![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /opt/mattermost/client/ |
Upload File : |
{"version":3,"file":"3147.66f984f962a4ccf35d7b.js","mappings":"8tDAiBA,MAAMA,EAAWC,EAAAA,QAAMD,SAEhBE,eAAeC,EAAaC,EAASC,GACxC,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,GACRJ,EAASQ,EAAAA,MACTR,EAASQ,EAAAA,MACTJ,EAAQE,IACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAeU,EAAcC,EAAQT,EAASC,GACjD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASc,EAAAA,GAA0BD,GAAQ,IACxEP,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAea,EAAiBX,EAASC,GAC5C,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAec,EAASZ,EAASC,GACpC,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAee,EAAoBb,EAASC,GAC/C,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAegB,EAA0Bd,EAASC,GACrD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAoBOL,eAAeiB,EAAaf,EAASC,GACxC,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAME,EAEd,CAEOL,eAAekB,EAAahB,EAASC,GACxC,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAME,EAEd,CAEOL,eAAemB,EAAeC,EAAQlB,EAASC,GAClD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAA4Bc,IAClEhB,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAME,EAEd,CAMO,SAASgB,EAAgBC,GAC5B,OAAOC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQJ,gBACpBK,OAAQ,CAACJ,IAEjB,CAMO,SAASK,EAAWC,GAAsD,IAArD,aAACC,EAAY,SAAEP,EAAQ,YAAEQ,EAAW,MAAEC,EAAK,MAAEC,GAAMJ,EAC3E,OAAOL,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQQ,kBACpBP,OAAQ,CAACG,EAAcP,EAAUQ,EAAaC,EAAOC,IAE7D,CAEOhC,eAAekC,EAAYC,EAASC,EAAUC,EAAOC,EAAQC,EAAcrC,EAASC,GACvF,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASc,EAAAA,GAA8BuB,EAASC,EAAUE,EAAQC,EAAcF,IAC7GjC,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAewC,EAAaL,EAASC,EAAUC,EAAOI,EAASvC,EAASC,GAC3E,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASc,EAAAA,GAA+B6B,EAASN,EAASC,EAAUC,IACjGjC,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAe0C,EAAaC,EAAgBC,EAAOR,EAAUlC,EAASC,GACzE,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASc,EAAAA,GAA+B+B,EAAgBC,EAAOR,IAC5FhC,GACIA,EAAKyC,cACLC,EAAAA,EAAAA,IAAuB1C,EAAKyC,aAE5B3C,GACAA,EAAQE,IAELC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAe+C,EAAiBC,EAAY9C,EAASC,GACxD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAA8B0C,IACpE5C,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAeiD,EAAiB/C,EAASC,GAC5C,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAekD,EAA4BC,EAAMjD,EAASC,GAC7D,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAAyC6C,IAC/E/C,GAAQF,EACRA,EAAQ,mBACDG,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAeoD,EAA6BD,EAAMjD,EAASC,GAC9D,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAA0C6C,IAChF/C,GAAQF,EACRA,EAAQ,oBACDG,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAeqD,EAA4BF,EAAMjD,EAASC,GAC7D,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAAyC6C,IAC/E/C,GAAQF,EACRA,EAAQ,mBACDG,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CACOL,eAAesD,EAA6BH,EAAMjD,EAASC,GAC9D,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAA0C6C,IAChF/C,GAAQF,EACRA,EAAQ,oBACDG,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAeuD,EAAyBJ,EAAMjD,EAASC,GAC1D,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAAsC6C,IAC5E/C,GAAQF,EACRA,EAAQ,gBACDG,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAewD,EAA4BtD,EAASC,GACvD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAeyD,EAA6BvD,EAASC,GACxD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAe0D,EAA4BxD,EAASC,GACvD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAe2D,EAA6BzD,EAASC,GACxD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAe4D,EAAyB1D,EAASC,GACpD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAe6D,EAAqBC,SACjChE,EAASQ,EAAAA,GAAkCwD,GACrD,CAEO9D,eAAe+D,EAAqBD,SACjChE,EAASQ,EAAAA,GAAkCwD,GACrD,CAEO9D,eAAegE,EAA2BF,SACvChE,EAASQ,EAAAA,GAAwCwD,GAC3D,CAEO9D,eAAeiE,EAAwBH,SACpChE,EAASQ,EAAAA,GAAqCwD,GACxD,CAEO9D,eAAekE,EAAwBJ,SACpChE,EAASQ,EAAAA,GAAqCwD,GACxD,CAEO9D,eAAemE,EAAkBC,EAAQlE,EAASC,GACrD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAA+B8D,IACrEhE,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAeqE,EAAiBnE,EAASC,GAC5C,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAesE,EAA0BpE,EAASC,EAAOoE,GAC5D,MAAM,KAACnE,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAAuCiE,IAC7EnE,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAWOL,eAAewE,EAAqBtE,EAASC,SAC1CmE,OAA0BG,EAAWtE,EAAO,CAAC,aACnD,MAAMuE,EAAM,CACRC,KAAMC,EAAAA,GAASC,4BACfzE,KAAM,CACF0E,YAAa,QACbC,YAAa,QACbC,YAAa,QACbC,eAAgB,OAChBC,SAAU,iCAlBflF,eAAyBE,EAASC,EAAOuE,GAC5C,MAAM,KAACtE,EAAMD,MAAOE,SAAaP,GAASqF,EAAAA,EAAAA,IAAUT,IAGzCrE,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAcU+E,CAAUX,EAAWtE,EAAOuE,GAClCxE,GACJ,CAEOF,eAAeqF,EAAkBnF,EAASC,GAC7C,MAAMmF,GAAoB/D,EAAAA,EAAAA,IAAe,CACrCC,WAAYC,EAAAA,GAAQ6D,kBACpB5D,OAAQ,MAGN,KAACtB,EAAMD,MAAOE,SAAaP,EAASwF,GACtClF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEO,SAASkF,GAAqBC,GACjC,MAAO,CACHb,KAAMc,EAAAA,GAAYC,uBAClBF,UAER,CAEO,SAASG,GAAgBC,GAC5B,MAAO,CACHjB,KAAMc,EAAAA,GAAYI,iBAClBD,wBAER,CAEO,SAASE,KACZ,MAAO,CACHnB,KAAMc,EAAAA,GAAYM,kBAE1B,CAEO,SAASC,KAEZ,MAAO,CAACC,EAAeC,KACnB,MAAMC,GAAWC,EAAAA,EAAAA,IAAyBF,KAEtCC,GACAA,IAGJF,EAAc,CACVtB,KAAMc,EAAAA,GAAYY,oBACpB,CAEV,CAEOrG,eAAesG,GAA0BpG,EAASC,GACrD,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASyG,EAAAA,MACtCnG,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAewG,GAAStG,EAASC,GACpC,MAAM,KAACC,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,MACtCF,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEO,SAASoG,GAA2BC,EAAUC,GACjD,OAAQC,IACJA,EAAc,CACVjC,KAAMc,EAAAA,GAAYoB,+BAClBzG,KAAM,CACFsG,WACAC,YAEN,CAEV,CAEO,SAASG,GAA6BJ,GACzC,OAAQE,IACJA,EAAc,CACVjC,KAAMc,EAAAA,GAAYsB,8BAClB3G,KAAM,CACFsG,aAEN,CAEV,CAEO1G,eAAegH,GAAY9G,EAASC,EAAO8G,GAC9C,MAAM,KAAC7G,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAAyB2G,IAC/D7G,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEO,SAAS6G,GAAkCR,EAAUS,EAAKC,EAASC,GAAe,IAAb,UAACC,GAAUD,EACnF,OAAQT,IACJA,EAAc,CACVjC,KAAMc,EAAAA,GAAY8B,wCAClBnH,KAAM,CACFsG,WACAS,MACAC,YACAI,QAAS,CAACF,eAEhB,CAEV,CAEO,SAASG,GAAkCf,EAAUS,EAAKC,GAC7D,OAAQR,IACJA,EAAc,CACVjC,KAAMc,EAAAA,GAAYiC,sCAClBtH,KAAM,CACFsG,WACAS,MACAC,cAEN,CAEV,CAEOpH,eAAe2H,GAAuBzH,EAASC,EAAOyH,GACzD,MAAM,KAACxH,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAAoCsH,IAC1ExH,GAAQF,EACRA,EAAQE,GACDC,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEOL,eAAe6H,GAAkC3H,EAASC,EAAO2H,GACpE,MAAM,KAAC1H,EAAMD,MAAOE,SAAaP,EAASQ,EAAAA,GAA+CwH,IACrF1H,GAAQF,EACRA,EAAQ,gBACDG,GAAOF,GACdA,EAAKI,EAAC,CAACC,GAAIH,EAAII,iBAAoBJ,GAE3C,CAEO,SAAS0H,KACZ,OAAO/H,WACHgI,EAAAA,EAAAA,IAAW,MAAO,iCACCvG,EAAAA,GAAQwG,sBAGnC,CAEO,SAASC,KACZ,OAAOlI,eACgByB,EAAAA,GAAQ0G,2BAGnC,CAEO,SAASC,KACZ,OAAOpI,eACgByB,EAAAA,GAAQ2G,eAGnC,CAEO,SAASC,GAAKC,EAAiBC,GAClC,OAAOvI,eACgByB,EAAAA,GAAQ4G,KAAKC,EAAiBC,EAGzD,CAEO,SAASC,GAAoBC,EAAoBC,GACpD,OAAO1I,UACH,IAII,OAHAgI,EAAAA,EAAAA,IAAW,MAAO,4BAA6B,CAACW,UAAWD,IAGpD,CAACtI,WADeqB,EAAAA,GAAQ+G,oBAAoBC,GAEvD,CAAE,MAAOG,GAEL,MAAO,CAACzI,MAAOyI,EAAEC,QAASzI,KAAM,CAAC0I,OAAQF,EAAEG,aAC/C,EAER,C,ggBCjhBA,MAAM,OAACC,GAAUC,EAAAA,EACJC,EAAuBC,IAChC,MAAMC,EAAOD,EAAM/I,KAEbiJ,EAAcD,EAAKE,aACnBC,EAAUH,EAAKG,QAEfC,EACFC,IAAAA,cAAA,QAAMC,UAAU,gDACZD,IAAAA,cAAA,KAAGC,UAAU,qDAIfC,EAAc,KAAOP,EAAKQ,KAAO,IAEvC,OACIH,IAAAA,cAACT,EAAMa,OAAAC,OAAA,CACHJ,UAAU,2BACNP,GAEJM,IAAAA,cAAA,OAAKC,UAAU,sBACVF,EACDC,IAAAA,cAAA,OAAKC,UAAU,4BACXD,IAAAA,cAAA,QAAMC,UAAU,sBACXL,GAELI,IAAAA,cAAA,QAAMC,UAAU,QACX,IACAC,GAELF,IAAAA,cAAA,QAAMC,UAAU,QACX,IACAH,KAIR,E,qCC1BjB,MAWOP,OAAMA,GAAIC,EAAAA,EAEJc,EAAoBZ,IAC7B,MAAMa,EAAWb,EAAM/I,KAAK4J,SACtBL,IAfcvJ,EAee+I,EAAM/I,MAd/B6J,YAAc7J,EAAK8J,YAAc9J,EAAK+J,SACrC,MAAPC,OAAaC,EAAAA,GAAkBjK,GAAK,MAAAgK,OAAKhK,EAAK+J,SAAQ,KAC/C/J,EAAK+J,SACL,OAAPC,OAAchK,EAAK+J,SAAQ,KACpB/J,EAAK6J,YAAc7J,EAAK8J,UACxB,MAAPE,OAAaC,EAAAA,GAAkBjK,IAE5B,GARaA,MAiBpB,OACIqJ,IAAAA,cAACT,EAAMa,OAAAC,OAAA,CACHJ,UAAU,2BACNP,GAEJM,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAACa,EAAAA,EAAM,CACHC,KAAK,MACLP,SAAUA,EACVQ,KAAKC,EAAAA,EAAAA,IAAgBtB,EAAM/I,KAAKI,MAEpCiJ,IAAAA,cAAA,OAAKC,UAAU,4BACXD,IAAAA,cAAA,QAAMC,UAAU,sBACX,IAAMM,GAEXP,IAAAA,cAAA,YACK,IACAE,IAGRR,EAAM/I,KAAKsK,QAAUjB,IAAAA,cAACkB,EAAAA,EAAM,OAC5BC,EAAAA,EAAAA,GAAQzB,EAAM/I,KAAKyK,QAAUpB,IAAAA,cAACqB,EAAAA,EAAQ,OAEtC,E,w9BCpBjB,MAAMC,EAAc,CAChBC,WAAaC,GAA6B1K,EAAAA,EAAA,GACnC0K,GAAQ,IACXC,OAAQ,QAIVC,EAAmB,CACrBC,gBAAkBjC,GACdM,IAAAA,cAAA,OAAKC,UAAU,kCACVP,EAAM/I,KAAKiL,QAKlBC,EAAc,CAChBC,aAAa,EACbC,iBAAiB,EACjBC,gBAAiB,iCACjBC,iBAAkBC,SAASC,KAC3BC,OAAQd,GAGG,MAAMe,UAA4BrC,IAAAA,cAC7CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,iBAkBLC,IACRC,KAAKhD,MAAMiD,SAASF,EAAe,IACtCD,EAAA,2BAEoBjM,SACVmM,KAAKhD,MAAMkD,cAAcF,KAAKhD,MAAMmD,MAAM1C,KAAM2C,KAC1DN,EAAA,+BAEwBjM,gBAC8BmM,KAAKhD,MAAMqD,QAAQC,kBAAkBF,EAAUG,gBAExEC,MAAMC,QAAQC,IAAUA,EAAKnC,SAAQoC,KAAKD,IAChE,MAAMxB,EAAQc,KAAKhD,MAAM4D,qBAAsBC,EAAAA,EAAAA,IAAgBH,EAAMV,KAAKhD,MAAM4D,qBAAuBF,EAAK7C,SAE5G,OAAAzJ,EAAAA,EAAA,GAAWsM,GAAI,IAAExB,QAAO4B,MAAOJ,EAAKrM,GAAI0M,WAAWzC,EAAAA,EAAAA,IAAgBoC,EAAKrM,KAAG,MAElFyL,EAAA,kCAE2BjM,UACxB,IAAImN,EAAmC,GAMvC,aAJMhB,KAAKhD,MAAMqD,QAAQY,qBAAqBb,EAAUG,eAAgBtM,IACpE+M,EAAwB/M,CAAI,IAC7B,SAEI+M,EAAsBL,KAAKO,GAAO9M,EAAAA,EAAA,GAAU8M,GAAO,IAAEhC,MAAOgC,EAAQ/D,aAAc2D,MAAOI,EAAQ7M,MAAK,IAzC7G2L,KAAKpK,MAAQ,CACTuK,MAAOnD,EAAMmD,MACbgB,aAAcC,KAAKC,SAASC,WAEpC,CACA,+BAAOC,CAAyBC,EAAkBC,GAC9C,OAAID,EAAUrB,QAAUsB,EAAUtB,MACvB,CACHA,MAAOqB,EAAUrB,MACjBgB,aAAcC,KAAKC,SAASC,YAI7B,IACX,CA8BAI,mBAAAA,GACI,MAAM,MAACvB,GAASH,KAAKhD,MACf2E,EAAcxB,EAAMyB,MAAQ,GAC5Bd,EAAQd,KAAKhD,MAAM8D,MAEzB,OACIxD,IAAAA,cAAA,OAAKC,UAAW,gBACZD,IAAAA,cAACuE,EAAAA,GAAWnE,OAAAC,OAAA,CACRtJ,GAAE,cAAA4J,OAAgBkC,EAAM1C,MACxBqE,YAAa9B,KAAK+B,mBAClBC,gBAAgB,EAChBC,QAAS9B,EAAM+B,cAAe,EAC9BP,YAAaA,EACbb,MAAOA,EACPb,SAAUD,KAAKC,SACfkC,WAAYhC,EAAMiC,SAClBtF,WAAYkC,GACRG,IAIpB,CAEAkD,gBAAAA,GACI,MAAM,KAACT,EAAI,KAAEnE,EAAI,YAAEyE,EAAW,SAAEE,GAAYpC,KAAKhD,MAAMmD,MACjDwB,EAAcC,GAAQ,GACtBd,EAAQd,KAAKhD,MAAM8D,MAEzB,OACIxD,IAAAA,cAAA,OAAKC,UAAW,gBACZD,IAAAA,cAACuE,EAAAA,GAAWnE,OAAAC,OAAA,CACRtJ,GAAE,cAAA4J,OAAgBR,GAClBqE,YAAa9B,KAAKsC,uBAClBN,gBAAgB,EAChBC,QAASC,IAAe,EACxBP,YAAaA,EACbb,MAAOA,EACPb,SAAUD,KAAKC,SACfkC,WAAYC,EACZtF,WAAU1I,EAAAA,EAAA,GAAM4K,GAAgB,IAAEnC,OAAQe,KACtCuB,IAIpB,CAEAoD,mBAAAA,GACI,MAAM,KAACX,EAAI,KAAEnE,EAAI,YAAEyE,EAAW,SAAEE,GAAYpC,KAAKhD,MAAMmD,MACjDwB,EAAcC,GAAQ,GACtBd,EAAQd,KAAKhD,MAAM8D,MAEzB,OACIxD,IAAAA,cAAA,OAAKC,UAAW,gBACZD,IAAAA,cAACuE,EAAAA,GAAWnE,OAAAC,OAAA,CACRtJ,GAAE,cAAA4J,OAAgBR,GAClBqE,YAAa9B,KAAKwC,0BAClBR,gBAAgB,EAChBC,QAASC,IAAe,EACxBP,YAAaA,EACbb,MAAOA,EACPb,SAAUD,KAAKC,SACfkC,WAAYC,EACZtF,WAAU1I,EAAAA,EAAA,GAAM4K,GAAgB,IAAEnC,OAAQE,KACtCoC,IAIpB,CAEAsD,kBAAAA,GACI,MAAM,MAACtC,GAASH,KAAKhD,MAEf2E,EAAcxB,EAAMyB,MAAQ,GAE5BvG,EAAU8E,EAAM9E,QAChByF,EAAQd,KAAKhD,MAAM8D,MAEzB,OACIxD,IAAAA,cAAA,OAAKC,UAAW,gBACZD,IAAAA,cAACoF,EAAAA,GAAWhF,OAAAC,OAAA,CACRtJ,GAAE,cAAA4J,OAAgBkC,EAAM1C,MACxBpC,QAASA,EACT4G,QAAS9B,EAAM+B,cAAe,EAC9BP,YAAaA,EACbb,MAAOA,EACPb,SAAUD,KAAKC,SACfkC,WAAYhC,EAAMiC,SAClBtF,WAAYkC,GACRG,IAIpB,CAEAwD,mBAAAA,CAAoBnK,GAChB,OAAQA,GACR,KAAKoK,EAAAA,GAAcC,eACf,OAAO7C,KAAK0B,sBAChB,KAAKkB,EAAAA,GAAcE,cACf,OAAO9C,KAAKyC,qBAChB,KAAKG,EAAAA,GAAcG,KACf,OAAO/C,KAAKqC,mBAChB,KAAKO,EAAAA,GAAcI,QACf,OAAOhD,KAAKuC,sBAChB,QACI,OAER,CAEAU,MAAAA,GACI,MAAM,MAAC9C,EAAK,MAAEjB,EAAK,SAAEgE,GAAYlD,KAAKhD,MAEhCmG,EAAkBnD,KAAK2C,oBAAoBxC,EAAM3H,MAEvD,OACI8E,IAAAA,cAAA,OACIC,UAAU,cAET2B,GACG5B,IAAAA,cAAA,aACK4B,GAGT5B,IAAAA,cAACA,IAAAA,SAAc,CAACtC,IAAKgF,KAAKpK,MAAMuL,cAC3BgC,EACD7F,IAAAA,cAAA,OAAKC,UAAU,aACV2F,IAKrB,E,yZACHpD,EApLoBH,EAAmB,aAxCpCT,MAAKkE,IAAAA,KAAAC,WACLH,SAAQE,IAAAA,KAAAC,WAERpD,SAAQmD,IAAAA,KAAAC,WACRnD,cAAakD,IAAAA,KAAAC,WACbzC,oBAAmBwC,IAAAA,OACnB/C,QAAO+C,IAAAA,MAAA,CACHnC,qBAAoBmC,IAAAA,KAAAC,WACpB/C,kBAAiB8C,IAAAA,KAAAC,aAAAA,aCWV,MAAMC,UAAsBhG,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,uBAKhD0D,IACd,MAAM,KAAC/F,EAAI,SAAEwC,GAAYD,KAAKhD,MAExByG,EAASD,EAEXE,MAAMC,QAAQH,GAEdvD,EAASxC,EADO+F,EAAS7C,KAAKiD,IAAY,CAAO1E,MAAO0E,EAAa1E,MAAO4B,MAAO8C,EAAa9C,WAGhGb,EAASxC,EADF+F,EACQ,CAACtE,MAAOsE,EAAStE,MAAO4B,MAAO0C,EAAS1C,OAExC2C,EACnB,GACH,CAEDR,MAAAA,GACI,MAAM,MACF9C,EAAK,KACL1C,EAAI,MACJqD,EAAK,SACLb,EAAQ,UACR4D,GACA7D,KAAKhD,MAEH2E,EAAcxB,EAAMyB,MAAQ,GAE5BkC,EAAe3D,EAAM4D,aAAe5D,EAAMjB,MAChD,IAAI8E,EAAuC7D,EAAM4D,aAAe5D,EAAMjB,MACtE8E,EACI1G,IAAAA,cAAAA,IAAAA,SAAA,KACKwG,GACC3D,EAAM8D,aACJ3G,IAAAA,cAAA,QAAMC,UAAU,SACX,gBAMjB,MAAM2F,EAAW/C,EAAM3C,YACvB,IAAI0G,EAAmC5G,IAAAA,cAAC6G,EAAAA,EAAQ,CAACzH,QAASwG,IAY1D,OAXIW,IACAK,EACI5G,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAC6G,EAAAA,EAAQ,CAACzH,QAASwG,IACnB5F,IAAAA,cAAA,OAAKC,UAAU,mBACVsG,KAMT1D,EAAM3H,MACd,KAAKoK,EAAAA,GAAcwB,KAAM,CACrB,MAAMC,EAAUlE,EAAMkE,SAAW,OAEjC,IAAIC,EAAYnE,EAAMoE,WACjBD,IAEGA,EADY,aAAZD,EAlFgB,IADJ,KA0FpB,MAAMG,EAAY1D,EAClB,OACIxD,IAAAA,cAACmH,EAAAA,EAAW,CACRC,UAAW1E,KAAKhD,MAAM0H,UACtBrQ,GAAIoJ,EACJkH,SAAUxE,EAAMiC,SAChB5J,KAAM6L,EACNnF,MAAO8E,EACPM,UAAWA,EACXxD,MAAO0D,GAAa,GACpB7C,YAAaA,EACbuB,SAAUgB,EACVjE,SAAUA,EACV2E,WAAW,GAGvB,CACA,KAAKhC,EAAAA,GAAcI,QACnB,KAAKJ,EAAAA,GAAcG,KACnB,KAAKH,EAAAA,GAAcE,cACnB,KAAKF,EAAAA,GAAcC,eACf,OACIvF,IAAAA,cAACqC,EAAmBjC,OAAAC,OAAA,GACZqC,KAAKhD,MAAK,CACd4D,oBAAqBZ,KAAKhD,MAAM4D,oBAChCT,MAAOA,EACPjB,MAAO8E,EACPd,SAAUgB,EACVjE,SAAUD,KAAK6E,eACf/D,MAAOd,KAAKhD,MAAM8D,SAI9B,KAAK8B,EAAAA,GAAckC,KAAM,CACrB,MAAMC,EAAYjE,EAClB,OACIxD,IAAAA,cAAC0H,EAAAA,EAAW,CACRN,UAAW1E,KAAKhD,MAAM0H,UACtBrQ,GAAIoJ,EACJkH,SAAUxE,EAAMiC,SAChBlD,MAAO8E,EACPlD,MAAOiE,IAAa,EACpB7B,SAAUgB,EACVvC,YAAaA,EACb1B,SAAUA,GAGtB,CACA,KAAK2C,EAAAA,GAAcqC,SACf,OACI3H,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAASyD,EAAM3C,cAM3B,OAAO,IACX,EACHsC,EAjIoBwD,EAAa,aAf9B7F,KAAI2F,IAAAA,OAAAC,WACJQ,UAAST,IAAAA,KACTxC,oBAAmBwC,IAAAA,OAGnBnD,SAAQmD,IAAAA,KAAAC,WACRqB,UAAStB,IAAAA,KAETlD,cAAakD,IAAAA,KAAAC,WACbhD,QAAO+C,IAAAA,MAAA,CACHnC,qBAAoBmC,IAAAA,KAAAC,WACpB/C,kBAAiB8C,IAAAA,KAAAC,aAAAA,aAAAvD,EAIJwD,EAAa,eACR,CAClB4B,cAAeC,EAAAA,ICZvB,SAAeC,EAAAA,EAAAA,UAff,SAAyBxP,GACrB,MAAO,CACHgL,qBAAqByE,EAAAA,EAAAA,IAA8BzP,GAE3D,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBrE,qBAAoB,KACpBX,kBAAiBA,EAAAA,IAClB3M,GAEX,GAEA,CAA4D2P,GCnBtDiC,EAAkB,CAACC,YAAY,EAAOC,kBAAkB,GAExDC,EAAmC1I,GAEjCM,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAASM,EAAM8D,MACfzF,QAASkK,IAGnBG,EAAAC,UAAA,CAbEtR,GAAE+O,IAAAA,OACFtC,MAAKsC,IAAAA,OAAAC,YAcT,U,09BCiCA,MAAMuC,GAAkBC,IACpB,MAAMC,EAAwB,CAAC,EAY/B,OAXID,GAAQA,EAAKE,QACbF,EAAKE,OAAOC,SAASC,IACjB,IAAIC,EAA6B,KAC7BD,EAAEzN,OAASoK,EAAAA,GAAckC,OACzBoB,GAAe,GAGnBJ,EAAOG,EAAExI,MAAQwI,EAAEnF,OAASoF,CAAY,IAIzCJ,CAAM,EAGV,MAAMK,WAAiB7I,IAAAA,cAC1BsC,WAAAA,CAAY5C,GAAc,IAAAoJ,EACtBvG,MAAM7C,GAAMoJ,EAAApG,KAAAF,GAAA,qBA2BD,CAACuG,EAA2BC,EAAqCC,KAC5E,IAAIC,GAAY,EAChB,MAAM5Q,EAAQ,CAAC,EAOf,GALI2Q,IACAC,GAAY,EACZ5Q,EAAM2Q,UAAYA,GAGlBD,GAAe5I,OAAO+I,KAAKH,GAAaI,QAAU,EAElD,GADAF,GAAY,GACRG,EAAAA,EAAAA,GAA2BL,EAAaD,GAAW,CACnDzQ,EAAM0Q,YAAc,CAAC,EACrB,IAAK,MAAOtL,EAAK8F,KAAUpD,OAAOkJ,QAAQN,GACtC1Q,EAAM0Q,YAAYtL,GAAQsC,IAAAA,cAAC6G,EAAAA,EAAQ,CAACzH,QAASoE,GAErD,MAAO,IAAKlL,EAAM2Q,UAAW,CACzB,MAAMpG,EAAQzC,OAAO+I,KAAKH,GAAa,GACvC1Q,EAAM2Q,UAAYvG,KAAKhD,MAAM6J,KAAKC,cAAc,CAC5CzS,GAAI,2CACJ0S,eAAgB,kFACjB,CACC5G,QACAnM,MAAOsS,EAAYnG,IAE3B,CAOJ,OAJIqG,GACAxG,KAAKgH,SAASpR,GAGX4Q,CAAS,IACnB1G,GAAA,qBAEcjM,MAAO4I,EAAoBwK,EAAqBnG,KAC3DrE,EAAEyK,iBAEF,MAAM,OAACnB,GAAU/F,KAAKhD,MAAM6I,KACtBC,EAAS9F,KAAKpK,MAAMkQ,OACtBmB,GAAcnG,IACdgF,EAAOmB,GAAcnG,GAGzB,MAAMwF,EAAiD,CAAC,EAElDD,EAAWc,GAAiBpB,GAkBlC,GAjBAM,SAAAA,EAAUL,SAASoB,IACf,MAAMpT,GAAQqT,EAAAA,EAAAA,GACVD,EACAtB,EAAOsB,EAAQ3J,OAEfzJ,IACAsS,EAAYc,EAAQ3J,MAChBH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAIL,EAAMK,GACV0S,eAAgB/S,EAAM+S,eACtBjB,OAAQ9R,EAAM8R,SAG1B,IAGJ9F,KAAKgH,SAAS,CAACV,gBACyB,IAApC5I,OAAO+I,KAAKH,GAAaI,OAAc,CACvC,MAAMH,EAAYvG,KAAKhD,MAAM6J,KAAKC,cAAc,CAC5CzS,GAAI,wCACJ0S,eAAgB,gCAIpB,YADA/G,KAAKgH,SAAS,CAACT,aAEnB,CAEA,MAAMgB,EAAa,CACfzB,UAGJ,IAAI0B,EAAa,SACbP,GAAcnG,IACd0G,EAAa1G,GAGjBd,KAAKgH,SAAS,CAACQ,aAAYjB,UAAW,OACtC,MAAMkB,QAAYzH,KAAKhD,MAAMqD,QAAQqH,OAAOH,GAG5C,GAFAvH,KAAKgH,SAAS,CAACQ,WAAY,OAEvBC,EAAIzT,MAAO,KAAA2T,EACX,MAAMC,EAAgBH,EAAIzT,MACpB6T,EAAeD,EAAcE,KAKnC,YAJkB9H,KAAK+H,aAAa1B,EAA4B,QAApBsB,EAAEC,EAAc3T,YAAI,IAAA0T,OAAA,EAAlBA,EAAoBK,OAAQH,IAEtE7H,KAAKiI,YAAW,GAGxB,CAEA,MAAMC,EAAeT,EAAIxT,KAEzB,IAAIuS,GAAY,EACZ2B,GAAc,EAClB,OAAQD,EAAa1P,MACrB,KAAK4P,EAAAA,GAAqBC,KACtBF,GAAc,EACd,MACJ,KAAKC,EAAAA,GAAqBE,GAC1B,KAAKF,EAAAA,GAAqBG,SACtB,MACJ,QACI/B,GAAY,EACZxG,KAAK+H,aAAa,QAAIzP,EAAW0H,KAAKhD,MAAM6J,KAAKC,cAAc,CAC3DzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAM0P,EAAa1P,QAItBgO,GAAc2B,GACfnI,KAAKiI,YAAW,EACpB,IACHnI,GAAA,sBAEejM,MAAO4J,EAAc2C,KAAkD,IAAAoI,EACnF,MAAM3B,EAAO7G,KAAKhD,MAAM6J,KAClB1G,EAA8B,QAAzBqI,EAAGxI,KAAKhD,MAAM6I,KAAKE,cAAM,IAAAyC,OAAA,EAAtBA,EAAwBC,MAAMxC,GAAMA,EAAExI,OAASA,IAC7D,IAAK0C,EACD,MAAO,GAGX,MAAMsH,QAAYzH,KAAKhD,MAAMqD,QAAQqI,kBAAkBvI,EAAOH,KAAKpK,MAAMkQ,OAAQ1F,GACjF,GAAIqH,EAAIzT,MAAO,CACX,MACM2U,EADgBlB,EAAIzT,MACG8T,MAAQjB,EAAKC,cAAc,CACpDzS,GAAI,qBACJ0S,eAAgB,4BAQpB,OANA/G,KAAKgH,SAAS,CACVV,YAAWlS,EAAAA,EAAA,GACJ4L,KAAKpK,MAAM0Q,aAAW,IACzB,CAACnG,EAAM1C,MAAOkL,MAGf,EACX,CAEA,MAAMC,EAAWnB,EAAIxT,KACrB,OAAQ2U,EAASpQ,MACjB,KAAK4P,EAAAA,GAAqBE,GAAI,KAAAO,EAAAC,EAC1B,IAAIC,GAAqB,QAAbF,EAAAD,EAAS3U,YAAI,IAAA4U,OAAA,EAAbA,EAAeE,QAAS,GAEpC,OADAA,EAAa,QAARD,EAAGC,SAAK,IAAAD,OAAA,EAALA,EAAOrI,OAAOuI,EAAAA,IACfD,CACX,CACA,KAAKX,EAAAA,GAAqBC,KAC1B,KAAKD,EAAAA,GAAqBG,SAAU,CAChC,MAAMI,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,uCACJ0S,eAAgB,6DACjB,CACCvO,KAAMoQ,EAASpQ,OASnB,OANAwH,KAAKgH,SAAS,CACVV,YAAWlS,EAAAA,EAAA,GACJ4L,KAAKpK,MAAM0Q,aAAW,IACzB,CAACnG,EAAM1C,MAAOkL,MAGf,EACX,CACA,QAAS,CACL,MAAMA,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAMoQ,EAASpQ,OASnB,OANAwH,KAAKgH,SAAS,CACVV,YAAWlS,EAAAA,EAAA,GACJ4L,KAAKpK,MAAM0Q,aAAW,IACzB,CAACnG,EAAM1C,MAAOkL,MAGf,EACX,EACA,IACH7I,GAAA,eAEQ,KACLE,KAAKiI,YAAW,EAAM,IACzBnI,GAAA,mBAEY,WAAuB,IAAtBmJ,EAAS1F,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GACnB,MAAM,KAACsC,GAAQO,EAAKpJ,OAEfiM,GAAapD,EAAKqD,iBAWvB9C,EAAKY,SAAS,CAACmC,MAAM,GACzB,IAACrJ,GAAA,iBAEU,CAACrC,EAAcqD,KAAe,IAAAsI,EACrC,MAAMjJ,EAA8B,QAAzBiJ,EAAGpJ,KAAKhD,MAAM6I,KAAKE,cAAM,IAAAqD,OAAA,EAAtBA,EAAwBX,MAAMxC,GAAMA,EAAExI,OAASA,IAC7D,IAAK0C,EACD,OAGJ,MAAM2F,EAAM1R,EAAAA,EAAA,GAAO4L,KAAKpK,MAAMkQ,QAAM,IAAE,CAACrI,GAAOqD,IAE1CX,EAAMkJ,UACNrJ,KAAKgH,SAAS,CAACsC,SAAS,IACxBtJ,KAAKhD,MAAMqD,QAAQkJ,gBAAgBpJ,EAAO2F,GAAQ0D,MAAM/B,IAEpD,GADAzH,KAAKgH,SAAS,CAACsC,SAAS,IACpB7B,EAAIzT,MAAO,KAAAyV,EACX,MAAM7B,EAAgBH,EAAIzT,MACpB0V,EAAW9B,EAAcE,KACzBE,EAA2B,QAArByB,EAAG7B,EAAc3T,YAAI,IAAAwV,OAAA,EAAlBA,EAAoBzB,OAC7B3B,EAAWc,GAAiBnH,KAAKhD,MAAM6I,KAAKE,QAElD,YADA/F,KAAK+H,aAAa1B,EAAU2B,EAAQ0B,EAExC,CAEA,MAAMxB,EAAeT,EAAIxT,KACzB,OAAQiU,EAAa1P,MACrB,KAAK4P,EAAAA,GAAqBC,KACtB,OACJ,KAAKD,EAAAA,GAAqBE,GAC1B,KAAKF,EAAAA,GAAqBG,SAOtB,YANAvI,KAAK+H,aAAa,QAAIzP,EAAW0H,KAAKhD,MAAM6J,KAAKC,cAAc,CAC3DzS,GAAI,uCACJ0S,eAAgB,6DACjB,CACCvO,KAAM0P,EAAa1P,QAG3B,QACIwH,KAAK+H,aAAa,QAAIzP,EAAW0H,KAAKhD,MAAM6J,KAAKC,cAAc,CAC3DzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAM0P,EAAa1P,QAE3B,KAIRwH,KAAKgH,SAAS,CAAClB,UAAQ,IAxRvB,MAAOD,KAAAA,GAAQ7I,EACT8I,EAASF,GAAeC,GAE9B7F,KAAKpK,MAAQ,CACT0T,SAAS,EACTH,MAAM,EACNrD,OAAAA,EACAS,UAAW,KACXD,YAAa,CAAC,EACdkB,WAAY,KACZ3B,KAAAA,EAER,CAEA,+BAAOtE,CAAyBC,EAAkBC,GAC9C,OAAID,EAAUqE,OAASpE,EAAUoE,KACtB,CACHC,OAAQF,GAAepE,EAAUqE,MACjCA,KAAMrE,EAAUqE,MAIjB,IACX,CAoQA8D,WAAAA,GACI,MAAM,OAAC5D,EAAM,OAAE6D,GAAU5J,KAAKhD,MAAM6I,KAC9ByD,EAAUO,QAAQ7J,KAAKpK,MAAM0T,SAE7BQ,EAAiB,gCADLR,EAAU,+BAAiC,+BAE7D,OACIhM,IAAAA,cAACyM,EAAAA,MAAK,CACF1V,GAAG,YACH2V,gBAAgB,0BAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiK,OACbC,SAAUlK,KAAKhD,MAAMkN,SACrBC,SAAS,SACTC,KAAK,OACL,kBAAgB,kBAEhB9M,IAAAA,cAAA,QACI+M,SAAUrK,KAAKsK,aACfC,aAAc,OAEdjN,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CACTC,aAAa,EACbC,MAAO,CAACC,aAAc5E,GAAUA,EAAOW,OAAS,GAAK,QAErDpJ,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,kBAEF2L,KAAK8K,kBAGZ/E,GAAU6D,IACRtM,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAC0N,EAAAA,KAAI,CAACC,GAAI3B,GACNhM,IAAAA,cAAA,OACIC,UACIuM,GAGJxM,IAAAA,cAAC4N,EAAAA,EAAc,CAACR,MAAO,CAACS,SAAU,YAGzCnL,KAAKoL,cAGd9N,IAAAA,cAACyM,EAAAA,MAAMsB,OAAM,KACRrL,KAAKsL,iBAK1B,CAEAC,cAAAA,GACI,MAAM,OAACxF,EAAM,OAAE6D,GAAU5J,KAAKhD,MAAM6I,KAEpC,OACIvI,IAAAA,cAAA,QAAM+M,SAAUrK,KAAKsK,cACjBhN,IAAAA,cAAA,WACK0C,KAAK8K,iBAER/E,GAAU6D,IACRtM,IAAAA,cAAA,WACK0C,KAAKoL,cAGd9N,IAAAA,cAAA,WACK0C,KAAKsL,gBAItB,CAEAR,YAAAA,GACI,MAAM,MACFU,EAAK,KACLnO,GACA2C,KAAKhD,MAAM6I,KAEf,IAAI4F,EAcJ,OAbIpO,IACAoO,EACInO,IAAAA,cAAA,OACIjJ,GAAG,mBACHqX,IAAK,mBACLnO,UAAU,oBACVoO,MAAM,KACNC,OAAO,KACPC,IAAKxO,KAMbC,IAAAA,cAAAA,IAAAA,SAAA,KACKmO,EACAD,EAGb,CAEAM,cAAAA,GACI,MAAM,WAACC,EAAU,KAAElG,GAAQ7F,KAAKhD,OAE1B,OAAC+I,GAAUF,EACjB,OAAKE,EAIEA,EAAOtF,QAAQwF,GAAMA,EAAExI,OAASoI,EAAKmG,iBAAgBrL,KAAI,CAACR,EAAO8L,IAEhE3O,IAAAA,cAACgG,EAAa,CACVnD,MAAOA,EACPnF,IAAKmF,EAAM1C,KACXiH,UAAqB,IAAVuH,EACXxO,KAAM0C,EAAM1C,KACZoG,UAAW7D,KAAKpK,MAAM0Q,YAAYnG,EAAM1C,MACxCqD,MAAOd,KAAKpK,MAAMkQ,OAAO3F,EAAM1C,MAC/ByC,cAAeF,KAAKE,cACpBD,SAAUD,KAAKC,SACfiF,cAAe6G,EAAaG,EAAAA,EAAiB/G,EAAAA,MAd9C,IAkBf,CAEAiG,UAAAA,GACI,MAAM,OAACrF,EAAM,OAAE6D,GAAU5J,KAAKhD,MAAM6I,KAEpC,OAAQE,GAAU6D,IACdtM,IAAAA,cAAAA,IAAAA,SAAA,KACKsM,GACGtM,IAAAA,cAACoI,EAAc,CACXrR,GAAG,kBACHyM,MAAO8I,IAGd5J,KAAK8L,iBAGlB,CAEAR,YAAAA,GACI,MAAM,OAACvF,GAAU/F,KAAKhD,MAAM6I,KAEtBsG,EACF7O,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,WAIvB,IAAIqF,EAAgB,CAChB9O,IAAAA,cAAC+O,EAAAA,EAAa,CACVhY,GAAG,kBACH2G,IAAI,SACJxC,KAAK,SACLkM,WAAYqB,GAA4B,IAAlBA,EAAOW,OAC7BnJ,UAAU,8BACV+O,SAAUzC,QAAQ7J,KAAKpK,MAAM4R,YAC7B+E,cAAcC,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,gCACJ0S,eAAgB,mBAGnBoF,IAIT,GAAInM,KAAKhD,MAAM6I,KAAKmG,eAAgB,CAChC,MAAM7L,EAAQ4F,aAAM,EAANA,EAAQ0C,MAAMxC,GAAMA,EAAExI,OAASuC,KAAKhD,MAAM6I,KAAKmG,iBAC7D,GAAI7L,EAAO,KAAAsM,EACP,MAAMC,EAAuB,QAAhBD,EAAGtM,EAAM9E,eAAO,IAAAoR,OAAA,EAAbA,EAAe9L,KAAKgM,GAChCrP,IAAAA,cAAC+O,EAAAA,EAAa,CACVhY,GAAI,kBAAoBsY,EAAE7L,MAC1B9F,IAAK2R,EAAE7L,MACPtI,KAAK,SACL+E,UAAU,8BACV+O,SAAUtM,KAAKpK,MAAM4R,aAAemF,EAAE7L,MACtCyL,aAAcI,EAAEzN,MAChB0N,QAAUnQ,GAAwBuD,KAAKsK,aAAa7N,EAAG0D,EAAM1C,KAAMkP,EAAE7L,QAEpE6L,EAAEzN,SAGPwN,IACAN,EAAgBM,EAExB,CACJ,CAEA,OACIpP,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,WACK0C,KAAKpK,MAAM2Q,WACRjJ,IAAAA,cAAA,WACIA,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAC6G,EAAAA,EAAQ,CAACzH,QAASsD,KAAKpK,MAAM2Q,cAI1CjJ,IAAAA,cAAA,UACIjJ,GAAG,kBACHmE,KAAK,SACL+E,UAAU,iCACVqP,QAAS5M,KAAKiK,QAEd3M,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,YAGtBqF,GAIjB,CAEAnJ,MAAAA,GACI,OAAOjD,KAAKhD,MAAM+O,WAAa/L,KAAKuL,iBAAmBvL,KAAK2J,aAChE,EAGJ,SAASxC,GAAiBpB,GACtB,OAAOA,aAAM,EAANA,EAAQpF,KAAKsF,IAAC,CACjBxI,KAAMwI,EAAExI,KACRjF,KAAMyN,EAAEzN,KACR6L,QAAS4B,EAAE5B,QACXwI,UAAW5G,EAAEhC,eAErB,CATCnE,GA5fYqG,GAAQ,aAvCjB4F,WAAU3I,IAAAA,KACV8G,SAAQ9G,IAAAA,KAAAC,WACRhD,QAAO+C,IAAAA,MAAA,CACHsE,OAAMtE,IAAAA,KAAAC,WAGNqF,kBAAiBtF,IAAAA,KAAAC,WACjBkG,gBAAenG,IAAAA,KAAAC,aAAAA,aAuiBvB,UAAeyJ,EAAAA,EAAAA,YAAW3G,I,0ZC7iB1B,MAAM4G,WAA0BzP,IAAAA,cAC5BsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,mBAIJjM,UACT,MAAMmZ,EAAgBC,GACXjN,KAAKhD,MAAM6J,KAAKC,cACnB,CACIzS,GAAI,iCACJ0S,eAAgB,+FAEpB,CAACmG,QAASD,KAGZ,KAACpH,GAAQ7F,KAAKpK,MACpB,IAAKiQ,EAAM,CACP,MAAM8C,EAAS3I,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,2BAC7F,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBH,EAAarE,IACtD,CACA,IAAK9C,EAAK6B,OAAQ,CACd,MAAMiB,EAAS3I,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,4BAC/F,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBH,EAAarE,IACtD,CACA,IAAK3I,KAAKhD,MAAMoQ,QACZ,MAAO,CAACpZ,OAAOmZ,EAAAA,EAAAA,IAAsB,+BAGzC,MAAME,GAAOC,EAAAA,EAAAA,IAAkBzH,EAAK6B,OAAQ1H,KAAKhD,MAAMoQ,QAAS,CAAC,EAAG7F,EAAWzB,QACzE2B,QAAYzH,KAAKhD,MAAMqD,QAAQkN,YAAYF,EAAMrN,KAAKhD,MAAM6J,MAClE,GAAIY,EAAIzT,MACJ,OAAOyT,EAGX,MAAMmB,EAAWnB,EAAIxT,KACrB,OAAQ2U,EAASpQ,MACjB,KAAK4P,EAAAA,GAAqBE,GAClBM,EAASd,MACT9H,KAAKhD,MAAMqD,QAAQmN,oCACf5E,EACAA,EAASd,KACTuF,EAAKD,SAGb,MACJ,KAAKhF,EAAAA,GAAqBC,KACtBrI,KAAKgH,SAAS,CAACnB,KAAM+C,EAAS/C,OAC9B,MACJ,KAAKuC,EAAAA,GAAqBG,SACtB,MACJ,QACI,MAAO,CAACvU,OAAOmZ,EAAAA,EAAAA,IAAsBH,EAAahN,KAAKhD,MAAM6J,KAAKC,cAC9D,CACIzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAMoQ,EAASpQ,UAI3B,OAAOiP,CAAG,IACb3H,GAAA,wBAEiBjM,MAAOsM,EAAiB2F,KACtC,MAAM2H,EAAc/Q,GAAoBsD,KAAKhD,MAAM6J,KAAKC,cACpD,CACIzS,GAAI,yBACJ0S,eAAgB,6FAEpB,CAACmG,QAASxQ,KAGR,KAACmJ,GAAQ7F,KAAKpK,MACpB,IAAKiQ,EACD,MAAO,CAAC7R,OAAOmZ,EAAAA,EAAAA,IAAsBM,EAAWzN,KAAKhD,MAAM6J,KAAKC,cAAc,CAC1EzS,GAAI,0BACJ0S,eAAgB,8BAGxB,IAAKlB,EAAK6H,OACN,MAAO,CAAC1Z,OAAOmZ,EAAAA,EAAAA,IAAsBM,EAAWzN,KAAKhD,MAAM6J,KAAKC,cAAc,CAC1EzS,GAAI,4BACJ0S,eAAgB,gCAGxB,IAAK5G,EAAMkJ,QAEP,MAAO,CAACrV,OAAOmZ,EAAAA,EAAAA,IAAsBM,EAAWzN,KAAKhD,MAAM6J,KAAKC,cAAc,CAC1EzS,GAAI,qCACJ0S,eAAgB,2CAGxB,IAAK/G,KAAKhD,MAAMoQ,QACZ,MAAO,CAACpZ,OAAOmZ,EAAAA,EAAAA,IAAsB,+BAGzC,MAAME,GAAOC,EAAAA,EAAAA,IAAkBzH,EAAK6H,OAAQ1N,KAAKhD,MAAMoQ,QAAS,CAAC,EAAGtH,GACpEuH,EAAKM,eAAiBxN,EAAM1C,KAE5B,MAAMgK,QAAYzH,KAAKhD,MAAMqD,QAAQuN,eAAeP,EAAMrN,KAAKhD,MAAM6J,MACrE,GAAIY,EAAIzT,MACJ,OAAOyT,EAGX,MAAMmB,EAAWnB,EAAIxT,KACrB,OAAQ2U,EAASpQ,MACjB,KAAK4P,EAAAA,GAAqBC,KACtBrI,KAAKgH,SAAS,CAACnB,KAAM+C,EAAS/C,OAC9B,MACJ,KAAKuC,EAAAA,GAAqBE,GAC1B,KAAKF,EAAAA,GAAqBG,SACtB,MAAO,CAACvU,OAAOmZ,EAAAA,EAAAA,IAAsBM,EAAWzN,KAAKhD,MAAM6J,KAAKC,cAAc,CAC1EzS,GAAI,uCACJ0S,eAAgB,6DACjB,CACCvO,KAAMoQ,EAASpQ,UAGvB,QACI,MAAO,CAACxE,OAAOmZ,EAAAA,EAAAA,IAAsBM,EAAWzN,KAAKhD,MAAM6J,KAAKC,cAAc,CAC1EzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAMoQ,EAASpQ,UAIvB,OAAOiP,CAAG,IACb3H,GAAA,0BAEmBjM,MAAOsM,EAAiB2F,EAAuB1F,KAC/D,MAAMyG,EAAO7G,KAAKhD,MAAM6J,KAQxB,IAAK1G,EAAM0N,OACP,MAAO,CAAC7Z,OAAOmZ,EAAAA,EAAAA,KARGzQ,EAQgCmK,EAAKC,cAAc,CACjEzS,GAAI,4BACJ0S,eAAgB,6BAVkBF,EAAKC,cAC3C,CACIzS,GAAI,0BACJ0S,eAAgB,qGAEpB,CAACmG,QAASxQ,OALQA,MAatB,IAAKsD,KAAKhD,MAAMoQ,QACZ,MAAO,CAACpZ,OAAOmZ,EAAAA,EAAAA,IAAsB,+BAGzC,MAAME,GAAOC,EAAAA,EAAAA,IAAkBnN,EAAM0N,OAAQ7N,KAAKhD,MAAMoQ,QAAS,CAAC,EAAGtH,GAIrE,OAHAuH,EAAKM,eAAiBxN,EAAM1C,KAC5B4P,EAAKS,MAAQ1N,EAENJ,KAAKhD,MAAMqD,QAAQ0N,YAAYV,EAAMxG,EAAK,IAvJjD7G,KAAKpK,MAAQ,CAACiQ,KAAM7I,EAAM6I,KAC9B,CAyJA5C,MAAAA,GACI,MAAM,KAAC4C,GAAQ7F,KAAKpK,MAEpB,OAAKiQ,SAAAA,EAAM6B,QAAW1H,KAAKhD,MAAMoQ,QAK7B9P,IAAAA,cAAC6I,GAAQ,CACLN,KAAMA,EACNqE,SAAUlK,KAAKhD,MAAMkN,SACrB7J,QAAS,CACLqH,OAAQ1H,KAAKgO,WACbtF,kBAAmB1I,KAAK0I,kBACxBa,gBAAiBvJ,KAAKuJ,mBAVvB,IAcf,EAGJzJ,GAlLMiN,GAAiB,aAbnB7C,SAAQ9G,IAAAA,KAAAC,WACRhD,QAAO+C,IAAAA,MAAA,IAAAC,aAiMX,UAAeyJ,EAAAA,EAAAA,YAAWC,ICjM1B,IAAe3H,EAAAA,EAAAA,SAAQ,MAXvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBiI,YAAW,GACXK,eAAc,GACdG,YAAW,GACXP,oCAAmCA,IACpC7Z,GAEX,GAEA,CAAiDoZ,I,khCCK1C,SAASkB,GAAgCC,EAAqBd,EAAqBvG,GACtF,OAAOhT,UAAoB,IAAAsa,EAEvB,IAAItI,EAAOqI,EAAQrI,KACnB,GAAQ,QAARsI,EAAItI,SAAI,IAAAsI,GAAJA,EAAMT,OAAQ,CACd,MAAMU,GAAcd,EAAAA,EAAAA,IAAkBzH,EAAK6H,OAAQN,GAC7C3F,QAAY9T,EAASia,GAAoBQ,EAAavH,IAC5D,GAAIY,EAAIzT,MACJ,OAAOyT,EAEX5B,EAAO4B,EAAIxT,KAAM4R,IACrB,CAGA,GAAIA,EAAM,KAAAwI,EAEN,GAAS,QAALA,EAACxI,SAAI,IAAAwI,IAAJA,EAAM3G,OAAQ,CACf,MAAMiB,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,+BACJ0S,eAAgB,oEAEpB,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,CAMA,MAAO,CAAC1U,KAJ0B,CAC9BuE,KAAM4P,EAAAA,GAAqBC,KAC3BxC,QAGR,CAIA,IAAKqI,EAAQxG,OAAQ,CACjB,MAAMiB,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,+BACJ0S,eAAgB,oEAEpB,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,CAEA,MAAMyF,GAAcd,EAAAA,EAAAA,IAChBY,EAAQxG,OACR0F,GAIJ,aADkBzZ,EAAS4Z,GAAiBa,EAAavH,GAC/C,CAElB,CAEO,SAAS0G,GAAyBe,EAAwBzH,GAC7D,OAAOhT,UAAY,IAAA0a,EACf,IACI,MAAMC,EAAoBpa,GAAAA,GAAA,GACnBka,GAAM,IACTlB,QAAOhZ,GAAAA,GAAA,GACAka,EAAOlB,SAAO,IACjBqB,iBAAiB,MAGnBhH,QAAYnS,EAAAA,GAAQoZ,eAAeF,GAAM,GACzC9Y,EAAe+R,EAAIjP,MAAQ4P,EAAAA,GAAqBE,GAEtD,OAAQ5S,GACR,KAAK0S,EAAAA,GAAqBE,GACtB,MAAO,CAACrU,KAAMwT,GAClB,KAAKW,EAAAA,GAAqBuG,MACtB,MAAO,CAAC3a,MAAOyT,GACnB,KAAKW,EAAAA,GAAqBC,KACtB,GAAa,QAATkG,EAAC9G,EAAI5B,YAAI,IAAA0I,IAARA,EAAU7G,OAAQ,CACnB,MAAMiB,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,oCACJ0S,eAAgB,yEAEpB,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,CAGA,OADAiG,EAAAA,EAAAA,IAAUnH,EAAI5B,MACP,CAAC5R,KAAMwT,GAElB,KAAKW,EAAAA,GAAqBG,SAAU,CAChC,IAAKd,EAAIoH,gBAAiB,CACtB,MAAMlG,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,uCACJ0S,eAAgB,sEAEpB,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,CACA,IAAImG,EAAAA,GAAAA,IAAmBrH,EAAIoH,iBAAiBE,EAAAA,GAAAA,OAExC,OADAC,OAAOC,KAAKxH,EAAIoH,iBACT,CAAC5a,KAAMwT,GAElB,MAAMyH,EAAczH,EAAIoH,gBAAgBM,YAAWJ,EAAAA,GAAAA,OAAgBtH,EAAIoH,gBAAgBO,OAAML,EAAAA,GAAAA,MAAarI,QAAUe,EAAIoH,gBAExH,OADAQ,EAAAA,GAAAA,KAAaC,KAAKJ,GACX,CAACjb,KAAMwT,EAClB,CACA,QAAS,CACL,MAAMkB,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,oCACJ0S,eAAgB,2DACjB,CAACvO,KAAM9C,IACV,MAAO,CAAC1B,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,EAEJ,CAAE,MAAO3U,GACL,MAAM2U,EAAS3U,EAAM0I,SAAWmK,EAAKC,cAAc,CAC/CzS,GAAI,wCACJ0S,eAAgB,kCAEpB,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,EAER,CAEO,SAASiF,GAA4BY,EAAsB3H,GAC9D,OAAOhT,UAAY,IAAA0b,EACf,IACI,MAAM9H,QAAYnS,EAAAA,GAAQoZ,eAAeF,GAAM,GACzC9Y,EAAe+R,EAAIjP,MAAQ4P,EAAAA,GAAqBE,GAEtD,OAAQ5S,GACR,KAAK0S,EAAAA,GAAqBuG,MACtB,MAAO,CAAC3a,MAAOyT,GACnB,KAAKW,EAAAA,GAAqBC,KACtB,GAAa,QAATkH,EAAC9H,EAAI5B,YAAI,IAAA0J,IAARA,EAAU7H,OAAQ,CACnB,MAAMiB,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,oCACJ0S,eAAgB,yEAEpB,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,CAEA,OADAiG,EAAAA,EAAAA,IAAUnH,EAAI5B,MACP,CAAC5R,KAAMwT,GAClB,QAAS,CACL,MAAMkB,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,oCACJ0S,eAAgB,2DACjB,CAACvO,KAAM9C,IACV,MAAO,CAAC1B,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,EAEJ,CAAE,MAAO3U,GACL,MAAM2U,EAAS3U,EAAM0I,SAAWmK,EAAKC,cAAc,CAC/CzS,GAAI,wCACJ0S,eAAgB,kCAEpB,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,EAER,CAEO,SAASoF,GAAyBS,EAAsB3H,GAC3D,OAAOhT,UACH,IACI,MAAM4T,QAAYnS,EAAAA,GAAQoZ,eAAeF,GAAM,GACzC9Y,EAAe+R,EAAIjP,MAAQ4P,EAAAA,GAAqBE,GAEtD,OAAQ5S,GACR,KAAK0S,EAAAA,GAAqBE,GACtB,MAAO,CAACrU,KAAMwT,GAClB,KAAKW,EAAAA,GAAqBuG,MACtB,MAAO,CAAC3a,MAAOyT,GAEnB,QAAS,CACL,MAAMkB,EAAS9B,EAAKC,cAAc,CAC9BzS,GAAI,oCACJ0S,eAAgB,2DACjB,CAACvO,KAAM9C,IACV,MAAO,CAAC1B,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,EAEJ,CAAE,MAAO3U,GACL,MAAM2U,EAAS3U,EAAM0I,SAAWmK,EAAKC,cAAc,CAC/CzS,GAAI,wCACJ0S,eAAgB,kCAEpB,MAAO,CAAC/S,OAAOmZ,EAAAA,EAAAA,IAAsBxE,GACzC,EAER,CAEO,SAAS6G,GAAkBC,GAC9B,MAAO,CAACC,EAAmB/X,IAChB9D,UACH,IAII,MAAO,CAACI,YAHkBqB,EAAAA,GAAQqa,gBAAgBD,EAAW/X,IAC1B8I,QAAQmP,GAAMA,EAAEH,WAAaA,IAChCI,QAAO,CAACC,EAAqBC,IAAwBD,EAAM7R,OAAO8R,EAAQC,UAAY,KAAK,IAE/H,CAAE,MAAAC,GACE,MAAO,CAAChc,KAAM,GAClB,EAGZ,CAEO,SAASic,GAAcrK,EAAeuH,GACzC,OAAO+C,EAAAA,EAAAA,GAAU,CACbC,QAASC,GAAAA,GAAiBC,WAC1BC,WAAYpK,GACZqK,YAAa,CACT3K,OACAuH,YAGZ,CAEO,SAASqD,GAAiCC,EAA2BhU,EAAiBiU,GAAY,IAAAC,EACrG,OAAOC,EAAAA,GAAAA,IACHnU,EACAiU,EAAKG,WACLH,EAAKI,SAAWJ,EAAKtc,GACA,QADEuc,EACvBF,EAASM,oBAAY,IAAAJ,OAAA,EAArBA,EAAuBK,YAE/B,CAEO,SAASC,GAAoCR,EAA2BhU,EAAiByU,GAAmB,IAAAC,EAC/G,OAAOP,EAAAA,GAAAA,IACHnU,EACAyU,EACA,GACqB,QADnBC,EACFV,EAASM,oBAAY,IAAAI,OAAA,EAArBA,EAAuBH,YAE/B,CAEO,SAASzD,GAAoCkD,EAA2BhU,EAAiB0Q,GAAqB,IAAAiE,EACjH,OAAOR,EAAAA,GAAAA,IACHnU,EACA0Q,EAAQ0D,WACR1D,EAAQ2D,SAAW3D,EAAQkE,QACN,QADaD,EAClCX,EAASM,oBAAY,IAAAK,OAAA,EAArBA,EAAuBJ,YAE/B,CAEO,SAASM,GAAwCb,EAA2BhU,EAAiB8U,GAAmB,IAAAC,EACnH,OAAOZ,EAAAA,GAAAA,IACHnU,EACA8U,EAAKV,WACLU,EAAKT,QACgB,QADTU,EACZf,EAASM,oBAAY,IAAAS,OAAA,EAArBA,EAAuBR,YAE/B,C,6JC/PO,SAASS,IACZ,OAAO7d,UACH,IAEI,MAAO,CAACI,WADmBqB,EAAAA,GAAQoc,kBAEvC,CAAE,MAAOjV,GACL,MAAO,CAACzI,MAAOyI,EAAEC,QACrB,EAER,CAEO,SAASiV,IAAkC,IAAZlb,EAAK8M,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAE1C,OADA1H,EAAAA,EAAAA,IAAW,MAAO,+BACXhI,UACH,IAEI,aADkByB,EAAAA,GAAQqc,sBAAsBlb,IACrCxC,KAAK2d,QACpB,CAAE,MAAO5d,GACL,OAAO,CACX,EAER,CAcO,SAAS6d,IACZ,OAAOhe,UACH,IACIF,EAAS,CACL6E,KAAMsZ,EAAAA,GAAWC,uBAErB,MAAMC,QAAe1c,EAAAA,GAAQuc,iBACzBG,GACAre,EAAS,CACL6E,KAAMsZ,EAAAA,GAAWG,sBACjBhe,KAAM+d,GAGlB,CAAE,MAAOhe,GAIL,OAHAL,EAAS,CACL6E,KAAMsZ,EAAAA,GAAWI,sBAEdle,CACX,CACA,OAAO,CAAI,CAEnB,CAEO,SAASme,IACZ,OAAOte,UACH,IACI,MAAMme,QAAe1c,EAAAA,GAAQ8c,gBACzBJ,GACAre,EAAS,CACL6E,KAAMsZ,EAAAA,GAAWO,wBACjBpe,KAAM+d,EAAOM,OAGzB,CAAE,MAAOte,GACL,OAAOA,CACX,CACA,OAAO,CAAI,CAEnB,CAEO,SAASue,IACZ,OAAO1e,UACH,IACI,MAAMme,QAAe1c,EAAAA,GAAQid,gBAE7B,GAAIP,EAAQ,CAER,MAAMQ,EAAwB,EAAfR,EAAOS,MACtB9e,EAAS,CACL6E,KAAMsZ,EAAAA,GAAWY,qBACjBze,KAAMue,GAEd,CACJ,CAAE,MAAOxe,GACL,OAAOA,CACX,CACA,MAAO,CAACC,MAAM,EAAK,CAE3B,CAEO,SAAS0e,IACZ,OAAO9e,UACH,IACI,MAAMme,QAAe1c,EAAAA,GAAQqd,gBACzBX,GACAre,EAAS,CACL6E,KAAMsZ,EAAAA,GAAWc,qBACjB3e,KAAM,CAAC4e,OAAQb,EAAOa,OAAQC,cAAed,EAAOe,iBAGhE,CAAE,MAAO/e,GACL,OAAOA,CACX,CACA,MAAO,CAACC,MAAM,EAAM,CAE5B,CAEO,SAAS+e,IACZ,MAAO,CAACrf,EAAUsf,KACd,MAAMjL,GAASkL,EAAAA,EAAAA,IAAeD,KAC9B,OAAmC,IAA/BvV,OAAO+I,KAAKuB,GAAQtB,SAIpBsB,EAAOmL,cACPxf,GAASyf,EAAAA,EAAAA,OAGTpL,EAAOqL,UACP1f,GAAS2f,EAAAA,EAAAA,OAGTtL,EAAOuL,UACP5f,GAAS6f,EAAAA,EAAAA,OAGTxL,EAAOyL,UACP9f,GAAS+f,EAAAA,EAAAA,OAGT1L,EAAO2L,QACPhgB,EAASke,MApBF,CAAC5d,MAAM,EAuBC,CAE3B,C,wkCC5HO,SAAS2f,EAAUne,EAA8Foe,GAAuD,IAApJ,KAAC7c,EAAI,KAAEyG,EAAI,KAAEjF,EAAI,OAAEsb,EAAM,UAAEpE,EAAS,SAAEva,EAAQ,WAAE4e,EAAU,UAAEC,EAAS,QAAEC,GAAoBxe,EAClH,MAAO,CAAC9B,EAAUsf,KACdtf,EAAS,CAAC6E,KAAM0b,EAAAA,GAAUC,uBAE1B,IAAI9V,EAAM/I,EAAAA,GAAQ8e,gBACdP,IACAxV,GAAO,kBAGX,MAAMgW,EAAM,IAAIC,eAEhBD,EAAIpF,KAAK,OAAQ5Q,GAAK,GAEtB,MAAMkW,EAAiBjf,EAAAA,GAAQkf,WAAW,CAACC,OAAQ,SAASC,QAC5DhX,OAAO+I,KAAK8N,GAAgBvO,SAAS2O,IACjC,MAAMC,EAAqBL,EAAeI,GACtCC,GACAP,EAAIQ,iBAAiBF,EAAeC,EACxC,IAGJP,EAAIQ,iBAAiB,SAAU,oBAE/B,MAAMC,EAAW,IAAIC,SAkGrB,OAjGAD,EAASE,OAAO,aAActF,GAC9BoF,EAASE,OAAO,aAAc7f,GAC9B2f,EAASE,OAAO,QAAShe,EAAMyG,GAE3BsW,GAAcM,EAAIY,SAClBZ,EAAIY,OAAOC,WAAcC,IACrB,MAAMC,EAAUhU,KAAKiU,MAAOF,EAAMG,OAASH,EAAMI,MAAS,KAO1DxB,EANwB,CACpB5e,WACAsI,OACA2X,UACA5c,QAEuB,GAI/Bwb,IACAK,EAAImB,OAAS,KACT,GAAmB,MAAfnB,EAAI1X,QAAqC,IAAnB0X,EAAIoB,WAAkB,CAC5C,MAAM/E,EAAWgF,KAAKC,MAAMtB,EAAI3D,UAC1Bzc,EAAOyc,EAASkF,WAAWjV,KAAI,CAACkV,EAAoB5J,IACtD7X,EAAAA,EAAA,GACOyhB,GAAQ,IACX1gB,SAAUub,EAASoF,WAAW7J,OAItCtY,GAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAM0b,EAAAA,GAAU8B,sBAChB/hB,OACAyb,YACAoE,UAEJ,CACItb,KAAM0b,EAAAA,GAAU+B,yBAIxBjC,EAAUtD,EAAUhB,EAAWoE,EACnC,MAAO,GAAIO,EAAI1X,QAAU,KAA0B,IAAnB0X,EAAIoB,WAAkB,CAClD,IAAI5N,EAAe,GACnB,IACI,MAAMD,EAAgB8N,KAAKC,MAAMtB,EAAI3D,UACrC7I,EACCD,SAAAA,EAAevT,IAAfuT,MAAqBA,GAAAA,EAAelL,SAAWwZ,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAIuT,EAAcvT,GAAI0S,eAAgBa,EAAclL,WAAYwZ,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,4BAA6B0S,eAAgB,6CACvM,CAAE,MAAOtK,GACLoL,GAAeqO,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,4BAA6B0S,eAAgB,6CACrF,CAEApT,EAAS,CACL6E,KAAM0b,EAAAA,GAAUiC,qBAChBC,UAAW,CAACjhB,GACZua,YACAoE,WAGJG,SAAAA,EAAUpM,EAAc1S,EAAUua,EAAWoE,EACjD,IAIJG,IACAI,EAAIgC,QAAU,KACV,GAAuB,IAAnBhC,EAAIoB,YAAgD,IAA5BpB,EAAIiC,aAAa5P,OAAc,CACvD,MAAMkB,EAAgB8N,KAAKC,MAAMtB,EAAI3D,WAErC6F,EAAAA,EAAAA,IAAuB3O,EAAejU,EAAUsf,GAEhD,MAAMuD,EAAsB,CACxBhe,KAAM0b,EAAAA,GAAUiC,qBAChBC,UAAW,CAACjhB,GACZua,YACAoE,SACA9f,MAAO4T,GAGXjU,GAASoiB,EAAAA,EAAAA,IAAa,CAACS,GAAqBC,EAAAA,EAAAA,IAAkB7O,MAC9DqM,EAAQrM,EAAezS,EAAUua,EAAWoE,EAChD,KAAO,CACH,MAAMjM,EAA8B,IAAfwM,EAAI1X,QAAiB0X,EAAI1X,QAA2HuZ,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,+BAAgC0S,eAAgB,2DAA6D,KAAOsN,EAAI1X,OAAS,KAAxQuZ,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,4BAA6B0S,eAAgB,8CAEzHpT,EAAS,CACL6E,KAAM0b,EAAAA,GAAUiC,qBAChBC,UAAW,CAACjhB,GACZua,YACAoE,WAGJG,EAAQ,CAACvX,QAASmL,GAAe1S,EAAUua,EAAWoE,EAC1D,IAIRO,EAAIqC,KAAK5B,GAEFT,CAAG,CAElB,C,2hBCxIA,MAAMsC,EAAelhB,IAGR,IAHS,SAClB4Q,EAAQ,SACR6D,GACIzU,EACJ,MAAO0T,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,GAC3BhQ,GAAOiQ,EAAAA,EAAAA,WAEP7M,GAAS8M,EAAAA,EAAAA,cAAY,KACvBH,GAAQ,EAAM,GACf,IAEGI,GAAeC,EAAAA,EAAAA,UAAQ,KACzB,GAAK5Q,EAGL,OAAOA,EAAS1F,KACXyG,GACG9J,IAAAA,cAAC4Z,EAAAA,EAAKC,YAAW,CACbnc,IAAKoM,EAAQ/S,GACbA,GAAI+S,EAAQ/S,GACZyT,KAAMV,EAAQU,KACdsP,QAAShQ,EAAQgQ,QACjBC,OAAQjQ,EAAQiQ,OAChB5W,OAAQ2G,EAAQ3G,OAChB6W,MAAM,KAEjB,GACF,CAACjR,IAEJ,OACI/I,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAiB,2CACjBb,KAAMA,EACNc,OAAQA,EACRC,SAAUA,EACVqN,cAAc,EACdljB,GAAG,eACH+V,KAAK,QAEL9M,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,CACP,cAAa,mBACb6B,QAAS3C,GAET3M,IAAAA,cAACka,EAAAA,EAAW,KACRla,IAAAA,cAAC4Z,EAAAA,EAAI,CACDO,UAAU,EACVC,UAAW7Q,EAAKC,cAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,oBAE9EiQ,GAEL1Z,IAAAA,cAAA,cAGJ,EAEdqZ,EAAAhR,UAAA,CA1DEuE,SAAQ9G,IAAAA,KAAAC,YA4DZ,QAAe/F,IAAAA,KAAWqZ,G,+ECrB1B,MAAMhjB,EAAWC,EAAAA,QAAMD,SACjBsf,EAAWrf,EAAAA,QAAMqf,SAEhB,SAAS0E,EAAsBzW,IAClC,SAAyB0W,GACrB,MAAMhiB,EAAQqd,IACRze,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAC1B+B,EAASigB,EAAKE,UAAWC,EAAAA,EAAAA,IAAiBniB,GAC1CoiB,GAAcC,EAAAA,EAAAA,GAAariB,GAC3BsiB,GAAuBC,EAAAA,EAAAA,IAAYviB,KAAWwiB,EAAAA,GAAUC,IACxDC,GAAwBH,EAAAA,EAAAA,IAAYviB,KAAWwiB,EAAAA,GAAUG,cACzDC,GAASC,EAAAA,EAAAA,IAAmB7iB,EAAOgiB,EAAKvjB,IACxCqkB,GAAmBC,EAAAA,EAAAA,IAAoB/iB,GACvCgjB,GAAmBC,EAAAA,EAAAA,IAAoBjjB,GAE7CjC,GAASmlB,EAAAA,EAAAA,IAAgBlB,EAAKvjB,KAE9B,MAAM0kB,EAAcC,EAAAA,EAAkBC,uBAAuBzkB,EAAQmD,GAC/DuhB,EAAkBF,EAAAA,EAAkBG,sBAAsB3kB,EAAQmD,GACpEohB,IAAgBnB,EAAKna,OACrBub,EAAAA,EAAkBI,0BAA0B5kB,EAAQmD,EAAQohB,GAC5DC,EAAAA,EAAkBK,uBAAuB7kB,EAAQmD,EAAQigB,EAAKna,OAG9Dyb,IAAoBI,EAAAA,GAAoBC,UAAYR,IAAgBnB,EAAKna,OACzEub,EAAAA,EAAkBQ,sBAAsBhlB,EAAQmD,EAAQ2hB,EAAAA,GAAoBC,UAC5EP,EAAAA,EAAkBS,yBAAyBjlB,EAAQmD,EAAQuhB,IAK3DlB,GAAeE,GACfvkB,GAAS+lB,EAAAA,EAAAA,IAAetB,EAAAA,GAAUC,IAAKT,EAAKvjB,GAAIukB,IAGhDZ,GAAeM,GACf3kB,GAAS+lB,EAAAA,EAAAA,IAAetB,EAAAA,GAAUG,cAAeX,EAAKvjB,GAAIukB,IAG1DF,IACAiB,EAAAA,EAAAA,MAGJhmB,GAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAMohB,EAAAA,GAAaC,eACnB5lB,KAAM2jB,EAAKvjB,IAEf,CACImE,KAAMc,EAAAA,GAAYwgB,2BAClB7lB,KAAM2jB,EAAKvjB,GACX6M,QAAS0W,EACTY,OAAQA,GAAU,CAAC,GAEvBuB,EAAqBnkB,EAAOgiB,OAG5BoC,EAAAA,EAAAA,IAAYpkB,IACZjC,GAASsmB,EAAAA,EAAAA,GAAiBrC,EAAKvjB,IAEvC,CAEA6lB,CAAgBhZ,EACpB,CAEA,SAAS6Y,EAAqBnkB,EAAoBsL,GAC9C,MAAMsX,GAASC,EAAAA,EAAAA,IAAmB7iB,EAAOsL,EAAQ7M,IAC3C8lB,GAAeC,EAAAA,EAAAA,IAAuBxkB,EAAOsL,EAAQ7M,IAE3D,IAAIgmB,GAAc,EACdC,GAAa,EACjB,GAAI9B,GAAU2B,EAAc,CACxB,MAAMI,GAAaC,EAAAA,EAAAA,IAA0B5kB,GAEvC6kB,GAAcC,EAAAA,EAAAA,IAAqBP,EAAc3B,EAAQ+B,GAE/DF,EAAcI,EAAYE,SAAW,EACrCL,EAAaG,EAAYG,YAAcH,EAAYI,SAAW,CAClE,CAEA,MAAO,CACHriB,KAAMc,EAAAA,GAAYwhB,wBAClBpL,UAAWxO,EAAQ7M,GACnBgmB,cACAC,aAER,CAEO,MAAMS,EAAyB,CAClCviB,KAAMc,EAAAA,GAAYwhB,wBAClBpL,UAAW,IAGR,SAASsL,EAA6BtL,GAA8C,IAA3BuL,EAAY1X,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2X,KAAKC,MAChF,MAAO,CACH3iB,KAAMc,EAAAA,GAAY8hB,8BAClBtK,WAAYpB,EACZ2L,eAAgBJ,EAExB,CAEO,SAASK,IACZ3nB,GAAS4nB,EAAAA,EAAAA,MACb,CAEO,SAASC,EAAuBnV,GACnC,MAAMoV,EAAmB,CACrBrL,QAASC,EAAAA,GAAiBqL,eAC1BnL,WAAYoG,EACZnG,YAAa,CACTnK,aAIR1S,GAASwc,EAAAA,EAAAA,GAAUsL,GACvB,CAEO,SAAS5K,EAAkBnU,EAAiBgT,EAAoBiM,EAAmBnnB,GACtF,MAAO,CAAConB,EAAYC,KAChB,MAAMC,EAAY5d,EAAAA,KACZyS,EAAO,CACTtc,GAAI6J,EAAAA,KACJ6d,QAASvnB,GAAU,IACnBsc,WAAYpB,IAAaiJ,EAAAA,EAAAA,IAAoBkD,KAC7Cnf,UACAlE,KAAMwjB,EAAAA,GAAUC,UAChBC,UAAWJ,EACXK,UAAWL,EACX/K,QAAS4K,GAAY,GACrB3e,MAAO,CAAC,GAGZ,OAAO4e,GAAWQ,EAAAA,EAAAA,IAAczL,GAAM,CAE9C,CAEO,SAAS0L,GAA8B3b,EAAmB4b,EAAuBC,EAAqB7M,GAAuD,IAApC8M,EAAUjZ,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAAIuY,EAAiBvY,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EAC9J,MAAMqY,EAAO,CACTtc,GAAI6J,EAAAA,KACJ6d,QAASrb,EAAKrM,GACdyc,WAAYpB,IAAaiJ,EAAAA,EAAAA,IAAoB1F,KAC7CvW,QAAS,GACTlE,KAAMwjB,EAAAA,GAAUS,yBAChBP,UAAWJ,EACXK,UAAWL,EACX/K,QAASyL,EACTxf,MAAO,CACHa,SAAU6C,EAAK7C,SACfye,gBACAC,gBAIR5oB,GAASyoB,EAAAA,EAAAA,IAAczL,GAC3B,CAEA,IAAI+L,GAAqB,EAClB,SAASC,GAAyBjN,EAAmBkN,GA4BxD,OAAOjpB,GA3B6BE,MAAOgpB,EAAgBC,KACvD,MAAMlnB,EAAQknB,IACR7kB,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GAEzB,IACIonB,EAAAA,EAAAA,IAA8BpnB,KAC9BqnB,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAYC,+BAAgCD,EAAAA,GAAYE,8BAEvE,MAAO,CAACnpB,MAAM,GAGlB,MAAMopB,EAAInC,KAAKC,MACTmC,GAAQC,EAAAA,EAAAA,IAAuB3nB,GAC/B4nB,EAAmBF,EAAQA,EAAMG,aAAe,EAEhDC,EAA2Cxf,EAAAA,EAAqBjG,EAAO0lB,0CACvEC,EAA6B1f,EAAAA,EAAqBjG,EAAO4lB,4BAQ/D,OANMR,EAAIX,GAAsBgB,GAC3BF,EAAmBI,GAAoE,SAApC3lB,EAAO6lB,2BAC3DC,EAAAA,EAAgBC,WAAWtO,EAAWkN,GACtCF,GAAqBW,GAGlB,CAACppB,MAAM,EAAK,GAI3B,CAEO,SAAS0C,KAAuF,IAAhEsnB,EAAU1a,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,IAAK2a,IAAkB3a,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,KAAAA,UAAA,MAAmBA,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,KAAAA,UAAA,KAItFyV,EAAAA,EAAkBmF,gBAAe,GAGrCxqB,GAASyqB,EAAAA,EAAAA,OAAU5U,MAAK,KAChB0U,IACAG,EAAAA,EAAaC,eACbC,EAAAA,EAAWD,gBAGfD,EAAAA,EAAaG,+CAEbC,EAAAA,MAEAC,EAAAA,EAAAA,MAEArP,EAAAA,EAAAA,KAAaC,KAAK2O,EAAW,IAC9BU,OAAM,MACLtP,EAAAA,EAAAA,KAAaC,KAAK2O,EAAW,GAErC,CAEO,SAASW,KACZ,OAAQhD,IACJA,GAAWL,EAAAA,EAAAA,OACXK,GAAWiD,EAAAA,EAAAA,OACXjD,GAAWkD,EAAAA,EAAAA,MAAe,CAElC,CAEO,SAASC,GAAiBC,GAC7BrrB,EAAS,CACL6E,KAAMc,EAAAA,GAAY2lB,qBAClBD,SAER,CAEOnrB,eAAeqrB,GAAoCxe,EAAmBye,GACzE,IAAIvpB,EAAQqd,IACR/R,EAAU,KAEd,MAAMke,GAAWC,EAAAA,EAAAA,IAAgBzpB,EAAOupB,EAAK9qB,IAC7C,IAAK+qB,GAA6C,IAAjC1hB,OAAO+I,KAAK2Y,GAAU1Y,OACnC,OAAO,KAGX,IAAI4Y,GAAeC,EAAAA,EAAAA,IAAyB3pB,EAAOupB,EAAK9qB,IACnDirB,GAAqD,IAArC5hB,OAAO+I,KAAK6Y,GAAc5Y,eAErC/S,GAAS6rB,EAAAA,EAAAA,IAAwBL,EAAK9qB,KAC5CuB,EAAQqd,IACRqM,GAAeC,EAAAA,EAAAA,IAAyB3pB,EAAOupB,EAAK9qB,KAGxD,MAAM6I,EAAc8b,EAAAA,EAAkBC,uBAAuBvY,EAAKrM,GAAI8qB,EAAK9qB,IAQ3E,IAAIorB,EAoBJ,OA3BAve,EAAUoe,EAAapiB,QAEA,IAAZgE,IAEPA,GADewe,EAAAA,EAAAA,IAAqB9pB,GACnB6S,MAAMkX,GAAkBA,EAAcliB,OAASP,KAIhEgE,IACAue,GAAgBhH,EAAAA,EAAAA,IAAmB7iB,EAAOsL,EAAQ7M,KAGjD6M,GAAYue,UAEP9rB,GAASisB,EAAAA,EAAAA,IAA4BT,EAAK1hB,KAAMP,IACtDtH,EAAQqd,IACRqM,GAAeC,EAAAA,EAAAA,IAAyB3pB,EAAOupB,EAAK9qB,IACpD6M,EAAUoe,EAAapiB,GACvBuiB,GAAgBhH,EAAAA,EAAAA,IAAmB7iB,EAAOsL,GAAWA,EAAQ7M,KAG5D6M,GAAYue,IAEbve,EAAUoe,GADoBO,EAAAA,EAAAA,IAA8BjqB,EAAOupB,EAAK9qB,KAExEorB,GAAgBhH,EAAAA,EAAAA,IAAmB7iB,EAAOsL,GAAWA,EAAQ7M,KAG7D6M,GAAWue,EACJve,EAEJ,IACX,CAEA,SAAS4e,GAA2BC,EAAcC,GAC1CA,GACA3Q,EAAAA,EAAAA,KAAaC,KAAK,CACd2Q,SAAUF,EACVG,OAAQF,EAAY1e,cAGxB+N,EAAAA,EAAAA,KAAaC,KAAKyQ,EAE1B,CAEOlsB,eAAessB,GAA0BC,GAC5C,IAAIxqB,EAAQqd,IAGRvS,GAAO2f,EAAAA,EAAAA,IAAezqB,GAC1B,MAAM0qB,EAAiBpiB,EAAAA,IAAoBqiB,EAAAA,EAAAA,IAAmB3qB,MAAY8K,EACpE8f,GAAwBC,EAAAA,EAAAA,IAA2B7qB,GAOzD,GANI0qB,UACM3sB,GAAS+sB,EAAAA,EAAAA,OACf9qB,EAAQqd,IACRvS,GAAO2f,EAAAA,EAAAA,IAAezqB,KAGrB8K,EACD,OAIJ,MAAMigB,GAAmBC,EAAAA,EAAAA,IAAahrB,GAEhCirB,GAASC,EAAAA,EAAAA,GAAiBlrB,GAC1B+B,EAASqhB,EAAAA,EAAkB+H,kBAAkBrgB,EAAKrM,IAExD,IAYI8qB,EAZA6B,GAAUC,EAAAA,EAAAA,IAAWrrB,GAEzB,GAAqB,KADPsrB,EAAAA,EAAAA,IAAmBtrB,GACvB8Q,OACN,OAAIia,GAAoBH,OACpBV,GAA2B,uBAAwBM,QAIvDN,GAA2B,eAAgBM,GAS/C,GAJIzoB,IACAwnB,GAAOgC,EAAAA,EAAAA,IAAQvrB,EAAO+B,IAGtBwnB,GAA2B,IAAnBA,EAAKiC,UAAiB,CAC9B,MAAMlgB,QAAgBge,GAAoCxe,EAAMye,GAChE,GAAIje,EAIA,OAHAvN,GAAS0tB,EAAAA,EAAAA,IAAwBlC,EAAK9qB,IAAI,IAC1CV,GAAS2tB,EAAAA,EAAAA,IAAcpgB,EAAQ7M,UAC/ByrB,GAA2B,IAAD7hB,OAAKkhB,EAAK1hB,KAAI,cAAAQ,OAAaiD,EAAQzD,MAAQ2iB,EAG7E,CAEAY,GAAUO,EAAAA,EAAAA,GAAgCP,EAASH,GAEnD,IAAK,MAAMW,KAAUR,EAAS,CAE1B,MAAM9f,QAAgBge,GAAoCxe,EAAM8gB,GAChE,GAAItgB,EAGA,OAFAvN,GAAS2tB,EAAAA,EAAAA,IAAcpgB,EAAQ7M,UAC/ByrB,GAA2B,IAAD7hB,OAAKujB,EAAO/jB,KAAI,cAAAQ,OAAaiD,EAAQzD,MAAQ2iB,EAG/E,CAEAN,GAA2B,eAAgBM,EAC/C,C,0DClZO,SAASqB,EAAsBxS,GAClC,MAAO,CACHzW,KAAMc,EAAAA,GAAYooB,4BAClBzS,OAER,CAEO,SAAS0S,EAAyB1S,GACrC,MAAO,CACHzW,KAAMc,EAAAA,GAAYsoB,gCAClB3S,OAER,C,+8CC+CO,SAAS4S,IACZ,OAAOhuB,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACR6O,GAAiBC,EAAAA,EAAAA,IAAkBnsB,GACnCosB,GAAiBC,EAAAA,EAAAA,IAAgCrsB,GACjD+pB,GAAgBuC,EAAAA,EAAAA,IAAyCtsB,GACzDusB,EAAWzkB,OAAOC,OAAO,CAAC,EAAGqkB,EAAgBrC,GAEnD,IAAIyC,GAAoBC,EAAAA,EAAAA,IAAiBF,GAAUG,EAAAA,EAAAA,IAAyB1sB,IAM5E,OAJIksB,aAAc,EAAdA,EAAgBztB,MAAO+tB,EAAmB/tB,KAC1C+tB,GAAoBC,EAAAA,EAAAA,IAAiBF,GAAUtC,EAAAA,EAAAA,IAA8BjqB,GAAOmiB,EAAAA,EAAAA,IAAiBniB,MAGlGjC,EAASumB,EAAgBkI,GAAoB,CAE5D,CAEO,SAASG,EAAoB7S,GAChC,OAAO7b,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACR/R,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,OAAIxO,EACOvN,EAASumB,EAAgBhZ,IAE7B,CAACjN,MAAM,EAAK,CAE3B,CAcO,SAASimB,EAAgBhZ,GAC5B,OAAOrN,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRwP,EAAiBvhB,EAAQ4W,QACzB4K,EAAUD,GAAiBE,EAAAA,EAAAA,IAAmB/sB,EAAO6sB,IAAkBG,EAAAA,EAAAA,IAA0BhtB,GAEvG,GAAIsL,EAAQ1M,OAAQ,CAChB,MAAMqJ,EAAWqD,EAAQ1M,OAAS0M,EAAQzD,KAAOyD,EAAQ/D,aACnDuD,GAAOmiB,EAAAA,EAAAA,IAAkBjtB,EAAOiI,GACtC,IAAK6C,EACD,MAAO,CAAC1M,OAAO,GAInB,UADqBL,GAASmvB,EAAAA,EAAAA,IAA0BpiB,EAAKrM,MAClDL,MACP,MAAO,CAACA,OAAO,IAEnBqb,EAAAA,EAAAA,KAAaC,KAAK,GAADrR,OAAIykB,EAAO,eAAAzkB,OAAciD,EAAQzD,MACtD,MAAO,GAAIyD,EAAQ1I,OAASuqB,EAAAA,GAAUC,WAAY,CAC9C,MAAMC,GAAYT,EAAAA,EAAAA,GAAW5sB,EAAOsL,EAAQ7M,IAC5C,GAAK4uB,UAAAA,EAAWxlB,KACZ,MAAO,CAACzJ,OAAO,IAEnBqb,EAAAA,EAAAA,KAAaC,KAAK,GAADrR,OAAIykB,EAAO,cAAAzkB,OAAaglB,EAAUxlB,MACvD,MAAWyD,EAAQ1I,OAASuqB,EAAAA,GAAUG,SAClC7T,EAAAA,EAAAA,KAAaC,KAAK,GAADrR,OAAIykB,EAAO,KAAAzkB,OAAIiD,EAAQzD,QAExC4R,EAAAA,EAAAA,KAAaC,KAAK,GAADrR,OAAIykB,EAAO,cAAAzkB,OAAaiD,EAAQzD,OAGrD,MAAO,CAACxJ,MAAM,EAAK,CAE3B,CAEO,SAASkvB,EAAgBzT,GAC5B,OAAO7b,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRmQ,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjCytB,GAAgBtL,EAAAA,EAAAA,IAAiBniB,GAEvC,OAAOjC,GAAS2vB,EAAAA,EAAAA,IAAYF,EAAeC,EAAe3T,GAAW,CAE7E,CAEO,SAAS6T,EAAa7T,GACzB,OAAO7b,MAAOF,EAAUsf,KACpB,IAAIrd,EAAQqd,IACZ,MAAMmQ,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjC4tB,GAAcC,EAAAA,EAAAA,IAAe7tB,GACnC,IAAK4tB,EACD,MAAO,CAACvvB,MAAM,GAElB,MAAMiN,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAC5BgJ,GAAmBC,EAAAA,EAAAA,IAAoB/iB,IAEzC8tB,EAAAA,EAAAA,IAAkB9tB,EAAO8Z,IACzB/b,GAASgwB,EAAAA,EAAAA,IAAkBjU,IAG/B,MAAMgT,GAAUE,EAAAA,EAAAA,IAA0BhtB,IAErCguB,EAAAA,EAAAA,IAAkB1iB,IACnB8X,EAAAA,EAAkB6K,sBAAsBT,EAAeI,EAAYnvB,GAAIuB,GAE3E,MAAM,MAAC5B,SAAeL,GAASmwB,EAAAA,EAAAA,IAAkBpU,IACjD,GAAI1b,EACA,MAAO,CAACA,SAEZ4B,EAAQqd,IAER,MAAM8Q,EAAkB/K,EAAAA,EAAkBC,uBAAuBmK,EAAeI,EAAYnvB,GAAIuB,GAC1FosB,GAAiBC,EAAAA,EAAAA,IAAgCrsB,GACjDouB,GAAc3B,EAAAA,EAAAA,IAAiBL,EAAgB+B,GAChDC,IAAgBC,EAAAA,EAAAA,IAAwBruB,GAAOouB,EAAY3vB,KAC5D2kB,EAAAA,EAAkB6K,sBAAsBT,EAAeI,EAAYnvB,GAAIuB,GAE3E,MAAMsuB,GAAeC,EAAAA,EAAAA,IAAgBvuB,GAgBrC,OAfuBwuB,EAAAA,EAAAA,IAAkBxuB,KACK,IAAxBsuB,EAAaG,QAC/B1wB,GAAS4nB,EAAAA,EAAAA,OAGqH,KAA9H+I,EAAAA,EAAAA,IAAcrR,KAAYxS,QAAQ8jB,GAAMA,EAAE/rB,OAASuqB,EAAAA,GAAUyB,cAAgBD,EAAE/rB,OAASuqB,EAAAA,GAAU0B,kBAAiB/d,QACnHsS,EAAAA,EAAkB6K,sBAAsBT,EAAeI,EAAYnvB,GAAIuB,GACvEjC,GAAS+wB,EAAAA,EAAAA,IAAW,KACpB/wB,EAAS,CAAC6E,KAAMmsB,EAAAA,GAAUC,WAAY3wB,KAAMuvB,KAC5CnU,EAAAA,EAAAA,KAAaC,KAAK,MACXI,IAAcgJ,IAErBrJ,EAAAA,EAAAA,KAAaC,KAAKoT,GAGf,CACHzuB,MAAM,EACT,CAET,CAEO,SAAS4wB,EAAmB3nB,GAC/B,OAAOrJ,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRmQ,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GAWvC,OAVckvB,EAAAA,EAAAA,IAAalvB,GACrBoQ,SAASwd,IACX,MAAMuB,EAAkB/L,EAAAA,EAAkBC,uBAAuBmK,EAAeI,EAAYnvB,GAAIuB,GAC1FovB,EAAqBhM,EAAAA,EAAkBiM,0BAA0B7B,EAAeI,EAAYnvB,GAAIuB,GAClGsH,IAAgB6nB,EAChB/L,EAAAA,EAAkB6K,sBAAsBT,EAAeI,EAAYnvB,GAAIuB,GAChEsH,IAAgB8nB,GACvBhM,EAAAA,EAAkBkM,6BAA6B9B,EAAeI,EAAYnvB,GAC9E,IAEG,CACHJ,MAAM,EACT,CAET,CAEO,SAASkxB,EAA2BC,EAAgB1V,GACvD,MAAM2V,GAA0BC,EAAAA,EAAAA,KAChC,OAAOzxB,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRoQ,GAAgBtL,EAAAA,EAAAA,IAAiBniB,GAEjC8a,QAAiB/c,GAAS2M,EAAAA,EAAAA,IAAkB8kB,EAAQ/B,EAAe3T,IAEnEzb,EAAOyc,EAASzc,KACtB,OAAIA,EACAG,EAAAA,EAAA,GACOsc,GAAQ,IACXzc,KAAIG,EAAAA,EAAA,GACGH,GAAI,IACPuM,MAAO6kB,EAAwBzvB,EAAO3B,EAAKuM,OAAS,IACpD+kB,eAAgBF,EAAwBzvB,EAAO3B,EAAKsxB,gBAAkB,QAK3E7U,CAAQ,CAEvB,CAEO,SAAS8U,EAAY9V,GAA4G,IAAzF+V,EAAQliB,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GACnD,OAAO1P,UACH,MAAM6xB,EAAOxK,KAAKC,MACdsK,GACA9xB,EAAS,CACL6E,KAAMc,EAAAA,GAAYqsB,2BAClBjW,YACA/S,OAAQipB,EAAAA,GAAcC,UAG9B,MAAM,KAAC5xB,EAAI,MAAED,SAAeL,EAASmyB,EAAAA,GAA2BpW,IAChE,GAAI1b,EAQA,OAPIyxB,GACA9xB,EAAS,CACL6E,KAAMc,EAAAA,GAAYqsB,2BAClBjW,YACA/S,OAAQipB,EAAAA,GAAcG,UAGvB,CACH/xB,QACAgyB,iBAAiB,EACjBC,iBAAiB,GAGzBtyB,GAASuyB,EAAAA,EAAAA,IAAkCjyB,EAAMkyB,QAEjD,MAAM9lB,EAAU,GAwBhB,OAvBAA,EAAQiP,KAAK,CACT9W,KAAMc,EAAAA,GAAY8sB,yBAClBnyB,KAAMyb,EACN2W,OAAQpyB,EAAMqyB,MAAM5f,SAGpB+e,GACAplB,EAAQiP,KAAK,CACT9W,KAAMc,EAAAA,GAAYqsB,2BAClBjW,YACA/S,OAAQipB,EAAAA,GAAcW,UAIH,KAAvBtyB,EAAMuyB,cACNnmB,EAAQiP,KAAK,CACT9W,KAAMc,EAAAA,GAAYmtB,mCAClB/W,YACAgW,SAIR/xB,GAASoiB,EAAAA,EAAAA,IAAa1V,IACf,CACH2lB,gBAAwC,KAAvB/xB,EAAMuyB,aACvBP,gBAAwC,KAAvBhyB,EAAMyyB,aAC1B,CAET,CAEO,SAASC,EAAgBjX,EAAmBkX,GAC/C,OAAO/yB,UACH,MAAM,KAACI,EAAI,MAAED,SAAeL,EAASmyB,EAAAA,GAA2BpW,EAAWkX,EAAeC,EAAAA,GAAMC,gBAAkB,IAClH,OAAI9yB,EACO,CACHA,QACAgyB,iBAAiB,EACjBC,iBAAiB,IAIzBtyB,EAAS,CACL6E,KAAMc,EAAAA,GAAY8sB,yBAClBnyB,KAAMyb,EACN2W,OAAQpyB,EAAMqyB,MAAM5f,SAEjB,CACHsf,gBAAwC,KAAvB/xB,EAAMuyB,aACvBP,gBAAwC,KAAvBhyB,EAAMyyB,cAC1B,CAET,CAEO,SAASK,EAAgBrX,GAC5B,OAAO7b,UACH,MAAM6xB,EAAOxK,KAAKC,OACZ,KAAClnB,EAAI,MAAED,SAAeL,EAASmyB,EAAAA,GAAqBpW,EAAW,EAAGmX,EAAAA,GAAMC,gBAAkB,IAEhG,OAAI9yB,EACO,CACHA,QACAgyB,iBAAiB,EACjBC,iBAAiB,IAIzBtyB,EAAS,CACL6E,KAAMc,EAAAA,GAAYmtB,mCAClB/W,YACAgW,SAGG,CACHzxB,OACA+xB,gBAAwC,KAAvB/xB,EAAMuyB,aACvBP,gBAAwC,KAAvBhyB,EAAMyyB,cAC1B,CAET,CAeO,SAASM,EAASvxB,GAI+C,IAJ9C,UACtBia,EAAS,OACTuX,EAAM,KACNzuB,GACkB/C,EAElB,OAAO5B,UACH,MAAMqzB,EAAuBnE,EAAAA,GAAU+D,gBAAkB,EASzD,IAAI9U,EAPJre,EAAS,CACL6E,KAAMc,EAAAA,GAAY6tB,cAClBlzB,MAAM,EACNyb,cAMAsC,EADAxZ,IAAS4uB,EAAAA,GAAiBC,gBACX1zB,EAASmyB,EAAAA,GAA2BpW,EAAWuX,EAHrD,EAGmEC,UAE7DvzB,EAASmyB,EAAAA,GAA0BpW,EAAWuX,EALpD,EAKkEC,IAG/E,MAAM,KAACjzB,GAAQ+d,EAET3R,EAAuB,CAAC,CAC1B7H,KAAMc,EAAAA,GAAY6tB,cAClBlzB,MAAM,EACNyb,cAGJ,OAAIsC,EAAOhe,MACA,CACHA,MAAOge,EAAOhe,MACdszB,YAAY,IAIpB3zB,GAASuyB,EAAAA,EAAAA,IAAkCjyB,EAAMkyB,QACjD9lB,EAAQiP,KAAK,CACT9W,KAAMc,EAAAA,GAAY8sB,yBAClBnyB,KAAMyb,EACN2W,OAAQpyB,EAAMqyB,MAAM5f,SAGxB/S,GAASoiB,EAAAA,EAAAA,IAAa1V,IAEf,CACHinB,WAAY9uB,IAAS4uB,EAAAA,GAAiBC,UAAmC,KAAvBpzB,EAAMyyB,aAA6C,KAAvBzyB,EAAMuyB,cACvF,CAET,CAEO,SAASe,EAAmB7X,EAAmB8X,GAAkD,IAAnC/B,EAAQliB,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GACzE,OAAO1P,MAAOF,EAAUsf,KACpB,MAAMyS,EAAOxK,KAAKC,MACZvlB,EAAQqd,IACRwU,GAAeC,EAAAA,EAAAA,GAAgB9xB,GACrC,IAAI+xB,EAAsBH,EAC1B,MAAMI,GAA6BC,EAAAA,EAAAA,GAA8BjyB,EAAO8Z,GAClErP,EAAU,GAEZunB,GAA8BA,EAA6BH,EAAaK,mBACxEH,EAAsBC,GAGtBnC,GACA9xB,EAAS,CACL6E,KAAMc,EAAAA,GAAYqsB,2BAClBjW,YACA/S,OAAQipB,EAAAA,GAAcC,UAI9B,MAAM,KAAC5xB,EAAI,MAAED,SAAeL,EAASmyB,EAAAA,GAA0BpW,EAAWiY,IA2B1E,OA1BI1zB,GACAoM,EAAQiP,KAAK,CACT9W,KAAMc,EAAAA,GAAYmtB,mCAClB/W,YACAgW,SAIJD,IACIzxB,EACAqM,EAAQiP,KAAK,CACT9W,KAAMc,EAAAA,GAAYqsB,2BAClBjW,YACA/S,OAAQipB,EAAAA,GAAcG,UAG1B1lB,EAAQiP,KAAK,CACT9W,KAAMc,EAAAA,GAAYqsB,2BAClBjW,YACA/S,OAAQipB,EAAAA,GAAcW,WAKlC5yB,GAASoiB,EAAAA,EAAAA,IAAa1V,IAEf,CAACpM,OAAMD,QAAM,CAE5B,CAEO,SAAS+zB,EAAqBrY,EAAmBsY,GACpD,OAAOn0B,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRgV,GAAwBC,EAAAA,EAAAA,IAA6BtyB,EAAO8Z,GAElE,IAAK9Z,EAAMuyB,SAAShC,MAAMiC,eAAe1Y,KAAeuY,EAIpD,OAHID,SACM,IAAIK,SAASC,GAAYC,WAAWD,EAASN,KAEhDr0B,EAAS6xB,EAAY9V,GAAW,IAG3C,MAAM8Y,GAAaC,EAAAA,EAAAA,IAAQ7yB,EAAOqyB,GAClC,OAAOt0B,EAAS4zB,EAAmB7X,EAAW8Y,EAAWtM,WAAW,GAAM,CAElF,CAEO,SAASwM,IACZ,MAAO,KACHC,EAAAA,EAAaC,KAAKC,EAAAA,GAAWC,2BAA2B,CAEhE,CAEO,SAASC,IACZ,MAAO,CAACp1B,EAAUsf,KACd,MAAMrd,EAAQqd,IACRyF,GAAmBC,EAAAA,EAAAA,IAAoB/iB,GACvCozB,GAAmBC,EAAAA,EAAAA,IAAiCrzB,GACpDszB,GAAiB9E,EAAAA,EAAAA,IAAkBxuB,IAEpCuzB,EAAAA,EAAAA,IAAiBlW,IAAYyF,IAC9B/kB,GAASy1B,EAAAA,EAAAA,IAAkB1Q,IAG3BsQ,GACAr1B,GAAS01B,EAAAA,EAAAA,IAAiBL,IAG1BtQ,GAAoBwQ,GACpBv1B,GAAS01B,EAAAA,EAAAA,IAAiBH,GAC9B,CAER,CAEO,SAASI,EAAkB3sB,GAC9B,MAAO,CACHnE,KAAMc,EAAAA,GAAYiwB,oBAClBt1B,KAAM0I,EAEd,CAEO,SAAS6sB,EAAc9Z,GAC1B,OAAO7b,MAAOF,EAAUsf,KAEpB,UADkBtf,GAAS81B,EAAAA,EAAAA,IAAmB/Z,KACtC1b,MACJ,MAAO,CAACC,MAAM,GAElB,MAAM2B,EAAQqd,IAERiR,GAAeC,EAAAA,EAAAA,IAAgBvuB,GAMrC,OALuBwuB,EAAAA,EAAAA,IAAkBxuB,KAClBsuB,EAAaG,QAChC1wB,GAAS4nB,EAAAA,EAAAA,OAGN,CAACtnB,MAAM,EAAK,CAE3B,C,m9CCvfO,SAASy1B,EACZha,EACAoE,EACA6V,EACAC,EACAC,EACAxuB,GAEA,OAAOxH,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IAERze,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAE1B8vB,EAAOxnB,EAAAA,KAEb,IAAIyS,EAAO,CACPmZ,SAAU,GACVptB,QAASitB,EAAMjtB,QACfoU,WAAYpB,EACZqB,QAAS+C,EACTiW,gBAAiB,GAAF9rB,OAAKzJ,EAAM,KAAAyJ,OAAIynB,GAC9B3J,QAASvnB,EACT0nB,UAAWwJ,EACXsE,SAAQ51B,EAAA,GAAMu1B,EAAMK,UACpBhtB,MAAK5I,EAAA,GAAMu1B,EAAM3sB,QAGrB,MAAMkE,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,IAAKxO,EACD,MAAO,CAAClN,MAAO,IAAIi2B,MAAM,0BAEFC,EAAAA,EAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,GAAI81B,EAAAA,GAAYC,wBACvEC,EAAAA,EAAAA,IAAkB1Z,EAAKjU,QAAS,CAAC4tB,kBAAkB,MAC1E3Z,EAAK3T,MAAMutB,0BAA2B,GAG1C,MAAMC,GAAUC,EAAAA,EAAAA,IAAW70B,GAErB80B,EADwC,UAAxBF,aAAO,EAAPA,EAASG,aAAiD,UAAxBH,aAAO,EAAPA,EAASI,cACnBV,EAAAA,EAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,GAAI81B,EAAAA,GAAYU,oBAE/GC,GAAyBC,EAAAA,EAAAA,IAAsBn1B,KAAUs0B,EAAAA,EAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,GAAI81B,EAAAA,GAAYU,oBAEhIG,EAA2BN,GAAwBI,GAAyBG,EAAAA,EAAAA,IAAyCr1B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,IAAM,KAC5Jq2B,GAAyBI,KAA0BI,EAAAA,EAAAA,IAAsBva,EAAKjU,QAASsuB,KACxFra,EAAK3T,MAAMmuB,yBAA0B,GAGzC,MAAMC,QAAmBz3B,GAAS03B,EAAAA,EAAAA,IAA4B1a,IAC9D,GAAIya,EAAWp3B,MACX,MAAO,CAACA,MAAOo3B,EAAWp3B,OAK9B,GAFA2c,EAAOya,EAAWn3B,KAEd41B,EAAgB,KAAAyB,EAChB,MAAMC,GAAgBC,EAAAA,EAAAA,IAAsB7a,EAAMkZ,GAClD0B,EAAczB,SAAWH,EAAM8B,UAAU9qB,KAAKkV,GAAaA,EAASxhB,MACjD,QAAfi3B,EAAA3B,EAAM8B,iBAAS,IAAAH,OAAA,EAAfA,EAAiB5kB,QAAS,IACrB6kB,EAAcvB,WACfuB,EAAcvB,SAAW,CAAC,GAG9BuB,EAAcvB,SAAS0B,MAAQ/B,EAAM8B,WAEzC,MAAM/a,QAAiB/c,GAASg4B,EAAAA,EAAAA,IAA4BJ,IAC5D,GAAI3B,EAAa,CACb,MAAM5X,EAA+B,CACjChe,MAAO0c,EAAS1c,MAChB43B,SAAUlb,EAAS1c,OAEvB41B,EAAY5X,EAChB,CAEA,OAAOtB,CACX,CAEA,OAAO/c,EAASmyB,EAAAA,GAAuBnV,EAAMgZ,EAAM8B,UAAW7B,EAAavuB,GAAS,CAE5F,CAqDO,SAASgP,EACZsf,EACAtuB,EACAwuB,GAEA,OAAOh2B,MAAOF,EAAUsf,KACpB,MAAM,QAACvW,EAAO,UAAEgT,EAAS,OAAEoE,GAAU6V,EAC/B/zB,EAAQqd,IAId,GAFAtf,GAASk4B,EAAAA,EAAAA,IAAsBnvB,KAE1BmtB,IAAmBxuB,EAAQywB,YAAa,CACzC,MAAMC,EAAa7tB,EAAAA,GAAuB8tB,KAAKtvB,GAEzCuvB,GAASC,EAAAA,EAAAA,IAAsBt2B,GAC/Bu2B,EAAW,IAAIC,EAAAA,EAASH,GAE9B,GAAIF,GAAcI,EAASE,IAAIN,EAAW,IAAK,CAC3C,MAAMO,GAAeC,EAAAA,EAAAA,IAA4B32B,EAAO8Z,EAAWoE,GACnE,OAAIwY,EACO34B,EAASmyB,EAAAA,GAA2BwG,EAAcP,EAAW,GAAIA,EAAW,KAEhF,CAAC/3B,MAAO,IAAIi2B,MAAM,uBAC7B,CAEA,GAA6B,IAAzBvtB,EAAQ8vB,QAAQ,OAAenxB,EAAQywB,YACvC,OAAOn4B,EA3EhB,SAAuB+b,EAAmBoE,EAAgB6V,GAC7D,OAAO91B,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IAERtb,GAASogB,EAAAA,EAAAA,IAAiBniB,GAEhC,IAAI4b,EAAoB,CACpBV,WAAYpB,EACZoI,QAASngB,EACToZ,QAAS+C,IAGT,QAACpX,GAAWitB,EAEhB,MAAMyB,QAAmBz3B,GAAS84B,EAAAA,EAAAA,IAAiC/vB,EAAS8U,IAC5E,GAAI4Z,EAAWp3B,MACX,MAAO,CAACA,MAAOo3B,EAAWp3B,OACvB,IAAKo3B,EAAWn3B,KAAMyI,UAAY0uB,EAAWn3B,KAAMud,KAKtD,MAAO,CAAC,EAGZ9U,EAAU0uB,EAAWn3B,KAAMyI,QAC3B8U,EAAO4Z,EAAWn3B,KAAMud,KAExB,MAAM,MAACxd,EAAK,KAAEC,SAAcN,ECnG7B,SAAwB+I,EAAiB8U,GAC5C,OAAO3d,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IAEd,IAAIhG,EAAMvQ,EAENgwB,EAAYzf,EAAIuf,QAAQ,KACxBE,EAAY,IACZA,EAAYzf,EAAIvG,QAEpB,MAAMimB,EAAM1f,EAAI2f,UAAU,EAAGF,GAAWnsB,cACxC0M,EAAM0f,EAAM,IAAM1f,EAAI2f,UAAUF,EAAWzf,EAAIvG,QAAQmmB,OAGvD,MAAMC,EAAwB,CAC1B,CAACC,QAAS,QAASC,UAAW,sBAC9B,CAACD,QAAS,eAAgBC,UAAW,8BAEzC,IAAK,MAAMD,KAAWD,EAClB,GAAI7f,EAAIkC,WAAW4d,EAAQA,SAAU,EACjClxB,EAAAA,EAAAA,IAAW,iBAAkBkxB,EAAQC,WACrC,KACJ,CAGJ,OAAQL,GACR,IAAK,UAED,OADAh5B,EAASmyB,EAAAA,GAA0B7Y,EAAI2f,UAAUF,EAAY,EAAGzf,EAAIvG,UAC7D,CAACzS,KAAM,CAACg5B,iBAAiB,IACpC,IAAK,aACD,OAAIC,EAAAA,KAEO,CAACl5B,MADM,CAAC0I,SAASwZ,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,oCAAqC0S,eAAgB,2DAItGpT,GAASwc,EAAAA,EAAAA,GAAU,CAACC,QAASC,EAAAA,GAAiB8c,yBAA0B5c,WAAY6c,EAAAA,WAC7E,CAACn5B,KAAM,CAACg5B,iBAAiB,KACpC,IAAK,SAAU,CAEX,GAAIzb,EAAKV,YAAcU,EAAKT,QAExB,OADApd,EAAS05B,EAAAA,GAAgC,kFAAmF7b,EAAKV,WAAYU,EAAKT,UAC3I,CAAC9c,KAAM,CAACg5B,iBAAiB,IAEpC,MAAM/rB,GAAU6gB,EAAAA,EAAAA,IAAkBnsB,GAClC,IAAKsL,EACD,MAAO,CAACjN,KAAM,CAACq5B,oBAAqB,IAAIrD,MAAM,iCAElD,GAAI/oB,EAAQ1I,OAASuqB,EAAAA,GAAU0B,gBAE3B,OADA9wB,GAASwc,EAAAA,EAAAA,GAAU,CAACC,QAASC,EAAAA,GAAiBkd,4BAA6Bhd,WAAYid,EAAAA,EAAmBhd,YAAa,CAACtP,cACjH,CAACjN,KAAM,CAACg5B,iBAAiB,IAEpC,GACI/rB,EAAQ1I,OAASuqB,EAAAA,GAAU0K,YAC3BvsB,EAAQ1I,OAASuqB,EAAAA,GAAUC,WAC7B,CACE,MAAMI,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACvC,IAAI6H,EACAiwB,EACAxsB,EAAQ1I,OAASuqB,EAAAA,GAAU0K,YAC3BhwB,GAAOkwB,EAAAA,EAAAA,IAAyBzsB,GAChCwsB,EAAW3K,EAAAA,GAAU7F,YAAY0Q,+BAEjCnwB,EAAOyD,EAAQ7M,GACfq5B,EAAW3K,EAAAA,GAAU7F,YAAY2Q,6BAErC,MAAMxK,GAAgBtL,EAAAA,EAAAA,IAAiBniB,GACjCk4B,GAAkBjO,EAAAA,EAAAA,IAA8BjqB,EAAOytB,GACvDX,GAAUE,EAAAA,EAAAA,IAA0BhtB,GAQ1C,OAPAyZ,EAAAA,EAAAA,KAAaC,KAAK,GAADrR,OAAIykB,EAAO,cAAAzkB,OAAa6vB,IAEzCn6B,GAASo6B,EAAAA,EAAAA,IAAgB3K,EAAe,CAAC,CAACsK,WAAUjwB,OAAMse,QAASqH,EAAetiB,MAAO,aACrF4iB,EAAAA,EAAAA,IAAkB9tB,EAAOsL,EAAQ7M,KACjCV,GAASgwB,EAAAA,EAAAA,IAAkBziB,EAAQ7M,KAGhC,CAACJ,KAAM,CAACg5B,iBAAiB,GACpC,CACA,KACJ,CACA,IAAK,YAED,OADAt5B,GAASwc,EAAAA,EAAAA,GAAU,CAACC,QAASC,EAAAA,GAAiB2d,cAAezd,WAAY0d,EAAAA,QAAmBzd,YAAa,CAAC0d,0BAA0B,MAC7H,CAACj6B,KAAM,CAACg5B,iBAAiB,IACpC,IAAK,eAED,OAAKkB,EAAAA,EAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAYiE,2BAK9CC,EAAAA,EAAAA,IAAqBz4B,IAI1BjC,GAASwc,EAAAA,EAAAA,GAAU,CAACC,QAASC,EAAAA,GAAiBie,mBAAoB/d,WAAYge,EAAAA,EAAkB/d,YAAa,CAACge,WAAY,cACnH,CAACv6B,KAAM,CAACg5B,iBAAiB,KAJrB,CAACj5B,MAAO,CAAC0I,SAASwZ,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,+BAAgC0S,eAAgB,yFALvF,CAAC/S,MAAO,CAAC0I,SAASwZ,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,oCAAqC0S,eAAgB,6EAU3G,IAAK,YACL,IAAK,UACDpT,EAASmyB,EAAAA,MACTnyB,EAASmyB,EAAAA,MAGb,IAAI9L,EAAAA,EAAAA,IAAYpkB,GAAQ,CACpB,MAAM64B,EAAiBA,IAAMxb,IACvByb,EAAsBC,IACjB,CAAC36B,MAAO,CAAC0I,QAASiyB,KAEvBC,EAAS,IAAIC,EAAAA,GAAiB,CAACl7B,WAAUsf,SAAUwb,GAAwBK,EAAAA,GAAUtd,EAAKV,WAAYU,EAAKsG,QAAStG,EAAKT,SAC/H,GAAI6d,EAAOG,aAAa9hB,GACpB,IACI,MAAM,KAACI,EAAI,aAAExF,SAAsB+mB,EAAOI,yBAAyB/hB,GACnE,IAAKI,EACD,OAAOqhB,EAAmB7mB,GAG9B,MAAMJ,QAAY9T,GAAS4Z,EAAAA,EAAAA,IAAYF,EAAMyhB,EAAAA,KAE7C,GAAIrnB,EAAIzT,MAEJ,OAAO06B,EADejnB,EAAIzT,MACc8T,MAAQgnB,EAAAA,GAAShoB,cAAc,CACnEzS,GAAI,qBACJ0S,eAAgB,6BAIxB,MAAM6B,EAAWnB,EAAIxT,KACrB,OAAQ2U,EAASpQ,MACjB,KAAK4P,EAAAA,GAAqBE,GAItB,OAHIM,EAASd,MACTnU,GAAS4d,EAAAA,EAAAA,IAAwC3I,EAAUA,EAASd,KAAM0J,IAEvE,CAACvd,KAAM,CAACg7B,YAAarmB,IAChC,KAAKR,EAAAA,GAAqBC,KAItB,OAHIO,EAAS/C,MACTlS,GAASuc,EAAAA,EAAAA,IAActH,EAAS/C,KAAMwH,EAAKD,UAExC,CAACnZ,KAAM,CAACg7B,YAAarmB,IAChC,KAAKR,EAAAA,GAAqBG,SACtB,MAAO,CAACtU,KAAM,CAACg7B,YAAarmB,IAChC,QACI,OAAO8lB,EAAmBI,EAAAA,GAAShoB,cAC/B,CACIzS,GAAI,oCACJ0S,eAAgB,2DAEpB,CACIvO,KAAMoQ,EAASpQ,QAI/B,CAAE,MAAOtE,GAKL,OAAOw6B,EAJSx6B,EAAIwI,SAAWoyB,EAAAA,GAAShoB,cAAc,CAClDzS,GAAI,qBACJ0S,eAAgB,4BAGxB,CAER,CAEA,IAAI9S,EACJ,IACIA,QAAaqB,EAAAA,GAAQ45B,eAAejiB,EAAKuE,EAC7C,CAAE,MAAOtd,GACL,MAAO,CAACF,MAAOE,EACnB,CAEA,MAAMi7B,EAAkBl7B,EAAKm7B,gBAAiBC,EAAAA,EAAAA,IAAUp7B,EAAKm7B,eAE7D,MAAmB,YAAfniB,EAAI4f,QACJQ,EAAAA,GAAqC8B,EAAkBl7B,EAAKm7B,cAAgB,KACrE,CAACn7B,KAAM,CAACyc,SAAUzc,MAGzBA,EAAKq7B,YACL37B,EAAS,CAAC6E,KAAM+2B,EAAAA,GAAiBC,2BAA4Bv7B,KAAMA,EAAKq7B,aAGxEH,IACIl7B,EAAKm7B,cAAcjgB,WAAW,MAC9BE,EAAAA,EAAAA,KAAaC,KAAKrb,EAAKm7B,eAChBn7B,EAAKm7B,cAAcjgB,YAAWJ,EAAAA,EAAAA,QACrCM,EAAAA,EAAAA,KAAaC,KAAKrb,EAAKm7B,cAAcK,QAAO1gB,EAAAA,EAAAA,MAAarI,SAEzDsI,OAAOC,KAAKhb,EAAKm7B,gBAIlB,CAACn7B,KAAM,CAACyc,SAAUzc,IAAM,CAEvC,CD1F6Ci7B,CAAexyB,EAAS8U,IAE7D,GAAIxd,EAAO,CACP,GAAIA,EAAM07B,YACN,OAAO/7B,EAAS+1B,EAAWha,EAAWoE,EAAQ6V,IAElD,MAAO31B,CACX,CAEA,MAAO,CAACC,KAAMA,EAAM,CAE5B,CAoCgC07B,CAAcjgB,EAAWoE,EAAQ6V,GAEzD,CAEA,OAAOh2B,EAAS+1B,EAAWha,EAAWoE,EAAQ6V,EAAOtuB,EAAQuuB,YAAaC,EAAgBxuB,GAAS,CAE3G,CAEO,SAASu0B,EAAelgB,GAAkE,IAA/CoE,EAAMvQ,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACvD,MAAO,CAAC5P,EAAUsf,KACd,MAAMrd,EAAQqd,IAER4c,GAAaC,EAAAA,EAAAA,IAAoBl6B,EAAO8Z,EAAWoE,GAEzD,OAAK+b,EAIEl8B,EAASmyB,EAAAA,GACZ+J,EACA/b,EAAS,gBAAkB,eAC3BjK,QAAQiK,KAND,CAAC7f,MAAM,EAOhB,CAEV,C,suBEjNO,SAAS87B,EAAmC3K,EAAQztB,EAAQ+X,GAAsB,IAAXsgB,EAAIzsB,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAClF,OAAO1P,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACd,KAAKiX,EAAAA,EAAAA,IAAuBt0B,EACxB+B,EACA+X,EACAya,EAAAA,EAAYU,oBAEZ,MAAO,CAAC52B,KAAM,IAElB,IAAI82B,EAAAA,EAAAA,IAAsBn1B,GAAQ,CAC9B,MAAML,E,+VAAMnB,CAAA,CACR67B,EAAG7K,EACH8K,wBAAwB,EACxB3zB,KAAM,EACN4zB,SAAU,GACVC,sBAAsB,EACtBC,6BAA8B3gB,GAC3BsgB,SAGDr8B,GAAS28B,EAAAA,EAAAA,IAAa/6B,GAChC,CACA,MAAO,CAACtB,MAAMs8B,EAAAA,EAAAA,IAAwC36B,EAAOwvB,EAAQztB,EAAQ+X,GAAW,CAEhG,C,uJCpBO,MAAM8gB,EAAcC,IACvB,IAAIC,EAAiBD,EACrB,IAAKA,EAAa,CACd,MAAM9kB,EAAQqD,OAAO2hB,WAErB,QAAQ,GACR,KAAKhlB,GAASoX,EAAAA,GAAU6N,yBACpBF,EAAiBG,EAAAA,GAAYC,MAC7B,MAEJ,KAAKnlB,EAAQoX,EAAAA,GAAU6N,0BAA4BjlB,GAASoX,EAAAA,GAAUgO,0BAClEL,EAAiBG,EAAAA,GAAYG,OAC7B,MAEJ,KAAKrlB,EAAQoX,EAAAA,GAAUgO,2BAA6BplB,GAASoX,EAAAA,GAAUkO,yBACnEP,EAAiBG,EAAAA,GAAYK,MAC7B,MAEJ,QACIR,EAAiBG,EAAAA,GAAYM,OAGrC,CACA,MAAO,CACH34B,KAAMc,EAAAA,GAAY83B,aAClBhzB,KAAMsyB,EACT,EAGQW,EAASA,KAAA,CAClB74B,KAAMc,EAAAA,GAAYg4B,aAGTriB,EAAOA,KAAA,CAChBzW,KAAMc,EAAAA,GAAYi4B,WAGTC,EAAQA,KAAA,CACjBh5B,KAAMc,EAAAA,GAAYm4B,YAGTC,EAAoBC,IAAc,CAC3Cn5B,KAAMc,EAAAA,GAAYs4B,mBAClB39B,KAAM09B,IAGGE,EAAgBA,CAACr5B,EAAmBnE,IACrCV,IACJ,OAAQ6E,GACR,KAAKs5B,EAAAA,EAAYC,QACbp+B,GAAS2tB,EAAAA,EAAAA,IAAcjtB,GAAM,KAC7BV,EAAS+9B,EAAiB,KAC1B,MACJ,KAAKI,EAAAA,EAAYE,KACbr+B,GAAS2tB,EAAAA,EAAAA,IAAc,KACvB3tB,EAAS+9B,EAAiBr9B,GAAM,KAChC,MACJ,KAAKy9B,EAAAA,EAAYG,KACbt+B,GAAS2tB,EAAAA,EAAAA,IAAc,KACvB3tB,EAAS+9B,EAAiB,KAC1B,MACJ,QACI,MAAM,IAAIzH,MAAM,0BAA4BzxB,GAChD,EAID,SAAS05B,EAAsB79B,GAClC,MAAO,CAACV,EAAUsf,KACd,MAAMrd,EAAQqd,IACRyP,GAAUE,EAAAA,EAAAA,IAA0BhtB,GAG1C,OAFAyZ,EAAAA,EAAAA,KAAaC,KAAK,GAADrR,OAAIykB,EAAO,KAAAzkB,OAAI5J,IAEzB,CAACJ,MAAM,EAAK,CAE3B,C,kDCpFO,SAASk+B,EAAc35B,GAC1B,OAAQ7E,IACJA,EAAS,CACL6E,KAAMc,EAAAA,GAAY84B,eAClBn+B,KAAMuE,IAGH,CAACvE,MAAM,GAEtB,C,mKCIO,SAASo+B,IACZ,OAAOx+B,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRmQ,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjC8K,GAAO2f,EAAAA,EAAAA,IAAezqB,GACtB+B,GAASogB,EAAAA,EAAAA,IAAiBniB,IAAUojB,EAAAA,EAAkB+H,kBAAkBqC,GACxEjE,GAAOgC,EAAAA,EAAAA,IAAQvrB,EAAO+B,GAAU,IAEtC,IAAKwnB,EACD,MAAO,CAAClrB,MAAM,GAGlB,MAAMiN,QAAgBge,EAAAA,EAAAA,IAAoCxe,EAAMye,GAC1DjiB,GAAcgE,aAAO,EAAPA,EAASzD,OAAQslB,EAAAA,GAAUuP,gBAG/C,OADAjjB,EAAAA,EAAAA,KAAaC,KAAK,IAADrR,OAAKkhB,EAAK1hB,KAAI,cAAAQ,OAAaf,IACrC,CAACjJ,MAAM,EAAK,CAE3B,CAEO,SAASs+B,IAA8C,IAAzBC,EAAOjvB,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAC3C,OAAQ5P,IACJA,EAAS0+B,KACT9J,YAAW,KACP50B,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBoiB,WAC1BliB,WAAYmiB,EAAAA,QACZliB,YAAa,CACb,IACD,GACJgiB,GACI,CAACv+B,MAAM,GAEtB,CASO,SAAS0+B,EAAqC1jB,GACjD,MAAO,CACHzW,KAAMc,EAAAA,GAAYs5B,sCAClB3jB,OAER,CAEO,SAAS4jB,EAAkC5jB,GAC9C,MAAO,CACHzW,KAAMc,EAAAA,GAAYw5B,mCAClB7jB,OAER,C,qOClDO,SAAS8jB,EAASpiB,GACrB,OAAO9c,UACH,MAAMme,QAAere,EAASmyB,EAAAA,GAAqBnV,IAOnD,OAJIqB,EAAOhe,OAA0C,0DAAjCge,EAAOhe,MAAMM,iBAC7BX,GAASq/B,EAAAA,EAAAA,IAAS,CAACx6B,KAAMy6B,EAAAA,GAAqBC,aAAcx2B,QAASsV,EAAOhe,MAAM0I,UAAU,IAGzFsV,CAAM,CAErB,CAEO,SAASmhB,EAAYxiB,EAAMzP,GAAuB,IAAdxE,EAAO6G,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACjD,OAAO1P,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRvD,EAAYxO,EAAQ7M,GAEpB+uB,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjC4tB,GAAcC,EAAAA,EAAAA,IAAe7tB,GAE7Bw9B,GAAoBC,EAAAA,EAAAA,GAAgBz9B,EAAO4tB,EAAYnvB,GAAIsc,EAAKtc,IAChEi/B,EAAY,GAAHr1B,QAAM8Q,EAAAA,EAAAA,OAAY9Q,OAAGm1B,GAE9B5I,GAAUC,EAAAA,EAAAA,IAAW70B,GAErB80B,EADwC,UAAxBF,aAAO,EAAPA,EAASG,aAAiD,UAAxBH,aAAO,EAAPA,EAASI,cACnB2I,EAAAA,EAAAA,IAA8B39B,EAAOu0B,EAAAA,GAAYU,oBACzF2I,GAAqBtJ,EAAAA,EAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAASpI,EAAWya,EAAAA,GAAYC,sBAC3FU,GAAyBC,EAAAA,EAAAA,IAAsBn1B,KAAU29B,EAAAA,EAAAA,IAA8B39B,EAAOu0B,EAAAA,GAAYU,oBAC1GG,EAA2BN,GAAwBI,GAAyBG,EAAAA,EAAAA,IAAyCr1B,EAAO4tB,EAAYnvB,GAAIqb,GAAa,KAE/J,IAAI+jB,EAAU,CAAC,EAEfA,EAAQ3iB,WAAapB,EAErB,MAAMgW,GAAOgO,EAAAA,EAAAA,MACPl/B,EAAS4uB,EAEfqQ,EAAQ/2B,QAAUA,EAAU,GAAHuB,OAAMvB,EAAO,MAAAuB,OAAKq1B,GAAcA,EACzDG,EAAQ1J,gBAAkB,GAAH9rB,OAAMzJ,EAAM,KAAAyJ,OAAIynB,GACvC+N,EAAQ1X,QAAUvnB,EAClBi/B,EAAQvX,UAAYwJ,EACpB+N,EAAQzJ,SAAW,CAAC,EACpByJ,EAAQz2B,MAAQ,CAAC,GAEZw2B,IAAsBnJ,EAAAA,EAAAA,IAAkBoJ,EAAQ/2B,QAAS,CAAC4tB,kBAAkB,MAC7EmJ,EAAQz2B,MAAMutB,0BAA2B,GAGxCG,GAAyBI,KAA0BI,EAAAA,EAAAA,IAAsBuI,EAAQ/2B,QAASsuB,KAC3FyI,EAAQz2B,MAAMmuB,yBAA0B,GAG5C,MAAMC,QAAmBz3B,GAAS03B,EAAAA,EAAAA,IAA4BoI,IAE9D,OAAIrI,EAAWp3B,MACJo3B,GAGXqI,EAAUrI,EAAWn3B,KAEdN,EAASmyB,EAAAA,GAAuB2N,EAAS,KAAI,CAE5D,CAEO,SAASE,EAA2B1M,EAAQ2M,EAAUC,EAAQC,EAAYhsB,EAAMhH,GACnF,OAAOjN,UACHF,EAAS,CACL6E,KAAMc,EAAAA,GAAYy6B,8BAClB9/B,KAAM,CACFgzB,SACA5mB,QAAS,CACL,CAACuzB,GAAW,CACR9rB,OACAhH,aAMhBnN,EAASmyB,EAAAA,GAAmCmB,EAAQ2M,EAAUC,EAAQ/yB,IAE/D,CAAC7M,MAAM,GAEtB,C,kDCrGO,SAAS+/B,EAA2B/kB,GACvC,MAAO,CACHzW,KAAMc,EAAAA,GAAY26B,0BAClBhlB,OAER,C,uyggBCGA,MAAMilB,EAAsE,CAAC,EAItE,SAASC,EAAiC55B,EAAkB65B,GAE/D,OADAF,EAAyB35B,GAAY65B,EAC9B,CAACzgC,EAAUsf,KACd,MAAMrd,EAAQqd,IACR4N,GAASC,EAAAA,EAAAA,GAAiBlrB,GAC1By+B,GAAwBC,EAAAA,EAAAA,GAAgB1+B,EAAOirB,GAC/C0T,EAAe,CAAC,EACtB72B,OAAOC,OAAO42B,EAAcF,GACxBA,IACA32B,OAAOC,OAAO42B,EAAcH,EAAevT,IAC3CltB,EAAS,CACL6E,KAAMc,EAAAA,GAAYk7B,sBAClBvgC,KAAM,CACF4sB,SACA0T,kBAGZ,CAER,CAEO,SAASE,EAAmCl6B,GAC/Cm6B,QAAQC,eAAeT,EAA0B35B,EACrD,CAEO,SAASq6B,EAAiB/T,EAAgBxiB,GAC7C,OAAOxK,UACH,MAAM0gC,E,+VAAYngC,CAAA,GAAOygC,GAMzB,GALAn3B,OAAOoI,OAAOouB,GAA0BluB,SAAS8uB,IAC7Cp3B,OAAOC,OAAO42B,EAAcO,EAAWjU,GAAQ,IAIpC,OAAXA,EACA,IACI,MAAMkU,QAA2Bz/B,EAAAA,GAAQg/B,gBAAgBj2B,GACzDX,OAAOC,OAAO42B,EAAcQ,EAChC,CAAE,MAAO/gC,GACLghC,QAAQhhC,MAAMA,EAClB,CASJ,OAPAL,EAAS,CACL6E,KAAMc,EAAAA,GAAYk7B,sBAClBvgC,KAAM,CACF4sB,SACA0T,kBAGD,CAACtgC,MAAM,EAAK,CAE3B,C,yHC9DO,SAASghC,EAAmBC,GAC/B,MAAO,CACH18B,KAAM28B,EAAAA,GAAYC,iBAClBnhC,KAAMihC,EAEd,CAEO,SAASG,EAAqBH,GACjC,MAAO,CACH18B,KAAM28B,EAAAA,GAAYG,mBAClBrhC,KAAMihC,EAEd,CAEO,SAASK,EAA+BL,GAC3C,MAAO,CACH18B,KAAM28B,EAAAA,GAAYK,+BAClBvhC,KAAMihC,EAEd,CAEO,SAASO,IAA8B,IAAdC,EAAOnyB,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EACvC,MAAO,CACH/K,KAAM28B,EAAAA,GAAYQ,kBAClB1hC,KAAMyhC,EAEd,CAEO,SAASE,EAAkBV,GAC9B,MAAO,CACH18B,KAAM28B,EAAAA,GAAYU,qBAClB5hC,KAAMihC,EAEd,CAEO,SAASY,IAAiC,IAAdJ,EAAOnyB,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC1C,MAAO,CACH/K,KAAM28B,EAAAA,GAAYY,sBAClB9hC,KAAMyhC,EAEd,CAEO,SAASM,EAAkBd,GAC9B,MAAO,CACH18B,KAAM28B,EAAAA,GAAYc,qBAClBhiC,KAAMihC,EAEd,CAEO,SAASgB,EAAqBhB,GACjC,MAAO,CACH18B,KAAM28B,EAAAA,GAAYgB,wBAClBliC,KAAMihC,EAEd,CAEO,SAASkB,IAAoC,IAAdV,EAAOnyB,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC7C,MAAO,CACH/K,KAAM28B,EAAAA,GAAYkB,yBAClBpiC,KAAMyhC,EAEd,C,kDC7DO,SAASY,EAAkBrnB,GAC9B,MAAO,CACHzW,KAAMc,EAAAA,GAAYi9B,uBAClBtnB,OAER,C,2ZCCO,SAASunB,IACZ,OAAO3iC,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACd,IAAIwjB,EACJ,IACI,MAAMC,QAAoB/iC,GAASgjC,EAAAA,EAAAA,OACnCF,EAAa,IAAIG,IAAKF,EAAoBziC,KAC9C,CAAE,MAAOC,GACL,MAAO,CAACF,MAAOE,EACnB,CACAuiC,EAAWI,KAAIhf,EAAAA,EAAAA,IAAiBjiB,IAEhC,MAAMkhC,EAAWp5B,OAAO+I,MAAKswB,EAAAA,EAAAA,IAASnhC,IAChCohC,EAAgB,IAAIJ,IAAIE,EAASr2B,QAAQw2B,IAAOR,EAAWpK,IAAI4K,MAE/D52B,EAAU,GAChB,IAAK,MAAM62B,KAAgBF,EAAclxB,SACrCzF,EAAQiP,KAAK,CAAC9W,KAAM2+B,EAAAA,GAAUC,0BAA2BnjC,KAAM,CAAC8nB,QAASmb,KAM7E,OAJI72B,EAAQqG,OAAS,GACjB/S,GAASoiB,EAAAA,EAAAA,IAAa1V,IAGnB,CAACpM,MAAM,EAAK,CAE3B,C,60BClBe,MAAMojC,WAAgC/5B,KAAAA,cACjDsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,eAKR,KACLE,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAJ5BnJ,KAAKpK,MAAQ,CAACuT,MAAM,EACxB,CAMAlG,MAAAA,GACI,IAAI/F,EACAo6B,EAsBJ,OApBAp6B,EACII,KAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,gBAGnB/G,KAAKhD,MAAME,cACXA,EAAc8C,KAAKhD,MAAME,aAG7Bo6B,EACIh6B,KAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,YAGnB/G,KAAKhD,MAAMs6B,UACXA,EAAUt3B,KAAKhD,MAAMs6B,SAGQ,KAA7Bt3B,KAAKhD,MAAMomB,cACJ,KAIP9lB,KAAAA,cAACyM,GAAAA,MAAK,CACFC,gBAAgB,cAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiK,OACbC,SAAUlK,KAAKhD,MAAMkN,SACrBE,KAAK,OACL,kBAAgB,+BAEhB9M,KAAAA,cAACyM,GAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,KAAAA,cAACyM,GAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,+BAEHiJ,KAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,kBAEnBzJ,KAAAA,cAAA,QAAMC,UAAU,QACXL,KAIbI,KAAAA,cAACyM,GAAAA,MAAMgB,KAAI,KACPzN,KAAAA,cAAA,SACIA,KAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,uCACfjB,OAAQ,CACJwxB,UACAp2B,QAAUhE,OAK1BI,KAAAA,cAACyM,GAAAA,MAAMsB,OAAM,KACT/N,KAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,kBACVqP,QAAS5M,KAAKiK,OACd5V,GAAG,qBAEHiJ,KAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,WAMvC,EACHjH,GA1FoBu3B,GAAuB,aAVxCjU,cAAahgB,KAAAA,OAAAC,WACb6G,SAAQ9G,KAAAA,KAAAC,WACRnG,YAAWkG,KAAAA,OACXk0B,QAAOl0B,KAAAA,SCYX,UAAegC,EAAAA,GAAAA,UARf,SAAyBxP,EAAoB2hC,GACzC,MAAMD,GAAUE,EAAAA,EAAAA,IAAQ5hC,EAAO2hC,EAASE,WACxC,MAAO,CACHrU,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAChC0hC,QAASA,GAAWA,EAAQz5B,SAEpC,GAEA,CAAwCw5B,I,6hCC6GxC,MAAM1jC,GAAWC,EAAAA,QAAMD,SACjBsf,GAAWrf,EAAAA,QAAMqf,SAEjBykB,GAAsB,EAEtBC,GAAsB,CAAC,EAEtB,SAASC,KACZ,IAAK5oB,OAAO6oB,UAGR,YADA7C,QAAQ8C,IAAI,sCAKhB9C,QAAQ8C,IAAI,6CAEZ,MAAM7/B,GAAS8kB,EAAAA,EAAAA,IAAU9J,MACzB,IAAI8kB,EAAU,GACV9/B,EAAO+/B,aACPD,EAAU9/B,EAAO+/B,cAEjBD,EAAU,IAAIE,KAAIlpB,EAAAA,GAAAA,OAGO,WAArBgpB,EAAQG,SACRH,EAAQG,SAAW,OAEnBH,EAAQG,SAAW,MAIjB,QAASC,KAAKJ,EAAQK,QACC,SAArBL,EAAQG,SACRH,EAAQK,MAAQ,IAAMngC,EAAOogC,oBAE7BN,EAAQK,MAAQ,IAAMngC,EAAOqgC,eAIrCP,EAAUA,EAAQz2B,YAIlBy2B,EAAQrxB,OAAS,GAAqC,MAAhCqxB,EAAQA,EAAQrxB,OAAS,KAC/CqxB,EAAUA,EAAQnL,UAAU,EAAGmL,EAAQrxB,OAAS,IAGpDqxB,GAAWziC,EAAAA,GAAQijC,gBAAkB,aAErCxa,GAAAA,EAAgBya,mBAAmBC,IACnC1a,GAAAA,EAAgB2a,wBAAwBC,IACxC5a,GAAAA,EAAgB6a,qBAAqBC,IACrC9a,GAAAA,EAAgB+a,yBAAyBC,IACzChb,GAAAA,EAAgBib,iBAAiBC,IAEjClb,GAAAA,EAAgB6Z,WAAWG,OAASz/B,GAAW,EACnD,CAEO,SAASk5B,KACZzT,GAAAA,EAAgByT,QAEhBzT,GAAAA,EAAgBmb,sBAAsBT,IACtC1a,GAAAA,EAAgBob,2BAA2BR,IAC3C5a,GAAAA,EAAgBqb,wBAAwBP,IACxC9a,GAAAA,EAAgBsb,4BAA4BN,IAC5Chb,GAAAA,EAAgBub,oBAAoBL,GACxC,CAEA,MAAMM,GAA0B,CAAC,EAE1B,SAASC,GAA+Bj/B,EAAUk/B,GACrDF,GAAwBh/B,GAAYk/B,CACxC,CAEO,SAASC,GAAiCn/B,GAC7Cm6B,QAAQC,eAAe4E,GAAyBh/B,EACpD,CAEA,SAASw+B,KACLF,KAGAllC,IAASgmC,EAAAA,EAAAA,MACb,CAEO,SAASd,KAEZ7D,QAAQ8C,IAAI,2BAEZ8B,EAAAA,GAAAA,IAA8BC,EAAAA,GAAgBC,WAE9CnmC,GAAS,CACL6E,KAAMuhC,EAAAA,GAAaC,kBACnBle,UAAWZ,KAAKC,QAGpB,MAAMvlB,EAAQqd,KACRoQ,GAAgBtL,EAAAA,EAAAA,IAAiBniB,GACvC,GAAIytB,EAAe,CACf,MAAMD,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjC8iB,GAAmBC,EAAAA,EAAAA,IAAoB/iB,GACvCqkC,GAAe/R,EAAAA,EAAAA,IAA6BtyB,EAAO8iB,GACnDwhB,GAAiBzR,EAAAA,EAAAA,IAAQ7yB,EAAOqkC,IAElCjgB,EAAAA,EAAAA,IAAYpkB,IACZjC,GAASwmC,MAGbxmC,IAASymC,EAAAA,EAAAA,OACTzmC,IAAS0tB,EAAAA,EAAAA,IAAwBgC,GAAe,GAAM,IACtD1vB,IAAS0mC,EAAAA,EAAAA,OACT1mC,IAAS2mC,EAAAA,EAAAA,IAAkBjX,KAC3B1J,EAAAA,EAAAA,MAEIugB,EACAvmC,IAAS4zB,EAAAA,EAAAA,IAAmB7O,EAAkBwhB,EAAehe,YACtDxD,GAGP/kB,IAAS4mC,EAAAA,EAAAA,IAAS7hB,KAGM8hB,EAAAA,EAAAA,IAA+B5kC,IAEvDjC,GAAS8mC,EAAAA,MAGb,MAAMlgB,GAAaC,EAAAA,EAAAA,IAA0B5kB,GAE7C,GADAjC,GAASyG,EAAAA,GAA6BmgB,IAClCA,EAAY,CACZ,MAAMmgB,GAAQzZ,EAAAA,EAAAA,IAAWrrB,GACzB+kC,GAAYtX,EAAeD,GAE3B,IAAK,MAAMjE,KAAQub,EACXvb,EAAK9qB,KAAOgvB,GAGhBsX,GAAYxb,EAAK9qB,GAAI+uB,EAE7B,CAGArF,GAAAA,EAAgB6c,oBAAoBliB,GACpCqF,GAAAA,EAAgB8c,iBAAiBxX,EACrC,EAEAyX,EAAAA,GAAAA,MAEAp9B,OAAOoI,OAAOyzB,IAAyBvzB,SAASyzB,IACxCA,GAA8B,mBAAZA,GAClBA,GACJ,IAGA7jC,EAAMmlC,UAAUjT,kBAChBn0B,IAASqnC,EAAAA,EAAAA,OAGbrnC,ICrROE,UACHF,EAAS,CACL6E,KAAMc,EAAAA,GAAY2hC,sBACpB,IDmRNtnC,IAASunC,EAAAA,EAAAA,MACb,CAEA,SAASP,GAAYhjC,EAAQnD,GACzB,MAAMoB,EAAQqd,KACRkoB,GAAeC,EAAAA,EAAAA,GAAsBxlC,EAAO+B,GAG7CwjC,GAGLxnC,IAAS0nC,EAAAA,EAAAA,IAAyB7mC,EAAQmD,EAAQwjC,EAAaG,eACnE,CAEO,SAASC,GAA6BhhC,EAAU4a,EAAOkC,GACrDsgB,GAAoBp9B,KACrBo9B,GAAoBp9B,GAAY,CAAC,GAErCo9B,GAAoBp9B,GAAU4a,GAASkC,CAC3C,CAEO,SAASmkB,GAA+BjhC,EAAU4a,GACrD,MAAMsmB,EAAS9D,GAAoBp9B,GAC9BkhC,GAIL/G,QAAQC,eAAe8G,EAAQtmB,EACnC,CAEO,SAASumB,GAAmCnhC,GAC/Cm6B,QAAQC,eAAegD,GAAqBp9B,EAChD,CAEA,SAASo+B,KACLhlC,IAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAMuhC,EAAAA,GAAaC,kBACnBle,UAAWZ,KAAKC,QAEpB+f,EAAAA,EAAAA,QAER,CAEA,SAASjC,GAAY0C,GACbA,EAAYjE,IACZ/jC,IAASq/B,EAAAA,EAAAA,IAAS,CAACx6B,KAAM,WAAYkE,QAASk/B,EAAAA,GAAwBC,uBAAuB,IAEjGloC,IAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAMuhC,EAAAA,GAAa+B,kBACnBhgB,UAAWZ,KAAKC,OCjVjBtnB,UACHF,EAAS,CACL6E,KAAMc,EAAAA,GAAYyiC,0BACpB,IDkVV,CAEO,SAAStD,GAAYxrB,GACxB,OAAQA,EAAIkI,OACZ,KAAK6mB,EAAAA,GAAaC,OAClB,KAAKD,EAAAA,GAAaE,kBACdC,GAA4BlvB,GAC5B,MAEJ,KAAK+uB,EAAAA,GAAaI,aAmbf,SAA6BnvB,GAEhC,MAAM0D,EAAO+E,KAAKC,MAAM1I,EAAIhZ,KAAK0c,MAE7B3B,OAAOqtB,eAEPrH,QAAQ8C,IAAI,2CAA4CnnB,GAG5D,MAAM4J,GAAaC,EAAAA,EAAAA,IAA0BvH,MAC7Ctf,IAAS2oC,EAAAA,EAAAA,IAAa3rB,EAAM4J,IAE5B5mB,IAAS4oC,EAAAA,EAAAA,IAA0C,CAAC5rB,IACxD,CA/bQ6rB,CAAoBvvB,GACpB,MAEJ,KAAK+uB,EAAAA,GAAaS,cA8btB5oC,eAAqCoZ,GACjC,MAAM0D,EAAO+E,KAAKC,MAAM1I,EAAIhZ,KAAK0c,MAE7B3B,OAAOqtB,eAEPrH,QAAQ8C,IAAI,+CAAgDnnB,GAGhE,MAAM/a,EAAQqd,KACRypB,GAAmBliB,EAAAA,EAAAA,IAA0B5kB,GASnD,IAPK+a,EAAKI,SAAW2rB,GACjB/oC,IAASgpC,EAAAA,EAAAA,IAAsBhsB,IAGnChd,IAASipC,EAAAA,EAAAA,IAAYjsB,IAGjBA,EAAKI,SAAW2rB,EAEhB,IADeG,EAAAA,EAAAA,IAAUjnC,EAAO+a,EAAKI,SACzB,CACR,MAAMvc,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAC1B+B,GAASmlC,EAAAA,EAAAA,IAAkBlnC,EAAO+a,GACpChZ,GACAhE,IAASopC,EAAAA,EAAAA,IAAYvoC,EAAQmD,EAAQgZ,EAAKI,SAAS,GAE3D,KAAO,CACH,MAAMtJ,QAAY9T,IAASqpC,EAAAA,EAAAA,IAAcrsB,EAAKI,WACxC,MAACuV,EAAK,MAAEH,GAAS1e,EAAIxT,KACrBgpC,EAAW9W,EAAMG,EAAM,IAC7B3yB,IAAS2oC,EAAAA,EAAAA,IAAaW,GAC1B,CAGAtsB,EAAKusB,WACLvpC,IAASmlB,EAAAA,EAAAA,IAAgBnI,EAAKG,YAEtC,CAleQqsB,CAAsBlwB,GACtB,MAEJ,KAAK+uB,EAAAA,GAAaoB,aAief,SAA+BnwB,GAClCtZ,GACI,CACI6E,KAAMc,EAAAA,GAAY+jC,oBAClBppC,KAAM,CACFgnB,aAAchO,EAAIhZ,KAAKonB,eACvB3L,UAAWzC,EAAIqwB,UAAUxsB,WACzBysB,SAAUtwB,EAAIhZ,KAAKupC,UACnBC,aAAcxwB,EAAIhZ,KAAKypC,eACvBC,aAAc1wB,EAAIhZ,KAAK2pC,cACvBC,iBAAkB5wB,EAAIhZ,KAAK6pC,mBAC3BC,mBAAoB9wB,EAAIhZ,KAAK+pC,uBAI7C,CA/eQC,CAAsBhxB,GACtB,MAEJ,KAAK+uB,EAAAA,GAAapX,YAyff,SAA8B3X,GACjC,MAAMrX,EAAQqd,KAER5S,EAAU,CACZ,CACI7H,KAAM2+B,EAAAA,GAAU+G,6BAChBjqC,KAAM,CAACI,GAAI4Y,EAAIhZ,KAAK6jB,QAASiE,QAAS9O,EAAIhZ,KAAK8nB,UAEnD,CACIvjB,KAAMmsB,EAAAA,GAAUwZ,wBAChBlqC,KAAM,CAAC6jB,QAAS7K,EAAIhZ,KAAK6jB,QAASiE,QAAS9O,EAAIhZ,KAAK8nB,WAItDqiB,GAAkBC,EAAAA,EAAAA,IAAkBzoC,GACpCusB,EAAYic,GAAmBA,EAAgBnxB,EAAIhZ,KAAK6jB,UAAa,GAE3E,IAAK,MAAM5W,KAAWihB,EAClB9hB,EAAQiP,KAAK,CACT9W,KAAMohB,EAAAA,GAAa0kB,2BACnBrqC,KAAM,CAACI,GAAI6M,EAAS6a,QAAS9O,EAAIhZ,KAAK8nB,WAI9CpoB,IAASoiB,EAAAA,EAAAA,IAAa1V,IACtB,MAAMk+B,GAAcle,EAAAA,EAAAA,IAAezqB,GAEnC,GAAI2oC,EAAYlqC,KAAO4Y,EAAIhZ,KAAK8nB,QAC5BpoB,GAAS,CAAC6E,KAAMmsB,EAAAA,GAAUC,WAAY3wB,KAAM,CAACI,GAAI4Y,EAAIhZ,KAAK6jB,YAGtDC,EAAAA,EAAAA,IAAiBniB,KAAWqX,EAAIhZ,KAAK6jB,UAChC0mB,EAAAA,EAAO/uB,SAASwQ,SAAS9Q,WAAW,oBACrCgR,EAAAA,EAAAA,QAGJ1hB,EAAAA,EAAAA,GAAQ8/B,EAAY7/B,QACpB/K,GAAS6iC,SAEV,CACH,MAAMrX,GAAOgC,EAAAA,EAAAA,IAAQvrB,EAAOqX,EAAIhZ,KAAK6jB,SAC/B2mB,GAAUC,EAAAA,EAAAA,IAA4B9oC,GACtC+oC,EAAWjhC,OAAOoI,OAAO24B,GAASG,MAAMpmB,GAAWA,EAAOvL,EAAIhZ,KAAK8nB,WACrEoD,IAAQ1gB,EAAAA,EAAAA,GAAQ8/B,EAAY7/B,SAAWigC,GACvChrC,IAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAM2+B,EAAAA,GAAUC,0BAChBnjC,KAAM,CAAC8nB,QAAS9O,EAAIhZ,KAAK8nB,UAE7B,CACIvjB,KAAMmsB,EAAAA,GAAUwZ,wBAChBlqC,KAAM,CAAC6jB,QAASqH,EAAK9qB,GAAI0nB,QAAS9O,EAAIhZ,KAAK8nB,YAI3D,CACJ,CAhjBQ8iB,CAAqB5xB,GACrB,MAEJ,KAAK+uB,EAAAA,GAAa8C,aA+iBtB,SAA+B7xB,GAC3B,MAAMrX,EAAQhC,EAAAA,QAAMqf,WACduX,GAAUC,EAAAA,EAAAA,IAAW70B,GAC3BjC,GAAS,CAAC6E,KAAMmsB,EAAAA,GAAUoa,aAAc9qC,KAAMyhB,KAAKC,MAAM1I,EAAIhZ,KAAKkrB,QAC5C,SAAlBqL,EAAQwU,OACRrrC,IAASgf,EAAAA,EAAAA,MAEjB,CArjBQssB,CAAsBhyB,GACtB,MAEJ,KAAK+uB,EAAAA,GAAakD,mBAqjBlBvrC,GAASyG,EAAAA,MAnjBL,MAEJ,KAAK4hC,EAAAA,GAAamD,aAojBtB,SAA+BlyB,GAC3B,MAAMmyB,EAAc1pB,KAAKC,MAAM1I,EAAIhZ,KAAKkrB,MAClCvpB,EAAQhC,EAAAA,QAAMqf,YACd,MAACynB,GAAS9kC,EAAMuyB,SAASuS,MAK/B,GAHsB,UADNjQ,EAAAA,EAAAA,IAAW70B,GACfopC,OACRrrC,IAASgf,EAAAA,EAAAA,OAGTysB,GACA1E,GACAA,EAAM0E,EAAY/qC,KACkB,IAApCqmC,EAAM0E,EAAY/qC,IAAI+sB,UACxB,CACE,MAAM,cAACgC,GAAiBxtB,EAAMuyB,SAAS3nB,OACjC,cAAC6iB,EAAa,UAAEgc,GAAazpC,EAAMuyB,SAASuS,MAC5C4E,EAAc5hC,OAAOoI,OAAOu5B,GAC5BE,EAAaD,EAAY72B,MAAM+2B,GAAMA,EAAEzjB,UAAYqH,GAAiBoc,EAAE1nB,UAAYuL,IAExF,IAAIoc,EAAY,GAChB,GACIL,GACAG,GACAH,EAAY/qC,KAAOkrC,EAAWznB,QAChC,CACE,MAAMkJ,EAAU,CAAC,GACjBC,EAAAA,EAAAA,IAAWrrB,GAAOoQ,SAASqX,IACvB2D,EAAQ3D,EAAEhpB,IAAMgpB,CAAC,IAGrB,IAAK,IAAIqiB,EAAI,EAAGA,EAAIJ,EAAY54B,OAAQg5B,IAAK,CACzC,MAAMC,EAAeL,EAAYI,GAAG5nB,QACpC,GACIkJ,GACAA,EAAQ2e,IAC4B,IAApC3e,EAAQ2e,GAAcve,WACtBge,EAAY/qC,KAAOsrC,EACrB,CACEF,EAAYE,EACZ,KACJ,CACJ,CACJ,CAOA,GALAhsC,IAASoiB,EAAAA,EAAAA,IAAa,CAClB,CAACvd,KAAMmsB,EAAAA,GAAUib,sBAAuB3rC,KAAM,CAACI,GAAI+qC,EAAY/qC,KAC/D,CAACmE,KAAMmsB,EAAAA,GAAUoa,aAAc9qC,KAAMmrC,MAGrC/b,IAAkB+b,EAAY/qC,GAC9B,GAAIorC,EAAW,CACX9rC,GAAS,CAAC6E,KAAMmsB,EAAAA,GAAUkb,YAAa5rC,KAAMwrC,IAC7C,MAAMK,EAAc7sB,KACd6a,GAAkBjO,EAAAA,EAAAA,IAA8BigB,EAAaL,IACnEpwB,EAAAA,GAAAA,KAAaC,KAAK,GAADrR,QAAI8hC,EAAAA,EAAAA,IAAkBD,GAAY,cAAA7hC,OAAa6vB,GACpE,MACIze,EAAAA,GAAAA,KAAaC,KAAK,IAG9B,CACJ,CA/mBQ0wB,CAAsB/yB,GACtB,MAEJ,KAAK+uB,EAAAA,GAAaiE,eA8dtBpsC,eAAoCoZ,SAC1BtZ,GAASyG,EAAAA,GAAoB6S,EAAIhZ,KAAK6jB,gBACtCnkB,GAASyG,EAAAA,MACf,MAAMxE,EAAQqd,WACRtf,GAASyG,EAAAA,IAA6BogB,EAAAA,EAAAA,IAA0B5kB,KAEhD,UADN60B,EAAAA,EAAAA,IAAW70B,GACfopC,OACRrrC,IAASgf,EAAAA,EAAAA,MAEjB,CAteQutB,CAAqBjzB,GACrB,MAEJ,KAAK+uB,EAAAA,GAAamE,WACdxsC,GA6nBR,SAA8BsZ,GAC1B,OAAOpZ,MAAO+nB,EAAYC,KACtB,MAAMjmB,EAAQimB,IACR5jB,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnB40B,GAAUC,EAAAA,EAAAA,IAAW70B,GACrB8iB,GAAmBC,EAAAA,EAAAA,IAAoB/iB,GACzC8iB,IAAqBzL,EAAIqwB,UAAUxsB,aACnC8K,GAAW9C,EAAAA,EAAAA,IAAgBJ,IAC3BkD,EAAW,CACPpjB,KAAM2+B,EAAAA,GAAUiJ,4BAChBnsC,KAAM,CAACI,GAAI4Y,EAAIqwB,UAAUxsB,WAAYiL,QAAS9O,EAAIhZ,KAAK8nB,WAE/B,UAAxByO,aAAO,EAAPA,EAASG,aAAiD,UAAxBH,aAAO,EAAPA,EAASI,aAAwE,SAA/C3yB,EAAOooC,qCAC3EzkB,GAAW0kB,EAAAA,EAAAA,IAA8B5nB,KAKjD,MAAM2K,GAAgBtL,EAAAA,EAAAA,IAAiB8D,KACjCuH,GAAgBvL,EAAAA,EAAAA,IAAiBgE,KACnCwH,IAAkBpW,EAAIhZ,KAAK6jB,SAAWsL,IAAkBnW,EAAIhZ,KAAK8nB,SACjEH,EAAW2kB,GAA4BtzB,EAAIqwB,UAAUxsB,aAInC,SAAlB0Z,EAAQwU,QAAoBwB,EAAAA,EAAAA,IAAyB3kB,MACrDD,GAAWlkB,EAAAA,EAAAA,MACf,CAER,CA1pBiB+oC,CAAqBxzB,IAC9B,MAEJ,KAAK+uB,EAAAA,GAAa0E,cAmqBf,SAAgCzzB,GACnC,MAAMrX,EAAQqd,KACR6O,GAAiBC,EAAAA,EAAAA,IAAkBnsB,IAAU,CAAC,EAC9C2oC,GAAcle,EAAAA,EAAAA,IAAezqB,GAC7BqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnB40B,GAAUC,EAAAA,EAAAA,IAAW70B,GAE3B,GAAIqX,EAAIqwB,UAAUvhB,UAAYwiB,EAAYlqC,GAAI,CAC1CV,IAASgtC,EAAAA,EAAAA,OAET,MAAMC,GAAeC,EAAAA,EAAAA,IAAqBjrC,GACtCqX,EAAIhZ,KAAK6c,aAAe8vB,GACxBjtC,IAAS4nB,EAAAA,EAAAA,OAGTtO,EAAIhZ,KAAK6c,aAAegR,EAAeztB,IACnC4Y,EAAIhZ,KAAK6sC,aAAe7zB,EAAIqwB,UAAUvhB,WACzByb,EAAAA,EAAAA,IAAQ5hC,EAAOqX,EAAIhZ,KAAK6sC,aAEjCntC,IAASotC,EAAAA,EAAAA,IAAS9zB,EAAIhZ,KAAK6sC,aAG/BntC,IAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiB2wB,qBAC1BzwB,WAAY8mB,GACZ7mB,YAAa,CACTtT,YAAa4kB,EAAe3kB,aAC5Bs6B,UAAWxqB,EAAIhZ,KAAK6sC,gBAMpC,MAAM5/B,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAOqX,EAAIhZ,KAAK6c,YAE3Cnd,GAAS,CACL6E,KAAMohB,EAAAA,GAAaqnB,cACnBhtC,KAAM,CACFI,GAAI4Y,EAAIhZ,KAAK6c,WACbiL,QAAS9O,EAAIqwB,UAAUvhB,QACvBjE,QAAS5W,aAAO,EAAPA,EAAS4W,WAItB7K,EAAIhZ,KAAK6c,aAAegR,EAAeztB,KACvC8rB,EAAAA,EAAAA,OAGA1hB,EAAAA,EAAAA,GAAQ8/B,EAAY7/B,QACpB/K,GAAS6iC,IAEjB,MAAWvpB,EAAIqwB,UAAUxsB,aAAegR,EAAeztB,KACnDV,IAASmlB,EAAAA,EAAAA,IAAgBgJ,EAAeztB,KACxCV,GAAS,CACL6E,KAAM2+B,EAAAA,GAAU+J,gCAChBjtC,KAAM,CAACI,GAAI4Y,EAAIqwB,UAAUxsB,WAAYiL,QAAS9O,EAAIhZ,KAAK8nB,WAE/B,UAAxByO,aAAO,EAAPA,EAASG,aAAiD,UAAxBH,aAAO,EAAPA,EAASI,aAAwE,SAA/C3yB,EAAOooC,qCAC3E1sC,IAAS2sC,EAAAA,EAAAA,IAA8Bxe,EAAeztB,MAI9D,GAAI4Y,EAAIqwB,UAAUvhB,UAAYwiB,EAAYlqC,GAAI,CAC1C,MAAM6M,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAOqX,EAAIqwB,UAAUxsB,YAC1C2tB,GAAUC,EAAAA,EAAAA,IAA4B9oC,GACtC+oC,EAAWjhC,OAAOoI,OAAO24B,GAASG,MAAMpmB,GAAWA,EAAOvL,EAAIhZ,KAAK8nB,WACzE,GAAI7a,IAAWzC,EAAAA,EAAAA,GAAQ8/B,EAAY7/B,SAAWigC,EAAU,CACpD,MAAMt+B,EAAU,CACZ,CACI7H,KAAM2+B,EAAAA,GAAUC,0BAChBnjC,KAAM,CAAC8nB,QAAS9O,EAAIhZ,KAAK8nB,UAE7B,CACIvjB,KAAMmsB,EAAAA,GAAUwZ,wBAChBlqC,KAAM,CAAC6jB,QAAS5W,EAAQ4W,QAASiE,QAAS9O,EAAIhZ,KAAK8nB,WAG3DpoB,IAASoiB,EAAAA,EAAAA,IAAa1V,GAC1B,CACJ,CAEA,MAAMqP,EAAYzC,EAAIqwB,UAAUxsB,YAAc7D,EAAIhZ,KAAK6c,WACjDtc,EAASyY,EAAIqwB,UAAUvhB,SAAW9O,EAAIhZ,KAAK8nB,QAC3C7a,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,IAC9BxO,IAAYigC,EAAAA,EAAAA,IAAsBvrC,EAAO,CAACwrC,WAAYjX,EAAAA,GAAYkX,iBAAmBC,EAAAA,EAAAA,IAAoB1rC,EAAOsL,EAAQ4W,QAASqS,EAAAA,GAAYkX,eAC7I1tC,IAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAM2+B,EAAAA,GAAU+G,6BAChBjqC,KAAM,CAACI,GAAI6M,EAAQ4W,QAASiE,QAASvnB,IAEzC,CACIgE,KAAMmsB,EAAAA,GAAUwZ,wBAChBlqC,KAAM,CAAC6jB,QAAS5W,EAAQ4W,QAASiE,QAASvnB,MAI1D,CAlwBQ+sC,CAAuBt0B,GACvB,MAEJ,KAAK+uB,EAAAA,GAAawF,cAiwBf3tC,eAAsCoZ,GAKzC,MAAMrX,EAAQqd,KACRsrB,GAAcle,EAAAA,EAAAA,IAAezqB,GAC7B8K,EAAOuM,EAAIhZ,KAAKyM,KACtB,GAAIA,GAAQA,EAAK1D,MAAO,CACpB,MAAMykC,EAAe/gC,EAAK1D,MAAMykC,aAAe/rB,KAAKC,MAAMjV,EAAK1D,MAAMykC,mBAAgBnpC,EACrF3E,IAAS+tC,EAAAA,EAAAA,IAAyB,CAACD,aAAY,EAAZA,EAAcE,QACrD,CAEIpD,EAAYlqC,KAAOqM,EAAKrM,GACpBqM,EAAKyb,UAAYoiB,EAAYpiB,YAE7BxoB,GAAS,CACL6E,KAAM2+B,EAAAA,GAAUyK,YAChB3tC,KAAMyM,IAEV/M,IAASkuC,EAAAA,EAAAA,IAAkBnhC,EAAKhC,MAAMojC,MAAM,QAGhDnuC,GAAS,CACL6E,KAAM2+B,EAAAA,GAAU4K,iBAChB9tC,KAAMyM,GAGlB,CA5xBQshC,CAAuB/0B,GACvB,MAEJ,KAAK+uB,EAAAA,GAAaiG,YA2xBtB,SAA8Bh1B,GAC1B,MAAM7C,EAAOsL,KAAKC,MAAM1I,EAAIhZ,KAAKmW,MAEjCzW,GAAS,CACL6E,KAAM0pC,EAAAA,GAAUC,cAChBluC,KAAMmW,GAEd,CAjyBQg4B,CAAqBn1B,GACrB,MAEJ,KAAK+uB,EAAAA,GAAaqG,cAgyBtB,SAAgCp1B,GAC5B,MAAM7C,EAAOsL,KAAKC,MAAM1I,EAAIhZ,KAAKmW,MAEjCzW,GAAS,CACL6E,KAAM0pC,EAAAA,GAAUI,aAChBruC,KAAMmW,GAEd,CAtyBQm4B,CAAuBt1B,GACvB,MAEJ,KAAK+uB,EAAAA,GAAawG,wBAqyBtB,SAAyCv1B,GACrCtZ,IAAS8kB,EAAAA,EAAAA,IAAmBxL,EAAIqwB,UAAUxsB,YAC9C,CAtyBQ2xB,CAAgCx1B,GAChC,MAEJ,KAAK+uB,EAAAA,GAAa0G,oBAklBtB,SAAqCz1B,GACjC,MAAM01B,EAAajtB,KAAKC,MAAM1I,EAAIhZ,KAAKukB,QACjCoqB,EAAWD,EAAWjkC,MAAMojC,MAAM,KAExCnuC,IAASkuC,EAAAA,EAAAA,IAAkBe,IAE3BjvC,GAAS,CACL6E,KAAMmsB,EAAAA,GAAUke,wBAChB5uC,KAAM0uC,GAEd,CA3lBQG,CAA4B71B,GAC5B,MAEJ,KAAK+uB,EAAAA,GAAa+G,cAiyBtB,SAAgC91B,GAC5B,MAAM7C,EAAOsL,KAAKC,MAAM1I,EAAIhZ,KAAKmW,MAEjCzW,GAAS,CACL6E,KAAM0pC,EAAAA,GAAUC,cAChBluC,KAAMmW,GAEd,CAvyBQ44B,CAAuB/1B,GACvB,MAEJ,KAAK+uB,EAAAA,GAAaiH,gBACdtvC,GAqyBR,SAAmCsZ,GAC/B,OAAOpZ,MAAOqvC,EAAYC,KACtB,MAAMzzB,EAAYzC,EAAIhZ,KAAK6c,WACrBnZ,EAASsV,EAAIhZ,KAAK6jB,QAClBliB,EAAQutC,IAEd,IAAIprB,EAAAA,EAAAA,IAAiBniB,KAAW+B,EAAQ,CACpC,IAAIuJ,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAE3BxO,UACKgiC,GAAWE,EAAAA,EAAAA,IAAsB1zB,IAEvCxO,GAAUshB,EAAAA,EAAAA,GAAW2gB,IAAczzB,IAGvCwzB,GAAWG,EAAAA,EAAAA,IAA4BniC,GAAS,GACpD,EAER,CAvzBiBoiC,CAA0Br2B,IACnC,MAEJ,KAAK+uB,EAAAA,GAAauH,iBAszBtB,SAAmCt2B,GAC/B,MAAMrX,EAAQqd,KAERuwB,EAAmE,UAD1DzmB,EAAAA,EAAAA,IAAUnnB,GACW6tC,iCACpC,IAAI9qB,EAAAA,EAAAA,IAAoB/iB,KAAWqX,EAAIhZ,KAAK6c,aAAe0yB,EAAsB,CAC7E,MAAM9gB,GAAUE,EAAAA,EAAAA,IAA0BhtB,GACpCytB,GAAgBtL,EAAAA,EAAAA,IAAiBniB,GACjCk4B,GAAkBjO,EAAAA,EAAAA,IAA8BjqB,EAAOytB,IAC7DhU,EAAAA,GAAAA,KAAaC,KAAKoT,EAAU,aAAeoL,EAC/C,CAEAn6B,GAAS,CAAC6E,KAAMohB,EAAAA,GAAa8pB,yBAA0BzvC,KAAM,CAACI,GAAI4Y,EAAIhZ,KAAK6c,WAAYgH,QAAS7K,EAAIqwB,UAAUxlB,QAAS6rB,SAAU12B,EAAIhZ,KAAKmtB,UAAWoiB,yBACzJ,CAj0BQI,CAA0B32B,GAC1B,MAEJ,KAAK+uB,EAAAA,GAAa6H,oBAg0BtB,SAAsC52B,GAClC,MAAMrX,EAAQqd,KAERuwB,EAAmE,UAD1DzmB,EAAAA,EAAAA,IAAUnnB,GACW6tC,iCAEpC9vC,GAAS,CAAC6E,KAAMohB,EAAAA,GAAakqB,4BAA6B7vC,KAAM,CAACI,GAAI4Y,EAAIhZ,KAAK6c,WAAYgH,QAAS7K,EAAIqwB,UAAUxlB,QAAS0rB,yBAC9H,CAr0BQO,CAA6B92B,GAC7B,MAEJ,KAAK+uB,EAAAA,GAAagI,mBAuNtB,SAAqC/2B,GACjC,MAAMyC,EAAYzC,EAAIhZ,KAAK6c,WAC3B,GAAIpB,EAAW,CACX,MAAMxO,GAAUshB,EAAAA,EAAAA,GAAWvP,KAAYvD,GACnCxO,GACAvN,GAAS,CACL6E,KAAMohB,EAAAA,GAAaqqB,iBACnBhwC,KAAIG,GAAAA,GAAA,GAAM8M,GAAO,IAAE1I,KAAM0rC,EAAAA,GAAQzf,mBAG7C,CACJ,CAjOQ0f,CAA4Bl3B,GAC5B,MAEJ,KAAK+uB,EAAAA,GAAaoI,gBACdzwC,GA+ND,SAAmCsZ,GACtC,MAAO,CAAC2O,EAAYC,KAChB,MAAM3a,EAAUwU,KAAKC,MAAM1I,EAAIhZ,KAAKiN,SAE9Bb,EAAU,CAAC,CAAC7H,KAAMohB,EAAAA,GAAaqqB,iBAAkBhwC,KAAMiN,IAGvDtL,EAAQimB,IACRwoB,GAAkB7hB,EAAAA,EAAAA,GAAW5sB,EAAOsL,EAAQ7M,IAYlD,GATIgwC,GAEIA,EAAgB7rC,OAAS0rC,EAAAA,GAAQlhB,YAAc9hB,EAAQ1I,OAAS0rC,EAAAA,GAAQzf,iBACxEpkB,EAAQiP,KAAK,CAAC9W,KAAMohB,EAAAA,GAAa0qB,wBAAyBrwC,KAAMiN,IAIxE0a,GAAW7F,EAAAA,EAAAA,IAAa1V,IAEpBa,EAAQ7M,MAAOskB,EAAAA,EAAAA,IAAoB/iB,GAAQ,CAE3C,MAAM+B,EAASuJ,EAAQ4W,UAAWC,EAAAA,EAAAA,IAAiBniB,IACnDyZ,EAAAA,GAAAA,KAAak1B,QAAQ,GAADtmC,QAAI0kB,EAAAA,EAAAA,IAAmB/sB,EAAO+B,GAAO,cAAAsG,OAAaiD,EAAQzD,MAClF,EAER,CAzPiB+mC,CAA0Bv3B,IACnC,MAEJ,KAAK+uB,EAAAA,GAAayI,wBAwPtB,SAAyCx3B,GACrC,MAAMwS,EAAgB/J,KAAKC,MAAM1I,EAAIhZ,KAAKwrB,eACpC/gB,EAAQ+gB,EAAc/gB,MAAMojC,MAAM,KACxCnuC,IAASkuC,EAAAA,EAAAA,IAAkBnjC,IAC3B/K,GAAS,CAAC6E,KAAMohB,EAAAA,GAAa8qB,2BAA4BzwC,KAAMwrB,GACnE,CA5PQklB,CAAgC13B,GAChC,MAEJ,KAAK+uB,EAAAA,GAAa4I,yBACdjxC,GAk4CR,SAAsCsZ,GAClC,MAAM43B,EAAWnvB,KAAKC,MAAM1I,EAAIhZ,KAAK4wC,UAErC,MAAO,CACHrsC,KAAMssC,EAAAA,GAAqBC,kBAC3B9wC,KAAM4wC,EAEd,CAz4CiBG,CAA6B/3B,IACtC,MAEJ,KAAK+uB,EAAAA,GAAaiJ,yBACdtxC,GAu4CR,SAAsCsZ,GAClC,OAAOpZ,UACH,MAAM,QAACqxC,EAAO,QAAEC,GAAWzvB,KAAKC,MAAM1I,EAAIhZ,KAAKmxC,WAE3CF,GACAtpB,EAAW,CACPpjB,KAAMssC,EAAAA,GAAqBC,kBAC3B9wC,KAAMixC,IAIVC,GACAvpB,EAAW,CACPpjB,KAAMssC,EAAAA,GAAqBO,iBAC3BpxC,KAAMkxC,GAEd,CAER,CAz5CiBG,CAA6Br4B,IACtC,MAEJ,KAAK+uB,EAAAA,GAAauJ,yBACd5xC,GAu5CR,SAAsCsZ,GAClC,MAAM43B,EAAWnvB,KAAKC,MAAM1I,EAAIhZ,KAAK4wC,UAErC,MAAO,CACHrsC,KAAMssC,EAAAA,GAAqBO,iBAC3BpxC,KAAM4wC,EAEd,CA95CiBW,CAA6Bv4B,IACtC,MAEJ,KAAK+uB,EAAAA,GAAayJ,wBACd9xC,GA45CR,SAAqCsZ,GACjC,MAAMm4B,EAAY1vB,KAAKC,MAAM1I,EAAIhZ,KAAKmxC,WAEtC,MAAO,CACH5sC,KAAMssC,EAAAA,GAAqBY,mBAC3BzxC,KAAM,CAACyb,UAAWzC,EAAIqwB,UAAUxsB,WAAYs0B,aAEpD,CAn6CiBO,CAA4B14B,IACrC,MAEJ,KAAK+uB,EAAAA,GAAa4J,aAIlB,KAAK5J,EAAAA,GAAa6J,YACdlyC,GA6iBR,SAA+BsZ,GAC3B,OAAOszB,GAA4BtzB,EAAIqwB,UAAUxsB,WACrD,CA/iBiBg1B,CAAsB74B,IAC/B,MAEJ,KAAK+uB,EAAAA,GAAa+J,oBAgyBtB,SAAsC94B,GAClC,MAAM+4B,EAAatwB,KAAKC,MAAM1I,EAAIhZ,KAAK+xC,YACvCryC,GAAS,CAAC6E,KAAMytC,EAAAA,GAAgBC,qBAAsBjyC,KAAM,CAAC+xC,KAEzDG,GAAeH,KACfI,EAAAA,EAAAA,MAGAC,GAAeL,KACfM,EAAAA,EAAAA,KAER,CA1yBQC,CAA6Bt5B,GAC7B,MAEJ,KAAK+uB,EAAAA,GAAawK,qBAyyBtB,SAAuCv5B,GACnC,MAAMw5B,EAAc/wB,KAAKC,MAAM1I,EAAIhZ,KAAKwyC,aACxC9yC,GAAS,CAAC6E,KAAMytC,EAAAA,GAAgBC,qBAAsBjyC,KAAMwyC,KAEb,IAA3CA,EAAYC,UAAUP,MACtBC,EAAAA,EAAAA,OAG2C,IAA3CK,EAAYC,UAAUL,MACtBC,EAAAA,EAAAA,KAER,CAnzBQK,CAA8B15B,GAC9B,MAEJ,KAAK+uB,EAAAA,GAAa4K,qBAkzBtB,SAAuC35B,GACnC,MAAMw5B,EAAc/wB,KAAKC,MAAM1I,EAAIhZ,KAAKwyC,aACxC9yC,GAAS,CAAC6E,KAAMytC,EAAAA,GAAgBY,oBAAqB5yC,KAAMwyC,GAC/D,CApzBQK,CAA8B75B,GAC9B,MAEJ,KAAK+uB,EAAAA,GAAa+K,eACdpzC,GA0zBD,SAAkCsZ,GACrC,MAAO,CACHzU,KAAM2+B,EAAAA,GAAU6P,kBAChB/yC,KAAM,CAAC,CAACgZ,EAAIhZ,KAAK8nB,SAAU9O,EAAIhZ,KAAK0I,QAE5C,CA/zBiBsqC,CAAyBh6B,IAClC,MAEJ,KAAK+uB,EAAAA,GAAakL,OA8zBtB,SAA0Bj6B,GAwB1B,IAA2Bk6B,EAPFC,EAhBrBzzC,IAAS0zC,EAAAA,EAAAA,IAAiBp6B,EAAIhZ,KAAKqzC,iBACnC3zC,IAeqByzC,EAfIn6B,EAAIhZ,KAAKszC,cAgB3B,CACH/uC,KAAMuhC,EAAAA,GAAayN,kBACnBC,QAAS,CAACL,mBAjBdzzC,IAqBuBwzC,EArBIl6B,EAAIhZ,KAAKyzC,gBAsB7B,CACHlvC,KAAMuhC,EAAAA,GAAa4N,oBACnBF,QAAS,CAACN,oBAvBlB,CAj0BQS,CAAiB36B,GACjB,MAEJ,KAAK+uB,EAAAA,GAAa6L,gBAg0BtB,SAAkC56B,GAC9B,MAAM66B,EAAWpyB,KAAKC,MAAM1I,EAAIhZ,KAAK6zC,UAErCn0C,IAASo0C,EAAAA,EAAAA,IAA0BD,EAASE,aAE5Cr0C,GAAS,CACL6E,KAAMwjB,EAAAA,GAAUisB,kBAChBh0C,KAAM6zC,GAEd,CAx0BQI,CAAyBj7B,GACzB,MAEJ,KAAK+uB,EAAAA,GAAamM,kBA81BtB,SAAoCl7B,GAChC,MAAM66B,EAAWpyB,KAAKC,MAAM1I,EAAIhZ,KAAK6zC,UAErCn0C,GAAS,CACL6E,KAAMwjB,EAAAA,GAAUosB,iBAChBn0C,KAAM6zC,GAEd,CAp2BQO,CAA2Bp7B,GAC3B,MAEJ,KAAK+uB,EAAAA,GAAasM,aAi1BtB,SAAwBr7B,GACpB,MAAMhZ,EAAOyhB,KAAKC,MAAM1I,EAAIhZ,KAAK0tC,OAEjChuC,GAAS,CACL6E,KAAM+vC,EAAAA,GAAWC,sBACjBv0C,QAER,CAv1BQw0C,CAAex7B,GACf,MAEJ,KAAK+uB,EAAAA,GAAa0M,0BA+1BtB,SAA2Cz7B,IACnC4K,EAAAA,EAAAA,IAAiB5E,QAAgBhG,EAAIqwB,UAAUvhB,SAC/CpoB,IAASg1C,EAAAA,EAAAA,IAA2B17B,EAAIhZ,KAAK20C,eAErD,CAl2BQC,CAAkC57B,GAClC,MAEJ,KAAK+uB,EAAAA,GAAa8M,gBAi2Bf,SAA6B77B,GAChC,MAAM87B,EAAW97B,EAAIhZ,KAAK80C,SAC1Bp1C,GAAS,CAAC6E,KAAMc,EAAAA,GAAY0vC,uBAAwB/0C,KAAM80C,KAE1DE,EAAAA,GAAAA,IAAWF,GAAUpqB,OAAO3qB,IACxBghC,QAAQhhC,MAAMA,EAAM0I,QAAQ,GAEpC,CAv2BQwsC,CAAoBj8B,GACpB,MAEJ,KAAK+uB,EAAAA,GAAamN,iBAs2Bf,SAA8Bl8B,GACjC,MAAM87B,EAAW97B,EAAIhZ,KAAK80C,UAC1BK,EAAAA,GAAAA,IAAaL,EACjB,CAx2BQM,CAAqBp8B,GACrB,MAEJ,KAAK+uB,EAAAA,GAAasN,mBAu2BtB,SAA+Br8B,GAC3B,MAAMvM,EAAO9M,EAAAA,QAAMqf,WAAWkV,SAAS3nB,MAAM+oC,SAASt8B,EAAIhZ,KAAK8nB,SAE/D,GAAIrb,EAAM,CACN,MAAMhC,EAAQuO,EAAIhZ,KAAKyK,MACjBkkC,EAAWlkC,EAAMojC,MAAM,KACvB0H,EAAU9oC,EAAKhC,MAAM+qC,SAAS1mB,EAAAA,GAAU2mB,4BAA8BhrC,EAAM+qC,SAAS1mB,EAAAA,GAAU2mB,0BAErG91C,EAAAA,QAAMD,SAAS,CAAC6E,KAAM2+B,EAAAA,GAAU4K,iBAAkB9tC,KAAIG,GAAAA,GAAA,GAAMsM,GAAI,IAAEhC,YAClE/K,IAASkuC,EAAAA,EAAAA,IAAkBe,IAEvB4G,GAAWhL,EAAAA,EAAO/uB,SAASwQ,SAAS9Q,WAAW,oBAC/CgR,EAAAA,EAAAA,KAER,CACJ,CAr3BQwpB,CAAsB18B,GACtB,MAEJ,KAAK+uB,EAAAA,GAAa4N,gBAo3BtB,SAA6B38B,GACzBrZ,EAAAA,QAAMD,SAAS,CAAC6E,KAAMuhC,EAAAA,GAAa8P,uBAAwB51C,KAAMgZ,EAAIhZ,KAAKgE,QAC9E,CAr3BQ6xC,CAAoB78B,GACpB,MAEJ,KAAK+uB,EAAAA,GAAa+N,iBAo3BtB,SAA8B98B,GAC1BrZ,EAAAA,QAAMD,SAAS,CAAC6E,KAAMuhC,EAAAA,GAAaiQ,wBAAyB/1C,KAAMgZ,EAAIhZ,KAAKu2B,SAC/E,CAr3BQyf,CAAqBh9B,GACrB,MAEJ,KAAK+uB,EAAAA,GAAakO,yBAo3BtB,SAA0Cj9B,GACtCrZ,EAAAA,QAAMD,SAAS,CAAC6E,KAAM2xC,EAAAA,GAAWC,yBAA0Bn2C,KAAMgZ,EAAIhZ,KAAKo2C,iBAC9E,CAr3BQC,CAAiCr9B,GACjC,MAEJ,KAAK+uB,EAAAA,GAAauO,aAo3BtB,SAA+Bt9B,GAC3B,MAAMhZ,EAAQgZ,EAAIhZ,MAAQgZ,EAAIhZ,KAAKu2C,QAAW,CAAC,EACzCA,EAAS90B,KAAKC,MAAM1hB,GAE1BL,EAAAA,QAAMD,SAAS,CAAC6E,KAAM+2B,EAAAA,GAAiBkb,gBAAiBx2C,KAAMu2C,IAE9D,MAAME,EAAmBz3B,KAAWkV,SAASwiB,aAAaC,gBAEtDJ,EAAOlb,aAAeob,GAI1B92C,EAAAA,QAAMD,UAASwc,EAAAA,EAAAA,GAAU,CAACC,QAASC,EAAAA,GAAiBw6B,mBAAoBt6B,WAAYu6B,EAAAA,IACxF,CAh4BQC,CAAsB99B,GACtB,MAEJ,KAAK+uB,EAAAA,GAAagP,gBA+3BtB,SAAiC/9B,GAC7B,MAAMhZ,EAAOyhB,KAAKC,MAAM1I,EAAIhZ,KAAKg3C,OACjCt3C,GACI,CACI6E,KAAM0yC,EAAAA,GAAWC,cACjBl3C,QAGZ,CAt4BQm3C,CAAwBn+B,GACxB,MAEJ,KAAK+uB,EAAAA,GAAaqP,iBACd13C,GAo4BD,SAAqCsZ,GACxC,OAAOpZ,MAAO+nB,EAAYC,KACtB,MAAMjmB,EAAQimB,IACRuH,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjC01C,EAAY51B,KAAKC,MAAM1I,EAAIhZ,KAAKs3C,cAEtC,GAAInoB,IAAkBkoB,EAAUvvB,QAE5B,IADcyvB,EAAAA,EAAAA,IAAS51C,EAAO01C,EAAUG,UAEpC93C,GACI,CACI6E,KAAM0yC,EAAAA,GAAWQ,aACjBr3C,GAAIi3C,EAAUG,eAGnB,CACH,MAAM,MAACz3C,SAAe4nB,GAAW+vB,EAAAA,EAAAA,IAAWL,EAAUG,UAAU,IAC3Dz3C,GACDL,GACI,CACI6E,KAAM0yC,EAAAA,GAAWQ,aACjBr3C,GAAIi3C,EAAUG,UAI9B,CACJ,CAER,CAh6BiBG,CAA4B3+B,IACrC,MAEJ,KAAK+uB,EAAAA,GAAa6P,qBACdl4C,GA85BR,SAAuCsZ,GACnC,MAAO,CAAC2O,EAAYC,KAChB,MAAMjmB,EAAQimB,IACRuH,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjC3B,EAAOyhB,KAAKC,MAAM1I,EAAIhZ,KAAKs3C,cAE7BnoB,IAAkBnvB,EAAK8nB,SACvBpoB,GACI,CACI6E,KAAM0yC,EAAAA,GAAWY,gBACjB73C,OACAI,GAAIJ,EAAKw3C,UAGrB,CAER,CA96BiBM,CAA8B9+B,IACvC,MAEJ,KAAK+uB,EAAAA,GAAagQ,mCA66BtB,SAA0C/+B,GACtCrZ,EAAAA,QAAMD,SAAS,CACX6E,KAAM0yC,EAAAA,GAAWc,kCACjB/3C,KAAM,CAACg4C,OAAQh/B,EAAIqwB,UAAUxlB,QAASo0B,OAAQ,CAAC,CAAC73C,GAAI4Y,EAAIhZ,KAAKw3C,aAErE,CAj7BQU,CAAiCl/B,GACjC,MAEJ,KAAK+uB,EAAAA,GAAaoQ,uCAg7BtB,SAA6Cn/B,GACzCrZ,EAAAA,QAAMD,SAAS,CACX6E,KAAM0yC,EAAAA,GAAWkB,sCACjBn4C,KAAM,CAACg4C,OAAQh/B,EAAIqwB,UAAUxlB,QAASo0B,OAAQ,CAAC,CAAC73C,GAAI4Y,EAAIhZ,KAAKw3C,aAErE,CAp7BQY,CAAoCp/B,GACpC,MAEJ,KAAK+uB,EAAAA,GAAasQ,sCAm7BtB,SAA6Cr/B,GACzCrZ,EAAAA,QAAMD,SAAS,CACX6E,KAAM0yC,EAAAA,GAAWoB,qCACjBr4C,KAAM,CAACkd,UAAWlE,EAAIqwB,UAAUxsB,WAAYo7B,OAAQ,CAAC,CAAC73C,GAAI4Y,EAAIhZ,KAAKw3C,aAE3E,CAv7BQc,CAAoCt/B,GACpC,MAEJ,KAAK+uB,EAAAA,GAAawQ,0CAs7BtB,SAAgDv/B,GAC5CrZ,EAAAA,QAAMD,SAAS,CACX6E,KAAM0yC,EAAAA,GAAWsB,yCACjBv4C,KAAM,CAACkd,UAAWlE,EAAIqwB,UAAUxsB,WAAYo7B,OAAQ,CAAC,CAAC73C,GAAI4Y,EAAIhZ,KAAKw3C,aAE3E,CA17BQgB,CAAuCx/B,GACvC,MAEJ,KAAK+uB,EAAAA,GAAa0Q,yBACd/4C,GAw7BR,SAAsCsZ,GAClC,MAAO,CAAC2O,EAAYC,KAChB,MAAMjmB,EAAQimB,IAET5O,EAAIqwB,UAAUxlB,SAIf7K,EAAIqwB,UAAUxlB,WAAYC,EAAAA,EAAAA,IAAiBniB,IAO/CgmB,GAAW0e,EAAAA,EAAAA,IAAkBrtB,EAAIqwB,UAAUxlB,SAAS,CAE5D,CAz8BiB60B,CAA6B1/B,IACtC,MAEJ,KAAK+uB,EAAAA,GAAa4Q,yBACdj5C,GAu8BR,SAAsCsZ,GAClC,MAAO,CAAC2O,EAAYC,KAChB,MAAMjmB,EAAQimB,IAET5O,EAAIqwB,UAAUxlB,SAIf7K,EAAIqwB,UAAUxlB,WAAYC,EAAAA,EAAAA,IAAiBniB,IAO/CgmB,GAAW0e,EAAAA,EAAAA,IAAkBrtB,EAAIqwB,UAAUxlB,SAAS,GAAM,CAElE,CAx9BiB+0B,CAA6B5/B,IACtC,MAEJ,KAAK+uB,EAAAA,GAAa8Q,yBACdn5C,GAs9BR,SAAsCsZ,GAClC,MAAO,CAAC2O,EAAYC,KAChB,MAAMjmB,EAAQimB,IAET5O,EAAIqwB,UAAUxlB,SAIf7K,EAAIqwB,UAAUxlB,WAAYC,EAAAA,EAAAA,IAAiBniB,IAM/CgmB,GAAW0e,EAAAA,EAAAA,IAAkBrtB,EAAIqwB,UAAUxlB,SAAS,CAE5D,CAt+BiBi1B,CAA6B9/B,IACtC,MACJ,KAAK+uB,EAAAA,GAAagR,+BACdr5C,GAq+BR,SAA2CsZ,GACvC,OAAOggC,EAAAA,EAAAA,IAAsBhgC,EAAIqwB,UAAUxlB,QAAS7K,EAAIhZ,KAAKqyB,MACjE,CAv+BiB4mB,CAAkCjgC,IAC3C,MACJ,KAAK+uB,EAAAA,GAAamR,+BACdx5C,IAu+BG,CAACioB,EAAYC,KAChB,MAAMjmB,EAAQimB,IAIQ,UAHN4O,EAAAA,EAAAA,IAAW70B,GAGfopC,QACJwB,EAAAA,EAAAA,IAAyB5qC,IACzBgmB,GAAWlkB,EAAAA,EAAAA,MAEnB,IA/+BA,MACJ,KAAKskC,EAAAA,GAAaoR,6BACdz5C,IAk/BIioB,GAAeA,GAAWxI,EAAAA,EAAAA,SAj/B9B,MACJ,KAAK4oB,EAAAA,GAAaqR,2BACd15C,GAk/BD,SAAwCsZ,GAC3C,MAAO,CAAC2O,EAAYC,KAChB,MAAMjmB,EAAQimB,IAkBd,MAfsB,UAFN4O,EAAAA,EAAAA,IAAW70B,GAEfopC,QACJ/xB,EAAIhZ,KAAK0f,QACTiI,EAAW,CACPpjB,KAAMsZ,EAAAA,GAAWG,sBACjBhe,KAAMgZ,EAAIhZ,KAAK0f,SAInB1G,EAAIhZ,KAAKkf,cACTyI,EAAW,CACPpjB,KAAMsZ,EAAAA,GAAWw7B,4BACjBr5C,KAAMgZ,EAAIhZ,KAAKkf,gBAIpB,CAAClf,MAAM,EAAK,CAE3B,CAxgCiBs5C,CAA+BtgC,IACxC,MACJ,KAAK+uB,EAAAA,GAAawR,+CAqjCtB,SAA6DvgC,GACzD,MAAMwgC,EAAe/3B,KAAKC,MAAM1I,EAAIhZ,KAAKy5C,kCACzC95C,EAAAA,QAAMD,SAAS,CAAC6E,KAAMuhC,EAAAA,GAAayT,8CAA+Cv5C,KAAMw5C,GAC5F,CAvjCQE,CAAoD1gC,GACpD,MACJ,KAAK+uB,EAAAA,GAAa4R,sBACdj6C,GAuoCR,SAAmCsZ,GAC/B,OAAOpZ,MAAO+nB,EAAYC,KACtB,MAAMjmB,EAAQimB,MACCghB,EAAAA,EAAAA,IAAUjnC,EAAOqX,EAAIhZ,KAAK45C,YAC1B5gC,EAAIhZ,KAAK2B,OAASqX,EAAIhZ,KAAK65C,mBAChClyB,GAAWmhB,EAAAA,EAAAA,KAAYllB,EAAAA,EAAAA,IAAiBjiB,GAAQqX,EAAIqwB,UAAUxlB,QAAS7K,EAAIhZ,KAAK45C,WAAW,KAErGE,EAAAA,EAAAA,IAAoBnyB,EAAY3O,EAAIhZ,KAAK45C,UAAW5gC,EAAIqwB,UAAUxlB,QAAS7K,EAAIhZ,KAAK2B,MAAM,CAElG,CAhpCiBo4C,CAA0B/gC,IACnC,MACJ,KAAK+uB,EAAAA,GAAaiS,oBACdt6C,GAmjCR,SAAiCsZ,GAC7B,MAAO,CAAC2O,EAAYC,KAChB,GAAI5O,EAAIhZ,KAAK45C,UAAW,KAAAK,EAAAC,EAAAC,EACpB,MAAMx4C,EAAQimB,IACRwyB,EAA0B,QAApBH,GAAGI,EAAAA,EAAAA,IAAW14C,UAAM,IAAAs4C,OAAA,EAAjBA,EAAoBjhC,EAAIhZ,KAAK45C,WAGxCQ,KAAWE,EAAAA,EAAAA,IAAa34C,EAAOy4C,EAAOh6C,KACtCunB,GAAW4yB,EAAAA,EAAAA,IAAuBH,EAAOh6C,GAAI4Y,EAAIhZ,KAAK6nB,YAG1DF,GACI6yB,EAAAA,EAAAA,IACIxhC,EAAIhZ,KAAK45C,UACT5gC,EAAIqwB,UAAUxlB,QACd7K,EAAIhZ,KAAK6c,WACT,CACImK,aAAchO,EAAIhZ,KAAK6nB,UACvB4yB,mBAA2C,QAAzBP,EAAEE,aAAM,EAANA,EAAQM,uBAAe,IAAAR,EAAAA,EAAIlhC,EAAIhZ,KAAK26C,yBACxDC,kBAAmB5hC,EAAIhZ,KAAK06C,gBAC5BG,kBAAyC,QAAxBV,EAAEC,aAAM,EAANA,EAAQU,sBAAc,IAAAX,EAAAA,EAAInhC,EAAIhZ,KAAK+6C,wBACtDC,iBAAkBhiC,EAAIhZ,KAAK86C,iBAI3C,MAAW9hC,EAAIqwB,UAAUxsB,WACrB8K,GAAWszB,EAAAA,EAAAA,IAAoCjiC,EAAIqwB,UAAUxsB,WAAY7D,EAAIhZ,KAAK6nB,YAElFF,GAAWuzB,EAAAA,EAAAA,IAAoBliC,EAAIqwB,UAAUxlB,SACjD,CAER,CAllCiBs3B,CAAwBniC,IACjC,MACJ,KAAK+uB,EAAAA,GAAaqT,eACd17C,GAilCR,SAA6BsZ,GACzB,MAAO,CAAC2O,EAAYC,KAChB,IAAIyzB,EACJ,IACIA,EAAa55B,KAAKC,MAAM1I,EAAIhZ,KAAKo6C,OACrC,CAAE,MAAAp+B,GAEE,MACJ,CAEA,MAAMra,EAAQimB,IACRuH,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjCytB,GAAgBtL,EAAAA,EAAAA,IAAiBniB,GAEvC,IAAIqlB,EAIAmI,IAAkBksB,EAAW3+B,KAAKoL,UAClCuzB,EAAWC,cAAe,IAG1BhB,EAAAA,EAAAA,IAAa34C,EAAO05C,EAAWj7C,KAAO2a,OAAOwgC,YAAaC,EAAAA,EAAAA,IAAuB75C,EAAO05C,EAAWj7C,MACnG4mB,EAAeC,KAAKC,MAMhBF,EAAeq0B,EAAWhU,gBAC1BrgB,EAAeq0B,EAAWhU,cAAgB,GAM9CgU,EAAWj0B,eAAiBJ,EAC5Bq0B,EAAWX,gBAAkB,EAC7BW,EAAWP,eAAiB,EAG5Bp7C,IAAS+7C,EAAAA,EAAAA,IAAiBtsB,EAAeC,EAAeisB,EAAWj7C,GAAI4mB,MAG3E00B,EAAAA,EAAAA,IAAoB/zB,EAAYC,EAAYyzB,EAAYriC,EAAIqwB,UAAUxlB,QAAS7K,EAAIhZ,KAAK+6C,wBAAyB/hC,EAAIhZ,KAAK26C,yBAAyB,CAE3J,CA/nCiBgB,CAAoB3iC,IAC7B,MACJ,KAAK+uB,EAAAA,GAAa6T,gCACdl8C,GAASwmC,MACT,MACJ,KAAK6B,EAAAA,GAAa8T,8BACdn8C,IAwhCJA,GAASwmC,MAEF,CACH3hC,KAAMu3C,EAAAA,GAAUC,uBA1hChB,MACJ,KAAKhU,EAAAA,GAAaiU,+BACdt8C,GA6hCG,CACH6E,KAAMu3C,EAAAA,GAAUG,uBA7hChB,MACJ,KAAKlU,EAAAA,GAAamU,2BACdx8C,GAgoCR,SAAwCsZ,GACpC,MAAMhZ,EAAOyhB,KAAKC,MAAM1I,EAAIhZ,KAAKm8C,iBAEjC,MAAO,CACH53C,KAAMwjB,EAAAA,GAAUq0B,wBAChBp8C,OAER,CAvoCiBq8C,CAA+BrjC,IACxC,MACJ,KAAK+uB,EAAAA,GAAauU,6BACd58C,GAsoCR,SAA0CsZ,GACtC,MAAMhZ,EAAOyhB,KAAKC,MAAM1I,EAAIhZ,KAAKm8C,iBAEjC,MAAO,CACH53C,KAAMwjB,EAAAA,GAAUw0B,wBAChBv8C,OAER,CA7oCiBw8C,CAAiCxjC,IAC1C,MACJ,KAAK+uB,EAAAA,GAAa0U,cAClB,KAAK1U,EAAAA,GAAa2U,cACdh9C,GA2oCR,SAAgCsZ,GAC5B,OAAOpZ,UACH,MAAM81B,EAAQjU,KAAKC,MAAM1I,EAAIhZ,KAAK01B,QAC5B,IAAC3uB,EAAG,MAAE8F,IAAS8vC,EAAAA,EAAAA,IAAqBjnB,GAC1C7oB,EAAMqI,MAAO,EAEbyS,GAAWi1B,EAAAA,EAAAA,IAAe71C,EAAK8F,GAAO,GAAM,CAEpD,CAnpCiBgwC,CAAuB7jC,IAChC,MACJ,KAAK+uB,EAAAA,GAAa+U,cACdp9C,GA4rCR,SAAgCsZ,GAC5B,OAAOpZ,UACH,MAAM81B,EAAQjU,KAAKC,MAAM1I,EAAIhZ,KAAK01B,QAC5B,IAAC3uB,IAAO41C,EAAAA,EAAAA,IAAqBjnB,GAEnC/N,GAAWo1B,EAAAA,EAAAA,IAAch2C,EAAK,CAC1B0B,QAAS,GACT+uB,UAAW,GACXwlB,kBAAmB,KACpB,CAEX,CAvsCiBC,CAAuBjkC,IAChC,MACJ,KAAK+uB,EAAAA,GAAamV,uBACdx9C,GA+oCR,SAAwCsZ,GACpC,OAAOpZ,UACH,MAAM03B,EAAgB7V,KAAKC,MAAM1I,EAAIhZ,KAAKs3B,eACpC31B,EAAQqd,KACRtb,GAASy5C,EAAAA,EAAAA,IAAqBx7C,EAAO21B,EAAcza,YAEzD8K,EAAW,CACPpjB,KAAM64C,EAAAA,GAAmBC,+BACzBr9C,KAAM,CACFs3B,gBACA5zB,WAEN,CAEV,CA7pCiB45C,CAA+BtkC,IACxC,MACJ,KAAK+uB,EAAAA,GAAawV,uBACd79C,GA4pCR,SAAwCsZ,GACpC,OAAOpZ,UACH,MAAM03B,EAAgB7V,KAAKC,MAAM1I,EAAIhZ,KAAKs3B,eAE1C3P,EAAW,CACPpjB,KAAM64C,EAAAA,GAAmBG,uBACzBv9C,KAAM,CACFs3B,kBAEN,CAEV,CAvqCiBkmB,CAA+BxkC,IACxC,MACJ,KAAK+uB,EAAAA,GAAa0V,uBACd/9C,GAsqCR,SAAwCsZ,GACpC,OAAOpZ,UACH,MAAM03B,EAAgB7V,KAAKC,MAAM1I,EAAIhZ,KAAKs3B,eAE1C3P,EAAW,CACPpjB,KAAM64C,EAAAA,GAAmBK,uBACzBz9C,KAAM,CACFs3B,kBAEN,CAEV,CAjrCiBomB,CAA+B1kC,IACxC,MACJ,KAAK+uB,EAAAA,GAAa4V,kCACdj+C,GA6rCR,SAAsCsZ,GAClC,OAAOpZ,UACH,MAAM8c,EAAO+E,KAAKC,MAAM1I,EAAIhZ,KAAK0c,MAEjCiL,GAAWi2B,EAAAA,EAAAA,IAAwBlhC,EAAM1D,EAAIhZ,MAAM,CAE3D,CAnsCiB69C,CAA6B7kC,IACtC,MACJ,KAAK+uB,EAAAA,GAAa+V,wCACdp+C,GAksCR,SAAmDsZ,GAC/C,MAAO,CACHzU,KAAMw5C,EAAAA,GAAoBC,qCAC1Bh+C,KAAMgZ,EAAIhZ,KAAKi+C,SAEvB,CAvsCiBC,CAA0CllC,IAKvDvP,OAAOoI,OAAO6xB,IAAqB3xB,SAASosC,IACnCA,GAID10C,OAAO20C,OAAOD,EAAcnlC,EAAIkI,QAA6C,mBAA5Bi9B,EAAanlC,EAAIkI,QAClEi9B,EAAanlC,EAAIkI,OAAOlI,EAC5B,GAER,CAwFA,MAAMkvB,GArCN,WACI,IAAI3J,EACA8f,EAAQ,GACRhgC,EAAQ,EAGZ,MAAMigC,EAAYA,KACd/f,EAAU,KAEN8f,EAAM5rC,OAAS,GACf/S,GA2DL,SAA6B2+C,GAChC,MAAO,CAACpP,EAAYC,KAEhB,MAAMhd,EAAQmsB,EAAM3xC,KAAKsM,GAAQyI,KAAKC,MAAM1I,EAAIhZ,KAAK0c,QAEjD3B,OAAOqtB,eAEPrH,QAAQ8C,IAAI,2CAA4C3R,GAG5DA,EAAMngB,SAAQ,CAAC2K,EAAM1E,KACbqmC,EAAMrmC,GAAOhY,KAAKu+C,YAClBz0B,GAAAA,EAAgB00B,8BAA8B9hC,EAAKtc,GAAI,WAAY,iBACvE,IAIJ,MAAMkmB,GAAaC,EAAAA,EAAAA,IAA0B2oB,KACvC9iC,EAAU8lB,EAAMxlB,KAAKgQ,IAAS+hC,EAAAA,EAAAA,IAAgB/hC,EAAM4J,KAC1D2oB,GAAWntB,EAAAA,EAAAA,IAAa1V,IAGxB6iC,GAAWyP,EAAAA,EAAAA,IAAexsB,IAC1B+c,GAAW3G,EAAAA,EAAAA,IAA0CpW,GAAO,CAEpE,CApFqBysB,CAAoBN,IAGjCA,EAAQ,GACRhgC,EAAQ,CAAC,EAGb,OAAO,SAAYrF,GACXulB,GAAWlgB,EAAQ,GAEfggC,EAAMhjC,KAAKrC,GAAO,MAElBqlC,EAAQ,GACRtd,QAAQ8C,IAAI,yDAEhB+a,aAAargB,GACbA,EAAUjK,WAAWgqB,EAWqB,OAR1CjgC,GAAS,EACT3e,GASL,SAA4BsZ,GAC/B,MAAO,CAACi2B,EAAYC,KAChB,MAAMxyB,EAAO+E,KAAKC,MAAM1I,EAAIhZ,KAAK0c,MAE7B3B,OAAOqtB,eAEPrH,QAAQ8C,IAAI,yCAA0CnnB,GAG1DuyB,GAAW9mB,EAAAA,EAAAA,IAAczL,EAAM1D,IAC/Bi2B,GAAW3G,EAAAA,EAAAA,IAA0C,CAAC5rB,KAQlDA,EAAKoL,WAAYlE,EAAAA,EAAAA,IAAiBsrB,QACjC2P,EAAAA,EAAAA,IAA2B3P,IAAcxyB,EAAKoL,UAC/C9O,EAAIhZ,KAAK8+C,YAET7P,EAAW,CACP1qC,KAAM2+B,EAAAA,GAAU6P,kBAChB/yC,KAAM,CAAC,CAAC0c,EAAKoL,SAAUi3B,EAAAA,GAAaC,SAE5C,CAER,CArCqBC,CAAmBjmC,IAC5B4lC,aAAargB,GACbA,EAAUjK,WAAWgqB,EAKqB,KAHlD,CACJ,CAEoCY,GAqUpC,SAAS5S,GAA4B7wB,GACjC,OAAO7b,UACH,MAAM,KAACI,EAAI,MAAED,SAAe4nB,GAAWwnB,EAAAA,EAAAA,IAAsB1zB,IAExD1b,GACD4nB,GAAWynB,EAAAA,EAAAA,IAA4BpvC,EAAKiN,SAChD,CAER,CA0OA,SAASilC,GAAeH,GACpB,OAAOA,EAAWtY,WAAa3K,EAAAA,GAAU7F,YAAY0Q,8BAAqD,SAArBoY,EAAWllC,KACpG,CAEA,SAASulC,GAAeL,GACpB,OAAOA,EAAWtY,WAAa3K,EAAAA,GAAU7F,YAAY2Q,6BAAoD,SAArBmY,EAAWllC,KACnG,CAsTA,SAASq5B,KACL,MAAO,CAACve,EAAYC,KAAe,IAAAu3B,EAAAC,EAC/B,MAAMz9C,EAAQimB,IAEdD,GAAW3B,EAAAA,EAAAA,IAAiBtB,EAAAA,EAAAA,IAAoB/iB,KAEhD,MAAMkF,EAAUlF,EAAMuyB,SAASmrB,QAAQr7C,OAAOs7C,QACxCC,EAAaxkC,OAAOS,SAASgkC,KACnC,IAAIC,EACJ,GAAIF,EAAWrkC,WAAWrU,GAAU,CAChC,MAAM64C,EAAQH,EAAW/jB,OAAO30B,EAAQ4L,QAAU5L,EAAQ84C,SAAS,KAAO,EAAI,IAAI9R,MAAM,KACnE,IAAjB6R,EAAMjtC,QAA6B,YAAbitC,EAAM,KAC5BD,EAAmBC,EAAM,GAEjC,CACA,MAAME,GAAU1vB,EAAAA,EAAAA,IAAgBvuB,GAChC,IAAIk+C,EACAJ,IACAI,GAAiBjX,EAAAA,EAAAA,IAAUjnC,EAAO89C,IAEtC,MAAMK,EAASL,IAAoBG,aAAO,EAAPA,EAASx/C,IACtC8c,GAA0B,QAAdiiC,EAAAU,SAAc,IAAAV,GAAM,QAANC,EAAdD,EAAgBziC,YAAI,IAAA0iC,OAAN,EAAdA,EAAsBviC,cAAc+iC,aAAO,EAAPA,EAAS/iC,YAC/D,OAAKijC,GAILn4B,GAAWo4B,EAAAA,EAAAA,GAAqB7iC,IACzB,CAACld,MAAM,IAJH,CAACA,MAAM,EAIC,CAE3B,C,yNEplDe,SAASggD,EAAqBj3C,GACzC,MAAM/E,EAAS+E,EAAM/E,OAGrB,IAAIi8C,EAFYl3C,EAAMwtB,QAEI2pB,QAC1B,MAAMC,GAAcC,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAASmsB,MAAM/gC,WAEzE6gC,IACAF,EAAcE,EAAY32C,MAG9B,MAAM+N,EACFlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,UAIjBwtC,EACFj3C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,4CAIjBytC,EACFl3C,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,iBAElB,IAAWmtC,GAIpB,OACI52C,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAiByqC,IAAW,cAAe,cAAe,SAC1DtrC,KAAMnM,EAAMmM,KACZc,OAAQjN,EAAM03C,OACdxqC,SAAUlN,EAAMkN,SAChBE,KAAK,OACL,kBAAgB,mBAEhB9M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,mBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,cACHyR,OAAQ,CAAC6uC,SAAU18C,EAAO28C,UAAY,cACtC7tC,eAAe,uBAI3BzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACu3C,EAAAA,EAAc,OAEnBv3C,IAAAA,cAAA,WACIA,IAAAA,cAAA,MAAIC,UAAU,sBACVD,IAAAA,cAAA,cAAS,aAAa,IAAEkO,IAE5BlO,IAAAA,cAAA,KAAGC,UAAU,YAAYg3C,GACzBj3C,IAAAA,cAAA,OAAKC,UAAU,eACXD,IAAAA,cAAA,OAAK,cAAY,qBACbA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gBACH0S,eAAe,wBAEnBzJ,IAAAA,cAAA,QAAMjJ,GAAG,iBAAiB,IAAW4D,EAAO68C,WAGnDN,EACDl3C,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,eACH0S,eAAe,oLACfjB,OAAQ,CACJivC,WAAa9nC,GACT3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAK,yEACLhkC,SAAS,2BAERxC,GAGTgoC,YAAchoC,GACV3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAK,+DACLhkC,SAAS,2BAERxC,GAGTioC,WAAajoC,GACT3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAK,yEACLhkC,SAAS,2BAERxC,MAKjB3P,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kBACH0S,eAAe,sEACfjB,OAAQ,CACJqvC,aAAa,IAAIj6B,MAAOk6B,oBAM5C93C,IAAAA,cAAA,aAEJA,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,aACH0S,eAAe,gBAElB9O,EAAOo9C,UACR/3C,IAAAA,cAAA,WACAA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,eACH0S,eAAe,mBAElB9O,EAAOq9C,qBAEZh4C,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,aACH0S,eAAe,gBAElB9O,EAAOs9C,aAMhC,C,yZAACtB,EAAAtuC,UAAA,CAxJGuE,SAAQ9G,IAAAA,KAAAC,WACRpL,OAAMmL,IAAAA,IAAAC,WACNmnB,QAAOpnB,IAAAA,IAAAC,WACP8F,KAAI/F,IAAAA,KAAAC,WACJqxC,OAAMtxC,IAAAA,KAAAC,YCyBK,MAAMmyC,UAAwBl4C,IAAAA,cACzCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,eAOR,KACLE,KAAKgH,SAAS,CAACmC,MAAM,IACrBnJ,KAAKhD,MAAMkN,UAAU,IAPrBlK,KAAKpK,MAAQ,CACTuT,MAAM,EAEd,CAOAlG,MAAAA,GACI,MAAMhL,EAAS+H,KAAKhD,MAAM/E,OACpBuyB,EAAUxqB,KAAKhD,MAAMwtB,QAE3B,GAAsB,SAAlBA,EAAQwU,MACR,OACI1hC,IAAAA,cAAC22C,EAAoBv2C,OAAAC,OAAA,GACbqC,KAAKhD,MACLgD,KAAKpK,MAAK,CACd8+C,OAAQ10C,KAAK00C,UAKzB,IA6BIF,EA7BAhpC,EACAlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,iBAInBwtC,EACAj3C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,4FAInB0uC,EACAn4C,IAAAA,cAAA,WACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,sCAEnBzJ,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,oBACTgkC,KAAK,qCAEJ,8BAMuB,SAAhCx7C,EAAOy9C,uBACPlqC,EACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,uBAIvBwtC,EACIj3C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,oDAIvB0uC,EACIn4C,IAAAA,cAAA,WACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,4CAEnBzJ,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,oBACTgkC,KAAK,2BAEJ,mBAKc,SAAvBjpB,EAAQG,aACRnf,EACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,uBAGvBytC,EACIl3C,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,iBAEnBzJ,IAAAA,cAACq4C,EAAAA,EAAI,MAAGnrB,EAAQ2pB,WAMhC,MAAMyB,EACFt4C,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,oBACTpb,GAAG,UACHo/C,KAAMoC,EAAAA,GAAWC,kBAEjBx4C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,YACH0S,eAAe,kBAKrBgvC,EACFz4C,IAAAA,cAAC03C,EAAAA,EAAY,CACT3gD,GAAG,cACHob,SAAS,oBACTgkC,KAAMoC,EAAAA,GAAWG,gBAEjB14C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gBACH0S,eAAe,oBAKrBkvC,EACF34C,IAAAA,cAAA,OAAK,cAAY,yBACbA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oBACH0S,eAAe,kBAEnBzJ,IAAAA,cAAA,QAAMjJ,GAAG,qBAAqB,KAAmC,QAAvB4D,EAAOi+C,YAAwB,MAAQj+C,EAAOi+C,eAI1FC,EAAuD,QAAvBl+C,EAAOi+C,YAAwBj+C,EAAOi+C,YAAcj+C,EAAO68C,QAEjG,IAAI3N,EA0CJ,OA1BIA,EAfCnnC,KAAKhD,MAAMyqB,aAAa2uB,UAclBp2C,KAAKhD,MAAMyqB,aAAa0f,eAE3B7pC,IAAAA,cAAA,WACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,cAEnBzJ,IAAAA,cAACq4C,EAAAA,EAAI,MACJ31C,KAAKhD,MAAMyqB,aAAa0f,gBAK7B7pC,IAAAA,cAAA,WACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,cAEnBzJ,IAAAA,cAACq4C,EAAAA,EAAI,MACLr4C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,qCAjCvBzJ,IAAAA,cAAA,WACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,cAEnBzJ,IAAAA,cAACq4C,EAAAA,EAAI,MACLr4C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,kBAgC3BzJ,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,0BAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAK00C,OACbxqC,SAAUlK,KAAKhD,MAAMkN,SACrBE,KAAK,OACL,kBAAgB,mBAEhB9M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,mBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,cACHyR,OAAQ,CACJ6uC,SAAU18C,EAAO28C,UAAY,cAEjC7tC,eAAe,uBAI3BzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACu3C,EAAAA,EAAc,OAEnBv3C,IAAAA,cAAA,WACIA,IAAAA,cAAA,MAAIC,UAAU,sBACVD,IAAAA,cAAA,cACK,aAAa,IAAEkO,IAGxBlO,IAAAA,cAAA,KAAGC,UAAU,8BACRg3C,GAELj3C,IAAAA,cAAA,OAAKC,UAAU,mBACXD,IAAAA,cAAA,OAAK,cAAY,qBACbA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gBACH0S,eAAe,wBAEnBzJ,IAAAA,cAAA,QAAMjJ,GAAG,iBACJ,IAAW8hD,IAGpB74C,IAAAA,cAAA,OAAK,cAAY,6BACbA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kBACH0S,eAAe,6BAEnBzJ,IAAAA,cAAA,QAAMjJ,GAAG,mBACJ,IAAW4D,EAAOo+C,gBAG1BJ,EACD34C,IAAAA,cAAA,WACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,cAElB,IAAW9O,EAAOq+C,eAEtBnP,GAEJqN,IAGTl3C,IAAAA,cAAA,OAAKC,UAAU,uBACVk4C,EACDn4C,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kBACH0S,eAAe,sEACfjB,OAAQ,CACJqvC,aAAa,IAAIj6B,MAAOk6B,kBAIpC93C,IAAAA,cAAA,OAAKC,UAAU,sBACVq4C,EACA,MACAG,KAIbz4C,IAAAA,cAAA,OAAKC,UAAU,uCACXD,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,eACH0S,eAAe,oLACfjB,OAAQ,CACJivC,WAAa9nC,GACT3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,oBACTgkC,KAAK,0EAEJxmC,GAGTgoC,YAAchoC,GACV3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,oBACTgkC,KAAK,gEAEJxmC,GAGTioC,WAAajoC,GACT3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,oBACTgkC,KAAK,0EAEJxmC,QAOzB3P,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,aACH0S,eAAe,gBAEnBzJ,IAAAA,cAACq4C,EAAAA,EAAI,MACJ19C,EAAOo9C,UACR/3C,IAAAA,cAAA,WACAA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,eACH0S,eAAe,mBAEnBzJ,IAAAA,cAACq4C,EAAAA,EAAI,MACJ19C,EAAOq9C,qBAEZh4C,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,aACH0S,eAAe,gBAEnBzJ,IAAAA,cAACq4C,EAAAA,EAAI,MACJ19C,EAAOs9C,aAMhC,EACHz1C,EAlVoB01C,EAAe,aAnBhCtrC,SAAQ9G,IAAAA,KAAAC,WAYRokB,aAAYrkB,IAAAA,MAAA,CArBZgzC,UAAShzC,IAAAA,KAAAC,aAAAA,aCGb,SAAe+B,EAAAA,EAAAA,UARf,SAAyBxP,GACrB,MAAO,CACHqC,QAAQ8kB,EAAAA,EAAAA,IAAUnnB,GAClB40B,SAASC,EAAAA,EAAAA,IAAW70B,GACpB6xB,cAAcC,EAAAA,EAAAA,GAAgB9xB,GAEtC,GAEA,CAAwC4/C,E,0uCCqCjC,MAAMe,UAA6Bj5C,IAAAA,cAItCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GA6CV8C,EAAA,mBACoB,KAChBE,KAAKhD,MAAMqD,QAAQ40B,mBAAmB,IACtCj1B,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAGhCrJ,EAAA,mBACoB,KAChBE,KAAKhD,MAAMkN,UAAU,IAGzBpK,EAAA,uBACyB5L,IACrB,IAAIsiD,EAAW,KACXtiD,GAAOA,EAAIwI,UACX85C,EAAWtiD,EAAIwI,SAGnBsD,KAAKgH,SAAS,CACVyvC,QAAQ,EACRD,YACF,IAGN12C,EAAA,qBACsBjM,UAClB,MAAM6iD,EAAW12C,KAAKpK,MAAMkQ,OAAOnF,KAAKg2C,GAAMA,EAAEtiD,KAChD,GAAwB,IAApBqiD,EAAShwC,OAAb,CAGA,GAAI1G,KAAKhD,MAAM45C,WAKX,OAJI52C,KAAKhD,MAAM65C,eACX72C,KAAKhD,MAAM65C,cAAcH,QAE7B12C,KAAKiI,aAITjI,KAAKgH,SAAS,CAACyvC,QAAQ,UAEjBpuB,QAAQyuB,IAAIJ,EAAS/1C,KAAI9M,UAC3B,MAAM,MAACG,SAAegM,KAAKhD,MAAMqD,QAAQ02C,kBAAkBC,EAASh3C,KAAKhD,MAAMqmB,cAAe4zB,EAAAA,GAAaC,KAAM,CAACC,UAAU,EAAMC,cAAc,IAChJp3C,KAAKq3C,eAAerjD,GACfA,GACDgM,KAAKiI,YACT,IAhBJ,CAiBG,IAGPnI,EAAA,iBACmBgB,IACf,MAAMgF,EAASpI,OAAOC,OAAmC,GAAIqC,KAAKpK,MAAMkQ,QAClEwxC,EAAUxxC,EAAOnF,KAAKg2C,GAAMA,EAAEtiD,KAChCyM,GAASA,EAAMzM,KAAqC,IAA/BijD,EAAQ9qB,QAAQ1rB,EAAMzM,KAC3CyR,EAAOwJ,KAAKxO,GAGhBd,KAAKgH,SAAS,CAAClB,UAAQ,IAC1BhG,EAAA,8BAEgCy3C,IAC7Bv3C,KAAKgH,SAAS,CACVwwC,cAAeD,GACjB,IAGNz3C,EAAA,yBAC0B,CAACvD,EAAck7C,KACjCl7C,EAAOk7C,IACPz3C,KAAK03C,uBAAsB,GAC3B13C,KAAKhD,MAAMqD,QAAQs3C,6BAA6B33C,KAAKhD,MAAMqmB,cAAerjB,KAAKhD,MAAM46C,WAAYr7C,EAAMs7C,IAAqBruC,MAAK,KAC7HxJ,KAAK03C,uBAAsB,EAAM,IAEzC,IAGJ53C,EAAA,qBACuBgG,GAA+B9F,KAAKgH,SAAS,CAAClB,aAErEhG,EAAA,eACiBo1B,GAAuBl1B,KAAKhD,MAAMqD,QAAQ40B,mBAAmBC,KAE9Ep1B,EAAA,qBACsB,CAAC2D,EAAoBq0C,EAAqBC,EAAoCC,KAChG,MAAMC,EAAcH,EAAa,4BAA8B,GAE/D,OACIx6C,IAAAA,cAAA,OACItC,IAAKyI,EAAOpP,GACZ6jD,IAAKJ,EAAa93C,KAAKm4C,gBAAkB10C,EAAOpP,GAChDkJ,UAAW,6BAA+B06C,EAC1CrrC,QAASA,IAAMmrC,EAAMt0C,GACrBu0C,YAAaA,IAAMA,EAAYv0C,IAE/BnG,IAAAA,cAAA,OACIC,UAAU,oBACVsO,IAAKusC,EACL1sC,IAAI,gBACJC,MAAM,KACNC,OAAO,OAEXtO,IAAAA,cAAA,OACIC,UAAU,uBAEVD,IAAAA,cAAA,OAAKC,UAAU,oBACVkG,EAAOtG,aAAaG,IAAAA,cAACq4C,EAAAA,EAAI,MAAG,IAAIr4C,IAAAA,cAACq4C,EAAAA,EAAI,MAAEr4C,IAAAA,cAAA,QAAMC,UAAU,wBACpDD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,aACH0S,eAAe,4DACfjB,OAAQ,CACJuyC,IAAK50C,EAAOga,mBAMhCngB,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,KAAGC,UAAU,qBAGnB,IAIduC,EAAA,oBACsB9C,GAA+CA,EAAM/I,KAAKkJ,eAzK5E6C,KAAKs4C,gBAAkB,EAEvBt4C,KAAKpK,MAAQ,CACTkQ,OAAQ,GACRqD,MAAM,EACN+W,QAAQ,EACRu2B,QAAQ,EACRD,SAAU,KACVgB,eAAe,GAGnBx3C,KAAKm4C,gBAAkB76C,IAAAA,WAC3B,CAEOi7C,iBAAAA,GACHlwB,QAAQyuB,IAAI,CACR92C,KAAKhD,MAAMqD,QAAQs3C,6BAA6B33C,KAAKhD,MAAMqmB,cAAe,GAAI,EAAGw0B,IACjF73C,KAAKhD,MAAMqD,QAAQm4C,6BAA6Bx4C,KAAKhD,MAAMqmB,eAAe,GAAO,KAClF7Z,MAAK,KACJxJ,KAAK03C,uBAAsB,EAAM,GAEzC,CAEOe,kBAAAA,CAAmBC,GACtB,GAAI14C,KAAKhD,MAAM46C,aAAec,EAAUd,WAAY,CAChD/E,aAAa7yC,KAAKs4C,iBAElB,MAAMV,EAAa53C,KAAKhD,MAAM46C,WAC9B,GAAmB,KAAfA,EACA,OAGJ53C,KAAKs4C,gBAAkBtpC,OAAOuZ,YAC1B10B,UACImM,KAAK03C,uBAAsB,SACrB13C,KAAKhD,MAAMqD,QAAQs3C,6BAA6B33C,KAAKhD,MAAMqmB,cAAeu0B,GAChF53C,KAAK03C,uBAAsB,EAAM,GAErC30B,EAAAA,GAAU41B,4BAElB,CACJ,CAkIO11C,MAAAA,GAAsB,IAAA21C,EACzB,MAAMC,EACFv7C,IAAAA,cAAA,OAAKjJ,GAAG,sBACJiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,4GACfjB,OAAQ,CACJuyC,IA7NM,GA6NuBr4C,KAAKpK,MAAMkQ,OAAOY,WAMzDoyC,GAAmBtsC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,kBAAmB0S,eAAgB,QACzEgyC,GAA0BvsC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,qBAAsB0S,eAAgB,cAEzF,IAAIyvC,EAAW,KACXx2C,KAAKpK,MAAM4gD,WACXA,EACIl5C,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,SAAOC,UAAU,qCACZyC,KAAKpK,MAAM4gD,YAM5B,IAAIwC,EAAeh5C,KAAKhD,MAAMkvC,OAC9B,GAAIlsC,KAAKhD,MAAMi8C,cAAe,CAC1B,MAAMC,EAAYC,IAAS,IAAAC,EAAA,QAA8B,QAAzBA,EAACp5C,KAAKhD,MAAMi8C,qBAAa,IAAAG,GAAxBA,EAA0B3wC,MAAM4wC,GAAMA,EAAEhlD,KAAO8kD,EAAG9kD,KAAG,EACtF2kD,EAAeA,EAAav4C,OAAOy4C,EACvC,CACA,GAAIl5C,KAAKhD,MAAMs8C,cAAe,CAC1B,MAAMJ,EAAYC,IAAS,IAAAI,EAAA,OAA6B,QAA7BA,EAAKv5C,KAAKhD,MAAMs8C,qBAAa,IAAAC,OAAA,EAAxBA,EAA0B9wC,MAAM4wC,GAAMA,EAAEhlD,KAAO8kD,EAAG9kD,IAAG,EACrF2kD,EAAe,IAAIA,KAAiBh5C,KAAKhD,MAAMs8C,cAAc74C,OAAOy4C,GACxE,CAEA,MAAMM,EAAsBR,EAAar4C,KAAKsqC,GAC1C72C,EAAAA,EAAA,GAAW62C,GAAK,IAAE/rC,MAAO+rC,EAAM9tC,aAAc2D,MAAOmqC,EAAM52C,OAG9D,OACIiJ,IAAAA,cAACyM,EAAAA,MAAK,CACF1V,GAAG,uBACH2V,gBAAiB,8CACjBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiI,WACbiC,SAAUlK,KAAKy5C,YAEfn8C,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CAACC,eAAe,MACxBvN,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,oCACfjB,OAAQ,CACJ4zC,SACIp8C,IAAAA,cAAA,cAAmC,QAAnCs7C,EAAS54C,KAAKhD,MAAM28C,uBAAe,IAAAf,EAAAA,EAAI,SAM3Dt7C,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACNyrC,EACDl5C,IAAAA,cAACs8C,EAAAA,EAAW,CACR5+C,IAAI,qBACJK,QAASm+C,EACTK,eAAgB75C,KAAK85C,aACrBjzC,KAAM7G,KAAKhD,MAAM6J,KACjBsxC,gBAAiBn4C,KAAKm4C,gBACtBryC,OAAQ9F,KAAKpK,MAAMkQ,OACnBi0C,cAAe/5C,KAAKg6C,YACpBC,QA/RA,GAgSAC,iBAAkBl6C,KAAKk6C,iBACvBC,YAAan6C,KAAKkgB,OAClBk6B,aAAcp6C,KAAKo6C,aACnBC,UAAWr6C,KAAKs6C,SAChBhwC,aAActK,KAAKsK,aACnBiwC,UApSM,GAqSN1B,iBAAkBA,EAClBC,iBAAkBA,EAClBC,wBAAyBA,EACzBtC,OAAQz2C,KAAKpK,MAAM6gD,OACnBntC,QAAStJ,KAAKpK,MAAM4hD,cACpBgD,iBAAiBhuC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,mCAAoC0S,eAAgB,6BAK5G,EAGJ,SAAe+F,EAAAA,EAAAA,YAAWypC,GC5Q1B,GAAenxC,EAAAA,EAAAA,UAjCf,SAAyBxP,EAAoB2hC,GAAiB,IAAAkjB,EAC1D,MAAM7C,EAAahiD,EAAM8kD,MAAMx6B,OAAOy6B,YAEhCx7B,EAAOoY,EAASpY,OAAQsE,EAAAA,EAAAA,IAAe7tB,GAE7C,IAAIs2C,GAAS0O,EAAAA,EAAAA,IAAgChlD,GAAOupB,aAAI,EAAJA,EAAM9qB,KAAM,IAChE,GAAIujD,EAAY,CACZ,MAAMiD,EAAQC,OAAOlD,EAAY,KACjC1L,EAASA,EAAOzrC,QAAQwqC,GAAU4P,EAAM1iB,KAAK8S,EAAM9tC,eAAiB09C,EAAM1iB,KAAK8S,EAAMxtC,OACzF,CAEA,MAAO,CACHk8C,gBAAiBx6B,aAAI,EAAJA,EAAMhiB,aACvBkmB,cAAuB,QAAVo3B,EAAEt7B,aAAI,EAAJA,EAAM9qB,UAAE,IAAAomD,EAAAA,GAAI1iC,EAAAA,EAAAA,IAAiBniB,GAC5CghD,WAAYrf,EAASqf,WACrBC,cAAetf,EAASsf,cACxBoC,cAAe1hB,EAAS0hB,cACxBrB,aACA1L,SAER,IAEA,SAA4Bv4C,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBqyC,6BAA4B,KAC5B1iB,mBAAkB,KAClB8hB,kBAAiB,KACjByB,6BAA4BA,EAAAA,IAC7B7kD,GAEX,GAEA,CAA4D4iD,E,2TC/B5D,MAAMwE,EAAoBz9C,IAAAA,YAAiB,CAAA7H,EAMjCyiD,KAAoC,IANF,OACxCz0C,EAAM,MACNs0C,EACAC,YAAAA,EAAW,aACXgD,EAAY,WACZlD,GACIriD,EACJ,OACI6H,IAAAA,cAAA,OACItC,IAAKyI,EAAOpP,GACZkJ,UAAWk3C,IAAW,4BAA6B,CAAC,4BAA6BqD,IACjFlrC,QAASA,IAAMmrC,EAAMt0C,GACrBy0C,IAAKA,EACLF,YAAaA,IAAMA,EAAYv0C,IAE/BnG,IAAAA,cAAC29C,EAAAA,EAAc,CACXpvC,IAAKvW,EAAAA,GAAQ4lD,qBAAqBz3C,EAAOpP,GAAIoP,EAAO03C,qBACpDx+C,OAAQq+C,EAAav3C,EAAOpP,IAC5B+J,KAAK,KACLP,SAAU4F,EAAO5F,WAErBP,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,qBACV69C,EAAAA,EAAAA,IAAyB33C,GACzBA,EAAOlF,QAAUjB,IAAAA,cAACkB,EAAAA,EAAM,OACxBC,EAAAA,EAAAA,GAAQgF,EAAO/E,QAAUpB,IAAAA,cAACqB,EAAAA,EAAQ,CAACpB,UAAU,kBAGtDD,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,KACIC,UAAU,qBAIpB,IAEXw9C,EAAAp1C,UAAA,CA3CCoyC,MAAK30C,IAAAA,KAAAC,WACL20C,YAAW50C,IAAAA,KAAAC,WAEXy0C,WAAU10C,IAAAA,KAAAC,YA0Cd,U,yZCGO,MAAMg4C,UAAkC/9C,IAAAA,cAS3CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,uBATS,GAACA,EAAA,iBAoBPgB,IAChB,MAAMgF,EAA6BpI,OAAOC,OAAO,GAAIqC,KAAKpK,MAAMkQ,SACjC,IAA3BA,EAAO0mB,QAAQ1rB,IACfgF,EAAOwJ,KAAKxO,GAGZd,KAAKhD,MAAMs+C,iBACXt7C,KAAKhD,MAAMs+C,gBAAgBx1C,GAG/B9F,KAAKgH,SAAS,CAAClB,UAAQ,IAC1BhG,EAAA,qBAgBuBgG,IAChB9F,KAAKhD,MAAMu+C,oBACXv7C,KAAKhD,MAAMu+C,mBAAmBz1C,GAGlC9F,KAAKgH,SAAS,CAAClB,UAAQ,IAC1BhG,EAAA,6BAE+By3C,IAC5Bv3C,KAAKgH,SAAS,CACVw0C,aAAcjE,GAChB,IACLz3C,EAAA,yBAE0B,CAACvD,EAAck7C,KAClCl7C,EAAOk7C,IACPz3C,KAAKy7C,sBAAqB,GACtBz7C,KAAKhD,MAAM0+C,QACX17C,KAAKhD,MAAMqD,QAAQs7C,sBAAsB37C,KAAKhD,MAAM0+C,QAASn/C,EAAO,EArH7D,IAqHgFiN,MAAK,KACxFxJ,KAAKy7C,sBAAqB,EAAM,IAGpCz7C,KAAKhD,MAAMqD,QAAQu7C,YAAYr/C,EAAO,EAzH/B,IAyHkDiN,MAAK,KAC1DxJ,KAAKy7C,sBAAqB,EAAM,IAG5C,IACH37C,EAAA,qBAEqB,KAEK,IADPE,KAAKpK,MAAMkQ,OAAOnF,KAAKg2C,GAAMA,EAAEtiD,KACnCqS,QAGZ1G,KAAKhD,MAAM6+C,iBAAiB77C,KAAKpK,MAAMkQ,OAAO,IACjDhG,EAAA,eAEgB83C,IACb,MAAM1iB,EAAO0iB,EAAW/qB,OACxBgmB,aAAa7yC,KAAKs4C,iBAClBt4C,KAAKgH,SAAS,CACVkuB,SAGAA,IACAl1B,KAAKy7C,sBAAqB,GAC1Bz7C,KAAKs4C,gBAAkBtpC,OAAOuZ,YAC1B10B,gBACUmM,KAAKhD,MAAMqD,QAAQy7C,eAAe5mB,EAAMl1B,KAAKhD,MAAM++C,eACzD/7C,KAAKy7C,sBAAqB,EAAM,GAEpC14B,EAAAA,GAAU41B,6BAElB,IACH74C,EAAA,wBAE0B2D,GAClBA,EAGEA,EAAO5F,SAFH,KAGdiC,EAAA,qBAEc,CAAC2D,EAA0Bq0C,EAAqBC,EAAyCC,IAEhG16C,IAAAA,cAACy9C,EAAiB,CACdt3C,OAAQA,EACRs0C,MAAOA,EACPD,WAAYA,EACZE,YAAaA,EACbgD,aAAch7C,KAAKhD,MAAMg+C,aACzB9C,IAAKJ,EAAa93C,KAAKm4C,qBAAkB7/C,EACzC0C,IAAKyI,EAAOpP,OAGvByL,EAAA,eAEe,KACZ,MAAMg5C,EAAmB94C,KAAKhD,MAAM87C,mBAAoBtsC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,0BAA2B0S,eAAgB,iBAChHgyC,EAA0B/4C,KAAKhD,MAAM+7C,0BAA2BvsC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,uBAAwB0S,eAAgB,gBAEjI,IAUIwzC,EAVA/5C,GAAQw7C,EAAAA,EAAAA,IAA+Bh8C,KAAKhD,MAAMusC,SAAUvpC,KAAKpK,MAAMs/B,MAAMz0B,QAAQC,GAC3D,IAAnBA,EAAK0gB,gBACqB9oB,IAA5B0H,KAAKhD,MAAMi/C,eAA+Bj8C,KAAKhD,MAAMi/C,aAAav7C,EAAKrM,MAC7EsM,KAAKD,GAASA,IAEjB,GAAIV,KAAKhD,MAAMk/C,aAAc,CACzB,MAAMA,EAAex+C,OAAOoI,OAAO9F,KAAKhD,MAAMk/C,cAC9C17C,EAAQ,IAAIA,KAAU07C,EAC1B,CAGA,IAAIrD,EAAmB,KAOvB,OALI74C,KAAKpK,MAAMkQ,OAAOY,QAhMA,MAiMlB6zC,EAjMkB,IAkMlB1B,GAAmBrsC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,8BAA+B0S,eAAgB,+DAIrFzJ,IAAAA,cAACs8C,EAAAA,EAAW,CACR5+C,IAAKgF,KAAKhD,MAAMm/C,gBAChB9gD,QAASmF,EACTq5C,eAAgB75C,KAAK85C,aACrBjzC,KAAM7G,KAAKhD,MAAM6J,KACjBsxC,gBAAiBn4C,KAAKm4C,gBACtBryC,OAAQ9F,KAAKpK,MAAMkQ,OACnBs2C,kBAAmBp8C,KAAKq8C,gBACxBC,mBAAoB,SACpBrC,QAhNO,GAiNPC,iBAAkBl6C,KAAKk6C,iBACvBC,YAAan6C,KAAKkgB,OAClBk6B,aAAcp6C,KAAKo6C,aACnBC,UAAWr6C,KAAKs6C,SAChBhwC,aAActK,KAAKsK,aACnBwuC,iBAAkBA,EAClBC,wBAAyBA,EACzBtC,OAAQz2C,KAAKhD,MAAMy5C,OACnBntC,QAAStJ,KAAKpK,MAAM4lD,aACpBhB,iBAAiBhuC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,0BAA2B0S,eAAgB,sBAC/Ew1C,gBAAgB,EAChBC,YAAax8C,KAAKhD,MAAMw/C,YACxBC,cAAez8C,KAAKhD,MAAMy/C,cAC1BC,gBAAiB18C,KAAKhD,MAAM0/C,gBAC5BC,gBAAiB38C,KAAKhD,MAAM2/C,gBAC5BC,eAAgB58C,KAAKhD,MAAM4/C,eAC3BrC,UAAWA,EACX1B,iBAAkBA,GACpB,IApKN74C,KAAKpK,MAAQ,CACTkQ,OAAQ,GACRovB,KAAM,GACNsmB,cAAc,GAGlBx7C,KAAKm4C,gBAAkB76C,IAAAA,WAC3B,CAeOi7C,iBAAAA,GACCv4C,KAAKhD,MAAM0+C,QACX17C,KAAKhD,MAAMqD,QAAQs7C,sBAAsB37C,KAAKhD,MAAM0+C,SAASlyC,MAAK,KAC9DxJ,KAAKy7C,sBAAqB,EAAM,IAGpCz7C,KAAKhD,MAAMqD,QAAQu7C,cAAcpyC,MAAK,KAClCxJ,KAAKy7C,sBAAqB,EAAM,IAIxCz7C,KAAKhD,MAAMqD,QAAQw8C,4BAA4B78C,KAAKhD,MAAMusC,SAC9D,EAqIHzpC,EAnLYu7C,EAAyB,aA7ClCc,gBAAe/4C,IAAAA,OAAAC,WAEfm5C,YAAWp5C,IAAAA,KAKXs4C,QAAOt4C,IAAAA,OAGPy4C,iBAAgBz4C,IAAAA,KAAAC,WAChBi4C,gBAAel4C,IAAAA,KACfm4C,mBAAkBn4C,IAAAA,KAGlB24C,cAAa34C,IAAAA,IAMbmmC,SAAQnmC,IAAAA,MAAAC,WAERo5C,cAAar5C,IAAAA,KAAAC,WACbozC,OAAMrzC,IAAAA,KAAAC,WAGNq5C,gBAAet5C,IAAAA,KACfu5C,gBAAev5C,IAAAA,OAGf/C,QAAO+C,IAAAA,MAAA,CACHw4C,YAAWx4C,IAAAA,KAAAC,WACXs4C,sBAAqBv4C,IAAAA,KAAAC,WACrBw5C,4BAA2Bz5C,IAAAA,KAAAC,WAC3By4C,eAAc14C,IAAAA,KAAAC,aAAAA,aAAAvD,EAUTu7C,EAAyB,eAIL,CACzBa,aAAc,CAAC,EACfD,aAAc,CAAC,IA+KvB,SAAenvC,EAAAA,EAAAA,YAAWuuC,GCtM1B,GAAej2C,EAAAA,EAAAA,UA5Bf,SAAyBxP,EAAoBoH,GACzC,IAAIusC,EAGAA,EADAvsC,EAAM0+C,SACKoB,EAAAA,EAAAA,IAA6BlnD,EAAOoH,EAAM0+C,UAE1C3kB,EAAAA,EAAAA,IAASnhC,GAExB,MAAMolD,GAAe+B,EAAAA,EAAAA,IAAgBnnD,GAErC,MAAO,CACH8lD,QAAS1+C,EAAM0+C,QACfnS,WACAyR,eAER,IAEA,SAA4BrnD,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBs2C,YAAW,KACXD,sBAAqB,KACrBkB,4BAA2B,KAC3Bf,eAAcA,EAAAA,GACfnoD,GAEX,GAEA,CAA4D0nD,E,uMC1BtD2B,EAAgBvnD,IAA0D,IAAzD,QAAC4D,EAAO,QAAEgH,EAAO,QAAEuM,EAAO,GAAEqwC,GAAwBxnD,EAAjBynD,E,qWAASC,CAAA1nD,EAAA2nD,GAC/D,MAAMC,GAActmC,EAAAA,EAAAA,cAAata,IAC7BmQ,SAAAA,EAAUnQ,GAENpD,IACAoD,EAAEyK,iBACF7G,EAAQ7G,iBAAgB,MACpB6V,EAAAA,EAAAA,KAAaC,KAAK2tC,EAAG,IAE7B,GACD,CAAC58C,EAAShH,EAASuT,EAASqwC,IAE/B,OACI3/C,IAAAA,cAACggD,EAAAA,QAAO5/C,OAAAC,OAAA,GACAu/C,EAAS,CACbD,GAAIA,EACJrwC,QAASywC,IACX,EAIV,EAAe//C,IAAAA,KAAW0/C,GCrB1B,GAAe53C,EAAAA,EAAAA,UAdf,SAAyBxP,GACrB,MAAO,CACHyD,SAASkkD,EAAAA,EAAAA,IAAqB3nD,GAEtC,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB9L,gBAAeA,EAAAA,IAChB7F,GAEX,GAEA,CAA4DqpD,E,0FClB5D,MAAMQ,EAAkBxgD,GACpBM,IAAAA,cAAA,OACIqO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,MACjDm8C,QAAQ,cACRC,KAAK,OACLC,MAAM,6BACNC,WAAW,gCAEXtgD,IAAAA,cAAA,UACIugD,GAAG,OACHC,GAAG,KACHC,EAAE,IACFC,UAAU,sBACVN,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,UACIugD,GAAG,OACHC,GAAG,KACHC,EAAE,IACFC,UAAU,sBACVN,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,KACHC,EAAE,IACFC,UAAU,yBACVN,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2CACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,yBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,MACHC,GAAG,MACHC,EAAE,MACFC,UAAU,2BACVN,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,4CACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIqO,MAAM,KACNC,OAAO,IACPoyC,UAAU,0BACVN,KAAK,8BACLO,YAAY,QAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,MACNC,OAAO,KACP4yC,GAAG,IACHd,KAAK,2BACLS,OAAO,8BACPM,YAAY,MAEhBnhD,IAAAA,cAAA,QACI25B,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,KACP8xC,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,mCACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,mCACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,0BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,UACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,mBACFC,OAAO,8BACPE,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,iBACFC,OAAO,8BACPE,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,iBACFC,OAAO,8BACPE,cAAc,UAElB/gD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,SACHhB,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,oBACH,YAAU,YACVsqD,UAAU,iBACV1nB,EAAE,MACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,+PACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,2BACJthD,IAAAA,cAAA,QACI4gD,EAAE,yNACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yNACFR,KAAK,8BACLO,YAAY,QAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2GACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2GACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,8eACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8eACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,+fACFR,KAAK,yBAGbpgD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,SACHhB,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,oBACHsqD,UAAU,iBACV1nB,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,KACP,YAAU,aAEVtO,IAAAA,cAAA,QACI4gD,EAAE,iQACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,2BACJthD,IAAAA,cAAA,QACI4gD,EAAE,yNACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yNACFR,KAAK,8BACLO,YAAY,QAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2GACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2GACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,+eACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+eACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,+fACFR,KAAK,yBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,mNACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mNACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,oBACH,YAAU,YACVsqD,UAAU,iBACV1nB,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,0MACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,2BACJthD,IAAAA,cAAA,QACI4gD,EAAE,2JACFR,KAAK,wBAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6LACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACRX,EAAE,6LACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4GACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4GACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,4eACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4eACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,+iBACFR,KAAK,yBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,oBACH,YAAU,YACVsqD,UAAU,iBACV1nB,EAAE,MACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,2BACJthD,IAAAA,cAAA,QACI4gD,EAAE,iMACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACRX,EAAE,iMACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4GACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4GACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2eACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2eACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,ykBACFR,KAAK,yBAGbpgD,IAAAA,cAAA,QACI25B,EAAE,MACFsnB,EAAE,IACF5yC,MAAM,KACNC,OAAO,KACP4yC,GAAG,IACHd,KAAK,sBACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,QACFsnB,EAAE,MACF5yC,MAAM,KACNC,OAAO,KACP4yC,GAAG,MACHd,KAAK,2BACLS,OAAO,gCAEX7gD,IAAAA,cAAA,QACI4gD,EAAE,kBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,cACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,cACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,cACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,sBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,sBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,u7BACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,q7BACFR,KAAK,8BACLO,YAAY,UAGtBT,EAAA73C,UAAA,CAtfEgG,MAAKvI,IAAAA,OACLwI,OAAMxI,IAAAA,QAufV,S,2WCpfe,SAAS47C,EAAKhiD,GACzB,OACIM,IAAAA,cAAA,QACIkO,MAAOxO,EAAMwO,MACbjO,UAAWP,EAAMO,WAEjBD,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRwB,QAAQ,MACR70C,KAAK,OAEL9M,IAAAA,cAAA,QAAM4gD,EAAE,mLAIxB,CAACc,EAAAr5C,UAAA,CArBG6F,MAAKpI,IAAAA,OACL7F,UAAS6F,IAAAA,Q,eCKb,MAAM87C,EAAYC,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,aAAVq7C,CAAU,oLAgBtBE,EAAOF,IAAOH,GAAKI,WAAA,CAAAt7C,YAAA,QAAZq7C,CAAY,yGAiBnBG,EAAiB7pD,IAAuD,IAAtD,YAACqO,EAAW,UAAEgY,EAAS,iBAAEyjC,GAAwB9pD,EACrE,OACI6H,IAAAA,cAAC4hD,EAAS,CAAC3hD,UAAU,kBACjBD,IAAAA,cAAC+hD,EAAI,CAAC9hD,UAAU,kBAChBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,gCACfjB,OAAQ,CACJpF,KACIpD,IAAAA,cAAA,QAAMC,UAAU,mBACXuG,GAGT4hB,KACIpoB,IAAAA,cAACkiD,EAAAA,GAAS,CACNC,aAAa,EACb3+C,MAAOgb,EACP4jC,SAAS,EACTC,aAAcJ,EACdK,QAAS,CACLC,KAAM,UACNC,OAAQ,gBAMpB,EAElBR,EAAA35C,UAAA,CAlCE7B,YAAWV,IAAAA,OAAAC,WACXyY,UAAS1Y,IAAAA,OAAAC,YAmCb,U,qCC9DO,SAAS08C,EAA2BtqD,GAAmD,IAAlD,kBAACuqD,EAAiB,qBAAEC,GAA4BxqD,EACxF,OAAgC,IAA5BuqD,EAAkB1tC,MACX,KAIPhV,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6DACH0S,eAAe,gHACfjB,OAAQ,CACJwM,MAAO0tC,EAAkB1tC,MACzB4tC,EAAIC,GACA7iD,IAAAA,cAAC8iD,EAAAA,KAAI,CAACnD,GAAIgD,GACLE,MAO7B,CAACJ,EAAAp6C,UAAA,CAxBGs6C,qBAAoB78C,IAAAA,OAAAC,Y,yBCmBT,SAASg9C,EAAsB5qD,GAAgE,IAA/D,SAACga,EAAQ,UAAEC,EAAS,OAAEuX,EAAM,wBAAEq5B,GAA+B7qD,EAMxG,MAAM8qD,EAAW9wC,IAAa+wC,EAAAA,GAAUC,YAClCpsD,EAAKksD,EAAWt5B,EAASvX,EACzBswC,GAAoB3L,EAAAA,EAAAA,cAAaz+C,IAAuB8qD,EAAAA,EAAAA,IAA0C9qD,EAAOvB,KAEzGslD,GAAkBtF,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAA+qD,EAAA,OAA0B,QAA1BA,GAAKl9B,EAAAA,EAAAA,IAAe7tB,UAAM,IAAA+qD,OAAA,EAArBA,EAAuBljD,IAAI,IACjFwiD,EAAuB,IAAHhiD,OAAO07C,EAAe,+BAAA17C,OAA8B5J,GAE9E,GAAK2rD,UAAAA,EAAmB1tC,MACpB,OAAO,KAGX,GAAIguC,EACA,OACIhjD,IAAAA,cAACyiD,EAA2B,CACxBC,kBAAmBA,EACnBC,qBAAsBA,IAKlC,IAAIW,EA2CJ,OAxCgC,IAA5BZ,EAAkB1tC,OAAe0tC,EAAkBz0B,gBACnDq1B,EACItjD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAe,oCACfjB,OAAQ,CACJ+6C,SACIvjD,IAAAA,cAACkiD,EAAAA,GAAS,CACN1+C,MAAOk/C,EAAkBz0B,cAAcu1B,aACvCC,OAAQC,EAAAA,GACRC,mBAAmB,EACnBrB,QAASsB,EAAAA,SAS7BlB,EAAkB1tC,MAAQ,IAC1BsuC,EAAoBL,EAChBjjD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sDACH0S,eAAe,wCACfjB,OAAQ,CACJwM,MAAO0tC,EAAkB1tC,SAIjChV,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uDACH0S,eAAe,yCACfjB,OAAQ,CACJwM,MAAO0tC,EAAkB1tC,UAOrChV,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAAA,KACI,cAAY,oBACZC,UAAU,sDAEbqjD,EACDtjD,IAAAA,cAAC8iD,EAAAA,KAAI,CAACnD,GAAIgD,GACN3iD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gEACH0S,eAAe,cAKnC,CAACs5C,EAAA16C,UAAA,CA1FG8J,SAAQrM,IAAAA,OAAAC,WACRqM,UAAStM,IAAAA,OAAAC,WACT4jB,OAAM7jB,IAAAA,OAAAC,WACNi9C,wBAAuBl9C,IAAAA,M,0BCJ3B,MAAM+9C,EAAmB,CACrBC,sBAAsB,EACtBC,kBAAmB,MACnBC,eAAgB,IA6FpB,EAxFA,SAAiC5xC,GAC7B,MAAM6xC,GAAiBtqC,EAAAA,EAAAA,SAAQuqC,EAAAA,GAAoB,IAE7CC,GAAapN,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAA8rD,EAAA,OAAuC,QAAlCA,GAAAC,EAAAA,EAAAA,IAAiB/rD,EAAO8Z,UAAU,IAAAgyC,OAAA,EAAlCA,EAAoCE,cAAe,EAAE,IACtGC,GAAsBxN,EAAAA,EAAAA,cAAaz+C,GAAwB6rD,EAAaF,EAAe3rD,EAAO6rD,GAAc,KAE5GK,GAAOzN,EAAAA,EAAAA,cACRz+C,IAAkB,IAAAmsD,EAAA,OAAKl4C,QAA0C,QAAnCk4C,GAACJ,EAAAA,EAAAA,IAAiB/rD,EAAO8Z,UAAU,IAAAqyC,OAAA,EAAlCA,EAAoCH,YAAY,IAS9EI,GALgB3N,EAAAA,EAAAA,cAAaz+C,KAC9B6rD,IAAaQ,EAAAA,EAAAA,IAAmBrsD,EAAO6rD,KAAgBzO,EAAAA,GAAakP,OAIjCJ,GAEjChmC,EAAWqmC,IAAgBtrC,EAAAA,EAAAA,UAAS,IACpCurC,EAAQC,IAAaxrC,EAAAA,EAAAA,WAAS,GAE/ByrC,GAAoCjO,EAAAA,EAAAA,cAAaz+C,IAAuB4hC,EAAAA,EAAAA,IAAQ5hC,EAAO6rD,KACvFlC,GAAmBtoC,EAAAA,EAAAA,UAAQ,IACxBqrC,GAIEC,EAAAA,EAAAA,IAA0BD,GAHtBnB,GAIZ,CAACmB,IAGEE,GAAsBnO,EAAAA,EAAAA,cAAaz+C,IAAuB6sD,EAAAA,EAAAA,IAAmB7sD,MAGnF8sD,EAAAA,EAAAA,YAAU,KACN,GAAIZ,SAAQQ,GAAAA,EAAU/jD,OAIlB,MAAO,OAGX,SAASokD,IACL,MAAMC,EACFrD,EAAiB6B,qBAAuB7B,EAAiB8B,kBAAoB9B,EAAiB+B,gBAAkB,MAE9GuB,EAAmBC,EAAAA,SAASC,QAAQC,QAAQJ,GAElDT,EAAaU,EAAiBI,YAE9B,MAAMC,EAAcL,EAAiBhD,KAC/BsD,EACFD,GAAengC,EAAAA,GAAUqgC,wCACzBF,EAAcngC,EAAAA,GAAUsgC,6CAE5BhB,EAAUc,EACd,CAEAR,IAEA,MAAMW,EAAWC,YAAYZ,EA9DtB,KAgEP,MAAO,IAAMa,cAAcF,EAAS,GACrC,CAAChB,EAAU/C,EAAiB6B,qBAAsB7B,EAAiB8B,kBAAmB9B,EAAiB+B,eAAgBQ,IAE1H,MAAM2B,GAA8BpP,EAAAA,EAAAA,aAAYqP,EAAAA,IAE1CC,EAAqB7B,GAAQM,GAAwB,IAAdtmC,EAEvCsH,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5B+rC,EAAW9B,GAAQL,IAAer+B,EAClCygC,EAAQh6C,QAAQi4C,IAAQQ,aAAQ,EAARA,EAAU/jD,SAExC,MAAO,CACHolD,qBACA7B,OACAgC,sBAAuBhoC,EACvByjC,mBACAiD,sBACAuB,uBAAwBN,EACxBzB,iBACAP,aACAI,sBACA+B,WACAC,QAER,EClGe,SAASG,EAAgBvuD,GAA4D,IAA3D,UAACia,EAAS,oBAAEmyC,EAAmB,SAAEpyC,EAAQ,OAAEwX,GAAcxxB,EAC9F,MAAM,mBACFkuD,EAAkB,uBAClBI,EAAsB,sBACtBD,EAAqB,iBACrBvE,GACA0E,EAAwBv0C,GAE5B,OACIpS,IAAAA,cAAA,OAAKC,UAAU,oBAEPomD,GACArmD,IAAAA,cAACgiD,EAAc,CACXx7C,YAAa+9C,EACb/lC,UAAWgoC,EACXvE,iBAAkBA,IAMtBwE,GACAzmD,IAAAA,cAAC+iD,EAAsB,CACnB5wC,SAAUA,EACVC,UAAWA,EACXuX,OAAQA,EACRq5B,wBAAyBqD,IAK7C,CAACK,EAAAr+C,UAAA,CArCG+J,UAAStM,IAAAA,OAAAC,WACTw+C,oBAAmBz+C,IAAAA,OAAAC,WACnBoM,SAAQrM,IAAAA,OAAAC,WACR4jB,OAAM7jB,IAAAA,OAAAC,Y,0FCCK,SAAS6gD,GAAkBlnD,GACtC,MAAOmnD,EAAUC,IAAevtC,EAAAA,EAAAA,UAA4B,OACtDwtC,GAAWhQ,EAAAA,EAAAA,aAAYiQ,EAAAA,IAiB7B,OAfA5B,EAAAA,EAAAA,YAAU,KACN,MAAM6B,EAAQvnD,EAAMwnD,SAASz0C,QAC7B,GAAIw0C,GAASvnD,EAAMiS,KAAM,KAAAw1C,EACrB,MAEMC,GAF4C,QAApCD,EAAGF,EAAMI,wBAAwBC,WAAG,IAAAH,EAAAA,EAAI,IAChCJ,EAAWthC,EAAAA,GAAU8hC,iCAAmC9hC,EAAAA,GAAU+hC,2BACvC,SAAW,MAExDJ,IAAgBP,GAGhBC,EAAYM,EAEpB,IACD,CAACP,EAAUnnD,EAAMwnD,SAAUxnD,EAAMiS,KAAMo1C,IAGtC/mD,IAAAA,cAAC4O,EAAAA,EAAcxO,OAAAC,OAAA,GACPX,EAAK,CACTmnD,SAAUA,IAGtB,CAACD,GAAAv+C,UAAA,CA5BGsJ,KAAI7L,IAAAA,KAAAC,Y,+GCPR,MAAM67C,GAAYC,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,aAAVq7C,CAAU,8HAUtBE,GAAOF,IAAAA,EAAQC,WAAA,CAAAt7C,YAAA,QAARq7C,CAAQ,oDAUf4F,GAAsBtvD,IAA0B,IAAzB,YAACqO,GAAmBrO,EAC7C,OACI6H,IAAAA,cAAC4hD,GAAS,CAAC3hD,UAAU,uBACjBD,IAAAA,cAAC+hD,GAAI,CAAC9hD,UAAU,sBAChBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2CACH0S,eAAe,gDACfjB,OAAQ,CAAChC,cAAa8L,EAAIuwC,GAA4B7iD,IAAAA,cAAA,SAAI6iD,MAEtD,EAElB4E,GAAAp/C,UAAA,CAdE7B,YAAWV,IAAAA,OAAAC,YAgBf,Y,uCCvBe,SAAS2hD,GAAehoD,GACnC,MAAMrJ,GAAWsxD,EAAAA,EAAAA,eAEXC,GAAkB7Q,EAAAA,EAAAA,aAAY8Q,GAAAA,IAC9BC,GAAcC,EAAAA,GAAAA,MAAU,KAAO,QAOrC,OACI/nD,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,UACIsP,QAAS5P,EAAMsoD,OACf/nD,UAAU,QAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,UAGvBzJ,IAAAA,cAAA,UACIsP,QAjBZ,WAAwB,IAAA24C,EACN,QAAdA,EAAAvoD,EAAMwoD,gBAAQ,IAAAD,GAAdA,EAAA/2C,KAAAxR,GACArJ,GAAS8xD,EAAAA,GAAAA,MACb,EAeYloD,UAAU,UAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,YAGvBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wBACH0S,eAAe,sEACfjB,OAAQ,CACJ9K,IAAKkqD,EAAkBE,EAAc,GACrCM,OAASzuB,GAAc35B,IAAAA,cAAA,cAAS25B,MAKpD,CAAC+tB,GAAAr/C,UAAA,CA7CG2/C,OAAMliD,IAAAA,KAAAC,WACNmiD,SAAQpiD,IAAAA,MC2CZ,SAxCA,SAA4BpG,GAAc,IAAA2oD,EAAAC,EAAAC,EACtC,IAAIC,EAAAA,GAAAA,IAA2B9oD,EAAMhJ,OAAQ,KAAA+xD,EACzC,MAAMC,EAAqC,QAAzBD,EAAG/oD,EAAMipD,wBAAgB,IAAAF,OAAA,EAAtBA,EAAwBjkB,MAAM,KAAK,GAExD,OACIxkC,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,OAAKC,UAAU,iBACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,2DACfjB,OAAQ,CACJkgD,kBAGR1oD,IAAAA,cAAA,KACIm2C,KAAK,IACLrpC,KAAK,SACLwC,QAAS5P,EAAMsN,cAEfhN,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,uCAMvC,CAEA,OAA6C,KAA9B,QAAX4+C,EAAA3oD,EAAMhJ,aAAK,IAAA2xD,GAAS,QAATC,EAAXD,EAAajpD,eAAO,IAAAkpD,GAAQ,QAARC,EAApBD,EAAsB/4B,cAAM,IAAAg5B,OAAjB,EAAXA,EAA8Bn/C,QACvB,KAIPpJ,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,SAAOC,UAAU,iBAAiBP,EAAMhJ,MAAM0I,QAAQmwB,QAGlE,E,sCC1CA,MAAMq5B,GAAqBA,CAAC3c,EAAwC3oC,EAA6B8O,EAAmBkN,EAAsBupC,KACtI,MAAM9xD,EAAKqb,EAAYkN,EAEvB,GAAIupC,EAAO9xD,GAAK,CACZ,MAAMmM,EAAQ9C,OAAO+I,KAAK0/C,EAAO9xD,IAEjC,GAAImM,EAAMkG,OACN,OAAOlG,EAAMG,KAAKnM,IACPqM,EAAAA,GAAAA,IAAgB0oC,EAAS/0C,GAASoM,IAGrD,CAEA,MAAO,EAAE,E,gBC8CN,SAASwlD,GAAkB5xD,EAAgBkb,EAAmBoE,EAAgBqH,GACjF,MAAO,CACH3iB,KAAM6tD,EAAAA,GAAgBC,YACtBryD,KAAM,CACFI,GAAIqb,EAAYoE,EAChBtf,SACA2mB,OAGZ,C,gBC9De,SAASorC,GAAUvpD,GAC9B,MAAM,kBAACwpD,EAAiB,kBAAEJ,GAAqBppD,EA4D/C,OA3DAypD,EAAAA,GAAAA,IAAa,CACThtB,SAAS1iB,EAAAA,EAAAA,cAAa9J,IAClB,GAAIA,EAAIkI,QAAU6mB,EAAAA,GAAa0qB,OAAQ,CACnC,MAAMh3C,EAAYzC,EAAIqwB,UAAUxsB,WAC1BgD,EAAS7G,EAAIhZ,KAAK0yD,UAClBnyD,EAASyY,EAAIhZ,KAAK8nB,QAEpB/e,EAAM0S,YAAcA,GAAa1S,EAAMiqB,SAAWnT,GAClD0yC,EAAkBhyD,EAAQkb,EAAWoE,EAAQoH,KAAKC,MAE1D,MAAO,GAAIlO,EAAIkI,QAAU6mB,EAAAA,GAAaC,OAAQ,CAC1C,MAAMtrB,EAAO+E,KAAKC,MAAM1I,EAAIhZ,KAAK0c,MAE3BjB,EAAYiB,EAAKG,WACjBgD,EAASnD,EAAKI,QACdvc,EAASmc,EAAKoL,QAEhB/e,EAAM0S,YAAcA,GAAa1S,EAAMiqB,SAAWnT,GAClDsyC,EAAkB5xD,EAAQkb,EAAWoE,EAAQoH,KAAKC,MAE1D,IACD,CAACne,EAAM0S,UAAW1S,EAAMiqB,OAAQu/B,EAAmBJ,MAuCtD9oD,IAAAA,cAAA,QAAMC,UAAU,cApCEqpD,MAClB,IAAIpmD,EAAkB,GAClBqmD,EAAW,EAMf,GALI7pD,EAAM8pD,cACNtmD,EAAQ,IAAIxD,EAAM8pD,aAClBD,EAAWrmD,EAAMkG,QAGJ,IAAbmgD,EACA,MAAO,GAEX,GAAiB,IAAbA,EACA,OACIvpD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,sBACfjB,OAAQ,CACJpF,KAAMF,EAAM,MAK5B,MAAMumD,EAAOvmD,EAAMwmD,MACnB,OACI1pD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,mCACfjB,OAAQ,CACJtF,MAAQA,EAAMymD,KAAK,MACnBF,SAEN,EAKwBH,GAEtC,CAACL,GAAA5gD,UAAA,CAvEG+J,UAAStM,IAAAA,OAAAC,WACT4jB,OAAM7jB,IAAAA,OAAAC,WACNyjD,YAAW1jD,IAAAA,QAAAA,IAAAA,QAAAC,WACXmjD,kBAAiBpjD,IAAAA,KAAAC,WACjB+iD,kBAAiBhjD,IAAAA,KAAAC,YCarB,MAAM6jD,GAAqB,CACvBV,kBFVG,SAA2BhyD,EAAgBkb,EAAmBoE,EAAgBqH,GACjF,MAAO,CAACxnB,EAAUsf,KACd,MAAMrd,EAAQqd,KAGV+J,EAAAA,EAAAA,IAA8BpnB,KAC9BqnB,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAYC,+BAAgCD,EAAAA,GAAYE,gCAK3EzpB,EAAS,CACL6E,KAAM6tD,EAAAA,GAAgBK,OACtBzyD,KAAM,CACFI,GAAIqb,EAAYoE,EAChBtf,SACA2mB,SAKRxnB,EAQR,SAA2Ba,GACvB,OAAOX,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRmQ,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjCuxD,GAAsB3sB,EAAAA,GAAAA,IAA+B5kC,GAE3D,GAAIpB,IAAW4uB,EAAe,CAC1B,MAAMpR,QAAere,GAASyzD,EAAAA,GAAAA,IAAwB,CAAC5yD,KACvD,GAAIwd,EAAO/d,MAAQ+d,EAAO/d,KAAKyS,OAAS,EAEpC,MAAO,CAACzS,MAAM,EAEtB,CAOA,OALeguD,EAAAA,EAAAA,IAAmBrsD,EAAOpB,KAC1B0vC,EAAAA,GAAQ+O,QAAUkU,GAC7BxzD,GAAS0zD,EAAAA,GAAAA,IAAiB,CAAC7yD,KAGxB,CAACP,MAAM,EAAK,CAE3B,CA7BiBqzD,CAAkB9yD,IAE3B+zB,YAAW,KACP50B,EAASyyD,GAAkB5xD,EAAQkb,EAAWoE,EAAQqH,GAAK,GA9BvE,SAAoCvlB,GAChC,MAAMqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GAEzB,YAA2D0C,IAApDL,EAAO0lB,yCAAyD,EAAI4pC,SAAStvD,EAAO0lB,yCAA0C,GACzI,CA2BW6pC,CAA2B5xD,IAAO,CAE7C,EEhBIwwD,kBAAiBA,IAGrB,IAAehhD,EAAAA,EAAAA,UAjBf,WACI,MAAMqiD,GHYCC,EAAAA,GAAAA,IACH,qCACA3wB,GAAAA,GACA1xB,EAAAA,IACA,CAACzP,EAAoByF,IAAiDA,EAAQqU,YAC9E,CAAC9Z,EAAoByF,IAAiDA,EAAQ4rB,SAC7ErxB,GAAuBA,EAAMuyB,SAASg+B,QACvCD,IGjBJ,OAAO,SAAyBtwD,EAAoB2hC,GAGhD,MAAO,CACHuvB,YAHgBW,EAA+B7xD,EAAO,CAAC8Z,UAAW6nB,EAAS7nB,UAAWuX,OAAQsQ,EAAStQ,SAK/G,CACJ,GAO4CigC,GAA5C,CAAgEX,ICVjD,SAASl7C,GAAM5V,GAQpB,IARqB,UAC3BkyD,EAAS,WACTC,EAAU,YACVC,EAAW,UACXn4C,EAAS,OACTuX,EAAM,uBACN6gC,EAAsB,aACtBC,GACItyD,EACJ,OACI6H,IAAAA,cAAA,OACIjJ,GAAG,mBACH+V,KAAK,OACL7M,UAAU,8BAEToqD,GACGrqD,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,aAAc,CAACmT,gBACrCD,GAGRE,GACGvqD,IAAAA,cAAC0qD,GAAkB,CACfh0D,MAAO6zD,EACP5B,iBAAkB4B,EAAY5B,iBAC9B37C,aAAcw9C,KAGpBC,GACEzqD,IAAAA,cAACipD,GAAS,CACN72C,UAAWA,EACXuX,OAAQA,IAK5B,CAAC5b,GAAA1F,UAAA,CA5CGgiD,UAASvkD,IAAAA,KACTwkD,WAAUxkD,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,MAAA,UAIV0kD,uBAAsB1kD,IAAAA,KAAAC,WACtB0kD,aAAY3kD,IAAAA,KAAAC,Y,uFCThB,MAuCM4kD,GAAkE,CACpEC,KAAM,EACNC,OAAQ,EACRC,OAAQ,EACRC,IAAK,GCtCIC,GAAYnJ,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,aAAVq7C,CAAU,kHAQtBoJ,GAAsBpJ,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,uBAAVq7C,CAAU,gHAQvCqJ,GAAyBrJ,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,0BAAVq7C,CAAU,oJAWnCsJ,GAA0BtJ,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,2BAAVq7C,CAAU,knBA0FpCuJ,GAAiB1rD,IACnB,MAAM,cACF2rD,EAAa,oBACbC,EAAmB,kBACnBC,EAAiB,gBACjBC,EAAe,SACfr5C,EAAQ,mBACRs5C,GACA/rD,GACGgsD,EAAoBC,IAAyBpyC,EAAAA,EAAAA,WAAS,GACvDqyC,GAAmBC,EAAAA,EAAAA,QAAuB,OAC1C,SAACC,EAAQ,eAAEC,EAAc,SAAEC,GDxEjCJ,KAMA,MAAMI,EAnE0BpR,KAChC,MAAOoR,EAAUC,IAAe1yC,EAAAA,EAAAA,UAAmB,QAC7C2yC,GAAezyC,EAAAA,EAAAA,aAAY0yC,MAAS,KAAM,IAAAC,OACXpxD,KAAlB,QAAXoxD,EAAAxR,EAAInoC,eAAO,IAAA25C,OAAA,EAAXA,EAAaC,eAGbzR,EAAInoC,QAAQ45C,YAAc,KAC1BJ,EAAY,QAEZrR,EAAInoC,QAAQ45C,aAAe,KAAOzR,EAAInoC,QAAQ45C,aAAe,KAC7DJ,EAAY,UAEZrR,EAAInoC,QAAQ45C,YAAc,KAC1BJ,EAAY,UAGZrR,EAAInoC,QAAQ45C,YAAc,KAC1BJ,EAAY,OAChB,GACD,IAAK,IAiBR,OAfAK,EAAAA,EAAAA,kBAAgB,KACZ,IAAK1R,EAAInoC,QACL,MAAO,OAGX,IAAI85C,EAAsC,IAAIC,eAAeN,GAI7D,OAFAK,EAAaE,QAAQ7R,EAAInoC,SAElB,KACH85C,EAAcG,aACdH,EAAe,IAAI,CACtB,GACF,CAACL,EAActR,IAEXoR,CAAQ,EA+BEW,CAA2Bf,IAEtC,SAACE,EAAQ,eAAEC,GAvBd,SAAoCC,GACvC,MAAMY,EAA8B,CAAC,OAAQ,SAAU,SAAU,UAAW,OAAQ,OAAQ,QAAS,KAAM,MAErGC,EAAiBlC,GAAmCqB,GAK1D,MAAO,CACHF,SAJac,EAAY96C,MAAM,EAAG+6C,GAKlCd,eAJmBa,EAAY96C,MAAM+6C,GAM7C,CAWuCC,CAA2Bd,GAE9D,MAAO,CACHF,WACAC,iBACAC,WACH,EC0D4Ce,CAAyBnB,IAEhE,cAACpiD,IAAiBgQ,EAAAA,EAAAA,WAClBwzC,EAAgCxjD,EAAc,CAACzS,GAAI,8CAA+C0S,eAAgB,oCAElH,EAACkwB,EAAC,EAAEsnB,EAAC,SAAEgM,EAAQ,OAAEC,EAAM,QAAEp9C,EAASq9C,MAAM,aAACC,EAAY,YAAEC,KAAgBC,EAAAA,GAAAA,IAA+B,CACxG37C,KAAM+5C,EACN6B,aAAc5B,EACd6B,UAAW,MACXC,WAAY,EAACC,EAAAA,GAAAA,IAAO,CAACC,SAAU,OAG7BC,GAAQC,EAAAA,GAAAA,IAAS/9C,IAChBg+C,kBAAmBC,EAAwBC,iBAAkBC,IAAyBC,EAAAA,GAAAA,IAAgB,CACzGN,IAGEO,GAAUC,EAAAA,GAAAA,IAAWt+C,IACpBg+C,kBAAmBO,EAA0BL,iBAAkBM,IAA2BJ,EAAAA,GAAAA,IAAgB,CAC7GC,KAGJ/I,EAAAA,EAAAA,YAAU,KACN8H,SAAAA,GAAU,GACX,CAAClB,EAAUkB,EAAQxB,IAEtB,MAAM6C,EAAiC,SAAbvC,EAOpBwC,GAAwB/0C,EAAAA,EAAAA,cAAag1C,GAAS,KAEhD,GAAIjD,EACA,OAIJ,MAAM,MAACkD,EAAK,IAAEC,GAAOrD,IAErB,GAAc,OAAVoD,GAA0B,OAARC,EAClB,OAGJ,MAAMnrD,EAAQ+nD,IAEdF,EAAc,CACVuD,aAAcH,EACdI,eAAgBH,EAChBI,aAAcH,EACdvvD,QAASoE,IAITkoD,GACAC,GAAsB,EAC1B,GACD,CAACL,EAAqBC,EAAmBF,EAAeK,EAAoBF,IAIzEuD,EAAqD,CACvDlI,SAAUoG,EACV3F,IAAKrG,QAAAA,EAAK,EACV+N,KAL8B,QAAbhD,GAAsBryB,QAAAA,EAAK,GA1EnB,GA0EmDA,QAAAA,EAAK,GAQ/Es1B,EAA8B,SAAbjD,EAEvB,OACIhsD,IAAAA,cAACkrD,GAAsB,CACnBtQ,IAAKgR,EACL,cAAY,0BAEXE,EAASzoD,KAAKorD,GAEPzuD,IAAAA,cAACA,IAAAA,SAAc,CAACtC,IAAK+wD,GACjBzuD,IAAAA,cAACkvD,GAAAA,EAAc,CACXT,KAAMA,EACNxuD,UAAU,UACVqP,QAASk/C,EAAsBC,GAC/BpnD,SAAUmkD,IAEJ,YAATiD,GAAsBQ,GAAkBjvD,IAAAA,cAACgrD,GAAS,SAK9D5kD,MAAMC,QAAQolD,IAAuBA,EAAmBriD,OAAS,GAC9DpJ,IAAAA,cAAAA,IAAAA,SAAA,KACKivD,GAAkBjvD,IAAAA,cAACgrD,GAAS,MAC5BS,GAIR8C,GACGvuD,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACmvD,GAAAA,EAAa/uD,OAAAC,OAAA,CACVtJ,GAAI,uBAAyBob,EAC7ByoC,IAAKwS,EACLntD,UAAWk3C,IAAW,CAAC5hC,OAAQm2C,IAC/B,aAAYsB,EACZ9xD,KAAK,UACD6yD,IACAM,KAEJruD,IAAAA,cAACovD,GAAAA,mBAAkB,CACfC,MAAO,eACPvuD,KAAM,OAMtBd,IAAAA,cAACsvD,GAAAA,EAAa,CACVp6B,QAAS,IACTiiB,WAAW,QACXxpC,GAAI+9C,GAEJ1rD,IAAAA,cAACmrD,GAAuB/qD,OAAAC,OAAA,CACpBu6C,IAAKyS,EACLjgD,MAAO2hD,GACHd,IACAK,KAEHvC,EAAe1oD,KAAKorD,GAEbzuD,IAAAA,cAACkvD,GAAAA,EAAc,CACXxxD,IAAK+wD,EACLA,KAAMA,EACNxuD,UAAU,UACVqP,QAASk/C,EAAsBC,GAC/BpnD,SAAUmkD,QAMT,EAE/BJ,GAAA/iD,UAAA,CA3LEkjD,kBAAiBzlD,IAAAA,KAAAC,WAQjBulD,oBAAmBxlD,IAAAA,KAAAC,WAKnBslD,cAAavlD,IAAAA,KAAAC,WAKbylD,gBAAe1lD,IAAAA,KAAAC,WAKfoM,SAAQrM,IAAAA,OAAAC,YAsKZ,UAAewpD,EAAAA,EAAAA,MAAKnE,ICzRL,SAASoE,KACpB,MAAM,cAAChmD,IAAiBgQ,EAAAA,EAAAA,WAExB,OACIxZ,IAAAA,cAAA,OAAKC,UAAU,mBACXD,IAAAA,cAAA,QAAMC,UAAU,yBACZD,IAAAA,cAACyvD,GAAAA,uBAAsB,CACnB3uD,KAAM,GACNuuD,MAAM,kBAGdrvD,IAAAA,cAAA,YACKwJ,EAAc,CACXzS,GAAI,+CACJ0S,eAAgB,4EAKpC,C,+DCFA,MAAMimD,GAAc,CAChBC,EAAAA,GAAAA,GACAA,EAAAA,GAAAA,IAmCJ,MAAMC,GAAwB,CAACC,QAAS,QAClCC,GAA+B,CAACvN,KAAM,UAAWC,OAAQ,WACzDuN,GAAqB,CAACC,MAAO,OAAQC,IAAK,WAWhD,SAASC,GAAoB/3D,GAA4E,IAA3E,eAACg4D,EAAc,oBAAEjL,EAAmB,WAAEkL,EAAU,gBAAEC,GAAuBl4D,EACnG,MAAM0lB,EAAM2nC,EAAAA,SAAS3nC,MAAM6nC,QAAQR,GAC7BoL,GAAyBvZ,EAAAA,EAAAA,cAAaz+C,IAAuBi4D,EAAAA,EAAAA,IAAcj4D,EAAOk4D,EAAAA,GAAeC,gBAAiBD,EAAAA,GAAeE,6BACjIC,GAAoDh3C,EAAAA,EAAAA,UAAQ,KAC9D,GAAI22C,EACA,IACI,OAAOl4C,KAAKC,MAAMi4C,EACtB,CAAE,MAAOnxD,GACL,MAAO,CAAC,CACZ,CAEJ,MAAO,CAAC,CAAC,GACV,CAACmxD,IACEM,GAA+Bn3C,EAAAA,EAAAA,cAAata,GAAMgxD,EAAehxD,EAAGwxD,EAA0BnyC,YAAa,CAAC2xC,EAAgBQ,EAA0BnyC,YAE5J,IA5CJ,SACIqyC,EACAF,EACAzL,EACAmL,EACAD,GAEA,OAAOO,GACwC,iBAAxCA,EAA0B9xC,WACc,iBAAxC8xC,EAA0BnyC,WACjCmyC,EAA0BnyC,UAAYqyC,GACtCF,EAA0BnyC,YAAc6xC,GACxCM,EAA0BnyC,YAAc4xC,GAvB5C,SAAqC5xC,GAAqC,IAAlBsyC,EAAQ7qD,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,MAC/D,IAAKuY,GAAauyC,MAAMvyC,GACpB,OAAO,EAEX,MAAMwyC,EAAWxL,EAAAA,SAASyL,WAAWzyC,GAAWknC,QAAQoL,GAClDjzC,EAAM2nC,EAAAA,SAAS3nC,MAAM6nC,QAAQoL,GAGnC,OAAOE,GAFenzC,EAAIqzC,MAAM,CAACC,KAAM,MAEHH,GAAYnzC,CACpD,CAeIuzC,CAA4BT,EAA0B9xC,UAAWqmC,EACrE,CA+BSmM,CAAiCxzC,EAAI8nC,WAAYgL,EAA2BzL,EAAqBmL,EAAiBD,GAEnH,OAAO,KAGX,MAAMkB,EA9BV,SAAuBzzC,EAAeW,EAA+B0mC,GACjE,IAAKrnC,IAAQW,IAAc0mC,EACvB,OAAO0K,GAEX,MAAM2B,EAAgB/L,EAAAA,SAASyL,WAAWzyC,GAAWknC,QAAQR,GAE7D,OADwBqM,EAAcC,aAAe3zC,EAAI2zC,YAAcD,EAAcE,WAAa5zC,EAAI4zC,SAC7E7B,GAAwBG,EACrD,CAuBuB2B,CAAc7zC,EAAK8yC,EAA0BnyC,UAAW0mC,GAErE1mC,EACFxe,IAAAA,cAACkiD,EAAAA,GAAS,CACNuB,OAAQiM,GACRlsD,MAAOmtD,EAA0BnyC,UACjCsyC,SAAU5L,EACV9C,QAASkP,EACThP,QAASwN,KAIX6B,EACF3xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+EACH0S,eAAe,8BAIvB,OACIzJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAC4Z,GAAAA,GAAc,CAAClc,IAAI,4BACpBsC,IAAAA,cAAC4Z,GAAAA,GAAS,CACNlc,IAAI,4BACJ4R,QAASshD,EACTgB,OAAQpzC,EACRve,UAAU,oBACV4xD,iBAAkBF,IAIlC,CAACzB,GAAA7nD,UAAA,CA5GG8nD,eAAcrqD,IAAAA,KAAAC,WACdm/C,oBAAmBp/C,IAAAA,OAAAC,WACnBsqD,gBAAevqD,IAAAA,OAAAC,WACfqqD,WAAUtqD,IAAAA,OAAAC,YA2Gd,UAAewpD,EAAAA,EAAAA,MAAKW,ICvFpB,SAAS4B,GAAe35D,GAAqC,IAApC,eAACg4D,EAAc,UAAE/9C,GAAiBja,EACvD,MAAM,oBACF+sD,EAAmB,iBACnBjD,EAAgB,oBAChBsC,EAAmB,KACnBC,EAAI,SACJ8B,EAAQ,MACRC,GACAI,EAAwBv0C,GAEtB0T,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,KAElC6qC,EAAAA,EAAAA,YAAU,MAIN2M,EAAAA,GAAAA,IACIC,GAAAA,2BACA,8BACA,CACI,CAACC,GAAAA,mBAAoBnsC,EACrB,CAACosC,GAAAA,wBAAyB,UAEjC,GACF,CAACpsC,IAEJ,MAAMjI,EAAM2nC,EAAAA,SAAS3nC,MAAM6nC,QAAQR,GAC7BmL,EAAkB7K,EAAAA,SAAS3nC,MAC7B6nC,QAAQR,GACRiN,KAAK,CAAChB,KAAM,IACZiB,IAAI,CAAC7P,KAAM,EAAGC,OAAQ,EAAG6P,OAAQ,EAAGC,YAAa,IACjD3M,WAEEyK,EAxCV,SAAwB7M,GACpB,MACMgP,GAsCiC,EAvCAhP,EAASsM,QACT,GAAK,EACtC2C,EAA6B,IAAjBD,EAAqB,EAAIA,EAC3C,OAAOhP,EAAS4O,KAAK,CAAChB,KAAMqB,GAChC,CAmCuBC,CAAe50C,GAAQu0C,IAAI,CAC1C7P,KAAM,EACNC,OAAQ,EACR6P,OAAQ,EACRC,YAAa,IACd3M,WAEG+M,EACF1yD,IAAAA,cAACkiD,EAAAA,GAAS,CACN1+C,MAAO6sD,EAAgBsC,UACvBvQ,SAAS,IAIXwQ,EAAqC,CAAC,EAE5C,GAAIpO,IAAS+B,IAAUD,EAAU,CAC7B,MAAMuM,EAAyB5Q,EAAiB6B,qBAAuB7B,EAAiB8B,kBAAoB9B,EAAiB+B,gBAAkB,MACzI8O,EAjEd,SAA4CC,EAA8BF,GAItE,OAHyBrN,EAAAA,SAASyL,WAAW8B,EAAsB,CAACC,KAAM,QAC3BtN,QAAQmN,GACXI,SAAS,SAEzD,CA4DgDC,CAAmC7C,EAAiBwC,GACtFM,EACFnzD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wEACH0S,eAAe,uBACfjB,OAAQ,CACJpF,KACIpD,IAAAA,cAAA,QAAMC,UAAU,mBACXskD,GAGTn8B,KAAM0qC,KAKlBF,EAAWf,iBAAmBsB,CAClC,CAEA,MAAMC,GAAuB35C,EAAAA,EAAAA,cAAata,GAAMgxD,EAAehxD,EAAGkxD,IAAkB,CAACF,EAAgBE,IAE/FgD,EACFrzD,IAAAA,cAAC4Z,GAAAA,GAASxZ,OAAAC,OAAA,CACN3C,IAAK,gCACL4R,QAAS8jD,EACTxB,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8DACH0S,eAAe,wBACfjB,OAAQ,CAAC,UAAWkqD,KAG5BzyD,UAAU,oBACVmH,WAAW,GACPwrD,IAINU,GAAyB75C,EAAAA,EAAAA,cAAata,GAAMgxD,EAAehxD,EAAGixD,IAAa,CAACD,EAAgBC,IAE5FmD,EACFvzD,IAAAA,cAAC4Z,GAAAA,GAASxZ,OAAAC,OAAA,CACN3C,IAAK,mCACL4R,QAASgkD,EACT1B,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iEACH0S,eAAe,2BACfjB,OAAQ,CAAC,UAAWkqD,KAG5BzyD,UAAU,qBACN2yD,IAINY,EACFxzD,IAAAA,cAAC4Z,GAAAA,GAASxZ,OAAAC,OAAA,CACN3C,IAAK,8BACL4R,QAASgkD,EACT1B,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4DACH0S,eAAe,sBACfjB,OAAQ,CACJ,UAAWkqD,KAIvBzyD,UAAU,oBACVmH,UAA2B,IAAhByW,EAAIgyC,SAAiC,IAAhBhyC,EAAIgyC,SAChC+C,IAIZ,IAAI70D,EAAgC,GAEpC,OAAQ8f,EAAIgyC,SAEZ,KAAK,EACD9xD,EAAU,CAACs1D,GACX,MAGJ,KAAK,EACDt1D,EAAU,CAACs1D,EAAgBE,GAC3B,MAGJ,KAAK,EACL,KAAK,EACDx1D,EAAU,CAACy1D,GACX,MAGJ,QACIz1D,EAAU,CAACs1D,EAAgBG,GAG/B,OACIxzD,IAAAA,cAAAA,IAAAA,SAAA,KACKjC,EACDiC,IAAAA,cAACkwD,GAAoB,CACjBC,eAAgBA,EAChBjL,oBAAqBA,EACrBmL,gBAAiBA,EACjBD,WAAYA,IAI5B,CAAC0B,GAAAzpD,UAAA,CAnLG8nD,eAAcrqD,IAAAA,KAAAC,WACdqM,UAAStM,IAAAA,OAAAC,YAoLb,UAAewpD,EAAAA,EAAAA,MAAKuC,I,eCjLb,SAAS2B,GAAet7D,GAAyC,IAAxC,SAACkP,EAAQ,SAAEqsD,EAAQ,UAAEthD,GAAiBja,EAClE,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClBnjB,GAAWsxD,EAAAA,EAAAA,eAEXwI,GAAiB12C,EAAAA,EAAAA,cAAY,CAACta,EAAoBw0D,KACpDx0D,EAAEyK,iBACFzK,EAAEy0D,kBAMFF,EAJuC,CACnClQ,aAAcmQ,GAGM,GACzB,CAACD,IAEEG,GAAyBp6C,EAAAA,EAAAA,cAAak6C,IAKxCD,EAJuC,CACnClQ,aAAcmQ,IAIX5oC,QAAQC,QAAQ,CAAC,KACzB,CAAC0oC,IAEEI,GAAyBr6C,EAAAA,EAAAA,cAAY,KACvCpjB,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBghD,iCAC1B9gD,WAAY+gD,GAAAA,EACZ9gD,YAAa,CACTd,YACA6hD,UAAWJ,KAEhB,GACJ,CAACzhD,EAAW/b,EAAUw9D,IAEzB,OACI7zD,IAAAA,cAAC4Z,GAAAA,GAAc,CACXs6C,kBAAmB,CACf1pD,KAAMhB,EAAc,CAChBzS,GAAI,6CACJ0S,eAAgB,qBAEpBpC,YAEJ8sD,WAAY,CACRp9D,GAAI,2BACJq9D,MAAOjd,IAAW,2BAA4B,CAAC9vC,aAC/CgtD,SAAUr0D,IAAAA,cAACs0D,KAAe,CAACxzD,KAAM,KACjCuG,WACA,aAAcmC,EAAc,CACxBzS,GAAI,6CACJ0S,eAAgB,sBAGxB8qD,KAAM,CACFx9D,GAAI,8BAERy9D,gBAAiB,CACbC,WAAY,QACZC,SAAU,UAEdC,aAAc,CACVD,SAAU,MACVD,WAAY,UAGhBz0D,IAAAA,cAAC4Z,GAAAA,GAAS,CACNvS,UAAU,EACVuqD,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4DACH0S,eAAe,wBAK3BzJ,IAAAA,cAAC8xD,GAAe,CACZ3B,eAAgBA,EAChB/9C,UAAWA,IAGfpS,IAAAA,cAAC4Z,GAAAA,GAAc,MAEf5Z,IAAAA,cAAC4Z,GAAAA,GAAS,CACNtK,QAASwkD,EACTp2D,IAAK,qBACLk0D,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wEACH0S,eAAe,2BAOvC,CAACgqD,GAAAprD,UAAA,CArGG+J,UAAStM,IAAAA,OAAAC,WACTsB,SAAQvB,IAAAA,KACR4tD,SAAQ5tD,IAAAA,KAAAC,Y,4BCGZ,MAAM6uD,GAAaz8D,IAA0D,IAAzD,SAACkP,EAAQ,aAAE2F,EAAY,UAAEoF,GAA2Bja,EACpE,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClBitC,GAAyB1P,EAAAA,EAAAA,aAAYqP,EAAAA,IAErCh0B,GAAc3Y,EAAAA,EAAAA,cAAY,CAACta,EAAoBotB,KACjDptB,SAAAA,EAAGy0D,kBACHz0D,SAAAA,EAAGyK,iBACHoD,EAAauf,EAAe,GAC7B,CAACvf,IAEE46C,GAAkB7Q,EAAAA,EAAAA,aAAY8Q,GAAAA,IAE9BgN,GAAoCl7C,EAAAA,EAAAA,UAA4B,KAClE,MAAMm7C,EAAyC,CAC3CC,QAAS,EACL7lD,EAAAA,EAAAA,eAAc,CACVnY,GAAI,0BACJ0S,eAAgB,WAGxBurD,IAAK,EACD9lD,EAAAA,EAAAA,eAAc,CACVnY,GAAI,0BACJ0S,eAAgB,YAKP,IAAAwrD,EAKrB,OALIrN,IACAkN,EAAmBC,QAAQG,QAAQC,GAAAA,EAAaC,MAC1B,QAAtBH,EAAAH,EAAmBE,WAAG,IAAAC,GAAtBA,EAAwBC,QAAQC,GAAAA,EAAa9lC,MAG1CylC,CAAkB,GAC1B,CAAClN,IAEJ,OACI5nD,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,kBAAmB,CAAC9vC,WAAU4mB,cAAew4B,KACpEzmD,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAO1E,EAAc,CAACzS,GAAI,qCAAsC0S,eAAgB,aAChF6rD,SAAUT,EACVxtD,SAAUA,GAEVrH,IAAAA,cAAA,UACIC,UAAWk3C,IAAW,oBAAqB,CAAC9vC,YAAW,CAACkuD,cAAe9O,IACvE,cAAY,oBACZ+O,SAAU,EACV,aAAYhsD,EAAc,CACtBzS,GAAI,qCACJ0S,eAAgB,aAEpBpC,SAAUA,EACViI,QAAS8iB,GAETpyB,IAAAA,cAACy1D,GAAAA,SAAQ,CACL30D,KAAM,GACNuuD,MAAM,mBAMd5I,GACAzmD,IAAAA,cAACyzD,GAAe,CACZpsD,SAAUA,EACVqsD,SAAU1mD,EACVoF,UAAWA,IAGjB,EAEZwiD,GAAAvsD,UAAA,CA5EE2E,aAAYlH,IAAAA,KAAAC,WACZsB,SAAQvB,IAAAA,KAAAC,WACRqM,UAAStM,IAAAA,OAAAC,YA4Eb,UAAewpD,EAAAA,EAAAA,MAAKqF,I,gBClFpB,MAAMc,GAAkBh2D,IACpB,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,YAClB,QAAClK,EAAO,OAAEiG,GAAU7V,EACpBi2D,EAAkBnsD,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,YACrFmsD,EAAgBpsD,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,aAElF,OACIzJ,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAC61D,GAAAA,EAAwB,CACrBP,SAAUQ,GAAAA,EAAmBC,mBAC7BC,kBAAkB,EAClBC,iBAAiB,KAIzBj2D,IAAAA,cAACmvD,GAAAA,EAAa,CACVj0D,KAAK,SACLnE,GAAG,yBACHuY,QAASA,EACT,aAAYqmD,EACZ11D,UAAWk3C,IAAW,CAAC5hC,YAEvBvV,IAAAA,cAACk2D,GAAAA,eAAc,CACXp1D,KAAM,GACNuuD,MAAO,eACP,aAAYuG,KAGV,EAEpBF,GAAArtD,UAAA,CAnCEiH,QAAOxJ,IAAAA,KAAAC,WACPwP,OAAMzP,IAAAA,KAAAC,YAoCV,UAAewpD,EAAAA,EAAAA,MAAKmG,ICxCdS,GAAoBtU,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,qBAAXq7C,CAAW,uMAQ/B1pD,IAAA,IAAC,UAACq1D,EAAS,oBAAE4I,GAAoBj+D,EAAA,MAAoB,QAAdq1D,GAAsB6I,EAAAA,EAAAA,KAAG,yBAErDD,EAAsB,GAAK,IACpCC,EAAAA,EAAAA,KAAG,0BAGN,IAEUz4D,IAAA,IAAC,KAACiO,GAAO,GAAKjO,EAAA,OAAMiO,EAAO,EAAI,CAAC,IAE7ByqD,IAAA,IAAC,KAACzqD,GAAO,GAAKyqD,EAAA,OAAMzqD,EAAO,UAAY,QAAQ,IAYjE,IAAe0jD,EAAAA,EAAAA,MAAK4G,ICvBdI,GAAuB72D,IACzB,MAAM,QAAC4P,EAAO,OAAEiG,EAAM,SAAElO,GAAY3H,GAC9B,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WAClBm8C,EAAkBnsD,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,eACxFmsD,EAAgBpsD,EAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,4BAEvFyE,EAAQqH,EACVvV,IAAAA,cAAC61D,GAAAA,EAAwB,CACrBP,SAAUQ,GAAAA,EAAmBU,kBAC7BR,kBAAkB,EAClBC,iBAAiB,IAGrBj2D,IAAAA,cAAC61D,GAAAA,EAAwB,CACrBP,SAAUQ,GAAAA,EAAmBW,kBAC7BT,kBAAkB,EAClBC,iBAAiB,IAInBS,EAAcnhD,EAASohD,GAAAA,cAAgBrC,GAAAA,gBAE7C,OACIt0D,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAOA,GAEPlO,IAAAA,cAACmvD,GAAAA,EAAa,CACVj0D,KAAK,SACLnE,GAAG,4BACHuY,QAASA,EACTjI,SAAUA,EACV,aAAYsuD,GAEZ31D,IAAAA,cAAC42D,GAAAA,qBAAoB,CACjB91D,KAAM,GACNuuD,MAAO,eACP,aAAYuG,IAEhB51D,IAAAA,cAAC02D,EAAW,CACR51D,KAAM,GACNuuD,MAAO,eACP,aAAYuG,KAGV,EAEpBW,GAAAluD,UAAA,CAnDEiH,QAAOxJ,IAAAA,KAAAC,WACPwP,OAAMzP,IAAAA,KAAAC,WACNsB,SAAQvB,IAAAA,KAAAC,YAmDZ,UAAewpD,EAAAA,EAAAA,MAAKgH,I,mhECrCpB,MAAMM,GAAWpxC,EAAAA,GAAUoxC,S,0/BCzBpB,SAASC,GAAkBx+D,GAC9B,OAAOA,EAAM8kD,MAAM2Z,IAAIC,cAC3B,C,2mCCuCA,MAAMC,IAAUC,EAAAA,EAAAA,gBAAe,CAC3BC,QAAS,CACLpgE,GAAI,sBACJ0S,eAAgB,iGAEpB2tD,WAAY,CACRrgE,GAAI,yBACJ0S,eAAgB,0DAEpB4tD,UAAW,CACPtgE,GAAI,wBACJ0S,eAAgB,wDAEpB6tD,eAAgB,CACZvgE,GAAI,6BACJ0S,eAAgB,8CAEpB8tD,cAAe,CACXxgE,GAAI,4BACJ0S,eAAgB,+CAEpB6M,WAAY,CACRvf,GAAI,2BACJ0S,eAAgB,kBAMlB+tD,GAAe,CACjBxI,KAAM,UACNyI,MAAO,EACPC,OAAQ,OACRpQ,IAAK,QA+FF,MAAMqQ,WAAmBC,EAAAA,cAS5Bt1D,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,+BAQQ,KACrB,IAAIq1D,EACAC,EAEJ,OAAQp1D,KAAKhD,MAAMq4D,UACnB,IAAK,OACDF,EAAoBn1D,KAAKhD,MAAMs4D,6BAA+B,6CAA+C,YAC7GF,EAAkBp1D,KAAKhD,MAAMs4D,6BAA+B,6BAA+B,uBAC3F,MAEJ,IAAK,UACDH,EAAoBn1D,KAAKhD,MAAMu4D,mBAAqB,mEAAqE,yBACzHH,EAAkBp1D,KAAKhD,MAAMu4D,mBAAqB,IAAMC,EAAAA,GAA6B,IAAMC,EAAAA,GAC3F,MAEJ,IAAK,SACDN,EAAoBn1D,KAAKhD,MAAMu4D,mBAAqB,oDAAsD,cAC1GH,EAAkBp1D,KAAKhD,MAAMu4D,mBAAqB,6BAA+B,sBACjF,MAEJ,IAAK,YACDJ,EAAoB,iBACpBC,EAAkB,IAAMM,EAAAA,GAK5B,MAAO,CACHP,oBACAC,kBACH,IACJt1D,GAAA,0BA8BmB,CAAC7L,EAA0Byb,EAAmBimD,KAC9D,GAAI1hE,EAAM,CACN+L,KAAKhD,MAAM44D,aAAa3hE,EAAK2hB,WAAY3hB,EAAK6hB,WAAYpG,EAAWimD,GAErE,MAAME,EAAWn4D,OAAOC,OAAO,CAAC,EAAGqC,KAAKpK,MAAMigE,UAC9C,IAAK,IAAIC,EAAI,EAAGA,EAAI7hE,EAAK6hB,WAAWpP,OAAQovD,IACxCphC,QAAQC,eAAekhC,EAAU5hE,EAAK6hB,WAAWggD,IAErD91D,KAAKgH,SAAS,CAAC6uD,YACnB,KACH/1D,GAAA,uBAEgB,CAAC5L,EAA2BiB,EAAkBua,EAAmBimD,KAC9E31D,KAAKhD,MAAM+4D,cAAc7hE,EAAKiB,EAAUua,EAAWimD,EAAc,IACpE71D,GAAA,0BAEoB4rB,IAEjB1rB,KAAKhD,MAAM+4D,cAAc,MACzB/1D,KAAKg2D,YAAYtqC,EAAM,IAC1B5rB,GAAA,uCAEiC4rB,IAE9B1rB,KAAKhD,MAAM+4D,cAAc,MAEzB,IAAIE,EAAcvyD,MAAMwyD,KAAKxqC,GAAOyqC,MAAK,CAACjW,EAAGtwC,IAAMswC,EAAEziD,KAAK24D,cAAcxmD,EAAEnS,KAAMuC,KAAKhD,MAAM6jB,OAAQ,CAACw1C,SAAS,MAE7G,MAAMC,EAAkBt2D,KAAKhD,MAAMu5D,2BACnC,IAAK,MAAMC,KAAKF,EAAiB,KAAAG,EAC7B,MAAMzkD,EAAe,QAATykD,EAAGD,EAAEE,YAAI,IAAAD,OAAA,EAANA,EAAAjoD,KAAAgoD,EAASP,EAAaj2D,KAAK22D,mBAGtC3kD,SAAAA,EAAQtV,SACRsD,KAAKhD,MAAM+4D,cAAc/jD,EAAOtV,SAGpCu5D,GAAcjkD,aAAM,EAANA,EAAQ0Z,QAAS,EACnC,CAEIuqC,GAAeA,EAAYvvD,QAC3B1G,KAAKg2D,YAAYC,EACrB,IACHn2D,GAAA,oBAEcm2D,IACX,MAAM,UAACvmD,EAAS,OAAEoE,GAAU9T,KAAKhD,MAE3B45D,EAAmB7zC,EAAAA,GAAU8zC,iBAAmB72D,KAAKhD,MAAM85D,UACjE,IAAIC,EAAa,EAGjB,MAAMC,EAAwB,GACxBC,EAAoB,GACpB7gD,EAAsB,GAE5B,IAAK,IAAIspB,EAAI,EAAGA,EAAIu2B,EAAYvvD,QAAUqwD,EAAaH,EAAkBl3B,IAAK,CAC1E,GAAIu2B,EAAYv2B,GAAGthC,KAAO4B,KAAKhD,MAAMk6D,YAAa,CAC9CF,EAAc1nD,KAAK2mD,EAAYv2B,IAC/B,QACJ,CAC4B,IAAxBu2B,EAAYv2B,GAAGthC,MACf64D,EAAU3nD,KAAK2mD,EAAYv2B,IAI/B,MAAMvqC,GAAWgiE,EAAAA,GAAAA,MAEXC,EAAUp3D,KAAKhD,MAAMqD,QAAQuT,WAAW,CAC1C5c,KAAMi/D,EAAYv2B,GAClBjiC,KAAMw4D,EAAYv2B,GAAGjiC,KACrBjF,KAAMy9D,EAAYv2B,GAAGlnC,KACrBsb,OAAQA,GAAU,GAClBpE,YACAva,WACA4e,WAAY/T,KAAKhD,MAAMq6D,iBACvBrjD,UAAWhU,KAAKs3D,kBAChBrjD,QAASjU,KAAKu3D,iBAGlBv3D,KAAKgH,SAAS,CAAC6uD,SAAQzhE,GAAAA,GAAA,GAAM4L,KAAKpK,MAAMigE,UAAQ,IAAE,CAAC1gE,GAAWiiE,MAC9DhhD,EAAU9G,KAAKna,GAEf4hE,GAAc,CAClB,CAEA/2D,KAAKhD,MAAMw6D,cAAcphD,EAAW1G,GAEpC,MAAM,cAAC5I,GAAiB9G,KAAKhD,MAAM6J,KAC7BmB,EAAS,GAKf,GAJIiuD,EAAYvvD,OAASkwD,GACrB5uD,EAAOsH,KAAKxI,EAAcytD,GAAQE,QAAS,CAACniD,MAAOyQ,EAAAA,GAAU8zC,oBAG7DG,EAActwD,OAAS,EAAG,CAC1B,MAAM+wD,EAAoBT,EAAcr2D,KAAK3J,GAASA,EAAKyG,OAAMwpD,KAAK,MAEtEj/C,EAAOsH,KAAKxI,EAAcytD,GAAQG,WAAY,CAACgD,IAAM13D,KAAKhD,MAAMk6D,YAAc,QAAUS,UAAWF,IACvG,MAAWT,EAActwD,OAAS,GAC9BsB,EAAOsH,KAAKxI,EAAcytD,GAAQI,UAAW,CAAC+C,IAAM13D,KAAKhD,MAAMk6D,YAAc,QAAUU,SAAUZ,EAAc,GAAGv5D,QAGtH,GAAIw5D,EAAUvwD,OAAS,EAAG,CACtB,MAAMmxD,EAAgBZ,EAAUt2D,KAAK3J,GAASA,EAAKyG,OAAMwpD,KAAK,MAE9Dj/C,EAAOsH,KAAKxI,EAAcytD,GAAQK,eAAgB,CAAC+C,UAAWE,IAClE,MAAWZ,EAAUvwD,OAAS,GAC1BsB,EAAOsH,KAAKxI,EAAcytD,GAAQM,cAAe,CAAC+C,SAAUX,EAAU,GAAGx5D,QAGzEuK,EAAOtB,OAAS,GAChB1G,KAAKhD,MAAM+4D,cAAc/tD,EAAOi/C,KAAK,MACzC,IACHnnD,GAAA,qBAEerD,IACRA,EAAEq7D,OAAOpsC,OAASjvB,EAAEq7D,OAAOpsC,MAAMhlB,OAAS,IAC1C1G,KAAK+3D,+BAA+Bt7D,EAAEq7D,OAAOpsC,QAE7CssC,EAAAA,GAAAA,IAAev7D,EAAEq7D,SAGrB93D,KAAKhD,MAAMi7D,oBAAoB,IAClCn4D,GAAA,mBAEarD,IACV,IAAKuD,KAAKhD,MAAMk7D,eAEZ,YADAl4D,KAAKhD,MAAM+4D,eAAc7/C,EAAAA,GAAAA,IAAgB,CAAC7hB,GAAI,uBAAwB0S,eAAgB,oCAI1F/G,KAAKhD,MAAM+4D,cAAc,MAEzB,MAAMhtD,EAAQtM,EAAE07D,aAAapvD,OAAS,GAChCqvD,EAAe37D,EAAE07D,aAAazsC,MAC9BA,EAAgB,GACtBhoB,MAAMwyD,KAAKkC,GAAcpyD,SAAQ,CAAChP,EAAMiV,KACpC,MAAMhP,EAAO8L,EAAMkD,GACfhP,GAAQA,EAAKo7D,mBAAiD,OAA5Bp7D,EAAKo7D,oBAAgCp7D,EAAKo7D,mBAAuCC,cAGvH5sC,EAAMpc,KAAKtY,EAAK,IAGpB,MAAMuhE,EAAQ97D,EAAE07D,aAAaI,MAC7B,GAAIA,EAAO,CACP,IAAIC,EAAAA,GAAAA,IAAU/7D,EAAE07D,cACZ,OAIJ,GAAII,EAAM9uB,WAAa8uB,EAAM9uB,SAAS,SAClC,MAER,CAEqB,IAAjB/d,EAAMhlB,QAKNglB,EAAMhlB,QACN1G,KAAK+3D,+BAA+BrsC,GAGxC1rB,KAAKhD,MAAMi7D,sBARPj4D,KAAKhD,MAAM+4D,eAAc7/C,EAAAA,GAAAA,IAAgB,CAAC7hB,GAAI,0BAA2B0S,eAAgB,wCAQ9D,IAClCjH,GAAA,2BAEoB,CAACq1D,EAA2BC,KAC7C,IAAIqD,EAAUj5D,SAASk5D,cAActD,GAErC,MAAMuD,EAAc,IAAIC,GAAAA,GAAc,KAAM,IAAAC,EACjC,QAAPA,EAAAJ,SAAO,IAAAI,GAAPA,EAASC,UAAUjiC,IAAI,SAAS,IAsD9BkiC,EAAOA,OAEb,IAAIC,EAAkB,CAAC,EAEnBA,EADAh5D,KAAKhD,MAAMk7D,eACO,CACde,MAxDOx8D,IAGNg8D,IACDA,EAAUj5D,SAASk5D,cAActD,IAGrC,MAAM1pC,EAAQjvB,EAAEy8D,OAAOf,aACyB,IAAAgB,IAA3CX,EAAAA,GAAAA,IAAU9sC,KAAU0tC,EAAAA,GAAAA,IAAe1tC,KAC7B,QAAPytC,EAAAV,SAAO,IAAAU,GAAPA,EAASL,UAAUO,OAAO,WAE9B58D,EAAEy8D,OAAOhyD,gBAAgB,EA8CrBoyD,MA3CO78D,IACX,MAAMivB,EAAQjvB,EAAEy8D,OAAOf,aAEyB,IAAAoB,IAA3Cf,EAAAA,GAAAA,IAAU9sC,KAAU0tC,EAAAA,GAAAA,IAAe1tC,KAC7B,QAAP6tC,EAAAd,SAAO,IAAAc,GAAPA,EAAST,UAAUjiC,IAAI,WAG3B8hC,EAAYa,SAEZ/8D,EAAEy8D,OAAOhyD,gBAAgB,EAmCrBuyD,KAhCMh9D,IACVk8D,EAAYe,UA9XA,MA+XPC,EAAAA,GAAAA,IAAqBl9D,EAAEy8D,SACxBz8D,EAAEy8D,OAAOhyD,gBACb,EA6BI0yD,KA3BqBn9D,IAAmB,IAAAo9D,EACrC,QAAPA,EAAApB,SAAO,IAAAoB,GAAPA,EAASf,UAAUjiC,IAAI,UACvB8hC,EAAYa,SAEZx5D,KAAK85D,WAAWr9D,EAAEy8D,SAEbS,EAAAA,GAAAA,IAAqBl9D,EAAEy8D,SACxBz8D,EAAEy8D,OAAOhyD,gBACb,GAsBkB,CACd+xD,MAAOF,EACPO,MAAOP,EACPU,KAAMV,EACNa,KAvBMn9D,IACVuD,KAAK85D,WAAWr9D,EAAEy8D,SAEbS,EAAAA,GAAAA,IAAqBl9D,EAAEy8D,SACxBz8D,EAAEy8D,OAAOhyD,gBACb,GAsBJlH,KAAK+5D,qBCxeE,SAAkBjsD,EAAezS,GAC5C,MAAM6L,EAAkBzK,IACpBA,EAAEyK,gBAAgB,EAGhB8yD,EAAW,CACbf,MAAO/xD,EACPoyD,MAAOpyD,EACPuyD,KAAMvyD,EACN0yD,KAAM1yD,GAGJ+yD,EAAWv8D,OAAOC,OAAOq8D,EAAU3+D,GACnC6+D,EAAO16D,SAASk5D,cAAc5qD,GAEpC,IAAKosD,EACD,MAAO,OAGX,IAAIC,GAAQ,EACRxK,GAAS,EAEb,MAAMyK,EAAajlD,IACf,GAAIglD,EAEA,YADAxK,GAAS,GAIbwK,GAAQ,EACR,MAAME,EAAa,IAAIC,YAAY,iBAAkB,CAACpB,OAAQ/jD,IAC9D+kD,EAAKK,cAAcF,EAAW,EAG5BG,EAAarlD,IAMf,GALIw6C,EACAA,GAAS,EACFwK,IACPA,GAAQ,IAEPA,IAAUxK,EAAQ,CACnB,MAAM8K,EAAa,IAAIH,YAAY,iBAAkB,CAACpB,OAAQ/jD,IAC9D+kD,EAAKK,cAAcE,EACvB,GAGEC,EAAYvlD,IACd,MAAMwlD,EAAY,IAAIL,YAAY,gBAAiB,CAACpB,OAAQ/jD,IAC5D+kD,EAAKK,cAAcI,EAAU,EAG3Bf,EAAQzkD,IAMV,GALIw6C,EACAA,GAAS,EACFwK,IACPA,GAAQ,IAEPA,IAAUxK,EAAQ,CACnB,MAAMiL,EAAY,IAAIN,YAAY,gBAAiB,CAACpB,OAAQ/jD,IAC5D+kD,EAAKK,cAAcK,EACvB,GAyBJ,OAtBAV,EAAKW,iBAAiB,YAAaT,GACnCF,EAAKW,iBAAiB,YAAaL,GACnCN,EAAKW,iBAAiB,WAAYH,GAClCR,EAAKW,iBAAiB,OAAQjB,GAE9BM,EAAKW,iBAAiB,iBAAkBZ,EAAShB,OACjDiB,EAAKW,iBAAiB,iBAAkBZ,EAASX,OACjDY,EAAKW,iBAAiB,gBAAiBZ,EAASR,MAChDS,EAAKW,iBAAiB,gBAAiBZ,EAASL,MAE3BkB,KACjBZ,EAAKa,oBAAoB,YAAaX,GACtCF,EAAKa,oBAAoB,YAAaP,GACtCN,EAAKa,oBAAoB,WAAYL,GACrCR,EAAKa,oBAAoB,OAAQnB,GAEjCM,EAAKa,oBAAoB,iBAAkBd,EAAShB,OACpDiB,EAAKa,oBAAoB,iBAAkBd,EAASX,OACpDY,EAAKa,oBAAoB,gBAAiBd,EAASR,MACnDS,EAAKa,oBAAoB,gBAAiBd,EAASL,KAAK,CAIhE,CDmZoCoB,CAAS7F,EAAmB6D,EAAgB,IAC3El5D,GAAA,4BAEqB,CAACm7D,EAAwCC,IAAoCD,GAAiBA,EAAcE,SAASD,KAE3Ip7D,GAAA,oBAGerD,IAEX,IAAKA,EAAE2+D,gBAAkB3+D,EAAE2+D,cAAcryD,QAASsyD,EAAAA,GAAAA,IAAa5+D,EAAE2+D,eAC7D,OAGJ,MAAME,EAAWt7D,KAAKhD,MAAMu+D,YAC5B,IAAKv7D,KAAKw7D,oBAAoBF,EAAU7+D,EAAEq7D,QACtC,OAGJ93D,KAAKhD,MAAM+4D,cAAc,MAEzB,MAAM0F,EAAqB/3D,MACvBwyD,KAAKz5D,EAAE2+D,cAAcryD,OACrBtI,QAAQxD,GAAuB,SAAdA,EAAKy+D,OAE1B,GAAID,EAAmB/0D,OAAS,EAAG,CAC/B,IAAK1G,KAAKhD,MAAMk7D,eAEZ,YADAl4D,KAAKhD,MAAM+4D,cAAc/1D,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,oCAIxG,MAAM40D,EAAyB37D,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,qBAElG60D,EAAWH,EACb96D,KAAKk7D,IAAsBC,EAAAA,GAAAA,IAAgCD,EAAmBF,KAC9El7D,QAAQzJ,GAAoD,OAATA,IAEnD4kE,EAASl1D,OAAS,IAGlBjK,EAAEyK,iBAEFlH,KAAK+3D,+BAA+B6D,GACpC57D,KAAKhD,MAAMi7D,qBAEnB,KACHn4D,GAAA,kBAEYrD,IACT,IAAIs/D,EAAAA,GAAAA,GAAiBt/D,KAAOA,EAAEu/D,WAAYC,EAAAA,GAAAA,GAAax/D,EAAGsmB,EAAAA,GAAUoxC,SAAS+H,GAAI,KAAAC,EAAAC,EAAAC,EAG7E,GAFA5/D,EAAEyK,kBAEGlH,KAAKhD,MAAMk7D,eAEZ,YADAl4D,KAAKhD,MAAM+4D,eAAc7/C,EAAAA,GAAAA,IAAgB,CAAC7hB,GAAI,uBAAwB0S,eAAgB,oCAG1F,MAAMu1D,EAAsC,SAAxBt8D,KAAKhD,MAAMq4D,UAAsD,kBAAT,QAAtB8G,EAAA38D,SAAS+8D,qBAAa,IAAAJ,OAAA,EAAtBA,EAAwB9nE,IACxEmoE,EAAyC,YAAxBx8D,KAAKhD,MAAMq4D,UAAyD,mBAAT,QAAtB+G,EAAA58D,SAAS+8D,qBAAa,IAAAH,OAAA,EAAtBA,EAAwB/nE,IAC9EooE,EAAwC,WAAxBz8D,KAAKhD,MAAMq4D,UAAwD,mBAAT,QAAtBgH,EAAA78D,SAAS+8D,qBAAa,IAAAF,OAAA,EAAtBA,EAAwBhoE,IAC9B,IAAAqoE,EAAAC,GAAhDL,GAAeE,GAAkBC,KACX,QAAtBC,EAAA18D,KAAK48D,UAAU7sD,eAAO,IAAA2sD,GAAtBA,EAAwB19C,QACF,QAAtB29C,EAAA38D,KAAK48D,UAAU7sD,eAAO,IAAA4sD,GAAtBA,EAAwBzR,QAEhC,KACHprD,GAAA,qBAEe3K,IACZ,MAAM0gE,EAAWn4D,OAAOC,OAAO,CAAC,EAAGqC,KAAKpK,MAAMigE,UACxCuB,EAAUvB,EAAS1gE,GAErBiiE,IACAA,EAAQyF,QAERnoC,QAAQC,eAAekhC,EAAU1gE,GACjC6K,KAAKgH,SAAS,CAAC6uD,aACnB,IACH/1D,GAAA,+BAEyBrD,IAClBA,GACAA,EAAEyK,iBAGN,MAAM,cAAC6uD,GAAiB/1D,KAAKhD,OACvB,cAAC8J,GAAiB9G,KAAKhD,MAAM6J,KAEnCkvD,EAAcjvD,EAAcytD,GAAQE,QAAS,CAACniD,MAAOyQ,EAAAA,GAAU8zC,mBAAmB,IACrF/2D,GAAA,gCAE0BrD,IACEsmB,EAAAA,GAAU8zC,iBAAmB72D,KAAKhD,MAAM85D,UAC1C,EACf92D,KAAKhD,MAAM4P,SACX5M,KAAKhD,MAAM4P,UAGf5M,KAAK88D,uBAAuBrgE,GAEhCuD,KAAKgH,SAAS,CAAC+1D,UAAU,GAAO,IACnCj9D,GAAA,2BAEqBrD,IAAsE,IAAAugE,EACxFvgE,EAAEyK,iBACFzK,EAAEy0D,kBACoB,QAAtB8L,EAAAh9D,KAAK48D,UAAU7sD,eAAO,IAAAitD,GAAtBA,EAAwB9R,OAAO,IAja/BlrD,KAAKpK,MAAQ,CACTigE,SAAU,CAAC,EACXkH,UAAU,GAEd/8D,KAAK48D,UAAYt/D,IAAAA,WACrB,CAmCAi7C,iBAAAA,GACI,MAAM,kBAAC4c,EAAiB,gBAAEC,GAAmBp1D,KAAKi9D,yBAClDj9D,KAAKk9D,mBAAmB/H,EAAmBC,GAE3C51D,SAASq7D,iBAAiB,QAAS76D,KAAKm9D,aACxC39D,SAASq7D,iBAAiB,UAAW76D,KAAKo9D,UAC9C,CAEA3kB,kBAAAA,CAAmBC,GAGf,GACIA,EAAU4c,+BAAiCt1D,KAAKhD,MAAMs4D,8BACtD5c,EAAU6c,qBAAuBv1D,KAAKhD,MAAMu4D,mBAC9C,KAAA8H,EAC2B,QAAzBA,EAAAr9D,KAAK+5D,4BAAoB,IAAAsD,GAAzBA,EAAA7uD,KAAAxO,MACA,MAAM,kBAACm1D,EAAiB,gBAAEC,GAAmBp1D,KAAKi9D,yBAClDj9D,KAAKk9D,mBAAmB/H,EAAmBC,EAC/C,CACJ,CAEAkI,oBAAAA,GAAuB,IAAAC,EACnB/9D,SAASu7D,oBAAoB,QAAS/6D,KAAKm9D,aAC3C39D,SAASu7D,oBAAoB,UAAW/6D,KAAKo9D,WAEpB,QAAzBG,EAAAv9D,KAAK+5D,4BAAoB,IAAAwD,GAAzBA,EAAA/uD,KAAAxO,KACJ,CAkWAiD,MAAAA,GACI,MAAM,cAAC6D,GAAiB9G,KAAKhD,MAAM6J,KACnC,IAAI22D,GAAW,GACXC,EAAAA,GAAAA,QAEAD,GAAW,GAGf,IAAIE,EAAS,IACTC,EAAAA,GAAAA,QAEAD,EAAS,WAGb,MAAM9G,EAAmB7zC,EAAAA,GAAU8zC,iBAAmB72D,KAAKhD,MAAM85D,UAEjE,IAAI8G,EACJ,MAAM3K,EAAkBnsD,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,eACxFmsD,EAAgBpsD,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,oBAEjF,GAAkD,IAA9C/G,KAAKhD,MAAM6gE,wBAAwBn3D,OACnCk3D,EACItgE,IAAAA,cAAA,WACIA,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAC61D,GAAAA,EAAwB,CACrBP,SAAUQ,GAAAA,EAAmB0K,YAC7BxK,kBAAkB,EAClBC,iBAAiB,KAIzBj2D,IAAAA,cAAA,UACI9E,KAAK,SACLnE,GAAG,mBACH,aAAY4+D,EACZ11D,UAAWk3C,IAAW,gDAAiD,CACnE9vC,SAAUiyD,GAAoB,IAElChqD,QAAS5M,KAAK+9D,mBACdC,WAAYh+D,KAAK+9D,oBAEjBzgE,IAAAA,cAAC2gE,GAAAA,cAAa,CACV7/D,KAAM,GACNuuD,MAAO,eACP,aAAYuG,MAIxB51D,IAAAA,cAAA,SACIjJ,GAAG,kBACHy+D,UAAW,EACX,aAAYhsD,EAAcytD,GAAQ3gD,YAClCskC,IAAKl4C,KAAK48D,UACVpkE,KAAK,OACLyH,SAAUD,KAAKk+D,aACftxD,QAAS5M,KAAKm+D,wBACdX,SAAUA,EACVE,OAAQA,SAIjB,CACH,MAAMG,EAA0B79D,KAAKhD,MAAM6gE,wBAAwBl9D,KAAK1D,GAEhEK,IAAAA,cAAA,MACItC,IAAKiC,EAAK1C,SAAW,4BACrBqS,QAASA,KACD3P,EAAKoa,QACLpa,EAAKoa,OAAOrX,KAAK+3D,gCAErB/3D,KAAKgH,SAAS,CAAC+1D,UAAU,GAAO,GAGpCz/D,IAAAA,cAAA,KAAGm2C,KAAK,KACJn2C,IAAAA,cAAA,QAAMC,UAAU,QACXN,EAAKI,MAETJ,EAAK6K,SAKtB81D,EACItgE,IAAAA,cAAA,WACIA,IAAAA,cAAA,SACIw1D,UAAW,EACX,aAAYhsD,EAAcytD,GAAQ3gD,YAClCskC,IAAKl4C,KAAK48D,UACVpkE,KAAK,OACL+E,UAAU,kCACV0C,SAAUD,KAAKk+D,aACftxD,QAAS5M,KAAKm+D,wBACdX,SAAUA,EACVE,OAAQA,IAEZpgE,IAAAA,cAACka,GAAAA,EAAW,KACRla,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAC61D,GAAAA,EAAwB,CACrBP,SAAUQ,GAAAA,EAAmB0K,YAC7BxK,kBAAkB,EAClBC,iBAAiB,KAIzBj2D,IAAAA,cAAA,UACI9E,KAAK,SACLnE,GAAG,mBACH,aAAY4+D,EACZ11D,UAAU,iDAEVD,IAAAA,cAAC2gE,GAAAA,cAAa,CACV7/D,KAAM,GACNuuD,MAAO,eACP,aAAYuG,MAIxB51D,IAAAA,cAAC4Z,GAAAA,EAAI,CACD7iB,GAAG,oBACHojB,UAAU,EACV2mD,QAAQ,EACR1mD,UAAW5Q,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,yBAC3E+tD,aAAcA,IAEdx3D,IAAAA,cAAA,UACIA,IAAAA,cAAA,KACIm2C,KAAK,IACL7mC,QAAS5M,KAAK+9D,mBACdC,WAAYh+D,KAAK+9D,oBAEjBzgE,IAAAA,cAAA,QAAMC,UAAU,QACZD,IAAAA,cAAA,KAAGC,UAAU,kBAEjBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,eACH0S,eAAe,oBAI1B82D,IAKrB,CAEA,OAAK79D,KAAKhD,MAAMk7D,eAKZ56D,IAAAA,cAAA,OAAKC,UAAWq5D,GAAoB,EAAI,kCAAoC,eACvEgH,GALE,IAQf,EACH99D,GA7kBYm1D,GAAU,eAIG,CAClB4I,wBAAyB,GACzBtH,2BAA4B,KAykBpC,MAAM8H,IAAmBvxD,EAAAA,EAAAA,YAAWmoD,GAAY,CAACqJ,YAAY,IAC7DD,GAAiBv6D,YAAc,yBAC/B,YEhtBA,IAAesB,EAAAA,EAAAA,UA3Bf,SAAyBxP,GACrB,MAAMqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnBshE,EAAc3P,SAAStvD,EAAOsmE,aAAe,GAAI,IAEjDC,GAAcC,EAAAA,GAAAA,IAA6B7oE,GAC3C0/D,EAA+BkJ,EAAYr1D,OAASq1D,EAAYE,MAChEnJ,EAAqBiJ,EAAYr1D,MAAQq1D,EAAYE,MAE3D,MAAO,CACHxH,cACAgB,gBAAgBA,EAAAA,GAAAA,IAAejgE,GAC/B4oB,QAAQC,EAAAA,GAAAA,GAAiBlrB,GACzBioE,wBAAyBjoE,EAAM+oE,QAAQ7hE,WAAW8hE,iBAClDrI,2BAA4B3gE,EAAM+oE,QAAQ7hE,WAAW+hE,oBACrDvJ,+BACAC,qBAER,IAEA,SAA4B5hE,GACxB,MAAO,CACH0M,SAASiF,EAAAA,GAAAA,oBAAmB,CACxBsO,WAAUA,GAAAA,GACXjgB,GAEX,GAE4D,KAAM,CAAC2qE,YAAY,GAA/E,CAAsFrJ,I,89BC1BtF,MAAM6J,GAAgBn1C,GACXA,EAAM8B,UAAU/kB,OAASijB,EAAMsnB,kBAAkBvqC,O,89BCmE5D,MAAMq4D,IAAwBC,EAAAA,EAAAA,GAAmB,yBAAyBC,EAAAA,EAAAA,OAAK,IAAM,mCA0B/EC,GAAqBzpE,IASd,IAAA0pE,EAAA,IATe,SACxB1vD,EAAQ,UACRC,EAAS,OACTuX,EAAM,aACNm4C,GAAe,EAAK,YACpBz9D,EAAW,aACXomD,GAAe,EAAK,YACpBn+B,EAAW,WACXy1C,GACI5pE,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElBnjB,GAAWsxD,EAAAA,EAAAA,eAEXqa,GAAqBroD,EAAAA,EAAAA,SAAQsoD,EAAAA,GAAgB,IAC7CC,GAAmBvoD,EAAAA,EAAAA,SAAQwoD,EAAAA,GAAc,IACzCle,GAAiBtqC,EAAAA,EAAAA,SAAQuqC,EAAAA,GAAoB,IAE7Ckd,EAAQ70D,QAAQod,IAAWm4C,GAE3BM,EAAiCA,KACnC,IAAIjiE,EAOJ,OALIA,EADAihE,EACO3W,EAAe4X,EAAAA,GAAwBC,KAAOD,EAAAA,GAAwBE,QAEtEF,EAAAA,GAAwBG,KAG5BriE,CAAI,EAGT2lB,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5B3W,GAAUmzC,EAAAA,EAAAA,cAAaz+C,GAAuB0pE,EAAmB1pE,EAAO8Z,KACxEqwD,GAAqB7+D,aAAO,EAAPA,EAAS/D,eAAgB,GAC9C6iE,GAAc9+D,aAAO,EAAPA,EAAS1I,OAAQ,GAC/BynE,EAAkB/+D,aAAO,EAAPA,EAASg/D,OAC3BC,GAAiB9rB,EAAAA,EAAAA,cAAaz+C,GAAuB4pE,EAAiB5pE,EAAO8Z,EAAWuX,EAAQo4C,KAChGe,GAAgB/rB,EAAAA,EAAAA,cAAaz+C,GCnJhC,SAA8BA,GACjC,OAAOA,EAAM8kD,MAAM2lB,OAAOC,6BAC9B,CDiJ8DC,CAAqB3qE,GAAS,IAClF4qE,GAAcnsB,EAAAA,EAAAA,cAAaz+C,GAAuB2xD,UAASxqC,EAAAA,EAAAA,IAAUnnB,GAAO6qE,aAAe,GAAI,KAAO19C,EAAAA,GAAU29C,0BAChHxI,GAAiB7jB,EAAAA,EAAAA,cAAaz+C,IAAuB+qE,EAAAA,GAAAA,KAAgC5jD,EAAAA,EAAAA,IAAUnnB,MAC/FgrE,IAAmBvsB,EAAAA,EAAAA,cAAaz+C,IAAuBirE,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAY6jD,qBAAsB7jD,EAAAA,GAAY8jD,gCAAkC9jD,EAAAA,GAAY+jD,mCACrMC,IAAwB7sB,EAAAA,EAAAA,cAAaz+C,IACvC,MAAMurE,EAAiBzB,IACvB,OAAOziD,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAYkkD,qBAAsBD,EAAe,IAErE1f,IAAapN,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAA8rD,EAAA,OAAuC,QAAlCA,GAAAC,EAAAA,EAAAA,IAAiB/rD,EAAO8Z,UAAU,IAAAgyC,OAAA,EAAlCA,EAAoCE,cAAe,EAAE,IACtGC,IAAsBxN,EAAAA,EAAAA,cAAaz+C,GAAwB6rD,GAAaF,EAAe3rD,EAAO6rD,IAAc,KAC5GO,IAAiB3N,EAAAA,EAAAA,cAAaz+C,KAAwB6rD,KAAaQ,EAAAA,EAAAA,IAAmBrsD,EAAO6rD,MAAgBzO,EAAAA,GAAakP,MAC1Hmf,IAAyBhtB,EAAAA,EAAAA,cAAaz+C,IAAuB0rE,EAAAA,EAAAA,IAA0B1rE,KAEvF2rE,IAAUltB,EAAAA,EAAAA,cAAaz+C,IACzB,MAAMsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,QAAOxO,IAAUgpB,EAAAA,EAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,GAAI81B,EAAAA,GAAYq3C,YAAoB,IAE1GhuC,IAAqB6gB,EAAAA,EAAAA,cAAaz+C,IACpC,MAAMsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,QAAOxO,IAAUgpB,EAAAA,EAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,GAAI81B,EAAAA,GAAYC,qBAA6B,IAEnHq3C,IAAsBptB,EAAAA,EAAAA,cAAaz+C,IAErC,GAAIqxB,EACA,OAAO,EAEX,MACMy6C,EAA2C,UADlC3kD,EAAAA,EAAAA,IAAUnnB,GACK+rE,eAExBC,GAAeC,EAAAA,EAAAA,IAAOjsE,EAAOksE,GAAAA,GAAiBC,yBAA0B3+C,EAAe,GAIvF4+C,GADcC,EAAAA,EAAAA,IAAuBrsE,GACZssE,GAAAA,GAAiCC,aAAeC,GAAAA,GAAoBD,aAEnG,OAAOT,GAAmBE,IAAiBI,CAAS,IAElDK,IAAchuB,EAAAA,EAAAA,cAAaz+C,IAAuB0sE,EAAAA,EAAAA,IAAmB1sE,EAAOqxB,KAE5Es7C,IAAmBpZ,EAAAA,EAAAA,QAAuB,MAC1CqZ,IAAgBrZ,EAAAA,EAAAA,QAAuB,MACvCsZ,IAAatZ,EAAAA,EAAAA,QAAqB,MAClCuZ,IAA2BvZ,EAAAA,EAAAA,UAC3BwZ,IAAiBxZ,EAAAA,EAAAA,UACjByZ,IAAWzZ,EAAAA,EAAAA,QAAOgX,GAClB0C,IAAe1Z,EAAAA,EAAAA,QAA8C,CAAC,GAC9D2Z,IAAa3Z,EAAAA,EAAAA,QAAO,IAEnBx/B,GAAOo5C,KAAYlsD,EAAAA,EAAAA,UAASspD,IAC5B6C,GAAeC,KAAoBpsD,EAAAA,EAAAA,UAAS8S,GAAMjtB,QAAQgK,SAC1DmhD,GAAaqb,KAAkBrsD,EAAAA,EAAAA,UAA+D,OAC9F8wC,GAAWwb,KAAgBtsD,EAAAA,EAAAA,UAA0B,OACrDusD,GAAaC,KAAkBxsD,EAAAA,EAAAA,WAAS,IACxCysD,GAAeC,KAAoB1sD,EAAAA,EAAAA,WAAS,IAC5C2sD,GAAiBC,KAAsB5sD,EAAAA,EAAAA,WAAS,IAChD6sD,GAAmBC,KAAwB9sD,EAAAA,EAAAA,WAAS,GAErD+sD,IAAmBrC,GACnBsC,GAAkBh6D,QAAQ8f,GAAMjtB,SAChConE,IAAqB5C,KAA0B0C,GAC/CG,IAA0B1vB,EAAAA,EAAAA,cAAaz+C,GAAiF,UAA1DouE,EAAAA,EAAAA,IAAoBpuE,EAAO,6BACzFquE,GAAiBhE,IAAoBD,IAAgBj9C,EAAAA,GAAU0K,YAAcuyC,IAAgBj9C,EAAAA,GAAUC,YACvG7gB,GAAa0H,QAAQ+5D,KAAqBG,IAA2BE,IAErEC,IAAoBntD,EAAAA,EAAAA,cAAY,KAClCssD,IAAgBc,IAAUA,GAAK,GAChC,IAEGC,IAAkBrtD,EAAAA,EAAAA,cAAY,KAChCsW,EAAAA,GAAuC3d,EAAWuX,EAAO,GAC1D,CAACvX,EAAWuX,IAETo9C,IAAoBttD,EAAAA,EAAAA,cAAY,SAACutD,GAA2G,IAAjFjpE,EAA4CkI,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAACghE,SAAS,EAAOp7D,MAAM,GAC/Hw5D,GAAe5yD,SACf8iC,aAAa8vB,GAAe5yD,SAGhCgzD,GAASuB,GAET,MAAME,EAAYA,KACd,IAAIp/C,EAASq/C,EAAAA,GAAgBC,MACzBC,EAASL,EAAc50D,UACvB40D,EAAcxwD,SACdsR,EAASq/C,EAAAA,GAAgBG,cACzBD,EAASL,EAAcxwD,QAE3B,MAAM9Y,EAAMqkE,GAAc,GAAJphE,OAAOmnB,GAAMnnB,OAAG0mE,IAElCE,EAAAA,GAAAA,GAAiBP,GACjB3wE,GAASmxE,EAAAA,EAAAA,IAAY9pE,EAAKspE,EAAc50D,UAAW40D,EAAcxwD,SAIjEzY,EAAQ8N,KACRxV,GAASoxE,EAAAA,EAAAA,IAAY/pE,EAAG5G,GAAAA,GAAA,GAAMkwE,GAAa,IAAEn7D,MAAM,IAAOm7D,EAAcxwD,QAAQ,IAIpFngB,GAASoxE,EAAAA,EAAAA,IAAY/pE,EAAKspE,EAAeA,EAAcxwD,QAAQ,EAG/DzY,EAAQkpE,QACRC,IAEA7B,GAAe5yD,QAAUwY,YAAW,KAChCi8C,GAAW,GACZzhD,EAAAA,GAAUiiD,oBAGjBnC,GAAa9yD,QAAQu0D,EAAcxwD,QAAUwwD,EAAc50D,WAAa40D,CAC5E,GAAG,CAAC3wE,IAEEg1D,IAAgB5xC,EAAAA,EAAAA,cAAaxhB,IAC/B,GAAI6tE,GACA,OAGJ,MAAM37D,GAAMw9D,EAAAA,GAAAA,IAAkB1vE,GAE9B8uE,GAAiBjwE,GAAAA,GAAC,CAAC,EACZu1B,IAAK,IACRjtB,QAAS+K,EAAI/K,WAGjB6rB,YAAW,KAAM,IAAA28C,EACb,MAAMC,EAA4B,QAArBD,EAAGzC,GAAW1yD,eAAO,IAAAm1D,OAAA,EAAlBA,EAAoBE,cACpClnE,GAAAA,GAAwBinE,EAAS19D,EAAI0kD,eAAgB1kD,EAAI2kD,aAAa,GACxE,GACH,CAACgX,GAAaiB,GAAmB16C,KAE9B07C,IAA0BtuD,EAAAA,EAAAA,cAAY,KACxCpjB,GAASo6B,EAAAA,EAAAA,IAAgB3K,EAAe,CAAC,CACrCsK,SAAUxQ,EAAAA,GAAYkkD,qBACtBrlD,QAASqH,EAGT3lB,KAAMiiE,IACN5+D,MAAOwkE,QAAQpE,OACf,GACL,CAACvtE,EAAUyvB,EAAes8C,EAAgCwB,KE1RnCqE,EAC1B9C,EACAx7C,KAEA,MAAMu+C,GAAkBrc,EAAAA,EAAAA,QAAO,IAEzBsc,GAAsB1uD,EAAAA,EAAAA,cAAY,KACpC,IAAKmW,GAAAA,KACD,OAIJ,IAAIw4C,EAAc,WAahB,IAAAR,EAZEl2D,OAAO02D,cACPA,EAHoB,KAGNtkE,KAAKukE,IAAI32D,OAAO02D,aAA6C,YAAc,YAGzF12D,OAAO42D,OAAOF,cACdA,EAAc12D,OAAO42D,OAAOF,YAAYltE,KAAKspC,MAAM,KAAK,IAIxD0jC,EAAgBz1D,SAChB21D,IAAgBF,EAAgBz1D,SACM,kBAArCvQ,SAAS+8D,eAAiB,CAAC,GAAGloE,KAEb,QAAlB6wE,EAAAzC,EAAW1yD,eAAO,IAAAm1D,GAAlBA,EAAoBW,QAGxBL,EAAgBz1D,QAAU21D,CAAW,GACtC,CAACjD,KAEJ/f,EAAAA,EAAAA,YAAU,MACDz7B,GAAUiG,GAAAA,OACXu4C,IACIz2D,OAAO42D,OAAOF,aAAe,aAAc12D,OAAO42D,OAAOF,YACzD12D,OAAO42D,OAAOF,YAAY7K,iBAAiB,SAAU4K,GAC9C,wBAAyBz2D,QAChCA,OAAO6rD,iBAAiB,oBAAqB4K,IAG9C,KACEx+C,IACGjY,OAAO42D,OAAOF,aAAe,aAAc12D,OAAO42D,OAAOF,YACzD12D,OAAO42D,OAAOF,YAAY3K,oBAAoB,SAAU0K,GACjD,wBAAyBz2D,QAChCA,OAAO+rD,oBAAoB,oBAAqB0K,GAExD,IAEL,GAAG,EF0ONF,CAAsB9C,GAAYx7C,GAClC,MAAM6+C,GG3RaC,EACnBp8C,EACA84C,EACA4B,KAEA,MAAM2B,GAAoB3xB,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAM+oE,QAAQ7hE,WAAWmpE,mBAEjFC,GAAkBnvD,EAAAA,EAAAA,cAAY,KAAM,IAAAmuD,EACtC,MAAM3gB,EAA0B,QAArB2gB,EAAGzC,EAAW1yD,eAAO,IAAAm1D,OAAA,EAAlBA,EAAoBE,cAElC,MAAO,CACHpZ,MAAOzH,aAAK,EAALA,EAAO4H,eACdF,IAAK1H,aAAK,EAALA,EAAO6H,aACf,GACF,CAACqW,IAEE0D,GAAapvD,EAAAA,EAAAA,cAAara,IAC5B2nE,EAAiBjwE,GAAAA,GAAC,CAAC,EACZu1B,GAAK,IACRjtB,YACF,GAGH,CAAC2nE,EAAmB16C,IAkBvB,OAhBc1S,EAAAA,EAAAA,UAAQ,IAAM+uD,aAAiB,EAAjBA,EAAmBrlE,KAAK1D,IAChD,IAAKA,EAAKhC,UACN,OAAO,KAGX,MAAMmrE,EAAYnpE,EAAKhC,UACvB,OACIqC,IAAAA,cAAC8oE,EAAS,CACNprE,IAAKiC,EAAK5I,GACVs1B,MAAOA,EACPu8C,gBAAiBA,EACjBC,WAAYA,GACd,KAEN,CAACH,EAAmBr8C,EAAOu8C,EAAiBC,GAEpC,EHkPQJ,CAAep8C,GAAO84C,GAAY4B,IAChDgC,GItRcC,EACpB7D,EACA/yD,EACAgvD,EACA6C,KAEA,MAAM5tE,GAAWsxD,EAAAA,EAAAA,eAEXshB,GAAclyB,EAAAA,EAAAA,aAAYmyB,EAAAA,IAC1BC,GAAUpyB,EAAAA,EAAAA,aAAYp8B,EAAAA,GAItBq8C,GAAiBjgB,EAAAA,EAAAA,aAAY+f,IAAmB,KAAM,IAEtDiS,GAAetvD,EAAAA,EAAAA,cAAY,WAAuB,IAAtB2vD,EAASnjE,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GACvC,MAAMojE,GAAuBpF,EACzBkB,EAAW1yD,SAAW42D,EACtBlE,EAAW1yD,QAAQ81D,QAGnBpD,EAAW1yD,UAAY22D,GAAcx5C,GAAAA,MACrCu1C,EAAW1yD,QAAQiP,OAE3B,GAAG,CAACuiD,EAASkB,IAEPmE,GAA0B7vD,EAAAA,EAAAA,cAAata,IAAqB,IAAA0/D,GAEzDuC,GAAS6H,GAKV7H,IAAU6H,GAKV7H,GAAS+H,GAA+C,UAAd,QAAtBtK,EAAA38D,SAAS+8D,qBAAa,IAAAJ,OAAA,EAAtBA,EAAwB0K,UAO5CrnE,SAASsnE,uBAAuB,wBAAwBpgE,SAIxDqgE,EAAAA,GAAAA,IAAuBtqE,EAAG+C,SAAS+8D,gBACnC8J,GACJ,GACD,CAACA,EAAcE,EAAaE,EAAS/H,IAyBxC,OAtBAhc,EAAAA,EAAAA,YAAU,KACNljD,SAASq7D,iBAAiB,UAAW+L,GAC9B,KACHpnE,SAASu7D,oBAAoB,UAAW6L,EAAwB,IAErE,CAACA,KAGJI,EAAAA,EAAAA,IAAa,KACTX,GAAc,GACf,CAAC32D,KAGJgzC,EAAAA,EAAAA,YAAU,KACFgc,GAASpK,GACT+R,IACA1yE,GAASszE,EAAAA,GAAAA,QACDvI,GAAUpK,GAClB+R,GACJ,GACD,IAEIA,CAAY,EJyMEC,CAAgB7D,GAAY/yD,EAAWgvD,EAAO6C,KAC5D2F,GAAmBC,ID/QPC,EACnBz9C,EACA1C,EACAvX,EACA0vD,EACAyD,EACA1gE,EACAsgE,EACA4B,EACAgC,EACAnD,EACAmE,KAEA,MAAMxmD,GAASwzB,EAAAA,EAAAA,aAAYvzB,GAAAA,IAEpBwmD,EAAwBC,IAA6B1wD,EAAAA,EAAAA,UAAkD,CAAC,GAEzG2wD,GAAgBre,EAAAA,EAAAA,QAAwB,MAExCse,GAAyB1wD,EAAAA,EAAAA,cAAY,KACvCsvD,GAAc,GACf,CAACA,IAEEqB,GAAsB3wD,EAAAA,EAAAA,cAAY,KAAM,IAAAmuD,EAC1C,OAAyB,QAAzBA,EAAOzC,EAAW1yD,eAAO,IAAAm1D,OAAA,EAAlBA,EAAoBE,aAAa,GACzC,CAAC3C,IAEEkF,GAAuB5wD,EAAAA,EAAAA,cAAa6wD,IACtCL,GAA2BpD,GAAI/vE,GAAAA,GAAA,GACxB+vE,GAAI,IACP,CAACyD,EAAgBzyE,UAAWyyE,KAC7B,GACJ,IAEGC,GAA2B9wD,EAAAA,EAAAA,cAAY,CAAC0U,EAAuBrV,EAAqB1G,EAAmBoE,KACzG,MAAM9Y,EAAM8Y,GAAUpE,EAChBo4D,EAAgBjF,EAAa9yD,QAAQ/U,GAC3C,IAAK8sE,EACD,OAGJ,MAAMC,GAAeC,EAAAA,GAAAA,IAAc,IAAIF,EAAcr8C,WAAa,MAAOA,GAAY5K,GAE/EonD,EAAe,IAAIrxC,IAAIxgB,GACvB66B,GAAqB62B,EAAc72B,mBAAqB,IAAIxwC,QAAQk2C,IAAOsxB,EAAa57C,IAAIsqB,KAE5FuxB,EAAa9zE,GAAAA,GAAA,GACZ0zE,GAAa,IAChBr8C,UAAWs8C,EACX92B,sBAGJozB,EAAkB6D,EAAe,CAAC3D,SAAS,GAAM,GAClD,CAAC1jD,EAAQwjD,EAAmBxB,IAEzBsF,GAAoBpxD,EAAAA,EAAAA,cAAaX,IACnC,MAAM66B,EAAoB,IAAItnB,EAAMsnB,qBAAsB76B,GAEpDgyD,EAAYh0E,GAAAA,GAAA,GACXu1B,GAAK,IACRsnB,sBAGJozB,EAAkB+D,EAAc,CAAC7D,SAAS,IAE1C8B,GAAc,GACf,CAAC18C,EAAO06C,EAAmBgC,IAExBgC,GAAoBtxD,EAAAA,EAAAA,cAAY,SAACuxD,EAA0CnzE,GAC7E,GAAIA,EAAU,CACV,MAAMd,GAF4GkP,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,MAAhBA,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,IAGlGglE,EAAc1F,EAAa9yD,QAAQ1b,GACzC,GAAIk0E,EAAa,KAAAC,EACb,MAAMN,EAAa9zE,GAAA,GAAOm0E,GACpBt8D,EAAyD,QAApDu8D,EAAGN,EAAcj3B,kBAAkBzkB,QAAQr3B,UAAS,IAAAqzE,EAAAA,GAAK,GACrD,IAAXv8D,IACAi8D,EAAcj3B,kBAAoB,IAAIi3B,EAAcj3B,mBACpDi3B,EAAcj3B,kBAAkBw3B,OAAOx8D,EAAO,GAC9Co4D,EAAkB6D,EAAe,CAAC3D,SAAS,IAEnD,CACJ,CAE2B,iBAAhB+D,EACHA,GACApF,EAAe,IAAIj5C,MAAMq+C,IAG7BpF,EAAeoF,EAEvB,GAAG,CAACjE,EAAmBnB,EAAgBL,IAEjC6F,GAAgB3xD,EAAAA,EAAAA,cAAa5hB,IAC/BkzE,EAAkB,KAAMlzE,EAAUw0B,EAAMja,UAAWia,EAAM7V,QAEzD,MAAMo0D,EAAa9zE,GAAA,GAAOu1B,GAC1B,IAAI1d,EAAQ0d,EAAM8B,UAAUib,WAAWiiC,GAASA,EAAKt0E,KAAOc,IAC5D,IAAe,IAAX8W,EAAc,CAGd,GAFAA,EAAQ0d,EAAMsnB,kBAAkBzkB,QAAQr3B,KAEpC8W,GAAS,GAOT,OAPY,IAAA28D,EACZV,EAAcj3B,kBAAoB,IAAItnB,EAAMsnB,mBAC5Ci3B,EAAcj3B,kBAAkBw3B,OAAOx8D,EAAO,GAEzB,QAArB28D,EAAApB,EAAcz3D,eAAO,IAAA64D,GAArBA,EAAuBC,aAAa1zE,EAK5C,MACI+yE,EAAcz8C,UAAY,IAAI9B,EAAM8B,WACpCy8C,EAAcz8C,UAAUg9C,OAAOx8D,EAAO,GAG1Co4D,EAAkB6D,EAAe,CAAC3D,SAAS,IAC3CkD,GAAwB,GACzB,CAAC99C,EAAO69C,EAAenD,EAAmBgE,EAAmBZ,IAEhE,IAAIP,EAAoB,MACnB/kE,IAAewnB,EAAM8B,UAAU/kB,OAAS,GAAKijB,EAAMsnB,kBAAkBvqC,OAAS,KAC/EwgE,EACI5pE,IAAAA,cAACwrE,GAAAA,EAAW,CACRr9C,UAAW9B,EAAM8B,UACjBs9C,SAAUL,EACVz3B,kBAAmBtnB,EAAMsnB,kBACzBq2B,uBAAwBA,KAKpC,IAAIjS,EAAmC,OAuBvC,OAtBIgS,EACAhS,EAAW,YACJpuC,IACPouC,EAAW+J,EAAe,SAAW,WAmBlC,CAAC8H,EAhBc/kE,EAAa,KAC/B7E,IAAAA,cAAC23D,GAAU,CACP/c,IAAKsvB,EACL1Q,UAAWgI,GAAan1C,GACxB4xC,UAAWmM,EACXzP,mBAAoBwP,EACpBjQ,cAAe2Q,EACfvS,aAAciS,EACd9R,cAAesS,EACfhR,iBAAkBsQ,EAClB7zD,OAAQmT,EACRvX,UAAWA,EACX2lD,SAAUA,IAIuB,ECsHE+R,CACvCz9C,GACA1C,EACAvX,EACA0vD,EACAyD,GACA1gE,GACAsgE,GACA4B,GACAgC,GACAnD,GACAnb,GAGEihB,GAAoBjhB,EAAe,CAACgN,MAAO,SAAMz8D,GACjD,YACF2wE,GAAW,kBACXC,GAAiB,kBACjBC,IKhSeC,EACnBjnE,EACAwnB,EACAq5C,EACAC,EACAoB,EACAgF,EACAhD,EACA2C,KAEA,MAAMniE,GAAOiQ,EAAAA,EAAAA,WAEPoyD,GAAoB70B,EAAAA,EAAAA,cAAaz+C,GAA8D,UAAvCmnB,EAAAA,EAAAA,IAAUnnB,GAAO0zE,oBACzEC,GAAkBl1B,EAAAA,EAAAA,cAAaz+C,GAA4D,UAArCmnB,EAAAA,EAAAA,IAAUnnB,GAAO4zE,kBAEvEC,GAAiBtgB,EAAAA,EAAAA,QAA0B,OAE1CugB,EAAiBC,IAAsB9yD,EAAAA,EAAAA,WAAS,GAEjDsyD,GAAoBpyD,EAAAA,EAAAA,cAAata,IACnCA,SAAAA,EAAGy0D,kBACHyY,GAAoBxF,IAAUA,GAAK,GACpC,IAEGyF,GAAkB7yD,EAAAA,EAAAA,cAAY,KAChC4yD,GAAmB,EAAM,GAC1B,IAEGE,GAAoB9yD,EAAAA,EAAAA,cAAY,IAC3B0yD,EAAe15D,SACvB,IAEG+5D,GAAmB/yD,EAAAA,EAAAA,cAAa4qB,IAClC,MAAMooC,GAAaC,EAAAA,GAAAA,IAAaroC,GAEhC,IAAKooC,EAED,OAGJ,IAAIE,EACJ,GAAsB,KAAlBtgD,EAAMjtB,QACNutE,EAAa,IAAHhsE,OAAO8rE,EAAU,MAC3B9G,EAAiBgH,EAAWvjE,YACzB,CACH,MAAM,QAAChK,GAAWitB,GACZ,WAACugD,EAAU,UAAEC,IAAaC,EAAAA,GAAAA,IAAiCpH,EAAetmE,GAGhFutE,EACmB,KAAfC,EAAoB,IAAHjsE,OAAO8rE,EAAU,MAAA9rE,OAAKksE,GAAS,GAAAlsE,OAAQisE,EAAU,MAAAjsE,OAAK8rE,EAAU,MAAA9rE,OAAKksE,GAE1F,MAAME,EACa,KAAfH,EAAoB,IAAAjsE,OAAI8rE,EAAU,MAAKrjE,OAAS,GAAAzI,OAAGisE,EAAU,MAAAjsE,OAAK8rE,EAAU,MAAKrjE,OACrFu8D,EAAiBoH,EACrB,CAEAhG,EAAiBjwE,GAAAA,GAAC,CAAC,EACZu1B,GAAK,IACRjtB,QAASutE,KAGbN,GAAmB,EAAM,GAC1B,CAAChgD,EAAOq5C,EAAeqB,EAAmBpB,IAEvCqH,GAAiBvzD,EAAAA,EAAAA,cAAawzD,IAChC,IAAIN,EAEAA,EADkB,KAAlBtgD,EAAMjtB,QACO6tE,EACL,OAAQpyC,KAAKxO,EAAMjtB,SAEd,GAAHuB,OAAM0rB,EAAMjtB,SAAOuB,OAAGssE,EAAG,KAEtB,GAAHtsE,OAAM0rB,EAAMjtB,QAAO,KAAAuB,OAAIssE,EAAG,KAGxClG,EAAiBjwE,GAAAA,GAAC,CAAC,EACZu1B,GAAK,IACRjtB,QAASutE,KAGbN,GAAmB,EAAM,GAC1B,CAAChgD,EAAO06C,KAGX2C,EAAAA,EAAAA,IAAa,KACJ0C,GACDrD,GACJ,GACD,CAACqD,IAEJ,IAAIT,EAAc,KA2ClB,OAzCIC,IAAsB/mE,IACtB8mE,EACI3rE,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACktE,GAAAA,EAAkB,CACfrhE,KAAMugE,EACN5R,OAAQ+R,EACR5/D,OAAQ2/D,EACRa,aAAcX,EACdY,WAAYJ,EACZf,gBAAiBA,EACjBoB,WAAY,EACZC,YAAa5B,aAAiB,EAAjBA,EAAmBjU,QAEpCz3D,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAC61D,GAAAA,EAAwB,CACrBP,SAAUQ,GAAAA,EAAmByX,mBAC7BvX,kBAAkB,EAClBC,iBAAiB,KAIzBj2D,IAAAA,cAACmvD,GAAAA,EAAa,CACVp4D,GAAI,oBACJ6jD,IAAKuxB,EACL78D,QAASu8D,EACT3wE,KAAK,SACL,aAAYqO,EAAKC,cAAc,CAACzS,GAAI,4CAA6C0S,eAAgB,oBACjGpC,SAAU0kE,EACV9rE,UAAWk3C,IAAW,CAAC5hC,OAAQ62D,KAE/BpsE,IAAAA,cAACwtE,GAAAA,yBAAwB,CACrBne,MAAO,eACPvuD,KAAM,SAQvB,CAAC6qE,cAAaC,oBAAmBC,oBAAkB,EL2JtDC,CAAejnE,GAAYwnB,GAAOq5C,GAAeC,GAAkBoB,GAAmBjB,GAAaiD,GAAc2C,KAEjH9Z,OAAQ6b,GACRC,kBAAmBC,GAAyB,+BAC5CC,GACAC,cAAeC,KACfC,EAAAA,GAAAA,GAAY1hD,GAAO06C,GAAmBgC,GAAcjD,KACjD94D,GAAcs9C,KAAc0jB,EAAAA,GAAAA,GAC/B3hD,GACAg+B,GACAj4C,EACAuX,EACA4gC,GACAib,GACAuD,GACAnD,GACAG,GACAgB,GACA+G,QACA9yE,EACAsxB,OACAtxB,EACAyvD,GAGEwjB,IAAex0D,EAAAA,EAAAA,cAAY,KAC7BstD,GAAkB,CACd3nE,QAAS,GACT+uB,UAAW,GACXwlB,kBAAmB,GACnBu6B,SAAU,EACVC,SAAU,EACV/7D,YACAoE,OAAQmT,EACR+C,SAAU,CAAC,GACb,GACH,CAACq6C,GAAmB30D,EAAWuX,IAE5BykD,IAA0B30D,EAAAA,EAAAA,cAAa4S,IAEzCh2B,EAAS,CACL6E,KAAM0b,EAAAA,GAAUy3D,wBAChB13E,KAAM01B,EAAM8B,UACZxE,WAIJ,MAAM2kD,EAAiBvJ,GAAY5hE,QAAQpM,IAAgBs1B,EAAM8B,UAAUhjB,MAAMzR,GAASA,EAAK3C,KAAOA,MAClGu3E,GACAj4E,EAAS,CACL6E,KAAM0b,EAAAA,GAAU23D,aAChB53E,KAAM,CACF63E,QAASF,IAGrB,GACD,CAACj4E,EAAU0uE,GAAap7C,IAErB8kD,IAAsBh1D,EAAAA,EAAAA,cAAY,KACpC,MAAMi1D,GAAcnH,EAAAA,GAAAA,GAAiBl7C,IAErC,GAAIo+B,GAAgBikB,EAApB,CACI,MAAMC,EAAsB,CACxB77D,QAASC,EAAAA,GAAiB67D,YAC1B37D,WAAY47D,EAAAA,EACZ37D,YAAa,CACTG,KAAMgZ,GACN+0C,UAIR/qE,GAASwc,EAAAA,EAAAA,GAAU87D,GAEvB,MAEIlkB,GACA2jB,GAAwB/hD,IAG5Brf,IAAc,GACf,CAAC3W,EAAUg2B,GAAO+hD,GAAyBphE,GAAcy9C,EAAc2W,KAEnE0N,GAAeC,IN7WJC,EAClB3iD,EACAja,EACAuX,EACA+7C,EACAkI,EACAz7D,EACAgzD,EACAqB,EACAuC,EACA1d,EACA0b,EACA/5D,EACA85D,EACAmI,EACAlH,EACA8D,EACAphB,EACAvC,KAKA,MAAM7xD,GAAWsxD,EAAAA,EAAAA,eAEXunB,GAAWn4B,EAAAA,EAAAA,cAAaz+C,IAAuBqnB,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAYuvD,2BAA4B,wBACtGC,GAAuBr4B,EAAAA,EAAAA,cAAaz+C,IAAuBqnB,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAYuvD,2BAA4B,yBAAyB,KAC3IE,GAAiBt4B,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAAShC,MAAMymD,gBAAgB/xD,WAC1F0rD,GAAclyB,EAAAA,EAAAA,aAAYmyB,EAAAA,IAE1BqG,GAAY1jB,EAAAA,EAAAA,UACZ2jB,GAAsB3jB,EAAAA,EAAAA,QAAOwjB,EAAejmE,QAC5CqmE,GAAsB5jB,EAAAA,EAAAA,QAAO,GAC7B6jB,GAAsB7jB,EAAAA,EAAAA,SAAO,GAE7B8jB,GAAkBl2D,EAAAA,EAAAA,cAAata,IACjC,GAAIwqB,EACA,OAGJxqB,EAAEyK,iBACF,MAAMgmE,EAAW1tE,SAAS2tE,eAAe,iBACrCD,GACAA,EAASluD,QAGbrrB,GAASy5E,EAAAA,GAAAA,IAA2B19D,GAAW,GAChD,CAAC/b,EAAUszB,EAAQvX,IAEhB29D,GAAmBt2D,EAAAA,EAAAA,cAAata,IAClCA,EAAEyK,iBACF,MAAOjT,KAAMq5E,GAAc35E,GAASi8B,EAAAA,GAAAA,IAAelgB,EAAWuX,IACzDqmD,GACDjH,GAAa,EACjB,GACD,CAACA,EAAc32D,EAAWuX,EAAQtzB,IAE/B45E,GAAkBx2D,EAAAA,EAAAA,cAAata,IACjCA,EAAEyK,iBACkC,IAAhC4lE,EAAoB/8D,UAGxB+8D,EAAoB/8D,SAAW,EAC/Bs0D,EAAiBjwE,GAAAA,GAAC,CAAC,EACZu1B,GAAK,IACRjtB,QAASiwE,EAAeG,EAAoB/8D,UAAY,MAC1D,GACH,CAAC4Z,EAAO06C,EAAmBsI,IAExBa,GAAkBz2D,EAAAA,EAAAA,cAAata,IACjCA,EAAEyK,iBACE4lE,EAAoB/8D,SAAW48D,EAAejmE,SAGlDomE,EAAoB/8D,SAAW,EAC/Bs0D,EAAiBjwE,GAAAA,GAAC,CAAC,EACZu1B,GAAK,IACRjtB,QAASiwE,EAAeG,EAAoB/8D,UAAY,MAC1D,GACH,CAAC4Z,EAAO06C,EAAmBsI,IAExBN,GAAkBt1D,EAAAA,EAAAA,cAAata,IACjC,MAAM,aAACgxE,EAAY,oBAAEC,EAAmB,eAAEC,EAAc,QAAEjxE,IAAWkxE,EAAAA,GAAAA,IACjEnxE,EACAktB,EAAMjtB,QACN8vE,EACAE,EACAzlD,EAAS,EAAI/L,KAAKC,MAClB8L,EAAS,EAAI8lD,EAAoBh9D,QACjCizD,GAGJ,GAAI2K,EAGA,OAFAlxE,EAAEyK,sBACFzK,EAAEy0D,kBAIN,GAAIuc,GAAgBvC,EAAgC,CAChDzuE,EAAEyK,iBACF,MAAMkhE,EAAgBsF,GAAuBhxE,EAAOtI,GAAAA,GAAA,GAAQu1B,GAAK,IAAEjtB,iBAAWpE,EAC9EgS,EAAa89D,EACjB,CAEAhE,GAAiB,GAClB,CAACz6C,EAAO6iD,EAAUE,EAAsB1J,EAAe/7C,EAAQm9C,EAAiB95D,EAAc4gE,IAE3FkB,GAAgBr1D,EAAAA,EAAAA,cAAata,IAC/B,MAAMoxE,EAAuBpxE,EAAEqxE,SAAWrxE,EAAEsxE,QACtCC,GAAqBxB,GAAYE,IACnCuB,GAAAA,EAAsBxxE,EAAG03D,GAAS+Z,QAClCL,EAEEM,EAAeF,GAAAA,EAA0BxxE,KAAOA,EAAE2xE,SAAW3xE,EAAEu/D,SAC/DqS,EAAeJ,GAAAA,EAA0BxxE,GAAG,IAASA,EAAE2xE,OACvDE,GAAiBL,GAAAA,EAA0BxxE,IAAMA,EAAEu/D,UAAYv/D,EAAE2xE,OACjEG,EAAiBN,GAAAA,EAA0BxxE,GAAG,IAASA,EAAEu/D,SAa/D,GAVIv/D,EAAEzB,MAAQm5D,GAASqa,EAAE,IAAMX,GACvBpxE,EAAEu/D,WACFgR,EAAoBj9D,SAAU,EAC9B88D,EAAU98D,QAAUf,OAAOuZ,YAAW,KAClCykD,EAAoBj9D,SAAU,CAAK,GACpC,MAKP7R,GAAAA,GAAmCzB,GAKnC,YAJA4nE,EAAiBjwE,GAAAA,GAAC,CAAC,EACZu1B,GAAK,IACRjtB,QAASwB,GAAAA,GAAkCzB,EAAEgyE,gBAKrD,GAAIT,EAEA,YADA3B,EAAgB5vE,GAI2B,IAAAyoE,EAA3C+I,GAAAA,EAAsBxxE,EAAG03D,GAASua,UAClClpB,SAAAA,IACkB,QAAlB0f,EAAAzC,EAAW1yD,eAAO,IAAAm1D,GAAlBA,EAAoBW,OAChB9d,GACAp0D,GAAS8xD,EAAAA,GAAAA,QAIjB,MAAMkpB,GAAad,IAAyBpxE,EAAE2xE,SAAW3xE,EAAEu/D,UAAYiS,GAAAA,EAAsBxxE,EAAG03D,GAASya,IACnGC,EAA0C,IAAzBllD,EAAMjtB,QAAQgK,OAC/BooE,EAAkD,IAAzBnlD,EAAMjtB,QAAQgK,QAAgBijB,EAAMjtB,UAAYiwE,EAAeG,EAAoB/8D,SAC5Gg/D,EAAyB/L,IAAiBgM,EAAAA,GAAAA,IAAkBrlD,EAAMjtB,QAASsmE,GAE7E2L,GAAaE,IACbpyE,EAAEyK,iBACEu7D,EAAW1yD,SACX0yD,EAAW1yD,QAAQ81D,OAGvBwH,EAAiB5wE,IAGrB,MAAM,eACF0vD,EAAc,aACdC,EAAY,MACZtrD,GACArE,EAAEq7D,OAEFqW,IAAiBY,EACbD,GAA0Bb,GAAAA,EAAsBxxE,EAAG03D,GAASya,KAC5DnyE,EAAEy0D,kBACFz0D,EAAEyK,iBACFqmE,EAAgB9wE,IACTqyE,GAA0Bb,GAAAA,EAAsBxxE,EAAG03D,GAAS8a,OACnExyE,EAAEy0D,kBACFz0D,EAAEyK,iBACFsmE,EAAgB/wE,IACTwxE,GAAAA,EAAsBxxE,EAAG03D,GAAS+a,IACzCzyE,EAAEy0D,kBACFz0D,EAAEyK,iBACFyhD,EAAc,CACVuD,aAAc,OACdC,iBACAC,eACA1vD,QAASoE,KAENmtE,GAAAA,EAAsBxxE,EAAG03D,GAASgb,IACzC1yE,EAAEy0D,kBACFz0D,EAAEyK,iBACFyhD,EAAc,CACVuD,aAAc,SACdC,iBACAC,eACA1vD,QAASoE,KAEN5C,GAAAA,GAAkCzB,IAAMwxE,GAAAA,EAAsBxxE,EAAG03D,GAASib,KACjF3yE,EAAEy0D,kBACFz0D,EAAEyK,iBACFyhD,EAAc,CACVuD,aAAc,OACdC,iBACAC,eACA1vD,QAASoE,KAGVutE,IAAiBU,EACpBd,GAAAA,EAAsBxxE,EAAG03D,GAASib,IAClC3yE,EAAEy0D,kBACFz0D,EAAEyK,iBACFyhD,EAAc,CACVuD,aAAc,OACdC,iBACAC,eACA1vD,QAASoE,KAENmtE,GAAAA,EAAsBxxE,EAAG03D,GAASkb,IACzC5yE,EAAEy0D,kBACFz0D,EAAEyK,iBACFyhD,EAAc,CACVuD,aAAc,OACdC,iBACAC,eACA1vD,QAASoE,KAENmtE,GAAAA,EAAsBxxE,EAAG03D,GAASmb,IACzC7yE,EAAEy0D,kBACFz0D,EAAEyK,iBACFiiE,KACO8E,GAAAA,EAAsBxxE,EAAG03D,GAASob,IACzC9yE,EAAEy0D,kBACFz0D,EAAEyK,iBACFm+D,KACO4I,GAAAA,EAAsBxxE,EAAG03D,GAASqb,IAAM7lD,EAAMjtB,QAAQgK,SAAWwmB,GAAAA,MAAqB42C,IAC7FrnE,EAAEy0D,kBACFz0D,EAAEyK,iBACFqlE,KAEG+B,IAAkBS,EACrBd,GAAAA,EAAsBxxE,EAAG03D,GAASsb,IAClChzE,EAAEy0D,kBACFz0D,EAAEyK,iBACFyhD,EAAc,CACVuD,aAAc,SACdC,iBACAC,eACA1vD,QAASoE,KAENmtE,GAAAA,EAAsBxxE,EAAG03D,GAASub,QACzCjzE,EAAEyK,iBACFyhD,EAAc,CACVuD,aAAc,KACdC,iBACAC,eACA1vD,QAASoE,KAENmtE,GAAAA,EAAsBxxE,EAAG03D,GAASwb,QACzClzE,EAAEyK,iBACFyhD,EAAc,CACVuD,aAAc,KACdC,iBACAC,eACA1vD,QAASoE,KAENmtE,GAAAA,EAAsBxxE,EAAG03D,GAASyb,QACzCnzE,EAAEyK,iBACFyhD,EAAc,CACVuD,aAAc,QACdC,iBACAC,eACA1vD,QAASoE,KAGVytE,IAAmBQ,IACtBd,GAAAA,EAAsBxxE,EAAG03D,GAASqb,IAAM7lD,EAAMjtB,QAAQgK,QAAUwmB,GAAAA,MAChEzwB,EAAEy0D,kBACFz0D,EAAEyK,iBACFqlE,KACO0B,GAAAA,EAAsBxxE,EAAG03D,GAASmb,KACzC7yE,EAAEy0D,kBACFz0D,EAAEyK,iBACFiiE,MAI4BoF,GAAkBN,GAAAA,EAAsBxxE,EAAG03D,GAAS0b,cAIpFpzE,EAAEy0D,kBACFz0D,EAAEyK,iBAEG6gD,GAEDp0D,GAASm8E,EAAAA,GAAAA,IAAgC7oD,EAASu5B,EAAAA,GAAUuvB,SAAWvvB,EAAAA,GAAUwvB,UAIpF/oD,IACwB4mD,IAAyBpxE,EAAE2xE,QAAU3xE,EAAEu/D,UAAYiS,GAAAA,EAAsBxxE,EAAG03D,GAASya,KACvFC,IACnB5B,SAAAA,EAAkBxwE,GAE1B,GACD,CACCksD,EACAqa,EACA0J,EACAF,EACA74E,EACAg2B,EACA06C,EACAmJ,EACAD,EACAZ,EACAU,EACApmD,EACAolD,EACAY,EACAxK,EACA4C,EACA8D,EACAoD,KAIJ7pB,EAAAA,EAAAA,YAAU,KACN,SAASutB,EAAQ96D,IACb+6D,EAAAA,GAAAA,IAAa/6D,EAAO1F,EAAUka,EAAMjtB,QAASswE,EAAoBj9D,QAASizD,EAC9E,CAGA,OADAxjE,SAASq7D,iBAAiB,QAASoV,GAC5B,KACHzwE,SAASu7D,oBAAoB,QAASkV,EAAQ,CACjD,GACF,CAACxgE,EAAUka,EAAMjtB,QAASsmE,IAE7B,MAAMmN,GAAqBp5D,EAAAA,EAAAA,cAAata,IACpCA,EAAEyK,iBAEF,MAAMkpE,EAAmF,IAAjE5wE,SAASsnE,uBAAuBuJ,EAAAA,GAAeC,OAAO5pE,OACxE6pE,EAA4F,IAAjE/wE,SAASsnE,uBAAuBuJ,EAAAA,GAAeG,OAAO9pE,QAMlF6/D,GAAe6J,GAAmBG,GACnC58E,GAASm8E,EAAAA,GAAAA,IAAgCtvB,EAAAA,GAAUwvB,QACvD,GACD,CAACr8E,EAAU4yE,IAyCd,OAvCA7jB,EAAAA,EAAAA,YAAU,KACN,MAAM+tB,EAAsBh0E,KACKA,EAAEqxE,SAAWrxE,EAAEsxE,UACgBtxE,EAAEu/D,UAAYiS,GAAAA,EAAsBxxE,EAAG03D,GAAS0b,aAExGM,EAAmB1zE,EACvB,EAOJ,OAJKwqB,GACDznB,SAASq7D,iBAAiB,UAAW4V,GAGlC,KACExpD,GACDznB,SAASu7D,oBAAoB,UAAW0V,EAC5C,CACH,GACF,CAACxpD,EAAQkpD,KAGZztB,EAAAA,EAAAA,YAAU,KACFoqB,EAAoB/8D,UAAY48D,EAAejmE,QAG/CijB,EAAMjtB,UAAYiwE,EAAeG,EAAoB/8D,WACrD+8D,EAAoB/8D,QAAU48D,EAAejmE,OACjD,GACD,CAACijB,EAAMjtB,WAEVgmD,EAAAA,EAAAA,YAAU,KACNoqB,EAAoB/8D,QAAU48D,EAAejmE,MAAM,GACpD,CAACimE,KAGJjqB,EAAAA,EAAAA,YAAU,KACNqqB,EAAoBh9D,QAAUmL,KAAKC,KAAK,GACzC,CAACzL,IAEG,CAAC08D,EAAeC,EAAgB,EM3BEC,CACrC3iD,GACAja,EACAuX,EACA+7C,GACAkI,GACAz7D,EACAgzD,GACAqB,GACAuC,GACA1d,GACA0b,GACA0H,GACA3H,GACAF,GACAmB,GACA8D,GACAphB,EACAwjB,IAGEmF,IAAwB35D,EAAAA,EAAAA,cAAata,IACvCA,EAAEyK,iBACFoD,IAAc,GACf,CAACA,KAEEqmE,IAAkB55D,EAAAA,EAAAA,cAAa7iB,IACjCivE,GAAajvE,EAAI,GAClB,IAEG08E,IAAqB75D,EAAAA,EAAAA,cAAY,CAACnL,EAAgBilE,KACpDpN,GAAmB73D,EAASilE,EAAU,GACvC,IAEGC,IAAa/5D,EAAAA,EAAAA,cAAY,KAC3B+rD,GAAW/yD,QAAUmL,KAAKC,MAC1BwoD,IAAqB,EAAM,GAC5B,IAEGoN,IAAch6D,EAAAA,EAAAA,cAAY,KAC5B4sD,IAAqB,EAAK,GAC3B,IAEGzF,IAAennD,EAAAA,EAAAA,cAAata,IAC9B,MAAMC,EAAUD,EAAEq7D,OAAOh3D,OAEpBglD,EAAAA,GAAAA,IAA2B+B,KAC5Bqb,GAAe,MAGnBmB,GAAiBjwE,GAAAA,GAAC,CAAC,EACZu1B,IAAK,IACRjtB,YACF,GACH,CAACitB,GAAO06C,GAAmBxc,KAQxBmpB,IAAkBj6D,EAAAA,EAAAA,cAAY,SAAAk6D,EAAA,OAAwB,QAAxBA,EAAMxO,GAAW1yD,eAAO,IAAAkhE,OAAA,EAAlBA,EAAoB7L,cAActkE,KAAK,GAAE,CAAC2hE,KAE9E7Z,IAAsB7xC,EAAAA,EAAAA,cAAY,KAAM,IAAAm6D,EAC1C,MAAM3sB,EAA0B,QAArB2sB,EAAGzO,GAAW1yD,eAAO,IAAAmhE,OAAA,EAAlBA,EAAoB9L,cAElC,MAAO,CACHpZ,MAAOzH,EAAM4H,eACbF,IAAK1H,EAAM6H,aACd,GACF,CAACqW,KAEE0O,IAAoBp6D,EAAAA,EAAAA,cAAapL,IAAkB,IAAAylE,EACrD,MAAM7sB,EAA0B,QAArB6sB,EAAG3O,GAAW1yD,eAAO,IAAAqhE,OAAA,EAAlBA,EAAoBhM,cAClC,IAAK5C,GAAczyD,UAAYwyD,GAAiBxyD,UAAYw0C,EACxD,OAGJ,MAAM8sB,EAAW7O,GAAczyD,QAAQuhE,YAAc/O,GAAiBxyD,QAAQuhE,YAS1E/N,KAPCM,IAMDl4D,GAAS0lE,EAIb,GACD,CAACxN,KAEE0N,IAAqBx6D,EAAAA,EAAAA,cAAata,IACpCwmE,GAAkBxmE,EAAEq7D,OAA0B3L,gBAAkB,EAAE,GACnE,IAEGqlB,IAAiBz6D,EAAAA,EAAAA,cAAY,CAACra,EAAiB+0E,KAOjD,GANApN,GAAiBjwE,GAAAA,GAAC,CAAC,EACZu1B,IAAK,IACRjtB,aAEJumE,GAAiBvmE,EAAQgK,QAErB+qE,EAAa,KAAAC,EACb,MAAMC,EAA6B,QAArBD,EAAGjP,GAAW1yD,eAAO,IAAA2hE,OAAA,EAAlBA,EAAoBtM,cACrCuM,SAAAA,EAAUzmB,QACVmb,IAAa,EACjB,IACD,CAAChC,GAAmBgC,GAAc18C,GAAO84C,MAG5C/f,EAAAA,EAAAA,YAAU,KAAM,IAAAkvB,EACZ,MAAMzM,EAAgF,QAArByM,EAAGnP,GAAW1yD,eAAO,IAAA6hE,OAAA,EAAlBA,EAAoBxM,cACpFD,GAAWA,EAAQhZ,iBAAmB6W,IACtC9kE,GAAAA,GAAuBinE,EAASnC,GACpC,GACD,CAACA,MAGJtgB,EAAAA,EAAAA,YAAU,KACDmhB,IACDsN,GAAkB,EACtB,GACD,CAACtN,GAAiBsN,MAGrBzuB,EAAAA,EAAAA,YAAU,IACC,IAAMggB,GAAyB3yD,SAAW8iC,aAAa6vB,GAAyB3yD,UACxF,KAGHi3D,EAAAA,EAAAA,IAAa,KACJ5D,IACDiD,IACJ,GACD,CAACjD,MAGJ1gB,EAAAA,EAAAA,YAAU,KACF2e,IACAgF,IACJ,GAED,CAAChF,MAGJ3e,EAAAA,EAAAA,YAAU,KACN2gB,IAAe,GACfH,GAAe,KAAK,GACrB,CAACxzD,EAAWuX,KAGfy7B,EAAAA,EAAAA,YAAU,KACN/uD,GAASk+E,EAAAA,EAAAA,IAA8B5qD,EAASw9C,EAAAA,GAAgBG,cAAgBH,EAAAA,GAAgBC,OAAO,CAACoN,EAAcnoD,IAC7GA,GAAUA,EAAMsnB,mBAAwD,IAAnCtnB,EAAMsnB,kBAAkBvqC,OAIlEtS,GAAAA,GAAA,GAAWu1B,GAAK,IAAEsnB,kBAAmB,KAH1BtnB,IAIZ,GACJ,KAGH+4B,EAAAA,EAAAA,YAAU,KACN,MAAM1oD,EAAWA,IAAMqqE,GAAkB16C,GAAO,CAAC46C,SAAS,EAAMp7D,MAAM,IAEtE,OADA6F,OAAO6rD,iBAAiB,eAAgB7gE,GACjC,KACHgV,OAAO+rD,oBAAoB,eAAgB/gE,EAAS,CACvD,GACF,CAACqqE,GAAmB16C,MAGvB+4B,EAAAA,EAAAA,YAAU,KACNkgB,GAAS7yD,QAAU4Z,EAAK,GACzB,CAACA,KAEJ,MAAMooD,IAAsCh7D,EAAAA,EAAAA,cAAa8S,GAAoCvf,QAAahS,EAAWuxB,IAAiB,CAACvf,MAGvIo4C,EAAAA,EAAAA,YAAU,KAEN,MAAMsvB,EAAc7R,EAIpB,OAFA4C,GAASiP,GAEF,KACCA,IAAgBpP,GAAS7yD,SACzBs0D,GAAkBzB,GAAS7yD,QAAS,CAACw0D,SAAS,EAAMp7D,MAAM,GAC9D,CACH,GACF,CAACuG,EAAWuX,IAEf,MAAMgrD,GAAoBpoE,QAAQ1H,KAAgBwnB,GAAMjtB,QAAQmwB,OAAOnmB,SAAWijB,GAAM8B,UAAU/kB,UAAawkE,GACzGgH,GAAatO,IAAmB7b,EAAe,KACjDzqD,IAAAA,cAAC40D,GAAU,CACPvtD,SAAUstE,GACV3nE,aAAcynE,GACdriE,UAAWA,IAIbyiE,GAAgBF,GAAoB,KACtC30E,IAAAA,cAAC80E,GAAU,CACPxlE,QAASs3D,GACTrxD,OAAQuwD,KAIhB,IAAIiP,GAEAA,GADA1wE,IAEQslB,GAAW9kB,GASH2E,EADT88D,GAEH,CACIvvE,GAAI,wBACJ0S,eAAgB,2EAGhBg9D,IAA2BE,GAE/B,CACI5vE,GAAI,8BACJ0S,eAAgB,2EAIM,CAAC1S,GAAI,4BAA6B0S,eAAgB,4BAtBhED,EACZ,CACIzS,GAAI,oBACJ0S,eAAgB,iCAEpB,CAACg5D,wBAoBT,MAAMuS,GAAenwE,GAAa,GAAKwnB,GAAM4oD,gBAAkB5oD,GAAMjtB,QAErE,IAAI81E,GAAY,UAEhB,OAAQ/iE,GACR,KAAK+wC,EAAAA,GAAUwvB,OACXwC,GAAY,eACZ,MACJ,KAAKhyB,EAAAA,GAAUC,YACX+xB,GAAY,gBACZ,MACJ,KAAKhyB,EAAAA,GAAU8vB,MACXkC,GAAY,gBAIZzqB,IACAyqB,GAAY,gBAGhB,MAAMC,GAAqBz5D,EAAAA,EAAkB05D,wBAE7C,IAAIC,GACCF,KACDE,GAAuB7rE,EAAc,CACjCzS,GAAI,gCACJ0S,eAAgB,qBAKf27D,GAAyB3yD,UAC1B2yD,GAAyB3yD,QAAUwY,YAAW,KAC1CvP,EAAAA,EAAkB45D,uBAAsB,EAAK,GAC9C,OAIX,MAAMC,GAAwB/rE,EAAc,CACxCzS,GAAI,sCACJ0S,eAAgB,uCAGd2Q,GAAYi7D,GAAuB,GAAH10E,OAAM00E,GAAoB,KAAA10E,OAAI40E,IAA0BA,GAExF9pB,IAAqB9xC,EAAAA,EAAAA,UAAQ,IAAM,EACpC8wC,GAAgBkjB,MACbnF,IAAe,IACrBrlE,OAAOoJ,UAAU,CAACi8D,GAAamF,GAA2BljB,IAEtD+qB,GACFx1E,IAAAA,cAACy1E,EAAAA,EAAkB,CACfC,SAAUlP,GAAoB,EAAI,EAClCmP,MACI31E,IAAAA,cAACorD,GAAa,CACVC,cAAeA,GACfE,kBAAmBmoB,GACnBpoB,oBAAqBA,GACrBE,gBAAiBsa,GACjBra,mBAAoBA,GACpBt5C,SAAUA,IAGlByjE,MAAO,KACPC,qBAAsBzP,KAIxB0P,IAAoBn8D,EAAAA,EAAAA,UAAQ,KAC9B,MAAMo8D,EAAc3U,EAAQ,QAAU,SAChC4U,EAAY,aAElB,OAAOvrB,EACHzqD,IAAAA,cAACi2E,EAAAA,GAAiB,CACdF,YAAaA,EACbtrB,cAAc,EACd1zD,GAAIqhE,EAAAA,GACJ4d,UAAWA,IAGfh2E,IAAAA,cAACi2E,EAAAA,GAAiB,CACdF,YAAaA,EACbtrB,cAAc,EACd1zD,GAAIqqE,EAAQlJ,EAAAA,GAA6Bge,EAAAA,GACzCF,UAAWA,GAElB,GACF,CAACvrB,EAAc2W,IAEZ+U,GAAuBnQ,IAAiBF,IAAe8D,IAAqBxI,GAASU,EAErFsU,IAA2D,QAA7BvU,GAAAwU,EAAAA,GAAAA,IAAchqD,cAAK,EAALA,GAAOjtB,gBAAQ,IAAAyiE,OAAA,EAA7BA,EAA+Bz4D,QAAS,EAE5E,OACIpJ,IAAAA,cAAA,QACIjJ,GAAI4yB,OAAS3uB,EAAY,cACzB,cAAa2uB,OAAS3uB,EAAY,cAClCiF,UAAa0pB,GAAW25C,QAA+BtoE,EAAX,SAC5C+R,SAAUqmE,IAETnP,KAAY53C,GAAM8B,UAAU/kB,OAAS,GAAKijB,GAAMsnB,kBAAkBvqC,OAAS,IACxEpJ,IAAAA,cAACyhE,GAAqB,MAEzB/c,IAAkB1kD,IAAAA,cAACynD,GAAmB,CAACjhD,YAAa+9C,MACnDkG,GACEzqD,IAAAA,cAAC0mD,EAAgB,CACbt0C,UAAWA,EACXmyC,oBAAqBA,GACrBpyC,SAAUA,EACVwX,OAAQA,IAGhB3pB,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,qBAAsB,CACxC,2CAA4CyjB,EAC5C0b,OAAQpQ,GACR,iBAAkBM,OAGpB2O,IACEn1E,IAAAA,cAAA,OACI,YAAU,YACVC,UAAU,WAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,sBAI3BzJ,IAAAA,cAAA,OACIC,UAAW,2BACXoH,SAAUxC,IAETixE,GACD91E,IAAAA,cAAA,OACI46C,IAAKsqB,GACLp4D,KAAK,cACL/V,GAAG,yBACH,uBAAqB,IACrB,aAAYqjB,GACZo7C,UAAW,EACXv1D,UAAU,0CAERwqD,GAAgBgjB,GAClBztE,IAAAA,cAACu2E,GAAAA,GAAO,CACJC,WAAW/rB,GAAuBl+C,QAAQkhE,IAC1CgJ,eAAgBtkE,IAAa+wC,EAAAA,GAAUC,YAAcyD,GAAoBh4C,EAAAA,EACzEjM,SAAUi+D,GACV8V,WAAY3H,GACZ4H,UAAW7H,GACX8H,UAAW3C,GACX4C,QAAS5C,GACT6C,cAAehQ,GACfiQ,eAAgBzD,GAChBD,gBAAiBA,GACjB7vE,MAAOwxE,GACPgC,OAAQxD,GACRyD,QAASxD,GACTyD,aAActL,GACdmJ,cAAeA,GACf3iE,UAAWA,EACXrb,GAAIm+E,GACJt6B,IAAKuqB,GACL99D,SAAUxC,GACVsyE,eAAgBjU,EAChBkU,QAAStR,GACThD,cAAeA,EACf5sC,mBAAoBA,GACpB1f,OAAQmT,EACR0tD,cAAexD,GACfppB,aAAcA,IAEjBmf,IACC/kE,KAAe2hE,IAAqBV,KAClC9lE,IAAAA,cAACm2D,GAAiB,CACd3I,UAAU,MACV4I,oBAAqB8P,IAEpB2O,IAGRsB,GACGn2E,IAAAA,cAACirD,GAAmB,KACfuqB,IAELA,IACF3wE,IACE7E,IAAAA,cAACm2D,GAAiB,CACdvb,IAAKqqB,GACLzX,UAAU,UAEVxtD,IAAAA,cAACu2D,GAAmB,CAChBjnD,QAASy4D,GACTxyD,OAAQixD,GACRn/D,SAAUy+D,KAEd9lE,IAAAA,cAACgrD,GAAS,MACT6e,GACA8B,GACAiJ,KAIZzQ,IACGnkE,IAAAA,cAACs3E,GAAAA,GAAe,CACZpD,eAAgBA,GAChB9hE,UAAWA,EACX0T,cAAeA,MAK9B2kC,GAAgB2rB,IACbp2E,IAAAA,cAACwvD,GAAyB,MAE9BxvD,IAAAA,cAAC+N,GAAM,CACHs8C,UAAWA,GACXC,WAAYA,GACZC,YAAaA,GACbn4C,UAAWA,EACXuX,OAAQA,EACR6gC,uBAAwBikB,GACxBhkB,aAAcA,IAEjBA,GACGzqD,IAAAA,cAAC0nD,GAAc,CACXM,OAAQymB,GACRvmB,SAAU+lB,KAGf,EAEbrM,GAAAv5D,UAAA,CArwBE8J,SAAQrM,IAAAA,OAAAC,WACRqM,UAAStM,IAAAA,OAAAC,WACT4jB,OAAM7jB,IAAAA,OAAAC,WACN+7D,aAAYh8D,IAAAA,KACZzB,YAAWyB,IAAAA,OACX2kD,aAAY3kD,IAAAA,KAMZi8D,WAAUj8D,IAAAA,OAKVwmB,YAAWxmB,IAAAA,MAuvBf,W,+MMz0BaqpD,EAAgBtN,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,iBAAbq7C,CAAa,mqBAkDpC01B,EAAsF,CACxFC,KAAMC,EAAAA,eACNC,OAAQC,EAAAA,iBACRC,KAAMC,EAAAA,gBACNC,OAAQC,EAAAA,+BACRC,KAAMC,EAAAA,aACNC,QAASC,EAAAA,iBACTC,MAAOC,EAAAA,oBACPC,GAAIC,EAAAA,uBACJC,GAAIC,EAAAA,wBAGFC,GAA0FxhB,EAAAA,EAAAA,gBAAe,CAC3GsgB,KAAM,CAACzgF,GAAI,4BAA6B0S,eAAgB,QACxDiuE,OAAQ,CAAC3gF,GAAI,8BAA+B0S,eAAgB,UAC5DmuE,KAAM,CAAC7gF,GAAI,4BAA6B0S,eAAgB,QACxDquE,OAAQ,CAAC/gF,GAAI,8BAA+B0S,eAAgB,kBAC5DuuE,KAAM,CAACjhF,GAAI,4BAA6B0S,eAAgB,QACxDyuE,QAAS,CAACnhF,GAAI,+BAAgC0S,eAAgB,WAC9D2uE,MAAO,CAACrhF,GAAI,6BAA8B0S,eAAgB,SAC1D6uE,GAAI,CAACvhF,GAAI,qCAAsC0S,eAAgB,iBAC/D+uE,GAAI,CAACzhF,GAAI,qCAAsC0S,eAAgB,mBAG7DkvE,EAA2G,CAC7GnB,KAAM1hB,EAAAA,EAAmB8iB,gBACzBlB,OAAQ5hB,EAAAA,EAAmB+iB,kBAC3BjB,KAAM9hB,EAAAA,EAAmBgjB,gBACzBhB,OAAQhiB,EAAAA,EAAmBijB,kBAC3Bf,KAAMliB,EAAAA,EAAmBkjB,gBACzBd,QAASpiB,EAAAA,EAAmBmjB,cAC5Bb,MAAOtiB,EAAAA,EAAmBojB,iBAC1BZ,GAAIxiB,EAAAA,EAAmBqjB,cACvBX,GAAI1iB,EAAAA,EAAmBsjB,eAGrBlqB,EAAkBxvD,IAKpB,MAAM,KAAC+uD,EAAI,QAAEn/C,GAA0B5P,EAAd25E,E,qWAAUx5B,CAAIngD,EAAKogD,GAGtCiC,EAAOw1B,EAA0B9oB,IACjC,cAACjlD,IAAiBgQ,EAAAA,EAAAA,WAElBm8C,EAAkBnsD,EADIkvE,EAAgCjqB,IAGtD6R,EACFtgE,IAAAA,cAACmvD,EAAa/uD,OAAAC,OAAA,CACVnF,KAAK,SACLnE,GAAI2I,EAAM3I,IAAM,qBAAJ4J,OAAyB8tD,GACrCn/C,QAASA,EACT,aAAYqmD,GACR0jB,GAEJr5E,IAAAA,cAAC+hD,EAAI,CACDsN,MAAO,eACPvuD,KAAM,MAMZw0D,EAAWqjB,EAAwClqB,GAEzD,OACIzuD,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAC61D,EAAAA,EAAwB,CACrBP,SAAUA,EACVU,kBAAkB,EAClBC,iBAAiB,KAIxBqK,EACS,EAEpBpR,EAAA7mD,UAAA,CAvFEtR,GAAE+O,IAAAA,OAEFwJ,QAAOxJ,IAAAA,KACP7F,UAAS6F,IAAAA,OACTuB,SAAQvB,IAAAA,MAqFZ,SAAeypD,EAAAA,EAAAA,MAAKL,E,mKCzIpB,SAASoqB,EAAcnhF,GAQb,IARc,UACpBohF,EAAS,SACTC,EAAQ,gBACRC,EAAe,SACfhO,EAAQ,wBACRiO,EAAuB,SACvBC,EAAQ,aACRC,GACIzhF,EACJ,MAAMoR,GAAOiQ,EAAAA,EAAAA,WAEb,OACIxZ,IAAAA,cAAA,OAAKC,UAAU,2BACV05E,GACG35E,IAAAA,cAAC65E,EAAAA,EAAa,CACV/4E,KAAK,KACL64E,SAAUA,IAGjBD,GACG15E,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO3E,EAAKC,cAAc,CACtBzS,GAAI,iDACJ0S,eAAgB,2CAGpBzJ,IAAAA,cAAA,QAAMC,UAAU,iCAGvB25E,GACG55E,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,iCAAkC,CAACqiC,cAC1Dx5E,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO3E,EAAKC,cAAc,CACtBzS,GAAI,gDACJ0S,eAAgB,uCAGpBzJ,IAAAA,cAAA,QAAMC,UAAU,qCAEjB05E,GACC35E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,wCACJ0S,eAAgB,6BAK/B+vE,GACGx5E,IAAAA,cAAA,OAAKC,UAAU,uBACTw5E,GAAmBr5E,OAAOoI,OAAOixE,GAAiBttC,UAAS,GAASnsC,IAAAA,cAAC85E,EAAAA,EAAkB,CAACL,gBAAiBA,IAAqBz5E,IAAAA,cAAC+5E,EAAAA,EAAa,OAGrJR,GACGv5E,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO3E,EAAKC,cAAc,CACtBzS,GAAI,uBACJ0S,eAAgB,qBACjB,CAACkwE,cAEJ35E,IAAAA,cAAA,UACIC,UAAU,4BACVqP,QAASm8D,GAETzrE,IAAAA,cAAA,QAAM,cAAY,QAAQ,KAC1BA,IAAAA,cAAA,QAAMC,UAAU,WACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,uBACJ0S,eAAgB,oBAChBjB,OAAQ,CAACmxE,iBAQzC,CAACL,EAAAjxE,UAAA,CArFGkxE,UAASzzE,IAAAA,KAAAC,WACTyzE,SAAQ1zE,IAAAA,KAAAC,WACR0zE,gBAAe3zE,IAAAA,SAAAA,IAAAA,MACf2lE,SAAQ3lE,IAAAA,MAoFZ,SAAeypD,EAAAA,EAAAA,MAAK+pB,E,mOC/EpB,MAAM5pB,EAAc,CAChBC,EAAAA,GAAAA,GACAA,EAAAA,GAAAA,IAGG,SAASqqB,EAAc7hF,GAAmC,IAAlC,UAACia,EAAS,aAAE6nE,GAAoB9hF,EAC3D,MAAMyL,GAAUmzC,EAAAA,EAAAA,cAAaz+C,IAAuB4sB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,KAChE8nE,EAAWt2E,GAAWA,EAAQ1I,OAAS0rC,EAAAA,GAAQzW,YAAaE,EAAAA,EAAAA,IAAyBzsB,GAAW,GAChGu2E,GAASpjC,EAAAA,EAAAA,cAAaz+C,IAAuB4hC,EAAAA,EAAAA,IAAQ5hC,EAAO4hF,KAC5DE,GAAarjC,EAAAA,EAAAA,cAAaz+C,IAAuB+hF,EAAAA,EAAAA,IAAqB/hF,EAAO6hF,KAE7EG,GAAa3gE,EAAAA,EAAAA,UAAQ,IAClBwgE,EAKDn6E,IAAAA,cAACkiD,EAAAA,GAAS,CACNuB,OAAQiM,EACRrN,aAAc83B,EAAO70B,SACrBhD,QAAS,CACLC,KAAM,UACNC,OAAQ,WAEZh/C,MAAOy2E,IAXJ,MAcZ,CAACE,EAAQF,IAEZ,OAAKr2E,GAA4B,MAAjBA,EAAQ1I,KAKpB8E,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+CACH0S,eAAe,gCACfjB,OAAQ,CACJ8xE,aACAF,iBAVL,IAef,CAACJ,EAAA3xE,UAAA,CAjDG+J,UAAStM,IAAAA,OAAAC,WACTk0E,aAAYn0E,IAAAA,WAAA8X,O,0BCOD,SAASo2C,EAA4B77D,GAAuD,IAAtD,UAACia,EAAS,SAAExF,EAAQ,UAAEqnD,EAAS,YAAEsmB,GAAmBpiF,EACrG,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,YACjBjP,EAAciwE,IAAmBjhE,EAAAA,EAAAA,YAClC8oC,GAAetL,EAAAA,EAAAA,aAAYoO,EAAAA,IAC3BtnC,EAAM48D,MAASC,GAAGr4B,GAClBv8B,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5BlkB,GAAWsxD,EAAAA,EAAAA,gBACVgzB,EAAkBC,IAAuBrhE,EAAAA,EAAAA,WAAiB,IACzDghE,GAIG18D,EAAI0b,IAAI,EAAG,QAAQ64B,IAAI,CAAC7P,KAAM,EAAGC,OAAQ,EAAG6P,OAAQ,EAAGC,YAAa,MAGzEuoB,GAAoBlhE,EAAAA,EAAAA,UAAQ,KAAMmhE,EAAAA,EAAAA,IAA6Bz4B,IAAe,CAACA,IAE/E04B,GAAkBthE,EAAAA,EAAAA,cAAYljB,UAChC,MAAM0jF,EAAe12B,EAASoP,UACxBv/C,QAAiB6gD,EAAUgmB,GAEjC5jF,GACIo6B,EAAAA,EAAAA,IACI3K,EACA,CAAC,CACGrH,QAASqH,EACTsK,SAAUogC,EAAAA,GAAeC,gBACzBtwD,KAAMqwD,EAAAA,GAAeE,0BACrBltD,MAAO4U,KAAK4iE,UAAU,CAACn8D,UAAW47D,MAASC,GAAGr4B,GAAcsQ,UAAWn0C,UAAWy7D,QAK1F7mE,EAAS1c,MACT8jF,EAAgBpnE,EAAS1c,OAEzBkW,GACJ,GACD,CAACqnD,EAAWrnD,IAETquE,GAAathE,EAAAA,EAAAA,UAAQ,IAEnB3Z,IAAAA,cAACg6E,EAAc,CACX5nE,UAAWA,EACX6nE,aAAcU,aAAgB,EAAhBA,EAAkBO,YAGzC,CAAC9oE,EAAWuoE,IAET/4E,EAAQ4H,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,qBAEpF0xE,GAAqBpkC,EAAAA,EAAAA,aAAYqkC,EAAAA,IAAkB,OAAIpgF,EAE7D,OACIgF,IAAAA,cAACq7E,EAAAA,EAAmB,CAChBp7E,UAAU,mCACVs6E,YAAaI,EACbruE,OACItM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,qBAGvB6xE,WAAYT,EACZU,kBACIv7E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sDACH0S,eAAe,YAGvB+xE,iBACIx7E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qDACH0S,eAAe,WAGvB2Q,UAAWxY,EACXgL,SAAUA,EACVqnD,UAAW8mB,EACXp4E,SAAUi4E,EACVK,WAAYA,EACZQ,cAAc,EACdvzB,SAAUt7C,EACVrG,UAAWgE,EACX4wE,mBAAoBA,GAGhC,CAACnnB,EAAA3rD,UAAA,CA7FG+J,UAAStM,IAAAA,OAAAC,WACT6G,SAAQ9G,IAAAA,KAAAC,WACRkuD,UAASnuD,IAAAA,KAAAC,W,kOCKb,SAAS21E,EAA+BvjF,GAO9B,IAP+B,YACrCuqE,EAAW,+BACXiZ,EAA8B,gBAC9BlC,EAAe,QACfr6E,EAAO,UACP60D,EAAS,SACTrnD,GACIzU,EACAgK,EAAwB,GACxB+L,EAAyB,GACzB0tE,EAA8B,GAC9BC,EAAgBA,OAEpB,MAAMC,GAAkBniE,EAAAA,EAAAA,SAAQoiE,EAAAA,GAA2C,IACrEC,GAAgBjlC,EAAAA,EAAAA,aAAYklC,EAAAA,IAC5Bj2B,GAAWjP,EAAAA,EAAAA,aAAYmlC,EAAAA,IACvBlnE,GAAQ+hC,EAAAA,EAAAA,cAAaz+C,GAAuBwjF,EAAgBxjF,EAAO8G,KAoGzE,OAlGIsjE,IAAgBj9C,EAAAA,GAAU0K,YAC1B0rD,EAAgB5nB,EAChB/lD,EACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,mCAGvBtH,EACInC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4CACH0S,eAAe,iJACfjB,OAAQ,CACJw9C,WACAzlD,SAAUo7E,EACVrpE,EAAIuwC,GAAmB7iD,IAAAA,cAAA,SAAI6iD,MAIvC+4B,EACI57E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,UAGhBrJ,OAAOoI,OAAOixE,GAAiBttC,UAAS,IAC/ChqC,EACInC,IAAAA,cAAC85E,EAAAA,EAAkB,CAACL,gBAAiBA,IAEzCmC,EACI57E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gDACH0S,eAAe,YAGN,IAAVuL,GACP9G,EAAQlO,IAAAA,cAAC+5E,EAAAA,EAAa,MACtB53E,EACInC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2CACH0S,eAAe,6HAGvBmyE,EACI57E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uCACH0S,eAAe,YAGhBuL,EAAQmnE,OAAOH,IACtB9tE,EACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,wBAGvBtH,EACInC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4CACH0S,eAAe,gNACfjB,OAAQ,CACJ4xD,IAAK4hB,EACLhnE,QACA1C,EAAIuwC,GAAmB7iD,IAAAA,cAAA,SAAI6iD,MAIvC+4B,EACI57E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,aAIvBoyE,EAAgB5nB,EAChB/lD,EACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,mCAGvBtH,EACInC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2CACH0S,eAAe,oJACfjB,OAAQ,CACJw9C,cAIZ41B,EACI57E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,UAMvBzJ,IAAAA,cAACo8E,EAAAA,GAAY,CACTC,wBAAwB,EACxBtlF,GAAG,qCACHulF,0BAA0B,EAC1BC,eAAe,EACfhB,kBAAmBK,EACnB3hE,cAAc,EACdg0D,aAAcA,OACd4N,cAAeA,EACfW,oBAAqBX,EACrBY,eAAe,EACfC,gBAAiBxuE,EACjBtB,SAAUA,GAETzK,EAGb,CAACu5E,EAAArzE,UAAA,CA7IGoxE,gBAAe3zE,IAAAA,SAAAA,IAAAA,MAAAC,WAEf3G,QAAO0G,IAAAA,OAAAC,WACPkuD,UAASnuD,IAAAA,KAAAC,WACT6G,SAAQ9G,IAAAA,KAAAC,YA2IZ,SAAewpD,EAAAA,EAAAA,MAAKmsB,G,gKCxIpB,MAAMiB,EAAa96B,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,cAAbq7C,CAAa,4DAK1B+6B,EAAU/6B,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,WAAVq7C,CAAU,qFACXniD,GAAWA,EAAM2H,SAAW,UAAY,YAOjDw1E,EAAah7B,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,cAAVq7C,CAAU,iFAMvBi7B,EAAOj7B,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,QAAVq7C,CAAU,wBAIjBk7B,EAAcl7B,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,eAAVq7C,CAAU,yFAMxBm7B,EAAgBn7B,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,iBAAVq7C,CAAU,gDAM1Bo7B,EAAkBp7B,IAAOq7B,EAAAA,WAAUp7B,WAAA,CAAAt7C,YAAA,mBAAjBq7C,CAAiB,0DAMnCjoC,EAAOioC,IAAAA,GAASC,WAAA,CAAAt7C,YAAA,QAATq7C,CAAS,mLAetB,SAASs7B,EAAIhlF,GAKC,IALA,QACVmX,EAAO,UACP8K,EAAS,KACT5P,EAAI,WACJgwC,GACQriD,EACR,OACI6H,IAAAA,cAAC28E,EAAU,CACP,aAAYviE,EACZna,UAAU,cACVqP,QAASA,GAER9E,GAAQxK,IAAAA,cAAA,QAAMC,UAAU,0BAA0BuK,GAClDgwC,GACGx6C,IAAAA,cAACi9E,EAAe,CAACn8E,KAAM,KAIvC,CAEA,SAASs8E,EAAUx/E,GAQH,IARI,UAChBwc,EAAS,YACTla,EAAW,SACXmH,EAAQ,KACRtH,EAAI,QACJuP,EAAO,KACP9E,EAAI,QACJ6yE,GACUz/E,EACV,OACIoC,IAAAA,cAAC48E,EAAO,CACJttE,QAASjI,OAAWrM,EAAYsU,EAChCjI,SAAUA,EACVyF,KAAK,UAEL9M,IAAAA,cAAC68E,EAAU,KACN98E,EACDC,IAAAA,cAAC88E,EAAI,KACAtyE,GAELxK,IAAAA,cAACg9E,EAAa,KACVh9E,IAAAA,cAACs9E,EAAAA,EAAM,CACH,aAAYljE,EACZtZ,KAAK,SACLuG,SAAUA,EACVk2E,SAAUjuE,EACV+tE,QAASA,EACTG,gBAAgB,yBAI5Bx9E,IAAAA,cAAC+8E,EAAW,KACP78E,GAIjB,CAtCCi9E,EAAA90E,UAAA,CA1FG+R,UAAStU,IAAAA,OAAAC,WACTy0C,WAAU10C,IAAAA,KAAAC,WACVuJ,QAAOxJ,IAAAA,KAAAC,WACPyE,KAAI1E,IAAAA,KAAAC,YA6HPq3E,EAAA/0E,UAAA,CAzHG+R,UAAStU,IAAAA,OACT5F,YAAW4F,IAAAA,KAAAC,WACXsB,SAAQvB,IAAAA,KAAAC,WACRhG,KAAI+F,IAAAA,KAAAC,WACJuJ,QAAOxJ,IAAAA,KAAAC,WACPyE,KAAI1E,IAAAA,KAAAC,WACJs3E,QAAOv3E,IAAAA,KAAAC,YAqHX,MAAM03E,GAAWC,EAAAA,EAAAA,GAASP,GAI1B,IC3HMQ,EAAa97B,IAAO+7B,EAAAA,kBAAiB97B,WAAA,CAAAt7C,YAAA,cAAxBq7C,CAAwB,6CAIrCg8B,EAAgBh8B,IAAOi8B,EAAAA,wBAAuBh8B,WAAA,CAAAt7C,YAAA,iBAA9Bq7C,CAA8B,2CAI9Ck8B,EAAel8B,IAAOm8B,EAAAA,wBAAuBl8B,WAAA,CAAAt7C,YAAA,gBAA9Bq7C,CAA8B,sDAI7Co8B,EAAsBp8B,IAAOq8B,EAAAA,wBAAuBp8B,WAAA,CAAAt7C,YAAA,uBAA9Bq7C,CAA8B,sDAIpDs8B,EAA8Bt8B,IAAOu8B,EAAAA,qBAAoBt8B,WAAA,CAAAt7C,YAAA,+BAA3Bq7C,CAA2B,sDAIzD30C,EAAS20C,IAAAA,GAASC,WAAA,CAAAt7C,YAAA,UAATq7C,CAAS,wLAalB9zC,EAAS8zC,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,UAAVq7C,CAAU,0KAUnBw8B,EAASx8B,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,UAAVq7C,CAAU,iSAgBzB,SAASy8B,EAAkBnmF,GAIjB,IAJkB,QACxBomF,EAAO,QACPC,EAAO,SACP7hB,GACIxkE,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,YACjBmgE,EAAU8E,IAAellE,EAAAA,EAAAA,WAA0BojD,aAAQ,EAARA,EAAUgd,WAAY,KACzEC,EAAc8E,IAAmBnlE,EAAAA,EAAAA,WAAkBojD,aAAQ,EAARA,EAAUgiB,iBAAiB,IAC9EjF,EAAyBkF,IAA8BrlE,EAAAA,EAAAA,WAAkBojD,aAAQ,EAARA,EAAUkiB,4BAA4B,GAEhHC,GAA8B/nC,EAAAA,EAAAA,aAAYgoC,EAAAA,IAC1CC,GAAiCjoC,EAAAA,EAAAA,aAAYkoC,EAAAA,KAAqCH,EAClF94B,GAAWjP,EAAAA,EAAAA,aAAYmlC,EAAAA,IAEvBgD,GAAuBzlE,EAAAA,EAAAA,cAAave,GAAyBiE,IAC/DA,EAAEy0D,kBACFz0D,EAAEyK,iBAEF60E,EAAYvjF,GAAQ,IAEf4jF,EAOM5jF,IAASikF,EAAAA,EAAaC,QAC7BR,GAA2B,IAP3BL,EAAQ,CACJ5E,SAAUz+E,GAAQ,GAClByjF,eAAe,EACfE,0BAA0B,IAE9BL,IAGJ,GACD,CAACD,EAASC,EAASM,IAEhBO,GAAY5lE,EAAAA,EAAAA,cAAY,KAC1BilE,GAAiB9E,EAAa,GAC/B,CAACA,IAEE0F,GAAgC7lE,EAAAA,EAAAA,cAAY,KAC9CmlE,GAA4BlF,EAAwB,GACrD,CAACA,IAWJ,OACI15E,IAAAA,cAACq+E,EAAM,CAACp+E,UAAU,sBACdD,IAAAA,cAACkN,EAAM,CAACjN,UAAU,eACbuJ,EAAc,CACXzS,GAAI,8BACJ0S,eAAgB,sBAGxBzJ,IAAAA,cAAA,OAAK8M,KAAK,eACN9M,IAAAA,cAAC4Z,EAAI,CAAC3Z,UAAU,QACZD,IAAAA,cAACu/E,EAAAA,EAAS,KACNv/E,IAAAA,cAACy9E,EAAQ,CACL1mF,GAAG,8BACHuY,QAAS4vE,IACT1kC,YAAam/B,EACb55E,KAAMC,IAAAA,cAAC+9E,EAAY,CAACj9E,KAAM,KAC1B0J,KAAMhB,EAAc,CAChBzS,GAAI,kCACJ0S,eAAgB,eAGxBzJ,IAAAA,cAACy9E,EAAQ,CACL1mF,GAAG,+BACHuY,QAAS4vE,EAAqBC,EAAAA,EAAaK,WAC3ChlC,WAAYm/B,IAAawF,EAAAA,EAAaK,UACtCz/E,KAAMC,IAAAA,cAAC69E,EAAa,CAAC/8E,KAAM,KAC3B0J,KAAMhB,EAAc,CAChBzS,GAAI,mCACJ0S,eAAgB,gBAGxBzJ,IAAAA,cAACy9E,EAAQ,CACL1mF,GAAG,4BACHuY,QAAS4vE,EAAqBC,EAAAA,EAAaC,QAC3C5kC,WAAYm/B,IAAawF,EAAAA,EAAaC,OACtCr/E,KAAMC,IAAAA,cAAC29E,EAAU,CAAC78E,KAAM,KACxB0J,KAAMhB,EAAc,CAChBzS,GAAI,gCACJ0S,eAAgB,eAI1Bq1E,GAA+BE,IAC7Bh/E,IAAAA,cAACu/E,EAAAA,EAAS,KACLT,GACG9+E,IAAAA,cAACo9E,EAAU,CACP/1E,UAAU,EACViI,QAAS+vE,EACThC,QAASzD,EACT75E,KAAMC,IAAAA,cAACi+E,EAAmB,CAACn9E,KAAM,KACjC0J,KAAMhB,EAAc,CAChBzS,GAAI,mCACJ0S,eAAgB,4BAEpBvJ,YAAasJ,EAAc,CACvBzS,GAAI,0CACJ0S,eAAgB,8DAI3BkwE,IAAawF,EAAAA,EAAaC,QAAUJ,GACjCh/E,IAAAA,cAACo9E,EAAU,CACP/1E,SAAUsyE,IAAawF,EAAAA,EAAaC,OACpC9vE,QAASgwE,EACTjC,QAAS3D,EACT35E,KAAMC,IAAAA,cAACm+E,EAA2B,CAACr9E,KAAM,KACzC0J,KAAMhB,EAAc,CAChBzS,GAAI,8CACJ0S,eAAgB,kCAEpBvJ,YAAasJ,EACT,CACIzS,GAAI,qDACJ0S,eAAgB,mIACjB,CACCu8C,kBAS/B84B,GACG9+E,IAAAA,cAAC+N,EAAM,KACH/N,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,6BACVqP,QAASkvE,GAETx+E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,8BACJ0S,eAAgB,YAGxBzJ,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,4BACVqP,QA5GAmwE,KAChBlB,EAAQ,CACJ5E,WACAgF,cAAe/E,EACfiF,yBAA0BnF,IAE9B8E,GAAS,GAwGOx+E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,6BACJ0S,eAAgB,YAO5C,CAAC60E,EAAAj2E,UAAA,CA9NGm2E,QAAO14E,IAAAA,KAAAC,WACPw4E,QAAOz4E,IAAAA,KAAAC,YA+NX,UAAewpD,EAAAA,EAAAA,MAAK+uB,GCjNpB,SAASoB,GAAyBvnF,GAKxB,IALyB,SAC/BkP,EAAQ,SACRs1D,EAAQ,QACR4hB,EAAO,QACPC,GACIrmF,EACJ,MAAOwnF,EAAYC,IAAiBrmE,EAAAA,EAAAA,WAAS,IACvC,cAAC/P,IAAiBgQ,EAAAA,EAAAA,WAElBmiB,GAAcliB,EAAAA,EAAAA,cAAY,KAC5BmmE,GAAc,GACdpB,GAAS,GACV,CAACA,KAGA7kD,EAAGkmD,EACH5+B,EAAG6+B,EACH7yB,SAAU8yB,EACVjwE,QAASkwE,EACT7yB,MACIC,aAAc6yB,EACd5yB,YAAa6yB,KAEjB5yB,EAAAA,EAAAA,IAAY,CACZ37C,KAAMguE,EACNpyB,aAAcqyB,EACdpyB,UAAW,YACX2yB,qBAAsBC,EAAAA,GACtB3yB,WAAY,EACRC,EAAAA,EAAAA,IAAO,CAACC,SAAU,KAClB0yB,EAAAA,EAAAA,IAAK,CACDC,mBAAoB,CAAC,UAEzBC,EAAAA,EAAAA,IAAM,CACFC,QAAS,SAMjBxyB,iBAAkByyB,EAClB3yB,kBAAmB4yB,IACnBxyB,EAAAA,EAAAA,IAAgB,EAChBL,EAAAA,EAAAA,IAASmyB,IACT5xB,EAAAA,EAAAA,IAAW4xB,IACXW,EAAAA,EAAAA,IAAQX,KAGNY,EAAkBp3E,EAAc,CAACzS,GAAI,8CAA+C0S,eAAgB,qBAE1G,OACIzJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO0yE,GAEP5gF,IAAAA,cAACmvD,EAAAA,EAAa/uD,OAAAC,OAAA,CACVtJ,GAAG,kBACH6jD,IAAKqlC,EACLhgF,UAAWk3C,IAAW,CAAC0pC,SAAS,EAAMtrE,OAAQoqE,IAC9Ct4E,SAAUA,EACVnM,KAAK,SACL,aAAY0lF,GACRF,KAEJ1gF,IAAAA,cAAC89E,EAAAA,uBAAsB,CACnBh9E,KAAM,GACNuuD,MAAM,mBAIlBrvD,IAAAA,cAAC8gF,EAAAA,GAAc,CAAC/pF,GAAG,eACd4oF,GACG3/E,IAAAA,cAAC+gF,EAAAA,GAAoB,CACjBjxE,QAASkwE,EACTgB,OAAO,EACPC,aAAa,EACbC,cAAe,GAEflhF,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKslC,EACL9yE,MAAO,CACHiB,MAAO,cACPw4C,SAAUk5B,EACVz4B,IAAKw4B,QAAAA,EAAW,EAChB9wB,KAAM6wB,QAAAA,EAAW,EACjBp+E,OAAQ,IAERg/E,KAEJzgF,IAAAA,cAACs+E,GAAkB,CACf3hB,SAAUA,EACV4hB,QAASA,EACTC,QAAS7iD,OAQzC,CAAC+jD,GAAAr3E,UAAA,CA1GGhB,SAAQvB,IAAAA,KAAAC,WAERw4E,QAAOz4E,IAAAA,KAAAC,WACPy4E,QAAO14E,IAAAA,KAAAC,YAyGX,UAAewpD,EAAAA,EAAAA,MAAKmwB,I,8+BC9GpB,MA8IA,GA9IoB3R,CAChB1hD,EACA06C,EACAgC,EACAgD,KACC,IAAAoV,EAAAC,EACD,MAAM/qF,GAAWsxD,EAAAA,EAAAA,eACXnxC,EAAS6V,EAAM7V,OACfpE,EAAYia,EAAMja,UAElBivE,GAAwBtqC,EAAAA,EAAAA,aAAYuqC,EAAAA,IACpC5e,GAAc3rB,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAAipF,EAAA,OAAiC,QAA5BA,GAAAr8D,EAAAA,EAAAA,GAAW5sB,EAAO8Z,UAAU,IAAAmvE,OAAA,EAA5BA,EAA8BrmF,OAAQ,GAAG,IAC3FsmF,GAA0BzqC,EAAAA,EAAAA,cAAaz+C,IAAuB,IAAAmpF,EAChE,MAAM79E,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,OAAiD,QAA1CqvE,GAAAvnD,EAAAA,EAAAA,IAAQ5hC,GAAOsL,aAAO,EAAPA,EAAS0gD,cAAe,WAAG,IAAAm9B,OAAA,EAA1CA,EAA4ClhF,WAAY,EAAE,IAG/DmhF,EAAiBL,IACT,QAD8BF,EAC5C90D,EAAMK,gBAAQ,IAAAy0D,OAAA,EAAdA,EAAgBxH,YAEZttD,EAAMK,SAASitD,SAASA,UACxBttD,EAAMK,SAASitD,SAASgF,eAGtBlF,GAAkB9/D,EAAAA,EAAAA,UAAQ,KACrBgoE,EAAAA,EAAAA,IAAsBt1D,EAAMjtB,UACpC,CAACitB,EAAMjtB,UAEJwiF,GAAqBjoE,EAAAA,EAAAA,UAAQ,IACxBvZ,OAAOoI,OAAOixE,GAAiBttC,UAAS,IAChD,CAACstC,IAEE7L,GAAiCj0D,EAAAA,EAAAA,UAAQ,KAC3C,IAAK+nE,EACD,OAAO,EAGX,MAAM,SAAC/H,EAAUkF,yBAA0BnF,GAA2BrtD,EAAMK,SAAUitD,SACtF,OAAIA,IAAawF,EAAAA,EAAaC,SAAW1F,IAIrChX,IAAgBj9C,EAAAA,GAAU0K,aAI1ByxD,IAIaC,EAAAA,EAAAA,IAAmCx1D,EAAMjtB,SAE1CgK,OAAS,EAAC,GAC3B,CAACs4E,EAAgBr1D,EAAOq2C,EAAakf,IAElCE,GAA0BroE,EAAAA,EAAAA,cAAakjD,IACzC,MAAMmO,EAAYh0E,GAAA,GACXu1B,GAGHswC,SAAAA,EAAUgd,UAAYhd,SAAAA,EAAUgiB,cAChC7T,EAAap+C,SAAW,CACpBitD,SAAQ7iF,GAAAA,GAAA,GACD6lE,GAAQ,IACXgd,SAAUhd,EAAUgd,UAAY,GAChCgF,cAAehiB,EAAUgiB,iBAIjC7T,EAAap+C,SAAW,CAAC,EAG7Bq6C,EAAkB+D,EAAc,CAAC7D,SAAS,IAC1C8B,GAAc,GACf,CAACA,EAAc18C,EAAO06C,IAEnBgb,GAAyBtoE,EAAAA,EAAAA,cAAY,KACvCsvD,GAAa,EAAK,GACnB,CAACA,IAEEiZ,GAAuBvoE,EAAAA,EAAAA,cAAY,KACrCqoE,GAAyB,GAC1B,CAACA,IAEEG,GAA+BxoE,EAAAA,EAAAA,cAAY,CAACra,EAAiBq6E,EAA2C/W,EAA8BzO,KACxI59D,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBmvE,mCAC1BjvE,WAAYyoE,EACZxoE,YAAa,CACTyoE,+BAAgC6F,EAChC/H,kBACA/W,cACAtjE,UACA60D,eAEL,GACJ,CAACutB,EAAyBnrF,IAEvBw3E,GAAgBp0D,EAAAA,EAAAA,cAAaw6C,IAA0B,IAAAkuB,EACzD,SACId,KACAe,EAAAA,EAAAA,IAAoC/1D,SAAe,QAAV81D,EAAL91D,EAAOK,gBAAQ,IAAAy1D,OAAV,EAALA,EAAiBxI,YAErDsI,EAA6B51D,EAAMjtB,QAASq6E,EAAiB/W,EAAazO,GACnE,GAEC,GACb,CAACotB,EAAuBY,EAA8B51D,EAAOq2C,EAAa+W,IA2B7E,MAAO,CACH7nB,QA1BWj4C,EAAAA,EAAAA,UAAQ,SAAA0oE,EAAAC,EAAAC,EAAA,OAClBb,IAAmBlrE,EAChBxW,IAAAA,cAACs5E,GAAAA,EAAc,CACXC,WAAYxN,EACZyN,UAAW5L,EACX6L,gBAAiBA,EACjBhO,SAAUuW,EACVtI,wBAAkD,QAA3B2I,EAAEh2D,EAAOK,SAAUitD,gBAAQ,IAAA0I,OAAA,EAAzBA,EAA2BxD,yBACpDlF,SAAmC,QAA3B2I,EAAEj2D,EAAOK,SAAUitD,gBAAQ,IAAA2I,OAAA,EAAzBA,EAA2B3I,SACrCC,aAAuC,QAA3B2I,EAAEl2D,EAAOK,SAAUitD,gBAAQ,IAAA4I,OAAA,EAAzBA,EAA2B5D,qBAE7C3jF,CAAS,GACd,CAAC0mF,EAAgBlrE,EAAQu1D,EAAmB6B,EAAgC6L,EAAiBuI,EAAsB31D,IAelHqhD,mBAbsB/zD,EAAAA,EAAAA,UAAQ,SAAA6oE,EAAA,OAC7BhsE,GAAU6qE,GACPrhF,IAAAA,cAAC0/E,GAAyB,CACtBhiF,IAAI,2BACJi/D,SAAwB,QAAhB6lB,EAAEn2D,EAAMK,gBAAQ,IAAA81D,OAAA,EAAdA,EAAgB7I,SAC1B4E,QAASuD,EACTtD,QAASuD,EACT16E,SAAU0kE,GAEjB,GAAE,CAACv1D,EAAQ6qE,EAAqC,QAAhBD,EAAE/0D,EAAMK,gBAAQ,IAAA00D,OAAA,EAAdA,EAAgBzH,SAAUmI,EAAyBC,EAAwBhW,IAK9G6B,iCACAC,gBACH,C,wVCtJU,MAAM4U,UAA2BziF,IAAAA,cAC5C2F,MAAAA,GACI,MAAM,SAAC0X,EAAQ,qBAAEqlE,EAAoB,kBAAEC,GAAqBjgF,KAAKhD,MAEjE,IAAIkjF,EAAoC,GACpCC,EAAkC,GACtC,GAAIxlE,EAAS8uB,SAAS,SAAW9uB,EAAS8uB,SAAS,aAAe9uB,EAAS8uB,SAAS,SAOhF,GANA02C,EACI7iF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,oDAGnBi5E,EAAuB,EAAG,CAC1B,MAAMtjF,EAA8B,IAApBie,EAASjU,QAAgC,UAAhBiU,EAAS,GAAiBE,EAASulE,gBAAkBvlE,EAASwlE,eACvGH,EACI5iF,IAAAA,cAACgK,EAAAA,iBAAgB5J,OAAAC,OAAA,GACTjB,EAAO,CACXoJ,OAAQ,CACJw6E,aAAcL,EACdM,UAAWP,EACXpwE,EAAIuwC,GAAmB7iD,IAAAA,cAAA,SAAI6iD,MAI3C,KAAO,CACH,MAAMzjD,EAA8B,IAApBie,EAASjU,QAAgC,UAAhBiU,EAAS,GAAiBE,EAAS2lE,OAAS3lE,EAAS4lE,MAC9FP,EACI5iF,IAAAA,cAACgK,EAAAA,iBAAgB5J,OAAAC,OAAA,GACTjB,EAAO,CACXoJ,OAAQ,CACJw6E,aAAcL,EACdrwE,EAAIuwC,GAAmB7iD,IAAAA,cAAA,SAAI6iD,MAI3C,MACOxlC,EAASjU,OAAS,IACzBy5E,EACI7iF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,4CAMfm5E,EAFgB,IAApBvlE,EAASjU,OACLs5E,EAAuB,EAEnB1iF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uCACH0S,eAAe,gOACfjB,OAAQ,CACJ46E,QAAS/lE,EAAS,GAClB2lE,aAAcL,EACdM,UAAWP,EACXpwE,EAAIuwC,GAAmB7iD,IAAAA,cAAA,SAAI6iD,MAMnC7iD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,4IACfjB,OAAQ,CACJ46E,QAAS/lE,EAAS,GAClB2lE,aAAcL,EACdrwE,EAAIuwC,GAAmB7iD,IAAAA,cAAA,SAAI6iD,MAKpC6/B,EAAuB,EAE1B1iF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,2PACfjB,OAAQ,CACJ6U,SAAUA,EAASvL,MAAM,GAAI,GAAG63C,KAAK,MACrC05B,aAAchmE,EAASA,EAASjU,OAAS,GACzC45E,aAAcL,EACdM,UAAWP,EACXpwE,EAAIuwC,GAAmB7iD,IAAAA,cAAA,SAAI6iD,MAMnC7iD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,uKACfjB,OAAQ,CACJ6U,SAAUA,EAASvL,MAAM,GAAI,GAAG63C,KAAK,MACrC05B,aAAchmE,EAASA,EAASjU,OAAS,GACzC45E,aAAcL,EACdrwE,EAAIuwC,GAAmB7iD,IAAAA,cAAA,SAAI6iD,OAO/C,MAAMygC,EACFtjF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,YAIvB,OACIzJ,IAAAA,cAACujF,EAAAA,EAAiB,CACdr1E,MAAO20E,EACPzjF,QAASwjF,EACTrH,kBAAmB+H,EACnBrvB,UAAWvxD,KAAKhD,MAAMu0D,UACtBrnD,SAAUlK,KAAKhD,MAAMkN,UAGjC,E,EAtHiB61E,E,EAAkB,Y,EAAA,CAPnCplE,SAAQvX,IAAAA,QAAAA,IAAAA,QAAAC,WACR48E,kBAAiB78E,IAAAA,OAAAC,WACjB28E,qBAAoB58E,IAAAA,OAAAC,WACpBkuD,UAASnuD,IAAAA,KAAAC,WACT6G,SAAQ9G,IAAAA,KAAAC,a,8XA4HZ,MAAMwX,GAAW25C,EAAAA,EAAAA,gBAAe,CAC5BisB,MAAO,CACHpsF,GAAI,qBACJ0S,eAAgB,kJAEpBs5E,eAAgB,CACZhsF,GAAI,6BACJ0S,eAAgB,sOAEpBy5E,OAAQ,CACJnsF,GAAI,uBACJ0S,eAAgB,+IAEpBq5E,gBAAiB,CACb/rF,GAAI,+BACJ0S,eAAgB,qO,eC7IxB,MAAM+5E,EAAmBrrF,IAEZ,IAFa,SACtByU,GACIzU,EACJ,MAAO0T,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,GAE3B5O,GAAa8O,EAAAA,EAAAA,cAAY,IAAMH,GAAQ,IAAQ,IAErD,OACItZ,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,cAChBb,KAAMA,EACNc,OAAQhC,EACRiC,SAAUA,EACVE,KAAK,OACL,kBAAgB,wBAChB,cAAY,oBAEZ9M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,yBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wBACH0S,eAAe,kCAI3BzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,wEAI3BzJ,IAAAA,cAACyM,EAAAA,MAAMsB,OAAM,KACT/N,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,kBACVmH,WAAW,EACXkI,QAAS3E,EACT,cAAY,4BAEZ3K,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mBACH0S,eAAe,WAIvB,EAEd+5E,EAAAn7E,UAAA,CAvDEuE,SAAQ9G,IAAAA,KAAAC,YAyDZ,SAAewpD,EAAAA,EAAAA,MAAKi0B,G,8jCCVpB,MAuVA,EAvVkBxV,CACd3hD,EACAg+B,EACAj4C,EACAuX,EACA4gC,EACAib,EACAuD,EACAnD,EACAG,EACAgB,EACA+G,EACA2V,EACAn3D,EACAo3D,EACAj5B,KAKA,MAAMk5B,ECnDQC,EACdxxE,EACAhT,KAEA,MAAM/I,GAAWsxD,EAAAA,EAAAA,eAEXttD,GAAS08C,EAAAA,EAAAA,cAAaz+C,IACxB,MAAMsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,OAAOxO,aAAO,EAAPA,EAAS4W,WAAWC,EAAAA,EAAAA,IAAiBniB,EAAM,IAGhDurF,GAA0B9sC,EAAAA,EAAAA,cAAaz+C,IACzC,MAAMsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,IAAKxO,EACD,OAAO,EAEX,MAAMspB,GAAUC,EAAAA,EAAAA,IAAW70B,GAE3B,MAD8C,UAAxB40B,aAAO,EAAPA,EAASG,aAAiD,UAAxBH,aAAO,EAAPA,EAASI,cACzCV,EAAAA,EAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,GAAI81B,EAAAA,GAAYU,mBAAmB,IAGhHu2D,GAA4B/sC,EAAAA,EAAAA,cAAaz+C,IAC3C,MAAMsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,QAAKxO,IAGE6pB,EAAAA,EAAAA,IAAsBn1B,KAAUs0B,EAAAA,EAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,GAAI81B,EAAAA,GAAYU,mBAAmB,IAG/HG,GAA2BqpB,EAAAA,EAAAA,cAAaz+C,IAC1C,MAAMsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,OAAKxO,IAGEigF,GAA2BC,IAA4Bn2D,EAAAA,EAAAA,IAAyCr1B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,IAF5H,IAEsI,IAG/IgtF,GAA6BhtC,EAAAA,EAAAA,cAAaz+C,IAAuB0rF,EAAAA,EAAAA,IAAiC1rF,EAAO8Z,KAEzGuxE,GAAmBlqE,EAAAA,EAAAA,cAAara,IAClC,IAAIujF,EAAoB,EACpBD,EAAuB,EACvBrlE,EAAqB,GACzB,GAAIwmE,GAA2BC,EAA2B,CACtD,MAAMG,GAAgBr2D,EAAAA,EAAAA,IAAsBxuB,EAASsuB,GACjDu2D,EAAc76E,OAAS,IACvB66E,EACIv7E,SAASilC,IACL,GAAIA,EAAMv9B,SAAW8zE,EAAAA,GAAYC,OAASN,EACtC,OAEJ,GAAIl2C,EAAMv9B,SAAW8zE,EAAAA,GAAYE,SAAWN,EACxC,OAEJ,MAAMO,EAAcN,EAA2Bp2C,EAAM52C,IACjDstF,GAAeA,EAAYC,qBAAuB7+D,EAAAA,GAAU8+D,oBAAsBF,EAAYC,qBAAuB3B,IACrHA,EAAoB0B,EAAYC,qBAChC5B,EAAuB2B,EAAYG,gCAEvCnnE,EAASrL,KAAK,IAADrR,OAAKgtC,EAAMxtC,MAAO,IAEvCkd,EAAW,IAAI,IAAIic,IAAIjc,IAE/B,CACA,MAAO,CAACA,WAAUslE,oBAAmBD,uBAAqB,GAC3D,CAACqB,EAA4Br2D,EAA0Bo2D,EAA2BD,IAerF,OAZAz+B,EAAAA,EAAAA,YAAU,KACN,GAAIy+B,GAA2BC,EAA2B,CACtD,MAAMzmE,GAAWwkE,EAAAA,EAAAA,IAAmCziF,GAE5B,IAApBie,EAASjU,OACT/S,GAASo8B,EAAAA,EAAAA,GAAmCpV,EAAS,GAAIhjB,EAAQ+X,IAC1DiL,EAASjU,OAAS,GACzB/S,GAAS2sC,EAAAA,EAAAA,IAA8B5wB,GAE/C,IACD,CAACA,IAEGuxE,CAAgB,ED7BEC,CAAUxxE,EAAWia,EAAMjtB,SAE9C/I,GAAWsxD,EAAAA,EAAAA,eAEX88B,GAAoB54B,EAAAA,EAAAA,SAAO,IAC1BvB,EAAYo6B,IAAiBnrE,EAAAA,EAAAA,UAAwB,MACtDorE,GAAkB5tC,EAAAA,EAAAA,cAAaz+C,IACjC,MAAMsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,QAAKxO,IAGEA,EAAQ1I,OAASuqB,EAAAA,GAAU0K,YAAcvsB,EAAQ1I,OAASuqB,EAAAA,GAAUC,WAAU,IAGnF9hB,GAAUmzC,EAAAA,EAAAA,cAAaz+C,IAClB4sB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,KAGvBwyE,GAAgB7tC,EAAAA,EAAAA,cAAaz+C,IAC/B,IAAKqxB,EACD,OAAO,EAEX,MAAMtW,GAAO8X,EAAAA,EAAAA,IAAQ7yB,EAAOqxB,GAC5B,QAAKtW,IAAQA,EAAKyQ,WAA4B,YAAfzQ,EAAK/a,MAIxB,IAGVusF,GAAsC9tC,EAAAA,EAAAA,cAAaz+C,GAAgF,UAAzDmnB,EAAAA,EAAAA,IAAUnnB,GAAOyqC,sCAC3F+hD,GAAsB/tC,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAAysF,EAAAC,EAAA,OAAuD,QAAvDD,EAAyC,QAAzCC,GAAKC,EAAAA,EAAAA,IAAmB3sF,GAAO8Z,UAAU,IAAA4yE,OAAA,EAApCA,EAAsC7kE,oBAAY,IAAA4kE,EAAAA,EAAI,CAAC,IACjHG,IAAoBnuC,EAAAA,EAAAA,cAAaz+C,IACnC,MAAMwtB,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACvC,OAAOqsD,EAAAA,EAAAA,IAAmBrsD,EAAOwtB,KAAmB4vB,EAAAA,GAAayvC,aAAa,IAE5EjvD,IAAqB6gB,EAAAA,EAAAA,cAAaz+C,IACpC,MAAMsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAClC,QAAKxO,IAGEgpB,EAAAA,EAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,GAAI81B,EAAAA,GAAYC,qBAAqB,IAGjGs4D,IAAuB3rE,EAAAA,EAAAA,cAAY,KACrCpjB,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBsyE,mBAC1BpyE,WAAYuwE,IACb,GACJ,CAACntF,IAEEivF,IAAW7rE,EAAAA,EAAAA,cAAYljB,iBAAsH,IAA/GgvF,EAA0Bt/E,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAGomB,EAAOE,EAA+BtmB,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EAAEwqF,EAAqCv/E,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EAC1I,GAAIuqF,EAAgB5xC,kBAAkBvqC,OAAS,EAE3C,YADAq7E,EAAkBhyE,SAAU,GAIhC,GAAI43C,IAAcm7B,UAAAA,EAAmBC,iBAMjC,OALAf,EAAc,wBACdz5D,YAAW,KACPy5D,EAAc,KAAK,GACpBj/D,EAAAA,GAAUigE,wBACbjB,EAAkBhyE,SAAU,GAIhC,IAAI80D,EAAAA,EAAAA,GAAiBl7C,GAEjB,YADAo4D,EAAkBhyE,SAAU,GAIhC,IAAK8Z,GACGq4D,EAGA,OAFAQ,UACAX,EAAkBhyE,SAAU,GAKpC,GAAI83C,KAAgB/B,EAAAA,EAAAA,IAA2B+B,GAE3C,YADAk6B,EAAkBhyE,SAAU,GAIhC,MACMkzE,EAAa/nE,KAAKC,MAAQ2nD,EAAW/yD,QADV,IAEjCs2D,EAAa4c,GAEb/f,EAAe,MAEf,MACM7nE,EAA2B,CAC7BywB,YAFgBk1D,IAAiBl7B,EAAAA,EAAAA,IAA2B+B,KAAgBA,aAAW,EAAXA,EAAa5B,oBAAqB48B,EAAgBnmF,QAG9HktB,cACAm3D,wBACAmC,UAAWJ,aAAiB,EAAjBA,EAAmBI,WAGlC,IAAI,IAAAC,EACA,IAAIzyE,EAOJ,GANIq3C,GACAr3C,QAAiB/c,GAASo/B,EAAAA,EAAAA,IAAS8vD,IACnCO,GAAiBP,IAEjBnyE,QAAiB/c,GAAS0W,EAAAA,EAAAA,IAASw4E,EAAiBxnF,EAASwuB,IAErD,QAAZs5D,EAAIzyE,SAAQ,IAAAyyE,GAARA,EAAUnvF,MACV,MAAM0c,EAAS1c,MAGnBkvE,EAAe,MACfmB,EAAkB,CACd3nE,QAAS,GACT+uB,UAAW,GACXwlB,kBAAmB,GACnBu6B,SAAU,EACVC,SAAU,EACV/7D,YACAoE,OAAQmT,GACT,CAACs9C,SAAS,GACjB,CAAE,MAAOrwE,GAaL,OAZImvF,EAAAA,EAAAA,IAAcnvF,KACV4xD,EAAAA,EAAAA,IAA2B5xD,IAC3BmwE,EAAkBwe,EAAiB,CAACte,SAAS,IAEjDrB,EAAc9uE,EAAAA,EAAC,CAAC,EACTF,GAAG,IACN+xD,iBAAkB48B,EAAgBnmF,YAGtCwmE,EAAehvE,QAEnB6tF,EAAkBhyE,SAAU,EAEhC,CAEKkX,GAAW4C,GACZl2B,GAAS+0B,EAAAA,EAAAA,OAGTq/B,GACAp0D,GAAS8xD,EAAAA,EAAAA,OAGbs8B,EAAkBhyE,SAAU,CAChC,GAAG,CACCpc,EACAg2B,EACAg+B,EACAu6B,EACAr6B,EACAib,EACAuD,EACAnD,EACA8d,EACAp3D,EACAm3D,EACA95D,EACAy7D,GACAre,EACA30D,EACAq4C,IAGEq7B,IAAmBrsE,EAAAA,EAAAA,cAAa8rE,IAClClvF,EAAS,CACL6E,KAAM0b,EAAAA,GAAUy3D,wBAChB13E,KAAM4uF,EAAgBp3D,UACtBxE,UACF,GACH,CAACtzB,EAAUszB,IAERq8D,IAAoBvsE,EAAAA,EAAAA,cAAa4S,GAKnCv1B,EAAAA,EAAA,GACOu1B,GAAK,IACRG,SAAUH,EAAM8B,UAAU9qB,KAAKkV,GAAaA,EAASxhB,QAE1D,IAEGkvF,IAAqBxsE,EAAAA,EAAAA,cAAY,CAAC4D,EAAoBqlE,EAA8BC,EAA2B1uB,KACjH59D,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBmzE,qBAC1BjzE,WAAYwvE,EACZvvE,YAAa,CACTmK,WACAqlE,uBACAC,oBACA1uB,eAEL,GACJ,CAAC59D,IA8HJ,MAAO,EA5HcojB,EAAAA,EAAAA,cAAYljB,iBAAsG,IAA/F4vF,EAAoBlgF,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAGomB,EAAOE,EAA+BtmB,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EAAE+C,EAA2BkI,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EAC9H,IAAK4I,EACD,OAGJ,GAAI6gF,EAAkBhyE,QAClB,OAGJ,MAAM8yE,EAAkBS,GAAkBG,GAC1CpgB,GAAe,GACf0e,EAAkBhyE,SAAU,EAE5B,MAAM2zE,EAAyBvB,GAAuC3uD,GACtE,IAAIysD,EAAoB,EACpBD,EAAuB,EACvBrlE,EAAqB,GAEzB,MAAMo8D,GAAkBkI,EAAAA,EAAAA,IAAsB4D,EAAgBnmF,SACxDwiF,EAAqBxhF,OAAOoI,OAAOixE,GAAiBttC,UAAS,GAMnE,GAJI04C,IAAwCjD,KACtCe,oBAAmBD,uBAAsBrlE,YAAYsmE,EAAiB4B,EAAgBnmF,UAGxFgnF,GAA0BtB,EAAsBr/D,EAAAA,GAAU8+D,oBAAsB3C,EAAoB,CACpGe,EAAoBmC,EAAsB,EAE1C,IAAK,MAAMuB,KAAK5M,EACRA,EAAgB4M,IAChBhpE,EAASrL,KAAK,IAAMq0E,GAI5B,MAAM,KAAC1vF,SAAcN,GAASiwF,EAAAA,EAAAA,IAAoBl0E,IAClDswE,EAAuB/rF,EAAOA,EAAKyS,OAAS,CAChD,CAEA,MAAM6qD,EAAYA,IAAMqxB,GAASC,EAAiBh5D,GAClD,GAAIuhD,EAAoB7Z,GACpBwwB,EAAkBhyE,SAAU,MADhC,CAKA,GAAIkwE,EAAoB,EAGpB,OAFAsD,GAAmB5oE,EAAUqlE,EAAsBC,EAAmB1uB,QACtEwwB,EAAkBhyE,SAAU,GAIhC,IAAKixE,IAAiBn3D,EAAgB,CAClC,MAAMltB,EAzRlB,SAAmCD,GAC/B,MACMqwB,EADSrwB,EAAQolC,MAAM,KACN,IAAM,GAC7B,GAAmB,MAAf/U,EAAQ,GACR,MAAO,GAEX,MAAMpwB,EAASowB,EAAQH,UAAU,GACjC,MAAe,WAAXjwB,GAAkC,SAAXA,GAAgC,QAAXA,GAA+B,YAAXA,EACzDA,EAGJ,EACX,CA6Q2BknF,CAA0BhB,EAAgBnmF,SACzD,GAAI8lF,IAAqB7lF,EAAQ,CAC7B,MAAMmnF,EAAuB,CACzB1zE,QAASC,EAAAA,GAAiB0zE,aAC1BxzE,WAAYyzE,EAAAA,QACZxzE,YAAa,CAACyzE,UAAWtnF,IAU7B,OAPAhJ,GAASwc,EAAAA,EAAAA,GAAU2zE,IAEnBzf,EAAiBjwE,EAAAA,EAAC,CAAC,EACZyuF,GAAe,IAClBnmF,QAAS,WAEbqlF,EAAkBhyE,SAAU,EAEhC,CAEA,GAA0C,YAAtC8yE,EAAgBnmF,QAAQwnF,UAAyB,CACjD,MAAMC,EAA6B,CAC/B/zE,QAASC,EAAAA,GAAiB+zE,oBAC1B7zE,WAAY8zE,EAAAA,EACZ7zE,YAAa,CAACtP,YAUlB,OAPAvN,GAASwc,EAAAA,EAAAA,GAAUg0E,IAEnB9f,EAAiBjwE,EAAAA,EAAC,CAAC,EACZyuF,GAAe,IAClBnmF,QAAS,WAEbqlF,EAAkBhyE,SAAU,EAEhC,CAEA,IAAKkyE,GAAyD,aAAtCY,EAAgBnmF,QAAQwnF,UAA0B,CACtE,MAAMI,EAA8B,CAChCl0E,QAASC,EAAAA,GAAiBk0E,qBAC1Bh0E,WAAYi0E,EAAAA,EACZh0E,YAAa,CAACtP,YAUlB,OAPAvN,GAASwc,EAAAA,EAAAA,GAAUm0E,IAEnBjgB,EAAiBjwE,EAAAA,EAAC,CAAC,EACZyuF,GAAe,IAClBnmF,QAAS,WAEbqlF,EAAkBhyE,SAAU,EAEhC,CACJ,OAEM6yE,GAASC,EAAiBh5D,EAAgBxuB,EA9DhD,CA+DJ,GAAG,CACCunF,GACAj5D,EACAs4D,EACA/gF,EACAwO,EACA0yE,EACAzuF,EACAwuF,EACAnB,EACA3c,EACAkf,GACA/vD,GACAgvD,GACAvB,EACA5d,EACA+H,IAGkBxjB,EAAW,C,oIErWrC,MAAM68B,EAAchvF,IAeI,IAfH,GACjBpB,EAAE,KACF03D,EAAI,MACJvgD,EAAK,WACLk5E,EAAU,QACVhoF,EAAO,UACPa,EAAS,QACTonF,EAAU,MAAK,UACfC,EAAS,iBACTC,EAAgB,kBAChBC,EAAiB,gBACjBC,EAAe,cACfC,EAAa,SACbC,EAAQ,SACRtzB,GACel8D,EACf,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElBouE,GAAajuE,EAAAA,EAAAA,UAAQ,IACnBytE,IAIS,WAAT34B,GAA8B,YAATA,EACdzuD,IAAAA,cAAC49E,EAAAA,iBAAgB,CAAC98E,KAAM,KACf,YAAT2tD,EACAzuD,IAAAA,cAACk9E,EAAAA,UAAS,CAACp8E,KAAM,KAErBd,IAAAA,cAACyvD,EAAAA,uBAAsB,CAAC3uD,KAAM,OACtC,CAAC2tD,EAAM24B,IAEJS,GAAgBluE,EAAAA,EAAAA,UAAQ,IAEtB3Z,IAAAA,cAAA,UACIC,UAAU,2BACV,aAAYuJ,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,UAC/E6F,QAASg4E,GAETtnF,IAAAA,cAAC8nF,EAAAA,UAAS,CAAChnF,KAAM,OAG1B,CAACwmF,IAEJ,OACItnF,IAAAA,cAAA,OACI,cAAajJ,EACbkJ,UAAWk3C,IACP,cACAsX,EACAxuD,EAAS,gBAAAU,OACO0mF,MAGlBM,GACE3nF,IAAAA,cAAA,OAAKC,UAAU,qBACV2nF,GAGT5nF,IAAAA,cAAA,OAAKC,UAAU,qBACViO,GACGlO,IAAAA,cAAA,OAAKC,UAAU,sBACViO,GAGR9O,GACGY,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,CAAC4wC,qBAAsBx7E,QAAQ2B,MAEpD9O,GAGRi1D,GACCkzB,GAAoBC,IAClBxnF,IAAAA,cAAA,OAAKC,UAAU,8BACVsnF,EACAC,GAGRE,GACG1nF,IAAAA,cAAA,OAAKC,UAAU,8BACVynF,IAIZJ,GAAaG,GACVznF,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOu5E,EACPO,YAAY,GAEXH,GAGRP,IAAcG,GACXI,EAEF,EAEZV,EAAA9+E,UAAA,CAjHEtR,GAAE+O,IAAAA,OACF2oD,KAAI3oD,IAAAA,MAAA,CAJe,SAAW,UAAY,OAAS,YAASC,WAK5DmI,MAAKpI,IAAAA,KACLshF,WAAUthF,IAAAA,KACV1G,QAAO0G,IAAAA,KACPuuD,SAAQvuD,IAAAA,KACR7F,UAAS6F,IAAAA,OACT6hF,SAAQ7hF,IAAAA,KACRyhF,iBAAgBzhF,IAAAA,KAChB0hF,kBAAiB1hF,IAAAA,KACjB4hF,cAAa5hF,IAAAA,KACb2hF,gBAAe3hF,IAAAA,OACfwhF,UAASxhF,IAAAA,KACTuhF,QAAOvhF,IAAAA,MAAA,CAAG,MAAQ,SAsGtB,S,uSCpIO,SAASmiF,IACZ,MAAO,CACH/sF,KAAMc,EAAAA,GAAYksF,uBAE1B,CAEO,SAASC,IACZ,MAAO,CACHjtF,KAAMc,EAAAA,GAAYosF,yBAE1B,CCVO,SAASC,EAAwB/vF,GACpC,OAAOA,EAAM8kD,MAAMkrC,gBAAgBC,qBAAqBC,oBAC5D,C,yDCNA,SAAAhmF,EAAArD,EAAAshD,EAAA1gC,GAAA,OAAA0gC,EAAA,SAAA1gC,GAAA,IAAAqiB,EAAA,SAAAriB,GAAA,oBAAAA,IAAAA,EAAA,OAAAA,EAAA,IAAA5gB,EAAA4gB,EAAA0oE,OAAAC,aAAA,YAAAvpF,EAAA,KAAAijC,EAAAjjC,EAAA+R,KAAA6O,EAAA0gC,UAAA,oBAAAre,EAAA,OAAAA,EAAA,UAAAumD,UAAA,uDAAA3gB,OAAAjoD,EAAA,CAAA6oE,CAAA7oE,GAAA,uBAAAqiB,EAAAA,EAAAA,EAAA,GAAAymD,CAAApoC,MAAAthD,EAAAiB,OAAA0oF,eAAA3pF,EAAAshD,EAAA,CAAAj9C,MAAAuc,EAAAgpE,YAAA,EAAAC,cAAA,EAAAC,UAAA,IAAA9pF,EAAAshD,GAAA1gC,EAAA5gB,CAAA,CA6Ce,MAAM+pF,UAAwBlpF,IAAAA,cAEzCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,8BAoBO,KACpB,MAAM2mF,EAAMzmF,KAAK0mF,WAAW32E,QAC5B,GAAI02E,EAAK,CACL,MAAME,EAASF,EAAInV,YAAcmV,EAAIG,YAKrC,OAJA5mF,KAAKgH,SAAS,CAAC6/E,YAAaF,SACK,iBAAtB3mF,KAAKhD,MAAMN,SAClBsD,KAAKgH,SAAS,CAAC8/E,uBAAuBA,EAAAA,EAAAA,IAAsB9mF,KAAKhD,MAAMN,WAG/E,CACAsD,KAAKgH,SAAS,CAAC6/E,aAAa,GAAO,IACtC/mF,EAAA,oBAoBcrD,IACXA,EAAEyK,iBACElH,KAAKhD,MAAMi8B,aACXj5B,KAAKhD,MAAMi8B,aACf,IArDAj5B,KAAK0mF,WAAappF,IAAAA,YAElB0C,KAAKpK,MAAQ,CACTixF,aAAa,EACbC,uBAAuB,EAE/B,CAyBAvuC,iBAAAA,GACIv4C,KAAKhD,MAAMqD,QAAQklF,gCACnB/lF,SAASC,KAAKq5D,UAAUjiC,IAAI,0BAChC,CAEA4hB,kBAAAA,GAC4C,IAApCz4C,KAAKhD,MAAM8oF,sBACXtmF,SAASC,KAAKq5D,UAAUjiC,IAAI,0BAEpC,CAEAymC,oBAAAA,GAC4C,IAApCt9D,KAAKhD,MAAM8oF,sBACXtmF,SAASC,KAAKq5D,UAAUO,OAAO,2BAEnCr5D,KAAKhD,MAAMqD,QAAQolF,+BACvB,CASAxiF,MAAAA,GACI,IAAKjD,KAAKhD,MAAMN,QACZ,OAAO,KAGX,IAAIqqF,EAAW,mBACf,MAAMC,EAAW,CAACC,gBAAiB,GAAIt6B,MAAO,IACxCu6B,EAAY,CAACv6B,MAAO,IAuB1B,IAAIliD,EAtBAzK,KAAKhD,MAAM2vD,OAAS3sD,KAAKhD,MAAMmqF,WAC/BH,EAASC,gBAAkBjnF,KAAKhD,MAAM2vD,MACtCq6B,EAASr6B,MAAQ3sD,KAAKhD,MAAMmqF,UAC5BD,EAAUv6B,MAAQ3sD,KAAKhD,MAAMmqF,WACtBnnF,KAAKhD,MAAMxE,OAASy6B,EAAAA,GAAqBm0D,WAEzCpnF,KAAKhD,MAAMxE,OAASy6B,EAAAA,GAAqBo0D,SADhDN,EAAW,6CAGJ/mF,KAAKhD,MAAMxE,OAASy6B,EAAAA,GAAqB1M,QAChDwgE,EAAW,4CACJ/mF,KAAKhD,MAAMxE,OAASy6B,EAAAA,GAAqBq0D,QAChDP,EAAW,4CACJ/mF,KAAKhD,MAAMxE,OAASy6B,EAAAA,GAAqBs0D,YAChDR,EAAW,gDACJ/mF,KAAKhD,MAAMxE,OAASy6B,EAAAA,GAAqBu0D,UAChDT,EAAW,6CAGX/mF,KAAKhD,MAAMO,YACXwpF,GAAY,IAAJ9oF,OAAQ+B,KAAKhD,MAAMO,YAI3ByC,KAAKhD,MAAMyqF,kBACXh9E,EACInN,IAAAA,cAAA,KACIm2C,KAAK,IACLl2C,UAAU,0BACVmN,MAAOw8E,EACPt6E,QAAS5M,KAAKi5B,aAEb,MAKb,IAAIv8B,EAAUsD,KAAKhD,MAAMN,QACH,iBAAXA,IACPA,EACIY,IAAAA,cAACoqF,EAAAA,EAAwB,CAACrzF,GAAI2L,KAAKhD,MAAMN,WASjD,IAAIirF,EAAcrqF,IAAAA,cAAA,OAAKC,UAAU,0BAC5ByC,KAAKhD,MAAMK,KAAO2C,KAAKhD,MAAMK,KANTuqF,KACd5nF,KAAKhD,MAAM6qF,mBACjB7nF,KAAKhD,MAAMyqF,gBAAkBnqF,IAAAA,cAAA,KAAGC,UAAU,mCAAqCD,IAAAA,cAAA,KAAGC,UAAU,6BAIxDqqF,GACrCtqF,IAAAA,cAAA,QACI46C,IAAKl4C,KAAK0mF,WACVoB,aAAc9nF,KAAK+nF,uBAElBrrF,GAGDsD,KAAKhD,MAAM6qF,kBAAoB7nF,KAAKhD,MAAMgrF,SAAWhoF,KAAKhD,MAAMirF,iBAChE3qF,IAAAA,cAAA,UACIsP,QAAS5M,KAAKhD,MAAMkrF,cACpBvjF,SAAU3E,KAAKhD,MAAMmrF,aAErB7qF,IAAAA,cAACgK,EAAAA,iBACOtH,KAAKhD,MAAMirF,kBAKvBjoF,KAAKhD,MAAM6qF,kBAAoB7nF,KAAKhD,MAAMgrF,SAAWhoF,KAAKhD,MAAMorF,SAChE9qF,IAAAA,cAAA,UACIsP,QAAS5M,KAAKhD,MAAMkrF,cACpBvjF,SAAU3E,KAAKhD,MAAMmrF,aAEpBnoF,KAAKhD,MAAMorF,UAiBxB,OAZIpoF,KAAKpK,MAAMixF,cACXc,EACIrqF,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOxL,KAAKhD,MAAMqrF,WAAaroF,KAAKhD,MAAMqrF,WAAa3rF,EACvDa,UAAU,yBACV+qF,YAAY,GAEXX,IAMTrqF,IAAAA,cAAAirF,EAAA,CACIhrF,UAAWwpF,EACXr8E,MAAOs8E,EAGP,cAAahnF,KAAKhD,MAAM3I,IAEvBszF,EACAl9E,EAGb,EACH3K,EA5KoB0mF,EAAe,aA7BhCnyF,GAAE+O,IAAAA,OACFqkF,gBAAerkF,IAAAA,KACf7F,UAAS6F,IAAAA,OACTupD,MAAKvpD,IAAAA,OACL+jF,UAAS/jF,IAAAA,OACT5K,KAAI4K,IAAAA,OACJ1G,QAAO0G,IAAAA,KAAAC,WACPglF,WAAUjlF,IAAAA,KACV61B,YAAW71B,IAAAA,KACXolF,UAASplF,IAAAA,KACT0iF,qBAAoB1iF,IAAAA,OACpB8kF,cAAa9kF,IAAAA,KAEbykF,iBAAgBzkF,IAAAA,KAChB/F,KAAI+F,IAAAA,KACJ/C,QAAO+C,IAAAA,MAAA,CACHmiF,8BAA6BniF,IAAAA,KAAAC,WAC7BoiF,8BAA6BriF,IAAAA,KAAAC,aAAAA,WAEjC2kF,QAAO5kF,IAAAA,KACPglF,QAAOhlF,IAAAA,KACP+kF,YAAW/kF,IAAAA,OAAAtD,EAQM0mF,EAAe,eAaV,CAClBiB,iBAAiB,EACjB96B,MAAO,GACPw6B,UAAW,GACX3uF,KAAMy6B,EAAAA,GAAqBo0D,SAC3BQ,kBAAkB,EAClBY,cAAc,EACdT,SAAS,IACZ,IAAAO,EAAAG,IAAA,OAAAtpC,WAAA,CAAAt7C,YAAA,cAAA4kF,CA+IgB,CAACC,SAAU,iBCrLhC,SAAevjF,EAAAA,EAAAA,UAff,SAAyBxP,GACrB,MAAO,CACHkwF,qBAAsBH,EAAwB/vF,GAEtD,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBigF,8BAA6B,EAC7BE,8BAA6BA,GAC9B9xF,GAEX,GAEA,CAA4D6yF,G,eCPvDoC,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,0BAAhBA,EAAgB,2BAAhBA,EAAgB,kBAAhBA,EAAgB,mBAAhBA,EAAgB,cAAhBA,EAAgB,SAAhBA,CAAgB,EAAhBA,GAAgB,IASrB,MAAMC,EAAuB,WAWhBC,EAA8BA,KACvC,MAAMn1F,GAAWsxD,EAAAA,EAAAA,eAEX8jC,GAAmBC,EAAAA,EAAAA,KAEnBzqD,GAAc8V,EAAAA,EAAAA,aAAYh0B,EAAAA,IAC1B4oE,GAAU50C,EAAAA,EAAAA,aAAY7T,EAAAA,IACtB0oD,GAAU70C,EAAAA,EAAAA,aAAY80C,EAAAA,IACtBC,GAAwBF,aAAO,EAAPA,EAASG,OAAQC,EAAAA,GAAcC,QAEvDpuE,EAAM48D,IAAO78D,KAAKC,OAElBquE,EADmBzR,IAAO8Q,EAAsB,YACVY,KAAKtuE,EAAK,QAEhDuuE,GAAsBr1C,EAAAA,EAAAA,cAAaz+C,IAAuBi4D,EAAAA,EAAAA,IAAcj4D,EAAOsnB,EAAAA,GAAYysE,mBAAoBC,EAAAA,GAAaC,2BAA4B,gCACxJC,EAAap0E,KAAKC,MAAM+zE,GACxBvgF,EAAO2gF,EAAW3gF,KAElB4gF,EAAmBC,GACdF,EAAWE,QAAUA,GAGhCtnC,EAAAA,EAAAA,YAAU,KACDonC,EAAW3gF,OACRqgF,GAAsB,KAAOO,EAAgBnB,EAAiBqB,qBAC9DC,GAAW,GAGXV,EAAqB,IAAMA,EAAqB,KAAOO,EAAgBnB,EAAiBuB,qBACxFD,GAAW,GAGXV,GAAsB,IAAMA,EAAqB,KAAOO,EAAgBnB,EAAiBwB,YACzFF,GAAW,GAGXV,GAAsB,IAAMA,EAAqB,KAAOO,EAAgBnB,EAAiByB,aACzFH,GAAW,GAGXV,GAAsB,IACtBU,GAAW,GAEnB,GACD,IAEH,MAAMA,EAAa,WAAkB,IAAjB/gF,EAAI5F,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAChB+mF,EAAS1B,EAAiB2B,KAC1Bf,GAAsB,KACtBc,EAAS1B,EAAiBqB,oBAG1BT,EAAqB,IAAMA,EAAqB,KAChDc,EAAS1B,EAAiBuB,oBAG1BX,GAAsB,IAAMA,EAAqB,KACjDc,EAAS1B,EAAiBwB,WAG1BZ,GAAsB,IAAMA,EAAqB,KACjDc,EAAS1B,EAAiByB,YAI1Bb,GAAsB,IAAMA,EAAqB,IACjDc,EAAS1B,EAAiB4B,QAG9B,MAAMV,EAA0C,CAC5CE,MAAOM,EACPnhF,QAGJxV,GAASo6B,EAAAA,EAAAA,IAAgBwQ,EAAYlqC,GAAI,CAAC,CACtCq5B,SAAUxQ,EAAAA,GAAYysE,mBACtBlsF,KAAMmsF,EAAAA,GAAaC,2BACnB9tE,QAASwiB,EAAYlqC,GACrByM,MAAO4U,KAAK4iE,UAAUwR,MAE9B,EAEA,IAAK3gF,EACD,OAAO,KAGX,IAAK8/E,EACD,OAAO,KAGX,IAAKG,EACD,OAAO,KAGX,IAAI1sF,EAAU,CACVrI,GAAI,+CACJ0S,eAAgB,0FAChBjB,OAAQ,CACJ2kF,KAAM1S,IAAO8Q,EAAsB,YAAY6B,OAAO,mBAI1DlB,EAAqB,IACrB9sF,EAAU,CACNrI,GAAI,0DACJ0S,eAAgB,8EAIxB,MAAM4jF,EAAoBnB,GAAsB,GAAMv2D,EAAAA,GAAqBo0D,SAAWp0D,EAAAA,GAAqBC,aAE3G,OACI51B,IAAAA,cAACkpF,EAAe,CACZnyF,GAAG,0CACHmE,KAAMmyF,EACNlD,gBAAiB+B,EAAqB,GACtCtB,cAAea,EACfd,gBAAiBptE,EAAS+vE,UAC1BluF,QAASY,IAAAA,cAACgK,EAAAA,iBAAqB5K,GAC/BmrF,kBAAkB,EAClB5uD,YAAaixD,GACf,EAIJrvE,GAAW25C,EAAAA,EAAAA,gBAAe,CAC5Bo2B,UAAW,CACPv2F,GAAI,yCACJ0S,eAAgB,gB,ugBC7HxB,MAAM8jF,EAAkB,kBAClBC,EAAoB,gBAC1B,MAAMC,UAAkCztF,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,oBAkBjDjM,UACV,MAAM,gBAACm3F,GAAmBhrF,KAAKhD,MAC/B,IAAIiuF,EAAe,GACfD,EAAkBE,EAAAA,GAAgBC,wBAClCF,EAAeJ,EACRG,GAAmBE,EAAAA,GAAgBC,yBAA2BH,GAAmBE,EAAAA,GAAgBE,cACxGH,EAAeH,IAEnBjvF,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqBC,YAAW,0BAAArtF,OACN+sF,EAAe,gBAEvChrF,KAAKhD,MAAMqD,QAAQ0tB,gBAAgB/tB,KAAKhD,MAAMuhC,YAAYlqC,GAAI,CAAC,CACjEq5B,SAAUxQ,EAAAA,GAAYquE,mBACtBxvE,QAAS/b,KAAKhD,MAAMuhC,YAAYlqC,GAChCoJ,KAAMmsF,EAAAA,GAAa4B,MACnB1qF,MAAO,GAAF7C,OAAKgtF,KACX,IACNnrF,EAAA,yBAEkB,KACf,MAAM,YAAC2rF,EAAW,YAAEC,EAAW,QAAEC,GAAW3rF,KAAKhD,MACjD,OAAOyuF,GAAeC,GAAeC,CAAO,IAC/C7rF,EAAA,sBAEe,KACZ,MAAM,gBAACkrF,GAAmBhrF,KAAKhD,MAC/B,IAAI4uF,GAAc,EAKlB,OAHIZ,GAAmBE,EAAAA,GAAgBE,cACnCQ,GAAc,GAEXA,CAAW,IACrB9rF,EAAA,kBAEW,KACR,MAAM,gBAACkrF,GAAmBhrF,KAAKhD,MAC3BgD,KAAK6rF,iBACLhwF,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqBC,YAAW,qCAAArtF,OACK+sF,EAAe,WAGxDnvF,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqBC,YACrB,2CAGRtrF,KAAKhD,MAAMqD,QAAQ8P,UAAU,CACzBC,QAASC,EAAAA,GAAiBy7E,cAC1Bv7E,WAAYw7E,EAAAA,GACd,GACL,CArED,uBAAMxzC,GACF,IAAKyzC,IAAQhsF,KAAKhD,MAAMmW,eAAiBnT,KAAKisF,mBAAoB,CAC9D,MAAM,gBAACjB,GAAmBhrF,KAAKhD,MAC3BgD,KAAK6rF,iBACLhwF,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqBC,YAAW,oBAAArtF,OACZ+sF,EAAe,WAGvCnvF,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqBC,YACrB,+BAGZ,CACJ,CAwDAroF,MAAAA,GAAS,IAAAipF,EAAAC,EACL,MAAM,gBAACnB,EAAe,YAAEvkD,GAAezmC,KAAKhD,MAE5C,IAAKgD,KAAKisF,mBACN,OAAO,KAGX,GAAKxlD,EAAY7H,MAAMwtD,GAASA,EAAK3uF,OAASmsF,EAAAA,GAAa4B,OAASY,EAAKtrF,QAAU+pF,KAAoBG,EAAkBE,EAAAA,GAAgBC,yBACnIH,GAAmBE,EAAAA,GAAgBC,yBAA2BH,GAAmBE,EAAAA,GAAgBE,aACnG3kD,EAAY7H,MAAMwtD,GAASA,EAAK3uF,OAASmsF,EAAAA,GAAa4B,OAASY,EAAKtrF,QAAUgqF,IAC9E,OAAO,KAGX,MAAMuB,EACF/uF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iDACH0S,eAAe,gEACfjB,OAAQ,CAACklF,qBAIX/C,EAAkBptE,EAASyxE,YAE3BC,EACFjvF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+DACH0S,eAAe,sGACfjB,OAAQ,CAACklF,qBAIXwB,GAAmBC,EAAAA,EAAAA,KAA6C,QAAvBP,EAAAlsF,KAAKhD,MAAMmW,oBAAY,IAAA+4E,OAAA,EAAvBA,EAAyBQ,cAAyB,IAAO,QAAwC,QAAjCP,EAAEnsF,KAAKhD,MAAMuhC,YAAYqkB,gBAAQ,IAAAupC,OAAA,EAA/BA,EAAiC9qC,mBAE5IsrC,EACFrvF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uDACH0S,eAAe,iGACfjB,OAAQ,CAAC0mF,sBAIjB,IAAII,EACAvvF,EAEA2tF,GAAmBE,EAAAA,GAAgB2B,cAAgB7B,GAAmBE,EAAAA,GAAgBC,yBACtFyB,EAAgBL,EAChBlvF,EAAOC,IAAAA,cAAC89E,EAAAA,uBAAsB,CAACh9E,KAAM,MAC9B4sF,GAAmBE,EAAAA,GAAgBE,aAAeJ,GAAmBE,EAAAA,GAAgB4B,cAC5FF,EAAgBD,EAChBtvF,EAAOC,IAAAA,cAAC49E,EAAAA,iBAAgB,CAAC98E,KAAM,OAE/BwuF,EAAgBP,EAChBhvF,EAAOC,IAAAA,cAAC89E,EAAAA,uBAAsB,CAACh9E,KAAM,MAGzC,MAAMwtF,EAAc5rF,KAAK6rF,gBAEzB,OACIvuF,IAAAA,cAACkpF,EAAe,CACZhuF,KAAMozF,EAAc34D,EAAAA,GAAqBq0D,QAAUr0D,EAAAA,GAAqBo0D,SACxEI,gBAAiBmE,EACjB3yD,YAAaj5B,KAAKi5B,YAClBivD,cAAeloF,KAAKwoF,UACpBP,gBAAiBA,EACjBvrF,QAASkwF,EACT/E,kBAAkB,EAClBxqF,KAAMA,GAGlB,EACHyC,EA9IKirF,EAAyB,aAhB3BW,YAAWtoF,IAAAA,KAAAC,WACXooF,YAAWroF,IAAAA,KAAAC,WAEXojC,YAAWrjC,IAAAA,MAAAC,WACX2nF,gBAAe5nF,IAAAA,OAAAC,WACfsoF,QAAOvoF,IAAAA,KAAAC,WAEPhD,QAAO+C,IAAAA,MAAA,CACH2qB,gBAAe3qB,IAAAA,KAAAC,WACf+P,qBAAoBhQ,IAAAA,KAAAC,WACpB8M,UAAS/M,IAAAA,KAAAC,aAAAA,aAsJjB,MAAMwX,GAAW25C,EAAAA,EAAAA,gBAAe,CAC5Bu4B,mBAAoB,CAChB14F,GAAI,+DACJ0S,eAAgB,uBAEpBulF,YAAa,CACTj4F,GAAI,wDACJ0S,eAAgB,iBAIxB,KCpLMimF,IAAiCC,EAAAA,EAAAA,IAAgB,iCAAkC/vE,EAAAA,GAAYquE,oBAwCrG,IAAenmF,EAAAA,EAAAA,UAtCf,SAAyBxP,GACrB,MAAMud,EAAevd,EAAMuyB,SAASmsB,MAAMnhC,aACpCw4E,EAAsC,UAA5BlhE,EAAAA,EAAAA,IAAW70B,GAAOopC,MAClC,IAAIysD,GAAc,EACdT,EAAkB,EAUtB,OARIW,GAA2C,UAAhCx4E,aAAY,EAAZA,EAAc+5E,iBACzBzB,GAAc,EACdT,EAAkB5pF,KAAKinD,KACnB8kC,EAAAA,EAAAA,IAAoCh6E,EAAau5E,cACjDxB,EAAAA,GAAgBkC,gBAIjB,CACH3B,cACAT,kBACAU,aAAalrD,EAAAA,EAAAA,IAAyB5qC,GACtC2oC,aAAale,EAAAA,EAAAA,IAAezqB,GAC5B+1F,UACAx4E,eACAszB,YAAaumD,GAA+Bp3F,GAEpD,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBACL,CACIyoB,gBAAe,KACf5d,UAAS,IACTiD,qBAAoBA,EAAAA,IAExBzf,GAGZ,GAEA,CAA4Do3F,I,4BC9B5D,MAAMsC,IAAoCJ,EAAAA,EAAAA,IAAgB,oCAAqC/vE,EAAAA,GAAYowE,wBAuFrGzyE,IAAW25C,EAAAA,EAAAA,gBAAe,CAC5B+4B,WAAY,CACRl5F,GAAI,yBACJ0S,eAAgB,uEAEpBymF,YAAa,CACTn5F,GAAI,eACJ0S,eAAgB,kBAIxB,GAhG+C0mF,KAC3C,MAAM95E,GAAS+5E,EAAAA,GAAAA,KACTv6E,ECtBK,WACX,MAAMw6E,GAAoBt5C,EAAAA,EAAAA,aAAYjhC,EAAAA,IAChCoX,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtBmjE,EAAoB/jF,QAAQ8jF,GAC5Bh6F,GAAWsxD,EAAAA,EAAAA,gBACV4oC,EAAuBC,IAA4Bj3E,EAAAA,EAAAA,WAAS,GASnE,OAPA6rC,EAAAA,EAAAA,YAAU,KACgB,SAAlBl4B,EAAQwU,OAAqB4uD,GAAsBC,IACnDl6F,GAASo6F,EAAAA,EAAAA,OACTD,GAAyB,GAC7B,GACD,CAACD,EAAuBD,EAAmBpjE,IAEvCmjE,CACX,CDOyBK,GACfr6F,GAAWsxD,EAAAA,EAAAA,eACXxe,GAAc4N,EAAAA,EAAAA,aAAYg5C,IAC1B9uD,GAAc8V,EAAAA,EAAAA,cAAaz+C,IAC7ByqB,EAAAA,EAAAA,IAAezqB,KAEbq4F,GAAsB55C,EAAAA,EAAAA,cAAaz+C,IAAuBs4F,EAAAA,EAAAA,IAAuBt4F,KAEjFmzF,GAAmBC,EAAAA,EAAAA,KA2CzB,MAzCyBiD,MACrB,IAAK94E,IAAiB86E,EAClB,OAAO,EAIX,IAAKt6E,IAAWA,EAAO,GACnB,OAAO,EAGX,IAAK8yB,EACD,OAAO,EAEX,GAAIA,EAAY7H,MAAMwtD,GAASA,EAAK3uF,OAASmsF,EAAAA,GAAauE,MAAuB,SAAf/B,EAAKtrF,QACnE,OAAO,EAIX,IAAImtF,aAAmB,EAAnBA,EAAqB5E,OAAQC,EAAAA,GAAcC,QAC3C,OAAO,EAIX,GADmD,SAA/Bp2E,EAAa+5E,cAE7B,OAAO,EAGX,MAAMkB,EAAW,IAAIlzE,KAAK/H,EAAau5E,cACjCvxE,EAAM,IAAID,KAIhB,QAAkC,IAA9B/H,EAAau5E,cAAsB0B,EAAWjzE,GAAOizE,EAAW,IAAIlzE,KAAK,iBAGxEmzE,EAAAA,GAAAA,IAAc9vD,EAAY7/B,OAGpB,EAGVutF,GAkBD3uF,IAAAA,cAACkpF,EAAe,CACZhuF,KAAMy6B,EAAAA,GAAqBo0D,SAC3BI,iBAAiB,EACjBS,cAAeA,IAAMa,EAAiB,CAACuF,iBAAkB,uCACzDrG,gBAAiBptE,GAAS2yE,YAC1B9wF,QAASY,IAAAA,cAACgK,EAAAA,iBAAqBuT,GAAS0yE,YACxC1F,kBAAkB,EAClBY,cAAc,EACdprF,KAAMC,IAAAA,cAAA,KAAGC,UAAU,4BACnB07B,YAvBYA,KAChBtlC,GACIo6B,EAAAA,EAAAA,IAAgBwQ,EAAYlqC,GAAI,CAC5B,CACIq5B,SAAUxQ,EAAAA,GAAYowE,uBACtBvxE,QAASwiB,EAAYlqC,GACrBoJ,KAAMmsF,EAAAA,GAAauE,KACnBrtF,MAAO,UAGlB,IAbM,IA2BL,E,+KE9FV,MAAMytF,GAAevxF,IACjB,MAAOwxF,IAAoBC,EAAAA,GAAAA,KAOrBC,EACFpxF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oDACH0S,eAAe,kBAIvB,OACIzJ,IAAAA,cAAA,UACIC,UAAU,iDACVoH,SAAU3H,EAAMmF,WAChByK,QAAUnQ,GAhBM5I,WACpB4I,EAAEyK,iBACFsnF,GAAkB,EAcEG,CAAgBlyF,IAE/BiyF,EACI,EAEfH,GAAA5oF,UAAA,CAhCEipF,cAAaxrF,IAAAA,MAAA,CAAKrP,QAAOqP,IAAAA,OAAAC,WAAUrP,MAAKoP,IAAAA,OAAAC,aACxChD,QAAO+C,IAAAA,MAAA,CACH+M,UAAS/M,IAAAA,KAAAC,aAAAA,WAEblB,WAAUiB,IAAAA,KACVyrF,cAAazrF,IAAAA,SA6BjB,YCzBA,IAAegC,EAAAA,EAAAA,SAAQ,MAXvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBACL,CACI6K,UAASA,EAAAA,GAEbxc,GAGZ,GAEA,CAAiD46F,I,qGCX3CO,GAAqB,mBAWrBzzF,GAAU,CACZmK,YAAY,EACZC,kBAAkB,GAGhBspF,GAAgBjnF,GAA2F,SAAhEknF,aAAaC,QAAQH,IAAqBhnF,aAAI,EAAJA,EAAMxG,aAE3F4tF,GAAqBz5F,IAKd,IALe,eACxB05F,EAAc,KACdrnF,EAAI,YACJsnF,GAEI35F,EADDy6D,E,qWAAU/S,CAAA1nD,EAAA2nD,IAEb,MAAOiyC,EAAWC,IAAgBz4E,EAAAA,EAAAA,WAAkB,IAAMk4E,GAAajnF,MAEvE46C,EAAAA,EAAAA,YAAU,KACN4sC,EAAaP,GAAajnF,GAAM,GACjC,CAACA,IAEJ,MAAMynF,GAAgBx4E,EAAAA,EAAAA,cAAY,KACzBo4E,KAGLtzF,EAAAA,EAAAA,IAAW,SAAU,qBAErBmzF,aAAaQ,QAAQV,IAAqBhnF,aAAI,EAAJA,EAAMxG,YAAY,QAC5DguF,GAAa,GACbF,SAAAA,IAAe,GAChB,CAACD,EAAgBC,EAAatnF,IAEjC,OAAIunF,EACO,KAIP/xF,IAAAA,cAACkpF,EAAe9oF,OAAAC,OAAA,GACRuyD,EAAU,CACdu3B,gBAAiB0H,EACjBl2D,YAAas2D,EACb7yF,QACIY,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,KAAGC,UAAU,kCACI,iBAATuK,EACJxK,IAAAA,cAAC6G,GAAAA,EAAQ,CACLzH,QAASoL,EACTzM,QAASA,KAEbyM,KAGd,EAERonF,GAAAvpF,UAAA,CA1DEwpF,eAAc/rF,IAAAA,KAAAC,WACdyE,KAAI1E,IAAAA,KAAAC,WACJ+rF,YAAWhsF,IAAAA,KACX7F,UAAS6F,IAAAA,QAyDb,YC0NA,IAAe0J,EAAAA,EAAAA,aAnPuB9P,IAAiB,IAAAyyF,EAAAC,EAAAC,EACnD,MAAM,cAAC7oF,GAAiB9J,EAAM6J,KAExB+oF,EAAyBA,KAC3B5yF,EAAMqD,QAAQ8xB,cAAcyJ,EAAAA,GAAwBi0D,iBAAiB,EAGnEC,EAAwBA,MAC1Bj0F,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqB0E,4BACrB,oCAGJ/yF,EAAMqD,QAAQ0tB,gBAAgB/wB,EAAMomB,cAAe,CAAC,CAChDsK,SAAUxQ,EAAAA,GAAY8yE,sBACtBj0E,QAAS/e,EAAMomB,cACf3lB,KAAMwyF,EAAAA,GAAqBC,gBAC3BpvF,MAAO,SACR,EAGDqvF,EAA8BA,KAChCnzF,EAAMqD,QAAQ8xB,cAAcyJ,EAAAA,GAAwBw0D,uBAAuB,EAGzEC,EAAqB,CAACt8F,QAAS,+BAAgCC,MAAO,6BAG5E,GAAIgJ,EAAMszF,oBAAqB,CAC3B,KAAKC,EAAAA,GAAAA,IAAyBvzF,EAAMwtB,WAAYgmE,EAAAA,GAAAA,IAAiBxzF,EAAMwtB,YAAcxtB,EAAMyzF,wBAAyB,CAChH,MAAM/zF,EAAWY,IAAAA,cAAAA,IAAAA,SAAA,KACbA,IAAAA,cAAA,OACIC,UAAU,eACVsO,IAAK6kF,KAETpzF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,qEACfjB,OAAQ,CACJ6qF,YAAYC,EAAAA,GAAAA,GAAkB5zF,EAAMwtB,QAAQqmE,aAAyC,SAA3B7zF,EAAMwtB,QAAQsmE,cAIpF,OACIxzF,IAAAA,cAACkpF,EAAe,CACZhuF,KAAMy6B,EAAAA,GAAqBo0D,SAC3B3qF,QACIY,IAAAA,cAAA,OAAKC,UAAU,mCACVb,EACDY,IAAAA,cAACixF,GAAW,CAACK,cAAeyB,KAGpChI,WAAY3rF,EACZu8B,YAAa62D,EACbrI,iBAAiB,GAG7B,CAEA,MAAMsJ,GAA0BC,EAAAA,GAAAA,IAAoBh0F,EAAMwtB,SAC1D,IAAIymE,EAAAA,GAAAA,IAAej0F,EAAMwtB,eAA+C,IAA5BumE,GAA2CA,GAA2B,KAAO/zF,EAAMk0F,8BAA+B,CAC1J,MAAMC,EACF7zF,IAAAA,cAAC8zF,GAAAA,EAAY,CACTC,kBACI/zF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gDACH0S,eAAe,6BAM/B,IAAIrK,EACAY,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OACIC,UAAU,eACVsO,IAAKylF,KAETh0F,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gDACH0S,eAAe,iDACf8/D,QAAQ,SACR/gE,OAAQ,CACJ2oD,KAAMsiC,MAMlBQ,EAAsBt+D,EAAAA,GAAqBC,aAE/C,MAAOs+D,EAAG7lF,IAAS8lF,EAAAA,EAAAA,MACnB,GAAIV,EAA0B,EAAG,CAC7B,MAAMW,EAAuB/lF,EAAQoX,EAAAA,GAAU4uE,oBAAsB7qF,EAAc,CAC/EzS,GAAI,+DACJ0S,eAAgB,6CAChBD,EAAc,CACdzS,GAAI,yDACJ0S,eAAgB,uIAEpBrK,EACIY,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OACIC,UAAU,eACVsO,IAAK6kF,KAERgB,GAGTH,EAAsBt+D,EAAAA,GAAqBo0D,QAC/C,CAEA,OACI/pF,IAAAA,cAACkpF,EAAe,CACZiB,iBAAiB,EACjBxuD,YAAak3D,EACb33F,KAAM+4F,EACN70F,QACIY,IAAAA,cAAA,OAAKC,UAAU,mCACVb,EACAy0F,GAGT9I,WAAY3rF,GAGxB,CAEA,KAAKu0F,EAAAA,GAAAA,IAAej0F,EAAMwtB,WAAYonE,EAAAA,GAAAA,IAAkB50F,EAAMwtB,WAAaxtB,EAAM60F,yBAA0B,KAAAC,EACvG,MAAMp1F,EAAWY,IAAAA,cAAAA,IAAAA,SAAA,KACbA,IAAAA,cAAA,OACIC,UAAU,eACVsO,IAAKylF,KAETh0F,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAe,sDACfjB,OAAQ,CACJ2kF,KAAM,IAAIvvE,KAAKqsC,SAAsB,QAAduqC,EAAC90F,EAAMwtB,eAAO,IAAAsnE,OAAA,EAAbA,EAAeC,UAAW,KAClDpB,YAAYC,EAAAA,GAAAA,GAAkB5zF,EAAMwtB,QAAQqmE,aAAyC,SAA3B7zF,EAAMwtB,QAAQsmE,cAIpF,OACIxzF,IAAAA,cAACkpF,EAAe,CACZiB,iBAAiB,EACjBxuD,YAAa22D,EACbp3F,KAAMy6B,EAAAA,GAAqBC,aAC3Bx2B,QACIY,IAAAA,cAAA,OAAKC,UAAU,mCACVb,EACDY,IAAAA,cAACixF,GAAW,CAACK,cAAeyB,KAGpChI,WAAY3rF,GAGxB,CACJ,MAEI,IAAI6zF,EAAAA,GAAAA,IAAyBvzF,EAAMwtB,SAC/B,OACIltB,IAAAA,cAACkpF,EAAe,CACZhuF,KAAMy6B,EAAAA,GAAqBo0D,SAC3B3qF,QACIY,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OACIC,UAAU,eACVsO,IAAK6kF,KAETpzF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAIunC,EAAAA,GAAwBo2D,mBAC5BjrF,eAAe,2HACfjB,OAAQ,CACJ6qF,YAAYC,EAAAA,GAAAA,GAAkB5zF,EAAMwtB,QAAQqmE,aAAyC,SAA3B7zF,EAAMwtB,QAAQsmE,gBAUxG,GAA6C,UAA7B,QAAZrB,EAAAzyF,EAAM/E,cAAM,IAAAw3F,OAAA,EAAZA,EAAcwC,yBACgC,UAA9B,QAAZvC,EAAA1yF,EAAM/E,cAAM,IAAAy3F,OAAA,EAAZA,EAAcwC,yBACpB,CACE,MAAMC,EAAerrF,EAAc,CAC/BzS,GAAIunC,EAAAA,GAAwBw2D,aAC5BrrF,eAAgB,+DAGpB,OACIzJ,IAAAA,cAAC4xF,GAAkB,CACfC,gBAAgB,EAChBrnF,KAAMqqF,EACN35F,KAAMy6B,EAAAA,GAAqB1M,SAGvC,CAEA,GAAIvpB,EAAMszF,qBAAiD,MAAd,QAAZX,EAAA3yF,EAAM/E,cAAM,IAAA03F,OAAA,EAAZA,EAAcp8C,SAAgB,KAAA8+C,EAC3D,MAAMvsF,EAAoC,CACtCwsF,SAAWrlF,GACP3P,IAAAA,cAAC03C,GAAAA,EAAY,CACTvB,KAAMz2C,EAAMlC,QACZ2U,SAAS,kCAERxC,GAGTslF,YAActlF,GACV3P,IAAAA,cAAC8iD,GAAAA,KAAI,CAACnD,GAAG,yCACJhwC,IAKb,IAAIulF,EAaJ,OAXIA,EADyC,UAA7B,QAAZH,EAAAr1F,EAAM/E,cAAM,IAAAo6F,OAAA,EAAZA,EAAcI,wBACG3rF,EAAc,CAC3BzS,GAAI,8CACJ0S,eAAgB,oKACjBjB,GAEcgB,EAAc,CAC3BzS,GAAI,uCACJ0S,eAAgB,yGACjBjB,GAIHxI,IAAAA,cAAC4xF,GAAkB,CACfC,gBAAgB,EAChBrnF,KAAM0qF,EACNh6F,KAAMy6B,EAAAA,GAAqBC,cAGvC,CAEA,OAAO,IAAI,IC3Pf,IAAe9tB,EAAAA,EAAAA,UApBf,SAAyBxP,GACrB,MAAMwtB,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACvC,MAAO,CACHkF,SAASiU,EAAAA,EAAAA,MACTmiF,8BAA+BrnF,QAAQjU,EAAM8kD,MAAMg4C,OAAOC,iBAAiB/2D,EAAAA,GAAwBw0D,yBACnGK,wBAAyB5mF,QAA0G,UAAlGgkD,EAAAA,EAAAA,IAAcj4D,EAAOsnB,EAAAA,GAAY8yE,sBAAuBC,EAAAA,GAAqBC,kBAC9G2B,yBAA0BhoF,QAAQjU,EAAM8kD,MAAMg4C,OAAOC,iBAAiB/2D,EAAAA,GAAwBi0D,mBAC9FzsE,gBAER,IAEA,SAA4BzvB,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6sB,cAAa,IACbpE,gBAAeA,EAAAA,IAChBp6B,GAEX,GAEA,CAA4Di/F,I,4BC3B7C,SAASC,KACpB,MAAO1pF,EAAMyN,IAAWC,EAAAA,EAAAA,WAAUwH,GAAAA,EAAay0E,8CAEzCz1C,GAActmC,EAAAA,EAAAA,cAAYljB,UAC5B,UACUk/F,EAAAA,GAAAA,KACV,CAAE,MAAO/+F,GAELghC,QAAQhhC,MAAM,2CAA4CA,EAC9D,CAAE,QAEE4iB,GAAQ,EACZ,IACD,IAEGqiB,GAAcliB,EAAAA,EAAAA,cAAY,KAC5BH,GAAQ,GAGRyH,GAAAA,EAAa20E,4CAA4C,GAC1D,IAEH,OAAK7pF,EAKD7L,IAAAA,cAACkpF,EAAe,CACZhuF,KAAMy6B,EAAAA,GAAqBC,aAC3Bx2B,QACIY,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iEACH0S,eAAe,kEAGvBqhF,QACI9qF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6DACH0S,eAAe,oCAGvBihF,SAAS,EACTH,kBAAkB,EAClBK,cAAe7qC,EACfoqC,iBAAiB,EACjBxuD,YAAaA,IAtBV,IAyBf,CCjDe,SAASg6D,KACpB,MAAO9pF,EAAMyN,IAAWC,EAAAA,EAAAA,WAAUwH,GAAAA,EAAay0E,8CAEzCz1C,GAActmC,EAAAA,EAAAA,cAAYljB,UAC5Bmb,OAAOC,KAAK,gDAAiD,SAAU,sBAAsB,GAC9F,IAEGgqB,GAAcliB,EAAAA,EAAAA,cAAY,KAC5BH,GAAQ,GAGRyH,GAAAA,EAAa20E,4CAA4C,GAC1D,IAEH,OAAK7pF,EAKD7L,IAAAA,cAACkpF,EAAe,CACZiB,iBAAiB,EACjBjvF,KAAMy6B,EAAAA,GAAqBC,aAC3B+F,YAAaA,EACbv8B,QACIY,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sDACH0S,eAAe,yDAGvBqhF,QACI9qF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kDACH0S,eAAe,wBAGvBihF,SAAS,EACTH,kBAAkB,EAClBK,cAAe7qC,IAtBZ,IAyBf,C,gBCjCe,SAAS61C,KACpB,MAAMC,EAAatpF,SAAQwqC,EAAAA,EAAAA,aAAYx8B,EAAAA,KAIvC,OAFAu7E,EAAAA,GAAAA,KAEKD,GAKAE,EAAAA,GAAAA,OAKDC,EAAAA,GAAAA,QAAgCC,GAAAA,GACzBj2F,IAAAA,cAACu1F,GAAqC,QAI7CS,EAAAA,GAAAA,MAAgCE,GAAAA,GACzB,MAVAl2F,IAAAA,cAACm2F,GAAoC,MALrC,IAmBf,C,4BCZA,MAuFA,GA/E2BC,KACvB,MAAOlF,IAAoBC,EAAAA,GAAAA,KACrB96F,GAAWsxD,EAAAA,EAAAA,eACX3nC,GAAQ+2B,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAASwrE,MAAMC,aAAc,CAAC,EAChF3K,GAAU50C,EAAAA,EAAAA,aAAY7T,EAAAA,IACtBhW,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtBopE,EAAiBtsC,SAAS/8B,EAAQspE,MAAO,IACzCnI,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,IACtBx1D,GAAc8V,EAAAA,EAAAA,cAAaz+C,IAAuByqB,EAAAA,EAAAA,IAAezqB,KACjEo+F,GAAqB3/C,EAAAA,EAAAA,aAAY4/C,EAAAA,IACjCC,GAAgB52E,GAAS,CAAC,GAAG62E,EAAAA,GAAUC,cAA2B,GAClE,6CACFC,EAA4C,+BAC5CC,IACAC,EAAAA,GAAAA,GAA8B,CAC9BL,cACAL,mBAEEW,EAAoBF,EAAiC,QAAU,OAC/DG,GAAmBjqE,EAAQkqE,IAAM,IAAI9nE,UAAU,EAAG,GAClDu0C,EAAiB,GAAHljE,OAAMu2F,EAAiB,mBAAAv2F,OAAkBw2F,GAEvDE,EAAiBT,EAAcL,EAG/Be,EAAgB3L,IADCoL,GAAgDC,KACnB3I,GAC9C,IACFkJ,EAAG,aACHC,IACAC,EAAAA,GAAAA,GAA2B,CAC3BC,eAAgBX,EAChBY,OAAQ,kBAoBZ,IAAKL,GA3DiBn/F,KAA6F,IAA5F,eAAC0rE,EAAc,mBAAE6yB,EAAkB,gBAAEkB,GAAyCz/F,EACrG,QAAIy/F,QAC6E58F,IAAtE07F,EAAmBvrF,MAAM3H,GAAUA,EAAMrD,OAAS0jE,GAGjD,EAsDUg0B,CAAkB,CAACD,gBAAiBb,EAA8CL,qBAAoB7yB,mBACxH,OAAO,KAGX,MAAMzkE,EACFY,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,4MACfjB,OAAQ,CACJsvF,MAAOT,KAInB,OACIr3F,IAAAA,cAACkpF,EAAe,CACZhuF,KAAM67F,EAA+CphE,EAAAA,GAAqBq0D,QAAUr0D,EAAAA,GAAqBo0D,SACzGI,gBAAiB4M,EACjBnM,cAzByBzrF,IAC7BA,EAAEyK,iBACF4tF,EAAa,iBACbtG,GAAkB,EAuBdvG,gBAAiB4M,EACjBn4F,QAASA,EACTmrF,kBAAkB,EAClBY,cAAc,EACdprF,KAAMC,IAAAA,cAAA,KAAGC,UAAU,4BACnB07B,YAxCYA,KAChBtlC,GAASo6B,EAAAA,EAAAA,IAAgBwQ,EAAYlqC,GAAI,CAAC,CACtCq5B,SAAUxQ,EAAAA,GAAYm4E,qBACtB53F,KAAM0jE,EACNplD,QAASwiB,EAAYlqC,GACrByM,MAAO,kCACP,GAmCF,E,4BC5FK,SAASw0F,KAAyB,IAAAC,EAAAC,EAC7C,MAAOC,EAAmBC,IAAwB7+E,EAAAA,EAAAA,WAAS,GACrDljB,GAAWsxD,EAAAA,EAAAA,eACX9xC,GAAekhC,EAAAA,EAAAA,aAAYshD,EAAAA,IAC3BpiF,GAAW8gC,EAAAA,EAAAA,aAAYuhD,EAAAA,IACvBC,GAAmD,QAAnCN,GAAAlhD,EAAAA,EAAAA,aAAY65C,EAAAA,WAAuB,IAAAqH,OAAA,EAAnCA,EAAqClM,OAAQC,EAAAA,GAAcC,QAC3EmC,GAAcr3C,EAAAA,EAAAA,aAAY7T,EAAAA,IAC1BmrD,EAA4C,UAAlCt3C,EAAAA,EAAAA,aAAY5pB,EAAAA,IAAYuU,OAExC0jB,EAAAA,EAAAA,YAAU,KACFipC,IAAYkK,GAAiB7J,IAAQz4E,IAAam4E,IAAgB+J,IAClEC,GAAqB,GACrB/hG,GAAS6f,EAAAA,EAAAA,OACb,GAEJ,CAACm4E,EAASkK,EAAetiF,EAAUm4E,EAAa+J,IAEhD,MAAMK,EAAiE,YAAvC3iF,SAA0B,QAAdqiF,EAAZriF,EAAc4iF,oBAAY,IAAAP,OAAd,EAAZA,EAA4B74F,QAE5D,GAEIqvF,IAAQ74E,IACR0iF,IACClK,IACAD,GACDM,IAAQz4E,MACNyiF,EAAAA,GAAAA,IAAsBziF,KAAcuiF,EAEtC,OAAO,KAOX,IAAIp5F,EACAY,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+CACH0S,eAAe,uFAavB,OATI+uF,IACAp5F,EACIY,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qDACH0S,eAAe,qCAMvBzJ,IAAAA,cAACkpF,EAAe,CACZhuF,KAAMy6B,EAAAA,GAAqBo0D,SAC3BI,iBAAiB,EACjBS,cAxBkB+N,MACtB5mF,EAAAA,GAAAA,KAAaC,KAAK4mF,EAAAA,GAAaC,aAAa,EAwBxClO,gBAAiBptE,GAASo7E,kBAC1Bv5F,QAASA,EACTmrF,kBAAkB,EAClBY,cAAc,GAG1B,CAEA,MAAM5tE,IAAW25C,EAAAA,EAAAA,gBAAe,CAC5ByhC,kBAAmB,CACf5hG,GAAI,+CACJ0S,eAAgB,yB,wCChExB,MA6DA,GA7D4BqvF,KACxB,MAAMC,GAAchiD,EAAAA,EAAAA,cAAaz+C,IAAuB4qC,EAAAA,EAAAA,IAAyB5qC,KAC3E0gG,GAA0BC,EAAAA,GAAAA,KAE1B5iG,GAAWsxD,EAAAA,EAAAA,eAGXuxC,EAAO,OAEPC,GAAwBpiD,EAAAA,EAAAA,cAAaz+C,IAAuB8gG,EAAAA,GAAAA,GAAY9gG,EAAOya,EAAAA,GAAiBsmF,wBAEhGC,GAAmBviD,EAAAA,EAAAA,cAAaz+C,IAAuBmnB,EAAAA,EAAAA,IAAUnnB,GAAOihG,mBACxEt4D,GAAc8V,EAAAA,EAAAA,cAAaz+C,IAAuByqB,EAAAA,EAAAA,IAAezqB,KACjEkhG,GAAyBziD,EAAAA,EAAAA,cAAaz+C,IAAuBqnB,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAY65E,kBAAmBh0E,EAAAA,GAAUi0E,0BAErHC,GAAmB5iD,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAASwrE,MAAMsD,mBAC5EC,GAAiB7iD,EAAAA,EAAAA,aAAY5pB,EAAAA,IAC7B0sE,EAAc3sE,KACXA,UAAAA,EAASG,aAGPH,EAAQG,aAAe6rE,EAE5BY,EAAiBD,EAAWF,GAC5BI,EAAoBF,EAAWD,GAC/BI,GAAaC,EAAAA,GAAAA,IAAuB,GAGpCC,EAAgCH,GAAqBD,EAErDK,EAAgBA,MAClB57F,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqBqM,mCACrB,gCAEJ/jG,GAASo6B,EAAAA,EAAAA,IAAgBwQ,EAAYlqC,GAAI,CACrC,CACIq5B,SAAUxQ,EAAAA,GAAY65E,kBACtBh7E,QAASwiB,EAAYlqC,GACrBoJ,KAAMslB,EAAAA,GAAUi0E,uBAChBl2F,MAAO01F,KAEZ,EAiBP,OAdA9zC,EAAAA,EAAAA,YAAU,KACN,MAAMi1C,EAA8B,MAAsBle,OAAOmd,GAE3DgB,GADM,IAAI18E,MAAO28E,UACYF,EAC7BG,EAAwBre,OAAO6d,GA3CnB,GA4CdjB,IAAgBI,GAAyBqB,GAAyBF,IAAyBd,IAA2BU,IACtHlB,EAAwB,CAAChI,iBAAkB,0BAA2BmJ,IACtE57F,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqBqM,mCACrB,kCAER,GACD,CAACJ,IAEG,IAAI,E,mGCjEf,MAAMS,GAAwBtiG,IASQ,IARlC,GACIpB,EAAE,MACF2jG,EAAK,QACLt7F,EAAO,QACPkQ,EAAO,UACPqrF,GAAY,EAAK,YACjBC,EAAW,kBACXC,GACyB1iG,EAC7B,MAAM2iG,GAAUC,EAAAA,GAAAA,cAEVC,GAAWvhF,EAAAA,EAAAA,cAAY,KACQ,IAA7BihF,EAAMxrE,QAAQ,YAAkD,IAA9BwrE,EAAMxrE,QAAQ,YAChDxd,OAAOC,KAAK+oF,GAEZI,EAAQ9oF,KAAK0oF,GAGbprF,GACAA,KAGJ/Q,EAAAA,EAAAA,IACIs8F,EACAD,EAAc,mBAAqB7jG,EACtC,GACF,CAAC2jG,EAAOprF,IAEX,OACItP,IAAAA,cAAA,KACIC,UAAS,yBAAAU,OAA2Bg6F,EAAY,GAAK,qBACrDrrF,QAAS0rF,GAER57F,EACD,EAEVq7F,GAAApyF,UAAA,CA9CEtR,GAAE+O,IAAAA,OAAAC,WACF20F,MAAK50F,IAAAA,OAAAC,WACL3G,QAAO0G,IAAAA,OAAAC,WACP80F,kBAAiB/0F,IAAAA,OAAAC,WACjB60F,YAAW90F,IAAAA,OAAAC,WACXuJ,QAAOxJ,IAAAA,KACP60F,UAAS70F,IAAAA,MA0Cb,YCpCMm1F,GAAyB9iG,IAUQ,IATnC,GACIpB,EAAE,MACFmX,EAAK,YACLhO,EAAW,oBACXg7F,EAAmB,WACnBC,EAAU,YACVC,EAAW,QACXC,EAAO,QACP7c,GAC0BrmF,EAC9B,OACI6H,IAAAA,cAAA,OACIjJ,GAAE,0BAAA4J,OAA4B5J,GAC9BkJ,UAAU,wCAEVD,IAAAA,cAAA,OAAKC,UAAS,GAAAU,OAAKu6F,EAAmB,iBACjCC,GAELn7F,IAAAA,cAAA,OAAKC,UAAU,mBACXD,IAAAA,cAAA,OAAKC,UAAU,SACViO,GAELlO,IAAAA,cAAA,OAAKC,UAAU,eACVC,EACCm7F,GAAWD,GACTp7F,IAAAA,cAACy6F,GAAqB,CAClB1jG,GAAIA,EACJ2jG,MAAOW,EACPj8F,QAASg8F,EACT9rF,QAASkvE,EACTqc,kBAAmB9M,EAAAA,GAAqBuN,4BACxCV,YAAa,4BAK3B,EAEZK,GAAA5yF,UAAA,CAlDEtR,GAAE+O,IAAAA,OAAAC,WACFmI,MAAKpI,IAAAA,OAAAC,WACL7F,YAAW4F,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,UAAAC,WACXm1F,oBAAmBp1F,IAAAA,OAAAC,WACnBo1F,WAAUr1F,IAAAA,KAAAC,WACVq1F,YAAWt1F,IAAAA,OACXu1F,QAAOv1F,IAAAA,OACPuoF,QAAOvoF,IAAAA,KACP04E,QAAO14E,IAAAA,MA4CX,Y,UC9BA,SAASy1F,GAAwB77F,GAC7B,MAAMrJ,GAAWsxD,EAAAA,EAAAA,gBACX,cAACn+C,IAAiBgQ,EAAAA,EAAAA,WAClBiyE,GAAmBC,EAAAA,EAAAA,KACnB7/E,GAAOkrC,EAAAA,EAAAA,cAAaz+C,IAAuB8gG,EAAAA,GAAAA,GAAY9gG,EAAOya,EAAAA,GAAiByoF,+BAC/EC,GAAQC,EAAAA,GAAAA,MACPrlF,IAAU+5E,EAAAA,GAAAA,KAeXgL,EAAc5xF,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,eAE1FkyF,GAAuChiF,EAAAA,EAAAA,UAAQ,IAAM,CACvD,CACI5iB,GAAI,SACJmX,MAAO1E,EAAc,CAACzS,GAAI,0CAA2C0S,eAAgB,qDACrFvJ,YAAasJ,EAAc,CAACzS,GAAI,gDAAiD0S,eAAgB,6HACjGyxF,oBAAqB,iBACrBC,WACIn7F,IAAAA,cAAC47F,GAAAA,EAAc,CACXvtF,MAAO,IACPC,OAAQ,KAGhB+sF,QAASQ,EAAAA,GAASC,WAClBV,eAEJ,CACIrkG,GAAI,OACJmX,MAAO1E,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,kDACnFvJ,YAAasJ,EAAc,CAACzS,GAAI,8CAA+C0S,eAAgB,2IAC/FyxF,oBAAqB,eACrBC,WACIn7F,IAAAA,cAAC+7F,GAAAA,EAAkB,CACf1tF,MAAO,IACPC,OAAQ,KAGhB+sF,QAASQ,EAAAA,GAASG,aAClBZ,eAEJ,CACIrkG,GAAI,gBACJmX,MAAO1E,EAAc,CAACzS,GAAI,iDAAkD0S,eAAgB,oDAC5FvJ,YAAasJ,EAAc,CAACzS,GAAI,uDAAwD0S,eAAgB,4HACxGyxF,oBAAqB,eACrBC,WACIn7F,IAAAA,cAACkgD,GAAAA,EAAc,CACX7xC,MAAO,IACPC,OAAQ,KAGhB+sF,QAASzC,EAAAA,GAAaqD,QACtBb,iBAEL,IAEH,IAAIc,EAAa1yF,EAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,yBACrF0yF,EAAqB3yF,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,gFAEhG2yF,GAA2BziF,EAAAA,EAAAA,UAC3B,IACIgiF,EAAMt4F,KAAIlL,IAAA,IAAC,GAACpB,GAAYoB,EAALkkG,E,qWAAIx8C,CAAA1nD,EAAA2nD,IAAA,OACnB9/C,IAAAA,cAACi7F,GAAsB76F,OAAAC,OAAA,GACfg8F,EAAI,CACRtlG,GAAIA,EACJ2G,IAAK3G,IACP,KAEV,IAoBJ,OAjBI2I,EAAM48F,mBACNJ,EAAa1yF,EAAc,CAACzS,GAAI,oDAAqD0S,eAAgB,kCACrG0yF,EAAqB3yF,EAAc,CAACzS,GAAI,uDAAwD0S,eAAgB,8IAChH2yF,EACIp8F,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAAA,KAAGC,UAAU,gBACRuJ,EAAc,CAACzS,GAAI,0CAA2C0S,eAAgB,YAEnFzJ,IAAAA,cAACu8F,GAAAA,EAAoB,CACjBC,WAAW,EACXnmF,OAAQA,EACRolF,MAAOA,MAMlB5vF,EAKD7L,IAAAA,cAACo8E,GAAAA,GAAY,CACTn8E,UAAU,0BACVlJ,GAAG,0BACH6V,SAnGcrW,UACdmJ,EAAMkN,UACNlN,EAAMkN,iBAEJvW,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiByoF,6BAA6B,EAgGpE9e,gBAAiBwf,EACjB3f,eAAe,GAEfv8E,IAAAA,cAAA,OAAKC,UAAU,wBACVk8F,GAELn8F,IAAAA,cAAA,OAAKC,UAAU,qBACVm8F,GAELp8F,IAAAA,cAAA,OAAKC,UAAU,kBACfD,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,UACIsP,QAzGe/Y,gBACrBF,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiByoF,8BAC3C/P,EAAiB,CAACuF,iBAAkB,+BAA+B,EAwGvD/wF,UAAU,6BAETuJ,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,yBAvBlF,IA4Bf,CAAC8xF,GAAAlzF,UAAA,CArIGuE,SAAQ9G,IAAAA,KACRw2F,iBAAgBx2F,IAAAA,KAAAC,YAsIpB,YCxEA,GA9DoC22F,KAChC,MAAMxvE,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtBkhE,EAA6B,UAAnBnhE,aAAO,EAAPA,EAASwU,OACnBq3D,GAAchiD,EAAAA,EAAAA,cAAaz+C,IAAuB4qC,EAAAA,EAAAA,IAAyB5qC,KAC3Eud,GAAekhC,EAAAA,EAAAA,aAAYjhC,EAAAA,IAC3Bq4E,EAA8C,UAAhCt4E,aAAY,EAAZA,EAAc+5E,eAE5Bv5F,GAAWsxD,EAAAA,EAAAA,eACX6xC,EAA2K,UAAlJziD,EAAAA,EAAAA,cAAaz+C,IAAuBi4D,EAAAA,EAAAA,IAAcj4D,EAAOsnB,EAAAA,GAAYquE,mBAAoB3B,EAAAA,GAAaqQ,yCAE/HC,EAAe,IAAIh/E,MAAK/H,aAAY,EAAZA,EAAcu5E,eAAgB,GAEtDyN,EAAQpiB,MAKRqiB,EAJmBriB,IAAO0B,OAAOygB,GAAgB,IACrBzQ,KAAK0Q,EAAO,SAGA,EAGxCE,EAA0BxwF,SAAQywF,EAAAA,GAAAA,IAAiCtB,EAAAA,GAAAA,MAAetL,EAAAA,GAAAA,KAAe,KAEjGtqE,GAAgBixB,EAAAA,EAAAA,aAAYx8B,GAAAA,IAE5B4/E,EAAgB5jG,WAClBgI,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqBC,YACrB,+CAGE33F,GAASo6B,EAAAA,EAAAA,IAAgB3K,EAAe,CAAC,CAC3CsK,SAAUxQ,EAAAA,GAAYquE,mBACtBxvE,QAASqH,EACT3lB,KAAMmsF,EAAAA,GAAaqQ,sCACnBn5F,MAAO,WAEXnN,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiByoF,6BAA6B,EAwBtE,OArBAp2C,EAAAA,EAAAA,YAAU,UAC6BpqD,KAA/B6a,aAAY,EAAZA,EAAcu5E,eAA4D,IAA9Bv5E,EAAau5E,cAIzDf,GAAWF,GAAe4K,IAAgBS,GAA0BsD,IACpEzmG,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiByoF,4BAC1BvoF,WAAYsoF,GACZroF,YAAa,CACTopF,iBAAkBS,EAClBnwF,SAAUutF,OAGlB57F,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqBuN,4BACrB,uCAER,GACD,CAACzlF,aAAY,EAAZA,EAAcu5E,eAEX,IAAI,ECrFR,SAAS6N,GAAgB3kG,GAC5B,OAAOA,EAAMuyB,SAASxU,OAAO6mF,YACjC,CCeA,SAASC,GAA2Bz9F,GAAc,IAAA80F,EAAA4I,EAAAC,EAC9C,MAAMH,GAAenmD,EAAAA,EAAAA,aAAYkmD,IAE3BK,GAAiB7jF,EAAAA,EAAAA,cAAY,KAC/B/H,OAAOC,KANe,oEAMa,SAAS,GAC7C,IAEGkoF,EAA4C,UAA/Bn6F,SAAc,QAAT80F,EAAL90F,EAAOwtB,eAAO,IAAAsnE,OAAT,EAALA,EAAgBnnE,YAC7BkwE,EAA2C,QAA9BH,EAAGF,aAAY,EAAZA,EAAcK,qBAAa,IAAAH,EAAAA,EAAI,EAC/CI,EAA+C,QAAhCH,EAAGH,aAAY,EAAZA,EAAcM,uBAAe,IAAAH,EAAAA,EAAI,EAEzD,OAuCG,SAA4CllG,GAAyG,IAAxG,YAACi2F,EAAW,WAAEyL,EAAU,cAAE0D,EAAa,gBAAEC,GAA6DrlG,EACtJ,QAAKi2F,IAIiB,IAAlBmP,GAA2C,IAApBC,KAInB3D,GAAc2D,GAAmBD,GAC7C,CAjDSE,CAAoC,CAACrP,YAAa1uF,EAAM0uF,YAAayL,aAAY0D,gBAAeC,oBAKjGx9F,IAAAA,cAACkpF,EAAe,CACZnyF,GAAG,gCACHozF,iBAAiB,EACjB/qF,QACIY,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,gEACfjB,OAAQ,CACJk1F,UAAW,kCAIvBxiG,KAAMy6B,EAAAA,GAAqBo0D,SAC3BhqF,KAAMC,IAAAA,cAAC49E,EAAAA,iBAAgB,CAAC98E,KAAM,KAC9B4pF,SAAS,EACTH,kBAAkB,EAClBO,QACI9qF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,eAGvBmhF,cAAe0S,IA1BZ,IA6Bf,CAACH,GAAA90F,UAAA,CA9CG+lF,YAAWtoF,IAAAA,KAAAC,YAmEf,YCvEM43F,GAAaA,KACfjsF,OAAOS,SAASyrF,QAAQ,EAGtBC,GAAa1lG,IAEN,IAFO,UAChB2lG,GACI3lG,EACJ,MAAO4lG,EAAoBC,IAAyBzkF,EAAAA,EAAAA,UAA2BukF,GAQ/E,OANA14C,EAAAA,EAAAA,YAAU,MACD24C,GAAsBD,GACvBE,EAAsBF,EAC1B,GACD,CAACA,EAAWC,IAEVA,GAAsBA,IAAuBD,GAI9CC,IAAuBD,EAEnB99F,IAAAA,cAACkpF,EAAe,CACZhuF,KAAMy6B,EAAAA,GAAqBC,aAC3Bx2B,QACIY,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kBACH0S,eAAe,8CAEnBzJ,IAAAA,cAAA,KACIsP,QAASquF,GACTvwF,MAAO,CAAC6wF,WAAY,UAEpBj+F,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,yBAGtB,OAtBV,IA6BA,EACbo0F,GAAAx1F,UAAA,CAjDEy1F,UAASh4F,IAAAA,QAmDb,SAAe9F,IAAAA,KAAW69F,IC/C1B,IAAe/1F,EAAAA,EAAAA,UANf,SAAyBxP,GACrB,MAAO,CACHwlG,UAAWxlG,EAAMuyB,SAASmrB,QAAQr7C,OAAOo9C,UAEjD,GAEA,CAAwC8lD,ICwBxC,MAAMK,WAAkCl+F,IAAAA,cACpC2F,MAAAA,GAAS,IAAAw4F,EAAAC,EAAAC,EAAAC,EACL,IAAIC,EAAiC,KACG,UAAnB,QAAjBJ,EAAAz7F,KAAKhD,MAAM/E,cAAM,IAAAwjG,OAAA,EAAjBA,EAAmBK,eAAuD,QAAhCJ,EAAI17F,KAAKhD,MAAM/E,OAAO8jG,kBAAU,IAAAL,GAA5BA,EAA8B7uE,SAC5EgvE,EACIv+F,IAAAA,cAAC4xF,GAAkB,CACf3xF,UAAU,qBACVovD,MAAO3sD,KAAKhD,MAAM/E,OAAO+jG,YACzB7U,UAAWnnF,KAAKhD,MAAM/E,OAAOgkG,gBAC7B9M,eAA2D,SAA3CnvF,KAAKhD,MAAM/E,OAAOikG,qBAClCp0F,KAAM9H,KAAKhD,MAAM/E,OAAO8jG,cAKpC,IAAII,EAAW,KACXn8F,KAAKhD,MAAMo/F,cACXD,EACI7+F,IAAAA,cAACkpF,EAAe,CACZhuF,KAAMwH,KAAKhD,MAAMo/F,YAAYpoG,MAAMwE,KACnCkE,QAASsD,KAAKhD,MAAMo/F,YAAYpoG,MAAM0I,QACtC+qF,iBAAiB,EACjBxuD,YAAaj5B,KAAKhD,MAAMqD,QAAQg8F,gBAK5C,IAAIC,EAAyB,KACzBC,EAA4B,KAC5BC,EAA+B,KAG/BC,EAAmC,KACL,UAAZ,QAAlBd,EAAA37F,KAAKhD,MAAMwtB,eAAO,IAAAmxE,OAAA,EAAlBA,EAAoB38D,SACpBs9D,EACIh/F,IAAAA,cAACg4F,GAAsB,MAE3BiH,EACIj/F,IAAAA,cAACytF,GAAyB,MAE9ByR,EACIl/F,IAAAA,cAACmwF,GAA4B,MAGjCgP,EAAoCn/F,IAAAA,cAACwrF,EAA2B,OAGpE,IAAI4T,EAAsB,KAiB1B,OAhBI18F,KAAKhD,MAAM0uF,cACXgR,EACIp/F,IAAAA,cAACq/F,GAAmB,OAexBr/F,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAC41F,GAAyB,MACzB2I,EACAM,EACD7+F,IAAAA,cAACm9F,GAA0B,CACvBjwE,QAASxqB,KAAKhD,MAAMwtB,QACpBkhE,YAAa1rF,KAAKhD,MAAM0uF,cAE3B4Q,EACAC,EACAC,EA7CkC,KACJ,KA+C9BC,EAC8B,UAAZ,QAAlBb,EAAA57F,KAAKhD,MAAMwtB,eAAO,IAAAoxE,OAAA,EAAlBA,EAAoB58D,QAAoB1hC,IAAAA,cAACo2F,GAAkB,MAC3DgJ,EACDp/F,IAAAA,cAAC08F,GAA2B,MAC5B18F,IAAAA,cAAC69F,GAAU,MACX79F,IAAAA,cAACs/F,GAA4B,CACzB3kG,OAAQ+H,KAAKhD,MAAM/E,OACnBuyB,QAASxqB,KAAKhD,MAAMwtB,QACpB8lE,oBAAqBtwF,KAAKhD,MAAMszF,oBAChCuM,kBAAmB78F,KAAKhD,MAAM6/F,oBAI9C,E,gBA3FErB,G,GAAyB,Y,GAAA,CAb3BlL,oBAAmBltF,IAAAA,KAAAC,WACnBqoF,YAAWtoF,IAAAA,KAAAC,WACX+4F,YAAWh5F,IAAAA,MAAA,CACPpP,MAAKoP,IAAAA,IAAAC,aAGThD,QAAO+C,IAAAA,MAAA,CACHi5F,aAAYj5F,IAAAA,KAAAC,WACZ+P,qBAAoBhQ,IAAAA,KAAAC,WACpBmQ,iBAAgBpQ,IAAAA,KAAAC,aAAAA,a,uYAkGxB,UAAey5F,EAAAA,EAAAA,GAAyBtB,ICzExC,IAAep2F,EAAAA,EAAAA,UAtCf,SAAyBxP,GAAoB,IAAAmnG,EACzC,MAAMzM,GAAsBnvD,EAAAA,EAAAA,IAAsBvrC,EAAO,CAACwrC,WAAYjX,EAAAA,GAAY6yE,gBAC5ExyE,GAAUC,EAAAA,EAAAA,IAAW70B,GACrBqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnBoS,ECrBH,SAA8BpS,GACjC,OAAOA,EAAMoS,OAAOvH,QAAQzM,GAAUA,EAAMipG,aAChD,CDmBmBC,CAAqBtnG,GAC9B+1F,EAA4B,SAAlBnhE,EAAQwU,MAClB7rB,EAAmC,QAAvB4pF,EAAGnnG,EAAMuyB,SAASmsB,aAAK,IAAAyoD,OAAA,EAApBA,EAAsB5pF,aACrCu4E,GAAclrD,EAAAA,EAAAA,IAAyB5qC,GAE7C,IAAIwmG,EAAc,KAKlB,OAJIp0F,GAAUA,EAAOtB,QAAU,IAC3B01F,EAAcp0F,EAAO,IAGlB,CACHwiB,UACAvyB,SACAq4F,sBACA8L,cACAzQ,UACAx4E,eACAu4E,cAER,IAEA,SAA4B/3F,GACxB,MAAMwpG,EAAoBd,EAAAA,GAAae,KAAK,KAAM,GAClD,MAAO,CACH/8F,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB5N,qBAAoB,KACpB2kG,aAAcc,EACdhrE,cAAa,IACb/e,qBAAoB,KACpBI,iBAAgBA,EAAAA,IACjB7f,GAEX,GAEA,CAA4D6nG,G,yHE5C5D,MAAMpK,EAAiCp0F,IACnC,MAAOqgG,IAAiB5O,EAAAA,EAAAA,KASxB,OACInxF,IAAAA,cAAA,UACIjJ,GAAI2I,EAAMsgG,QACV//F,UAAW,gCACXqP,QAXwB/Y,UAC5B4I,EAAEyK,kBACFrL,EAAAA,EAAAA,IAAW,QAASmB,EAAMsgG,SAAW,6BAErCD,GAAe,GASVrgG,EAAMq0F,kBACF,EAEfD,EAAAzrF,UAAA,CAvBE0rF,kBAAiBjuF,IAAAA,QAAAC,WACjBi6F,QAAOl6F,IAAAA,QAwBX,S,wQClCO,IAAKm6F,EAAI,SAAJA,GAAI,OAAJA,EAAAA,EAAI,eAAJA,EAAAA,EAAI,qBAAJA,EAAAA,EAAI,mBAAJA,CAAI,M,sTC+BhB,MAiDMC,EAAmBxgG,IACrB,MAAM,MACFiuC,EAAK,QACL5qC,EAAO,QACPo+B,EAAO,KACPg/D,EAAI,QACJ/6E,EAAO,WACPk1B,EAAU,YACV8lD,GACA1gG,EAEEo7F,GAAUC,EAAAA,EAAAA,eAEV,cAACvxF,IAAiBgQ,EAAAA,EAAAA,YAEjB6mF,EAAUC,IAAe/mF,EAAAA,EAAAA,UAASzV,KAAKiU,MAAMopB,EAAQ/3B,OAhEzC,OAiEZm3F,EAAmBC,IAAwBjnF,EAAAA,EAAAA,UAAS0mF,EAAKQ,OACzDC,EAAkBC,IAAuBpnF,EAAAA,EAAAA,eAA6Bve,GAEvE4lG,GAAoB/0C,EAAAA,EAAAA,QAA8B,MAClDg1C,GAAsBh1C,EAAAA,EAAAA,QAAgC,OACrDi1C,EAAYC,IAAiBxnF,EAAAA,EAAAA,WAAS,IAE7C6rC,EAAAA,EAAAA,YAAU,KACF07C,IACIF,EAAkBnuF,SAClBmuF,EAAkBnuF,QAAQuuF,0BAE1BH,EAAoBpuF,SACpBouF,EAAoBpuF,QAAQwuF,gBAAgB,IAGpDF,GAAc,EAAK,GACpB,CAAC5/D,EAAQ/3B,OAAQ03F,IAEpB,MA0BMI,EAA6B,KAAf5mD,EACd6mD,GAAeD,GAAe//D,EAAQ/3B,OAASukC,EAAMxtB,aACrDihF,GAAaF,GAAeC,EAAchgE,EAAQ/3B,OAAS,EAAI+3B,EAAQ/3B,OAEvEi4F,EAAgBH,GAAeX,IAAsBN,EAAKqB,QAAU,OA9BrD/qG,UACjBiqG,EAAqBP,EAAKqB,gBACRv+F,EAAQw+F,gBAAgB5zD,EAAM52C,GAAIspG,EAtFrC,IAsF+D,iBACtE1pG,MACJ2pG,EAAYD,EAAW,GACvBG,EAAqBP,EAAKQ,OAE1BD,EAAqBP,EAAKuB,OAC9B,EAwBEC,EAAgB39F,KAAKinD,IAzGA,IAyGqBjnD,KAAKs2D,IA1GjC,IAPa,GAiHyCx5D,EAAAA,KAAwBs4D,IAE5FwoC,EAAgB/yF,GACXuyF,IAAgBC,GAAexyF,EAAQwyB,EAAQ/3B,OAGpD+zE,EAAOhlF,IAA6C,IAA5C,MAACwW,EAAK,MAAEvB,GAA+BjV,EACjD,MAAMkH,GAAS03C,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAAqpG,EAAAC,EAAA,OAAKj9C,EAAAA,EAAAA,IAAmBrsD,EAAqB,QAAhBqpG,EAAExgE,EAAQxyB,UAAM,IAAAgzF,GAAM,QAANC,EAAdD,EAAgBv+F,YAAI,IAAAw+F,OAAN,EAAdA,EAAsB7qG,KAAO2+C,EAAAA,GAAamsD,OAAO,IAK9H,GAFAz0F,EAAMkB,YAAStT,EAEX0mG,EAAa/yF,GAAQ,KAAAmzF,EAAAC,EACrB,MAAM3+F,EAAO+9B,EAAQxyB,GAAOvL,KACtBjD,EAAOghC,EAAQxyB,GAAOnI,YAE5B,OACIxG,IAAAA,cAACgiG,EAAY,CACT/hG,UAAU,yBACV48D,MAAiB,IAAVluD,EACP86C,KAAM96C,IAAUg/B,EAAMxtB,aAAe,EACrC/S,MAAOA,EACP1P,IAAK0F,EAAKrM,GACV+V,KAAK,YAEL9M,IAAAA,cAACiiG,EAAAA,EAAc,CACX/qG,OAAQkM,EAAKrM,GACbwX,IAAK3N,EAAAA,GAA8B,QAATkhG,EAAC1+F,aAAI,EAAJA,EAAMrM,UAAE,IAAA+qG,EAAAA,EAAI,IACvCI,WAAY9+F,EAAKnC,QAEjBjB,IAAAA,cAACmiG,EAAU,KACPniG,IAAAA,cAAA,QAAMC,UAAU,kBACZD,IAAAA,cAACa,EAAAA,EAAM,CACHN,SAAU6C,EAAK7C,SACfO,KAAM,KACNC,IAAKH,EAAAA,GAA8B,QAATmhG,EAAC3+F,aAAI,EAAJA,EAAMrM,UAAE,IAAAgrG,EAAAA,EAAI,IACvC9hG,UAAW,sBACXu1D,UAAW,IAEfx1D,IAAAA,cAACoiG,EAAAA,EAAU,CACP/iG,OAAQA,KAGhBW,IAAAA,cAACqiG,EAAQ,CAACpiG,UAAU,kCAAkCE,GACtDH,IAAAA,cAACsiG,EAAG,CAACriG,UAAU,4BAGvBD,IAAAA,cAACuiG,GAAW,CAACtiG,UAAU,+BACnBD,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO1E,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,kBAElFzJ,IAAAA,cAACwiG,GAAQ,CACLviG,UAAU,sBACV,aAAYuJ,EACR,CAACzS,GAAI,sCAAuC0S,eAAgB,0BAC5D,CAACrG,KAAMjD,IACXmP,QAASA,IA7EVlM,UACEpI,IAArB0lG,IAGJC,EAAoBv9F,EAAKrM,IACzBgM,EAAQyiB,0BAA0BpiB,EAAKrM,IAAImV,MAAMwI,IACxCA,EAAOhe,QACRqM,EAAQkb,qBACR0iF,OAAoB3lG,GACpBmlG,SAAAA,IACArF,EAAQ9oF,KAAK,GAADrR,OAAIykB,EAAO,eAAAzkB,OAAcyC,EAAK7C,WAC9C,IACF,EAiEqCkiG,CAAkBr/F,IAEjCpD,IAAAA,cAAA,KACIC,UAAU,sBAOtC,CAEA,OACID,IAAAA,cAAC0iG,GAAW,CACRt1F,MAAOA,EACPyvD,MAAiB,IAAVluD,EACP86C,KAAM96C,IAAUwyB,EAAQ/3B,QAExBpJ,IAAAA,cAAC4N,EAAAA,EAAc,MACL,EA6EtB,OACI5N,IAAAA,cAAC2iG,EAAQ,CACLv1F,MAAO,CAACkB,OAAQxK,KAAKinD,IAAI02C,GAvQP1mD,EAuQoCpN,EAAMxtB,aA1QpD,GAG2B46B,EAAsB,MAwQzDjuC,KAAK,QA3ELszF,IAAgBH,EAAKqB,QAEjBthG,IAAAA,cAAC4iG,GAAgB,KACb5iG,IAAAA,cAAC4N,EAAAA,EAAc,OAGhBwyF,IAAgBH,EAAKuB,OAExBxhG,IAAAA,cAAC6iG,GAAc,KACX7iG,IAAAA,cAAA,YACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,iFAKxBy3F,GAAkC,IAAnB//D,EAAQ/3B,OAE1BpJ,IAAAA,cAAC8iG,GAAa,KACV9iG,IAAAA,cAAC+iG,EAAAA,EAAkB,CACf1b,QAAS2b,EAAAA,EAAiBC,cAC1BC,YAAa,CAACtjG,YAAa,IAAFe,OAAM25C,EAAU,SAI9CimD,IAAsBN,EAAKuB,OAE9BxhG,IAAAA,cAAC6iG,GAAc,KACX7iG,IAAAA,cAAA,YACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,yDAElB,IACDzJ,IAAAA,cAACmjG,GAAW,CACR7zF,QAAS+xF,GAETrhG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,aAO/BzJ,IAAAA,cAACojG,EAAAA,EAAS,MACbxlG,IAAA,IAAC,OAAC0Q,EAAM,MAAED,GAAMzQ,EAAA,OACboC,IAAAA,cAACqjG,EAAAA,EAAc,CACXzoD,IAAKgmD,EACL0C,aAAc5B,EACdN,UAAWA,EACXC,cAAeA,EACfkC,UAAW,IAEVjtC,IAAA,IAAC,gBAACktC,EAAe,IAAE5oD,GAAI0b,EAAA,OACpBt2D,IAAAA,cAACyjG,EAAAA,GAAgB,CACbrC,UAAWA,EACXoC,gBAAiBA,EACjB5oD,IAAKA,EACL8oD,SAAW/0F,GAAkC,IAAVA,GAAeA,IAAUg/B,EAAMxtB,aAAe,GAAKxR,IAAUwyB,EAAQ/3B,OAAS,EA3P1Fu6F,GAF/B,GA8PQr1F,OAAQA,EACRD,MAAOA,GAEN8uE,EACc,GACV,KAhQHpiC,KA2QX,EAEjBmlD,EAAA73F,UAAA,CAxPE83F,KAAIr6F,IAAAA,KAAAC,WAUJo7B,QAAOr7B,IAAAA,QAAAA,IAAAA,MAAA,CAvBPU,YAAWV,IAAAA,OAAAC,cAAAA,WAwBXqf,QAAOtf,IAAAA,OAAAC,WACPu0C,WAAUx0C,IAAAA,OAAAC,WAEVhD,QAAO+C,IAAAA,MAAA,CACHy7F,gBAAez7F,IAAAA,KAAAC,WACfyf,0BAAyB1f,IAAAA,KAAAC,WACzBkY,mBAAkBnY,IAAAA,KAAAC,aAAAA,YAyO1B,MAAM48F,EAAW9gD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,YAAVq7C,CAAU,+IASrBmgD,EAAengD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,gBAAVq7C,CAAU,4UACxBniD,GAAUA,EAAMm9D,QAASxG,EAAAA,EAAAA,KAAG,sBA3RpB,KA+RR32D,GAAUA,EAAM+pD,OAAQ4M,EAAAA,EAAAA,KAAG,yBA/RnB,KA0TT8rC,EAAatgD,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,cAAbq7C,CAAa,gHAW1BygD,EAAMzgD,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,OAAXq7C,CAAW,+CAMjBwgD,EAAWxgD,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,YAAXq7C,CAAW,sCAKtB0gD,GAAc1gD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,eAAVq7C,CAAU,qFASxB2gD,GAAW3gD,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,YAAbq7C,CAAa,6CASxB6gD,GAAc7gD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,eAAVq7C,CAAU,yGACvBniD,GAAUA,EAAMm9D,QAASxG,EAAAA,EAAAA,KAAG,uBAnWpB,KAuWR32D,GAAUA,EAAM+pD,OAAQ4M,EAAAA,EAAAA,KAAG,0BAvWnB,IADK,IAmXdusC,GAAmB/gD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,oBAAVq7C,CAAU,2FAQ7BghD,GAAiBhhD,IAAO+gD,IAAiB9gD,WAAA,CAAAt7C,YAAA,kBAAxBq7C,CAAwB,qGAOzCihD,GAAgBjhD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,iBAAVq7C,CAAU,8DAM1BshD,GAActhD,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,eAAbq7C,CAAa,oFAQjC,GAAe7hD,IAAAA,KAAWkgG,GCzZpB0D,GAAkBA,CACpB33D,EACA43D,KAEA,MAAMC,EAA8B,GAYpC,OAXA73D,EAASvjC,SAASq7F,IACdD,EAAa9xF,KAAK,CACd5O,KAAM2gG,EACNv9F,aAAajD,EAAAA,EAAAA,IAAgBwgG,EAASF,IACxC,IAGNC,EAAajrC,MAAK,CAACjW,EAAGtwC,IACXswC,EAAEp8C,YAAYsyD,cAAcxmD,EAAE9L,eAGlCs9F,CAAY,EAGjBE,IAAiC55C,EAAAA,EAAAA,IACnC,iCACA65C,EAAAA,GACAl8F,EAAAA,GACA67F,IAGEM,IAAoC95C,EAAAA,EAAAA,IACtC,oCACA+5C,EAAAA,GACAp8F,EAAAA,GACA67F,IA8BJ,IAAe97F,EAAAA,EAAAA,UA3Bf,SAAyBxP,EAAoB2hC,GACzC,MAAMqgB,EAAahiD,EAAM8kD,MAAMx6B,OAAOwhF,cAEtC,IAAIjjE,EAAyB,GAO7B,OALIA,EADAmZ,EACU4pD,GAAkC5rG,EAAO2hC,EAAS0T,MAAM52C,GAAIujD,GAE5D0pD,GAA+B1rG,EAAO2hC,EAAS0T,MAAM52C,IAG5D,CACHoqC,UACAmZ,aACAl1B,SAASE,EAAAA,EAAAA,IAA0BhtB,GAE3C,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBu5F,gBAAe,KACf/7E,0BAAyB,KACzBvH,mBAAkBA,EAAAA,IACnB5nB,GAEX,GAEA,CAA4D6pG,I,4BCnD5D,MAAMmE,GAAmBlsG,IAIZ,IAJa,MACtBw1C,EAAK,KACLwyD,EAAI,YACJlf,GACI9oF,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClB8qF,GAAWz4C,EAAAA,EAAAA,QAA0B,MAErCx1D,GAAWsxD,EAAAA,EAAAA,eAEXrN,GAAavD,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAM8kD,MAAMx6B,OAAOwhF,iBAEnEhE,EAAamE,IAAkBhrF,EAAAA,EAAAA,UAAS0mF,EAAKQ,MAE9C+D,GAAW/qF,EAAAA,EAAAA,aAAY0yC,KAAS51D,iBAChBF,GAASmoD,EAAAA,EAAAA,GAAe5mB,EAAM,CAAC6sE,YAAa92D,EAAM52C,OAC5DJ,KACJ4tG,EAAetE,EAAKQ,MAEpB8D,EAAetE,EAAKuB,OACxB,GACD/7E,EAAAA,GAAU41B,6BAA8B,KAE3C+J,EAAAA,EAAAA,YAAU,KAENljD,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQ8pC,EAAS7xF,QACjBmyF,cAAc,MAO1BvuG,GAAS0hC,EAAAA,EAAAA,IAAqB,KACvB,KACH1hC,GAAS0hC,EAAAA,EAAAA,IAAqB,IAAI,IAEvC,KAEHqtB,EAAAA,EAAAA,YAAU,KACF9K,GACAiqD,EAAetE,EAAKqB,SACpBkD,EAASlqD,KAETiqD,EAAetE,EAAKQ,MACpB+D,EAAStoC,SACb,GACD,CAAC5hB,EAAYkqD,IAEhB,MAAMK,EAAkBA,KACpBxuG,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiB+xF,YAC1B7xF,WAAY8xF,GAAAA,EACZ7xF,YAAa,CACT8xF,iBAAkBH,EAClBj4F,SAAUq0E,KAEf,EAGDgkB,EAAqBA,KACvB9E,IACA9pG,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBmyF,gBAC1BjyF,WAAYkyF,GAAAA,EACZjyF,YAAa,CACTkrC,QAASzQ,EAAM52C,GACfquG,mBAAoBP,EACpBG,iBAAkBC,EAClBr4F,SAAUq0E,KAEf,EAgBP,OACIjhF,IAAAA,cAACyN,GAAI,KACDzN,IAAAA,cAACkN,GAAM,KACHlN,IAAAA,cAACqlG,GAAO,KACJrlG,IAAAA,cAACsN,GAAK,CACFrN,UAAU,kCAET0tC,EAAM9tC,cAEXG,IAAAA,cAACslG,GAAW,CACRrlG,UAAU,kCACV,aAAYuJ,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,6BAC3E6F,QAzBAqsB,KAChBwkE,IACAlf,GAAa,EAwBGrmC,IAAK0pD,GAELtkG,IAAAA,cAAA,KACIC,UAAU,sBAItBD,IAAAA,cAACulG,GAAQ,KACLvlG,IAAAA,cAAA,QAAMC,UAAU,kCAAkC,IAAK0tC,EAAMxtC,MAC7DH,IAAAA,cAACwlG,GAAG,KAAE,KACNxlG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,sEACfjB,OAAQ,CACJ2X,aAAcwtB,EAAMxtB,cAExBopD,QAASk8B,MAGjBzlG,IAAAA,cAAC0lG,GAAY,CACT,gBAAA/kG,OAAegtC,EAAM9tC,aAAY,MAAAc,OAAKgtC,EAAMxtC,KAAI,KAAAQ,OAAI6I,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,uEAAwE,CAAC0W,aAAcwtB,EAAMxtB,eAAc,KAAAxf,OAAI6I,EAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,0BAChT6F,QAAS21F,EACThlG,UAAU,sCAGjB0tC,EAAMxtB,aAAe,GAClBngB,IAAAA,cAAC2lG,GAAS,KACN3lG,IAAAA,cAAC4lG,EAAAA,YAAW,MACZ5lG,IAAAA,cAAC6lG,EAAAA,EAAU,CACP3qG,KAAK,OACL+E,UAAU,gCACVoE,YAAamF,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,mBACzFjG,MAAO82C,EACP33C,SAtDEkV,IAClBxhB,GAAS0hC,EAAAA,EAAAA,IAAqBlgB,EAAM2iD,OAAOh3D,OAAO,EAsDlCsiG,WAAW,EACXC,QApDAC,KAChB3vG,GAAS0hC,EAAAA,EAAAA,IAAqB,IAAI,KAsD1B,KACJ/3B,IAAAA,cAACkgG,GAAe,CACZvyD,MAAOA,EACPwyD,KAAMA,EACNC,YAAaA,IAEd,EAEbiE,GAAAh8F,UAAA,CAzJE83F,KAAIr6F,IAAAA,KAAAC,WACJk7E,YAAWn7E,IAAAA,KAAAC,YA0Jf,MAAM0H,GAAOo0C,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,QAAVq7C,CAAU,kKAQjB30C,GAAS20C,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,UAAVq7C,CAAU,yGASnB6jD,GAAe7jD,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,gBAAbq7C,CAAa,iIAc5Bv0C,GAAQu0C,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,SAAXq7C,CAAW,oBAInByjD,GAAczjD,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,eAAbq7C,CAAa,kLAoB3BwjD,GAAUxjD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,WAAVq7C,CAAU,yGAQpB0jD,GAAW1jD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,YAAVq7C,CAAU,mFAMrB4jD,GAAW5jD,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,YAAXq7C,CAAW,oBAItB2jD,GAAM3jD,IAAO4jD,IAAS3jD,WAAA,CAAAt7C,YAAA,OAAhBq7C,CAAgB,oBAItB8jD,GAAY9jD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,aAAVq7C,CAAU,8uBA2D5B,GAAe7hD,IAAAA,KAAWqkG,IC7RnB,SAAS4B,GAA2BvmG,GACvC,MAAOwmG,EAAQC,IAAW5sF,EAAAA,EAAAA,WAAS,IAE7B,KAAC4zC,EAAI,eAAEi5C,EAAgBt2F,QAASu2F,IAAmB/4C,EAAAA,EAAAA,IAAY,CACjE37C,KAAMu0F,EACN34C,aAAc44C,EACdhmB,qBAAsBC,EAAAA,GACtB3yB,WAAY,EAAC64C,EAAAA,EAAAA,UAGX,UAACC,EAAWnkG,OAAQokG,IAAoBC,EAAAA,EAAAA,IAAoBJ,EAAiB,CAC/EK,SAAU,CACN/0F,KJ3CoC,II4CpCuiB,MJ3CoC,OI+CtCyyE,EAAyBvmG,OAAOC,OAAO,CAAC,EAAG+lG,EAAgBI,GAE3DI,GAAoB/4C,EAAAA,EAAAA,IAASw4C,GAE7BQ,GAAqBz4C,EAAAA,EAAAA,IAAWi4C,GAEhCv5F,GAAO6zE,EAAAA,EAAAA,IAAQ0lB,IAEf,kBAACv4C,EAAiB,iBAAEE,IAAoBE,EAAAA,EAAAA,IAAgB,CAC1D04C,EACAC,EACA/5F,IAGEnC,GAAa8O,EAAAA,EAAAA,cAAY,KAC3B0sF,GAAQ,EAAM,GACf,IAEH,OACInmG,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAAI,OAAAC,OAAA,CACIu6C,IAAKuS,EAAKC,cACNU,KAEHpuD,EAAM20D,UAGVkyC,GACGvmG,IAAAA,cAAC8gF,EAAAA,GAAc,CAAC/pF,GAAG,eACfiJ,IAAAA,cAAC8mG,EAAAA,GAAe,CACZ/vG,GAAG,sCACHkJ,UAAU,sCACV8mG,YAAY,GAEZ/mG,IAAAA,cAAC+gF,EAAAA,GAAoB,CAACjxE,QAASu2F,GAC3BrmG,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKuS,EAAKE,YACVjgD,MAAOu5F,EACP1mG,UAAW8yE,EAAAA,GAAeG,OACtBllB,KAEJhuD,IAAAA,cAACqkG,GAAgB,CACb12D,MAAOjuC,EAAMiuC,MACbszC,YAAavhF,EAAMuhF,YACnBkf,KAAMx1F,QAS1C,CAACs7F,GAAA59F,UAAA,CAnFGgsD,SAAQvuD,IAAAA,KAAAC,WAURk7E,YAAWn7E,IAAAA,KAAAC,YChCf,YCwBMihG,GAAatnG,IACf,MAAMk7C,GAAMiR,EAAAA,EAAAA,QAA0B,OAE/BzoD,EAAMuqC,IAASh0B,EAAAA,EAAAA,UAClB,KAAMstF,EAAAA,EAAAA,IAA8BvnG,EAAMwnG,YAAaxnG,EAAMynG,gBAAiBznG,EAAM0nG,aAAc1nG,EAAM2nG,wBACxG,CAAC3nG,EAAMwnG,YAAaxnG,EAAMynG,gBAAiBznG,EAAM0nG,aAAc1nG,EAAM2nG,yBAGzEjiD,EAAAA,EAAAA,YAAU,KACDhiD,GAASuqC,IAASjuC,EAAM4nG,mBACzB5nG,EAAM6nG,yBAAyB7nG,EAAMwnG,YACzC,GACD,CAACxnG,EAAMwnG,cAEV,MAAMjmB,EAAcA,KAChB/+E,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQ5f,EAAInoC,QACZmyF,cAAc,KAGxB,EAGN,GAAIxhG,EAAM,CACN,MAAMokG,EAAwB9nG,EAAMwnG,YAAY53E,UAAUlsB,EAAK7C,SAAS6I,QAClEq+F,GAAkBlkG,EAAAA,EAAAA,IAAgBH,EAAM1D,EAAM4D,qBAC9CokG,GAAoBhoG,EAAMioG,kBAAoBvkG,EAAKrM,KAAO2I,EAAMomB,cAEtE,OACI9lB,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACiiG,EAAAA,EAAc,CACX2F,sBAAuBzwD,IAAW,CAAC,qBAAsBuwD,IACzDxwG,OAAQkM,EAAKrM,GACbwX,IAAKvW,EAAAA,GAAQ4lD,qBAAqBx6C,EAAKrM,GAAIqM,EAAKy6C,qBAChDzrC,UAAW1S,EAAM0S,UACjB6uE,YAAaA,GAEbjhF,IAAAA,cAAA,KACI46C,IAAKA,EACL36C,UAAU,eACV6M,KAAK,SACL0oD,SAAU,GAET,IAAMiyC,IAGdD,EAGb,CAAO,GAAI75D,EAAO,CACd,MAAMk6D,EAAyBnoG,EAAMwnG,YAAY53E,UAAUqe,EAAMxtC,KAAKiJ,QAChE0+F,EAAmBn6D,EAAMxtC,KAE/B,OACIH,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACqkG,GAAgB,CACb12D,MAAOA,EACPszC,YAAaA,GAEbjhF,IAAAA,cAAA,KACI46C,IAAKA,EACL36C,UAAU,qBACV6M,KAAK,SACL0oD,SAAU,GAET,IAAMsyC,IAGdD,EAGb,CAEA,OAAO7nG,IAAAA,cAAAA,IAAAA,SAAA,KAAGN,EAAM20D,SAAY,EAC9B2yC,GAAA3+F,UAAA,CAtFE6+F,YAAWphG,IAAAA,OAAAC,WACXsuD,SAAQvuD,IAAAA,KACRsM,UAAStM,IAAAA,OACT6hG,iBAAgB7hG,IAAAA,KAChBuhG,sBAAqBvhG,IAAAA,KACrBwhG,kBAAiBxhG,IAAAA,MAmFrB,UAAeypD,EAAAA,EAAAA,MAAKy3C,ICnFdp9C,GAAqB,CACvB29C,yBCdG,SAAkC/8F,GACrC,OAAOu9F,EAAAA,EAAAA,KAA8BC,EAAAA,EAAAA,IAA4Bx9F,GACrE,GDkBA,IAHkB1C,EAAAA,EAAAA,UAblB,SAAyBxP,GACrB,MAAO,CACHwtB,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAChCgL,qBAAqByE,EAAAA,EAAAA,IAA8BzP,GACnD6uG,iBAAiBc,EAAAA,EAAAA,IAAmB3vG,GACpC8uG,cAAcc,EAAAA,EAAAA,IAA+B5vG,GAErD,GAM2CsxD,GAG3C,CAAyBo9C,G,ugBEeV,MAAMmB,UAA6BnoG,IAAAA,cAY9CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,iBAOLrD,IACHA,GAAMA,EAAEq7D,QAIb93D,KAAKgH,SAAS,CAACu9C,MAAO9nD,EAAEq7D,OAAOh3D,OAAO,IACzChB,EAAA,uBAEiB0D,IACdxD,KAAKgH,SAAS,CAACu9C,MAAO,KAElBvkD,KAAKhD,MAAM0oG,YACX1lG,KAAKhD,MAAM0oG,WAAWliG,GAG1BmiG,uBAAsB,KACd3lG,KAAK4lG,eACL5lG,KAAK4lG,cAAc//B,MACvB,GACF,IACL/lE,EAAA,yBAEmBo4C,IAChBl4C,KAAK4lG,cAAgB1tD,CAAG,IAC3Bp4C,EAAA,gBAES,KACNE,KAAKgH,SAAS,CAAC6+F,SAAS,IAEpB7lG,KAAKhD,MAAM8oG,aACX9lG,KAAKhD,MAAM8oG,aAAY,EAC3B,IACHhmG,EAAA,eAEQ,KACLE,KAAKgH,SAAS,CAAC6+F,SAAS,IAEpB7lG,KAAKhD,MAAM8oG,aACX9lG,KAAKhD,MAAM8oG,aAAY,EAC3B,IA5CA9lG,KAAKpK,MAAQ,CACT2uD,MAAO,GAEf,CA4CAthD,MAAAA,GACI,MAAM,UACF8iG,EAAS,YACTpkG,EAAW,OACXqkG,EAAM,MACN9mG,EAAK,eACL+mG,EAAc,SACd/iG,EAAQ,eACRgjG,EAAc,MACdplG,EAAK,SACL6D,EAAQ,cACRO,EAAa,aACbihG,GACAnmG,KAAKhD,OAEH,QAAC6oG,GAAW7lG,KAAKpK,MACvB,IAMIwwG,EAWAliG,GAjBA,MAACqgD,GAASvkD,KAAKpK,MA0BnB,OAxBKiwG,IACDthD,EAAQzjD,GAIR5B,IACAknG,EACI9oG,IAAAA,cAAA,SACIC,UAAW,iBAAmB0oG,GAE7B/mG,IAMTgE,IACAgB,EACI5G,IAAAA,cAAA,OAAKC,UAAU,aACV2F,IAMT5F,IAAAA,cAAA,OACI,cAAY,uBACZC,UAAU,cAET6oG,EACD9oG,IAAAA,cAAA,OAAKC,UAAW2oG,GACZ5oG,IAAAA,cAAC+oG,EAAAA,EAEG,CACAnuD,IAAKl4C,KAAKsmG,iBACV3kG,YAAaA,EACbuD,cAAeA,EACf3H,UAAU,eACVgpG,eAAe,8BACfzlG,MAAOyjD,EACPtkD,SAAUD,KAAKC,SACfumG,eAAgBxmG,KAAK6E,eACrB0vE,QAASv0E,KAAKu0E,QACdD,OAAQt0E,KAAKs0E,OACbyxB,UAAWA,EACXU,eAAe,EACfC,iBAAiB,EACjBC,aAAa,EACbC,eAAe,EACfC,yBAAyB,EACzBliG,SAAUA,EACVwhG,aAAcA,IAEjBjiG,EACA8hG,GAIjB,EACHlmG,EA3IoB2lG,EAAoB,aAzBrCpxG,GAAE+O,IAAAA,OACF2iG,UAAS3iG,IAAAA,MAAAC,WACTvC,MAAKsC,IAAAA,OACLsiG,WAAUtiG,IAAAA,KACVlE,MAAKkE,IAAAA,UAAA,CAAAA,IAAAA,KAAAA,IAAAA,SACL6iG,eAAc7iG,IAAAA,OACd8iG,eAAc9iG,IAAAA,OACdF,SAAQE,IAAAA,UAAA,CAAAA,IAAAA,KAAAA,IAAAA,SACRzB,YAAWyB,IAAAA,OAEXuB,SAAQvB,IAAAA,KACR0iG,YAAW1iG,IAAAA,UAAA,CAAAA,IAAAA,KAAAA,IAAAA,MAAA,UACX8B,cAAa9B,IAAAA,UAAA,CAAAA,IAAAA,IAAAA,IAAAA,MACb+iG,aAAY/iG,IAAAA,SAAAtD,EAYK2lG,EAAoB,eACf,CAClBpxG,GAAI,GACJyM,MAAO,GACPmlG,eAAgB,GAChBC,eAAgB,GAChBhhG,cAAegH,EAAAA,EACfi6F,aAAc,O,4HCpDtB,MAAA/oD,EAAA,6GAoBM19C,EAAS,CACXonG,UAAW,CACPl7F,OAAQ,EACRm7F,SAAU,UAEdC,UAAW,CACPp7F,OAAQ,OACRD,MAAO,OACPs7F,QAAS,eACT9iD,SAAU,WACVnG,UAAW,oBACXkpD,UAAW,cAEfvlG,YAAa,CACTolG,SAAU,SACVI,aAAc,WACdtoD,QAAS,IACTuoD,cAAe,OACfjjD,SAAU,WACVkjD,WAAY,SACZC,WAAY,OACZC,YAAa,eAEjBC,SAAU,CACNC,UAAW,SAIbC,EAAmBpqG,IAAAA,YAA6C,CAAA7H,EAgB5DyiD,KAAQ,IAAAyvD,EAAA,IAhBqD,GAMnEtzG,EAAK,oBAAmB,SACxBsQ,EAAQ,MACR7D,EAAK,aACLoF,EAAY,SACZjG,EAAQ,eACRo0E,EAAc,cACdM,EAAa,QACbizB,EAAO,YACPjmG,GAEIlM,EADDkhF,EA/DP,SAAAl6E,EAAA4gB,GAAA,SAAA5gB,EAAA,aAAAkQ,EAAAoxC,EAAAre,EAAA,SAAAqe,EAAAthD,GAAA,SAAAshD,EAAA,aAAA1gC,EAAA,WAAAwqF,KAAA9pD,EAAA,MAAA+pD,eAAAt5F,KAAAuvC,EAAA8pD,GAAA,IAAAprG,EAAAgtC,SAAAo+D,GAAA,SAAAxqF,EAAAwqF,GAAA9pD,EAAA8pD,EAAA,QAAAxqF,CAAA,CAAA0qF,CAAAtrG,EAAA4gB,GAAA,GAAA3f,OAAAsqG,sBAAA,KAAAC,EAAAvqG,OAAAsqG,sBAAAvrG,GAAA,IAAAshD,EAAA,EAAAA,EAAAkqD,EAAAvhG,OAAAq3C,IAAApxC,EAAAs7F,EAAAlqD,GAAA1gC,EAAAosB,SAAA98B,IAAA,GAAAu7F,qBAAA15F,KAAA/R,EAAAkQ,KAAA+yB,EAAA/yB,GAAAlQ,EAAAkQ,GAAA,QAAA+yB,CAAA,CA+DiByd,CAAA1nD,EAAA2nD,GAEb,MAAMxxC,GAASu9C,EAAAA,EAAAA,QAAO,GAChBmS,GAAWnS,EAAAA,EAAAA,UACXg/C,GAAeh/C,EAAAA,EAAAA,QAAuB,MAmCtCi/C,GAAiBrxF,EAAAA,EAAAA,cAAasxF,IAC5BnwD,IACmB,mBAARA,EACPA,EAAImwD,GAEJnwD,EAAInoC,QAAUs4F,GAItB/sC,EAASvrD,QAAUs4F,CAAW,GAC/B,CAACnwD,KAEJwK,EAAAA,EAAAA,YAAU,KA7CgB4lD,MACtB,IAAKH,EAAap4F,UAAYurD,EAASvrD,QACnC,OAGJ,MAAMw4F,EAAeJ,EAAap4F,QAAQw4F,aACpCC,EAAkBltC,EAASvrD,QAEjC,GAAIw4F,EAAe,GAAKA,IAAiB38F,EAAOmE,QAAS,CACrD,MAAMrF,EAAQ+9F,iBAAiBD,GAG/BA,EAAgB99F,MAAMkB,OAAS,GAAH3N,OAAMsqG,EAAY,MAE9C38F,EAAOmE,QAAUw4F,EAEjBl0B,SAAAA,EAAiBk0B,EAAchhD,SAAS78C,EAAMmmE,WAAa,IAAK,IACpE,GA6BAy3B,GA1BqBI,MAAM,IAAAC,EAC3B,IAAKR,EAAap4F,QACd,OAGJ,MAAMpE,GAA4B,QAApBg9F,EAAAR,EAAap4F,eAAO,IAAA44F,OAAA,EAApBA,EAAsBr3B,eAAgB,EAChD3lE,GAAS,GACTqD,OAAO22F,uBAAsB,KACzBhxB,SAAAA,EAAgBhpE,EAAM,GAE9B,EAiBA+8F,EAAkB,IAGtB,MAAME,EAAc,CAChBC,KAAM,EACNj9F,OAAQ,GAGRA,EAAOmE,SAAW,EAElB64F,EAAYC,KAAO,EAEnBD,EAAYh9F,OAASA,EAAOmE,QAGhC,IAAI+4F,EAAiBhoG,GAASoF,EAY9B,OAXkB,QAAlByhG,EAAImB,SAAc,IAAAnB,GAAdA,EAAgB/zD,SAAS,QAQzBk1D,GAAkB,MAIlBxrG,IAAAA,cAAA,WACIA,IAAAA,cAAA,WAAAI,OAAAC,OAAA,CACIu6C,IAAKkwD,EACL,cAAa/zG,EACbA,GAAIA,GACAu0G,EACAjyB,EAAU,CACdh1E,YAAaA,EACbyI,KAAK,UACL2+F,IAAI,OACJpkG,SAAUA,EACV1E,SAAUA,EACV2nG,QAASA,EACT9mG,MAAOA,EACPoF,aAAcA,EACdwE,MAAOhL,EAAO8nG,YAElBlqG,IAAAA,cAAA,OAAKoN,MAAOhL,EAAOonG,WACfxpG,IAAAA,cAAA,OACI46C,IAAKiwD,EACL9zG,GAAIA,EAAK,aACTkJ,UAAWo5E,EAAWp5E,UACtBmN,MAAOhL,EAAOsnG,UACd+B,IAAI,OACJpkG,UAAU,EACV,eAAa,GAEZmkG,IAGP,IAEXpB,EAAA/hG,UAAA,CAxKCtR,GAAE+O,IAAAA,OACF7F,UAAS6F,IAAAA,OACTuB,SAAQvB,IAAAA,KACRtC,MAAKsC,IAAAA,OACL8C,aAAY9C,IAAAA,OACZnD,SAAQmD,IAAAA,KACRixE,eAAcjxE,IAAAA,KACduxE,cAAavxE,IAAAA,KACbwkG,QAAOxkG,IAAAA,KACPzB,YAAWyB,IAAAA,QAiKf,QAAe9F,IAAAA,KAAWoqG,E,8hBCjJ1B,MAAMsB,GAAoBC,EAAAA,EAAAA,MAEpBC,EAAelsG,IACjB,MAAM,MACFiuC,EAAK,WACL6M,EAAU,YACVG,EAAW,gBACXE,EACAH,YAAAA,EAAW,eACXmxD,GACAnsG,EAEEosG,GAA+BC,EAAAA,EAAAA,MAE/B9/D,GAAW8K,EAAAA,EAAAA,cAAaz+C,GAAuBwzG,EAA6BxzG,EAAO,CAAC0zG,WAAYr+D,EAAMs+D,YAAc,GAAIC,aAAc,OACtIC,GAAgBp1D,EAAAA,EAAAA,cAAaz+C,GAC3Bq1C,SAAAA,EAAOs+D,WACAt+D,aAAK,EAALA,EAAOs+D,WAAW5oG,KAAKnM,GAAWw0G,EAAkBpzG,GAAO,EAAzBozG,EAA+BxxE,EAAAA,EAAAA,IAAQ5hC,EAAOpB,MAAUyyD,KAAK,MAEnG,KAGLlP,GAAQhhC,EAAAA,EAAAA,cAAY,KACtB,IAAK,MAAMsqF,KAAW93D,EAClB4/D,EAAe9H,IAEnBhyC,EAAAA,EAAAA,IAAkBq6C,EAAAA,mBAAoBC,EAAAA,sBAAsB,GAC7D,CAACR,EAAgB5/D,IAEd0qC,GAAYl9D,EAAAA,EAAAA,cAAata,IACvBA,EAAEzB,MAAQ+nB,EAAAA,GAAUoxC,SAAS+Z,MAAM,IAAMp2B,IACzCr7C,EAAEy0D,kBACFnZ,IACJ,GACD,CAACD,EAAYC,IAWhB,OATA2K,EAAAA,EAAAA,YAAU,KAENljD,SAASq7D,iBAAiB,UAAWoZ,GAAW,GACzC,KAEHz0E,SAASu7D,oBAAoB,UAAWkZ,GAAW,EAAK,IAE7D,CAACA,IAGA32E,IAAAA,cAAA,OACItC,IAAKiwC,EAAM52C,GACX6jD,IAAKJ,EAAaK,OAAkB7/C,EACpCiF,UAAW,6BAA+B06C,EAC1CrrC,QAASmrC,EACTC,YAAaA,IAAMA,EAAY/M,IAE/B3tC,IAAAA,cAAA,QACIC,UAAU,2BAEVD,IAAAA,cAACssG,EAAAA,2BAA0B,CACvBxrG,KAAM,GACNuuD,MAAO,iDAGfrvD,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,QAAMC,UAAU,sBACX0tC,EAAM9tC,cAEXG,IAAAA,cAAA,QACIC,UAAU,yBAET,IAAK0tC,EAAMxtC,MAEhBH,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOi+F,GAEPnsG,IAAAA,cAAA,QACIC,UAAU,qBAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,sBACfjB,OAAQ,CACJ+jG,OAAQ5+D,EAAMxtB,gBAGtBngB,IAAAA,cAACwsG,EAAAA,iBAAgB,CACb1rG,KAAM,GACNuuD,MAAO,0BAMzB,EAEZu8C,EAAAvjG,UAAA,CArGEmyC,WAAU10C,IAAAA,KAAAC,WACV40C,YAAW70C,IAAAA,OAAAC,WAEX20C,YAAW50C,IAAAA,KAAAC,WACX8lG,eAAc/lG,IAAAA,KAAAC,YAmGlB,QAAe/F,IAAAA,KAAW4rG,G,mCCzG1B,MAAMa,EAAqB/sG,IACvB,MAAM,OACFrF,EAAM,MACN6I,EAAK,OACLwpG,GACAhtG,GAEE,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WAElBqI,GAAOk1B,EAAAA,EAAAA,cAAaz+C,IAAuBurB,EAAAA,EAAAA,IAAQvrB,EAAO+B,KAE1DsyG,GAA6BlzF,EAAAA,EAAAA,cAAavW,GACrCA,EAAMG,KAAKD,GACP,IAAPzC,OAAWyC,EAAK7C,YACjBopD,KAAK,OACT,IAEGijD,GAAkBnzF,EAAAA,EAAAA,cAAY,KAChC,GAAsB,IAAlBizF,EAAOtjG,OACP,OAAO,KAGX,MAAMyjG,EAA0BF,EAA2BD,GACrDI,EAAYJ,EAAO,GAAGnsG,SAC5B,GAAImsG,EAAOtjG,OAAS,GAChB,OACII,EACI,CACIzS,GAAI,4DACJ0S,eAAgB,6LAEpB,CACIsjG,UACI/sG,IAAAA,cAACgnG,EAAAA,EAAS,CACNtpG,IAAKovG,EACL5F,YAAa4F,IAGrBE,OACIhtG,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO2+F,EAAwB5lE,QAAQ,IAADtmC,OAAKmsG,EAAS,MAAM,KAE1D9sG,IAAAA,cAAA,QACIC,UAAU,mBAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mDACH0S,eAAe,iBACfjB,OAAQ,CACJwM,MAAO03F,EAAOtjG,OAAS,SAW3D,MAAM6jG,EAAaP,EAAOrpG,KAAKD,GAEvBpD,IAAAA,cAACgnG,EAAAA,EAAS,CACNtpG,IAAK0F,EAAK7C,SACV2mG,YAAa9jG,EAAK7C,aAK9B,OACIiJ,EACI,CACIzS,GAAI,oDACJ0S,eAAgB,gPAEpB,CACIuL,MAAO03F,EAAOtjG,OACdlG,MAAQlD,IAAAA,cAACktG,EAAAA,cAAa,CAAC1pG,MAAOypG,IAC9BF,UACI/sG,IAAAA,cAACgnG,EAAAA,EAAS,CACNtpG,IAAKovG,EACL5F,YAAa4F,IAGrBjrF,KAAO7hB,IAAAA,cAAA,cAAS6hB,aAAI,EAAJA,EAAMhiB,eAE7B,GAEN,CAAC6sG,EAAQljG,EAAemjG,EAA4B9qF,aAAI,EAAJA,EAAMhiB,eAEvDstG,GAAa1zF,EAAAA,EAAAA,cAAY,KAC3B,MAAMozF,EAA0BF,EAA2BzpG,GACrD4pG,EAAY5pG,EAAM,GAAG3C,SAE3B,GAAI2C,EAAMkG,OAAS,GACf,OAAOI,EACH,CACIzS,GAAI,qDACJ0S,eAAgB,kGAEpB,CACIsjG,UACI/sG,IAAAA,cAACgnG,EAAAA,EAAS,CACNtpG,IAAKovG,EACL5F,YAAa4F,IAGrBE,OACIhtG,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO2+F,EAAwB5lE,QAAQ,IAADtmC,OAAKmsG,EAAS,MAAM,KAE1D9sG,IAAAA,cAAA,QACIC,UAAU,mBAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mDACH0S,eAAe,iBACfjB,OAAQ,CACJwM,MAAO9R,EAAMkG,OAAS,OAM1CyY,KAAO7hB,IAAAA,cAAA,cAAS6hB,aAAI,EAAJA,EAAMhiB,gBAKlC,MAAMutG,EAAYlqG,EAAMG,KAAKD,GAErBpD,IAAAA,cAACgnG,EAAAA,EAAS,CACNtpG,IAAK0F,EAAK7C,SACV2mG,YAAa9jG,EAAK7C,aAK9B,OACIiJ,EACI,CACIzS,GAAI,6CACJ0S,eAAgB,2HAEpB,CACIuL,MAAO9R,EAAMkG,OACblG,MAAQlD,IAAAA,cAACktG,EAAAA,cAAa,CAAC1pG,MAAO4pG,IAC9BL,UACI/sG,IAAAA,cAACgnG,EAAAA,EAAS,CACNtpG,IAAKovG,EACL5F,YAAa4F,IAGrBjrF,KAAO7hB,IAAAA,cAAA,cAAS6hB,aAAI,EAAJA,EAAMhiB,eAE7B,GAEN,CAACqD,EAAOypG,EAA4B9qF,EAAMrY,IAE7C,OACIxJ,IAAAA,cAAAA,IAAAA,SAAA,MAESkD,EAAMkG,OAAS,GAAKsjG,EAAOtjG,OAAS,IACrCpJ,IAAAA,cAACmnF,EAAAA,EAAW,CACRpwF,GAAG,oBACH03D,KAAK,UACL44B,QAAQ,MACRn5E,MACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2CACH0S,eAAe,8GACfjB,OAAQ,CACJwM,MAAO9R,EAAMkG,OAASsjG,EAAOtjG,UAIzChK,QACI8D,EAAMkG,OAAS,GACf+jG,IAEJzlB,cACIglB,EAAOtjG,OAAS,GAChBwjG,MAIb,EAETH,EAAApkG,UAAA,CAjMEhO,OAAMyL,IAAAA,OAAAC,WACN7C,MAAK4C,IAAAA,MAAAC,WACL2mG,OAAM5mG,IAAAA,MAAAC,YAiMV,QAAe/F,IAAAA,KAAWysG,G,yZCpL1B,MA0DMY,EAAexrD,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,gBAAXq7C,CAAW,oBAI1ByrD,EAAkBzrD,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,mBAAXq7C,CAAW,mCAK5B,MAAM0rD,WAA2BvtG,IAAAA,cAUpCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,uBAVS,GAACA,EAAA,uBACDxC,IAAAA,aAAiCwC,EAAA,eAsBjD2D,QACsCnL,IAApCmL,EAAuB5F,WAClCiC,EAAA,iBAEmBgB,IAChB,GAAId,KAAK8qG,OAAOhqG,GAAQ,CACpB,MAAMugG,EAAUvgG,EAChB,IAAKd,KAAKhD,MAAM+tG,gBAAkB/qG,KAAKhD,MAAM+tG,cAAc1J,EAAQhtG,IAC/D,OAAIoK,EAAAA,EAAAA,GAAQ4iG,EAAQ3iG,aACqC,IAAjDsB,KAAKpK,MAAMo1G,gBAAgBx+E,QAAQ60E,IACnCrhG,KAAKgH,UAAUvF,IACJ,CAACupG,gBAAiB,IAAIvpG,EAAUupG,gBAAiB3J,cAKhB,IAAhDrhG,KAAKpK,MAAMq1G,eAAez+E,QAAQ60E,IAClCrhG,KAAKgH,UAAUvF,IACJ,CAACwpG,eAAgB,IAAIxpG,EAAUwpG,eAAgB5J,SAMf,IAA/CrhG,KAAKpK,MAAMs1G,cAAc1+E,QAAQ60E,IACjCrhG,KAAKgH,UAAUvF,IACJ,CAACypG,cAAe,IAAIzpG,EAAUypG,cAAe7J,MAGhE,KACHvhG,EAAA,2BAE6BypC,IAC1B,MAAM0hE,EAAiBjrG,KAAKpK,MAAMq1G,eAAexqG,QAAQ4gG,IACrD,MAAM3gG,EAAO2gG,EAGb,OAAe,IADD93D,EAAS/c,QAAQ9rB,KAI/BV,KAAKs6C,SAAS55C,IACP,EAAK,IAGhBV,KAAKgH,SAAS,CAACikG,eAAgB,IAAIA,GAAiBD,gBAAiB,IAAI,IAC5ElrG,EAAA,uCAEyCypC,IACtC,MAAM0hE,EAAiBjrG,KAAKpK,MAAMq1G,eAAexqG,QAAQ4gG,IAEnC,IADJ93D,EAAS/c,QAAQ60E,KAGnCrhG,KAAKgH,SAAS,CAACikG,eAAgB,IAAIA,GAAiBD,gBAAiB,IAAI,IAC5ElrG,EAAA,yBAmCkB,IACXE,KAAKhD,MAAMi/C,aACJ,IAAIrlB,OAAO52B,KAAKhD,MAAMmuG,yBAAyBxqG,KAAKD,GAASA,EAAKrM,KAAKqJ,OAAOoI,OAAO9F,KAAKhD,MAAMi/C,cAAct7C,KAAKD,GAASA,EAAKrM,MAErI,IAAIuiC,IAAI52B,KAAKhD,MAAMmuG,yBAAyBxqG,KAAKD,GAASA,EAAKrM,QAG1EyL,EAAA,mBACoB,KAChB,MAAMsrG,EAA8BprG,KAAKqrG,mBAEnCC,GAAkBtvD,EAAAA,EAAAA,IAA+Bh8C,KAAKhD,MAAMuuG,sBAAuBvrG,KAAKpK,MAAMs/B,MAC9Fs2E,EAAUxrG,KAAKyrG,6CAA6CH,EAAiBF,GAA6Bh8F,MAAM,EA9LvG,IAgMf,IAAI5O,EACJ,MAAMkrG,GAA+B1vD,EAAAA,EAAAA,IAA+Bh8C,KAAKhD,MAAM2uG,4BAA4B1tG,OAAO+B,KAAKhD,MAAM4uG,0BAA2B5rG,KAAKpK,MAAMs/B,MACnK10B,EAAQR,KAAKyrG,6CAA6CC,EAAeN,GACrEprG,KAAKhD,MAAMk/C,eACX17C,EAAQ,IAAIA,KAAU9C,OAAOoI,OAAO9F,KAAKhD,MAAMk/C,gBAEnD,MAKM2vD,EAAe,IACdL,KANgB,KAChBM,EAAAA,EAAAA,GAAyB9rG,KAAKhD,MAAMkvC,OAAQlsC,KAAKpK,MAAMs/B,SACvD10B,GACL21D,KAAK41C,EAAAA,KAKL38F,MAAM,EA7ME,IA+MV,OAAO1L,MAAMwyD,KAAK,IAAIt/B,IAAIi1E,GAAc,IAC3C/rG,EAAA,eAEe,KACZE,KAAKgH,SAAS,CAACmC,MAAM,IACrBnJ,KAAKhD,MAAMqD,QAAQw8C,4BAA4B78C,KAAKhD,MAAM2uG,6BAC1D3rG,KAAKhD,MAAMqD,QAAQw8C,4BAA4B78C,KAAKhD,MAAM4uG,yBAAyB,IACtF9rG,EAAA,0BAE2B5L,IACpBA,GACA8L,KAAKgH,SAAS,CACVyvC,QAAQ,EACRu1D,YAAa93G,EAAIwI,SAEzB,IACHoD,EAAA,qBAEuBgG,IAEpB,MAAMyjC,EAAWzjC,EACjB9F,KAAKgH,SAAS,CAACkkG,cAAe3hE,GAAU,IAC3CzpC,EAAA,6BAE+By3C,IAC5Bv3C,KAAKgH,SAAS,CACVw0C,aAAcjE,GAChB,IACLz3C,EAAA,yBAE0B,CAACvD,EAAck7C,KAClCl7C,EAAOk7C,IACPz3C,KAAKy7C,sBAAqB,GAC1Bz7C,KAAKhD,MAAMqD,QAAQ4rG,wBACfjsG,KAAKhD,MAAMkE,QAAQ4W,QACnB9X,KAAKhD,MAAMkE,QAAQ7M,GACnB2L,KAAKhD,MAAMkE,QAAQgrG,kBACnB3vG,EAAO,EAtPA,IAsPmBiN,MAAK,IAAMxJ,KAAKy7C,sBAAqB,KAEnEz7C,KAAKhD,MAAMqD,QAAQ8rG,qBAAqBnsG,KAAKhD,MAAMkE,QAAQ7M,GAAIkI,EAAO,EAxP3D,GAwP8E,GAAI,CAACsW,QAAQ,IAC1G,IACH/S,EAAA,qBAEqB,KAClB,MAAM,QAACO,EAAO,QAAEa,GAAWlB,KAAKhD,MAE1Bs6C,EAAUt3C,KAAKpK,MAAMs1G,cAAcvqG,KAAKyrG,GAAMA,EAAE/3G,KACtD,GAAuB,IAAnBijD,EAAQ5wC,OAAZ,CAIA,GAAI1G,KAAKhD,MAAM45C,YAAc52C,KAAKhD,MAAM65C,cAOpC,OANA72C,KAAKhD,MAAM65C,cAAc72C,KAAKpK,MAAMs1G,eACpClrG,KAAKgH,SAAS,CACVyvC,QAAQ,EACRu1D,iBAAa1zG,SAEjB0H,KAAKiK,SAITjK,KAAKgH,SAAS,CAACyvC,QAAQ,IAEvBp2C,EAAQgsG,kBAAkBnrG,EAAQ7M,GAAIijD,GAAS9tC,MAAMwI,IAC7CA,EAAOhe,MACPgM,KAAKssG,kBAAkBt6F,EAAOhe,QAE9BgM,KAAKgH,SAAS,CACVyvC,QAAQ,EACRu1D,iBAAa1zG,IAEjB0H,KAAKiK,SACT,GAvBJ,CAwBE,IACLnK,EAAA,eAEgB83C,IACb,MAAM1iB,EAAO0iB,EAAW/qB,OACxBgmB,aAAa7yC,KAAKs4C,iBAClBt4C,KAAKgH,SAAS,CACVkuB,SAGJl1B,KAAKs4C,gBAAkBtpC,OAAOuZ,YAC1B10B,UACI,IAAKqhC,EACD,OAGJ,MAAM75B,EAAU,CACZyc,QAAS9X,KAAKhD,MAAMkE,QAAQ4W,QAC5By0F,kBAAmBvsG,KAAKhD,MAAMkE,QAAQ7M,GACtC63G,kBAAmBlsG,KAAKhD,MAAMkE,QAAQgrG,mBAGpCl8E,EAAO,CACTC,EAAGiF,EACHhF,wBAAwB,EACxB3zB,KAAM,EACN4zB,SAAU,IACVC,sBAAsB,EACtBo8E,oBAAoB,GAElBC,EAAW,CACbzsG,KAAKhD,MAAMqD,QAAQy7C,eAAe5mB,EAAM75B,IAExC2E,KAAKhD,MAAM0vG,iBACXD,EAASn9F,KAAKtP,KAAKhD,MAAMqD,QAAQ0vB,mCAAmCmF,EAAMl1B,KAAKhD,MAAMkE,QAAQ4W,QAAS9X,KAAKhD,MAAMkE,QAAQ7M,GAAI27B,UAE3H3H,QAAQyuB,IAAI21D,GAClBzsG,KAAKy7C,sBAAqB,EAAM,GAEpC14B,EAAAA,GAAU41B,4BACb,IACJ74C,EAAA,wBAE0B2D,GAClBA,EAGDzD,KAAK8qG,OAAOrnG,GACLA,EAAO5F,SAEX4F,EAAOhG,KALH,KAMdqC,EAAA,qDAEsD,CAACU,EAAsBmsG,IACnEnsG,EAAMC,QAAQC,GACS,IAAnBA,EAAK0gB,YAAoBurF,EAAetgF,IAAI3rB,EAAKrM,QAE/DyL,EAAA,qBAEc,CAAC2D,EAAuCq0C,EAAqBC,EAAwDC,KAChI,IAAIC,EAAc,GAKlB,GAJIH,IACAG,EAAc,6BAGdj4C,KAAK8qG,OAAOrnG,GAAS,CACrB,MAAMmpG,EAAkB5sG,KAAKhD,MAAM4uG,yBAAyBjrG,KAAKD,GAASA,EAAKrM,KAEzEw4G,EAAsC,CAAC,EAC7C,IAAK,IAAIntE,EAAI,EAAGA,EAAIktE,EAAgBlmG,OAAQg5B,IACxCmtE,EAAYD,EAAgBltE,IAAM,qBAEtC,MAAM57B,GAAcjD,EAAAA,EAAAA,IAAgB4C,EAAQzD,KAAKhD,MAAMmkG,4BACvD,OACI7jG,IAAAA,cAAA,OACItC,IAAKyI,EAAOpP,GACZ6jD,IAAKJ,EAAa93C,KAAKm4C,gBAAkB10C,EAAOpP,GAChDkJ,UAAW,6BAA+B06C,EAC1CrrC,QAASA,IAAMmrC,EAAMt0C,GACrBu0C,YAAaA,IAAMA,EAAYv0C,IAE/BnG,IAAAA,cAAC29C,EAAAA,EAAc,CACXpvC,IAAKvW,EAAAA,GAAQ4lD,qBAAqBz3C,EAAOpP,GAAIoP,EAAO03C,qBACpDx+C,OAAQqD,KAAKhD,MAAMg+C,aAAav3C,EAAOpP,IACvC+J,KAAK,KACLP,SAAU4F,EAAO5F,WAErBP,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,YACKwG,EACAL,EAAOlF,QAAUjB,IAAAA,cAACkB,EAAAA,EAAM,OACxBC,EAAAA,EAAAA,GAAQgF,EAAO/E,QAAUpB,IAAAA,cAACqB,EAAAA,EAAQ,CAACpB,UAAU,gBAC7CuG,IAAgBL,EAAO5F,SACpB,KACAP,IAAAA,cAACqtG,EAAY,CACTptG,UAAU,cAET,IAAKkG,EAAO5F,UAGrBP,IAAAA,cAACstG,EAAe,CACZrtG,UAAU,SAETsvG,EAAYppG,EAAOpP,QAKpCiJ,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,KACIC,UAAU,qBAMlC,CAEA,OACID,IAAAA,cAAC4rG,EAAW,CACRj+D,MAAOxnC,EACPzI,IAAKyI,EAAOpP,GACZ80G,eAAgBpxD,EAChBD,WAAYA,EACZG,YAAaA,EACbD,YAAaA,EACbG,gBAAiBn4C,KAAKm4C,iBACxB,IAETr4C,EAAA,eAEe,KACZ,IAAIksG,EAAc,KACdhsG,KAAKpK,MAAMo2G,cACXA,EAAe1uG,IAAAA,cAAA,SAAOC,UAAU,2BAA2ByC,KAAKpK,MAAMo2G,cAG1E,MAAMlzD,GAAmBtsC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,kBAAmB0S,eAAgB,QACzEgyC,GAA0BvsC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,qBAAsB0S,eAAgB,cAEnF+lG,EAA0BA,KAC5B9sG,KAAKhD,MAAMqD,QAAQ05F,WAAW1pF,EAAAA,GAAiB08F,eAAe,EAG5DC,EAAmBhwG,GAEjBM,IAAAA,cAAC2vG,EAAAA,EAAiB,CACd54G,GAAG,cACHkJ,UAAS,GAAAU,OAAKjB,EAAMkwG,cAAgB,kBAAoB,GAAE,iBAC1D98F,QAASC,EAAAA,GAAiBoiB,WAC1BliB,WAAYmiB,EAAAA,QACZliB,YAAa,CACT28F,gBAAiBntG,KAAKhD,MAAMkE,QAC5BksG,aAAcptG,KAAKpK,MAAMs/B,KACzBg4E,cAAelwG,EAAMkwG,eAEzBtgG,QAASkgG,GAER9vG,EAAM20D,UAKb07C,EACF/vG,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,wFACfjB,OAAQ,CACJwnG,oBAAsBntD,GAClB7iD,IAAAA,cAAC0vG,EAAe,KACX7sD,OAQnBu5C,EACFp8F,IAAAA,cAACs8C,EAAAA,EAAW,CACR5+C,IAAI,uBACJK,QAAS2E,KAAKpK,MAAM23G,oBACpB1zD,eAAgB75C,KAAK85C,aACrBjzC,KAAM7G,KAAKhD,MAAM6J,KACjBsxC,gBAAiBn4C,KAAKm4C,gBACtBryC,OAAQ9F,KAAKpK,MAAMs1G,cACnB9uD,kBAAmBp8C,KAAKq8C,gBACxBC,mBAAoB,SACpBrC,QAzdO,GA0dPC,iBAAkBl6C,KAAKk6C,iBACvBC,YAAan6C,KAAKkgB,OAClBk6B,aAAcp6C,KAAKo6C,aACnBC,UAAWr6C,KAAKs6C,SAChBhwC,aAActK,KAAKsK,aACnBihE,aAAcuhC,EACdh0D,iBAAkBA,EAClBC,wBAAyBA,EACzBtC,OAAQz2C,KAAKpK,MAAM6gD,OACnBntC,QAAStJ,KAAKpK,MAAM4lD,aACpBhB,gBAAiBx6C,KAAKhD,MAAM0vG,iBAAkBlgG,EAAAA,EAAAA,eAAc,CAACnY,GAAI,yCAA0C0S,eAAgB,iCAAkCyF,EAAAA,EAAAA,eAAc,CAACnY,GAAI,0BAA2B0S,eAAgB,sBAC3Nw1C,gBAAgB,EAChBK,gBAAgBpwC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,qBAAsB0S,eAAgB,WACzE21C,gBAAiBowD,EACjBnwD,gBAAiB,+BACjB0wD,uBAAwBrtG,KAAKhD,MAAMwwG,wBAA0BH,EAAyB,OAIxFI,EACFnwG,IAAAA,cAAC0vG,EAAe,CAACE,eAAe,GAC5B5vG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,uBAK3B,OACIzJ,IAAAA,cAACyM,EAAAA,MAAK,CACF1V,GAAG,yBACH2V,gBAAgB,6BAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiK,OACbC,SAAUlK,KAAKhD,MAAMkN,SACrBE,KAAK,OACL,kBAAgB,2BAEhB9M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CACTnW,GAAG,0BACHoW,aAAa,GAEbnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,wBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,0BACfjB,OAAQ,CACJ5E,QAASlB,KAAKhD,MAAMkE,QAAQ/D,kBAK5CG,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,CACPX,KAAK,cACL7M,UAAU,qBAETyuG,EACD1uG,IAAAA,cAAA,OAAKC,UAAU,2BACVm8F,EACDp8F,IAAAA,cAACysG,EAAiB,CACdC,OAAQhqG,KAAKpK,MAAMo1G,gBACnBrzG,OAAQqI,KAAKhD,MAAMkE,QAAQ4W,QAC3BtX,MAAOR,KAAKpK,MAAMq1G,iBAEpBjrG,KAAKhD,MAAMwwG,yBAA2BxtG,KAAKhD,MAAM0wG,iBAAoBD,IAG3E,IAjdZztG,KAAKpK,MAAQ,CACTs1G,cAAe,GACfD,eAAgB,GAChBD,gBAAiB,GACjB91E,KAAM,GACN/rB,MAAM,EACNstC,QAAQ,EACR+E,cAAc,EACd+xD,oBAAqB,GAE7B,CAyDOh1D,iBAAAA,GACHv4C,KAAKhD,MAAMqD,QAAQ4rG,wBAAwBjsG,KAAKhD,MAAMkE,QAAQ4W,QAAS9X,KAAKhD,MAAMkE,QAAQ7M,GAAI2L,KAAKhD,MAAMkE,QAAQgrG,kBAAmB,GAAG1iG,MAAK,KACxIxJ,KAAKy7C,sBAAqB,EAAM,IAEpCz7C,KAAKhD,MAAMqD,QAAQ8rG,qBAAqBnsG,KAAKhD,MAAMkE,QAAQ7M,GAAI,EAtJhD,GAsJmE,GAAI,CAACwe,QAAQ,IAC/F7S,KAAKhD,MAAMqD,QAAQstG,aAAa3tG,KAAKhD,MAAMkE,QAAQ4W,SACnD9X,KAAKhD,MAAMqD,QAAQw8C,4BAA4B78C,KAAKhD,MAAM2uG,6BAC1D3rG,KAAKhD,MAAMqD,QAAQw8C,4BAA4B78C,KAAKhD,MAAM4uG,yBAC9D,CAEA,wBAAanzD,CAAmBC,EAAkBj3C,GAC9C,GAAIA,EAAUyzB,OAASl1B,KAAKpK,MAAMs/B,KAAM,CACpC,MAAMpvB,EAAS9F,KAAKwU,aACd8iC,EAAoB,GAE1B,IAAK,IAAIrrC,EAAQ,EAAGA,EAAQnG,EAAOY,OAAQuF,IAAS,CAChD,MAAM2hG,EAAW9nG,EAAOmG,GACpBjM,KAAK8qG,OAAO8C,GACZt2D,EAAQhoC,KAAKs+F,EAASv5G,IACfu5G,EAASrE,YAChBjyD,EAAQhoC,QAAQs+F,EAASrE,WAEjC,CAEKsE,IAAQ/nG,EAAQ9F,KAAKpK,MAAM23G,uBACxBj2D,EAAQ5wC,OAAS,GACjB1G,KAAKhD,MAAMqD,QAAQytG,oBAAoB9tG,KAAKhD,MAAMkE,QAAQ4W,QAASw/B,GAEvEt3C,KAAKgH,SAAS,CAACumG,oBAAqBznG,IAE5C,CACJ,EAkXHhG,EAheY+qG,GAAkB,aA1D3Bc,4BAA2BvoG,IAAAA,MAAAC,WAC3BuoG,yBAAwBxoG,IAAAA,MAAAC,WACxB8nG,yBAAwB/nG,IAAAA,MAAAC,WACxBkoG,sBAAqBnoG,IAAAA,MAAAC,WAIrB6G,SAAQ9G,IAAAA,KAAAC,WAER89F,2BAA0B/9F,IAAAA,OAAAC,WAG1BuzC,WAAUxzC,IAAAA,KAGVyzC,cAAazzC,IAAAA,KAKbsqG,gBAAetqG,IAAAA,KACfoqG,wBAAuBpqG,IAAAA,KACvB8oC,OAAM9oC,IAAAA,MAAAC,WACNqpG,gBAAetpG,IAAAA,KAAAC,WACfhD,QAAO+C,IAAAA,MAAA,CACHipG,kBAAiBjpG,IAAAA,KAAAC,WACjB4oG,wBAAuB7oG,IAAAA,KAAAC,WACvB8oG,qBAAoB/oG,IAAAA,KAAAC,WACpBsqG,aAAYvqG,IAAAA,KAAAC,WACZw5C,4BAA2Bz5C,IAAAA,KAAAC,WAC3By4C,eAAc14C,IAAAA,KAAAC,WACd02F,WAAU32F,IAAAA,KAAAC,WACV0sB,mCAAkC3sB,IAAAA,KAAAC,WAClCyqG,oBAAmB1qG,IAAAA,KAAAC,aAAAA,aAAAvD,EAyBd+qG,GAAkB,eAIE,CACzB3uD,aAAc,CAAC,EACfD,aAAc,CAAC,EACfrF,YAAY,IA2dpB,UAAe9pC,EAAAA,EAAAA,YAAW+9F,ICrd1B,IAAezlG,EAAAA,EAAAA,UAjFf,SAA6B2oG,EAA2BC,GACpD,MAAMC,GAAqCC,EAAAA,EAAAA,MAC3C,IAAIC,EAKAC,EAKJ,OATIJ,EAAat+F,WAAas+F,EAAar2G,SACvCw2G,GAA4BE,EAAAA,EAAAA,OAI5BL,EAAat+F,WAAas+F,EAAar2G,SACvCy2G,GAAyBE,EAAAA,EAAAA,OAGtB,CAAC14G,EAAoBoH,KACxB,IAAI2uG,EACAC,EACAT,EACAJ,EAEA/tG,EAAM0S,WAAa1S,EAAMrF,QACzBg0G,EAA8BwC,EAA0Bv4G,EAAOoH,EAAM0S,WACrEk8F,EAA2BwC,EAAuBx4G,EAAOoH,EAAM0S,WAC/Dy7F,GAA2BoD,EAAAA,EAAAA,IAAqB34G,EAAOoH,EAAMrF,QAC7DozG,GAAgByD,EAAAA,EAAAA,IAAiB54G,EAAOoH,EAAMrF,UAE9Cg0G,GAA8B8C,EAAAA,EAAAA,IAA+B74G,GAC7Dg2G,GAA2B8C,EAAAA,EAAAA,IAA4B94G,GACvDu1G,GAA2BwD,EAAAA,EAAAA,IAA4B/4G,GACvDm1G,GAAgB6D,EAAAA,EAAAA,IAAwBh5G,IAE5C,MAAM21G,GAAwBsD,EAAAA,EAAAA,IAAyBj5G,GACjDqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnB40B,GAAUC,EAAAA,EAAAA,IAAW70B,GAErB4tB,EAAcxmB,EAAMrF,QAASwpB,EAAAA,EAAAA,IAAQvrB,EAAOoH,EAAMrF,SAAU8rB,EAAAA,EAAAA,IAAe7tB,GAE3Ek5G,EAAsD,SAA/B72G,EAAO82G,oBAC9BvB,EAA4D,SAAlCv1G,EAAO+2G,uBACjC7X,EAAa3sE,GAAkC,SAAvBA,EAAQG,WAEhC+iF,GADqB7jG,QAAQ2Z,aAAW,EAAXA,EAAa0oF,oBACD/U,GAAc2X,IAAwB3gF,EAAAA,EAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAY8kF,cAG7HvC,GAFyB3hF,EAAAA,EAAAA,IAAsBn1B,IAEsB,UAAxB40B,aAAO,EAAPA,EAASG,aAAiD,UAAxBH,aAAO,EAAPA,EAASI,YAExFowB,GAAe+B,EAAAA,EAAAA,IAAgBnnD,GAKrC,MAAO,CACH+1G,8BACAC,2BACAT,2BACAJ,gBACA5J,4BAR+B97F,EAAAA,EAAAA,IAA8BzP,GAS7D21G,wBACAvwD,eACA0yD,kBACAF,0BACAthE,OAZW+hE,EAAmCr4G,GAAO,GAarD82G,kBACH,CAET,IAEA,SAA4B/4G,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB+mG,kBAAiB,KACjBJ,wBAAuB,KACvBE,qBAAoB,IACpBwB,aAAY,KACZ9wD,4BAA2B,KAC3Bf,eAAc,IACdi+C,WAAU,IACVhqE,mCAAkC,IAClC+9E,oBAAmBA,EAAAA,IACpBn6G,GAEX,GAEA,CAAgEk3G,G,uQCtEjD,SAASqE,EAAsBz5G,GAapC,IAbqC,QAC3CyL,EAAO,KACPR,EAAI,cACJ0iB,EAAa,cACb3D,EAAa,qBACb0vF,EAAoB,gBACpBC,EAAe,MACfnjG,EAAK,WACLqrF,EAAU,kBACV+X,EAAiB,mBACjBC,EAAkB,WAClBC,EAAU,QACVlvG,GACI5K,EACJ,MAAMoR,GAAOiQ,EAAAA,EAAAA,YAEN04F,EAAUC,IAAe54F,EAAAA,EAAAA,WAAS,IAClCgxC,EAAaqb,IAAkBrsD,EAAAA,EAAAA,UAAwB,MACxDljB,GAAWsxD,EAAAA,EAAAA,eAEXyqD,EAA0B77G,UAC5B,IAAI27G,EAIJ,GAAI9uG,EAAKrM,KAAO+uB,EACZqsF,GAAY,GACZ97G,EAAS0M,EAAQ8P,UAAU,CACvBC,QAASC,EAAAA,GAAiBkd,4BAC1Bhd,WAAYid,EAAAA,EACZhd,YAAa,CACTtP,UACAlH,SAAUA,KACNqG,EAAQyY,gBAAgB5X,EAAQ7M,IAChCo7G,GAAY,EAAM,UAI3B,CACHA,GAAY,GACZ,MAAM,MAACz7G,SAAeqM,EAAQsvG,oBAAoBzuG,EAAQ7M,GAAIqM,EAAKrM,IAEnE,GADAo7G,GAAY,GACRz7G,EAEA,YADAkvE,EAAelvE,EAAM0I,SAIzB2D,EAAQyY,gBAAgB5X,EAAQ7M,GACpC,GAGEu7G,EAAyBA,KAC3BC,GAA8B,EAAK,EAGjCC,EAA0BA,KAC5BD,GAA8B,EAAM,EAGlCA,EAAgCh8G,UAClC,MAAM,MAACG,SAAeqM,EAAQ0vG,+BAA+B7uG,EAAQ7M,GAAIqM,EAAKrM,IAAI,EAAM27G,GACpFh8G,EACAkvE,EAAelvE,EAAM0I,UAIzB2D,EAAQyY,gBAAgB5X,EAAQ7M,IAChCgM,EAAQ4vG,iBAAiB/uG,EAAQ7M,GAAIqM,EAAKrM,IAAG,EAqC3C67G,EAAiBC,EAAAA,GAAyB1wF,EAAc/gB,QAAU+gB,EAAc23B,aAChF34C,EAAU0xG,EAAAA,EAAkBzvG,EAAKhC,OACjCigC,GAAYuxE,IAAmBzxG,EAC/B2xG,EAAmBlvG,EAAQzD,OAASslB,EAAAA,GAAUuP,gBAC9C+9E,EAtCaC,EAACJ,EAAyBzxG,IACrCyxG,EACIb,GAIA/xG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,kBAGhBtI,EACH8wG,GAIAjyG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,kBAKvBuoG,GAIAhyG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAe,mBASPupG,CAAWJ,EAAgBzxG,GAE/C,GAAIiC,EAAK6vG,UACL,OAAQjzG,IAAAA,cAAAA,IAAAA,SAAA,MAGZ,MAAMkzG,EAA2BrB,GAAwBe,EACnDO,EAA0BtB,GAAwBxwE,EAClD+xE,EAA2BtB,KAAqBluG,EAAQgrG,mBAAqBxrG,EAAKnC,WAAa6xG,GAAoB3xG,GACnHkyG,EAAwBjwG,EAAKrM,KAAO+uB,EAAgBvc,EAAKC,cAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,kBAAoBF,EAAKC,cAAc,CAACzS,GAAI,+CAAgD0S,eAAgB,wBAChO6pG,EAA0BlwG,EAAKrM,KAAO+uB,EAAgB,eAAiB,oBAE7E,GAAIotF,GAA4BC,GAA2BC,EAA0B,CACjF,MAAMG,EACFvzG,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ,cAAaF,EACbznG,KAAMunG,EACN9jG,QAAS8iG,EACT5nG,KAAM6oG,EACNI,aAAa,IAGfC,EACF1zG,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAE,GAAA4J,OAAKyC,EAAK7C,SAAQ,uBACpBsL,KAAMsnG,EACN7jG,QAASgjG,EACT9nG,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,8CAA+C0S,eAAgB,yBAG/FkqG,EACF3zG,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAE,GAAA4J,OAAKyC,EAAK7C,SAAQ,wBACpBsL,KAAMqnG,EACN5jG,QAASkjG,EACThoG,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,+CAAgD0S,eAAgB,0BAGtG,OACIzJ,IAAAA,cAACka,EAAAA,EAAW,KACRla,IAAAA,cAAA,UACIC,UAAU,gDACV/E,KAAK,UAEL8E,IAAAA,cAAA,QAAMC,UAAU,WAAWmD,EAAK7C,UAChCP,IAAAA,cAAA,YAAO+yG,EAAY,KACnB/yG,IAAAA,cAAC4zG,EAAAA,EAAY,OAEjB5zG,IAAAA,cAAC4Z,EAAAA,EAAI,CACDO,UAAU,EACV2mD,OAAQk5B,EArLQ,GAqLoCA,EAAarrF,GArLjD,EAsLhByL,UAAW7Q,EAAKC,cAAc,CAACzS,GAAI,yCAA0C0S,eAAgB,uCAE5FypG,EAA2BS,EAAiB,KAC5CR,EAA0BO,EAAgB,KAC1CN,EAA2BG,EAAa,KACxChpD,GACGvqD,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,SAAOC,UAAU,2BAA2BsqD,KAMpE,CAEA,OAAIuoD,EAEI9yG,IAAAA,cAAA,YAKJA,IAAAA,cAAA,WACK+yG,EAGb,CAACnB,EAAAvpG,UAAA,CA3MGyd,cAAahgB,IAAAA,OAAAC,WAEb8rG,qBAAoB/rG,IAAAA,KAAAC,WACpB+rG,gBAAehsG,IAAAA,KAAAC,WACf4I,MAAK7I,IAAAA,OAAAC,WACLi0F,WAAUl0F,IAAAA,OAAAC,WACVgsG,kBAAiBjsG,IAAAA,QACjBksG,mBAAkBlsG,IAAAA,QAClBmsG,WAAUnsG,IAAAA,QACV/C,QAAO+C,IAAAA,MAAA,CACH0V,gBAAe1V,IAAAA,KAAAC,WACf0sG,+BAA8B3sG,IAAAA,KAAAC,WAC9BssG,oBAAmBvsG,IAAAA,KAAAC,WACnB4sG,iBAAgB7sG,IAAAA,KAAAC,WAChB8M,UAAS/M,IAAAA,KAAAC,aAAAA,YCcjB,SAAe+B,EAAAA,EAAAA,UA7Bf,SAAyBxP,EAAoB2hC,GACzC,MAAM,QAACr2B,GAAWq2B,EACZ43E,GAAuBjlF,EAAAA,EAAAA,IACzBt0B,EACAsL,EAAQ4W,QACR5W,EAAQ7M,GACR81B,EAAAA,GAAYgnF,wBACXC,EAAAA,EAAAA,IAAiBx7G,EAAOsL,GACvBkuG,GAAkBgC,EAAAA,EAAAA,IAAiBx7G,EAAOsL,GAEhD,MAAO,CACHkiB,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAChCu5G,uBACAC,kBAER,IAEA,SAA4Bz7G,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB2qG,iBAAgB,KAChBn3F,gBAAe,KACfi3F,+BAA8B,KAC9BJ,oBAAmB,KACnBx/F,UAASA,EAAAA,GACVxc,GAEX,GAEA,CAA4Du7G,E,iRC/B5D,MAAM/wG,EAASghD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,UAAVq7C,CAAU,2CAKnBkyD,EAAclyD,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,eAAXq7C,CAAW,sJAWzBwgD,EAAWxgD,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,YAAXq7C,CAAW,uGAOtBmyD,EAAcnyD,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,eAAbq7C,CAAa,2QAoB3BoyD,EAAcpyD,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,eAAVq7C,CAAU,yRAqBxBqyD,EAAaryD,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,cAAXq7C,CAAW,uDAkBxBsyD,EAASh8G,IAA8E,IAA7E,UAAC8H,EAAS,QAAE2D,EAAO,OAAEsX,EAAM,MAAEvM,EAAK,WAAEqrF,EAAU,QAAEoa,EAAO,QAAErxG,GAAe5K,EACpF,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB66F,EAAiBr8G,EAAAA,GAAQ4lD,qBAAqB1iC,EAAO9X,KAAKrM,GAAImkB,EAAO9X,KAAKy6C,qBAEhF,OACI79C,IAAAA,cAAA,OACIC,UAAWA,EACXmN,MAAO,CAACkB,OAAQ,QAChB,4BAAA3N,OAA2Bua,EAAO9X,KAAKrM,KAEvCiJ,IAAAA,cAAA,QAAMC,UAAU,eACZD,IAAAA,cAACa,EAAM,KACHb,IAAAA,cAAC29C,EAAAA,EAAc,CACX78C,KAAK,KACLzB,OAAQ6b,EAAO7b,OACfknD,MAAOrrC,EAAO9X,KAAKnC,OACnB/J,OAAQgkB,EAAO9X,KAAKrM,GACpBwJ,SAAU2a,EAAO1U,YACjB+H,IAAK8lG,KAGbr0G,IAAAA,cAACiiG,EAAAA,EAAc,CACX2F,sBAAsB,uBACtB1wG,OAAQgkB,EAAO9X,KAAKrM,GACpBwX,IAAK8lG,EACLnS,WAAYhnF,EAAO9X,KAAKnC,QAExBjB,IAAAA,cAAC+zG,EAAW,KACP74F,EAAO1U,aACPrF,EAAAA,EAAAA,GAAQ+Z,EAAO9X,KAAKhC,QAAUpB,IAAAA,cAACqB,EAAAA,EAAQ,MACvC6Z,EAAO9X,KAAK6vG,WAETjzG,IAAAA,cAACk0G,EAAU,KACPl0G,IAAAA,cAACs0G,EAAAA,EAAsB,CACnBC,aAAa,MAMzBr5F,EAAO1U,cAAgB0U,EAAO9X,KAAK7C,SAAW,KAAOP,IAAAA,cAACqiG,EAAQ,KAAE,IAAKnnF,EAAO9X,KAAK7C,UAErFP,IAAAA,cAACw0G,EAAAA,EAAiB,CACdC,OAAQv5F,EAAO9X,KAAKrM,GACpBwyF,aAAa,EACbmrB,UAAW,GACXC,UAAW,CACPhL,QAAS,OACTiL,KAAM,WACNC,WAAY,UAEhBC,WAAY,CACR7W,WAAY,MACZ4W,WAAY,cAM5B70G,IAAAA,cAACi0G,EAAW,CACRh0G,UAAWk3C,IAAW,CAACi9D,WAAU,uBACjC,cAAY,eAEXl5F,EAAO65F,YACJ/0G,IAAAA,cAAC4xG,EAAAA,EAAsB,CACnBhuG,QAASA,EACTR,KAAM8X,EAAO9X,KACb+e,cAAejH,EAAO65F,WACtBpmG,MAAOA,EACPqrF,WAAYA,EACZ+X,kBACI/xG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uDACH0S,eAAe,UAGvBuoG,mBACIhyG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wDACH0S,eAAe,WAGvBwoG,WACIjyG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+CACH0S,eAAe,cAMjC2qG,GACEp0G,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO1E,EAAc,CACjBzS,GAAI,0CACJ0S,eAAgB,kBAGpBzJ,IAAAA,cAACg0G,EAAW,CAAC1kG,QAASA,IAAMvM,EAAQiyG,kBAAkB95F,EAAO9X,OACzDpD,IAAAA,cAAA,KAAGC,UAAU,qBAIvB,EAEZk0G,EAAA9rG,UAAA,CArHEpI,UAAS6F,IAAAA,OAGT6I,MAAK7I,IAAAA,OAAAC,WACLi0F,WAAUl0F,IAAAA,OAAAC,WACVquG,QAAOtuG,IAAAA,KAAAC,WACPhD,QAAO+C,IAAAA,MAAA,CACHkvG,kBAAiBlvG,IAAAA,KAAAC,aAAAA,YAgHzB,QAAe87C,IAAOsyD,EAAtB,CAA6B,4eAWnBH,GCrNoB,IASzBiB,EAAY,SAAZA,GAAY,OAAZA,EAAY,gBAAZA,EAAY,iCAAZA,EAAY,sBAAZA,CAAY,EAAZA,GAAY,IAqBjB,MAAMC,EAAa/8G,IASN,IATO,YAChBgpG,EAAW,kBACXgU,EAAiB,QACjBvxG,EAAO,QACPu9B,EAAO,YACPi0E,EAAW,QACXhB,EAAO,kBACPY,EAAiB,SACjBK,GACIl9G,EACJ,MAAMyoG,GAAoB/0C,EAAAA,EAAAA,QAA8B,MAClDg1C,GAAsBh1C,EAAAA,EAAAA,QAAgC,OACrDi1C,EAAYC,IAAiBxnF,EAAAA,EAAAA,WAAS,IAE7C6rC,EAAAA,EAAAA,YAAU,KACF07C,IACIF,EAAkBnuF,SAClBmuF,EAAkBnuF,QAAQuuF,0BAE1BH,EAAoBpuF,SACpBouF,EAAoBpuF,QAAQwuF,gBAAgB,IAGpDF,GAAc,EAAK,GACpB,CAACqU,EAAaj0E,EAAQ/3B,OAAQ03F,IAEjC,MAAMM,EAAYD,EAAchgE,EAAQ/3B,OAAS,EAAI+3B,EAAQ/3B,OAEvDi4F,EAAgB8T,EAAoB,OAAWE,EAE/C/R,EAAgB30F,IACVwyF,GAAexyF,EAAQwyB,EAAQ/3B,OAGrCksG,EAAe3mG,IACjB,KAAMA,KAASwyB,GACX,OAAO,EAGX,OAAQA,EAAQxyB,GAAOzT,MACvB,KAAK+5G,EAAaM,eACd,OAAO,GACX,KAAKN,EAAajqD,UACd,OAAO,GAGX,OAAO,EAAE,EAGPmyB,EAAOv/E,IAA6C,IAA5C,MAAC+Q,EAAK,MAAEvB,GAA+BxP,EACjD,GAAI0lG,EAAa30F,GACb,OAAQwyB,EAAQxyB,GAAOzT,MACvB,KAAK+5G,EAAad,OAEd,MAAMj5F,EAASimB,EAAQxyB,GAAOhY,KAC9B,OACIqJ,IAAAA,cAAA,OACIoN,MAAOA,EACP1P,IAAKwd,EAAO9X,KAAKrM,IAEjBiJ,IAAAA,cAACm0G,EAAM,CACHvwG,QAASA,EACT+K,MAAOA,EACPqrF,WAAY74D,EAAQ/3B,OACpB8R,OAAQA,EACRk5F,QAASA,EACTrxG,QAAS,CAACiyG,wBAI1B,KAAKC,EAAajqD,UAClB,KAAKiqD,EAAaM,eACd,OACIv1G,IAAAA,cAAA,OACItC,IAAKiR,EACLvB,MAAOA,GAEN+zB,EAAQxyB,GAAOhY,MAG5B,QACI,OAAO,KAIf,OAAO,IAAI,EAGf,OAAuB,IAAnBwqC,EAAQ/3B,OACD,KAIPpJ,IAAAA,cAACojG,EAAAA,EAAS,MACL9sC,IAAA,IAAC,OAAChoD,EAAM,MAAED,GAAMioD,EAAA,OACbt2D,IAAAA,cAACqjG,EAAAA,EAAc,CACXzoD,IAAKgmD,EACL0C,aAAcA,EACdlC,UAAWA,EACXC,cAAeA,IAEdmU,IAAA,IAAC,gBAAChS,EAAiB5oD,IAAAA,GAAI46D,EAAA,OAEpBx1G,IAAAA,cAACyjG,EAAAA,GAAgB,CACbrC,UAAWA,EACXoC,gBAAiBA,EACjB5oD,IAAM66D,IACF76D,EAAI66D,GACJ5U,EAAoBpuF,QAAUgjG,CAAI,EAGtC/R,SAAU4R,EACVhnG,OAAQA,EACRD,MAAOA,GAEN8uE,EACc,GAEV,GAEb,EAElB+3B,EAAA7sG,UAAA,CAnIE84B,QAAOr7B,IAAAA,QAAAA,IAAAA,MAAA,CALP5K,KAAI4K,IAAAA,MAAA,0CAAAC,WACJpP,KAAImP,IAAAA,UAAA,CAAAA,IAAAA,MAAA,CAZJzG,OAAMyG,IAAAA,OACNU,YAAWV,IAAAA,OAAAC,aAAAD,IAAAA,UAAAC,cAAAA,WAgBXquG,QAAOtuG,IAAAA,KAAAC,WACPo7F,YAAWr7F,IAAAA,KAAAC,WACXovG,kBAAiBrvG,IAAAA,KAAAC,WACjBqvG,YAAWtvG,IAAAA,OAAAC,WACXivG,kBAAiBlvG,IAAAA,KAAAC,WACjBsvG,SAAQvvG,IAAAA,KAAAC,YA+HZ,SAAewpD,EAAAA,EAAAA,MAAK2lD,E,+KC9HL,SAASQ,EAAgBh2G,GAAc,IAAAi2G,EAClD,MAAOt/F,IAAU+5E,EAAAA,EAAAA,KACXqL,GAAQC,EAAAA,EAAAA,KACRka,GAAQ7+D,EAAAA,EAAAA,aAAY8+D,EAAAA,IAEpB70B,EACFhhF,IAAAA,cAACo8E,EAAAA,GAAY,CACTnO,aAAcvuE,EAAM8+E,QACpBjC,eAAe,EACf3vE,SAAUlN,EAAM8+E,QAChB9B,iBAAiBo5B,EAAAA,EAAAA,GAAiBp2G,EAAMwO,OACxCstE,iBAAkB97E,EAAMq2G,kBAAmBD,EAAAA,EAAAA,GAAiBp2G,EAAMq2G,gBAAgB32G,SAClFy8E,cAAkC,QAArB85B,EAAEj2G,EAAMs2G,qBAAa,IAAAL,OAAA,EAAnBA,EAAqBrmG,QACpCisE,kBAAmB77E,EAAMs2G,gBAAiBF,EAAAA,EAAAA,GAAiBp2G,EAAMs2G,cAAc52G,SAC/Ea,UAAU,kBACV4M,SAAUnN,EAAMmN,SAChBopG,kBAAmBv2G,EAAMu2G,mBAEzBj2G,IAAAA,cAAAA,IAAAA,SAAA,KACKA,IAAAA,eAAqBN,EAAMQ,aAAeR,EAAMQ,YAAcF,IAAAA,cAAA,KAAGC,UAAU,gCACvEP,EAAMQ,cAAe41G,EAAAA,EAAAA,GAAiBp2G,EAAMQ,cAEjDF,IAAAA,cAACu8F,EAAAA,EAAoB,CACjBC,WAAW,EACXnmF,OAAQ3W,EAAMw2G,WAAa7/F,EAC3BolF,MAAOA,MAMvB,OAAK/7F,EAAMy2G,WAKPn2G,IAAAA,cAACo2G,EAAAA,QAAoB,CAACR,MAAOA,GACxB50B,GALEA,CAQf,CAAC00B,EAAArtG,UAAA,CApDG2tG,cAAalwG,IAAAA,MAAA,CALbwJ,QAAOxJ,IAAAA,OAMPiwG,gBAAejwG,IAAAA,MAAA,CANfwJ,QAAOxJ,IAAAA,OAOP04E,QAAO14E,IAAAA,KAAAC,WAEP8G,SAAQ/G,IAAAA,KACRmwG,kBAAiBnwG,IAAAA,OACjB7F,UAAS6F,IAAAA,OAGTqwG,WAAUrwG,IAAAA,K,mICpBC,SAASuwG,EAAU32G,GAC9B,OACIM,IAAAA,cAAA,OAAKC,UAAU,sBACVP,EAAM88F,WAAax8F,IAAAA,cAAA,KAAGC,UAAS,4BAAAU,OAA8BjB,EAAMK,QACpEC,IAAAA,cAAA,OAAKC,UAAU,2BACXD,IAAAA,cAAA,OAAKC,UAAU,iCAAiCP,EAAM42G,WACtDt2G,IAAAA,cAACu2G,EAAAA,EAAe,CACZC,SAAS,OACT1+F,QAAShU,KAAKiU,MAAsB,IAAhBrY,EAAMoY,YAGlC9X,IAAAA,cAAA,OAAKC,UAAU,mCACVP,EAAM+2G,aAIvB,CCpBO,SAASX,EAAiBn8E,GAC7B,OAAIA,GAAkB,iBAANA,GAAkBv5B,OAAO20C,OAAOpb,EAAG,kBAE3C35B,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAK4iC,EAAc5iC,GACnB0S,eAAiBkwB,EAAclwB,eAC/BjB,OAASmxB,EAAcnxB,SAK5BmxB,CACX,CAQe,SAAS4iE,EAAqB78F,GAAc,IAAAg3G,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACvD,MAAM1tG,GAAOiQ,EAAAA,EAAAA,WACb,OACIxZ,IAAAA,cAAA,WACIA,IAAAA,cAACq2G,EAAS,CACNt2G,KAAK,4BACLy8F,UAAW98F,EAAM88F,UACjB1kF,QAASpY,EAAM+7F,MAAMl+E,SAASu9E,UAAuB,QAAZ4b,EAAAh3G,EAAM2W,cAAM,IAAAqgG,GAAU,QAAVC,EAAZD,EAAcn5F,gBAAQ,IAAAo5F,OAAV,EAAZA,EAAwB7b,UAAW3e,OAAO+6B,WACnFZ,UACIt2G,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,aAGvBgtG,YACIz2G,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+CACH0S,eAAe,qBACfjB,OAAQ,CACJ2uG,QAAQC,EAAAA,EAAAA,IAAI13G,EAAM+7F,MAAMl+E,SAASu9E,SACjCuc,OAAOD,EAAAA,EAAAA,KAAgB,QAAZR,EAAAl3G,EAAM2W,cAAM,IAAAugG,GAAU,QAAVC,EAAZD,EAAcr5F,gBAAQ,IAAAs5F,OAAV,EAAZA,EAAwB/b,UAAW,QAK9D96F,IAAAA,cAACq2G,EAAS,CACNt2G,KAAK,sBACLy8F,UAAW98F,EAAM88F,UACjB1kF,QAASpY,EAAM+7F,MAAMrtE,MAAMkpF,eAA4B,QAAZR,EAAAp3G,EAAM2W,cAAM,IAAAygG,GAAO,QAAPC,EAAZD,EAAc1oF,aAAK,IAAA2oF,OAAP,EAAZA,EAAqBQ,gBAAiBp7B,OAAO+6B,WACxFZ,UACIt2G,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,UAGvBgtG,YACIz2G,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4CACH0S,eAAe,qBACfjB,OAAQ,CACJ2uG,QAAQK,EAAAA,EAAAA,IAAW93G,EAAM+7F,MAAMrtE,MAAMkpF,aAAc/tG,EAAKkuG,cACxDJ,OAAOG,EAAAA,EAAAA,KAAuB,QAAZR,EAAAt3G,EAAM2W,cAAM,IAAA2gG,GAAO,QAAPC,EAAZD,EAAc5oF,aAAK,IAAA6oF,OAAP,EAAZA,EAAqBM,gBAAiB,EAAGhuG,EAAKkuG,mBAO5F,CDhDCpB,EAAAhuG,UAAA,CAvBGtI,KAAI+F,IAAAA,OAAAC,WACJuwG,UAASxwG,IAAAA,KAAAC,WACT0wG,YAAW3wG,IAAAA,KAAAC,WACX+R,QAAOhS,IAAAA,OAAAC,WACPy2F,UAAS12F,IAAAA,MCmEZy2F,EAAAl0F,UAAA,CAnDGm0F,UAAS12F,IAAAA,K,kkCCpBN,IAAK4xG,EAAe,SAAfA,GAAe,OAAfA,EAAAA,EAAe,iBAAfA,EAAAA,EAAe,iBAAfA,CAAe,MAc3B,MAyFA,EAzF2Bv/G,IAA4H,IAA3H,SAACu9E,EAAQ,gBAAEiiC,EAAe,MAAEhiC,EAAQ,KAAI,MAAEC,EAAQ,KAAI,SAAE8wB,EAAW,IAAG,qBAAE7wB,GAAuB,GAAuB19E,EAC9I,MAAMy/G,GAAa/rD,EAAAA,EAAAA,QAAuB,MACpCgsD,GAAWhsD,EAAAA,EAAAA,QAAuB,MAClCisD,GAAWjsD,EAAAA,EAAAA,QAAoC6pB,GAC/CqiC,GAAalsD,EAAAA,EAAAA,QAAoB,OAChCmsD,EAASC,IAAc1+F,EAAAA,EAAAA,WAAkB,IACzCjL,EAAQ4pG,IAAa3+F,EAAAA,EAAAA,UAA0B,SAC/CkwF,EAAU0O,IAAe5+F,EAAAA,EAAAA,UAAiB,YAC1C6+F,EAAOC,IAAY9+F,EAAAA,EAAAA,UAASm8D,IAAagiC,EAAgBY,MAAQ3iC,EAAQC,IAEhFxwB,EAAAA,EAAAA,YAAU,KACF0yD,EAASrlG,UAAYijE,EAErB2iC,EAAS3iC,IAAagiC,EAAgBY,MAAQ3iC,EAAQC,IAGtDkiC,EAASrlG,QAAUijE,EACnBuiC,GAAW,GACf,GACD,CAACviC,EAAUC,EAAOC,KAErBxwB,EAAAA,EAAAA,YAAU,KACN,GAAIywB,EAAsB,CACtB,MAAM3gD,EAAUjK,YAAW,KAAMstF,EAAAA,EAAAA,GAAeX,EAAWnlG,QAAU,CACjE+lG,SAAU,SACVC,WAAY,YACZC,MAAO,YACP,KACJ,MAAO,IAAMnjE,aAAargB,EAC9B,CACA,MAAO,MAAQ,GAChB,CAAC2gD,EAAsBH,IAI1B,MAAMijC,EAA6B,CAC/BC,mBAAoB,SACpBC,mBAAoB,GAAFl4G,OAAK+lG,EAAQ,MAC/BoS,yBAA0B,OAC1BzqG,MAAO,QAiBX,OACIrO,IAAAA,cAAC+4G,EAAAA,GAAU,CACPprG,GAAIqqG,EACJ9iF,QAASwxE,EACTsS,QAASA,KAAM,IAAAC,EACXf,EAA4B,QAAnBe,EAAClB,EAAWtlG,eAAO,IAAAwmG,EAAAA,EAAIpB,EAASplG,QAASymG,cAClDf,EAAY,UACZE,EAAS3iC,IAAagiC,EAAgBY,MAAQ3iC,EAAQC,EAAM,EAEhEujC,WAAYA,KACRjB,EAAUL,EAASplG,QAASymG,aAAa,EAE7CE,UAAYx8C,IACRm7C,EAAWtlG,QAAUolG,EAASplG,QAASymG,aACvChB,EAAU,QACVC,EAAY,WACZF,GAAW,GACXN,SAAAA,EAAkB/6C,EAAK,GAG3B58D,IAAAA,cAAA,OACIC,UAAU,aACV26C,IAAKg9D,EACLxqG,MAAKtW,EAAAA,EAAA,GAAM6hH,GAAW,IAAErqG,SAAQm7F,cAEhCzpG,IAAAA,cAAA,OAAK46C,IAAKi9D,GACLO,IAGA,C,8GC3FrB,MAAMiB,EAAWlhH,IASgB,IATf,WACdmhH,EAAU,GACVviH,EAAE,cACFwiH,EAAa,iBACbC,EAAgB,iBAChBC,EAAgB,kBAChBC,EAAiB,UACjBC,EAAYC,EAAAA,EAASC,OAAM,aAC3BC,GACI3hH,EACJ,MAAO4hH,EAAYC,IAAiBzgG,EAAAA,EAAAA,UAAS,IACtC0gG,EAAoBC,IAAyB3gG,EAAAA,EAAAA,WAAUggG,IACvDY,EAAoBC,IAAyB7gG,EAAAA,EAAAA,WAAS,GAEvD8gG,EAAYA,KACdH,GAAsB,GAEtB,MAAMI,EAAcP,IAAeT,EAAWlwG,OACxCmxG,EAAgBD,GAAef,EAAgB,GAAMe,GAAeP,EAAa,QAAM/+G,EAEzFu/G,IACAP,EAAcO,GAEVf,GACAA,EAAiBe,GAEzB,EAGEC,EAAYA,KACdJ,GAAsB,GAEtB,MAAMK,EAA8B,IAAfV,EACfQ,EAAgBE,GAAgBlB,EAAgBD,EAAWlwG,QAAWqxG,GAAgBV,EAAa,QAAM/+G,EAE3Gu/G,IACAP,EAAcO,GAEVd,GACAA,EAAiBc,GAEzB,EAmBJ,OAhBAn1D,EAAAA,EAAAA,YAAU,KACF20D,IAAeT,EAAWlwG,OACrBmwG,GACDa,GAAsB,GAEJ,IAAfL,IACFR,GACDW,GAAsB,GAE9B,GACD,CAACH,IAOA/5G,IAAAA,cAAA,OACIC,UAAU,mBACVlJ,GAAIA,GAEH4iH,IAAcC,EAAAA,EAASc,SAAW16G,IAAAA,cAAAA,IAAAA,SAAA,KAC/BA,IAAAA,cAAC26G,EAAAA,EAAc,CACXC,UAAWJ,EACXxkC,UAAW,OACX3uE,SAAU4yG,EACVN,UAAWC,EAAAA,EAASc,UAExB16G,IAAAA,cAAC26G,EAAAA,EAAc,CACXC,UAAWP,EACXrkC,UAAW,OACX3uE,SAAU8yG,GAAsBT,EAChCC,UAAWC,EAAAA,EAASc,WAG3BpB,EAAWj2G,KAAI,CAACw3G,EAAUlsG,IAEnB3O,IAAAA,cAAA,OACItC,IAAG,GAAAiD,OAAKgO,EAAM3K,YACd/D,UAAW85G,IAAeprG,EAAQ,EAAI,oBAAsB,SAE3DksG,KAKb76G,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,OAAKC,UAAU,kBACVq5G,EAAWj2G,KAAI,CAAC1D,EAAMgP,IACnB3O,IAAAA,cAAA,OACItC,IAAKiR,EAAM3K,WACXsL,QAASA,IAvChBX,KACbqrG,EAAcrrG,EAAM,EAsCemsG,CAAQnsG,EAAQ,GAC/B1O,UAAW85G,IAAeprG,EAAQ,EAAI,aAAe,WAIhEgrG,IAAcC,EAAAA,EAASC,QAAU75G,IAAAA,cAAA,OAAKC,UAAU,8BAC7CD,IAAAA,cAAC26G,EAAAA,EAAc,CACXC,UAAWJ,EACXxkC,UAAW,OACX3uE,SAAU4yG,IAEdj6G,IAAAA,cAAC26G,EAAAA,EAAc,CACXC,UAAWP,EACXrkC,UAAW,OACX3uE,SAAU8yG,GAAsBT,KAGvCI,GAAgB95G,IAAAA,cAAA,OAAKC,UAAU,8BAC3B65G,IAGP,EAEZT,EAAAhxG,UAAA,CA/HEixG,WAAUxzG,IAAAA,QAAAA,IAAAA,MAAAC,WACVhP,GAAE+O,IAAAA,OAAAC,WACFwzG,cAAazzG,IAAAA,KAAAC,WACbyzG,iBAAgB1zG,IAAAA,KAChB2zG,iBAAgB3zG,IAAAA,KAChB4zG,kBAAiB5zG,IAAAA,KAEjBg0G,aAAYh0G,IAAAA,SA0HhB,S,kGClIO,IAAK8zG,EAAQ,SAARA,GAAQ,OAARA,EAAQ,gBAARA,EAAQ,kBAARA,CAAQ,MAGnB,IASImB,EAAW,SAAXA,GAAW,OAAXA,EAAW,YAAXA,EAAW,YAAXA,CAAW,EAAXA,GAAW,IAKhB,MAAMJ,EAAiBxiH,IAAuF,IAAtF,UAAC69E,EAAS,UAAE4kC,EAAS,SAAEvzG,EAAQ,UAAEsyG,EAAYC,EAASC,QAAc1hH,EACxF,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElBwhG,EAAkBA,KAChB3zG,GAGJuzG,GAAW,EAGTpwG,EAAOwrE,IAAc+kC,EAAYE,KAAOzxG,EAAc,CAACzS,GAAI,sBAAuB0S,eAAgB,SAAWD,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,aAE3KyxG,EAAgB7zG,EAAW,YAAc,GACzC+gE,EAAc4N,IAAc+kC,EAAYE,KAAO,QAAU,OAE/D,OAAItB,IAAcC,EAASc,QAEnB16G,IAAAA,cAAA,OACIC,UAAW,0BAAAU,OAA0BynE,EAAW,KAAAznE,OAAIq1E,EAAS,QAASklC,EACtE5rG,QAAS0rG,GAETh7G,IAAAA,cAAA,KAAGC,UAAS,gBAAAU,OAAkBynE,MAKtCpoE,IAAAA,cAAA,KACIsP,QAAS0rG,EACT/6G,UAAW,GAAAU,OAAGq1E,IAAc+kC,EAAYE,KAAO,iBAAmB,sBAAyBC,GAE1FllC,IAAc+kC,EAAYI,KAAOn7G,IAAAA,cAAA,KAAGC,UAAU,wBAA0B,KACxEuK,EACAwrE,IAAc+kC,EAAYE,KAAOj7G,IAAAA,cAAA,KAAGC,UAAU,2BAA6B,KAC5E,EAEV06G,EAAAtyG,UAAA,CA9CE2tE,UAASlwE,IAAAA,OAAAC,WACT60G,UAAS90G,IAAAA,KAAAC,WACT4zG,UAAS7zG,IAAAA,MAAA,sBACTuB,SAAQvB,IAAAA,MA6CZ,S,6ICtCA,MAAMs1G,EAAav5D,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,cAAbq7C,CAAa,gcAmBzBw5D,GAAOA,EAAEC,YAAc,sDAAwD,KAWhFC,EAAc,CAACC,YAAa,QAE5BC,EAAOtjH,IAQA,IARC,QACVmX,EAAO,YACPgsG,EAAW,UACXr7G,EAAS,YACTy7G,EAAW,QACX/R,EAAO,OACPnhG,EAAM,iBACNmzG,GACIxjH,EACJ,MAAM4nD,GAActmC,EAAAA,EAAAA,cAAata,IAC7BA,EAAEyK,iBACF0F,SAAAA,GAAW,GACZ,CAACA,IAEJ,OACItP,IAAAA,cAACo7G,EAAU,CACP9rG,QAASywC,EACTu7D,YAAaA,EACbr7G,UAAWA,GAAa,IAEvBy7G,GACG17G,IAAAA,cAAC47G,EAAAA,EAAW,CACRC,UAAWH,EACX5G,WAAYyG,IAGlB5R,GAAWnhG,GACTxI,IAAAA,cAACgK,EAAAA,iBAAgB5J,OAAAC,OAAA,GACTspG,EAAO,CACXnhG,OAAQA,KAGfmzG,EACQ,EAEnBF,EAAApzG,UAAA,CA9EEiH,QAAOxJ,IAAAA,KAEP0C,OAAM1C,IAAAA,SAAAA,IAAAA,KACN7F,UAAS6F,IAAAA,OAGTw1G,YAAWx1G,IAAAA,KACX41G,YAAW51G,IAAAA,QAyEf,S,wFCrDA,QApBA,SAAqCg2G,GACjC,OAAO,cAAc97G,IAAAA,UACjB,uBAAMi7C,GAEF,IAAKv4C,KAAKhD,MAAM2uF,QACZ,OAEJ,MAAM,aAACx4E,EAAY,QAAE9S,EAAO,YAAEqrF,GAAe1rF,KAAKhD,MAE9CgvF,IAAQ74E,IAAiBu4E,GAAzBM,MAAwC3rF,GAAAA,EAAS+S,4BAC3C/S,EAAQ+S,sBAEtB,CAEAnQ,MAAAA,GACI,OAAO3F,IAAAA,cAAC87G,EAAqBp5G,KAAKhD,MACtC,EAER,C,6GC7BO,IAAKq8G,EAAyB,SAAzBA,GAAyB,OAAzBA,EAAyB,sBAAzBA,EAAyB,0BAAzBA,EAAyB,kBAAzBA,EAAyB,8BAAzBA,CAAyB,MAOtB,SAASC,IACpB,MAAOC,EAAiBC,IAAsB3iG,EAAAA,EAAAA,UAAoCwiG,EAA0BI,SAGtGC,EAAoD,UAD3CrlE,EAAAA,EAAAA,aAAYt3B,EAAAA,IACM24B,qBAmBjC,OAjBAgN,EAAAA,EAAAA,YAAU,KAUFg3D,EATJ7lH,iBACI,UACUyB,EAAAA,GAAQqkH,uBACdH,EAAmBH,EAA0BO,UACjD,CAAE,MAAO5lH,GACLwlH,EAAmBH,EAA0BQ,YACjD,CACJ,CAGIF,GAEAH,EAAmBH,EAA0BS,cACjD,GACD,CAACJ,IAEGH,CACX,C,kDChCA,MAWA,EAXuCvyC,CAAC+yC,EAAQC,KAC5C,MAAMC,GAAU9wD,EAAAA,EAAAA,SAAO,IACvBzG,EAAAA,EAAAA,YAAU,KACN,GAAIu3D,EAAQlqG,QACR,OAAOgqG,IAGXE,EAAQlqG,SAAU,CAAI,GACvBiqG,EAAK,C,wGCNL,MAAME,GAA4ExyD,EAAAA,EAAAA,IACrF,qBACA3qC,EAAAA,IACC9kB,IACG,MAAMkiH,EAASliH,EAAOmiH,OACtB,OAAQC,GACG,GAAPp8G,OAAUk8G,EAAM,gCAAAl8G,OAA+Bo8G,EAClD,ICFHxlB,IDMoCntC,EAAAA,EAAAA,IACtC,8BACC9xD,GAAuBA,EAAMuyB,SAASmsB,MAAM7gC,WAC5CA,GACQA,EAIE/V,OAAOoI,OAAO2N,GAAY,IAAIhT,QAAQ65G,GAA+B,SAAnBA,EAAQ39G,QAAqB29G,EAAQ/kG,MAAQ,IAH3F,MAOgCmyC,EAAAA,EAAAA,IAC/C,uCACC9xD,GAAuBA,EAAMuyB,SAASmsB,MAAMnhC,eAC5CA,IACG,IAAKA,IAAiBA,EAAaonG,iBAC/B,OAAO,EAEX,MAAMp/F,EAAM,IAAID,KACVs/F,EAAiB,IAAIt/F,KAAqC,IAAhC/H,EAAaonG,kBAC7C,OAAQn5G,KAAKiU,OAAO8F,EAAI08E,UAAY2iB,EAAe3iB,WAAa,QAA0B,EAAE,KC3BxFrrF,EAAAA,EAAAA,eAAc,CACtBnY,GAAI,uCACJ0S,eAAgB,mBAGPguF,EAA6Bt/F,IAGJ,IAHK,eACvCu/F,EAAc,OACdC,GAC6Bx/F,EAC7B,MAAMglH,GAAiBpmE,EAAAA,EAAAA,aAAY6lE,GAE7BplB,GAAe/9E,EAAAA,EAAAA,cAAa89E,KAC9Bh5F,EAAAA,EAAAA,IAAW,WAAYm5F,EAAiB,wBAA0B,sBAAuB,CACrFH,MACAI,UACF,GACH,CAACA,EAAQD,IAEZ,MAAO,CACHH,MACA4lB,iBACA3lB,eACH,C,sECLU,SAASwF,EAAiCvB,EAAmBplF,GACxE,OAAOsD,EAAAA,EAAAA,UAAQ,KAAM,IAAAyjG,EAAAC,EACjB,GAAmC,IAA/Bj9G,OAAO+I,KAAKkN,GAAQjN,OACpB,OAAO,EAEX,MAAMk0G,EAA0C,QAAlBF,EAAG/mG,EAAOkH,gBAAQ,IAAA6/F,OAAA,EAAfA,EAAiBtiB,QAC5CyiB,EAAsB9hB,EAAMl+E,SAASu9E,QAErC0iB,EAAoC,QAAfH,EAAGhnG,EAAO+X,aAAK,IAAAivF,OAAA,EAAZA,EAAc9F,cACtCkG,EAAmBhiB,EAAMrtE,MAAMkpF,aAQ/BoG,EA7Bd,WAAuE,QAAAC,EAAA13G,UAAAmD,OAA3C8K,EAAI,IAAA9N,MAAAu3G,GAAAnpC,EAAA,EAAAA,EAAAmpC,EAAAnpC,IAAJtgE,EAAIsgE,GAAAvuE,UAAAuuE,GAC5B,OAAOtgE,EAAK3B,QAAO,CAACqrG,EAAqBC,UACR7iH,IAAzB6iH,EAAexG,OACfuG,EAAI5rG,KAAK6rG,GAEND,IACR,GACP,CAsB6BE,CACjB,CACI/mH,GAAIgnH,EAAAA,GAAW1uC,eACfgoC,MAAOiG,EACP7hB,MAAO8hB,GAEX,CACIxmH,GAAIgnH,EAAAA,GAAWC,YACf3G,MAAOmG,EACP/hB,MAAOgiB,IAGXlrG,QAAO,CAACqrG,EAA2BK,IAC1BL,EAMAK,EAAKxiB,MAAQwiB,EAAK5G,MAAUuG,EAAIniB,MAAQmiB,EAAIvG,MACtC4G,EAEJL,EARCK,EAAK5G,OAAS4G,EAAK5G,MAAQ,EACpB4G,EAEJL,IAMZ,GAKP,SAD+BF,GAAiBA,EAAajiB,MAAQiiB,EAAarG,MAAU6G,EAAAA,GAAgBC,KAAO,MAI5GT,CAAY,GACpB,CAACjiB,EAAOplF,GACf,C,sGCpEe,SAAS+5E,IACpB,MAAM/B,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,IACtBZ,GAAauoB,EAAAA,EAAAA,MACbC,GAActnE,EAAAA,EAAAA,aAAYxiC,EAAAA,IAC1B+pG,GAAsBvnE,EAAAA,EAAAA,aAAYwnE,EAAAA,IAClCloH,GAAWsxD,EAAAA,EAAAA,eACXgpC,GAAsB55C,EAAAA,EAAAA,aAAY65C,EAAAA,KACjC4tB,EAAiBC,IAAsBllG,EAAAA,EAAAA,WAAS,GAkBvD,OAhBA6rC,EAAAA,EAAAA,YAAU,KACFywC,GAAcxH,IAAYmwB,IAAoBF,IAC9CjoH,GAASqoH,EAAAA,EAAAA,OACTD,GAAmB,GACvB,GACD,CAAC5oB,EAAYxH,EAASmwB,EAAiBF,KAE1Cl5D,EAAAA,EAAAA,YAAU,KACFurC,GAAuB6tB,GACvBC,GAAmB,EACvB,GACD,CAAC9tB,KAE8Bh3E,EAAAA,EAAAA,UAAQ,IAC/B,CAAC0kG,EAAaC,IACtB,CAACD,EAAaC,GAErB,C,6GC5BO,MAAMK,EAAe,CACxBC,WAAY,cACZC,QAAS,UACTC,QAAS,UACTC,OAAQ,SACRC,gBAAiB,YAuBfzhG,GAAW25C,EAAAA,EAAAA,gBAAe,CAC5B,CAACynD,EAAaE,SAAU,CACpB9nH,GAAI,qDACJ0S,eAAgB,gBAEpB,CAACk1G,EAAaG,SAAU,CACpB/nH,GAAI,oDACJ0S,eAAgB,mBAEpB,CAACk1G,EAAaK,iBAAkB,CAC5BjoH,GAAI,4DACJ0S,eAAgB,qBAEpB,CAACk1G,EAAaI,QAAS,CACnBhoH,GAAI,kDACJ0S,eAAgB,oBAEpB,CAACk1G,EAAaC,YAAa,CACvB7nH,GAAI,kDACJ0S,eAAgB,uBAIXw1G,EAAqB/qG,IAC9B,MAAOgrG,EAAcC,IAAa5lG,EAAAA,EAAAA,UAAuColG,EAAaC,YAwBtF,MAAO,CACHM,eACA9tB,SAxBY33E,EAAAA,EAAAA,cAAapa,GACrB6U,EAAK42E,SAAWzrF,IAAWs/G,EAAaC,WACjC1qG,EAAK42E,QAETvtE,EAASle,IACjB,CAAC6U,EAAK42E,UAoBLs0B,aAlBgB3lG,EAAAA,EAAAA,cAAYljB,UAAwD,IAAjD,YAAC8oH,EAAW,aAAEC,GAA8BnnH,EAC/E,IACIgnH,EAAUR,EAAaE,eACjB7mH,EAAAA,GAAQonH,YAAYC,IAC1B9gH,EAAAA,EAAAA,IAAW+gH,EAAalvF,SAAUkvF,EAAaznG,MAAOynG,EAAa5/G,OACnEy/G,EAAUR,EAAaG,QAC3B,CAAE,MAAOpoH,GACDA,GAA+B,MAAtBA,EAAM4I,YACf6/G,EAAUR,EAAaK,iBAEvBG,EAAUR,EAAaI,OAE/B,IACD,IAMF,C,0FCpFL,MAgBA,EAhB+B,WAAqC,IAApCQ,EAAet5G,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAC3C,MAAM5P,GAAWsxD,EAAAA,EAAAA,gBACV63D,EAAWC,IAAgBlmG,EAAAA,EAAAA,UAAiB,GAWnD,OATA6rC,EAAAA,EAAAA,YAAU,KACgB7uD,WAAY,IAAAmpH,EAC9B,MAAM,KAAC/oH,SAAcN,GAASspH,EAAAA,EAAAA,IAAsB,CAACC,cAAc,EAAOC,gBAAiBN,IAAkB,IAC7GE,EAAoC,QAAxBC,EAAC/oH,aAAI,EAAJA,EAAMmpH,yBAAiB,IAAAJ,EAAAA,EAAI,EAAE,EAG9CK,EAAe,GAChB,IAEIP,CACX,C,iHCHe,SAAS9jB,IACpB,MAAMD,GAAQ1kD,EAAAA,EAAAA,aAAYipE,EAAAA,GACpB3xB,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,IACtBZ,GAAauoB,EAAAA,EAAAA,MAEb/nH,GAAWsxD,EAAAA,EAAAA,gBAEVs4D,EAAmBC,IAAwB3mG,EAAAA,EAAAA,WAAS,IAC3D6rC,EAAAA,EAAAA,YAAU,KACFywC,GAAcxH,IAAY4xB,IAAsBxkB,EAAMl+E,SAAS4iG,gBAC/D9pH,GAASwe,EAAAA,EAAAA,OACTqrG,GAAqB,GACzB,GACD,CAACrqB,EAAYxH,EAAS4xB,EAAmBxkB,EAAMl+E,SAAS4iG,gBAE3D,MAAOC,EAAkBC,IAAuB9mG,EAAAA,EAAAA,WAAS,IACzD6rC,EAAAA,EAAAA,YAAU,KACFywC,GAAcxH,IAAY+xB,IAAqB3kB,EAAMrtE,MAAMkyF,qBAC3DjqH,GAAS4e,EAAAA,EAAAA,OACTorG,GAAoB,GACxB,GACD,CAACxqB,EAAYxH,EAAS+xB,EAAkB3kB,EAAMrtE,MAAMkyF,qBAEvD,MAAOC,EAAqBC,IAA0BjnG,EAAAA,EAAAA,WAAS,GAQ/D,OAPA6rC,EAAAA,EAAAA,YAAU,KACFywC,GAAcxH,IAAYkyB,IAAwB9kB,EAAMr+D,MAAMqjF,cAC9DpqH,GAASgf,EAAAA,EAAAA,OACTmrG,GAAuB,GAC3B,GACD,CAAC3qB,EAAYxH,EAASkyB,EAAqB9kB,EAAMr+D,MAAMqjF,cAEnDhlB,CACX,C,oHChCe,SAAS/P,IACpB,MAAMr1F,GAAWsxD,EAAAA,EAAAA,eACX0mC,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,IAqB5B,OApByBh9E,EAAAA,EAAAA,cAAainG,IAClC,IAAItwF,EAGAA,EADAi+D,EACWN,EAAAA,GAAqB4yB,cAErB,uBAEfpiH,EAAAA,EAAAA,IAAW6xB,EAAU,2BAA4B,CAC7CwwF,WAAYF,aAAc,EAAdA,EAAgB1vB,mBAEhC36F,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBy7E,cAC1Bv7E,WAAYw7E,EAAAA,EACZv7E,YAAa,CACT2tG,UAAWH,aAAc,EAAdA,EAAgB1vB,oBAEhC,GACJ,CAAC36F,EAAUg4F,GAGlB,C,wGC/BA,MAAMyyB,EAAY,aAEH,SAAS3vB,IACpB,MAAM9C,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,IACtBxgF,GAAW8gC,EAAAA,EAAAA,aAAY7gC,EAAAA,IACvB+qB,GAAc8V,EAAAA,EAAAA,aAAYh0B,EAAAA,IAChC,IAAIg+F,EAAgB,GAChBjU,EAAY,GACZkU,EAAW,GACXpqE,EAAc,GACdqqE,EAAY,aAEZ5yB,GAAWp4E,GACX8qG,EAAgB9qG,EAAS9c,OAAS,GAClC2zG,EAAY72F,EAASirG,oBAAsB,GAC3CF,EAAW/qG,EAASkrG,mBAAqB,GACzCvqE,EAAc3gC,EAAS9V,MAAQ,GAC/B8gH,EAAY,oBAEZF,GAAgB9/E,aAAW,EAAXA,EAAa9nC,QAAS,GAG1C,MAAMioH,GAAmBC,EAAAA,EAAAA,IAAWC,EAAAA,GAAaC,cAAezU,EAAWkU,EAAUpqE,EAAamqE,EAAeD,EAAWG,GAK5H,MAAO,EAJmBxnG,EAAAA,EAAAA,cAAY,MAClC+nG,EAAAA,EAAAA,IAA+B1U,EAAWkU,EAAUpqE,EAAamqE,EAAeD,EAAWG,EAAU,GACtG,CAACnU,EAAWkU,EAAUpqE,EAAamqE,EAAeE,IAE1BG,EAC/B,C,8FC1Be,SAASnoB,IACpB,MAAM5iG,GAAWsxD,EAAAA,EAAAA,eACjB,OAAOluC,EAAAA,EAAAA,cAAY,CAACinG,EAAiCliC,KACjDnoF,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiB0uG,uBAC1BxuG,WAAYyuG,EAAAA,EACZxuG,YAAa,CACTjU,KAAMyhH,aAAc,EAAdA,EAAgB1vB,iBACtBxS,aAEL,GACJ,CAACnoF,GACR,C,yFCdA,IAAIsrH,EAKG,SAAS7rB,IACZ,MAAO8rB,EAA+BC,IAAoCtoG,EAAAA,EAAAA,eAAwCve,GAE5G8mH,GAAYC,EAAAA,EAAAA,MACZC,GAAcjsB,EAAAA,EAAAA,MAEdksB,GAAuCxoG,EAAAA,EAAAA,cAAYljB,UAKrD,MAAMutC,QAAmBo+E,aAAaC,oBAQtC,OALAR,EAA2C79E,EAG3C+9E,EAAiC/9E,GAE1BA,CAAU,GAClB,IAaH,OAXAshB,EAAAA,EAAAA,YAAU,KACD08D,GAAcE,OAEqChnH,IAA7C2mH,EAEPM,SACoDjnH,IAA7C2mH,GACPE,EAAiCF,GALjCE,OAAiC7mH,EAMrC,GACD,CAAC8mH,EAAWE,EAAaC,IAErB,CAACL,EAA+BK,EAC3C,C,0FCzCA,MAAMG,EAAkB1iH,IAAe,IAAA2iH,EAAAC,EAAA,OACnCtiH,IAAAA,cAAA,OACIqO,OAAkB,QAAXg0G,EAAA3iH,EAAM2O,aAAK,IAAAg0G,OAAA,EAAXA,EAAar+G,aAAc,MAClCsK,QAAoB,QAAZg0G,EAAA5iH,EAAM4O,cAAM,IAAAg0G,OAAA,EAAZA,EAAct+G,aAAc,MACpCm8C,QAAQ,cACRC,KAAK,OACLC,MAAM,6BACNC,WAAW,gCAEXtgD,IAAAA,cAAA,KAAGuiH,SAAS,0BACRviH,IAAAA,cAAA,QACIqO,MAAM,MACNC,OAAO,MACP4yC,GAAG,MACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,4MACFC,OAAO,UACPM,YAAY,OACZqhE,iBAAiB,OAErBxiH,IAAAA,cAAA,KAAGuiH,SAAS,0BACRviH,IAAAA,cAAA,QACI4gD,EAAE,2sBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kbACFR,KAAK,0BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kbACFR,KAAK,0BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yMACFR,KAAK,0BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iIACFR,KAAK,0BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0IACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mMACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mGACFR,KAAK,aAGbpgD,IAAAA,cAAA,QACIjJ,GAAG,mBACHqW,MAAO,CACHq1G,SAAU,SAEdphE,UAAU,iBACV1nB,EAAE,MACFsnB,EAAE,KACF5yC,MAAM,MACNC,OAAO,OAEPtO,IAAAA,cAAA,QACI4gD,EAAE,2MACFR,KAAK,aAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,0BACJthD,IAAAA,cAAA,QACI4gD,EAAE,gaACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4nBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIjJ,GAAG,mBACHqW,MAAO,CACHq1G,SAAU,SAEdphE,UAAU,iBACV1nB,EAAE,MACFsnB,EAAE,MACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,4nBACFR,KAAK,8BAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,0BACJthD,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,UACPoyC,UAAU,mCACVN,KAAK,mBAETpgD,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,UACPoyC,UAAU,mCACVN,KAAK,oBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,mfACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0bACFR,KAAK,aAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,+SACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mRACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8bACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,MACRX,EAAE,maACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0sBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIjJ,GAAG,mBACHqW,MAAO,CACHq1G,SAAU,SAEdphE,UAAU,iBACV1nB,EAAE,MACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,0sBACFR,KAAK,aAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,0BACJthD,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,UACPoyC,UAAU,mCACVN,KAAK,oBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,mwBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIjJ,GAAG,mBACHqW,MAAO,CACHq1G,SAAU,SAEd9oF,EAAE,MACFsnB,EAAE,MACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,mwBACFR,KAAK,aAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,0BACJthD,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,UACPoyC,UAAU,mCACVN,KAAK,oBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,kZACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,ywBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8VACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,knBACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,sWACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yNACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kaACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wNACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oZACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kLACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+ZACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2NACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,qaACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+ZACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kKACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4cACFR,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,MACRX,EAAE,mNACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2dACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,siBACFR,KAAK,2BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,qfACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gfACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,ufACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+RACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+HACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,qlCACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gWACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2kBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIjJ,GAAG,mBACHqW,MAAO,CACHq1G,SAAU,SAEdphE,UAAU,iBACV1nB,EAAE,IACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,OAEPtO,IAAAA,cAAA,QACI4gD,EAAE,sBACFR,KAAK,aAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,0BACJthD,IAAAA,cAAA,QACI4gD,EAAE,iyBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6YACFR,KAAK,cAIjBpgD,IAAAA,cAAA,YACIA,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,qBACVjiE,UAAU,uBAGlB1gD,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,qBACVjiE,UAAU,kCAGlB1gD,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,qBACVjiE,UAAU,iCAGlB1gD,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,qBACVjiE,UAAU,kCAGlB1gD,IAAAA,cAAA,YAAUjJ,GAAG,oBACTiJ,IAAAA,cAAA,QACIqO,MAAM,MACNC,OAAO,MACP4yC,GAAG,MACHd,KAAK,8BAGbpgD,IAAAA,cAAA,YAAUjJ,GAAG,oBACTiJ,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,UACP8xC,KAAK,2BACLM,UAAU,gCAGlB1gD,IAAAA,cAAA,SACIjJ,GAAG,oBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,ujqBAEd3iH,IAAAA,cAAA,SACIjJ,GAAG,oBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,umsBAEd3iH,IAAAA,cAAA,SACIjJ,GAAG,oBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,u5cAEd3iH,IAAAA,cAAA,SACIjJ,GAAG,oBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,42QAGhB,EAERP,EAAA/5G,UAAA,CA9aEgG,MAAKvI,IAAAA,OACLwI,OAAMxI,IAAAA,QA+aV,S,+EC1aA,MAAM88G,E,MAAM/gE,GAAAA,IAAWghE,MAAM,CACzBlhE,QAAS,MACTtB,MAAO,6BACPC,WAAY,iCACdwB,WAAA,CAAAt7C,YAAA,OAJUq7C,CAIV,MAEF,EAAgBniD,GACZM,IAAAA,cAAC4iH,EAAG,CACA3iH,UAAWP,EAAMO,UACjBoO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,KACjDm8C,QAAQ,aACRC,KAAK,OACLC,MAAM,8BAENrgD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,k3XACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,kkCACFR,KAAK,Y,0FC3BjB,MAAM27C,EAAsBr8F,IAAe,IAAA2iH,EAAAC,EAAA,OACvCtiH,IAAAA,cAAA,OACIqO,OAAkB,QAAXg0G,EAAA3iH,EAAM2O,aAAK,IAAAg0G,OAAA,EAAXA,EAAar+G,aAAc,MAClCsK,QAAoB,QAAZg0G,EAAA5iH,EAAM4O,cAAM,IAAAg0G,OAAA,EAAZA,EAAct+G,aAAc,MACpCm8C,QAAQ,cACRC,KAAK,OACLC,MAAM,6BACNC,WAAW,gCAEXtgD,IAAAA,cAAA,QACI4gD,EAAE,oJACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oJACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4JACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kDACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6eACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oDACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2wCACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,2wCACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mwCACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2wCACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2wCACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,mwCACFR,KAAK,UAEP,EACR27C,EAAA1zF,UAAA,CAzFEgG,MAAKvI,IAAAA,OACLwI,OAAMxI,IAAAA,QA0FV,S,0FCvFA,MAAMg9G,EAAcpjH,GAChBM,IAAAA,cAAA,OACIqO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,KACjDm8C,QAAQ,aACRC,KAAK,OACLC,MAAM,8BAENrgD,IAAAA,cAAA,QACI25B,EAAE,cACFsnB,EAAE,IACF5yC,MAAM,KACNC,OAAO,KACP4yC,GAAG,OACHd,KAAK,mBACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,KACP4yC,GAAG,OACHd,KAAK,mBACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,6RACFR,KAAK,gCAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oNACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,6TACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kNACFC,OAAO,gCAEX7gD,IAAAA,cAAA,QACI4gD,EAAE,ulBACFC,OAAO,8BACPC,cAAc,UAGxBgiE,EAAAz6G,UAAA,CA1DEgG,MAAKvI,IAAAA,OAAAC,WACLuI,OAAMxI,IAAAA,OAAAC,YA2DV,S,8GC3CA,MAAMg9G,E,SAAoB7E,GAQpB8E,EAAgBnhE,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,iBAAVq7C,CAAU,8EACjBniD,GAAkC,iBAAhBA,EAAM2O,MAAqBvK,KAAKm/G,KAAKvjH,EAAM2O,MAAQ,IAAIrK,WAAa,KAAO,QAC9FtE,GAAkC,iBAAhBA,EAAM2O,MAAqB3O,EAAM2O,MAAMrK,WAAa,KAAOtE,EAAM2O,QAC9E3O,GACXwjH,EAAWxjH,EAAMoY,QAASpY,EAAMyjH,YAAc,uBAAyB,gDA4B/E,SAASD,EAAWprG,EAAiBqrG,GACjC,OAAOrrG,GAAWqrG,EAAWC,QACjC,CAEA,MAAMC,EAAgBxhE,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,iBAAVq7C,CAAU,4IAElBniD,GAAWwjH,EAAWxjH,EAAMoY,QAASpY,EAAMyjH,YAAc,GAAKzjH,EAAMoY,UAEzDpY,GAxBzB,SAAkBoY,EAAiBqrG,GAC/B,QAAQ,GACR,KAAKrrG,EAAUqrG,EAAWG,GACtB,MAAO,GACX,KAAKxrG,EAAUqrG,EAAWhF,KACtB,MAAO,0BACX,KAAKrmG,EAAUqrG,EAAWI,QAAUzrG,EAAUqrG,EAAWC,SAErD,MAAO,wBACX,KAAKtrG,EAAUqrG,EAAWC,SACtB,MAAO,uBACX,QACI,MAAO,GAEf,CAUmCI,CAAS9jH,EAAMoY,QAASpY,EAAMyjH,cAK3D5M,EAAmB72G,IACrB,MAAMyjH,EAAazjH,EAAMyjH,YAAcJ,EACjCjrG,EAAUhU,KAAKs2D,IAAI,EAAG16D,EAAMoY,SAC5B0+F,EAAW92G,EAAM82G,UAAY,IACnC,OACIx2G,IAAAA,cAACgjH,EAAa,CACV30G,MAAOmoG,EACP2M,WAAYA,EACZrrG,QAASA,GAET9X,IAAAA,cAACqjH,EAAa,CACVh1G,MAAOmoG,EACP2M,WAAYA,EACZrrG,QAASA,IAED,EAEtBy+F,EAAAluG,UAAA,CA3EEyP,QAAOhS,IAAAA,OAAAC,WACPo9G,WAAUr9G,IAAAA,MAAA,CAVVw9G,GAAEx9G,IAAAA,OAAAC,WACFo4G,KAAIr4G,IAAAA,OAAAC,WACJw9G,OAAMz9G,IAAAA,OAAAC,WACNq9G,SAAQt9G,IAAAA,OAAAC,aAQRywG,SAAQ1wG,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,UA2EZ,S,ykCCjFA,MAAMswG,EAAuBj+G,IAGhB,IAHiB,MAC1By9G,EAAK,SACLvhD,GACIl8D,EACJ,MAAMsrH,GAAe9pG,EAAAA,EAAAA,UAAQ,KACzB,MAAM+pG,EAAI5sH,EAAAA,EAAA,GACH6sH,EAAAA,IAAU,IACbC,cAAc,EACdC,gBAAgB,EAChBC,aAAa,IAGjB,OAAAhtH,EAAAA,EAAA,GACO4sH,GAAI,IACPK,QAAOjtH,EAAAA,EAAA,GACA4sH,EAAKK,SAAO,IACfC,QAAOltH,EAAAA,EAAA,GACA4sH,EAAKK,QAAQC,SAAO,IACvBC,KAAMrO,EAAMsO,gBACZC,SAAUvO,EAAMwO,yBAEpBC,MAAKvtH,EAAAA,EAAA,GACE4sH,EAAKK,QAAQM,OAAK,IACrBJ,KAAMrO,EAAM0O,iBAGpBvqG,OAAMjjB,EAAAA,EAAA,GACC4sH,EAAK3pG,QAAM,IACdwqG,MAAO3O,EAAMwO,uBACb/8G,SAAUuuG,EAAMwO,yBAEpBI,OAAM1tH,EAAAA,EAAA,GACC4sH,EAAKc,QAAM,IACdC,OAAQ7O,EAAM8O,gBACdC,KAAM/O,EAAMgP,cACZC,IAAKjP,EAAM0O,eAEf95G,KAAI1T,EAAAA,EAAA,GACG4sH,EAAKl5G,MAAI,IACZw5G,QAASpO,EAAMwO,0BAClB,GAEN,CAACxO,IAEJ,OACI51G,IAAAA,cAAC8kH,EAAAA,GAAa,CAAClP,MAAO6N,GACjBpvD,EACW,EAEtB+hD,EAAA/tG,UAAA,CApDEgsD,SAAQvuD,IAAAA,MAsDZ,S,0KCtDe,SAASy9E,EAAkB7jF,GACtC,MAAM,SACFwoD,EAAQ,UACR+L,EAAS,SACTrnD,GAEAlN,EADG25E,E,qWAAUx5B,CACbngD,EAAKogD,IAEFj0C,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,GAE3BwrG,GAAkBtrG,EAAAA,EAAAA,cAAaurG,IACjC98D,SAAAA,EAAW88D,GAEX1rG,GAAQ,EAAM,GACf,CAAC4uC,IACE+8D,GAAmBxrG,EAAAA,EAAAA,cAAaurG,IAClC/wD,SAAAA,EAAY+wD,GAEZ1rG,GAAQ,EAAM,GACf,CAAC26C,IAEJ,OACIj0D,IAAAA,cAACklH,EAAAA,EAAY9kH,OAAAC,OAAA,GACLg5E,EAAU,CACdnxB,SAAU68D,EACV9wD,UAAWgxD,EACXr4G,SAAUA,EACVf,KAAMA,IAGlB,CAAC03E,EAAAl7E,UAAA,CAjCGuE,SAAQ9G,IAAAA,KAAAC,YCHZ,S,+ICYA,MAAMo/G,EAA+BzlH,IACjC,MAAM6J,GAAOiQ,EAAAA,EAAAA,YAEN4rG,EAAUC,IAAe9rG,EAAAA,EAAAA,WAAS,GACnC+rG,GAAWz5D,EAAAA,EAAAA,QAA8B,MAiB/C,IAAI05D,EAEAA,EADAH,EACiB7nG,EAASioG,OACnB9lH,EAAM+lH,UACIloG,EAASmoG,SAETnoG,EAASooG,SAG9B,MAAMC,EACF5lH,IAAAA,cAACgK,EAAAA,iBAAqBu7G,GAGpBM,EAAgB1uE,IAAW,uBAAwBz3C,EAAMO,WAE/D,OACID,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO03G,GAEP5lH,IAAAA,cAAA,QACIC,UAAW4lH,EACXv2G,QApCMnQ,IACdA,EAAEyK,iBACFy7G,GAAY,GAERC,EAAS7yG,SACT8iC,aAAa+vE,EAAS7yG,SAG1B6yG,EAAS7yG,QAAUwY,YAAW,KAC1Bo6F,GAAY,EAAM,GACnB,MAEHS,EAAAA,EAAAA,IAAgBpmH,EAAM08F,QAAQ,EAyBtB,aAAY7yF,EAAKC,cAAc+7G,GAC/Bz4G,KAAK,WAEHs4G,GACEplH,IAAAA,cAAA,KACIC,UAAU,2BAGjBmlH,GACGplH,IAAAA,cAAA,KACIC,UAAU,qBAIZ,EAEpBklH,EAAA98G,UAAA,CAhEE+zF,QAAOt2F,IAAAA,OAAAC,WACP0/G,UAAS3/G,IAAAA,KACT7F,UAAS6F,IAAAA,QAgEb,MAAMyX,GAAW25C,EAAAA,EAAAA,gBAAe,CAC5BsuD,OAAQ,CACJzuH,GAAI,iBACJ0S,eAAgB,UAEpBk8G,SAAU,CACN5uH,GAAI,oBACJ0S,eAAgB,aAEpBi8G,SAAU,CACN3uH,GAAI,oBACJ0S,eAAgB,eAIxB,G,yqBChDO,MAAMs8G,UAA8B/lH,IAAAA,cACvCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,eAgBR,KACLE,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAC/BrJ,EAAA,sBACe,IACLE,KAAKpK,MAAM6H,KAAKiJ,OAAS,GAAK1G,KAAKpK,MAAM8qF,QAAQh6E,OAAS,GAAK1G,KAAKpK,MAAM0tH,WAAW58G,OAAS,IACxG5G,EAAA,wBACkBrD,IACf,MAAMqE,EAAQrE,EAAEq7D,OAAOh3D,MACvB,IAAI4/E,EAAU1gF,KAAKpK,MAAM8qF,QACpB1gF,KAAKpK,MAAM2tH,yBACZ7iC,EAAU5/E,EAAMyjC,QAAQ,qBAAsB,IAAIhkC,cAClB,MAA5BmgF,EAAQ9zD,UAAU,EAAG,KACrB8zD,EAAU,IAAHziF,OAAOyiF,KAGtB1gF,KAAKgH,SAAS,CAACvJ,KAAMqD,EAAO4/E,WAAS,IACxC5gF,EAAA,2BAEqBrD,IAClB,MAAMqE,EAAQrE,EAAEq7D,OAAOh3D,MACvBd,KAAKgH,SAAS,CAAC05E,QAAS5/E,EAAOyiH,wBAAwB,GAAM,IAChEzjH,EAAA,wBAE0BwjH,IACvBtjH,KAAKgH,SAAS,CAACs8G,cAAY,IAC9BxjH,EAAA,2BAE6BwjH,IAC1BtjH,KAAKgH,SAAS,CAACs8G,cAAY,IAC9BxjH,EAAA,eAEQ,KACwC,mBAAlCE,KAAKhD,MAAM0lG,qBAClB1iG,KAAKhD,MAAM0lG,qBACX1iG,KAAKhD,MAAMkN,WACf,IACHpK,EAAA,oBAEajM,UACVmM,KAAKgH,SAAS,CAACw8G,kBAAkB,EAAOC,sBAAuB,GAAIC,mBAAoB,GAAIjtE,QAAQ,IACnG,IAAIiqC,EAAU1gF,KAAKpK,MAAM8qF,QACzB,MAAM58E,EAAc9D,KAAKpK,MAAM6H,KAE/B,IAAKqG,IAAgBA,EAAY+oB,OAU7B,YATA7sB,KAAKgH,SAAS,CACV08G,mBACIpmH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,8BAGvB0vC,QAAQ,IAKhB,IAAKj2C,GAA0B,IAAjBA,EAAMkG,OAEhB,YADA1G,KAAKgH,SAAS,CAACyvC,QAAQ,IAO3B,GAJgC,MAA5BiqC,EAAQ9zD,UAAU,EAAG,KACrB8zD,EAAUA,EAAQ9zD,UAAU,EAAG8zD,EAAQh6E,SAGvCg6E,EAAQh6E,OAAS,EAUjB,YATA1G,KAAKgH,SAAS,CACVy8G,sBACInmH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,iCAGvB0vC,QAAQ,IAKhB,GAAI1zB,EAAAA,GAAU4gG,iBAAiBl6E,SAASi3C,EAAQngF,eAU5C,YATAP,KAAKgH,SAAS,CACVy8G,sBACInmH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,sCAGvB0vC,QAAQ,IAMhB,IADqB,IAAIqE,OAAO,mBACd3iB,KAAKuoD,GAUnB,YATA1gF,KAAKgH,SAAS,CACVy8G,sBACInmH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,kCAGvB0vC,QAAQ,IAKhB,MAAMxL,EAAQ,CACVxtC,KAAMijF,EACNvjF,aAAc6C,KAAKpK,MAAM6H,KACzBmmH,iBAAiB,EACjBl2G,OAAQ,SACRm2G,SAAUrjH,EAAMG,KAAKD,GACVA,EAAKrM,MAIdJ,QAAa+L,KAAKhD,MAAMqD,QAAQyjH,uBAAuB74E,GAE5C,IAAA84E,EAAAC,EAAb/vH,SAAAA,EAAMD,OAC8B,kCAAtB,QAAV+vH,EAAA9vH,EAAKD,aAAK,IAAA+vH,OAAA,EAAVA,EAAYzvH,iBACZ0L,KAAKgH,SAAS,CACVy8G,sBACInmH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,kCAIY,iCAAtB,QAAVi9G,EAAA/vH,EAAKD,aAAK,IAAAgwH,OAAA,EAAVA,EAAY1vH,iBACnB0L,KAAKgH,SAAS,CACVy8G,sBACInmH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4CACH0S,eAAe,wEAK3B/G,KAAKgH,SAAS,CAACw8G,kBAAkB,IAErCxjH,KAAKgH,SAAS,CAACyvC,QAAQ,KACyB,mBAAlCz2C,KAAKhD,MAAM0lG,mBACzB1iG,KAAKikH,SAELjkH,KAAK00C,QACT,IA7JA10C,KAAKpK,MAAQ,CACTuT,MAAM,EACN1L,KAAM,GACNijF,QAAS,GACTjkC,eAAe,EACf6mE,WAAY,GACZC,wBAAwB,EACxBE,sBAAuB,GACvBC,mBAAoB,GACpBF,kBAAkB,EAClB/sE,QAAQ,EAEhB,CAoJAxzC,MAAAA,GACI,OACI3F,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,uCAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAK00C,OACbxqC,SAAUlK,KAAKhD,MAAMkN,SACrBE,KAAK,OACL,kBAAgB,6BAChB/V,GAAG,yBAEHiJ,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GAEsB,mBAAlCzK,KAAKhD,MAAM0lG,mBACdplG,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,wCACV,aAAYyC,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,SAChG6F,QAASA,KACL5M,KAAKikH,QAAQ,GAGjB3mH,IAAAA,cAAA,KAAGC,UAAU,0BAEjBD,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,kCAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,mBAK3BzJ,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,0BAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,mBAOnCzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,OAAKC,UAAU,4BACXD,IAAAA,cAAC4mH,EAAAA,EAAK,CACF1rH,KAAK,OACLmJ,aAAa6K,EAAAA,EAAAA,eAAc,CAACnY,GAAI,yBAA0B0S,eAAgB,SAC1E9G,SAAUD,KAAKmkH,gBACfrjH,MAAOd,KAAKpK,MAAM6H,KAClB,cAAY,YACZ6G,UAAW,GACXI,WAAW,EACX0/G,cAAe,CAAC5rH,KAAM6rH,EAAAA,GAAW11G,MAAO7N,MAAOd,KAAKpK,MAAM8tH,uBAGlEpmH,IAAAA,cAAA,OAAKC,UAAU,+BACXD,IAAAA,cAAC4mH,EAAAA,EAAK,CACF1rH,KAAK,OACLmJ,aAAa6K,EAAAA,EAAAA,eAAc,CAACnY,GAAI,4BAA6B0S,eAAgB,YAC7E9G,SAAUD,KAAKskH,mBACfxjH,MAAOd,KAAKpK,MAAM8qF,QAClBp8E,UAAW,GACX,cAAY,eACZ8/G,cAAe,CAAC5rH,KAAM6rH,EAAAA,GAAW11G,MAAO7N,MAAOd,KAAKpK,MAAM6tH,0BAGlEnmH,IAAAA,cAAA,UACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,gBAGvBzJ,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAC+9C,EAAAA,EAAyB,CACtBc,gBAAiB,qBACjBN,iBAAkB77C,KAAKukH,YACvB/nE,aAAa,EACbC,cAAez8C,KAAKwkH,gBACpBlpE,gBAAiBt7C,KAAKs7C,gBACtBC,mBAAoBv7C,KAAKu7C,mBACzBqB,gBAAgBpwC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,2BAA4B0S,eAAgB,WAC/E21C,gBAC6C,mBAAlC18C,KAAKhD,MAAM0lG,mBAAoC1iG,KAAKikH,OAASjkH,KAAK00C,OAE7EiI,gBAAiB,mBACjBlG,OAAQz2C,KAAKpK,MAAM6gD,UAIvBz2C,KAAKpK,MAAM4tH,kBACXlmH,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,KAAGC,UAAU,4BACbD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,sCAQ/C,EACHjH,EAnRYujH,EAAqB,aAtB9Bn5G,SAAQ9G,IAAAA,KAAAC,WACRq/F,mBAAkBt/F,IAAAA,KAClB/C,QAAO+C,IAAAA,MAAA,CACH0gH,uBAAsB1gH,IAAAA,KAAAC,WACtB8M,UAAS/M,IAAAA,KAAAC,aAAAA,aAuSjB,SAAeyJ,EAAAA,EAAAA,YAAWu2G,GC5S1B,GAAej+G,EAAAA,EAAAA,SAAQ,MATvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBw+G,uBAAsB,KACtB3zG,UAASA,EAAAA,GACVxc,GAEX,GAEA,CAAiD0vH,E,4JCMjD,SAASvR,EAAiBr8G,GAUhB,IAViB,UACvBu8G,EAAY,GAAE,YACdnrB,GAAc,EAAK,UACnBorB,EAAY,CAAC,EAAC,WACdG,EAAa,CACT7W,WAAY,EACZkpB,WAAY,GACf,OACD1S,EAAS,GAAE,QACXnlG,GACInX,EACJ,MAAMivH,GAAkBztG,EAAAA,EAAAA,SAAQ0tG,EAAAA,GAAqB,IAC/CljF,GAAe4S,EAAAA,EAAAA,cAAaz+C,GAAuB8uH,EAAgB9uH,EAAOm8G,KAE1EnvD,GAAWvO,EAAAA,EAAAA,aAAYoO,EAAAA,IAEvBmiE,GAAsBvwE,EAAAA,EAAAA,cAAaz+C,IAAuBivH,EAAAA,EAAAA,IAAsBjvH,EAAO6rC,KACvFqjF,GAAsBzwE,EAAAA,EAAAA,aAAY0wE,EAAAA,IAElCC,GAAW77D,EAAAA,EAAAA,QAAwB,MAEzC,IAAK27D,GAAwBrjF,UAAAA,EAAcE,OAASijF,EAChD,OAAO,KAGX,MAAMK,EACF3nH,IAAAA,cAAC47G,EAAAA,EAAW,CACRC,UAAW13E,EAAaE,MACxBvjC,KAAM4zG,EACNI,WAAYA,EACZxlG,QAASA,IAIjB,OAAKi6E,EAKDvpF,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,iBACVkkC,EAAa35B,MACVxK,IAAAA,cAAA,QACIC,UAAU,qBACVmN,MAAO,CAAC6wF,WAAY,IAEnB95D,EAAa35B,OAIzB25B,EAAayjF,YAAczjF,EAAauiE,WAAamhB,EAAAA,EAAqBC,YACvE9nH,IAAAA,cAAA,WACIA,IAAAA,cAAC+nH,EAAAA,EAAU,CACP3/F,KAAM+b,EAAayjF,WACnBtiE,SAAUA,EACVrlD,UAAU,2BAM9BokC,MAAOF,EAAaE,MACpB2jF,cAAc,GAEdhoH,IAAAA,cAAA,QACI46C,IAAK8sE,EACLt6G,MAAOunG,GAENgT,IAnCFA,CAuCf,CAEA,SAASM,EAAc7sE,EAAkBl3C,GACrC,OAAOk3C,EAAUq5D,SAAWvwG,EAAUuwG,MAC1C,CAJCD,EAAAnsG,UAAA,CAlFGqsG,UAAS5uG,IAAAA,OACTyjF,YAAWzjF,IAAAA,KAGX2uG,OAAM3uG,IAAAA,OACNwJ,QAAOxJ,IAAAA,MAmFX,SAAeypD,EAAAA,EAAAA,MAAKilD,EAAmByT,E,6UCnFvC,MAAMC,EAA2CxoH,IAC7C,MAAM,sBAACyoH,EAAqB,YAAEniB,EAAW,OAAE3mG,GAAUK,GAC/C,MAAC2kC,EAAK,KAAE75B,EAAI,SAAEk8F,GAAYrnG,GACzBwM,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,GAc3B6uG,EAAcpiB,EAChBhmG,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,WAIvBzJ,IAAAA,cAAA,UACIC,UAAU,4BACVqP,QApBuBuI,IACnCA,EAAM+7C,kBACN/7C,EAAMjO,iBACFo8F,GACAA,EAAY3mG,EAChB,GAiBYW,IAAAA,cAAA,KAAGC,UAAU,8BAIzB,KAEJ,OACID,IAAAA,cAAA,UACIC,UAAU,wCACVuqF,aAnCgB69B,IAAM/uG,GAAQ,GAoC9BgvG,aAlCgBC,IAAMjvG,GAAQ,GAmC9BhK,QAASA,IAAM64G,EAAsB9oH,GACrCm2D,SAAU,GAEVx1D,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAAC47G,EAAAA,EAAW,CACRC,UAAWx3E,EACXvjC,KAAM,MAGdd,IAAAA,cAACwoH,EAAAA,EAAgB,CACbh+G,KAAMA,EACNvK,UAAWk3C,IAAW,yBAA0B,CAC5CsxE,cAAe/hB,MAGtBA,GACDA,IAAamhB,EAAAA,EAAqBa,kBAClChiB,IAAamhB,EAAAA,EAAqBc,eAC9B3oH,IAAAA,cAAA,QAAMC,UAAU,8BACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI6xH,EAAAA,GAAeliB,GAAU3vG,GAC7B0S,eAAgBm/G,EAAAA,GAAeliB,GAAUj9F,kBAIpDoC,GAAQu8G,EACJ,EAEfF,EAAA7/G,UAAA,CA3EE8/G,sBAAqBriH,IAAAA,KAAAC,WACrBigG,YAAWlgG,IAAAA,MA4Ef,U,0DCvEA,MAAM,WACFgiH,EAAU,eACVe,EAAc,SACdC,EAAQ,WACRC,EAAU,MACVC,EAAK,UACLC,EAAS,cACTN,EAAa,iBACbD,GACAb,EAAAA,EAEEqB,EAA+BxpH,IAAiB,IAAAypH,EAClD,MAAM,SAACziB,EAAQ,qBAAE0iB,EAAoB,WAAEC,GAAc3pH,GAC/C,cAAC8J,IAAiBgQ,EAAAA,EAAAA,YACjB8vG,EAAWC,IAAgBhwG,EAAAA,EAAAA,UAAwB,IAEpDiwG,EAAsE,CACxE,CAAC1B,GAAa,CACVt9G,KAAMhB,EAAco/G,EAAAA,GAAed,IACnCtkH,MAAOgG,EAAco/G,EAAAA,GAAed,KAExC,CAACe,GAAiB,CACdr+G,KAAMhB,EAAco/G,EAAAA,GAAeC,IACnCrlH,MAAOgG,EAAco/G,EAAAA,GAAeC,KAExC,CAACC,GAAW,CACRt+G,KAAMhB,EAAco/G,EAAAA,GAAeE,IACnCtlH,MAAOgG,EAAco/G,EAAAA,GAAeE,KAExC,CAACC,GAAa,CACVv+G,KAAMhB,EAAco/G,EAAAA,GAAeG,IACnCvlH,MAAOgG,EAAco/G,EAAAA,GAAeG,KAExC,CAACC,GAAQ,CACLx+G,KAAMhB,EAAco/G,EAAAA,GAAeI,IACnCxlH,MAAOgG,EAAco/G,EAAAA,GAAeI,KAExC,CAACC,GAAY,CACTz+G,KAAMhB,EAAco/G,EAAAA,GAAeK,IACnCzlH,MAAOgG,EAAco/G,EAAAA,GAAeK,KAExC,CAACP,GAAmB,CAChBl+G,KAAMhB,EAAc,CAACzS,GAAI,qDAAsD0S,eAAgB,yBAC/FjG,MAAOgG,EAAco/G,EAAAA,GAAeF,MAqB5C,OAjBAtjE,EAAAA,EAAAA,YAAU,KACN,MAAMqkE,EAAgBrpH,OAAO+I,KAAKqgH,GAAiBnmH,KAAI,CAAC1D,EAAMgP,KAAK,IAAA+6G,EAAAC,EAAA,OAC/D3pH,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ91G,IAAKiC,EAAKqE,WACVsL,QAAUuI,IACNA,EAAMjO,iBACNw/G,EAAqBzpH,EAA6B,EAEtDya,UAAwD,QAA/CsvG,EAAEF,EAAgB7pH,UAA6B,IAAA+pH,OAAA,EAA7CA,EAA+Cl/G,KAAKvH,cAC/DuH,KAAmD,QAA/Cm/G,EAAEH,EAAgB7pH,UAA6B,IAAAgqH,OAAA,EAA7CA,EAA+Cn/G,KACrDzT,GAAE,oBAAA4J,OAAsBgO,IAC1B,IAGN46G,EAAaE,EAAc,GAC5B,IAGCzpH,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,OAAKC,UAAU,yBACXD,IAAAA,cAACka,EAAAA,EAAW,CACRja,UAAW,sBAEXD,IAAAA,cAAA,UAAQC,UAAU,8CACdD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4CACH0S,eAAe,gBAChB,KACF4/G,GAAc3iB,IAAaohB,EACxB9nH,IAAAA,cAAC+nH,EAAAA,EAAU,CACP3/F,KAAMihG,EACNppH,UAAU,eACV2pH,YAAY,IAGhB5pH,IAAAA,cAAA,QAAMC,UAAU,gBAC8D,QADhDkpH,EACzBK,EAAgB9iB,IAAaiiB,EAAgBD,EAAmBhiB,UAAS,IAAAyiB,OAAA,EAAzEA,EAA2E3lH,OAGpFxD,IAAAA,cAAA,YACIA,IAAAA,cAAA,KACIC,UAAU,mBACV,cAAY,WAIxBD,IAAAA,cAAC4Z,EAAAA,EAAI,CACDQ,UAAW5Q,EAAc,CAACzS,GAAI,4CAA6C0S,eAAgB,gBAC3F1S,GAAG,oBAEHiJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACNP,MAKf,EAEZJ,EAAA7gH,UAAA,CA7GEghH,WAAUvjH,IAAAA,OACVsjH,qBAAoBtjH,IAAAA,KAAAC,YA8GxB,U,2DCnFA,MAUI+hH,WAAU,EACVe,eAAc,EACdC,SAAQ,EACRC,WAAU,EACVC,MAAK,EACLC,UAAS,EACTN,cAAa,GACbD,iBAAgBA,IAChBb,EAAAA,EAEEiC,GAA4D,CAC9D,CACIzlF,MAAO,WACPjlC,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,yCACJ0S,eAAgB,iBAEpBi9F,SAAUoiB,GAEd,CACIzkF,MAAO,YACPjlC,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,0CACJ0S,eAAgB,kBAEpBi9F,SAAUmiB,GAEd,CACIxkF,MAAO,gBACPjlC,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,qCACJ0S,eAAgB,aAEpBi9F,SAAUsiB,GAEd,CACI3kF,MAAO,QACPjlC,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,8CACJ0S,eAAgB,sBAEpBi9F,SAAUsiB,GAEd,CACI3kF,MAAO,YACPjlC,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,0CACJ0S,eAAgB,kBAEpBi9F,SAAUuiB,IAIZc,GAAkBf,EAClBgB,GAAsCtqH,IACxC,MAAM0nH,GAAkBztG,EAAAA,EAAAA,SAAQ0tG,EAAAA,GAAqB,IAC/ChxH,GAAWsxD,EAAAA,EAAAA,eACXsiE,GAAsBlzE,EAAAA,EAAAA,aAAYqwE,GAClCE,GAAsBvwE,EAAAA,EAAAA,cAAaz+C,IAAuBivH,EAAAA,EAAAA,IAAsBjvH,EAAO2xH,KACvFC,GAAuBnzE,EAAAA,EAAAA,aAAYozE,EAAAA,IACnCC,GAAyBv+D,EAAAA,EAAAA,QAAuB,MAChDw+D,GAAiBx+D,EAAAA,EAAAA,QAA0B,OAC3C,cAACriD,IAAiBgQ,EAAAA,EAAAA,WAClB8wG,GAA4BhD,KAAwB2C,aAAmB,EAAnBA,EAAqBz/G,QAAQy/G,aAAmB,EAAnBA,EAAqB5lF,SACrG+nC,EAAiBC,IAAsB9yD,EAAAA,EAAAA,WAAkB,IACzD/O,EAAM+/G,IAAWhxG,EAAAA,EAAAA,UAAiB+wG,EAA2BL,aAAmB,EAAnBA,EAAqBz/G,KAAO,KACzF65B,EAAOmmF,IAAYjxG,EAAAA,EAAAA,UAAiB+wG,EAA2BL,aAAmB,EAAnBA,EAAqB5lF,MAAQ,IAC7FomF,EAAkBH,EAA2BL,aAAmB,EAAnBA,EAAqBvjB,SAAWqjB,IAC5ErjB,EAAUgkB,IAAenxG,EAAAA,EAAAA,eAAmDve,IAApByvH,EAAgCV,GAAkBU,GAC3GE,EAAcp+G,QAAQ83B,GAAS75B,GAC/BogH,GAAuB7zE,EAAAA,EAAAA,aAAY8zE,EAAAA,IACnCvlE,GAAWvO,EAAAA,EAAAA,aAAYoO,EAAAA,IACvB2lE,GAAoBC,EAAAA,EAAAA,eAAc,gBAElCC,IAAcC,EAAAA,EAAAA,IAA4B3lE,GAChD,IAAI4lE,IAAkCC,EAAAA,EAAAA,IAAeH,IACjDV,IAA4BL,aAAmB,EAAnBA,EAAqBvjB,YAAaiiB,IAA9D2B,MAA+EL,GAAAA,EAAqBrC,aACpGsD,GAA0BzwC,IAAOwvC,EAAoBrC,aAEzD,MAAOwD,GAAkBC,KAAuB9xG,EAAAA,EAAAA,UAAiB2xG,KAC1DI,GAAeC,KAAoBhyG,EAAAA,EAAAA,WAAkB,GAEtDu1D,IAAgBr1D,EAAAA,EAAAA,cAAa5B,KAC3B8mD,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASua,UAAYk6C,IACnD5rH,EAAMkN,UACV,GACD,CAAC0+G,GAAe5rH,EAAMkN,YAEzBw4C,EAAAA,EAAAA,YAAU,KACNljD,SAASq7D,iBAAiB,UAAWuR,IAE9B,KACH5sE,SAASu7D,oBAAoB,UAAWqR,GAAc,IAE3D,CAACA,MAkBJ1pB,EAAAA,EAAAA,YAAU,KAfFwlE,GACAv0H,GAASm1H,EAAAA,EAAAA,IAAmC,CAAC,CAAC5rG,EAAAA,GAAY6rG,6BAA6B,KAK3Fp1H,GAASq1H,EAAAA,EAAAA,OAILpE,GAAuB2C,GACvB5zH,GAASs1H,EAAAA,EAAAA,MAOQ,GACtB,KAEHvmE,EAAAA,EAAAA,YAAU,KACF0lE,GACAz0H,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiB64G,eACzC,GACD,CAACv1H,EAAUy0H,IAEd,MAAMe,GAAkBA,KACpB,GAAIP,GACA,OAGJ,MAAMQ,EAAYC,KACZ5nF,EAAiC,CACnCE,MAAOA,GAAS,iBAChB75B,KAAMA,EAAK+kB,OACXm3E,SAAUA,IAAagiB,GAAmBC,GAAgBjiB,GAE1DolB,IACA3nF,EAAayjF,WAAakE,GAE9Bz1H,GAAS21H,EAAAA,EAAAA,IAAgB7nF,IACzB9tC,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiB64G,eAAe,EAGlDK,IAAwBxyG,EAAAA,EAAAA,cAAY,KACjC6xG,IACDO,IACJ,GACD,CAACP,GAAeO,KAEbE,GAAsBA,KACxB,OAAQrlB,GACR,KAAKohB,EACD,MAAO,GACX,KAAKe,EACD,OAAOpuC,MAASlhD,IAAI,GAAI,WAAW2yF,QAAQ,GAAGC,aAAa,GAAGC,cAClE,KAAKtD,EACD,OAAOruC,MAASlhD,IAAI,EAAG,QAAQ2yF,QAAQ,GAAGC,aAAa,GAAGC,cAC9D,KAAKrD,EACD,OAAOtuC,MAASlhD,IAAI,EAAG,SAAS2yF,QAAQ,GAAGC,aAAa,GAAGC,cAC/D,KAAKpD,EACD,OAAOvuC,MAAS4xC,MAAM,OAAO9yF,IAAI,EAAG,UAAU2yF,QAAQ,GAAGC,aAAa,GAAGC,cAC7E,KAAKnD,EACD,OAAOxuC,MAAS4xC,MAAM,QAAQD,cAClC,KAAKzD,GACL,KAAKD,GACD,OAAO0C,GAAiBgB,cAC5B,QACI,MAAO,GACX,EAGEE,GAAoBhC,EAA2B,IAAMj0H,GAASs1H,EAAAA,EAAAA,YAAuB3wH,EAErFuxH,GAA4BA,IAAMnC,EAAuB33G,QAoDzD+5G,GAAiCntH,GAA6BhJ,GAASo2H,EAAAA,EAAAA,IAAyBptH,IAEhGqtH,GAAoBroF,GAAS75B,EAC/BxK,IAAAA,cAAC47G,EAAAA,EAAW,CACRC,UAAWx3E,GAAS,iBACpBvjC,KAAM,KAEVd,IAAAA,cAAC2sH,EAAAA,EAAS,CAAC1sH,UAAW,qBAQpBkoH,GAAyB9oH,IAC3BmrH,EAASnrH,EAAOglC,OAChBkmF,EAAQlrH,EAAOmL,MACfkgH,EAAYrrH,EAAOqnG,UAAYohB,EAAW,EAgBxC8E,GACF5sH,IAAAA,cAAA,OAAKjJ,GAAG,6BACJiJ,IAAAA,cAAA,OAAKC,UAAU,2BACVuJ,EAAc,CAACzS,GAAI,yCAA0C0S,eAAgB,YAG9EygH,EAAqB7mH,KAAKhE,GACtBW,IAAAA,cAACkoH,EAAsB,CACnBxqH,IAAK2B,EAAOmL,KACZ29G,sBAAuBA,GACvBniB,YAAawmB,GACbntH,OAAQA,OAuCtBwtH,IADsB5C,aAAmB,EAAnBA,EAAqB5lF,SAAUA,IAAS4lF,aAAmB,EAAnBA,EAAqBz/G,QAASA,GACvCk8F,KAAaujB,aAAmB,EAAnBA,EAAqBvjB,UAEvFomB,IAAmBnC,GAAekC,GAElCE,IAAoBpC,GAAengH,EAAKpB,OAlUP,IAoUjC4jH,IAAwBF,KAAoBpmB,IAAagiB,IAAoBhiB,IAAaiiB,IAE1FsE,GACFjtH,IAAAA,cAAA,OACIC,UAAU,mBACVmN,MAAO,CAAC+5G,UAAWwD,EAAc,GAAK,IAEtC3qH,IAAAA,cAAA,OAAKC,UAAU,6BACViqH,EAAqB9gH,OAAS,GAAKwjH,GACpC5sH,IAAAA,cAAA,OAAKjJ,GAAG,iCA/CkBm2H,MAClC,MAAMC,EAA0BjD,EAAqB7mH,KAAKhE,GAA6BA,EAAOmL,OACxF4iH,EAA0BtD,GAC5BzmH,KAAKhE,IAAM,CACPglC,MAAOhlC,EAAOglC,MACd75B,KAAMhB,EAAcnK,EAAOD,SAC3BsnG,SAAUrnG,EAAOqnG,aAErBvjG,QAAQ9D,IAA8B8tH,EAAwBhhF,SAAS9sC,EAAOmL,QAC9EnH,KAAI,CAAChE,EAA0BsP,IAC3B3O,IAAAA,cAACkoH,EAAsB,CACnBxqH,IAAKiR,EACLw5G,sBAAuBA,GACvB9oH,OAAQA,MAIpB,OAAI+tH,EAAwBhkH,QAAU,EAC3B,KAIPpJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,2BACVuJ,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,iBAE1E2jH,EACF,EAqBMF,MAMjB,OACIltH,IAAAA,cAACo8E,EAAAA,GAAY,CACTniE,cAAc,EACdrN,SAAUlN,EAAMkN,SAChB2vE,eAAe,EACfG,gBACI18E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,iBAGvB8xE,kBACIv7E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,eAGvB+xE,iBACIx7E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,iBAGvB4jH,kBAAmBN,GACnBh2H,GAAG,sBACHkJ,UAAW,cACX47E,cAAegwC,GACfrvC,oBAAqByvC,GACrBh+C,aAAcq+C,GACdgB,uBAAuB,kBACvBlzG,UAAW5Q,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,iBAC1E8jH,gBAAgB,EAChB/3D,UAAW,EACX8mB,0BAA0B,GAE1Bt8E,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,OACI46C,IAAKwvE,EACLnqH,UAAU,gCAETmsE,GACGpsE,IAAAA,cAACktE,EAAAA,EAAkB,CACf1S,OAAQ+xD,GACR1gH,KAAMugE,EACNz/D,OAzMH6gH,KACrBnhD,GAAmB,GACfg+C,EAAe53G,SACfvQ,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQ6vD,EAAe53G,QACvBmyF,cAAc,KAI9B,EA+LwBz3B,aA/KFsgD,IACtBphD,GAAmB,GACnB,MAAMwvC,EAAa,eAAgB4R,EAAiBA,EAAcC,WAAaD,EAActtH,KAC7FqqH,EAAS3O,GACLwO,EAAe53G,SACfvQ,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQ6vD,EAAe53G,QACvBmyF,cAAc,KAI9B,EAmKwBt3B,YApICqgD,MACzB,IAAIrgD,EAAc7nD,EAAAA,GAAUmoG,kCAC5B,MAAMpzD,EAAS+xD,KAQf,OAPI/xD,IACA8S,EAAc57D,OAAO2hB,WAAamnC,EAAOnT,wBAAwB2H,KAlQ3C,IAmQlBse,EAAc,IACdA,EAAc7nD,EAAAA,GAAUmoG,oCAIzBtgD,CAAW,EA0HmBqgD,GACbE,WAAY,EACZxgD,UAAW,EACXygD,0BAA0B,QAC1BlhH,SAjMFmhH,KAClB1D,EAAe53G,SACfvQ,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQ6vD,EAAe53G,QACvBmyF,cAAc,KAI9B,IA0LgB5kG,IAAAA,cAAA,UACI9E,KAAK,SACLoU,QAzKGnQ,IACvBA,SAAAA,EAAGy0D,kBACHyY,GAAoB2hD,IAAcA,GAAS,EAwKvBpzE,IAAKyvE,EACL,aAAY7gH,EAAc,CAACzS,GAAI,4CAA6C0S,eAAgB,oBAC5FxJ,UAAWk3C,IAAW,0BAA2B,4BAA6B,CAC1E,oCAAqCi1B,KAGxCsgD,KAGT1sH,IAAAA,cAAC6lG,EAAAA,EAAU,CACPooB,eAAgBC,EAAAA,EAChB1qH,MAAOgH,EACPxD,UAzZmB,IA0ZnBmnH,sBAAuB5hH,QAAQo+G,GAC/B5kB,QAxKAqoB,KAChB5D,EAAS,IACTD,EAAQ,IACRG,EAAYX,GAAgB,EAsKZ9pH,UAAU,iCACVouH,eAAe,+BACf1rH,SAtLMkV,GAA+C0yG,EAAQ1yG,EAAM2iD,OAAOh3D,OAuL1Ea,YAAamF,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,iBAC5ErC,WAAW,KAGlBujH,GACG3qH,IAAAA,cAACkpH,EAAU,CACPxiB,SAAUA,EACV2iB,WAAYyD,GAAkB7C,aAAmB,EAAnBA,EAAqBrC,gBAAa5sH,EAChEouH,qBAAsBsB,IAG7BoC,IAAmBG,GACnBD,IACGhtH,IAAAA,cAACsuH,EAAAA,GAAa,CACVlmG,KAAMgjG,GACNxqD,aAAcyqD,GACd/lE,SAAUA,EACVimE,iBAAkBA,MAIlB,EAEtBvB,GAAA3hH,UAAA,CA3bEuE,SAAQ9G,IAAAA,KAAAC,YA6bZ,W,0HCzdA,MAAMyiH,EAAoB9oH,IACtB,MAAM,KAAC8K,EAAI,UAAEvK,GAAaP,EACpB8nH,GAAsBzwE,EAAAA,EAAAA,cAAaz+C,IAC9BmvH,EAAAA,EAAAA,IAAsBnvH,MAE1BuT,EAAMyN,IAAWC,EAAAA,EAAAA,WAAkB,GAC1C,IAAIg1G,EAAsC,KAC1C,IAAK/G,EACD,OAAO,KAGX,MAIMgH,EACFxuH,IAAAA,cAAA,QACIC,UAAS,kCAAAU,OAAoCV,GAC7C26C,IAAM9wC,IACFykH,EAAczkH,EAPtBwP,EAAQ/M,QAAQgiH,GAAeA,EAAYv6C,YAAcu6C,EAAYjlC,aAQhD,GAGhB9+E,GAIT,OAAKqB,EAKD7L,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO1D,GAENgkH,GAPEA,CAQO,EAEpBhG,EAAAngH,UAAA,CA1CEmC,KAAI1E,IAAAA,OACJ7F,UAAS6F,IAAAA,QA2Cb0iH,EAAiBiG,aAAe,CAC5BjkH,KAAM,GACNvK,UAAW,IAGf,S,oUC/BA,MAAMyuH,EAAiD,GAEhD,SAASvD,EAAe3nH,GAA2E,IAA5DmrH,EAAS1oH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAGyoH,EACtD,MAAMhgE,EAAQ+rB,IAAOj3E,GACf2oF,EAAOz9B,EAAMlM,SAAWmsE,EAC9B,GAAa,IAATxiC,EACA,OAAO3oF,EAEX,MAAMorH,EAAYD,EAAYxiC,EAC9B,OAAOz9B,EAAMn1B,IAAIq1F,EAAW,KAAK1C,QAAQ,GAAGC,aAAa,EAC7D,CAEO,MA4BD0C,EAA0C12H,IAOnC,IAPoC,KAC7CiwB,EAAI,aACJw4C,EAAY,SACZtb,EAAQ,iBACRimE,EAAgB,aAChB9vC,EAAY,mBACZN,GACIhjF,EACJ,MAAMorB,GAASwzB,EAAAA,EAAAA,aAAYvzB,EAAAA,IACpBsrG,EAAaC,IAAkBx1G,EAAAA,EAAAA,UAAiB,KAChDy1G,EAAcC,IAAmB11G,EAAAA,EAAAA,WAAS,IAC3C,cAAC/P,IAAiBgQ,EAAAA,EAAAA,WAClB01G,GAAgBrjE,EAAAA,EAAAA,QAA0B,MAC1C+pD,GAAQ7+D,EAAAA,EAAAA,aAAY8+D,EAAAA,IAEpBsZ,GAAwB11G,EAAAA,EAAAA,cAAaysF,IACvC+oB,EAAgB/oB,GAChBqlB,SAAAA,EAAmBrlB,EAAO,GAC3B,CAACqlB,IAEEz8C,GAAgBr1D,EAAAA,EAAAA,cAAa5B,KAC3B8mD,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASua,SAAW49C,GAClDG,GAAsB,EAC1B,GACD,CAACH,EAAcG,KAElB/pE,EAAAA,EAAAA,YAAU,KACNljD,SAASq7D,iBAAiB,UAAWuR,GAE9B,KACH5sE,SAASu7D,oBAAoB,UAAWqR,EAAc,IAE3D,CAACA,KAWJ1pB,EAAAA,EAAAA,YAT0BgqE,KACtB,MAAMpE,GAAcC,EAAAA,EAAAA,IAA4B3lE,GAChD,IAAI+pE,EAAY50C,IAAOryD,GAAMknG,QAAQ,OACjCtE,EAAYuE,OAAOnnG,EAAM,UACzBinG,EAAYlE,EAAeH,EAAa7vC,IAE5C4zC,EApE0B,SAACM,GAAyF,IAAtErpE,EAAQ//C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAGyoH,EACzDtmG,EAAOqyD,IAAO40C,GAClB,MAAMG,EAAU/0C,IAAO40C,GAAW91F,IAAI,EAAG,QAAQ+1F,QAAQ,OAEnDG,EAAoB,GAC1B,KAAOrnG,EAAKsnG,SAASF,IAAU,CAC3BC,EAAUz9G,KAAKoW,EAAK8yD,UACpB,MAAMy0C,EAAYvnG,EAAKunG,YACvBvnG,EAAOA,EAAKmR,IAAIysB,EAAU,WAAWkmE,QAAQ,GAAGC,aAAa,GAGzDwD,EAAYvnG,EAAKunG,cACjBvnG,EAAOA,EAAKmR,IAAIo2F,EAAYvnG,EAAKunG,YAAa,WAAWzD,QAAQ,GAAGC,aAAa,GAEzF,CAEA,OAAOsD,CACX,CAmDuBG,CAAmBP,EAAWl0C,GAAoB,GAGxC,CAAC/yD,IAE9B,MAiBMynG,GAAmBp2G,EAAAA,EAAAA,cAAY,CAAC2O,EAAYjpB,KAC9CA,EAAEyK,iBACFg3D,EAAatb,EAAWm1B,IAAAA,GAAUryD,EAAMk9B,GAAYm1B,IAAOryD,IAC3D0nG,GAAiB,GAClB,CAAClvD,IAEEoqD,GAAcC,EAAAA,EAAAA,IAA4B3lE,GAAU41B,SAEpD40C,GAAkBr2G,EAAAA,EAAAA,cAAY,KAChCvX,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQ00D,EAAcz8G,QACtBmyF,cAAc,KAGxB,GACH,IAMGmrB,EACF/vH,IAAAA,cAACgwH,EAAAA,GAAU,CACP1gH,QAASA,IAAM6/G,GAAsB,GACrCpvH,KAAM,mBACNE,UAAU,0BACVa,KAAM,KACN,gBAAc,SAIhBmvH,EAAkC,CACpC/uC,aAAc8tC,EACdvgE,KAAM,SACNvoD,SAAUkiB,EAAK8yD,SACfg1C,aAAc9nG,EAAK8yD,SACnBi1C,WAvDoBC,CAACngE,EAAWogE,KAChC,GAAIA,EAAUxzB,MAAO,CACjB,MAAMyzB,GAAWrF,EAAAA,EAAAA,IAA4B3lE,IACzCirE,EAAAA,EAAAA,IAAaD,EAAUloG,KACvBkoG,EAAS/tE,KAAKn6B,EAAKooG,SACnBF,EAAS9tE,OAAOp6B,EAAKqoG,YAEzB,MAAMC,EAAcvF,EAAemF,EAAUn1C,GAC7Cva,EAAa8vD,EACjB,KAAO,CACHzgE,EAAI0gE,SAASvoG,EAAKm6B,OAAQn6B,EAAKo6B,UAC/B,MAAMouE,EAAkBtrE,EAAWm1B,IAAOxqB,GAAKyqB,GAAGp1B,GAAU,GAAQm1B,IAAOxqB,GAC3E2Q,EAAagwD,EACjB,CACAzB,GAAsB,EAAM,EA0C5B9nH,SAAU,CAAC,CACPwpH,OAAQ7F,IAEZ8F,iBAAiB,GAGrB,OACI9wH,IAAAA,cAACo2G,EAAAA,QAAoB,CAACR,MAAOA,GACzB51G,IAAAA,cAAA,OAAKC,UAAU,YACXD,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAC+wH,EAAAA,EAAU,CACP/B,aAAcA,EACdG,sBAAuBA,EACvB5rG,OAAQA,EACR0sG,gBAAiBA,GAEjBjwH,IAAAA,cAAC4mH,EAAAA,EAAK,CACFpjH,OArCJ2pF,EAqCsB/kE,EApC/BqzD,GAAeu1C,EAAAA,EAAAA,IAAmB7jC,EAAM3jF,GAAiBg8C,EAAAA,SAASyrE,WAAW9jC,EAAKjS,UAAUg2C,kBAqC/En6H,GAAG,+BACHo6H,UAAU,EACVlxH,UAAWk3C,IAAW,2BAA4B,CAAC+uD,OAAQ8oB,IAC3DptH,MAAO4H,EAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,SAC/E6F,QAASA,IAAM6/G,GAAsB,GACrC35D,UAAW,EACX47D,YAAarB,MAIzB/vH,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAACka,EAAAA,EAAW,CACRja,UAAU,sBACVs9E,SAAUguC,GAEVvrH,IAAAA,cAAA,UACIC,UAAU,cACV26C,IAAKs0E,GAELlvH,IAAAA,cAAA,QAAMC,UAAU,yBAAyBuJ,EAAc,CAACzS,GAAI,yCAA0C0S,eAAgB,UACtHzJ,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAAA,KAAGC,UAAU,wBAEjBD,IAAAA,cAAA,OACIC,UAAU,mBAEVD,IAAAA,cAACkiD,EAAAA,GAAS,CACNC,aAAa,EACbC,SAAS,EACT5+C,MAAO4kB,EAAKpkB,eAIxBhE,IAAAA,cAAC4Z,EAAAA,EAAI,CACDQ,UAAW5Q,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,kBAC3E1S,GAAG,kBAEHiJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACNzjH,MAAMC,QAAQyoH,IAAgBA,EAAYzrH,KAAI,CAAC8C,EAAQwI,IACpD3O,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZlkG,QAASugH,EAAiB/vB,UAAK,EAAM35F,GACrCzI,IAAKiR,EACLnE,KACIxK,IAAAA,cAACkiD,EAAAA,GAAS,CACNC,aAAa,EACbC,SAAS,EACT5+C,MAAO2C,cApF/BgnF,KA8FO,EAE7B0hC,EAAAxmH,UAAA,CAxLEu4D,aAAY96D,IAAAA,KAAAC,WACZu/C,SAAQx/C,IAAAA,OACRylH,iBAAgBzlH,IAAAA,KAChB21E,aAAY31E,IAAAA,KACZq1E,mBAAkBr1E,IAAAA,QAsLtB,S,oIC9OA,MAAMurH,EAA8B,CAChC1hE,EAAAA,GAAAA,GACAA,EAAAA,GAAAA,IAWEo4D,EAAa5vH,IAAoE,IAAnE,KAACiwB,EAAI,SAAEk9B,EAAQ,UAAErlD,EAAS,WAAE2pH,EAAU,eAAE0H,GAAsBn5H,EAC9E,MAAMo5H,GAAoBtG,EAAAA,EAAAA,IAA4B3lE,GAChDksE,EAA0C,CAC5ChuH,MAAO4kB,EACPq7B,OAAQ4tE,IAGR52C,IAAOryD,GAAMmnG,OAAOgC,EAAkBE,QAAQpF,MAAM,SAAW5xC,IAAOryD,GAAMspG,QAAQH,EAAkBE,QAAQl4F,IAAI,EAAG,OAAO8yF,MAAM,WAClImF,EAAelvE,SAAU,GAGzBm4B,IAAOryD,GAAMsnG,SAAS6B,EAAkBE,QAAQpF,MAAM,UACtDmF,EAAepvE,SAAU,SAClBovE,EAAe/tE,QAGtBg3B,IAAOryD,GAAMspG,QAAQH,EAAkBE,QAAQl4F,IAAI,EAAG,OAAO8yF,MAAM,SAAW5xC,IAAOryD,GAAMsnG,SAAS6B,EAAkBE,QAAQl4F,IAAI,EAAG,WACrIi4F,EAAepvE,QAAU,CAACyN,QAAS,SAGnC4qB,IAAOryD,GAAMspG,QAAQH,EAAkBE,QAAQl4F,IAAI,EAAG,WACtDi4F,EAAexhE,MAAQ,SAGvByqB,IAAOryD,GAAMspG,QAAQH,EAAkBE,QAAQpF,MAAM,WACrDmF,EAAeG,KAAO,WAG1B,MAAM7pG,EAAS8hG,GACX5pH,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,eACfjB,OAAQ,CAAC4f,KAAM,MAChB,KAIX,OACIpoB,IAAAA,cAAA,QAAMC,UAAWA,GACZqxH,GAAkB,IAClBxpG,EACD9nB,IAAAA,cAACkiD,EAAAA,GACOsvE,GAEPF,GAAkB,IAChB,EAEbvJ,EAAA1/G,UAAA,CAvDE+f,KAAItiB,IAAAA,OAAAC,WACJu/C,SAAQx/C,IAAAA,OACR7F,UAAS6F,IAAAA,OACT8jH,WAAU9jH,IAAAA,KACVwrH,eAAcxrH,IAAAA,MAqDlBiiH,EAAW0G,aAAe,CACtB7E,YAAY,EACZ0H,gBAAgB,GAGpB,QAAetxH,IAAAA,KAAW+nH,E,0JCjD1B,MAAMgJ,EAAa54H,IAAqF,IAApF,SAACk8D,EAAQ,gBAAE47D,EAAe,aAAEjB,EAAY,sBAAEG,EAAqB,OAAE5rG,GAAcprB,EAC/F,MAAOy5H,EAAeC,IAAoBt4G,EAAAA,EAAAA,UAAiC,CAAC,IACtE,EAACogB,EAAC,EAAEsnB,EAAC,SAAEgM,EAAQ,QAAEn9C,EAASq9C,MAAM,aAACC,EAAY,YAAEC,KAAgBC,EAAAA,EAAAA,IAAY,CAC7E37C,KAAMq9G,EACNzhE,aAAcA,IAAM4hE,GAAsB,GAC1C3hE,UAAW,eACX2yB,qBAAsBC,EAAAA,GACtB3yB,WAAY,EACRC,EAAAA,EAAAA,IAAO,IACP2yB,EAAAA,EAAAA,IAAK,CAACC,mBAAoB,CAAC,aAAc,YAAa,UAAW,cAAe,cAAeE,QAAS,KACxGD,EAAAA,EAAAA,UAIF,kBAACzyB,EAAiB,iBAAEE,IAAoBE,EAAAA,EAAAA,IAAgB,EAC1DE,EAAAA,EAAAA,IAAWt+C,EAAS,CAChBgiH,SAAS,EACTC,cAAc,OAItB3sE,EAAAA,EAAAA,YAAU,KACNysE,GAAiBG,EAAAA,EAAAA,IAA+BzuG,EAAQquG,GAAe,GACxE,CAACA,EAAeruG,IAEnB,MAAM0uG,GAAWx4G,EAAAA,EAAAA,cAAY,IAErBzZ,IAAAA,cAAA,KAAGC,UAAU,4BAElB,IAEGiyH,GAAYz4G,EAAAA,EAAAA,cAAY,IAEtBzZ,IAAAA,cAAA,KAAGC,UAAU,6BAElB,IAEH,OACID,IAAAA,cAAA,WACIA,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKwS,GACDU,KAEHuG,GAEJ26D,GACGhvH,IAAAA,cAAC+gF,EAAAA,GAAoB,CACjBjxE,QAASA,EACTkxE,OAAO,EACPE,cAAe,GAEflhF,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKyS,EACLjgD,MAAO,CACHy5C,SAAUoG,EACV3F,IAAKrG,QAAAA,EAAK,EACV+N,KAAMr1B,QAAAA,EAAK,EACXtrB,MAAO,OACP5M,OAAQ,MAERusD,KAEJhuD,IAAAA,cAACmyH,EAAAA,GAAS/xH,OAAAC,OAAA,GACF4vH,EAAe,CACnBhwH,UAAU,sBACVsjB,OAAQquG,EAAcruG,GACtB/jB,WAAY,CACR4yH,UAAWF,EACXG,SAAUJ,QAO5B,EAEZlB,EAAA1oH,UAAA,CApFEgsD,SAAQvuD,IAAAA,KAAAC,WAERipH,aAAYlpH,IAAAA,KAAAC,WACZwd,OAAMzd,IAAAA,OAAAC,WACNopH,sBAAqBrpH,IAAAA,KAAAC,YAkFzB,S,0LCvEe,SAASs1E,EAAmBljF,GAiBjC,IAjBkC,SACxCyU,EAAQ,UACRwN,EAAS,OACT9N,EAAM,UACN2nD,EAAS,SACT/L,EAAQ,YACRqyB,EAAW,kBACXgB,EAAiB,SACjB54E,EAAQ,iBACR64E,EAAgB,WAChBF,EAAU,WACVg3C,EAAU,WACVr3C,EAAU,aACVQ,EAAY,UACZx7E,EAAS,UACTsG,EAAS,mBACT40E,GACIhjF,EACJ,MAAMkqD,GAAetL,EAAAA,EAAAA,aAAYoO,EAAAA,IAC3B6lE,GAAcC,EAAAA,EAAAA,IAA4B5oE,GAC1CkwE,GAAqBpH,EAAAA,EAAAA,IAAeH,IAEnCznE,EAAUivE,IAAej5G,EAAAA,EAAAA,UAASghE,GAAeg4C,IAEjDjH,EAAeC,IAAoBhyG,EAAAA,EAAAA,WAAS,IAEnD6rC,EAAAA,EAAAA,YAAU,KACN,SAAS0pB,EAAcj3D,IACf8mD,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASua,UAAYk6C,IACnDzzG,EAAMjO,iBACNiO,EAAM+7C,kBACNhnD,SAAAA,IAER,CAIA,OAFA1K,SAASq7D,iBAAiB,UAAWuR,GAE9B,KACH5sE,SAASu7D,oBAAoB,UAAWqR,EAAc,CACzD,GACF,CAACw8C,EAAe1+G,IAEnB,MAAMg0D,GAAennD,EAAAA,EAAAA,cAAa8pC,IAC9BivE,EAAYjvE,GACZ5gD,SAAAA,EAAW4gD,EAAS,GACrB,CAAC5gD,IAEEk5E,GAAgBpiE,EAAAA,EAAAA,cAAY,KAC9Bw6C,SAAAA,EAAY1Q,EAAS,GACtB,CAACA,EAAU0Q,IAERuoB,GAAsB/iE,EAAAA,EAAAA,cAAY,KAC/B6xG,GACDzvC,GACJ,GACD,CAACA,EAAeyvC,IAEnB,OACItrH,IAAAA,cAACo8E,EAAAA,GAAY,CACTrlF,GAAG,sBACHqjB,UAAWA,EACXxN,SAAUA,EACV8vE,gBAAiBpwE,EACjBmmH,mBAAoBn3C,EACpBC,kBAAmBA,EACnBM,cAAeA,EACf5N,aAAc/lB,EACds0B,oBAAqBA,EACrBv8E,UAAWyyH,IAAW,yBAA0BzyH,GAChDs8E,eAAe,EACfgxC,gBAAgB,EAChB/xC,iBAAkBA,EAClBc,0BAA0B,EAC1B/1E,UAAWA,GAEV+rH,EAEDtyH,IAAAA,cAACsuH,EAAAA,GAAa,CACVlmG,KAAMm7B,EACNqd,aAAcA,EACdtb,SAAUjD,EACVkpE,iBAAkBA,EAClB9vC,aAAcA,EACdN,mBAAoBA,IAGvBF,EAGb,CAACI,EAAAhzE,UAAA,CA3GGuE,SAAQ9G,IAAAA,KACRsU,UAAStU,IAAAA,OAAAC,WACTuG,OAAMxG,IAAAA,KAAAC,WACNu1E,WAAUx1E,IAAAA,KACVnD,SAAQmD,IAAAA,KACRoiD,SAAQpiD,IAAAA,KACRmuD,UAASnuD,IAAAA,KAETy1E,kBAAiBz1E,IAAAA,KACjB01E,iBAAgB11E,IAAAA,KAChBwsH,WAAUxsH,IAAAA,KACVm1E,WAAUn1E,IAAAA,KACV21E,aAAY31E,IAAAA,KACZ7F,UAAS6F,IAAAA,OACTS,UAAST,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,OACTq1E,mBAAkBr1E,IAAAA,O,uFCjBP,SAAS6sH,EAAqC7W,GAAmG,IAA5C8W,EAAmC3sH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,KACtJ,MAAM4sH,UAA8B7yH,IAAAA,cAEhCsC,WAAAA,CAAY5C,G,UACR6C,MAAM7C,G,EAAO,K,GAFP,G,kSAEO,c,wFAEbgD,KAAKpK,MAAQ,CACTw6H,cAAc,EAEtB,CAEA73E,iBAAAA,GACIv4C,KAAKi6G,SAAU,EACfjrG,OAAO22F,uBAAsB,KACzB32F,OAAO22F,uBAAsB,KACrB3lG,KAAKi6G,SACLj6G,KAAKgH,SAAS,CAACopH,cAAc,GACjC,GACF,GAEV,CAEA9yD,oBAAAA,GACIt9D,KAAKi6G,SAAU,CACnB,CAEAh3G,MAAAA,GACI,OAAOjD,KAAKpK,MAAMw6H,aAAe9yH,IAAAA,cAAC87G,EAAqBp5G,KAAKhD,OAAWkzH,CAC3E,EAGJ,OAAOG,IAAaF,EAAuB/W,EAC/C,C,ynBCZe,MAAMjtC,UAAwB7uE,IAAAA,cAGzCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,qBAQFjM,UACX,MAAM,QACFwM,EAAO,KACPsQ,GACA3Q,KAAKhD,MAET,IAAIszH,EAAkB,GAEtB,MAAMt+G,QAAe3R,EAAQkwH,oBAAoB5/G,GAE3C6/G,GAAkBC,EAAAA,EAAAA,WAA4BzwH,KAAKhD,MAAMyS,SAASwQ,SAAU,CAC9EF,KA7CsB,0CAgDpB2wG,GAAqBD,EAAAA,EAAAA,WAA4BzwH,KAAKhD,MAAMyS,SAASwQ,SAAU,CACjFF,KAhDyB,6CAyD7B,GANIywG,EACAF,EAAkBE,EAAgBj7H,OAAOo7H,OAClCD,IACPJ,EAAkBI,EAAmBn7H,OAAOo7H,QAG5CL,IAAoB3/G,EAAKtc,GAAI,CAC7B,MAAMu8H,EAAa5wH,KAAKhD,MAAMyS,SAASwQ,SAAS6hB,MAAM,KAAK1yB,MAAM,GAAI,GAAG63C,KAAK,MAC7E53C,EAAAA,EAAAA,KAAak1B,QAAQqsF,EACzB,CAEI5+G,EAAO/d,MACP+L,KAAKiK,QACT,IACHnK,EAAA,sBAEe,KAAM,IAAA+wH,EAAAC,EACA,QAAlBD,EAAA7wH,KAAK+wH,qBAAa,IAAAF,GAAS,QAATC,EAAlBD,EAAoB9gH,eAAO,IAAA+gH,GAA3BA,EAA6B9xG,OAAO,IACvClf,EAAA,eAEQ,KAGL,GAFAE,KAAKgH,SAAS,CAACmC,MAAM,KAEhB+jB,EAAAA,KAAsB,CACvB,IAAI9lB,EAEAA,EADApH,KAAKhD,MAAM0hE,MACDl/D,SAAS2tE,eAAe,iBAExB3tE,SAAS2tE,eAAe,gBAElC/lE,GACAA,EAAQ4X,OAEhB,KACHlf,EAAA,iBAEU,IACAE,KAAKhD,MAAM2T,KAAKI,QACnBzT,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,2BAGnBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,0BAG1BjH,EAAA,kBAEW,IACDE,KAAKhD,MAAM2T,KAAKI,QACnBzT,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,gDACf8/D,QAAQ,MAGZvpE,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,gDACf8/D,QAAQ,QAtFhB7mE,KAAK+wH,cAAgBzzH,IAAAA,YAErB0C,KAAKpK,MAAQ,CACTuT,MAAM,EAEd,CAsFAlG,MAAAA,GACI,IAAI+tH,EAAkC,GAClCC,EAAiC,GAmBrC,OAjBIjxH,KAAKhD,MAAMk0H,aAAe,GAAiC,KAA5BlxH,KAAKhD,MAAM2T,KAAKI,UAC/CigH,EACI1zH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,0FACfjB,OAAQ,CACJwM,MAAOtS,KAAKhD,MAAMk0H,cAEtBrqD,QAAQ,OAKhB7mE,KAAKhD,MAAM2T,KAAK4/F,YAChB0gB,EAAgB3zH,IAAAA,cAAC6zH,EAA8B,CAACxgH,KAAM3Q,KAAKhD,MAAM2T,QAIjErT,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,cAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjButG,UAAW12G,KAAKoxH,cAChBnnH,OAAQjK,KAAKiK,OACbC,SAAUlK,KAAKhD,MAAMkN,SACrB7V,GAAG,kBACH+V,KAAK,OACL,kBAAgB,wBAEhB9M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,wBAEF2L,KAAKqxH,aAGd/zH,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACN/K,KAAKsxH,YACLN,EACAC,GAEL3zH,IAAAA,cAACyM,EAAAA,MAAMsB,OAAM,KACT/N,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,mBACVqP,QAAS5M,KAAKiK,QAEd3M,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,YAGvBzJ,IAAAA,cAAA,UACI46C,IAAKl4C,KAAK+wH,cACVv4H,KAAK,SACLkM,WAAW,EACXnH,UAAU,iBACVqP,QAAS5M,KAAKo6C,aACd/lD,GAAG,yBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kBACH0S,eAAe,aAMvC,EACHjH,EAzKoBqsE,EAAe,aAlBhCjvE,YAAWkG,IAAAA,OACXs2C,SAAQt2C,IAAAA,OAER8tH,aAAY9tH,IAAAA,OAAAC,WACZq7D,MAAKt7D,IAAAA,KAAAC,WACL6G,SAAQ9G,IAAAA,KAAAC,WACRhD,QAAO+C,IAAAA,MAAA,CACHmtH,oBAAmBntH,IAAAA,KAAAC,aAAAA,WAEvBoM,SAAQrM,IAAAA,MAAA,CACJ6c,SAAQ7c,IAAAA,OAAAC,aAAAA,aAmLhB,MAAM8tH,EAAiC17H,IAA0B,IAAzB,KAACkb,GAAmBlb,EACxD,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElBhP,EAAO6I,EAAKI,QACdjK,EAAc,CACVzS,GAAI,qDACJ0S,eAAgB,kJAGpBD,EAAc,CACVzS,GAAI,kDACJ0S,eAAgB,kJAIxB,OACIzJ,IAAAA,cAACi0H,EAAAA,EAAa,CACV/4H,KAAK,UACLgT,MAAO1E,EAAc,CACjBzS,GAAI,2CACJ0S,eAAgB,mBAEpBe,KAAMA,GACR,ECpLV,GAAe0pH,EAAAA,EAAAA,aAAWpsH,EAAAA,EAAAA,UApB1B,WACI,MAAMqsH,GAAgBC,EAAAA,EAAAA,MAEtB,MAAO,CAAC97H,EAAoB2hC,KACxB,MAAM5mB,EAAO4mB,EAAS5mB,KAEtB,MAAO,CACHugH,aAAcO,EAAc77H,EAAO+a,GACtC,CAET,IAEA,SAA4Bhd,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBirH,oBAAmBA,EAAAA,IACpB58H,GAEX,GAE0ByR,CAAgE+mE,G,4KCpC1F,MAAMwlD,EAA6D,CAC/DpkE,IAAK,UACLtM,mBAAmB,EACnBrB,SAAS,EACTgyE,MAAO,CAAC,MAAO,SAAU,OAAQ,MAAO,OAAQ,QAAS,SAGhD5wE,EAA6B,CACtCiM,EAAAA,GAAAA,GACAA,EAAAA,GAAAA,GACAA,EAAAA,GAAAA,IAGS/L,EAAuEA,CAAC2wE,EAACp8H,KAAA,IAAE,KAACoqD,EAAI,OAAEC,GAAOrqD,EAAA,MAAM,CAACoqD,OAAMC,SAAO,EAiG1H,EArFA,SAAoB5kD,GAQV,IARW,KACjBwgE,EAAI,QACJr7D,EAAO,MACPwhH,EAAK,UACL/lG,EAAS,OACTg2G,EAAM,MACNtmH,EAAK,MACLxX,GACIkH,EACJ,MAAM62H,GAAsB96G,EAAAA,EAAAA,UAAQ,IAAM,IAAIiE,KAAKY,IAAY,CAACA,IAEhE,OACIxe,IAAAA,cAAA,UAAQC,UAAU,eACdD,IAAAA,cAAA,OAAKC,UAAU,qBAAqBiO,GACpClO,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,OAAKC,UAAWy0H,IAAG,uBAAwB,CAAC7oH,KAAM04G,KAC7CxhH,GAEL/C,IAAAA,cAAA,OAAKC,UAAWy0H,IAAG,oBAAqB,CAACv0B,KAAMokB,KAC1CiQ,GACGx0H,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mBACH0S,eAAe,iCAIvBzJ,IAAAA,cAAC20H,EAAAA,SAAQ,CAAC7zH,KAAM,OAI5Bd,IAAAA,cAAA,OAAKC,UAAU,0BAEPsM,QAAQiS,IAAuB,UAAT4/C,GAClBp+D,IAAAA,cAACkiD,EAAAA,GAAS9hD,OAAAC,OAAA,CACNmD,MAAO,IAAIoa,KAAKY,IACZ61G,IAMZ9nH,QAAQiS,IAAuB,kBAAT4/C,GAClBp+D,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,2EACfjB,OAAQ,CACJosH,kBACI50H,IAAAA,cAACkiD,EAAAA,GAAS,CACN1+C,MAAOgb,EACPilC,OAAQC,EACRC,mBAAmB,EACnBrB,QAASsB,IAGjBixE,mBAAmBC,EAAAA,EAAAA,IAAQL,OAOrC,UAATr2D,IAAqB1nE,GAClBsJ,IAAAA,cAAC+0H,EAAAA,EAAG,CACA1tC,QAAS,SACT2tC,WAAW,EACXxqH,KAAM,UAGb9T,GACGsJ,IAAAA,cAAC+0H,EAAAA,EAAG,CACAvqH,KAAM9T,EACN2wF,QAAS,SACT2tC,WAAW,EACXj1H,KAAM,oBAOlC,C,oxCC5FA,MAAMk1H,EAAa,CACfhuE,MAAQzlD,GAAuB1K,EAAAA,EAAA,GACxB0K,GAAQ,IACX6tD,MAAO,gCAEXwxB,QAAUr/E,GAAuB1K,EAAAA,EAAA,GAC1B0K,GAAQ,IACX0zH,OAAQ,OACRC,UAAW,OACX30C,QAAS,QACT40C,OAAQ,YAEZC,mBAAqB7zH,GAAuB1K,EAAAA,EAAA,GACrC0K,GAAQ,IACXmoG,QAAS,SAEbp1C,KAAO/yD,GAAuB1K,EAAAA,EAAA,GACvB0K,GAAQ,IACXC,OAAQ,MAEZF,WAAaC,GAAuB1K,EAAAA,EAAA,GAC7B0K,GAAQ,IACXC,OAAQ,OAIV6zH,EAAuB51H,GAErBM,IAAAA,cAAA,OAAKC,UAAU,sCACXD,IAAAA,cAACR,EAAAA,EAAW81H,oBAAwB51H,EAChCM,IAAAA,cAAA,KAAGC,UAAU,6BAMvBs1H,EAAW71H,GAETM,IAAAA,cAAA,OAAKC,UAAU,mCACXD,IAAAA,cAACR,EAAAA,EAAW+1H,QAAY71H,IAK9BH,EAAUG,GAERM,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,wBAAyB,CAC3CjxC,SAAUxG,EAAM86C,WAChB+tD,QAAS7oG,EAAM81H,aAGnBx1H,IAAAA,cAACR,EAAAA,EAAWD,OAAWG,IAkGnC,EA7F4CA,IACxC,MAAM,MAAC8D,EAAK,YAAEa,EAAW,UAAEpE,EAAS,MAAEw1H,EAAK,KAAEt1H,EAAI,WAAEu1H,EAAU,OAAEC,EAAM,SAAEhzH,EAAQ,OAAEP,EAAM,QAAErE,EAAO,MAAErH,EAAK,OAAEk/H,EAAM,SAAEC,GAA2Bn2H,EAAd25E,E,qWAAUx5B,CAAIngD,EAAKogD,IAE1IyoD,EAASutB,IAAcv8G,EAAAA,EAAAA,WAAS,IAYjC,cAAC/P,IAAiBgQ,EAAAA,EAAAA,YACjBu8G,EAAkBC,IAAuBz8G,EAAAA,EAAAA,UAAiC,MAC3E08G,GAAWpqE,EAAAA,EAAAA,UAEXqqE,GAAcz8G,EAAAA,EAAAA,cAAY,CAACjW,EAAUuW,KACvCk8G,EAASxjH,QAAUjP,EACnBb,EAASa,EAAOuW,EAAO,GACxB,CAACpX,IAEEwzH,GAAgB18G,EAAAA,EAAAA,cAAY,KAC9B,IAAKo8G,GAAkC,OAArBI,EAASxjH,SAAoBwjH,EAASxjH,QAEpD,YADAujH,EAAoB,MAIxB,MAAMI,EAAqB5sH,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,2BACvFusH,EAAoB,CAAC96H,KAAM6rH,EAAAA,GAAW11G,MAAO7N,MAAO4yH,GAAoB,GACzE,CAACP,EAAUrsH,IAER6sH,GAAc58G,EAAAA,EAAAA,cAAa5B,IAC7Bi+G,GAAW,GACXK,IAEI98C,EAAWrC,QACXqC,EAAWrC,OAAOn/D,EACtB,GACD,CAACwhE,EAAWrC,OAAQm/C,IAEjBG,EAAa/pH,QAAQg8F,GAAW/kG,GAChC+yH,EAAU7/H,GAAoC,WAA3Bq/H,aAAgB,EAAhBA,EAAkB76H,MAE3C,OACI8E,IAAAA,cAAA,OACIC,UAAU,gCACV,cAAa21H,GAAU,IAEvB51H,IAAAA,cAAA,YACIC,UAAWk3C,IAAW,iBAAkBl3C,EAAW,CAC/Cu2H,uBAAwBD,EACxBE,wBAAyBH,KAG7Bt2H,IAAAA,cAAA,UAAQC,UAAWk3C,IAAW,eAAgB,CAACu/E,qBAAsBJ,KAChEA,EAAcX,GAAUtxH,EAAe,MAE5CrE,IAAAA,cAAA,OACIC,UAAU,gBACVg3E,QAzDMp/D,IAClB,MAAM,QAACo/D,GAAWv3E,EAElBo2H,GAAW,GAEP7+C,GACAA,EAAQp/D,EACZ,EAmDYm/D,OAAQq/C,GAEPX,GAAc11H,IAAAA,cAAA,YAAO01H,GACtB11H,IAAAA,cAACoF,EAAAA,GAAWhF,OAAAC,OAAA,CACRtJ,GAAE,iBAAA4J,OAAmBR,GACrBpC,QAASA,EACTsG,YAAakkG,EAAU,GAAKlkG,EAC5B7E,WAAY,CACR81H,sBACA/1H,SACAg2H,WAEJt1H,UAAWk3C,IAAW,QAASl3C,EAAW,CAAC02H,aAAcL,IACzDt0H,gBAAiB,WACjBwB,MAAOA,EACPb,SAAUuzH,EACV9zH,OAAMtL,EAAAA,EAAA,GAAMm+H,GAAe7yH,IACvBi3E,KAGXo8C,GAELz1H,IAAAA,cAAC42H,EAAAA,EAAU,CACPx3H,QAAS1I,EACTmgI,OAAQd,IAEV,C,yGChKP,SAASe,EAAuChxD,GACnD,MAAO,CACH5qE,KAAMc,EAAAA,GAAY+6H,8CAClBjxD,cAER,CCXO,SAASkxD,EAAoC1+H,GAChD,OAAOA,EAAM8kD,MAAMyqB,QAAQovD,yCAC/B,C,kiBCOA,MAAMpgE,EAAWpxC,EAAAA,GAAUoxC,SAErBqgE,EAAkB,KAyBjB,MAAMnwC,UAA+B/mF,IAAAA,cAGxCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,2BAUarD,KACtBw/D,EAAAA,EAAAA,GAAax/D,EAAqC03D,EAASua,SAC3D1uE,KAAKy0H,WACT,IACH30H,EAAA,uBAEyB40H,IACtB10H,KAAKhD,MAAMqD,QAAQgjE,eAAeqxD,EAAS,IAC9C50H,EAAA,qBAEuBrD,IACIA,EAAEq7D,OAAOh3D,MAAM4F,OAAS8tH,EAE5Cx0H,KAAKgH,SAAS,CACV4C,OAAQnN,EAAEq7D,OAAOh3D,MACjB+mD,YAAa,CACTvzD,gBAAiB,0CACjBoI,QAAS,2BAIjBsD,KAAKgH,SAAS,CACV4C,OAAQnN,EAAEq7D,OAAOh3D,MACjB+mD,YAAa,MAErB,IACH/nD,EAAA,mBAEmBjM,UAA2B,IAAA8gI,EAAAC,EAC3C,MAAMhrH,EAAkC,QAA5B+qH,EAAoB,QAApBC,EAAG50H,KAAKpK,MAAMgU,cAAM,IAAAgrH,OAAA,EAAjBA,EAAmB/nG,cAAM,IAAA8nG,EAAAA,EAAI,GAC5C,GAAI/qH,IAAW5J,KAAKhD,MAAMkE,QAAQ0I,OAC9B5J,KAAKy0H,gBACF,CACHz0H,KAAKgH,SAAS,CAACyvC,QAAQ,IACvB,MAAM,QAACv1C,EAAO,QAAEb,GAAWL,KAAKhD,OAC1B,MAAChJ,SAAeqM,EAAQw0H,aAAa3zH,EAAQ7M,GAAK,CAACuV,WACrD5V,EACAgM,KAAKgH,SAAS,CAAC6gD,YAAa7zD,EAAOyiD,QAAQ,IAE3Cz2C,KAAKy0H,WAEb,KACH30H,EAAA,kBAEmB,KAChBE,KAAKgH,SAAS,CACVmC,MAAM,GACR,IACLrJ,EAAA,qBAEsB,KACfE,KAAK80H,4BAA4B/kH,SACjC/P,KAAK80H,4BAA4B/kH,QAAQiP,OAC7C,IACHlf,EAAA,oBAEqB,KACdE,KAAK80H,4BAA4B/kH,SACjC/P,KAAK80H,4BAA4B/kH,QAAQ81D,MAC7C,IACH/lE,EAAA,uBAEwB,KACrBE,KAAKqmE,cAAc,IACtBvmE,EAAA,sBAEwBrD,IACrB,MAAM,SAAC+vE,GAAYxsE,KAAKhD,OAGpB+3H,EAAAA,EAAAA,IAA6Bt4H,GAC7BuD,KAAKgH,SAAS,CAAC4C,QAAQorH,EAAAA,EAAAA,IAA4Bv4H,EAAEgyE,eAC9CjC,IAAYvQ,EAAAA,EAAAA,GAAax/D,EAAG03D,EAAS+Z,SAAwB,IAAdzxE,EAAEqxE,SACxD9tE,KAAKi1H,eAAex4H,EACxB,IACHqD,EAAA,uBAEyBrD,IACtB,MAAM,SAAC+vE,GAAYxsE,KAAKhD,QACnBqnD,EAAAA,EAAAA,QAAgBmoB,GAAY/vE,EAAEqxE,UAAatB,OACxCvQ,EAAAA,EAAAA,GAAax/D,EAAG03D,EAAS+Z,QAAWzxE,EAAEu/D,UAAav/D,EAAE2xE,SACrD3xE,EAAEyK,iBACFlH,KAAKk1H,cACLl1H,KAAKm1H,cAEb,IACHr1H,EAAA,wBAE0B6nD,IACvB3nD,KAAKgH,SAAS,CAAC2gD,aAAW,IAC7B7nD,EAAA,oBAEqB,KAClB,MAAM,YAAC+nD,GAAe7nD,KAAKpK,MAC3B,IAAKiyD,EACD,OAAO,KAGX,IAAIn+C,EAeJ,OAbIA,EADgC,4CAAhCm+C,EAAYvzD,gBAERgJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,yGACfjB,OAAQ,CACJxB,UAAWkwH,KAKZ3sE,EAAYnrD,QAIvBY,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,WACAA,IAAAA,cAAA,SAAOC,UAAU,iBACZmM,GAEH,IA/HV1J,KAAKpK,MAAQ,CACTgU,OAAQ5M,EAAMkE,QAAQ0I,OACtB6sC,QAAQ,EACRttC,MAAM,GAEVnJ,KAAK80H,4BAA8Bx3H,IAAAA,WACvC,CA6HO2F,MAAAA,GACH,IAAImyH,EAAc,KAoBlB,OAlBIA,EADAp1H,KAAKhD,MAAMkE,QAAQ1I,OAASuqB,EAAAA,GAAU0K,WAElCnwB,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,gBAKnBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,4BACfjB,OAAQ,CACJ5E,QAASlB,KAAKhD,MAAMkE,QAAQ/D,gBAOxCG,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,cAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBksH,UAAU,EACVphD,UAAWj0E,KAAKs1H,mBAChBrrH,OAAQjK,KAAKy0H,UACbhe,WAAYz2G,KAAKu1H,eACjBrrH,SAAUlK,KAAKhD,MAAMkN,SACrBE,KAAK,OACL,kBAAgB,+BAEhB9M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,+BAEF+gI,IAGT93H,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,CAACyqH,QAAQ,8BAChBl4H,IAAAA,cAAA,WACIA,IAAAA,cAAA,SACIm4H,QAAQ,eACRl4H,UAAU,kBAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,qEAGvBzJ,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAACu2E,EAAAA,GAAO,CACJ/yE,MAAOd,KAAKpK,MAAMgU,OAClB3J,SAAUD,KAAKk+D,aACf8V,WAAYh0E,KAAKi1H,eACjBhhD,UAAWj0E,KAAKosE,cAChBspD,kBAAkB,EAClBC,uBAAuB,SACvBtjD,cAAeryE,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,6BAC3G4pE,gBAAiB3wE,KAAK2wE,gBACtBjhE,UAAW1P,KAAKhD,MAAMkE,QAAQ7M,GAC9BA,GAAG,eACH6jD,IAAKl4C,KAAK80H,4BACVrgD,eAAgB+/C,EAChB9/C,QAAS10E,KAAKhD,MAAMqsE,kBACpB71C,oBAAoB,KAG5Bl2B,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAACs4H,EAAAA,GAAY,CACTxyD,YAAapjE,KAAKhD,MAAMqsE,kBACxBwsD,cAAe71H,KAAKqjE,eACpByyD,UAAS91H,KAAKpK,MAAMgU,QAAS5J,KAAKpK,MAAMgU,OAAOlD,OAAS,EACxDqvH,4BAA2B/1H,KAAKpK,MAAMgU,QAAS5J,KAAKpK,MAAMgU,OAAOlD,OAAS8tH,EAC1EwB,mBACI14H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAe,YAK9B/G,KAAKi2H,gBAGd34H,IAAAA,cAACyM,EAAAA,MAAMsB,OAAM,KACT/N,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,iCACVqP,QAAS5M,KAAKy0H,WAEdn3H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,YAGvBzJ,IAAAA,cAAA,UACIqH,SAAU3E,KAAKpK,MAAM6gD,OACrBj+C,KAAK,SACL+E,UAAU,8BACVqP,QAAS5M,KAAKm1H,YAEd73H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,WAMvC,EACHjH,EA1PYukF,EAAsB,aAlB/Bn6E,SAAQ9G,IAAAA,KAAAC,aA8QZ,SAAeyJ,EAAAA,EAAAA,YAAWu3E,GC1R1B,SAAS6xC,EAAgBtgI,GACrB,MAAO,CACHyzE,kBAAmBirD,EAAoC1+H,GACvD42E,UAAUvvD,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAYuvD,2BAA4B,sBAEzE,CAEA,SAASvlB,EAAmBvzD,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBuvH,aAAY,KACZxxD,eAAgB+wD,GACjBzgI,GAEX,EAEkByR,EAAAA,EAAAA,SAAQ8wH,EAAiBhvE,GAA3C,MAIA,GAAe9hD,EAAAA,EAAAA,SAAQ8wH,EAAiBhvE,EAAxC,CAA4Dm9B,E,0kBCErD,MAAMG,UAAgClnF,IAAAA,cAGzCsC,WAAAA,CAAY5C,GAAc,IAAAm5H,EACtBt2H,MAAM7C,GAAO8C,EAAA,uBAYA,KACTE,KAAK5C,QAAQ2S,SACb7R,EAAAA,GAAsB8B,KAAK5C,QAAQ2S,QACvC,IACHjQ,EAAA,eAEQ,KACLE,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAC/BrJ,EAAA,sBAEgBrD,IACb,MAAM,SAAC+vE,GAAYxsE,KAAKhD,MAGpBkB,EAAAA,GAAmCzB,IACnCA,EAAEyK,iBACFlH,KAAKgH,SAAS,CAAC5J,QAASc,EAAAA,GAAkCzB,EAAEgyE,gBACrDjC,GAAYyB,EAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAAS+Z,QAAUzxE,EAAEqxE,SAC3ErxE,EAAEyK,iBACFlH,KAAKm1H,cACG3oD,IAAYyB,EAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAAS+Z,QAAWzxE,EAAEu/D,UAAav/D,EAAE2xE,SAC5F3xE,EAAEyK,iBACFlH,KAAKm1H,aACT,IACHr1H,EAAA,mBAEYjM,UACT,MAAM,QAACqN,EAASb,SAAS,aAACw0H,IAAiB70H,KAAKhD,OAC1C,QAACI,GAAW4C,KAAKpK,MACvB,IAAKsL,EACD,OAGJlB,KAAKgH,SAAS,CAACovH,gBAAgB,IAE/B,MAAM,KAACniI,EAAI,MAAED,SAAe6gI,EAAa3zH,EAAQ7M,GAAI,CAAC+I,YAEtD4C,KAAKgH,SAAS,CACV6gD,YAAa7zD,EACboiI,gBAAgB,IAGhBniI,GACA+L,KAAKiK,QACT,IACHnK,EAAA,qBAEerD,IACZA,EAAEyK,iBACFlH,KAAKgH,SAAS,CAAC5J,QAASX,EAAEq7D,OAAOh3D,OAAO,IA5DxCd,KAAK5C,QAAUE,IAAAA,YAEf0C,KAAKpK,MAAQ,CACTwH,SAAsB,QAAb+4H,EAAAn5H,EAAMkE,eAAO,IAAAi1H,OAAA,EAAbA,EAAe/4H,UAAW,GACnCyqD,YAAa,KACb1+C,MAAM,EACNF,WAAW,EACXmtH,gBAAgB,EAExB,CAsDAnzH,MAAAA,GAAS,IAAAozH,EAAAC,EACL,IAAIzuE,EAAc,KAClB,MAAM,cAAC/gD,GAAiB9G,KAAKhD,MAAM6J,KAE/B7G,KAAKpK,MAAMiyD,cACXA,EACIvqD,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,WACAA,IAAAA,cAAA,SAAOC,UAAU,iBAAiByC,KAAKpK,MAAMiyD,YAAYnrD,WAKrE,IAAI8O,EACAlO,IAAAA,cAAA,YACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,kBAIL,QAAtBsvH,EAAIr2H,KAAKhD,MAAMkE,eAAO,IAAAm1H,GAAlBA,EAAoBl5H,eACpBqO,EACIlO,IAAAA,cAAA,YACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,sBAEnBzJ,IAAAA,cAAA,QAAMC,UAAU,QAAQyC,KAAKhD,MAAMkE,QAAQ/D,gBAKvD,IAAIo5H,EACAj5H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,mJAGU,OAAX,QAAlBuvH,EAAAt2H,KAAKhD,MAAMkE,eAAO,IAAAo1H,OAAA,EAAlBA,EAAoB99H,QACpB+9H,EACIj5H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAe,4EAK3B,MAAMyvH,EAAoB1vH,EAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,iBAAiBxG,cACnH,OACIjD,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,cAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiK,OACbwsG,WAAYz2G,KAAKu1H,eACjBrrH,SAAUlK,KAAKhD,MAAMkN,SACrBE,KAAK,OACL,kBAAgB,gCAEhB9M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,gCAEFmX,IAGTlO,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,SACKi5H,GAELj5H,IAAAA,cAAA,YACI46C,IAAKl4C,KAAK5C,QACVG,UAAU,yBACVsrG,KAAM,EACNvkG,UAjKC,IAkKDxD,MAAOd,KAAKpK,MAAMwH,QAClB62E,UAAWj0E,KAAKosE,cAChBnsE,SAAUD,KAAKk+D,aACf,aAAYs4D,IAEf3uE,GAELvqD,IAAAA,cAACyM,EAAAA,MAAMsB,OAAM,KACT/N,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,iCACVqP,QAAS5M,KAAKiK,QAEd3M,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,YAGvBzJ,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,kBACVoH,SAAU3E,KAAKpK,MAAMwgI,eACrBxpH,QAAS5M,KAAKm1H,YAEd73H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,WAMvC,EAGJ,SAAe+F,EAAAA,EAAAA,YAAW03E,GC9L1B,GAAep/E,EAAAA,EAAAA,UAdf,SAAyBxP,GACrB,MAAO,CACH42E,UAAUvvD,EAAAA,EAAAA,IAAQrnB,EAAOmtB,EAAAA,GAAAA,YAAsB0pD,2BAA4B,sBAEnF,IAEA,SAA4B94E,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBuvH,aAAYA,EAAAA,IACblhI,GAEX,GAEA,CAA4D6wF,E,klCCX5D,MAAM00B,EAAczjH,IAA4D,IAA3D,UAAC0jH,EAAS,WAAE/G,EAAU,KAAEh0G,EAAI,QAAEwO,GAAwBnX,EACvE,MAAM02B,GAAWkoB,EAAAA,EAAAA,cAAaz+C,IAAuB6gI,EAAAA,EAAAA,IAAY7gI,KAEjE,IAAKujH,EACD,OAAO,KAGX,MAAMud,EAAevqG,EAAS00C,IAAIs4C,GAClC,IAAKud,EACD,OAAO,KAEX,MAAMC,GAAgBC,EAAAA,EAAAA,IAAiBF,GAEvC,OACIp5H,IAAAA,cAAA,QACIsP,QAASA,EACTrP,UAAU,WACV,iBAAAU,OAAgBk7G,EAAS,KACzB,gBAAeA,EACfzuG,MAAKtW,EAAA,CACDyiI,gBAAiB,OAAF54H,OAAS04H,EAAa,KACrCG,eAAgB,UAChBlrH,OAAQxN,EACRuN,MAAOvN,EACPyyE,UAAWzyE,EACXizE,SAAUjzE,EACV24H,UAAW34H,EACX44H,SAAU54H,EACV2oG,SAAU,UACPqL,IAET,EAER8G,EAAAvzG,UAAA,CAvCEwzG,UAAS/1G,IAAAA,OAAAC,WACTjF,KAAIgF,IAAAA,OAEJwJ,QAAOxJ,IAAAA,MAsCX81G,EAAY6S,aAAe,CACvBpqF,MAAO,GACPywE,WAAY,CAAC,EACbh0G,KAAM,IAGV,QAAed,IAAAA,KAAW47G,E,6VCxC1B,SAAS+d,EAAmBxhI,GAAiE,IAAhE,SAACi4B,EAAQ,iBAAEwpG,EAAgB,SAAE1zH,EAAQ,OAAEmjF,EAAM,QAAE/5E,GAAenX,EACvF,MAAMoR,GAAOiQ,EAAAA,EAAAA,WAYPvZ,EAAYk3C,IAAW,yBAA0B,CACnD,mCAAoCjxC,EACpC2zH,SAAUxwC,IAGd,OACIrpF,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAACgK,EAAAA,iBAAqBomB,EAASxuB,QAGnC5B,IAAAA,cAAA,KACIC,UAAWA,EACXk2C,KAAK,IACL7mC,QAxBSuI,IAGjB,GAFAA,EAAMjO,iBAEFy/E,EAAQ,KAAAywC,EAAAC,EACR,MAAMC,EAAsC,QAA1BF,EAAG1pG,SAAkB,QAAV2pG,EAAR3pG,EAAU6pG,gBAAQ,IAAAF,OAAV,EAARA,EAAqB,UAAE,IAAAD,EAAAA,EAAI,GAEhDxqH,EAAQsqH,EAAkBxpG,EAASjwB,KAAM65H,EAC7C,GAkBQ,aAAYzwH,EAAKC,cAAc4mB,EAASxuB,QAExC5B,IAAAA,cAAA,KAAGC,UAAWmwB,EAAS8pG,iBAIvC,CAACP,EAAAtxH,UAAA,CAvCGnC,SAAQJ,IAAAA,KAAAC,WACRsjF,OAAMvjF,IAAAA,KAAAC,WACNuJ,QAAOxJ,IAAAA,KAAAC,YAuCX,SAAewpD,EAAAA,EAAAA,MAAKoqE,GCGb,IAAKQ,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,iBAAnBA,EAAmB,yBAAnBA,EAAmB,uBAAnBA,EAAmB,+BAAnBA,CAAmB,M,0jCChDxB,MAAMC,EAAS,SACTC,EAAiB,gBAIxBC,EAAkB,CACpBC,OAAQ,CACJp6H,KAAM,SACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,sBACJ0S,eAAgB,WAEpBywH,cAAe,sBAEnBM,cAAe,CACXr6H,KAAM,gBACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,6BACJ0S,eAAgB,mBAEpBywH,cAAe,IAEnB,kBAAmB,CACf/5H,KAAM,kBACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,+BACJ0S,eAAgB,sBAEpBywH,cAAe,+BAEnB,cAAe,CACX/5H,KAAM,cACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,2BACJ0S,eAAgB,kBAEpBywH,cAAe,wBAEnB,iBAAkB,CACd/5H,KAAM,iBACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,8BACJ0S,eAAgB,qBAEpBywH,cAAe,qBAEnB,aAAc,CACV/5H,KAAM,aACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,0BACJ0S,eAAgB,iBAEpBywH,cAAe,mBAEnB,gBAAiB,CACb/5H,KAAM,gBACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,6BACJ0S,eAAgB,oBAEpBywH,cAAe,yBAEnBO,WAAY,CACRt6H,KAAM,aACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,0BACJ0S,eAAgB,eAEpBywH,cAAe,mBAEnBQ,QAAS,CACLv6H,KAAM,UACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,uBACJ0S,eAAgB,YAEpBywH,cAAe,0BAEnBS,QAAS,CACLx6H,KAAM,UACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,uBACJ0S,eAAgB,YAEpBywH,cAAe,sBAEnBU,MAAO,CACHz6H,KAAM,QACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,qBACJ0S,eAAgB,UAEpBywH,cAAe,qBAEnBrD,OAAQ,CACJ12H,KAAM,SACNyB,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,sBACJ0S,eAAgB,WAEpBywH,cAAe,iCAIVW,EAAoD,CAACN,OAAQD,EAAgBC,QAG7EO,EAAyBC,EAAAA,GAClC53H,QAAQitB,KAA4B,WAAbA,GAAsC,kBAAbA,KAChD7d,QAAO,CAACyoH,EAAkBC,IACtBnkI,EAAAA,EAAA,GACOkkI,GAAgB,IACnB,CAACC,GAAkBX,EAAgBW,MAExC,CAAC,GAMKC,EAAsB,oBACtBC,EAAa,Y,u+BCpGnB,SAASC,EAAoBC,GAChC,OAAOA,EAAIngI,OAASggI,CACxB,CAoBA,SAASI,EAAeC,EAAmBC,GAGvC,QAFqBC,EAAAA,EAAAA,IAAcF,GAAcA,EAAWG,QAAUH,EAAWxkI,QAC5D0kI,EAAAA,EAAAA,IAAcD,GAAeA,EAAYE,QAAUF,EAAYzkI,GAExF,CA4GO,SAAS4kI,EAA0BC,EAAwBC,GAC9D,MAAMC,EAAgB17H,OAAO+I,KAAKyyH,GAAYxyF,WAAWhZ,GAAaA,IAAayrG,IAYnF,OAVsCz7H,OAAOoI,OAAOozH,GAAY9pH,MAAM,EAAGgqH,GAE1BvpH,QAAO,CAACwpH,EAAkBd,KAAoB,IAAAe,EAAAC,EACzF,MAAMC,EAA2D,QAApCF,EAAGf,SAAyB,QAAVgB,EAAfhB,EAAiBhB,gBAAQ,IAAAgC,OAAV,EAAfA,EAA2B7yH,cAAM,IAAA4yH,EAAAA,EAAI,EAIrE,OAAOD,EAFoCj4H,KAAKm/G,KAAKiZ,ED/ChC,GCiD0C,CAAC,GACjE,EAGP,CAEO,SAASC,EAAkBxtG,EAAiBmtG,EAAuBD,EAA6BO,GACnG,GAAsB,IAAlBztG,EAAOvlB,OACP,MAAO,CAAC,GAAIgzH,EAAkB,GAGlC,MAAMC,EAAwB,GAC9B,IAAIC,EAAyC,GACzCC,EAAuBH,EAmC3B,OAhCAztG,EAAOjmB,SAAQ,CAAC27B,EAAOm4F,KACnBF,EAAoBtqH,KAAK,CACrB8pH,gBACAD,eACAW,aACAC,SAAShB,EAAAA,EAAAA,IAAcp3F,GAASA,EAAMq3F,QAAUr3F,EAAMttC,GACtD4I,KAAM0kC,KAGLm4F,EAAa,GD1EG,GC0EoB,IACrCH,EAAUrqH,KAAK,CACXrD,MAAO4tH,EACPrhI,KAAMigI,EACN1vH,MAAO6wH,IAGXC,IACAD,EAAsB,GAC1B,IAIAA,EAAoBlzH,SACpBizH,EAAUrqH,KAAK,CACXrD,MAAO4tH,EACPrhI,KAAMigI,EACN1vH,MAAO6wH,IAGXC,KAGG,CAACF,EAAWE,EACvB,CAEO,SAASG,EAAsBC,GAClC,MAAMC,EAA4C,GAgBlD,OAdAD,EAAoBj0H,SAASm0H,IACzB,IAAKzB,EAAoByB,GAAqB,CAC1C,MAAMC,EAAWD,EAAmBluH,MAC9BouH,EAAgCF,EAAmBpxH,MAAMpI,KAAK25H,IAAS,CACzEF,WACAL,QAASO,EAAUP,QACnBZ,aAAcmB,EAAUnB,iBAG5Be,EAAuB5qH,KAAK+qH,EAChC,KAGoBH,EAAuBK,MAEnD,CAEO,SAASC,EACZC,EACAvB,EACAz4H,EACAi6H,GAEA,GAAI1uC,IAAQyuC,IAAczuC,IAAQktC,GAC9B,MAAO,CAAC,GAAI,IAIhB,GAAIz4H,EAAOiG,OAAQ,KAAAi0H,EAAAC,EACf,MAAMC,EAAuC,CACzC5uH,MAAO,EACPzT,KAAMggI,EACNzvH,MAAO,CAAC,CACJqwH,cAAe,EACfD,aAAcxB,EACdmC,YAAa,EACbC,QAAS,GACT98H,UAAM3E,KAIRwiI,EAA+C,QAAjCH,EAAGzB,SAAoB,QAAV0B,EAAV1B,EAAaxB,UAAO,IAAAkD,OAAV,EAAVA,EAAsBrD,gBAAQ,IAAAoD,EAAAA,EAAI,GACnDI,EApNP,SAA2BN,EAAkCh6H,EAAgBu6H,EAA8BN,GAC9G,MAAMO,EAA2Bv9H,OAAOoI,OAAO20H,GAAWh6H,QAAQkhC,IAC9D,MAAMu5F,GAAUnC,EAAAA,EAAAA,IAAcp3F,GAASA,EAAMw5F,YAAc,CAACx5F,EAAMlkC,MAElE,IAAK,IAAIiiC,EAAI,EAAGA,EAAIw7F,EAAQx0H,OAAQg5B,IAChC,GAAIw7F,EAAQx7F,GAAGn/B,cAAckpC,SAAShpC,EAAOF,eACzC,OAAO,EAIf,OAAO,CAAK,IAIV66H,EA3BV,SAAqC7D,EAAoBkD,EAAkCC,GACvF,OAAOnD,EAAS52H,KAAKo5H,IACjB,MAAMp4F,EAAQ84F,EAAUV,GACxB,OAAOhB,EAAAA,EAAAA,IAAcp3F,GAd7B,SAAwB05F,EAA2BC,GAC/C,MAAMC,GAAmBC,EAAAA,EAAAA,IAAQH,GACjC,GAAIE,GAAoBA,IAAqBD,EAAU,CACnD,MAAMG,GAA2BC,EAAAA,EAAAA,IAAqBL,EAAcC,GACpE,GAAIG,GAA4BA,EAAyBzC,QACrD,OAAOyC,CAEf,CACA,OAAOJ,CACX,CAKsCM,CAAeh6F,EAAO+4F,GAAgB/4F,CAAK,GAEjF,CAsByBi6F,CAA4BZ,EAAoBP,EAAWC,GAE1EmB,EAAuBZ,EAAyBx6H,QAAQkhC,GACnDy5F,EAAax8F,MAAMw8F,GAAiBxC,EAAewC,EAAcz5F,OAGtEm6F,EAAqBD,EAAqB1lE,MAAK,CAAC0iE,EAAYC,KAC9DiD,EAAAA,EAAAA,IAAclD,EAAYC,EAAar4H,KAIrCu7H,EAA6Bf,EAAyBx6H,QAAQkhC,IACxDy5F,EAAax8F,MAAMw8F,GAAiBxC,EAAewC,EAAcz5F,OASvEs6F,EAFiB,IAAIH,KAJcE,EAA2B7lE,MAAK,CAAC0iE,EAAYC,KAClFiD,EAAAA,EAAAA,IAAclD,EAAYC,EAAar4H,MAKOA,QAAQkhC,IAC/Cu6F,EAAAA,EAAAA,IAAiBv6F,EAAO+4F,KAGnC,OAAOuB,CACX,CA4K+BE,CAAkB1B,EAAWh6H,EAAQq6H,EAAgBJ,IACrE0B,GAAoB3C,EAAkBsB,EAAgB,EAAGpD,EAAgB,GAE1E0E,EAA0D,CAACxB,KAAsBuB,GAIvF,MAAO,CAACC,EAFgBrC,EAAsBqC,GAGlD,CAEA,IAAIC,EAAwB,GAExB5C,EAAkB,EAClB6C,EAA6C,GACjD7+H,OAAO+I,KAAKyyH,GAAYlzH,SAAQ,CAACmzH,EAAcC,KAC3C,MAAMntG,EAzLd,SACIwuG,EACA/sG,GACO,IAAA2pG,EACP,MAAME,EAA6B,QAArBF,EAAG3pG,aAAQ,EAARA,EAAU6pG,gBAAQ,IAAAF,EAAAA,EAAI,GAEvC,OAAwB,IAApBE,EAAS7wH,OACF,GAIJ6wH,EAAS52H,KAAKo5H,GAAYU,EAAUV,IAC/C,CA6KuByC,CACX/B,EACAvB,EAAWC,IAGfmD,EAAe,IAAIA,KAAiBrwG,GAGpC,MAAMwwG,EAAiC,CACnCxwH,MAAOytH,EACPlhI,KAAMggI,EACNzvH,MAAO,CAAC,CACJqwH,gBACAD,aAAcA,EACdW,YAAa,EACbC,QAAS,GACT98H,UAAM3E,KAIdikI,EAAuB,IAAIA,EAAsBE,GACjD/C,GAAmB,EAEnB,MAAOC,EAAW+C,GAA4BjD,EAAkBxtG,EAAQmtG,EAAeD,EAA+BO,GAEtHA,EAAkBgD,EAElBH,EAAuB,IAAIA,KAAyB5C,EAAU,IAGlE,MAAMgD,EAAkB3C,EAAsBuC,GAE9C,MAAO,CAACA,EAAsBI,EAClC,CCtSA,SAASC,EAAqBnnI,GAOpB,IAPqB,WAC3ByjI,EAAU,YACV2D,EAAW,OACXhqH,EAAM,QACNjG,EAAO,UACPqnE,EAAS,mBACT6oD,GACIrnI,EACJ,MA6BMsnI,EAAgBr/H,OAAO+I,KAAKyyH,GAE5B8D,EAAiBH,EAAcE,EAAc,GAAKlqH,EAExD,OACIvV,IAAAA,cAAA,OACIjJ,GAAG,wBACHkJ,UAAU,2BACV02E,UArCe9+D,IACnB,OAAQA,EAAMna,KACd,IAAK,aACDma,EAAM+7C,kBACN/7C,EAAMjO,iBACN+sE,EAAUwjD,EAAoBwF,WAC9BH,IACA,MACJ,IAAK,YACD3nH,EAAM+7C,kBACN/7C,EAAMjO,iBACN+sE,EAAUwjD,EAAoByF,eAC9BJ,IACA,MACJ,IAAK,UACD3nH,EAAM+7C,kBACN/7C,EAAMjO,iBACN+sE,EAAUwjD,EAAoB0F,kBAC9BL,IACA,MACJ,IAAK,YACD3nH,EAAM+7C,kBACN/7C,EAAMjO,iBACN+sE,EAAUwjD,EAAoB2F,cAC9BN,IAEJ,GAaKC,EAAcp8H,KAAKw4H,IAChB,MAAMzrG,EAAWwrG,EAAWC,GAE5B,OACI77H,IAAAA,cAAC25H,EAAmB,CAChBj8H,IAAK0yB,EAASjwB,KACdiwB,SAAUA,EACVwpG,iBAAkB+B,EAA0BC,EAAYC,GACxDvsH,QAASA,EACTpJ,SAAUw5H,IAAmBtvG,EAASjwB,KACtCkpF,QAASk2C,GACX,IAOtB,CAEA,SAAehwE,EAAAA,EAAAA,MAAK+vE,G,wCC/EpB,SAASS,GAAsB5nI,GAA+B,IAA9B,aAAC0jI,EAAY,MAAEzuH,GAAajV,EACxD,OACI6H,IAAAA,cAAA,OACIC,UAAU,gCACVmN,MAAOA,GAEPpN,IAAAA,cAAA,OACIC,UAAU,gCACVlJ,GAAE,kBAAA4J,OAAoBk7H,IAEtB77H,IAAAA,cAACgK,EAAAA,iBAAgB,CAACjT,GAAE,gBAAA4J,OAAkBk7H,MAItD,CAEA,UAAetsE,EAAAA,EAAAA,MAAKwwE,I,wCCLpB,SAASC,GAAe7nI,GAA6D,IAA5D,MAACksC,EAAK,SAAEy4F,EAAQ,WAAEtiF,EAAU,QAAElrC,EAAO,YAAE2wH,GAAmB9nI,EAC/E,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAclB0mH,GAAqBzmH,EAAAA,EAAAA,aACvB0mH,KAboBC,KACpB,IAAK5lF,EAAY,CACb,IAAIiiF,EAAU,GAEVA,GADAhB,EAAAA,EAAAA,IAAcp3F,GACJA,EAAMq3F,QAENr3F,EAAMttC,GAEpBkpI,EAAY,CAACnD,WAAUL,UAASp4F,SACpC,IJiGmC,II7FoB,CACnDg8F,SAAS,EACTC,UAAU,IACV,IAMFC,EAAgBppF,IAAW,qBAAsB,CACnDjxC,SAAUs0C,IAGd,IAAI4hD,EAEJ,IAAIq/B,EAAAA,EAAAA,IAAcp3F,GAAQ,CACtB,MAAMw3E,EAAYx3E,EAAMqpF,WAAarpF,EAAMqpF,WAAarpF,EAAMlkC,KACxDqgI,EAAen8F,EAAMq3F,QAAUr3F,EAAMq3F,QAAQz4H,cAAgBohC,EAAMlkC,KAAK8C,cAE9Em5F,EACIp8F,IAAAA,cAAA,OACIoO,IAAK,cACL,cAAai2B,EAAMw5F,YACnBtvH,IAAKkyH,GACLxgI,UAAS,8BAAAU,OAAgC0jC,EAAMjU,SAAQ,WAAAzvB,OAAU6/H,GACjEzpI,GAAE,SAAA4J,OAAW6/H,GACb,aAAYh3H,EACR,CACIzS,GAAI,qCACJ0S,eAAgB,qBAEpB,CACIoyG,UAAYA,EAAW50E,QAAQ,KAAM,OAG7Cn6B,KAAK,UAGjB,MACIsvF,EACIp8F,IAAAA,cAAA,OACIoO,IAAK,qBACL,cAAai2B,EAAMlkC,KACnBoO,KAAK+qH,EAAAA,EAAAA,IAAiBj1F,GACtBpkC,UAAW,2BAKvB,OACID,IAAAA,cAAA,OACIC,UAAWsgI,EACXjxH,QA/CYywC,KAChBzwC,EAAQ+0B,EAAM,EA+CV47F,YAAaC,GAEblgI,IAAAA,cAAA,OAAK,cAAY,aACZo8F,GAIjB,CAEA,SAASskC,GAAStlF,EAAkBl3C,GAChC,OACIk3C,EAAUZ,aAAet2C,EAAUs2C,UAE3C,CANCwlF,GAAA33H,UAAA,CAlFGy0H,SAAQh3H,IAAAA,OAAAC,WACRy0C,WAAU10C,IAAAA,KACVwJ,QAAOxJ,IAAAA,KAAAC,WACPk6H,YAAWn6H,IAAAA,KAAAC,YAuFf,UAAewpD,EAAAA,EAAAA,MAAKywE,GAAiBU,ICxFrC,SAASC,GAA6BxoI,GAA6F,IAA5F,MAACwW,EAAK,MAAEvB,EAAK,KAAEzW,EAAI,eAAEiqI,EAAc,cAAEC,EAAa,aAAE1zD,EAAY,iBAAE2zD,GAAwB3oI,EAC7H,MAAMkjI,EAAM1kI,EAAKgY,GAEjB,OAAIysH,EAAoBC,GAEhBr7H,IAAAA,cAAC+gI,GAA0B,CACvBlF,aAAcR,EAAI5vH,MAAM,GAAGowH,aAC3BzuH,MAAOA,IAMfpN,IAAAA,cAAA,OACIoN,MAAOA,EACPnN,UAAU,qBAETo7H,EAAI5vH,MAAMpI,KAAK29H,IACZ,MAAM38F,EAAQ28F,EAAYrhI,KACpB66C,EAAawmF,EAAYvE,QAAQx5H,gBAAkB49H,EAAc59H,eAAiB29H,IAAmBjyH,EAE3G,OACI3O,IAAAA,cAACggI,GAAe,CACZtiI,IAAG,GAAAiD,OAAKqgI,EAAYnF,aAAY,KAAAl7H,OAAIqgI,EAAYvE,SAChDp4F,MAAOA,EACPy4F,SAAUzB,EAAI1sH,MACd6rC,WAAYA,EACZlrC,QAAS69D,EACT8yD,YAAaa,GACf,IAKtB,CAACH,GAAAt4H,UAAA,CAxCGu4H,eAAc96H,IAAAA,OAAAC,WAEdonE,aAAYrnE,IAAAA,KAAAC,WACZ+6H,iBAAgBh7H,IAAAA,KAAAC,YAuCpB,UAAewpD,EAAAA,EAAAA,MAAKoxE,GAA+BD,GAAAA,ICvB7CO,IAA4BjgE,EAAAA,EAAAA,aAAkC,CAAA7oE,EAAgOyiD,KAAQ,IAAvO,qBAACqkF,EAAoB,YAAEM,EAAW,eAAEG,EAAc,eAAEkB,EAAc,cAAEC,EAAa,oBAAEK,EAAmB,gBAAEC,EAAe,kBAAEC,EAAiB,aAAEj0D,EAAY,iBAAE2zD,EAAgB,gBAAEO,EAAe,yBAAEC,GAAgCnpI,EAE9R,MAAMopI,EAAaA,CAAC5yH,EAA2C6yH,KAC3D,MAAM7qI,EAAO6qI,EAAS7yH,GAEtB,GAAIysH,EAAoBzkI,GAAO,CAC3B,MAAMwoI,EAAcxoI,EAAK8U,MAAM,GAC/B,MAAO,GAAP9K,OAAUw+H,EAAYrD,cAAa,KAAAn7H,OAAIw+H,EAAYtD,aACvD,CAEA,MACM4F,EADY9qI,EAAK8U,MACWpI,KAAKghC,GAAK,GAAA1jC,OAAQ0jC,EAAMy3F,cAAa,KAAAn7H,OAAI0jC,EAAMo4F,WACjF,OAAOgF,EAAgB93E,KAAK,KAAK,EAkB/B+3E,GAAkBjoH,EAAAA,EAAAA,aAAY0mH,KAASviI,IAAuC,IAAtC,aAAC+jI,GAAgC/jI,EAf1DgkI,EAACD,EAAiDjC,EAA+BH,EAAsBN,KAA+C,IAAA4C,EAAAC,EACvK,GAAIvC,EACA,OAGJ,MAAMwC,EAAoBj+H,KAAKm/G,KAAK0e,EN0EjB,IMzEbK,EAAkB/C,SAAyC,QAArB4C,EAApB5C,EAAuB8C,UAAkB,IAAAF,GAAU,QAAVC,EAAzCD,EAA2Cp2H,MAAM,UAAE,IAAAq2H,OAA/B,EAApBA,EAAqDjG,aAEzEmG,IAAoBtC,GAAmBsC,GAI3CZ,EAAkBY,EAAgB,EAIlCJ,CAAaD,EAAcjC,EAAgBH,EAAaN,EAAqB,GNqE1C,IMpEP,CAACoB,SAAS,EAAOC,UAAU,IACxD,CAACZ,EAAgBH,EAAaN,IAE3BgD,EAAsBtzH,GACjBA,EAAQswH,EAAqB71H,OAGlC84H,EAAsB3rI,UACxB,IAA4B,IAAxB2qI,EACA,OAGJ,MAAM,KAACvqI,SAAc0qI,EAAgBF,EN2DP,MMxDzBxqI,GAAQA,EAAKyS,ONwDY,KMpD9Bk4H,GAA0B,EAG9B,OACIthI,IAAAA,cAAA,OACIC,UAAU,sBACVmN,MAAO,CAACkB,ONsCkB,MMpC1BtO,IAAAA,cAAA,OAAKC,UAAU,2BACXD,IAAAA,cAACojG,GAAAA,EAAS,MACL9sC,IAAA,IAAC,OAAChoD,EAAM,MAAED,GAAMioD,EAAA,OACbt2D,IAAAA,cAACqjG,GAAAA,EAAc,CACXzoD,IAAKA,EACLwmD,UAAW69B,EAAqB71H,OAAS,EACzCk6F,aAAc2+B,EACd5gC,cAAe6gC,IAEd1sB,IAAA,IAAC,gBAAChS,EAAe,IAAE5oD,GAAI46D,EAAA,OACpBx1G,IAAAA,cAACmiI,GAAAA,GAAa,CACVvnF,IAAKA,EACL4oD,gBAAiBA,EACjBl1F,OAAQA,EACRD,MAAOA,EACP+zH,OAAO,WACPC,cN0BK,EMzBLjhC,UAAW69B,EAAqB71H,OAChCk5H,SAAUrD,EACVsD,QAAShB,EACT79B,SNeT,GMdS8+B,SAAUd,IAETe,IAAA,IAAC,MAAC9zH,EAAK,MAAEvB,EAAK,KAAEzW,GAAK8rI,EAAA,OAClBziI,IAAAA,cAAC2gI,GAA6B,CAC1BhyH,MAAOA,EACPvB,MAAOA,EACPzW,KAAMA,EACNiqI,eAAgBA,EAChBC,cAAeA,EACf1zD,aAAcA,EACd2zD,iBAAkBA,GACpB,GAEM,GAEP,KAI3B,IAIdG,GAA0Bz6H,YAAc,4BAExC,UAAe+oD,EAAAA,EAAAA,MAAK0xE,I,wCC1HpB,SAASyB,GAA4BvqI,GAAyD,IAAxD,oBAAC+oI,EAAmB,gBAAE7kF,EAAe,QAAE/sC,GAAenX,EACxF,OAAK+oI,EAI0B,IAA3B7kF,EAAgBjzC,OACT,KAIPpJ,IAAAA,cAAC2iI,GAAAA,EAAqB,CAACC,YAAa,CAAC/1G,GAAAA,EAAYg2G,gBAC7C7iI,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAC8iD,GAAAA,KAAI,CACD7iD,UAAU,mBACV0/C,GAAE,IAAAh/C,OAAM07C,EAAe,UACvB/sC,QAASA,GAETtP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,oBAjBxB,IAuBf,CAACi5H,GAAAr6H,UAAA,CA9BG64H,oBAAmBp7H,IAAAA,KAAAC,WACnBs2C,gBAAev2C,IAAAA,OAAAC,WACfuJ,QAAOxJ,IAAAA,KAAAC,YA8BX,UAAewpD,EAAAA,EAAAA,MAAKmzE,IC5BpB,SAASI,GAAkB3qI,GAAiB,IAYpCylI,EACAmF,GAboB,MAAC1+F,GAAalsC,EACtC,OAAKksC,IAcDo3F,EAAAA,EAAAA,IAAcp3F,IACdu5F,EAAUv5F,EAAMw5F,YAChBkF,EACI/iI,IAAAA,cAAA,QAAMC,UAAU,kBACZD,IAAAA,cAAA,OACIjJ,GAAG,2BACHqX,IAAK,uBACLG,IAAKkyH,GACLxgI,UAAW,sCAAwCokC,EAAMjU,SAAW,UAAYiU,EAAMq3F,QAAQz4H,mBAK1G26H,EAAU,CAACv5F,EAAMlkC,MACjB4iI,EACI/iI,IAAAA,cAAA,OACIjJ,GAAG,2BACHqX,IAAK,sBACLnO,UAAU,8BACVsO,KAAK+qH,EAAAA,EAAAA,IAAiBj1F,MAM9BrkC,IAAAA,cAAA,OAAKC,UAAU,yBACXD,IAAAA,cAAA,OAAKC,UAAU,mCACV8iI,GAEL/iI,IAAAA,cAAA,OAAKC,UAAU,yCACXD,IAAAA,cAAA,QACIC,UAAU,6BACV,cAAY,wBAEX,IAAM29H,EAAQj0E,KAAK,OAAS,QA9CrC3pD,IAAAA,cAAA,OAAKC,UAAU,2DACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8CACH0S,eAAe,oBAgDnC,CAEA,UAAe8lD,EAAAA,EAAAA,MAAKuzE,IC9CdE,IAAoBhiE,EAAAA,EAAAA,aAAoC,CAAA7oE,EAAkHyiD,KAAQ,IAAzH,MAACp3C,EAAK,oBAAEy/H,EAAmB,iBAAEC,EAAgB,SAAEvgI,EAAQ,oBAAEwgI,EAAmB,UAAExsD,EAAS,MAAEj1D,EAAK,QAAEs3F,GAAe7gH,EAC1K,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAyFxB,OACIxZ,IAAAA,cAAA,OAAKC,UAAU,gCACXD,IAAAA,cAAA,QAAMC,UAAU,gDAChBD,IAAAA,cAAA,SACI46C,IAAKA,EACL7jD,GAAG,oBACH,aAAYyS,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,wBAC5ExJ,UAAU,uBACV,cAAY,mBACZ/E,KAAK,OACLyH,SAjGUkV,IAClBA,EAAMjO,iBAGN,MAAMpG,EAAQqU,EAAM2iD,OAAOh3D,MAAMyjC,QAAQ,SAAU,IACnDtkC,EAASa,GAET2/H,GAAqB,EA2FbxsD,UAxFW9+D,IAA2C,IAAAurH,EAAAC,EAC9D,OAAQxrH,EAAMna,KACd,IAAK,eAEuC,QAApC0lI,EAAoB,QAApBC,EAACxrH,EAAMyrH,qBAAa,IAAAD,OAAA,EAAnBA,EAAqBx0E,sBAAc,IAAAu0E,EAAAA,EAAI,GAAK,EAAI5/H,EAAM4F,SAAoC,IAAzB65H,IAAoD,IAAtBC,KAChGrrH,EAAM+7C,kBACN/7C,EAAMjO,iBAEN+sE,EAAUwjD,EAAoBwF,YAElC,MACJ,IAAK,YACGsD,EAAsB,GAAKC,EAAmB,GAC9CrrH,EAAM+7C,kBACN/7C,EAAMjO,iBAEN+sE,EAAUwjD,EAAoByF,gBACC,IAAxBqD,GAAkD,IAArBC,IACpCC,IACAtrH,EAAMyrH,cAAcz0E,eAAiBrrD,EAAM4F,OAC3CyO,EAAMyrH,cAAcx0E,aAAetrD,EAAM4F,OAEzCyO,EAAM+7C,kBACN/7C,EAAMjO,iBAEN8X,KAEJ,MACJ,IAAK,UACD7J,EAAM+7C,kBACN/7C,EAAMjO,iBAEFiO,EAAM6mD,SAEN7mD,EAAMyrH,cAAcz0E,eAAiB,GACL,IAAzBo0E,GAEPprH,EAAMyrH,cAAcz0E,eAAiB,EACrCh3C,EAAMyrH,cAAcx0E,aAAe,GACJ,IAAxBm0E,GAA6BC,ETiDvB,GS9CbC,IACAtrH,EAAMyrH,cAAcz0E,eAAiBrrD,EAAM4F,OAC3CyO,EAAMyrH,cAAcx0E,aAAetrD,EAAM4F,OACzCsY,KAGAi1D,EAAUwjD,EAAoB0F,kBAElC,MACJ,IAAK,YACDhoH,EAAM+7C,kBACN/7C,EAAMjO,iBAEFiO,EAAM6mD,SAEN7mD,EAAMyrH,cAAcx0E,aAAetrD,EAAM4F,OAClC5F,GAAgD,IAAvCqU,EAAMyrH,cAAcz0E,gBAEpCh3C,EAAMyrH,cAAcz0E,eAAiBrrD,EAAM4F,OAC3CyO,EAAMyrH,cAAcx0E,aAAetrD,EAAM4F,QAGzCutE,EAAUwjD,EAAoB2F,cAElC,MACJ,IAAK,QACDjoH,EAAM+7C,kBACN/7C,EAAMjO,iBAENovG,IAGJ,EAeQ/rG,aAAa,MACb5I,YAAamF,EAAc,CAACzS,GAAI,sBAAuB0S,eAAgB,iBACvEjG,MAAOA,IAET,IAKdw/H,GAAkBx8H,YAAc,oBAEhC,UAAe+oD,EAAAA,EAAAA,MAAKyzE,I,sbCpHpB,MAAMO,GAAY,CACd,CACIl/F,MAAO02F,EAAAA,GAAaA,EAAAA,GAA0Bx3D,IAAI,oDAClD3hE,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,4BACJ0S,eAAgB,mBAEpBjG,MAAO,SAEX,CACI6gC,MAAO02F,EAAAA,GAAaA,EAAAA,GAA0Bx3D,IAAI,2DAClD3hE,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,mCACJ0S,eAAgB,0BAEpBjG,MAAO,SAEX,CACI6gC,MAAO02F,EAAAA,GAAaA,EAAAA,GAA0Bx3D,IAAI,sDAClD3hE,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,8BACJ0S,eAAgB,qBAEpBjG,MAAO,SAEX,CACI6gC,MAAO02F,EAAAA,GAAaA,EAAAA,GAA0Bx3D,IAAI,4DAClD3hE,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,oCACJ0S,eAAgB,2BAEpBjG,MAAO,SAEX,CACI6gC,MAAO02F,EAAAA,GAAaA,EAAAA,GAA0Bx3D,IAAI,qDAClD3hE,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,6BACJ0S,eAAgB,oBAEpBjG,MAAO,SAEX,CACI6gC,MAAO02F,EAAAA,GAAaA,EAAAA,GAA0Bx3D,IAAI,qCAClD3hE,OAAOsN,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,qBACJ0S,eAAgB,sBAEpBjG,MAAO,YAcR,MAAMggI,WAAwBxjI,IAAAA,cACjCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,kBAOJw7H,GACFt7H,KAAKhD,MAAM6J,KAAKC,cAAc,CACjCzS,GAAI,mCACJ0S,eAAgB,oBAEpB,CACIg6H,SAAU/gI,KAAKhD,MAAM6J,KAAKC,cAAcw0H,EAASp8H,WAExDY,GAAA,2BAEqBkhI,IAClBhhI,KAAKgH,SAAS,CAACi6H,gBAAgB,IAC3BD,IAAShhI,KAAKhD,MAAM09H,cACpB16H,KAAKhD,MAAMkkI,eAAeF,EAC9B,IACHlhI,GAAA,2BAEoB,KACjBE,KAAKgH,SAAS,CAACi6H,gBAAgB,GAAM,IAvBrCjhI,KAAKpK,MAAQ,CACTqrI,gBAAgB,EAExB,CAuBAE,QAAAA,GACI,MAAMC,EAAmBphI,KAAKhD,MAAM6J,KAAKC,cAAc,CACnDzS,GAAI,mBACJ0S,eAAgB,qBAEds6H,EAAUR,GAAUlgI,KAAK26H,IAC3B,MAAM0F,EAAO1F,EAASx6H,MAChB6gC,EAAQ25F,EAAS35F,MACjB2/F,EAAkB7sF,IAAW,cAAe,kBAAFx2C,OAAoB0jC,EAAMjU,UAAQ,SAAAzvB,OAAa0jC,EAAMq3F,QAAQz4H,gBAE7G,OACIjD,IAAAA,cAAA,UACIC,UAAU,+BACV,2BAAAU,OAA0B+iI,GAC1B,aAAYhhI,KAAK0X,UAAU4jH,GAC3BtgI,IAAKgmI,EACLp0H,QAASA,IAAM5M,KAAKuhI,mBAAmBP,IAEvC1jI,IAAAA,cAAA,OACIuO,IAAKkyH,GACLxgI,UAAW+jI,IAEV,IAGjB,OACIhkI,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,UACIC,UAAU,qCACVqP,QAASA,IAAM5M,KAAKuhI,mBAAmBvhI,KAAKhD,MAAM09H,cAClD,aAAY0G,GAEZ9jI,IAAAA,cAAC8nF,GAAAA,UAAS,CACNhnF,KAAM,GACNuuD,MAAO,iDAGfrvD,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACgK,EAAAA,iBACOu5H,GAAUA,GAAUn6H,OAAS,GAAGxH,SAIhD5B,IAAAA,cAAA,OAAKC,UAAU,qBACV8jI,GAIjB,CAEAG,SAAAA,GACI,MAAM7/F,EAAQk/F,GAAUp4H,MAAKhT,IAAA,IAAC,MAACqL,GAAMrL,EAAA,OAAKqL,IAAUd,KAAKhD,MAAM09H,YAAY,IAAG/4F,MACxE2/F,EAAkB7sF,IAAW,cAAe,kBAAFx2C,OAAoB0jC,aAAK,EAALA,EAAOjU,UAAQ,SAAAzvB,OAAa0jC,aAAK,EAALA,EAAOq3F,QAAQz4H,gBACzGkhI,EAAoBzhI,KAAKhD,MAAM6J,KAAKC,cAAc,CACpDzS,GAAI,yBACJ0S,eAAgB,cAGpB,OACIzJ,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOi2H,GAEPnkI,IAAAA,cAAA,UACI,6BAAAW,OAA4B+B,KAAKhD,MAAM09H,cACvCn9H,UAAU,uDACVqP,QAAS5M,KAAK0hI,mBACd,aAAYD,GAEZnkI,IAAAA,cAAA,OACIoO,IAAK,yBACLG,IAAKkyH,GACLxgI,UAAW+jI,KAK/B,CAEAr+H,MAAAA,GACI,OACI3F,IAAAA,cAACsvD,GAAAA,EAAa,CACV3hD,GAAIjL,KAAKpK,MAAMqrI,eACfxsF,WAAW,uBACXjiB,QAAS,KAETl1B,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,aAAc,CAAC,qBAAsBz0C,KAAKpK,MAAMqrI,kBACvE3jI,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,sBAAuB,CAAC,+BAAgCz0C,KAAKpK,MAAMqrI,kBACzFjhI,KAAKpK,MAAMqrI,eAAiBjhI,KAAKmhI,WAAanhI,KAAKwhI,cAKxE,EACH1hI,GA5HYghI,GAAe,aATxBpG,aAAYt3H,IAAAA,OAAAC,WACZ69H,eAAc99H,IAAAA,KAAAC,aAsIlB,UAAeyJ,EAAAA,EAAAA,YAAWg0H,I,0/BCtK1B,MAAMa,GAAclsI,IAkBP,IAAA0pI,EAAAC,EAAAwC,EAAA,IAlBQ,OACjBnhI,EAAM,aACNgqE,EAAY,mBACZo3D,EAAkB,uBAClBC,EAAsB,sBACtBC,EAAqB,oBACrBvD,GAAsB,EAAK,gBAC3BC,EAAkB,EAAC,SACnBtyG,EAAQ,aACRivG,EAAY,aACZV,EAAY,gBACZ/gF,EACAt5C,SAAS,gBACLs+H,EAAe,mBACfqD,EAAkB,yBAClBpD,EAAwB,gBACxBqD,IAEAxsI,EACJ,MAAMysI,EAA2BA,IAAO9G,EAAa10H,OAASgxH,EXlDpC,mBWmDnBsF,EAAgB0B,IAAqB7nH,EAAAA,EAAAA,UAAwBqrH,IAE7DxP,EAAQyP,IAAatrH,EAAAA,EAAAA,UAAsB,CAC9CujH,UAAW,EACXL,QAAS,GACTp4F,WAAOrpC,KAKJ4gI,EAAYkJ,IAAiBvrH,EAAAA,EAAAA,WADPwrH,IAAOjH,EAAa10H,OAAMtS,GAAAA,GAAA,GAAO+jI,GAA0BC,GAAcA,KAG/FqC,EAAW6H,IAAgBzrH,EAAAA,EAAAA,UAAgC,CAAC,IAE5D0lH,EAAsBgG,IAA2B1rH,EAAAA,EAAAA,UAA+B,KAGhF2rH,EAAgBC,IAA0B5rH,EAAAA,EAAAA,UAA0B,IAErE6rH,GAAiBv5E,EAAAA,EAAAA,QAAyB,MAE1C+0C,EAAoB5gG,IAAAA,OAA+E,MAEnGqlI,GAAsCx5E,EAAAA,EAAAA,UAEtCy5E,GAA6Bz5E,EAAAA,EAAAA,QAAOs0E,KAAS,CAACoF,EAAWrE,KACvDA,GAAuBqE,GAAaA,EAAUh2G,OAAOnmB,QACrDs7H,EAAmBa,EACvB,GX8C4C,OW3ChDngF,EAAAA,EAAAA,YAAU,KAGN,MAAMogF,EAA4B9zH,OAAO22F,uBAAsB,KAAM,IAAAo9B,EAC3C,QAAtBA,EAAAL,EAAe3yH,eAAO,IAAAgzH,GAAtBA,EAAwB/jH,OAAO,IAG7BgkH,EAAgBxjI,SAAS2tE,eAAe,QAG9C,OAFA61D,SAAAA,EAAelqE,UAAUjiC,IAAI,wBAEtB,KACHmsG,SAAAA,EAAelqE,UAAUO,OAAO,wBAChCrqD,OAAOi0H,qBAAqBH,EAA0B,CACzD,GACF,KAEHpgF,EAAAA,EAAAA,YAAU,KACNigF,EAAoC5yH,SAAU,EAE9C,MAAOmzH,EAAmBC,GVE3B,SACHh3G,EACAivG,EACAV,EACAD,GAEA,MAAM2I,EAAiBj3G,EAASk3G,aAC1BnK,EAAyBkC,EAAa10H,OAAMtS,EAAAA,EAAA,GAAO+jI,GAA0BC,GAAcA,EAEjG16H,OAAO+I,KAAKyyH,GAAYlzH,SAASmzH,IAC7B,IAAImK,EAA0B,GAET,WAAjBnK,GAA6BiC,EAAa10H,OAC1C48H,EAAiB,IAAIlI,GACjBmI,UACA9iI,QAAQhD,GACG0uB,EAASE,IAAI5uB,KAExBkD,KAAKlD,GACM0uB,EAAS00C,IAAIpjE,MAI5B6lI,GADiBE,EAAAA,GAAuB3iE,IAAI65D,GAAwC75D,IAAIs4D,IAAiB,IAChFx4H,KAAKsL,GAAUw3H,EAAAA,GAAWx3H,KAE9B,WAAjBktH,IACAmK,EAAiBA,EAAerlI,OAAO,IAAImlI,EAAet9H,aAKlEozH,EAAWC,GAA+B5B,SAAW+L,EACjD3iI,KAAKghC,IAAkBo3F,EAAAA,EAAAA,IAAcp3F,GAASA,EAAMq3F,QAAQz4H,cAAgBohC,EAAMttC,KAGtFivI,EAAet9H,SAAS09H,IACpB,MAAMC,GAAiB5K,EAAAA,EAAAA,IAAc2K,GAAgBA,EAAa1K,QAAQz4H,cAAgBmjI,EAAarvI,GACvGomI,EAAUkJ,GAAevvI,EAAAA,EAAA,GAAOqmI,EAAUkJ,IAAoBD,IAEzD3K,EAAAA,EAAAA,IAAc2K,KACfjJ,EAAUkJ,GAAevvI,EAAAA,EAAA,GAAOqmI,EAAUkJ,IAAe,IAAEj2G,SAAU,WACzE,GACF,IAGN,MAAMy1G,EAAmBzlI,OAAOC,OAAO,CAAC,EAAG88H,GAE3C,MAAO,CAACvB,EAAYiK,EACxB,CUlDsDS,CAAiCz3G,EAAUivG,EAAcV,EAAcD,GACrH6H,EAAaa,GACbf,EAAcc,EAAkB,GACjC,CAAC/2G,EAAUuuG,EAAcU,KAE5B14E,EAAAA,EAAAA,YAAU,KACNigF,EAAoC5yH,SAAU,EAE9C,MAAO8zH,EAA6BC,GAAyBtJ,EAA2BC,EAAWvB,EAAYz4H,EAAQi6H,GAEhG,WAAnBsC,GACA+G,EAAiBD,GAGrBvB,EAAwBsB,GACxBpB,EAAuBqB,GACvBlB,EAA2B7yH,QAAQtP,EAAQ+9H,EAAoB,GAChE,CAAC/9H,EAAQkiI,EAAoC5yH,QAASyuH,KAEzD97E,EAAAA,EAAAA,YAAU,KAAM,IAAAshF,EACU,QAAtBA,EAAAtB,EAAe3yH,eAAO,IAAAi0H,GAAtBA,EAAwBhlH,OAAO,GAChC,KAGH0jC,EAAAA,EAAAA,YAAU,KAAM,IAAAuhF,EAAAC,EACRlH,IAAmBkF,KACnBxD,EAAkBwD,KAItBhkC,SAA0B,QAAT+lC,EAAjB/lC,EAAmBnuF,eAAO,IAAAk0H,GAAU,QAAVC,EAA1BD,EAA4BE,gBAAQ,IAAAD,GAApCA,EAAsCE,aAAa,EAAG,QAAQ,GAC/D,CAAC3jI,KAGJiiD,EAAAA,EAAAA,YAAU,KACc,IAAA2hF,EAAAC,EAAhB5R,EAAOqH,UAEP77B,SAA0B,QAATmmC,EAAjBnmC,EAAmBnuF,eAAO,IAAAs0H,GAAU,QAAVC,EAA1BD,EAA4BF,gBAAQ,IAAAG,GAApCA,EAAsCF,aAAa1R,EAAO0H,SAAU,QACxE,GACD,CAAC1H,EAAO0H,WAEX,MAAM0C,GAAqB/lH,EAAAA,EAAAA,cAAY,KAAM,IAAAwtH,EACnB,QAAtBA,EAAA7B,EAAe3yH,eAAO,IAAAw0H,GAAtBA,EAAwBvlH,OAAO,GAChC,IAEGwlH,EAAgBzK,GACbA,EAGSU,EAAUV,IAAYU,EAAUV,EAAQ0K,gBAAkBhK,EAAUV,EAAQx5H,eAF/E,KAMTwjI,EAAoBvB,IACtB,IAAKA,EAAe,GAChB,OAGJ,MAAM,SAACpI,EAAQ,QAAEL,GAAWyI,EAAe,GACrCkC,EAAcF,EAAazK,GAC7B2K,GACAvC,EAAU,CACN/H,WACAL,UACAp4F,MAAO+iG,GAEf,EAGEC,GAAsB5tH,EAAAA,EAAAA,cAAY,CAACmgH,EAA+CiC,EAA6BY,KAAoB,IAAA6K,EAAAC,EACrI,IAAK1L,GAAgBA,IAAiB6D,IAAmBjD,EACrD,OAGJ2E,EAAkBvF,GAGlBj7B,SAA0B,QAAT0mC,EAAjB1mC,EAAmBnuF,eAAO,IAAA60H,GAAU,QAAVC,EAA1BD,EAA4BT,gBAAQ,IAAAU,GAApCA,EAAsCT,aAAalN,EAAkB,SAErE,MAAMwN,EAAcF,EAAazK,GAC7B2K,GACAvC,EAAU,CACN/H,SAAUlD,EAAmB,EAC7B6C,UACAp4F,MAAO+iG,GAEf,GACD,CAAC1H,IAEE8H,IAAc/tH,EAAAA,EAAAA,cAAY,KAC5BorH,EAAU,CACN/H,UAAW,EACXL,QAAS,GACTp4F,WAAOrpC,GACT,GACH,IAEGysI,IAA6BhuH,EAAAA,EAAAA,cAAY,KAC3C+qH,IACAC,SAAAA,GAAyB,GAC1B,KAEIiD,GAAgBzE,GAAqBC,IV0GzC,SAA6BtC,EAAyCC,EAAuC5B,GAA4D,IAAA4C,EAAAC,EAAA6F,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC5K,GAA6B,IAAzBnH,EAAcz3H,SAAoC,IAApBw3H,EAC9B,MAAO,CAAC,IAAK,GAAI,GAGrB,MAAMqH,EAAiE,QAAhDpG,EAAG5C,SAAsC,QAAlB6C,EAApB7C,EAAuB2B,UAAe,IAAAkB,OAAlB,EAApBA,EAAwCr2H,aAAK,IAAAo2H,EAAAA,EAAI,GAG3E,OAAIoG,EAAkB7+H,OAAS,EACpB,CAAC,IAAK,GAAI,GAUd,CAPkD,QAArCu+H,EAAuB,QAAvBC,EAAGK,EAAkB,UAAE,IAAAL,OAAA,EAApBA,EAAsB/L,oBAAY,IAAA8L,EAAAA,EAAI,GACE,QAAtCE,EAAuB,QAAvBC,EAAGG,EAAkB,UAAE,IAAAH,OAAA,EAApBA,EAAsBhM,qBAAa,IAAA+L,EAAAA,GAAK,EAItD,QAFQE,EAEpB,QAFoBC,EAAGC,EAAkB98H,MAAM6xH,GACtCA,EAAUP,UAAYoE,WAC/B,IAAAmH,OAAA,EAFuBA,EAErBxL,kBAAU,IAAAuL,EAAAA,GAAK,EAGvB,CU9HoEG,CAAoB9S,EAAO0H,SAAU1H,EAAOqH,QAASwC,GAsF/GkJ,GAAiCC,IAEnC,GAA8B,IAA1BlD,EAAe97H,OACf,OAGJ,IAAIi/H,EACJ,GAA8B,IAA1BjT,EAAOqH,QAAQrzH,SAAqC,IAArBgsH,EAAO0H,SAAiB,CAEvD,MAAMwL,EAA8BpD,EAAe97F,WAAWm/F,GAC1DA,EAAczL,WAAa1H,EAAO0H,UAAYyL,EAAc9L,QAAQx5H,gBAAkBmyH,EAAOqH,QAAQx5H,iBAEpE,IAAjCqlI,EACAD,OAAYrtI,EACLotI,IAAWjO,EAAoBwF,WAAayI,IAAWjO,EAAoByF,cAClFyI,EAjEZ,SAA+CD,EAA6BlD,EAAiCsD,EAAoChJ,GAC7I,OAAI4I,IAAWjO,EAAoBwF,WAAe6I,EAA6B,EAAKtD,EAAe97H,OAExF87H,EAAesD,EAA6B,GAEnDJ,IAAWjO,EAAoByF,eAAmB4I,EAA6B,GAAM,EAE9EtD,EAAesD,EAA6B,QAEnDJ,IAAWjO,EAAoByF,eAAmB4I,EAA6B,EAAK,GAEpFhJ,IAKR,CAiDwBiJ,CAAsCL,EAAQlD,EAAgBoD,EAA6B9I,GAChG4I,IAAWjO,EAAoB2F,aACtCuI,EAjDZ,SAAwCX,EAAwBxC,EAAiCoD,EAAqC1M,GAClI,GAAK0M,EXhJgB,EWgJ+BpD,EAAe97H,OAAQ,CAEvE,MAAMs/H,EAAyBxD,EAAeoD,EXlJ7B,GWkJ0EzM,aAE3F,GAAI6M,IAA2BhB,EAAgB,CAE3C,MACMiB,GAD4B/M,EAAW8M,GAAwBzO,UAAY,IACxB,GAIzD,OAHqCiL,EAAe/5H,MAAMo9H,GAC/CA,EAAc9L,QAAQx5H,gBAAkB0lI,EAAuB1lI,eAAiBslI,EAAc1M,eAAiB6M,GAG9H,CAGA,OAAOxD,EAAeoD,EX/JL,EWgKrB,CAIA,MAAMM,EAAkC1D,EAAepzH,MAAMw2H,EAA8B,EAAGpD,EAAe97H,QAAQ+B,MAAMo9H,GAChHA,EAAc1M,eAAiB6L,IAG1C,GAAIkB,EACA,OAAOA,CAIf,CAmBwBC,CAA+BnB,GAAgBxC,EAAgBoD,EAA6B1M,GACjGwM,IAAWjO,EAAoB0F,mBACtCwI,EAvGZ,SAAsCX,EAAwBxC,EAAiCoD,EAAqC1M,EAAwB4D,GACxJ,GAAK8I,EX5FgB,GW4FgC,EAAG,CAEpD,MAAMQ,EAAuB5D,EAAeoD,EX9F3B,GW8FwEzM,aAEzF,GAAIiN,IAAyBpB,EAAgB,CAEzC,MAAMqB,EAA0BnN,EAAWkN,GAAsB7O,UAAY,GACvE+O,EAAsBD,EAAwBA,EAAwB3/H,OAAS,GAIrF,OAHkC87H,EAAe/5H,MAAMo9H,GAC5CA,EAAc9L,QAAQx5H,gBAAkB+lI,EAAoB/lI,eAAiBslI,EAAc1M,eAAiBiN,GAG3H,CAGA,OAAO5D,EAAeoD,EX3GL,EW4GrB,CAIA,MAAMW,EAAoC/D,EAAepzH,MAAM,EAAGw2H,GAA6BrC,UAAU96H,MAAMo9H,GACpGA,EAAc1M,eAAiB6L,IAG1C,GAAIuB,EACA,OAAOA,EAIXzJ,GAEJ,CAuEwB0J,CAA6BxB,GAAgBxC,EAAgBoD,EAA6B1M,EAAY4D,GAE1H,MAAqC,IAA1BpK,EAAOqH,QAAQrzH,SAAqC,IAArBgsH,EAAO0H,WACzCsL,IAAWjO,EAAoBwF,WAAayI,IAAWjO,EAAoB2F,cAE7C,IAA1BoF,EAAe97H,SACfi/H,EAAYnD,EAAe,KAMvC,QAAkBlqI,IAAdqtI,EACA,OAGJ,MAAMc,EAAiBjC,EAAamB,EAAU5L,SACzC0M,GAILtE,EAAU,CACN/H,SAAUuL,EAAUvL,SACpBL,QAAS4L,EAAU5L,QACnBp4F,MAAO8kG,GACT,EAGAC,IAAqB3vH,EAAAA,EAAAA,cAAY,KACnC,MAAM4vH,EAAejU,EAAO/wF,MAExBglG,GACAl8D,EAAak8D,EACjB,GACD,CAACjU,EAAOqH,UAQL6M,IAAkB3vH,EAAAA,EAAAA,UAAQ,KAC5B,MAAM,MAAC0qB,GAAS+wF,EAEhB,OAAK/wF,GAIQqoC,EAAAA,EAAAA,IAAaroC,GACd4C,QAAQ,KAAM,KAJf,EAImB,GAC/B,CAACmuF,EAAOqH,UAEL8M,GAA0C,IAAlBpmI,EAAOiG,QAAgD,IAAhC61H,EAAqB71H,SAAgB61H,SAAyB,QAAL4C,EAApB5C,EAAuB,UAAE,IAAA4C,GAAO,QAAPC,EAAzBD,EAA2Bp2H,aAAK,IAAAq2H,GAAK,QAALwC,EAAhCxC,EAAmC,UAAE,IAAAwC,OAAjB,EAApBA,EAAuCzI,gBAAiBxB,EAElJ,OACIr6H,IAAAA,cAAA,OACIC,UAAU,sBACV6M,KAAK,eAEL9M,IAAAA,cAAA,OACI,YAAU,YACVC,UAAU,WAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,oBACfjB,OAAQ,CACJqzG,UAAWytB,OAIvBtpI,IAAAA,cAAA,OAAKC,UAAU,kCACXD,IAAAA,cAACgjI,GAAiB,CACdpoF,IAAKwqF,EACL5hI,MAAOL,EACP8/H,oBAAqBA,GACrBC,iBAAkBA,GAClBxhH,MAAO89G,EACPxmB,QAASowB,GACTzmI,SAAU4hI,EACV5tD,UAAWwxD,GACXhF,oBAAqBqE,KAEzBxnI,IAAAA,cAACwjI,GAAe,CACZpG,aAAcA,EACdwG,eAAgBe,KAGxB3kI,IAAAA,cAACs/H,EAAqB,CAClBC,YAAap8H,EAAOiG,OAAS,EAC7BmM,OAAQmqH,EACR9D,WAAYA,EACZtsH,QAAS+3H,EACT1wD,UAAWwxD,GACX3I,mBAAoBA,IAEvB+J,GACGvpI,IAAAA,cAAC+iG,GAAAA,EAAkB,CACf1b,QAAS2b,GAAAA,EAAiBwmC,OAC1BtmC,YAAa,CAACtjG,YAAa,GAAFe,OAAKwC,MAGlCnD,IAAAA,cAACihI,GAAyB,CACtBrmF,IAAKgmD,EACL2+B,YAAap8H,EAAOiG,OAAS,EAC7Bs2H,eAAgBA,EAChBT,qBAAsBA,EACtB4B,cAAezL,EAAOqH,QACtBmE,eAAgBxL,EAAO0H,SACvBsE,kBAAmBA,EACnBj0D,aAAcA,EACd2zD,iBA5EgB2I,IACxBA,EAAgBhN,UAAYrH,EAAOqH,SAA8B,KAAnBrH,EAAOqH,SACrDoI,EAAU4E,EACd,EA0EYpI,gBAAiBA,EACjBF,gBAAiBA,EACjBG,yBAA0BA,EAC1BJ,oBAAqBA,IAG7BlhI,IAAAA,cAAA,OAAKC,UAAU,wBACVspI,GAAwBvpI,IAAAA,cAAA,YAASA,IAAAA,cAAC8iI,GAAkB,CAACz+F,MAAO+wF,EAAO/wF,QACpErkC,IAAAA,cAAC0iI,GAA4B,CACzBrmF,gBAAiBA,EACjB6kF,oBAAqBA,EACrB5xH,QAASm4H,MAGf,EAEZpD,GAAAh8H,UAAA,CA7ZElF,OAAM2C,IAAAA,OAAAC,WACNonE,aAAYrnE,IAAAA,KAAAC,WACZw+H,mBAAkBz+H,IAAAA,KAAAC,WAClBy+H,uBAAsB1+H,IAAAA,KAAAC,WACtB0+H,sBAAqB3+H,IAAAA,MA2ZzB,UAAeypD,EAAAA,EAAAA,MAAK80E,ICvZpB,IAJkBv8H,EAAAA,EAAAA,UAtBlB,SAAyBxP,GAAoB,IAAAoxI,EAAArmF,EACzC,MAAO,CACH69E,qBAAqByI,EAAAA,EAAAA,IAAuBrxI,GAC5C6oI,gBAAiB7oI,EAAM8kD,MAAM/Y,MAAMulG,sBACnC/6G,UAAUsqG,EAAAA,EAAAA,IAAY7gI,GACtBwlI,cAAc+L,EAAAA,EAAAA,IAAqBvxI,GACnC8kI,cAAc0M,EAAAA,EAAAA,IAAgBxxI,GAC9B+jD,gBAA4C,QAA7BqtF,EAAuB,QAAvBrmF,GAAEl9B,EAAAA,EAAAA,IAAe7tB,UAAM,IAAA+qD,OAAA,EAArBA,EAAuBljD,YAAI,IAAAupI,EAAAA,EAAI,GAExD,IAEA,SAA4BrzI,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBq5H,gBAAe,KACfqD,mBAAkB,KAClBpD,yBAAwB,KACxBqD,gBAAeA,EAAAA,IAChBtuI,GAEX,GAMA,CAAyBguI,IClCnB0F,GAAoB5xI,IAAqC,IAApC,uBAACqsI,GAA8BrsI,EACtD,OACI6H,IAAAA,cAAA,OAAKC,UAAU,qCACXD,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,0CACVqP,QAASk1H,GAETxkI,IAAAA,cAAA,QAAM,cAAY,QAAQ,KAC1BA,IAAAA,cAAA,QAAMC,UAAU,WACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,qBACJ0S,eAAgB,YAI5BzJ,IAAAA,cAAA,MAAIC,UAAU,0CACVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,sBACJ0S,eAAgB,kBAGtB,EAId,GAAezJ,IAAAA,KAAW+pI,I,gBCT1B,SAtBA,SAAmBrqI,GACf,OACIM,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqgD,MAAM,6BACNhyC,MAAM,OACNC,OAAO,OACP6xC,QAAQ,aAERngD,IAAAA,cAAA,QACI4gD,EAAE,mDACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yDACFR,KAAK,aAKzB,E,ynBCTA,MAAM4pF,IAAYtoE,EAAAA,EAAAA,GAAmB,YAAa1hE,IAAAA,MAAW,IAAM,4DAoBpD,MAAMiqI,WAAwBryE,EAAAA,cASzCt1D,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,+BAUQ,KACrBE,KAAKhD,MAAMwqI,cAAc,IAC5B1nI,GAAA,2BAEqBW,IAClBT,KAAKgH,SAAS,CAACvG,UAAQ,IAC1BX,GAAA,0BAEmB,IACTE,KAAKynI,kBAAkB13H,UAjB9B/P,KAAKpK,MAAQ,CACT8xI,iBAAiB,EACjBjnI,OAAQ,IAGZT,KAAKynI,mBAAoBE,EAAAA,EAAAA,YAC7B,CAcA1kI,MAAAA,GACI,IAAI2kI,EAEyE,IAAAC,GADzE7nI,KAAKhD,MAAM0N,OAAqC,IAA1B1K,KAAKhD,MAAM0N,MAAM4hD,MAAuC,IAAzBtsD,KAAKhD,MAAM0N,MAAMk6C,MAGlEgjF,EAFyB,QAAzB5nI,KAAKhD,MAAM8tD,WAAgD,WAAzB9qD,KAAKhD,MAAM8tD,UAE/B,CACVlG,IAAK5kD,KAAKhD,MAAM0N,MAAMk6C,IACtBoQ,OAAQh1D,KAAKhD,MAAM0N,MAAMsqD,OACzBD,MAAiB,QAAZ8yE,EAAE7nI,KAAKhD,aAAK,IAAA6qI,OAAA,EAAVA,EAAYj9D,a,kWAGZx2E,CAAA,GAAO4L,KAAKhD,MAAM0N,OAG7Bk9H,EAAYhjF,IACZgjF,EAAYhjF,KAAO5kD,KAAKhD,MAAM2tE,WAAa,GAAMi9D,EAAYhjF,IAE7DgjF,EAAYhjF,IAAM5kD,KAAKhD,MAAM2tE,UAG7Bi9D,EAAYt7E,OACXs7E,EAAYt7E,MAAoBtsD,KAAKhD,MAAMmuH,YAAc,IAIlE,OAAInrH,KAAKhD,MAAMusE,sBAAmD,IAAzBvpE,KAAKhD,MAAM0tE,WAE5CptE,IAAAA,cAAA,OACIjJ,GAAG,iBACH6jD,IAAKl4C,KAAKynI,kBACV/8H,MAAOk9H,EACPrqI,UAAWk3C,IAAW,cAAe,eAAgB,CACjDugB,OAAiC,WAAzBh1D,KAAKhD,MAAM8tD,aAGvBxtD,IAAAA,cAACwqI,EAAAA,KAAI,CACDzzI,GAAG,oBACH0zI,iBAAkB,EAClBC,WAAW,EACXC,cAAc,EACdC,eAAe,GAEf5qI,IAAAA,cAAC+pI,GAAiB,CAACvF,uBAAwB9hI,KAAK8hI,yBAChDxkI,IAAAA,cAAC6qI,EAAAA,IAAG,CACAC,SAAU,EACV58H,MACIlO,IAAAA,cAAA,OAAKC,UAAW,gCACZD,IAAAA,cAAC2sH,GAAAA,EAAS,CACN1sH,UAAU,yBACV,eAAa,IAEjBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,YAI3BmhI,eAAe,EACfG,aAAc,oBAEd/qI,IAAAA,cAACqkI,GAAW,CACRlhI,OAAQT,KAAKpK,MAAM6K,OACnBgqE,aAAczqE,KAAKhD,MAAMytE,aACzBo3D,mBAAoB7hI,KAAK6hI,mBACzBC,uBAAwB9hI,KAAK8hI,0BAGrCxkI,IAAAA,cAAC6qI,EAAAA,IAAG,CACAC,SAAU,EACV58H,MACIlO,IAAAA,cAAA,OAAKC,UAAW,gCACZD,IAAAA,cAACgrI,GAAO,CACJ/qI,UAAU,yBACV,eAAa,IAEjBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,UAI3BmhI,eAAe,EACfG,aAAc,oBAEd/qI,IAAAA,cAACgqI,GAAS,CACN7mI,OAAQT,KAAKpK,MAAM6K,OACnB8nI,kBAAmBvoI,KAAKuoI,kBACxB79D,WAAY1qE,KAAKhD,MAAM0tE,WACvBm3D,mBAAoB7hI,KAAK6hI,wBAS7CvkI,IAAAA,cAAA,OACIjJ,GAAG,cACHqW,MAAOk9H,EACPrqI,UAAWk3C,IAAW,cAAe,eAAgB,uBAAwB,CACzEugB,OAAiC,WAAzBh1D,KAAKhD,MAAM8tD,aAGvBxtD,IAAAA,cAAC+pI,GAAiB,CAACvF,uBAAwB9hI,KAAK8hI,yBAChDxkI,IAAAA,cAACqkI,GAAW,CACRlhI,OAAQT,KAAKpK,MAAM6K,OACnBgqE,aAAczqE,KAAKhD,MAAMytE,aACzBo3D,mBAAoB7hI,KAAK6hI,mBACzBC,uBAAwB9hI,KAAK8hI,uBAC7BC,sBAAuB/hI,KAAKhD,MAAM+kI,wBAIlD,E,iaACHjiI,GAnJoBynI,GAAe,aAhBhC38D,YAAWxnE,IAAAA,OACXunE,UAASvnE,IAAAA,OACT+nH,WAAU/nH,IAAAA,OACV0nD,UAAS1nD,IAAAA,MAAA,CAAI,MAAQ,SAAW,OAAS,UACzCokI,aAAYpkI,IAAAA,KAAAC,WACZonE,aAAYrnE,IAAAA,KAAAC,WACZqnE,WAAUtnE,IAAAA,KACV2+H,sBAAqB3+H,IAAAA,KACrBmmE,gBAAenmE,IAAAA,OAAAtD,GAQEynI,GAAe,eAGV,CAClB38D,YAAa,EACbD,UAAW,EACXwgD,WAAY,ICRL,MAAM3gD,WAA2BltE,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,4BAkBjD0oI,EAAAA,EAAAA,IAAQ,CAACC,EAAct/H,KACzC,IAAIu/H,EAAwB3lH,EAAAA,GAAUmoG,kCAEtC,OAAK/hH,GAIDs/H,IACAC,EAAwB15H,OAAO2hB,WAAa83G,EAAa9jF,wBAAwB2H,KAAOvpC,EAAAA,GAAU4lH,iCAE9FD,EAAwB3lH,EAAAA,GAAUmoG,oCAClCwd,EAAwB3lH,EAAAA,GAAUmoG,oCAInCwd,GAXIA,CAWiB,KAC9B5oI,GAAA,qBAEa0oI,EAAAA,EAAAA,IAAQ,CAAC1wE,EAAQ8wE,EAAoBC,EAAoBzd,EAA2BjiH,IAC1FA,GAID2uD,ECtEL,SACHgxE,EACAC,EACAH,EACAC,EACAG,GAEA,IAAIl+E,EASJ,OANIA,EADAg+E,EAAalkF,IAAMgkF,EACP,MACLG,EAAcD,EAAa9zE,QAAU6zE,GAAsBD,GACtD,SAEAI,GAAsB,OAE/Bl+E,CACX,CDuDmBm+E,CADcnxE,EAAOnT,wBACgB31C,OAAO+5H,YAAaH,EAAoBC,EAAoBzd,GALjG,QASb,CAEFnoH,MAAAA,GAAS,IAAAimI,EAAArB,EACL,MAAM,OAAC/vE,EAAM,YAAE8S,EAAW,mBAAEg+D,EAAkB,mBAAEC,EAAkB,0BAAEzd,EAAyB,KAAEjiH,EAAI,aAAEggI,GAAgBnpI,KAAKhD,MACpH0rI,OAA+C,IAAhB99D,EAA8B5qE,KAAKopI,oBAAoBtxE,IAAU3uD,GAAQyhE,EACxG9f,EAAY9qD,KAAKqpI,aAAavxE,IAAU8wE,EAAoBC,EAAoBzd,EAA2BjiH,GAEjH,OACI7L,IAAAA,cAACgsI,EAAAA,QAAO,CACJngI,KAAMA,EACN2hD,UAA+B,QAAtBo+E,EAAElpI,KAAKhD,MAAM8tD,iBAAS,IAAAo+E,EAAAA,EAAIp+E,EACnCy+E,WAAYJ,EACZl/H,OAAQjK,KAAKhD,MAAMiN,OACnB6tD,OAAQA,EACR0xE,WAAW,EACXt/H,SAAoB,QAAZ29H,EAAE7nI,KAAKhD,aAAK,IAAA6qI,OAAA,EAAVA,EAAY39H,UAEtB5M,IAAAA,cAACiqI,GAAe,CACZh+D,gBAAiBvpE,KAAKhD,MAAMusE,gBAC5Bi+D,aAAcxnI,KAAKhD,MAAMiN,OACzBwgE,aAAczqE,KAAKhD,MAAMytE,aACzBC,WAAY1qE,KAAKhD,MAAM0tE,WACvBE,YAAa89D,EACb/9D,UAAW3qE,KAAKhD,MAAM2tE,UACtBwgD,WAAYnrH,KAAKhD,MAAMmuH,WACvB4W,sBAAuB/hI,KAAKhD,MAAM+kI,wBAIlD,EACH0H,GA7EoBj/D,GAEjB1qE,GAFiB0qE,GAAkB,8BAGE,KAAG1qE,GAHvB0qE,GAAkB,8BAIE,KAGrC1qE,GAPiB0qE,GAAkB,2BAQD,KAAG1qE,GARpB0qE,GAAkB,2BASD,KAElC1qE,GAXiB0qE,GAAkB,eAYb,CAClBo+D,mBAAoBp+D,GAAmBk/D,4BACvCb,mBAAoBr+D,GAAmBm/D,4BACvCpgE,iBAAiB,IEhCzB,MAIA,IAJkBnkE,EAAAA,EAAAA,UANlB,SAAyBxP,GACrB,MAAO,CACHuzI,cAAc7kF,EAAAA,EAAAA,IAAgB1uD,GAEtC,GAMA,CAAyB40E,G,gHCjBlB,MCcDo/D,EAAiB5sI,IACnB,MAAM6sI,EAAoB7sI,EAAM8sI,aDfVC,EAACC,EAAsCn+H,IACxDm+H,EAK2B,QAAzBA,EAAct/C,QAFe,IAAzB7+E,EAAI2gB,QAAQ,QCWwBu9G,CAAW/sI,EAAMgtI,cAAehtI,EAAM6O,KACrF,IAAIA,GAAMo+H,EAAAA,EAAAA,IAAYjtI,EAAM6O,IAAK7O,EAAMktI,eAIvC,OAHKL,IACDh+H,EAAM,IAEFvO,IAAAA,cAAAA,IAAAA,SAAA,KAAGN,EAAM20D,SAAS9lD,GAAQ,EACpC+9H,EAAAjkI,UAAA,CAdEgsD,SAAQvuD,IAAAA,KAAAC,WACRymI,WAAU1mI,IAAAA,KAAAC,WACV6mI,cAAa9mI,IAAAA,KAAAC,WAEbwI,IAAGzI,IAAAA,OAAAC,YAYP,SAAewpD,EAAAA,EAAAA,MAAK+8E,GCRpB,GAAexkI,EAAAA,EAAAA,UATf,SAAyBxP,GACrB,MAAMqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GAEzB,MAAO,CACHk0I,WAAkC,SAAtB7xI,EAAOkyI,WACnBD,cAAwC,SAAzBjyI,EAAOmyI,cAE9B,GAEA,CAAwCR,E,iJCOxC,MAAMS,EAAgB50I,IAIT,IAJU,SACnBogB,EAAQ,WACRi0H,EAAU,eACVQ,GACI70I,EACJ,MAAM,GAACpB,EAAE,UAAEk2I,EAAWC,kBAAmBC,EAAe,MAAE9+H,EAAQ,EAAC,OAAEC,EAAS,GAAMiK,EAC9E60H,EAAY70H,EAAsB80H,WAAc90H,EAAsDrd,KAE5G,IAAIA,EAAO0b,EAAAA,GAAU02H,MAOrB,GANIL,EACA/xI,GAAOqyI,EAAAA,EAAAA,IAAYN,GACZG,IACPlyI,GAAOsyI,EAAAA,EAAAA,IAAoBJ,IAG3Br2I,IAAOi2I,EAAgB,CACvB,GAAI9xI,IAAS0b,EAAAA,GAAU62H,MAAO,CAC1B,IAAIxtI,EAAY,aAEZoO,EAAQoX,EAAAA,GAAUioH,iBAAmBp/H,EAASmX,EAAAA,GAAUkoH,iBACxD1tI,GAAa,SAEbA,GAAa,UAGjB,IAAI2tI,GAAeC,EAAAA,EAAAA,IAAoB92I,GAKvC,OAJIk2I,IAAaa,EAAAA,EAAAA,IAAWb,KAAeE,IACvCS,GAAeG,EAAAA,EAAAA,IAAWh3I,IAI1BiJ,IAAAA,cAAA,OACIC,UAAWA,EACXmN,MAAO,CACHmsH,gBAAiB,OAAF54H,OAASitI,EAAY,KACpCpU,eAAgB,UAIhC,CAAO,GAAIyT,IAAcr2H,EAAAA,GAAUo3H,KAAOxB,EACtC,OACIxsI,IAAAA,cAAA,OACIoO,IAAK,uBACLnO,UAAU,oBACVsO,KAAKw/H,EAAAA,EAAAA,IAAWh3I,IAIhC,CAEA,OAAOiJ,IAAAA,cAAA,OAAKC,UAAW,cAAeguI,EAAAA,EAAAA,IAAiB/yI,IAAQ,EACjE6xI,EAAA1kI,UAAA,CAxDEmkI,WAAU1mI,IAAAA,KAAAC,WAEVinI,eAAclnI,IAAAA,MAwDlB,SAAeypD,EAAAA,EAAAA,MAAKw9E,GC/DpB,GAAejlI,EAAAA,EAAAA,UANf,SAAyBxP,GACrB,MAAO,CACHk0I,WAA4C,UAAhC/sH,EAAAA,EAAAA,IAAUnnB,GAAOu0I,WAErC,GAEA,CAAwCE,E,yHCXzB,SAASmB,EAAexuI,GACnC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,qBAEvEzJ,IAAAA,cAAA,KACIogD,KAAK,UACLoB,SAAS,WAETxhD,IAAAA,cAAA,KACI0gD,UAAU,uCACVc,SAAS,UACTpB,KAAK,WAELpgD,IAAAA,cAAA,KAAG0gD,UAAU,oCACT1gD,IAAAA,cAAA,KAAG0gD,UAAU,qCACT1gD,IAAAA,cAAA,QAAM4gD,EAAE,q5BAQxC,C,2CCce,MAAMutF,UAAwBnuI,IAAAA,cACzC2F,MAAAA,GACI,MAAM,YACFyoI,EAAW,SACX/5E,EAAQ,eACRg6E,EAAc,SACd91H,EAAQ,iBACR+1H,EAAgB,UAChBC,GACA7rI,KAAKhD,MAEH8uI,EAAWj2H,EAASpY,KACpBsuI,GAAkBC,EAAAA,EAAAA,IAAaF,GAErC,IAAIG,EA0CJ,OAxCIA,EADAN,EAEIruI,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOsgI,GAEPxuI,IAAAA,cAAA,KACIm2C,KAAK,IACL7mC,QAASg/H,EACTruI,UAAU,mBACV2uI,IAAI,uBAEJ5uI,IAAAA,cAACkuI,EAAc,CAACjuI,UAAU,SACzBwuI,IAINL,EAEHpuI,IAAAA,cAAA,OAAKC,UAAWsuI,GAAa,oBACzBvuI,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,OAAOgB,EAAAA,EAAAA,eAAc,CAACnY,GAAI,8BAA+B0S,eAAgB,cAEzEzJ,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,MAAM04F,EAAAA,EAAAA,IAAmBt2H,EAASxhB,IAClC,cAAY6hB,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,8BAA+B0S,eAAgB,aAAaxG,cAC7F6rI,SAAUN,EACVr8H,SAAS,oBAERkiD,GAAYo6E,KAOzBzuI,IAAAA,cAAA,QAAMC,UAAU,oBACXwuI,GAKLE,CACZ,E,EAzDiBR,E,EAAe,Y,EAAA,CAvBhCG,iBAAgBxoI,IAAAA,KAKhBuoI,eAAcvoI,IAAAA,KAKdsoI,YAAWtoI,IAAAA,KAKXuuD,SAAQvuD,IAAAA,KAKRyoI,UAASzoI,IAAAA,S,qrBCrCE,SAASipI,IAAkB,IAAAC,EACtC,MAAMzlI,GAAOiQ,EAAAA,EAAAA,WAEb,OACIxZ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,sCACVsJ,EAAKC,cAAc,CAChBzS,GAAI,+CACJ0S,eAAgB,sCAGxBzJ,IAAAA,cAAA,OAAKC,UAAU,4CACVsJ,EAAKC,cACF,CACIzS,GAAI,qDACJ0S,eAAgB,+GAEpB,CACIwlI,cAAcz3B,EAAAA,EAAAA,KAAkC,QAAvBw3B,GAAA5+C,EAAAA,EAAAA,KAAe,GAAGhiE,aAAK,IAAA4gH,OAAA,EAAvBA,EAAyBz3B,gBAAiB,EAAGhuG,EAAKkuG,iBAMnG,C,yBCwBe,SAASy3B,EAAexvI,GACnC,MAAMi9G,GAAU9wD,EAAAA,EAAAA,SAAO,IAEjB,cAACriD,IAAiBgQ,EAAAA,EAAAA,YAEjBxB,EAAQm3H,IAAa51H,EAAAA,EAAAA,WAASg0H,EAAAA,EAAAA,IAAY7tI,EAAM6Y,SAAS00H,aAAer2H,EAAAA,GAAU62H,QAClF2B,EAAiBC,IAAsB91H,EAAAA,EAAAA,WAAS,IAChD+1H,EAAUC,IAAeh2H,EAAAA,EAAAA,WAAS,IAClCunD,EAAQ0uE,IAAaj2H,EAAAA,EAAAA,WAAS,GAE/Bk2H,GAAY5jF,EAAAA,EAAAA,QAAiC,MAE7C6jF,EAAoBA,KAClB/yB,EAAQlqG,SACR08H,GAAU,EACd,EAGEQ,EAAYA,KACd,MAAMp3H,EAAW7Y,EAAM6Y,SACvB,GAAIA,EAASq3H,SAGT,OAEJ,MAAMC,GAAWtC,EAAAA,EAAAA,IAAYh1H,EAAS00H,WAEtC,IAAKvtI,EAAMowI,iBACP,GAAID,IAAaj5H,EAAAA,GAAU62H,MAAO,CAC9B,MAAMG,GAAeC,EAAAA,EAAAA,IAAoBt1H,EAASxhB,KAElDg5I,EAAAA,EAAAA,IAAUnC,EAAc8B,EAC5B,MAAWn3H,EAAS00H,YAAcr2H,EAAAA,GAAUo3H,KAAOtuI,EAAM8sI,aACrDuD,EAAAA,EAAAA,KAAUhC,EAAAA,EAAAA,IAAWx1H,EAASxhB,IAAK24I,EAE3C,GAGJtqF,EAAAA,EAAAA,YAAU,KACDgqF,IACDC,GAAmB,GACnBM,IACJ,GACD,CAACP,KAEJhqF,EAAAA,EAAAA,YAAU,MACDptC,GAAUtY,EAAM6Y,SAASxhB,IAC1B44I,GACJ,GACD,CAACjwI,EAAM6Y,SAASxhB,GAAIihB,KAEvBotC,EAAAA,EAAAA,YAAU,IACC,KACHu3D,EAAQlqG,SAAU,CAAK,GAE5B,KAEH2yC,EAAAA,EAAAA,YAAU,KACF1lD,EAAM6Y,SAASxhB,IACfo4I,GAAU5B,EAAAA,EAAAA,IAAY7tI,EAAM6Y,SAAS00H,aAAer2H,EAAAA,GAAU62H,SAAW/tI,EAAM8sI,YAAc9sI,EAAM6Y,SAAS00H,YAAcr2H,EAAAA,GAAUo3H,KACxI,GACD,CAACtuI,EAAM6Y,SAAS00H,UAAWvtI,EAAM6Y,SAASxhB,GAAI2I,EAAM8sI,aAEvD,MAAMwD,EAAqB7wI,IACvBA,EAAEyK,iBACFzK,EAAEy0D,kBAEEl0D,EAAM6Y,SAASq3H,UAAYlwI,EAAMstI,iBAIjC,SAAU7tI,EAAEq7D,QACXr7D,EAAEq7D,OAAuB+N,OAG1B7oE,EAAM4uI,kBACN5uI,EAAM4uI,iBAAiB5uI,EAAMiP,OACjC,EAGEshI,EAAwBt+H,IAAkB,IAAAu+H,EACd,QAA9BA,EAAAxwI,EAAMywI,gCAAwB,IAAAD,GAA9BA,EAAAh/H,KAAAxR,EAAiCiS,GACjC49H,EAAY59H,GAERA,GACAy+H,GACJ,EAGEA,EAAkBA,KAAM,IAAAC,EAC1B,IAAKZ,EAAUh9H,QACX,OAGJ,MAAM69H,EAA8B,QAApBD,EAAGZ,EAAUh9H,eAAO,IAAA49H,OAAA,EAAjBA,EAAmBhpF,wBACtC,IAAIpG,EAEAA,OADyB,KAAlBqvF,aAAU,EAAVA,EAAYrvF,QACY,KAApBqvF,aAAU,EAAVA,EAAYhpF,KAAsB,EAAIgpF,aAAU,EAAVA,EAAYhpF,IAEzDgpF,aAAU,EAAVA,EAAYrvF,EAEpB,MAEMsvF,EAFe7+H,OAAO+5H,YAEM,GAC5B+E,EAAavvF,EAAIx7B,EAAAA,GAAUgrH,sBAC3BC,EAAiBH,GAAcC,EAAa/qH,EAAAA,GAAUkrH,kBAE5DnB,EAAUgB,EAAaE,EAAc,EAGnCE,EAAsBA,KACxBlxI,EAAMqD,QAAQ8P,UAAU,CACpBC,QAASC,EAAAA,GAAiB89H,sBAC1B59H,WAAY69H,EAAAA,EACZ59H,YAAa,CACT69H,OAAQrxI,EAAM6Y,SAASxhB,KAE7B,GAkFA,eAACs3I,EAAc,SAAE91H,GAAY7Y,EAEnC,IAAIsxI,EACAC,EACAC,EACJ,MAAMC,EAAiB,GAAAxwI,OAAG6I,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,mBAAkB,KAAA9I,OAAI4X,EAASpY,MAAO8C,cAmEhI,IAAI0rI,EACJ,GAlEKN,IACD2C,EACIhxI,IAAAA,cAAA,KACI,aAAYmxI,EACZlxI,UAAU,wBACVk2C,KAAK,IACL7mC,QAAS0gI,GAERh4H,IAAWtY,EAAMowI,iBACd9vI,IAAAA,cAAC+sI,EAAAA,EAAa,CACVx0H,SAAUA,EACVy0H,eAAgBttI,EAAMstI,iBAG1BhtI,IAAAA,cAAC+sI,EAAAA,EAAa,CACVx0H,SAAU7Y,EAAM6Y,SAChBy0H,gBAAgB,KAM5Bz0H,EAASq3H,WACToB,EACIhxI,IAAAA,cAACoxI,EAAAA,mBAAkB,CACftwI,KAAM,GACNuuD,MAAO,8CACP,cAAY,wBAKxB4hF,EACIjxI,IAAAA,cAAA,OACIC,UAAU,6BACVqP,QAAS0gI,GAEThwI,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,QACIC,UAAWk3C,IAAW,mBAAoB,CACtC,6BAA8B5+B,EAASq3H,YAG1Cr3H,EAASpY,MAEboY,EAASq3H,SAAW5vI,IAAAA,cAAA,QAAMC,UAAW,wBAElCD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAe,2BAEbzJ,IAAAA,cAAAA,IAAAA,SAAA,KACNA,IAAAA,cAAA,QAAMC,UAAU,oBAAoBsY,EAAS00H,UAAU9F,eACvDnnI,IAAAA,cAAA,QAAMC,UAAU,qBAAoBoxI,EAAAA,EAAAA,IAAiB94H,EAASzX,UAOzEyX,EAASq3H,UAAalwI,EAAM4xI,iBAC7BJ,EAnJoBK,MACxB,MAAM,iBAACC,EAAgB,SAAEj5H,EAAQ,gBAAEk5H,GAAmB/xI,EAEtD,IAAIgyI,EACJ,MAAMC,EAAe,GACjBH,GACAG,EAAa3/H,KACThS,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ,aAAW,eACX91G,IAAK6a,EAASxhB,GAAK,sBACnBuY,QAASshI,EACTx2H,UAAW5Q,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,sBAC/Ee,KAAMhB,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,yBAKtF,MAAM++D,EAAcipE,aAAe,EAAfA,EAAiBtuI,QAAQxD,GAASA,aAAI,EAAJA,EAAMiyI,MAAMr5H,KAAWlV,KAAK1D,GAE1EK,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAI4I,EAAK5I,GAAK,kBACd2G,IAAKiC,EAAK5I,GAAK,kBACfuY,QAASA,IAAM3P,aAAI,EAAJA,EAAMoa,OAAOxB,GAC5B/N,KAAM7K,EAAK6K,SAMvB,OADsBmnI,aAAY,EAAZA,EAAcvoI,UAAUo/D,aAAW,EAAXA,EAAap/D,UAKlCuoI,aAAY,EAAZA,EAAcvoI,UAAUo/D,aAAW,EAAXA,EAAap/D,UAE1DsoI,EACI1xI,IAAAA,cAAA,MACIjJ,GAAE,gBAAA4J,OAAkB4X,EAASxhB,GAAE,YAC/BkJ,UAAU,oBACV6M,KAAK,cAMb9M,IAAAA,cAACka,EAAAA,EAAW,CACRqjE,SAAU0yD,EACV4B,yBAAyB,GAEzB7xI,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO1E,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,kBAElFzJ,IAAAA,cAAA,UACI46C,IAAK60F,EACL14I,GAAE,sBAAA4J,OAAwBjB,EAAM6Y,SAASxhB,IACzC,aAAYyS,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,iBAAiBxG,cACxGhD,UAAWk3C,IACP,qBAAsB,YACtB,CAAC,eAAgBm4F,IAErB,gBAAeA,GAEftvI,IAAAA,cAAA,KAAGC,UAAU,8BAGrBD,IAAAA,cAAC4Z,EAAAA,EAAI,CACD7iB,GAAE,iBAAA4J,OAAmBjB,EAAM6Y,SAASxhB,IACpCqjB,UAAW,YACXD,UAAU,EACV2mD,OAAQA,GAEP6wE,EACAD,EACAlpE,KA3CF,IA6CO,EAwEA+oE,KAKlB7xI,EAAMoyI,mBAAqBv5H,EAASq3H,SACpCjB,EACI3uI,IAAAA,cAACmuI,EAAAA,EAAe,CACZ51H,SAAUA,EACV81H,eAAgBA,EAChBD,YAAa1uI,EAAMoyI,iBACnBxD,iBAAkB0B,EAClBzB,UAAW,wBAEXvuI,IAAAA,cAAA,KAAGC,UAAU,qCAGlB,GAAIsY,EAASq3H,UAAYvB,EAAgB,CAC5C,MAAMG,EAAWj2H,EAASpY,KACpBsuI,GAAkBC,EAAAA,EAAAA,IAAaF,GACrCwC,EACIhxI,IAAAA,cAACoxI,EAAAA,mBAAkB,CACftwI,KAAM,GACNuuD,MAAO,8CACP,cAAY,uBAGpBs/E,EACK3uI,IAAAA,cAAA,QAAMC,UAAU,6BACbD,IAAAA,cAAA,QAAMC,UAAU,iCACXwuI,GAELzuI,IAAAA,cAAA,QAAMC,UAAU,8BACXuJ,EAAc,CACXzS,GAAI,kDACJ0S,eAAgB,gBAIpC,CAEA,OACIzJ,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOlO,IAAAA,cAAC+uI,EAAe,MACvB1nI,UAAWkR,EAASq3H,UAEpB5vI,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,CAClB,qBACA,CAAC,YAAam4F,GACd,CAAC,+BAAgC/2H,EAASq3H,aAG7CoB,EACDhxI,IAAAA,cAAA,OAAKC,UAAU,uBACVgxI,EACAC,EACAvC,IAKrB,CAACO,EAAA7mI,UAAA,CA1VGsG,MAAK7I,IAAAA,OAAAC,WAKLuoI,iBAAgBxoI,IAAAA,KAKhBuoI,eAAcvoI,IAAAA,KACdknI,eAAclnI,IAAAA,KACdqqI,yBAAwBrqI,IAAAA,KACxBgqI,iBAAgBhqI,IAAAA,KAChBwrI,eAAcxrI,IAAAA,MCblB,MAIA,GAJkBgC,EAAAA,EAAAA,UAnBlB,SAAyBxP,EAAoB2hC,GACzC,MAAMt/B,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GAEzB,MAAO,CACHw5I,kBAAmB73G,EAAS83G,kBAAmBD,EAAAA,EAAAA,IAAiBn3I,GAChE6xI,WAAkC,SAAtB7xI,EAAOkyI,WACnB2E,iBAA8C,SAA5B72I,EAAOq3I,iBACzBP,iBAAiBQ,EAAAA,EAAAA,IAAgC35I,GAEzD,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAASA,EAAAA,GACVxc,GAEX,GAMA,CAAyB64I,E,4qBCHV,MAAMgD,UAAwBlyI,IAAAA,cAMzCsC,WAAAA,CAAY5C,GAAc,IAAAyyI,EAAAC,EACtB7vI,MAAM7C,GAAO8C,EAAA,gBANC,GAAKA,EAAA,oBAoCT,KACNE,KAAKi6G,SACLj6G,KAAKgH,SAAS,CAACsO,QAAQ,GAC3B,IACHxV,EAAA,yBAEmBrD,IAChBA,EAAEyK,iBAEFlH,KAAKhD,MAAMqD,QAAQ8P,UAAU,CACzBC,QAASC,EAAAA,GAAiBs/H,mBAC1Bp/H,WAAYq/H,EAAAA,EACZp/H,YAAa,CACTib,UAAW,CAACzrB,KAAKhD,MAAM6Y,UACvBoR,OAAQjnB,KAAKhD,MAAMiqB,OACnB4oH,WAAY,IAElB,IACL/vI,EAAA,8BAEwBrD,IAGrBA,EAAEy0D,kBACFlxD,KAAKhD,MAAMqD,QAAQyvI,sBAAsB9vI,KAAKhD,MAAMiqB,OAAO,IAC9DnnB,EAAA,0BAEmB,IACTE,KAAKhD,MAAMqD,QAAQ0vI,kBAAkB/vI,KAAKhD,MAAM6Y,SAASxhB,MAzDhE2L,KAAKpK,MAAQ,CACT0f,QAAQ,EACR06H,WAAY,CACRrkI,OAAqB,QAAd8jI,EAAAzyI,EAAM6Y,gBAAQ,IAAA45H,OAAA,EAAdA,EAAgB9jI,QAAS,EAChCC,QAAsB,QAAd8jI,EAAA1yI,EAAM6Y,gBAAQ,IAAA65H,OAAA,EAAdA,EAAgB9jI,SAAU,GAG9C,CAEA2sC,iBAAAA,GACIv4C,KAAKi6G,SAAU,CACnB,CAEA,+BAAO14G,CAAyBvE,EAAcpH,GAAc,IAAAq6I,EACqDC,EAAAC,EAA7G,OAAmB,QAAdF,EAAAjzI,EAAM6Y,gBAAQ,IAAAo6H,OAAA,EAAdA,EAAgBtkI,SAAU/V,EAAMo6I,WAAWrkI,OAAU3O,EAAM6Y,SAASjK,SAAWhW,EAAMo6I,WAAWpkI,OAC1F,CACHokI,WAAY,CACRrkI,MAAqB,QAAhBukI,EAAElzI,EAAM6Y,gBAAQ,IAAAq6H,OAAA,EAAdA,EAAgBvkI,MACvBC,OAAsB,QAAhBukI,EAAEnzI,EAAM6Y,gBAAQ,IAAAs6H,OAAA,EAAdA,EAAgBvkI,SAI7B,IACX,CAEA0xD,oBAAAA,GACIt9D,KAAKi6G,SAAU,CACnB,CAiCAh3G,MAAAA,GACI,MAAM,SAAC4S,EAAQ,eAAE81H,EAAc,cAAEyE,GAAiBpwI,KAAKhD,OACjD,OACFsY,GACAtV,KAAKpK,MAET,QAAiB0C,IAAbud,EACA,OAAOvY,IAAAA,cAAAA,IAAAA,SAAA,MAGX,MAAOktI,kBAAmBC,EAAe,GAAEp2I,GAAMwhB,EAC3Cw6H,GAAUhF,EAAAA,EAAAA,IAAWh3I,GACrBi8I,EAAa7F,GAAkB8F,EAAAA,EAAAA,IAAkBl8I,GAAMg8I,EAEvDG,EAAgB36H,EAASjK,OACzB6kI,EAAe56H,EAASlK,MAG9B,IAAI+kI,EAAkB,IAEjBD,EA9GuB,IA+GxBD,EA/GwB,OA2GMA,EAAgBC,EA1GpB,MAgH1BC,EAAkB,eAEdF,EAAgBC,IAChBC,GAAmB,2BAKvB/E,IACA+E,GAAmB,oBAGvB,MAAMr/G,EACF/zB,IAAAA,cAAA,UACItC,IAAI,SACJuC,UAAU,wCACV,gBAAeyC,KAAKhD,MAAM2zI,eAC1B,aAAW,0BACX/jI,QAAS5M,KAAK8vI,uBAEdxyI,IAAAA,cAAA,QACIC,UAAWk3C,IAAW,OAAQ,CAC1B,iBAAkBz0C,KAAKhD,MAAM2zI,eAC7B,mBAAoB3wI,KAAKhD,MAAM2zI,oBAMzCC,EACFtzI,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,eAAgB,CAClC,yBAA0Bz0C,KAAKhD,MAAM2zI,kBAGxCt/G,GACCrxB,KAAKhD,MAAM2zI,gBACTrzI,IAAAA,cAAA,OACI,cAAY,aACZC,UAAWk3C,IAAW,aAAc,CAChC,kBAAmBk3F,KAGvBruI,IAAAA,cAAA,OACIjJ,GAAG,kBACHuY,QAAS5M,KAAK4rI,kBAEb/1H,EAASpY,QAO9B,IAAIozI,EAAc,GACdC,EAAiB,GAGjBC,EAA2B,CAAC,EAC5BC,EAAsB,CAAC,EACvBC,EAAW,GAuBf,OA1BiBpG,EAAAA,EAAAA,IAAYh1H,EAAS00H,aAIrBr2H,EAAAA,GAAUo3H,MACvB2F,EAAW,MACPjxI,KAAKpK,MAAMo6I,WAAWpkI,OACtBmlI,EAA2B,CACvBplI,MAAO,QAGXqlI,EAAsB,CAClBplI,OAAQ,IACRylE,SAAU,SAKlB/7D,IACAu7H,EAAc,iBAGdT,IACAU,EAAiB,mBAIjBxzI,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,oBAAqBq8F,IAE3CxzI,IAAAA,cAAA,OACIC,UAAU,eAETqzI,EACA5wI,KAAKhD,MAAM2zI,gBACZrzI,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,kBAAmBq8F,GACzCpmI,MAAOsmI,GAEP1zI,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,eAAgBo8F,EAAaI,GACnDvmI,MAAOqmI,GAEPzzI,IAAAA,cAAA,OAAKC,UAAWk3C,IAAWq8F,IACvBxzI,IAAAA,cAAC4zI,EAAAA,EAAc,CACXtkI,QAAS5M,KAAK4rI,iBACdruI,UAAWk3C,IAAWi8F,EAAiBI,GACvCjlI,IAAKykI,EACLN,WAAYhwI,KAAKpK,MAAMo6I,WACvBn6H,SAAU7V,KAAKhD,MAAM6Y,SACrBw6H,QAASA,EACTc,cAAenxI,KAAKoxI,YACpBC,WAAYrxI,KAAKhD,MAAM2zI,eACvBW,2BAA2B,EAC3BxC,iBAAkB9uI,KAAKhD,MAAM8xI,iBAC7BiB,kBAAmB/vI,KAAK+vI,kBACxBwB,cAAevxI,KAAKhD,MAAM4xI,qBAS1D,EACH9uI,EAtNoB0vI,EAAe,eAEV,CAClB7D,gBAAgB,ICPxB,MAIA,GAJkBvmI,EAAAA,EAAAA,UApBlB,SAAyBxP,GAIrB,MAAO,CACH47I,WAJcv5H,EAAAA,EAAAA,GAAariB,GAK3Bk5I,iBAA8C,UAJnC/xH,EAAAA,EAAAA,IAAUnnB,GAII05I,iBAEjC,IAEA,SAA4B37I,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBwqI,sBAAqB,KACrB3/H,UAAS,IACT4/H,kBAAiBA,EAAAA,IAClBp8I,GAEX,GAMA,CAAyB67I,GCkEnB9kI,EAAQ,CACV+mI,qBAAsB,CAAC1a,UAAW,UC7BtC,GAJkB3xH,EAAAA,EAAAA,UA1ClB,WACI,MAAMssI,GAAqBC,EAAAA,EAAAA,MACrBC,GAAyBC,EAAAA,EAAAA,MAE/B,OAAO,SAAyBj8I,EAAoB2hC,GAChD,MAAMtQ,EAASsQ,EAAS5mB,KAAO4mB,EAAS5mB,KAAKtc,GAAK,GAElD,IAAIo3B,EAGAA,EADA8L,EAASu6G,cACGF,EAAuBh8I,EAAO2hC,EAAS5mB,MAEvC+gI,EAAmB97I,EAAOqxB,GAG1C,IAAI6vC,EAAY,EAShB,OARIv/B,EAAS5mB,KAAKqZ,UAAYuN,EAAS5mB,KAAKqZ,SAAS0B,MACjDorC,GAAav/B,EAAS5mB,KAAKqZ,SAAS0B,OAAS,IAAIhlB,OAC1C6wB,EAAS5mB,KAAKmZ,SACrBgtC,EAAYv/B,EAAS5mB,KAAKmZ,SAASpjB,OAC5B6wB,EAAS5mB,KAAKgnD,YACrBb,EAAYv/B,EAAS5mB,KAAKgnD,UAAUjxD,QAGjC,CACHojI,WAA4C,UAAhC/sH,EAAAA,EAAAA,IAAUnnB,GAAOu0I,WAC7B1+G,YACAqrC,YACA65E,gBAAgBA,EAAAA,EAAAA,IAAe/6I,EAAO2hC,EAAS5mB,KAAKtc,IACpDwsB,QAAQC,EAAAA,EAAAA,GAAiBlrB,GAEjC,CACJ,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAASA,EAAAA,GACVxc,GAEX,GAMA,ED/De,SAA4BqJ,GACvC,MAAM4uI,EAAoBmG,IACtB/0I,EAAMqD,QAAQ8P,UAAU,CACpBC,QAASC,EAAAA,GAAiBs/H,mBAC1Bp/H,WAAYq/H,EAAAA,EACZp/H,YAAa,CACTyW,OAAQjqB,EAAM2T,KAAKtc,GACnBo3B,UAAWzuB,EAAMyuB,UACjBokH,WAAYkC,IAElB,GAGA,eACFpG,EAAc,WACd7B,EAAU,UACVr+G,EAAS,UACTqrC,EAAS,OACTj2C,EAAM,cACNuvH,GACApzI,EAEEg1I,GAAkB/6H,EAAAA,EAAAA,UAAQ,KAAM+wD,EAAAA,EAAAA,IAAcv8C,EAAY,IAAIA,GAAa,GAAI5K,IAAS,CAAC4K,EAAW5K,IAE1G,GAAyB,IAArB4K,EAAU/kB,OACV,OAAO,KAGX,GAAI+kB,GAAkC,IAArBA,EAAU/kB,SAAiB+kB,EAAU,GAAGyhH,SAAU,CAC/D,MAAMC,GAAWtC,EAAAA,EAAAA,IAAYp/G,EAAU,GAAG8+G,WAE1C,GAAI4C,IAAaj5H,EAAAA,GAAU62H,OAAUoC,IAAaj5H,EAAAA,GAAUo3H,KAAOxB,EAC/D,OACIxsI,IAAAA,cAACkyI,EAAe,CACZ35H,SAAU4V,EAAU,GACpBklH,eAAgB3zI,EAAM2zI,eACtB1pH,OAAQjqB,EAAM2T,KAAKtc,GACnBs3I,eAAgBA,EAChByE,cAAeA,EACfxB,eAAgB5xI,EAAM4xI,gBAItC,MAAO,GAAkB,IAAd93E,GAAmB95D,EAAM2zI,iBAAmBllH,UAAAA,EAAY,IAC/D,OACInuB,IAAAA,cAAA,OAAKoN,MAAOA,EAAM+mI,uBAI1B,MAAMQ,EAAY,GAClB,GAAID,GAAmBA,EAAgBtrI,OAAS,EAC5C,IAAK,IAAIg5B,EAAI,EAAGA,EAAIsyG,EAAgBtrI,OAAQg5B,IAAK,CAC7C,MAAM7pB,EAAWm8H,EAAgBtyG,GAC3BwyG,EAAYr8H,EAASuL,UAAY,EACvC6wH,EAAU3iI,KACNhS,IAAAA,cAACkvI,EAAAA,EAAc,CACXxxI,IAAK6a,EAASxhB,GACdwhB,SAAUm8H,EAAgBtyG,GAC1BzzB,MAAOyzB,EACPksG,iBAAkBA,EAClBD,eAAgBA,EAChB8B,yBAA0BzwI,EAAMywI,yBAChC4B,gBAAiBryI,EAAMm1I,gBACvBvD,eAAgB5xI,EAAM4xI,eACtBxB,iBAAkB8E,EAClB5H,eAAgB4H,IAG5B,MACG,GAAIp7E,EAAY,EACnB,IAAK,IAAIp3B,EAAI,EAAGA,EAAIo3B,EAAWp3B,IAE3BuyG,EAAU3iI,KACNhS,IAAAA,cAAA,OACItC,IAAG,aAAAiD,OAAeyhC,GAClBniC,UAAU,wDAM1B,OACID,IAAAA,cAAA,OACI,cAAY,qBACZC,UAAU,gCAET00I,EAGb,G,yjBEvFe,MAAMG,UAA4B90I,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,qBACzD,KACXE,KAAKhD,MAAMq1I,aAAaryI,KAAKhD,MAAM7H,SAAS,GAC/C,CAED8N,MAAAA,GACI,IACIqvI,EACAjS,EACAkS,EAHAn9H,EAAU,EAId,MAAM,SAACS,EAAQ,SAAE1gB,GAAY6K,KAAKhD,MAElC,GAAI6Y,EAAU,CACVT,EAAUS,EAAST,QAAUS,EAAST,QAAU,EAChD,MAAMo9H,EAAa,KAAHv0I,OAAQmX,EAAQq9H,QAAQ,GAAE,MACpCtF,GAAWrC,EAAAA,EAAAA,IAAoBj1H,EAASrd,MAAQ,IACtD6nI,EAAe/iI,IAAAA,cAAA,OAAKC,UAAW,aAAeW,EAAAA,GAAuBivI,KAErEmF,EACIh1I,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACmuI,EAAAA,EAAe,CACZ51H,SAAUA,EACV81H,gBAAgB,EAChBD,aAAa,IAEjBpuI,IAAAA,cAAA,QAAMC,UAAU,4BACC,MAAZ6X,EACG9X,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,kBAGnBzJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,iBAEnBzJ,IAAAA,cAAA,YAAOk1I,MAOvBp9H,IACAm9H,EACIj1I,IAAAA,cAACo1I,EAAAA,YAAW,CACRn1I,UAAU,0BACV4d,IAAK/F,EACLvC,OAAoB,MAAZuC,IAIxB,CAEA,OACI9X,IAAAA,cAAA,OACI46C,IAAK/iD,EACL6F,IAAK7F,EACLoI,UAAU,kCACV,iBAAgBpI,GAEhBmI,IAAAA,cAAA,OAAKC,UAAU,yBACV8iI,GAEL/iI,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,OAAKC,UAAU,sBACV+0I,IAGTh1I,IAAAA,cAAA,WACIA,IAAAA,cAAA,KACIC,UAAU,uBACVqP,QAAS5M,KAAKqyI,cAEd/0I,IAAAA,cAAA,KAAGC,UAAU,sBAGpBg1I,GAIjB,EACHzyI,EApFoBsyI,EAAmB,aALpCC,aAAYjvI,IAAAA,KAAAC,WACZlO,SAAQiO,IAAAA,OAAAC,Y,kjBCgBG,MAAMylE,UAAoBxrE,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,qBAOhDzL,IAAe,IAAAs+I,EAAA9K,EACR,QAAnB8K,GAAA9K,EAAA7nI,KAAKhD,OAAM+rE,gBAAQ,IAAA4pE,GAAnBA,EAAAnkI,KAAAq5H,EAAsBxzI,EAAG,GAC5B,CAED4O,MAAAA,GACI,MAAM2vI,EAAwB,GA8E9B,GA5EA5yI,KAAKhD,MAAMyuB,UAAUzlB,SAAS2iE,IAC1B,MAAMnwE,EAAO0F,EAAAA,GAAkByqE,EAAK4hE,WAEpC,IACIlK,EADA9iI,EAAY,kCAEhB,GAAI/E,IAAS0b,EAAAA,GAAUo3H,KAAOtrI,KAAKhD,MAAM8sI,WACrCzJ,EACI/iI,IAAAA,cAAA,OACIoO,IAAK,eACLnO,UAAU,oBACVsO,KAAKw/H,EAAAA,EAAAA,IAAW1iE,EAAKt0E,WAG1B,GAAImE,IAAS0b,EAAAA,GAAU62H,MAAO,CACjC,IAAI8H,EAAiB,aAEhBlqE,EAAKh9D,OAASg9D,EAAKh9D,MAAQoX,EAAAA,GAAUioH,iBAAqBriE,EAAK/8D,QAAU+8D,EAAK/8D,OAASmX,EAAAA,GAAUkoH,iBAClG4H,GAAkB,SAElBA,GAAkB,UAGtB,IAAI3H,GAAeC,EAAAA,EAAAA,IAAoBxiE,EAAKt0E,IACxC6J,EAAAA,GAAiByqE,EAAK4hE,aAAe5hE,EAAK6hE,oBAC1CU,GAAeG,EAAAA,EAAAA,IAAW1iE,EAAKt0E,KAGnCgsI,EACI/iI,IAAAA,cAAA,OACIC,UAAWs1I,EACXnoI,MAAO,CACHmsH,gBAAiB,OAAF54H,OAASitI,EAAY,KACpCpU,eAAgB,UAIhC,MACIv5H,GAAa,eACb8iI,EAAe/iI,IAAAA,cAAA,OAAKC,UAAW,aAAeW,EAAAA,GAAuB1F,KAGzEo6I,EAAStjI,KACLhS,IAAAA,cAAA,OACItC,IAAK2tE,EAAKt0E,GACVkJ,UAAWA,GAEXD,IAAAA,cAAA,OAAKC,UAAU,yBACV8iI,GAEL/iI,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAACmuI,EAAAA,EAAe,CACZ51H,SAAU8yD,EACVgjE,gBAAgB,EAChBD,aAAa,IAEhB/iE,EAAK4hE,WAAajtI,IAAAA,cAAA,QAAMC,UAAU,oBAAoBorE,EAAK4hE,UAAU9F,eACtEnnI,IAAAA,cAAA,QAAMC,UAAU,oBAAoBW,EAAAA,GAAuByqE,EAAKvqE,SAGxEd,IAAAA,cAAA,WACKuM,QAAQ7J,KAAKhD,MAAM+rE,WAChBzrE,IAAAA,cAAA,KACIC,UAAU,uBACVqP,QAAS5M,KAAKqyI,aAAaj1C,KAAKp9F,KAAM2oE,EAAKt0E,KAE3CiJ,IAAAA,cAAA,KAAGC,UAAU,wBAMpC,IAGDyC,KAAKhD,MAAMi0C,mBAAqBjxC,KAAKhD,MAAMsqE,uBAAwB,CACnE,MAAMA,EAAyBtnE,KAAKhD,MAAMsqE,uBAC1CtnE,KAAKhD,MAAMi0C,kBAAkBjrC,SAAS7Q,IAClC,MAAM0gB,EAAWyxD,EAAuBnyE,GACpC0gB,GACA+8H,EAAStjI,KACLhS,IAAAA,cAAC80I,EAAAA,EAAmB,CAChBp3I,IAAK7F,EACLA,SAAUA,EACV0gB,SAAUA,EACVw8H,aAAcryI,KAAKqyI,eAG/B,GAER,CAEA,OACI/0I,IAAAA,cAAA,OAAKC,UAAU,2BACVq1I,EAGb,EACH9yI,EAjHoBgpE,EAAW,eACN,CAClBr9C,UAAW,GACXwlB,kBAAmB,GACnBq2B,uBAAwB,CAAC,ICjBjC,SAAeliE,EAAAA,EAAAA,UARf,SAAyBxP,GAGrB,MAAO,CACHk0I,WAAkC,UAHvB/sH,EAAAA,EAAAA,IAAUnnB,GAGFu0I,WAE3B,GAEA,CAAwCrhE,E,8ICGxC,MAAM8mE,GAAmB5wE,EAAAA,EAAAA,GAAmB,mBAAoB1hE,IAAAA,MAAuC,IAAM,iCAmB7G,GAAe8H,EAAAA,EAAAA,UAZf,SAAyBxP,EAAoB2hC,GACzC,MAAMt/B,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GAEzB,MAAO,CACHw5I,kBAAkBA,EAAAA,EAAAA,IAAiBn3I,GACnC62I,iBAA8C,SAA5B72I,EAAOq3I,iBACzBnG,cAAc7kF,EAAAA,EAAAA,IAAgB1uD,GAC9Bk9I,4BAA6Bl9I,EAAM+oE,QAAQ7hE,WAAWgsE,YACtDn4D,KAAM4mB,EAAS5mB,OAAQ8X,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAAStQ,QAAU,IAEjE,GAEA,CAAwC2oH,E,kNC9B3Bl6E,EAAwB,0BACxBF,EAA6B,+BAC7Bge,EAA0B,4BAC1Bu/D,EAAuB,aACvBC,EAA6B,+BAC7Bv9E,EAAmB,qBASnB8d,EAAqBv2E,IAC9B,IAAIi2I,EAAe,sBACO,UAAtBj2I,EAAMq2E,YACN4/D,GAAgB,sBACa,WAAtBj2I,EAAMq2E,cACb4/D,GAAgB,wBAGhBj2I,EAAM+qD,eACNkrF,GAAgB,mBAGpB,MAAMlnF,EAAO/uD,EAAMs2E,WAAa,WAEhC,OACIh2E,IAAAA,cAAA,OACIjJ,GAAI2I,EAAM3I,GACVkJ,UAAW01I,GAEX31I,IAAAA,cAAA,OAAKC,UAAU,mBACXD,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,kBAAmBsX,IAC1CzuD,IAAAA,cAAA,OACIC,UAAU,iBACVsO,IAAKqnI,EACLxnI,IAAI,GACJpC,QAAQ,SAEZhM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,gCAIzB,EAEZwsE,EAAA5tE,UAAA,CAzCE0tE,YAAWjwE,IAAAA,OAAAC,WACXhP,GAAE+O,IAAAA,OAAAC,WACF0kD,aAAY3kD,IAAAA,KACZkwE,UAASlwE,IAAAA,MAAA,CAAG,aAAe,a,gDCjB/B,Q,SAAgC,E,4ICOzB,MAAM+vI,UAAuBC,IAAAA,SAGhCxzI,WAAAA,GAAkC,IAAtByzI,EAAY9vI,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GACpB1D,QACAG,KAAKqzI,aAAeA,CACxB,CAEAn+D,IAAAA,CAAKzhC,EAAcjoC,EAAe1D,GAC9B,MAAMhN,GAAUiU,EAAAA,EAAAA,MACVukI,GAAexkI,EAAAA,EAAAA,IAAmB2kC,EAAM34C,GAE9C,OAAIkF,KAAKqzI,aACEvrI,EAfa,MAiBpB2rC,EAAK,GACE,YAAPx1C,OAAmBw1C,EAAK7mB,UAAU,EAAG6mB,EAAK/sC,QAAO,gDAAAzI,OAA+C6J,EAAI,QAEpGwrI,EACO,YAAPr1I,OAAmBw1C,EAAI,gDAAAx1C,OAA+C6J,EAAI,QAEvE,YAAP7J,OAAmBw1C,EAAI,MAAAx1C,OAAK6J,EAAI,OACpC,CAEAyrI,SAAAA,CAAUzrI,GACN,OAAOA,CACX,EAkBW,SAAS4/E,EAAwBjyF,GAKtC,IALuC,GAC7CpB,EAAE,eACF0S,EAAc,OACdjB,EAAM,aACNutI,GACI59I,EACJ,MAEM+9I,GAFO18H,EAAAA,EAAAA,WAEQhQ,cAAc,CAACzS,KAAI0S,kBAAiBjB,GAEnD2tI,EAAkBL,IAAOI,EAAS,CACpCE,QAAQ,EACRC,UAAU,EACVC,SAAU,IAAIT,EAAeE,KAGjC,OAAQ/1I,IAAAA,cAAA,QAAMu2I,wBAAyB,CAACC,OAAQL,IACpD,CAAC/rD,EAAA/hF,UAAA,CA9BG0tI,aAAYjwI,IAAAA,KACZ/O,GAAE+O,IAAAA,OACF0C,OAAM1C,IAAAA,SAAAA,IAAAA,K,ykBCvBK,MAAM2wI,UAAqBz2I,IAAAA,cAM/BsC,WAAAA,CAAY5C,GACf6C,MAAM7C,GAAO8C,EAAA,mBANKxC,IAAAA,aAAsCwC,EAAA,eAY5C,KACZE,KAAKgH,SAAS,CAACgtI,YAAY,IAC3Bh0I,KAAKhD,MAAMiN,QAAQ,IACtBnK,EAAA,iBAEiB,KACd,MAAMw7D,EAAWt7D,KAAKi0I,YAAYlkI,QAElC,GAAIurD,EAAU,CACVA,EAASt8C,QACTs8C,EAAS44E,kBAAkB,EAAGl0I,KAAKhD,MAAMk4E,KAAKxuE,QAE9C,IACI1G,KAAKgH,SAAS,CAACgtI,WAAYx0I,SAAS20I,YAAY,SACpD,CAAE,MAAOjgJ,GACL8L,KAAKgH,SAAS,CAACgtI,YAAY,GAC/B,CACJ,KAtBAh0I,KAAKpK,MAAQ,CACTo+I,YAAY,EAEpB,CAsBO/wI,MAAAA,GACH,IAAIC,EAAW,KACXlD,KAAKhD,MAAMkG,WACXA,EACI5F,IAAAA,cAAA,SACK0C,KAAKhD,MAAMkG,SACZ5F,IAAAA,cAAA,WACAA,IAAAA,cAAA,aAKZ,IAAI82I,EAAW,KAEX50I,SAAS60I,sBAAsB,UAC/BD,EACI92I,IAAAA,cAAA,UACIjJ,GAAG,oBACH,gBAAc,OACdmE,KAAK,SACL+E,UAAU,4BACVqP,QAAS5M,KAAKo0I,UAEd92I,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gBACH0S,eAAe,gBAM/B,MAAMutI,EACFh3I,IAAAA,cAAA,YACIjJ,GAAG,oBACHkJ,UAAU,oCACV26C,IAAKl4C,KAAKi0I,YACVlrC,IAAI,OACJjoG,MAAOd,KAAKhD,MAAMk4E,KAClBtoE,QAAS5M,KAAKo0I,SACd3lB,UAAU,IAIlB,IAAI8lB,EAAkB,KAatB,OAZIv0I,KAAKpK,MAAMo+I,aACXO,EACIj3I,IAAAA,cAAA,KAAGC,UAAU,sCACTD,IAAAA,cAACk3I,EAAAA,EAAW,MACZl3I,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,mBAO3BzJ,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,cAChBb,KAAMnJ,KAAKhD,MAAMmM,KACjBc,OAAQjK,KAAKiK,OACbC,SAAUlK,KAAKhD,MAAMkN,SACrBE,KAAK,OACL,kBAAgB,qBAEhB9M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CACTnW,GAAG,oBACHoW,aAAa,GAEbnN,IAAAA,cAAA,MAAIC,UAAU,eAAeyC,KAAKhD,MAAMwO,QAE5ClO,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACN7H,EACAoxI,GAELh3I,IAAAA,cAACyM,EAAAA,MAAMsB,OAAM,KACT/N,IAAAA,cAAA,UACIjJ,GAAG,uBACHmE,KAAK,SACL+E,UAAU,mBACVqP,QAAS5M,KAAKiK,QAEd3M,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,WAGtBqtI,EACAG,GAIjB,EACHz0I,EA9HoBi0I,EAAY,aAZ7B5qI,KAAI/F,IAAAA,KAAAC,WACJ4G,OAAM7G,IAAAA,KAAAC,WACN6G,SAAQ9G,IAAAA,KAAAC,WACRmI,MAAKpI,IAAAA,OAAAC,WACLH,SAAQE,IAAAA,OACR8xE,KAAI9xE,IAAAA,OAAAC,aAAAvD,EAOai0I,EAAY,eAEA,CACzB7wI,SAAU,OCVlB,MAAMuxI,EAAqBh/I,IAKd,IALe,QACxB4K,EAAO,OACPguI,EAAM,SACNnkI,EAAQ,KACRgrE,EAAO,IACHz/E,EACJ,MAAMoR,GAAOiQ,EAAAA,EAAAA,YACN3N,EAAMyN,IAAWC,EAAAA,EAAAA,WAAkB,IAE1C6rC,EAAAA,EAAAA,YAAU,KACNriD,EAAQ0vI,kBAAkB1B,EAAO,GAClC,IAEH,MAAMpkI,GAAS8M,EAAAA,EAAAA,cAAY,IAAMH,GAAQ,IAAQ,IAEjD,OACItZ,IAAAA,cAACy2I,EAAY,CACT5qI,KAAMA,EACNc,OAAQA,EACRC,SAAUA,EACVsB,MAAO3E,EAAKC,cAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,qBAC9E7D,SAAU2D,EAAKC,cAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,2FAChFmuE,KAAMA,GACR,EAERu/D,EAAA9uI,UAAA,CA7BEuE,SAAQ9G,IAAAA,KAAAC,WACRgrI,OAAMjrI,IAAAA,OAAAC,YA8BV,SAAewpD,EAAAA,EAAAA,MAAK4nF,GCRpB,GAJkBrvI,EAAAA,EAAAA,UAflB,SAAyBxP,GAAoB,IAAA8+I,EAEzC,MAAO,CACHx/D,KAF8D,QAArCw/D,EAAGC,EAAAA,GAA4B/+I,UAAM,IAAA8+I,OAAA,EAAlCA,EAAoCx/D,KAIxE,IAEA,SAA4BvhF,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxByqI,kBAAiBA,EAAAA,IAClBp8I,GAEX,GAMA,CAAyB8gJ,E,mGChBlB,SAASG,EAAmB18F,EAA2Cze,IAC1EipB,EAAAA,EAAAA,YAAU,KACN,SAASmyF,EAAY1/H,GACjB,MAAM2iD,EAAS3iD,EAAM2iD,OACjB5f,EAAInoC,SAAW+nD,aAAkBg9E,OAAS58F,EAAInoC,QAAQorD,SAASrD,IAC/Dr+B,GAER,CAIA,OADAj6B,SAASq7D,iBAAiB,YAAag6E,GAChC,KAEHr1I,SAASu7D,oBAAoB,YAAa85E,EAAY,CACzD,GACF,CAAC38F,EAAKze,GACb,CAEO,MAAMs7G,EAAoBA,KACtB1gG,EAAAA,EAAAA,aAAYzzB,EAAAA,IAGVo0H,EAA8BA,KAChC3gG,EAAAA,EAAAA,aAAY7T,EAAAA,IAGVk7E,EAAgBA,IAClB7xG,SAAQwqC,EAAAA,EAAAA,aAAsCh0B,EAAAA,I,mCCzCzD,MACA,EADuBs1B,IAAM,G,iECE7B,MAMMs/F,EAA6B,8CAC7BC,EAA8BD,EAA6B,wDAC3DE,EAAuCF,EAA6B,uDCP1E,EAF6B,IDatB,MAQHr1I,WAAAA,G,YAAc,K,GAPsB,G,kSAOtB,gB,wFACVI,KAAKo1I,qBAAuB51I,SAAS2tE,eAAe,4BACpDntE,KAAKq1I,wBAA0B71I,SAAS2tE,eAAe,+BACvDntE,KAAKs1I,wBAA0B91I,SAAS2tE,eAAe,2BAEvDntE,KAAKu1I,wBAA0Bv1I,KAAKu1I,wBAAwBn4C,KAAKp9F,MAEjEA,KAAKw1I,MACT,CAEQA,IAAAA,IACAn2B,EAAAA,EAAAA,MAEAr/G,KAAKy1I,WAITz1I,KAAK01I,0BAIL11I,KAAKgsD,QACT,CAEQupF,uBAAAA,CAAwBpgI,GACvBnV,KAAKq1I,0BA7C+B,qCAiDrClgI,EAAMwgI,eAhD+B,6BAgD+BxgI,EAAMwgI,eACrE31I,KAAK41I,YACN51I,KAAKq1I,wBAAwB93I,UAAY03I,EAIzC1sH,YAAW,KACPvoB,KAAKy1I,SAAS,GA9CQ,MAkDtC,CAEQC,uBAAAA,GACA11I,KAAKq1I,yBACLr1I,KAAKq1I,wBAAwBx6E,iBAAiB,eAAgB76D,KAAKu1I,wBAE3E,CAEQM,0BAAAA,GACA71I,KAAKq1I,yBACLr1I,KAAKq1I,wBAAwBt6E,oBAAoB,eAAgB/6D,KAAKu1I,wBAE9E,CAEQE,OAAAA,GACJz1I,KAAK61I,6BAED71I,KAAKo1I,uBACLp1I,KAAKo1I,qBAAqB/7E,SAC1Br5D,KAAKo1I,qBAAuB,MAG5Bp1I,KAAKs1I,0BACLt1I,KAAKs1I,wBAAwBj8E,SAC7Br5D,KAAKs1I,wBAA0B,MAG/Bt1I,KAAKq1I,0BACLr1I,KAAKq1I,wBAA0B,MAGnCr1I,KAAK41I,UAAY,IACrB,CAOO5pF,KAAAA,GACEhsD,KAAKo1I,sBAAyBp1I,KAAKq1I,yBAMxCr1I,KAAK41I,WAAY,EAEjB51I,KAAKo1I,qBAAqB73I,UAzGD,wCA0GzByC,KAAKq1I,wBAAwB93I,UAAY23I,GAPrClgH,QAAQhhC,MAAM,qEAQtB,CAEO8hJ,IAAAA,CAAKC,GACH/1I,KAAKo1I,sBAAyBp1I,KAAKq1I,0BAIxCr1I,KAAK41I,WAAY,EAEjB51I,KAAKo1I,qBAAqB73I,UAnHQ,8DAoHlCyC,KAAKq1I,wBAAwB93I,UAAY43I,GAEzCa,EAAAA,EAAAA,IAAiB,CACbv4I,KAAMw4I,EAAAA,GAAQC,aACdC,UAAW,EACXC,SAAS,EACTlnF,OAAQ,CACJmnF,UAAWN,KAGvB,E,8GEzHJ,MAAM7hB,EAAcl3H,GACZA,EAAMN,QAEFY,IAAAA,cAAA,OAAKC,UAAU,iBACXD,IAAAA,cAAA,KAAGC,UAAU,4BACbD,IAAAA,cAAA,YAAON,EAAMN,UAGdM,EAAMm3H,OAET72H,IAAAA,cAAA,OAAKC,UAAS,iCAAAU,OAAmCjB,EAAMm3H,OAAO37H,OAC1D8E,IAAAA,cAAA,KACIC,UAAWk3C,IAAW,QAADx2C,OAASjB,EAAMm3H,OAAO37H,MAAQ,CAC/C,qBAAsBwE,EAAMm3H,OAAO37H,OAAS6rH,EAAAA,GAAWiyB,QACvD,4BAA6Bt5I,EAAMm3H,OAAO37H,OAAS6rH,EAAAA,GAAW11G,MAC9D,2BAA4B3R,EAAMm3H,OAAO37H,OAAS6rH,EAAAA,GAAWkyB,KAC7D,aAAcv5I,EAAMm3H,OAAO37H,OAAS6rH,EAAAA,GAAW99F,YAGvDjpB,IAAAA,cAAA,YAAON,EAAMm3H,OAAOrzH,QAIzB,KACTozH,EAAAvuH,UAAA,CA5BEjJ,QAAO0G,IAAAA,QA8BX,S,sSCrBA,MAAMozI,EAAe/gJ,IASR,IATS,eAClBwwG,EAAiB,GAAE,eACnBC,EAAiB,GAAE,QACnB7qG,EAAU,GAAE,SACZ4E,EAAQ,GACR5L,EAAE,MACF6K,EAAK,SACLgE,EAAQ,MACRpC,GACIrL,EACJ,MAAMyoE,GAAqDnnD,EAAAA,EAAAA,cAAata,IACpEwD,EAAS5L,EAAIoI,EAAEq7D,OAAOh3D,MAAM,GAC7B,CAACb,EAAU5L,IAEd,OACIiJ,IAAAA,cAACm5I,EAAAA,EAAO,CACJv3I,MAAOA,EACP+mG,eAAgBA,EAChBC,eAAgBA,EAChBhjG,SAAUA,EACVwzI,QAASriJ,GAGLgH,EAAQsF,KAAIzF,IAA2B,IAAzB4F,MAAO2C,EAAM,KAAEqE,GAAK5M,EAC9B,OACIoC,IAAAA,cAAA,OACIC,UAAU,QACVvC,IAAKyI,GAELnG,IAAAA,cAAA,aACIA,IAAAA,cAAA,SACI9E,KAAK,QACLsI,MAAO2C,EACPhG,KAAMpJ,EACNiuH,QAAS7+G,IAAW3C,EACpBb,SAAUi+D,IAEbp2D,GAEH,IAIZ,EAIlB,GAAe+kD,EAAAA,EAAAA,MAAK2pF,G,waCXL,MAAMG,UAAsBr5I,IAAAA,cAGvCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,uBA0BS0D,IACtB,MAAM,KAAC/F,EAAI,WAAEq2B,GAAc9zB,KAAKhD,MAEhC,GAAmB,UAAf82B,EAAwB,CACxB,MAAMpzB,EAAO8C,EACbxD,KAAKhD,MAAMiD,SAASxC,EAAMiD,EAAKrM,IAC/B2L,KAAKgH,SAAS,CAAClG,MAAOJ,EAAK7C,UAC/B,MAAO,GAAmB,aAAfi2B,EAA2B,CAClC,MAAM5yB,EAAUsC,EAChBxD,KAAKhD,MAAMiD,SAASxC,EAAMyD,EAAQ7M,IAClC2L,KAAKgH,SAAS,CAAClG,MAAOI,EAAQ/D,cAClC,KAAO,CACH,MAAMsG,EAASD,EACfxD,KAAKhD,MAAMiD,SAASxC,EAAMgG,EAAO3C,OACjCd,KAAKgH,SAAS,CAAClG,MAAO2C,EAAOqE,MACjC,KAvCA,IAAI8uI,EAAc,GAElB,GADA52I,KAAK+lG,UAAY,GACE,WAAf/oG,EAAMxE,OACmB,UAArBwE,EAAM82B,WACN9zB,KAAK+lG,UAAY,CAAC,IAAI8wC,EAAAA,EAAoB75I,EAAMqD,QAAQC,oBAC5B,aAArBtD,EAAM82B,WACb9zB,KAAK+lG,UAAY,CAAC,IAAI+wC,EAAAA,EAAuB95I,EAAMqD,QAAQ02I,6BACpD/5I,EAAM3B,UACb2E,KAAK+lG,UAAY,CAAC,IAAIixC,EAAAA,EAAmBh6I,EAAM3B,WAG/C2B,EAAM8D,OAAS9D,EAAM3B,SAAS,CAC9B,MAAM47I,EAAgBj6I,EAAM3B,QAAQoN,MAC/BhF,GAAWA,EAAO3C,QAAU9D,EAAM8D,QAEvC81I,EAAcK,EAAgBA,EAAcnvI,KAAO,EACvD,CAGJ9H,KAAKpK,MAAQ,CACTkL,MAAO81I,EAEf,CAoBO3zI,MAAAA,GACH,MAAM,KACFxF,EAAI,QACJ4G,EAAO,YACPP,EAAW,MACXhD,EAAK,YACLa,EAAW,SACX1B,EAAQ,SACRiD,EAAQ,UACRW,EAAS,SACTgJ,EAAQ,QACRxR,EAAO,KACP7C,EAAI,UACJ8L,GACAtE,KAAKhD,MAET,IAAIgH,EAAsCF,EAEtCE,EADA6I,EAEIvP,IAAAA,cAAAA,IAAAA,SAAA,KACKwG,EAAc,IACfxG,IAAAA,cAAA,QAAMC,UAAU,6BACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,iBAO3BzJ,IAAAA,cAAAA,IAAAA,SAAA,KACKwG,EACDxG,IAAAA,cAAA,QAAMC,UAAU,cAAc,OAK1C,IAAI2G,EAAmChB,EAYvC,GAXIW,IACAK,EACI5G,IAAAA,cAAAA,IAAAA,SAAA,KACK4F,EACD5F,IAAAA,cAAA,OAAKC,UAAU,mBACVsG,KAMJ,SAATrL,GAA4B,aAATA,EAAqB,CACxC,IAAI0+I,EAOAC,EAOJ,OAZID,EADS,SAAT1+I,EACuB8L,GApIP,IAsIOA,GArIH,IA0IpB6yI,EADY,WAAZ9yI,GAAyC,iBAAVvD,EACfA,EAEAA,GAAmB,GAInCxD,IAAAA,cAACmH,EAAAA,EAAW,CACRC,UAAW1E,KAAKhD,MAAM0H,UACtBrQ,GAAIoJ,EACJjF,MAAgB,aAATA,EAAsB,WAAa6L,IAA0B,OACpEnF,MAAO8E,EACPM,UAAW4yI,EACXp2I,MAAOq2I,EACPx1I,YAAaA,EACbuB,SAAUgB,EACVjE,SAAUA,EACV2E,WAAW,GAGvB,CAAO,GAAa,WAATpM,EACP,OACI8E,IAAAA,cAACmoG,EAAAA,EAAoB,CACjBpxG,GAAIoJ,EACJsoG,UAAW/lG,KAAK+lG,UAChBL,WAAY1lG,KAAK6E,eACjB3F,MAAO8E,EACPd,SAAUgB,EACVvC,YAAaA,EACbb,MAAOd,KAAKpK,MAAMkL,MAClBoE,cAAeC,EAAAA,EACfghG,aAAa,WAGlB,GAAa,SAAT3tG,EAAiB,CACxB,MAAMuM,EAAYjE,EAClB,OACIxD,IAAAA,cAAC0H,EAAAA,EAAW,CACRN,UAAW1E,KAAKhD,MAAM0H,UACtBrQ,GAAIoJ,EACJyB,MAAO8E,EACPlD,MAAOiE,IAAa,EACpB7B,SAAUgB,EACVvC,YAAaA,GAAe,GAC5B1B,SAAUA,GAGtB,CAAO,GAAa,UAATzH,EAAkB,CACzB,MAAMgM,EAAY1D,EAClB,OACIxD,IAAAA,cAACk5I,EAAY,CACTniJ,GAAIoJ,EACJyB,MAAO8E,EACPd,SAAUgB,EACV7I,QAASA,EACTyF,MAAO0D,EACPvE,SAAUA,GAGtB,CAEA,OAAO,IACX,EACHH,EA1KoB62I,EAAa,aA3B9B7yI,YAAWV,IAAAA,OAAAC,WACX5F,KAAI2F,IAAAA,OAAAC,WACJ7K,KAAI4K,IAAAA,OAAAC,WACJgB,QAAOjB,IAAAA,OACPzB,YAAWyB,IAAAA,OACXF,SAAQE,IAAAA,OACRS,UAAST,IAAAA,KACTkB,UAASlB,IAAAA,OACT0wB,WAAU1wB,IAAAA,OACVyJ,SAAQzJ,IAAAA,KACR/H,QAAO+H,IAAAA,QAAAA,IAAAA,MAAA,CACH0E,KAAI1E,IAAAA,OAAAC,WACJvC,MAAKsC,IAAAA,OAAAC,cAETvC,MAAKsC,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,OAAAA,IAAAA,OACLnD,SAAQmD,IAAAA,KAAAC,WACRqB,UAAStB,IAAAA,KACT/C,QAAO+C,IAAAA,MAAA,CACH2zI,2BAA0B3zI,IAAAA,KAAAC,WAC1B/C,kBAAiB8C,IAAAA,KAAAC,aAAAA,aC3BzB,SAAe+B,EAAAA,EAAAA,SAAQ,MATvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxByxI,2BAA0B,KAC1Bz2I,kBAAiBA,EAAAA,IAClB3M,GAEX,GAEA,CAAiDgjJ,G,0BCNlC,SAASS,EAAsB3hJ,GAA+B,IAA9B,GAACpB,EAAE,MAAEyM,EAAK,SAAEqrB,GAAgB12B,EACvE,MAAM4hJ,EAAmBlzI,EAAAA,GACrBrD,EACA,CACI4yI,QAAQ,EACRC,UAAU,EACV2D,KAAK,EACLx8I,SAASiU,EAAAA,EAAAA,OAEbod,GAGJ,OACI7uB,IAAAA,cAAA,QACIjJ,GAAIA,EACJw/I,wBAAyB,CAACC,OAAQuD,IAG9C,C,w9BAACD,EAAAzxI,UAAA,CAvBGtR,GAAE+O,IAAAA,OAAAC,WACFvC,MAAKsC,IAAAA,OAAAC,YCyBM,MAAMynC,UAA0BxtC,IAAAA,cAC3CsC,WAAAA,CAAY5C,GAAc,IAAAoJ,EACtBvG,MAAM7C,GAAMoJ,EAAApG,KAAAF,EAAA,qBAsBDjM,UAA+C,IAAA0jJ,EAC1D96I,EAAEyK,iBAEF,MAAM,SAACb,GAAYrG,KAAKhD,MAClB8I,EAAS9F,KAAKpK,MAAMkQ,OACpBkC,EAAsC,CAAC,EAsB7C,GApBI3B,GACAA,EAASL,SAASwxI,IACd,MAAMxjJ,GAAQqT,EAAAA,EAAAA,GACVmwI,EACA1xI,EAAO0xI,EAAK/5I,OAEZzJ,IACAgU,EAAOwvI,EAAK/5I,MACRH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAIL,EAAMK,GACV0S,eAAgB/S,EAAM+S,eACtBjB,OAAQ9R,EAAM8R,SAG1B,IAIR9F,KAAKgH,SAAS,CAACgB,WAEoB,IAA/BtK,OAAO+I,KAAKuB,GAAQtB,OACpB,OAGJ,MAAM,IAACrI,EAAG,WAAEo5I,EAAU,MAAE7hJ,GAASoK,KAAKhD,MAEhCwtC,EAA2B,CAC7BnsC,MACAq5I,YAAaD,QAAAA,EAAc,GAC3B7hJ,MAAOA,QAAAA,EAAS,GAChB2R,WAAYzB,EACZiW,QAAS,GACTjL,WAAY,GACZgH,QAAS,GACT6/H,WAAW,GAGf33I,KAAKgH,SAAS,CAACQ,YAAY,IAE3B,MAAM,KAACvT,GAAgE,QAA3DsjJ,QAASv3I,KAAKhD,MAAMqD,QAAQu3I,wBAAwBptG,UAAO,IAAA+sG,EAAAA,EAAI,CAAC,EAE5Ev3I,KAAKgH,SAAS,CAACQ,YAAY,IAE3B,IAAIhB,GAAY,EAEZvS,IACIA,EAAKD,QACLwS,GAAY,EACZxG,KAAKgH,SAAS,CAAChT,MAAOC,EAAKD,SAI3BC,EAAK+T,QACLtK,OAAO+I,KAAKxS,EAAK+T,QAAQtB,QAAU,IACnCC,EAAAA,EAAAA,GAA2B1S,EAAK+T,OAAQ3B,KAExCG,GAAY,EACZxG,KAAKgH,SAAS,CAACgB,OAAQ/T,EAAK+T,WAI/BxB,GACDxG,KAAKiI,YAAW,EACpB,IACHnI,EAAA,eAEQ,KACLE,KAAKiI,YAAW,EAAM,IACzBnI,EAAA,mBAEY,WAAuB,IAAtBmJ,EAAS1F,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GACnB,MAAM,IAAClF,EAAG,WAAEo5I,EAAU,MAAE7hJ,EAAK,eAAEiiJ,GAAkBzxI,EAAKpJ,MAEtD,IAAKiM,GAAa4uI,EAAgB,CAC9B,MAAMrtG,EAA2B,CAC7BnsC,MACAq5I,YAAaD,QAAAA,EAAc,GAC3B7hJ,MAAOA,QAAAA,EAAS,GAChB+hJ,WAAW,EACX57H,QAAS,GACTjL,WAAY,GACZgH,QAAS,GACTvQ,WAAY,CAAC,GAGjBnB,EAAKpJ,MAAMqD,QAAQu3I,wBAAwBptG,EAC/C,CAEApkC,EAAKY,SAAS,CAACmC,MAAM,GACzB,IAACrJ,EAAA,iBAEU,CAACrC,EAAcqD,KACtB,MAAMgF,EAAM1R,EAAAA,EAAA,GAAO4L,KAAKpK,MAAMkQ,QAAM,IAAE,CAACrI,GAAOqD,IAC9Cd,KAAKgH,SAAS,CAAClB,UAAQ,IAxHvB,MAAMA,EAAoD,CAAC,EACrC,MAAlB9I,EAAMqJ,UACNrJ,EAAMqJ,SAASL,SAASvJ,IAGb,IAAAq7I,EAFQ,SAAXr7I,EAAEjE,KACFsN,EAAOrJ,EAAEgB,MAA4C,SAApC6nE,OAAO7oE,EAAE41D,SAAS9xD,cAEnCuF,EAAOrJ,EAAEgB,MAAiB,QAAZq6I,EAAGr7I,EAAE41D,eAAO,IAAAylF,EAAAA,EAAI,IAClC,IAIR93I,KAAKpK,MAAQ,CACTuT,MAAM,EACNrD,OAAAA,EACA9R,MAAO,KACPgU,OAAQ,CAAC,EACTR,YAAY,EAEpB,CAyGAvE,MAAAA,GACI,MAAM,MACFuI,EAAK,iBACLusI,EAAgB,QAChBC,EAAO,YACPC,EAAW,SACX5xI,GACArG,KAAKhD,MAET,IAWIK,EAXA8O,EACA7O,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,WAsBvB,OAlBIkxI,IACA9rI,EAAa8rI,GAIbD,IACA36I,EACIC,IAAAA,cAAA,OACIjJ,GAAG,2BACHqX,IAAK,mBACLnO,UAAU,oBACVoO,MAAM,KACNC,OAAO,KACPC,IAAKmsI,KAMb16I,IAAAA,cAACyM,EAAAA,MAAK,CACF1V,GAAG,yBACH2V,gBAAgB,0BAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiK,OACbC,SAAUlK,KAAKhD,MAAMkN,SACrBC,SAAS,SACTC,KAAK,OACL,kBAAgB,+BAEhB9M,IAAAA,cAAA,QACI+M,SAAUrK,KAAKsK,aACfC,aAAc,OAEdjN,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CACTC,aAAa,EACbC,MAAO,CAACC,aAA0B,MAAZtE,EAAmB,WAAQ/N,IAEjDgF,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,+BAEFgJ,EACAmO,KAGPnF,GAAY0xI,IACVz6I,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACNgtI,GACGz6I,IAAAA,cAAC85I,EAAsB,CACnB/iJ,GAAG,yCACHyM,MAAOi3I,EACP5rH,SAAUnsB,KAAKhD,MAAMmvB,WAG5B9lB,GACDA,EAAS1F,KAAI,CAAClE,EAAGwP,IAET3O,IAAAA,cAACq5I,EAAa,CACVjyI,UAAqB,IAAVuH,EACXjR,IAAK,gBAAkByB,EAAEgB,KACzBqG,YAAarH,EAAEU,aACfM,KAAMhB,EAAEgB,KACRjF,KAAMiE,EAAEjE,KACR6L,QAAS5H,EAAE4H,QACXnB,SAAUzG,EAAEy7I,UACZr0I,UAAW7D,KAAKpK,MAAMoS,OAAOvL,EAAEgB,MAC/BkE,YAAalF,EAAEkF,YACf2C,UAAW7H,EAAE8H,WACbuvB,WAAYr3B,EAAE07I,YACdtrI,SAAUpQ,EAAEoQ,SACZxR,QAASoB,EAAEpB,QACXyF,MAAOd,KAAKpK,MAAMkQ,OAAOrJ,EAAEgB,MAC3BwC,SAAUD,KAAKC,cAMnC3C,IAAAA,cAACyM,EAAAA,MAAMsB,OAAM,KACRrL,KAAKpK,MAAM5B,OACRsJ,IAAAA,cAAA,OAAKC,UAAU,cAAcyC,KAAKpK,MAAM5B,OAE5CsJ,IAAAA,cAAA,UACIjJ,GAAG,0BACHmE,KAAK,SACL+E,UAAU,iCACVqP,QAAS5M,KAAKiK,QAEd3M,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,YAGvBzJ,IAAAA,cAAC+O,EAAAA,EAAa,CACVhY,GAAG,0BACHmE,KAAK,SACLkM,WAAY2B,GAAgC,IAApBA,EAASK,OACjCnJ,UAAU,8BACV+O,SAAUtM,KAAKpK,MAAM4R,WACrB+E,aACIjP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,mBAItBoF,KAMzB,EACHrM,EAhQoBgrC,EAAiB,aAXlC5gC,SAAQ9G,IAAAA,OCmBZ,MAIA,GAJkBgC,EAAAA,EAAAA,UA5BlB,SAAyBxP,GACrB,MAAM3B,EAAO2B,EAAMuyB,SAASwiB,aAAaH,OACzC,OAAKv2C,GAASA,EAAKu2C,OAIZ,CACHnsC,IAAKpK,EAAKoK,IACVo5I,WAAYxjJ,EAAKu2C,OAAOktG,YACxBrxI,SAAUpS,EAAKu2C,OAAOnkC,SACtBmF,MAAOvX,EAAKu2C,OAAOh/B,MACnBusI,iBAAkB9jJ,EAAKu2C,OAAO4tG,kBAC9BJ,QAAS/jJ,EAAKu2C,OAAO6tG,SACrBJ,YAAahkJ,EAAKu2C,OAAO8tG,aACzBT,eAAgB5jJ,EAAKu2C,OAAO+tG,iBAC5B3iJ,MAAO3B,EAAKu2C,OAAO50C,MACnBu2B,UAAUsqG,EAAAA,EAAAA,IAAY7gI,IAbf,CAAC,CAehB,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBsyI,wBAAuBA,EAAAA,IACxBjkJ,GAEX,GAMA,CAAyBm3C,E,oRCtBlB,SAAS0tG,EAAmB7gJ,EAAgB6I,EAAsBi4I,GACrE,OAAO5kJ,MAAOF,EAAUsf,KAChBzS,EAAMkG,OAAS,SACT/S,EAASyG,EAAAA,GAAgCzC,EAAQ6I,EAAMG,KAAKyrG,GAAMA,EAAE/3G,OAE9E,MAAMuB,EAAQqd,IACRylI,EAAO,GACPC,EAAU,GACVr1B,EAAa,GACnB,IAAK,MAAM5iH,KAAQF,EAAO,CACtB,MAAMgY,GAASogI,EAAAA,EAAAA,IAAchjJ,EAAO+B,EAAQ+I,EAAKrM,KAC7CoK,EAAAA,EAAAA,GAAQiC,EAAKhC,OACbi6I,EAAQrpI,KAAK,CACT5O,OACAm4I,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,+BACJ0S,eAAgB,2DAGjByR,EACPmgI,EAAQrpI,KAAK,CACT5O,OACAm4I,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,gCACJ0S,eAAgB,4CAIxBu8G,EAAWh0G,KAAK5O,EAExB,CACA,GAAI4iH,EAAW58G,OAAS,EAAG,CACvB,MAAMgK,QAAiB/c,GAASmlJ,EAAAA,EAAAA,IAAenhJ,EAAQ2rH,EAAW3iH,KAAKyrG,GAAMA,EAAE/3G,OACzEoqC,EAAU/tB,EAASzc,MAAQ,GACjC,GAAIyc,EAAS1c,MACT,IAAK,MAAM+kJ,KAAaz1B,EACpBq1B,EAAQrpI,KAAK,CAAC5O,KAAMq4I,EAAWF,OAAQnoI,EAAS1c,MAAM0I,eAG1D,IAAK,MAAMq8I,KAAaz1B,EAAY,CAChC,MAAM01B,EAAkBv6G,EAAQh2B,MAAM+2B,GAA2BA,EAAEzjB,UAAYg9H,EAAU1kJ,IAAMmrC,EAAExrC,QAC7FglJ,EACAL,EAAQrpI,KAAK,CACT5O,KAAMq4I,EACNF,OAAQG,EAAgBhlJ,MAAM0I,UAGlCg8I,EAAKppI,KAAK,CACN5O,KAAMq4I,EACNF,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,+BACJ0S,eAAgB,6CAIhC,CAER,CACA,GAAI0xI,EAAO/xI,OAAS,EAAG,CACnB,IAAIgK,EACJ,IACIA,QAAiB/c,EAASyG,EAAAA,GAA6CzC,EAAQ8gJ,GACnF,CAAE,MAAOh8I,GACLiU,EAAW,CACPzc,KAAMwkJ,EAAO93I,KAAKlK,IAAK,CACnBA,QACAzC,MAAO,CACHA,OAAOwY,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,oDACJ0S,eAAgB,6CAKpC,CACA,MAAMkyI,EAAoBvoI,EAASzc,MAAQ,GAC3C,GAAIyc,EAAS1c,MAAO,CACuB,4CAAnC0c,EAAS1c,MAAMM,kBACfoc,EAAS1c,MAAM0I,SAAU8P,EAAAA,EAAAA,eAAc,CACnCnY,GAAI,6BACJ0S,eAAgB,wCAGxB,IAAK,MAAMtQ,KAASgiJ,EAChBE,EAAQrpI,KAAK,CACT7Y,QACAoiJ,OAAQnoI,EAAS1c,MAAM0I,SAGnC,MACI,IAAK,MAAMjG,KAASgiJ,EAAQ,CACxB,MAAMS,EAAkBD,EAAkBxwI,MAAMi3B,GAA2BjpC,EAAM8J,gBAAkBm/B,EAAEjpC,OAASipC,EAAE1rC,QAC5GklJ,GAAgD,yEAA7BA,EAAgBllJ,MAAMK,KAAiFmsC,EAAAA,EAAAA,IAAyB5qC,GACnJ+iJ,EAAQrpI,KAAK,CACT7Y,QACAoiJ,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,qCACJ0S,eAAgB,6EAEpBgZ,KAAMm2E,EAAAA,GAAaijD,OAEhBD,EACPP,EAAQrpI,KAAK,CACT7Y,QACAoiJ,OAAQK,EAAgBllJ,MAAM0I,UAGlCg8I,EAAKppI,KAAK,CACN7Y,QACAoiJ,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,6BACJ0S,eAAgB,wCAIhC,CAER,CACA,MAAO,CACH9S,KAAM,CACFykJ,OACAC,WAEP,CAET,CAyFO,SAASS,EACZzhJ,EACAwqB,EACA3hB,EACAi4I,EACA/7I,GAEA,OAAO7I,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRylI,EAAO,GACPC,EAAU,GACVl6G,GAAUC,EAAAA,EAAAA,IAA4B9oC,GACtCyjJ,QAAgBhxH,QAAQyuB,IAAIt2C,EAAMG,KAAKD,GAnG9C7M,eACHF,EACA+M,EACA/I,EACAwqB,EACAsc,GAEA,KAAKhgC,EAAAA,EAAAA,GAAQiC,EAAKhC,OACd,MAAO,CACHi6I,QAAS,CACLj4I,OACAm4I,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,mCACJ0S,eAAgB,oGAKhC,IAAIuyI,GAAc,EACdC,GAAc,EAElB,IAAK,MAAMr4I,KAAWihB,EACHsc,GAAWA,EAAQv9B,EAAQ7M,KAAOoqC,EAAQv9B,EAAQ7M,IAAIqM,EAAKrM,IAEtEklJ,GAAc,EAEdD,GAAc,EAItB,GAAIA,EACA,MAAO,CACHX,QAAS,CACLj4I,OACAm4I,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,4CACJ0S,eAAgB,2DAMhC,UACUpT,GAASmlJ,EAAAA,EAAAA,IAAenhJ,EAAQ,CAAC+I,EAAKrM,MAC5C,IAAK,MAAM6M,KAAWihB,EACHsc,GAAWA,EAAQv9B,EAAQ7M,KAAOoqC,EAAQv9B,EAAQ7M,IAAIqM,EAAKrM,WAEhEV,GAAS2vB,EAAAA,EAAAA,IAAY5iB,EAAKrM,GAAIsD,EAAQuJ,EAAQ7M,GAAI6M,EAAQzD,MAG5E,CAAE,MAAOhB,GACL,MAAO,CACHk8I,QAAS,CACLj4I,OACAm4I,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,uDACJ0S,eAAgB,8CAIhC,CAEA,OAAIwyI,EACO,CACHZ,QAAS,CACLj4I,OACAm4I,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,6CACJ0S,eAAgB,+DAKzB,CACH2xI,KAAM,CACFh4I,OACAm4I,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,2BACJ0S,eAAgB,6FAChBjB,OAAQ,CACJwM,MAAO6P,EAASzb,WAKpC,CAc8D8yI,CAAuB7lJ,EAAU+M,EAAM/I,EAAQwqB,EAAUsc,MAE/G,IAAK,MAAMzsB,KAAUqnI,EACb,SAAUrnI,GAAUA,EAAO0mI,MAC3BA,EAAKppI,KAAK0C,EAAO0mI,MAEjB,YAAa1mI,GAAUA,EAAO2mI,SAC9BA,EAAQrpI,KAAK0C,EAAO2mI,SAI5B,GAAIF,EAAO/xI,OAAS,EAAG,CACnB,IAAIgK,EACJ,IACIA,QAAiB/c,EAASyG,EAAAA,GAAsDzC,EAAQwqB,EAASxhB,KAAKs2B,GAAMA,EAAE5iC,KAAKokJ,EAAQ/7I,GAC/H,CAAE,MAAOD,GACLiU,EAAW,CACPzc,KAAMwkJ,EAAO93I,KAAKlK,IAAK,CACnBA,QACAzC,MAAO,CACHA,OAAOwY,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,uDACJ0S,eAAgB,kDAKpC,CAEA,GAAI2J,EAAS1c,MAAO,CACuB,4CAAnC0c,EAAS1c,MAAMM,kBACfoc,EAAS1c,MAAM0I,SAAU8P,EAAAA,EAAAA,eAAc,CACnCnY,GAAI,6BACJ0S,eAAgB,wCAGxB,IAAK,MAAMtQ,KAASgiJ,EAChBE,EAAQrpI,KAAK,CACT7Y,QACAoiJ,OAAQnoI,EAAS1c,MAAM0I,SAGnC,MACI,IAAK,MAAM+K,KAAQiJ,EAASzc,MAAQ,GAC5BwT,EAAIzT,MACiB,yEAAjByT,EAAIzT,MAAMK,KAAiFmsC,EAAAA,EAAAA,IAAyB5qC,GACpH+iJ,EAAQrpI,KAAK,CACT7Y,MAAOgR,EAAIhR,MACXoiJ,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,qCACJ0S,eAAgB,6EAEpBgZ,KAAMm2E,EAAAA,GAAaijD,OAGvBR,EAAQrpI,KAAK,CACT7Y,MAAOgR,EAAIhR,MACXoiJ,OAAQpxI,EAAIzT,MAAM0I,UAI1Bg8I,EAAKppI,KAAK,CACN7Y,MAAOgR,EAAIhR,MACXoiJ,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,iCACJ0S,eAAgB,wCAMxC,CACA,MAAO,CACH9S,KAAM,CACFykJ,OACAC,WAEP,CAET,CAEO,SAASc,EACZ9hJ,EACAwqB,EACA3hB,EACAi4I,EACA/7I,GAEA,OAAO7I,MAAOF,EAAUsf,KAChBzS,EAAMkG,OAAS,SAGT/S,EAASyG,EAAAA,GAAgCzC,EAAQ6I,EAAMG,KAAKyrG,GAAMA,EAAE/3G,OAE9E,MAAMuB,EAAQqd,IACRylI,EAAO,GACPC,EAAU,GACVr1B,EAAa,GACnB,IAAK,MAAM5iH,KAAQF,EAAO,CACtB,MAAMgY,GAASogI,EAAAA,EAAAA,IAAchjJ,EAAO+B,EAAQ+I,EAAKrM,KAC7CoK,EAAAA,EAAAA,GAAQiC,EAAKhC,OACbi6I,EAAQrpI,KAAK,CACT5O,OACAm4I,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,+BACJ0S,eAAgB,2DAGjByR,EACPmgI,EAAQrpI,KAAK,CACT5O,OACAm4I,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,gCACJ0S,eAAgB,4CAIxBu8G,EAAWh0G,KAAK5O,EAExB,CACA,GAAI4iH,EAAW58G,OAAS,EAAG,CACvB,MAAMgK,QAAiB/c,GAASmlJ,EAAAA,EAAAA,IAAenhJ,EAAQ2rH,EAAW3iH,KAAKyrG,GAAMA,EAAE/3G,OACzEoqC,EAAU/tB,EAASzc,MAAQ,GACjC,GAAIyc,EAAS1c,MACT,IAAK,MAAM+kJ,KAAaz1B,EACpBq1B,EAAQrpI,KAAK,CACT5O,KAAMq4I,EACNF,OAAQnoI,EAAS1c,MAAM0I,eAI/B,IAAK,MAAMq8I,KAAaz1B,EAAY,CAChC,MAAM01B,EAAkBv6G,EAAQh2B,MAAM+2B,GAA2BA,EAAEzjB,UAAYg9H,EAAU1kJ,IAAMmrC,EAAExrC,QAC7FglJ,EACAL,EAAQrpI,KAAK,CACT5O,KAAMq4I,EACNF,OAAQG,EAAgBhlJ,MAAM0I,UAGlCg8I,EAAKppI,KAAK,CACN5O,KAAMq4I,EACNF,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,+BACJ0S,eAAgB,6CAIhC,CAER,CACA,GAAI0xI,EAAO/xI,OAAS,EAAG,CACnB,IAAIgK,EACJ,IACIA,QAAiB/c,EACbyG,EAAAA,GACIzC,EACAwqB,EAASxhB,KAAKs2B,GAAMA,EAAE5iC,KACtBokJ,EACA/7I,GAGZ,CAAE,MAAOD,GACLiU,EAAW,CACPzc,KAAMwkJ,EAAO93I,KAAKlK,IAAK,CACnBA,QACAzC,MAAO,CACHA,OAAOwY,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,oDACJ0S,eAAgB,6CAKpC,CACA,MAAMkyI,EAAoBvoI,EAASzc,MAAQ,GAC3C,GAAIyc,EAAS1c,MAAO,CACuB,4CAAnC0c,EAAS1c,MAAMM,kBACfoc,EAAS1c,MAAM0I,SAAU8P,EAAAA,EAAAA,eAAc,CAACnY,GAAI,6BAA8B0S,eAAgB,wCAE9F,IAAK,MAAMtQ,KAASgiJ,EAChBE,EAAQrpI,KAAK,CACT7Y,QACAoiJ,OAAQnoI,EAAS1c,MAAM0I,SAGnC,MACI,IAAK,MAAMjG,KAASgiJ,EAAQ,CACxB,MAAMS,EAAkBD,EAAkBxwI,MAAMi3B,GAA2BjpC,EAAM8J,gBAAkBm/B,EAAEjpC,OAASipC,EAAE1rC,QAC5GklJ,EACiC,yEAA7BA,EAAgBllJ,MAAMK,KAAiFmsC,EAAAA,EAAAA,IAAyB5qC,GAChI+iJ,EAAQrpI,KAAK,CACT7Y,QACAoiJ,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,qCACJ0S,eAAgB,6EAEpBgZ,KAAMm2E,EAAAA,GAAaijD,OAGvBR,EAAQrpI,KAAK,CACT7Y,QACAoiJ,OAAQK,EAAgBllJ,MAAM0I,UAItCg8I,EAAKppI,KAAK,CACN7Y,QACAoiJ,QAAQrsI,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,6BACJ0S,eAAgB,wCAIhC,CAER,CACA,MAAO,CACH9S,KAAM,CACFykJ,OACAC,WAEP,CAET,C,0BCzbA,MAAMjmH,GAAkBssC,EAAAA,EAAAA,GAAmB,kBAAmB1hE,IAAAA,MAAW,IAAM,4DAEzEw+C,EAAiB,SAAC5mB,GAA+B,IAAjB75B,EAAOkI,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC7C,OAAK2xB,GAGEwkH,EAAAA,EAAAA,GAAoBxkH,EAAM75B,IAFtBugD,EAAAA,EAAAA,IAAY,EAAG,GAAIvgD,EAGlC,EAEMs+I,EAAiBA,CAAChiJ,EAAgBu9B,KAC7B0kH,EAAAA,EAAAA,IAAoBjiJ,EAAQu9B,GAOhC,SAASghG,EAAgBtgI,EAAoBoH,GAAiB,IAAA68I,EACjE,MAAM5hJ,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnB40B,GAAUC,EAAAA,EAAAA,IAAW70B,GACrBusB,GAAW23H,EAAAA,EAAAA,IAAyBlkJ,GAEpCmkJ,GAAiE,QAAzCF,GADP53H,EAAAA,EAAAA,IAAgCrsB,GACVmtB,EAAAA,GAAUuP,wBAAgB,IAAAunH,OAAA,EAAzCA,EAA2C18I,eAAgB4lB,EAAAA,GAAUi3H,wBAG7Fx2H,EAAgC,MADhBzL,EAAAA,EAAAA,IAAiBniB,IACKoH,EAAMmwG,iBAAkBhsF,EAAAA,EAAAA,IAAQvrB,EAAOoH,EAAMmwG,gBAAgBr1F,UAAW2L,EAAAA,EAAAA,IAAe7tB,GAC7HksB,GAAiBC,EAAAA,EAAAA,IAAkBnsB,GACnCqkJ,EAAoB93H,EAAS1hB,QAAQS,GACnCA,EAAQ1I,OAASuqB,EAAAA,GAAU0K,YAAcvsB,EAAQ1I,OAASuqB,EAAAA,GAAUC,aAGpE9hB,EAAQ1I,OAASuqB,EAAAA,GAAU0B,iBACpByF,EAAAA,EAAAA,IAAuBt0B,EAAO4tB,aAAW,EAAXA,EAAanvB,GAAI6M,EAAQ7M,GAAI81B,EAAAA,GAAY+vH,iCAE3EhwH,EAAAA,EAAAA,IAAuBt0B,EAAO4tB,aAAW,EAAXA,EAAanvB,GAAI6M,EAAQ7M,GAAI81B,EAAAA,GAAYgwH,kCAE5ErrC,EAAsD,SAA/B72G,EAAO82G,oBAC9BvB,EAA4D,SAAlCv1G,EAAO+2G,uBACjC0K,EAAoD,SAAhCzhH,EAAOy9C,qBAE3Bg4D,GADqB7jG,QAAQ2Z,aAAW,EAAXA,EAAa0oF,oBACDwN,GAAqB5K,IAAwB3gF,EAAAA,EAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAY8kF,cACpItjB,EAA4B,SAAlBnhE,EAAQwU,MAElBo7G,GAAcjsH,EAAAA,EAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAYkwH,kBAElE,MAAO,CACHJ,oBACAz2H,cACAkqF,kBACA0sC,cACA5sC,0BACA7hB,UACA1C,SAASA,EAAAA,EAAAA,KAAQ5oE,EAAAA,EAAAA,IAAezqB,GAAO8I,OACvCojB,iBACAi4H,wBACAO,kBAAkBC,EAAAA,EAAAA,IAAoB3kJ,GAE9C,CAeA,SAAewP,EAAAA,EAAAA,SAAQ8wH,GAbvB,SAA4BviI,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB8zI,kBAAiB,EACjBZ,mBAAkB,EAClBiB,6BAA4B,EAC5Be,uBAAsB,KACtB1+F,iBACA69F,kBACDhmJ,GAEX,GAEA,CAA4D++B,E,sKCtF5D,MAAM+nH,GAAgBjmF,EAAAA,EAAAA,gBAAe,CACjCkmF,UAAW,CACPrmJ,GAAI,wBACJ0S,eAAgB,YAEpB4zI,eAAgB,CACZtmJ,GAAI,8BACJ0S,eAAgB,qCAEpB6zI,YAAa,CACTvmJ,GAAI,yBACJ0S,eAAgB,SAEpB8zI,cAAe,CACXxmJ,GAAI,2BACJ0S,eAAgB,6BAEpB+zI,cAAe,CACXzmJ,GAAI,6BACJ0S,eAAgB,gBAEpBg0I,mBAAoB,CAChB1mJ,GAAI,iCACJ0S,eAAgB,+BAEpBi0I,kBAAmB,CACf3mJ,GAAI,iCACJ0S,eAAgB,cAEpB4hE,KAAM,CACFt0E,GAAI,iBACJ0S,eACI,0EAERk0I,UAAW,CACP5mJ,GAAI,uBACJ0S,eAAgB,cAEpBm0I,gBAAiB,CACb7mJ,GAAI,+BACJ0S,eAAgB,aAEpBo0I,YAAa,CACT9mJ,GAAI,yBACJ0S,eAAgB,SAEpBq0I,kBAAmB,CACf/mJ,GAAI,gCACJ0S,eAAgB,UAEpBs0I,kBAAmB,CACfhnJ,GAAI,gCACJ0S,eAAgB,eAEpBu0I,oBAAqB,CACjBjnJ,GAAI,kCACJ0S,eAAgB,oCAQlBqmB,EAAyB33B,IAAoC,IAAnC,SAACyU,GAAgBzU,EAC7C,MAAO0T,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,GAC3B0kI,GAAapyF,EAAAA,EAAAA,QAAuB,OAEpC,cAACriD,IAAiBgQ,EAAAA,EAAAA,WAElB7O,GAAa8O,EAAAA,EAAAA,cAAY,IAAMH,GAAQ,IAAQ,IAE/C4kI,EAAUtuH,EAAAA,KAEVuuH,GAAepnG,EAAAA,EAAAA,aAAYqnG,EAAAA,IAE3BC,EAA2BC,GACtBl+I,OAAOkJ,QAAQg1I,GAAWj7I,KAAIzF,IAAqB,IAAnBF,EAAK43D,GAAS13D,EACjD,OACIoC,IAAAA,cAAC61D,EAAAA,EAAwB,CACrBn4D,IAAKA,EACL43D,SAAUA,GACZ,IASd,OAJAlQ,EAAAA,EAAAA,YAAU,KAAM,IAAAm5F,EACM,QAAlBA,EAAAN,EAAWxrI,eAAO,IAAA8rI,GAAlBA,EAAoB78H,OAAO,GAC5B,IAGC1hB,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,8BAChBb,KAAMA,EACNc,OAAQhC,EACRiC,SAAUA,EACVE,KAAK,OACL,kBAAgB,uBAEhB9M,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CACTC,aAAa,EACblN,UAAU,WAEVD,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,uBAEHiJ,IAAAA,cAAA,cAAQA,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB0oF,gBAGvEx+I,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,CAAC+nD,SAAU,GAClBx1D,IAAAA,cAAA,OACIw1D,UAAW,EACX5a,IAAKqjG,IAETj+I,IAAAA,cAAA,OAAKC,UAAU,OACXD,IAAAA,cAAA,OAAKC,UAAU,YACXD,IAAAA,cAAA,OAAKC,UAAU,WACXD,IAAAA,cAAA,WACIA,IAAAA,cAAA,MAAIC,UAAU,iBAAgBD,IAAAA,cAAA,cAASwJ,EAAc2zI,EAAcQ,aACnE39I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB2oF,UACvDz+I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB4oF,UACvD1+I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB6oF,gBACvD3+I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB8oF,iBACrDV,GAAWl+I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB+oF,eAClEX,GAAWl+I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBgpF,cACpE9+I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBipF,kBACvD/+I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBkpF,cACvDh/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBmpF,YACvDj/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBopF,cACvDl/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBqpF,cACvDn/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBspF,iBACvDp/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBupF,sBACvDr/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBwpF,mBACvDt/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBypF,qBACvDv/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB0pF,sBAInEx/I,IAAAA,cAAA,OAAKC,UAAU,YACXD,IAAAA,cAAA,OAAKC,UAAU,WACXD,IAAAA,cAAA,WACIA,IAAAA,cAAA,MAAIC,UAAU,iBAAgBD,IAAAA,cAAA,cAASwJ,EAAc2zI,EAAcC,aACnEp9I,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,oBAAoBuJ,EAAc2zI,EAAcE,iBAC9Dr9I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB2pF,UACvDz/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB4pF,WACvD1/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB6pF,kBACvD3/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB8pF,iBACvD5/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB+pF,kBAE3D7/I,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,oBAAoBuJ,EAAc2zI,EAAcK,gBAC9Dx9I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBgqF,kBACvD9/I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBiqF,iBACvD//I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBkqF,gBAE3DhgJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,oBAAoBuJ,EAAc2zI,EAAcO,oBAC9D19I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB8iB,kBACvD54E,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB+iB,oBACvD74E,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBgjB,mBAE3D94E,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,oBAAoBuJ,EAAc2zI,EAAcS,kBAC9D59I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBmqF,oBAE3DjgJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,oBAAoBuJ,EAAc2zI,EAAcG,cAC9Dt9I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB0K,kBAKvExgE,IAAAA,cAAA,OAAKC,UAAU,YACXD,IAAAA,cAAA,OAAKC,UAAU,WACXD,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,MAAIC,UAAU,iBAAgBD,IAAAA,cAAA,cAASwJ,EAAc2zI,EAAcI,iBACnEv9I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBoqF,qBACvDlgJ,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBqqF,qBACvDngJ,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBsqF,sBACvDpgJ,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBuqF,sBACvDrgJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,oBAAoBuJ,EAAc2zI,EAAcM,qBAC9Dz9I,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmBwqF,uBACvDtgJ,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmByqF,uBACvDvgJ,IAAAA,cAAC61D,EAAAA,EAAwB,CAACP,SAAUQ,EAAAA,EAAmB0qF,oBAIjErC,GACFn+I,IAAAA,cAAA,OAAKC,UAAU,WACXD,IAAAA,cAAA,WACIA,IAAAA,cAAA,MAAIC,UAAU,iBAAgBD,IAAAA,cAAA,cAASwJ,EAAc2zI,EAAcU,eACnE79I,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,oBAAoBuJ,EAAc2zI,EAAcW,oBAC7DO,EAAwBvoF,EAAAA,EAAmB2qF,MAAMv/G,SAGtDlhC,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,oBAAoBuJ,EAAc2zI,EAAcY,oBAC7DM,EAAwBvoF,EAAAA,EAAmB2qF,MAAMC,SAEtD1gJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,oBAAoBuJ,EAAc2zI,EAAca,sBAC7DK,EAAwBvoF,EAAAA,EAAmB2qF,MAAME,aAOtE3gJ,IAAAA,cAAA,OAAKC,UAAU,eAAeuJ,EAAc2zI,EAAc9xE,SAG9D,EAEdv7C,EAAAznB,UAAA,CA9JEuE,SAAQ9G,IAAAA,KAAAC,YAgKZ,S,gLCjNA,SAAS8vD,EAAwB19D,GAAwE,IAAAyoJ,EAAA,IAAvE,SAACtrF,EAAQ,gBAAEurF,EAAe,iBAAE7qF,EAAgB,gBAAEC,GAAuB99D,EACnG,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClBsnI,EAAet3I,EAZzB,SAAqC8rD,GACjC,IAAIyrF,EAAAA,EAAAA,IAAoBzrF,GACpB,OAAOA,EAEX,MAAOP,QAASisF,EAAQ,IAAEhsF,GAAOM,EACjC,OAAOvN,EAAAA,EAAAA,OAAWiN,EAAMA,EAAMgsF,CAClC,CAMuCC,CAA4B3rF,IACzD4rF,EAAgBJ,EAAat8G,MAAM,MAEzC,IAAItkC,EAAc,GACdiJ,EAAO,GACPg4I,EAAU,GA8Bd,OA5BID,EAAc93I,OAAS,GACvBlJ,EAAcghJ,EAAc,GAC5B/3I,EAAO+3I,EAAc,GACrBC,EAAUD,EAAc,IACjBA,EAAc,GAAG/0G,SAfV,KAgBdhjC,EAAO+3I,EAAc,GAErBhhJ,EAAcghJ,EAAc,GAsB5BlhJ,IAAAA,cAAAA,IAAAA,SAAA,KACKg2D,IAAqB6qF,IAA8B,QAAfD,EAAI1gJ,SAAW,IAAA0gJ,OAAA,EAAXA,EAAa35G,QAAQ,UAAW,KACzEjnC,IAAAA,cAAA,OAAKC,UAAU,kBACT+1D,IAAqB6qF,GAAmB3gJ,GAAeF,IAAAA,cAAA,YAAOE,GAC/DiJ,GAAQA,EAAKq7B,MA5CR,KA4C6BnhC,KAAK3F,GACpCsC,IAAAA,cAACohJ,EAAAA,EAAW,CACR1jJ,IAAKA,EACL2pF,QAASpxB,EAAkBorF,EAAAA,EAAmBC,QAAUD,EAAAA,EAAmBE,eAE1E7jJ,KAIRyjJ,GAhCSK,MAClB,MAAMC,EAAeN,EAAQ38G,MAtBf,KAsBoCnhC,KAAK3F,GACnDsC,IAAAA,cAACohJ,EAAAA,EAAW,CACR1jJ,IAAKA,EACL2pF,QAASpxB,EAAkBorF,EAAAA,EAAmBC,QAAUD,EAAAA,EAAmBE,eAE1E7jJ,KAIT,OACIsC,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,YAAO,SACNyhJ,EACF,EAkBaD,IAI5B,CAAC3rF,EAAAxtD,UAAA,CAtEGw4I,gBAAe/6I,IAAAA,KACfkwD,iBAAgBlwD,IAAAA,KAChBmwD,gBAAenwD,IAAAA,MAsEnB,SAAeypD,EAAAA,EAAAA,MAAKsG,GChFd6rF,EAAmB,CACrBxgH,OAAQ,CACJygH,eAAezqF,EAAAA,EAAAA,gBAAe,CAC1BnC,QAAS,CACLh+D,GAAI,4BACJ0S,eAAgB,6CAEpBurD,IAAK,CACDj+D,GAAI,gCACJ0S,eAAgB,2CAI5Bi3I,OAAQ,CACJkB,iBAAiB1qF,EAAAA,EAAAA,gBAAe,CAC5BnC,QAAS,CACLh+D,GAAI,8BACJ0S,eAAgB,qCAEpBurD,IAAK,CACDj+D,GAAI,kCACJ0S,eAAgB,oCAGxBo4I,sBAAsB3qF,EAAAA,EAAAA,gBAAe,CACjCnC,QAAS,CACLh+D,GAAI,oCACJ0S,eAAgB,sCAEpBurD,IAAK,CACDj+D,GAAI,wCACJ0S,eAAgB,qCAGxBq4I,wBAAwB5qF,EAAAA,EAAAA,gBAAe,CACnCnC,QAAS,CACLh+D,GAAI,sCACJ0S,eAAgB,8CAEpBurD,IAAK,CACDj+D,GAAI,0CACJ0S,eAAgB,6CAGxBs4I,6BAA6B7qF,EAAAA,EAAAA,gBAAe,CACxCnC,QAAS,CACLh+D,GAAI,2CACJ0S,eAAgB,wDAEpBurD,IAAK,CACDj+D,GAAI,+CACJ0S,eAAgB,qDAGxBu4I,gBAAgB9qF,EAAAA,EAAAA,gBAAe,CAC3BnC,QAAS,CACLh+D,GAAI,6BACJ0S,eAAgB,qCAEpBurD,IAAK,CACDj+D,GAAI,iCACJ0S,eAAgB,qCAI5Bk3I,OAAQ,CACJsB,iBAAiB/qF,EAAAA,EAAAA,gBAAe,CAC5BnC,QAAS,CACLh+D,GAAI,+BACJ0S,eAAgB,6CAMnBqsD,EAAqB,CAC9B0oF,YAAYtnF,EAAAA,EAAAA,gBAAe,CACvBnC,QAAS,CACLh+D,GAAI,mBACJ0S,eAAgB,8BAEpBurD,IAAK,CACDj+D,GAAI,uBACJ0S,eAAgB,6BAGxBg1I,SAASvnF,EAAAA,EAAAA,gBAAe,CACpBnC,QAAS,CACLh+D,GAAI,qBACJ0S,eAAgB,6BAEpBurD,IAAK,CACDj+D,GAAI,yBACJ0S,eAAgB,6BAGxBi1I,SAASxnF,EAAAA,EAAAA,gBAAe,CACpBnC,QAAS,CACLh+D,GAAI,qBACJ0S,eAAgB,2BAEpBurD,IAAK,CACDj+D,GAAI,yBACJ0S,eAAgB,2BAGxBk1I,eAAeznF,EAAAA,EAAAA,gBAAe,CAC1BnC,QAAS,CACLh+D,GAAI,4BACJ0S,eAAgB,0CAEpBurD,IAAK,CACDj+D,GAAI,gCACJ0S,eAAgB,0CAGxBm1I,eAAe1nF,EAAAA,EAAAA,gBAAe,CAC1BnC,QAAS,CACLh+D,GAAI,4BACJ0S,eAAgB,wCAEpBurD,IAAK,CACDj+D,GAAI,gCACJ0S,eAAgB,wCAGxBo1I,aAAa3nF,EAAAA,EAAAA,gBAAe,CACxBnC,QAAS,CACLh+D,GAAI,0BACJ0S,eAAgB,+BAEpBurD,IAAK,CACDj+D,GAAI,8BACJ0S,eAAgB,4BAGxBq1I,aAAa5nF,EAAAA,EAAAA,gBAAe,CACxBnC,QAAS,CACLh+D,GAAI,0BACJ0S,eAAgB,6BAEpBurD,IAAK,CACDj+D,GAAI,8BACJ0S,eAAgB,0BAGxBs1I,iBAAiB7nF,EAAAA,EAAAA,gBAAe,CAC5BnC,QAAS,CACLh+D,GAAI,8BACJ0S,eAAgB,gDAEpBurD,IAAK,CACDj+D,GAAI,kCACJ0S,eAAgB,6CAGxBu1I,aAAa9nF,EAAAA,EAAAA,gBAAe,CACxBnC,QAAS,CACLh+D,GAAI,yBACJ0S,eAAgB,qCAEpBurD,IAAK,CACDj+D,GAAI,6BACJ0S,eAAgB,oCAGxBw1I,WAAW/nF,EAAAA,EAAAA,gBAAe,CACtBnC,QAAS,CACLh+D,GAAI,qCACJ0S,eAAgB,uCAEpBurD,IAAK,CACDj+D,GAAI,yCACJ0S,eAAgB,sCAGxBy1I,aAAahoF,EAAAA,EAAAA,gBAAe,CACxBnC,QAAS,CACLh+D,GAAI,yBACJ0S,eAAgB,2BAEpBurD,IAAK,CACDj+D,GAAI,6BACJ0S,eAAgB,0BAGxB01I,aAAajoF,EAAAA,EAAAA,gBAAe,CACxBnC,QAAS,CACLh+D,GAAI,gCACJ0S,eAAgB,kCAEpBurD,IAAK,CACDj+D,GAAI,oCACJ0S,eAAgB,iCAGxB21I,gBAAgBloF,EAAAA,EAAAA,gBAAe,CAC3BnC,QAAS,CACLh+D,GAAI,6BACJ0S,eAAgB,2CAEpBurD,IAAK,CACDj+D,GAAI,iCACJ0S,eAAgB,0CAGxB41I,qBAAqBnoF,EAAAA,EAAAA,gBAAe,CAChCnC,QAAS,CACLh+D,GAAI,mCACJ0S,eAAgB,4CAEpBurD,IAAK,CACDj+D,GAAI,uCACJ0S,eAAgB,2CAGxB61I,kBAAkBpoF,EAAAA,EAAAA,gBAAe,CAC7BnC,QAAS,CACLh+D,GAAI,+BACJ0S,eAAgB,2CAEpBurD,IAAK,CACDj+D,GAAI,mCACJ0S,eAAgB,0CAGxB81I,oBAAoBroF,EAAAA,EAAAA,gBAAe,CAC/BnC,QAAS,CACLh+D,GAAI,kCACJ0S,eAAgB,kCAEpBurD,IAAK,CACDj+D,GAAI,sCACJ0S,eAAgB,mCAGxB+1I,kBAAkBtoF,EAAAA,EAAAA,gBAAe,CAC7BnC,QAAS,CACLh+D,GAAI,+BACJ0S,eAAgB,6CAEpBurD,IAAK,CACDj+D,GAAI,mCACJ0S,eAAgB,4CAGxBg2I,SAASvwI,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,sBACJ0S,eAAgB,sCAEpBi2I,UAAUxwI,EAAAA,EAAAA,eAAc,CACpBnY,GAAI,uBACJ0S,eAAgB,gDAEpBm2I,gBAAgB1oF,EAAAA,EAAAA,gBAAe,CAC3BnC,QAAS,CACLh+D,GAAI,8BACJ0S,eAAgB,sCAEpBurD,IAAK,CACDj+D,GAAI,kCACJ0S,eAAgB,qCAGxBo2I,gBAAgB3oF,EAAAA,EAAAA,gBAAe,CAC3BnC,QAAS,CACLh+D,GAAI,8BACJ0S,eAAgB,oCAEpBurD,IAAK,CACDj+D,GAAI,kCACJ0S,eAAgB,mCAGxBq2I,iBAAiB5wI,EAAAA,EAAAA,eAAc,CAC3BnY,GAAI,+BACJ0S,eAAgB,2BAEpBs2I,gBAAgB7wI,EAAAA,EAAAA,eAAc,CAC1BnY,GAAI,8BACJ0S,eAAgB,0BAEpBu2I,cAAc9wI,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,4BACJ0S,eAAgB,wBAEpBk2I,iBAAiBzoF,EAAAA,EAAAA,gBAAe,CAC5BnC,QAAS,CACLh+D,GAAI,oCACJ0S,eAAgB,wCAEpBurD,IAAK,CACDj+D,GAAI,wCACJ0S,eAAgB,uCAGxBmvE,iBAAiB1hB,EAAAA,EAAAA,gBAAe,CAC5BnC,QAAS,CACLh+D,GAAI,+BACJ0S,eAAgB,iBAEpBurD,IAAK,CACDj+D,GAAI,mCACJ0S,eAAgB,gBAGxBuvE,iBAAiB9hB,EAAAA,EAAAA,gBAAe,CAC5BnC,QAAS,CACLh+D,GAAI,+BACJ0S,eAAgB,QAEpBurD,IAAK,CACDj+D,GAAI,mCACJ0S,eAAgB,UAGxBsvE,mBAAmB7hB,EAAAA,EAAAA,gBAAe,CAC9BnC,QAAS,CACLh+D,GAAI,iCACJ0S,eAAgB,gCAEpBurD,IAAK,CACDj+D,GAAI,qCACJ0S,eAAgB,+BAGxBwvE,eAAe/hB,EAAAA,EAAAA,gBAAe,CAC1BnC,QAAS,CACLh+D,GAAI,6BACJ0S,eAAgB,WAEpBurD,IAAK,CACDj+D,GAAI,iCACJ0S,eAAgB,aAGxByvE,kBAAkBhiB,EAAAA,EAAAA,gBAAe,CAC7BnC,QAAS,CACLh+D,GAAI,gCACJ0S,eAAgB,SAEpBurD,IAAK,CACDj+D,GAAI,oCACJ0S,eAAgB,WAGxB2vE,eAAeliB,EAAAA,EAAAA,gBAAe,CAC1BnC,QAAS,CACLh+D,GAAI,kCACJ0S,eAAgB,iBAEpBurD,IAAK,CACDj+D,GAAI,sCACJ0S,eAAgB,mBAGxB0vE,eAAejiB,EAAAA,EAAAA,gBAAe,CAC1BnC,QAAS,CACLh+D,GAAI,oCACJ0S,eAAgB,iBAEpBurD,IAAK,CACDj+D,GAAI,wCACJ0S,eAAgB,mBAGxBgtD,mBAAmBS,EAAAA,EAAAA,gBAAe,CAC9BnC,QAAS,CACLh+D,GAAI,0CACJ0S,eAAgB,gCAEpBurD,IAAK,CACDj+D,GAAI,8CACJ0S,eAAgB,6BAGxB+sD,mBAAmBU,EAAAA,EAAAA,gBAAe,CAC9BnC,QAAS,CACLh+D,GAAI,0CACJ0S,eAAgB,gCAEpBurD,IAAK,CACDj+D,GAAI,8CACJ0S,eAAgB,6BAGxB8jE,oBAAoBrW,EAAAA,EAAAA,gBAAe,CAC/BnC,QAAS,CACLh+D,GAAI,gCACJ0S,eAAgB,qCAEpBurD,IAAK,CACDj+D,GAAI,oCACJ0S,eAAgB,oCAGxBssD,oBAAoBmB,EAAAA,EAAAA,gBAAe,CAC/BnC,QAAS,CACLh+D,GAAI,kCACJ0S,eAAgB,kCAEpBurD,IAAK,CACDj+D,GAAI,sCACJ0S,eAAgB,mCAGxBovE,mBAAmB3hB,EAAAA,EAAAA,gBAAe,CAC9BnC,QAAS,CACLh+D,GAAI,iCACJ0S,eAAgB,mBAEpBurD,IAAK,CACDj+D,GAAI,qCACJ0S,eAAgB,kBAGxBqvE,iBAAiB5hB,EAAAA,EAAAA,gBAAe,CAC5BnC,QAAS,CACLh+D,GAAI,+BACJ0S,eAAgB,qBAEpBurD,IAAK,CACDj+D,GAAI,mCACJ0S,eAAgB,kBAGxB+2D,aAAatJ,EAAAA,EAAAA,gBAAe,CACxBnC,QAAS,CACLh+D,GAAI,yBACJ0S,eAAgB,yBAEpBurD,IAAK,CACDj+D,GAAI,6BACJ0S,eAAgB,wBAGxBy2I,oBAAoBhpF,EAAAA,EAAAA,gBAAe,CAC/BnC,QAAS,CACLh+D,GAAI,iCACJ0S,eAAgB,8BAEpBurD,IAAK,CACDj+D,GAAI,qCACJ0S,eAAgB,2BAGxB02I,oBAAoBjpF,EAAAA,EAAAA,gBAAe,CAC/BnC,QAAS,CACLh+D,GAAI,iCACJ0S,eAAgB,kCAEpBurD,IAAK,CACDj+D,GAAI,qCACJ0S,eAAgB,8BAGxB22I,qBAAqBlpF,EAAAA,EAAAA,gBAAe,CAChCnC,QAAS,CACLh+D,GAAI,kCACJ0S,eAAgB,oBAEpBurD,IAAK,CACDj+D,GAAI,sCACJ0S,eAAgB,mBAGxB42I,qBAAqBnpF,EAAAA,EAAAA,gBAAe,CAChCnC,QAAS,CACLh+D,GAAI,kCACJ0S,eAAgB,qBAEpBurD,IAAK,CACDj+D,GAAI,sCACJ0S,eAAgB,oBAGxB62I,sBAAsBpxI,EAAAA,EAAAA,eAAc,CAChCnY,GAAI,mCACJ0S,eAAgB,mDAEpB82I,sBAAsBrxI,EAAAA,EAAAA,eAAc,CAChCnY,GAAI,mCACJ0S,eAAgB,iDAEpB+2I,gBAAgBtxI,EAAAA,EAAAA,eAAc,CAC1BnY,GAAI,4BACJ0S,eAAgB,oCAEpBw2I,kBAAkB/oF,EAAAA,EAAAA,gBAAe,CAC7BnC,QAAS,CACLh+D,GAAI,gCACJ0S,eAAgB,uBAEpBurD,IAAK,CACDj+D,GAAI,oCACJ0S,eAAgB,sBAGxBy4I,iBAAiBhrF,EAAAA,EAAAA,gBAAe,CAC5BnC,QAAS,CACLh+D,GAAI,8CACJ0S,eAAgB,oBAEpBurD,IAAK,CACDj+D,GAAI,8CACJ0S,eAAgB,sBAGxBg3I,MAAOiB,GC/fX,G,gHCcA,MAAMS,EAAgBhqJ,IAKI,IALH,SACnBiqJ,EAAQ,QACR9yI,EAAO,SACPjI,GAAW,EAAK,eAChBg7I,GAAiB,GACAlqJ,EACjB,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClB8oI,GAAgBrpD,EAAAA,EAAAA,KAChBspD,EAAahsJ,UAKf+rJ,IAGIhzI,GACAA,GACJ,EAGEvY,EAAK,kBAELq6F,EAAU5nF,EAAc,CAACzS,GAAI,sDAAuD0S,eAAgB,gBAE1G,OAAO44I,EACHriJ,IAAAA,cAAA,UACIjJ,GAAIA,EACJkJ,UAAWmiJ,EACX9yI,QAASizI,EACTl7I,SAAUA,GAET+pF,GAGLpxF,IAAAA,cAAA,KACIjJ,GAAIA,EACJkJ,UAAU,oBACVqP,QAASizI,GAERnxD,EAER,EACH+wD,EAAA95I,UAAA,CApDEuyF,YAAW90F,IAAAA,OAAAC,WACXuJ,QAAOxJ,IAAAA,KACP08I,mBAAkB18I,IAAAA,KAClBs8I,SAAQt8I,IAAAA,OACRu8I,eAAcv8I,IAAAA,KACduB,SAAQvB,IAAAA,KACR28I,aAAY38I,IAAAA,QAgDhB,S,4JC5CA,MAAMoqB,EAAoB/3B,IAAmD,IAAlD,QAAC4K,EAAO,QAAEa,EAAO,SAAElH,EAAQ,SAAEkQ,GAAgBzU,EACpE,MAAO0T,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,GAc3B5O,EAAaA,IAAM2O,GAAQ,GAEjC,IAAIpL,EACA9O,EACAwE,GAAWA,EAAQ/D,eAEfqO,EADAtK,EAAQ1I,OAASuqB,EAAAA,GAAU0B,gBAEvBnnB,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,kCACfjB,OAAQ,CACJ5E,QAAS5D,IAAAA,cAAA,SAAI4D,EAAQ/D,iBAM7BG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,0BACfjB,OAAQ,CACJ5E,QAAS5D,IAAAA,cAAA,SAAI4D,EAAQ/D,iBAOjCT,EADAwE,EAAQ1I,OAASuqB,EAAAA,GAAU0B,gBAEvBnnB,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,uIACfjB,OAAQ,CACJ5E,QAAS5D,IAAAA,cAAA,SAAI4D,EAAQ/D,iBAM7BG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,4HACfjB,OAAQ,CACJ5E,QAAS5D,IAAAA,cAAA,SAAI4D,EAAQ/D,kBAOzC,MACM6iJ,EACF1iJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,uBAIvB,OACIzJ,IAAAA,cAACklH,EAAAA,EAAY,CACTr5G,KAAMA,EACNqC,MAAOA,EACP9O,QAASA,EACTujJ,mBAbY,iBAcZpnE,kBAAmBmnE,EACnBzuF,UA7EajnD,KACjB,GAAIpJ,EAAS,CACT,MAAMwO,EAAYxO,EAAQ7M,GAC1BgM,EAAQkjB,aAAa7T,GAAWlG,MAAMwI,IAC9BA,EAAO/d,OACP+F,SAAAA,IACAiO,IACJ,GAER,GAqEIu9C,SAAUv9C,EACViC,SAAUA,GACZ,EAERsjB,EAAA7nB,UAAA,CA5FEuE,SAAQ9G,IAAAA,KAAAC,WACRrJ,SAAQoJ,IAAAA,KACR/C,QAAO+C,IAAAA,MAAA,CACHmgB,aAAYngB,IAAAA,KAAAC,aAAAA,YA2FpB,UCzFA,GAAe+B,EAAAA,EAAAA,SAAQ,MARvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBie,aAAYA,EAAAA,IACb5vB,GAEX,GAEA,CAAiD65B,E,kiBCR1C,MAAM0yH,EAAuB,GAgFrB,MAAMC,UAAkB7iJ,IAAAA,cAMnCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,mBAmBJ,KACTE,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAC/BrJ,EAAA,mBAEY,KACLE,KAAKhD,MAAMiN,QACXjK,KAAKhD,MAAMiN,QACf,IACHnK,EAAA,eAkBQ,KACL,MAAM69F,EAAW39F,KAAKpK,MAAM2G,KAAO,EACnCyD,KAAKogJ,aAAaziD,EAAS,IAC9B79F,EAAA,eAEQ,KACL,MAAM23C,EAAWz3C,KAAKpK,MAAM2G,KAAO,EACnCyD,KAAKogJ,aAAa3oG,EAAS,IAC9B33C,EAAA,qBAEcjM,UACXmM,KAAKgH,SAAS,CAACsC,SAAS,IACxB,MAAM0I,QAAehS,KAAKhD,MAAMqjJ,UAAU9jJ,EAAMyD,KAAKpK,MAAMgiD,YAC3D53C,KAAKgH,SAAS,CAACzK,OAAMwM,MAAOiJ,EAAOjJ,MAAOO,SAAS,GAAO,IAC7DxJ,EAAA,sBAEejM,UACZ,MAAM,OAACikE,GAAU3iD,EACXyiC,EAAakgB,EAAOh3D,MAC1Bd,KAAKgH,SAAS,CAACsC,SAAS,EAAMsuC,eAC9B,MAAM5lC,QAAehS,KAAKhD,MAAMqjJ,UAAU,EAAGzoG,IACvC,MAAC7uC,EAAK,WAAEu3I,GAActuI,EAC5BhS,KAAKgH,SAAS,CAACsC,SAAS,EAAOP,QAAOu3I,cAAY,IAjElDtgJ,KAAKugJ,WAAavjJ,EAAMujJ,YAAcL,EAEtClgJ,KAAKpK,MAAQ,CACTuT,MAAM,EACN5M,KAAM,EACNwM,MAAO,GACPu3I,WAAY,EACZh3I,SAAS,EACTsuC,WAAY,GAEpB,CAEA,uBAAMW,GACF,MAAM,WAAC+nG,EAAU,MAAEv3I,SAAe/I,KAAKhD,MAAMqjJ,UAAU,EAAG,IAC1DrgJ,KAAKgH,SAAS,CAACs5I,aAAYv3I,QAAOO,SAAS,GAC/C,CAYAk3I,UAAAA,GACI,OAAIxgJ,KAAKpK,MAAM0T,QAEPhM,IAAAA,cAAA,WACIA,IAAAA,cAACmjJ,EAAAA,EAAa,CACVt8F,SAAS,WACTnpD,IAAI,aAKbgF,KAAKpK,MAAMmT,MAAMpI,KAAK1D,GACzB+C,KAAKhD,MAAM0jJ,UAAUzjJ,EAAM+C,OAEnC,CA2BA2gJ,eAAAA,GACI,IAAIC,EAAc5gJ,KAAKpK,MAAM2G,KAAOyD,KAAKugJ,WAAc,EACvD,MAAMM,EAAYD,EAAa5gJ,KAAKpK,MAAMmT,MAAMrC,OAAU,EAI1D,OAHiB,IAAbm6I,IACAD,EAAa,GAEV,CAACA,aAAYC,WACxB,CAEA59I,MAAAA,GACI,IAAKjD,KAAKhD,MAAMmM,KACZ,OAAO,KAEX,MAAM,SAAC03I,EAAQ,WAAED,GAAc5gJ,KAAK2gJ,kBACpC,OACIrjJ,IAAAA,cAAA,WACIA,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,4CAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiI,WACbiC,SAAUlK,KAAKy5C,YAEfn8C,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CAACC,eAAe,MACxBvN,IAAAA,cAAA,QAAMC,UAAU,QAAQyC,KAAKhD,MAAM8jJ,YAEtC9gJ,KAAKhD,MAAM+jJ,oBAAsB/gJ,KAAKhD,MAAMgkJ,uBACzC1jJ,IAAAA,cAAA,KACIC,UAAU,yBACVk2C,KAAK,IACL7mC,QAAS5M,KAAKhD,MAAMgkJ,uBAEnBhhJ,KAAKhD,MAAM+jJ,qBAGxBzjJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,SACIC,UAAU,eACVk4H,QAAQ,oBAEPz1H,KAAKhD,MAAMikJ,uBAEhB3jJ,IAAAA,cAAA,SACIjJ,GAAG,mBACHkJ,UAAU,8BACVoE,YAAa3B,KAAKhD,MAAMikJ,sBACxBhhJ,SAAUD,KAAKkhJ,iBAGvB5jJ,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,QAAMC,UAAU,0BACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,qEACfjB,OAAQ,CACJ86I,aACAC,WACAtrI,MAAOvV,KAAKpK,MAAM0qJ,iBAMtChjJ,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,WACK0C,KAAKwgJ,eAGdljJ,IAAAA,cAAA,OAAKC,UAAU,mBACVyC,KAAKpK,MAAM2G,KAAO,GACnBe,IAAAA,cAAA,UACIsP,QAAS5M,KAAKmhJ,OACd5jJ,UAAU,+DAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,cAGtB/G,KAAKhD,MAAMujJ,YAAevgJ,KAAKpK,MAAMmT,MAAMrC,QAAU1G,KAAKhD,MAAMujJ,YAAeM,IAAa7gJ,KAAKpK,MAAM0qJ,YACxGhjJ,IAAAA,cAAA,UACIsP,QAAS5M,KAAKohJ,OACd7jJ,UAAU,+DAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,cASnD,EACHjH,EAhLoBqgJ,EAAS,aAzE1BW,UAAS19I,IAAAA,OAKT69I,sBAAqB79I,IAAAA,OAKrB29I,mBAAkB39I,IAAAA,OAMlBm9I,WAAUn9I,IAAAA,OAKV+F,KAAI/F,IAAAA,KAKJ49I,sBAAqB59I,IAAAA,KAiBrBi9I,UAASj9I,IAAAA,KAAAC,WAQT4G,OAAM7G,IAAAA,KAUNs9I,UAASt9I,IAAAA,KAAAC,aAAAvD,EAYQqgJ,EAAS,eACJ,CAClBh3I,MAAM,G,yFChFd,MAAMk4I,EAAuC5rJ,IAAgD,IAA/C,QAAC6T,EAAO,SAAE4oC,EAAQ,eAAEq0D,GAAsB9wG,EAChF6rJ,EACAhkJ,IAAAA,cAAA,QAAMC,UAAU,mBAYpB,OATI20C,IACAovG,EACIhkJ,IAAAA,cAAA,QAAMC,UAAU,kBACX+L,EAAO,IAAArL,OACHi0C,EAAQ,OAMrB50C,IAAAA,cAAA,OAAKC,UAAWgpG,GACZjpG,IAAAA,cAAC4N,EAAAA,EAAc,MACdo2I,EACC,EAEZD,EAAA17I,UAAA,CAzBE2D,QAAOlG,IAAAA,KACP8uC,SAAQ9uC,IAAAA,OACRmjG,eAAcnjG,IAAAA,QAyBlBi+I,EAAoBt1B,aAAe,CAC/BxlB,eAAgB,uBAGpB,S,yjCCDA,QAtBA,SAAsB9wG,GAAmF,IAAlF,QAACiH,EAAO,SAAEynD,EAAW,WAAU,MAAEz5C,EAAK,UAAEnN,EAAY,GAAE,SAAEgkJ,GAAW,GAAa9rJ,EACnG,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAExB,OACIxZ,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,iBAAkBl3C,EAAW,CAC/C,4BAA6BgkJ,IAEjC72I,MAAKtW,EAAA,CAAG+vD,YAAaz5C,IAErBpN,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,SACKZ,GAAWoK,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,aAE7EzJ,IAAAA,cAAA,OAAKC,UAAU,kBACfD,IAAAA,cAAA,OAAKC,UAAU,kBACfD,IAAAA,cAAA,OAAKC,UAAU,mBAI/B,C,yxBCYe,MAAMikJ,UAAiBlkJ,IAAAA,cAGlCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,+BA8FgB,KACxBN,SAASiiJ,QACVzhJ,KAAK0hJ,gBACT,IACH5hJ,EAAA,2BAc4B,CAAC6hJ,EAAuBC,EAAkBC,KAC9D7hJ,KAAKhD,MAAMuhC,eAKK,IAAjBojH,IAA0C,IAAjBA,GACzB5jI,EAAAA,EAAgB+jI,uBAAuBH,EAAcE,GACzD,IACH/hJ,EAAA,0BAE2B,CAAC4P,EAAmB/X,EAAgB0G,KAC5D2Q,OAAOgQ,QAGPhf,KAAKhD,MAAMqD,QAAQ0hJ,oBAAoBryI,EAAW/X,EAAQ0G,EAAI,IACjEyB,EAAA,wBAE0BrD,IAA2B,IAAAulJ,EAClD,MACM/mF,EAAgBx+D,EAAEq7D,OAExB,IAAKmD,EACD,OAGJ,MAAMgnF,EAAiBhnF,EAAc4L,QAAQtmE,cACvC2hJ,EAAiF,UAA1B,QAA1BF,EAAA/mF,EAAcknF,oBAAY,IAAAH,OAAA,EAA1BA,EAAAxzI,KAAAysD,EAA6B,qBAG5DgB,EAAAA,EAAAA,GAAax/D,EAAGsmB,EAAAA,GAAUoxC,SAASiuF,aAXd,CAAC,QAAS,YAYZ34G,SAASw4G,IAC5BC,GAEAzlJ,EAAEyK,gBACN,IACHpH,EAAA,2BAE4B,KAEzBkP,OAAO+rD,oBAAoB,eAAgB/6D,KAAKqiJ,qBAC5CC,EAAAA,EAAAA,OAAgCtiJ,KAAKhD,MAAM0b,mBAAqB1Y,KAAKhD,MAAMulJ,gCAC3EviJ,KAAKhD,MAAMqD,QAAQmiJ,0BAA0BxiJ,KAAKhD,MAAM0b,kBAE5D+pI,EAAAA,IAAwB,IA1JxB,MAAMnrI,EAAO9X,SAAS2tE,eAAe,QACjC71D,IACAA,EAAK/Z,WAAa,gBAE1B,CAEQmlJ,YAAAA,GACJ,OAAiC,MAA1B1iJ,KAAKhD,MAAMuhC,WACtB,CAEOga,iBAAAA,GAEHkqG,EAAAA,KAEAziJ,KAAK0hJ,iBAGL1yI,OAAO6rD,iBAAiB,eAAgB76D,KAAKqiJ,oBAG7CrzI,OAAO6rD,iBAAiB,mBAAoB76D,KAAK2iJ,wBAAwB,GAGzE3zI,OAAO6rD,iBAAiB,QAAS76D,KAAK4iJ,iBACtC5zI,OAAO6rD,iBAAiB,OAAQ76D,KAAK6iJ,gBAChCrjJ,SAASsjJ,YACVz1H,EAAAA,IAA+B,GAInC,MAAM01H,EAAkBxkI,EAAAA,EAAWykI,qBAAqBhjJ,KAAKijJ,oBACvDC,EAAyB3kI,EAAAA,EAAW4kI,sBAAsBnjJ,KAAKojJ,mBAarE,GAZApjJ,KAAKqjJ,wBAA0B,KAC3BN,IACAG,GAAwB,GAIxBI,EAAAA,EAAAA,MACA9jJ,SAASC,KAAKq5D,UAAUjiC,IAAI,QACrB0sH,EAAAA,EAAAA,OACP/jJ,SAASC,KAAKq5D,UAAUjiC,IAAI,YAG3B72B,KAAKhD,MAAMuhC,YAAa,CACzB,MAAMilH,EAAShkJ,SAAS2tE,eAAe,QACnCq2E,GACAA,EAAOC,aAAa,QAAS,IAEjCp2H,EAAAA,GAAqC,sBAAwBq2H,mBAAmB,GAADzlJ,OAAI+B,KAAKhD,MAAMyS,SAASwQ,UAAQhiB,OAAG+B,KAAKhD,MAAMyS,SAASyQ,UAAW,GAAM,EAC3J,CAGAlR,OAAO6rD,iBAAiB,UAAW76D,KAAK2jJ,iBAEpC3jJ,KAAK0iJ,iBAAmB1iJ,KAAKhD,MAAM4mJ,cACnCvlI,EAAAA,EAAawlI,cACbtlI,EAAAA,EAAWslI,cAEnB,CAEOvmF,oBAAAA,GAA6B,IAAAwmF,EAChCrB,EAAAA,KAEAzzI,OAAO+rD,oBAAoB,UAAW/6D,KAAK2jJ,iBAE3C30I,OAAO+rD,oBAAoB,QAAS/6D,KAAK4iJ,iBACzC5zI,OAAO+rD,oBAAoB,OAAQ/6D,KAAK6iJ,gBAEZ,QAA5BiB,EAAA9jJ,KAAKqjJ,+BAAuB,IAAAS,GAA5BA,EAAAt1I,KAAAxO,KACJ,CAEOiD,MAAAA,GACH,IAAKjD,KAAK0iJ,eACN,OAAOplJ,IAAAA,cAACmjJ,EAAAA,EAAa,MAGzB,GAAIzgJ,KAAKhD,MAAM4mJ,aACX,GAAqC,eAAjC5jJ,KAAKhD,MAAMyS,SAASwQ,SACpB,OAAO3iB,IAAAA,cAACymJ,EAAAA,SAAQ,CAAC9mG,GAAI,oBAEtB,GAAqC,iBAAjCj9C,KAAKhD,MAAMyS,SAASwQ,eAExB,GAAIjgB,KAAKhD,MAAMgnJ,oBACmB,sBAAjChkJ,KAAKhD,MAAMyS,SAASwQ,SACpB,OAAO3iB,IAAAA,cAACymJ,EAAAA,SAAQ,CAAC9mG,GAAI,iCAAmCymG,mBAAmB1jJ,KAAKhD,MAAMyS,SAASwQ,YAIvG,OAAOjgB,KAAKhD,MAAM20D,QACtB,CAQQ+vF,cAAAA,GACJ1hJ,KAAKhD,MAAMqD,QAAQ4jJ,oBAAmBC,EAAAA,EAAAA,MAC1C,CAEQtB,eAAAA,GACJv1H,EAAAA,IAA+B,EACnC,CAEQw1H,cAAAA,GACJx1H,EAAAA,IAA+B,EACnC,EAgDHvtB,EAlKoB0hJ,EAAQ,aAhBzB9oI,iBAAgBtV,IAAAA,OAChBm/I,+BAA8Bn/I,IAAAA,KAAAC,WAC9BsuD,SAAQvuD,IAAAA,KACRwgJ,YAAWxgJ,IAAAA,KAAAC,WACXhD,QAAO+C,IAAAA,MAAA,CACH6gJ,mBAAkB7gJ,IAAAA,KAAAC,WAClB0+I,oBAAmB3+I,IAAAA,KAAAC,WACnBm/I,0BAAyBp/I,IAAAA,KAAAC,aAAAA,WAE7B2gJ,mBAAkB5gJ,IAAAA,KAAAC,WAClBoM,SAAQrM,IAAAA,MAAA,CACJ6c,SAAQ7c,IAAAA,OAAAC,WACR6c,OAAM9c,IAAAA,OAAAC,aAAAA,aCCd,MAAM0+I,EAAsBA,CAACryI,EAAmB/X,EAAgB0G,IAAuC,CAAC1K,EAAUsf,KAC9G,MAAMrd,EAAQqd,IAEd,GAAI5U,IAAO8lJ,EAAAA,EAAAA,IAAe9lJ,GAEtB,YADAgR,EAAAA,EAAAA,KAAaC,KAAKjR,GAItB,MAAM6C,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAC9BxO,IACAmO,EAAAA,EAAAA,KAAaC,MAAK80I,EAAAA,EAAAA,GAAcxuJ,EAAOsL,EAASvJ,GACpD,EAaJ,GAAeyN,EAAAA,EAAAA,UAxCf,SAAyBxP,EAAoB2hC,GACzC,MAAM/M,GAAUC,EAAAA,EAAAA,IAAW70B,GACrBqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnBouJ,GAAqBK,EAAAA,EAAAA,IAAyBzuJ,GAC9C8iB,GAAmBC,EAAAA,EAAAA,IAAoB/iB,GAE7C,MAAO,CACH2oC,aAAale,EAAAA,EAAAA,IAAezqB,GAC5B8iB,mBACA6pI,gCAAgCp5H,EAAAA,EAAAA,IAAiBvzB,EAAO8iB,GACxDkrI,aAAaU,EAAAA,EAAAA,IAAmBjkI,EAAAA,EAAAA,IAAezqB,GAAQ40B,EAASvyB,EAAQs/B,EAAS23G,MAAM7wI,KACvF2lJ,qBAER,IAiBA,SAA4BrwJ,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB2+I,mBAAkB,IAClBlC,sBACAS,0BAAyBA,EAAAA,IAC1B7uJ,GAEX,GAEA,CAA4D6tJ,E,sxBCtC7C,MAAM+C,UAAuBjnJ,IAAAA,cACxCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,mBAeJ,KACTE,KAAKgH,SAAS,CACVmC,MAAM,GACR,IACLrJ,EAAA,uBAEiBrD,KACVw/D,EAAAA,EAAAA,GAAax/D,EAAGsmB,EAAAA,GAAUoxC,SAAS+Z,QACnCluE,KAAKsK,cACT,IACHxK,EAAA,qBAEc,KACXE,KAAKiI,aAELjI,KAAKhD,MAAMqD,QAAQmkJ,UACfxkJ,KAAKhD,MAAMqmB,cACXrjB,KAAKhD,MAAMomB,eAEfpjB,KAAKhD,MAAMqD,QAAQokJ,wBAAwB,IAhC3CzkJ,KAAKpK,MAAQ,CACTuT,MAAM,EAEd,CAEAovC,iBAAAA,GACI/4C,SAASq7D,iBAAiB,WAAY76D,KAAKi1H,eAC/C,CAEA33D,oBAAAA,GACI99D,SAASu7D,oBAAoB,WAAY/6D,KAAKi1H,eAClD,CAwBAhyH,MAAAA,GACI,MAAM,YACFs7B,EAAW,qBACXmmH,EAAoB,oBACpBC,GACA3kJ,KAAKhD,MAIT,IAAI4nJ,EAyEJ,OAtEQA,EALQz0C,EAAAA,EAAkB5xE,EAAY7/B,OAId,IAAxBimJ,GAAsD,IAAzBD,EAEzBpnJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,4VACfjB,OAAQ,CACJ++I,uBAAwBF,EACxBG,wBAAyBJ,EACzBh/F,OAASvF,GAA4B7iD,IAAAA,cAAA,cAAS6iD,MAI3B,IAAxBwkG,EAEHrnJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kDACH0S,eAAe,yPACfjB,OAAQ,CACJg/I,wBAAyBJ,EACzBh/F,OAASvF,GAA4B7iD,IAAAA,cAAA,cAAS6iD,MAMtD7iD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iDACH0S,eAAe,sPACfjB,OAAQ,CACJ++I,uBAAwBF,EACxBj/F,OAASvF,GAA4B7iD,IAAAA,cAAA,cAAS6iD,MAK/B,IAAxBwkG,GAAsD,IAAzBD,EAEhCpnJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,mXACfjB,OAAQ,CACJ++I,uBAAwBF,EACxBG,wBAAyBJ,EACzBh/F,OAASvF,GAA4B7iD,IAAAA,cAAA,cAAS6iD,MAI3B,IAAxBwkG,EAEHrnJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uCACH0S,eAAe,gRACfjB,OAAQ,CACJg/I,wBAAyBJ,EACzBh/F,OAASvF,GAA4B7iD,IAAAA,cAAA,cAAS6iD,MAMtD7iD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,uKACfjB,OAAQ,CACJ++I,uBAAwBF,EACxBj/F,OAASvF,GAA4B7iD,IAAAA,cAAA,cAAS6iD,MAO1D7iD,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,cAChBzM,UAAU,gBACV4L,KAAMnJ,KAAKpK,MAAMuT,KACjBe,SAAUlK,KAAKhD,MAAMkN,SACrBD,OAAQjK,KAAKiI,WACb5T,GAAG,iBACH+V,KAAK,OACL,kBAAgB,uBAEhB9M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,uBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,sBAI3BzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACN65I,GAELtnJ,IAAAA,cAACyM,EAAAA,MAAMsB,OAAM,KACT/N,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,mBACVqP,QAAS5M,KAAKiI,WACd5T,GAAG,eAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,QAGvBzJ,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,iBACVqP,QAAS5M,KAAKsK,aACdjW,GAAG,gBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,UAMvC,ECvLJ,SAASg+I,EAAwBnvJ,GAG7B,OAFiB0uB,EAAAA,EAAAA,IAAc1uB,GAEf6K,QAAQS,GAAYA,EAAQ1I,OAASuqB,EAAAA,GAAU0B,kBAAiB/d,MACpF,CAEA,SAASs+I,EAAuBpvJ,GAG5B,OAFiB0uB,EAAAA,EAAAA,IAAc1uB,GAEf6K,QAAQS,GAAYA,EAAQ1I,OAASuqB,EAAAA,GAAUyB,eAAc9d,MACjF,CD8KC5G,EA7KoBykJ,EAAc,aAf/BnhI,cAAahgB,IAAAA,OAAAC,WACbggB,cAAajgB,IAAAA,OAAAC,WACbshJ,oBAAmBvhJ,IAAAA,OAAAC,WACnBqhJ,qBAAoBthJ,IAAAA,OAAAC,WACpB6G,SAAQ9G,IAAAA,KAAAC,WACRhD,QAAO+C,IAAAA,MAAA,CACHohJ,UAASphJ,IAAAA,KAAAC,WACTohJ,uBAAsBrhJ,IAAAA,KAAAC,aAAAA,aCgC9B,SAAe+B,EAAAA,EAAAA,UAvBf,SAAyBxP,GAKrB,MAAO,CACHwtB,eALkBvL,EAAAA,EAAAA,IAAiBjiB,GAMnCytB,eALkBtL,EAAAA,EAAAA,IAAiBniB,GAMnC2oC,aALgBle,EAAAA,EAAAA,IAAezqB,GAM/B8uJ,qBAAsBK,EAAwBnvJ,GAC9C+uJ,oBAAqBK,EAAuBpvJ,GAEpD,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBk/I,UAAS,KACTC,uBAAwB7lI,EAAAA,IACzBjrB,GAEX,GAEA,CAA4D4wJ,G,giBCT5D,MAAMU,UAA8B3nJ,IAAAA,cAAkCsC,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,aAC1D,CACJolJ,kBAAkB,EAClBjoJ,KAAM,CACFwgB,aAAc,KAErB3d,EAAA,kBAEWjM,MAAOsxJ,EAAoBvtG,KACnC,MAAM,KAAC3jD,SAAc+L,KAAKhD,MAAMqD,QAAQ+kJ,0BAA0BplJ,KAAKhD,MAAMmiB,KAAK9qB,GAAIujD,EAAYutG,EAAYjF,EAAAA,GAAsB,GAEpI,MAAO,CACHn3I,MAAO9U,EAAMi4C,OACbo0G,WAAYrsJ,EAAMoxJ,gBACrB,IACJvlJ,EAAA,6BAEsB,KACnBE,KAAKgH,SAAS,CAACk+I,kBAAkB,GAAO,IAC3CplJ,EAAA,8BAEuB,KACpBE,KAAKgH,SAAS,CAACk+I,kBAAkB,IACjC,MAAM,KAACjoJ,EAAI,UAAEqoJ,GAAatlJ,KAAKpK,MAC/BoK,KAAKhD,MAAMqD,QAAQklJ,oBAAoBtoJ,EAAK5I,GAAI2L,KAAKhD,MAAMmiB,KAAK9qB,GAAI4iD,EAAAA,GAAaC,MAAM1tC,MAAK3V,UACxF,GAAIyxJ,EAAW,CACXA,EAAUt+I,SAAS,CAACsC,SAAS,IAC7B,MAAM,MAACP,EAAK,WAAEu3I,SAAoBgF,EAAUtoJ,MAAMqjJ,UAAUiF,EAAU1vJ,MAAM2G,KAAM+oJ,EAAU1vJ,MAAMgiD,YAElG0tG,EAAUt+I,SAAS,CAACsC,SAAS,EAAOP,QAAOu3I,cAC/C,IACF,IACLxgJ,EAAA,2BAEoB,CAAC7C,EAAaqoJ,KAC/BtlJ,KAAKgH,SAAS,CAACk+I,kBAAkB,EAAMjoJ,OAAMqoJ,aAAW,IAC3DxlJ,EAAA,kCAE2B,CAAC7C,EAAaqoJ,IAAyBtlJ,KAAKhD,MAAMqD,QAAQklJ,oBAAoBtoJ,EAAK5I,GAAI2L,KAAKhD,MAAMmiB,KAAK9qB,GAAI4iD,EAAAA,GAAaC,MAAM1tC,MAAK3V,UAC3JyxJ,EAAUt+I,SAAS,CAACsC,SAAS,IAC7B,MAAM,MAACP,EAAK,WAAEu3I,SAAoBgF,EAAUtoJ,MAAMqjJ,UAAUiF,EAAU1vJ,MAAM2G,KAAM+oJ,EAAU1vJ,MAAMgiD,YAClG0tG,EAAUt+I,SAAS,CAACsC,SAAS,EAAOP,QAAOu3I,cAAY,MACzDxgJ,EAAA,eAEO,KACLE,KAAKhD,MAAMqD,QAAQ05F,WAAW1pF,EAAAA,GAAiBm1I,mBAAmB,IACrE1lJ,EAAA,2BAEoB,KACjBE,KAAKiK,SACLjK,KAAKhD,MAAMqD,QAAQ8P,UAAU,CAACC,QAASC,EAAAA,GAAiBo1I,mBAAoBl1I,WAAYgmC,EAAAA,GAAsB,IACjHz2C,EAAA,4BAEqBjM,MAAOoJ,EAAaqoJ,EAAsBI,KAC5D1lJ,KAAKhD,MAAMqD,QAAQslJ,mBAAmB1oJ,EAAK5I,GAAI2L,KAAKhD,MAAMmiB,KAAK9qB,GAAI4iD,EAAAA,GAAaC,KAAM,CAACE,aAAcsuG,IAAcl8I,MAAK3V,UACpHyxJ,EAAUt+I,SAAS,CAACsC,SAAS,IAC7B,MAAM,MAACP,EAAK,WAAEu3I,SAAoBgF,EAAUtoJ,MAAMqjJ,UAAUiF,EAAU1vJ,MAAM2G,KAAM+oJ,EAAU1vJ,MAAMgiD,YAElG53C,KAAKhD,MAAMqD,QAAQulJ,mBAEnBN,EAAUt+I,SAAS,CAACsC,SAAS,EAAOP,QAAOu3I,cAAY,GACzD,IACLxgJ,EAAA,kBAEW,CAAC7C,EAAaqoJ,KACtB,IAAI95I,EAiBJ,OAfIA,EADAvO,EAAKm6C,aAED95C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,gBAKnBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,iBAMvBzJ,IAAAA,cAAA,OACItC,IAAKiC,EAAK5I,GACVkJ,UAAU,mBAEVD,IAAAA,cAAA,OACIC,UAAU,oBACVsO,IAAKusC,EACL1sC,IAAI,gBACJC,MAAM,KACNC,OAAO,OAEXtO,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OACIC,UAAU,mBACV,cAAY,cACdN,EAAKE,aAAa,IAACG,IAAAA,cAACq4C,EAAAA,EAAI,MAAE,IAAE,IAAI,IAACr4C,IAAAA,cAACq4C,EAAAA,EAAI,MACpCr4C,IAAAA,cAAA,QAAMC,UAAU,0BACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,aACH0S,eAAe,4DACfjB,OAAQ,CACJuyC,IAAKp7C,EAAKwgB,mBAM9BngB,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAACka,EAAAA,EAAW,KACRla,IAAAA,cAAA,UACIjJ,GAAE,sBAAA4J,OAAwBhB,EAAKE,cAC/BI,UAAU,gDACV/E,KAAK,SACL,gBAAc,OACd,cAAY,eAEZ8E,IAAAA,cAAA,YAAOkO,EAAM,KACblO,IAAAA,cAAC4zG,EAAAA,EAAY,OAEjB5zG,IAAAA,cAAC4Z,EAAAA,EAAI,CACDO,UAAU,EACVC,UAAWxZ,EAAAA,GAAsB,CAAC7J,GAAI,sCAAuC0S,eAAgB,sCAE7FzJ,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ3nG,MAAOlM,EAAKm6C,aACZxqC,QAASA,IAAM5M,KAAK6lJ,oBAAoB5oJ,EAAMqoJ,GAAW,GACzDx9I,KAAM5J,EAAAA,GAAsB,CAAC7J,GAAI,uCAAwC0S,eAAgB,uBAE7FzJ,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ3nG,KAAMU,QAAQ5M,EAAKm6C,cACnBxqC,QAASA,IAAM5M,KAAK6lJ,oBAAoB5oJ,EAAMqoJ,GAAW,GACzDx9I,KAAM5J,EAAAA,GAAsB,CAAC7J,GAAI,wCAAyC0S,eAAgB,wBAE9FzJ,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAG,eACHuY,QAASA,IAAM5M,KAAK8lJ,mBAAmB7oJ,EAAMqoJ,GAC7Cx9I,KAAM5J,EAAAA,GAAsB,CAAC7J,GAAI,qCAAsC0S,eAAgB,sBAKrG,GAEb,CAED9D,MAAAA,GACI,MAAM,cAAC6D,GAAiB9G,KAAKhD,MAAM6J,KAC7Bk/I,EAAc/lJ,KAAKpK,MAAMqH,KAAKwgB,aACpC,OACIngB,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAC6iJ,EAAAA,EAAS,CACNh3I,MAAOnJ,KAAKpK,MAAMsvJ,iBAClBpE,UAAWh6I,EAAc,CAACzS,GAAI,cAAe0S,eAAgB,iBAAkB,CAACoY,KAAMnf,KAAKhD,MAAMmiB,KAAKhiB,eACtG8jJ,sBAAuBn6I,EAAc,CAACzS,GAAI,8CAA+C0S,eAAgB,kBACzG25I,UAAW1gJ,KAAK0gJ,UAChBL,UAAWrgJ,KAAKqgJ,UAChBp2I,OAAQjK,KAAKiK,OACb82I,mBAAoBj6I,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,eAC1Fi6I,sBAAuBhhJ,KAAKgmJ,mBAC5B,cAAY,eAEhB1oJ,IAAAA,cAACklH,EAAAA,EAAY,CACTr5G,KAAMnJ,KAAKpK,MAAMsvJ,iBACjB15I,MAAO1E,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,8FAA+F,CAACg/I,gBACxKrpJ,QAASoK,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,uPAAwP,CAACg/I,gBACrUltE,kBAAmB/xE,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,6EAA8E,CAACg/I,gBACpKx0F,UAAWvxD,KAAKimJ,sBAChBzgG,SAAUxlD,KAAKkmJ,qBACf7xJ,GAAG,kBAInB,EACHyL,EAhLKmlJ,EAAqB,aAhBvB5kJ,QAAO+C,IAAAA,MAAA,CACHgiJ,0BAAyBhiJ,IAAAA,KAAAC,WACzB02F,WAAU32F,IAAAA,KAAAC,WACV8M,UAAS/M,IAAAA,KAAAC,WACTkiJ,oBAAmBniJ,IAAAA,KAAAC,WACnBsiJ,mBAAkBviJ,IAAAA,KAAAC,WAClBuiJ,iBAAgBxiJ,IAAAA,KAAAC,aAAAA,aA4LxB,SAAeyJ,EAAAA,EAAAA,YAAWm4I,GC3L1B,GAAe7/I,EAAAA,EAAAA,UAjBS8wH,CAACtgI,EAAoB2hC,KAClC,CACHpY,KAAMvpB,EAAMuyB,SAASuS,MAAMA,MAAMnD,EAAS0U,YAItBt4C,IAAkB,CAC1C0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB8/I,0BAAyB,KACzBrrD,WAAU,IACV5pF,UAAS,IACTo1I,oBAAmB,KACnBI,mBAAkB,KAClBC,iBAAgBA,EAAAA,IACjBjyJ,MAGP,CAA4DsxJ,G,wkBCe5D,MAAMkB,WAA4B7oJ,IAAAA,cAC9BsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,yBAUUjM,UACvB,MAAMuyJ,EAAKpmJ,KAAKhD,MAAMuhC,YACtB,GAAIv+B,KAAKhD,MAAM0D,KAAKrM,KAAO+xJ,EAAG/xJ,IAAM+xJ,EAAG1nJ,MAAM+qC,SAAS,gBAClDzpC,KAAKqmJ,aAAarmJ,KAAKhD,MAAM0D,KAAM,iBAChC,CACH,MAAM,MAAC1M,SAAegM,KAAKhD,MAAMqD,QAAQimJ,4BAA4BtmJ,KAAKhD,MAAMuiC,WAAWznB,QAAS9X,KAAKhD,MAAM0D,KAAKrM,IAAI,GAAM,GAC1HL,EACAgM,KAAKgH,SAAS,CAAC6gD,YAAa7zD,EAAM0I,WAElCsD,KAAKhD,MAAMqD,QAAQm3B,QAAQx3B,KAAKhD,MAAM0D,KAAKrM,IAC3C2L,KAAKhD,MAAMqD,QAAQu4I,cAAc54I,KAAKhD,MAAMuiC,WAAWznB,QAAS9X,KAAKhD,MAAM0D,KAAKrM,IAC5E2L,KAAKhD,MAAM0D,KAAKrM,KAAO+xJ,EAAG/xJ,WACpB2L,KAAKhD,MAAMqD,QAAQulJ,mBACzB5lJ,KAAKhD,MAAMqD,QAAQkmJ,iBAAiBvmJ,KAAKhD,MAAM0/B,mBAG3D,KACH58B,GAAA,6BAE8BjM,UAC3B,MAAM,MAACG,SAAegM,KAAKhD,MAAMqD,QAAQmmJ,8BAA8BxmJ,KAAKhD,MAAMuiC,WAAWznB,QAAS9X,KAAKhD,MAAM0D,KAAKrM,IAClHL,GACAgM,KAAKgH,SAAS,CAAC6gD,YAAa7zD,EAAM0I,SACtC,IACHoD,GAAA,wBAEyBjM,UACtB,MAAMuyJ,EAAKpmJ,KAAKhD,MAAMuhC,YACtB,GAAIv+B,KAAKhD,MAAM0D,KAAKrM,KAAO+xJ,EAAG/xJ,IAAM+xJ,EAAG1nJ,MAAM+qC,SAAS,gBAClDzpC,KAAKqmJ,aAAarmJ,KAAKhD,MAAM0D,KAAM,4BAChC,CACH,MAAM,MAAC1M,SAAegM,KAAKhD,MAAMqD,QAAQimJ,4BAA4BtmJ,KAAKhD,MAAMuiC,WAAWznB,QAAS9X,KAAKhD,MAAM0D,KAAKrM,IAAI,GAAM,GAC1HL,EACAgM,KAAKgH,SAAS,CAAC6gD,YAAa7zD,EAAM0I,WAElCsD,KAAKhD,MAAMqD,QAAQm3B,QAAQx3B,KAAKhD,MAAM0D,KAAKrM,IAC3C2L,KAAKhD,MAAMqD,QAAQu4I,cAAc54I,KAAKhD,MAAMuiC,WAAWznB,QAAS9X,KAAKhD,MAAM0D,KAAKrM,IAExF,KACHyL,GAAA,qBAEsB,CAACY,EAAmB0J,KACvCpK,KAAKgH,SAAS,CACV6gD,YAAa7nD,KAAKpK,MAAMiyD,YACxB4+F,iBAAiB,EACjB/lJ,OACA0J,QACF,IACLtK,GAAA,2BAE4B,KACzBE,KAAKgH,SAAS,CACV6gD,YAAa,KACb4+F,iBAAiB,EACjB/lJ,KAAM,KACN0J,KAAM,MACR,IACLtK,GAAA,2BAE4BjM,UACzB,MAAM,MAACG,SAAegM,KAAKhD,MAAMqD,QAAQimJ,4BAA4BtmJ,KAAKhD,MAAMuiC,WAAWznB,QAAS9X,KAAKhD,MAAM0D,KAAKrM,IAAI,GAAM,GAC1HL,EACAgM,KAAKgH,SAAS,CAAC6gD,YAAa7zD,EAAM0I,WAElCsD,KAAKhD,MAAMqD,QAAQm3B,QAAQx3B,KAAKhD,MAAM0D,KAAKrM,KAC3Cgb,EAAAA,GAAAA,KAAaC,KAAKtP,KAAKhD,MAAM0lB,SACjC,IA1EA1iB,KAAKpK,MAAQ,CACTiyD,YAAa,KACb4+F,iBAAiB,EACjB/lJ,KAAM,KACN0J,KAAM,KAEd,CAuEAnH,MAAAA,GACI,IAAI4kD,EAAc,KACd7nD,KAAKpK,MAAMiyD,cACXA,EACIvqD,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,SAAOC,UAAU,2BAA2ByC,KAAKpK,MAAMiyD,eAKnE,MAAM,YAACrkC,EAAW,WAAE+b,EAAU,KAAE7+B,EAAI,KAAEmG,GAAQ7G,KAAKhD,MAEnD,IAAI0pJ,EAAe,KAGfA,GADAjoJ,EAAAA,EAAAA,GAAQiC,EAAKhC,OAETpB,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,UAGhBrG,EAAKhC,MAAMgI,OAAS,IAAK2nF,EAAAA,EAAAA,IAAc3tF,EAAKhC,OAE/CpB,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,iBAGfw4B,EAAW7gC,MAAMgI,OAAS,IAAKuiF,EAAAA,EAAAA,IAAQ1pD,EAAW7gC,QAAW6gC,EAAW6X,aAE5E95C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,eAKnBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,WAK3B,MAAMq/I,EAAKpmJ,KAAKhD,MAAMuhC,YACtB,IAAIooH,IAAkBloJ,EAAAA,EAAAA,GAAQiC,EAAKhC,UAAWuqF,EAAAA,EAAAA,IAAQ1pD,EAAW7gC,QAAU6gC,EAAW6X,iBAAkBi3C,EAAAA,EAAAA,IAAc3tF,EAAKhC,OACvHkoJ,KAAiBnoJ,EAAAA,EAAAA,GAAQiC,EAAKhC,SAAWuqF,EAAAA,EAAAA,IAAQ1pD,EAAW7gC,SAAW2vF,EAAAA,EAAAA,IAAc3tF,EAAKhC,QAAW6gC,EAAW6X,cAEhH12C,EAAK0gB,UAAY,IACjBslI,EACIppJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,aAGvB4/I,GAAiB,EACjBC,GAAgB,GAGpB,MAAMC,EAAoBnmJ,EAAKrM,KAAO+xJ,EAAG/xJ,OAAQmvB,SAAAA,EAAa0oF,oBAAqBxrG,EAAKnC,QAExF,IAAIuoJ,EAAkB,KACtB,GAAIpmJ,EAAKrM,KAAO+xJ,EAAG/xJ,GAAI,CACnB,MAAMmX,EACFlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+CACH0S,eAAe,4CAIjBrK,EACFY,IAAAA,cAAA,WACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iDACH0S,eAAe,mPAEnBzJ,IAAAA,cAAA,WACAA,IAAAA,cAAA,WACAA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2CACH0S,eAAe,yCACfjB,OAAQ,CACJjI,SAAUuoJ,EAAGvoJ,YAGpBgqD,GAIHk/F,EACFzpJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,qBAIvB+/I,EACIxpJ,IAAAA,cAACklH,EAAAA,EAAY,CACTr5G,KAAMnJ,KAAKpK,MAAM6wJ,gBACjBj7I,MAAOA,EACP9O,QAASA,EACTm8E,kBAAmBkuE,EACnBx1F,UAAWvxD,KAAKgnJ,mBAChBxhG,SAAUxlD,KAAKinJ,oBAG3B,CAEA,IAAKJ,IAAsBD,IAAkBD,EACzC,OAAOrpJ,IAAAA,cAAA,WAAMopJ,GAGjB,MAAM,MAACz6I,EAAK,WAAEqrF,GAAct3F,KAAKhD,MACjC,IAAIohE,GAAS,EACTk5B,EAlOwB,GAkOoBA,EAAarrF,GAlOjC,IAmOxBmyD,GAAS,GAGb,MAAM8oF,EACF5pJ,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAG,iBACHuY,QAAS5M,KAAKmnJ,qBACdr/I,KACIxK,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,uBAKzBqgJ,EACF9pJ,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZlkG,QAAS5M,KAAKqnJ,gBACdv/I,KACIxK,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,sBAKzBugJ,EACFhqJ,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZlkG,QAAS5M,KAAKunJ,iBACdz/I,KACIxK,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,uBAK/B,OACIzJ,IAAAA,cAACka,EAAAA,EAAW,KACRla,IAAAA,cAAA,UACIjJ,GAAE,uBAAA4J,OAAyByC,EAAK7C,UAChCN,UAAU,gDACV/E,KAAK,SACL,gBAAc,QAEd8E,IAAAA,cAAA,YAAOopJ,EAAa,KACpBppJ,IAAAA,cAAC4zG,EAAAA,EAAY,OAEjB5zG,IAAAA,cAAA,WACIA,IAAAA,cAAC4Z,EAAAA,EAAI,CACDO,UAAU,EACV2mD,OAAQA,EACR1mD,UAAW7Q,EAAKC,cAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,sCAEzF8/I,EAAoBK,EAAa,KACjCN,EAAgBQ,EAAgB,KAChCT,EAAiBW,EAAiB,MAEtCR,EACAj/F,GAIjB,EACH/nD,GApQKqmJ,GAAmB,aAzBrBzjI,QAAOtf,IAAAA,OAAAC,WAEP4I,MAAK7I,IAAAA,OAAAC,WACLi0F,WAAUl0F,IAAAA,OAAAC,WAEVhD,QAAO+C,IAAAA,MAAA,CACHwiJ,iBAAgBxiJ,IAAAA,KAAAC,WAChBkjJ,iBAAgBnjJ,IAAAA,KAAAC,WAChBm0B,QAAOp0B,IAAAA,KAAAC,WACPu1I,cAAax1I,IAAAA,KAAAC,WACbsqG,aAAYvqG,IAAAA,KAAAC,WACZyV,gBAAe1V,IAAAA,KAAAC,WACfijJ,4BAA2BljJ,IAAAA,KAAAC,WAC3BmkJ,iBAAgBpkJ,IAAAA,KAAAC,WAChBmjJ,8BAA6BpjJ,IAAAA,KAAAC,aAAAA,aAiRrC,UAAeyJ,EAAAA,EAAAA,YAAWq5I,ICvQ1B,IAAe/gJ,EAAAA,EAAAA,UAzBf,SAAyBxP,GACrB,MAAO,CACH2oC,aAAale,EAAAA,EAAAA,IAAezqB,GAC5B8sB,SAASE,EAAAA,EAAAA,IAA0BhtB,GACnC4tB,aAAaC,EAAAA,EAAAA,IAAe7tB,GAC5B8mC,kBAAkBliB,EAAAA,GAAAA,IAA0B5kB,GAEpD,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBsgJ,iBAAgB,KAChBW,iBAAgB,KAChB/uH,QAAO,MACPohH,cAAa,KACbjrC,aAAY,KACZ70F,gBAAe,MACf0uI,iBAAgB,MAChBlB,4BAA2B,KAC3BE,8BAA6BA,GAAAA,IAC9B7yJ,GAEX,GAEA,CAA4DwyJ,I,yaCR7C,MAAMsB,WAAuBnqJ,IAAAA,cAGxCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,qBAmEF,KACXE,KAAKgH,SAAS,CAACsC,SAAS,GAAO,IAClCxJ,GAAA,iBAEUjM,UACPmM,KAAKgH,SAAS,CAACsC,SAAS,UAClB+e,QAAQyuB,IAAI,CACd92C,KAAKhD,MAAMqD,QAAQqnJ,2BAA2BnrJ,EAxGnC,GAwGyDyD,KAAKhD,MAAMqmB,cAAe,CAACxQ,QAAQ,IACvG7S,KAAKhD,MAAMqD,QAAQsnJ,eAAe3nJ,KAAKhD,MAAMqmB,cAAe9mB,EAAMwmB,EAAAA,GAAU6kI,2BACxE,CACIzxF,KAAM0xF,EAAAA,GAAMC,qBACZC,uBAAuB,MAInC/nJ,KAAKgoJ,cAAc,IACtBloJ,GAAA,eAESo1B,IACNl1B,KAAKhD,MAAMqD,QAAQ40B,mBAAmBC,EAAK,IApF3Cl1B,KAAKs4C,gBAAkB,EAEvBt4C,KAAKpK,MAAQ,CACT0T,SAAS,EAEjB,CAEA,uBAAMivC,SACIlwB,QAAQyuB,IAAI,CACd92C,KAAKhD,MAAMqD,QAAQqnJ,2BAA2B,EAAG3kI,EAAAA,GAAUklI,mBAAoBjoJ,KAAKhD,MAAMqmB,cAAe,CAACxQ,QAAQ,IAClH7S,KAAKhD,MAAMqD,QAAQsnJ,eAAe3nJ,KAAKhD,MAAMqmB,cAAe,EAAGN,EAAAA,GAAU6kI,2BACrE,CACIzxF,KAAM0xF,EAAAA,GAAMC,qBACZC,uBAAuB,IAG/B/nJ,KAAKhD,MAAMqD,QAAQstG,aAAa3tG,KAAKhD,MAAMqmB,iBAE/CrjB,KAAKgoJ,cACT,CAEA1qF,oBAAAA,GACIt9D,KAAKhD,MAAMqD,QAAQ40B,mBAAmB,GAC1C,CAEAwjB,kBAAAA,CAAmBC,GACf,GAAIA,EAAUd,aAAe53C,KAAKhD,MAAM46C,WAAY,CAChD/E,aAAa7yC,KAAKs4C,iBAElB,MAAMV,EAAa53C,KAAKhD,MAAM46C,WAC9B,GAAmB,KAAfA,EAGA,OAFA53C,KAAKgoJ,oBACLhoJ,KAAKs4C,gBAAkB,GAI3B,MAAMA,EAAkBtpC,OAAOuZ,YAC3B10B,UACI,MAAM,4BACFgpD,EAA2B,+BAC3BqrG,EAA8B,eAC9BpsG,GACA97C,KAAKhD,MAAMqD,SACT,KAACpM,SAAc6nD,EAAelE,EAAY,CAAC9/B,QAAS9X,KAAKhD,MAAMqmB,gBAEjEi1B,IAAoBt4C,KAAKs4C,kBAI7Bt4C,KAAKgH,SAAS,CAACsC,SAAS,IAExBuzC,EAA4B5oD,GAC5Bi0J,EAA+Bj0J,EAAM+L,KAAKhD,MAAMqmB,eAAe,GAAM7Z,MAAK/T,IAA2B,IAAzBxB,KAAMk0J,GAAc1yJ,EACxF0yJ,GACAnoJ,KAAKgoJ,cACT,IACF,GAENjlI,EAAAA,GAAU41B,6BAGd34C,KAAKs4C,gBAAkBA,CAC3B,CACJ,CAwBAr1C,MAAAA,GACI,IAAImlJ,EACApoJ,KAAKhD,MAAMqrJ,uBACXD,EAAsB,CAACjC,KAG3B,MAAM7mH,EAAct/B,KAAKhD,MAAMsiC,YACzB9+B,EAAQR,KAAKhD,MAAMwD,MACnB8nJ,EAIF,CAAC,EAEL,IAAIC,EACJ,GAAIvoJ,KAAKpK,MAAM0T,QACXi/I,EAAiB,SACd,CACHA,EAAiB,GAEjB,IAAK,IAAI7oH,EAAI,EAAGA,EAAIl/B,EAAMkG,OAAQg5B,IAAK,CACnC,MAAMh/B,EAAOF,EAAMk/B,GAEfJ,EAAY5+B,EAAKrM,KAA0B,IAAnBqM,EAAK0gB,YAC7BmnI,EAAej5I,KAAK5O,GACpB4nJ,EAAgB5nJ,EAAKrM,IAAM,CACvBkrC,WAAYD,EAAY5+B,EAAKrM,KAGzC,CACJ,CAEA,OACIiJ,IAAAA,cAACkrJ,GAAAA,EAAkB,CACfhoJ,MAAO+nJ,EACPE,aA1JO,GA2JPlzI,MAAOvV,KAAKhD,MAAM0rJ,iBAClB/qD,SAAU39F,KAAK29F,SACfz9E,OAAQlgB,KAAKkgB,OACb7f,QAAS+nJ,EACTE,gBAAiBA,EACjBK,cAAez7H,GAAAA,MAG3B,EACHptB,GA1IoB2nJ,GAAc,aAvB/B7vG,WAAUx0C,IAAAA,OAAAC,WACV7C,MAAK4C,IAAAA,MAAAC,WAILggB,cAAajgB,IAAAA,OAAAC,WACbqlJ,iBAAgBtlJ,IAAAA,OAAAC,WAChBglJ,qBAAoBjlJ,IAAAA,KACpB/C,QAAO+C,IAAAA,MAAA,CACHukJ,eAAcvkJ,IAAAA,KAAAC,WACdy4C,eAAc14C,IAAAA,KAAAC,WACdsqG,aAAYvqG,IAAAA,KAAAC,WACZqkJ,2BAA0BtkJ,IAAAA,KAAAC,WAC1Bw5C,4BAA2Bz5C,IAAAA,KAAAC,WAC3B6kJ,+BAA8B9kJ,IAAAA,KAAAC,WAC9B4xB,mBAAkB7xB,IAAAA,KAAAC,aAAAA,aC6B1B,UAAe+B,EAAAA,EAAAA,UAtCf,SAAyBxP,EAAoB2hC,GACzC,MAAM8wH,GAAuB/mH,EAAAA,EAAAA,IAAoB1rC,EAAO2hC,EAAS5/B,OAAQwyB,EAAAA,GAAYy+H,mBAE/EhxG,EAAahiD,EAAM8kD,MAAMx6B,OAAOy6B,YAEtC,IAAIn6C,EAEAA,EADAo3C,GACQixG,EAAAA,EAAAA,IAA4BjzJ,EAAOgiD,IAEnCkxG,EAAAA,EAAAA,IAAyBlzJ,GAGrC,MAAM0nB,GAAQyrI,EAAAA,EAAAA,IAAoBnzJ,IAAU,CAACozJ,oBAAqB,GAElE,MAAO,CACHpxG,aACAp3C,QACA8+B,aAAasvE,EAAAA,EAAAA,IAAwBh5G,IAAU,CAAC,EAChDytB,cAAeztB,EAAMuyB,SAASuS,MAAMrX,cACpCqlI,iBAAkBprI,EAAM0rI,oBACxBX,uBAER,IAEA,SAA4B10J,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBw2C,eAAc,KACd6xD,aAAY,KACZg6C,eAAc,KACdD,2BAA0B,MAC1B7qG,4BAA2B,MAC3BqrG,+BAA8B,MAC9BjzH,mBAAkBA,GAAAA,IACnBthC,GAEX,GAEA,CAA4D8zJ,I,0ZChC7C,MAAMwB,WAAyB3rJ,IAAAA,cAC1CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,mBAaJ,KACTE,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAC/BrJ,GAAA,2BAEoB,KACjB,MAAM,QAACO,GAAWL,KAAKhD,MAEvBqD,EAAQ8P,UAAU,CACdC,QAASC,EAAAA,GAAiBoiB,WAC1BliB,WAAYmiB,EAAAA,UAGhB1yB,KAAKiI,YAAY,IAvBjBjI,KAAKpK,MAAQ,CACTuT,MAAM,EAEd,CAEAovC,iBAAAA,GACQv4C,KAAKhD,MAAMksJ,QACXlpJ,KAAKhD,MAAMksJ,QAEnB,CAiBAjmJ,MAAAA,GAAS,IAAA21C,EAAAuwG,EACL,IAAIC,EAAkB,GAKtB,OAJIppJ,KAAKhD,MAAMwmB,cACX4lI,EAAkBppJ,KAAKhD,MAAMwmB,YAAYrmB,cAIzCG,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,yBAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiI,WACbiC,SAAUlK,KAAKhD,MAAMkN,SACrBE,KAAK,OACL,kBAAgB,uBAChB/V,GAAG,oBAEHiJ,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,wBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,iBACfjB,OAAQ,CACJqZ,KAAMiqI,MAIlB9rJ,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAA8B,QAAxBihD,EAAE54C,KAAKhD,MAAMwmB,mBAAW,IAAAo1B,OAAA,EAAtBA,EAAwBvkD,GAChC6rI,YAAa,CAAC/1G,GAAAA,EAAYkwH,iBAAkBlwH,GAAAA,EAAY8kF,eAExD3xG,IAAAA,cAAA,UACIjJ,GAAG,eACHmE,KAAK,SACL+E,UAAU,2CACVqP,QAAS5M,KAAKspJ,oBAEdhsJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,qBAK/BzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAACmqJ,GAAc,CACX9vJ,OAA8B,QAAxBwxJ,EAAEnpJ,KAAKhD,MAAMwmB,mBAAW,IAAA2lI,OAAA,EAAtBA,EAAwB90J,MAKpD,EACHyL,GApFoBmpJ,GAAgB,aAXjC/+I,SAAQ9G,IAAAA,KAAAC,WACR6lJ,OAAM9lJ,IAAAA,KACN/C,QAAO+C,IAAAA,MAAA,CACH+M,UAAS/M,IAAAA,KAAAC,aAAAA,aCUjB,UAAe+B,EAAAA,EAAAA,UAhBf,SAAyBxP,GACrB,MAAMwa,EAAUC,EAAAA,GAAiBk5I,aACjC,MAAO,CACH/lI,aAAaC,EAAAA,EAAAA,IAAe7tB,GAC5BuT,MAAMutF,EAAAA,EAAAA,GAAY9gG,EAAOwa,GAEjC,IAEA,SAA4Bzc,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAASA,EAAAA,GACVxc,GAEX,GAEA,CAA4Ds1J,I,qFCd5D,SAASO,GAAgB/zJ,GAA8F,IAA7F,aAAC6U,EAAY,aAAEihE,EAAY,YAAEtyC,EAAW,eAAEwwH,GAAiB,EAAK,MAAE7zJ,EAAQ,WAAiBH,EACjH,MAAMi0J,EAAiBj1G,KAAW,wBAAyB,CAACzgD,MAAOy1J,GAA4B,UAAV7zJ,GAAoB,CAAC+zJ,MAAiB,UAAV/zJ,IAC3Gg0J,EAAmBn1G,KAAW,iCAAkC,CAACzgD,MAAOy1J,GAA4B,UAAV7zJ,GAAoB,CAAC+zJ,MAAiB,UAAV/zJ,IACtHi0J,EAAwBp1G,KAAW,oCAAqC,CAACzgD,MAAOy1J,GAA4B,UAAV7zJ,GAAoB,CAAC+zJ,MAAiB,UAAV/zJ,IAC9Hk0J,EAAsBr1G,KAAW,kCAAmC,CAACzgD,MAAOy1J,GAA4B,UAAV7zJ,GAAoB,CAAC+zJ,MAAiB,UAAV/zJ,IA2FhI,OAzFA8sD,EAAAA,EAAAA,YAAU,KACN,IAAImqB,EAOJ,MANc,UAAVj3E,IACAi3E,EAAYtkD,YAAW,KACnB0Q,GAAa,GACd,OAGA,IAAM4Z,aAAag6B,EAAU,GACrC,CAAC5zC,EAAarjC,IAiFb0H,IAAAA,cAAA,OAAKC,UAAWmsJ,GACZpsJ,IAAAA,cAAA,KAAGC,UAAWqsJ,GACVtsJ,IAAAA,cAAC89E,GAAAA,uBAAsB,CACnBh9E,KAAM,GACNuuD,MAAO,iBAlFf88F,GAA4B,YAAV7zJ,EAEd0H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,6BAKb,UAAVnR,EAEI0H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,4CAMvBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,oBAMT,UAAVnR,EAEI0H,IAAAA,cAAA,OAAKC,UAAU,kCACXD,IAAAA,cAAA,UACIjJ,GAAG,mBACH,cAAY,mBACZmE,KAAK,SACL+E,UAAU,sBACVqP,QAASqsB,GAET37B,IAAAA,cAAA,KACIC,UAAU,sBAQ1BD,IAAAA,cAAA,OAAKC,UAAU,kCACXD,IAAAA,cAAA,UACI,cAAY,oCACZC,UAAWssJ,EACXj9I,QAAS2+D,GAETjuE,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,UAGvBzJ,IAAAA,cAAA,UACI,cAAY,kCACZC,UAAWusJ,EACXl9I,QAAStC,GAEE,UAAV1U,EACG0H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,cAEnBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wBACH0S,eAAe,WAoB3C,CAACyiJ,GAAA7jJ,UAAA,CAjHG2E,aAAYlH,IAAAA,KAAAC,WACZkoE,aAAYnoE,IAAAA,KAAAC,WACZ41B,YAAW71B,IAAAA,KAAAC,WACXomJ,eAAcrmJ,IAAAA,MA+GlB,Y,8+BCvHA,MAAMtG,GAAa,CACfitJ,kBAAmB,MAkBjBrqJ,GAAS,CACXy+E,QAAUo0C,GAAyBn+H,GAAAA,GAAA,GAC5Bm+H,GAAU,IACbjrB,WAAY,oCAEhB/iD,MAAQguE,GAAyBn+H,GAAAA,GAAA,GAC1Bm+H,GAAU,IACb5lE,MAAO,gDAEXq9F,WAAaz3B,GAAyBn+H,GAAAA,GAAA,GAC/Bm+H,GAAU,IACb03B,aAAc,OACd3iD,WAAY,8CACZL,QAAS,OACTkL,WAAY,WAEhB+3C,gBAAkB33B,GAAyBn+H,GAAAA,GAAA,GACpCm+H,GAAU,IACbz0C,QAAS,mBACTnxB,MAAO,8BACPw9F,WAAY,YACZh/I,SAAU,OACVi/I,WAAY,IACZC,WAAY,OACZC,cAAe,UAEnBC,iBAAmBh4B,GAAyBn+H,GAAAA,GAAA,GACrCm+H,GAAU,IACb03B,aAAc,MACd3iD,WAAY,8CACZ6iD,WAAY,gBACZh/I,SAAU,OACVi/I,WAAY,IACZz9F,MAAO,QACPhhD,MAAO,OACPC,OAAQ,OACRkyE,QAAS,EACTg7B,YAAa,MACb,SAAU,CACNxR,WAAY,8CACZ36C,MAAO,YAyDnB,GApDwBl3D,IAA6F,IAA5F,YAACkM,EAAW,MAAEb,EAAK,mBAAE0pJ,EAAkB,SAAEvqJ,EAAQ,GAAE5L,EAAE,YAAE+K,EAAW,YAAE5B,GAAmB/H,EAC5G,MAAOg1J,EAAYC,GAAiBptJ,IAAAA,SAAe,IAE7CqtJ,GAAkB5zI,EAAAA,EAAAA,cAAY,KAE5BjW,SAAAA,EAAO2oC,SAASghH,EAAW59H,SAAiC,IAAtB49H,EAAW/jJ,SAGrD8jJ,EAAmBC,GACnBC,EAAc,IAAG,GAClB,CAACF,EAAoBC,EAAY3pJ,IAE9BsrE,GAAsCr1D,EAAAA,EAAAA,cAAa5B,IACrD,GAAKs1I,EAGL,OAAQt1I,EAAMna,KACd,IAAK,IACL,IAAK,IACL,IAAK,QACD2vJ,IACAx1I,EAAMjO,iBACV,GACD,CAACujJ,EAAYE,IAEVC,GAAe3zI,EAAAA,EAAAA,UAAQ,IAClBnW,EAAMH,KAAKkqJ,IAAW,CAAO3rJ,MAAO2rJ,EAAa/pJ,MAAO+pJ,OAChE,CAAC/pJ,IAEJ,OACIxD,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACwtJ,GAAAA,GAAe,CACZz2J,GAAIA,EACJkJ,UAAU,oBACVmC,OAAQA,GACR5C,WAAYA,GACZsC,YAAaA,EACba,UAAU8W,EAAAA,EAAAA,cAAajW,GAAUb,EAASa,IAAmC,CAACb,IAC9EwqJ,WAAYA,EACZxoJ,SAAS,EACT8oJ,YAAY,EACZC,cAAeN,EACfz2E,UAAW7H,EACXzqE,YAAaA,EACbb,MAAO8pJ,EACPt2E,OAAQq2E,IAEXntJ,EAAcF,IAAAA,cAAA,KAAGC,UAAU,2BAA2BC,QAAmBlF,EAC3E,E,gBCxGX,MAAM2yJ,GAAuBx1J,IAAyF,IAAxF,eAACy1J,EAAc,kBAAEC,EAAiB,cAAEC,EAAa,yBAAEC,GAAgC51J,EAC7G,MAAO61J,EAAoBC,IAAyB10I,EAAAA,EAAAA,UAAkBq0I,EAAexkJ,OAAS,IACxF,cAACI,IAAiBgQ,EAAAA,EAAAA,WAElB00I,GAA6Bz0I,EAAAA,EAAAA,cAAaq4G,IAC5Cm8B,EAAsBn8B,GACjBA,GACD+7B,EAAkB,GACtB,GACD,CAACA,IAEEM,GAAuB10I,EAAAA,EAAAA,cAAa20I,IACtCN,GAAc,GACdC,EAAyB,WACzBF,EAAkB,IAAID,EAAgBQ,GAAQ,GAC/C,CAACR,EAAgBC,EAAmBC,EAAeC,IAEhDM,GAAwB50I,EAAAA,EAAAA,cAAa60I,IACvCR,GAAc,GACdC,EAAyB,WACzBF,GAAkBS,aAAqB,EAArBA,EAAuBjrJ,KAAK+qJ,GAAWA,EAAO5qJ,UAAU,GAAG,GAC9E,CAACqqJ,EAAmBC,EAAeC,IAEtC,OACI/tJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACuuJ,GAAAA,EAAmB,CAChBC,gBACIxuJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,oEAGvB,cAAY,yBACZxJ,UAAU,iCACViO,MAAO1E,EAAc,CACjBzS,GAAI,kCACJ0S,eAAgB,uCAEpBvJ,YAAasJ,EAAc,CACvBzS,GAAI,iCACJ0S,eAAgB,gHAEpBglJ,yBAAyB,EACzBC,eAAgB,CAACvuJ,KAAM,QACvBwuJ,gBAAiBX,EACjBptF,aAAcstF,IAEjBF,GACDhuJ,IAAAA,cAAC4uJ,GAAe,CACZ73J,GAAG,iBACHsN,YAAamF,EAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,wCACrF,aAAYD,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,oBACvFjG,MAAOoqJ,EACPjrJ,SAAU0rJ,EACVnB,mBAAoBiB,EACpBrsJ,aAAa,EACb5B,YAAasJ,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,mEAGtF,EAETkkJ,GAAAtlJ,UAAA,CAnEEulJ,eAAc9nJ,IAAAA,QAAAA,IAAAA,QAAAC,WACd8nJ,kBAAiB/nJ,IAAAA,KAAAC,WACjB+nJ,cAAahoJ,IAAAA,KAAAC,WACbgoJ,yBAAwBjoJ,IAAAA,KAAAC,YAkE5B,Y,2BC3DA,MAAMkxB,IAAeigC,EAAAA,EAAAA,gBAAe,CAChC23F,2BAA4B,CACxB93J,GAAI,4CACJ0S,eAAgB,qEAQlBqlJ,GAAqB32J,IAAqC,IAAA42J,EAAA,IAApC,uBAAC7R,GAA8B/kJ,EACvD,MAAM0pB,GAAOk1B,EAAAA,EAAAA,cAAaz+C,IAAuB6tB,EAAAA,EAAAA,IAAe7tB,KAC1D02J,GAAuBj4G,EAAAA,EAAAA,cAAaz+C,IAAuB0rC,EAAAA,EAAAA,IAAoB1rC,GAAOupB,aAAI,EAAJA,EAAM9qB,KAAM,GAAI81B,EAAAA,GAAYoiI,gBACjHC,EAAUC,IAAe51I,EAAAA,EAAAA,UAA2C,QAAnCw1I,EAAoBltI,aAAI,EAAJA,EAAMutI,iBAAS,IAAAL,EAAAA,EAAI,KACxEM,EAAeC,IAAoB/1I,EAAAA,EAAAA,aACpC,cAAC/P,IAAiBgQ,EAAAA,EAAAA,YAExB4rC,EAAAA,EAAAA,YAAU,KACN+pG,GAAYttI,aAAI,EAAJA,EAAMutI,YAAa,GAAG,GACnC,CAACvtI,aAAI,EAAJA,EAAMutI,YAEV,MAAMG,GAA2B91I,EAAAA,EAAAA,cAAYljB,UACzC,MAAM,KAACI,EAAI,MAAED,SAAewmJ,GAAuBr7H,aAAI,EAAJA,EAAM9qB,KAAM,IAE3DJ,SAAAA,EAAMy4J,UACND,EAAYx4J,EAAKy4J,WAIjB14J,GACA44J,EAAiBr4H,GAAa43H,2BAClC,GACD,CAAC3R,EAAwBr7H,aAAI,EAAJA,EAAM9qB,KAElC,IAAKi4J,EACD,OAAO,KAEX,MAAMQ,EACFxvJ,IAAAA,cAAA,OACI,cAAY,sBACZjJ,GAAG,uBAEHiJ,IAAAA,cAAC4mH,GAAAA,EAAK,CACF7vH,GAAG,eACHmE,KAAK,OACLsI,MAAO0rJ,EACPloJ,UAAW,KAEfhH,IAAAA,cAAA,UACI,cAAY,mBACZjJ,GAAG,mBACHkJ,UAAU,mBACVqP,QAASigJ,GAETvvJ,IAAAA,cAACyvJ,GAAAA,YAAW,MACXjmJ,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,iBAK1E,OACIzJ,IAAAA,cAAC0vJ,GAAAA,EAAe,CACZzvJ,UAAU,wBACViO,MAAO1E,EAAc,CACjBzS,GAAI,wBACJ0S,eAAgB,gBAEpBvJ,YAAasJ,EAAc,CACvBzS,GAAI,2BACJ0S,eAAgB,6MAGpB2yF,QAASozD,EACT94J,MAAO24J,EACPZ,yBAAyB,GAC3B,EAERK,GAAAzmJ,UAAA,CAtEE60I,uBAAsBp3I,IAAAA,KAAAC,YAwE1B,Y,gBCrFA,MAAM4pJ,GAAax3J,IAAsE,IAArE,mBAACy3J,EAAkB,gBAAEC,EAAe,mBAAEC,GAA0B33J,EAChF,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WACxB,GAAIo2I,EAAoB,CACpB,MAAMG,EACF/vJ,IAAAA,cAAA,KAAGjJ,GAAG,2BACFyS,EAAc,CACVzS,GAAI,uDACJ0S,eAAgB,wFACjB,CACCmuE,KAAOjoE,GACH3P,IAAAA,cAAC03C,GAAAA,EAAY,CACTvB,KAAK,6EACLhkC,SAAS,eAERxC,MAMrB,OACI3P,IAAAA,cAAC0vJ,GAAAA,EAAe,CACZzvJ,UAAU,gCACViO,MAAO1E,EAAc,CACjBzS,GAAI,6BACJ0S,eAAgB,yBAEpBvJ,YAAasJ,EAAc,CACvBzS,GAAI,6BACJ0S,eAAgB,wNAEpBglJ,yBAAyB,EACzBryD,QAAS2zD,GAGrB,CAEA,OACI/vJ,IAAAA,cAACuuJ,GAAAA,EAAmB,CAChBtuJ,UAAU,gCACVuuJ,gBACIxuJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,oEAGvBilJ,eAAgB,CAACvuJ,KAAM,QACvBwuJ,gBAAiBkB,EACjBjvF,aAAckvF,EACd5hJ,MAAO1E,EAAc,CACjBzS,GAAI,6BACJ0S,eAAgB,yBAEpBvJ,YAAasJ,EAAc,CACvBzS,GAAI,6BACJ0S,eAAgB,wNAEpBglJ,yBAAyB,GAC3B,EAERkB,GAAAtnJ,UAAA,CAjEEwnJ,gBAAe/pJ,IAAAA,KAAAC,WACf6pJ,mBAAkB9pJ,IAAAA,KAClBgqJ,mBAAkBhqJ,IAAAA,KAAAC,YAiEtB,YC7DMiqJ,GAAgCpC,GAC7BA,GAA4C,IAA1BA,EAAexkJ,QAGnBwkJ,EAAezhH,SAAS,KAAOyhH,EAAeppH,MAAM,KAAO,CAACopH,IAC7DvqJ,KAAK+qJ,GAAWA,EAAO7+H,SAH9B,GCkBf,IAJkBznB,EAAAA,EAAAA,SAAQ,MAT1B,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBioJ,UAAS,KACT/S,uBAAsBA,EAAAA,IACvB7mJ,GAEX,GAMA,EDVkB8B,IAA2H,IAAA+3J,EAAA,IAA1H,WAACzzD,EAAU,cAAE0zD,EAAa,kBAAEC,EAAiB,WAAEC,EAAU,qBAAEC,EAAoB,cAAExC,EAAa,KAAEjsI,EAAI,QAAE9e,GAAe5K,EACpI,MAAOy1J,EAAgBC,IAAqBt0I,EAAAA,EAAAA,WAAmB,IAAMy2I,GAA6BnuI,EAAK0uI,oBAChGV,EAAiBC,IAAsBv2I,EAAAA,EAAAA,UAAwC,QAAhC22I,EAAUruI,EAAK2uI,yBAAiB,IAAAN,GAAAA,IAC/EO,EAAuB1C,IAA4Bx0I,EAAAA,EAAAA,aACpD,cAAC/P,IAAiBgQ,EAAAA,EAAAA,WAElBk3I,GAA6Bj3I,EAAAA,EAAAA,cAAYljB,UAC3C,MAAM,MAACG,SAAeqM,EAAQktJ,UAAU,CACpCl5J,GAAI8qB,EAAK9qB,GACTw5J,gBAA2C,IAA1B3C,EAAexkJ,OAAewkJ,EAAe,GAAKA,EAAejkG,KAAK,QAE3F,OAAIjzD,CAGO,GACZ,CAACqM,EAAS6qJ,EAAgB/rI,IAEvB8uI,GAAyBl3I,EAAAA,EAAAA,cAAYljB,UACvC,GAAIs5J,IAAoBhuI,EAAK2uI,kBACzB,OAAO,EAEX,MAAM75J,EAAO,CACTI,GAAI8qB,EAAK9qB,GACTy5J,kBAAmBX,IAGjB,MAACn5J,SAAeqM,EAAQktJ,UAAUt5J,GACxC,OAAID,CAGO,GACZ,CAACqM,EAAS8sJ,EAAiBhuI,IAExB+uI,GAAmBn3I,EAAAA,EAAAA,cAAajW,IAClCsqJ,GAAc,GACdC,EAAyB,WACzB+B,EAAmBtsJ,EAAM,GAC1B,CAACsqJ,IAEEnyH,GAAcliB,EAAAA,EAAAA,cAAY,KAC5Bs0I,EAAyB,WACzBD,GAAc,GACdwC,GAAqB,EAAM,GAC5B,CAACA,EAAsBxC,IAEpB7/E,GAAex0D,EAAAA,EAAAA,cAAY,KAAM,IAAAo3I,EACnChD,EAAkBmC,GAA6BnuI,EAAK0uI,kBACpDT,EAAyC,QAAvBe,EAAChvI,EAAK2uI,yBAAiB,IAAAK,GAAAA,GACzCl1H,GAAa,GACd,CAACA,EAAa9Z,EAAK2uI,kBAAmB3uI,EAAK0uI,kBAExCO,GAAuBr3I,EAAAA,EAAAA,cAAY,KACjC42I,EACAC,GAAqB,GAGzBH,GAAe,GAChB,CAACA,EAAeE,EAAYC,IAEzBS,GAAoBt3I,EAAAA,EAAAA,cAAYljB,UAClC,MAAMy6J,QAA6BN,IAC7BO,QAA0BN,IAC3BK,GAAyBC,GAI9BlD,EAAyB,SACzBuC,GAAqB,IAJjBvC,EAAyB,QAIF,GAC5B,CAAC2C,EAA4BC,EAAwBL,IAExD,OACItwJ,IAAAA,cAACkxJ,GAAAA,EAAY,CACT90D,QACIp8F,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,UACIjJ,GAAG,cACHmE,KAAK,SACL+E,UAAU,QACV,eAAa,QACbqP,QAASmtF,GAETz8F,IAAAA,cAAA,QAAM,cAAY,QAAQ,MAE9BA,IAAAA,cAAA,MAAIC,UAAU,eACVD,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,KACIC,UAAU,mBACV,aAAYuJ,EAAc,CACtBzS,GAAI,yBACJ0S,eAAgB,kBAEpB6F,QAASwhJ,KAGjB9wJ,IAAAA,cAAA,YAAOwJ,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,qBAG/EzJ,IAAAA,cAAA,OAAKC,UAAU,0CACV4hB,EAAK+sF,uBACF5zG,EACAgF,IAAAA,cAAC2tJ,GAAoB,CACjBC,eAAgBA,EAChBC,kBAAmBA,EACnBC,cAAeA,EACfC,yBAA0BA,IAGlC/tJ,IAAAA,cAAA,OAAKC,UAAU,kBACfD,IAAAA,cAAC2vJ,GAAU,CACPC,mBAAoB/tI,EAAK+sF,kBACzBihD,gBAAiBA,EACjBC,mBAAoBc,IAExB5wJ,IAAAA,cAAA,OAAKC,UAAU,kBACd4hB,EAAK+sF,uBACF5zG,EACAgF,IAAAA,cAAC8uJ,GAAkB,CAAC5R,uBAAwBn6I,EAAQm6I,yBAEvDmT,EACGrwJ,IAAAA,cAACksJ,GAAgB,CACbj+E,aAAcA,EACdjhE,aAAc+jJ,EACdp1H,YAAaA,EACbwwH,eAAgBiE,EAChB93J,MAAOm4J,SACNz1J,KAIvB,I,SEzIV,MAiCA,GAjC+B7C,IAAiE,IAAhE,yBAACg5J,EAAwB,YAAEC,EAAW,YAAElxJ,GAAmB/H,EACvF,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB63I,GAAoB53I,EAAAA,EAAAA,cAAata,IACnCgyJ,EAAyBhyJ,EAAEq7D,OAAOh3D,MAAM,GACzC,CAAC2tJ,IAEEG,EACFtxJ,IAAAA,cAAC4mH,GAAAA,EAAK,CACF7vH,GAAG,kBACH,cAAY,uBACZw6J,mBAAmB,4BACnBr2J,KAAK,WACL8L,UAAWye,EAAAA,GAAU+rI,2BACrB7uJ,SAAU0uJ,EACV7tJ,MAAOtD,EACP0B,MAAO4H,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,kBAIjF,OACIzJ,IAAAA,cAAC0vJ,GAAAA,EAAe,CACZxvJ,YAAasJ,EAAc,CACvBzS,GAAI,kCACJ0S,eAAgB,oHAEpB2yF,QAASk1D,EACTrxJ,UAAU,2BACVvJ,MAAO06J,GACT,ECIV,GAjCwBj5J,IAAmD,IAAlD,YAACi5J,EAAW,kBAAEK,EAAiB,KAAEtxJ,GAAYhI,EAClE,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElBk4I,GAAaj4I,EAAAA,EAAAA,cAAata,GAAqCsyJ,EAAkBtyJ,EAAEq7D,OAAOh3D,QAAQ,CAACiuJ,IAEnGE,EACF3xJ,IAAAA,cAAC4mH,GAAAA,EAAK,CACF7vH,GAAG,WACH,cAAY,gBACZmE,KAAK,OACL8L,UAAWye,EAAAA,GAAUmsI,oBACrBjvJ,SAAU+uJ,EACVluJ,MAAOrD,EACPyB,MAAO4H,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,gBAI1E,OACIzJ,IAAAA,cAAC0vJ,GAAAA,EAAe,CACZxhJ,MAAO1E,EAAc,CACjBzS,GAAI,uBACJ0S,eAAgB,cAEpBvJ,YAAasJ,EAAc,CACvBzS,GAAI,2BACJ0S,eAAgB,qFAEpB2yF,QAASu1D,EACTj7J,MAAO06J,GACT,E,uqBCpBV,MAAMS,GAAqB15J,IAAkF,IAAjF,KAAC0pB,EAAI,KAAEnoB,EAAI,SAAE0iD,EAAQ,SAAE/0C,EAAQ,aAAEyqJ,EAAY,SAAErmF,EAAQ,YAAE2lF,GAAmBj5J,EACpG,MAAM45J,GAAclmG,EAAAA,EAAAA,QAAyB,OACtCmmG,EAAOC,IAAY14I,EAAAA,EAAAA,UAAiB,KACpC24I,EAAmBC,IAAwB54I,EAAAA,EAAAA,aAC5C,cAAC/P,IAAiBgQ,EAAAA,EAAAA,WAElB44I,GAAkBC,EAAAA,EAAAA,IAAgBxwI,GAElCywI,GAAkB74I,EAAAA,EAAAA,cAAY,KAC5Bs4I,EAAYt/I,UACZs/I,EAAYt/I,QAAQjP,MAAQ,GAC5BuuJ,EAAYt/I,QAAQm7C,QACxB,GACD,KAiFHxI,EAAAA,EAAAA,YAAU,KACF1rD,GAjBYA,KAChB,GAAIA,EAAM,CACN,MAAM64J,EAAc53H,IAAI63H,gBAAgB94J,GAElC+4J,EAAS,IAAIC,WACnBD,EAAOv6I,OAAU/Y,IACb,MAAMipE,EAAcuqF,GAAAA,GAA6BxzJ,EAAEq7D,OAAQ9lD,QACrDw9I,EAAoBS,GAAAA,GAA+BvqF,GAEzD6pF,EAASM,GACTJ,EAAqBD,EAAkB,EAE3CO,EAAOG,kBAAkBl5J,EAC7B,GAKIm5J,CAAWn5J,EACf,GACD,CAACA,IAEJ,MAiBMo5J,EACF9yJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,wBAhFL8yJ,MACd,GAAIr5J,EAAM,CACN,MAAMs5J,E,kWAAWl8J,CAAA,CACbyiI,gBAAiB,OAASy4B,EAAQ,IAClCx4B,eAAgB,QAChBy5B,iBAAkB,SACff,GAGP,OACIlyJ,IAAAA,cAAA,OACIjJ,GAAG,gBACHqW,MAAO4lJ,EACP/yJ,UAAU,mBACVqP,QAASgjJ,GAGrB,CACA,OAAIF,EAEIpyJ,IAAAA,cAAA,OACIjJ,GAAG,gBACHkJ,UAAU,mBACVsO,IAAK6jJ,EACL9iJ,QAASgjJ,IAKjBtyJ,IAAAA,cAAA,OAAKC,UAAU,mCACXD,IAAAA,cAAA,QACIjJ,GAAG,kBACHuY,QAASgjJ,EACTryJ,UAAU,mCACZm8C,EAAS82G,OAAO,GAAG/rB,cAAgB/qF,EAAS82G,OAAO,IACnD,EA8CDH,GAvGL/yJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,SACI,cAAY,gBACZ46C,IAAKm3G,EACL9xJ,UAAU,SACVmgE,OAAQ36C,EAAAA,GAAU0tI,oBAClB9rJ,SAAUA,EACVnM,KAAK,OACLyH,SAAUmvJ,EACV,eAAa,EACbt8F,UAAW,IAEfx1D,IAAAA,cAAA,QACIqH,SAAUA,EACViI,QAASgjJ,GAETtyJ,IAAAA,cAACozJ,GAAAA,EAAQ,SAoEjB15J,GAAQ04J,EAEJpyJ,IAAAA,cAAA,UACIsP,QAASm8D,EACT,cAAY,oBACZxrE,UAAU,mDAEVD,IAAAA,cAACqzJ,GAAAA,oBAAmB,MACnB7pJ,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,kBAKzE,MAaX,OACIzJ,IAAAA,cAAC0vJ,GAAAA,EAAe,CACZxhJ,MAAO1E,EAAc,CACjBzS,GAAI,wBACJ0S,eAAgB,cAEpBvJ,YAAakyJ,OAAkBp3J,EAAYwO,EACvC,CACIzS,GAAI,+BACJ0S,eAAgB,+EAEpB,CACI2wD,IAAK,SAGbgiC,QAAS02D,EACT7yJ,UAAU,uBACVvJ,MAAO06J,GACT,EAERS,GAAAxpJ,UAAA,CA1JE+zC,SAAQt2C,IAAAA,OAAAC,WACRsB,SAAQvB,IAAAA,KAAAC,WACR+rJ,aAAYhsJ,IAAAA,KAAAC,WACZ0lE,SAAQ3lE,IAAAA,KAAAC,YAyJZ,YC3JMutJ,GAA4B,CAAC,aAAc,YAAa,aACxDr8H,IAAeigC,EAAAA,EAAAA,gBAAe,CAChCq8F,SAAU,CACNx8J,GAAI,uBACJ0S,eAAgB,0BAEpB+pJ,qBAAsB,CAClBz8J,GAAI,mCACJ0S,eAAgB,8GAChBjB,OAAQ,CAACuiD,IAAKtlC,EAAAA,GAAUguI,oBAAqBr5F,IAAK30C,EAAAA,GAAUmsI,sBAEhE8B,wBAAyB,CACrB38J,GAAI,sCACJ0S,eAAgB,0DAEpBkqJ,iBAAkB,CACd58J,GAAI,+BACJ0S,eAAgB,kDAEpBmqJ,cAAe,CACX78J,GAAI,4BACJ0S,eAAgB,kDCOxB,IAJkB3B,EAAAA,EAAAA,UApBlB,SAAyBxP,GAAoB,IAAAu7J,EACzC,MAAMl5J,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GAGzB,MAAO,CACHshE,YAHgB3P,SAA2B,QAAnB4pG,EAACl5J,EAAOsmE,mBAAW,IAAA4yF,EAAAA,EAAI,GAAI,IAK3D,IAEA,SAA4Bx9J,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6b,QAAO,KACPosI,UAAS,KACT6D,eAAc,KACdC,YAAWA,EAAAA,IACZ19J,GAEX,GAMA,EDFgB8B,IAAwI,IAAA67J,EAAA,IAAvI,KAACnyI,EAAI,WAAEwuI,EAAU,YAAEz2F,EAAW,WAAE6iC,EAAU,cAAE0zD,EAAa,kBAAEC,EAAiB,qBAAEE,EAAoB,cAAExC,EAAa,QAAE/qJ,GAAe5K,EAC/I,MAAOgI,EAAM8zJ,IAAW16I,EAAAA,EAAAA,UAA+BsI,EAAKhiB,eACrDK,EAAag0J,IAAkB36I,EAAAA,EAAAA,UAA8BsI,EAAK3hB,cAClEi0J,EAAcC,IAAmB76I,EAAAA,EAAAA,aACjCvN,EAASqoJ,IAAc96I,EAAAA,EAAAA,WAAkB,IACzC+6I,EAAkBC,IAAuBh7I,EAAAA,EAAAA,aACzCi7I,EAAiBC,IAAsBl7I,EAAAA,EAAAA,aACvCk3I,EAAuB1C,IAA4Bx0I,EAAAA,EAAAA,aACpD,cAAC/P,IAAiBgQ,EAAAA,EAAAA,WAElBk7I,GAA8Bj7I,EAAAA,EAAAA,cAAYljB,UAC5C,GAAI4J,EAAKovB,SAAW1N,EAAKhiB,cAAgBK,IAAgB2hB,EAAK3hB,YAC1D,OAAO,EAGX,IAAKC,EAED,OADAs0J,EAAmBx9H,GAAas8H,WACzB,EACJ,GAAIpzJ,EAAKiJ,OAASqc,EAAAA,GAAUguI,oBAE/B,OADAgB,EAAmBx9H,GAAau8H,uBACzB,EAEXiB,OAAmBz5J,GACnB,MAAM,MAACtE,SAAeqM,EAAQktJ,UAAU,CAACl5J,GAAI8qB,EAAK9qB,GAAI8I,aAAcM,EAAMD,gBAC1E,OAAIxJ,CAGO,GACZ,CAACqM,EAAS7C,EAAaC,EAAM0hB,EAAK3hB,YAAa2hB,EAAKhiB,aAAcgiB,EAAK9qB,KAEpE49J,GAAuBl7I,EAAAA,EAAAA,cAAYljB,UACrC,IAAK49J,EACD,OAAO,EAEXE,GAAW,GACXE,OAAoBv5J,GACpB,MAAM,MAACtE,SAAeqM,EAAQgxJ,YAAYlyI,EAAK9qB,GAAIo9J,GAEnD,OADAE,GAAW,IACP39J,CAGO,GACZ,CAACqM,EAAS8e,EAAMsyI,IAEbpD,GAAoBt3I,EAAAA,EAAAA,cAAYljB,UAClC,MAAMq+J,QAA+BF,UACPC,KACLC,GAIzB7G,EAAyB,SACzBuC,GAAqB,IAJjBvC,EAAyB,QAIF,GAC5B,CAAC2G,EAA6BC,EAAsBrE,IAEjD30H,GAAcliB,EAAAA,EAAAA,cAAY,KAC5Bs0I,EAAyB,WACzBD,GAAc,GACdwC,GAAqB,EAAM,GAC5B,CAACA,EAAsBxC,IAEpB7/E,GAAex0D,EAAAA,EAAAA,cAAY,KAAM,IAAAo7I,EACnCZ,EAAyB,QAAlBY,EAAChzI,EAAKhiB,oBAAY,IAAAg1J,EAAAA,EAAIhzI,EAAK1hB,MAClC+zJ,EAAeryI,EAAK3hB,aACpBk0J,OAAgBp5J,GAChBu5J,OAAoBv5J,GACpBy5J,OAAmBz5J,GACnB2gC,GAAa,GACd,CAACA,EAAa9Z,EAAK3hB,YAAa2hB,EAAKhiB,aAAcgiB,EAAK1hB,OAErD20J,GAAuBr7I,EAAAA,EAAAA,cAAYljB,UACrC89J,GAAW,GACXE,OAAoBv5J,GACpBo5J,OAAgBp5J,GAChB2gC,IAEA,MAAM,MAACjlC,SAAeqM,EAAQ+wJ,eAAejyI,EAAK9qB,IAClDs9J,GAAW,GACP39J,IACAq3J,EAAyB,SACzBD,GAAc,GACdwC,GAAqB,GACzB,GACD,CAACvtJ,EAAS44B,EAAa20H,EAAsBxC,EAAejsI,EAAK9qB,KAE9Dg+J,GAAiBt7I,EAAAA,EAAAA,cAAata,IAChC,GAAIA,GAAKA,EAAEq7D,QAAUr7D,EAAEq7D,OAAOpsC,OAASjvB,EAAEq7D,OAAOpsC,MAAM,GAAI,CACtD,MAAM10B,EAAOyF,EAAEq7D,OAAOpsC,MAAM,GAEvBklI,GAA0BnnH,SAASzyC,EAAKwB,MAElCxB,EAAKoH,KAAO84D,EACnB26F,EAAoBt9H,GAAa08H,mBAEjCS,EAAgB16J,GAChB66J,OAAoBv5J,GACpB+yJ,EAAyB,WACzBD,GAAc,IAPdyG,EAAoBt9H,GAAay8H,wBASzC,MACIU,OAAgBp5J,GAChBu5J,EAAoBt9H,GAAa28H,cACrC,GACD,CAACh6F,EAAak0F,IAEX2D,GAAoBh4I,EAAAA,EAAAA,cAAatZ,IACnC2tJ,GAAc,GACdC,EAAyB,WACzBkG,EAAQ9zJ,EAAK,GACd,CAAC2tJ,IAEEqD,GAA2B13I,EAAAA,EAAAA,cAAavZ,IAC1C4tJ,GAAc,GACdC,EAAyB,WACzBmG,EAAeh0J,EAAY,GAC5B,CAAC4tJ,IAEEkH,GAAsBv7I,EAAAA,EAAAA,cAAY,KAChC42I,EACAC,GAAqB,GAGzBH,GAAe,GAChB,CAACA,EAAeE,EAAYC,IAEzB2E,EACFj1J,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,UACIjJ,GAAG,cACHmE,KAAK,SACL+E,UAAU,QACV,eAAa,QACbqP,QAASmtF,GAETz8F,IAAAA,cAAA,QAAM,cAAY,QAAQ,MAE9BA,IAAAA,cAAA,MAAIC,UAAU,eACVD,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,KACIC,UAAU,mBACV,aAAYuJ,EAAc,CACtBzS,GAAI,yBACJ0S,eAAgB,kBAEpB6F,QAAS0lJ,KAGjBh1J,IAAAA,cAAA,YAAOwJ,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,qBAG/EzJ,IAAAA,cAAA,OAAKC,UAAU,wCACXD,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAACk1J,GAAe,CACZ/0J,KAAMA,EACNixJ,YAAaoD,EACb/C,kBAAmBA,IAEvBzxJ,IAAAA,cAACm1J,GAAsB,CACnBj1J,YAAaA,EACbixJ,yBAA0BA,KAGlCnxJ,IAAAA,cAAC6xJ,GAAkB,CACfhwI,KAAMA,EACNnoB,KAAMy6J,EACN9sJ,SAAU2E,EACV8lJ,aAAciD,EACdtpF,SAAUqpF,EACV14G,SAA2B,QAAnB43G,EAAEnyI,EAAKhiB,oBAAY,IAAAm0J,EAAAA,EAAInyI,EAAK1hB,KACpCixJ,YAAakD,IAEhBjE,EACGrwJ,IAAAA,cAACksJ,GAAgB,CACbj+E,aAAcA,EACdjhE,aAAc+jJ,EACdp1H,YAAaA,EACbwwH,eAAgBiE,EAChB93J,MAAOm4J,SACNz1J,IAKrB,OAAOgF,IAAAA,cAACkxJ,GAAAA,EAAY,CAAC90D,QAAS64D,GAAsB,IEpNlDG,GAAej9J,IASR,IAKLuc,GAdc,UAClB2gJ,EAAY,GAAE,WACd54D,EAAU,cACV0zD,EAAa,KACbtuI,EAAI,WACJwuI,EAAU,kBACVD,EAAiB,cACjBtC,EAAa,qBACbwC,GACIn4J,EACJ,IAAK0pB,EACD,OAAO,KAIX,OAAQwzI,GACR,IAAK,OACD3gJ,EACI1U,IAAAA,cAACs1J,GAAO,CACJzzI,KAAMA,EACNwuI,WAAYA,EACZvC,cAAeA,EACfsC,kBAAmBA,EACnBE,qBAAsBA,EACtB7zD,WAAYA,EACZ0zD,cAAeA,IAGvB,MACJ,IAAK,SACDz7I,EACI1U,IAAAA,cAACu1J,GAAS,CACN1zI,KAAMA,EACNwuI,WAAYA,EACZvC,cAAeA,EACfsC,kBAAmBA,EACnBE,qBAAsBA,EACtB7zD,WAAYA,EACZ0zD,cAAeA,IAGvB,MACJ,QACIz7I,EACI1U,IAAAA,cAAA,YAKR,OAAO0U,CAAM,EACf0gJ,GAAA/sJ,UAAA,CA5DEgtJ,UAASvvJ,IAAAA,OAAAC,WACTsqJ,WAAUvqJ,IAAAA,KAAAC,WACVqqJ,kBAAiBtqJ,IAAAA,KAAAC,WACjB+nJ,cAAahoJ,IAAAA,KAAAC,WACbuqJ,qBAAoBxqJ,IAAAA,KAAAC,WACpB02F,WAAU32F,IAAAA,KAAAC,WACVoqJ,cAAarqJ,IAAAA,KAAAC,YAwDjB,YCxDA,IAAe+B,EAAAA,EAAAA,UANf,SAAyBxP,GACrB,MAAO,CACHupB,MAAMsE,EAAAA,EAAAA,IAAe7tB,GAE7B,GAEA,CAAwC88J,ICPlCI,GAAkBx1J,IAAAA,MAAW,IAAM,kCAOnCy1J,GAAoBt9J,IAAuC,IAAtC,SAACyU,EAAQ,eAAE8oJ,GAAsBv9J,EACxD,MAAOk9J,EAAWM,IAAgBp8I,EAAAA,EAAAA,UAAS,SACpC1N,EAAMyN,IAAWC,EAAAA,EAAAA,WAAkB,IACnC82I,EAAYvC,IAAiBv0I,EAAAA,EAAAA,WAAkB,IAC/C62I,EAAmBE,IAAwB/2I,EAAAA,EAAAA,WAAkB,GAC9Dq8I,GAAe/pG,EAAAA,EAAAA,QAAkB,OACjC,cAACriD,IAAiBgQ,EAAAA,EAAAA,WAElBq8I,GAAYp8I,EAAAA,EAAAA,cAAaq8I,IACvBzF,EACAC,GAAqB,IAGzBqF,EAAaG,GACbhI,GAAc,GACdwC,GAAqB,GAAM,GAC5B,CAACD,IAEE1lJ,GAAa8O,EAAAA,EAAAA,cAAY,IAAMH,GAAQ,IAAQ,IAE/CqiB,GAAcliB,EAAAA,EAAAA,cAAY,KAC5Bk8I,EAAa,QACb7H,GAAc,GACdwC,GAAqB,GACrB1jJ,GAAU,GACX,CAACA,IAEEmpJ,GAAiBt8I,EAAAA,EAAAA,cAAY,KAC/B,MAAMu8I,EAAKC,KAAAA,YAAqBL,EAAanjJ,SAC7CujJ,SAAAA,EAAIE,QAAQ,iBAAkB16F,UAAUO,OAAO,oBAC/C45F,EAAa,GAAG,GACjB,IAEGQ,EAAO,CACT,CAACh2J,KAAM,OAAQi2J,OAAQ5sJ,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,SAAU1J,KAAM,gCAAiCs2J,UAAW7sJ,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,gBAMlN,OAJIisJ,GACAS,EAAKnkJ,KAAK,CAAC7R,KAAM,SAAUi2J,OAAQ5sJ,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,WAAY1J,KAAM,qCAAsCs2J,UAAW7sJ,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,kBAIrOzJ,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,6BAChBb,KAAMA,EACNc,OAAQhC,EACRiC,SAAU+uB,EACV7uB,KAAK,OACL,kBAAgB,yBAChB/V,GAAG,qBAEHiJ,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CACTnW,GAAG,yBACHoW,aAAa,GAEbnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CAACC,eAAe,MACvB/D,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,oBAGzEzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,CAACmtC,IAAKg7G,GACb51J,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAACA,IAAAA,SAAc,CAACs2J,SAAU,MACtBt2J,IAAAA,cAACw1J,GAAe,CACZW,KAAMA,EACNd,UAAWA,EACXQ,UAAWA,MAIvB71J,IAAAA,cAAA,OAAKC,UAAU,sCACXD,IAAAA,cAACo1J,GAAY,CACTC,UAAWA,EACXhF,WAAYA,EACZvC,cAAeA,EACfsC,kBAAmBA,EACnBE,qBAAsBA,EACtB7zD,WAAY9xF,EACZwlJ,cAAe4F,OAK3B,EAEdN,GAAAptJ,UAAA,CAxFEuE,SAAQ9G,IAAAA,KAAAC,WACR2vJ,eAAc5vJ,IAAAA,KAAAC,YAyFlB,YC5EA,IAAe+B,EAAAA,EAAAA,UAVf,SAAyBxP,GACrB,MAAM+B,GAASogB,EAAAA,EAAAA,IAAiBniB,GAC1Bo9J,GAAiB1xH,EAAAA,EAAAA,IAAoB1rC,EAAO+B,EAAQwyB,EAAAA,GAAYoiI,aAChEn8I,EAAUC,EAAAA,GAAiBwjJ,cACjC,MAAO,CACH1qJ,MAAMutF,EAAAA,EAAAA,GAAY9gG,EAAOwa,GACzB4iJ,iBAER,GAEA,CAAwCD,I,gBCpBzB,SAASe,GAAc92J,GAClC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,cACR/yC,MAAOA,GACPN,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,qBAE7EzJ,IAAAA,cAAA,QAAM4gD,EAAE,0MAIxB,CAEA,MAAMxzC,GAAuB,CACzBo0C,SAAU,UACVC,SAAU,UACVT,eAAgB,QAChBwhE,iBAAkB,S,6cCiDf,MAAMi0C,WAAiBz2J,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,sBAepCrD,KACTs/D,EAAAA,EAAAA,GAAiBt/D,IAAMA,EAAEu/D,WAAYC,EAAAA,EAAAA,GAAax/D,EAAGsmB,EAAAA,GAAUoxC,SAAS6/F,KACxEv3J,EAAEyK,iBACFlH,KAAKhD,MAAMqD,QAAQ8P,UAAU,CAACC,QAASC,EAAAA,GAAiB2d,cAAezd,WAAY0d,GAAAA,QAAmBzd,YAAa,CAAC0d,0BAA0B,KAClJ,IACHpuB,GAAA,qCAE8B,KAC3ButB,EAAAA,IAAsC,IACzCvtB,GAAA,mBAEarD,IACVA,EAAEyK,iBACFlH,KAAKhD,MAAMqD,QAAQ4zJ,mBACnBj0J,KAAKhD,MAAMqD,QAAQye,cAAc,IACpChf,GAAA,uBAEiBrD,IACdA,EAAEyK,iBAEElH,KAAKhD,MAAMk3J,gBACXl0J,KAAKhD,MAAMqD,QAAQkb,sBAEnBvb,KAAKhD,MAAMqD,QAAQye,eACnB9e,KAAKhD,MAAMqD,QAAQ8zJ,eACvB,GACH,CAlCD,uBAAM57G,GACF/4C,SAASq7D,iBAAiB,UAAW76D,KAAKosE,cAC9C,CAEA9O,oBAAAA,GACI99D,SAASu7D,oBAAoB,UAAW/6D,KAAKosE,cACjD,CA8BAnpE,MAAAA,GAAS,IAAAmxJ,EACL,MAAM,gBACFC,EAAe,YACf91H,EAAW,uBACX+1H,EAAsB,wBACtBC,EAAuB,OACvB58J,EAAS,GAAE,mBACX68J,EAAkB,oBAClBC,GACAz0J,KAAKhD,MAEH03J,GAAsBC,EAAAA,GAAAA,IAAYN,GAAmB,IAE3D,IAAK91H,EACD,OAAO,KAGX,MAAMunC,EAAwC,QAA7BsuF,EAAGp0J,KAAKhD,MAAM+xI,uBAAe,IAAAqlB,OAAA,EAA1BA,EAA4BzzJ,KAAK1D,GACjDK,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAI4I,EAAK5I,GAAK,kBACd2G,IAAKiC,EAAK5I,GAAK,kBACfuY,QAASA,KACD3P,EAAKoa,QACLpa,EAAKoa,QACT,EAEJvP,KAAM7K,EAAK6K,KACXzK,KAAM2C,KAAKhD,MAAM43J,QAAU33J,EAAK43J,eAIlCC,EAAyB90J,KAAKhD,MAAM+3J,wBAA0B/0J,KAAKhD,MAAMg4J,wBAA0Bh1J,KAAKhD,MAAMi4J,gBAAkBj1J,KAAKhD,MAAMk4J,4BAA8Bl1J,KAAKhD,MAAMm4J,oBACpLC,GAAoBp1J,KAAKhD,MAAM43J,QAAUE,GAA0B90J,KAAKhD,MAAMq4J,sBAC9EC,EAAoBt1J,KAAKhD,MAAM64F,gBAAkB71F,KAAKhD,MAAMyuF,aAAezrF,KAAKhD,MAAMu4J,iBAAmB,EACzGC,EAAuBx1J,KAAKhD,MAAM2uF,UAAY3rF,KAAKhD,MAAMyuF,aAAe6pE,IAExE,cAACxuJ,GAAiB9G,KAAKhD,MAAM6J,KAEnC,IAAI4uJ,EAAoB,KAqBxB,OApBIjB,GAAsBC,KACtBgB,EACIn4J,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,eACH+b,QAASC,EAAAA,GAAiBoiB,WAC1BliB,WAAYmiB,EAAAA,QACZ5qB,KAAMhB,EAAc,CAChBzS,GAAI,+BACJ0S,eAAgB,kBAEpB4uJ,UAAW7uJ,EAAc,CACrBzS,GAAI,wCACJ0S,eAAgB,2BAEpB1J,KAAM2C,KAAKhD,MAAM43J,QAAUt3J,IAAAA,cAAA,KAAGC,UAAU,oBACxCqP,QAASA,KAAM/Q,EAAAA,EAAAA,IAAW,KAAM,gDAKrCmE,KAAKhD,MAAM43J,OACdt3J,IAAAA,cAAC4Z,EAAAA,EAAI,CACD7iB,GAAI2L,KAAKhD,MAAM3I,GACfqjB,UAAW5Q,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,eAE/EzJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAACs4J,EAAAA,EAAoB,CACjB11B,YAAa,CAAC/1G,EAAAA,GAAY0rI,2BAE1Bv4J,IAAAA,cAAC4Z,EAAAA,EAAK4+I,WAAU,CACZzhK,GAAG,qBAIfiJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAACs4J,EAAAA,EAAoB,CACjB11B,YAAa,CAAC/1G,EAAAA,GAAY4rI,6CAE1Bz4J,IAAAA,cAAC4Z,EAAAA,EAAK8+I,WAAU,CACZ3hK,GAAG,iBAIfiJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAG,iBACHuY,QAAS5M,KAAKi2J,eACd54J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,YAAY,KAC/BuK,KAAMhB,EAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,sBAElFzJ,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAG,eACHuY,QAAS5M,KAAKk2J,WACd74J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,mBACnBuK,KAAMhB,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,sBAG/EzJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,kBACH+b,QAASC,EAAAA,GAAiB2d,cAC1Bzd,WAAY0d,GAAAA,QACZzd,YAAa,CAAC0d,0BAA0B,GACxCpmB,KAAMhB,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,YAC5E1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,iBAEvBD,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,kBACH+b,QAASC,EAAAA,GAAiB2d,cAC1Bzd,WAAY0d,GAAAA,QACZzd,YAAa,CAAC0d,0BAA0B,GACxCpmB,KAAMhB,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,aAC5E1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,iBAG3BD,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYgsI,cAE1B74J,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,kBACH8U,KAAMmrJ,GAA0BC,EAChCnkJ,QAASC,EAAAA,GAAiBo1I,mBAC1Bl1I,WAAYgmC,EAAAA,EACZzuC,KAAMhB,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,uBAC5E1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,uBAG3BD,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYkwH,iBAAkBlwH,EAAAA,GAAY8kF,eAEvDwmD,IAGTn4J,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYgsI,cAE1B74J,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,eACH+b,QAASC,EAAAA,GAAiBwjJ,cAC1BtjJ,WAAYwiJ,GACZjrJ,KAAMhB,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,kBACzE1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,mBAG3BD,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYgsI,cAE1B74J,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,eACH8U,KAAMmrJ,GAA0BC,EAChCnkJ,QAASC,EAAAA,GAAiBm1I,mBAC1Bh1I,YAAa,CACTy7B,OAAQt0C,GAEZ4Y,WAAY00I,EACZn9I,KAAMhB,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,kBACzE1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,uBAG3BD,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYisI,sBAAuBjsI,EAAAA,GAAYy+H,oBAE7DtrJ,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,gBACH+b,QAASC,EAAAA,GAAiBk5I,aAC1Bh5I,WAAY04I,GACZnhJ,KAAMhB,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,mBAC1E1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,mBAG3BD,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYisI,sBAAuBjsI,EAAAA,GAAYy+H,mBAC7DyN,QAAQ,GAER/4J,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,cACH+b,QAASC,EAAAA,GAAiBk5I,aAC1Bh5I,WAAY04I,GACZnhJ,KAAMhB,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,iBACxE1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,oBAI/BD,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAACs4J,EAAAA,EAAoB,CAAC11B,YAAa,CAAC/1G,EAAAA,GAAYmsI,cAC5Ch5J,IAAAA,cAAC4Z,EAAAA,EAAKq/I,SAAQ,CACVliK,GAAG,aACH8U,MAAOmsJ,EACPr4G,GAAG,eACHn1C,KAAMhB,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,kBACnE1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,yBAG3BD,IAAAA,cAAC4Z,EAAAA,EAAKq/I,SAAQ,CACVliK,GAAG,WACH8U,MAAOnJ,KAAKhD,MAAMw5J,yBAA2Bx2J,KAAKhD,MAAMy5J,gBACxDx5G,GAAG,eACHn1C,KAAMhB,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,sBACjE1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,wBAEvBD,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,YACH8U,MAAOmrJ,GAA0Bt0J,KAAKhD,MAAMw5J,0BAA4Bx2J,KAAKhD,MAAM08C,SACnFtpC,QAASC,EAAAA,GAAiBuU,WAC1BrU,WAAYg0I,EACZz8I,KAAMhB,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,eAClE1J,KAAMC,IAAAA,cAACw2J,GAAa,SAG5Bx2J,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACNrhD,GAELxoE,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,EAAAA,EAAKq/I,SAAQ,CACVliK,GAAG,eACH8U,KAAMisJ,EACNn4G,GAAI,IAAMj9C,KAAKhD,MAAM08C,SAAW,gBAChC5xC,KAAMhB,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,oBAGjFzJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,EAAAA,EAAKw/I,iBAAgB,CAClBriK,GAAG,WACH8U,KAAMU,QAAQ7J,KAAKhD,MAAM25J,UACzBt4J,IAAK2B,KAAKhD,MAAM25J,SAChB7uJ,KAAMhB,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,SACjE1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,qBAEvBD,IAAAA,cAAC4Z,EAAAA,EAAKw/I,iBAAgB,CAClBriK,GAAG,aACH8U,KAAMU,QAAQ7J,KAAKhD,MAAM45J,oBACzBv4J,IAAK2B,KAAKhD,MAAM45J,mBAChB9uJ,KAAMhB,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,qBACnE1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,kBAEvBD,IAAAA,cAAC4Z,EAAAA,EAAKw/I,iBAAgB,CAClBriK,GAAG,gBACH8U,KAAMnJ,KAAKhD,MAAMq3J,kBAAoBnnI,GAAAA,KACrC7uB,IAAKq2J,EACL5sJ,KAAMhB,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,kBACvE1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,mBAEvBD,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,QACH+b,QAASC,EAAAA,GAAiBwmJ,MAC1BtmJ,WAAYilC,EAAAA,EACZ1tC,KAAMhB,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,oBAAqB,CAAC4tC,SAAU30C,KAAKhD,MAAM85J,UAAY,eACzHz5J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,kBAG3BD,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAG,SACHuY,QAAS5M,KAAK+2J,6BACdjvJ,KAAMhB,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,YACnE1J,KAAMC,IAAAA,cAAA,KAAGC,UAAU,uBAK/BD,IAAAA,cAAC4Z,EAAAA,EAAI,CACD7iB,GAAI2L,KAAKhD,MAAM3I,GACfqjB,UAAW5Q,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,eAEjFzJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYgsI,cAE1B74J,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,kBACH8U,KAAMmrJ,GAA0BC,EAChCnkJ,QAASC,EAAAA,GAAiBo1I,mBAC1Bl1I,WAAYgmC,EAAAA,EACZzuC,KAAMhB,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,0BAGpFzJ,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYkwH,iBAAkBlwH,EAAAA,GAAY8kF,eAEvDwmD,GAELn4J,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYgsI,cAE1B74J,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,eACH+b,QAASC,EAAAA,GAAiBwjJ,cAC1BtjJ,WAAYwiJ,GACZjrJ,KAAMhB,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,qBAGjFzJ,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYgsI,cAE1B74J,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,eACH8U,KAAMmrJ,GAA0BC,EAChCnkJ,QAASC,EAAAA,GAAiBm1I,mBAC1Bh1I,YAAa,CAACy7B,OAAQt0C,GACtB4Y,WAAY00I,EACZn9I,KAAMhB,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,qBAGjFzJ,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYisI,sBAAuBjsI,EAAAA,GAAYy+H,oBAE7DtrJ,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,gBACH+b,QAASC,EAAAA,GAAiBk5I,aAC1Bh5I,WAAY04I,GACZnhJ,KAAMhB,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,sBAGlFzJ,IAAAA,cAAC+rJ,EAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYisI,sBAAuBjsI,EAAAA,GAAYy+H,mBAC7DyN,QAAQ,GAER/4J,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,cACH+b,QAASC,EAAAA,GAAiBk5I,aAC1Bh5I,WAAY04I,GACZnhJ,KAAMhB,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,oBAGhFzJ,IAAAA,cAAC4Z,EAAAA,EAAKq/I,SAAQ,CACVliK,GAAG,WACH8U,MAAOnJ,KAAKhD,MAAMw5J,yBAA2Bx2J,KAAKhD,MAAMy5J,gBACxDx5G,GAAG,eACHn1C,KAAMhB,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,wBAErEzJ,IAAAA,cAAC4Z,EAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,YACHkJ,UAAU,cACV4L,MAAOmrJ,GAA0Bt0J,KAAKhD,MAAMw5J,0BAA4Bx2J,KAAKhD,MAAM08C,SACnFtpC,QAASC,EAAAA,GAAiBuU,WAC1BrU,WAAYg0I,EACZz8I,KAAMhB,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,kBAG1EzJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAACs4J,EAAAA,EAAoB,CAAC11B,YAAa,CAAC/1G,EAAAA,GAAYmsI,cAC5Ch5J,IAAAA,cAAC4Z,EAAAA,EAAKq/I,SAAQ,CACVliK,GAAG,aACH4oD,GAAG,eACH1/C,UAAWi4J,EAAuB,8BAAgC,GAClE7wJ,SAAU2wJ,EACVxtJ,KAAMhB,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,kBACnEiwJ,QAASxB,GACLl4J,IAAAA,cAAC25J,GAAAA,EAAmB,CAChBC,QAASC,EAAAA,GAAmBC,sBAC5BC,8BAA+BC,EAAAA,GAAYC,aAC3Cl+J,SAAU2G,KAAKhD,MAAMyuF,YACrBo3B,eAAgB/7G,EAAc,CAC1BzS,GAAI,gDACJ0S,eAAgB,4GAEpBywJ,mBAAoB1wJ,EAAc,CAC9BzS,GAAI,kDACJ0S,eAAgB,0CAEpB0wJ,qBAAsB3wJ,EAAc,CAChCzS,GAAI,oDACJ0S,eAAgB,4IAEpB,CACI2wJ,YAAaC,GAAAA,KAGjBC,oBAAqB9wJ,EAAc,CAC/BzS,GAAI,mDACJ0S,eAAgB,sCAEpB8wJ,sBAAuB/wJ,EAAc,CACjCzS,GAAI,qDACJ0S,eAAgB,sKAEpB+wJ,aAAchxJ,EAAc,CACxBzS,GAAI,4CACJ0S,eAAgB,2CAEpBgxJ,eAAgBjxJ,EAAc,CAC1BzS,GAAI,8CACJ0S,eAAgB,sGAMpCzJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAAC06J,GAAAA,EAAmB,SAIhC16J,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACNrhD,GAIjB,EACHhmE,GAxcYi0J,GAAQ,aArCjBa,OAAMxxJ,IAAAA,KACN/O,GAAE+O,IAAAA,OACFzL,OAAMyL,IAAAA,OACNs2C,SAAQt2C,IAAAA,OACR0zJ,SAAQ1zJ,IAAAA,OAERixJ,gBAAejxJ,IAAAA,OACf6xJ,eAAc7xJ,IAAAA,KAAAC,WACd0xJ,uBAAsB3xJ,IAAAA,KAAAC,WACtB6xJ,2BAA0B9xJ,IAAAA,KAAAC,WAC1B2xJ,uBAAsB5xJ,IAAAA,KAAAC,WACtB8xJ,oBAAmB/xJ,IAAAA,KAAAC,WACnBgyJ,sBAAqBjyJ,IAAAA,KAAAC,WACrBmzJ,wBAAuBpzJ,IAAAA,OACvBuzJ,SAAQvzJ,IAAAA,OACRwzJ,mBAAkBxzJ,IAAAA,OAClBqzJ,gBAAerzJ,IAAAA,KAAAC,WACf0rI,gBAAe3rI,IAAAA,MACf8wJ,gBAAe9wJ,IAAAA,KACfkxJ,uBAAsBlxJ,IAAAA,KAAAC,WACtBkxJ,wBAAuBnxJ,IAAAA,KAEvBuoF,QAAOvoF,IAAAA,KAAAC,WACPwyF,cAAazyF,IAAAA,KAAAC,WACbooF,YAAWroF,IAAAA,KAAAC,WACXkyJ,gBAAenyJ,IAAAA,OAAAC,WACfmxJ,mBAAkBpxJ,IAAAA,KAAAC,aAAAvD,GAWTi0J,GAAQ,eACK,CAClBkE,SAAU,GACVrD,QAAQ,EACR7lB,gBAAiB,KAsczB,UAAejiI,EAAAA,EAAAA,YAAWinJ,IChb1B,IAAeviC,EAAAA,EAAAA,aAAqBpsH,EAAAA,EAAAA,UAxEpC,SAAyBxP,GACrB,MAAMqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnB4tB,GAAcC,EAAAA,EAAAA,IAAe7tB,GAC7B2oC,GAAcle,EAAAA,EAAAA,IAAezqB,GAE7By+J,EAAkBp8J,EAAOigK,gBACzBjD,EAA2C,SAA1Bh9J,EAAOkgK,eACxBrB,EAAW7+J,EAAO28C,SAClBmgH,EAA2D,SAAlC98J,EAAOmgK,uBAChClD,EAAmE,SAAtCj9J,EAAOogK,2BACpCrD,EAA2D,SAAlC/8J,EAAOqgK,uBAChC9B,EAA0Bv+J,EAAOsgK,wBACjC5B,EAAW1+J,EAAOugK,SAClB5B,EAAqB3+J,EAAOwgK,mBAE5BC,GAA6BvqI,EAAAA,EAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAYwuI,yBAA0BxqI,EAAAA,EAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAYyuI,gBAAiBzqI,EAAAA,EAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAY0uI,4BAA6B1qI,EAAAA,EAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAY2uI,0BAC7R3D,GAAuBh0H,EAAAA,EAAAA,IAAsBvrC,EAAO,CAACwrC,WAAYjX,EAAAA,GAAY4uI,gBAAiB53H,EAAAA,EAAAA,IAAsBvrC,EAAO,CAACwrC,WAAYjX,EAAAA,GAAY6uI,qBACpJ3D,EAAwBqD,GAA6BvD,EACrDV,GAAsBtmI,EAAAA,EAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAYkwH,kBAEpE4e,GAAgBC,EAAAA,EAAAA,IAAmBtjK,GACnC6gK,EAAkBwC,GAAiBA,EAAcvyJ,OAAS,EAC1DyyJ,GAAWhhJ,EAAAA,EAAAA,IAAYviB,GAEvBud,GAAewiF,EAAAA,EAAAA,IAAwB//F,GACvC40B,GAAUC,EAAAA,EAAAA,IAAW70B,GACrBq4F,GAAsBC,EAAAA,EAAAA,IAAuBt4F,GAE7C+1F,GAAUytE,EAAAA,EAAAA,IAAe5uI,GACzBqrE,EAAgBlK,IAAWsC,aAAmB,EAAnBA,EAAqB5E,OAAQC,EAAAA,GAAcC,QACtEkC,EAAcE,GAA2C,UAAhCx4E,aAAY,EAAZA,EAAc+5E,eAE7C,MAAO,CACHmnE,kBACAY,iBACAI,wBACAN,yBACAG,6BACAF,yBACAG,sBACAqB,0BACAG,WACAC,qBACA7nB,gBAAiBn5I,EAAM+oE,QAAQ7hE,WAAWi3J,SAC1C0C,kBACAK,WACAn/J,OAAQ6rB,aAAW,EAAXA,EAAanvB,GACrBqlD,SAAUl2B,aAAW,EAAXA,EAAa/lB,KACvB8gC,cACA21H,gBAAiBiF,IAAa/gJ,EAAAA,GAAUihJ,QACxC/E,uBAAwBzqJ,QAAQ2Z,aAAW,EAAXA,EAAa0oF,mBAC7CqoD,wBAAuE,SAA9C3+J,EAAMuyB,SAASmrB,QAAQ9oB,QAAQI,WACxD4pI,mBAAmD,SAA/Bv8J,EAAO82G,oBAC3B0lD,sBACA9oE,UACAkK,gBACApK,cAER,IAEA,SAA4B93F,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAAS,IACTgkJ,aAAY,KACZF,iBAAgB,KAChB14I,mBAAkB,KAClBuD,aAAYA,EAAAA,IACbnrB,GAEX,GAEoCyR,CAA6C2uJ,I,iFC/FjF,MAqBA,EArB4BiE,IAEpB16J,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oBACH0S,eAAe,2BACfjB,OAAQ,CACJo6C,EAAIC,GACA7iD,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,oBACTgkC,KAAK,8DAELn2C,IAAAA,cAAA,KAAGC,UAAU,gCACbD,IAAAA,cAAA,YAAO6iD,O,qOCyInC,MC3FA,GAJkB/6C,EAAAA,EAAAA,UA3BlB,WACI,MAAMk0J,GAfC5xG,EAAAA,EAAAA,IACH,yBACA6xG,EAAAA,IACA,CAAC1nC,EAAgB70H,IAAoBA,GAASA,EAAMw8J,kBACpD,CAACA,EAAiBC,IACVA,EACO/7J,OAAOC,OAAO,CAAC,EAAG87J,EAAiBD,GAGvCA,IAQf,OAAO,SAAyB5jK,EAAoB2hC,GAChD,MAAMt/B,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GAEzB,IAAI8Z,EACiB,IAAAgqJ,EAIrB,OAJIniI,EAAStQ,SACTvX,EAA2C,QAAlCgqJ,GAAGjxI,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAAStQ,eAAO,IAAAyyI,OAAA,EAA/BA,EAAiC5oJ,YAG1C,CACH6oJ,sBAAsBC,EAAAA,EAAAA,IAAwBhkK,GAC9C4jK,gBAAiBF,EAAmB1jK,EAAO2hC,GAC3CsiI,kBAAkB58I,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAYuvD,2BAA4B,cAAc,GACvFqtF,sBAAsBC,EAAAA,EAAAA,IAAwBnkK,GAC9CokK,YAAaziI,EAASyiI,cAAeC,EAAAA,EAAAA,GAAsBrkK,GAC3DkF,SAASiU,EAAAA,EAAAA,MACToQ,MAAMsE,EAAAA,EAAAA,IAAe7tB,GACrBs0I,cAAwC,SAAzBjyI,EAAOmyI,cACtB8vB,qBAAsB3yG,SAAStvD,EAAOkiK,sBAAwB,GAAI,IAClEhuI,UAAUsqG,EAAAA,EAAAA,IAAY7gI,GACtB8Z,YAER,CACJ,GAMA,EDoBA,SAAiBja,GAwBP,IAxBQ,QACd4F,EAAU,CAAC,EAAC,YACZ++J,GAAc,EAAI,eAClBC,EAAiB,CAAC,EAAC,OACnBpzI,EAAS,GAAE,SACXqzI,EAAW,EAAC,QACZ59J,EAAU,GAAE,gBACZ88J,EAAe,YACfQ,EAAW,cACXO,EAAa,WACbC,EAAU,UACV9qJ,EAAS,kBACT+qJ,EAAiB,SACjBplG,EAAQ,SACRlpC,EAAQ,QACRmrB,EAAO,gBACPojH,EAAe,iBACfb,EAAgB,qBAChBF,EAAoB,QACpB7+J,EAAO,cACPovI,EAAa,KACb/qH,EAAI,qBACJ+6I,EAAoB,qBACpBJ,GACIrkK,EACJ,GAAgB,KAAZiH,IAAmBm9J,EACnB,OACIv8J,IAAAA,cAAA,YACKZ,EACDY,IAAAA,cAACq9J,EAAAA,EAAmB,CAChB1zI,OAAQA,EACRqzI,SAAUA,KAM1B,MAAMM,EAAel9J,OAAOC,OAAO,CAC/Bg8J,uBACA7+J,UACAk/J,cACAO,gBACAM,YAAY,EACZrB,kBACAY,YAAalwB,GAAiBkwB,EAC9Bj7I,OACA+6I,uBACAJ,uBACAQ,WACArzI,UACD5rB,GAEGy/J,GAAoBC,EAAAA,EAAAA,IAAWr+J,EAASk+J,EAAczuI,GAE5D,OAAO6uI,EAAAA,EAAAA,GAAuBF,EAAmB,CAC7CN,aACAH,iBACAI,oBACAxzI,SACAqwB,UACAojH,kBACAhrJ,YACA2lD,WACA5vD,iBAAkBpK,aAAO,EAAPA,EAASoK,iBAC3Bk/F,sBAAuBtpG,aAAO,EAAPA,EAASspG,sBAChC21D,WACAW,uBAAwB5/J,aAAO,EAAPA,EAAS4/J,uBACjCC,eAAgB7/J,aAAO,EAAPA,EAAS6/J,gBAEjC,G,4ME9IA,MAAMC,EAAoCn+J,IACtC,MAAMo+J,GAAkBC,EAAAA,EAAAA,KAElBnoD,GAAQj8F,EAAAA,EAAAA,UAAkB,SAAAqkJ,EAAAC,EAAAC,EAAAC,EAAA,OAAMC,EAAAA,EAAAA,GAAY,CAC9Cr6C,QAAS,CACL/Z,WAAY,CACRq0D,MAAmC,QAA9BL,EAAa,QAAbC,EAAEv+J,EAAMk2G,aAAK,IAAAqoD,OAAA,EAAXA,EAAaK,uBAAe,IAAAN,EAAAA,EAAIF,EAAgB/5C,QAAQ/Z,WAAWq0D,OAE9E3sB,SAAS6sB,EAAAA,EAAAA,IAAqC,QAAhCL,EAAY,QAAZC,EAACz+J,EAAMk2G,aAAK,IAAAuoD,OAAA,EAAXA,EAAaK,0BAAkB,IAAAN,EAAAA,EAAIJ,EAAgB/5C,QAAQ2tB,QAAS,OAEzF,GAAE,CAAChyI,aAAK,EAALA,EAAOk2G,QAEZ,OAAO51G,IAAAA,cAAC8kH,EAAAA,EAAa,CAAClP,MAAOA,GAAQl2G,EAAM20D,SAAyB,EAGxE,GAAe9E,EAAAA,EAAAA,MAAKsuG,G,qCClBb,MAAMY,GAAcC,EAAAA,EAAAA,eAAsC,CAC7Dx4D,QAAQ,EACRy4D,oBAAqBA,OACrBC,aAAcA,SAElBH,EAAYj4J,YAAc,cAEnB,MAAMq4J,GAAiBH,EAAAA,EAAAA,eAAsC,CAChEx4D,QAAQ,EACRy4D,oBAAqBA,OACrBC,aAAcA,SAIX,SAASE,EAAoB5qI,EAAmBgyE,GACnD,MAAM64D,GAAoBlzG,EAAAA,EAAAA,QAAO,IAAIvyB,KAErC,OAAO3f,EAAAA,EAAAA,UAAQ,KAAM,CACjBua,QACAgyE,SACAy4D,oBAAsBK,IAClBD,EAAkBtsJ,QAAQ8mB,IAAIylI,EAAS,EAE3CJ,aAAcA,KACVG,EAAkBtsJ,QAAQ/J,SAASs2J,GAAaA,MAChDD,EAAkBtsJ,QAAQwsJ,OAAO,KAErC,CAAC/qI,EAAOgyE,GAChB,CAhBA24D,EAAer4J,YAAc,iB,0BCRtB,MAAM04J,GAAgBr9G,EAAAA,EAAAA,IAAOs9G,EAAAA,EAAS,CACzCC,kBAAoBC,GAAkB,cAATA,GADJx9G,EAGzB1pD,IAAA,IAAC,UAACmnK,EAAS,MAAEjxJ,GAAMlW,EAAA,MAAM,CACrB,mBAAoB,CAChBwxF,gBAAiB,2BACjBwrC,UAAW,GAAFx0H,OACL2+J,EAAY,qBAAuB,qBAAoB,iEAE3D5lC,SAAU,QACV3lD,SAAU,QACVR,UAAW,OACXllE,SAEP,ICECkxJ,EAA+B,IAC/BC,EAAgC,IA+BhCC,EAAsB,CAAC/qG,SAAU,SAAUD,WAAY,QACvDirG,EAAyB,CAAChrG,SAAU,MAAOD,WAAY,QAiCtD,SAAS76C,EAAKla,GAAc,IAAAigK,EAAAC,EAC/B,MAAMhqD,GAAQ7+D,EAAAA,EAAAA,aAAY8+D,EAAAA,IAEpBg2B,GAAe90F,EAAAA,EAAAA,aAAYiQ,EAAAA,IAE3B3wD,GAAWsxD,EAAAA,EAAAA,gBAEVk4G,EAAeC,IAAoBvmJ,EAAAA,EAAAA,UAA6B,OAChEwmJ,EAAsBC,IAA2BzmJ,EAAAA,EAAAA,WAAS,GAC3D0mJ,EAAa1zJ,QAAQszJ,GAUrBK,GAAYzmJ,EAAAA,EAAAA,cAAY,KAC1BqmJ,EAAiB,MACjBE,GAAwB,EAAM,GAC/B,IAEH,SAASG,EAAqBrtJ,GAC1Bzc,GAASomG,EAAAA,EAAAA,GAAW3pF,IACpBgtJ,EAAiB,KACrB,CA6BA,SAASM,EAAsBvoJ,GAIT,IAAAwoJ,EAAAC,EAHlBzoJ,EAAMjO,iBACNiO,EAAM+7C,kBAEFi4E,EACAx1I,GACIwc,EAAAA,EAAAA,GAA0B,CACtBC,QAASpT,EAAM60D,KAAKx9D,GACpBkc,WAAYstJ,EACZrtJ,YAAa,CACTstJ,aAAc9gK,EAAMy0D,WAAWp9D,GAC/B0pK,OAAQ/gK,EAAM60D,KAAKx9D,GACnB2pK,cAAyC,QAA5BL,EAAY,QAAZC,EAAE5gK,EAAM60D,YAAI,IAAA+rG,OAAA,EAAVA,EAAa,qBAAa,IAAAD,EAAAA,EAAI,GAC7CM,aAAcR,EACd9rG,SAAU30D,EAAM20D,SAChBsiB,UAAWj3E,EAAM60D,KAAKoiB,cAKlCmpF,EAAiBjoJ,EAAMyrH,cAE/B,CAGA,SAASs9B,IACLZ,GAAwB,EAC5B,CAGA,SAASa,IAAmB,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACxB,MAAMC,EAA0C,QAAvBR,EAAmB,QAAnBC,EAAGrhK,EAAMy0D,kBAAU,IAAA4sG,OAAA,EAAhBA,EAAkBQ,UAAE,IAAAT,EAAAA,EAAI,SAE9CU,EACFxhK,IAAAA,cAACshK,EAAmB,CAChBvqK,GAAI2I,EAAMy0D,WAAWp9D,GACrB,cAAa2I,EAAMy0D,WAAWstG,WAC9B,gBAAe/hK,EAAM60D,KAAKx9D,GAC1B,iBAAe,EACf,gBAAekpK,EACf54J,SAAoC,QAA5B25J,EAAkB,QAAlBC,EAAEvhK,EAAMy0D,kBAAU,IAAA8sG,OAAA,EAAhBA,EAAkB55J,gBAAQ,IAAA25J,GAAAA,EACpC,aAA4C,QAA5CE,EAA4B,QAA5BC,EAAYzhK,EAAMy0D,kBAAU,IAAAgtG,OAAA,EAAhBA,EAAmB,qBAAa,IAAAD,EAAAA,EAAI,GAChDjhK,UAAkC,QAAzBmhK,EAAkB,QAAlBC,EAAE3hK,EAAMy0D,kBAAU,IAAAktG,OAAA,EAAhBA,EAAkBjtG,aAAK,IAAAgtG,EAAAA,EAAI,GACtC9xJ,QAAS8wJ,EACT7oB,YAAaqpB,GAEZlhK,EAAMy0D,WAAWE,UAIoD,IAAAqtG,EAAAC,EAAAC,EAA9E,OAAIliK,EAAMw0D,mBAAqBx0D,EAAMw0D,kBAAkB1pD,OAASqhI,EAExD7rI,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOxO,EAAMw0D,kBAAkB1pD,KAC/Bw9E,WAA+C,QAArC05E,EAAyB,QAAzBC,EAAEjiK,EAAMw0D,yBAAiB,IAAAytG,OAAA,EAAvBA,EAAyB35E,kBAAU,IAAA05E,GAAAA,EAC/Cr6J,SAAU44J,IAA8B,QAApB2B,EAAIliK,EAAMy0D,kBAAU,IAAAytG,OAAA,EAAhBA,EAAkBv6J,WAEzCm6J,GAKNA,CACX,EAEAp8G,EAAAA,EAAAA,YAAU,KACF1lD,EAAM60D,KAAKgpB,UACX79E,EAAM60D,KAAKgpB,SAAS0iF,EACxB,GACD,CAACA,IAEJ,MAAM4B,EAAgB/C,EAAoBoB,EAAW3zJ,QAAQszJ,IAE7D,OAAIh0B,EAEOg1B,IAIP7gK,IAAAA,cAAC69J,EAAqB,CAACjoD,MAAOA,GACzBirD,IACD7gK,IAAAA,cAACy+J,EAAYqD,SAAQ,CAACt+J,MAAOq+J,GACzB7hK,IAAAA,cAACk/J,EAAa,CACV6C,SAAUlC,EACVluJ,KAAMsuJ,EACNzhF,QAjIhB,SAAyB3mE,GACrBA,EAAMjO,iBACNk2J,EAAiB,MACjBE,GAAwB,EAC5B,EA8HgB1wJ,QA/GhB,SAAyBnQ,GACrBA,EAAEy0D,iBACN,EA8GgBouG,mBAAoBH,EAAcjD,aAClCjoF,UA7GhB,SAA2B9+D,GACvB,IAAI8mD,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAAS+Z,SAAUjS,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASorG,OAAQ,CAChG,MAAMznG,EAAS3iD,EAAM2iD,OACf0nG,EAAkE,UAA1C1nG,aAAM,EAANA,EAAQqqF,aAAa,kBAC7Csd,EAAqE,UAA1C3nG,aAAM,EAANA,EAAQqqF,aAAa,kBAElDqd,GAAyBC,GAGzBrC,EAAiB,KAEzB,CAEIpgK,EAAM60D,KAAKoiB,WAIXj3E,EAAM60D,KAAKoiB,UAAU9+D,EAAOqoJ,EAEpC,EA2FgBjgK,UAAW8yE,EAAAA,GAAeG,MAC1B7kE,MAAO3O,EAAM60D,KAAKlmD,MAClBsmD,aAAcj1D,EAAMi1D,cAAgB8qG,EACpCjrG,gBAAiB90D,EAAM80D,iBAAmBkrG,EAC1CK,qBAAsBA,EACtBqC,cAAe,CACXrrK,GAAI2I,EAAM60D,KAAKx9D,GACf,aAAwC,QAA5B4oK,EAAY,QAAZC,EAAElgK,EAAM60D,YAAI,IAAAqrG,OAAA,EAAVA,EAAa,qBAAa,IAAAD,EAAAA,EAAI,IAEhD0C,gBAAiB,CACb13B,cAAc,EACdC,eAAe,EACf11G,QAAS,CACLymC,MAAO4jG,EACP+C,KAAM9C,KAIb9/J,EAAM20D,WAK3B,CAWA,SAASksG,EAAU7gK,GACf,MAAMk2G,GAAQ7+D,EAAAA,EAAAA,aAAY8+D,EAAAA,IAE1B,SAAS0sD,IACL7iK,EAAMihK,aAAajhK,EAAM+gK,OAC7B,CAqBA,OACIzgK,IAAAA,cAAC69J,EAAqB,CAACjoD,MAAOA,GAC1B51G,IAAAA,cAACo8E,EAAAA,GAAY,CACTrlF,GAAI2I,EAAM+gK,OACVxgK,UAAU,YACV4M,UAAU,EACVuN,UAAW1a,EAAMghK,cACjB9zJ,SAAU21J,EACVtoJ,cAAc,EACduoJ,cAfZ,SAAuB3qJ,GACfA,GAASnY,EAAMi3E,WACfj3E,EAAMi3E,UAAU9+D,EAAO0qJ,EAE/B,GAaYviK,IAAAA,cAACyiK,EAAAA,EAAY,CACT9kK,UAAU,MACV,kBAAiB+B,EAAM8gK,aACvBlxJ,QAjChB,SAAiCuI,GAC7B,GAAIA,GAASA,EAAMyrH,cAAczlE,SAAShmD,EAAM2iD,QAC5C,IAAK,MAAMkoG,KAAkB7qJ,EAAMyrH,cAAcjvE,SAC7C,GAAIquG,EAAe7kG,SAAShmD,EAAM2iD,UAAoBkoG,EAAeC,aAAc,CAG/EJ,IACA,KACJ,CAGZ,GAwBiB7iK,EAAM20D,WAK3B,C,+LCvNO,SAASopB,EAAS/9E,GACrB,MAAM,eACFkjK,EAAc,OACdhxG,EAAM,iBACNC,EAAgB,cAChBgxG,EAAa,kBACbC,EAAiB,SACjBzuG,EAAQ,QACR/kD,EAAO,KACPxC,EAAO,YAEPpN,EADG25E,E,qWAAUx5B,CACbngD,EAAKogD,GAEHijH,GAAcC,EAAAA,EAAAA,YAAWvE,GACzBwE,GAAiBD,EAAAA,EAAAA,YAAWnE,GAE5BhzB,GAAe90F,EAAAA,EAAAA,aAAYiQ,EAAAA,IAEjC,SAASjH,EAAYloC,GACjB,GA+KR,SAAuCA,GACnC,GAAIA,EAAM3c,OAASqwB,EAAAA,GAAW23I,SAAU,CACpC,MAAMC,EAAgBtrJ,EACtB,UAAI8mD,EAAAA,EAAAA,GAAawkG,EAAe19I,EAAAA,GAAUoxC,SAAS+Z,UAAUjS,EAAAA,EAAAA,GAAawkG,EAAe19I,EAAAA,GAAUoxC,SAASorG,OAKhH,CAAO,OAAIpqJ,EAAM3c,OAASqwB,EAAAA,GAAW63I,OAEP,IADPvrJ,EACJ6qI,MAQvB,CAjMY2gB,CAA8BxrJ,KAG1ByrJ,EAAsBx2J,GACtB+K,EAAM+7C,mBAGFqvG,EAAe/uI,OACf+uI,EAAe/uI,QAIf6uI,EAAY7uI,OACZ6uI,EAAY7uI,SAIhB5kB,GAGA,GAAIu8H,GAAgBy3B,EAAsBx2J,GACtCwC,EAAQuI,OACL,CAEH,MAAM0rJ,EAAcC,IAAU3rJ,GAE9BkrJ,EAAYpE,qBAAoB,KAC5BrvJ,EAAQi0J,EAAY,GAE5B,CAGZ,CAGA,MAAME,EAAoB7xG,GAAUA,EAAOlyD,OAASkyD,EAAOlyD,MAAM20D,UAAsD,IAA1CqvG,EAAAA,SAAS1uJ,MAAM48C,EAAOlyD,MAAM20D,UAEzG,OACIr0D,IAAAA,cAAC2jK,EAAcvjK,OAAAC,OAAA,CACXujK,eAAe,EACfC,oBAAoB,EACpBhB,cAAeA,EACfY,kBAAmBA,EACnBX,kBAAmBA,EACnBxzJ,QAASywC,EACT42B,UAAW52B,EACXjzC,KAAMA,GACFusE,GAEHupF,GAAkB5iK,IAAAA,cAAA,OAAKC,UAAU,mBAAmB2iK,GACrD5iK,IAAAA,cAAA,OAAKC,UAAU,kBAAkB2xD,GAChCC,GAAoB7xD,IAAAA,cAAA,OAAKC,UAAU,qBAAqB4xD,GACxDwC,EAGb,CAQO,MAAMsvG,GAAiB9hH,EAAAA,EAAAA,IAAOiiH,EAAAA,EAAa,CAC9C1E,kBAAoBC,GAAkB,kBAATA,GAChB,sBAATA,GAAyC,sBAATA,GAFVx9G,EAI1B1pD,IAAmF,IAAlF,cAAC0qK,GAAgB,EAAK,kBAAEY,GAAoB,EAAK,kBAAEX,GAAoB,GAAM3qK,EAC1E,MACM4rK,GAAalB,EAEnB,MAAQ,CACJ,qBAAsB,CAClBhW,WAAY,0BACZx9F,MAAO00G,EAAY,8BAAgC,oBACnDvjF,QAAS,WACTmpB,QAAS,OACTq6D,cAAe,MACfC,SAAU,SACVC,eAAgB,aAChBrvD,YAZqB4uD,GAYcX,EAAoB,SAAW,aAClErpC,UAAW,OACXlmD,UAAW,OAGX,wCAAyC,CACrC,mBAAoBwwF,EAAY,mCAAqC,6DAGzE,UAAW,CACPp6E,gBAAiBo6E,EAAY,8CAAgD,oBAC7E10G,MAAOwzG,GAAiB,uBAG5B,iBAAkB,CACdxzG,MAAO,+CAGX,qBAAsB,CAClB8lE,UAAW4uC,EAAY,oDAAsD,sDAC7Ep6E,gBAAiBo6E,EAAY,2BAA6B,oBAC1D10G,MAAOwzG,GAAiB,uBAE5B,kJAAmJ,CAC/IxzG,MAAOwzG,GAAiB,uBAE5B,6EAA8E,CAC1ExzG,MAAOwzG,GAAiB,uBAG5B,qBAAsB,CAClBx0J,MAAO,OACPC,OAAQ,OACR61J,gBAAiB,OACjB90G,MAAO00G,EAAY,8CAAgD,qBAEvE,2BAA4B,CACxB10G,MAAO00G,EAAY,6CAA+C,uBAGtE,oBAAqB,CACjBp6D,QAAS,OACTiL,KAAM,WACNovD,cAAe,SACfE,eAAgB,SAChBrvD,WAAY,aACZovD,SAAU,SACVG,UAAW,UACXtX,WAAY,IACZuX,UAAW,QACXC,IAAK,MACLvX,WAAY,QAGhB,gCAAiC,CAC7Bl/I,SAAU,OACVwhD,MAAO00G,EAAY,8CAAgD,qBAEvE,sCAAuC,CACnC10G,MAAOwzG,GAAiB,uBAG5B,gEAAiE,CAC7Dh1J,SAAU,OACVwhD,MAAO00G,EAAY,8BAAgC,qBAEvD,4EAA6E,CACzE10G,MAAOwzG,GAAiB,uBAG5B,uBAAwB,CACpBl5D,QAAS,OACTq6D,cAAe,MACfC,SAAU,SACVC,eAAgB,WAChB70G,MAAO00G,EAAY,8CAAgD,oBACnEO,IAAK,MACLC,kBAAmB,OACnB12J,SAAU,OACVk/I,WAAY,OACZl4C,WAAY,UAEhB,6BAA8B,CAC1BxlD,MAAO00G,EAAY,8CAAgD,wBAG9E,IA6BT,SAAST,EAAsBx2J,GAC3B,MAAgB,qBAATA,GAAwC,kBAATA,CAC1C,C,kICjRO,SAAS03J,EAAQ9kK,GACpB,MAAM,GACF3I,EAAE,eACF6rK,EAAc,OACdhxG,EAAM,iBACNC,EAAgB,cAChBgxG,EAAa,OACbpC,EAAM,cACNC,EAAa,gBACb+D,EAAe,SACfpwG,GAEA30D,EADG28F,E,qWAAIx8C,CACPngD,EAAKogD,IAEF+/G,EAAeC,IAAoBvmJ,EAAAA,EAAAA,UAA6B,MACjEmrJ,EAAgBn4J,QAAQszJ,GAExBh0B,GAAe90F,EAAAA,EAAAA,aAAYiQ,EAAAA,IAC3B29G,GAAe5tH,EAAAA,EAAAA,aAAY6tH,EAAAA,GAE3BvuK,GAAWsxD,EAAAA,EAAAA,gBAEjBvC,EAAAA,EAAAA,YAAU,KACFu/G,IAAiB94B,GACjBi0B,EAAiB,KACrB,GACD,CAAC6E,EAAc94B,IAElB,MAAMg5B,GAA6BlrJ,EAAAA,EAAAA,UAAQ,IA8K/C,WAAkK,IAAlGkmJ,EAAiC55J,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EAC7F,IAAK6kK,EACD,OAAOiF,EAGX,GALkD7+J,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAM9C,OAAO8+J,EAGX,GAAIrzJ,QAAUA,OAAO2hB,WAAY,KAAA2xI,EAAAC,EAAAC,EAAAC,EAC7B,MAAMC,EAAc1zJ,OAAO2hB,WACrBgyI,EAAgE,QAA/CL,EAAGnF,SAAsC,QAAzBoF,EAAbpF,EAAex4G,+BAAuB,IAAA49G,OAAzB,EAAbA,EAAwCj2G,YAAI,IAAAg2G,EAAAA,EAAI,EAM1E,OAFmBI,GAHqD,QAAhDF,EAAGrF,SAAsC,QAAzBsF,EAAbtF,EAAex4G,+BAAuB,IAAA89G,OAAzB,EAAbA,EAAwC1tG,aAAK,IAAAytG,EAAAA,EAAI,GAE1DG,EAIPN,EAGJD,CACX,CAEA,OAAOA,CACX,CAtMeQ,CAA8Bb,EAAiB5E,IACvD,CAACA,EAAe4E,IAOb5C,EAAgB/C,GAJDrlJ,EAAAA,EAAAA,cAAY,KAC7BqmJ,EAAiB,KAAK,GACvB,IAEqDvzJ,QAAQszJ,IAGhE,IADwBtzJ,QAAQ8nD,GAE5B,OAAO,KA+CX,MAAMkxG,EAA6B,CAC/BxuK,KACA,gBAAiB0pK,EACjB,iBAAiB,EACjB,gBAAiBiE,EACjBd,eAAe,EACfhB,iBACAhxG,SACAC,mBACAgxG,gBACAvzJ,QAASu8H,EAtBb,WACIx1I,GAASwc,EAAAA,EAAAA,GAA6B,CAClCC,QAAS2tJ,EACTxtJ,WAAYoG,EACZnG,YAAa,CACTutJ,SACAC,gBACArsG,cAGZ,OAY4Cr5D,GAG5C,OAAI6wI,EACQ7rI,IAAAA,cAACy9E,EAAa8nF,GAItBvlK,IAAAA,cAACy9E,EAAQr9E,OAAAC,OAAA,GACDg8F,EACAkpE,EAA0B,CAC9B/6E,aAjER,SAA0B3yE,GACtBA,EAAMjO,iBACNk2J,EAAiBjoJ,EAAMyrH,cAC3B,EA+DQhb,aA7DR,SAA0BzwG,GACtBA,EAAMjO,iBACNk2J,EAAiB,KACrB,EA2DQnpF,UAzDR,SAAuB9+D,KAEf8mD,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAAS+Z,SACvCjS,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASorG,SACvCtjG,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAAS2uG,UAEvC3tJ,EAAMjO,iBACNk2J,EAAiBjoJ,EAAMyrH,eAE/B,IAkDQtjI,IAAAA,cAACk/J,EAAa,CACV6C,SAAUlC,EACVluJ,KAAM+yJ,EACNpF,WAAW,EACX3qG,aAAckwG,EAA2BlwG,aACzCH,gBAAiBqwG,EAA2BrwG,gBAC5CixG,GAAI,CAAC37D,cAAe,SAKpB9pG,IAAAA,cAACyiK,EAAAA,EAAW,CACR1rK,GAAI0pK,EACJ9iK,UAAU,KACV,aAAY+iK,EACZzgK,UAAW8yE,EAAAA,GAAeG,MAC1ByD,UAhEhB,SAA8B9+D,IACtB8mD,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASya,MAAO3S,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAAS8a,MAErF95D,EAAM+7C,oBACC+K,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASua,UAAWzS,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAAS6uG,SAChG7tJ,EAAMjO,iBACNk2J,EAAiB,MAEzB,EAyDgB2F,GAAI,CACA37D,cAAe,OACf67D,WAAY,EACZC,cAAe,IAGnB5lK,IAAAA,cAAC6+J,EAAeiD,SAAQ,CAACt+J,MAAOq+J,GAC3BxtG,KAMzB,CAQA,SAASh7C,EAAa3Z,GAClB,MAAMrJ,GAAWsxD,EAAAA,EAAAA,eAEXiuD,GAAQ7+D,EAAAA,EAAAA,aAAY8+D,EAAAA,IAE1B,SAASgwD,IACLxvK,GAASomG,EAAAA,EAAAA,GAAW/8F,EAAM+gK,QAC9B,CAEA,OACIzgK,IAAAA,cAAC69J,EAAqB,CAACjoD,MAAOA,GAC1B51G,IAAAA,cAACo8E,EAAAA,GAAY,CACTrlF,GAAI2I,EAAM+gK,OACVrmJ,UAAW1a,EAAMghK,cACjB9zJ,SAAUi5J,EACVh5J,UAAU,EACV5M,UAAU,aAEVD,IAAAA,cAACyiK,EAAAA,EAAW,CACR,eAAa,EACbnzJ,QAASu2J,GAERnmK,EAAM20D,WAK3B,CAEA,MAAM0wG,EAAa,CACfpwG,aAAc,CACVD,SAAU,MACVD,WAAY,QAEhBD,gBAAiB,CACbE,SAAU,MACVD,WAAY,UAIdqwG,EAAc,CAChBnwG,aAAc,CACVD,SAAU,MACVD,WAAY,SAEhBD,gBAAiB,CACbE,SAAU,MACVD,WAAY,S,eC5Ob,SAASqxG,IACZ,OACI9lK,IAAAA,cAAC+lK,EAAAA,EAAO,CACJpoK,UAAU,KACV,mBAAiB,YAG7B,C,6oBCgBA,MAAMk5D,EAAWpxC,EAAAA,GAAUoxC,SAEZ,MAAMmvG,UAAyChmK,IAAAA,cAWnDsC,WAAAA,CAAY5C,GACf6C,MAAM7C,GAAO8C,EAAA,iBALG,GAACA,EAAA,eACHxC,IAAAA,aAAiCwC,EAAA,uBACzBxC,IAAAA,aA2C1BwC,EAAA,oBACsB0D,IAClBxD,KAAKgH,SAAS,CAACxD,YAAU,IAC5B1D,EAAA,yBAE2BrD,IACxB,IAAIs/D,EAAAA,EAAAA,GAAiBt/D,IAAMA,EAAEu/D,SACzB,OAGJ,MAAM3gE,EAAU2E,KAAKhD,MAAM3B,QAC3B,GAAuB,IAAnBA,EAAQqL,OACR,OAGJ,IAAIlD,EACJ,OAAQ/G,EAAEzB,KACV,KAAKm5D,EAAS8a,KAAK,GACf,IAA6B,IAAzBjvE,KAAKpK,MAAM4N,SAAiB,CAC5BA,EAAW,EACX,KACJ,CACAA,EAAWpC,KAAKinD,IAAIroD,KAAKpK,MAAM4N,SAAW,EAAGnI,EAAQqL,OAAS,GAC9D,MACJ,KAAKytD,EAASya,GAAG,GACb,IAA6B,IAAzB5uE,KAAKpK,MAAM4N,SAAiB,CAC5BA,EAAW,EACX,KACJ,CACAA,EAAWpC,KAAKs2D,IAAI13D,KAAKpK,MAAM4N,SAAW,EAAG,GAC7C,MACJ,QACI,OAGJ/G,EAAEyK,iBACFlH,KAAKgH,SAAS,CAACxD,aACfxD,KAAKhD,MAAMg0D,SAAS31D,EAAQmI,GAAU,IACzC1D,EAAA,8BAE+B,CAC5B2D,EACAq0C,EACAjhB,EACA0sI,KAEA,IAAItrH,EAAc,GAKlB,OAJIH,IACAG,EAAc,6BAId36C,IAAAA,cAAA,OACI46C,IAAKJ,EAAa93C,KAAKm4C,gBAAkB10C,EAAO3C,MAChDvD,UAAW06C,EACXj9C,IAAK,oBAAsByI,EAAO3C,MAClC8L,QAASA,IAAMiqB,EAAIpzB,GACnBqkF,aAAcA,IAAMy7E,EAAO9/J,IAE1BA,EAAOvE,MACN,IAEbY,EAAA,eAEiB2D,IACd,MAAMi8B,EAAI1/B,KAAKhD,MAAM3B,QAAQmxB,QAAQ/oB,IAC1B,IAAPi8B,GACI1/B,KAAKpK,MAAM4N,WAAak8B,GACxB1/B,KAAKwjK,YAAY9jI,EAEzB,IA5GA1/B,KAAKpK,MAAQ,CACT4N,UAAW,EAEnB,CAEO+0C,iBAAAA,GACH/4C,SAASq7D,iBAAiB,UAAW76D,KAAKyjK,iBAC9C,CAEOnmG,oBAAAA,GACH99D,SAASu7D,oBAAoB,UAAW/6D,KAAKyjK,iBACjD,CAEOhrH,kBAAAA,CAAmBo5E,EAAapwH,GAAkB,IAAAiiK,EACrD,MAAMroK,EAAU2E,KAAKhD,MAAM3B,QAK3B,GAJIA,GAAWA,EAAQqL,OAAS,GAAK1G,KAAKpK,MAAM4N,UAAY,GACxDxD,KAAKhD,MAAMg0D,SAAS31D,EAAQ2E,KAAKpK,MAAM4N,WAGvC/B,EAAU+B,WAAaxD,KAAKpK,MAAM4N,SAClC,OAGJ,MAAMmgK,EAAY3jK,KAAKm4C,gBAAgBpoC,UAAqC,QAA9B2zJ,EAAI1jK,KAAKhD,MAAMm7C,uBAAe,IAAAurH,OAAA,EAA1BA,EAA4B3zJ,SAC9E,GAAI/P,KAAK4jK,QAAQ7zJ,SAAW4zJ,EAAW,CACnC,MAAME,EAAUF,EAAUh/G,wBAAwBC,IAC5Ck/G,EAAaH,EAAUh/G,wBAAwBqQ,OAC/C+uG,EAAU/jK,KAAK4jK,QAAQ7zJ,QAAQ40C,wBAAwBC,IAEzDk/G,EADe9jK,KAAK4jK,QAAQ7zJ,QAAQ40C,wBAAwBqQ,OAE5D2uG,EAAU9tD,gBAAe,GAClBguD,EAAUE,GACjBJ,EAAU9tD,gBAAe,EAEjC,CACJ,CA4EO5yG,MAAAA,GACH,MAAM,QAAC5H,EAAO,uBAAEgyG,GAA0BrtG,KAAKhD,MAC/C,IAAIgnK,EAEJ,GAAIhkK,KAAKhD,MAAMsM,QACX06J,EACI1mK,IAAAA,cAAA,OAAK,eAAa,GACdA,IAAAA,cAACmjJ,EAAAA,EAAa,CACVt8F,SAAS,WACTnpD,IAAI,kBAIb,GAAe,MAAXK,GAAsC,IAAnBA,EAAQqL,OAE9Bs9J,EADA32D,GAII/vG,IAAAA,cAAA,OACItC,IAAI,iBACJuC,UAAU,qBACVu1D,SAAU,GAEVx1D,IAAAA,cAAA,KAAGC,UAAU,mBACTD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,iDACfjB,OAAQ,CACJm+J,YAAajkK,KAAKhD,MAAM8Q,MACxB8B,EAAI9O,GAAkBxD,IAAAA,cAAA,SAAIwD,YAO/C,CACH,IAAI8yI,EAEAA,EADA5zI,KAAKhD,MAAM68C,eACA75C,KAAKhD,MAAM68C,eAEX75C,KAAKkkK,sBAGpB,MAAMC,EAAiB9oK,EAAQsF,KAAI,CAACgM,EAAG+yB,IAAMk0G,EAASjnI,EAAG3M,KAAKpK,MAAM4N,WAAak8B,EAAG1/B,KAAKhD,MAAM+6C,MAAO/3C,KAAKujK,UAErGxjK,EAAiB1E,EAAQ2E,KAAKpK,MAAM4N,UACpCkU,EAAY1X,KAAKhD,MAAMo/C,kBAAkBr8C,GAE/CikK,EACI1mK,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,OACIC,UAAU,UACV,YAAU,SACV,cAAY,QAEXma,GAELpa,IAAAA,cAAA,OACI46C,IAAKl4C,KAAK4jK,QACVvvK,GAAG,kBACHkJ,UAAU,sBACV6M,KAAK,eACL,eAAa,GAEZ+5J,GAIjB,CAEA,OACI7mK,IAAAA,cAAA,OACIC,UAAU,wBACV,YAAU,UAETymK,EAGb,E,yZACHlkK,EA7MoBwjK,EAAe,aAvBhCh6J,QAAOlG,IAAAA,KACP20C,MAAK30C,IAAAA,KAAAC,WACL+8I,aAAYh9I,IAAAA,KACZ4tD,SAAQ5tD,IAAAA,KAAAC,WACRw2C,eAAcz2C,IAAAA,KAAAC,WAMdyK,MAAK1K,IAAAA,OAEL/H,QAAO+H,IAAAA,MACP7G,KAAI6G,IAAAA,OAAAC,WACJ42C,QAAO72C,IAAAA,OACPiqG,uBAAsBjqG,IAAAA,OAAAtD,EAQLwjK,EAAe,eACH,CACzBjoK,QAAS,GACT4+C,QAAS,GACTmqH,SAAUA,IAAM,OCmCxB,MAAMjwG,EAAWpxC,EAAAA,GAAUoxC,SAEpB,MAAMva,UAAqCt8C,IAAAA,cAavCsC,WAAAA,CAAY5C,GACf6C,MAAM7C,GAAO8C,EAAA,eAbCxC,IAAAA,aAAqCwC,EAAA,sBAC9BxC,IAAAA,aAA8BwC,EAAA,gBAC1B,MAAIA,EAAA,gCAgDC,KAC9BE,KAAKgH,SAAS,CAACq9J,YAAY,GAAM,IACpCvkK,EAAA,kCAEmC,KAChCE,KAAKgH,SAAS,CAACq9J,YAAY,GAAO,IACrCvkK,EAAA,iBAEkB,KACXE,KAAKhD,MAAMk9C,kBACXl6C,KAAKhD,MAAMk9C,iBAAiBl6C,KAAKpK,MAAM2G,KAAO,EAAGyD,KAAKpK,MAAM2G,MAE5DyD,KAAK4jK,QAAQ7zJ,SACb/P,KAAK4jK,QAAQ7zJ,QAAQyzJ,YAAY,GAErCxjK,KAAKgH,SAAS,CAACzK,KAAMyD,KAAKpK,MAAM2G,KAAO,GAAG,IAC7CuD,EAAA,iBAEkB,KACS,IAApBE,KAAKpK,MAAM2G,OAIXyD,KAAKhD,MAAMk9C,kBACXl6C,KAAKhD,MAAMk9C,iBAAiBl6C,KAAKpK,MAAM2G,KAAO,EAAGyD,KAAKpK,MAAM2G,MAG5DyD,KAAK4jK,QAAQ7zJ,SACb/P,KAAK4jK,QAAQ7zJ,QAAQyzJ,YAAY,GAErCxjK,KAAKgH,SAAS,CAACzK,KAAMyD,KAAKpK,MAAM2G,KAAO,IAAG,IAC7CuD,EAAA,oBAEoB,KACjBE,KAAKgH,SAAS,CAACzK,KAAM,GAAG,IAC3BuD,EAAA,iBAEmB0D,IAChBxD,KAAKwD,SAAWA,CAAQ,IAC3B1D,EAAA,cAEgBgB,IACb,GAAId,KAAKhD,MAAMu9C,WAAav6C,KAAKhD,MAAM8I,OAAOY,QAAU1G,KAAKhD,MAAMu9C,UAC/D,OAGJ,IAAK,IAAI7a,EAAI,EAAGA,EAAI1/B,KAAKhD,MAAM8I,OAAOY,OAAQg5B,IAC1C,GAAI1/B,KAAKhD,MAAM8I,OAAO45B,GAAGrrC,KAAOyM,EAAMzM,GAClC,OAIR2L,KAAKhD,MAAMq9C,UAAUv5C,GACrBd,KAAKwD,SAAW,KAEZxD,KAAKskK,eAAev0J,UACpB/P,KAAKskK,eAAev0J,QAAQwzJ,OAAOgB,kBAC/B,CAAC3jC,cAAe,CAAC9/H,MAAO,MAE5Bd,KAAKskK,eAAev0J,QAAQiP,SAGhC,MAAMwlJ,EAAsBxkK,KAAKhD,MAAMwnK,oBACnCA,GAAuBA,EAAoB1jK,IAC3Cd,KAAKhD,MAAMsN,aAAa,CAACxJ,GAC7B,IACHhB,EAAA,gBAEiB,CAACykD,EAAekgH,KACzBA,GAIiB,eAAlBA,EAAOptJ,QAA6C,eAAlBotJ,EAAOptJ,QAIzCrX,KAAKpK,MAAM2uD,QAAUA,IAIzBvkD,KAAKgH,SAAS,CAACu9C,UAEXvkD,KAAK4jK,QAAQ7zJ,UACC,KAAVw0C,EACAvkD,KAAK4jK,QAAQ7zJ,QAAQyzJ,aAAa,GAElCxjK,KAAK4jK,QAAQ7zJ,QAAQyzJ,YAAY,IAGzCxjK,KAAKwD,SAAW,KAEhBxD,KAAKhD,MAAMm9C,YAAYoK,EAAOvkD,MAAK,IACtCF,EAAA,uBAEyBrD,IACdA,EAAEzB,MACLm5D,EAAS+Z,MAAM,IAChBzxE,EAAEyK,gBAEN,IACHpH,EAAA,yBAE2BrD,IACxB,GAAQA,EAAEzB,MACLm5D,EAAS+Z,MAAM,GAApB,CACI,GAAqB,MAAjBluE,KAAKwD,SAEL,YADAxD,KAAKhD,MAAMsN,eAGftK,KAAK+3C,MAAM/3C,KAAKwD,SACX,CACT,IACH1D,EAAA,sBAEwBrD,IACrBA,EAAEyK,iBACFlH,KAAKhD,MAAMsN,cAAc,IAC5BxK,EAAA,iBAE2C,CAAC+xH,EAAG4yC,KAC5C,GAAsB,iBAAlBA,EAAOptJ,QAA+C,cAAlBotJ,EAAOptJ,OAC3C,OAGJ,MAAMvR,EAAS,IAAI9F,KAAKhD,MAAM8I,QAC9B,IAAK,IAAI45B,EAAI,EAAGA,EAAI55B,EAAOY,OAAQg5B,IAE/B,GAAI55B,EAAO45B,GAAGrrC,KAAQowK,EAAeC,aAAarwK,GAAI,CAClDyR,EAAO2iE,OAAO/oC,EAAG,GACjB,KACJ,CAGJ1/B,KAAKhD,MAAMo9C,aAAat0C,EAAO,IAClChG,EAAA,yBAEkBrK,IAAA,IAAC,SAACk8D,EAAQ,WAAEgzG,GAAgBlvK,EAAA,OAC3C6H,IAAAA,cAAA,MAASqnK,EACJhzG,GAAYr0D,IAAAA,cAACsnK,EAAAA,EAAoB,MAChC,IACT9kK,EAAA,0BAEoBY,IACjB,MAAMmkK,GAAavmK,EAAAA,EAAAA,IAAgBoC,EAAKrM,GAAIqM,EAAKy6C,qBAEjD,OACI79C,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACa,EAAAA,EAAM,CACHC,KAAK,KACLP,SAAU6C,EAAK7C,SACfQ,IAAKwmK,IAETvnK,IAAAA,cAAA,OAAKC,UAAU,8BACVgkD,EAAAA,EAAAA,IAAe7gD,IAErB,IAEVZ,EAAA,sBAEgB9C,GACNgD,KAAKhD,MAAMu/C,eAAiBj/C,IAAAA,cAACR,EAAAA,EAAWmC,gBAAoBjC,GAAWgD,KAAKhD,MAAM+8C,gBApMzF/5C,KAAKpK,MAAQ,CACTyuK,YAAY,EACZ9nK,KAAM,EACNgoD,MAAO,GAEf,CAEOhM,iBAAAA,GACH,MAAMiM,EAAoBxkD,KAAKskK,eAAev0J,SAAW/P,KAAKskK,eAAev0J,QAAQwzJ,OAAO/+G,SAE5FhlD,SAASq7D,iBAA4B,UAAW76D,KAAK8kK,kBACjDtgH,GAAkE,mBAA9CA,EAAyBqW,mBAC5CrW,EAAyBqW,iBAAiBmnC,EAAAA,GAAqB+iE,SAAU/kK,KAAKglK,yBAC9ExgH,EAAyBqW,iBAAiBmnC,EAAAA,GAAqBijE,WAAYjlK,KAAKklK,2BAE7EllK,KAAKhD,MAAMw/C,aACXmpD,uBAAsB,KAElB3lG,KAAKskK,eAAev0J,QAASiP,OAAO,IAIpD,CAEOs+C,oBAAAA,GACH,MAAM9Y,EAAoBxkD,KAAKskK,eAAev0J,SAAW/P,KAAKskK,eAAev0J,QAAQwzJ,OAAO/+G,SAExFA,GAAkE,mBAA9CA,EAAyBqW,mBAC5CrW,EAAyBuW,oBAAoBinC,EAAAA,GAAqB+iE,SAAU/kK,KAAKglK,yBACjFxgH,EAAyBuW,oBAAoBinC,EAAAA,GAAqBijE,WAAYjlK,KAAKklK,4BAGxF1lK,SAASu7D,oBAAoB,UAAW/6D,KAAK8kK,iBACjD,CAsKO7hK,MAAAA,GACH,MAAM5H,EAAUqC,OAAOC,OAAO,IAAIqC,KAAKhD,MAAM3B,WACvC,WAACilJ,EAAU,MAAE9/I,EAAK,OAAEsF,GAAU9F,KAAKhD,MAEzC,IAAI67C,EAgBAC,EAYA8D,EA3BA58C,KAAKhD,MAAM67C,iBACXA,GAAmBssH,EAAAA,EAAAA,IAAkBnlK,KAAKhD,MAAM67C,kBACjB,MAAxB74C,KAAKhD,MAAMu9C,gBAA8CjiD,IAAzB0H,KAAKhD,MAAMu9C,YAClD1B,EACIv7C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,gFACfjB,OAAQ,CACJ4xD,IAAK13D,KAAKhD,MAAMu9C,UAChBlC,IAAKr4C,KAAKhD,MAAMu9C,UAAYv6C,KAAKhD,MAAM8I,OAAOY,WAO1D1G,KAAKhD,MAAM87C,iBACXA,GAAmBqsH,EAAAA,EAAAA,IAAkBnlK,KAAKhD,MAAM87C,kBACjB,MAAxB94C,KAAKhD,MAAMu9C,YAClBzB,EACIx7C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,QAOvB61C,EADA58C,KAAKhD,MAAM4/C,gBACMuoH,EAAAA,EAAAA,IAAkBnlK,KAAKhD,MAAM4/C,gBAG1Ct/C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,SAK3B,IACIq+J,EACAC,EACAC,EAHAC,EAAmB,GAKnBvlK,KAAKhD,MAAMwoK,WACXF,EACIhoK,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,KACIC,UAAU,aACViO,MAAOxL,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,iBAGxFzJ,IAAAA,cAAA,WAAM0C,KAAKhD,MAAMwoK,YAK7B,MAAMC,EAAoC,CAAC,EAC3C,IAAK,IAAI/lI,EAAI,EAAGA,EAAI55B,EAAOY,OAAQg5B,IAC/B+lI,EAAS3/J,EAAO45B,GAAGrrC,KAAM,EAG7B,IAAK,IAAIqrC,EAAIrkC,EAAQqL,OAAS,EAAGg5B,GAAK,EAAGA,IACjC+lI,EAASpqK,EAAQqkC,GAAGrrC,KACpBgH,EAAQotE,OAAO/oC,EAAG,GAI1B,GAAIrkC,GAAWA,EAAQqL,OAAS1G,KAAKhD,MAAMi9C,QAAS,CAChD,MAAMyrH,EAAY1lK,KAAKpK,MAAM2G,KAAOyD,KAAKhD,MAAMi9C,QACzC0rH,EAAUD,EAAY1lK,KAAKhD,MAAMi9C,QACvCsrH,EAAmBlqK,EAAQ+T,MAAMs2J,EAAWC,GACvC3lK,KAAKhD,MAAMsM,UACRjO,EAAQqL,OAASi/J,IACjBP,EACI9nK,IAAAA,cAAA,UACIC,UAAU,8DACVqP,QAAS5M,KAAK29F,UAEdrgG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,WAM3B/G,KAAKpK,MAAM2G,KAAO,IAClB8oK,EACI/nK,IAAAA,cAAA,UACIC,UAAU,8DACVqP,QAAS5M,KAAKy3C,UAEdn6C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,eAMvC,MACIw+J,EAAmBlqK,EAGvB,IAAIuqK,EA0CA7f,EAcJ,MAtDsC,WAAlC/lJ,KAAKhD,MAAMs/C,mBACPt8C,KAAKpK,MAAM2uD,QACXqhH,EACItoK,IAAAA,cAACgmK,EAAe,CACZprH,IAAKl4C,KAAK4jK,QACVvoK,QAASkqK,EACT1rH,eAAgB75C,KAAKhD,MAAM68C,eAC3BuC,kBAAmBp8C,KAAKhD,MAAMo/C,kBAC9B7/C,KAAMyD,KAAKpK,MAAM2G,KACjB09C,QAASj6C,KAAKhD,MAAMi9C,QACpBmmG,aAAcpgJ,KAAKhD,MAAMk9C,iBACzBnC,MAAO/3C,KAAK+3C,MACZiZ,SAAUhxD,KAAKgxD,SACf1nD,QAAStJ,KAAKhD,MAAMsM,QACpBwE,MAAO9N,KAAKpK,MAAM2uD,MAClBpM,gBAAiBn4C,KAAKhD,MAAMm7C,gBAC5Bk1D,uBAAwBrtG,KAAKhD,MAAMqwG,6BAA0B/0G,KAKzEstK,EACItoK,IAAAA,cAACgmK,EAAe,CACZprH,IAAKl4C,KAAK4jK,QACVvoK,QAASkqK,EACT1rH,eAAgB75C,KAAKhD,MAAM68C,eAC3BuC,kBAAmBp8C,KAAKhD,MAAMo/C,kBAC9B7/C,KAAMyD,KAAKpK,MAAM2G,KACjB09C,QAASj6C,KAAKhD,MAAMi9C,QACpBmmG,aAAcpgJ,KAAKhD,MAAMk9C,iBACzBnC,MAAO/3C,KAAK+3C,MACZiZ,SAAUhxD,KAAKgxD,SACf1nD,QAAStJ,KAAKhD,MAAMsM,QACpBwE,MAAO9N,KAAKpK,MAAM2uD,MAClBpM,gBAAiBn4C,KAAKhD,MAAMm7C,gBAC5Bk1D,uBAAwBrtG,KAAKhD,MAAMqwG,6BAA0B/0G,IAMrEkI,GAASA,EAAMkG,QAAU45I,IACzByF,EACIzoJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,0DACfjB,OAAQ,CACJ+/J,cAAeN,EAAiB7+J,OAChC45I,WAAYtgJ,KAAKhD,MAAMsjJ,eAOnChjJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,OAAKC,UAAU,+BACXD,IAAAA,cAAA,OAAKC,UAAU,wCACXD,IAAAA,cAACoF,EAAAA,GAAW,CACRrO,GAAG,cACH6jD,IAAKl4C,KAAKskK,eACVriK,SAAS,EACT5G,QAAS2E,KAAKhD,MAAM3B,QACpBqE,OAAQA,EACR5C,WAAY,CACRoa,KAAM4uJ,EACNlzC,oBAAqBkzC,EACrB7mK,gBAAiBe,KAAKhD,MAAMu/C,eAAiBz/C,EAAAA,EAAWmC,gBAAkB8mK,EAAgB/lK,KAAKhD,MAAM+8C,eACrGisH,iBAAkBhmK,KAAKhD,MAAMu/C,eAAiBv8C,KAAKgmK,iBAAmBlpK,EAAAA,EAAWkpK,kBAErF5mK,aAAa,EACbC,iBAAiB,EACjB0rJ,YAAY,EACZC,cAAehrJ,KAAK4nG,QACpB3zB,UAAWj0E,KAAKimK,eAChBhmK,SAAUD,KAAKC,SACfa,MAAOd,KAAKhD,MAAM8I,OAClBogK,kBAAmBlmK,KAAKhD,MAAMu/C,eAAiBv8C,KAAKkmK,uBAAoB5tK,EACxEqJ,aAAawkK,EAAAA,EAAAA,IAAenmK,KAAKhD,MAAM6J,KAAKC,cAAe9G,KAAKhD,MAAMw9C,iBACtEiwG,WAAYzqJ,KAAKpK,MAAM2uD,MACvB6hH,eAAiB3iK,GAAkBA,EAAOpP,GAC1CgyK,eAAgBrmK,KAAKhD,MAAMo/C,kBAC3B,cAAY+pH,EAAAA,EAAAA,IAAenmK,KAAKhD,MAAM6J,KAAKC,cAAe9G,KAAKhD,MAAMw9C,iBACrEj9C,UAAWyC,KAAKpK,MAAMyuK,WAAa,wBAA0B,GAC7D/kK,gBAAgB,mCAEe,QAAlCU,KAAKhD,MAAMs/C,oBACRh/C,IAAAA,cAACgpK,EAAAA,EAAU,CACPjyK,GAAG,YACHoiD,OAAQz2C,KAAKhD,MAAMy5C,OACnB9xC,SAAU3E,KAAKhD,MAAMy5C,OACrB7pC,QAAS5M,KAAKumK,cACdx/J,eAAgB+xC,EAChB0tH,eAAerB,EAAAA,EAAAA,IAAkBnlK,KAAKhD,MAAM+7C,4BAIxDz7C,IAAAA,cAAA,OACIjJ,GAAG,4BACHkJ,UAAU,sBAETs7C,EACAktG,IAGR6f,EACDtoK,IAAAA,cAAA,OACIjJ,GAAG,yBACHkJ,UAAU,sBAET+nK,GAE8B,QAAlCtlK,KAAKhD,MAAMs/C,oBACRh/C,IAAAA,cAAA,OAAKC,UAAU,mBACV8nK,EACAD,IAIsB,WAAlCplK,KAAKhD,MAAMs/C,oBACRh/C,IAAAA,cAAA,OAAKC,UAAU,qCAEPyC,KAAKhD,MAAM0/C,iBACXp/C,IAAAA,cAAA,UACIsP,QAAUnQ,IACNA,EAAEyK,iBACElH,KAAKhD,MAAM0/C,iBACX18C,KAAKhD,MAAM0/C,iBACf,EAEJn/C,UAAWk3C,IAAW,mBAAoBz0C,KAAKhD,MAAM2/C,kBAEpDC,GAGTt/C,IAAAA,cAACgpK,EAAAA,EAAU,CACPjyK,GAAG,YACHoiD,OAAQz2C,KAAKhD,MAAMy5C,OACnB9xC,SAAU3E,KAAKhD,MAAMy5C,SAAWz2C,KAAKhD,MAAMy/C,cAC3C7vC,QAAS5M,KAAKumK,cACdx/J,eAAgB+xC,EAChB0tH,eAAerB,EAAAA,EAAAA,IAAkBnlK,KAAKhD,MAAM+7C,4BAMpE,EACHj5C,EA7dY85C,EAAW,eAKS,CACzBwC,kBAydR,SAAkC34C,GAC9B,OAAKA,EAGEA,EAAOvE,MAFH,IAGf,EA7dQo9C,mBAAoB,MACpBC,gBAAgB,EAChBC,aAAa,EACbC,eAAe,IA4dvB,MAAMqpH,EAAgBA,IAAM,KAEtBC,EAAmB3sD,GACbp8G,GAEAM,IAAAA,cAAA,OAAKC,UAAU,kCACXD,IAAAA,cAAC87G,EAAqBp8G,IAMhC0C,EAAS,CACXonG,UAAWA,KACA,CACHG,QAAS,OACTF,SAAU,SACVmL,KAAM,UAKlB,G,sJCtkBO,SAASu0D,EAAUzpK,GACtB,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,MACNC,OAAO,KACP6xC,QAAQ,aACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,iBAEvEzJ,IAAAA,cAAA,KAAGuiH,SAAS,2BACRviH,IAAAA,cAAA,QACI25B,EAAE,WACFsnB,EAAE,KACF5yC,MAAM,MACNC,OAAO,KACP4yC,GAAG,OACHd,KAAK,mBACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,SACFtrB,MAAM,KACNC,OAAO,KACP4yC,GAAG,OACHd,KAAK,mBACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,SACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,KACP4yC,GAAG,OACHd,KAAK,mBACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,qkBACFC,OAAO,8BACPC,cAAc,SAElB9gD,IAAAA,cAAA,QACI4gD,EAAE,gHACFC,OAAO,8BACPC,cAAc,SAElB9gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,IACHR,UAAU,6BACVN,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,MACHR,UAAU,6BACVG,OAAO,8BACPC,cAAc,QAElB9gD,IAAAA,cAAA,QACI4gD,EAAE,gZACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4YACFC,OAAO,8BACPC,cAAc,QAElB9gD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,wxBACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,4xBACFR,KAAK,8BACLO,YAAY,QAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,6YACFC,OAAO,8BACPC,cAAc,QAElB9gD,IAAAA,cAAA,UACIugD,GAAG,SACHC,GAAG,KACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,WAGtB/gD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,qBACTiJ,IAAAA,cAAA,QACIqO,MAAM,MACNC,OAAO,KACP8xC,KAAK,QACLM,UAAU,2BAOtC,CC5IO,SAAS0oH,EAAiB1pK,GAC7B,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,MACNC,OAAO,MACP6xC,QAAQ,cACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,yBAE/EzJ,IAAAA,cAAA,KAAGuiH,SAAS,0BACRviH,IAAAA,cAAA,QACIuhD,QAAQ,MACRX,EAAE,iOACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iOACFR,KAAK,mBACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,mCACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,kDACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,qCACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,MACHC,GAAG,MACHC,EAAE,MACFC,UAAU,kDACVN,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,UACIugD,GAAG,MACHC,GAAG,MACHC,EAAE,MACFC,UAAU,iDACVN,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,mOACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8NACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wOACFC,OAAO,8BACPC,cAAc,QAElB9gD,IAAAA,cAAA,UACIugD,GAAG,SACHC,GAAG,KACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,UACFC,UAAU,6BACVN,KAAK,6BAETpgD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,UACFC,UAAU,6BACVG,OAAO,8BACPC,cAAc,MACdK,YAAY,UACZJ,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,UACFC,UAAU,6BACVG,OAAO,8BACPC,cAAc,MACdK,YAAY,UACZJ,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,kDACFC,OAAO,8BACPC,cAAc,OACdK,YAAY,UACZJ,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACIqpK,GAAG,WACHC,GAAG,YACHC,GAAG,UACHC,GAAG,YACH9oH,UAAU,+DACVG,OAAO,8BACPC,cAAc,MACdK,YAAY,UACZJ,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,0BACFC,OAAO,8BACPE,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPE,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPE,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,OACHC,EAAE,MACFL,KAAK,8BACLO,YAAY,UAGpB3gD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,oBACTiJ,IAAAA,cAAA,QACIqO,MAAM,MACNC,OAAO,MACP8xC,KAAK,QACLM,UAAU,6BAOtC,CCtMO,SAAS+oH,EAAY/pK,GACxB,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,KACNC,OAAO,KACP6xC,QAAQ,YACRC,KAAK,OACLC,MAAM,6BACN,aAAY72C,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,kBAExEzJ,IAAAA,cAAA,QACI4gD,EAAE,+BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,aACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,aACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACIuhD,QAAQ,OACRX,EAAE,4LACFR,KAAK,qBAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,2BACPE,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,4LACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kNACFC,OAAO,8BACPC,cAAc,QAElB9gD,IAAAA,cAAA,UACIugD,GAAG,KACHC,GAAG,KACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,KACHC,GAAG,KACHC,EAAE,KACFL,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,qBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,eACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,eACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,KACHC,EAAE,IACFI,OAAO,wBAEX7gD,IAAAA,cAAA,QACI4gD,EAAE,0HACFC,OAAO,sBACPE,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,uKACFC,OAAO,sBACPE,cAAc,WAKlC,CC1IO,SAAS2oH,EAAiBhqK,GAC7B,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,KACNC,OAAO,KACP6xC,QAAQ,YACRC,KAAK,OACLtzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,eAErEzJ,IAAAA,cAAA,KAAGuiH,SAAS,0BACRviH,IAAAA,cAAA,QACI4gD,EAAE,oCACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,yBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,yBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACIuhD,QAAQ,OACRX,EAAE,kOACFR,KAAK,qBAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,2BACPE,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,sOACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gPACFC,OAAO,8BACPC,cAAc,QAElB9gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,KACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,sBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,sBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,sBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,sBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,sBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,sBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,KACHC,EAAE,KACFL,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+HACFC,OAAO,wBAEX7gD,IAAAA,cAAA,QACI4gD,EAAE,oCACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,yBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,yBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,WAGvBhhD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,oBACTiJ,IAAAA,cAAA,QACIqO,MAAM,KACNC,OAAO,KACP8xC,KAAK,QACLM,UAAU,6BAOtC,CC1IO,SAASipH,EAAOjqK,GACnB,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WAExB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,KACNC,OAAO,KACP6xC,QAAQ,YACRwB,QAAQ,MACR70C,KAAK,MAGLuzC,MAAM,6BACN,aAAY72C,EAAc,CAACzS,GAAI,oBAAqB0S,eAAgB,cAGpEzJ,IAAAA,cAAA,KAAGuiH,SAAS,0BACRviH,IAAAA,cAAA,QACI4gD,EAAE,mCACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,yBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,yBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACIuhD,QAAQ,OACRX,EAAE,4NACFR,KAAK,qBAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,2BACPE,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,8NACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wOACFC,OAAO,8BACPC,cAAc,QAElB9gD,IAAAA,cAAA,UACIugD,GAAG,SACHC,GAAG,KACHC,EAAE,IACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,UACIugD,GAAG,SACHC,GAAG,KACHC,EAAE,KACFL,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wBACFC,OAAO,sBACPE,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,yIACFC,OAAO,sBACPE,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,yBACFC,OAAO,sBACPE,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,iCACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,uBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,uBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,WAGvBhhD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,oBACTiJ,IAAAA,cAAA,QACIqO,MAAM,KACNC,OAAO,KACP8xC,KAAK,QACLM,UAAU,6BAOtC,CC1JO,SAASkpH,EAAgBlqK,GAC5B,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,MACNC,OAAO,MACP6xC,QAAQ,cACRC,KAAK,OACLtzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,wBAE9EzJ,IAAAA,cAAA,QACI25B,EAAE,IACFsnB,EAAE,KACF5yC,MAAM,MACNC,OAAO,KACP4yC,GAAG,IACHd,KAAK,6BAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,IACFsnB,EAAE,KACF5yC,MAAM,MACNC,OAAO,KACP4yC,GAAG,IACHd,KAAK,qBAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,2BACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI25B,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,KACP4yC,GAAG,IACHd,KAAK,YAETpgD,IAAAA,cAAA,QACI25B,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,UACNC,OAAO,KACP4yC,GAAG,IACHd,KAAK,6BAETpgD,IAAAA,cAAA,QACI25B,EAAE,OACFsnB,EAAE,OACF5yC,MAAM,UACNC,OAAO,KACP4yC,GAAG,MACHL,OAAO,8BACPC,cAAc,QAElB9gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,OACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI25B,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,KACP4yC,GAAG,IACHd,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,KAAGuiH,SAAS,0BACRviH,IAAAA,cAAA,QACI4gD,EAAE,gPACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gOACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,yFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6MACFR,KAAK,8BAGbpgD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,UACFC,UAAU,6BACVN,KAAK,6BAETpgD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,UACFC,UAAU,6BACVG,OAAO,8BACPC,cAAc,MACdK,YAAY,UACZJ,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,UACIugD,GAAG,UACHC,GAAG,UACHC,EAAE,UACFC,UAAU,6BACVG,OAAO,8BACPC,cAAc,MACdK,YAAY,UACZJ,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,qCACFC,OAAO,8BACPC,cAAc,OACdK,YAAY,UACZJ,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACIqpK,GAAG,WACHC,GAAG,YACHC,GAAG,UACHC,GAAG,YACH9oH,UAAU,+DACVG,OAAO,8BACPC,cAAc,MACdK,YAAY,UACZJ,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,UACIugD,GAAG,OACHC,GAAG,OACHC,EAAE,MACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,UACIugD,GAAG,MACHC,GAAG,MACHC,EAAE,MACFC,UAAU,yBACVN,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,oBACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,QACdC,eAAe,UAEnBhhD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,UAElB/gD,IAAAA,cAAA,QACI4gD,EAAE,YACFC,OAAO,8BACPC,cAAc,MACdC,cAAc,UAElB/gD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,oBACTiJ,IAAAA,cAAA,QACIqO,MAAM,KACNC,OAAO,KACP8xC,KAAK,2BACLM,UAAU,wBAQtC,CC3PO,SAASmpH,EAAcnqK,GAC1B,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,MACNC,OAAO,KACP6xC,QAAQ,aACRC,KAAK,OACLtzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,sBAE5EzJ,IAAAA,cAAA,KAAGuiH,SAAS,2BACRviH,IAAAA,cAAA,QACI4gD,EAAE,+OACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+OACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,oBACH,YAAU,YACVsqD,UAAU,iBACV1nB,EAAE,KACFsnB,EAAE,IACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,+OACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,2BACJthD,IAAAA,cAAA,QACI4gD,EAAE,4JACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0LACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACRX,EAAE,0LACFR,KAAK,qBAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wGACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wGACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,4eACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4eACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,4iBACFR,KAAK,aAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,+NACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+NACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,oBACH,YAAU,YACVsqD,UAAU,iBACV1nB,EAAE,IACFsnB,EAAE,IACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,+NACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,2BACJthD,IAAAA,cAAA,QACI4gD,EAAE,2LACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACRX,EAAE,0LACFR,KAAK,qBAETpgD,IAAAA,cAAA,QACI4gD,EAAE,uGACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,uGACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,mdACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mdACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,skBACFR,KAAK,aAGbpgD,IAAAA,cAAA,UACIugD,GAAG,SACHC,GAAG,OACHC,EAAE,OACFL,KAAK,6BAETpgD,IAAAA,cAAA,UACIugD,GAAG,OACHC,GAAG,OACHC,EAAE,OACFL,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,oBACH,YAAU,YACVsqD,UAAU,iBACV1nB,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,wNACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,2BACJthD,IAAAA,cAAA,QACI4gD,EAAE,6LACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6LACFR,KAAK,8BACLO,YAAY,QAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,4DACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4DACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,odACFR,KAAK,6BAETpgD,IAAAA,cAAA,QACI4gD,EAAE,odACFR,KAAK,8BACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,8dACFR,KAAK,aAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,4UACFC,OAAO,8BACPC,cAAc,SAElB9gD,IAAAA,cAAA,QACI4gD,EAAE,8UACFC,OAAO,8BACPC,cAAc,SAElB9gD,IAAAA,cAAA,QACI4gD,EAAE,iRACFC,OAAO,8BACPC,cAAc,UAGtB9gD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,qBACTiJ,IAAAA,cAAA,QACIqO,MAAM,MACNC,OAAO,KACP8xC,KAAK,2BACLM,UAAU,2BAOtC,C,eCrMA,MAAMopH,EAAyD,CAC3D,CAAC9mE,EAAAA,EAAiBwmC,QAASxpI,IAAAA,cAACmpK,EAAS,CAAClpK,UAAU,qBAChD,CAAC+iG,EAAAA,EAAiBC,eAAgBjjG,IAAAA,cAACopK,EAAgB,CAACnpK,UAAU,qBAC9D,CAAC+iG,EAAAA,EAAiB+mE,OAAQ/pK,IAAAA,cAAC4pK,EAAe,CAAC3pK,UAAU,qBACrD,CAAC+iG,EAAAA,EAAiBgnE,UAAWhqK,IAAAA,cAACypK,EAAW,CAACxpK,UAAU,qBACpD,CAAC+iG,EAAAA,EAAiBinE,cAAejqK,IAAAA,cAAC0pK,EAAgB,CAACzpK,UAAU,qBAC7D,CAAC+iG,EAAAA,EAAiBknE,aAAclqK,IAAAA,cAAC2pK,EAAM,CAAC1pK,UAAU,qBAClD,CAAC+iG,EAAAA,EAAiBmnE,cAAenqK,IAAAA,cAAC4pK,EAAe,CAAC3pK,UAAU,qBAC5D,CAAC+iG,EAAAA,EAAiBonE,sBAAuBpqK,IAAAA,cAAC4pK,EAAe,CAAC3pK,UAAU,qBACpE,CAAC+iG,EAAAA,EAAiBqnE,YAAarqK,IAAAA,cAAC6pK,EAAa,CAAC5pK,UAAU,qBACxD,CAAC+iG,EAAAA,EAAiBsnE,kBAAmBtqK,IAAAA,cAAC6pK,EAAa,CAAC5pK,UAAU,qBAC9D,CAAC+iG,EAAAA,EAAiBunE,oBAAqBvqK,IAAAA,cAAC6pK,EAAa,CAAC5pK,UAAU,sBAG9DuqK,GAAWtzG,EAAAA,EAAAA,gBAAe,CAC5B,CAAC8rC,EAAAA,EAAiBwmC,QAAS,CACvBzyI,GAAI,0BACJ0S,eAAgB,kCAEpB,CAACu5F,EAAAA,EAAiB+mE,OAAQ,CACtBhzK,GAAI,yBACJ0S,eAAgB,sCAEpB,CAACu5F,EAAAA,EAAiBC,eAAgB,CAC9BlsG,GAAI,kCACJ0S,eAAgB,kCAEpB,CAACu5F,EAAAA,EAAiBgnE,UAAW,CACzBjzK,GAAI,4BACJ0S,eAAgB,mBAEpB,CAACu5F,EAAAA,EAAiBinE,cAAe,CAC7BlzK,GAAI,iCACJ0S,eAAgB,yBAEpB,CAACu5F,EAAAA,EAAiBknE,aAAc,CAC5BnzK,GAAI,mCACJ0S,eAAgB,0BAEpB,CAACu5F,EAAAA,EAAiBmnE,cAAe,CAC7BpzK,GAAI,iCACJ0S,eAAgB,gBAEpB,CAACu5F,EAAAA,EAAiBonE,sBAAuB,CACrCrzK,GAAI,0CACJ0S,eAAgB,kBAEpB,CAACu5F,EAAAA,EAAiBqnE,YAAa,CAC3BtzK,GAAI,+BACJ0S,eAAgB,iBAEpB,CAACu5F,EAAAA,EAAiBsnE,kBAAmB,CACjCvzK,GAAI,sCACJ0S,eAAgB,kBAEpB,CAACu5F,EAAAA,EAAiBunE,oBAAqB,CACnCxzK,GAAI,wCACJ0S,eAAgB,wBAIlBghK,GAAcvzG,EAAAA,EAAAA,gBAAe,CAC/B,CAAC8rC,EAAAA,EAAiBwmC,QAAS,CACvBzyI,GAAI,6BACJ0S,eAAgB,6CAEpB,CAACu5F,EAAAA,EAAiB+mE,OAAQ,CACtBhzK,GAAI,4BACJ0S,eAAgB,6CAEpB,CAACu5F,EAAAA,EAAiBC,eAAgB,CAC9BlsG,GAAI,qCACJ0S,eAAgB,6CAEpB,CAACu5F,EAAAA,EAAiBgnE,UAAW,CACzBjzK,GAAI,+BACJ0S,eAAgB,sFAEpB,CAACu5F,EAAAA,EAAiBinE,cAAe,CAC7BlzK,GAAI,oCACJ0S,eAAgB,mIAEpB,CAACu5F,EAAAA,EAAiBknE,aAAc,CAC5BnzK,GAAI,sCACJ0S,eAAgB,iJAEpB,CAACu5F,EAAAA,EAAiBmnE,cAAe,CAC7BpzK,GAAI,oCACJ0S,eAAgB,gDAEpB,CAACu5F,EAAAA,EAAiBonE,sBAAuB,CACrCrzK,GAAI,6CACJ0S,eAAgB,yEAEpB,CAACu5F,EAAAA,EAAiBqnE,YAAa,CAC3BtzK,GAAI,kCACJ0S,eAAgB,sFAEpB,CAACu5F,EAAAA,EAAiBsnE,kBAAmB,CACjCvzK,GAAI,yCACJ0S,eAAgB,iEAEpB,CAACu5F,EAAAA,EAAiBunE,oBAAqB,CACnCxzK,GAAI,2CACJ0S,eAAgB,8EAoExB,EAhE2BtR,IA0Bd,IA1Be,SACxBuyK,EAAQ,MACRt9J,EAAK,QACLi6E,EAAO,YACPsjF,GAActjF,EACVrnF,IAAAA,cAAA,OAAKC,UAAU,+BACV6pK,EAAQziF,IAEb,MAAI,YACR6b,EAAW,MACXh1F,GAAQm5E,EACJrnF,IAAAA,cAACgK,EAAAA,iBAAgB5J,OAAAC,OAAA,GACTmqK,EAASnjF,GAAQ,CACrB7+E,OAAQ06F,KAEZ,MAAI,eACR0nE,EAAc,SACdC,GAAWxjF,EACPrnF,IAAAA,cAACgK,EAAAA,iBAAgB5J,OAAAC,OAAA,GACToqK,EAAYpjF,GAAQ,CACxB7+E,OAAQoiK,KAEZ,MAAI,OACRxoC,EAAS0oC,EAAAA,EAAgBC,SAAQ,eACjCC,EAAc,kBACdC,GACI9yK,EACAikG,EACAp8F,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,sBAAuB,CAAC,oBAAqBirF,IAAW0oC,EAAAA,EAAgBI,aAC9F99J,MAAOA,GAENu9J,EAED3qK,IAAAA,cAAA,OACIC,UAAU,8BAETiO,GACGlO,IAAAA,cAAA,MAAIC,UAAWk3C,IAAW,oBAAqB,CAAC,cAAe0zH,GAAWG,IACrE98J,GAIR28J,GACG7qK,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,uBAAwB8zH,IAC9CJ,KAgBrB,OARIH,IACAtuE,EACIp8F,IAAAA,cAAA,OAAKC,UAAU,sBACVm8F,IAKNA,CAAO,C,2CCjMX,IAAK4G,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,gBAAhBA,EAAgB,cAAhBA,EAAgB,8BAAhBA,EAAgB,oBAAhBA,EAAgB,4BAAhBA,EAAgB,0BAAhBA,EAAgB,4BAAhBA,EAAgB,4CAAhBA,EAAgB,wBAAhBA,EAAgB,oCAAhBA,EAAgB,wCAAhBA,CAAgB,MAchB8nE,EAAe,SAAfA,GAAe,OAAfA,EAAAA,EAAe,uBAAfA,EAAAA,EAAe,2BAAfA,CAAe,K,qJCL3B,MAAMK,EAAOtpH,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,QAAXq7C,CAAW,gGAQlBupH,EAASvpH,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,UAAbq7C,CAAa,gFAGdniD,GAAgBA,EAAM2rK,SAAW,6BAA+B,2BAkBvE,SAASC,EAA0D5rK,EAAkB6rK,GACxF,MAAOn6E,QAASo6E,EAAY,YAAEpsD,EAAW,aAAEF,IAAgBD,EAAAA,EAAAA,GAAkB,CAAC,IACxE,cAACz1G,IAAiBgQ,EAAAA,EAAAA,WA8BxB,MAAO,CA5BUna,KACb,OAAQA,GACR,KAAKs/G,EAAAA,EAAaE,QAClB,KAAKF,EAAAA,EAAaG,QACd,OAAOp/G,EAAM+rK,aAAejiK,EAAcgiK,EAAa7sD,EAAAA,EAAaG,UACxE,KAAKH,EAAAA,EAAaK,gBAClB,KAAKL,EAAAA,EAAaI,OACd,OAAOv1G,EAAcgiK,EAAansK,IACtC,QACI,OAAOK,EAAMorF,SAAWthF,EAAcgiK,EAAa7sD,EAAAA,EAAaC,aACpE,EAkBIxtB,CAAQ8tB,GAfG3oH,MAAO4I,EAAoCyhH,KAC1DzhH,EAAEyK,iBACFzK,EAAEy0D,kBACFwrD,EAAY,CACRE,aAAc,CACVlvF,SAAU,UACVvY,MAAO,yBACPnY,MAAO,CACHkhH,eAGRvB,YAAaksD,GACf,EAGqCrsD,EAC/C,CAEA,SAASwsD,EAAehsK,GACpB,MAAO0xF,EAASu6E,EAAQtsK,GAAUisK,EAAe5rK,EAAOA,EAAMksK,oBACxD,cAACpiK,IAAiBgQ,EAAAA,EAAAA,WACxB,IAAItL,EAAQ1E,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,sBAK9E,OAJI/J,EAAMmsK,WACN39J,EAAQ1E,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,mBAItEzJ,IAAAA,cAAAA,IAAAA,SAAA,KACKN,EAAMorF,QACH9qF,IAAAA,cAAA,YACIA,IAAAA,cAACorK,EAAM,CACHr0K,GAAG,mBACHuY,QAAUnQ,GAAMwsK,EAAOxsK,EAAGO,EAAMkhH,YAChCv5G,SAAUhI,IAAWs/G,EAAAA,EAAaK,gBAClCqsD,SAAUhsK,IAAWs/G,EAAAA,EAAaG,SAEjC1tB,IAITpxF,IAAAA,cAACmrK,EAAI,CAACp0K,GAAG,wBACJmX,EACDlO,IAAAA,cAACorK,EAAM,CACHr0K,GAAG,mBACHuY,QAAUnQ,GAAMwsK,EAAOxsK,EAAGO,EAAMkhH,YAChCv5G,SAAUhI,IAAWs/G,EAAAA,EAAaK,gBAClCqsD,SAAUhsK,IAAWs/G,EAAAA,EAAaG,SAEjC1tB,IAMzB,CAACs6E,EAAArjK,UAAA,CAnFGyiF,QAAOhlF,IAAAA,KACP2lK,YAAW3lK,IAAAA,KACX+lK,SAAQ/lK,IAAAA,KAIR86G,WAAU96G,IAAAA,OAAAC,YA+Ed,S,uEC/GA,MAEa+lK,EAAyB,uBAGzBC,EAAsB,CAC/BC,cAAe,gBACfC,cAAe,gBACfC,aAAc,eACdC,sBAAuB,wBACvBC,qBAAsB,uBACtBC,YAAa,eAGJC,EAAqB,CAC9BC,0BAA2B,4BAC3BC,0BAA2B,4BAC3BC,2BAA4B,6BAC5BC,8BAA+B,iCAGtBC,EAAmB,CAC5BC,MAAO,EACPrkJ,QAAS,EACTskJ,SAxBa,KA2BJC,EAAqB,CAC9B,CAACf,EAAoBC,eAAgBW,EACrC,CAACZ,EAAoBI,uBAAwBQ,EAC7C,CAACZ,EAAoBG,cAAeS,EACpC,CAACZ,EAAoBK,sBAAuBO,EAC5C,CAACZ,EAAoBE,eAAgBU,EACrC,CAACZ,EAAoBM,aAAcM,E,+OC3BhC,SAASI,EAAoCz0K,GAChD,OAAOA,EAAM8kD,MAAM4vH,gBAAgBD,mCACvC,CAEO,SAASE,EAAiC30K,GAC7C,OAAOA,EAAM8kD,MAAM4vH,gBAAgBC,gCACvC,CCAA,MAAMC,EAAY,CAACvzI,EAAG,EAAGsnB,GAAI,GAEhBksH,EAAyBA,KAClC,MAAM92K,GAAWsxD,EAAAA,EAAAA,eACXylH,GAAaC,EAAAA,EAAAA,MACbC,EAAWvB,EAAAA,EAAoBK,qBAC/BzwE,EAAQmxE,EAAAA,GAAmBQ,GAC3BpnE,GAASnvD,EAAAA,EAAAA,aAAYk2H,IAE3B7nH,EAAAA,EAAAA,YAAU,IACC,KACH/uD,GAASk/B,EAAAA,EAAAA,KAAkC,GAAO,GAEvD,IAEH,MAAMrnB,EACFlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAgB,6BAGlB6+D,EACFtoE,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gDACH0S,eAAgB,mFAKtB8jK,GAAkBC,EAAAA,EAAAA,IAAoB,CAAC,kCAAmC,IAQhF,OACIxtK,IAAAA,cAACytK,EAAAA,GAAO,CACJ5hK,KAAMq6F,EACNh4F,MAAOA,EACPo6D,OAAQA,EACRilG,gBAAiBA,EACjBG,KAAM/xE,EAAMpzE,QACZilC,UAAU,aACVmgH,sBAAsB,QACtBC,sBAAuBV,EACvBj7E,cAhBW9yF,IACfA,EAAEy0D,kBACFz0D,EAAEyK,iBACFwjK,EAAWE,EAAU3xE,EAAMixE,OAAO,EAAM,UAAU,EAc9CiB,WAAW,EACXC,YAAY,EACZC,qBAAqB,GACvB,ECpDJb,EAAY,CAACvzI,EAAG,EAAGsnB,GAAI,GAEhB+sH,EAA0BA,KACnC,MAAM33K,GAAWsxD,EAAAA,EAAAA,eACXylH,GAAaC,EAAAA,EAAAA,MACbC,EAAWvB,EAAAA,EAAoBI,sBAC/BxwE,EAAQmxE,EAAAA,GAAmBQ,GAC3BpnE,GAASnvD,EAAAA,EAAAA,aAAYg2H,IAE3B3nH,EAAAA,EAAAA,YAAU,IACC,KACH/uD,GAASg/B,EAAAA,EAAAA,KAAqC,GAAO,GAE1D,IAEH,MAAMnnB,EACFlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+CACH0S,eAAgB,sBAGlB6+D,EACFtoE,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qDACH0S,eAAgB,8EAKtB8jK,GAAkBC,EAAAA,EAAAA,IAAoB,CAAC,8BAA+B,GAAI,CAACvsH,GAAI,EAAG3yC,OAAQ,EAAGqrB,EAAG,EAAGtrB,MAAO,IAOhH,OACIrO,IAAAA,cAACytK,EAAAA,GAAO,CACJ5hK,KAAMq6F,EACNh4F,MAAOA,EACPo6D,OAAQA,EACRilG,gBAAiBA,EACjBG,KAAM/xE,EAAMpzE,QACZilC,UAAU,aACVmgH,sBAAsB,OACtBC,sBAAuBV,EACvBj7E,cAhBW9yF,IACfA,EAAEy0D,kBACFz0D,EAAEyK,iBACFwjK,EAAWE,EAAU3xE,EAAMixE,OAAO,EAAM,UAAU,EAc9CiB,WAAW,EACXC,YAAY,EACZC,qBAAqB,GACvB,E,0PCxDV,QAAgBruK,GACZM,IAAAA,cAAA,OACIqO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,MACjDo8C,KAAK,2BACLD,QAAQ,cACRE,MAAM,8BAENrgD,IAAAA,cAAA,KAAGuiH,SAAS,yBACRviH,IAAAA,cAAA,QACI4gD,EAAE,20BACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,00BACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gfACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0eACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+eACFR,KAAK,WAGbpgD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,mBACTiJ,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,UACP8xC,KAAK,QACLM,UAAU,kC,wBCpC9B,MAAMutH,EAAgBvuK,GAClBM,IAAAA,cAAA,OACIqO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,MACjDo8C,KAAK,2BACLD,QAAQ,cACRE,MAAM,8BAENrgD,IAAAA,cAAA,KAAGuiH,SAAS,qBACRviH,IAAAA,cAAA,QACI4gD,EAAE,ooBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gpBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yoBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,woBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,w9BACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yjCACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4qCACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yoBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,soBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,yoBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,ipBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gkCACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,y9BACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,u9BACFR,KAAK,aAGbpgD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,eACTiJ,IAAAA,cAAA,QACIqO,MAAO,IACPC,OAAQ,IACR8xC,KAAK,2BACLM,UAAU,wBAK5ButH,EAAA5lK,UAAA,CAjHEgG,MAAKvI,IAAAA,OACLwI,OAAMxI,IAAAA,QAkHV,UC/GMmoK,EAAgBvuK,GAClBM,IAAAA,cAAA,OACIqO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,MACjDo8C,KAAK,2BACLD,QAAQ,cACRE,MAAM,8BAENrgD,IAAAA,cAAA,KAAGuiH,SAAS,qBACRviH,IAAAA,cAAA,QACI4gD,EAAE,4vBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kbACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oSACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6aACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kSACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6TACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mXACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mTACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,qyCACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gLACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0IACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2KACFR,KAAK,aAGbpgD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,eACTiJ,IAAAA,cAAA,QACIqO,MAAO,IACPC,OAAQ,IACR8xC,KAAK,aAKvB6tH,EAAA5lK,UAAA,CAxEEgG,MAAKvI,IAAAA,OACLwI,OAAMxI,IAAAA,QAyEV,UCtEMmoK,EAAgBvuK,GAClBM,IAAAA,cAAA,OACIqO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,MACjDo8C,KAAK,2BACLD,QAAQ,cACRE,MAAM,8BAENrgD,IAAAA,cAAA,QACI25B,EAAG,IACHsnB,EAAG,IACH5yC,MAAO,GACPC,OAAQ,EACR4yC,GAAI,EACJd,KAAK,YAETpgD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,yjBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6LACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wKACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0BACFR,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAS,IACTX,EAAE,0BACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+OACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oOACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oOACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oOACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iOACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gPACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6OACFR,KAAK,aAGf6tH,EAAA5lK,UAAA,CAxHEgG,MAAKvI,IAAAA,OACLwI,OAAMxI,IAAAA,QAyHV,UCtHMmoK,EAAgBvuK,GAClBM,IAAAA,cAAA,OACIqO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,MACjDo8C,KAAK,2BACLD,QAAQ,cACRE,MAAM,8BAENrgD,IAAAA,cAAA,QACI4gD,EAAE,yrBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,waACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,waACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0MACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oIACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iIACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iMACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mGACFR,KAAK,aAGf6tH,EAAA5lK,UAAA,CA7CEgG,MAAKvI,IAAAA,OACLwI,OAAMxI,IAAAA,QA8CV,UC3CMmoK,EAAgBvuK,GAClBM,IAAAA,cAAA,OACIqO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,MACjDo8C,KAAK,2BACLD,QAAQ,cACRE,MAAM,8BAENrgD,IAAAA,cAAA,QACI4gD,EAAE,iXACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6hBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gYACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,igBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gQACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,00CACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,uxCACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,grBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2kBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6eACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,uqBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gQACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mZACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iZACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4YACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+bACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kbACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gTACFR,KAAK,aAGf6tH,EAAA5lK,UAAA,CArFEgG,MAAKvI,IAAAA,OACLwI,OAAMxI,IAAAA,QAsFV,U,gICxEA,MAAMooK,EAA0B/1K,IAWQ,IAVpC,GACIpB,EAAE,MACFmX,EAAK,YACLhO,EAAW,oBACXg7F,EAAmB,WACnBC,EAAU,kBACVgzE,EAAiB,QACjB9yE,EAAO,YACPD,EAAW,cACXjB,GAC2BhiG,EAC/B,OACI6H,IAAAA,cAAA,OACIjJ,GAAE,2BAAA4J,OAA6B5J,GAC/BkJ,UAAU,2CAEVD,IAAAA,cAAA,OAAKC,UAAS,GAAAU,OAAKu6F,EAAmB,iBACjCC,GAELn7F,IAAAA,cAAA,OAAKC,UAAU,SACViO,GAELlO,IAAAA,cAAA,OAAKC,UAAU,eACVC,GAEHm7F,GAAWD,GACTp7F,IAAAA,cAACouK,EAAAA,EAA0B,CACvBr3K,GAAIA,EACJ2jG,MAAOW,EACPj8F,QAASg8F,EACT9rF,QAAS6qF,EACTQ,WAAW,EACXC,YAAa,2BAGpBuzE,GACGnuK,IAAAA,cAAA,OAAKC,UAAU,4BACVkuK,GAGP,EAEZD,EAAA7lK,UAAA,CAtDEtR,GAAE+O,IAAAA,OAAAC,WACFmI,MAAKpI,IAAAA,OAAAC,WACL7F,YAAW4F,IAAAA,OAAAC,WACXm1F,oBAAmBp1F,IAAAA,OAAAC,WACnBo1F,WAAUr1F,IAAAA,KAAAC,WACVooK,kBAAiBroK,IAAAA,OACjBu1F,QAAOv1F,IAAAA,OACPs1F,YAAWt1F,IAAAA,OACXq0F,cAAar0F,IAAAA,MAgDjB,U,8BClCMuoK,EAAsBl2K,IAKS,IAJjC,QACIqmF,EAAO,SACP5xE,EAAQ,WACR0hK,EAAa,IACTn2K,EACR,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,YACjB+0J,EAAWC,IAAgBj1J,EAAAA,EAAAA,WAAS,GACrCljB,GAAWsxD,EAAAA,EAAAA,eAGXz6B,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtBkhE,EAA6B,UAAnBnhE,aAAO,EAAPA,EAASwU,OAEnB8gH,GAAqB/oI,EAAAA,EAAAA,cAAY,KACnC+0J,GAAa,EAAK,GACnB,IAGGC,GAAgBh1J,EAAAA,EAAAA,cAAY,KAC9BpjB,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiB27J,wBAAwB,GAC9D,IAEGC,EACF3uK,IAAAA,cAACmiJ,EAAAA,EAAa,CACVK,mBAAoBA,EACpB5nD,YAAW,kCAAAj6F,OAAoC2tK,GAC/Ch/J,QAASm/J,IAIXt0E,GAAgB1gF,EAAAA,EAAAA,cAAY,KAC1B+kE,GACAA,IAGJ5xE,GAAU,GACX,CAAC4xE,EAAS5xE,KAEbw4C,EAAAA,EAAAA,YAAU,MACN7mD,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqB6gF,8BACrB,8BACH,GACF,IAEH,MAAMxzE,EAAc5xF,EAAc,CAACzS,GAAI,oDAAqD0S,eAAgB,mCAEtGkyF,GAAwChiF,EAAAA,EAAAA,UAAQ,IAAM,CACxD,CACI5iB,GAAI,SACJmX,MAAO1E,EAAc,CAACzS,GAAI,2CAA4C0S,eAAgB,8CACtFvJ,YAAasJ,EAAc,CAACzS,GAAI,iDAAkD0S,eAAgB,oGAClGyxF,oBAAqB,iBACrBC,WACIn7F,IAAAA,cAAC47F,EAAAA,EAAc,CACXvtF,MAAO,IACPC,OAAQ,MAGhB+sF,QAASQ,EAAAA,GAASC,WAClBV,eAEJ,CACIrkG,GAAI,OACJmX,MAAO1E,EAAc,CAACzS,GAAI,yCAA0C0S,eAAgB,kDACpFvJ,YAAasJ,EAAc,CAACzS,GAAI,+CAAgD0S,eAAgB,2IAChGyxF,oBAAqB,eACrBC,WACIn7F,IAAAA,cAAC+7F,EAAAA,EAAkB,CACf1tF,MAAO,IACPC,OAAQ,MAGhB+sF,QAASQ,EAAAA,GAASgzE,WAClBzzE,eAEJ,CACIrkG,GAAI,gBACJmX,MAAO1E,EAAc,CAACzS,GAAI,kDAAmD0S,eAAgB,oDAC7FvJ,YAAasJ,EAAc,CAACzS,GAAI,wDAAyD0S,eAAgB,4HACzGyxF,oBAAqB,eACrBC,WACIn7F,IAAAA,cAACkgD,EAAAA,EAAc,CACX7xC,MAAO,IACPC,OAAQ,MAGhB+sF,QAASzC,EAAAA,GAAaqD,QACtBb,iBAEL,IAEG0zE,GAA6Br1J,EAAAA,EAAAA,cAAasgG,IAAuB,IAAAg1D,EACnE,MAAMC,EAA+B,QAAxBD,EAAGpzE,EAAMoe,EAAa,UAAE,IAAAg1D,OAAA,EAArBA,EAAuBh4K,GAEnCi4K,IACAzwK,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqB6gF,8BACrB,sCAAwCI,EAEhD,GACD,CAACrzE,IAEEszE,GAAYt1J,EAAAA,EAAAA,UACd,IACIgiF,EAAMt4F,KAAIzF,IAAA,IAAC,GAAC7G,GAAY6G,EAALy+F,E,qWAAIx8C,CAAAjiD,EAAAkiD,GAAA,OACnB9/C,IAAAA,cAACkuK,EAAuB9tK,OAAAC,OAAA,GAChBg8F,EAAI,CACRtlG,GAAIA,EACJ2G,IAAK3G,IACP,KAEV,IAGEmlG,EAAa1yF,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,gCAEzF,OAAI4kF,EAEO,KAIPruF,IAAAA,cAACo8E,EAAAA,GAAY,CACTG,eAAe,EACft8E,UAAU,sBACVlJ,GAAG,sBACH6V,SAAUutF,EACVzd,gBAAiBwf,GAEjBl8F,IAAAA,cAACq5G,EAAAA,EAAQ,CACLC,WAAY21D,EACZl4K,GAAI,8BACJwiH,eAAe,EACfC,iBAAkBs1D,EAClBr1D,iBAAkBq1D,EAClBp1D,kBAAmB60D,EACnB50D,UAAWC,EAAAA,EAASc,QACpBZ,aAAc60D,IAEP,EAErBN,EAAAhmK,UAAA,CApJEm2E,QAAO14E,IAAAA,KACP8G,SAAQ9G,IAAAA,KAAAC,WACRuoK,WAAUxoK,IAAAA,QAoJd,U,4pBCjIA,MAgGaopK,EAAyBA,KAClC,MAAMC,GAAWp4H,EAAAA,EAAAA,aAAYq4H,EAAAA,IACvBC,EA1CkBC,MACxB,MAAM31E,GAAmB5iD,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAASwrE,MAAMsD,mBAC5EzsE,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtB2sE,EAAiBH,aAAgB,EAAhBA,EAAkBtsE,WACnC0sE,EAAoB7sE,aAAO,EAAPA,EAASG,WAC7B0rE,GAAchiD,EAAAA,EAAAA,cAAaz+C,IAAuB4qC,EAAAA,EAAAA,IAAyB5qC,KAC3Ei3K,GAAcx4H,EAAAA,EAAAA,cAAaz+C,IAAuBqsE,EAAAA,EAAAA,IAAuBrsE,KACzE+qB,GAAmB0zB,EAAAA,EAAAA,aAAYzzB,EAAAA,IAG/BzN,GAAekhC,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAASmsB,MAAMnhC,eACxEw4E,EAA6B,UAAnBnhE,aAAO,EAAPA,EAASwU,OACnBysD,EAA8C,UAAhCt4E,aAAY,EAAZA,EAAc+5E,eAC5B4/E,EAAoD,WAAhC35J,aAAY,EAAZA,EAAc+5E,iBAA6B/5E,aAAY,EAAZA,EAAcu5E,cAAe,EAO5FqgF,EAHiD,UAAtB11E,GAAoD,UAAnBD,GACtCzL,IAAYF,IAAgBqhF,EAIlD/5D,E,+VAA4B3+G,CAAA,GAAOi1K,EAAAA,GAezC,OAdK0D,UACMh6D,EAAK42D,YAGXhpJ,GAAqB01E,WACf0c,EAAK22D,4BACL32D,EAAK42D,aAIZkD,UACO95D,EAAKw2D,cAGT7rK,OAAOoI,OAAOitG,EAAK,EAKR65D,GACZI,EAnGgBC,MACtB,MAAM,cAACnmK,IAAiBgQ,EAAAA,EAAAA,WACxB,MAAO,CACH,CAACuyJ,EAAAA,EAAoBC,eAAgB,CACjCj1K,GAAI,kCACJ64K,IAAKC,EACLzwK,QAASoK,EAAc,CACnBzS,GAAI,2DACJ0S,eAAgB,8BAGxB,CAACsiK,EAAAA,EAAoBE,eAAgB,CACjCl1K,GAAI,2BACJ64K,IAAKE,EACL1wK,QAASoK,EAAc,CACnBzS,GAAI,oDACJ0S,eAAgB,2CAGxB,CAACsiK,EAAAA,EAAoBI,uBAAwB,CACzCp1K,GAAI,6BACJ64K,IAAKG,EACL3wK,QAASoK,EAAc,CACnBzS,GAAI,sDACJ0S,eAAgB,4BAIxB,CAACsiK,EAAAA,EAAoBG,cAAe,CAChCn1K,GAAI,wBACJ64K,IAAKI,EACL5wK,QAASoK,EAAc,CACnBzS,GAAI,iDACJ0S,eAAgB,2CAIxB,CAACsiK,EAAAA,EAAoBK,sBAAuB,CACxCr1K,GAAI,4BACJ64K,IAAKK,EACL7wK,QAASoK,EAAc,CACnBzS,GAAI,qDACJ0S,eAAgB,2DAGxB,CAACsiK,EAAAA,EAAoBM,aAAc,CAC/Bt1K,GAAI,8BACJ64K,IAAKM,EACL9wK,QAASoK,EAAc,CACnBzS,GAAI,uDACJ0S,eAAgB,+DAG3B,EA8CsBkmK,GACvB,OAAOh2J,EAAAA,EAAAA,UAAQ,IACX01J,EAAUhsK,KAAK8sK,IAAS,IAAAC,EACpB,MAAM/wK,EAAoD,QAA9C+wK,EAAGjB,EAAShkK,MAAM2jF,GAASA,EAAK3uF,OAASgwK,WAAK,IAAAC,OAAA,EAA3CA,EAA6C5sK,MAC5D,MAAO,CACHrD,KAAMgwK,EACN9wK,OAAQA,IAAWwtK,EAAAA,GAAS7oK,WAC5BpC,MAAOA,KACH,MAAM,GAAC7K,EAAE,IAAE64K,EAAG,QAAExwK,GAAWswK,EAAeS,GAC1C,OACInwK,IAAAA,cAAA,OAAKtC,IAAK3G,GACNiJ,IAAAA,cAAA,eACKA,IAAAA,cAAoB4vK,EAAK,CAACvhK,MAAO,GAAIC,OAAQ,MAElDtO,IAAAA,cAAA,YAAOZ,GACL,EAGjB,KACD,CAAC+vK,EAAUE,GAAW,EAGrBhC,EAA8BA,KACvC,MAAMh3K,GAAWsxD,EAAAA,EAAAA,eACX7hC,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5B81J,GAAuB52J,EAAAA,EAAAA,cACzB,CAAC62J,EAAsBhD,EAAUI,KAC7B,MAAMvkI,EAAc,CAChB,CACI1qB,QAASqH,EACTsK,SAAUkgJ,EACVnwK,KAAMmtK,EACN9pK,MAAOkqK,EAAK1pK,aAGpB3N,GAASo6B,EAAAA,EAAAA,IAAgB3K,EAAeqjB,GAAa,GAEzD,CAACrjB,IAGL,OAAOrM,EAAAA,EAAAA,cAAY,SACf6zJ,EACAI,GAIC,IAHDnvK,IAAU0H,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,KAAAA,UAAA,GACVsqK,EAAyBtqK,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EACzBs1K,EAAYrqK,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG6lK,EAAAA,GAGf,GADAuE,EAAqBC,EAAchD,EAAUI,GACzCnvK,EAAY,CACZ,MAAMiyK,EAAcD,EAAmB,GAAH5vK,OAAM+sK,EAAI,MAAA/sK,OAAK4vK,GAAqB7C,EAAK1pK,WACvEysK,GAAeC,EAAAA,EAAAA,GAAqB5E,EAAAA,GAAwBwB,EAAUkD,IAC5EG,EAAAA,EAAAA,IAAiB7E,EAAAA,GAAwB2E,EAC7C,CACJ,GAAG,CAACJ,GAAsB,EAGjBO,EAAiCA,KAC1C,MAAMv6K,GAAWsxD,EAAAA,EAAAA,gBACX,SAAChlC,IAAYkuJ,EAAAA,EAAAA,eAEbC,EAAiBzD,IACjBvnJ,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5Bg1J,GAAcx4H,EAAAA,EAAAA,cAAaz+C,IAAuBqsE,EAAAA,EAAAA,IAAuBrsE,KACzEy4K,EAAkE,OAAjD59C,EAAAA,EAAAA,WAAUxwG,EAAU,CAACF,KAAM,mBAC5CuuJ,EAAyE,OAA5D79C,EAAAA,EAAAA,WAAUxwG,EAAU,CAACF,KAAM,8BAE9C,OAAQ6qJ,IACJ,OAAQA,GACR,KAAKvB,EAAAA,EAAoBC,cAAe,CACpC8E,EAAexD,EAAUR,EAAAA,GAAmBQ,GAAU/kJ,SAAS,GAC/D,MAAM0oJ,EAAezsG,EAAAA,GAAiBC,yBAChCt7B,EAAc,CAChB,CACI1qB,QAASqH,EACTsK,SAAU6gJ,EACV9wK,KAAM2lB,EAGNtiB,MAAO+rK,EAAc3qG,EAAAA,GAAiCC,aAAa7gE,WAAa8gE,EAAAA,GAAoBosG,6BAA6BltK,YAErI,CACIya,QAASqH,EACTsK,SAAU6gJ,EACV9wK,KAAMgxK,EAAAA,GAAuBF,GAC7BztK,MAAO4tK,EAAAA,GAAeC,QAAQrtK,aAGtC3N,GAASo6B,EAAAA,EAAAA,IAAgB3K,EAAeqjB,IACnC6nI,GACD36K,GAAS0+B,EAAAA,EAAAA,OAEb,KACJ,CACA,KAAKg3I,EAAAA,EAAoBI,sBACrB91K,GAAS2iC,EAAAA,EAAAA,IAAkB,IAC3B3iC,GAASg/B,EAAAA,EAAAA,KAAqC,IAC9Cy7I,EAAexD,EAAUR,EAAAA,GAAmBQ,GAAU/kJ,SAAS,GAC3DwoJ,GACA16K,GAAS0+B,EAAAA,EAAAA,OAEb,MAEJ,KAAKg3I,EAAAA,EAAoBK,qBACrB/1K,GAASqgC,EAAAA,EAAAA,IAA2B,IACpCrgC,GAASk/B,EAAAA,EAAAA,KAAkC,IAC3Cu7I,EAAexD,EAAUR,EAAAA,GAAmBQ,GAAU/kJ,SAAS,GAC/D,MAEJ,KAAKwjJ,EAAAA,EAAoBE,cACrBv6E,aAAaQ,QAAQ45E,EAAAA,GAAwB,QAGzCz1K,EADA06K,GACS97I,EAAAA,EAAAA,IAAqB,MAErBA,EAAAA,EAAAA,OAEb67I,EAAexD,EAAUR,EAAAA,GAAmBQ,GAAUT,UAAU,GAChE,MAEJ,KAAKd,EAAAA,EAAoBG,aAAc,CACnC4E,EAAexD,EAAUR,EAAAA,GAAmBQ,GAAUT,UAAU,GAChE,MAAM1jI,EAAc,CAAC,CACjB1qB,QAASqH,EACTsK,SAAU07I,EAAAA,GACV3rK,KAAMmsK,EAAAA,GAAmBC,0BACzB/oK,MAAO,SAEXnN,GAASo6B,EAAAA,EAAAA,IAAgB3K,EAAeqjB,IACxCz3B,OAAOC,KAAK,0CAA2C,SAAU,uBACjE,KACJ,CACA,KAAKo6J,EAAAA,EAAoBM,aACrBsE,EAAAA,EAAAA,IACI5iF,EAAAA,GAAqBujF,kCACrB,0BAEJj7K,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiB27J,uBAC1Bz7J,WAAYo7J,EACZn7J,YAAa,CACTo7J,WAAY,iBAIpBwC,EAAexD,EAAUR,EAAAA,GAAmBQ,GAAUT,UAAU,GAIpE,CACH,C,2CCrSE,MAAM6D,EAAuBA,CAACtgJ,EAAkBjwB,EAAcknE,IAC1D,GAAP1mE,OAAUyvB,EAAQ,MAAAzvB,OAAKR,EAAI,MAAAQ,OAAK0mE,GAG7B,SAASkqG,EAAqB5lF,GACjC,OAAOA,EAAU,mBAAqB,qBAC1C,C,0HCCA6lF,EAAAA,EAAAA,IAAU,CAAC,CACPx5F,KAAM,KACN73E,KAAM,YAGH,MAAMsxK,GAAYC,EAAAA,EAAAA,MAAU74G,MAAK,CAACjW,EAAYtwC,IAAgBswC,EAAEziD,KAAOmS,EAAEnS,KAAO,GAAK,ICEtFwxK,EAAmBjyK,IACrB,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WAExB,OACIxZ,IAAAA,cAAC4xK,EAAAA,EAAa,CACVh8C,OAAQl2H,EAAMk2H,QAAU,kBACxBjzH,SAAUjD,EAAMiD,SAChBa,MAAO9D,EAAM8D,MAAQ,CAACA,MAAO9D,EAAM8D,MAAO5B,OAAOiwK,EAAAA,EAAAA,IAAQnyK,EAAM8D,QAAU,SAAMxI,EAC/E+C,QAAS0zK,EAAUpuK,KAAKyuK,IAAO,CAC3BtuK,MAAOsuK,EAAQ95F,KACfp2E,MAAOkwK,EAAQ3xK,SAEnBw1H,OAAQnsH,EAAc,CAClBzS,GAAI,uBACJ0S,eAAgB,mBAEpBpF,YAAamF,EAAc,CACvBzS,GAAI,uBACJ0S,eAAgB,mBAEpBtJ,KAAM,oBACR,EAERwxK,EAAAtpK,UAAA,CA5BE1F,SAAQmD,IAAAA,KAAAC,WACRvC,MAAKsC,IAAAA,OACL8vH,OAAM9vH,IAAAA,QA4BV,S,sICXA,MAAM68H,EAAwBxqI,IAAoD,IAAnD,YAACyqI,EAAW,SAAEvuE,EAAQ,OAAE0kG,GAAS,GAAa5gK,EACzE,MAAMm/F,GAAgBvgD,EAAAA,EAAAA,cAAaz+C,IAC/B,MAAM8kC,GAAQzZ,EAAAA,EAAAA,IAAWrrB,GACzB,IAAK,MAAMupB,KAAQub,EACf,IAAK,MAAM0G,KAAc8+F,EACrB,IAAI5+F,EAAAA,EAAAA,IAAoB1rC,EAAOupB,EAAK9qB,GAAI+sC,GACpC,OAAO,EAKnB,OAAO,CAAK,IAGhB,OACI9jC,IAAAA,cAAC+xK,EAAAA,EAAI,CACDhZ,OAAQA,EACRzhE,cAAeA,GAEdjjC,EACE,EAEbsuE,EAAAt6H,UAAA,CAnCEu6H,YAAW98H,IAAAA,QAAAA,IAAAA,QAAAC,WAKXgzJ,OAAMjzJ,IAAAA,KAKNuuD,SAAQvuD,IAAAA,KAAAC,YA2BZ,QAAe/F,IAAAA,KAAW2iI,E,2HCf1B,MAAMqvC,EAAwB75K,IAAuE,IAAtE,UAACia,EAAS,OAAE/X,EAAM,YAAEuoI,EAAW,SAAEvuE,EAAQ,OAAE0kG,GAAS,GAAa5gK,EAC5F,MAAMm/F,GAAgBvgD,EAAAA,EAAAA,cAAaz+C,IAC/B,IAAK8Z,GAAD,MAAc/X,EACd,OAAO,EAEX,IAAK,MAAMypC,KAAc8+F,EACrB,IAAIh2G,EAAAA,EAAAA,IAAuBt0B,EAAO+B,EAAQ+X,EAAW0xB,GACjD,OAAO,EAGf,OAAO,CAAK,IAGhB,OACI9jC,IAAAA,cAAC+xK,EAAAA,EAAI,CACDhZ,OAAQA,EACRzhE,cAAeA,GAEdjjC,EACE,EAEb29G,EAAA3pK,UAAA,CA5CE+J,UAAStM,IAAAA,OAKTzL,OAAMyL,IAAAA,OAKN88H,YAAW98H,IAAAA,QAAAA,IAAAA,QAAAC,WAKXgzJ,OAAMjzJ,IAAAA,KAKNuuD,SAAQvuD,IAAAA,KAAAC,YA0BZ,QAAe/F,IAAAA,KAAWgyK,E,+ECpD1B,MAAMD,EAAO55K,IAIA,IAJC,cACVm/F,EAAa,OACbyhE,EAAM,SACN1kG,GACIl8D,EACJ,OAAIm/F,IAAkByhE,EACX/4J,IAAAA,cAAAA,IAAAA,SAAA,KAAGq0D,GAEP,IAAI,EACb09G,EAAA1pK,UAAA,CAdEivF,cAAaxxF,IAAAA,KAAAC,WACbgzJ,OAAMjzJ,IAAAA,KACNuuD,SAAQvuD,IAAAA,KAAAC,YAcZ,S,2HCIA,MAAMuyJ,EAAuBngK,IAIhB,IAJiB,OAC1B4gK,GAAS,EAAK,YACdn2B,EAAW,SACXvuE,GACIl8D,EACJ,MAAMm/F,GAAgBvgD,EAAAA,EAAAA,cAAaz+C,IAC/B,IAAK,MAAMwrC,KAAc8+F,EACrB,IAAI/+F,EAAAA,EAAAA,IAAsBvrC,EAAO,CAACwrC,eAC9B,OAAO,EAIf,OAAO,CAAK,IAGhB,OACI9jC,IAAAA,cAAC+xK,EAAAA,EAAI,CACDhZ,OAAQA,EACRzhE,cAAeA,GAEdjjC,EACE,EAEbikG,EAAAjwJ,UAAA,CApCEu6H,YAAW98H,IAAAA,QAAAA,IAAAA,QAAAC,WAKXgzJ,OAAMjzJ,IAAAA,KAKNuuD,SAAQvuD,IAAAA,KAAAC,YA4BZ,QAAe/F,IAAAA,KAAWs4J,E,2HChB1B,MAAMvM,EAAqB5zJ,IAKd,IALe,OACxBkC,EAAM,YACNuoI,EAAW,OACXm2B,GAAS,EAAK,SACd1kG,GACIl8D,EACJ,MAAMm/F,GAAgBvgD,EAAAA,EAAAA,cAAaz+C,IAC/B,IAAK+B,EACD,OAAO,EAGX,IAAK,MAAMypC,KAAc8+F,EACrB,IAAI5+F,EAAAA,EAAAA,IAAoB1rC,EAAO+B,EAAQypC,GACnC,OAAO,EAIf,OAAO,CAAK,IAGhB,OACI9jC,IAAAA,cAAC+xK,EAAAA,EAAI,CACDhZ,OAAQA,EACRzhE,cAAeA,GAEdjjC,EACE,EAEb03F,EAAA1jJ,UAAA,CA9CEhO,OAAMyL,IAAAA,OAKN88H,YAAW98H,IAAAA,QAAAA,IAAAA,QAAAC,WAKXgzJ,OAAMjzJ,IAAAA,KAKNuuD,SAAQvuD,IAAAA,KAAAC,YAiCZ,QAAe/F,IAAAA,KAAW+rJ,E,qSC5DnB,SAASkmB,EAAStyK,GACrB,YAAmD3E,IAA3C2E,EAA2B8rC,SAAS10C,EAChD,CAEO,SAAS86K,EAAQlyK,GACpB,OAAIsyK,EAAStyK,GACFA,EAAK8rC,SAAStrC,KAElBR,EAAK8rC,SAAS5rC,YACzB,C,eCHO,MAAMqyK,EAAc55K,GAA4CA,EAAM8kD,MAAM+0H,YAAY9wG,QAIlF+wG,GAAahoH,EAAAA,EAAAA,IACtB,aACA8nH,GAJoB55K,GAAyCA,EAAM8kD,MAAM+0H,YAAYE,OAMrF,CAAChxG,EAASgxG,IACFhxG,EACQA,EAAsD1gE,OAAO0xK,GAGlEA,IAIFC,GAAsBloH,EAAAA,EAAAA,IAC/B,sBACAgoH,GACCG,GAAYA,EAAQpvK,QAAQi/B,GACrB6vI,EAAS7vI,GACsB,KAAxBA,EAAEowI,kBAGNpwI,EAAEqwI,cAYJC,EAAgBA,CAACp6K,EAAoBvB,IAAwBwV,SAAQomK,EAAAA,EAAAA,IAAoBr6K,EAAM8kD,MAAM+0H,YAAYS,WAAY77K,IAE7H87K,EAAWA,CAACv6K,EAAoBvB,KAAmC47K,EAAAA,EAAAA,IAAoBr6K,EAAM8kD,MAAM+0H,YAAYznK,OAAQ3T,G,gDCzB7H,SAAS+7K,IAA4F,IAA/EC,EAAS9sK,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAClC,OAAO1P,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRxS,EDkBY7K,IAA+BA,EAAM8kD,MAAM+0H,YAAYhvK,OClB1D6vK,CAAU16K,GAEzB,IAAI+oE,EACAgxG,EAAyB,GAE7B,IACIhxG,QAAgBrpE,EAAAA,GAAQi7K,sBAAsB9vK,EAAQ4vK,EAC1D,CAAE,MAAOr8K,GAKL,MAH8B,kDAA1BA,EAAMM,iBAAwE+7K,SACxE18K,EAASy8K,GAAa,IAEzB,CAACp8K,QACZ,CAOA,GALAL,EAAS,CACL6E,KAAMc,EAAAA,GAAYk3K,6BAClB7xG,aAGA3kD,EAAAA,EAAAA,IAAYpkB,GAAQ,CACpB,IACI+5K,QAAar6K,EAAAA,GAAQm7K,mBAAmBhwK,EAC5C,CAAE,MAAOzM,GACL,MAAO,CAACC,KAAM0qE,EAClB,CAEAhrE,EAAS,CACL6E,KAAMc,EAAAA,GAAYo3K,0BAClBf,QAER,CAEA,OAAIhxG,EACO,CAAC1qE,KAAO0qE,EAAsD1gE,OAAO0xK,IAGzE,CAAC17K,KAAM07K,EAAK,CAE3B,CAiBO,SAASgB,EAAct8K,GAC1B,OAAOR,MAAOF,EAAUsf,KACpBtf,EAAS,CACL6E,KAAMc,EAAAA,GAAYs3K,4BAClBv8K,OAGJ,MAEMw8K,EDrDWC,EAACl7K,EAAoBvB,IAC1Cm7K,EAAW55K,GAAO6S,MAAOkwG,GAAMA,EAAE5vE,UAAY4vE,EAAE5vE,SAAS10C,KAAOA,ICoDjCy8K,CAFZ79J,IAE6B5e,GAC3C,GAAKw8K,EAAL,CASA,UACUv7K,EAAAA,GAAQy7K,yBAAyB18K,EAC3C,CAAE,MAAOL,GAML,YALAL,EAAS,CACL6E,KAAMc,EAAAA,GAAY03K,mCAClB38K,KACAL,MAAOA,EAAM0I,SAGrB,OAEM/I,EAASy8K,KACfz8K,EAAS,CACL6E,KAAMc,EAAAA,GAAY23K,sCAClB58K,MAhBJ,MANIV,EAAS,CACL6E,KAAMc,EAAAA,GAAY03K,mCAClB38K,KACAL,MAAO,mBAAqBK,GAoBlC,CAEV,CAKO,SAAS68K,EAAW78K,GACvB,OAAOR,MAAOF,EAAUsf,KACpBtf,EAAS,CACL6E,KAAMc,EAAAA,GAAYs3K,4BAClBv8K,OAGJ,MAUMyR,EAAwB,CAC1BqrK,IAAK,CACDjyK,MAAO7K,EACPyM,MAAOzM,IAITuB,EAAQqd,IACR9B,GAAYwH,EAAAA,EAAAA,IAAoB/iB,GAChCq2C,GAASl0B,EAAAA,EAAAA,IAAiBniB,GAC1B6Z,EAAW2hK,EAAAA,GAAoBC,YAC/BjkK,GAAUkkK,EAAAA,EAAAA,IAAkB,OAAQ7hK,EAAU0B,EAAW86B,GAEzD5+B,GAAOC,EAAAA,EAAAA,IAtBS,CAClByS,KAFa,mBAuBoB3S,EAlBX,CACtBmkK,YAAa,WACb1wJ,OAAQ,OAgB0C/a,GAEhD2B,QAAY9T,GAAS4Z,EAAAA,EAAAA,IAAYF,EAAMyhB,EAAAA,KAE7C,GAAIrnB,EAAIzT,MAAO,CACX,MAAM4T,EAAgBH,EAAIzT,MAM1B,OALAL,EAAS,CACL6E,KAAMc,EAAAA,GAAY03K,mCAClB38K,KACAL,MAAO4T,EAAcE,QAElB,CACX,CAEAnU,EAAS,CACL6E,KAAMc,EAAAA,GAAY23K,sCAClB58K,OAGJ,MAAMuU,EAAWnB,EAAIxT,KASrB,OARI2U,EAASpQ,OAAS4P,EAAAA,GAAqBC,MAAQO,EAAS/C,MACxDlS,GAASuc,EAAAA,EAAAA,IAActH,EAAS/C,KAAMwH,EAAKD,UAG3CxE,EAASd,MACTnU,GAAS6Z,EAAAA,EAAAA,IAAoC5E,EAAUA,EAASd,KAAMsF,KAGnE,CAAI,CAEnB,C,mlBC1KO,MAAMokK,GAAQ/7K,IAA6D,IAA5D,KAACgI,EAAI,YAAED,EAAW,IAAEa,GAAsB5I,EAC5D,MAAMg8K,EACFn0K,IAAAA,cAAC+0H,EAAAA,EAAG,CACAvqH,KAAMrK,EACN60H,WAAW,EACXl0H,KAAM,OAId,IAAIc,EAaJ,OAXIA,EADA1B,EAEIF,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOhO,GAENi0K,GAIDA,EAGRpzK,EAEIf,IAAAA,cAAC03C,EAAAA,EAAY,CACT,aAAYv3C,EAAK8C,cACjBhD,UAAU,qDACVk2C,KAAMp1C,EACNoR,SAAS,oBAERvQ,GAKNA,CAAK,EAsBD,MAAMwyK,WAAwBp0K,IAAAA,cAGzCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,8BAaO,KACpB,MAAMsH,EAAUpH,KAAK2xK,eAAe5hK,QAC9B82E,EAAcz/E,GAAWA,EAAQkqE,YAAclqE,EAAQw/E,YAC7D5mF,KAAKgH,SAAS,CAAC6/E,YAAah9E,QAAQg9E,IAAc,IAdlD7mF,KAAK2xK,eAAiBr0K,IAAAA,YAEtB0C,KAAKpK,MAAQ,CACTixF,aAAa,EAErB,CAEAtuC,iBAAAA,GACIv4C,KAAK+nF,uBACT,CAQA9kF,MAAAA,GACI,MAAM,OAACisD,EAAS,MAAQlvD,KAAKhD,MAC7B,IAAIK,EAEAA,EADA2C,KAAKhD,MAAM40K,WAEPt0K,IAAAA,cAAA,OAAKC,UAAU,yCACXD,IAAAA,cAAA,OAAKuO,IAAK7L,KAAKhD,MAAM40K,cAItBt0K,IAAAA,cAACu0K,EAAAA,EAAU,CAACt0K,UAAU,0CAGjC,MAAMu0K,EAAkB5iH,aAAM,EAANA,EAAQvuD,KAAKzB,GACjC5B,IAAAA,cAACk0K,GAAK,CACFx2K,IAAKkE,EAAMzB,KACXA,KAAMyB,EAAMzB,KACZD,YAAa0B,EAAM1B,YACnBa,IAAKa,EAAMb,QAIb0zK,EACFz0K,IAAAA,cAAAA,IAAAA,SAAA,KACK0C,KAAKhD,MAAMS,KACXuC,KAAKhD,MAAMg1K,cAIdC,EAAkBjyK,KAAKhD,MAAMhJ,OAASgM,KAAKhD,MAAMQ,YACvD,IAmBI00K,EAnBA10K,EACAF,IAAAA,cAAA,KACIC,UAAWk3C,IAAW,0BAA2B,CAAC09H,WAAYnyK,KAAKhD,MAAMhJ,QACzEkkD,IAAKl4C,KAAK2xK,gBAETM,GAyDT,OArDIjyK,KAAKpK,MAAMixF,cACXrpF,EACIF,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOymK,GAAmB,IAEzBz0K,IAOT00K,EADAlyK,KAAKhD,MAAMo1K,YAEP90K,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAC03C,EAAAA,EAAY,CACT,aAAYh1C,KAAKhD,MAAMS,KAAK8C,cAC5BhD,UAAU,oCACVk2C,KAAMzzC,KAAKhD,MAAMo1K,YACjB3iK,SAAS,oBAERsiK,GAEJD,EACDx0K,IAAAA,cAAC03C,EAAAA,EAAY,CACT,aAAW,mBACXz3C,UAAU,oCACVk2C,KAAMzzC,KAAKhD,MAAMo1K,YACjB3iK,SAAS,oBAERjS,IAMTF,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,QACI,aAAY0C,KAAKhD,MAAMS,KAAK8C,cAC5BhD,UAAU,eAETw0K,GAEJD,EACDx0K,IAAAA,cAAA,QACI,aAAW,qBACXC,UAAU,eAETC,IAObF,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,kBAAmB,wBAAyB,CAAC49H,WAAYryK,KAAKhD,MAAMhJ,QAC1FgH,IAAKgF,KAAKhD,MAAM3I,GAChBA,GAAI,sBAAwB2L,KAAKhD,MAAM3I,IAEtCgJ,EACDC,IAAAA,cAAA,OAAKC,UAAU,uBACV20K,EACAlyK,KAAKhD,MAAMs1K,eAEhBh1K,IAAAA,cAAA,OAAKC,UAAU,uBACVyC,KAAKhD,MAAMgjJ,SAKhC,E,0ZACHlgJ,GAtIoB4xK,GAAe,aAlBhCr9K,GAAE+O,IAAAA,OAAAC,WACF5F,KAAI2F,IAAAA,OAAAC,WACJ7F,YAAW4F,IAAAA,OACXwuK,WAAUxuK,IAAAA,OACV8rD,OAAM9rD,IAAAA,MACNgvK,YAAWhvK,IAAAA,OAEXpP,MAAKoP,IAAAA,OAEL48I,OAAM58I,IAAAA,QAAAC,WACNivK,cAAalvK,IAAAA,UAAA,CAAAA,IAAAA,QAAAA,IAAAA,MAAA,UACb4uK,aAAY5uK,IAAAA,UAAA,CAAAA,IAAAA,QAAAA,IAAAA,MAAA,YChCD,MAAMmvK,WAA2Bj1K,IAAAA,cAA8CsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,kBAC9E,KACRE,KAAKhD,MAAMnB,WAAW,UAAW,6BAA8B,CAC3D22K,OAAQxyK,KAAKhD,MAAM3I,KAGvB2L,KAAKhD,MAAMqD,QAAQ6wK,WAAWlxK,KAAKhD,MAAM3I,IAAImV,MAAM/B,IAC3CA,GACAzH,KAAKhD,MAAMqD,QAAQoyK,uBACvB,GACF,GACL,CAEDC,aAAAA,GACI,GAAI1yK,KAAKhD,MAAM+yK,YAAc/vK,KAAKhD,MAAMkzK,aAAelwK,KAAKhD,MAAMhJ,MAC9D,OACIsJ,IAAAA,cAAA,UACIC,UAAU,gBACVoH,UAAU,GAEVrH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,eAM/B,IAAIqwG,EAiBJ,OAfIA,EADAp3G,KAAKhD,MAAMhJ,MAEPsJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,cAKnBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,YAMvBzJ,IAAAA,cAAA,UACIsP,QAAS5M,KAAK2yK,UACdp1K,UAAU,kCACVoH,SAAU3E,KAAKhD,MAAMkzK,YAErB5yK,IAAAA,cAACs1K,EAAAA,EAAc,CACXtpK,QAAStJ,KAAKhD,MAAMkzK,WACpBpoK,MAAM0E,EAAAA,EAAAA,eAAc,CAACnY,GAAI,+BAAgC0S,eAAgB,mBAExEqwG,GAKjB,CAEAn0G,MAAAA,GACI,OACI3F,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACo0K,GAAeh0K,OAAAC,OAAA,CACZqiJ,OAAQhgJ,KAAK0yK,gBACbJ,cAAe,KACfN,aAAc,KACdJ,WAAY5xK,KAAKhD,MAAM61K,SACnB7yK,KAAKhD,QAIzB,EACH8C,GA3EoByyK,GAAkB,aApBnCl+K,GAAE+O,IAAAA,OAAAC,WACF5F,KAAI2F,IAAAA,OAAAC,WACJ7F,YAAW4F,IAAAA,OACXgvK,YAAWhvK,IAAAA,OACXyvK,QAAOzvK,IAAAA,OAEP2sK,UAAS3sK,IAAAA,KAAAC,WACT6rD,OAAM9rD,IAAAA,MAEN8sK,WAAU9sK,IAAAA,KAAAC,WACVrP,MAAKoP,IAAAA,OAELvH,WAAUuH,IAAAA,KAAAC,WAEVhD,QAAO+C,IAAAA,MAAA,CACH8tK,WAAU9tK,IAAAA,KAAAC,WACVovK,sBAAqBrvK,IAAAA,KAAAC,aAAAA,aCa7B,UAAe+B,EAAAA,EAAAA,UApBf,SAAyBxP,EAAoBoH,GAIzC,MAAO,CACHkzK,WAJeF,EAAcp6K,EAAOoH,EAAM3I,IAK1CL,MAJUm8K,EAASv6K,EAAOoH,EAAM3I,IAKhCwH,WAAUA,EAAAA,GAElB,IAEA,SAA4BlI,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB4rK,WAAU,EACVuB,sBAAuBA,KAAM14E,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBie,qBAC1D36B,GAEX,GAEA,CAA4D4+K,I,6cClBrD,MAAMO,GAAgBr9K,IAAiE,IAAhE,QAACwpD,EAAO,gBAAE8zH,GAAoCt9K,EACxE,OAAKs9K,EASDz1K,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,0BACTgkC,KAAMs/H,GAEL9zH,GAXD3hD,IAAAA,cAAA,YACK2hD,EAWM,EAErB6zH,GAAAntK,UAAA,CAtBEs5C,QAAO77C,IAAAA,OAAAC,WACP0vK,gBAAe3vK,IAAAA,QAgCZ,MAAM4vK,GAAgB93K,IAAkH,IAAjH,QAAC+jD,EAAO,gBAAE8zH,EAAe,iBAAEE,EAAgB,aAAEC,EAAY,SAAEC,GAA6Bj4K,EAClH,IAAK+3K,GAAoBC,EACrB,OAAO,KAGX,IAAIE,GAAW,EACf,IACIA,EAAWC,KAAAA,GAAUp0H,EAASg0H,EAClC,CAAE,MAAOx2K,GACL,CAGJ,OAAK22K,EAKD91K,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,WACvBn3C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAe,sBAElB,IACDzJ,IAAAA,cAACw1K,GAAa,CACV7zH,QAASA,EACT8zH,gBAAiBA,IAEpB,MACDz1K,IAAAA,cAAA,SACIA,IAAAA,cAAA,KAAGsP,QAASumK,GACR71K,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,cAnBxB,IAuBD,EAEZisK,GAAArtK,UAAA,CA9CEs5C,QAAO77C,IAAAA,OAAAC,WACP0vK,gBAAe3vK,IAAAA,OACf6vK,iBAAgB7vK,IAAAA,OAChB8vK,aAAY9vK,IAAAA,KAAAC,WACZ8vK,SAAQ/vK,IAAAA,KAAAC,YAuDL,MAAMiwK,GAA0B1/G,IAAoI,IAAnI,KAACzqD,EAAI,KAAE1L,EAAI,QAAEwhD,EAAO,iBAAEg0H,EAAgB,gBAAEF,EAAe,SAAEI,EAAQ,SAAE3tH,GAAuCoO,EAC9I,IAAKq/G,EACD,OAAO,KAGX,IAAIG,GAAW,EACf,IACIA,EAAWC,KAAAA,GAAUp0H,EAASg0H,EAClC,CAAE,MAAOx2K,GACL,CAGJ,IAAK22K,EACD,OAAO,KAGX,MAAMv4J,EAAW,CACbvd,IAAAA,cAAA,KAAGtC,IAAI,SACHsC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2DACH0S,eAAc,uCAAA9I,OAAyCR,EAAI,eAAAQ,OAAcghD,EAAO,KAChFn5C,OAAQ,CAACrI,OAAMwhD,eAKvB8zH,EACAl4J,EAASvL,KACLhS,IAAAA,cAAA,KAAGtC,IAAI,WACHsC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gFACH0S,eAAe,qIACfjB,OAAQ,CACJmtK,mBACA/yH,EAAIC,GACA7iD,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAMs/H,EACNtjK,SAAS,sBAER0wC,QAOzBtlC,EAASvL,KACLhS,IAAAA,cAAA,KAAGtC,IAAI,WACHsC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6DACH0S,eAAc,sBAAA9I,OAAwBg1K,EAAgB,eACtDntK,OAAQ,CAACmtK,wBAMzB,IAAIM,GAAmB,EACvB,IACIA,EAAmBF,KAAAA,MAAap0H,KAAao0H,KAAAA,MAAaJ,EAC9D,CAAE,MAAOx2K,GAEL,CAwCJ,OArCK82K,IACGR,EACAl4J,EAASvL,KACLhS,IAAAA,cAAA,KACIC,UAAU,sBACVvC,IAAI,WAEJsC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8FACH0S,eAAe,+FACfjB,OAAQ,CACJo6C,EAAIC,GACA7iD,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAMs/H,EACNtjK,SAAS,sBAER0wC,QAOzBtlC,EAASvL,KACLhS,IAAAA,cAAA,KACIC,UAAU,sBACVvC,IAAI,WAEJsC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2EACH0S,eAAgB,iDAQhCzJ,IAAAA,cAACklH,GAAAA,EAAY,CACTr5G,KAAMA,EACNqC,MACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mDACH0S,eAAgB,0BAGxBrK,QAASme,EACTg+D,kBACIv7E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4DACH0S,eAAe,WAGvBwqD,UAAW4hH,EACX3tH,SAAUA,GACZ,EAER8tH,GAAA3tK,UAAA,CApIEwD,KAAI/F,IAAAA,KAAAC,WACJ5F,KAAI2F,IAAAA,OAAAC,WACJ47C,QAAO77C,IAAAA,OAAAC,WACP0vK,gBAAe3vK,IAAAA,OACf6vK,iBAAgB7vK,IAAAA,OAChB+vK,SAAQ/vK,IAAAA,KAAAC,WACRmiD,SAAQpiD,IAAAA,KAAAC,YA0JG,MAAMmwK,WAA8Bl2K,IAAAA,cAC/CsC,WAAAA,CAAY5C,GAAmC,IAAAoJ,EAC3CvG,MAAM7C,GAAMoJ,EAAApG,KAAAF,GAAA,mBAOH,SAAC2zK,GAAgD,IAA7BC,IAAWnwK,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,KAAAA,UAAA,GACpC6C,EAAKpJ,MAAM22K,sBAAwBD,EACnCttK,EAAKpJ,MAAMnB,WAAW,UAAW43K,EAAW,CACxCG,UAAWxtK,EAAKpJ,MAAM3I,GACtB4qD,QAAS74C,EAAKpJ,MAAMiiD,QACpB6wH,kBAAmB1pK,EAAKpJ,MAAMi2K,mBAGlC7sK,EAAKpJ,MAAMnB,WAAW,UAAW43K,EAEzC,IAAC3zK,GAAA,oCAE6B,KAC1BE,KAAKgH,SAAS,CAAC6sK,6BAA6B,GAAM,IACrD/zK,GAAA,oCAE6B,KAC1BE,KAAKgH,SAAS,CAAC6sK,6BAA6B,GAAO,IACtD/zK,GAAA,kBAEW,KACRE,KAAKnE,WAAW,2BAChBmE,KAAKhD,MAAMqD,QAAQswK,cAAc3wK,KAAKhD,MAAM3I,GAAG,IAClDyL,GAAA,oBAEa,KACVE,KAAKnE,WAAW,4BAA4B,GAE5CmE,KAAKhD,MAAMqD,QAAQoyK,uBAAuB,IAC7C3yK,GAAA,iBAEU,KACPE,KAAKnE,WAAW,kCAEhBmE,KAAK8zK,8BACL9zK,KAAKhD,MAAMqD,QAAQswK,cAAc3wK,KAAKhD,MAAM3I,GAAG,IAxC/C2L,KAAKpK,MAAQ,CACTi+K,6BAA6B,EAErC,CAwCAnB,aAAAA,GACI,GAAoC,KAAhC1yK,KAAKhD,MAAMi2K,mBAA4BjzK,KAAKhD,MAAMkzK,aAAelwK,KAAKhD,MAAMhJ,MAC5E,OACIsJ,IAAAA,cAAC8iD,EAAAA,KAAI,CACDnD,GAAI,iCAAmCj9C,KAAKhD,MAAM3I,IAElDiJ,IAAAA,cAAA,UACIsP,QAAS5M,KAAK+zK,YACdx2K,UAAU,oBAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,gBAOnC,IAAIqwG,EAiBJ,OAfIA,EADAp3G,KAAKhD,MAAMhJ,MAEPsJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,cAKnBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,YAMvBzJ,IAAAA,cAAA,UACIsP,QAAS5M,KAAK2yK,UACdp1K,UAAU,qCACVoH,SAAU3E,KAAKhD,MAAMkzK,YAErB5yK,IAAAA,cAACs1K,EAAAA,EAAc,CACXtpK,QAAStJ,KAAKhD,MAAMkzK,WACpBpoK,MAAM0E,EAAAA,EAAAA,eAAc,CAACnY,GAAI,+BAAgC0S,eAAgB,mBAExEqwG,GAKjB,CAEAn0G,MAAAA,GAAsB,IAAA+wK,EAClB,IAAI/0H,EAAU,IAAHhhD,OAAO+B,KAAKhD,MAAMiiD,QAAO,KACA,KAAhCj/C,KAAKhD,MAAMi2K,mBACXh0H,EAAU,IAAHhhD,OAAO+B,KAAKhD,MAAMi2K,iBAAgB,MAG7C,MAAMjB,EAAe10K,IAAAA,cAAA,QAAMC,UAAU,kBAAkB0hD,GAEjDqzH,EACFh1K,IAAAA,cAAC01K,GAAa,CACV/zH,QAASj/C,KAAKhD,MAAMiiD,QACpBg0H,iBAAkBjzK,KAAKhD,MAAMi2K,iBAC7BF,gBAAiB/yK,KAAKhD,MAAM+1K,gBAC5BG,aAAclzK,KAAKhD,MAAMkzK,WACzBiD,SAAUnzK,KAAK6zK,8BAIvB,OACIv2K,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACo0K,GAAeh0K,OAAAC,OAAA,CACZqiJ,OAAQhgJ,KAAK0yK,gBACbV,aAAcA,EACdM,cAAeA,EACfV,WAAY5xK,KAAKhD,MAAMi3K,UACnBj0K,KAAKhD,MAAK,CACdhJ,MAAOgM,KAAKhD,MAAMhJ,QAAgC,QAA3BggL,EAAIh0K,KAAKhD,MAAMk3K,oBAAY,IAAAF,OAAA,EAAvBA,EAAyBhgL,UAExDsJ,IAAAA,cAACg2K,GAAuB,CACpBnqK,KAAMnJ,KAAKpK,MAAMi+K,4BACjBp2K,KAAMuC,KAAKhD,MAAMS,KACjBwhD,QAASj/C,KAAKhD,MAAMiiD,QACpBg0H,iBAAkBjzK,KAAKhD,MAAMi2K,iBAC7BF,gBAAiB/yK,KAAKhD,MAAM+1K,gBAC5BI,SAAUnzK,KAAKmzK,SACf3tH,SAAUxlD,KAAK8zK,8BAI/B,EACHh0K,GA5IoB0zK,GAAqB,aAzBtCn/K,GAAE+O,IAAAA,OAAAC,WACF5F,KAAI2F,IAAAA,OAAAC,WACJ7F,YAAW4F,IAAAA,OACX67C,QAAO77C,IAAAA,OAAAC,WACP+uK,YAAWhvK,IAAAA,OACX2vK,gBAAe3vK,IAAAA,OACf8rD,OAAM9rD,IAAAA,MACN6wK,SAAQ7wK,IAAAA,OACR6vK,iBAAgB7vK,IAAAA,OAChB8sK,WAAU9sK,IAAAA,KAAAC,WAEVrP,MAAKoP,IAAAA,OACLuwK,qBAAoBvwK,IAAAA,KAAAC,WACpBxH,WAAUuH,IAAAA,KAAAC,WAEVhD,QAAO+C,IAAAA,MAAA,CACHutK,cAAavtK,IAAAA,KAAAC,WACbovK,sBAAqBrvK,IAAAA,KAAAC,aAAAA,aCnM7B,UAAe+B,EAAAA,EAAAA,UAzBf,SAAyBxP,EAAoBoH,GACzC,MAAMkzK,EAAaF,EAAcp6K,EAAOoH,EAAM3I,IACxCL,EAAQm8K,EAASv6K,EAAOoH,EAAM3I,IAC9Bs/K,EAAiE,UAA1C52J,EAAAA,EAAAA,IAAUnnB,GAAOu+K,qBAExCD,GAAeE,EAAAA,GAAAA,IAAgBx+K,EAAOoH,EAAM3I,IAElD,MAAO,CACH67K,aACAl8K,QACA2/K,uBACA93K,WAAU,KACVq4K,eAER,IAEA,SAA4BvgL,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBqrK,cAAa,EACb8B,sBAAuBA,KAAM14E,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBie,qBAC1D36B,GAEX,GAEA,CAA4D6/K,ICrBtDa,GAAkB5+K,IAOI,IAPH,QACrBo6K,EAAO,KACPtzK,EAAI,iBACJ+3K,EAAgB,gBAChBC,EAAe,OACf9zK,EAAM,QACNmjK,GACmBnuK,EACnB,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB09J,GAAYv9J,EAAAA,EAAAA,UAAQ,KACtB,GAAuB,IAAnB44J,EAAQnpK,OACR,MAAO,GAGX,MAAMg/J,EA7BgB,GA6BJnpK,EACZopK,EAAUD,EA9BM,GAgCtB,MAAO,IAAImK,GACP15G,MAAK,CAACjW,EAAGtwC,IAAMu/J,EAAQjvH,GAAGkW,cAAc+4G,EAAQv/J,MAChDR,MAAMs2J,EAAWC,GACjBhlK,KAAK++B,GACD6vI,EAAS7vI,GACLpiC,IAAAA,cAACk2K,GAAqB,CAClBx4K,IAAK0kC,EAAEqJ,SAAS10C,GAChBA,GAAIqrC,EAAEqJ,SAAS10C,GACfoJ,KAAMiiC,EAAEqJ,SAAStrC,KACjBD,YAAakiC,EAAEqJ,SAASvrC,YACxByhD,QAASvf,EAAEqJ,SAASkW,QACpBmzH,YAAa1yI,EAAE+0I,aACf1B,gBAAiBrzI,EAAEg1I,kBACnBxlH,OAAQxvB,EAAEwvB,OACV+kH,SAAUv0I,EAAE3+B,UACZkyK,iBAAkBvzI,EAAEowI,oBAGxBxyK,IAAAA,cAACi1K,GAAkB,CACfv3K,IAAK0kC,EAAEqJ,SAASypI,OAChBn+K,GAAIqrC,EAAEqJ,SAASypI,OACf/0K,KAAMiiC,EAAEqJ,SAAS5rC,aACjBK,YAAakiC,EAAEqJ,SAASvrC,YACxB40K,YAAa1yI,EAAEqJ,SAAS0rI,aACxB5B,QAASnzI,EAAE24G,SACX03B,UAAWrwI,EAAEqwI,UACb7gH,OAAQxvB,EAAEwvB,UAGpB,GACP,CAAC2gH,EAAStzK,IAEPo4K,GAAsB59J,EAAAA,EAAAA,cAAY,IACpCtW,EACIqG,EACI,CAACzS,GAAI,2CAA4C0S,eAAgB,6BACjE,CAACtG,WAGL6zK,GAEL,CAAC7zK,EAAQ6zK,IAEZ,OAA2B,IAAnBzE,EAAQnpK,OACZpJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACu0K,EAAAA,EAAU,CAACt0K,UAAU,iBACtBD,IAAAA,cAAA,OAAKC,UAAU,uBACVo3K,KAEJJ,GACGj3K,IAAAA,cAAA,UACIC,UAAU,qBACVqP,QAAS2nK,EAAgB3nK,QACzB,cAAY,0BAEX2nK,EAAgBr1K,QAK7B5B,IAAAA,cAAA,OACI46C,IAAK0rH,EACLrmK,UAAU,oBAETi3K,EAER,EACHH,GAAA1uK,UAAA,CA/FEpJ,KAAI6G,IAAAA,OAAAC,WACJixK,iBAAgBlxK,IAAAA,OAAAC,WAChBkxK,gBAAenxK,IAAAA,MAAA,CACXlE,MAAKkE,IAAAA,OAAAC,WACLuJ,QAAOxJ,IAAAA,KAAAC,aAEX5C,OAAM2C,IAAAA,QA2FV,Y,iMCxEMwxK,GAAqBz1H,KAAOnK,EAAAA,GAAaoK,WAAA,CAAAt7C,YAAA,sBAApBq7C,CAAoB,4MAgBzC01H,GAA2B11H,KAAAA,QAAcC,WAAA,CAAAt7C,YAAA,4BAAdq7C,CAAc,+JACf21H,IAQ1BlqK,GAAQu0C,KAAAA,IAAUC,WAAA,CAAAt7C,YAAA,SAAVq7C,CAAU,0LAgBlBk7B,GAAcl7B,KAAAA,EAAQC,WAAA,CAAAt7C,YAAA,eAARq7C,CAAQ,8HAUtB0yH,GAAa1yH,KAAAA,IAAUC,WAAA,CAAAt7C,YAAA,cAAVq7C,CAAU,+CAMvB41H,GAAiB51H,KAAAA,IAAUC,WAAA,CAAAt7C,YAAA,kBAAVq7C,CAAU,uFAG3B0yH,IAKN,GA3F6BmD,KACzB,MAAM,cAACluK,IAAiBgQ,EAAAA,EAAAA,WAExB,OACIxZ,IAAAA,cAACu3K,GAAwB,CAACt3K,UAAU,wBAChCD,IAAAA,cAACs3K,GAAkB,CACfnhI,KARa,qCASbhkC,SAAS,qBAETnS,IAAAA,cAACsN,GAAK,KACD9D,EAAc,CAACzS,GAAI,+CAAgD0S,eAAgB,oCACpFzJ,IAAAA,cAAC23K,EAAAA,eAAc,CAAC72K,KAAM,MAE1Bd,IAAAA,cAAC+8E,GAAW,KACPvzE,EAAc,CAACzS,GAAI,8CAA+C0S,eAAgB,kDAEvFzJ,IAAAA,cAACy3K,GAAc,KACXz3K,IAAAA,cAACu0K,GAAU,CAAChmK,IAAKqpK,KACjB53K,IAAAA,cAACu0K,GAAU,CAAChmK,IAAKspK,KACjB73K,IAAAA,cAACu0K,GAAU,CAAChmK,IAAKupK,OAGF,ECA7BC,GACW,MAMX9iF,GAAetlF,GACjB3P,IAAAA,cAAC8iD,EAAAA,KAAI,CAACnD,GAAG,4CACJhwC,GA4QT,GAlQyBxX,IAEI,IAFH,WACtB+4B,GACoB/4B,EACpB,MAAM9B,GAAWsxD,EAAAA,EAAAA,gBACX,cAACn+C,IAAiBgQ,EAAAA,EAAAA,WAClB8sJ,GAAUz6G,EAAAA,EAAAA,QAAuB,MAEjChgD,GAAOkrC,EAAAA,EAAAA,cAAaz+C,IAAuB8gG,EAAAA,EAAAA,GAAY9gG,EAAOya,EAAAA,GAAiBie,sBAC/EuhJ,GAAUx7H,EAAAA,EAAAA,aAAYq7H,GACtB4F,GAAmBjhI,EAAAA,EAAAA,aAAYu7H,GAC/B2F,GAAiBlhI,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAASwrE,MAAM4hF,iBAC1EC,GAAkCnhI,EAAAA,EAAAA,aAAYohI,EAAAA,IAC9CC,GAAkCrhI,EAAAA,EAAAA,aAAYshI,EAAAA,IAC9CnrJ,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtBkhE,GAAUytE,EAAAA,EAAAA,IAAe5uI,IAExBorJ,EAAQC,IAAah/J,EAAAA,EAAAA,UAASw+J,KAC9B50K,EAAQq1K,IAAaj/J,EAAAA,EAAAA,UAAS,KAC9Bta,EAAMw5K,IAAWl/J,EAAAA,EAAAA,UAAS,IAC1Bm/J,EAAWC,IAAgBp/J,EAAAA,EAAAA,WAAS,IACpCvN,EAASqoJ,GAAcr0J,IAAAA,UAAe,IACtCuqD,EAAaqb,GAAkB5lE,IAAAA,UAAe,GAE/C44K,GAAiBn/J,EAAAA,EAAAA,cAAYljB,UAC/B,MAAM,MAACG,SAAeL,EAASy8K,KAE3Bp8K,GACAkvE,GAAe,GAGnByuF,GAAW,EAAM,GAClB,IAEG7vD,GAAW/qF,EAAAA,EAAAA,cAAYljB,WACzBgI,EAAAA,EAAAA,IAAW,UAAW,wBAAyB,CAAC4E,WAEhD,MAAM,MAACzM,SAAeL,ERzBvB,SAAuB8M,GAC1B,OAAO5M,UACHF,EAAS,CACL6E,KAAMc,EAAAA,GAAY68K,2BAClB11K,WAGG9M,EAASy8K,KAExB,CQgBuCgG,CAAc31K,IAEzCzM,GACAkvE,GAAe,EACnB,GACD,CAACziE,IAEE41K,EAAkB5sH,IAASq4C,EAzDD,MA2DhCp/C,EAAAA,EAAAA,YAAU,MAON7mD,EAAAA,EAAAA,IAAW,UAAW,wBAAyB,CAACq6D,KAAM1nC,IAEjDgnJ,KACD35K,EAAAA,EAAAA,IAAW,UAAW,2CACtBlI,GAAS2iL,EAAAA,EAAAA,QAVbziL,uBACUF,GAAS4iL,EAAAA,EAAAA,aACTL,IACND,GAAa,EACjB,CASAO,EAAS,GACV,KAEH9zH,EAAAA,EAAAA,YAAU,KACFszH,GACAE,GACJ,GACD,CAACX,KAEJ7yH,EAAAA,EAAAA,YAAU,KACFszH,IACAK,IACAN,EAAQ,GACZ,GACD,CAACt1K,IAEJ,MAAMg2K,GAAkB1/J,EAAAA,EAAAA,cAAY,KAC5B6sJ,EAAQ7zJ,UACR6zJ,EAAQ7zJ,QAAQ2mK,UAAY,EAChC,GACD,IAOGC,GAAkC5/J,EAAAA,EAAAA,cAAa6+J,IACjDC,EAAUD,GACVG,EAAQ,GACRU,GAAiB,GAClB,CAACA,IAEEG,GAAiB7/J,EAAAA,EAAAA,cAAa5B,IAChC2gK,EAAU3gK,EAAM2iD,OAAOh3D,MAAM,GAC9B,IAEG+1K,IAAgB9/J,EAAAA,EAAAA,cAAY,KAC9B++J,EAAU,GAAG,GACd,IAEGgB,IAAmB//J,EAAAA,EAAAA,cAAY,KACjCg/J,EAAQx5K,EAAO,GACfk6K,GAAiB,GAClB,CAACl6K,EAAMk6K,IAEJM,IAAuBhgK,EAAAA,EAAAA,cAAY,KACrCg/J,EAAQx5K,EAAO,GACfk6K,GAAiB,GAClB,CAACl6K,EAAMk6K,IAEJO,IAA6BjgK,EAAAA,EAAAA,cAAY,KAC3C4/J,EAAgBtB,GAA4B,GAC7C,CAACsB,IAEEM,IAAiBlgK,EAAAA,EAAAA,cAAY,IAC3B2+J,EACO,KAIPp4K,IAAAA,cAAC4mH,EAAAA,EAAK,CACF7vH,GAAG,2BACHoJ,KAAK,2BACLoxJ,mBAAmB,2BACnB3oD,eAAe,eACf1tG,KAAK,OACL0+K,UAAWC,EAAAA,EAAKjmJ,MAChBw9F,YAAapxH,IAAAA,cAAC4lG,EAAAA,YAAW,CAAC9kG,KAAM,KAChCuD,YAAamF,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,uBAC5EqwK,WAAW,EACX1yK,WAAW,EACX0+F,WAAW,EACXtiG,MAAOL,EACPR,SAAU22K,EACVvzE,QAASwzE,MAGlB,CAACp2K,EAAQm2K,EAAgBC,KAEtBQ,IAAmBtgK,EAAAA,EAAAA,cAAY,IAC7B2+J,GAAmC7F,EAAQnpK,QFxLzB,GEyLX,KAIPpJ,IAAAA,cAACg6K,EAAAA,GAAgB,CACb/6K,KAAMA,EACNgZ,MAAOqgK,IAAWP,GAA8BxF,EAAQnpK,OAAS4uK,EAAiB5uK,OAClF6wK,aFhMc,GEiMdC,WAAYV,GACZW,eAAgBV,MAGzB,CAACzB,EAAiB5uK,OAAQmpK,EAAQnpK,OAAQnK,EAAMu6K,GAAkBC,GAAsBnB,EAAQF,IAE7FgC,IAAqB3gK,EAAAA,EAAAA,cAAY,KAC9B2+J,GAAmC/pF,EAC7B,KAGJruF,IAAAA,cAAC03K,GAAoB,OAC7B,CAACU,EAAiC/pF,IAErC,OACIruF,IAAAA,cAACo8E,EAAAA,GAAY,CACTrlF,GAAG,oBACHkJ,UAAWk3C,IAAW,oBAAqB,CACvC,0BAA2BihI,EAC3B,4BAA6BA,IAAoC/pF,IAErE3R,gBAAiBlzE,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,oBAC/E2Q,UAAW5Q,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,oBACzElD,UAAWgkD,EACP/gD,EACI,CACIzS,GAAI,8BACJ0S,eAAgB,4HAEpB,CAACwrF,sBAELj6F,EACJ6Q,KAAMA,EACN0wE,eAAe,EACf89F,aAAa,EACbC,YAAalC,EACbmC,eAAe,EACf3tK,SAzGcutF,MAClB57F,EAAAA,EAAAA,IAAW,UAAW,yBACtBlI,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBie,oBAAoB,EAwGrDwpJ,cAAeT,KACfU,gBAAiBL,KACjBM,YAAaf,MAEZvB,EACGp4K,IAAAA,cAAAA,IAAAA,SAAA,KACKgM,EACGhM,IAAAA,cAACmjJ,EAAAA,EAAa,CAACljJ,UAAU,YAEzBD,IAAAA,cAAC+2K,GAAe,CACZzQ,QAASA,EACTiM,QAASA,EACTtzK,KAAMA,EACNkE,OAAQA,EACR6zK,iBAAkBxtK,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,wBAKjGzJ,IAAAA,cAACwqI,EAAAA,KAAI,CACDzzI,GAAG,kBACHkJ,UAAU,OACVwqI,iBAAkBstC,GAClB4C,UAAWrC,EACX5kH,SAAU2lH,EACVzuC,eAAe,GAEf5qI,IAAAA,cAAC6qI,EAAAA,IAAG,CACAC,SAAUitC,GACV7pK,MAAO1E,EAAc,CAACzS,GAAI,qCAAsC0S,eAAgB,SAE/EuC,EACGhM,IAAAA,cAACmjJ,EAAAA,EAAa,CAACljJ,UAAU,YAEzBD,IAAAA,cAAC+2K,GAAe,CACZzQ,QAASA,EACTiM,QAASA,EACTtzK,KAAMA,EACNkE,OAAQA,EACR6zK,iBAAkBxtK,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,wBAIjGzJ,IAAAA,cAAC6qI,EAAAA,IAAG,CACAC,SAxPD,YAyPC58H,MAAO1E,EACH,CAACzS,GAAI,2CAA4C0S,eAAgB,uBACjE,CAACuL,MAAOgjK,EAAiB5uK,UAG7BpJ,IAAAA,cAAC+2K,GAAe,CACZzQ,QAASA,EACTiM,QAASyF,EACT/4K,KAAMA,EACNkE,OAAQA,EACR6zK,iBAAkBxtK,EAAc,CAC5BzS,GAAI,yCACJ0S,eAAgB,+BAEpBwtK,gBAAiB,CACbr1K,MAAO4H,EAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,oBAC/E6F,QAASoqK,QAMlB,C,kSCtShB,SAASkB,EAA8BvnK,GAC1C,MAAO,CAAChd,EAAUsf,MACVs7B,EAAAA,EAAAA,IAAat7B,IAAYtC,EAAKtc,KAC9BV,GAAS4nB,EAAAA,EAAAA,OAGb,MAAM48J,EAAW,GAAHl6K,OAAMwmE,EAAAA,GAAgBG,eAAa3mE,OAAG0S,EAAKtc,IAKzD,OAJI+jL,EAAAA,EAAAA,IAAcnlK,IAAYklK,EAAU,OACpCxkL,GAASmxE,EAAAA,EAAAA,IAAYqzG,EAAUxnK,EAAKG,WAAYH,EAAKtc,KAGlDV,GAAS0kL,EAAAA,EAAAA,IAAW1nK,GAAM,CAEzC,C,6HC3BA,QCUe,WACX,MAAM,cAAC7J,IAAiBgQ,EAAAA,EAAAA,WAElBwhK,GAA4BjkI,EAAAA,EAAAA,aAAYoqB,EAAAA,IAE9C,IAAK65G,EAA0BnvK,KAC3B,OAAO,KAGX,MAAMuG,EAAY4oK,EAA0B3nK,KAAKG,WAC3CrB,EAAW6oK,EAA0B55G,MAAQle,EAAAA,GAAUC,YAAcD,EAAAA,GAAUwvB,OAC/El8D,EAASwkK,EAA0B3nK,KAAKI,SAAWunK,EAA0B3nK,KAAKtc,IAAM,GACxFgrE,EAAa,GAAHphE,OAAMwmE,EAAAA,GAAgB8zG,YAAUt6K,OAAGq6K,EAA0B3nK,KAAKtc,IAElF,OACIiJ,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAC4hE,EAAAA,EAAkB,CACfzvD,SAAUA,EACVC,UAAWA,EACXuX,OAAQnT,EACRi0C,cAAc,EACdsX,WAAYA,EACZ19D,YAAamF,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,uBAItF,E,oOClCe,MAAMyxK,WAAyBC,GAAAA,EACnCvjG,IAAAA,CAAKzhC,EAAcjoC,EAAe1D,GACrC,IAAI4wK,EAAUjlI,GAETklI,EAAAA,GAAAA,IAAUllI,KACXilI,EAAU,UAAHz6K,OAAay6K,IAGxB,IAAIE,EAAS,yCAAH36K,OAA4Cy6K,EAAO,qBAQ7D,OANIltK,IACAotK,GAAU,WAAaptK,EAAQ,KAGnCotK,GAAU,IAAJ36K,OAAQ6J,EAAI,QAEX8wK,CACX,E,mDCTJ,MAUMrzK,GAAkB,CACpBE,kBAAkB,EAClBozK,UAAU,EACVlf,qBAAsB,IAYpBmf,GAAerjL,IAOR,IAPS,OAClB4hB,EAAM,aACN0hK,EAAY,SACZp0K,EAAQ,MACRuuG,EAAK,gBACL8lE,EAAe,uBACfC,GACIxjL,EACJ,MAAMyjL,GAAoBniK,EAAAA,EAAAA,cAAata,GAAMs8K,EAAat8K,EAAG4a,EAAOhc,UAAU,CAACgc,EAAOhc,QAAS09K,IAC/F,IAAII,EAEJ,GAAI9hK,EAAO3M,MAAO,CACd,MAAM0uK,EArCWlmE,KACd,CACHmmE,KAAM,UACNC,QAAS,UACTz4D,OAAQ3N,EAAMqmE,eACdlnH,QAAS6gD,EAAM4oD,mBACfx6C,QAASpO,EAAMsmE,SACfzlL,QAAS,YA8Ba0lL,CAAgBvmE,GACtCimE,GACIlJ,EAAAA,EAAAA,IAAoBmJ,EAAe/hK,EAAO3M,SAC1CulK,EAAAA,EAAAA,IAAoB/8D,EAAO77F,EAAO3M,QACjC2M,EAAO3M,MAAMwkI,MAAM,+BAAiC73H,EAAO3M,KACpE,CAEA,OACIpN,IAAAA,cAACo8K,GAAS,CACN,iBAAgBriK,EAAOhjB,GACvB,qBAAoBgjB,EAAOwc,OAC3BlvB,SAAUA,EACV3J,IAAKqc,EAAOhjB,GACZuY,QAASssK,EACT37K,UAAU,aACV47K,SAAUA,GAEV77K,IAAAA,cAACs1K,GAAAA,EAAc,CACXtpK,QAAS0vK,EACTlxK,KAAMmxK,GAEN37K,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAAS2a,EAAO5Z,KAChBpC,QAASkK,MAGT,EAElBuzK,GAAAnzK,UAAA,CA/CEozK,aAAY31K,IAAAA,KAAAC,WACZsB,SAAQvB,IAAAA,KAER41K,gBAAe51K,IAAAA,KACf61K,uBAAsB71K,IAAAA,QA8C1B,MAAMs2K,GAAYv6H,KAAAA,OAAaC,WAAA,CAAAt7C,YAAA,aAAbq7C,CAAa,SACzBjkD,IAAA,IAAC,SAACi+K,GAASj+K,EAAA,OAAKi+K,IAAYxlH,EAAAA,GAAAA,KAAG,8IACTgmH,EAAAA,GAAAA,GAAcR,EAAU,KACnCA,GAEeQ,EAAAA,GAAAA,GAAcR,EAAU,MAGxBQ,EAAAA,GAAAA,GAAcR,EAAU,KAEnD,IAGL,IAAetsH,EAAAA,EAAAA,MAAKisH,IC/EpB,IAAe1zK,EAAAA,EAAAA,UANf,SAAyBxP,GACrB,MAAO,CACHs9G,OAAOC,EAAAA,EAAAA,IAASv9G,GAExB,GAEA,CAAwCkjL,I,oDCTxC,MAQA,GARoBx7K,IAAAA,cAAsC,CAKtDs8K,kBAAmB,O,wCCaR,MAAMC,WAAmBv8K,IAAAA,cAGpCsC,WAAAA,CAAY5C,G,UACR6C,MAAM7C,G,EAAO,K,EAwCCwG,IAAuB,IAAAs2K,EACrC,IAAKt2K,EACD,OAGJ,MAAM,OAAC6T,GAAUrX,KAAKhD,MAEtB,IAAI8D,EAAQ,GACRgH,EAAO,GACX,GAA2B,UAAvBuP,EAAO8gI,YAAyB,CAChC,MAAMz3I,EAAO8C,EACbsE,EAAOpH,EAAK7C,SACZiD,EAAQJ,EAAKrM,EACjB,MAAO,GAA2B,aAAvBgjB,EAAO8gI,YAA4B,CAC1C,MAAMj3I,EAAUsC,EAChBsE,EAAO5G,EAAQ/D,aACf2D,EAAQI,EAAQ7M,EACpB,KAAO,CACH,MAAMoP,EAASD,EACfsE,EAAOrE,EAAOqE,KACdhH,EAAQ2C,EAAO3C,KACnB,CAEAd,KAAKhD,MAAM22B,2BACP3zB,KAAKhD,MAAMiqB,OAAQjnB,KAAKhD,MAAMqa,OAAOhjB,IAAM,GAAI2L,KAAKhD,MAAMqa,OAAOwc,QAAU,GAAqB,QAAnBimJ,EAAE95K,KAAKhD,MAAMqa,cAAM,IAAAyiK,OAAA,EAAjBA,EAAmB3hC,YAAarwI,EAAMhH,GAEzHd,KAAKgH,SAAS,CAAClG,MAAOgH,GAAM,G,kSAlEf,qB,wFAEb,MAAMuP,EAASra,EAAMqa,OAYrB,IAAI7T,EAXJxD,KAAK+lG,UAAY,GACb1uF,IAC2B,UAAvBA,EAAO8gI,YACPn4I,KAAK+lG,UAAY,CAAC,IAAI8wC,GAAAA,EAAoB75I,EAAMsD,oBAClB,aAAvB+W,EAAO8gI,YACdn4I,KAAK+lG,UAAY,CAAC,IAAI+wC,GAAAA,EAAuB95I,EAAMiE,uBAC5CoW,EAAOhc,UACd2E,KAAK+lG,UAAY,CAAC,IAAIixC,GAAAA,EAAmB3/H,EAAOhc,YAKxD,IAAIyF,EAAQ,GAERuW,EAAO0iK,gBAAkB1iK,EAAOhc,UAChCmI,EAAW6T,EAAOhc,QAAQoN,MAAMhF,GAAWA,EAAO3C,QAAUuW,EAAO0iK,iBACnEj5K,EAAQ0C,EAAWA,EAASsE,KAAO,IAGvC9H,KAAKpK,MAAQ,CACT4N,SAAAA,EACA1C,MAAAA,EAER,CAEA,+BAAOS,CAAyBvE,EAAcpH,GAC1C,OAAIoH,EAAMwG,UAAYxG,EAAMwG,WAAa5N,EAAM4N,SAEpC,CACH1C,MAFa9D,EAAMwG,SAEHsE,KAChBtE,SAAUxG,EAAMwG,UAIjB,IACX,CA+BAP,MAAAA,GACI,MAAM,OAACoU,EAAM,SAAE1S,GAAY3E,KAAKhD,MAEhC,OACIM,IAAAA,cAAC08K,GAAYC,SAAQ,MAChBxkL,IAAA,IAAC,kBAACmkL,GAAkBnkL,EAAA,OACjB6H,IAAAA,cAACmoG,GAAAA,EAAoB,CACjBM,UAAW/lG,KAAK+lG,UAChBL,WAAY1lG,KAAK6E,eACjBlD,YAAa0V,EAAO5Z,KACpByoG,eAAe,2BACfplG,MAAOd,KAAKpK,MAAMkL,MAClBglG,YAAa8zE,EACbj1K,SAAUA,GACZ,GAIlB,ECpFJ,MAAMuiD,GAAqB,CACvBvzB,2BAA0B,MAC1B1yB,qBAAoB,MACpBX,kBAAiBA,GAAAA,IAOrB,IAJkB8E,EAAAA,EAAAA,UAflB,SAAyBxP,EAAoB2hC,GAAoB,IAAA2iJ,EAC7D,MAAM75K,EAAUzK,EAAM8kD,MAAMv0B,MAAMg0J,YAAY5iJ,EAAStQ,QAGvD,MAAO,CACHzjB,SAH6B,QAAhB02K,EAAC3iJ,EAASlgB,cAAM,IAAA6iK,GAAfA,EAAiB7lL,IAAM47K,EAAAA,EAAAA,IAAoB5vK,EAASk3B,EAASlgB,OAAOhjB,SAAMiE,EAKhG,GAQ2C4uD,GAI3C,CAAyB2yH,I,0ZC6BV,MAAMO,WAA0B98K,IAAAA,cAI3CsC,WAAAA,CAAY5C,GAAc,IAAAoJ,EACtBvG,MAAM7C,GAAMoJ,EAAApG,KAAAF,GAAA,gBAJE,GAAKA,GAAA,kBACF,CAAC,GAACA,GAAA,wCAyBWrK,IAAgC,IAA/B,OAACmW,GAAyBnW,EACzD,MAAM,WAAC4kL,GAAcr6K,KAAKhD,MACrBq9K,EAAWC,aAGXrK,EAAAA,EAAAA,IAAoBjwK,KAAKhD,MAAMq9J,eAAgBggB,EAAWC,YAC3Dt6K,KAAKu6K,qBAAqB3uK,GAC9B,IACH9L,GAAA,wCAEiC5E,IAAgC,IAA/B,OAAC0Q,GAAyB1Q,EACzD,MAAM,WAACm/K,GAAcr6K,KAAKhD,MACrBq9K,EAAWG,aAGXvK,EAAAA,EAAAA,IAAoBjwK,KAAKhD,MAAMq9J,eAAgBggB,EAAWG,YAC3Dx6K,KAAKu6K,qBAAqB3uK,GAC9B,IACH9L,GAAA,6BAEuB8L,IACf5L,KAAKi6G,SAINruG,EAAS,GACT5L,KAAKy6K,mBACT,IACH36K,GAAA,0BAEmB,KAIhBE,KAAKgH,UAAUvF,IACJ,CAACi5K,cAAej5K,EAAUi5K,cAAgB,KACnD,IACL56K,GAAA,0BAEmB,KAChB,MAAMO,EAAUL,KAAKhD,MAAMq9K,WAAWh6K,QACtC,IAAKA,IAAYA,EAAQqG,OACrB,MAAO,GAGX,MAAMgzF,EAAU,GAkChB,OAhCAr5F,EAAQ2F,SAASqR,IACRA,EAAOhjB,IAAOgjB,EAAO5Z,OAKrB,WADG4Z,EAAO7e,KAEXkhG,EAAQpqF,KACJhS,IAAAA,cAACu8K,GAAU,CACP7+K,IAAKqc,EAAOhjB,GACZ4yB,OAAQjnB,KAAKhD,MAAMiqB,OACnB5P,OAAQA,EACR1S,SAAU0S,EAAO1S,YAMzB+0F,EAAQpqF,KACJhS,IAAAA,cAACw7K,GAAY,CACT99K,IAAKqc,EAAOhjB,GACZgjB,OAAQA,EACR1S,SAAU0S,EAAO1S,SACjBo0K,aAAc/4K,KAAK+4K,aACnBC,gBAAiBh5K,KAAKpK,MAAMojL,gBAC5BC,uBAAwBj5K,KAAKpK,MAAMqjL,6BAA0B3gL,KAIzE,IAIAgF,IAAAA,cAAA,OACIC,UAAU,sBAETm8F,EACC,IAEb55F,GAAA,qBAEc,CAACrD,EAAqBk+K,KACjCl+K,EAAEyK,iBAEF,MAAM+xK,EAAyBj5K,KAAK46K,gBAAgBD,EAAe,0BAC/D1B,GACAj5K,KAAKgH,SAAS,CAACgyK,iBAAiB,EAAMC,uBAAwBA,EAAuBn4K,QAGzF,MAAM+5K,EAAc76K,KAAK46K,gBAAgBD,EAAe,gBACpDE,IACAh/K,EAAAA,EAAAA,IAAW,QAAS,2BAA4B,CAACi/K,OAAQD,EAAY/5K,QAGzE,MAAM8yB,EAAWn3B,EAAEmkI,cAAcuhB,aAAa,mBAAqB,GAC7D44B,EAAet+K,EAAEmkI,cAAcuhB,aAAa,uBAAyB,GAE3EniJ,KAAKhD,MAAMqD,QAAQ26K,uBAAuBh7K,KAAKhD,MAAMiqB,OAAQ2M,EAAUmnJ,GAAcvxK,MAAK,KACtFxJ,KAAKi7K,oBAAoBN,GACrB1B,GACAj5K,KAAKgH,SAAS,CAACgyK,iBAAiB,EAAOC,uBAAwB,MACnE,GACF,IACLn5K,GAAA,4BAEsB66K,IACnB,MAAMO,EAAel7K,KAAK46K,gBAAgBD,EAAe,uBACzD,GAAIO,EAAc,CACd,MAAMC,EAAgBzlK,KAAKC,MAAMulK,EAAap6K,OAC9CkO,OAAOS,SAASgkC,KAAO,UAAY0nI,EAAcC,eAAiB,OAASD,EAAcE,QAAU,YAAc33B,mBAAmBy3B,EAAcG,cAAgB,SAAW53B,mBAAmBy3B,EAAcI,UAClN,KACHz7K,GAAA,wBAEiB,CAAC66K,EAA+Ca,KAC9D,IAAIC,EAAM,KAIV,OAHId,IACAc,EAAMd,EAAclyK,MAAMhF,GAAWA,EAAOqE,OAAS0zK,KAElDC,CAAG,IACb37K,GAAA,uBAEgB,KACb,MAAMiG,EAAS/F,KAAKhD,MAAMq9K,WAAWt0K,OACrC,IAAKA,IAAWA,EAAOW,OACnB,MAAO,GAGX,MAAMg1K,EAAc,GAEpB,IAAIC,EAAa,GACbC,EAAW,GACXC,EAAS,EACTC,GAAc,EACdC,EAAW,EACf,MAAMlD,EAAW,CAACA,UAAU,EAAOpzK,kBAAkB,EAAOo1J,YAAY,GAyExE,OAvEA90J,EAAOC,SAAQ,CAAC7F,EAAOu/B,MACJ,IAAXm8I,IAAkC,IAAhB17K,EAAM67K,OAAmBF,KAC3CJ,EAAYpsK,KACRhS,IAAAA,cAAA,SACIC,UAAU,oBACVvC,IAAK,sBAAwB+gL,GAE7Bz+K,IAAAA,cAAA,aACIA,IAAAA,cAAA,UACKq+K,IAGTr+K,IAAAA,cAAA,aACIA,IAAAA,cAAA,UACKs+K,MAKjBD,EAAa,GACbC,EAAW,GACXC,EAAS,EACTE,GAAY,EACZD,GAAc,GAElBH,EAAWrsK,KACPhS,IAAAA,cAAA,MACIC,UAAU,4BACVvC,IAAK,6BAA+B0kC,EAAI,KAAOq8I,GAE/Cz+K,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAASyD,EAAMqL,MACfnQ,QAASw9K,EACT5xJ,OAAQjnB,KAAKhD,MAAMiqB,WAK/B20J,EAAStsK,KACLhS,IAAAA,cAAA,MACIC,UAAU,mBACVvC,IAAK,qBAAuB0kC,EAAI,KAAOq8I,GAEvCz+K,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAAS4oE,OAAOnlE,EAAMW,OACtBmmB,OAAQjnB,KAAKhD,MAAMiqB,WAI/B40J,GAAU,EACVC,KAAgC,IAAhB37K,EAAM67K,MAAe,IAErCL,EAAWj1K,OAAS,GACpBg1K,EAAYpsK,KACRhS,IAAAA,cAAA,SACIC,UAAU,oBACVvC,IAAK,sBAAwB+gL,GAE7Bz+K,IAAAA,cAAA,aACIA,IAAAA,cAAA,UACKq+K,IAGTr+K,IAAAA,cAAA,aACIA,IAAAA,cAAA,UACKs+K,MAOjBt+K,IAAAA,cAAA,WACKo+K,EACC,IAEb57K,GAAA,iCAE2BrD,GAAkByB,EAAAA,GAA+BzB,EAAGuD,KAAKhD,MAAMi/K,0BAAuBn8K,GAAA,gCAEvFzB,IACvB,MAAM4N,EAAQ5N,EAAI69K,YAAY,KAC9B,OAAOjwK,EAAQ,EAAI5N,EAAIuuB,UAAU3gB,EAAQ,GAAK,IAAI,IACrDnM,GAAA,kBAEW,SAACrD,GAA8E,IAAdy4E,EAAI3xE,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAChF9G,EAAEyK,iBAEF,MAAMqjI,EAAYnkI,EAAK+1K,wBAAwBjnG,GAE/C9uE,EAAKpJ,MAAMqD,QAAQ8P,UAAU,CACzBC,QAASC,EAAAA,GAAiBs/H,mBAC1Bp/H,WAAYq/H,EAAAA,EACZp/H,YAAa,CACTyW,OAAQ7gB,EAAKpJ,MAAMiqB,OACnBwE,UAAW,CAAC,CACR++G,mBAAmB,EACnBt1D,OACAq1D,UAAWA,QAAAA,EAAa,GACxB9sI,KAAMy3E,IAEV26D,WAAY,IAGxB,IA3QI7vI,KAAKpK,MAAQ,CACT8kL,cAAe,EACf1B,iBAAiB,EACjBC,uBAAwB,MAG5Bj5K,KAAKw6J,WAAa,CACdrpB,cAAenxI,KAAKu6K,qBACpB6B,qBAAsBp8K,KAAKy6K,kBAEnC,CAEAliI,iBAAAA,GACIv4C,KAAKi6G,SAAU,CACnB,CAEA38C,oBAAAA,GACIt9D,KAAKi6G,SAAU,CACnB,CA2PAh3G,MAAAA,GACI,MAAM,WAACo3K,EAAU,QAAEh/K,GAAW2E,KAAKhD,MACnC,IAEIq/K,EAFAC,EAAe,GAGfjC,EAAWkC,UACXD,EAAe,sBACfD,EACI/+K,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAAS29K,EAAWkC,QACpBt1J,OAAQjnB,KAAKhD,MAAMiqB,WAMnC,IA4CIzb,EAgCAgxK,EAmBAltB,EAwBAtpD,EAgCAy2E,EAvJAC,EAAS,GAgGb,IA/FIrC,EAAWsC,aAAetC,EAAWuC,eACjCvC,EAAWuC,aACXF,EAAOptK,KACHhS,IAAAA,cAACssI,EAAAA,EAAa,CACV5uI,IAAK,0BACL6Q,IAAKwuK,EAAWuC,YAChB5yC,eAAeimC,EAAAA,EAAAA,IAAoBjwK,KAAKhD,MAAMq9J,eAAgBggB,EAAWuC,eAEvE5kC,GACE16I,IAAAA,cAAA,OACIoO,IAAK,yBACLnO,UAAU,0BACVsO,IAAKmsI,EACLpsI,OAAO,KACPD,MAAM,UAMtB0uK,EAAWsC,aACXD,EAAOptK,KACHhS,IAAAA,cAAA,QACIC,UAAU,0BACVvC,IAAK,2BAEJq/K,EAAWsC,eAKxBtC,EAAWwC,cAAextJ,EAAAA,GAAAA,IAAUgrJ,EAAWwC,eAC/CH,EAAS,CACLp/K,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAM4mI,EAAWwC,YACjB7hL,IAAK,0BACLyU,SAAS,sBAERitK,KAMTrC,EAAW7uK,QAEPA,EADA6uK,EAAWyC,aAAcztJ,EAAAA,GAAAA,IAAUgrJ,EAAWyC,YAE1Cx/K,IAAAA,cAAA,MAAIC,UAAU,qBACVD,IAAAA,cAAC03C,EAAAA,EAAY,CACTz3C,UAAU,yBACVk2C,KAAM4mI,EAAWyC,WACjBrtK,SAAS,sBAER4qK,EAAW7uK,QAMpBlO,IAAAA,cAAA,MAAIC,UAAU,qBACVD,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAAS29K,EAAW7uK,MACpBnQ,QAAS,CACLw/J,YAAY,EACZp1J,kBAAkB,EAClBmuI,SAAU,IAAI4kC,GACd7e,qBAAsB,IAE1B1yI,OAAQjnB,KAAKhD,MAAMiqB,WAQnCozJ,EAAWvyK,OACX00K,EACIl/K,IAAAA,cAACy/K,EAAAA,EAAQ,CACLrC,cAAe16K,KAAKpK,MAAM8kL,cAC1BsC,kBAAkB,EAClBl1K,KAAMuyK,EAAWvyK,KACjB+oE,UAAW,KAEXvzE,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAAS29K,EAAWvyK,MAAQ,GAC5BzM,QAASA,EACT4rB,OAAQjnB,KAAKhD,MAAMiqB,OACnBuzI,WAAYx6J,KAAKw6J,eAO7B6f,EAAWG,UAAW,CACtB,MAAMxwC,GAAgBimC,EAAAA,EAAAA,IAAoBjwK,KAAKhD,MAAMq9J,eAAgBggB,EAAWG,WAEhFlrB,EACIhyJ,IAAAA,cAAA,OAAKC,UAAU,+BACXD,IAAAA,cAACssI,EAAAA,EAAa,CACV/9H,IAAKwuK,EAAWG,UAChBxwC,cAAeA,IAEbizC,GACE3/K,IAAAA,cAAC4zI,EAAAA,EAAc,CACX3zI,UAAU,oBACV4zI,cAAenxI,KAAKk9K,gCACpBrxK,IAAKoxK,EACLjtC,WAAYhG,EACZp9H,QAAS5M,KAAKwoF,cAMtC,CAGA,GAAI6xF,EAAWr0E,OAAQ,CACnB,IAAIm3E,EACJ,GAAI9C,EAAW+C,YAAa,CACxB,MAAMC,GAAqBpN,EAAAA,EAAAA,IAAoBjwK,KAAKhD,MAAMq9J,eAAgBggB,EAAW+C,aAErFD,EACI7/K,IAAAA,cAACssI,EAAAA,EAAa,CACV/9H,IAAKwuK,EAAW+C,YAChBpzC,cAAeqzC,IAEbC,GACEhgL,IAAAA,cAAA,OACIoO,IAAK,yBACLnO,UAAU,0BACVsO,IAAKyxK,EACL1xK,OAAO,KACPD,MAAM,QAK1B,CAEAq6F,EACI1oG,IAAAA,cAAA,OAAKC,UAAU,gCACV4/K,EACD7/K,IAAAA,cAAA,YAAOigL,IAASlD,EAAWr0E,OAAQ,CAACt/F,OAAQqc,EAAAA,GAAUy6J,6BAA8BC,SAAU,OAG1G,CAGA,GAAIpD,EAAWC,UAAW,CACtB,MAAMoD,GAAgBzN,EAAAA,EAAAA,IAAoBjwK,KAAKhD,MAAMq9J,eAAgBggB,EAAWC,WAEhFmC,EACIn/K,IAAAA,cAAA,OAAKC,UAAU,+BACXD,IAAAA,cAACssI,EAAAA,EAAa,CACV/9H,IAAKwuK,EAAWC,UAChBtwC,cAAe0zC,IAEbC,GACErgL,IAAAA,cAAC4zI,EAAAA,EAAc,CACXC,cAAenxI,KAAK49K,gCACpB/xK,IAAK8xK,EACL3tC,WAAY0tC,MAMpC,CAEA,MAAM33K,EAAS/F,KAAK69K,iBACdx9K,EAAUL,KAAK89K,oBAErB,IAAIC,EACA1D,EAAW1tH,OAAiC,MAAxB0tH,EAAW1tH,MAAM,KACrCoxH,EAAiB,CAACC,gBAAiB3D,EAAW1tH,QAGlD,MAAMsxH,EAAavB,EAAOh2K,OAAS,GAAKmD,QAAQ2B,IAAU3B,QAAQ4yK,IAAU5yK,QAAQ2yK,IAAmB3yK,QAAQylJ,IAAUzlJ,QAAQ9D,IAAW8D,QAAQm8F,IAAWn8F,QAAQxJ,GAEvK,OACI/C,IAAAA,cAAA,OACIC,UAAW,cAAgB++K,EAC3B1vK,QAAS5M,KAAKk+K,0BAEb7B,EAEG4B,GACA3gL,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OACIC,UAAWwgL,EAAiB,iCAAmC,yDAA2D1D,EAAW1tH,MACrIjiD,MAAOqzK,GAENrB,EACAlxK,EACDlO,IAAAA,cAAA,WACIA,IAAAA,cAAA,OACIC,UAAWk/K,EAAQ,mBAAqB,+CAEvCD,EACAltB,EACAvpJ,EACAigG,EACA3lG,GAEJo8K,EACDn/K,IAAAA,cAAA,OAAKoN,MAAOA,GAAMs7F,YAO9C,EAGJ,MAAMt7F,GAAQ,CACVs7F,OAAQ,CAACu2D,MAAO,SC3iBpB,IAAen3J,EAAAA,EAAAA,UAdf,SAAyBxP,GACrB,MAAO,CACHqmL,wBAAwBr5J,EAAAA,EAAAA,IAA0BhtB,GAE1D,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB01K,uBAAsB,KAAE7qK,UAASA,EAAAA,GAClCxc,GAEX,GAEA,CAA4DymL,ICKtD+D,GAA4C,CAAC,EAE7CC,GAAwB3oL,IAAA,IAAC,eAC3B4kK,EAAiB8jB,GAAc,YAC/BE,EAAW,OACXp3J,EAAM,QACN5rB,GACI5F,EAAA,OACJ6H,IAAAA,cAAA,OACIjJ,GAAE,yBAAA4J,OAA2BgpB,GAC7B1pB,UAAU,oBAET8gL,EAAY19K,KAAI,CAAC05K,EAAY36I,IAC1BpiC,IAAAA,cAAC88K,GAAiB,CACdC,WAAYA,EACZpzJ,OAAQA,EACRjsB,IAAK,OAAS0kC,EACdrkC,QAASA,EACTg/J,eAAgBA,MAGtB,EACR+jB,GAAAz4K,UAAA,CAxCEshB,OAAM7jB,IAAAA,OAAAC,WAKNg7K,YAAWj7K,IAAAA,MAAAC,YAqCf,UAAewpD,EAAAA,EAAAA,MAAKuxH,I,gBC/BpB,MCPA,IAFkBh5K,EAAAA,EAAAA,SAAQ,MAR1B,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAASA,EAAAA,GACVxc,GAEX,GAIA,EDOkB8B,IAKI,IALH,cACfu0I,EAAa,KACb90D,EAAI,KACJvkE,EAAI,QACJtQ,GACa5K,EACb,MAAM,UAAC0a,GAAa9P,EACdmoF,GAAYzxE,EAAAA,EAAAA,cAAY,SAC1Bta,GAEC,IADDy4E,EAAI3xE,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAEP9G,EAAEyK,iBAEFiJ,EAAU,CACNC,QAASC,EAAAA,GAAiBs/H,mBAC1Bp/H,WAAYq/H,EAAAA,EACZp/H,YAAa,CACTG,OACAk/H,WAAY,EACZpkH,UAAW,CACP,CACI++G,mBAAmB,EACnBt1D,OACAq1D,UAAWP,EAAct/C,OACzBjtF,KAAMy3E,MAK1B,GAAG,CAAC/kE,EAAW65H,EAAct/C,OAAQ/5E,IAErC,OACIrT,IAAAA,cAAA,OAAKC,UAAU,yBACXD,IAAAA,cAACssI,EAAAA,EAAa,CACV/9H,IAAKqpE,EACL80D,cAAeA,IAEbs0C,GACEhhL,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAC4zI,EAAAA,EAAc,CACX3zI,UAAU,4CACVsO,IAAKyyK,EACLtuC,WAAYhG,EACZqH,YAAY,EACZzkI,QAAS47E,OAKvB,I,kCE1EP,MAAM+1F,GAAU,4K,0ZCqBR,MAAMC,WAAqBlhL,IAAAA,cACtCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,aAcV,KACHE,KAAKgH,SAAS,CAACy3K,SAAS,GAAM,IACjC3+K,GAAA,aAEM,KACHE,KAAKgH,SAAS,CAACy3K,SAAS,GAAO,IAjB/Bz+K,KAAKpK,MAAQ,CACT6oL,SAAS,EAEjB,CAEA,+BAAOl9K,CAAyBvE,EAAcpH,GAC1C,OAAKoH,EAAMmM,MAAQvT,EAAM6oL,QACd,CAACA,SAAS,GAEd,IACX,CAUAx7K,MAAAA,GACI,MAAM,SAAC+mB,EAAQ,KAAEkrD,GAAQl1E,KAAKhD,MAExB0hL,EDjBP,SAAoBxpG,GACvB,MAAMg6D,EAAQh6D,EAAKroD,OAAOqiH,MAAMqvC,IAChC,OAAKrvC,GAA6B,KAApBA,EAAM,GAAGxoI,OAIhBwoI,EAAM,GAHF,IAIf,CCUwByvC,CAAWzpG,GACrB0pG,GAAa50J,aAAQ,EAARA,EAAUxe,QAAS,UAChCka,EDhDP,SAA2BwvD,GAAc,IAAA2pG,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC5C,MAEMx5J,EAAOwvD,EAAKg6D,MAFA,qEAGlB,GAAKxpH,UAAAA,EAAO,GACR,MAAO,GAGX,MAAMooG,EAAmC,QAA9B+wD,EAAU,QAAVC,EAAGp5J,EAAK,UAAE,IAAAo5J,OAAA,EAAPA,EAAS5vC,MAAM,oBAAY,IAAA2vC,EAAAA,EAAI,KACvC9wD,EAAqC,QAA9BgxD,EAAU,QAAVC,EAAGt5J,EAAK,UAAE,IAAAs5J,OAAA,EAAPA,EAAS9vC,MAAM,oBAAY,IAAA6vC,EAAAA,EAAI,KACzCv1D,EAAsC,QAA/By1D,EAAU,QAAVC,EAAGx5J,EAAK,UAAE,IAAAw5J,OAAA,EAAPA,EAAShwC,MAAM,qBAAa,IAAA+vC,EAAAA,EAAI,KAEhD,IAAIE,EAAe,EAcnB,OAZIrxD,SAAAA,EAAQ,KACRqxD,GAAyC,KAAzB53H,SAASumE,EAAM,GAAI,KAGnCC,SAAAA,EAAU,KACVoxD,GAA2C,GAA3B53H,SAASwmE,EAAQ,GAAI,KAGrCvE,SAAAA,EAAU,KACV21D,GAAgB53H,SAASiiE,EAAQ,GAAI,KAGlC,UAAPvrH,OAAiBkhL,EACrB,CCqBqBC,CAAkBlqG,GAEzBtrE,EACFtM,IAAAA,cAAA,UACIA,IAAAA,cAAA,QAAMC,UAAU,cAAc,cAC9BD,IAAAA,cAAA,QAAMC,UAAU,eACZD,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAMzzC,KAAKhD,MAAMk4E,KACjBzlE,SAAS,iBAERmvK,KAMjB,IAAIllF,EAEJ,GAAI15F,KAAKpK,MAAM6oL,QACX/kF,EACIp8F,IAAAA,cAAA,UACIuO,IAAK,iCAAmC6yK,EAAU,kEAAoEh5J,EACtH/Z,MAAM,QACNC,OAAO,QACPyzK,YAAY,IACZC,iBAAiB,EACjBC,MAAM,sGACNC,eAAgBx/K,KAAKhD,MAAMyiL,sBAAwB,kCAAoC,cACvFj0K,MAAOozK,EACPc,QAAQ,wEAGb,CACH,MAAMpwB,EAAQtlI,aAAQ,EAARA,EAAU21J,OAAO,GAE/BjmF,EACIp8F,IAAAA,cAAA,OAAKC,UAAU,2CACXD,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAACssI,EAAAA,EAAa,CAAC/9H,KAAKyjJ,aAAK,EAALA,EAAOswB,cAActwB,aAAK,EAALA,EAAOjxJ,MAAO,KACjDwhL,GACEviL,IAAAA,cAAA,OACIuO,IAAKg0K,EACLn0K,IAAI,0BACJnO,UAAU,sBAItBD,IAAAA,cAAA,OAAKC,UAAU,SACXD,IAAAA,cAAA,QAAMC,UAAU,eAAcD,IAAAA,cAAA,gBAKlD,CAEA,OACIA,IAAAA,cAAA,OACIC,UAAU,yBAEVD,IAAAA,cAAA,WACKsM,EACDtM,IAAAA,cAAA,OACIC,UAAU,kCACVqP,QAAS5M,KAAK8/K,MAEbpmF,IAKrB,CAEA,oBAAcqmF,CAAc7qG,GACxB,OAAOrrE,QAAQqrE,EAAKroD,OAAOqiH,MAAMqvC,IACrC,EACHz+K,GAxGoB0+K,GAAY,aAX7Bv3J,OAAM7jB,IAAAA,OAAAC,WACN6xE,KAAI9xE,IAAAA,OAAAC,WACJ8F,KAAI/F,IAAAA,KAAAC,WAEJo8K,sBAAqBr8K,IAAAA,OCazB,UAAegC,EAAAA,EAAAA,UAZf,SAAyBxP,EAAoB2hC,GACzC,MAAMt/B,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GAEzB,MAAO,CACH8iB,kBAAkBC,EAAAA,EAAAA,IAAoB/iB,GACtCoqL,mBAAoB/nL,EAAOgoL,mBAC3B/1C,cAAwC,SAAzBjyI,EAAOmyI,cACtBpgH,UAAUk2J,EAAAA,EAAAA,IAA2BtqL,EAAO2hC,EAAStQ,OAAQsQ,EAAS29C,MACtEuqG,sBAAwD,SAAjCxnL,EAAOkoL,sBAEtC,GAEA,CAAwC3B,I,oeCOxC,MAAM4B,WAAsB9iL,IAAAA,cACxBsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,oBAMHjM,UACV,MAAM,QAACqa,EAAO,KAAEyC,EAAI,KAAE9J,GAAQ7G,KAAKhD,MAEnC,IAAIivC,EAAS,GACb,MAAM,KAACh4C,SAAc+L,KAAKhD,MAAMqD,QAAQmiB,WAAW7R,EAAKG,YACpD7c,IAEAg4C,EADgBh4C,EACC6jB,SAGrB,MAAM1K,GAAUkkK,EAAAA,GAAAA,IACZpjK,EAAQskK,OACRpB,GAAAA,GAAoBiP,QAAU,IAAMnyK,EAAQuB,SAC5CkB,EAAKG,WACLm7B,EACAt7B,EAAKtc,GACLsc,EAAKI,SAGT/Q,KAAKgH,SAAS,CAACs5K,WAAW,IAC1B,MAAM74K,QAAYzH,KAAKhD,MAAMqD,QAAQ4N,mBAAmBC,EAASd,EAASvG,GAG1E,GAFA7G,KAAKgH,SAAS,CAACs5K,WAAW,IAEtB74K,EAAIzT,MAAO,CACX,MAAM4T,EAAgBH,EAAIzT,MACpB6T,EAAeD,EAAcE,MAAQjB,EAAKC,cAAc,CAC1DzS,GAAI,qBACJ0S,eAAgB,4BAGpB,YADA/G,KAAKhD,MAAMqD,QAAQoQ,iCAAiC7I,EAAeC,EAAc8I,EAErF,CAEA,MAAM/H,EAAWnB,EAAIxT,KACrB,OAAQ2U,EAASpQ,MACjB,KAAK4P,GAAAA,GAAqBE,GAClBM,EAASd,MACT9H,KAAKhD,MAAMqD,QAAQoQ,iCAAiC7H,EAAUA,EAASd,KAAM6I,GAEjF,MACJ,KAAKvI,GAAAA,GAAqBG,SAEtB,MACJ,KAAKH,GAAAA,GAAqBC,KAClBO,EAAS/C,MACT7F,KAAKhD,MAAMqD,QAAQ6P,cAActH,EAAS/C,KAAMuH,GAEpD,MACJ,QAAS,CACL,MAAMvF,EAAehB,EAAKC,cAAc,CACpCzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAMoQ,EAASpQ,OAEnBwH,KAAKhD,MAAMqD,QAAQoQ,iCAAiC7H,EAAUf,EAAc8I,EAChF,EACA,IA9DA3Q,KAAKpK,MAAQ,CACT0qL,WAAW,EAEnB,CA8DAr9K,MAAAA,GAAS,IAAAs9K,EAAAC,EACL,MAAM,QAACtyK,GAAWlO,KAAKhD,MAEvB,KAAKkR,EAAQxG,QAAuB,QAAb64K,EAACryK,EAAQrI,YAAI,IAAA06K,GAAZA,EAAc74K,QAAuB,QAAb84K,EAACtyK,EAAQrI,YAAI,IAAA26K,GAAZA,EAAc9yK,QAC3D,OAAO,KAGX,MAAMxO,EAAQgP,EAAQhP,OAASgP,EAAQuB,SACvC,OAAKvQ,EAKD5B,IAAAA,cAAA,UACIC,UAAU,aACVqP,QAAS5M,KAAKq9C,aAEd//C,IAAAA,cAACs1K,GAAAA,EAAc,CACXtpK,QAAStJ,KAAKpK,MAAM0qL,WAEpBhjL,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAASwC,EACT7D,QAAS,CACLoK,kBAAkB,EAClBozK,UAAU,EACVlf,qBAAsB,QAhB/B,IAsBf,EACH75J,GApGKsgL,GAAa,aAZf//K,QAAO+C,IAAAA,MAAA,CAEHof,WAAUpf,IAAAA,KAAAC,aAAAA,aAgHlB,UAAeyJ,EAAAA,EAAAA,YAAWszK,ICnH1B,IAAeh7K,EAAAA,EAAAA,SAAQ,MAXvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB2I,mBAAkB,MAClBuU,WAAU,KACV/R,iCAAgC,MAChCP,cAAaA,GAAAA,IACdvc,GAEX,GAEA,CAAiDysL,I,0ZCejD,MAAMK,WAAsBnjL,IAAAA,cAGxBsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,gBAFE,GAACA,GAAA,uBAyCHjM,UAA8B,IAAA6sL,EAE3C,IAAKl9K,KAAc,UAAWA,GAC1B,OAGJxD,KAAKgH,SAAS,CAACxD,aACf,MAAM0K,EAAqC,QAA9BwyK,EAAG1gL,KAAKhD,MAAMkR,QAAQ8B,gBAAQ,IAAA0wK,OAAA,EAA3BA,EAA6Bj4K,MAAMmH,GAAMA,EAAEH,WAAajM,EAAS1C,QACjF,IAAKoN,EAED,YADA8mB,QAAQ2rJ,MAAM,oDAIlB,MAAM,KAAChwK,EAAI,KAAE9J,GAAQ7G,KAAKhD,MAE1B,IAAIivC,EAAS,GACb,MAAM,KAACh4C,SAAc+L,KAAKhD,MAAMqD,QAAQmiB,WAAW7R,EAAKG,YACpD7c,IAEAg4C,EADgBh4C,EACC6jB,SAGrB,MAAM1K,GAAUkkK,EAAAA,GAAAA,IACZpjK,EAAQskK,OACRpB,GAAAA,GAAoBiP,QAAU,IAAMnyK,EAAQuB,SAC5CkB,EAAKG,WACLm7B,EACAt7B,EAAKtc,GACLsc,EAAKI,SAGHtJ,QAAYzH,KAAKhD,MAAMqD,QAAQ4N,mBAAmBC,EAASd,EAASvG,GAE1E,GAAIY,EAAIzT,MAAO,CACX,MAAM4T,EAAgBH,EAAIzT,MACpB6T,EAAeD,EAAcE,MAAQjB,EAAKC,cAAc,CAC1DzS,GAAI,qBACJ0S,eAAgB,4BAGpB,YADA/G,KAAKhD,MAAMqD,QAAQoQ,iCAAiC7I,EAAeC,EAAc8I,EAErF,CAEA,MAAM/H,EAAWnB,EAAIxT,KACrB,OAAQ2U,EAASpQ,MACjB,KAAK4P,GAAAA,GAAqBE,GAClBM,EAASd,MACT9H,KAAKhD,MAAMqD,QAAQoQ,iCAAiC7H,EAAUA,EAASd,KAAM6I,GAEjF,MACJ,KAAKvI,GAAAA,GAAqBG,SACtB,MACJ,KAAKH,GAAAA,GAAqBC,KAClBO,EAAS/C,MACT7F,KAAKhD,MAAMqD,QAAQ6P,cAActH,EAAS/C,KAAMuH,GAEpD,MACJ,QAAS,CACL,MAAMvF,EAAe7H,KAAKhD,MAAM6J,KAAKC,cAAc,CAC/CzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAMoQ,EAASpQ,OAEnBwH,KAAKhD,MAAMqD,QAAQoQ,iCAAiC7H,EAAUf,EAAc8I,EAChF,EACA,IAvGA,MAAMzC,EAAUlR,EAAMkR,QAEtB,GADAlO,KAAK+lG,UAAY,GACb73F,EAAQ8B,SAAU,CAClB,MAAM3U,EAAgD,GAChDulL,EAAyC,CAAC,EAC1CC,EAAyC,CAAC,EAChD3yK,EAAQ8B,SAAShK,SAAS4J,IACtB,MAAM1Q,EAAQ0Q,EAAE1Q,OAAS0Q,EAAEH,SACtBvQ,GAIA0Q,EAAEH,WAIHmxK,EAAW1hL,IAIX2hL,EAAWjxK,EAAEH,YAIjBmxK,EAAW1hL,IAAS,EACpB2hL,EAAWjxK,EAAEH,WAAY,EAEzBpU,EAAQiU,KAAK,CAACxH,KAAM5I,EAAO4B,MAAO8O,EAAEH,YAAU,IAGlDzP,KAAK8gL,SAAWzlL,EAAQqL,OACxB1G,KAAK+lG,UAAY,CAAC,IAAIixC,GAAAA,EAAmB37I,GAC7C,CAEA2E,KAAKpK,MAAQ,CAAC,CAClB,CAuEAqN,MAAAA,GACI,IAAKjD,KAAK8gL,SACN,OAAO,KAGX,MAAM,QAAC5yK,GAAWlO,KAAKhD,MACjBkC,EAAQgP,EAAQhP,OAASgP,EAAQuB,SACvC,OAAKvQ,EAKD5B,IAAAA,cAAC08K,GAAYC,SAAQ,MAChBxkL,IAAA,IAAAsrL,EAAA,IAAC,kBAACnH,GAAkBnkL,EAAA,OACjB6H,IAAAA,cAACmoG,GAAAA,EAAoB,CACjBM,UAAW/lG,KAAK+lG,UAChBL,WAAY1lG,KAAK6E,eACjBlD,YAAazC,EACbgnG,eAAe,2BACfplG,MAA0B,QAArBigL,EAAE/gL,KAAKpK,MAAM4N,gBAAQ,IAAAu9K,OAAA,EAAnBA,EAAqBj5K,KAC5Bg+F,YAAa8zE,GACf,IAbH,IAiBf,EACH95K,GA1IK2gL,GAAa,aAZfpgL,QAAO+C,IAAAA,MAAA,CAEHof,WAAUpf,IAAAA,KAAAC,aAAAA,aAwJlB,UAAeyJ,EAAAA,EAAAA,YAAW2zK,IC7J1B,IAAer7K,EAAAA,EAAAA,SAAQ,MAXvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB2I,mBAAkB,MAClBuU,WAAU,KACV/R,iCAAgC,MAChCP,cAAaA,GAAAA,IACdvc,GAEX,GAEA,CAAiD8sL,I,0ZCwBlC,MAAMO,WAAwB1jL,IAAAA,cAEzCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,uBAqCA,KACb,IAAKE,KAAKhD,MAAMikL,MAAMzO,OAClB,OAAO,KAGX,IAAKxyK,KAAKhD,MAAMikL,MAAMjxK,SAClB,OAAO,KAGX,MAAMA,EAAWhQ,KAAKpK,MAAMoa,SAC5B,IAAKA,IAAaA,EAAStJ,OACvB,OAAO,KAGX,MAAMgzF,EAAU,GAuBhB,OArBA1pF,EAAShK,SAASkI,IACVA,EAAQ8B,UAAY9B,EAAQ8B,SAAStJ,OAAS,EAC9CgzF,EAAQpqF,KACJhS,IAAAA,cAACmjL,GAAa,CACVzlL,IAAKkT,EAAQuB,SACbkB,KAAM3Q,KAAKhD,MAAM2T,KACjBzC,QAASA,KAMrBwrF,EAAQpqF,KACJhS,IAAAA,cAAC8iL,GAAa,CACVplL,IAAKkT,EAAQuB,SACbkB,KAAM3Q,KAAKhD,MAAM2T,KACjBzC,QAASA,IAEhB,IAID5Q,IAAAA,cAAA,OACIC,UAAU,sBAETm8F,EACC,IAEb55F,GAAA,iCAE2BrD,GAAwByB,EAAAA,GAA+BzB,EAAGuD,KAAKhD,MAAMi/K,0BAAuBn8K,GAAA,0BAEpG,KAIhBE,KAAKgH,UAAUvF,IACJ,CAACi5K,cAAej5K,EAAUi5K,cAAgB,KACnD,IACL56K,GAAA,6BAEuB8L,IAChBA,EAAS,GACT5L,KAAKy6K,mBACT,IA/FA,MAAM7kL,EAAe,CACjB8kL,cAAe,EACfuG,MAAOjkL,EAAMikL,MACbjxK,SAAU,IAGVhT,EAAMikL,MAAMzO,QAAUx1K,EAAMikL,MAAMjxK,WAClCpa,EAAMoa,SAAWgxK,GAAgBE,aAAalkL,EAAMikL,QAGxDjhL,KAAKpK,MAAQA,EAEboK,KAAKw6J,WAAa,CACdrpB,cAAenxI,KAAKu6K,qBACpB6B,qBAAsBp8K,KAAKy6K,kBAEnC,CAEA,+BAAOl5K,CAAyBvE,EAAcyE,GAC1C,OAAIzE,EAAMikL,QAAUx/K,EAAUw/K,MACnB,CACHA,MAAOjkL,EAAMikL,MACbjxK,SAAUgxK,GAAgBE,aAAalkL,EAAMikL,QAI9C,IACX,CAuEAh+K,MAAAA,GACI,MAAM,MAACg+K,EAAK,QAAE5lL,GAAW2E,KAAKhD,MAE9B,IAAIwO,EAiBAgxK,EAhBAyE,EAAM/hL,QACNsM,EACIlO,IAAAA,cAAA,MAAIC,UAAU,qBACVD,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAASukL,EAAM/hL,MACf7D,QAAS,CACLoK,kBAAkB,EAClBmuI,SAAU,IAAI4kC,GACd7e,qBAAsB,IAE1B1yI,OAAQjnB,KAAKhD,MAAM2T,KAAKtc,OAOpC4sL,EAAMzjL,cACNg/K,EACIl/K,IAAAA,cAACy/K,EAAAA,EAAQ,CACLC,kBAAkB,EAClBl1K,KAAMm5K,EAAMzjL,YACZqzE,UAAW,KAEXvzE,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAASukL,EAAMzjL,YACfg9J,WAAYx6J,KAAKw6J,WACjBn/J,QAASA,EACT4rB,OAAQjnB,KAAKhD,MAAM2T,KAAKtc,OAMxC,MAAM2b,EAAWhQ,KAAKmhL,iBAEtB,OACI7jL,IAAAA,cAAA,OACIC,UAAW,aACXqP,QAAS5M,KAAKk+K,0BAEd5gL,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OACIC,UAAW,0DAEViO,EACDlO,IAAAA,cAAA,WACIA,IAAAA,cAAA,OACIC,UAAW,+CAEVi/K,EACAxsK,GAEL1S,IAAAA,cAAA,OAAKoN,MAAOA,GAAMs7F,YAM1C,EACHlmG,GAvKoBkhL,GAAe,gBAkCT9yK,IACnB,MAAMkzK,EAAiB1rK,KAAKC,MAAMD,KAAK4iE,UAAUpqE,IAEjD,OADAmzK,EAAAA,EAAAA,IAAaD,EAAgBhQ,GAAAA,GAAoBiP,SAC1Ce,EAAepxK,QAAQ,IAoItC,MAAMtF,GAAQ,CACVs7F,OAAQ,CAACu2D,MAAO,SCzMpB,IAAen3J,EAAAA,EAAAA,UANf,SAAyBxP,GACrB,MAAO,CACHqmL,wBAAwBr5J,EAAAA,EAAAA,IAA0BhtB,GAE1D,GAEA,CAAwCorL,ICclCM,GAAmB7rL,IAAA,IAAC,OACtB8rL,EAAM,KACN5wK,EAAI,QACJtV,GACI5F,EAAA,OACJ6H,IAAAA,cAAA,OACIjJ,GAAE,yBAAA4J,OAA2B0S,EAAKtc,IAClCkJ,UAAU,oBAETgkL,EAAO5gL,KAAI,CAACsgL,EAAOvhJ,IAChBpiC,IAAAA,cAAC0jL,GAAe,CACZC,MAAOA,EACPtwK,KAAMA,EACN3V,IAAK,OAAS0kC,EACdrkC,QAASA,MAGf,EACRimL,GAAA37K,UAAA,CA3BE47K,OAAMn+K,IAAAA,MAAAC,YA6BV,UAAewpD,EAAAA,EAAAA,MAAKy0H,I,0ZCZL,MAAME,WAAkClkL,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,8BACtD,KACpBE,KAAKhD,MAAMqD,QAAQyvI,sBAAsB9vI,KAAKhD,MAAM2T,KAAKtc,GAAG,IAC/DyL,GAAA,iBAEU,KACP,MAAM,SAACkqB,GAAYhqB,KAAKhD,MAAM2T,KAC9B,OAAO8wK,EAAAA,EAAAA,IAAqBz3J,EAAS,IACxClqB,GAAA,0BAEoBmhL,IACjB,MAAMS,EAAgC1hL,KAAKhD,MAAM2kL,qCAAuC,GACxF,IAAK,MAAMp9J,KAAKm9J,EACZ,GAAIn9J,EAAE2qH,MAAM+xC,GACR,OAAOp3K,QAAQ0a,EAAEq9J,YAIzB,MAAsB,UAAfX,EAAMzoL,MAAoC,cAAfyoL,EAAMzoL,MAAwBgmL,GAAauB,cAAckB,EAAM5iL,IAAK,IACzGyB,GAAA,oBAEcmhL,IACX,MAAMS,EAAgC1hL,KAAKhD,MAAM2kL,qCAAuC,GACxF,IAAK,MAAMp9J,KAAKm9J,EACZ,GAAIn9J,EAAE2qH,MAAM+xC,GAAQ,CAChB,MAAM76G,EAAY7hD,EAAEtpB,UACpB,OAAO+E,KAAKhD,MAAM2zI,gBACdrzI,IAAAA,cAAC8oE,EAAS,CACN66G,MAAOA,EACPY,gBAAiBA,GAAAA,GAG7B,CAEJ,OAAQZ,EAAMzoL,MACd,IAAK,QACD,OAAKwH,KAAKhD,MAAM2zI,eAKZrzI,IAAAA,cAACwkL,GAAS,CACN93C,cAAehqI,KAAKhD,MAAM2T,KAAKqZ,SAAS21J,OAAOsB,EAAM5iL,KACrD62E,KAAM+rG,EAAM5iL,IACZsS,KAAM3Q,KAAKhD,MAAM2T,OAPd,KAWf,IAAK,qBAAsB,KAAAoxK,EAAAC,EACvB,MAAM3D,GAAc4D,EAAAA,EAAAA,GAA8C,QAAtBF,EAAC/hL,KAAKhD,MAAM2T,KAAK3T,aAAK,IAAA+kL,OAAA,EAArBA,EAAuB1D,aAAoC,QAAxB2D,EAAGhiL,KAAKhD,MAAM2T,KAAK3T,aAAK,IAAAglL,OAAA,EAArBA,EAAuB3D,YAAc,GAExH,OACI/gL,IAAAA,cAAC8gL,GAAqB,CAClBC,YAAaA,EACbp3J,OAAQjnB,KAAKhD,MAAM2T,KAAKtc,GACxBgH,QAAS2E,KAAKhD,MAAM3B,QACpBg/J,eAAgBr6J,KAAKhD,MAAM2T,KAAKqZ,SAAS21J,QAGrD,CAEA,IAAK,YACD,OAAInB,GAAauB,cAAckB,EAAM5iL,KAC5B2B,KAAKhD,MAAM2zI,eAKZrzI,IAAAA,cAACkhL,GAAY,CACTv3J,OAAQjnB,KAAKhD,MAAM2T,KAAKtc,GACxB6gF,KAAM+rG,EAAM5iL,IACZ8K,KAAMnJ,KAAKhD,MAAM2zI,iBAPd,KAaXrzI,IAAAA,cAAC4kL,GAAAA,EAAuB,CACpBj7J,OAAQjnB,KAAKhD,MAAM2T,KAAKtc,GACxB6gF,KAAM+rG,EAAM5iL,IACZsyI,eAAgB3wI,KAAKhD,MAAM2zI,eAC3BhgI,KAAM3Q,KAAKhD,MAAM2T,KACjBm/H,sBAAuB9vI,KAAK8vI,wBAGxC,IAAK,YACD,OAAImxC,EAAMhtL,MAAQ,YAAagtL,EAAMhtL,MAAQgtL,EAAMhtL,KAAKqd,QAEhDhU,IAAAA,cAAC6kL,GAAAA,EAAkB,CACfn4J,SAAUi3J,EAAMhtL,KAChBw5I,yBAA0BztI,KAAKhD,MAAMywI,2BAI1C,KACX,QACI,OAAO,KACX,IACH3tI,GAAA,qBAEesiL,GAER9kL,IAAAA,cAAA,UACItC,IAAI,SACJuC,UAAS,kDAAAU,OAAoDmkL,EAAgB,YAAc,IAC3F,gBAAepiL,KAAKhD,MAAM2zI,eAC1B,aAAW,0BACX/jI,QAAS5M,KAAK8vI,yBAGzB,CAED7sI,MAAAA,GACI,MAAMg+K,EAAQjhL,KAAKqiL,WAEnB,GAAIriL,KAAKhD,MAAMgd,YAAa,KAAAsoK,EAAAC,EACxB,MAAMC,GAAYC,EAAAA,EAAAA,WAA2C,QAAlCH,EAAatiL,KAAKhD,MAAM2T,KAAK3T,aAAK,IAAAslL,OAAA,EAArBA,EAAuBI,aAAcC,EAAAA,KAAgBC,EAAAA,EAAAA,IAAsC,QAAtBL,EAACviL,KAAKhD,MAAM2T,KAAK3T,aAAK,IAAAulL,OAAA,EAArBA,EAAuBG,cAAgB,GACrJ,GAAIF,EAAU97K,OAEV,OACIpJ,IAAAA,cAAAA,IAAAA,SAAA,KACK0C,KAAKhD,MAAM20D,SACZr0D,IAAAA,cAACgkL,GAAgB,CACbC,OAAQiB,EACR7xK,KAAM3Q,KAAKhD,MAAM2T,OAKrC,CAEA,GAAIswK,EAAO,CACP,MAAMW,EAAa5hL,KAAK6iL,kBAAkB5B,GACpCmB,EAAiB,qBAAsBjqJ,KAAKn4B,KAAKhD,MAAM2T,KAAKjU,SAElE,OACIY,IAAAA,cAAA,WACMskL,GAAcQ,GAAkBpiL,KAAK8iL,cAAa,GACnD9iL,KAAKhD,MAAM20D,SACViwH,IAAeQ,GAAkBpiL,KAAK8iL,cAAa,GACpD9iL,KAAK+iL,YAAY9B,GAG9B,CAEA,OAAOjhL,KAAKhD,MAAM20D,QACtB,EACH7xD,GAnJoB0hL,GAAyB,aAX1CG,oCAAmCv+K,IAAAA,MACnCuuD,SAAQvuD,IAAAA,QACRutI,eAAcvtI,IAAAA,KAEd4W,YAAW5W,IAAAA,KAAAC,WACXoqI,yBAAwBrqI,IAAAA,KACxB/C,QAAO+C,IAAAA,MAAA,CACH0sI,sBAAqB1sI,IAAAA,KAAAC,aAAAA,aCD7B,UAAe+B,EAAAA,EAAAA,UAdf,SAAyBxP,EAAoB2hC,GACzC,MAAO,CACHo5G,gBAAgBA,EAAAA,EAAAA,IAAe/6I,EAAO2hC,EAAS5mB,KAAKtc,IACpDstL,oCAAqC/rL,EAAM+oE,QAAQ7hE,WAAWkmL,6BAC9DhpK,aAAaA,EAAAA,EAAAA,IAAYpkB,GAEjC,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CAACwqI,sBAAqBA,EAAAA,IAAGn8I,GAE7D,GAEA,CAGE6tL,I,gBCda,SAASyB,GAA4BxtL,GAAwE,IAAvE,KAACkb,EAAI,eAAEggI,EAAc,gBAAEuyC,EAAe,MAAExkH,EAAK,eAAEitE,GAAsBl2I,EACtH,MAAM0tL,EAAYxyK,EAAKnY,MAAQ0qL,GAAmBxlL,OAAO20C,OAAO6wI,EAAiBvyK,EAAKnY,MACtF,IAAIyU,EACJ,MAAMm2K,EACF9lL,IAAAA,cAAC+lL,GAAAA,EAAe,CACZ1yK,KAAMA,EACN+tD,MAAOA,EACPitE,eAAgBA,IAexB,OAXI1+H,EADA0D,EAAK/a,QAAUixB,EAAAA,GAAM4V,cAAgB0mJ,EAC/BC,EAGF9lL,IAAAA,cAACkkL,GAAyB,CACtB7wK,KAAMA,EACNggI,eAAgBA,GAEfyyC,GAINn2K,CACX,CAACg2K,GAAAt9K,UAAA,CA/BGtR,GAAE+O,IAAAA,OAEFutI,eAAcvtI,IAAAA,KAEds7D,MAAKt7D,IAAAA,KAAAC,WACLsoI,eAAcvoI,IAAAA,M,uICKlB,MAAMq3E,GAAOt7B,KAAAA,IAAUC,WAAA,CAAAt7C,YAAA,QAAVq7C,CAAU,8CAMjBmkI,GAAOnkI,KAAAA,IAAUC,WAAA,CAAAt7C,YAAA,QAAVq7C,CAAU,iHASjBv0C,GAAQu0C,KAAAA,IAAUC,WAAA,CAAAt7C,YAAA,SAAVq7C,CAAU,wHAQlBspH,GAAOtpH,KAAAA,KAAWC,WAAA,CAAAt7C,YAAA,QAAXq7C,CAAW,uFAMlBokI,GAAUpkI,KAAAA,IAAUC,WAAA,CAAAt7C,YAAA,WAAVq7C,CAAU,8QAY1B,SAASqkI,GAAG/tL,GAYT,IAZU,eACTguL,EAAc,GACdpvL,EAAE,KACFqvL,EAAI,kBACJC,EAAiB,SACjB9lL,GAOHpI,EACG,MAAM8rD,GAAiBtqC,EAAAA,EAAAA,SAAQuqC,EAAAA,GAAoB,IAC7C19C,GAAcuwC,EAAAA,EAAAA,cAAaz+C,GAAuB2rD,EAAe3rD,EAAOvB,KAE9E,OACIiJ,IAAAA,cAACm9E,GAAI,KACDn9E,IAAAA,cAACa,GAAAA,EAAM,CACHC,KAAK,KACLC,IAAK/I,GAAAA,GAAQ4lD,qBAAqB7mD,EAAIsvL,GACtC9lL,SAAUA,IAEdP,IAAAA,cAACgmL,GAAI,KACDhmL,IAAAA,cAAA,WACKwG,EACA4/K,GACGpmL,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACq4C,GAAAA,EAAI,MACLr4C,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,gCACJ0S,eAAgB,YAKhCzJ,IAAAA,cAACmrK,GAAI,KACDnrK,IAAAA,cAACkiD,GAAAA,GAAS,CAAC1+C,MAAO2iL,MAKtC,CAEe,SAASG,GAA+B1oL,GAA+B,IAA9B,KAAC63G,EAAI,cAAE3vF,GAAqBloB,EAChF,OACIoC,IAAAA,cAACimL,GAAO,KACJjmL,IAAAA,cAACsN,GAAK,KACFtN,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,uCACJ0S,eAAgB,sBAGvBgsG,EAAKpyG,KAAK1D,GACPK,IAAAA,cAACkmL,GAAG,CACAxoL,IAAKiC,EAAKyD,KAAKrM,GACfovL,eAAgBxmL,EAAKwmL,eACrBC,KAAMtgK,IAAkBnmB,EAAKyD,KAAKrM,GAClCA,GAAI4I,EAAKyD,KAAKrM,GACdsvL,kBAAmB1mL,EAAKyD,KAAKy6C,oBAC7Bt9C,SAAUZ,EAAKyD,KAAK7C,aAKxC,CCrFA,SAASgmL,GAAoBpuL,GAQnB,IARoB,SAC1BquL,EAAQ,cACR1gK,EAAa,aACb2gK,EAAY,UACZ7xC,EAAS,KACTn/B,EAAI,OACJ9rF,EAAM,YACN+8J,GAAc,GACVvuL,EACAguL,EAAiB,EACrB,MAAMQ,GAAYC,EAAAA,GAAAA,MACZC,EAAkBL,IAAa1gK,EAC/BzvB,GAAWsxD,EAAAA,EAAAA,gBACVh2C,EAAMw0F,IAAW5sF,EAAAA,EAAAA,WAAS,GAEjC,GAAIk8F,GAAQA,EAAKrsG,OAAQ,CACrB,MAAM09K,EAAMrxE,EAAKtqG,MAAM27K,GAAQA,EAAI1jL,KAAKrM,KAAO+uB,IAC3CghK,IACAX,EAAiBW,EAAIX,eAE7B,CACA,MAAMY,EAAkBx6K,QAAQ45K,KA1BX/9J,EA0B8C+9J,GAzBvD,IAAIvoK,MAAO28E,UACVnyE,EAAO,MAwBmEy+J,EA1B3F,IAAyBz+J,EA4BrB,MAAM,EAACuR,EAAC,EAAEsnB,EAAC,SAAEgM,EAAQ,QAAEn9C,EAASq9C,MAAM,aAACC,EAAY,YAAEC,KAAgBC,EAAAA,GAAAA,IAAY,CAC7E37C,OACA47C,aAAc44C,EACd34C,UAAW,YACX2yB,qBAAsBC,GAAAA,GACtB3yB,WAAY,EACRC,EAAAA,GAAAA,IAAO,IACP2yB,EAAAA,GAAAA,IAAK,CACDC,mBAAoB,CAAC,eAAgB,SACrCE,QAAS,MAEbD,EAAAA,GAAAA,IAAM,CACFC,QAAS,SAKf,kBAAC1yB,EAAiB,iBAAEE,IAAoBE,EAAAA,GAAAA,IAAgB,EAC1D84H,EAAAA,GAAAA,IAASl3K,EAAS,CACdgiH,QAASrc,GAAQA,EAAKrsG,OAAS,EAC/B69K,WAAW,EACXC,MAAO,CACHv1K,KAAM,IACNuiB,MAAO,GAEXizJ,OAAQ,IACRxrJ,aAAayrJ,EAAAA,GAAAA,IAAY,CACrBC,oBAAoB,OAG5B1mG,EAAAA,GAAAA,IAAQ7wE,KAgBZ,GAAI8kI,EACA,OAAO,KAGX,IAAI0yC,EACAtnL,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,mCACJ0S,eAAgB,iBAInBgsG,GAAQA,EAAKrsG,QAAWy9K,KACzBS,GAAa7xE,aAAI,EAAJA,EAAMrsG,SAAU,GAGjC,MAAMs5I,EACF1iJ,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,SAAAI,OAAAC,OAAA,CACIu6C,IAAKwS,EACL99C,QAhCSnQ,IACjB,GAAI4nL,EAGA,OAFA5nL,EAAEyK,sBACFzK,EAAEy0D,kBAIFv9D,EADA8vL,GACSoB,EAAAA,EAAAA,IAAkB59J,IAElB69J,EAAAA,EAAAA,IAAgB79J,GAC7B,EAuBQ1pB,UAAWk3C,IAAW,CAClBswI,uBAAuB,EACvB,+BAAgCl7K,QAAQ45K,GACxC,kCAAmCY,EACnC,kCAAmCtxE,GAAwB,IAAhBA,EAAKrsG,UAEhD0kD,KAEJ9tD,IAAAA,cAACk+E,GAAAA,uBAAsB,CAACp9E,KAAM,KAC7BwmL,GAEJZ,GAAeD,GAAgBzmL,IAAAA,cAAA,OAAKC,UAAU,oCAIvD,OAAKw1G,GAASA,EAAKrsG,OAKfpJ,IAAAA,cAAAA,IAAAA,SAAA,KACK0iJ,EACA/wI,GACG3R,IAAAA,cAAC+gF,GAAAA,GAAoB,CACjBjxE,QAASA,EACTkxE,OAAO,GAEPhhF,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKyS,EACLjgD,MAAO,CACHy5C,SAAUoG,EACV3F,IAAKrG,QAAAA,EAAK,EACV+N,KAAMr1B,QAAAA,EAAK,EACXtrB,MAAO,IACP5M,OAAQ,KAEZ,kBAAiBklL,GACb34H,KAEJhuD,IAAAA,cAACsmL,GAA+B,CAC5BxgK,cAAeA,EACf2vF,KAAMA,OAzBnBitC,CAgCf,CDpDC4jC,GAAAj+K,UAAA,CA7GGotG,KAAI3vG,IAAAA,QAAAA,IAAAA,MAAA,KAAAC,YCiKPwgL,GAAAl+K,UAAA,CArJGo+K,aAAY3gL,IAAAA,KAAAC,WACZ6uI,UAAS9uI,IAAAA,KAAAC,WACT0vG,KAAI3vG,IAAAA,QAAAA,IAAAA,MAAA,KAEJ4gL,YAAW5gL,IAAAA,MAmJf,UAAeypD,EAAAA,EAAAA,MAAKg3H,ICvJpB,IAAez+K,EAAAA,EAAAA,UAhBf,WACI,MAAM4/K,GAAsCC,EAAAA,EAAAA,MAE5C,MAAO,CAACrvL,EAAoB2hC,KAKjB,CACHnU,eALkBvL,EAAAA,GAAAA,IAAiBjiB,GAMnCmuL,cALiBmB,EAAAA,EAAAA,IAAgBtvL,EAAO2hC,EAAStQ,QAMjD8rF,KALSiyE,EAAoCpvL,EAAO2hC,EAAStQ,SAQzE,GAEA,CAA4C48J,I,gBClB5C,MAAMsB,GAA0B1vL,IAEnB,IAFoB,UAC7Bg2B,GACIh2B,EACJ,GAAKg2B,UAAAA,EAAW/kB,OACZ,OAAO,KAGX,IAAI0+K,EAAW,KAaf,OAZI35J,EAAU/kB,OAAS,IACnB0+K,EACI9nL,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,wEACfjB,OAAQ,CACJwM,MAAOmZ,EAAU/kB,OAAS,MAOtCpJ,IAAAA,cAAA,QAAM,cAAY,YACbmuB,EAAU,GAAGhuB,KACb2nL,EACE,EAEbD,GAAAx/K,UAAA,CA7BE8lB,UAASroB,IAAAA,OA+Bb,SAAe9F,IAAAA,KAAW6nL,ICV1B,IAAe//K,EAAAA,EAAAA,UAff,WACI,MAAMigL,GAAyB1zC,EAAAA,GAAAA,MAE/B,OAAO,SAAyB/7I,EAAoB2hC,GAChD,IAAI9L,EAKJ,OAJI8L,EAAS3a,eACT6O,EAAY45J,EAAuBzvL,EAAO2hC,EAAS3a,eAGhD,CACH6O,YAER,CACJ,GAEA,CAA4C05J,I,4BCX5C,SAASG,GAAW7vL,GAAgD,IAAA8vL,EAAA,IAA/C,KAAC50K,EAAI,eAAE60K,EAAc,eAAEC,GAAsBhwL,EAC9D,MAiBMiH,EAjByBgpL,MAAM,IAAAC,EACjC,IAAIjpL,EAA2B,GAC/B,GAAIiU,EAAKjU,QACLA,EAAUwB,EAAAA,GAA0ByS,EAAKjU,cACtC,GAAIiU,EAAKmZ,UAAYnZ,EAAKmZ,SAASpjB,OAAS,EAC/ChK,EACIY,IAAAA,cAAC6nL,GAAuB,CAACvoK,aAAcjM,EAAKtc,UAE7C,IAAI4tL,EAAAA,EAAAA,GAAmC,QAAX0D,EAACh1K,EAAK3T,aAAK,IAAA2oL,OAAA,EAAVA,EAAYtH,cAAgB1tK,EAAK3T,MAAMqhL,YAAY33K,OAAS,EAAG,CAC/F,MAAM2zK,EAAa1pK,EAAK3T,MAAMqhL,YAAY,GACpCuH,EAAiBvL,EAAWkC,SAAWlC,EAAW7uK,OAAS6uK,EAAWvyK,MAAQuyK,EAAWzmB,UAAY,GAC3Gl3J,EAAUwB,EAAAA,GAA0B0nL,EACxC,CAEA,OAAOlpL,CAAO,EAGFgpL,GACVG,EAAqC,QAArBN,EAAGC,aAAc,EAAdA,EAAgBnxL,UAAE,IAAAkxL,EAAAA,EAAI,GAEzCO,EACFxoL,IAAAA,cAACyoL,GAAAA,EAAW,CACRvxL,OAAQqxL,IAIhB,OACIvoL,IAAAA,cAAA,OACI,cAAY,YACZC,UAAU,cAEVD,IAAAA,cAAA,YACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wBACH0S,eAAe,kCACfjB,OAAQ,CACJrI,KAAMH,IAAAA,cAAA,KAAGC,UAAU,mBAAmBuoL,MAG9CxoL,IAAAA,cAAA,KACIC,UAAU,QACVqP,QAAS64K,GAEW,iBAAZ/oL,GAAuBspL,EAAAA,GAAAA,IAActpL,GAAWA,IAK5E,CAAC4oL,GAAA3/K,UAAA,CAvDGsgL,2BAA0B7iL,IAAAA,KAE1BqiL,eAAcriL,IAAAA,MAuDlB,UAAeypD,EAAAA,EAAAA,MAAKy4H,I,yoBCtDpB,MAAMY,GAAoBzwL,IAGb,IAHc,KACvBkb,EAAI,QACJtQ,GACI5K,EACJ,MAAM0wL,GAAYpvK,EAAAA,EAAAA,cAAata,IAC3BA,EAAEyK,iBAEF,MAAMk/K,E,kWAAWhyL,CAAA,GAAOuc,GACxB+jB,QAAQC,eAAeyxJ,EAAa,MACpC/lL,EAAQgmL,WAAWD,EAAa,GAAG,GACpC,CAAC/lL,EAASsQ,IAEP21K,GAAavvK,EAAAA,EAAAA,cAAata,IAC5BA,EAAEyK,iBAEF7G,EAAQg4K,WAAW1nK,EAAK,GACzB,CAACtQ,EAASsQ,IAEb,OACIrT,IAAAA,cAAA,QAAMC,UAAU,wBACZD,IAAAA,cAAA,KACIC,UAAU,aACVk2C,KAAK,IACL7mC,QAASu5K,GAET7oL,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,WAGtB,MACDzJ,IAAAA,cAAA,KACIC,UAAU,cACVk2C,KAAK,IACL7mC,QAAS05K,GAEThpL,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,YAGpB,EAIf,IAAe8lD,EAAAA,EAAAA,MAAKq5H,IC3CpB,IAAe9gL,EAAAA,EAAAA,SAAQ,MATvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB+gL,WAAU,KACVhO,WAAUA,EAAAA,IACX1kL,GAEX,GAEA,CAAiDuyL,I,gBChBlC,SAASK,GAAevpL,GACnC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,kBAExEzJ,IAAAA,cAAA,KACI6gD,OAAO,OACPM,YAAY,IACZf,KAAK,UACLoB,SAAS,WAETxhD,IAAAA,cAAA,KACI0gD,UAAU,sCACVc,SAAS,UACTpB,KAAK,WAELpgD,IAAAA,cAAA,KAAG0gD,UAAU,kCACT1gD,IAAAA,cAAA,KAAG0gD,UAAU,qCACT1gD,IAAAA,cAAA,KAAG0gD,UAAU,mCACT1gD,IAAAA,cAAA,QAAM4gD,EAAE,4QAS5C,C,0ZClBO,IAAKsoI,GAAmB,SAAnBA,GAAmB,OAAnBA,EAAAA,EAAmB,qBAAnBA,EAAAA,EAAmB,mBAAnBA,EAAAA,EAAmB,uCAAnBA,EAAAA,EAAmB,qBAAnBA,CAAmB,MAK9B,IAEIC,GAAc,SAAdA,GAAc,OAAdA,EAAc,kBAAdA,EAAc,gBAAdA,EAAc,oCAAdA,CAAc,EAAdA,IAAc,IAMnB,MAAMC,WAAsBppL,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,wBA+CjC,CAAC6mL,EAA4Bj3K,KACvCi3K,IAAeF,GAAeG,QAAUl3K,EACxC1P,KAAKhD,MAAMqD,QAAQwmL,gBAAgBn3K,GAEnC1P,KAAKhD,MAAMqD,QAAQ4zJ,kBACvB,GACH,CApDD6yB,aAAAA,CAAcC,EAAoBC,GAC9B,OAAID,EACIC,EACOR,GAAoBS,iBAGxBT,GAAoBU,QAG3BF,EACOR,GAAoBI,OAGxBJ,GAAoBW,OAC/B,CAEAC,cAAAA,CAAeC,EAAiCC,EAAuBC,GACnE,GAAID,GAAeC,EACf,OAAO,EAGX,GAAIF,IAAeb,GAAoBS,iBAAkB,CACrD,IAAKM,IAAeD,EAChB,OAAOb,GAAeQ,iBAG1B,GAAIM,EACA,OAAOd,GAAeS,QAG1B,GAAII,EACA,OAAOb,GAAeG,MAE9B,CAEA,OAAIS,IAAeb,GAAoBU,SAAYI,EAI/CD,IAAeb,GAAoBI,SAAWW,GACvCd,GAAeG,OAJfH,GAAeS,OAQ9B,CAUAjkL,MAAAA,GACI,MAAM,UAAC8jL,EAAS,SAAEC,EAAQ,WAAEO,EAAU,YAAED,EAAW,UAAE53K,GAAa1P,KAAKhD,MAEjE2pL,EAAa3mL,KAAKonL,eAAepnL,KAAK8mL,cAAcC,EAAWC,GAAWM,EAAaC,GAE7F,OAAMR,GAAcC,IAAcL,EAK9BrpL,IAAAA,cAAA,OAAKC,UAAU,mBACXD,IAAAA,cAAA,OAAKC,UAAU,oCACVypL,IAAaO,GAAcjqL,IAAAA,cAAA,QAAMC,UAAU,wCAC3CwpL,IAAcO,GAAehqL,IAAAA,cAACipL,GAAc,CAAChpL,UAAU,gCAE5DD,IAAAA,cAAA,OAAKC,UAAU,mCACVopL,GACDA,IAAeF,GAAeQ,kBAC1B3pL,IAAAA,cAAA,YACIA,IAAAA,cAAA,KAAGsP,QAASA,IAAM5M,KAAK2uF,gBAAgBg4F,EAAYj3K,IAC/CpS,IAAAA,cAACgK,EAAAA,iBACOuT,GAAS8rK,MAK5BA,GACDA,IAAeF,GAAeQ,kBAC1B3pL,IAAAA,cAAA,YACIA,IAAAA,cAAA,KAAGsP,QAASA,IAAM5M,KAAK2uF,gBAAgB83F,GAAeG,OAAQl3K,IAC1DpS,IAAAA,cAACgK,EAAAA,iBACOuT,GAAS4rK,GAAeG,UAGpCtpL,IAAAA,cAAA,QAAMC,UAAU,mCAAmC,KACnDD,IAAAA,cAAA,KAAGsP,QAASA,IAAM5M,KAAK2uF,gBAAgB83F,GAAeS,UAClD5pL,IAAAA,cAACgK,EAAAA,iBACOuT,GAAS4rK,GAAeS,cA/B7C,IAuCf,EACHpnL,GArGK4mL,GAAa,aAxBfK,UAAS3jL,IAAAA,KAAAC,WACT2jL,SAAQ5jL,IAAAA,KACRmkL,WAAUnkL,IAAAA,KACVkkL,YAAWlkL,IAAAA,KACXsM,UAAStM,IAAAA,OAAAC,WACThD,QAAO+C,IAAAA,MAAA,CACH6wJ,iBAAgB7wJ,IAAAA,KAAAC,WAChBwjL,gBAAezjL,IAAAA,KAAAC,aAAAA,aAwHvB,MAAMwX,IAAW25C,EAAAA,EAAAA,gBAAe,CAC5B,CAACiyH,GAAeS,SAAU,CACtB7yL,GAAI,0BACJ0S,eAAgB,SAEpB,CAAC0/K,GAAeG,QAAS,CACrBvyL,GAAI,yBACJ0S,eAAgB,YAIxB,IAAe+F,EAAAA,EAAAA,YAAW45K,ICnI1B,IAAethL,EAAAA,EAAAA,SAAQ,MAPKzR,IAAkB,CAC1C0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB2uJ,iBAAgB,KAChB4yB,gBAAeA,EAAAA,IAChBlzL,MAGP,CAAiD+yL,I,sdCHjD,MAAMc,GAAsB,CACxBv6H,GAAAA,GAAAA,GACAA,GAAAA,GAAAA,IAEEw6H,GAA6DA,CAAC51D,EAACp8H,KAAA,IAAE,KAACoqD,EAAI,OAAEC,EAAM,OAAE6P,GAAOl6D,EAAA,MAAM,CAACoqD,OAAMC,SAAQ6P,SAAO,EAyB1G,MAAM+3H,WAAiBpqL,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,oBAM/C,KACNE,KAAKhD,MAAMmsI,cACX97G,GAAAA,IACJ,GACH,CAEDpqB,MAAAA,GACI,MAAM,UACF0kL,EAAS,YACTC,EAAW,SACXn4K,EAAQ,OACRwX,EAAM,QACNvE,EAAO,eACPosG,EAAiB,CAAC,GAClB9uH,KAAKhD,MAEH6qL,EACFvqL,IAAAA,cAACkiD,GAAAA,GAAS9hD,OAAAC,OAAA,CACNmD,MAAO6mL,EACPpqL,UAAU,aACVmiD,SAAS,GACLovE,IAINp1B,GAAUr1C,EAAAA,GAAAA,QAAeujI,EAC3BtqL,IAAAA,cAAA,OACI8M,KAAK,eACL7M,UAAU,8CAETsqL,GAGLvqL,IAAAA,cAAC8iD,GAAAA,KAAI,CACD/rD,GAAE,GAAA4J,OAAKwR,EAAQ,UAAAxR,OAASgpB,GACxBg2B,GAAE,GAAAh/C,OAAKykB,EAAO,QAAAzkB,OAAOgpB,GACrB1pB,UAAU,kBACVqP,QAAS5M,KAAKq9C,YACd,kBAAiBsqI,EAAUrmL,YAE1BumL,GAIT,OACIvqL,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAACkiD,GAAAA,GAAS,CACN1+C,MAAO6mL,EACP5mI,OAAQymI,GACRvmI,mBAAmB,EACnBrB,QAAS6nI,MAIhB/tF,EAGb,EACH55F,GAjEoB4nL,GAAQ,eACa,CAClCC,UAAW,EACXl4K,SAAU+wC,EAAAA,GAAUwvB,SCvB5B,UAAe5qE,EAAAA,EAAAA,UAPf,SAAyBxP,EAAoB2hC,GACzC,MAAO,CACH4xG,cAAc7kF,EAAAA,EAAAA,IAAgB1uD,GAC9B8sB,QAAS6U,EAASmiB,SAAW,IAAHz7C,OAAOs5B,EAASmiB,WAAa92B,EAAAA,EAAAA,IAA0BhtB,GAEzF,GAEA,CAAwC8xL,I,gBCdjC,SAASI,GAAgBlyL,EAAoB8Z,GAChD,MAAMxO,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAElC,SAAKxO,GAAWA,EAAQkgB,UAAY,KAI7B8I,EAAAA,GAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAASpI,EAAWya,EAAAA,GAAY49J,aACjF,CAEO,SAASC,GAAmBpyL,EAAoB8Z,GACnD,MAAMxO,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAElC,SAAKxO,GAAWA,EAAQkgB,UAAY,KAI7B8I,EAAAA,GAAAA,IAAuBt0B,EAAOsL,EAAQ4W,QAASpI,EAAWya,EAAAA,GAAY89J,gBACjF,C,6JCPA,MAAMC,GAAoClrL,IACtC,MAAM,gBACF8qL,EAAe,mBACfE,EAAkB,SAClBr2H,EAAQ,mBACRw2H,EAAkB,UAClBhvE,EAAS,OACTivE,EAAM,UACNC,EAAS,MACT7nL,GACAxD,EAEE6J,GAAOiQ,EAAAA,EAAAA,WAEPwxK,EAAkBD,EAAU3hL,OAASlG,EAAMkG,OAEjD,IAAI6hL,EAuCAC,EApCID,EAFJD,EAAkB,EACd9nL,EAAMkG,OAAS,EACPG,EAAKC,cACT,CACIzS,GAAI,iCACJ0S,eAAgB,yFAEpB,CACIvG,MAAOA,EAAMymD,KAAK,MAClBwhI,WAAYH,IAIZzhL,EAAKC,cACT,CACIzS,GAAI,yBACJ0S,eAAgB,uEAEpB,CACI0hL,WAAYH,IAIjB9nL,EAAMkG,OAAS,EACdG,EAAKC,cACT,CACIzS,GAAI,wBACJ0S,eAAgB,0BAEpB,CACIvG,MAAOA,EAAM4O,MAAM,GAAI,GAAG63C,KAAK,MAC/ByhI,SAAUloL,EAAMA,EAAMkG,OAAS,KAI/BlG,EAAM,GAMVgoL,EAFJhoL,EAAMkG,OAAS4hL,EAAkB,EAC7BH,EACethL,EAAKC,cAAc,CAC9BzS,GAAI,oCACJ0S,eAAgB,YAGLF,EAAKC,cAAc,CAC9BzS,GAAI,8BACJ0S,eAAgB,YAGjBohL,EACQthL,EAAKC,cAAc,CAC9BzS,GAAI,4BACJ0S,eAAgB,YAGLF,EAAKC,cAAc,CAC9BzS,GAAI,6BACJ0S,eAAgB,YAIxB,MAAM4hL,EAAe9hL,EAAKC,cACtB,CACIzS,GAAI,mBACJ0S,eAAgB,uCAEpB,CACIvG,MAAO+nL,EACPC,eACA7mJ,MAAO,IAAMw3E,EAAY,MAIjC,IAAIyvE,EAaJ,OAZIT,GAAsBH,EACtBY,EAAc/hL,EAAKC,cAAc,CAC7BzS,GAAI,yBACJ0S,eAAgB,uBAEZohL,GAAsBL,IAC9Bc,EAAc/hL,EAAKC,cAAc,CAC7BzS,GAAI,sBACJ0S,eAAgB,oBAInBzJ,IAAAA,eAAqBq0D,GAKtBr0D,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAOm9K,EACP/mL,KAAMgnL,EACNjnJ,MAAOw3E,EACPmM,cAAc,EACdujE,OAAQT,GAEPz2H,GAXE,IAYO,EAEpBu2H,GAAAviL,UAAA,CAlIEmiL,gBAAe1kL,IAAAA,KAAAC,WACf2kL,mBAAkB5kL,IAAAA,KAAAC,WAClBsuD,SAAQvuD,IAAAA,KAAAC,WACR8kL,mBAAkB/kL,IAAAA,KAAAC,WAClB81G,UAAS/1G,IAAAA,OAAAC,WACT+kL,OAAMhlL,IAAAA,KAAAC,WACNglL,UAASjlL,IAAAA,MAAAC,WACT7C,MAAK4C,IAAAA,QAAAA,IAAAA,QAAAC,YA6HT,YChFA,IAAe+B,EAAAA,EAAAA,UAVf,WACI,MAAM0jL,GAhC+BphI,EAAAA,GAAAA,IACrC,uBACA,CAAC9xD,EAAoByyL,IAA8BA,GACnDxwK,EAAAA,IACAkxK,EAAAA,EAAAA,MACA1jL,EAAAA,IACA,CAACgjL,EAA2BjlK,EAAuBmmB,EAAyB3oC,KAGxE,IAAIunL,GAAqB,EACzB,MACM3nL,EADkB6nL,EAAUlyH,MAAK,CAACjW,EAAGtwC,IAAMswC,EAAEhkC,UAAYtM,EAAEsM,YACnCrM,QAAO,CAACm5K,EAAaj5K,KAC/C,GAAIA,EAAQgM,UAAYqH,EACpB+kK,GAAqB,MAClB,CACH,MAAMznL,EAAO6oC,EAAS9gC,MAAM2jG,GAAMA,EAAE/3G,KAAO0b,EAAQgM,UAC/Crb,GACAsoL,EAAY15K,MAAKzO,EAAAA,GAAAA,IAAgBH,EAAME,GAE/C,CACA,OAAOooL,CAAW,GACnB,IAMH,OAJIb,GACA3nL,EAAMgyD,QAAQt0D,EAAAA,GAAsB,CAAC7J,GAAI,eAAgB0S,eAAgB,SAGtEvG,CAAK,IAOhB,MAAO,CAAC5K,EAAoB2hC,KACjB,CACH/2B,MAAOsoL,EAAgBlzL,EAAO2hC,EAAS8wJ,YAGnD,GAEA,CAA4CH,I,0ZCsB7B,MAAMe,WAAiB3rL,IAAAA,cAKlCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,yBALWxC,IAAAA,aAAoCwC,GAAA,wBACrCxC,IAAAA,aAAkCwC,GAAA,kBACzC,GAAKA,GAAA,oBAiCX,KAGV,IACME,KAAKhD,MAAM8qL,kBAAmB9nL,KAAKhD,MAAMgrL,oBAAuBhoL,KAAKkpL,UAEvE,OAGJ,MAAM,mBAACf,GAAsBnoL,KAAKhD,MAElCgD,KAAKkpL,WAAY,EACjBlpL,KAAKgH,UAAUpR,GACPuyL,EACO,CACHgB,cAAevzL,EAAMuzL,cAAgB,EACrCC,aAAc,wBAIf,CACHD,cAAevzL,EAAMuzL,cAAgB,EACrCC,aAAc,uBAEpB,IACLtpL,GAAA,6BAEsB,KACnB,MAAM,QAACO,EAAO,mBAAE8nL,EAAkB,KAAEx3K,EAAI,UAAEwoG,GAAan5G,KAAKhD,MAE5DgD,KAAKkpL,WAAY,EACjBlpL,KAAKgH,UAA0BpR,GACA,uBAAvBA,EAAMwzL,aACC,CACHA,aAAc,qBAEY,yBAAvBxzL,EAAMwzL,aACN,CACHA,aAAc,uBAGfxzL,IAGPuyL,EACA9nL,EAAQgpL,eAAe14K,EAAKtc,GAAI8kH,GAEhC94G,EAAQipL,YAAY34K,EAAKtc,GAAI8kH,EACjC,IACHr5G,GAAA,4BAEqBjM,UAClB,MAAM01L,EAAMvpL,KAAKhD,MAAMqrL,UAAU1nL,KAAKmnC,GAAaA,EAAS/rB,UAC5D/b,KAAKhD,MAAMqD,QAAQ+mD,wBAAwBmiI,EAAI,IAjF/C,MAAOpB,mBAAAA,EAAkB,cAAEqB,GAAiBxpL,KAAKhD,MAG7CgD,KAAKpK,MADLuyL,EACa,CACTiB,aAAc,oBACdD,cAAeK,GAGN,CACTJ,aAAc,sBACdD,cAAeK,EAG3B,CAEA/wI,kBAAAA,CAAmBC,GACf,GAAIA,EAAU8wI,gBAAkBxpL,KAAKhD,MAAMwsL,cAAe,CACtD,MAAM,mBAACrB,GAAsBnoL,KAAKhD,MAC5BosL,EAAejB,EAAqB,oBAAsB,sBAEhEnoL,KAAKkpL,WAAY,EACjBlpL,KAAKgH,SAAS,CACVmiL,cAAenpL,KAAKhD,MAAMwsL,cAC1BJ,gBAER,CACJ,CA0DAnmL,MAAAA,GACI,IAAKjD,KAAKhD,MAAM25H,cACZ,OAAO,KAEX,MAAM,gBACFmxD,EAAe,mBACfE,EAAkB,mBAClBG,EAAkB,UAClBhvE,EAAS,cACTqwE,EAAa,UACbnB,GACAroL,KAAKhD,OACH,cAACmsL,GAAiBnpL,KAAKpK,MACvB6zL,EAAgBtB,EAAqBqB,EAAgBA,EAAgB,EACrEE,EAAkBvB,EAAqBqB,EAAgB,EAAIA,EAC3DG,EAAaD,EAAkB,EAAKA,EAAkB,GACtDE,EAAWH,EAAgB,EAAKA,EAAgB,GAChDxiF,EAAWkiF,EAAgB,EAAKA,EAAgB,GAChDU,EAAiB/B,GAAmBE,EAAsB,GAAK,sBAE/D8B,EAAsB9pL,KAAKhD,MAAMm8G,UAAU50E,QAAQ,KAAM,KAC/D,IAAIwlJ,EAAiB,GAAH9rL,OAAMC,EAAAA,GAAsB,CAAC7J,GAAI,gCAAiC0S,eAAgB,eAAc,KAAA9I,OAAI6rL,GAClH3B,GAAsBH,IACtB+B,EAAiB,GAAH9rL,OAAMC,EAAAA,GAAsB,CAAC7J,GAAI,iCAAkC0S,eAAgB,oBAAmB,KAAA9I,OAAI6rL,IAG5H,MAAME,EACF1sL,IAAAA,cAAA,OACIC,UAAU,2BACVsO,IAAK7L,KAAKhD,MAAM25H,gBAIxB,OACIr5H,IAAAA,cAAC4qL,GAAe,CACZJ,gBAAiBA,EACjBE,mBAAoBA,EACpBG,mBAAoBA,EACpBhvE,UAAWA,EACXkvE,UAAWA,EACXD,OAAQpoL,KAAKiqL,qBAEb3sL,IAAAA,cAAA,UACIjJ,GAAE,gBAAA4J,OAAkB+B,KAAKhD,MAAM2T,KAAKtc,GAAE,KAAA4J,OAAI+B,KAAKhD,MAAMm8G,WACrD,aAAY4wE,EACZxsL,UAAS,YAAAU,OAAc+B,KAAKpK,MAAMwzL,aAAY,KAAAnrL,OAAI4rL,GAClDj9K,QAAS5M,KAAKq9C,YACdnF,IAAKl4C,KAAKkqL,mBAEV5sL,IAAAA,cAAA,QAAMC,UAAU,6BACXysL,EACD1sL,IAAAA,cAAA,QACI46C,IAAKl4C,KAAKmqL,iBACV5sL,UAAU,mBAEVD,IAAAA,cAAA,QAAMC,UAAU,oBACZD,IAAAA,cAAA,QAAMC,UAAU,6BAA6B0pG,GAC7C3pG,IAAAA,cAAA,QACIC,UAAU,8BACV6sL,eAAgBpqL,KAAKqqL,sBAEpBV,GAELrsL,IAAAA,cAAA,QAAMC,UAAU,6BAA6BqsL,OAOzE,EACH9pL,GAnKoBmpL,GAAQ,aAxDzB7lK,cAAahgB,IAAAA,OAAAC,WAKb81G,UAAS/1G,IAAAA,OAAAC,WAKTmmL,cAAapmL,IAAAA,OAAAC,WAKbglL,UAASjlL,IAAAA,MAAAC,WAKTykL,gBAAe1kL,IAAAA,KAAAC,WAKf2kL,mBAAkB5kL,IAAAA,KAAAC,WAKlBszH,cAAavzH,IAAAA,OAAAC,WAKb8kL,mBAAkB/kL,IAAAA,KAAAC,WAElBhD,QAAO+C,IAAAA,MAAA,CAKHkmL,YAAWlmL,IAAAA,KAAAC,WAKX+jD,wBAAuBhkD,IAAAA,KAAAC,WAKvBgmL,eAAcjmL,IAAAA,KAAAC,aAAAA,aCDtB,UAAe+B,EAAAA,EAAAA,UAhDf,WACI,MAAMklL,GAAsB5iI,EAAAA,GAAAA,IACxB,sBACA7vC,EAAAA,IACA,CAACjiB,EAAoByyL,IAA8BA,IACnD,CAACjlK,EAAuBilK,IACbA,EAAUzpJ,MAAMkJ,GAAaA,EAAS/rB,UAAYqH,MAIjE,OAAO,SAAyBxtB,EAAoB2hC,GAChD,MAAM7nB,EAAY6nB,EAAS5mB,KAAKG,WAEhC,IAAI6wB,EAEAA,EADA02F,GAAAA,GAA0BhsG,IAAIkL,EAAS4hF,WAC/Bkf,GAAAA,GAAaA,GAAAA,GAA0Bx3D,IAAItpC,EAAS4hF,aAE7CjtF,EAAAA,GAAAA,IAAsBt2B,GACtBirE,IAAItpC,EAAS4hF,WAGhC,IAAIwd,EAAgB,GAMpB,OALIh1F,IACAg1F,GAAgBC,EAAAA,GAAAA,IAAiBj1F,IAI9B,CACHve,eAHkBvL,EAAAA,EAAAA,IAAiBjiB,GAInC4zL,cAAejyJ,EAAS8wJ,UAAU3hL,OAClCohL,gBAAiBA,GAAgBlyL,EAAO8Z,GACxCs4K,mBAAoBA,GAAmBpyL,EAAO8Z,GAC9CinH,gBACAwxD,mBAAoBmC,EAAoB10L,EAAO2hC,EAAS8wJ,WAEhE,CACJ,IAEA,SAA4B10L,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBgkL,YAAW,KACXD,eAAc,KACdjiI,wBAAuBA,GAAAA,IACxBzzD,GAEX,GAEA,CAAgEs1L,IC1EjD,SAASsB,GAAgBvtL,GACpC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,uBAE7EzJ,IAAAA,cAAA,QAAM4gD,EAAE,y5DAIxB,C,0ZCAA,MAGMrjC,IAAW25C,EAAAA,EAAAA,gBAAe,CAC5Bg2H,aAAc,CACVn2L,GAAI,mCACJ0S,eAAgB,oBAwCT,MAAM0jL,WAAqBntL,IAAAA,cAGtCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,4BAHcxC,IAAAA,aAAoCwC,GAAA,kBAuBvD,IACDE,KAAK0qL,qBAAqB36K,UACpCjQ,GAAA,yBAEmB6hC,IAChB3hC,KAAKgH,SAAS,CAAC0iE,iBAAiB,IAChC,MAAMyvC,GAAYnvC,EAAAA,GAAAA,IAAaroC,GAC/B3hC,KAAKhD,MAAMqD,QAAQsqL,eAAe3qL,KAAKhD,MAAM2T,KAAKtc,GAAI8kH,EAAU,IACnEr5G,GAAA,wBAEiB,KACdE,KAAKgH,SAAS,CAAC0iE,iBAAiB,GAAO,IAC1C5pE,GAAA,0BAEoBrD,IACjBA,SAAAA,EAAGy0D,kBACHlxD,KAAKgH,SAAS,CAAC0iE,iBAAkB1pE,KAAKpK,MAAM8zE,iBAAiB,IAlC7D1pE,KAAKpK,MAAQ,CACTg1L,WAAY,GACZlhH,iBAAiB,EAEzB,CAEA,+BAAOnoE,CAAyBvE,EAAcpH,GAC1C,IAAIg1L,EAAah1L,EAAMg1L,WAEvB,IAAK,MAAO5iJ,WAAYmxE,KAAcz7G,OAAOoI,OAAsB,QAAhB+kL,EAAC7tL,EAAMqrL,iBAAS,IAAAwC,EAAAA,EAAI,CAAC,GAAI,KAAAA,EACnED,EAAWnhJ,SAAS0vE,KACrByxE,EAAa,IAAIA,EAAYzxE,GAErC,CAEA,OAAQyxE,IAAeh1L,EAAMg1L,WAAc,KAAO,CAACA,aACvD,CAqBA3nL,MAAAA,GACI,MAAM6nL,EAAkB,IAAIC,IAE5B,GAAI/qL,KAAKhD,MAAMqrL,UACX,IAAK,MAAMvgJ,KAAYpqC,OAAOoI,OAAO9F,KAAKhD,MAAMqrL,WAAY,CACxD,MAAMlvE,EAAYrxE,EAASE,WAEvB8iJ,EAAgBz+J,IAAI8sF,GACpB2xE,EAAgBjqH,IAAIs4C,GAAW7pG,KAAKw4B,GAEpCgjJ,EAAgBp7H,IAAIypD,EAAW,CAACrxE,GAExC,CAGJ,GAA6B,IAAzBgjJ,EAAgB1sL,KAChB,OAAO,KAGX,MAAMiqL,EAAYroL,KAAKpK,MAAMg1L,WAAWjqL,KAAKw4G,GACrC2xE,EAAgBz+J,IAAI8sF,GAEhB77G,IAAAA,cAAC2rL,GAAQ,CACLjuL,IAAKm+G,EACLxoG,KAAM3Q,KAAKhD,MAAM2T,KACjBwoG,UAAWA,EACXkvE,UAAWyC,EAAgBjqH,IAAIs4C,IAAc,KAIlD,OAGL6xE,EAAoBhrL,KAAKu7D,YAC/B,IAAIqP,EA3H8B,GA4H9BogH,IACApgH,EAAc57D,OAAO2hB,WAAaq6J,EAAkBrmI,wBAAwBoQ,MA5HtD,IA8HlB6V,EAAc,IACdA,EAhI0B,KAoIlC,IAAI3B,EAAc,KACdjpE,KAAKhD,MAAM8qL,kBACX7+G,EACI3rE,IAAAA,cAAA,QAAMC,UAAU,2BACZD,IAAAA,cAACktE,GAAAA,EAAkB,CACfrhE,KAAMnJ,KAAKpK,MAAM8zE,gBACjB5R,OAAQ93D,KAAKu7D,UACbtxD,OAAQjK,KAAK4pE,gBACba,aAAczqE,KAAK8pE,iBACnBc,YAAaA,EACbD,WAAY,IAEhBrtE,IAAAA,cAACgyK,GAAAA,EAAqB,CAClB5/J,UAAW1P,KAAKhD,MAAM2T,KAAKG,WAC3BnZ,OAAQqI,KAAKhD,MAAMrF,OACnBuoI,YAAa,CAAC/1G,GAAAA,EAAY49J,eAE1BzqL,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAOqP,GAAS2vK,cAEhBltL,IAAAA,cAAA,UACI,cAAY4Y,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,yBAA0B0S,eAAgB,mBAC3ExJ,UAAU,WACVqP,QAAS5M,KAAKmpE,mBAEd7rE,IAAAA,cAAA,QACIjJ,GAAE,eAAA4J,OAAiB+B,KAAKhD,MAAM2T,KAAKtc,IACnCkJ,UAAU,gBACV26C,IAAKl4C,KAAK0qL,sBAEVptL,IAAAA,cAACitL,GAAe,YAS5C,IAAIU,EAAuB,oBAK3B,OAJIjrL,KAAKpK,MAAM8zE,kBACXuhH,GAAwB,wCAIxB3tL,IAAAA,cAAA,OACI,cAAY4Y,EAAAA,EAAAA,IAAgB,CAAC7hB,GAAI,+BAAgC0S,eAAgB,cACjFxJ,UAAU,sBAET8qL,EACD/qL,IAAAA,cAAA,OAAKC,UAAW0tL,GACXhiH,GAIjB,EACHnpE,GA9IoB2qL,GAAY,aA1B7B9yL,OAAMyL,IAAAA,OAAAC,WAUNykL,gBAAe1kL,IAAAA,KAAAC,WAEfhD,QAAO+C,IAAAA,MAAA,CAKHunL,eAAcvnL,IAAAA,KAAAC,aAAAA,aCTtB,UAAe+B,EAAAA,EAAAA,UAzBf,WACI,MAAM8lL,GAAsBC,EAAAA,EAAAA,MAE5B,OAAO,SAAyBv1L,EAAoB2hC,GAAiB,IAAA6zJ,EACjE,MAAM17K,EAAY6nB,EAAS5mB,KAAKG,WAE1B5P,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO8Z,GAGlC,MAAO,CACH/X,OAH2B,QAAnByzL,EAAGlqL,aAAO,EAAPA,EAAS4W,eAAO,IAAAszK,EAAAA,EAAI,GAI/B/C,UAAW6C,EAAoBt1L,EAAO2hC,EAAS5mB,KAAKtc,IACpDyzL,gBAAiBA,GAAgBlyL,EAAO8Z,GAEhD,CACJ,IAEA,SAA4B/b,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBqlL,eAAcA,EAAAA,IACfh3L,GAEX,GAEA,CAAgE82L,I,gGCbhE,SAASY,GAAY51L,GAGX,IAHY,SAClB61L,EAAQ,WACRC,GACI91L,EACJ,MAAM9B,GAAWsxD,EAAAA,EAAAA,eACX5hC,GAAgBgxB,EAAAA,EAAAA,aAAYt8B,EAAAA,IAC5BqL,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5BlH,GAAO0jC,EAAAA,EAAAA,cAAaz+C,IAAuB6yB,EAAAA,EAAAA,IAAQ7yB,EAAO01L,KAC1DE,GAAuBv0K,EAAAA,EAAAA,SAAQw0K,GAAAA,GAA0B,CAAC96K,EAAKtc,KAC/Dg6C,GAASgG,EAAAA,EAAAA,cAAaz+C,GAAuB41L,EAAqB51L,EAAO+a,MAE/E+xC,EAAAA,EAAAA,YAAU,MACFgpI,EAAAA,GAAAA,IAAkBr9I,IAAWA,EAAOkB,cAAgBlB,EAAOP,YAAc,GACzEn6C,GAASopC,EAAAA,GAAAA,IAAY3Z,EAAeC,EAAeioK,GACvD,GACD,IAEH,MAAM,aACFK,EACA79I,YAAa89I,EAAe,EAC5BtwJ,cAAeuwJ,EACft8I,aAAcu8I,GAAc,EAC5Bn7K,MACIG,WAAYpB,IAEhB2+B,EAEE09I,GAAiB90K,EAAAA,EAAAA,UAAQ,KAAO00K,GAAgB,IAAIhrL,KAAIzF,IAAA,IAAC,GAAC7G,GAAG6G,EAAA,OAAK7G,CAAE,IAAEkvI,WAAW,CAACooD,IAElFK,GAAcj1K,EAAAA,EAAAA,cAAata,IACzB8uL,EACAA,EAAW9uL,KAIfZ,EAAAA,EAAAA,IAAW,MAAO,wBAClBY,EAAEy0D,kBACFv9D,GAASs4L,EAAAA,EAAAA,IAAW,CAAC53L,GAAIi3L,EAAUx6K,WAAYpB,KAAoB,GACpE,CAAC67K,EAAYD,EAAU57K,IAEpBw8K,GAAkBn1K,EAAAA,EAAAA,cAAata,IACjCA,EAAEy0D,kBACFv9D,GAASw4L,EAAAA,GAAAA,IAAgB/oK,EAAeC,EAAeioK,GAAWQ,GAAa,GAChF,CAACA,IAEJ,OACIxuL,IAAAA,cAAA,OAAKC,UAAU,gBACTuuL,KAAeJ,EAAAA,GAAAA,IAAkBr9I,IAAYA,EAAOU,eAGlDzxC,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,kGACfjB,OAAQ,CAACsmL,WAAY/9I,EAAOU,mBAIpCzxC,IAAAA,cAAA,OACIC,UAAU,YACVu1D,SAAU,GAEVx1D,IAAAA,cAAA,OAAKC,UAAU,kBAfvBD,IAAAA,cAAA,OAAKC,UAAU,cAoBlBwuL,GAAkBA,EAAerlL,OAAS,EACvCpJ,IAAAA,cAAC+uL,GAAAA,EAAO,CACJ/0I,QAASy0I,EACT3tL,KAAK,OAET,KAEHiwC,EAAOP,YAAc,GAClBxwC,IAAAA,cAACorK,GAAAA,EAAM,CACH97J,QAASo/K,EACTzuL,UAAU,wBACV+uL,QACIhvL,IAAAA,cAAA,QAAMC,UAAU,QACZD,IAAAA,cAAA,KAAGC,UAAU,yBAIrBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,oEACfjB,OAAQ,CAAC8lL,mBAKrBtuL,IAAAA,cAACivL,GAAAA,EAAY,CACTT,YAAaA,EACbvuL,UAAU,YACVqP,QAASs/K,IAGZriL,QAAQgiL,IACLvuL,IAAAA,cAACkiD,GAAAA,GAAS9hD,OAAAC,OAAA,CACNmD,MAAO+qL,GACHW,GAAAA,IAEH54H,IAAA,IAAC,UAAC64H,GAAU74H,EAAA,OACTt2D,IAAAA,cAAA,QAAMC,UAAU,mCACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,yBACfjB,OAAQ,CAAC2mL,eAEV,IAM/B,CAACpB,GAAA1lL,UAAA,CAxHG4lL,WAAUnoL,IAAAA,MA0Hd,UAAeypD,EAAAA,EAAAA,MAAKw+H,I,gBCrJL,SAASqB,GAAc1vL,GAClC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACI,aAAYwJ,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,cACrE4E,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRwB,QAAQ,OAER3hD,IAAAA,cAAA,KACI6gD,OAAO,OACPM,YAAY,IACZf,KAAK,UACLoB,SAAS,WAETxhD,IAAAA,cAAA,KACI0gD,UAAU,uCACVN,KAAK,WAELpgD,IAAAA,cAAA,QAAM4gD,EAAE,2iBAMhC,C,kGCvBO,SAASyuI,GAAel3L,GAA2B,IAA1B,KAACgI,EAAI,UAAEmvL,GAAiBn3L,EACpD,MAAMo3L,EAAaD,EAAY,mCAAqC,yBACpE,OACItvL,IAAAA,cAAA,QAAMC,UAAS,GAAAU,OAAKR,EAAI,KAAAQ,OAAI4uL,IAEpC,C,0ZAACF,GAAAhnL,UAAA,CATGlI,KAAI2F,IAAAA,OAAAC,WACJupL,UAASxpL,IAAAA,MC4Bb,MAEa0pL,GAAsB,uBAwD5B,MAAMC,WAAwBzvL,IAAAA,cAQjCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,sBAuBD,KACRE,KAAKhD,MAAMgd,cAAgBha,KAAKpK,MAAMo3L,aACtChtL,KAAKhD,MAAMqD,QAAQ4sL,cAAcjtL,KAAKhD,MAAM2T,KAAKG,WAAY9Q,KAAKhD,MAAMrF,QAAQ6R,MAAK/T,IAAY,IAAX,KAACxB,GAAKwB,EACxFuK,KAAKgH,SAAS,CAACgmL,YAAa/4L,GAAM,GAE1C,IACH6L,GAAA,8BAEuB,KACpB,MACMotL,EAAsB,CACxB98K,QAASC,EAAAA,GAAiBie,mBAC1B/d,WAAYge,GAAAA,EACZ/d,YAAa,CAACge,WAJiB,iBAMnCxuB,KAAKhD,MAAMqD,QAAQ8P,UAAU+8K,EAAoB,IACpDptL,GAAA,0BAEmBjM,UAChB,MAAM,KAAC8c,EAAI,KAAE9J,GAAQ7G,KAAKhD,MAEpBoQ,GAAUkkK,EAAAA,GAAAA,IACZpjK,EAAQskK,OACRtkK,EAAQuB,SACRzP,KAAKhD,MAAM2T,KAAKG,WAChB9Q,KAAKhD,MAAMrF,OACXqI,KAAKhD,MAAM2T,KAAKtc,GAChB2L,KAAKhD,MAAM2T,KAAKI,SAGdtJ,QAAYzH,KAAKhD,MAAMqD,QAAQ4N,mBAAmBC,EAASd,EAASvG,GAE1E,GAAIY,EAAIzT,MAAO,CACX,MAAM4T,EAAgBH,EAAIzT,MACpB6T,EAAeD,EAAcE,MAAQjB,EAAKC,cAAc,CAC1DzS,GAAI,qBACJ0S,eAAgB,4BAGpB,YADA/G,KAAKhD,MAAMqD,QAAQoQ,iCAAiC7I,EAAeC,EAAc8I,EAErF,CAEA,MAAM/H,EAAWnB,EAAIxT,KACrB,OAAQ2U,EAASpQ,MACjB,KAAK4P,GAAAA,GAAqBE,GAClBM,EAASd,MACT9H,KAAKhD,MAAMqD,QAAQoQ,iCAAiC7H,EAAUA,EAASd,KAAM6I,GAEjF,MACJ,KAAKvI,GAAAA,GAAqBG,SACtB,MACJ,KAAKH,GAAAA,GAAqBC,KAClBO,EAAS/C,MACT7F,KAAKhD,MAAMqD,QAAQ6P,cAActH,EAAS/C,KAAMuH,GAEpD,MACJ,QAAS,CACL,MAAMvF,EAAehB,EAAKC,cAAc,CACpCzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAMoQ,EAASpQ,OAEnBwH,KAAKhD,MAAMqD,QAAQoQ,iCAAiC7H,EAAUf,EAAc8I,EAChF,EACA,IACH7Q,GAAA,sBAyCgB6kE,GAETrnE,IAAAA,cAAA,MACIjJ,GAAE,gBAAA4J,OAAkB+B,KAAKhD,MAAM2T,KAAKtc,GAAE,KAAA4J,OAAI0mE,GAC1CpnE,UAAU,oBACV6M,KAAK,eAGhBtK,GAAA,6BAEuBmP,IAAkB,IAAAk+K,EAAAtlD,EAAAulD,EAGtC,GAF+B,QAA/BD,GAAAtlD,EAAA7nI,KAAKhD,OAAMuwI,4BAAoB,IAAA4/C,GAA/BA,EAAA3+K,KAAAq5H,EAAkC54H,IAE7BA,EACD,OAGJ,MAAMo+K,EAAmC,QAAzBD,EAAGptL,KAAK+sI,UAAUh9H,eAAO,IAAAq9K,OAAA,EAAtBA,EAAwBzoI,wBAC3C,IAAIpG,EAEAA,OADyB,KAAlB8uI,aAAU,EAAVA,EAAY9uI,QACW,KAAnB8uI,aAAU,EAAVA,EAAYzoI,KAAqB,EAAIyoI,aAAU,EAAVA,EAAYzoI,IAExDyoI,aAAU,EAAVA,EAAY9uI,EAEpB,MAEMsvF,EAFe7+H,OAAO+5H,YA7NT,GAgOb+E,EAAavvF,EAAIx7B,EAAAA,GAAUgrH,sBAC3BC,EAAiBH,GAAcC,EAAa/qH,EAAAA,GAAUkrH,kBAE5DjuI,KAAKgH,SAAS,CACVo3D,OAAS0vE,EAAaE,GACxB,IAhKFhuI,KAAKpK,MAAQ,CACTwoE,QAAQ,GAGZp+D,KAAK+sI,UAAYzvI,IAAAA,WACrB,CAEAm7C,kBAAAA,CAAmBC,GACX14C,KAAKhD,MAAMugK,aAAe7kH,EAAU6kH,YACpCv9J,KAAKitL,eAEb,CAEA,+BAAO1rL,CAAyBvE,GAC5B,MAAMpH,EAAwB,CAAC,EAI/B,OAHIoH,EAAMgwL,cACNp3L,EAAMo3L,YAAchwL,EAAMgwL,aAEvBp3L,CACX,CAsEA03L,mBAAAA,GACI,OACIhwL,IAAAA,cAACs4J,GAAAA,EAAoB,CACjB11B,YAAa,CAAC/1G,GAAAA,EAAY6yE,eAC1BhiG,IAAI,iCAEJsC,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,0BAGvBzJ,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAe,iCAI3BzJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,UACIjJ,GAAG,oBACHkJ,UAAU,2CACVqP,QAAS5M,KAAKutL,uBAEdjwL,IAAAA,cAACqvL,GAAe,CAAClvL,KAAK,8DACtBH,IAAAA,cAAA,QAAMC,UAAU,iCACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,6BAO3C,CAqCA9D,MAAAA,GAA0B,IAAAmxJ,EAAAo5B,EAEtB,GADwBC,EAAAA,GAA0BztL,KAAKhD,MAAM2T,MAEzD,OAAO,KAGX,MAAMm1D,GAAwC,QAA1BsuF,EAAAp0J,KAAKhD,MAAM+xI,uBAAe,IAAAqlB,OAAA,EAA1BA,EAChB3zJ,QAAQxD,GACGA,EAAKwD,OAASxD,EAAKwD,OAAOT,KAAKhD,MAAM2T,KAAKtc,IAAM4I,IAE3D0D,KAAK1D,GACGA,EAAKma,QAED9Z,IAAAA,cAAC4Z,GAAAA,EAAKC,YAAW,CACbnc,IAAKiC,EAAK5I,GAAK,kBACfA,GAAI4I,EAAK5I,GACT4yB,OAAQjnB,KAAKhD,MAAM2T,KAAKtc,GACxByT,KAAM7K,EAAK6K,KACXsP,QAASna,EAAKma,QACdC,OAAQpa,EAAKoa,OACbC,MAAM,IAKdha,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZ91G,IAAKiC,EAAK5I,GAAK,kBACfyT,KAAM7K,EAAK6K,KACX8E,QAASA,KACD3P,EAAKoa,QACLpa,EAAKoa,OAAOrX,KAAKhD,MAAM2T,KAAKtc,GAChC,QAIV,GAEV,IAAI24L,EAAc,GACdhtL,KAAKhD,MAAMgd,aAAeha,KAAKpK,MAAMo3L,cACrCA,EAAchtL,KAAKpK,MAAMo3L,YAAYrsL,KAAK1D,IACtC,IAAII,EASJ,OARIJ,EAAKI,OACLA,EACIC,IAAAA,cAAA,OACItC,IAAKiC,EAAKu1K,OAAS,WACnB3mK,IAAK5O,EAAKI,QAKlBC,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZhpG,KAAM7K,EAAKiC,MACXlE,IAAKiC,EAAKu1K,OAASv1K,EAAKwS,SACxB7C,QAASA,IAAM5M,KAAK0tL,kBAAkBzwL,GACtCI,KAAMA,GACR,KAKd,MAAM,cAACyJ,GAAiB9G,KAAKhD,MAAM6J,KAEnC,IAiBI+/G,EAjBA+mE,EAAc,KACd3tL,KAAKhD,MAAM4wL,qBACXD,EACIrwL,IAAAA,cAACA,IAAAA,SAAc,CAACtC,IAAK,eAChBgF,KAAK6tL,cAAc,eACpBvwL,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZz8G,GAAE,oBAAA4J,OAAsB+B,KAAKhD,MAAM2T,KAAKtc,IACxC2G,IAAG,eAAAiD,OAAiB+B,KAAKhD,MAAM2T,KAAKtc,IACpC8U,MAAM,EACNrB,KAAMhB,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,oBAClE1J,KAAMC,IAAAA,cAACqvL,GAAe,CAAClvL,KAAK,gCAC5BmP,QAAS5M,KAAKutL,0BAO9B,MAAMO,EAAUjkL,QAAQmjL,EAAYtmL,QAC9BqnL,EAAgBlkL,QAAkD,QAA3C2jL,EAACxtL,KAAKhD,MAAMF,WAAWgwL,WAAoB,IAAAU,OAAA,EAA1CA,EAA4C9mL,QAGpEsnL,EAFiBnkL,QAAQi8D,aAAW,EAAXA,EAAap/D,SAEConL,GAAWC,EACxD,IAAK/tL,KAAKhD,MAAM4wL,qBAAuBI,EACnC,OAAO,KAGX,GAAIA,EAQApnE,EAAY,CACR9gD,EACAknH,EARA1vL,IAAAA,cAAC2wL,GAAAA,QAAS,CACNhnK,OAAQjnB,KAAKhD,MAAM2T,KAAKtc,GACxB65L,cAAepB,GACf9xL,IAAKgF,KAAKhD,MAAM2T,KAAKtc,GAAK,cAO9Bs5L,QAIJ,GADA/mE,EAAY,CAAC5mH,KAAKstL,wBACbttL,KAAKhD,MAAMmxL,WACZ,OAAO,KAIf,OACI7wL,IAAAA,cAACka,GAAAA,EAAW,CACRvI,KAAMjP,KAAKhD,MAAMugK,WACjB1iF,SAAU76E,KAAKutI,sBAEfjwI,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,qBAIvBzJ,IAAAA,cAAA,UACItC,IAAI,sBACJk9C,IAAKl4C,KAAK+sI,UACV14I,GAAE,GAAA4J,OAAK+B,KAAKhD,MAAMyS,SAAQ,oBAAAxR,OAAmB+B,KAAKhD,MAAM2T,KAAKtc,IAC7D,aAAYyS,EAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,YAAYxG,cAChGhD,UAAWk3C,IAAW,kBAAmB,CACrC,0BAA2Bz0C,KAAKhD,MAAMugK,aAE1C/kK,KAAK,SACL,gBAAc,SAEd8E,IAAAA,cAAA,KAAGC,UAAW,qBAGtBD,IAAAA,cAAC4Z,GAAAA,EAAI,CACD7iB,GAAE,GAAA4J,OAAK+B,KAAKhD,MAAMyS,SAAQ,sBAAAxR,OAAqB+B,KAAKhD,MAAM2T,KAAKtc,IAC/DojB,UAAU,EACV2mD,OAAQp+D,KAAKpK,MAAMwoE,OACnB1mD,UAAW5Q,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,uBACzE/L,IAAG,GAAAiD,OAAK+B,KAAKhD,MAAMyS,SAAQ,sBAAAxR,OAAqB+B,KAAKhD,MAAM2T,KAAKtc,KAE/DuyH,GAIjB,EACH9mH,GAnUYitL,GAAe,aAtDxBC,YAAW5pL,IAAAA,UAAA,CAAAA,IAAAA,MAAAA,IAAAA,MAAA,UACX4W,YAAW5W,IAAAA,KAAAC,WACXkqI,qBAAoBnqI,IAAAA,KAEpBm6J,WAAUn6J,IAAAA,KACV+qL,WAAU/qL,IAAAA,KAAAC,WACVoM,SAAQrM,IAAAA,UAAA,CAAAA,IAAAA,MAAA,CAAG,WAAQA,IAAAA,MAAA,CAAG,aAAUA,IAAAA,MAAA,CAAG,gBAAaA,IAAAA,MAAA,CAAG,WAAQA,IAAAA,SAC3D2rI,gBAAe3rI,IAAAA,MAEfzL,OAAMyL,IAAAA,OAAAC,WACNuqL,mBAAkBxqL,IAAAA,KAAAC,WAKlBvG,WAAUsG,IAAAA,SAAAA,IAAAA,OAAAC,WAIVhD,QAAO+C,IAAAA,MAAA,CAKH+M,UAAS/M,IAAAA,KAAAC,WAoBT4pL,cAAa7pL,IAAAA,KAAAC,aAAAA,aAAAvD,GAURitL,GAAe,eACqB,CACzCC,YAAa,GACbv9K,SAAU+wC,EAAAA,GAAUwvB,OACpB++D,gBAAiB,KAiUzB,UAAejiI,EAAAA,EAAAA,YAAWigL,IC3XpBqB,GAA8B,GAE9BC,GC5BC,WACH,MAAMC,GAAyBC,EAAAA,EAAAA,IAAwBnd,GAAAA,GAAoBod,gBACrEC,GAAsBC,EAAAA,EAAAA,IAA0Btd,GAAAA,GAAoBod,gBAC1E,OAAO9mI,EAAAA,GAAAA,IACH,sBACA4mI,EACAG,GACA,CAAC74L,EAAoB6Z,IAAsBA,IAC3C,CAACk/K,EAA8BC,EAA2Bn/K,KACtD,OAAQA,GACR,KAAK+wC,EAAAA,GAAUuvB,SACf,KAAKvvB,EAAAA,GAAUC,YACX,OAAOmuI,EACX,KAAKpuI,EAAAA,GAAUquI,OACX,OAAO,KACX,KAAKruI,EAAAA,GAAUwvB,OACf,QACI,OAAO2+G,EACX,GAGZ,CDO6BG,GAEvB7B,IAAgBz9K,EAAAA,GAAAA,IAAkB4hK,GAAAA,GAAoBod,gBA2C5D,IAAeppL,EAAAA,EAAAA,UAzCf,SAAyBxP,EAAoB2hC,GACzC,MAAM,KAAC5mB,GAAQ4mB,EAETw3J,GAAgBC,EAAAA,EAAAA,IAAgBr+K,GAEhCg/J,GAAO31J,EAAAA,EAAAA,IAAYpkB,GACnBq5L,EAAetf,IAASof,KAAkBG,EAAAA,GAAAA,IAA2Bv+K,EAAKtc,IAChF,IAAI24L,EAAmCoB,GACnCa,IACAjC,EAAcqB,GAAqBz4L,EAAO2hC,EAAS9nB,WAEvD,MAAM8uB,GAAcle,EAAAA,EAAAA,IAAezqB,GAC7Bu4L,GAAa9/F,EAAAA,GAAAA,IAAc9vD,EAAY7/B,OAE7C,MAAO,CACHsuL,cACAhzK,YAAa21J,EACb7yK,WAAYlH,EAAM+oE,QAAQ7hE,WAC1BqxL,aACAp/C,gBAAiBn5I,EAAM+oE,QAAQ7hE,WAAWqyL,iBAC1Cx3L,QAAQogB,EAAAA,EAAAA,IAAiBniB,GACzBuzI,cAAc7kF,EAAAA,EAAAA,IAAgB1uD,GAC9Bg4L,oBACIv/J,EAAAA,EAAAA,IAAqBz4B,KACrBu4B,EAAAA,GAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAYiE,0BAG1D,IAEA,SAA4Bz6B,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB2I,mBAAkB,MAClBg/K,iBACA98K,UAAS,IACTD,cAAa,MACbO,iCAAgCA,GAAAA,IACjC9c,GAEX,GAEA,CAA4Dy7L,IEhF7C,SAASC,GAAUryL,GAC9B,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACR6xI,iBAAiB,qBACjBllL,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,sBAAuB0S,eAAgB,gBAEtEzJ,IAAAA,cAAA,QAAM4gD,EAAE,2mCAIxB,CCFA,MAAMqxI,GAAc95L,IAOP,IAPQ,SACjBga,EAAW,SAAQ,YACnB+/K,EAAc,GAAE,aAChBt+D,EAAe,EAAC,WAChBu+D,EAAa,GAAE,mBACfC,EAAkB,OAClBzoK,GACIxxB,EACJ,MAAMoR,GAAOiQ,EAAAA,EAAAA,WAEb,IAAI64K,EAAuC,KACvCC,EAAY,wCACZ1+D,EAAe,GACf0+D,GAAa,yBACbD,EACIryL,IAAAA,cAAA,QAAMC,UAAU,4BACX2zH,IAGc,KAAhBs+D,IACPI,EAAY,GAAH3xL,OAAM2xL,EAAS,KAAA3xL,OAAIuxL,IAGhC,MAAMK,EAAahpL,EAAKC,cAAc,CAClCzS,GAAI,uCACJ0S,eAAgB,UAGpB,OACIzJ,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAOqkL,GAEPvyL,IAAAA,cAAA,UACIjJ,GAAE,GAAA4J,OAAKwR,EAAQ,iBAAAxR,OAAgBgpB,GAC/B,aAAY4oK,EAAWtvL,cACvBhD,UAAS,GAAAU,OAAK2xL,EAAS,KAAA3xL,OAAIwxL,GAC3B7iL,QAAS8iL,GAETpyL,IAAAA,cAAA,QAAMC,UAAU,6BACZD,IAAAA,cAAC+xL,GAAS,CAAC9xL,UAAU,qBACpBoyL,IAGC,EAEpBJ,GAAA5pL,UAAA,CArDE8J,SAAQrM,IAAAA,IACRssL,mBAAkBtsL,IAAAA,KAClBosL,YAAWpsL,IAAAA,OACX8tH,aAAY9tH,IAAAA,OACZ6jB,OAAM7jB,IAAAA,OACNqsL,WAAUrsL,IAAAA,OAAAC,YAkDd,Y,2ECjDA,MAAMysL,GAAuD,CACzDx8I,QAAS,gCACTq1B,KAAM,6BACN50E,QAAS,gCACTulL,QAAS,gCACTz4D,OAAQ,gCAONkvE,GAAsB5wI,KAAAA,IAAUC,WAAC,CAADt7C,YAAA,uBAAVq7C,EAAW1pD,IAAuC,IAAtC,MAACk3D,GAAgCl3D,EACrE,OAAOk+D,EAAAA,GAAAA,KAAG,mUAWmBhH,EAGJA,EAAK,IAK5BqjI,GAAmB7wI,KAAAA,IAAUC,WAAA,CAAAt7C,YAAA,oBAAVq7C,CAAU,wEAO7B8wI,GAAoB9wI,KAAAA,GAASC,WAAA,CAAAt7C,YAAA,qBAATq7C,CAAS,iHAQ7B+wI,GAAmB/wI,KAAAA,EAAQC,WAAC,CAADt7C,YAAA,oBAARq7C,EAASjkD,IAAmC,IAAlC,QAACi1L,GAA4Bj1L,EAC5D,MAAMk1L,EAAOD,EAAU,QAAU,OACjC,OAAOx8H,EAAAA,GAAAA,KAAG,uHACOy8H,EAAI,IASnBC,GAAkBz8H,IAAwD,IAAvD,QAAC+wB,EAAO,MAAEn5E,EAAK,KAAE1D,EAAI,GAAEzT,EAAK,IAAsBu/D,EACvE,MAAMjH,EAAQmjI,GAAgBnrG,GAExB2rG,EAAY,CACdlyL,KAAM,GACNuuD,MAAO,OAAF1uD,OAAS0uD,EAAK,MAGvB,IAAItvD,EAAO,KACX,OAAQsnF,GACR,IAAK,OACDtnF,EAAOC,IAAAA,cAACyvD,GAAAA,uBAA2BujI,GACnC,MACJ,IAAK,UACDjzL,EAAOC,IAAAA,cAACk9E,GAAAA,UAAc81G,GACtB,MACJ,IAAK,UACL,IAAK,SACDjzL,EAAOC,IAAAA,cAAC49E,GAAAA,iBAAqBo1G,GAOjC,OACIhzL,IAAAA,cAACyyL,GAAmB,CAChBpjI,MAAOA,EACP,6BAAA1uD,OAA4B5J,EAAK,IAAH4J,OAAO5J,GAAO,KAE5CiJ,IAAAA,cAAC0yL,GAAgB,KACZ3yL,GAEJmO,GAASlO,IAAAA,cAAC2yL,GAAiB,KAAEzkL,GAC7B1D,GACGxK,IAAAA,cAAC4yL,GAAgB,CACbC,SAAU3kL,EACV,cAAa,qBAEZ1D,GAGS,EAE5BuoL,GAAA1qL,UAAA,CA9GEtR,GAAE+O,IAAAA,OACFwoF,YAAWxoF,IAAAA,KACXoI,MAAKpI,IAAAA,UAAA,CAAAA,IAAAA,QAAAA,IAAAA,SACL0E,KAAI1E,IAAAA,UAAA,CAAAA,IAAAA,QAAAA,IAAAA,SAAAC,WACJshF,QAAOvhF,IAAAA,MAAA,CAPgB,UAAY,OAAS,UAAW,UAAY,WAAQC,YAmH/E,UAAewpD,EAAAA,EAAAA,MAAKwjI,I,kkCC9GpB,MCwCaE,GAA6BrvL,IAAgB,CACtDhC,MAAOgC,EAAQ/D,cAAgB+D,EAAQzD,KACvCqD,MAAOI,EAAQ7M,GACf6Y,QAAShM,IAGPsvL,GAAmBxzL,IACrB,MAAM,QAACkQ,GAAWlQ,GAEZ,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WAElBsM,GAAgBixB,EAAAA,EAAAA,cAAaz+C,IAAuBiiB,EAAAA,EAAAA,IAAiBjiB,KACrE8K,GAAO2zC,EAAAA,EAAAA,cAAaz+C,IAAuB4hC,EAAAA,EAAAA,IAAQ5hC,EAAOsX,EAAQ1Y,QAAU,MAC5EmI,GAAS03C,EAAAA,EAAAA,cAAaz+C,IAAuBqsD,EAAAA,EAAAA,IAAmBrsD,EAAOsX,EAAQ1Y,QAAU,MACzF8tD,GAAWjO,EAAAA,EAAAA,cAAaz+C,IAAuB66L,EAAAA,EAAAA,IAAkB76L,EAAOsX,EAAQ7Y,MAChF8qB,GAAOk1B,EAAAA,EAAAA,cAAaz+C,IAAuBurB,EAAAA,EAAAA,IAAQvrB,EAAOsX,EAAQ4K,WAClE44K,GAAehwL,aAAI,EAAJA,EAAMrM,KAAM6J,EAAAA,GAAsBwC,EAAKrM,GAAIqM,EAAKy6C,qBAC/Dw1I,GAAsBt8I,EAAAA,EAAAA,cAAaz+C,GAAoD,KAA7BqrB,EAAAA,EAAAA,IAAWrrB,GAAO8Q,SAIlF,IAAIrJ,EACJ,MAAMizL,EAAY,CACdlyL,KAAM,GACNuuD,MAAO,+CAIPtvD,EATsB6P,EAAQkU,UAAY,EASnC9jB,IAAAA,cAACoxI,GAAAA,mBAAuB4hD,GACxBpjL,EAAQ1U,OAASuqB,EAAAA,GAAUyB,aAC3BlnB,IAAAA,cAACszL,GAAAA,UAAcN,GACfpjL,EAAQ1U,OAASuqB,EAAAA,GAAU0B,gBAC3BnnB,IAAAA,cAACuzL,GAAAA,gBAAoBP,GACrBpjL,EAAQ1U,OAASuqB,EAAAA,GAAUG,QAC3B5lB,IAAAA,cAACg+E,GAAAA,uBAA2Bg1G,GAC5BpjL,EAAQ1U,OAASuqB,EAAAA,GAAUC,WAC3B1lB,IAAAA,cAAA,OAAKC,UAAU,wBAAwB,KAG1CD,IAAAA,cAAC29C,GAAAA,EAAc,CACXpvC,IAAK6kL,EACL/zL,OAAQ2lD,GAAYA,EAAS/jD,YAASjG,EAAYqE,EAClDyB,KAAK,OAKjB,IAAIqjC,EAAe,KAEfhkC,EAAOyP,EAAQ/P,aACfK,EAAc,IAAHS,OAAOiP,EAAQzP,MAE1Bg0K,EAAM,KACV,GAAIvkK,EAAQ1U,OAASuqB,EAAAA,GAAU0K,WAAY,KAAAqjK,EACnCxuI,SAAAA,EAAU/jD,OACVkzK,EAAMn0K,IAAAA,cAACkB,GAAAA,EAAM,OACNC,EAAAA,GAAAA,GAAuB,QAAhBqyL,EAACxuI,aAAQ,EAARA,EAAU5jD,aAAK,IAAAoyL,EAAAA,EAAI,MAClCrf,EAAMn0K,IAAAA,cAACqB,GAAAA,EAAQ,OAGnB,MAAMyzG,EAAa,CACf2+E,aAAc,EACdx1F,WAAY,GAGhB95D,EACInkC,IAAAA,cAACw0G,GAAAA,EAAiB,CACdjrB,aAAa,EACbkrB,OAAQrxG,EAAKrM,GACb+9G,WAAYA,IAIpB,MAAM4+E,EAActwL,EAAK0gB,UAAY,MAAHnjB,OAAS6I,EAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,iBAAoB,IAElImG,EAAQ/P,cAAiBmlD,SAAAA,EAAU/jD,QAGnCd,EAAOiD,EAAK7C,SACR6C,EAAKrM,KAAO+uB,IACZ3lB,GAAQ,IAAJQ,OAAQ6I,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,YAEhFvJ,EAAcwzL,GANdxzL,EAAc,IAAHS,OAAOyC,EAAK7C,UAAQI,OAAG+yL,EAQ1C,MAAW9jL,EAAQ1U,OAASuqB,EAAAA,GAAUC,aAElCvlB,EAAOyP,EAAQ/P,aACfK,EAAc,IAGlB,MAAMyzL,EAAa/jL,EAAQgzD,OACvB5iE,IAAAA,cAACs0G,GAAAA,EAAsB,CACnBr0G,UAAU,wBAEd,KAEEm8C,EAAWxsC,EAAQ4K,SAAWqH,EAChC7hB,IAAAA,cAAA,QAAMC,UAAU,qBAAqB4hB,EAAKhiB,cAC1C,KAEE+zL,EAAgBl0L,EAAMm0L,cAAgB,cAAgB,SAEtDC,EAAc,+BAAHnzL,OAAkCizL,EAAa,KAAAjzL,OAAIiP,EAAQ7Y,IAE5E,OACIiJ,IAAAA,cAAA,OACIjJ,GAAI+8L,EACJ7zL,UAAWP,EAAMO,UACjB,cAAa2P,EAAQzP,KACrB,aAAYA,GAEXJ,EACDC,IAAAA,cAAA,QAAMC,UAAU,mBACZD,IAAAA,cAAA,QAAMC,UAAU,yBAAyBE,IACvCkzL,GAAuBzjL,EAAQ1U,OAASuqB,EAAAA,GAAU0K,aAAejwB,GAC/DF,IAAAA,cAAA,QAAMC,UAAU,gCAAgCC,GAEnDikC,EACAwvJ,EACAxf,IAEHkf,GAAuBj3I,EACvB,EAEZ82I,GAAA7qL,UAAA,CAtIEzG,MAAKkE,IAAAA,OAAAC,WACLvC,MAAKsC,IAAAA,OAAAC,YAuIT,MAAMxG,GAAUG,IACZ,MAAM,KAAC/I,GAAQ+I,EAETslD,GAAWjO,EAAAA,EAAAA,cAAaz+C,IAAuB66L,EAAAA,EAAAA,IAAkB76L,EAAO3B,EAAKiZ,QAAQ7Y,MAE3F,OAAIiuD,SAAAA,EAAU/jD,OACH,KAIPjB,IAAAA,cAACR,GAAAA,EAAWD,OAAWG,EACnBM,IAAAA,cAACkzL,GAAe9yL,OAAAC,OAAA,GACR1J,EAAI,CACRsJ,UAAU,YAEE,EAItB8zL,GAAer0L,IACjB,MAAM,KAAC/I,GAAQ+I,EAEf,OACIM,IAAAA,cAACR,GAAAA,EAAWu0L,YAAgBr0L,EACxBM,IAAAA,cAACkzL,GAAe9yL,OAAAC,OAAA,GACR1J,EAAI,CACRk9L,eAAe,EACf5zL,UAAU,iBAEO,EAI3BwsJ,GAAqB/sJ,GAEnBM,IAAAA,cAACR,GAAAA,EAAWitJ,kBAAsB/sJ,EAC9BM,IAAAA,cAACs0D,GAAAA,gBAAe,CACZxzD,KAAM,GACNuuD,MAAO,iDAavB,SAAS2kI,GAAwB77L,GAAuG,IAAtG,SAACu7D,EAAQ,MAAElwD,EAAK,kBAAEywL,EAAiB,kBAAEC,EAAoB,CAAC,IAAK,IAAK,IAAK,MAA2B/7L,EAClI,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,YACjB/G,QAAS0hL,IAAYtoI,EAAAA,EAAAA,QAA8B,IAAIuoI,GAAAA,IAE9DhvI,EAAAA,EAAAA,YAAU,KACN+uI,EAASE,eAAgB,CAAI,GAC9B,CAACF,IAEJ,MAAMl/D,ED9Naq/D,KACnB,MAAMC,EAAgBD,EAHL,GADF,EAMf,MAAQ,CACJrtI,MAAQzlD,GAAuB1K,GAAAA,GAAA,GACxB0K,GAAQ,IACXg/E,QAAS,EACTg0G,OAAQ,EACRnlI,MAAO,gCAEXhrD,YAAc7C,GAAuB1K,GAAAA,GAAA,GAC9B0K,GAAQ,IACXgzL,OAAQ,EACRnlI,MAAO,8CACPxhD,SAAU,OACVk/I,WAAY,SAKhBlsE,QAASA,CAACr/E,EAAyBlJ,KAC/B,MAAMm8L,EAAc,mCAEpB,OAAA39L,GAAAA,GAAA,GACO0K,GAAQ,IACX6tD,MAAO,8BACPs6B,gBAAiB,2BACjByrC,OAAQ,UACRs/D,YAAa,EACbv/D,UAAW78H,EAAMk9H,UAAYi/D,EAAc,8DAC3C9nC,aAAc,MACdlzB,UAAW,GAAF94H,OAjCJ,GAiCqB,MAC1B6/E,QAAS,aAET,SAAU,CACNnxB,MAAO/2D,EAAMk9H,UAAYi/D,EAAc,gEAC1C,EAGTp/D,mBAAoBA,KAAA,CAChB1rB,QAAS,SAEbgrF,oBAAsBnzL,GAAuB1K,GAAAA,GAAA,GACtC0K,GAAQ,IACXg/E,QAAS,QAEbo0G,kBAAmBA,CAACpzL,EAAyBlJ,IAAkCxB,GAAAA,GAAA,GACxE0K,GAAQ,IACXk/C,UAAWpoD,EAAMk9H,UAAY,iBAAmB,YAChDq/D,WAAY,gCAEhBC,eAAiBtzL,GAAuB1K,GAAAA,GAAA,GACjC0K,GAAQ,IACXioG,SAAU,UACVjpB,QAAS,aACTg0G,OAAQ,IAEZjgI,KAAO/yD,GAAuB1K,GAAAA,GAAA,GACvB0K,GAAQ,IACXg/E,QAAS,EACTg0G,OAAQ,GAAF7zL,OA/DC,EA+Dc,YACrBc,OAAQ,KAEZszL,SAAWvzL,GAAuB1K,GAAAA,GAAA,GAC3B0K,GAAQ,IACXg/E,QAAS,EACTmJ,gBAAiB,2BACjBgjE,aAAc,MACdz3B,OAAQ,wDACR3hD,UAAW,OAAF5yE,OAAS4zL,EAAa,cAG/Bp/D,UAAW,iCAGXhrB,UAAW,OAEX6qF,eAAgB,2BAChBC,eAAgB,OAEhB,sBAAuB,CACnB5mL,MAAO,OAGX,4BAA6B,CACzBA,MAAO,MACP27F,WAAY,eAGhB,4BAA6B,CACzBkrB,OAAQ,qCACRlrB,WAAY,yDACZkrF,eAAgB,cAChBvoC,aAAc,YAGtBwoC,aAAe3zL,GAAuB1K,GAAAA,GAAA,GAC/B0K,GAAQ,IACX4zH,OAAQ,UACRvuE,SAAU,WACV8iD,QAAS,OACTr7F,OAAQ,SACRumG,WAAY,SACZqvD,eAAgB,aAChB1jF,QAAS,aACTg0G,OAAQ,EACRnlI,MAAO,8CACPs6B,gBAAiB,OACjB97E,SAAU,SACVi/I,WAAY,IACZsoC,cAAe,cAEnB7nC,YAAc/rJ,GAAuB1K,GAAAA,GAAA,GAC9B0K,GAAQ,IACXuyE,SAAU,oBACV1lE,MAAO,OACPo7F,SAAU,YAEdtjG,OAAQA,CAAC3E,EAAyBlJ,IAAkCxB,GAAAA,GAAA,GAC7D0K,GAAQ,IACX4zH,OAAQ,UACR50C,QAAS,WACTmJ,gBAAiBrxF,EAAMk9H,UAAY,8CAAgD,gBAEvFvzH,iBAAmBT,GAAuB1K,GAAAA,GAAA,GACnC0K,GAAQ,IACXC,OAAQ,KAEf,EC8FkB4zL,CAAcpB,GAE3BqB,EAAsB1xL,GAAqBswL,EAAkB/nJ,SAASvoC,EAAQ1I,QAAU0I,EAAQkgB,UAqBhGpf,GAAiBmnD,EAAAA,EAAAA,QAnBG0pI,MACtB,IAAIx3L,EAA2B,GAe/B,OADAo2L,EAASqB,sCAZqBrrL,IAC1BpM,EAAU,CACN,CACI6D,MAAO4H,EAAc,CAACzS,GAAI,qCAAsC0S,eAAgB,WAChF1L,QAASoM,EAAIsB,MAAMtI,QAAQxD,IAASA,aAAI,EAAJA,EAAMiE,UAAW0xL,EAAmB31L,EAAKiE,WAAajE,EAAK+zL,cAAarwL,KAAK1D,IAC7G,MAAM,QAACiE,GAAWjE,EAClB,OAAOszL,GAA0BrvL,EAAQ,KAGpD,IAIE7F,CAAO,EAG6Bw3L,IAgC/C,OACIv1L,IAAAA,cAACuE,GAAAA,GAAW,CACRf,MAAOA,EACPb,SAAU+wD,EACVlvD,YAlCmB2oJ,GAChB,IAAIpiI,SAA0BC,IACjC,IAAIyqK,EAAYtoC,EAAa,EAAI,EACjC,MAAMpvJ,EAA2B,GAuBjCo2L,EAASuB,qBAAqBvoC,GAfR52J,UAClBk/L,UACMtrL,EAAIsB,MAAMtI,QAAQxD,IAASA,aAAI,EAAJA,EAAMiE,UAAW0xL,EAAmB31L,EAAKiE,WAAajE,EAAK+zL,cAAahrL,SAAS/I,IAC9G,MAAM,QAACiE,GAAWjE,GAEkD,IAAhE5B,EAAQqrC,WAAWjjC,GAAWA,EAAO3C,QAAUI,EAAQ7M,MACvDgH,EAAQiU,KAAKihL,GAA0BrvL,GAC3C,IAGc,IAAd6xL,GACAzqK,EAAQjtB,EACZ,GAGoD,IASxD2G,eAAgBA,EAAe+N,QAC/BjT,WAAY,CAACitJ,qBAAmBltJ,UAAQw0L,gBACxC3xL,OAAQ6yH,EACRU,OAAO,aACPtxH,YAAY,2BACZpE,UAAU,uBACV,cAAY,uBAGxB,CAAC+zL,GAAA3rL,UAAA,CAnFGqrD,SAAQ5tD,IAAAA,KAAAC,WACRkuL,kBAAiBnuL,IAAAA,OAAAC,WAEjBmuL,kBAAiBpuL,IAAAA,QAAAA,IAAAA,SAkFrB,Y,4BCjSA,MAAM,SAAC+wD,IAAYpxC,EAAAA,GAabkwK,GAA0Bx9L,IAA+G,IAA9G,UAACia,EAAS,eAAEwjL,EAAc,QAAEC,EAAO,gBAAEC,EAAe,SAAEnzL,EAAQ,QAAEgU,EAAO,SAAE5J,EAAQ,eAAEgqE,GAAsB5+E,EACtI,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB7e,GAASo8C,EAAAA,EAAAA,cAAaz+C,IAAuBmnB,EAAAA,EAAAA,IAAUnnB,KAEvD6sE,GAAatZ,EAAAA,EAAAA,QAAqB,MAElCqX,GACDjZ,SAAStvD,EAAOwoE,aAAe,GAAI,KACpC19C,EAAAA,GAAU29C,yBAA2B0yH,EAAkB,EACrDlqH,EAAiD,SAA7BjxE,EAAOqxE,kBAK3BpL,GAAennD,EAAAA,EAAAA,cAChBta,IACG,MAAMC,EAAUD,EAAEq7D,OAAOh3D,MAEzBb,EAASvD,EAAQ,GAErB,CAACuD,IAOCozL,EAAqB99L,IACvB,MAAMkS,GAAMkhD,EAAAA,GAAAA,IAAcpzD,GALN1B,iBACdoM,EAASvD,EAAQ,EAMvB42L,CAAgB7rL,EAAI/K,SAAS8M,MAAK,KAAM,IAAA07D,EACpC,MAAMC,EAA4B,QAArBD,EAAGzC,EAAW1yD,eAAO,IAAAm1D,OAAA,EAAlBA,EAAoBE,cACpClnE,EAAAA,GACIinE,EACA19D,EAAI0kD,eACJ1kD,EAAI2kD,aACP,GACH,EAsDAimB,EAAgBvrE,EAAc,CAChCzS,GAAI,yCACJ0S,eAAgB,6BAGpB,OACIzJ,IAAAA,cAACu2E,GAAAA,GAAO,CACJ5zE,SAAUi+D,EACV8V,WAvFgB3H,OAwFhB4H,UA5Dex3E,IACnB,MAAM0xE,EAAeF,GAAAA,EAA0BxxE,KAAOA,EAAE2xE,SAAW3xE,EAAEu/D,SAC/DqS,EAAeJ,GAAAA,EAA0BxxE,GAAG,IAASA,EAAE2xE,OACvDG,EAAiBN,GAAAA,EAA0BxxE,GAAG,IAASA,EAAEu/D,SACzDu3H,EAAkBtlH,GAAAA,EAAsBxxE,EAAG03D,GAASib,GACpDvB,EAAuBpxE,EAAEqxE,SAAWrxE,EAAEsxE,QACtCC,EACFC,GAAAA,EAAsBxxE,EAAG03D,GAAS+Z,QAAUL,GAE1C,eAAC1hB,EAAc,aAAEC,EAAY,MAAEtrD,GACjCrE,EAAEq7D,OAGF55D,EAAAA,GAAmCzB,GACnCwD,EAAS/B,EAAAA,GAAkCzB,EAAEgyE,cACtCJ,GAAgBklH,EACvBF,EAAkB,CACdnnI,aAAc,OACdC,iBACAC,eACA1vD,QAASoE,IAENqtE,GAAgBF,GAAAA,EAAsBxxE,EAAG03D,GAAS+a,GACzDmkH,EAAkB,CACdnnI,aAAc,OACdC,iBACAC,eACA1vD,QAASoE,IAENqtE,GAAgBF,GAAAA,EAAsBxxE,EAAG03D,GAASgb,GACzDkkH,EAAkB,CACdnnI,aAAc,SACdC,iBACAC,eACA1vD,QAASoE,IAENytE,GAAkBN,GAAAA,EAAsBxxE,EAAG03D,GAASsb,GAC3D4jH,EAAkB,CACdnnI,aAAc,SACdC,iBACAC,eACA1vD,QAASoE,IAENytE,GAAkBN,GAAAA,EAAsBxxE,EAAG03D,GAASmb,IAC3D7yE,EAAEy0D,kBACFz0D,EAAEyK,kBACK8mE,GAAqBklH,GAC5B7oL,GACJ,EAaIgqE,eAAgBA,EAChB1D,gBAAiB18D,EACjBnT,MAAOqyL,EACP3+G,aAActL,EACdmJ,cAAeA,EACf3iE,UAAWA,EACXrb,GAAI,uBACJ6jD,IAAKuqB,EACLgS,eAAgBjU,EAChBhtC,oBAAoB,EACpBkiG,kBAAkB,EAClBC,uBAAuB,SACvB69D,kBAAkB,GACpB,EAERP,GAAAttL,UAAA,CA/HE+J,UAAStM,IAAAA,OAAAC,WACT6vL,eAAc9vL,IAAAA,KAAAC,WACd8vL,QAAO/vL,IAAAA,OAAAC,WACP+vL,gBAAehwL,IAAAA,OAAAC,WACfgH,SAAQjH,IAAAA,KAAAC,WACRpD,SAAQmD,IAAAA,KAAAC,WACR4Q,QAAO7Q,IAAAA,KAAAC,WACPgxE,eAAcjxE,IAAAA,KAAAC,YA0HlB,YC1GM01D,GAAOA,OAEP06H,GAAmBh+L,IAA6B,IAAAi+L,EAAA,IAA5B,SAACxpL,EAAQ,KAAEyG,GAAYlb,EAC7C,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClBnjB,GAAWsxD,EAAAA,EAAAA,eAEXziC,GAAavL,EAAAA,EAAAA,SAAQsoD,EAAAA,GAAgB,IAErCr+D,GAAUmzC,EAAAA,EAAAA,cAAaz+C,GAAuB4sB,EAAW5sB,EAAO+a,EAAKG,cACrE0S,GAAc6wB,EAAAA,EAAAA,aAAY5wB,EAAAA,IAE1B2P,GAAoBihB,EAAAA,EAAAA,cAAaz+C,GAAwB4tB,GAAc6P,EAAAA,GAAAA,GAAgBz9B,EAAO4tB,EAAYnvB,GAAIsc,EAAKtc,IAAM,KACzHi/B,EAAY,GAAHr1B,QAAM8Q,EAAAA,GAAAA,OAAY9Q,OAAGm1B,GAE9BugK,GAAwBzyL,aAAO,EAAPA,EAAS1I,QAASuqB,EAAAA,GAAUyB,cAEnD2uK,EAASS,IAAc/8K,EAAAA,EAAAA,UAAS,KAChC+6K,EAAYiC,IAAiBh9K,EAAAA,EAAAA,UAAiB,IAC9CigE,EAAUg9G,IAAej9K,EAAAA,EAAAA,WAAkB,IAC3C8wC,EAAWwb,IAAgBtsD,EAAAA,EAAAA,UAA0B,OACrDk9K,EAAiBC,IAAsBn9K,EAAAA,EAAAA,YAExCo9K,GAAU9qI,EAAAA,EAAAA,UAEV+qI,GAAcn9K,EAAAA,EAAAA,cAAamjD,IAChB,OAATA,IACA+5H,EAAQlkL,QAAUmqD,EAClB25H,EAAc35H,EAAKvV,wBAAwB/4C,QAC/C,GACD,IASGuoL,GAAoBJ,SAAwB,QAATL,EAAfK,EAAiB7mL,eAAO,IAAAwmL,OAAT,EAAfA,EAA0Br/L,KAAM,GAEpD+/L,GAA2B//I,EAAAA,EAAAA,cAC5Bz+C,IAAuB,IAAAy+L,EAAAC,EACpB,MAAM5kL,EAAYikL,EAAwBhjL,EAAKG,WAAaqjL,EACtDI,GAAcR,SAAwB,QAATM,EAAfN,EAAiB7mL,eAAO,IAAAmnL,OAAT,EAAfA,EAA0B77L,QAASuqB,EAAAA,GAAU0K,WAC3D91B,EAASg8L,EAAwBnwK,aAAW,EAAXA,EAAanvB,GAAK0/L,SAAwB,QAATO,EAAfP,EAAiB7mL,eAAO,IAAAonL,OAAT,EAAfA,EAA0Bx8K,QAE7E08K,GAAuBtqK,EAAAA,GAAAA,IACzBt0B,EACA+B,IAAU6rB,aAAW,EAAXA,EAAanvB,IACvBqb,EACAya,EAAAA,GAAYq3C,aAGhB,OAAO33D,QAAQ6F,KAAe8kL,GAAwBD,EAAY,IAIpErB,GAAkBS,GAAyBS,KAA8BzsI,EAEzE19C,GAAS8M,EAAAA,EAAAA,cAAY,KACvB7M,SAAAA,GAAY,GACb,CAACA,IAEEuqL,GAAsB19K,EAAAA,EAAAA,cACvB7V,IACOwC,MAAMC,QAAQzC,IACd8yL,EAAmB9yL,EAAQ,IAE/B8yL,EAAmB9yL,EAAyB,GAEhD,IASEwzL,EAAsB5tL,EAAc,CACtCzS,GAAI,mCACJ0S,eAAgB,oBAGd4tL,EAAuC,CACzChkL,OACAW,QAASX,EAAKtc,GACdugM,WAAWpxK,aAAW,EAAXA,EAAa/lB,OAAQ,GAChCo3L,sBAAsB3zL,aAAO,EAAPA,EAAS/D,eAAgB,GAC/C23L,cAAc5zL,aAAO,EAAPA,EAAS1I,OAAQ,IAC/BsY,WAAYH,EAAKG,YAGrB,IAAIikL,EACJ,GAAIpB,EAAuB,CACvB,IAAIqB,EACJ,IAAI9zL,aAAO,EAAPA,EAAS1I,QAAS0rC,EAAAA,GAAQzf,gBAAiB,CAC3C,MAAMvnB,EAAc,IAAHe,OAAOiD,EAAQ/D,cAChC63L,EACI13L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kDACH0S,eAAe,oGACfjB,OAAQ,CACJ5I,cACAwoD,OAASzuB,GAAuB35B,IAAAA,cAAA,cAAS25B,KAIzD,KAAO,CACH,MACM00J,IADkBzqL,aAAO,EAAPA,EAAS/D,aAAa2kC,MAAM,QAAS,IACxBnhC,KAAKs0L,GAAgB33L,IAAAA,cAAA,UAAQtC,IAAKi6L,GAAcA,KAErFD,EACI13L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2CACH0S,eAAe,yFACfjB,OAAQ,CACJ6lL,aAAcruL,IAAAA,cAACktG,EAAAA,cAAa,CAAC1pG,MAAO6qL,IACpCjmI,OAASzuB,GAAuB35B,IAAAA,cAAA,cAAS25B,KAIzD,CAEA89J,EACIz3L,IAAAA,cAAC+yL,GAAe,CACZ1rG,QAAS,OACT78E,KAAMktL,EACN3gM,GAAI,gBAGhB,CAEA,MAAMs8E,EAAmB38E,IACrBmvE,EAAanvE,GACb8/L,GAAY,GACZvrK,YAAW,IAAMurK,GAAY,IAAQ/wK,EAAAA,GAAUigE,kBAAkB,EAG/D14E,EAAeA,KACjB,GAAIq9C,EACA,OAAOt/B,QAAQC,UAGnB,IAAKpnB,EACD,OAAOmnB,QAAQC,UAGnB,MAAM4sK,EAAmBvB,EAAwBpD,GAA0BrvL,GAAW6yL,EAEtF,IAAKmB,EACD,OAAO7sK,QAAQC,UAGnB,MAAM,KAAC9vB,EAAI,OAAEhE,GAAU0gM,EAAiBhoL,QAExC,OAAOmb,QAAQC,UAAU9e,MAAK,IACtBhR,IAASuqB,EAAAA,GAAU0K,YAAcj5B,EAC1Bb,GAASmvB,EAAAA,GAAAA,IAA0BtuB,IAEvC,CAACP,MAAM,KACfuV,MAAKtO,IAAY,IAAX,KAACjH,GAAKiH,EAKX,OAJIjH,IACAihM,EAAiBhoL,QAAQ7Y,GAAKJ,EAAKI,IAGhCV,GAASw/B,EAAAA,GAAAA,IACZxiB,EACAukL,EAAiBhoL,QACjBimL,GACF,IACH3pL,MAAK,IACAhR,IAASuqB,EAAAA,GAAUoyK,uBAAyB38L,IAASuqB,EAAAA,GAAUyB,aACxD7wB,GAASwvB,EAAAA,GAAAA,IAAgB+xK,EAAiBhoL,QAAQ7Y,KAEtD,CAACJ,MAAM,KACfuV,MAAK,IAECmqL,EAGE,CAAC1/L,MAAM,GAFHN,GAASumB,EAAAA,GAAAA,IAAgBg7K,EAAiBhoL,YAGtD1D,MAAK,KACJS,GAAQ,IACT0U,OAAO3M,IACFA,SAAAA,EAAQhe,OACR28E,EAAgB3+D,EAAOhe,MAC3B,GACF,EAGAohM,EAA2BtuL,EAAc,CAC3CzS,GAAI,4CACJ0S,eAAgB,mCAEpB,CACI7F,SAASA,aAAO,EAAPA,EAAS/D,eAAgB,KAGtC,OACIG,IAAAA,cAACo8E,GAAAA,GAAY,CACTn8E,UAAU,2BACVlJ,GAAG,qBACH8U,MAAM,EACNywE,0BAA0B,EAC1BC,eAAe,EACfG,gBAAiBlzE,EAAc,CAC3BzS,GAAI,2BACJ0S,eAAgB,oBAEpB8xE,kBAAmB/xE,EAAc,CAC7BzS,GAAI,oCACJ0S,eAAgB,YAEpB+xE,iBAAkBhyE,EAAc,CAC5BzS,GAAI,mCACJ0S,eAAgB,WAEpB4jH,mBAAoBuoE,EACpB/5G,cAAe7uE,EACfihE,aAActhE,EACdC,SAAUD,GAEV3M,IAAAA,cAAA,OACIC,UAAW,qBACX26C,IAAKg8I,GAEJP,EACGoB,EAEAz3L,IAAAA,cAACg0L,GAAwB,CACrBtgI,SAAUyjI,EACV3zL,MAAOizL,EACPxC,kBAAmBK,IAG3Bt0L,IAAAA,cAAC21L,GAAuB,CACpBC,eAAgBA,EAChBxjL,UAAWykL,EACXhB,QAASA,EACTlzL,SAAU2zL,EACV3/K,QAAS08D,EACTtmE,SAAUC,EACV+pE,eAnNOA,CAAC1oE,EAAeC,KAC/BqoL,EAAQlkL,SACR8jL,EAAcI,EAAQlkL,QAAQ40C,wBAAwB/4C,OAC1D,EAiNYwnL,gBAAiB9/J,EAAU5sB,SAE/BpJ,IAAAA,cAAA,OAAKC,UAAW,8BACZD,IAAAA,cAAA,QAAMC,UAAW,qCACZm3L,GAELp3L,IAAAA,cAAA,OACIC,UAAU,4CACVqP,QAlLYnQ,IAC5BA,EAAEyK,iBACFzK,EAAEy0D,iBAAiB,GAkLH5zD,IAAAA,cAAC6kL,GAAAA,EAAkB,CACfn4J,SAAU2qK,EACVlnD,yBAA0B10E,GAC1Bs8H,oBAAoB,EACpBC,qBAAsBF,KAG7BztI,GACGrqD,IAAAA,cAAA,SACIC,UAAWk3C,IAAW,aAAc,CAChC,uBAAwBqiC,KAG3BnvB,KAKN,EAErB8rI,GAAA9tL,UAAA,CAxREuE,SAAQ9G,IAAAA,MA0RZ,Y,gBC9QA,MAAM21D,GAAOA,OAEPv2C,IAAa+8C,EAAAA,EAAAA,MAGbg2H,GAA0B94L,IAC5BA,EAAEyK,iBACFzK,EAAEy0D,iBAAiB,EAGjBskI,GAAkB//L,IAAsC,IAArC,SAACyU,EAAQ,KAAEyG,EAAI,QAAEtQ,GAAe5K,EACrD,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB2+K,GAAkBphJ,EAAAA,EAAAA,cAAaz+C,GAAuB4sB,GAAW5sB,EAAO+a,EAAKG,cAC7E0S,GAAc6wB,EAAAA,EAAAA,aAAY5wB,EAAAA,IAE1BiyK,GAAavsI,EAAAA,EAAAA,QAA8B,OAE1CyoI,EAAYiC,IAAiBh9K,EAAAA,EAAAA,UAAiB,IAC9CigE,EAAUg9G,IAAej9K,EAAAA,EAAAA,WAAkB,IAC3C8wC,EAAWwb,IAAgBtsD,EAAAA,EAAAA,UAA0B,OACrDk9K,EAAiBC,IAAsBn9K,EAAAA,EAAAA,aACvC8+K,EAAiBC,IAAsB/+K,EAAAA,EAAAA,WAAkB,GAE1Do9K,GAAU9qI,EAAAA,EAAAA,UAEV+qI,GAAcn9K,EAAAA,EAAAA,cAAamjD,IAChB,OAATA,IACA+5H,EAAQlkL,QAAUmqD,EAClB25H,EAAc35H,EAAKvV,wBAAwB/4C,QAC/C,GACD,IAEG3B,GAAS8M,EAAAA,EAAAA,cAAY,KACvB7M,SAAAA,GAAY,GACb,CAACA,IAEEuqL,GAAsB19K,EAAAA,EAAAA,cAAa7V,IACjCwC,MAAMC,QAAQzC,GACd8yL,EAAmB9yL,EAAQ,IAG/B8yL,EAAmB9yL,EAAyB,GAC7C,IAEGwzL,EAAsB5tL,EAAc,CACtCzS,GAAI,kCACJ0S,eAAgB,oBAGd4tL,GAAuC19K,EAAAA,EAAAA,UAAQ,KAAM,CACvDtG,OACAW,QAASX,EAAKtc,GACdugM,WAAWpxK,aAAW,EAAXA,EAAa/lB,OAAQ,GAChCo3L,sBAAsBY,aAAe,EAAfA,EAAiBt4L,eAAgB,GACvD23L,cAAcW,aAAe,EAAfA,EAAiBj9L,OAAQ,IACvCsY,YAAY2kL,aAAe,EAAfA,EAAiBphM,KAAM,MACnC,CAACsc,EAAM6S,aAAW,EAAXA,EAAa/lB,KAAMg4L,aAAe,EAAfA,EAAiBt4L,aAAcs4L,aAAe,EAAfA,EAAiBj9L,KAAMi9L,aAAe,EAAfA,EAAiBphM,KAE/F2gM,EAAmBluL,EAAc,CACnCzS,GAAI,0CACJ0S,eAAgB,8CAGdguL,EACFz3L,IAAAA,cAAC+yL,GAAe,CACZ1rG,QAAS,OACT78E,KAAMktL,EACN3gM,GAAI,gBAINs8E,GAAkB55D,EAAAA,EAAAA,cAAa/iB,IACjC4hM,GAAmB,GACnBzyH,EAAanvE,EAAM0I,SACnBo3L,GAAY,GAER4B,EAAW3lL,SACX8iC,aAAa6iJ,EAAW3lL,SAG5B2lL,EAAW3lL,QAAUwY,YAAW,KAC5BurK,GAAY,GACZ4B,EAAW3lL,QAAU,IAAI,GAC1BgT,EAAAA,GAAUigE,kBAAkB,GAChC,IAEG14E,GAAeyM,EAAAA,EAAAA,cAAYljB,UAE7B,GADA+hM,GAAmB,IACd7B,EAED,YADA6B,GAAmB,GAIvB,MAAM10L,EAAU6yL,EAAgB7mL,QAEhC,IAAI8E,QAAe3R,EAAQw1L,WAAWllL,EAAKI,SAAWJ,EAAKtc,GAAI6M,EAAQ7M,IAEnE2d,EAAOhe,OAMPkN,EAAQ1I,OAASuqB,EAAAA,GAAUoyK,uBAC3Bj0L,EAAQ1I,OAASuqB,EAAAA,GAAUyB,eAE3BxS,QAAe3R,EAAQ8iB,gBAAgBjiB,EAAQ7M,IAE3C2d,EAAOhe,OAVX28E,EAAgB3+D,EAAOhe,QAgB3Bge,QAAe3R,EAAQ6Z,gBAAgBhZ,GAEnC8Q,EAAOhe,MACP28E,EAAgB3+D,EAAOhe,OAI3BiW,IAAQ,GACT,CAAC8pL,EAAiBpjL,EAAMtQ,EAASswE,EAAiB1mE,IAE/CmrL,EAA2BtuL,EAAc,CAC3CzS,GAAI,2CACJ0S,eAAgB,uCAEpB,CACI7J,aAAau4L,aAAe,EAAfA,EAAiBt4L,eAAgB,KAGlD,OACIG,IAAAA,cAACo8E,GAAAA,GAAY,CACTn8E,UAAU,uCACVlJ,GAAG,oBACH8U,MAAM,EACNywE,0BAA0B,EAC1BC,eAAe,EACfG,gBAAiBlzE,EAAc,CAC3BzS,GAAI,0BACJ0S,eAAgB,gBAEpB8xE,kBAAmB/xE,EAAc,CAC7BzS,GAAI,mCACJ0S,eAAgB,SAEpB+xE,iBAAkBhyE,EAAc,CAC5BzS,GAAI,kCACJ0S,eAAgB,WAEpB8iJ,sBAAuB,iCACvBl/B,kBAAmBgrE,EACnBx8G,cAAe7uE,EACfwvE,oBAAqBxvE,EACrBihE,aAActhE,EACdC,SAAUD,GAEV3M,IAAAA,cAAA,OACIC,UAAW,oBACX26C,IAAKg8I,GAEJa,EACDz3L,IAAAA,cAACw4L,GAAe,CACZ9kI,SAAUyjI,EACV3zL,MAAOizL,EACPxC,kBAAmBK,EACnBJ,kBAAmB,CAAC,IAAK,OAE7Bl0L,IAAAA,cAAA,OAAKC,UAAW,6BACZD,IAAAA,cAAA,QAAMC,UAAW,oCACZm3L,GAELp3L,IAAAA,cAAA,OACIC,UAAU,2CACVqP,QAAS2oL,IAETj4L,IAAAA,cAAC6kL,GAAAA,EAAkB,CACfn4J,SAAU2qK,EACVlnD,yBAA0B10E,GAC1Bs8H,oBAAoB,EACpBC,qBAAsBF,KAG7BztI,GACGrqD,IAAAA,cAAA,SACIC,UAAWk3C,IAAW,aAAc,CAChC,uBAAwBqiC,KAG3BnvB,KAKN,EAErB6tI,GAAA7vL,UAAA,CA9MEuE,SAAQ9G,IAAAA,KAMoB/C,QAAO+C,IAAAA,MAAA,CAlBnC+f,gBAAe/f,IAAAA,KAAAC,WAGf6W,gBAAe9W,IAAAA,KAAAC,WAGfwyL,WAAUzyL,IAAAA,KAAAC,aAAAA,YAsNd,YCjOA,IAFkB+B,EAAAA,EAAAA,SAAQ,MAT1B,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6d,gBAAe,MACfjJ,gBAAe,MACf27K,WAAUA,EAAAA,IACXliM,GAEX,GAGA,CAAyB6hM,I,gBCVzB,MAAMO,IAA+B/2H,E,SAAAA,GAAmB,+BAAgC1hE,IAAAA,MAAW,IAAM,mCAmBnG04L,IAAY5wL,EAAAA,EAAAA,UAjBlB,SAAyBxP,GACrB,MAAMgtD,GAAWH,EAAAA,GAAAA,IAAmB7sD,GAGpC,MAAO,CACHpB,QAHWqjB,EAAAA,EAAAA,IAAiBjiB,GAI5BgtD,WAER,IAEA,SAA4BjvD,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB2wL,gBAAeA,EAAAA,IAChBtiM,GAEX,IAGA,GAAeqiM,GAAUD,I,4BCVzB,MAAMG,GAAgB,CAClB/vE,eAAgB,iBAChBC,SAAU,WACV+vE,UAAW,YACXC,SAAU,WACVC,OAAQ,UAGZ,SAASC,GAAoBt5L,GACzB,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WAClBnjB,GAAWsxD,EAAAA,EAAAA,eAmCXsxI,EAA2B74L,OAAOoI,OAAOowL,IAAev1L,KAAK61L,IAC/D,IAAItnI,EAAS,KAETA,EADAsnI,IAAiBN,GAAc/vE,eAE3B7oH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kDACH0S,eAAe,YAGhByvL,IAAiBN,GAAc9vE,SAElC9oH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4CACH0S,eAAe,WAGhByvL,IAAiBN,GAAcC,UAElC74L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6CACH0S,eAAe,YAGhByvL,IAAiBN,GAAcE,SAElC94L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4CACH0S,eAAe,aAKnBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAe,WAK3B,IAAIooD,EAAmB,KACvB,GAAIqnI,IAAiBN,GAAcE,SAAU,CACzC,MAAMK,GAAWluE,EAAAA,GAAAA,IAA4BvrH,EAAM4lD,UAAU/rB,IAAI,EAAG,OAAO64B,IAAI,CAAC7P,KAAM,EAAGC,OAAQ,IAAI04B,SAErGrpB,EACI7xD,IAAAA,cAAA,QAAMC,UAAS,gBAAAU,OAAkBu4L,EAAY,eACzCl5L,IAAAA,cAACo5L,EAAAA,cAAa,CACV51L,MAAO21L,EACPtpI,QAAQ,QACRiB,SAAUpxD,EAAM4lD,WAEnB,KACDtlD,IAAAA,cAACq5L,EAAAA,cAAa,CACV71L,MAAO21L,EACPG,UAAU,QACVC,QAAS75L,EAAM85L,eACf1oI,SAAUpxD,EAAM4lD,WAIhC,CAEA,OACItlD,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,uBAAA4J,OAAyBu4L,GAC3Bx7L,IAAG,uBAAAiD,OAAyBu4L,GAC5BtnI,OAAQA,EACRC,iBAAkBA,EAClBviD,QAASA,IApGrB,SAAqCvY,GACjC,GAAIA,IAAO6hM,GAAcG,OAAQ,CAC7B,MAAMU,EAA+B,CACjC3mL,QAASC,EAAAA,GAAiB2mL,iCAC1BzmL,WAAYwlL,GACZvlL,YAAa,CACTyW,OAAQjqB,EAAM2T,KAAKtc,KAI3BV,GAASwc,EAAAA,EAAAA,GAAU4mL,GACvB,KAAO,CACH,MAAME,GAAc1uE,EAAAA,GAAAA,IAA4BvrH,EAAM4lD,UAEtD,IAAIs0I,EAAUD,EACV5iM,IAAO6hM,GAAc/vE,eAErB+wE,EAAUD,EAAYpgK,IAAI,GAAI,WACvBxiC,IAAO6hM,GAAc9vE,SAE5B8wE,EAAUD,EAAYpgK,IAAI,EAAG,QACtBxiC,IAAO6hM,GAAcC,UAE5Be,EAAUD,EAAYpgK,IAAI,EAAG,SACtBxiC,IAAO6hM,GAAcE,WAE5Bc,EAAUD,EAAYpgK,IAAI,EAAG,OAAO64B,IAAI,CAAC7P,KAAM,EAAGC,OAAQ,KAG9DnsD,GAASsiM,EAAAA,EAAAA,IAAgBj5L,EAAMxI,OAAQwI,EAAM2T,KAAKtc,IAAI8iM,EAAAA,GAAAA,IAAUD,EAAQ1+G,WAC5E,CACJ,CAqE2B4+G,CAA4BZ,IAC7C,IAIV,OACIl5L,IAAAA,cAAC4Z,GAAAA,GAAY,CACT7iB,GAAE,eAAA4J,OAAiBjB,EAAM2T,KAAKtc,IAC9B2pK,cAAel3J,EAAc,CACzBzS,GAAI,0CACJ0S,eAAgB,wBAEpBmoD,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,WAGvBm5J,eAAgB5iK,IAAAA,cAAC+5L,GAAAA,iBAAgB,CAACj5L,KAAM,KACxC+wD,iBAAkB7xD,IAAAA,cAAA,QAAMC,UAAW,gCAAgCD,IAAAA,cAACwsG,GAAAA,iBAAgB,CAAC1rG,KAAM,MAC3F2/J,OAAM,eAAA9/J,OAAiBjB,EAAM2T,KAAKtc,GAAE,UAEpCiJ,IAAAA,cAAA,MAAIC,UAAW,uCACVuJ,EACG,CAACzS,GAAI,0CACD0S,eAAgB,yBAG3BwvL,EAGb,CAACD,GAAA3wL,UAAA,CArJGnR,OAAM4O,IAAAA,OAAAC,WAENyzL,eAAc1zL,IAAAA,KAAAC,WACdu/C,SAAQx/C,IAAAA,QAoJZ,UAAeypD,EAAAA,EAAAA,MAAKypI,IClKPgB,GAAoBA,CAAC76L,EAAgBkoE,KAC1CloE,EAAEjE,OAASqwB,EAAAA,GAAW63I,OACtB7kK,EAAAA,EAAAA,IAAWwvF,EAAAA,GAAqBksG,eAAgB1uK,EAAAA,GAAW63I,MAAQ,IAAM/7F,IAEzE9oE,EAAAA,EAAAA,IAAWwvF,EAAAA,GAAqBksG,eAAgB1uK,EAAAA,GAAW2uK,SAAW,KAAO7yH,EACjF,E,0ZCuCJ,MAAM+5E,GAAcjpJ,IAAA,IAAEgiM,YAAa7kI,GAA2Bn9D,EAAA,OAC1D6H,IAAAA,cAAA,YACKs1D,EACE,EACT8rF,GAAA/4I,UAAA,CAPE8xL,YAAWr0L,IAAAA,OAAAC,YAyFR,MAAMq0L,WAAqBp6L,IAAAA,cAS9BsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,0BA6CG,KAChBE,KAAKgH,SAAS,CAAC2wL,SAAS,GAAO,IAClC73L,GAAA,oCAE8BrD,IACvBuD,KAAKhD,MAAM+pL,WACX/mL,KAAKhD,MAAMqD,QAAQu3L,WAAW53L,KAAKhD,MAAM2T,KAAKtc,IAC9CijM,GAAkB76L,EAAGo7L,EAAAA,GAAiBC,UAEtC93L,KAAKhD,MAAMqD,QAAQ03L,SAAS/3L,KAAKhD,MAAM2T,KAAKtc,IAC5CijM,GAAkB76L,EAAGo7L,EAAAA,GAAiBG,MAC1C,IACHl4L,GAAA,2CAEoC,KAE7BE,KAAKhD,MAAMi7L,wBACXj4L,KAAKhD,MAAMi7L,wBACf,IACHn4L,GAAA,iBAEWrD,IACRyB,EAAAA,GAAsB,GAADD,OAAI+B,KAAKhD,MAAM0lB,QAAO,QAAAzkB,OAAO+B,KAAKhD,MAAM2T,KAAKtc,KAClEijM,GAAkB76L,EAAGo7L,EAAAA,GAAiBK,UAAU,IACnDp4L,GAAA,iBAEWrD,IACRyB,EAAAA,GAAsB8B,KAAKhD,MAAM2T,KAAK4hE,gBAAkBvyE,KAAKhD,MAAM2T,KAAKjU,SACxE46L,GAAkB76L,EAAGo7L,EAAAA,GAAiBM,UAAU,IACnDr4L,GAAA,mCAE6BrD,IACtBuD,KAAKhD,MAAM2T,KAAKusB,WAChBl9B,KAAKhD,MAAMqD,QAAQ+3L,UAAUp4L,KAAKhD,MAAM2T,KAAKtc,IAC7CijM,GAAkB76L,EAAGo7L,EAAAA,GAAiBQ,SAEtCr4L,KAAKhD,MAAMqD,QAAQi4L,QAAQt4L,KAAKhD,MAAM2T,KAAKtc,IAC3CijM,GAAkB76L,EAAGo7L,EAAAA,GAAiBx/K,KAC1C,IACHvY,GAAA,+BAEyBrD,IACtBuD,KAAKhD,MAAMqD,QAAQk4L,iBAAiBv4L,KAAKhD,MAAM2T,KAAM3Q,KAAKhD,MAAMyS,UAChE6nL,GAAkB76L,EAAGo7L,EAAAA,GAAiBW,OAAO,IAChD14L,GAAA,sCAEgCrD,IAC7B,MAAMwvE,EAAsB,CACxB77D,QAASC,EAAAA,GAAiB67D,YAC1B37D,WAAY47D,GAAAA,EACZ37D,YAAa,CACTG,KAAM3Q,KAAKhD,MAAM2T,KACjB+tD,MAAO1+D,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUuvB,UAAY/vE,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUC,cAI/FzgD,KAAKhD,MAAMqD,QAAQ8P,UAAU87D,GAE7BqrH,GAAkB76L,EAAGo7L,EAAAA,GAAiBY,OAAO,IAChD34L,GAAA,0CAEoCrD,IAEjC,GADAA,EAAEyK,kBACGlH,KAAKhD,MAAM07L,QACZ,OAGJpB,GAAkB76L,EAAGo7L,EAAAA,GAAiBc,aACtC,MAAMC,EAAsB,CACxBxoL,QAASC,EAAAA,GAAiBwoL,kBAC1BtoL,WAAYilL,GACZhlL,YAAa,CACTG,KAAM3Q,KAAKhD,MAAM2T,OAIzB3Q,KAAKhD,MAAMqD,QAAQ8P,UAAUyoL,EAAoB,IACpD94L,GAAA,uCAEiCrD,IAC9B,IAAKuD,KAAK84L,mBAGN,OAGJxB,GAAkB76L,EAAGo7L,EAAAA,GAAiBkB,SACtC,MAAMC,EAAuB,CACzB5oL,QAASC,EAAAA,GAAiB4oL,mBAC1B1oL,WAAYkjL,GACZjjL,YAAa,CACTG,KAAM3Q,KAAKhD,MAAM2T,OAIzB3Q,KAAKhD,MAAMqD,QAAQ8P,UAAU6oL,EAAqB,IACrDl5L,GAAA,oCAE8BrD,IAAyB,IAAA0wL,EAAAtlD,EACrB,QAA/BslD,GAAAtlD,EAAA7nI,KAAKhD,OAAMuwI,4BAAoB,IAAA4/C,GAA/BA,EAAA3+K,KAAAq5H,GAAkC,GAClC7nI,KAAKhD,MAAMqD,QAAQ64L,eACfl5L,KAAKhD,MAAM2T,KAAKtc,GAChB2L,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUwvB,OAAS,eAAiB,gBAC5DhwE,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUuvB,UAAY/vE,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUC,aAAezgD,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUquI,QAErIyI,GAAkB76L,EAAGo7L,EAAAA,GAAiBj4H,KAAK,IAC9C9/D,GAAA,8BAEwBrD,IACrB,MAAM,QAAC4D,EAAO,OAAE1I,EAAM,SAAE2zL,EAAQ,OAAE92L,EAAM,kBAAE2kM,EAAiB,sBAAEC,GAAyBp5L,KAAKhD,MAC3F,IAAIq8L,EAKAA,EADsB,OAAtBF,GACmBC,GAEAD,EAGnB7B,GAAkB76L,EADlB48L,EACqBxB,EAAAA,GAAiByB,OAEjBzB,EAAAA,GAAiB0B,UAE1Cl5L,EAAQ8rL,gBACJ33L,EACAmD,EACA2zL,EACA+N,EACH,IACJv5L,GAAA,2BAEqBrD,IAAmB,IAAA+8L,EAAAC,EACrCnC,GAAkB76L,EAAGo7L,EAAAA,GAAiB6B,OACT,QAA7BF,GAAAC,EAAAz5L,KAAKhD,OAAM0yL,0BAAkB,IAAA8J,GAA7BA,EAAAhrL,KAAAirL,EAAgCh9L,EAAE,IACrCqD,GAAA,0BAEmB,CAACqV,EAA4CwkL,KAG7D,GAFAxkL,EAAMjO,kBAEDyyL,EACD,OAGJ,MAAMC,EAAoBzkL,EAAM6mD,SAEhC,QAAQ,GACR,KAAKiS,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAAS0lI,GACjDF,IACA35L,KAAK0vL,mBAAmBv6K,GACxB,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAASmb,GACjDqqH,IACA35L,KAAK85L,4BAA4B3kL,GACjC,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAAS4lI,KAAOH,EACxDD,IACA35L,KAAKg6L,sBAAsB7kL,GAC3B,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAAS4lI,IAAMH,EACvDD,IACA35L,KAAKi6L,+BAA+B9kL,GACpC,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAASib,GACjDuqH,IACA35L,KAAKo0I,SAASj/H,GACd,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAASkb,GACjDsqH,IACA35L,KAAKgjH,SAAS7tG,GACd,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAASskI,QACjDkB,IACA35L,KAAKk6L,8BAA8B/kL,GACnC,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAASgmI,GACjDR,IACA35L,KAAKo6L,kCAAkCjlL,GACvC,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAASqb,GACjDmqH,IACA35L,KAAKq6L,2BAA2BllL,GAChC,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAASmmI,GACjDX,IACA35L,KAAKu6L,4BAA4BplL,GACjC,MAGJ,KAAK84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAAS+H,GACjDy9H,IACA35L,KAAKw6L,uBAAuBrlL,GAEhC,IACHrV,GAAA,yBAEmBmP,IAAkB,IAAAwrL,EAAAC,EACH,QAA/BD,GAAAC,EAAA16L,KAAKhD,OAAMuwI,4BAAoB,IAAAktD,GAA/BA,EAAAjsL,KAAAksL,EAAkCzrL,EAAK,IAlQvCjP,KAAK26L,kBAAoB,IAAI/hI,GAAAA,EAAc54D,KAAK46L,mBAEhD56L,KAAKpK,MAAQ,CACT+hM,QAAS36L,EAAM26L,UAAY36L,EAAM69L,WACjCC,UAAW99L,EAAM89L,YAAc99L,EAAM69L,YAGzC76L,KAAK84L,oBAAqB,CAC9B,CAEA,+BAAOv3L,CAAyBvE,GAK5B,MAJ8B,CAC1B26L,QAAS36L,EAAM26L,UAAY36L,EAAM69L,WACjCC,UAAW99L,EAAM89L,YAAc99L,EAAM69L,WAG7C,CAEAE,wBAAAA,GACI,MAAM,KAACpqL,EAAI,WAAEwmF,GAAcn3F,KAAKhD,OAC1B,QAAC26L,GAAW33L,KAAKpK,MAEjBolM,EAAoBh7L,KAAKhD,MAAMg+L,mBAAqBj4K,EAAAA,GAAUk4K,2BAEpE,GAAItD,GAAWxgG,GACP6jG,IAAsB11H,OAAOviD,EAAAA,GAAUk4K,4BAA6B,CACpE,MAAMxxE,EAAe,IACfyxE,EAAYvqL,EAAKuL,UAAau9D,OAAOuhH,GAAqBvxE,EAAiBvrH,EAAAA,KAC7Eg9L,EAAW,GACXl7L,KAAK26L,kBAAkBjhI,UAAUwhI,EAAWzxE,EAEpD,CAER,CAEAlxE,iBAAAA,GACIv4C,KAAK+6L,0BACT,CAEAz9H,oBAAAA,GACIt9D,KAAK26L,kBAAkBnhI,QAC3B,CA4NAv2D,MAAAA,GAAsB,IAAAk4L,EAClB,MAAM,cAACr0L,GAAiB9G,KAAKhD,MAAM6J,KAC7BsyL,EAAgD,QAA/BgC,EAAGn7L,KAAKhD,MAAMm8L,yBAAiB,IAAAgC,EAAAA,EAAIn7L,KAAKhD,MAAMo8L,sBAC/D/0I,EAAWrkD,KAAKhD,MAAMmsI,aACtB6lD,EAAkBvB,EAAAA,GAA0BztL,KAAKhD,MAAM2T,MAE7D3Q,KAAK84L,oBAAuB9J,EAE5B,MAAMoM,EACF99L,IAAAA,cAAA,QAAMC,UAAW,4BACbD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,aAKrBs0L,EACF/9L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,oBAGjBu0L,EACFh+L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uCACH0S,eAAe,qBAGjBw0L,EACFj+L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,kBAGjBy0L,EACFl+L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,mBAUjB00L,EACFn+L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,sBAIjB20L,EACFp+L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,SAIjBuxL,EACFh7L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gBACH0S,eAAe,QAIjB40L,EACFr+L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kBACH0S,eAAe,UAIvB,OACIzJ,IAAAA,cAAC4Z,GAAAA,GAAc,CACXu6C,WAAY,CACRp9D,GAAI,GAAF4J,OAAK+B,KAAKhD,MAAMyS,SAAQ,YAAAxR,OAAW+B,KAAKhD,MAAM2T,KAAKtc,IACrD0qK,WAAY,sBAAF9gK,OAAwB+B,KAAKhD,MAAM2T,KAAKtc,IAClDq9D,MAAOjd,IAAW,kBAAmB,CACjC,0BAA2Bz0C,KAAKhD,MAAMugK,aAE1C,aAAcz2J,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,SAASxG,cAC7FoxD,SAAUr0D,IAAAA,cAACovD,GAAAA,mBAAkB,CAACtuD,KAAM,MAExCyzD,KAAM,CACFx9D,GAAI,GAAF4J,OAAK+B,KAAKhD,MAAMyS,SAAQ,cAAAxR,OAAa+B,KAAKhD,MAAM2T,KAAKtc,IACvD,aAAcyS,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,uBAC5EktE,UAAWj0E,KAAK47L,kBAChBjwL,MAAO,QACPkvE,SAAU76E,KAAK67L,kBAEnBrqI,kBAAmB,CACf1pD,KAAMhB,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,SAC5E2qD,MAAO,eAGTs9H,GAAmBhvL,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUwvB,QACnD1yE,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,iBAAA4J,OAAmB+B,KAAKhD,MAAM2T,KAAKtc,IACrC,+BAAA4J,OAA8B+B,KAAKhD,MAAM2T,KAAKtc,IAC9C66D,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kBACH0S,eAAe,UAGvBm5J,eAAgB5iK,IAAAA,cAACw+L,GAAAA,iBAAgB,CAAC19L,KAAM,KACxC+wD,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,MAC3C7qL,QAAS5M,KAAK0vL,qBAGrB1vL,KAAK84L,oBACFx7L,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,gBAAA4J,OAAkB+B,KAAKhD,MAAM2T,KAAKtc,IACpC,8BAAA4J,OAA6B+B,KAAKhD,MAAM2T,KAAKtc,IAC7C66D,OAAQksI,EACRh7B,mBAAmB,EACnBF,eAAgB5iK,IAAAA,cAACy+L,GAAAA,0BAAyB,CAAC39L,KAAM,KACjD+wD,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,cAC3C7qL,QAAS5M,KAAKi6L,iCAGrBpwL,QAAQw6C,IAAa2qI,IAAoBhvL,KAAKhD,MAAM69L,YAAc76L,KAAKhD,MAAMksE,oBAC1E5rE,IAAAA,cAACgyK,GAAAA,EAAqB,CAClB5/J,UAAW1P,KAAKhD,MAAM2T,KAAKG,WAC3BnZ,OAAQqI,KAAKhD,MAAMrF,OACnBuoI,YAAa,CAAC/1G,GAAAA,EAAY49J,eAE1BzqL,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,iBAAA4J,OAAmB+B,KAAKhD,MAAM2T,KAAKtc,IACrC,+BAAA4J,OAA8B+B,KAAKhD,MAAM2T,KAAKtc,IAC9C66D,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,iBAGvBm5J,eAAgB5iK,IAAAA,cAAC0+L,GAAAA,wBAAuB,CAAC59L,KAAM,KAC/CwO,QAAS5M,KAAKi8L,sCAIzBpyL,SACImlL,GACGhvL,KAAKhD,MAAMwd,4BACVxa,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUwvB,QAC/BhwE,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUuvB,UAClC/vE,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUC,eAClCnjD,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,sBAAA4J,OAAwB+B,KAAKhD,MAAM2T,KAAKtc,IAC1C,oCAAA4J,OAAmC+B,KAAKhD,MAAM2T,KAAKtc,IACnD86D,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,MAC3CvoI,OAlHAgtI,KAChB/C,EACOn5L,KAAKhD,MAAMm/L,iBAAmBd,EAAsBC,EAExDt7L,KAAKhD,MAAMm/L,iBAAmBZ,EAAoBC,EA8G7BU,GACRh8B,eACIi5B,EACI77L,IAAAA,cAAC8+L,GAAAA,wBAAuB,CAACh+L,KAAM,KAE/Bd,IAAAA,cAAC++L,GAAAA,wBAAuB,CAACj+L,KAAM,KAGvCwO,QAAS5M,KAAKg6L,wBAG7BnwL,SAASmlL,IAAoBhvL,KAAKhD,MAAMs/L,mBAAqBt8L,KAAKhD,MAAMyS,WAAa+wC,EAAAA,GAAUquI,SAC5FvxL,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,eAAA4J,OAAiB+B,KAAKhD,MAAM2T,KAAKtc,IACnC,6BAAA4J,OAA4B+B,KAAKhD,MAAM2T,KAAKtc,IAC5C66D,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mBACH0S,eAAe,mBAGvBm5J,eAAgB5iK,IAAAA,cAACi/L,GAAAA,iBAAgB,CAACn+L,KAAM,KACxC+wD,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,MAC3C7qL,QAAS5M,KAAKw6L,0BAGpBxL,GACE1xL,IAAAA,cAACk/L,GAAmB,CAChBhoM,OAAQwL,KAAKhD,MAAMxI,OACnBmc,KAAM3Q,KAAKhD,MAAM2T,KACjBmmL,eAAgB92L,KAAKhD,MAAM85L,eAC3Bl0I,SAAU5iD,KAAKhD,MAAM4lD,YAG3BosI,GACE1xL,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,aAAA4J,OAAe+B,KAAKhD,MAAM2T,KAAKtc,IACjC,2BAAA4J,OAA0B+B,KAAKhD,MAAM2T,KAAKtc,IAC1C66D,OAAQlvD,KAAKhD,MAAM+pL,UAAY0U,EAAaC,EAC5Cx7B,eAAgBlgK,KAAKhD,MAAM+pL,UAAYzpL,IAAAA,cAACm/L,GAAAA,aAAY,CAACr+L,KAAM,KAAQd,IAAAA,cAACo/L,GAAAA,oBAAmB,CAACt+L,KAAM,KAC9F+wD,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,MAC3C7qL,QAAS5M,KAAKu6L,8BAGrB1wL,SAASmlL,IAAoBhvL,KAAKhD,MAAM69L,aACrCv9L,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,GAAA4J,OAAK+B,KAAKhD,MAAM2T,KAAKusB,UAAY,QAAU,MAAK,UAAAj/B,OAAS+B,KAAKhD,MAAM2T,KAAKtc,IAC3E,0BAAA4J,OAAyB+B,KAAKhD,MAAM2T,KAAKtc,IACzC66D,OAAQlvD,KAAKhD,MAAM2T,KAAKusB,UAAYy+J,EAAYrD,EAChDp4B,eAAgBlgK,KAAKhD,MAAM2T,KAAKusB,UAAY5/B,IAAAA,cAACq/L,GAAAA,QAAO,CAACv+L,KAAM,KAAQd,IAAAA,cAACs/L,GAAAA,eAAc,CAACx+L,KAAM,KACzF+wD,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,MAC3C7qL,QAAS5M,KAAKq6L,6BAGrBxwL,SAASmlL,GAAmBhvL,KAAKhD,MAAM07L,UACpCp7L,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,eAAA4J,OAAiB+B,KAAKhD,MAAM2T,KAAKtc,IACnC66D,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,wBACJ0S,eAAgB,gBAExBm5J,eAAgB5iK,IAAAA,cAACu/L,GAAAA,6BAA4B,CAACz+L,KAAM,KACpD+wD,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,MAC3C7qL,QAAS5M,KAAKo6L,qCAGpBpL,IAAoBhvL,KAAKpK,MAAM+hM,SAAW33L,KAAKpK,MAAMklM,YAAcx9L,IAAAA,cAAC4Z,GAAAA,GAAc,OAClF83K,GACE1xL,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,aAAA4J,OAAe+B,KAAKhD,MAAM2T,KAAKtc,IACjC,2BAAA4J,OAA0B+B,KAAKhD,MAAM2T,KAAKtc,IAC1C66D,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,cAEvBm5J,eAAgB5iK,IAAAA,cAAC63E,GAAAA,gBAAe,CAAC/2E,KAAM,KACvC+wD,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,MAC3C7qL,QAAS5M,KAAKo0I,YAGpB46C,GAAmB1xL,IAAAA,cAAC4Z,GAAAA,GAAc,MACnClX,KAAKpK,MAAM+hM,SACRr6L,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,aAAA4J,OAAe+B,KAAKhD,MAAM2T,KAAKtc,IACjC,2BAAA4J,OAA0B+B,KAAKhD,MAAM2T,KAAKtc,IAC1C66D,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,SAEvBm5J,eAAgB5iK,IAAAA,cAACw/L,GAAAA,kBAAiB,CAAC1+L,KAAM,KACzC+wD,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,MAC3C7qL,QAAS5M,KAAK85L,+BAGpB9K,GACE1xL,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,QAAA4J,OAAU+B,KAAKhD,MAAM2T,KAAKtc,IAC5B,sBAAA4J,OAAqB+B,KAAKhD,MAAM2T,KAAKtc,IACrC66D,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,cAEvBm5J,eAAgB5iK,IAAAA,cAACy/L,GAAAA,gBAAe,CAAC3+L,KAAM,KACvC+wD,iBAAkB7xD,IAAAA,cAACohJ,GAAW,CAAC+4C,YAAY,MAC3C7qL,QAAS5M,KAAKgjH,WAGrBhjH,KAAKpK,MAAMklM,WACRx9L,IAAAA,cAAC4Z,GAAAA,GAAS,CACN7iB,GAAE,eAAA4J,OAAiB+B,KAAKhD,MAAM2T,KAAKtc,IACnC,6BAAA4J,OAA4B+B,KAAKhD,MAAM2T,KAAKtc,IAC5C6rK,eAAgB5iK,IAAAA,cAACqzJ,GAAAA,oBAAmB,CAACvyJ,KAAM,KAC3C+wD,iBAAkB7xD,IAAAA,cAAA,YAAO,UACzB4xD,OACI5xD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gBACH0S,eAAe,WAEvB6F,QAAS5M,KAAKk6L,8BACd/5B,eAAe,IAKnC,EACHrgK,GA7iBY43L,GAAY,aA7ErB//L,OAAMyL,IAAAA,OAAAC,WACNoM,SAAQrM,IAAAA,IACR2jL,UAAS3jL,IAAAA,KACTssL,mBAAkBtsL,IAAAA,KAClBmqI,qBAAoBnqI,IAAAA,KAAAC,WACpB40L,uBAAsB70L,IAAAA,KACtBm6J,WAAUn6J,IAAAA,KACVy3L,WAAUz3L,IAAAA,KACV+zF,WAAU/zF,IAAAA,KACV43L,kBAAiB53L,IAAAA,OACjB8lE,kBAAiB9lE,IAAAA,KACjBk5L,kBAAiBl5L,IAAAA,KACjBsf,QAAOtf,IAAAA,OACP+lI,aAAY/lI,IAAAA,KAAAC,WACZu/C,SAAQx/C,IAAAA,OACR0zL,eAAc1zL,IAAAA,KAAAC,WACdq1L,QAAOt1L,IAAAA,KAAAC,WAEPhD,QAAO+C,IAAAA,MAAA,CAKH20L,SAAQ30L,IAAAA,KAAAC,WAKRu0L,WAAUx0L,IAAAA,KAAAC,WAKV61L,eAAc91L,IAAAA,KAAAC,WAKdi1L,QAAOl1L,IAAAA,KAAAC,WAKP+0L,UAASh1L,IAAAA,KAAAC,WAKT8M,UAAS/M,IAAAA,KAAAC,WAKTk1L,iBAAgBn1L,IAAAA,KAAAC,WAKhB8oL,gBAAe/oL,IAAAA,KAAAC,aAAAA,WAInBs0L,QAAOv0L,IAAAA,KAAAC,WACPy3L,UAAS13L,IAAAA,KAAAC,WACT7O,OAAM4O,IAAAA,OAAAC,WAENmX,0BAAyBpX,IAAAA,KAAAC,WACzB81L,kBAAiB/1L,IAAAA,KACjBg2L,sBAAqBh2L,IAAAA,KACrB+4L,iBAAgB/4L,IAAAA,SAAAtD,GAQP43L,GAAY,eACwB,CACzC3Q,WAAW,EACX8T,YAAY,EACZprL,SAAU+wC,EAAAA,GAAUwvB,SA2iB5B,UAAeljE,EAAAA,EAAAA,YAAW4qL,IC3iB1B,IAAetyL,EAAAA,EAAAA,UAxFf,WACI,MAAMomL,GAAuBC,EAAAA,GAAAA,MACvBuR,GAAcC,EAAAA,EAAAA,MAEpB,OAAO,SAAyBrnM,EAAoB2hC,GAChD,MAAM,KAAC5mB,GAAQ4mB,EAET/M,GAAUC,EAAAA,EAAAA,IAAW70B,GACrBqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnBpB,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAC1BsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO+a,EAAKG,YACjC0S,GAAcC,EAAAA,EAAAA,IAAe7tB,GAC7BupB,EAAOje,GAAUigB,EAAAA,EAAAA,IAAQvrB,EAAOsL,EAAQ4W,cAAWxf,EACnDoqB,EAAU,GAAHzkB,QAAM8Q,EAAAA,GAAAA,MAAY,KAAA9Q,QAAIkhB,aAAI,EAAJA,EAAM1hB,QAAQ+lB,aAAW,EAAXA,EAAa/lB,OACxDq5L,GAAiB75K,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYggL,mBAAmB,GAEtGnO,GAAgBC,EAAAA,EAAAA,IAAgBr+K,GAChC+rB,GAAmBliB,EAAAA,EAAAA,IAA0B5kB,GAE7Cke,EAASnD,EAAKI,SAAWJ,EAAKtc,GACpC,IAAIi3L,EAAWx3K,EACXqlL,GAAoB,EACpBC,GAAwB,EACxB+C,EAAmB,EAEvB,GACIz/J,GACA5oB,IAAWi7K,KAINx3J,EAAS9nB,UACV8nB,EAAS9nB,WAAa+wC,EAAAA,GAAUuvB,UAChCx4C,EAAS9nB,WAAa+wC,EAAAA,GAAUC,aAChClpB,EAAS9nB,WAAa+wC,EAAAA,GAAUwvB,QAEtC,CACE,MAAM14D,GAAOmR,EAAAA,EAAAA,IAAQ7yB,EAAOke,GAC5B,GAAIwD,EAAM,CACN,MAAM+2B,EAASm9I,EAAqB51L,EAAO0hB,GAC3C6kL,EAAmB9tJ,EAAOP,YAC1B,MAAMqvJ,GAAyBC,EAAAA,EAAAA,IAA0BxnM,GACnDynM,GAAyB1pH,EAAAA,GAAAA,IAAcr8D,EAAK5a,SAClDy8L,EAAoB9qJ,EAAOkB,aAC3B6pJ,EAA+C,IAAvB/qJ,EAAOP,cAC3BwvJ,EAAAA,EAAAA,IAA4CH,EAAwBE,GACxE/R,EAAWj9I,EAAOh6C,EACtB,CACJ,CAEA,MAAO,CACHioM,mBAAmB14K,EAAAA,EAAAA,IAAkB1iB,GACrCpE,WAAYlH,EAAM+oE,QAAQ7hE,WAC1Bk+L,kBAAmB/iM,EAAOslM,kBAC1BpmG,WAAmC,SAAvB3sE,EAAQG,WACpBhzB,QAAQogB,EAAAA,EAAAA,IAAiBniB,GACzB+hM,QAASlK,EAAAA,GAAsB73L,EAAO+a,EAAM6Z,EAASvyB,EAAQiJ,EAAS1M,GACtEsmM,UAAWrN,EAAAA,GAAwB73L,EAAO+a,EAAMzP,GAChDwhB,UACAluB,SACA82L,WACA6N,oBACAC,wBACA5+K,0BAA2BkiB,EAC3By/J,mBACAhzD,cAAc7kF,EAAAA,EAAAA,IAAgB1uD,GAC9BgtD,UAAUH,EAAAA,GAAAA,IAAmB7sD,GAC7BkhM,iBACA4B,UAASx3L,GAAU87L,EAAYpnM,EAAOsL,EAAQ1I,KAAM2jM,GAE5D,CACJ,IAEA,SAA4BxoM,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxByyL,SAAQ,KACRH,WAAU,KACVsB,eAAc,KACdZ,QAAO,KACPF,UAAS,KACTjoL,UAAS,IACTooL,iBAAgB,KAChBpM,gBAAeA,GAAAA,IAChBx4L,GAEX,GAEA,CAAgE6pM,I,gBCxHhE,MAAMC,GAAehoM,IAQR,IAPT4K,SAAS,SACL03L,EAAQ,WACRH,GACH,UACD7Q,EAAS,OACT9/J,EAAM,SACNxX,EAAW+wC,EAAAA,GAAUwvB,QACjBv6E,EACJ,MAAMoR,GAAOiQ,EAAAA,EAAAA,WAEPi2H,GAAY5jF,EAAAA,EAAAA,QAA0B,OACrCk7G,EAAYq5B,IAAiB7mL,EAAAA,EAAAA,WAAS,GAEvC8mL,GAAc5mL,EAAAA,EAAAA,cAAata,IAC7BA,EAAEyK,iBAEE6/K,EACA6Q,EAAW3wK,GAEX8wK,EAAS9wK,EACb,GACD,CAAC8wK,EAAUH,EAAY3wK,EAAQ8/J,IA4BlC,IAAI6W,EAOJ,OAjCAl7I,EAAAA,EAAAA,YAAU,KACN,SAASsiH,IACL04B,GAAc,EAClB,CACA,SAASx4B,IACLw4B,GAAc,EAClB,CAMA,OAJI3wD,EAAUh9H,UACVg9H,EAAUh9H,QAAQ8qD,iBAAiBmnC,EAAAA,GAAqB+iE,SAAUC,GAClEj4B,EAAUh9H,QAAQ8qD,iBAAiBmnC,EAAAA,GAAqBijE,WAAYC,IAEjE,KACCn4B,EAAUh9H,UACVg9H,EAAUh9H,QAAQgrD,oBAAoBinC,EAAAA,GAAqB+iE,SAAUC,GACrEj4B,EAAUh9H,QAAQgrD,oBAAoBinC,EAAAA,GAAqBijE,WAAYC,GAC3E,CACH,GACF,KAEHxiH,EAAAA,EAAAA,YAAU,KACF2hH,GAAct3B,EAAUh9H,SACxBg9H,EAAUh9H,QAAQwqD,cAAc,IAAIsjI,MAAM77F,EAAAA,GAAqB87F,QACnE,GACD,CAACz5B,IAIAu5B,EADA7W,EACWzpL,IAAAA,cAACipL,GAAc,CAAChpL,UAAWk3C,IAAW,OAAQ,cAAe,qBAAsB,CAAC,4BAA6BsyI,MAEjHzpL,IAAAA,cAACygM,GAAAA,EAAQ,CAACxgM,UAAWk3C,IAAW,OAAQ,iBAInDn3C,IAAAA,cAACq1D,GAAAA,EAAW,CACR33D,IAAG,iBAAAiD,OAAmB8oL,EAAY,UAAY,IAC9Cv7K,MACIu7K,EACIzpL,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mBACH0S,eAAe,sBAGnBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,kBAK3BzJ,IAAAA,cAAA,UACI46C,IAAK60F,EACL14I,GAAE,GAAA4J,OAAKwR,EAAQ,cAAAxR,OAAagpB,GAC5B,aAAY8/J,EAAYlgL,EAAKC,cAAc,CAACzS,GAAI,mBAAoB0S,eAAgB,sBAAsBxG,cAAgBsG,EAAKC,cAAc,CAACzS,GAAI,iBAAkB0S,eAAgB,SAASxG,cAC7LhD,UAAU,kBACVqP,QAAS+wL,GAERC,GAEK,EAEpBH,GAAA93L,UAAA,CA3FE8J,SAAQrM,IAAAA,IACR6jB,OAAM7jB,IAAAA,OAAAC,WACN0jL,UAAS3jL,IAAAA,KAAAC,WACThD,QAAO+C,IAAAA,MAAA,CARP20L,SAAQ30L,IAAAA,KAAAC,WACRu0L,WAAUx0L,IAAAA,KAAAC,aAAAA,YAiGd,SAAe/F,IAAAA,KAAWmgM,IC5F1B,IAAer4L,EAAAA,EAAAA,SAAQ,MATvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxByyL,SAAQ,KACRH,WAAUA,EAAAA,IACXjkM,GAEX,GAEA,CAAiD8pM,I,0aCAjD,MAEM5iL,IAAW25C,EAAAA,EAAAA,gBAAe,CAC5B80H,YAAa,CACTj1L,GAAI,kCACJ0S,eAAgB,kBAsBjB,MAAMi3L,WAAqB1gM,IAAAA,cAAkCsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,0BAM3C6hC,IACjB3hC,KAAKgH,SAAS,CAAC0iE,iBAAiB,IAChC,MAAMyvC,GAAYnvC,EAAAA,GAAAA,IAAaroC,GAC/B3hC,KAAKhD,MAAMqD,QAAQsqL,eAAe3qL,KAAKhD,MAAMiqB,OAAQkyF,GACrDn5G,KAAKhD,MAAMmsE,mBAAmB,GACjC,CAEDlmE,MAAAA,GACI,MAAM,UACFyM,EAAS,SACTD,EAAQ,OACRwX,EAAM,gBACNyiD,EAAe,OACf/xE,EAAM,KACNkP,GACA7G,KAAKhD,MAET,IAAI4rI,EACAC,EAMJ,OALIp5H,IAAa+wC,EAAAA,GAAUuvB,UAAYtgE,IAAa+wC,EAAAA,GAAUC,cAC1DmoF,EAAqBp+D,GAAAA,EAAmByzH,yBACxCp1D,EAAqBr+D,GAAAA,EAAmB0zH,0BAIxC5gM,IAAAA,cAACgyK,GAAAA,EAAqB,CAClB5/J,UAAWA,EACX/X,OAAQA,EACRuoI,YAAa,CAAC/1G,GAAAA,EAAY49J,eAE1BzqL,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACktE,GAAAA,EAAkB,CACfrhE,KAAMugE,EACN5R,OAAQ93D,KAAKhD,MAAMmhM,cACnBl0L,OAAQjK,KAAKhD,MAAMmsE,kBACnBsB,aAAczqE,KAAKo+L,kBACnBzzH,WArEL,EAsEKi+D,mBAAoBA,EACpBC,mBAAoBA,IAExBvrI,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAOqP,GAASyuK,aAEhBhsL,IAAAA,cAAA,UACI,cAAY,2BACZjJ,GAAE,GAAA4J,OAAKwR,EAAQ,cAAAxR,OAAagpB,GAC5B,aAAYpgB,EAAKC,cAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,iBACvFxJ,UAAWk3C,IAAW,kBAAmB,6BAA8B,CACnE,0BAA2Bi1B,IAE/B98D,QAAS5M,KAAKhD,MAAMmsE,mBAEpB7rE,IAAAA,cAAC2sH,GAAAA,EAAS,CAAC1sH,UAAU,wBAM7C,EACHuC,GAjEYk+L,GAAY,aAjBrBtuL,UAAStM,IAAAA,OACT6jB,OAAM7jB,IAAAA,OAAAC,WACN1L,OAAMyL,IAAAA,OAAAC,WACN86L,cAAa/6L,IAAAA,KAAAC,WACboM,SAAQrM,IAAAA,IACRsmE,gBAAetmE,IAAAA,KACf+lE,kBAAiB/lE,IAAAA,KAAAC,WACjBhD,QAAO+C,IAAAA,MAAA,CACHunL,eAAcvnL,IAAAA,KAAAC,aAAAA,aAAAvD,GASTk+L,GAAY,eACwB,CACzCvuL,SAAU+wC,EAAAA,GAAUwvB,OACpBtG,iBAAiB,IAgEzB,UAAe58D,EAAAA,EAAAA,YAAWkxL,IC/F1B,IAAe54L,EAAAA,EAAAA,SAAQ,MARvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBqlL,eAAcA,EAAAA,IACfh3L,GAEX,GAEA,CAAiDqqM,I,gBCHjD,MAAMK,GAAY5oM,IAAwC,IAAvC,MAACksC,EAAK,YAAE28J,EAAW,MAAEh4K,GAAa7wB,EACjD,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAOlB+mH,EAAgB,kBAEhB1kB,GAAYnvC,EAAAA,GAAAA,IAAaroC,GAE/B,OACIrkC,IAAAA,cAAA,OACIC,UAAWk3C,IAAWopF,EAAe,uBACrCjxH,QAZanQ,IACjBA,EAAEy0D,kBACFotI,EAAY38J,EAAM,GAYdrkC,IAAAA,cAAA,UACIjJ,GAAE,mBAAA4J,OAAqBqoB,GACvB,cAAau3G,EAAgB,SAC7BtgI,UAAU,sBACVmN,MAAO,CAACmsH,gBAAiB,OAAF54H,QAAS24H,EAAAA,GAAAA,IAAiBj1F,GAAM,KAAKslD,gBAAiB,eAC7E,aAAYngF,EACR,CACIzS,GAAI,qCACJ0S,eAAgB,qBAEpB,CACIoyG,UAAYA,EAAW50E,QAAQ,KAAM,SAI/C,EAEZ85J,GAAA14L,UAAA,CArCE24L,YAAWl7L,IAAAA,KAAAC,WACXijB,MAAKljB,IAAAA,QAsCT,Y,0ZCfe,MAAMm7L,WAA4BjhM,IAAAA,cAAkCsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,0BAM1D6hC,IACjB,MAAMw3E,GAAYnvC,EAAAA,GAAAA,IAAaroC,GAC/B3hC,KAAKhD,MAAMqD,QAAQsqL,eAAe3qL,KAAKhD,MAAMiqB,OAAQkyF,EAAU,IAClEr5G,GAAA,yBAEmBmsB,IAChB,MAAMuyK,EAAax+L,KAAKhD,MAAMyhM,cAAch+L,QAAQhE,IAChD,IAAIiiM,GAAS,EACb,IAAK,MAAM/8J,KAAS1V,EAChB,GAAIxvB,EAAEgB,OAASkkC,EAAMlkC,KAAM,CACvBihM,GAAS,EACT,KACJ,CAEJ,OAAQA,CAAM,IAEZC,EAAI1yK,EAAOvlB,OACjB,IAAK,IAAIg5B,EAAI,EAAGA,EAAI1/B,KAAKhD,MAAMoB,KAAOugM,EAAGj/J,IACrCzT,EAAO3c,KAAKkvL,EAAW9+J,IAG3B,OAAOzT,CAAM,IAChBnsB,GAAA,kBAEW,CAAC6hC,EAAc9gB,KAKvB,OAJ+BonF,GAGlBj+B,EAAAA,GAAAA,IAAaroC,GACQ4C,QAAQ,KAAM,MAHnC,GAAGq6J,kBAAkB/9K,GAAUonF,EAAE74F,MAAM,GADpD,IAA+B64F,CAIsB,GACxD,CAEDhlG,MAAAA,GACI,MAAM,UACFyM,EAAS,OACT/X,GACAqI,KAAKhD,MAET,IAAIivB,EAAS,IAAIjsB,KAAKhD,MAAMivB,QAAQ7c,MAAM,EAAGpP,KAAKhD,MAAMoB,MAKxD,OAJI6tB,EAAOvlB,OAAS1G,KAAKhD,MAAMoB,OAC3B6tB,EAASjsB,KAAK6+L,iBAAiB5yK,IAG5BA,EAAOtrB,KAAI,CAACghC,EAAOkmE,IACtBvqG,IAAAA,cAACgyK,GAAAA,EAAqB,CAClBt0K,IAAKgF,KAAKm5G,UAAUx3E,EAAO3hC,KAAKhD,MAAM6jB,QACtCnR,UAAWA,EACX/X,OAAQA,EACRuoI,YAAa,CAAC/1G,GAAAA,EAAY49J,eAE1BzqL,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAOxL,KAAKm5G,UAAUx3E,EAAO3hC,KAAKhD,MAAM6jB,QACxC8gB,OAAOqoC,EAAAA,GAAAA,IAAaroC,GACpB2jF,cAAc,GAEdhoH,IAAAA,cAAA,WACIA,IAAAA,cAAC+gM,GAAS,CACN18J,MAAOA,EACP28J,YAAat+L,KAAKo+L,kBAClB93K,MAAOuhF,QAO/B,EACH/nG,GAzEoBy+L,GAAmB,aAjBpC7uL,UAAStM,IAAAA,OACT6jB,OAAM7jB,IAAAA,OAAAC,WACN1L,OAAMyL,IAAAA,OAAAC,WACNoM,SAAQrM,IAAAA,MAAA,CANS,SAAW,WAAa,gBAOzCyd,OAAMzd,IAAAA,OAAAC,WACN4oB,OAAM7oB,IAAAA,MAAAC,WACNjF,KAAIgF,IAAAA,OACJq7L,cAAar7L,IAAAA,MAAAC,WACbhD,QAAO+C,IAAAA,MAAA,CACHunL,eAAcvnL,IAAAA,KAAAC,aAAAA,aAAAvD,GAQDy+L,GAAmB,eACS,CACzC9uL,SAAU+wC,EAAAA,GAAUwvB,OACpB5xE,KAAM,ICJd,UAAegH,EAAAA,EAAAA,UAXf,SAAyBxP,GACrB,MAAMirB,GAASC,EAAAA,GAAAA,GAAiBlrB,GAC1Bu2B,GAAWsqG,EAAAA,EAAAA,IAAY7gI,GAG7B,MAAO,CACH6oM,cAHkB,CAACtyK,EAAS00C,IAAI,YAAa10C,EAAS00C,IAAI,YAAa10C,EAAS00C,IAAI,qBAIpFhgD,SAER,IAjBA,SAA4BltB,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBqlL,eAAcA,EAAAA,IACfh3L,GAEX,GAaA,CAA4DqqM,ICwP5D,GAhOqBhhM,IACjB,MAAM8hM,GAAa31I,EAAAA,EAAAA,QAAuB,OAEnCugB,EAAiBC,IAAsB9yD,EAAAA,EAAAA,WAAS,IAChDkoL,EAAaC,IAAkBnoL,EAAAA,EAAAA,WAAS,IACxCooL,EAAiBC,IAAsBroL,EAAAA,EAAAA,WAAS,GAEjDsyD,GAAoBpyD,EAAAA,EAAAA,cAAY,KAClC4yD,GAAoBD,GACpB1sE,EAAMuwI,sBAAuB7jE,EAAgB,GAC9C,CAAC1sE,EAAMuwI,qBAAsB7jE,KAEhChnB,EAAAA,EAAAA,YAAU,KACN,MAAMy8I,EAAmC,gBAAnBniM,EAAMyS,SAA6B+wC,EAAAA,GAAUuvB,SAAW/yE,EAAMyS,SAChFzS,EAAMoiM,YACLpiM,EAAMqiM,qCAAuCF,GAC1CniM,EAAMsiM,sBACVn2H,IACAnsE,EAAMqD,QAAQyvE,gCAAgCtvB,EAAAA,GAAU++I,UAC5D,GAED,CAACviM,EAAMoiM,WAAYpiM,EAAMqiM,mCAAoCriM,EAAMyS,SAAUzS,EAAMsiM,sBAEtF,MAAM,kBACFhD,EAAiB,wBACjBkD,EAAuB,WACvB3E,EAAU,KACVlqL,EAAI,yBACJ8uL,EAAwB,aACxBt2D,GACAnsI,EAEE0iM,GAAcC,EAAAA,EAAAA,IAAgBhvL,GAC9Bo+K,GAAgBC,EAAAA,EAAAA,IAAgBr+K,GAChCivL,GAAsBC,EAAAA,EAAAA,IAAkBlvL,GAkBxCmvL,EAAgBnvL,GAAQA,EAAK/a,QAAUixB,EAAAA,GAAM4V,aAC7CsjK,EAAa/iM,EAAM6kH,OAASn4C,GAAmBq1H,GAAeE,EAC9De,EAAkBJ,IAAyB7Q,IAAkB5lD,GAC3D42D,IAAgBpvL,EAAKI,SAAWlH,QAAQ7M,EAAMijM,aAC9CjjM,EAAMkjM,eAAiBljM,EAAMyS,WAAa+wC,EAAAA,GAAUwvB,OACtDmwH,EAAwBh3D,EAAe,GAAK,aAElD,IAAIi3D,EACAJ,IACAI,EACI9iM,IAAAA,cAACiyL,GAAW,CACRG,mBAAoB1yL,EAAM0yL,mBAC1BzoK,OAAQtW,EAAKtc,GACbo7L,WAAY0Q,EACZjvE,aAAcl0H,EAAMwiM,wBAA0B,EAAIxiM,EAAMqjM,cAKpE,MAAMC,GAA8Bn3D,IAAiB0xD,IAAe6E,IAAgB/uL,EAAK4vL,SAAWxR,IAAkBuN,GAAqBmD,GAA4BziM,EAAMksE,mBAAqB62H,EAElM,IAAIS,EAkBAC,EAjBJ,GAAIH,EAA2B,KAAAI,EAAAC,EAC3B,MAAMC,EAAoB5jM,EAAM6jM,YACT,WAAnB7jM,EAAMyS,WACkE,QAAxEixL,EAAyC,QAAzCC,EAACnhM,SAAS2tE,eAAe,wBAAgB,IAAAwzH,OAAA,EAAxCA,EAA0Ch8I,wBAAwBh5C,aAAK,IAAA+0L,EAAAA,EAAI,GAAK39K,EAAAA,GAAU+9K,sBAE/FN,EACIljM,IAAAA,cAACihM,GAAmB,CAChB7uL,UAAWiB,EAAKG,WAChBmW,OAAQtW,EAAKtc,GACbsD,OAAQqF,EAAMrF,OACds0B,OAAQjvB,EAAMo+H,aACdh9H,KAAMwiM,EAAoB,EAAI,GAG1C,EAE0B7R,IAAkB8L,IAAe6E,IAAgB/uL,EAAK4vL,QAAUvjM,EAAMksE,oBAAsBozH,IAGlHmE,EACInjM,IAAAA,cAAC0gM,GAAY,CACTtuL,UAAWiB,EAAKG,WAChBrB,SAAUzS,EAAMyS,SAChBwX,OAAQtW,EAAKtc,GACbsD,OAAQqF,EAAMrF,OACdwmM,cAjDUA,IAAMW,EAAW/uL,QAkD3B25D,gBAAiBA,EACjBP,kBAAmBA,KAK/B,IAAIy0H,EAAsB,KACrBz0D,GAAkBu2D,GAAgB/uL,EAAK4vL,QAAWxR,IACnD6O,EACItgM,IAAAA,cAACmgM,GAAY,CACThuL,SAAUzS,EAAMyS,SAChBwX,OAAQtW,EAAKtc,GACb0yL,UAAW/pL,EAAM+pL,aAM7B,MACMga,EADsB/jM,EAAMgkM,wBAA0B73D,GAAgB42D,IAExEziM,IAAAA,cAAC8xL,GAAW,CACRz+K,KAAMA,EACNlB,SAAUzS,EAAMyS,SAChB89H,qBA9EyBt+H,IAC7BiwL,EAAmBjwL,GACnBjS,EAAMuwI,qBAAsBt+H,EAAK,EA6E7BsuJ,WAAY0hC,IAIpB,IAAIn5H,EAAyB,KACuC,IAAAm7H,EAA9DvB,GAAgB/uL,EAAK4vL,QAAWxR,IAAkBgR,IACpDj6H,GAAiC,QAAnBm7H,EAAAjkM,EAAMkkM,qBAAa,IAAAD,OAAA,EAAnBA,EACVtgM,KAAK1D,IACD,GAAIA,EAAKhC,UAAW,CAChB,MAAMmrE,EAAYnpE,EAAKhC,UACvB,OACIqC,IAAAA,cAAC8oE,EAAS,CACNz1D,KAAM3T,EAAM2T,KACZ3V,IAAKiC,EAAK5I,IAGtB,CACA,OAAO,IAAI,MACT,IAGd,MAAM8sM,EACF7jM,IAAAA,cAACkgM,GAAO,CACJ7sL,KAAM3T,EAAM2T,KACZlB,SAAUzS,EAAMyS,SAChBs3K,UAAW/pL,EAAM+pL,UACjBx5C,qBA9GqBt+H,IACzB+vL,EAAe/vL,GACfjS,EAAMuwI,qBAAsBt+H,EAAK,EA6G7BygL,mBAAoB1yL,EAAM0yL,mBAC1BuI,uBAAwB9uH,EACxB0xH,WAAYA,GAAcyB,EAC1B/+B,WAAYwhC,EACZ71H,kBAAmBlsE,EAAMksE,oBAKjC,IAAI7tE,EACJ,GAAIqkM,EACArkM,EACIiC,IAAAA,cAAA,OAAKC,UAAU,mBACXD,IAAAA,cAAA,UACIC,UAAU,6CACVqP,QAlIhB,WACI5P,EAAMq7K,WAAWr7K,EAAM2T,KAC3B,GAkIiB,WAIV,GAAImvL,GAAkB/Q,IAAkB/xL,EAAM89L,UACjDz/L,EAAU,UACP,GAAI2B,EAAMyS,WAAa+wC,EAAAA,GAAUquI,OAAQ,CAC5C,MAAMuS,EAAepkM,EAAMwiM,0BAA4B7uL,EAAKI,UAAYJ,EAAKm9B,YAAc,GAAKn9B,EAAK4+B,cACrGl0C,EACIiC,IAAAA,cAAA,OAAKC,UAAU,2BACV4jM,EACAvD,EACA5gM,EAAMqkM,WAAaD,GAChB9jM,IAAAA,cAACiyL,GAAW,CACR9/K,SAAUzS,EAAMyS,SAChBigL,mBAAoB1yL,EAAM0yL,mBAC1Bx+D,aAAcl0H,EAAMqjM,WACpBp5K,OAAQtW,EAAKtc,GACbm7L,YAAa,uBACbC,WAAYzyL,EAAMqjM,WAAa,gBAAkB,KAGzD/iM,IAAAA,cAAA,KACIm2C,KAAK,IACL7mC,QAAS5P,EAAMskM,gBACf/jM,UAAU,qBAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mBACH0S,eAAe,UAKnC,MAAY/J,EAAMqqE,oBACdhsE,EACIiC,IAAAA,cAAA,OACI46C,IAAK4mJ,EACL,2BAAA7gM,OAA0BjB,EAAM2T,KAAKtc,IACrCkJ,UAAWyyH,IAAW,gBAAiB,CAAC,uBAAwB+vE,GAAcC,MAE5ER,IAA4Bc,GAA6Ba,EAC1DX,EACAC,EACA7C,EACA93H,EACAi7H,EACAX,GACCZ,GAA2Bc,IAA8Ba,IAKvE,OAAO7jM,IAAAA,cAAAA,IAAAA,SAAA,KAAGjC,EAAW,E,4BCpQzB,MAAMkmM,GAA0BvkM,IAC5B,MAAM0nH,GAAkBztG,EAAAA,EAAAA,SAAQ0tG,GAAAA,GAAqB,KAC/C,OAACnwH,EAAM,gBAAEw6L,EAAe,MAAEnrI,GAAS7mD,EACnCrJ,GAAWsxD,EAAAA,EAAAA,eACXu8I,GAAmBntJ,EAAAA,EAAAA,cAAaz+C,GAAuB8uH,EAAgB9uH,EAAOpB,KAC9EitM,GAAyBptJ,EAAAA,EAAAA,aAAYqtJ,GAAAA,IACrC58E,GAAsBzwE,EAAAA,EAAAA,aAAY0wE,GAAAA,IAElC48E,EAAoBH,GAAoBA,EAAiB7/J,MAC/D,OAAKmjF,GAAuBkqE,GAAmBnrI,EACpC,KAGP89I,EAEIrkM,IAAAA,cAACw0G,GAAAA,EAAiB,CACdC,OAAQv9G,EACRqyF,aAAa,EACburB,WAAY,CACRqS,UAAW,KAOtBg9E,EAUDnkM,IAAAA,cAAA,UACIsP,QAPcuI,IAClBA,EAAMjO,iBACNvT,GAAS2iC,EAAAA,GAAAA,IAAkB,GAAM,EAM7B/4B,UAAU,8DAEVD,IAAAA,cAAC2sH,GAAAA,EAAS,CAAC1sH,UAAU,wCACrBD,IAAAA,cAAA,QAAMC,UAAU,uCACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,yBAjBpB,IAoBE,EAEfw6L,GAAA57L,UAAA,CAtDEnR,OAAM4O,IAAAA,OAAAC,WACN2rL,gBAAe5rL,IAAAA,KAAAC,WACfwgD,MAAKzgD,IAAAA,KAAAC,YAsDT,Y,gBC3CA,MA4HA,GA5HyBrG,IACrB,MAAM6J,GAAOiQ,EAAAA,EAAAA,YACP,KAACnG,EAAI,eAAEg7H,EAAc,aAAExC,EAAY,kBAAEy4D,EAAiB,2BAAE3b,EAA0B,MAAEpiI,EAAK,gBAAEmrI,EAAe,kBAAE6S,GAAqB7kM,EACjI4iM,GAAsBC,EAAAA,EAAAA,IAAkBlvL,GACxCmxL,EAAWn2D,GAAkBk2D,EAEnC,IAAIE,EAAyB,KACzBC,EAAe,KACfC,EAAQ,KAERjlM,EAAM2uI,iBACNs2D,EAAQ3kM,IAAAA,cAAA,UAAQC,UAAU,SAAS,MAGvC,MAAMkkC,EACFnkC,IAAAA,cAACikM,GAAsB,CACnB/sM,OAAQwI,EAAM2T,KAAKoL,QACnB8nC,MAAO7mD,EAAM6mD,OAAqC,SAA5BlzC,EAAK3T,MAAMklM,aACjClT,gBAAiBA,IAczB,IAVIrjD,GAAkBxC,KAClB44D,EACIzkM,IAAAA,cAACyoL,GAAAA,EAAW,CACRvxL,OAAQmc,EAAKoL,QACbrM,UAAWiB,EAAKG,WAChBgxL,SAAUA,KAKlBF,EACAG,EACIzkM,IAAAA,cAACyoL,GAAAA,EAAW,CACRvxL,OAAQmc,EAAKoL,QACbrM,UAAWiB,EAAKG,WAChBgxL,SAAUA,SAYlB,GARAC,EACIzkM,IAAAA,cAACyoL,GAAAA,EAAW,CACRvxL,OAAQmc,EAAKoL,QACbrM,UAAWiB,EAAKG,WAChBgxL,SAAUA,KAIdK,EAAAA,EAAAA,IAAcxxL,GAAO,CACrB,MAAMyxL,GAAmBC,EAAAA,EAAAA,IAAa1xL,EAAK3T,MAAMslM,mBAC3CC,EAAgBH,GAAoBnc,EAA6Bmc,OAAmB9pM,EAEpFkqM,GADmBH,EAAAA,EAAAA,IAAa1xL,EAAK3T,MAAMylM,yBACPnqM,EAC1CypM,EACIzkM,IAAAA,cAACyoL,GAAAA,EAAW,CACRvxL,OAAQmc,EAAKoL,QACbrM,UAAWiB,EAAKG,WAChB0uF,YAAY,EACZ+iG,cAAeA,EACfT,SAAUA,EACVU,cAAeA,IAMlB3+I,IACDm+I,EAAgB1kM,IAAAA,cAACkB,GAAAA,EAAM,MAE/B,MAAWohM,GACPmC,EACIzkM,IAAAA,cAAA,QAAMC,UAAU,kBACZD,IAAAA,cAACyoL,GAAAA,EAAW,CACRvxL,OAAQmc,EAAKoL,QACbrM,UAAWiB,EAAKG,WAChB0uF,YAAY,EACZsiG,SAAUA,KAItBE,EACI1kM,IAAAA,cAAC+0H,GAAAA,EAAG,CACAvqH,KACIxK,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,uBAKxBioL,GAAmBnrI,EAC1Bk+I,EACIzkM,IAAAA,cAACyoL,GAAAA,EAAW,CACRvxL,OAAQmc,EAAKoL,QACbrM,UAAWiB,EAAKG,WAChB0uF,YAAY,EACZsiG,SAAUA,IAGX9S,IACP+S,EACIzkM,IAAAA,cAACyoL,GAAAA,EAAW,CACRwc,cAAe17L,EAAKC,cAAc,CAC9BzS,GAAI,mBACJ0S,eAAgB,WAEpBvS,OAAQmc,EAAKoL,QACb2mL,gBAAgB,EAChBhzL,UAAWiB,EAAKG,WAChBgxL,SAAUA,KAM1B,OAAQxkM,IAAAA,cAAA,OAAKC,UAAU,iBAClBwkM,EACAE,EACAD,EACAvgK,EACC,E,89BCrGV,SAASy+J,GAAavvL,EAAYgyL,GAC9B,QAAIhyL,EAAKI,WACD4xL,GAEOhyL,EAAKI,UAAY4xL,EAAatuM,IAAMsc,EAAKI,UAAY4xL,EAAa5xL,QASrF,CAEA,SAAS6wL,GAAkBhsM,EAAoB2hC,GAAoB,IAAAqrK,EAAAC,EAC/D,IAAIlyL,EACA4mB,EAAStQ,OACTtW,GAAO8X,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAAStQ,QACxBsQ,EAAS5mB,OAChBA,EAAO4mB,EAAS5mB,MAEpB,MAAMgyL,EAAeprK,EAASurK,iBAAkBr6K,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAASurK,gBAExE,IAAIC,GAAkB,EAKtB,OAHIJ,IAAgBhyL,GAAsB,QAAdiyL,EAACjyL,EAAKqZ,gBAAQ,IAAA44K,GAAU,QAAVC,EAAbD,EAAe3rH,gBAAQ,IAAA4rH,GAAvBA,EAAyB5rH,WAClD8rH,GAAkBC,EAAAA,EAAAA,IAA8BryL,EAAMgyL,IAEnDI,CACX,CA6JA,MAAM/M,IAAY5wL,EAAAA,EAAAA,UA3JlB,WACI,MAAM69L,GAAuBC,EAAAA,EAAAA,MACvBzxE,GAAgBC,EAAAA,EAAAA,MAEtB,OAAO,SAAyB97H,EAAoB2hC,GAChD,IAAI5mB,EASAwyL,EACA3d,EAJJ,GALIjuJ,EAAS5mB,KACTA,EAAO4mB,EAAS5mB,KACT4mB,EAAStQ,SAChBtW,GAAO8X,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAAStQ,UAE9BtW,EACD,OAAO,KAKPA,EAAKI,UACLoyL,GAAa16K,EAAAA,EAAAA,IAAQ7yB,EAAO+a,EAAKI,SACjCy0K,EAAiB2d,GAAa3rK,EAAAA,EAAAA,IAAQ5hC,EAAOutM,EAAWpnL,SAAW,MAGvE,MAAM9jB,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnBszE,EAAiD,SAA7BjxE,EAAOqxE,kBAC3B28G,EAAmE,SAAtChuL,EAAOmrM,2BACpCliM,EAAUtL,EAAMuyB,SAAShG,SAASA,SAASxR,EAAKG,YAChDuuL,GAAqCgE,EAAAA,EAAAA,IAAsCztM,GAE3E8K,GAAO82B,EAAAA,EAAAA,IAAQ5hC,EAAO+a,EAAKoL,SAC3B8nC,EAAQh6C,QAAQnJ,GAAQA,EAAKnC,QAC7B+kM,GAAoBC,EAAAA,EAAAA,IAAqB3tM,GAEzC4tM,GAAeC,EAAAA,EAAAA,IAAoB7tM,GAEzC,IAAIq2B,EAAkB,GACtB,MAAMwzK,EAA2K,UAAhJ5+H,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYwmL,4BAA6BxmL,EAAAA,GAAYymL,qCACpIlE,IACAxzK,GAAS23K,EAAAA,EAAAA,IAA0BhuM,IAGvC,IAAI+sM,EAAe,KACfprK,EAASurK,iBACTH,GAAel6K,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAASurK,iBAG3C,IAAIe,GAAwB,EAExBlB,IAAiBhyL,EAAK3T,MAAMi6E,WAC5B4sH,EAAwBh6L,QAAQ84L,EAAa5xL,UAGjD,MAAMyS,GAAcC,EAAAA,EAAAA,IAAe7tB,GAC7BupB,GAAOgC,EAAAA,EAAAA,IAAQvrB,EAAOsL,EAAQ4W,SACpC,IACIsxI,EADA1vG,EAAWl2B,aAAW,EAAXA,EAAa/lB,KAG5B,MAAMqmM,GAAcvjL,EAAAA,EAAAA,IAAmB3qB,GACjCmuM,EAAW7iM,EAAQ1I,OAAS0rC,EAAAA,GAAQzW,YAAcvsB,EAAQ1I,OAAS0rC,EAAAA,GAAQlhB,WAC3Em2I,GAAWhhJ,EAAAA,EAAAA,IAAYviB,GAEzBujK,IAAa/gJ,EAAAA,GAAUC,MACtB0rL,GACDD,GAAepmM,OAAOoI,OAAOg+L,GAAap9L,OAAS,IAEnD0iJ,EAAkBjqI,aAAI,EAAJA,EAAMhiB,aACxBu8C,GAAWv6B,aAAI,EAAJA,EAAM1hB,QAAQ+lB,aAAW,EAAXA,EAAa/lB,OAG1C,MAAM4jM,EAAW0C,GAAa7iM,EAAQ4W,WAAY0L,aAAW,EAAXA,EAAanvB,IACzD2vM,GAAiBvT,EAAAA,EAAAA,IAAkB76L,EAAOsL,EAAQ7M,IAElD4vM,GAAmBpjI,EAAAA,EAAAA,IACrBjrE,EACAsnB,EAAAA,GAAY4jD,0BACZ5jD,EAAAA,GAAYgnL,iBACZhnL,EAAAA,GAAYinL,0BAGVC,GAAiBnnL,EAAAA,EAAAA,IACnBrnB,EACAsnB,EAAAA,GAAY4jD,0BACZ5jD,EAAAA,GAAYmnL,qBACiC,SAA7CnnL,EAAAA,GAAYonL,8BAGhB,MAAO,CACHp7H,oBACA+8G,6BACAt1C,gBAAgBA,EAAAA,EAAAA,IAAe/6I,EAAO+a,EAAKtc,IAC3CwmM,YAAY,EACZz3K,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAChCsqM,eAAcyC,GAAezC,GAAavvL,EAAMgyL,GAChD1C,WAAYxuE,EAAc77H,EAAO+a,GAAQ,EACzC0vL,WAAY5uE,EAAc77H,EAAO+a,GACjC0wL,WACAne,gBAAiBttL,EAAM+oE,QAAQ4lI,UAC/BjI,mBAAmB14K,EAAAA,EAAAA,IAAkB1iB,GACrC0gM,kBAAmBA,GAAkBhsM,EAAO2hC,GAC5CssK,wBACA9c,WAAWyd,EAAAA,EAAAA,IAAc5uM,EAAO+a,EAAKtc,IACrCs3I,gBAAgB9qE,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYunL,gBAAiBvnL,EAAAA,GAAYwnL,2BAA6BxnL,EAAAA,GAAYynL,wBACpJ9C,kBAAiJ,UAA9HhhI,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAY0nL,mBAAoB1nL,EAAAA,GAAY2nL,4BACjH7D,uBAAuBA,EAAAA,EAAAA,IAAsBprM,EAAO+a,GACpD6S,cACArE,OACAkgL,qCACAx7I,QACA27I,yBAAyBhlL,EAAAA,EAAAA,IAA0B5kB,GACnDkvM,gBAAiBvtK,EAASutK,iBAAmBxB,IAAsB3yL,EAAKtc,GACxEorM,2BACArkE,aAAcnvG,EACd84K,QAAQlkI,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAY6jD,qBAAsB7jD,EAAAA,GAAY8jD,gCAAkC9jD,EAAAA,GAAY8nL,8BACtJxqL,2BAA2BA,EAAAA,EAAAA,IAA0B5kB,GACrDirM,WAAYjrM,EAAM8kD,MAAM2Z,IAAI4wI,kBAC5B59H,kBAAmB9vC,EAAS9nB,WAAa+wC,EAAAA,GAAUwvB,SAAUk1H,EAAAA,EAAAA,IAA0BtvM,EAAO+a,EAAKtc,MAAO8wM,EAAAA,EAAAA,IAAqBvvM,EAAO+a,EAAKtc,KAAM6wM,EAAAA,EAAAA,IAA0BtvM,EAAO+a,EAAKtc,IACvL80I,cAAc7kF,EAAAA,EAAAA,IAAgB1uD,GAC9BquM,mBACAG,iBACAzzL,OACAzT,YAAagE,EAAQ/D,aACrB6iE,YAAa9+D,EAAQ1I,KACrB4wJ,kBACAtlJ,aAAa6zE,EAAAA,EAAAA,IAAqB/hF,EAAOouM,GACzCtqJ,WACA0rJ,eAAgBjsC,IAAa/gJ,EAAAA,GAAUitL,KACvCC,cAAensC,IAAa/gJ,EAAAA,GAAUC,IACtCktL,aAAoI,UAAtH1kI,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYsoL,eAAgBtoL,EAAAA,GAAYuoL,wBACxGC,iBAAkBzC,EAAqBrtM,EAAO+a,EAAKtc,IACnD8uM,aACA3d,iBACAnpG,+BAA+BA,EAAAA,EAAAA,IAA8BzmF,GAC7D+oF,uBAAuBA,EAAAA,EAAAA,IAAsB/oF,GAC7C+vM,WAAYnC,GAAgBA,EAAanvM,KAAOsc,EAAKtc,GACrDuxM,mBAAmBA,EAAAA,EAAAA,IAAkBhwM,EAAO+a,EAAMzP,GAClD45L,WAAW+K,EAAAA,EAAAA,IAAcjwM,EAAO+a,EAAMzP,GACtCggM,cAAetrM,EAAM+oE,QAAQ7hE,WAAWgpM,WAEhD,CACJ,IAEA,SAA4BnyM,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBizL,iBAAgB,KAChBzoH,gCAA+B,KAC/Bm8G,WAAU,KACV8Z,kCAAiC,KACjCC,eAAc,KACd3tB,WAAYH,EACZ38J,mBAAkB,KAClB0qL,eAAcA,EAAAA,IACftyM,GAEX,IAMA,GAAeqiM,ICvHQh5L,IAA8B,IAAAvH,EAAAywM,EAAAC,EAAAC,EAAAC,EAAAzD,EAAA0D,EAAAC,EAAAC,EACjD,MAAM,KAAC71L,EAAI,gBAAEm0L,EAAe,eAAE2B,GAAkBzpM,EAE1C0pM,EAAsB1pM,EAAM2pM,SAAW3pM,EAAM2pM,QAAQjgM,OAAS,GAAM1J,EAAMk3J,iBAAoBl3J,EAAMk4B,MAAQl4B,EAAMk4B,KAAKxuB,OAAS,EAChIg4D,EAAQ1hE,EAAMyS,WAAa+wC,EAAAA,GAAUuvB,UAAY/yE,EAAMyS,WAAa+wC,EAAAA,GAAUC,aAAezjD,EAAMyS,WAAa+wC,EAAAA,GAAUquI,OAC1H+X,GAAUz9I,EAAAA,EAAAA,QAAuB,MACjC09I,GAAgB19I,EAAAA,EAAAA,QAAuB,MACvCxxD,EAAgD,QAA1ClC,EAAiB,QAAjBywM,EAAa,QAAbC,EAAGnpM,EAAMmiB,YAAI,IAAAgnL,OAAA,EAAVA,EAAY9xM,UAAE,IAAA6xM,EAAAA,EAAqB,QAArBE,EAAIppM,EAAMwmB,mBAAW,IAAA4iL,OAAA,EAAjBA,EAAmB/xM,UAAE,IAAAoB,EAAAA,EAAI,IAEnDosH,EAAOilF,IAAYjwL,EAAAA,EAAAA,WAAS,IAC5BwtJ,EAAY0iC,IAAWlwL,EAAAA,EAAAA,WAAS,IAChCmwL,EAAgBC,IAAqBpwL,EAAAA,EAAAA,WAAS,IAC9CqwL,EAAoBC,IAAyBtwL,EAAAA,EAAAA,WAAS,IACtDuwL,EAAkBC,IAAuBxwL,EAAAA,EAAAA,WAAS,IAClDnL,EAAK47L,IAAUzwL,EAAAA,EAAAA,WAAS,IACxB0wL,EAAsBC,IAA2B3wL,EAAAA,EAAAA,WAAS,GAE3Dm4K,EAAkBvB,EAAAA,GAA0B98K,GAC5CkvL,EAAoBpS,EAAAA,GAA4B98K,IAEtD+xC,EAAAA,EAAAA,YAAU,KACN,GAAIoiJ,EAAiB,CACjB,MAAM2C,EAAQl/K,YAAW,IAAM8+K,GAAoB,IAAOtkL,EAAAA,GAAU2kL,mBACpE,MAAO,KACH70J,aAAa40J,EAAM,CAE3B,CACgB,GACjB,CAAC3C,IAEJ,MAAM9/B,EAA0BA,IAAM+hC,GAAQ,GACxC7hC,EAA4BA,IAAM6hC,GAAQ,GAC1CY,EAAalrM,GAAqB6qM,EAAO7qM,EAAE2xE,QAE3Cw5H,GAA0B7wL,EAAAA,EAAAA,cAAata,KACpC8qM,GAAwBzC,IAAmB7oI,EAAAA,GAAAA,GAAax/D,EAAGsmB,EAAAA,GAAUoxC,SAAS0zI,MAAQprM,EAAEu/D,WACzFv/D,EAAEyK,iBACFzK,EAAEy0D,kBAEFs2I,GAAwB,GAExBhoM,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQ8uI,EAAQ72L,QAChBmyF,cAAc,MAI9B,GACD,CAACqlG,EAAsBzC,KAE1BpiJ,EAAAA,EAAAA,YAAU,KACU,IAAAolJ,EAAZzjC,IACe,QAAfyjC,EAAAlB,EAAQ72L,eAAO,IAAA+3L,GAAfA,EAAiBvtI,cAAc,IAAIsjI,MAAM77F,EAAAA,GAAqB87F,SAClE,GACD,CAACz5B,KAEJ3hH,EAAAA,EAAAA,YAAU,KACN,IAAIqY,EAQJ,OANI6rI,EAAQ72L,UACR62L,EAAQ72L,QAAQ8qD,iBAAiBmnC,EAAAA,GAAqB+iE,SAAUC,GAChE4hC,EAAQ72L,QAAQ8qD,iBAAiBmnC,EAAAA,GAAqBijE,WAAYC,GAClEnqG,EAAsB6rI,EAAQ72L,QAAQgrD,qBAGnC,KACCA,IACAA,EAAoBinC,EAAAA,GAAqB+iE,SAAUC,GACnDjqG,EAAoBinC,EAAAA,GAAqBijE,WAAYC,GACzD,CACH,GACF,KAEHxiH,EAAAA,EAAAA,YAAU,KACFm/D,IACAriH,SAASq7D,iBAAiB,UAAW8sI,GACrCnoM,SAASq7D,iBAAiB,QAAS8sI,IAGhC,KACHnoM,SAASu7D,oBAAoB,UAAW4sI,GACxCnoM,SAASu7D,oBAAoB,QAAS4sI,EAAU,IAErD,CAAC9lF,KAEJn/D,EAAAA,EAAAA,YAAU,KACNljD,SAASq7D,iBAAiB,QAAS+sI,GAE5B,KACHpoM,SAASu7D,oBAAoB,QAAS6sI,EAAwB,IAEnE,CAACA,IAEJ,MAAMG,EAAe/qM,KACbA,EAAMkjM,eAEEvvL,EAAKI,SAAY/T,EAAM6mM,wBAAyB7mM,EAAM4kM,qBAEvDjxL,EAAKI,SAqFd08H,GAA2B12H,EAAAA,EAAAA,cAAa9H,GAAkBk4L,EAAsBl4L,IAAO,IAEvFs+H,GAAuBx2H,EAAAA,EAAAA,cAAaixL,IAClCvB,GACAA,EAAeuB,GAEnBf,EAAkBe,EAAO,GAC1B,CAACvB,IAEE/oE,IAAkB3mH,EAAAA,EAAAA,cAAata,IACjCqqM,GAAS,GACTQ,EAAO7qM,EAAE2xE,OAAO,GACjB,IAEG65H,IAAmBlxL,EAAAA,EAAAA,cAAY,KACjC+vL,GAAS,GACTQ,GAAO,EAAM,GACd,IAcGY,IAAqBjxL,EAAAA,EAAAA,UAAQ,KAAMkxL,EAAAA,EAAAA,IAAuB,0EAA0E,IAEpIC,IAAkBrxL,EAAAA,EAAAA,cAAata,IAC5BkU,IAAQ3T,EAAMs/L,oBAKd7/L,EAAE2xE,SACHpxE,EAAMuoM,eACL1F,GAAsB7Q,IACvBkZ,GAAmBzrM,IACnBO,EAAMyS,WAAa+wC,EAAAA,GAAUwvB,QAC5BhzE,EAAMqqE,qBAEPxrE,EAAAA,EAAAA,IAAW,MAAO,oBAClBmB,EAAMqD,QAAQ4rL,WAAWt7K,IAGzBlU,EAAE2xE,QACFpxE,EAAMqD,QAAQk4L,iBAAiB5nL,EAAM3T,EAAMyS,UAC/C,GACD,CACCkB,EACAkvL,EACAqI,GACAlZ,EACAhyL,EAAMs/L,kBACNt/L,EAAMuoM,aACNvoM,EAAMqD,QACNrD,EAAMyS,SACNzS,EAAMqqE,oBAGJi6H,IAAkBvqL,EAAAA,EAAAA,cAAata,IACjCA,EAAEyK,iBACElK,EAAMmsI,cACNnsI,EAAMqD,QAAQkb,qBAGlBve,EAAMqD,QAAQ2lM,gBAAe,IAC7B32L,EAAAA,GAAAA,KAAaC,KAAK,IAADrR,OAAKjB,EAAM08C,SAAQ,QAAAz7C,OAAO0S,EAAKtc,IAAK,GACtD,CAAC2I,EAAMmsI,aAAcnsI,EAAMqD,QAASrD,EAAM08C,SAAU/oC,aAAI,EAAJA,EAAMtc,MAEvD,kCAAC0xM,IAAqC/oM,EAAMqD,QAE5CqvL,IAAqB34K,EAAAA,EAAAA,cAAata,IACpCA,EAAEyK,iBAEGyJ,GAGLo1L,GAAkCp1L,EAAK,GACxC,CAACA,EAAMo1L,KAEJsC,IAAoBtxL,EAAAA,EAAAA,cAAata,IAAwB,IAAA6rM,GACtC,QAAjBA,EAAAtrM,EAAMwmB,mBAAW,IAAA8kL,OAAA,EAAjBA,EAAmBj0M,MAAOsD,EAC1B+3L,GAAmBjzL,GAEnB6kM,GAAgB7kM,EACpB,GACD,CAACizL,GAAoB4R,GAAkC,QAAnB+E,EAAErpM,EAAMwmB,mBAAW,IAAA6iL,OAAA,EAAjBA,EAAmBhyM,GAAIsD,IAE1D4wM,GAAY9zJ,IAAW,aAAc,CAAC,eAAgBg5I,EAAAA,GAAmB98K,GAAO,sBAAuB+1L,IAE7G,IAAIvT,GACAn2L,EAAMkjM,cAAgBljM,EAAMmmM,YAAcnmM,EAAMwoL,gBAAkB70K,EAAKnY,OAASuqB,EAAAA,GAAAA,UAAoB9G,YACpGk3K,GACI71L,IAAAA,cAACgoL,GAAW,CACR30K,KAAM3T,EAAMmmM,WACZ3d,eAAgBxoL,EAAMwoL,eACtBC,eAAgBiK,MAK5B,IAYI8Y,GAZAC,GAAiB,KACjB93L,EAAKnY,OAASuqB,EAAAA,GAAAA,UAAoB9G,WAAcjf,EAAM2uI,gBAAkBh7H,EAAK/a,QAAUixB,EAAAA,GAAM4V,eAC7FgsK,GACInrM,IAAAA,cAAA,QAAMC,UAAU,oBACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,4BAO/B,MAAM2hM,GAAqBX,EAAY/qM,KAAY2T,EAAKI,UAAY/T,EAAMijM,aAAgBxS,EAAAA,GAAoB98K,GACxGg4L,KAAoB3rM,EAAMyS,WAAa+wC,EAAAA,GAAUC,aAAezjD,EAAM2uI,gBAAkB3uI,EAAM4kM,oBAC/F8G,IAAsBC,KACvBH,GACIlrM,IAAAA,cAACsrM,GAAAA,EAAkB,CACfj9D,eAAgB3uI,EAAM2uI,eACtBh7H,KAAMA,EACNnc,OAAQmc,EAAKoL,UAIjB8jL,IACA2I,GACIlrM,IAAAA,cAAA,QAAMC,UAAU,kBACXirM,MAMjB,MAAM9rM,GAAUgqM,EACZppM,IAAAA,cAACkkL,GAAyB,CACtB7wK,KAAMA,EACNtV,QAAS,CACLu8C,WAAY56C,EAAMk4B,KAClB2zK,cAAe7rM,EAAM2pM,UAGzBrpM,IAAAA,cAACwrM,GAAAA,EAAoB,CACjBn4L,KAAMA,EACNtV,QAAS,CACLu8C,WAAY56C,EAAMk4B,KAClB2zK,cAAe7rM,EAAM2pM,QACrBlhM,iBAAkBzI,EAAMk3J,iBAE5Bx1F,MAAOA,KAIfphE,IAAAA,cAAC2lL,GAA4B,CACzBtyK,KAAMA,EACNggI,eAAgB3zI,EAAM2zI,eACtBuyC,gBAAiBlmL,EAAMkmL,gBACvBxkH,MAAOA,EACPitE,eAAgB3uI,EAAM2uI,iBAIxBo9D,GAA+B/rM,EAAMqqE,kBAAoB2tC,EAAAA,EAAgBg0F,MAAQh0F,EAAAA,EAAgBY,MACjGqzF,GAAejsM,EAAMyS,WAAa+wC,EAAAA,GAAUuvB,UAAY/yE,EAAMwd,4BAA8B7J,EAAKI,UAAY/T,EAAMijM,YAActvL,EAAK4+B,cACxIjyC,IAAAA,cAAC+tL,GAAY,CACTC,SAAU36K,EAAKtc,GACfk3L,WAAY8c,KAEhB,KACEa,IAAiBC,EAAAA,EAAAA,IAAoBx4L,EAAKuL,WAC1C6jD,GA/PiBqpI,MACnB,IAAI3rM,EAAwBT,EAAME,YAElC,MAAMmsM,EAAkBrsM,EAAMgjE,cAAgBj9C,EAAAA,GAAU0K,WAClD67K,EAAiBtsM,EAAMwd,4BAA8B7J,EAAKm9B,YAAc,GAAKn9B,EAAK4+B,cAkCxF,OAhCI85J,GAAmBC,EACnB7rM,EACIH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,6CACfjB,OAAQ,CACJjI,SAAUb,EAAM8G,eAIrBwlM,EACP7rM,EACIH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,sBACfjB,OAAQ,CACJ5E,QAASlE,EAAME,eAIpBmsM,IACP5rM,EACIH,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,mCACfjB,OAAQ,CACJjI,SAAUb,EAAM8G,gBAMzBrG,CAAI,EAyNY2rM,GACrBG,GAAgBvsM,EAAMyS,WAAa+wC,EAAAA,GAAUquI,QAAU7xL,EAAMsoM,eAAiBtoM,EAAMooM,eAuB1F,IAAInuH,GACa,QAAb2rH,EAAAjyL,EAAKqZ,gBAAQ,IAAA44K,GAAbA,EAAe3rH,UAAYj6E,EAAM2hF,wBACjC1H,GAAW35E,IAAAA,cAAA,QAAMC,UAAU,oBAAmBD,IAAAA,cAAC65E,GAAAA,EAAa,CAACF,SAAUtmE,EAAKqZ,SAASitD,SAASA,aAGlG,IAAIuyH,GAAyB,GACzBxsM,EAAMyS,WAAa+wC,EAAAA,GAAUwvB,OAC7Bw5H,GAAyB,WAClBxsM,EAAMyS,WAAa+wC,EAAAA,GAAUuvB,UAAY/yE,EAAMyS,WAAa+wC,EAAAA,GAAUC,cAC7E+oJ,GAAyB,eAG7B,MAAMC,GAAsB94L,EAAKmZ,UAAYnZ,EAAKmZ,SAASpjB,OAAS,IAAM1J,EAAMqqE,kBAEhF,OACI/pE,IAAAA,cAAAA,IAAAA,SAAA,MACMopM,GAAuB1pM,EAAMyS,WAAa+wC,EAAAA,GAAUwvB,SAAWhzE,EAAMsoM,eAAiBtoM,EAAMooM,kBAAqB9nM,IAAAA,cAACosM,GAAAA,EAAa,CAACj/G,KAAMy+G,KACxI5rM,IAAAA,cAACqsM,GAAAA,EAAgB,CACbzxJ,IAAK0uJ,EACLvyM,GAxCMu1M,MACd,IAAIC,EACJ,OAAQ7sM,EAAMyS,UACd,IAAK,SAWL,QACIo6L,EAAW,aATf,IAAK,WACL,IAAK,cACDA,EAAW,UACX,MACJ,IAAK,SACDA,EAAW,eAOf,OAAOA,EAAW,IAAH5rM,OAAO0S,EAAKtc,GAAI,EAsBnBu1M,GACJ,cAAaJ,GACb12I,SAAU,EACVniD,KAAMA,EACNpT,UAzPSusM,MACjB,MAAMC,GAAcC,EAAAA,EAAAA,IAAiBr5L,GAC/Bs5L,EACFpoF,GAASqlF,GAAsBF,GAAkB3iC,GAAcrnK,EAAMqqE,kBACzE,OAAO5yB,IAAW,qBAAsB,CACpC,kBAAmBqwJ,IAAoBsC,EACvC,aAAcW,EAAY/qM,GAC1B,eAAgB+qM,EAAY/qM,KAAWgyL,EACvC,YAAavB,EAAAA,GAAoB98K,GACjC,gBAAiB3T,EAAMqqE,kBACvB,gBAAiBrqE,EAAMomB,gBAAkBzS,EAAKoL,UAAYizK,EAC1D,eAAgBA,GAAmB+a,EACnC,aAAc/sM,EAAMijM,cAAgBtvL,EAAKI,SAAWJ,EAAKI,QAAQrK,OAAS,GAC1E,gBAAkBiK,EAAKI,SAAWJ,EAAKI,QAAQrK,OAAS,IAAM1J,EAAMwd,2BAA+Bxd,EAAMyS,WAAa+wC,EAAAA,GAAUC,YAChI,gBAAiBzjD,EAAM2uI,eACvB,gBAAiBs+D,EACjB,aAAcjtM,EAAM4kM,qBAAuB5kM,EAAM2uI,gBAAkB3uI,EAAMyS,WAAa+wC,EAAAA,GAAUC,aAChG,kBAAmB/0C,IAAQ1O,EAAMs/L,kBACjC,sBAAuB3rL,EAAK4vL,QAAU5vL,EAAK/a,QAAUixB,EAAAA,GAAM4V,aAC3D,2BAA4BojK,EAC5B,2BAA4BlvL,EAAKusB,WAAalgC,EAAM+pL,YAAc/pL,EAAMyS,WAAa+wC,EAAAA,GAAUwvB,OAC/F,kBAAmBhzE,EAAM0oM,iBACzB,eAAgBhnI,GAClB,EAkOiBorI,GACXl9L,QAASw7L,GACT7qE,YAAaG,GACb9X,aAAcqiF,KAEZp+L,QAAQ68L,IAAwB1pM,EAAMyS,WAAa+wC,EAAAA,GAAUwvB,QAAUhzE,EAAM+pL,YAC3EzpL,IAAAA,cAAA,OACIC,UAAU,kCACV,cAAY,SAEVsM,QAAQ68L,IAAuB1pM,EAAMooM,iBACvC9nM,IAAAA,cAAA,QAAMC,UAAU,wBACXwiE,IAGJ/iE,EAAMs/L,mBACPh/L,IAAAA,cAAA,QAAMC,UAAU,4BACZD,IAAAA,cAAC4sM,GAAAA,EAAW,CAAC3sM,UAAU,mEACvBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,eAIrB8C,QAAQ68L,IAAuB1pM,EAAMooM,iBAAmBv7L,QAAQ7M,EAAMosJ,kBACxE9rJ,IAAAA,cAAA,QAAMC,UAAU,qBACXP,EAAMosJ,kBAKnB9rJ,IAAAA,cAACopL,GAAa,CACVK,UAAW/pL,EAAM+pL,UACjBC,SAAUr2K,EAAKusB,UACfqqJ,WAAYvqL,EAAMyS,WAAa+wC,EAAAA,GAAUquI,QAAU7xL,EAAMsoM,cACzDhe,YAAatqL,EAAMyS,WAAa+wC,EAAAA,GAAUquI,QAAU7xL,EAAMooM,eAC1D11L,UAAWiB,EAAKG,aAEpBxT,IAAAA,cAAA,OACI8M,KAAK,cACL7M,UAAS,iBAAAU,OAAmBjB,EAAM+nM,OAAS,SAAW,IACtD,cAAY,eAEZznM,IAAAA,cAAA,OAAKC,UAAU,aACVirM,IAELlrM,IAAAA,cAAA,WACIA,IAAAA,cAAA,OACIC,UAAU,eACV26C,IAAK2uJ,GAELvpM,IAAAA,cAAC6sM,GAAezsM,OAAAC,OAAA,GACRX,EAAK,CACTgyL,gBAAiBA,KAErB1xL,IAAAA,cAAA,OAAKC,UAAU,mCACPmrM,IAAsB1rM,EAAMyS,WAAa+wC,EAAAA,GAAUwvB,QAAW6xC,GAAS7kH,EAAMyS,WAAa+wC,EAAAA,GAAUwvB,SACpG1yE,IAAAA,cAACoqL,GAAQ,CACLE,cAAe/gK,EAAAA,GAAM4V,eAAiB9rB,EAAK/a,QAASw0M,EAAAA,EAAAA,IAAsBz5L,IAC1E+oC,SAAoB,QAAZ4sJ,EAAEtpM,EAAMmiB,YAAI,IAAAmnL,OAAA,EAAVA,EAAY7oM,KACtBkqL,UAAWh3K,EAAKuL,UAChB+K,OAAQtW,EAAKtc,GACbob,SAAUzS,EAAMyS,SAChBq/G,eAAc16H,GAAAA,GAAA,GAAM4I,EAAM8xH,gBAAc,IAAEpkH,MAAO1N,EAAM4kM,oBAAsB5kM,EAAM2uI,eAAiB,cAAWrzI,MAGtH2+E,GACAtmE,EAAK3T,OAAS2T,EAAK3T,MAAMqtM,MACtB/sM,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,0BAIvBzJ,IAAAA,cAAA,UACIC,UAAW,gDAAkDP,EAAM2oM,WAAa,SAAW,IAC3F/4L,QAAUnQ,IACNA,EAAEyK,iBA3RrByJ,KAChBA,IAGD3T,EAAMstM,iBACNttM,EAAMstM,gBAAgB35L,GAE1B3T,EAAMqD,QAAQ4lM,eAAet1L,GAAK,EAqRM25L,CAAgB35L,EAAK,GAGzBrT,IAAAA,cAACovL,GAAa,CACVnvL,UAAU,kBACV,cAAY,WAK3BkrM,KAEHzrM,EAAMqqE,mBACR/pE,IAAAA,cAACitM,GAAW7sM,OAAAC,OAAA,GACJX,EAAK,CACTrF,OAAQA,EACR41I,qBAAsBA,EACtBmiD,mBAAoBA,GACpB7tE,MAAOA,GAASwiD,EAChBgU,WAAYr7K,EAAMqD,QAAQg4K,WAC1BipB,gBAAiBA,GACjBhC,oBA1WCkL,MAAsB,IAAAC,EAC/C,MAAMC,EAAmE,QAAxBD,EAAG5D,EAAc92L,eAAO,IAAA06L,OAAA,EAArBA,EAAuB9lJ,wBAE3E,IAAIgmJ,EAA4C,KAMhD,OALID,IACAC,EAA6BD,EAAuB9lJ,IAAM,GAAM,GAC5D8lJ,EAAuB11I,OAAUhmD,OAAO+5H,YAAc,IAGvD4hE,CAAyB,EAiWaH,OAI5BrX,GACD71L,IAAAA,cAAA,OACIC,UAAWgrM,GACXl0M,GAAIqqE,OAAQpmE,EAAY,GAAH2F,OAAM0S,EAAKtc,GAAE,aAEjCsc,EAAK4vL,QAAUjjM,IAAAA,cAAC4oL,GAAiB,CAACv1K,KAAMA,IACzCrT,IAAAA,cAACy1E,EAAAA,EAAkB,CACfC,SAAU+1H,GACV51H,qBAAsBn2E,EAAMqqE,kBAC5B4L,MAAOv2E,GACPw2E,MAAO51E,IAAAA,cAACstM,EAAQ,MAChB31F,gBAAiBA,IAAMz1G,SAAS+6D,cAAc,IAAIsjI,MAAMgN,EAAAA,GAAUC,uBAGlErB,IACAnsM,IAAAA,cAACytM,EAAAA,EAA2B,CACxBp6L,KAAMA,EACNg7H,eAAgB3uI,EAAM2uI,eACtB8B,yBAA0BA,IAGlCnwI,IAAAA,cAAA,OAAKC,UAAU,6BACVP,EAAMq/E,gCAA8C,QAAjBkqH,EAAI51L,EAAKqZ,gBAAQ,IAAAu8K,GAAU,QAAVC,EAAbD,EAAetvH,gBAAQ,IAAAuvH,OAAV,EAAbA,EAAyBvqH,gBAC7D3+E,IAAAA,cAACumL,GAAoB,CACjBC,SAAUnzK,EAAKoL,QACfm2H,UAAWvhI,EAAK/a,QAAUixB,EAAAA,GAAM4V,aAChCxV,OAAQtW,EAAKtc,KAGpBk1M,IAAiBjsM,IAAAA,cAACmtL,GAAY,CAAC95K,KAAMA,KAEzCs4L,OAKlB,G,qyBChpBX,MAAM+B,GAAcx2I,EAAAA,EAAAA,gBAAe,CAC/B,CAAC3tC,EAAAA,GAAMokL,WAAWC,gBAAiB,CAC/B72M,GAAI,2CACJ0S,eAAgB,6CAEpB,CAAC8f,EAAAA,GAAMokL,WAAWE,cAAe,CAC7B92M,GAAI,yCACJ0S,eAAgB,2BAEpB,CAAC8f,EAAAA,GAAMokL,WAAWhqK,eAAgB,CAC9B5sC,GAAI,uCACJ0S,eAAgB,yBAEpB,CAAC8f,EAAAA,GAAMokL,WAAWG,oBAAqB,CACnC/2M,GAAI,8CACJ0S,eAAgB,oCAEpB,CAAC8f,EAAAA,GAAMokL,WAAWI,qBAAsB,CACpCh3M,GAAI,+CACJ0S,eAAgB,sCAEpB,CAAC8f,EAAAA,GAAMokL,WAAWK,aAAc,CAC5Bj3M,GAAI,wCACJ0S,eAAgB,0CAEpB,CAAC8f,EAAAA,GAAMokL,WAAWM,WAAY,CAC1Bl3M,GAAI,sCACJ0S,eAAgB,wBAEpB,CAAC8f,EAAAA,GAAMokL,WAAWrmL,YAAa,CAC3BvwB,GAAI,oCACJ0S,eAAgB,sBAEpB,CAAC8f,EAAAA,GAAMokL,WAAWO,kBAAmB,CACjCn3M,GAAI,4CACJ0S,eAAgB,qCAiBjB,MAAM0kM,UAAkBnuM,IAAAA,cAC3BsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,sBAOArD,IACbA,EAAEyK,iBAEFlH,KAAKgH,SAAS,CAAC0kM,QAAQ,GAAM,IAChC5rM,EAAA,sBAEgBu3I,GAET/5I,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAAS26I,EACTh8I,QAAS2E,KAAKhD,MAAM2uM,kBAf5B3rM,KAAKpK,MAAQ,CACT81M,QAAQ,EAEhB,CAiBAzoM,MAAAA,GACI,MAAM,cAAC6D,GAAiB9G,KAAKhD,MAAM6J,MAC7B,OAAC6kM,GAAU1rM,KAAKpK,OAChB,MACFg2M,EAAK,eACLC,EAAc,SACdx2I,EAAQ,UACRy2I,GACA9rM,KAAKhD,MAEHqtG,EAAYyhG,EAAU,GACtBC,EAAYD,EAAUplM,OAAS,EAC/BgiL,EAAWojB,EAAUC,GAE3B,GAAIL,EAAQ,CACR,MAAMr0D,EAAmBvwI,EAAc+kM,EAAgB,CACnDrrM,MAAOsrM,EAAU18L,MAAM,EAAG28L,GAAW9kJ,KAAK,MAC1CyhI,WACAkjB,UAGJ,OAAO5rM,KAAKgsM,cAAc30D,EAC9B,CAEA,MAAM40D,EAAmBnlM,EACrB,CAACzS,GAAI,2BAA4B0S,eAAgB,oBACjD,CAACsjG,cAGC6hG,EAAoBplM,EACtB,CAACzS,GAAI,4BAA6B0S,eAAgB,uBAClD,CAAColM,UAAWJ,IAGVK,GAAsBn8B,EAAAA,EAAAA,IAAoB+6B,EAAa31I,GAEvDg3I,EAAeD,EAAsBtlM,EACvC,CAACzS,GAAI+3M,EAAoB/3M,GAAI0S,eAAgBqlM,EAAoBrlM,gBACjE,CAAC6kM,UACD,GAEJ,OACItuM,IAAAA,cAAA,YACK0C,KAAKgsM,cAAcC,GACpB3uM,IAAAA,cAAA,KAAGsP,QAAS5M,KAAKumK,eACZ2lC,GAEJlsM,KAAKgsM,cAAcK,GAGhC,EACHvsM,EA3EY2rM,EAAS,aAZlBG,MAAKxoM,IAAAA,OAILiyD,SAAQjyD,IAAAA,OAAAC,WACRyoM,UAAS1oM,IAAAA,QAAAA,IAAAA,QAAAC,aAmFb,SAAeyJ,EAAAA,EAAAA,YAAW2+L,G,yZC7H1B,MAAM,aACFN,EAAY,eAAED,EAAc,oBAAEG,EAAmB,cAAEpqK,EAAa,mBAAEmqK,EAAkB,UACpFG,EAAS,YAAED,EAAW,iBAAEE,EAAgB,WAAE5mL,GAC1CiC,EAAAA,GAAMokL,WAEJqB,EAAkB,CACpB,CAACnB,IAAe32I,EAAAA,EAAAA,gBAAe,CAC3B+3I,IAAK,CACDl4M,GAAI,6CACJ0S,eAAgB,uCAEpBylM,QAAS,CACLn4M,GAAI,iDACJ0S,eAAgB,+BAEpB0lM,IAAK,CACDp4M,GAAI,6CACJ0S,eAAgB,wDAEpB2lM,cAAe,CACXr4M,GAAI,uDACJ0S,eAAgB,oDAGxB,CAACmkM,IAAiB12I,EAAAA,EAAAA,gBAAe,CAC7B+3I,IAAK,CACDl4M,GAAI,+CACJ0S,eAAgB,oDAEpBylM,QAAS,CACLn4M,GAAI,mDACJ0S,eAAgB,iDAEpB0lM,IAAK,CACDp4M,GAAI,+CACJ0S,eAAgB,qEAEpB2lM,cAAe,CACXr4M,GAAI,yDACJ0S,eAAgB,sEAGxB,CAACskM,IAAsB72I,EAAAA,EAAAA,gBAAe,CAClC+3I,IAAK,CACDl4M,GAAI,mDACJ0S,eAAgB,iDAEpBylM,QAAS,CACLn4M,GAAI,uDACJ0S,eAAgB,0CAEpB0lM,IAAK,CACDp4M,GAAI,mDACJ0S,eAAgB,mEAEpB2lM,cAAe,CACXr4M,GAAI,6DACJ0S,eAAgB,+DAGxB,CAACk6B,IAAgBuzB,EAAAA,EAAAA,gBAAe,CAC5B+3I,IAAK,CACDl4M,GAAI,2CACJ0S,eAAgB,qCAEpBylM,QAAS,CACLn4M,GAAI,+CACJ0S,eAAgB,6BAEpB0lM,IAAK,CACDp4M,GAAI,2CACJ0S,eAAgB,sDAEpB2lM,cAAe,CACXr4M,GAAI,qDACJ0S,eAAgB,kDAGxB,CAACqkM,IAAqB52I,EAAAA,EAAAA,gBAAe,CACjC+3I,IAAK,CACDl4M,GAAI,gDACJ0S,eAAgB,gDAEpBylM,QAAS,CACLn4M,GAAI,oDACJ0S,eAAgB,wCAEpB0lM,IAAK,CACDp4M,GAAI,gDACJ0S,eAAgB,iEAEpB2lM,cAAe,CACXr4M,GAAI,0DACJ0S,eAAgB,6DAGxB,CAACwkM,IAAY/2I,EAAAA,EAAAA,gBAAe,CACxB+3I,IAAK,CACDl4M,GAAI,0CACJ0S,eAAgB,oCAEpBylM,QAAS,CACLn4M,GAAI,8CACJ0S,eAAgB,4BAEpB0lM,IAAK,CACDp4M,GAAI,0CACJ0S,eAAgB,qDAEpB2lM,cAAe,CACXr4M,GAAI,oDACJ0S,eAAgB,iDAGxB,CAACukM,IAAc92I,EAAAA,EAAAA,gBAAe,CAC1B+3I,IAAK,CACDl4M,GAAI,4CACJ0S,eAAgB,iDAEpBylM,QAAS,CACLn4M,GAAI,gDACJ0S,eAAgB,8CAEpB0lM,IAAK,CACDp4M,GAAI,4CACJ0S,eAAgB,kEAEpB2lM,cAAe,CACXr4M,GAAI,sDACJ0S,eAAgB,mEAGxB,CAACykM,IAAmBh3I,EAAAA,EAAAA,gBAAe,CAC/B+3I,IAAK,CACDl4M,GAAI,gDACJ0S,eAAgB,8CAEpBylM,QAAS,CACLn4M,GAAI,oDACJ0S,eAAgB,uCAEpB0lM,IAAK,CACDp4M,GAAI,gDACJ0S,eAAgB,gEAEpB2lM,cAAe,CACXr4M,GAAI,0DACJ0S,eAAgB,4DAGxB,CAAC6d,IAAa4vC,EAAAA,EAAAA,gBAAe,CACzB+3I,IAAK,CACDl4M,GAAI,wCACJ0S,eAAgB,kCAEpBylM,QAAS,CACLn4M,GAAI,4CACJ0S,eAAgB,0BAEpB0lM,IAAK,CACDp4M,GAAI,wCACJ0S,eAAgB,mDAEpB2lM,cAAe,CACXr4M,GAAI,kDACJ0S,eAAgB,gDAoBrB,MAAM4lM,UAA8BrvM,IAAAA,cAA2BsC,WAAAA,GAAA,IAAAwG,EAAA,SAAA7C,WAAA6C,EAAApG,KAAAF,EAAA,yBAiB/C,CAACwpG,EAAsBE,KAClCF,EAAW5iG,OAAS,GACpB1G,KAAKhD,MAAMqD,QAAQ+mD,wBAAwBkiD,GAG3CE,EAAa9iG,OAAS,GACtB1G,KAAKhD,MAAMqD,QAAQglG,8BAA8BmE,EACrD,IACH1pG,EAAA,wBAEiB,KACd,MAAM,WACFwpG,EAAU,aACVE,EAAY,cACZpmF,EAAa,gBACbwpL,EAAe,aACfC,GACA7sM,KAAKhD,OACH,cAAC8J,GAAiB9G,KAAKhD,MAAM6J,KAC7BilM,EAAYe,EAAah9L,QAAO,CAACqrG,EAA8Bx6G,KACjEw6G,EAAIx6G,EAAKrM,IAAMqM,EAAK7C,SACpBq9G,EAAIx6G,EAAK7C,UAAY6C,EAAK7C,SACnBq9G,IACR,CAAC,GAEE4xF,EAAyBhmM,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,QAOjG,OANIuiG,EAAW7/D,SAASrmB,GACpB0oL,EAAU1oL,GAAiB0pL,EACpBtjG,EAAa//D,SAASmjK,KAC7Bd,EAAUc,GAAmBE,GAG1BhB,CAAS,IACnBhsM,EAAA,0BAEmB,WAA+C,IAA9Cw3C,EAA0B/zC,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAC9C,MAAMwpM,EAAerpM,MAAMC,QAAQ2zC,GAAWA,EAAU,CAACA,IACnD,cAACl0B,EAAa,gBAAEwpL,GAAmBxmM,EAAKpJ,MACxCwsG,EAAepjG,EAAK4mM,mBAEpB,cAAClmM,GAAiBV,EAAKpJ,MAAM6J,KAC7BomM,EAAUnmM,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,YAEvE+kM,EAAYiB,EACdtsM,QAAQjM,GACGA,IAAW4uB,GAAiB5uB,IAAWo4M,IAElDjsM,KAAKnM,IACD,MAAMqJ,GAAWoyK,EAAAA,EAAAA,IAAoBzmE,EAAch1G,GACnD,OAAOqJ,EAAW,IAAHI,OAAOJ,GAAaovM,CAAO,IAE9CxsM,QAAQ5C,GACGA,GAAyB,KAAbA,IAS3B,OANIkvM,EAAatjK,SAASrmB,GACtB0oL,EAAUt5I,QAAQg3C,EAAapmF,IACxB2pL,EAAatjK,SAASmjK,IAC7Bd,EAAUt5I,QAAQg3C,EAAaojG,IAG5BlpM,MAAMwyD,KAAK,IAAIt/B,IAAIk1K,GAC9B,GAAC,CAzEDvzJ,iBAAAA,GACIv4C,KAAKktM,iBAAiBltM,KAAKhD,MAAMssG,WAAYtpG,KAAKhD,MAAMwsG,aAC5D,CAEA/wD,kBAAAA,CAAmBC,GACf,MAAM,WAAC4wD,EAAU,aAAEE,GAAgBxpG,KAAKhD,MACpCssG,IAAe5wD,EAAU4wD,YAAcE,IAAiB9wD,EAAU8wD,cAClExpG,KAAKktM,iBAAiB5jG,EAAYE,EAE1C,CAkEA2jG,sBAAAA,CAAuB93I,EAAkB/d,EAAmB81J,GACxD,MAAM,cAACtmM,GAAiB9G,KAAKhD,MAAM6J,MAC7B,cAACuc,EAAa,gBAAEwpL,GAAmB5sM,KAAKhD,MACxC8uM,EAAY9rM,KAAKqtM,kBAAkB/1J,GACzC,IAAIs0J,EAAQwB,EAAUptM,KAAKqtM,kBAAkB,CAACD,IAAU,GAAK,IACzDxB,GAAUwB,IAAYhqL,GAAiBgqL,IAAYR,IACnDhB,EAAQA,EAAMrrM,eAGlB,MAAM8pG,EAAYyhG,EAAU,GACtBwB,EAAaxB,EAAU,GACvBK,EAAYL,EAAUplM,OAAS,EAE/BrL,EAAU,CACZw/J,YAAY,EACZb,YAAa,CAAC,CAACh/J,IAAKqvG,GAAY,CAACrvG,IAAKsyM,GAAa,CAACtyM,IAAK4wM,IACzDnmM,kBAAkB,EAClBD,YAAY,GAGV+nM,GAA0Bt9B,EAAAA,EAAAA,IAAoBq8B,EAAiBj3I,GACrE,IAAKk4I,EACD,OAAOjwM,IAAAA,cAAAA,IAAAA,SAAA,MAGX,GAAI6uM,EAAY,EACZ,OACI7uM,IAAAA,cAACmuM,EAAS,CACNG,MAAOA,EACPC,eAAgB0B,EAAwBb,cACxCf,cAAetwM,EACfg6D,SAAUA,EACVy2I,UAAWA,IAKvB,IAAI0B,EAAkC,CAAC,EACrB,IAAdrB,GACAqB,EAAeD,EAAwBhB,IAGlCj1J,EAAQ,KAAOt3C,KAAKhD,MAAMomB,eAAiBk0B,EAAQ,KAAOt3C,KAAKhD,MAAM4vM,kBACtEW,EAAwBf,UAExBgB,EAAeD,EAAwBf,UAEtB,IAAdL,IACPqB,EAAeD,EAAwBd,KAG3C,MAAMp1D,EAAmBvwI,EAAc0mM,EAAc,CAACnjG,YAAWijG,aAAY1B,UAE7E,OACItuM,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAAS26I,EACTh8I,QAASA,GAGrB,CAEA2wM,aAAAA,CAAc//L,EAAeopD,EAAkB/d,EAAmB81J,GAC9D,OACI9vM,IAAAA,cAACA,IAAAA,SAAc,CAACtC,IAAKiR,GAChBjM,KAAKmtM,uBAAuB93I,EAAU/d,EAAS81J,GAChD9vM,IAAAA,cAAA,WAGZ,CAEA2F,MAAAA,GACI,MAAM,cACFmgB,EAAa,YACbqqL,GACAztM,KAAKhD,MAEH08F,EAAU,GAChB,IAAK,IAAIh6D,EAAI,EAAGA,EAAI+tK,EAAY/mM,OAAQg5B,IAAK,CACzC,MAAMhjC,EAAU+wM,EAAY/tK,IACtB,SACF21B,EAAQ,QACR+3I,GACA1wM,EACJ,IAAI46C,EAAU56C,EAAQ46C,QAEtB,IAAKt3C,KAAKhD,MAAM0wM,eAAiBN,IAAYhqL,EAAe,CAGxD,IAF+D,IAApCk0B,EAAQ9qB,QAAQpJ,GAOvC,SAHAk0B,EAAU,CAACl0B,EAKnB,CAEAs2E,EAAQpqF,KAAKtP,KAAKgsM,cAActsK,EAAG21B,EAAU/d,EAAS81J,GAC1D,CAEA,OACI9vM,IAAAA,cAAAA,IAAAA,SAAA,KACKo8F,EAGb,EACH55F,EA3LY6sM,EAAqB,aAd9BrjG,WAAUlmG,IAAAA,QAAAA,IAAAA,QACVomG,aAAYpmG,IAAAA,QAAAA,IAAAA,QACZggB,cAAahgB,IAAAA,OAAAC,WACbupM,gBAAexpM,IAAAA,OAAAC,WAEfoqM,YAAWrqM,IAAAA,MAAAC,WACXqqM,cAAatqM,IAAAA,KAAAC,WACbwpM,aAAYzpM,IAAAA,MAAAC,WACZhD,QAAO+C,IAAAA,MAAA,CACHgkD,wBAAuBhkD,IAAAA,KAAAC,WACvBgiG,8BAA6BjiG,IAAAA,KAAAC,aAAAA,aAAAvD,EAIxB6sM,EAAqB,eACR,CAClBrjG,WAAY,GACZE,aAAc,KA0LtB,SAAe18F,EAAAA,EAAAA,YAAW6/L,GC1V1B,GAAevnM,EAAAA,EAAAA,UAzBf,WACI,MAAMgkG,GAA+BC,EAAAA,EAAAA,MAErC,MAAO,CAACzzG,EAAoB2hC,KACxB,MAAMgH,GAAcle,EAAAA,EAAAA,IAAezqB,IAC7B,WAAC0zG,EAAU,aAAEE,GAAgBjyE,EAEnC,MAAO,CACHnU,cAAemb,EAAYlqC,GAC3Bu4M,gBAAiBruK,EAAY1gC,SAC7B6vM,eAAeC,EAAAA,EAAAA,IAA4B/3M,GAC3Ci3M,aAAczjG,EAA6BxzG,EAAO,CAAC0zG,aAAYE,iBAClE,CAET,IAEA,SAA4B71G,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB8hD,wBAAuB,KACvBi+C,8BAA6BA,EAAAA,IAC9B1xG,GAEX,GAEA,CAAgEg5M,GC4BhE,EArDA,SAA6B3vM,GACzB,MAAM4wM,EAAoB5wM,EAAM2T,KAAK3T,MAAM4wM,kBACrCC,GAA+BC,EAAAA,EAAAA,eAAc9wM,EAAM2T,KAAK3T,MAAM6wM,8BAAgC7wM,EAAM2T,KAAK3T,MAAM6wM,6BAA+B,GAE9Il6M,GAAWsxD,EAAAA,EAAAA,eACXp+C,GAAOiQ,EAAAA,EAAAA,YAEb4rC,EAAAA,EAAAA,YAAU,KACN/uD,GAASyzD,EAAAA,EAAAA,IAAwBymJ,GAA8B,GAChE,CAAC7wM,EAAM2T,OAEV,MAAMy4F,GAA+BjgD,EAAAA,EAAAA,SAAOkgD,EAAAA,EAAAA,OACtCwjG,GAAex4J,EAAAA,EAAAA,cAChBz+C,GAAuBwzG,EAA6Br5F,QACjDna,EACA,CAAC0zG,WAAYukG,EAA8BrkG,aAAc,OAI3DukG,GAAsB92L,EAAAA,EAAAA,UAAQ,KAChC,MAAM+2L,EAAkBnB,EAAapkM,MAAM/H,GAASA,EAAKrM,KAAOu5M,IAEhE,OAAKI,EAQEC,GAAeD,EAAgBnwM,UAN9BP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iDACH0S,eAAe,WAIoB,GAChD,CAAC6mM,EAAmBf,IAEjBqB,EAAqBrB,EAAalsM,KAAKD,GAASutM,GAAevtM,EAAK7C,YAE1E,OAAK+vM,GAAsBC,GAAwE,IAAxCA,EAA6BnnM,OAOpFpJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yDACH0S,eAAe,4EACfjB,OAAQ,CACJqoM,YAAaJ,EACbK,UAAWvnM,EAAKwnM,WAAWH,MAV/B5wM,IAAAA,cAAA,YAAON,EAAM2T,KAAKjU,QAc9B,E,qdCpCe,MAAM4xM,WAA6BhxM,IAAAA,cAC9CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,+BAOQ,KACrB,MAAM,YAACy+B,EAAW,KAAE5tB,EAAI,QAAE2mC,EAAO,UAAEw0J,GAAa9rM,KAAKhD,MAErD,GAAI2T,GAAQA,EAAKG,WAAY,CACzB,IAAI06D,EAAW76D,EAAKuL,UACpBo7B,EAAQtxC,SAAQ,CAACxR,EAAQyX,KACrBu/D,IACAxrE,KAAKhD,MAAMqD,QAAQkuM,iBAAiB59L,EAAKG,WAAYtc,EAAQmc,EAAKI,UAClEsL,EAAAA,EAAAA,IAA8BkiB,EAAautK,EAAU7/L,GAAQzX,EAAQmc,EAAKG,WAAYH,EAAKI,QAASy6D,EAAS,IAGjHxrE,KAAKhD,MAAMqD,QAAQg4K,WAAW1nK,EAClC,KACH7Q,GAAA,eAEQ,KACLE,KAAKgH,SAAS,CAACghK,UAAU,GAAM,IArB/BhoK,KAAKpK,MAAQ,CACToyK,UAAU,EAElB,CAqBAwmC,kBAAAA,GAA+C,IAA5B1C,EAASvoM,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACC,IAAAkrM,EAA5B,GAAyB,IAArB3C,EAAUplM,OACV,OACIpJ,IAAAA,cAACgnG,EAAAA,EAAS,CACNE,YAAasnG,EAAU,GACvBp8L,UAA0B,QAAjB++L,EAAEzuM,KAAKhD,MAAM2T,YAAI,IAAA89L,OAAA,EAAfA,EAAiB39L,aAGjC,GAAIg7L,EAAUplM,OAAS,EAAG,KAAAgoM,EAAAC,EAC7B,SAASC,EAAa5zM,GAClB,OACIsC,IAAAA,cAACgK,EAAAA,iBAAgB,CACbtM,IAAKA,EACL3G,GAAI,uDACJ0S,eAAgB,SAG5B,CAEA,SAAS8nM,EAAe7zM,GACpB,OAAOsC,IAAAA,cAAA,QAAMtC,IAAKA,GAAM,KAC5B,CAEA,GAAIgF,KAAKpK,MAAMoyK,UAAY8jC,EAAUplM,QAAU,EAC3C,OACIpJ,IAAAA,cAAA,YAEQwuM,EAAUnrM,KAAK9C,IAAa,IAAAixM,EACxB,OACIxxM,IAAAA,cAACgnG,EAAAA,EAAS,CACNtpG,IAAK6C,EACL2mG,YAAa3mG,EACb6R,UAA0B,QAAjBo/L,EAAE9uM,KAAKhD,MAAM2T,YAAI,IAAAm+L,OAAA,EAAfA,EAAiBh+L,YAC9B,IAEPjB,QAAO,CAACqrG,EAAKo4C,EAAIy7C,EAAKC,IACT,IAARD,EACO,CAACz7C,GACDy7C,IAAQC,EAAItoM,OAAS,EACrB,IAAIw0G,EAAK0zF,EAAaG,GAAMz7C,GAGhC,IAAIp4C,EAAK2zF,EAAeE,GAAMz7C,IACtC,KAKnB,MAAMm1B,EAAa,IAAIqjB,GACjBmD,EAAgBxmB,EAAW5qG,QAC3BqxH,EAAezmB,EAAWzhI,MAChC,OACI1pD,IAAAA,cAAA,YACIA,IAAAA,cAACgnG,EAAAA,EAAS,CACNtpG,IAAKi0M,EACLzqG,YAAayqG,EACbv/L,UAA0B,QAAjBg/L,EAAE1uM,KAAKhD,MAAM2T,YAAI,IAAA+9L,OAAA,EAAfA,EAAiB59L,aAE/B+9L,EAAe,GAChBvxM,IAAAA,cAAA,KACIC,UAAU,0BACVqP,QAAS5M,KAAK0rM,QAEdpuM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,qDACJ0S,eAAgB,qBAChBjB,OAAQ,CACJqmM,UAAW1jB,EAAW/hL,WAIjCkoM,EAAa,GACdtxM,IAAAA,cAACgnG,EAAAA,EAAS,CACNtpG,IAAKk0M,EACL1qG,YAAa0qG,EACbx/L,UAA0B,QAAjBi/L,EAAE3uM,KAAKhD,MAAM2T,YAAI,IAAAg+L,OAAA,EAAfA,EAAiB79L,aAI5C,CAEA,MAAO,EACX,CAEA7N,MAAAA,GACI,MAAM,YAAC+8D,EAAW,OAAE/4C,EAAM,UAAE6kL,EAAS,kBAAEqD,GAAqBnvM,KAAKhD,MACjE,IAAKiqB,IAAW+4C,EACZ,OAAO,KAGX,IAAIkV,EAiBAk6H,EAhBApvI,IAAgBj9C,EAAAA,GAAU0B,gBAC1BywD,EACI53E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2DACH0S,eAAe,qCAGhBi5D,IAAgBj9C,EAAAA,GAAUyB,eACjC0wD,EACI53E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0DACH0S,eAAe,6BAM3B,MAAMsoM,EAAyBrvM,KAAKwuM,mBAAmB1C,GAiBvD,IAAIwD,EAhBqB,IAArBxD,EAAUplM,OACV0oM,EACI9xM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0DACH0S,eAAe,iGAGhB+kM,EAAUplM,OAAS,IAC1B0oM,EACI9xM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+DACH0S,eAAe,kGAM3B,MAAMwoM,EAAwBvvM,KAAKwuM,mBAAmBW,GAClDA,EAAkBzoM,SAClB4oM,EACIhyM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6DACH0S,eAAe,6OAK3B,IAAIyoM,EAAsB,KACtBC,EAAqB,KAgCzB,OA9BI3D,EAAUplM,SACV8oM,EACIlyM,IAAAA,cAAA,SACK+xM,EACA,IACAD,EACD9xM,IAAAA,cAAA,KACIC,UAAU,gCACVqP,QAAS5M,KAAK0vM,wBAEbx6H,GAEL53E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,2DACJ0S,eAAgB,sDAM5BooM,EAAkBzoM,SAClB+oM,EACInyM,IAAAA,cAAA,SACKiyM,EACA,IACAD,IAMThyM,IAAAA,cAAAA,IAAAA,SAAA,KACKkyM,EACAC,EAGb,EACH3vM,GA5MoBwuM,GAAoB,aAbrCtuI,YAAW58D,IAAAA,OAAAC,WACX4jB,OAAM7jB,IAAAA,OAAAC,WAENi0C,QAAOl0C,IAAAA,QAAAA,IAAAA,QAAAC,WACPyoM,UAAS1oM,IAAAA,QAAAA,IAAAA,QAAAC,WACT8rM,kBAAiB/rM,IAAAA,QAAAA,IAAAA,QAAAC,WACjBhD,QAAO+C,IAAAA,MAAA,CAZPmrM,iBAAgBnrM,IAAAA,KAAAC,WAChBg1K,WAAUj1K,IAAAA,KAAAC,aAAAA,aC8Bd,UAAe+B,EAAAA,EAAAA,UA1Bf,SAAyBxP,EAAoB2hC,GACzC,MAAM5mB,GAAO8X,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAAStQ,SAAW,CAAC,EACjD,IAAI+4C,EAAc,GAClB,GAAIrvD,GAAQA,EAAKG,WAAY,CACzB,MAAM5P,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO+a,EAAKG,YACnC5P,GAAWA,EAAQ1I,OACnBwnE,EAAc9+D,EAAQ1I,KAE9B,CAEA,MAAO,CACHwnE,cACAzhC,aAAale,EAAAA,EAAAA,IAAezqB,GAC5B+a,OAER,IAEA,SAA4Bhd,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBipM,iBAAgB,KAChBl2B,WAAUA,EAAAA,IACX1kL,GAEX,GAEA,CAA4D26M,I,gBCvBrD,SAASL,GAAentM,GAC3B,MAAM6uM,GAAgBtN,EAAAA,EAAAA,IAAavhM,GAOnC,OAAO8uM,GANgC,MAArBD,EAAc,GAAcA,EAAgB,IAAH1xM,OAAO0xM,GAElD,CACZ92B,UAAU,GAIlB,CAEA,SAAS+2B,GAAoB9uM,EAAgBzF,EAA0CsV,GACnF,MAAMg/L,GAAgBtN,EAAAA,EAAAA,IAAavhM,GACnC,OACIxD,IAAAA,cAAC6G,EAAAA,EAAQ,CACLzH,QAASizM,EACTt0M,QAASA,EACT4rB,OAAQtW,GAAQA,EAAKtc,GACrBghE,SAAU1kD,GAAQA,EAAKnY,MAGnC,CAEA,SAASq3M,GAAyBl/L,GAC9B,MAAM9S,EAAWowM,GAAet9L,EAAK3T,MAAMa,UAE3C,OACIP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2CACH0S,eAAe,iCACfjB,OAAQ,CAACjI,aAGrB,CA6BA,SAASiyM,GAA0Bn/L,GAC/B,MAAM9S,EAAWowM,GAAet9L,EAAK3T,MAAMa,UACrCye,EAAgB2xL,GAAet9L,EAAK3T,MAAMsf,eAEhD,OACIhf,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,sDACfjB,OAAQ,CACJjI,WACAye,kBAIhB,CAmRA,MAAMyzL,GAAyB,CAC3B,CAAClpL,EAAAA,GAAMokL,WAAWE,cAAe0E,GACjC,CAAChpL,EAAAA,GAAMokL,WAAWhqK,eA/StB,SAAmCtwB,GAC/B,MAAM9S,EAAWowM,GAAet9L,EAAK3T,MAAMa,UAE3C,OACIP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,mCACfjB,OAAQ,CAACjI,aAGrB,EAsSI,CAACgpB,EAAAA,GAAMokL,WAAWC,gBAAiB4E,GACnC,CAACjpL,EAAAA,GAAMokL,WAAWxuL,0BAA2BqzL,GAC7C,CAACjpL,EAAAA,GAAMokL,WAAWI,qBAnQtB,SAAwC16L,GACpC,MAAMq/L,EAAkB/B,GAAet9L,EAAK3T,MAAMgzM,iBAElD,OACI1yM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,iDACfjB,OAAQ,CACJkqM,oBAIhB,EAwPI,CAACnpL,EAAAA,GAAMokL,WAAWM,WAtPtB,SAA+B56L,GAC3B,MAAM9S,EAAWowM,GAAet9L,EAAK3T,MAAMa,UAE3C,OACIP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,8BACfjB,OAAQ,CAACjI,aAGrB,EA6OI,CAACgpB,EAAAA,GAAMokL,WAAWrmL,YA3OtB,SAAgCjU,GAC5B,MAAM9S,EAAWowM,GAAet9L,EAAK3T,MAAMa,UAE3C,OACIP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,4BACfjB,OAAQ,CAACjI,aAGrB,EAkOI,CAACgpB,EAAAA,GAAMokL,WAAWK,aAhOtB,SAAgC36L,GAC5B,MAAM9S,EAAWowM,GAAet9L,EAAK3T,MAAMa,UACrCye,EAAgB2xL,GAAet9L,EAAK3T,MAAMsf,eAEhD,OACIhf,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,mDACfjB,OAAQ,CACJjI,WACAye,kBAIhB,EAmNI,CAACuK,EAAAA,GAAMokL,WAAWO,kBAjNtB,SAAqC76L,GACjC,MAAMq/L,EAAkB/B,GAAet9L,EAAK3T,MAAMa,UAElD,OACIP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,+CACfjB,OAAQ,CACJkqM,oBAIhB,EAsMI,CAACnpL,EAAAA,GAAMokL,WAAWgF,eApMtB,SAAmCt/L,GAAuB,IAAAg1K,EACtD,IAAKh1K,EAAK3T,MAAMa,SACZ,OAAO,KAGX,MAAMqyM,EAAgB,CAClB12C,iBAAiB22C,EAAAA,EAAAA,IAA4B,QAAXxqB,EAACh1K,EAAK3T,aAAK,IAAA2oL,OAAA,EAAVA,EAAYyqB,kBAAoBz/L,EAAK3T,MAAMozM,sBAAmB93M,EACjGmN,kBAAkB,GAGhB5H,EAAWowM,GAAet9L,EAAK3T,MAAMa,UACrCwyM,EAAY1/L,EAAK3T,MAAMszM,WAAaV,GAAoBj/L,EAAK3T,MAAMszM,WAAYJ,EAAev/L,GAAQ,KACtG4/L,EAAY5/L,EAAK3T,MAAMwzM,WAAaZ,GAAoBj/L,EAAK3T,MAAMwzM,WAAYN,EAAev/L,GAAQ,KAE5G,OAAIA,EAAK3T,MAAMwzM,WACP7/L,EAAK3T,MAAMszM,WAEPhzM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yEACH0S,eAAe,kHACfjB,OAAQ,CACJjI,WACA4yM,IAAKJ,EACLK,IAAKH,EACL7qJ,OAASvF,GAA6B7iD,IAAAA,cAAA,cAAS6iD,GAC/CwwJ,GAAK15K,GAAwB35B,IAAAA,cAAAA,IAAAA,SAAA,KAAEA,IAAAA,cAAA,WAAM25B,MAOjD35B,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uEACH0S,eAAe,kDACfjB,OAAQ,CACJjI,WACA6yM,IAAKH,KAIV5/L,EAAK3T,MAAMszM,WAEdhzM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oEACH0S,eAAe,qDACfjB,OAAQ,CACJjI,WACA4yM,IAAKJ,KAMd,IACX,EA8II,CAACxpL,EAAAA,GAAMokL,WAAW2F,oBA5ItB,SAAwCjgM,GACpC,KAAMA,EAAK3T,MAAMa,UAAY8S,EAAK3T,MAAM6zM,iBAAmBlgM,EAAK3T,MAAM8zM,iBAClE,OAAO,KAGX,MAAMjzM,EAAWowM,GAAet9L,EAAK3T,MAAMa,UACrCkzM,EAAiBpgM,EAAK3T,MAAM6zM,gBAC5BG,EAAiBrgM,EAAK3T,MAAM8zM,gBAElC,OACIxzM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8EACH0S,eAAe,oEACfjB,OAAQ,CACJjI,WACA4yM,IAAKM,EACLL,IAAKM,IAIrB,EAyHI,CAACnqL,EAAAA,GAAMokL,WAAWgG,iBAvHtB,SAA8CtgM,GAC1C,IAAMA,EAAK3T,MAAMa,SACb,OAAO,KAGX,MAAMA,EAAWowM,GAAet9L,EAAK3T,MAAMa,UAE3C,OACIP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2DACH0S,eAAe,0DACfjB,OAAQ,CACJjI,aAIhB,EAwGI,CAACgpB,EAAAA,GAAMokL,WAAWiG,gBAtGtB,SAAoCvgM,GAChC,IAAKA,EAAK3T,MAAMa,SACZ,OAAO,KAGX,MAAMA,EAAWowM,GAAet9L,EAAK3T,MAAMa,UACrCszM,EAAaxgM,EAAK3T,MAAMo0M,YACxBC,EAAa1gM,EAAK3T,MAAMs0M,YAE9B,OAAI3gM,EAAK3T,MAAMs0M,YACP3gM,EAAK3T,MAAMo0M,YAEP9zM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+DACH0S,eAAe,+DACfjB,OAAQ,CACJjI,WACA4yM,IAAKU,EACLT,IAAKW,KAOjB/zM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6DACH0S,eAAe,mDACfjB,OAAQ,CACJjI,WACA6yM,IAAKW,KAIV1gM,EAAK3T,MAAMo0M,YAEd9zM,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0DACH0S,eAAe,sDACfjB,OAAQ,CACJjI,WACA4yM,IAAKU,KAMd,IACX,EAuDI,CAACtqL,EAAAA,GAAMokL,WAAW1nK,iBArDtB,SAAqC5yB,GACjC,IAAKA,EAAK3T,MAAMa,SACZ,OAAO,KAGX,MAAMA,EAAWowM,GAAet9L,EAAK3T,MAAMa,UAE3C,OACIP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,uCACfjB,OAAQ,CAACjI,aAGrB,EAwCI,CAACgpB,EAAAA,GAAMokL,WAAWpnK,oBAtCtB,SAAwClzB,GACpC,IAAKA,EAAK3T,MAAMa,SACZ,OAAO,KAGX,MAAMA,EAAWowM,GAAet9L,EAAK3T,MAAMa,UAE3C,OACIP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,yCACfjB,OAAQ,CAACjI,aAGrB,EAyBI,CAACgpB,EAAAA,GAAMokL,WAAWsG,IAvBtB,SAAyB5gM,GAIrB,OAAOi/L,GAFSj/L,EAAKjU,QAAQ6nC,QAAQ,WAAY,IAGrD,G,+9BA4JAiwB,EAAAA,EAAAA,gBAAe,CACXg9I,wBAAyB,CACrBn9M,GAAI,yDACJ0S,eAAgB,yEAEpB0qM,kBAAmB,CACfp9M,GAAI,mDACJ0S,eAAgB,sCAEpB2qM,mBAAoB,CAChBr9M,GAAI,iEACJ0S,eAAgB,2FAEpB4qM,aAAc,CACVt9M,GAAI,2DACJ0S,eAAgB,wDAEpB6qM,mBAAoB,CAChBv9M,GAAI,4CACJ0S,eAAgB,gDCtfT,MAAM8qM,WAAqBv0M,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,mBAOpD0oI,EAAAA,EAAAA,IACT,CAACntI,EAAiCspG,EAAiCl/F,EAA4B60J,IAC3FlmK,GAAAA,GAAA,GACOiH,GAAO,IACVspG,wBACAl/F,mBACA60J,eAEN,CAENr3J,MAAAA,GAAS,IAAAwrM,EAAA1sB,EAAA+sB,EAAAgD,EAAAC,EAAAC,EAAAtD,EAAAuD,EAAAtD,EAAAuD,EAAAC,EAAAC,EAAAC,EACL,IAAI31M,EAAUsD,KAAKhD,MAAMN,QAEzB,GAAIsD,KAAKhD,MAAM2T,KAAM,KAAAioC,EAAAuwG,EACjB,MAAMmpD,EAAwBtyM,KAAKhD,MAAMkE,QDsW9C,SAA6ByP,EAAYgpC,EAAyBz4C,EAAkBqxM,EAAwBC,EAAkC1b,EAA0Bl0I,GAA8B,IAAA6vJ,EAAAC,EACzM,MAAMhT,GAAcC,EAAAA,EAAAA,IAAgBhvL,GACpC,GAAI+uL,IAAyB,QAAV+S,EAAA9hM,EAAK3T,aAAK,IAAAy1M,OAAA,EAAVA,EAAYj6M,QAASquB,EAAAA,GAAMokL,WAAW0H,SACrD,OA+CR,SAAkChiM,EAAYgpC,EAAyBm9I,EAAyBl0I,GAC5F,MAAM/kD,EAAWowM,GAAet9L,EAAK3T,MAAMa,UACrC6kB,EAAU,GAAHzkB,QAAM8Q,EAAAA,GAAAA,MAAY,KAAA9Q,OAAI0S,EAAK3T,MAAM43L,WAAaj7I,GACrDu7B,EAAO,GAAHj3E,OAAMykB,EAAO,QAAAzkB,OAAO0S,EAAK3T,MAAMsU,SACnCgiB,EAAYs8K,GAAoB,IAAD3xM,OAAKi3E,EAAI,MAAAj3E,OAAKi3E,EAAI,MACjD09H,GAAaC,EAAAA,EAAAA,IAAaliM,EAAK3T,MAAM81M,aACrCC,EAAY,IAAI73L,KAAkB,IAAb03L,GAErBI,EACF11M,IAAAA,cAACq5L,EAAAA,cAAa,CACV71L,MAAOiyM,EACPlc,QAASC,EACT1oI,SAAUxL,IAEZqwJ,EACF31M,IAAAA,cAACo5L,EAAAA,cAAa,CACV51L,MAAOiyM,EACPxlJ,IAAI,UACJD,MAAM,QACN2hE,KAAK,UACL7gE,SAAUxL,IAElB,OACItlD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,gCACJ0S,eAAe,yGACfjB,OAAQ,CACJktM,eACAC,eACAp1M,WACAy1B,cAIhB,CAjFe4/K,CAAyBviM,EAAMgpC,EAAiB9vC,QAAQitL,GAAiBl0I,GAEpF,GA5BiB,iBADYjM,EA6BE,QAAX+7J,EAAC/hM,EAAK3T,aAAK,IAAA01M,OAAA,EAAVA,EAAYS,qBA5BHx8J,GAIxB,YAAaA,GAA2B,iBAAdA,EAAErlC,SAI5B,4BAA6BqlC,IAAOm3J,EAAAA,EAAAA,eAAcn3J,EAAEy8J,0BAIpD,4BAA6Bz8J,IAAOm3J,EAAAA,EAAAA,eAAcn3J,EAAE08J,0BAIpD,6BAA8B18J,IAAOm3J,EAAAA,EAAAA,eAAcn3J,EAAE28J,0BAYL,CAClD,GAAIpyM,IAAYA,EAAQ1I,OAAS0rC,EAAAA,GAAQzf,iBAAmBvjB,EAAQ1I,OAAS0rC,EAAAA,GAAQ1f,eACjFguL,GACA9S,EACF,CACE,MAAM6T,EAAiB5iM,EAAK3T,MAAMm2M,mBAClC,OACI71M,IAAAA,cAACgxM,GAAoB,CACjBrnL,OAAQssL,EAAejiM,QACvBgmC,QAASi8J,EAAeH,wBACxBjE,kBAAmBoE,EAAeF,wBAClCvH,UAAWyH,EAAeD,0BAGtC,CAEA,OAAO,IACX,CAAO,GAAIvD,GAAuBp/L,EAAKnY,MACnC,OAAOu3M,GAAuBp/L,EAAKnY,MAAMmY,GACtC,GAAIA,EAAKnY,OAASquB,EAAAA,GAAMokL,WAAWuI,mBACtC,OAvYR,SAAuC7iM,EAAY4hM,GAC/C,GAAIA,EACA,OAAO1C,GAAyBl/L,GAEpC,MAAM9S,EAAWowM,GAAet9L,EAAK3T,MAAMa,UAE3C,OACIP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iDACH0S,eAAe,4CACfjB,OAAQ,CAACjI,aAGrB,CA0Xe41M,CAA8B9iM,EAAM4hM,GACxC,GAAI5hM,EAAKnY,OAASquB,EAAAA,GAAMokL,WAAWyI,qBACtC,OA9VR,SAAwC/iM,EAAY4hM,GAChD,GAAIA,EACA,OAAOzC,GAA0Bn/L,GAErC,MAAM9S,EAAWowM,GAAet9L,EAAK3T,MAAMa,UACrCye,EAAgB2xL,GAAet9L,EAAK3T,MAAMsf,eAEhD,OACIhf,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,iEACfjB,OAAQ,CACJjI,WACAye,kBAIhB,CA6Ueq3L,CAA+BhjM,EAAM4hM,GACzC,GAAI5hM,EAAKnY,OAASquB,EAAAA,GAAMokL,WAAW2I,yBAA0BC,EAAAA,EAAAA,IAAmBljM,EAAK3T,MAAM82M,eAAgB,CAC9G,MAAM,WAACxqG,EAAU,aAAEE,EAAY,YAAEikG,GAAe98L,EAAK3T,MAAM82M,cAE3D,OACIx2M,IAAAA,cAACqvM,EAAqB,CAClBrjG,WAAYA,EACZE,aAAcA,EACdikG,YAAaA,GAGzB,CAAO,OAAI98L,EAAKnY,OAASquB,EAAAA,GAAMokL,WAAW3mK,wBAKlChnC,IAAAA,cAACy2M,EAAmB,CAACpjM,KAAMA,IAI5B,KAvEJ,IAA0BgmC,CAwEjC,CCtZ+Dq9J,CAAoBh0M,KAAKhD,MAAM2T,KAClD,QADsDioC,EAC5D,QAD4DuwG,EAClFnpJ,KAAKhD,MAAMwmB,mBAAW,IAAA2lI,OAAA,EAAtBA,EAAwB1rJ,YAAI,IAAAm7C,EAAAA,EAAI,GAChC54C,KAAKhD,MAAMkE,QACXlB,KAAKhD,MAAMu1M,cACXvyM,KAAKhD,MAAMw1M,uBACXxyM,KAAKhD,MAAM85L,eACX92L,KAAKhD,MAAM4lD,UAAY,KAC3B,GAAI0vJ,EACA,OAAOh1M,IAAAA,cAAA,WAAMg1M,EAErB,CAEA,GAAItyM,KAAKhD,MAAM2T,MAAQ3Q,KAAKhD,MAAM2T,KAAKnY,OAASquB,EAAAA,GAAMokL,WAAW0H,SAAU,CACvE,IAAK3yM,KAAKhD,MAAMwmB,YACZ,OAAO,KAEX,MAAMywL,ED4aX,SAAwCtjM,EAAY6S,GACvD,MAAM3lB,EAAW8S,EAAK3T,MAAMa,SAAWowM,GAAet9L,EAAK3T,MAAMa,UAAY,GACvE6kB,EAAU,GAAHzkB,QAAM8Q,EAAAA,GAAAA,MAAY,KAAA9Q,OAAI0S,EAAK3T,MAAM43L,WAAapxK,EAAY/lB,MACjEy3E,EAAO,GAAHj3E,OAAMykB,EAAO,QAAAzkB,OAAO0S,EAAK3T,MAAMsU,SACnCgiB,EAAYs8K,GAAoB,IAAD3xM,OAAKi3E,EAAI,MAAAj3E,OAAKi3E,EAAI,MACvD,OACI53E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,0BACJ0S,eAAe,iFACfjB,OAAQ,CACJjI,WACAy1B,cAIhB,CC3b6C4gL,CAA+Bl0M,KAAKhD,MAAM2T,KAAM3Q,KAAKhD,MAAMwmB,aAC5F,OAAOlmB,IAAAA,cAAA,WAAM22M,EACjB,CAEA,GAAIj0M,KAAKhD,MAAM2T,MAAQ3Q,KAAKhD,MAAM2T,KAAKnY,OAASquB,EAAAA,GAAMokL,WAAWkJ,SAAU,CACvE,MAAMC,EDgdX,SAAqCzjM,GAAuB,IAAA0jM,EAAAC,EAC/D,IAAIxuM,EAAkE,CAAC,EACvE,MAAMzR,GAAKguM,EAAAA,EAAAA,IAAuB,QAAXgS,EAAC1jM,EAAK3T,aAAK,IAAAq3M,OAAA,EAAVA,EAAYE,eAC9BC,GAAuBnS,EAAAA,EAAAA,IAAuB,QAAXiS,EAAC3jM,EAAK3T,aAAK,IAAAs3M,OAAA,EAAVA,EAAYG,sBAUtD,OATID,IACA1uM,EAAS,CACLovE,KAAMs/H,IAEU3B,EAAAA,EAAAA,IAAaliM,EAAK3T,MAAM03M,aAC1B,IACd5uM,EAAO+jG,OAASl5F,EAAK3T,MAAM03M,cAI/Bp3M,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAIA,EACJ0S,eAAgB4J,EAAKjU,QACrBoJ,OAAQA,GAGpB,CCpe4C6uM,CAA4B30M,KAAKhD,MAAM2T,MACvE,OAAOrT,IAAAA,cAAA,WAAM82M,EACjB,CAGA,MAAMh6C,GAAep6J,KAAKhD,MAAM2T,OAAS3Q,KAAKhD,MAAM2T,KAAK4hE,gBAAkBvyE,KAAKhD,MAAM2T,KAAKjU,UAAYsD,KAAKhD,MAAM2T,KAAK4hE,eACjHinF,GAAkB22C,EAAAA,EAAAA,IAAiC,QAAhB1B,EAACzuM,KAAKhD,MAAM2T,YAAI,IAAA89L,GAAO,QAAP1sB,EAAf0sB,EAAiBzxM,aAAK,IAAA+kL,OAAP,EAAfA,EAAwBquB,kBAAmC,QAAlBtB,EAAG9uM,KAAKhD,MAAM2T,YAAI,IAAAm+L,GAAO,QAAPgD,EAAfhD,EAAiB9xM,aAAK,IAAA80M,OAAP,EAAfA,EAAwB1B,sBAAmB93M,EAE3G,QAAtBy5M,EAAA/xM,KAAKhD,MAAM43M,mBAAW,IAAA7C,GAAtBA,EAAwB/rM,SAAS2G,IACzBA,GAAKA,EAAE+pD,MAAQ12D,KAAKhD,MAAM2T,OAC1BjU,EAAUiQ,EAAE+pD,KAAK12D,KAAKhD,MAAM2T,KAAMjU,GACtC,IAGJ,IAAI+I,EAAqC,QAArBusM,EAAGhyM,KAAKhD,MAAM3B,eAAO,IAAA22M,OAAA,EAAlBA,EAAoBvsM,iBACvCzF,KAAKhD,MAAM2T,MAAQ3Q,KAAKhD,MAAM2T,KAAK3T,QACnCyI,GAAoBzF,KAAKhD,MAAM2T,KAAK3T,MAAMutB,0BAG9C,MAAMlvB,EAAU2E,KAAKwU,WACjBxU,KAAKhD,MAAM3B,SACyC,KAArC,QAAfqzM,EAAA1uM,KAAKhD,MAAM2T,YAAI,IAAA+9L,GAAO,QAAPuD,EAAfvD,EAAiB1xM,aAAK,IAAAi1M,OAAP,EAAfA,EAAwB9mL,yBACxB1lB,EACe,QADCkpM,EAChB3uM,KAAKhD,MAAM2T,YAAI,IAAAg+L,OAAA,EAAfA,EAAiBkG,SAGrB,IAAIt6C,EAKJ,OAJKv6J,KAAKhD,MAAM83M,qCAAuC90M,KAAKhD,MAAM08G,oBAC9D6gD,EAAgBv6J,KAAKhD,MAAMu9J,eAI3Bj9J,IAAAA,cAAC6G,EAAAA,EAAQ,CACLq2J,WAAYx6J,KAAKhD,MAAMw9J,WACvB99J,QAASA,EACT09J,YAAaA,EACbJ,YAAah6J,KAAKhD,MAAMg9J,YACxBO,cAAeA,EACfl/J,QAASA,EACTm+J,gBAAiBA,EACjBiB,kBAAmBz6J,KAAKhD,MAAMy9J,kBAC9BJ,eAA+B,QAAjB63C,EAAElyM,KAAKhD,MAAM2T,YAAI,IAAAuhM,GAAU,QAAVC,EAAfD,EAAiBloL,gBAAQ,IAAAmoL,OAAV,EAAfA,EAA2BxyB,OAC3C14J,OAAuB,QAAjBmrL,EAAEpyM,KAAKhD,MAAM2T,YAAI,IAAAyhM,OAAA,EAAfA,EAAiB/9M,GACzBimK,SAAUt6J,KAAKhD,MAAM+3M,wBAAyC,QAAlB1C,EAAGryM,KAAKhD,MAAM2T,YAAI,IAAA0hM,OAAA,EAAfA,EAAiBwC,aAAUv8M,GAGtF,EACHwH,GAzFoB+xM,GAAY,aAvB7Br3C,WAAUp3J,IAAAA,SAAAA,IAAAA,KAKV1G,QAAO0G,IAAAA,OAAAC,WAMPqM,UAAStM,IAAAA,OAAAC,WAMT0xM,wBAAuB3xM,IAAAA,OAAAtD,GAMN+xM,GAAY,eACP,CAClB+C,YAAa,GACbv5M,QAAS,CAAC,EACV05M,yBAAyB,ICsCjC,MAIA,IAJkB3vM,EAAAA,EAAAA,UA9BlB,WACI,MAAM4vM,GAxBCttJ,EAAAA,EAAAA,IACH,4BACA01I,EAAAA,IACA,CAACxnM,EAAoB+a,IAAgBA,IACrC,CAAC/a,EAAoB+a,EAAazP,IAC7BA,GAAU+zM,EAAAA,EAAAA,IAAgCr/M,EAAOsL,EAAQ4W,QAAS5W,EAAQ7M,KAAM6gN,EAAAA,EAAAA,IAAsBt/M,GAAO,KAClH,CAACu/M,EAA0BxkM,EAAMykM,KAAqB,IAAAzvB,EAAA8sB,EAClD,IAAIz4C,EAAcm7C,EAWlB,OAVKxkM,SAAW,QAAPg1K,EAAJh1K,EAAM3T,aAAK,IAAA2oL,GAAXA,EAAax6J,0BACd6uI,EAAcA,EAAY/7J,OAAOm3M,IAGjCzkM,SAAW,QAAP8hM,EAAJ9hM,EAAM3T,aAAK,IAAAy1M,GAAXA,EAAaloL,2BACbyvI,EAAcA,EAAYv5J,QACrBK,IAAW,CAAC,OAAQ,WAAY,SAAS2oC,SAAS3oC,EAAM9F,QAI1Dg/J,CAAW,IAQ1B,MAAO,CAACpkK,EAAoB2hC,KACxB,MAAMr2B,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAO2hC,EAAS7nB,WACrC8T,GAAcC,EAAAA,EAAAA,IAAe7tB,GAE7B40B,GAAUC,EAAAA,EAAAA,IAAW70B,GACrBq4F,GAAsBC,EAAAA,EAAAA,IAAuBt4F,GAG7C8jH,EAAoD,UAD3C38F,EAAAA,EAAAA,IAAUnnB,GACQ8/C,qBAEjC,MAAO,CACHx0C,UACAsiB,cACAoxL,YAAah/M,EAAM+oE,QAAQ7hE,WAAWu4M,kBACtC56C,kBAAmB5wJ,QAAQjU,EAAM+oE,QAAQ7hE,WAAWw4M,aACpD9C,uBAAwBtxM,IAAWkwG,EAAAA,EAAAA,IAAiBx7G,EAAOsL,GAC3D84J,YAAag7C,EAAsBp/M,EAAO2hC,EAAS5mB,KAAMzP,GACzDq5J,eAAeg7C,EAAAA,EAAAA,IAAoC3/M,GACnDkhM,gBAAgB75K,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYggL,mBAAmB,GACrGt6I,UAAUH,EAAAA,EAAAA,IAAmB7sD,GAC7B28M,cAAkD,UAAnCx1L,EAAAA,EAAAA,IAAUnnB,GAAO4/M,cAChCV,qCAAqCA,EAAAA,EAAAA,IAAoCtqL,EAASyjE,EAAqByrB,GACvGA,oBACH,CAET,GAMA,CAAyBm4F,G,8ECtFlB,SAASz6H,EAAkB3hF,GAAiE,IAAhE,gBAACshF,GAA6DthF,EAC7F,MAAMklB,GAAW1D,EAAAA,EAAAA,UAAQ,IACdvZ,OAAO+I,KAAKswE,GACft2E,QAAQzF,GAAQ+7E,EAAgB/7E,KAChC2F,KAAK3F,GAAG,IAAAiD,OAASjD,MAGtB,CACC+7E,EAAgBjgC,IAChBigC,EAAgB0+H,KAChB1+H,EAAgB71E,UAIpB,OACI5D,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,uCACJ0S,eAAgB,wDAChBjB,OAAQ,CACJ46E,QACIpjF,IAAAA,cAACktG,EAAAA,cAAa,CACV1pG,MAAO6Z,EACPniB,KAAK,kBAM7B,CAEO,SAAS6+E,IACZ,OACI/5E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,kCACJ0S,eAAgB,iCAG5B,C,kKC1Be,SAASowE,EAAa1hF,GAG3B,IAH4B,SAClCwhF,GAEIxhF,EADDkkG,E,qWAAIx8C,CAAA1nD,EAAA2nD,GAEP,MAAM,cAACt2C,IAAiBgQ,EAAAA,EAAAA,WAExB,OAAImgE,IAAawF,EAAAA,EAAaC,OAEtBp/E,IAAAA,cAAC+0H,EAAAA,EAAG30H,OAAAC,OAAA,GACIg8F,EAAI,CACRhV,QAAQ,SACRtnF,KAAM,gBACNyK,KAAMhB,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,WAC1EurH,WAAW,KAKnBr7C,IAAawF,EAAAA,EAAaK,UAEtBx/E,IAAAA,cAAC+0H,EAAAA,EAAG30H,OAAAC,OAAA,GACIg8F,EAAI,CACRhV,QAAQ,OACRtnF,KAAM,uBACNyK,KAAMhB,EAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,cAC7EurH,WAAW,KAKhB,IACX,CAACn7C,EAAAxxE,UAAA,CAlCG2sH,UAASlvH,IAAAA,K,mnBCeE,MAAMwlM,UAA2BtrM,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,6BAKhD,KACnB,MAAM,KAAC6Q,EAAI,KAAEjQ,GAAQV,KAAKhD,MAE1B,OAAI0D,GAAQA,EAAKrM,KAAOsc,EAAKoL,QAClB7d,EAAAA,GAAsBwC,EAAKrM,GAAIqM,EAAKy6C,qBACpCxqC,EAAKoL,QACL7d,EAAAA,GAAsByS,EAAKoL,SAG/B,EAAE,IACZjc,EAAA,kBAEW,CAAC+/L,EAA4B6V,EAAsBh1M,IACvDm/L,GAAqB6V,GAAgBh1M,GAAQA,EAAKnC,OAC3C,GAGJyB,KAAKhD,MAAML,SACrBmD,EAAA,uBAEgB,CAAC61M,EAAoB9V,EAA4B6V,KAC9D,MAAM,uBAACE,EAAsB,cAAE1rE,EAAa,KAAEv5H,GAAQ3Q,KAAKhD,MACrD64M,EAAYllM,EAAK3T,MACjB84M,GAAsBzT,EAAAA,EAAAA,IAAawT,aAAS,EAATA,EAAWpT,mBAC9CsT,GAAc1T,EAAAA,EAAAA,IAAawT,aAAS,EAATA,EAAWG,eAE5C,OAAIh2M,KAAKhD,MAAM2uI,eACJ,IAGNk0D,GAAqB6V,IAAgBK,GAAeH,EACjDE,GAA+C,KAAxBA,EAChBroB,EAAAA,GAAsBqoB,EAAqB5rE,GAG/CnnH,EAAAA,GAAUkzL,qBAGdN,CAAU,GACpB,CAED1yM,MAAAA,GAAS,IAAA0iL,EACL,MAAM,0BACFuwB,EAAyB,eACzBvqE,EAAc,KACdh7H,EAAI,KACJjQ,EAAI,MACJmjD,GACA7jD,KAAKhD,MAEHgyL,EAAkBvB,EAAAA,GAA0B98K,GAC5C+kM,EAAcjoB,EAAAA,GAAwB98K,GAE5C,GAAIq+K,IAAoBrjD,IAAmB+pE,IAAgB7xJ,EACvD,OAAOvmD,IAAAA,cAACu3C,EAAAA,EAAc,CAACt3C,UAAU,SAErC,MAAMsiM,EAAoBpS,EAAAA,GAA4B98K,GAEhDwlM,EAAan2M,KAAKo2M,uBAClBvqM,EAAM7L,KAAKq2M,eAAeF,EAAYtW,EAAmB6V,GAEzDY,GAAoBjU,EAAAA,EAAAA,IAAa1xL,EAAK3T,MAAMu5M,qBAC5ChU,GAAgBF,EAAAA,EAAAA,IAAuB,QAAX1c,EAACh1K,EAAK3T,aAAK,IAAA2oL,OAAA,EAAVA,EAAY2c,mBACzCkU,EAAgC,KAAtBF,EACV35M,EAASqD,KAAKy2M,UAAU5W,EAAmB6V,EAAah1M,GAE9D,OACIpD,IAAAA,cAAC29C,EAAAA,EAAc,CACX78C,KAAK,KACLyN,IAAKA,EACLsqM,WAAYA,EACZK,QAASA,EACT75M,OAAsC,SAA9Bu5M,EAAuCv5M,EAAS,GACxDnI,OAAQkM,aAAI,EAAJA,EAAMrM,GACdqb,UAAWiB,EAAKG,WAChBjT,SAAU6C,aAAI,EAAJA,EAAM7C,SAChB2kM,cAAexiM,KAAKhD,MAAMwlM,cAC1BD,cAAeA,EACf1+I,MAAOnjD,aAAI,EAAJA,EAAMnC,OACbshM,kBAAmBA,EACnB6V,YAAaA,GAGzB,EACH51M,EAzFoB8oM,EAAkB,aAXnCsN,0BAAyB9yM,IAAAA,OAAAC,WACzBsoI,eAAcvoI,IAAAA,KACdwyM,uBAAsBxyM,IAAAA,KAAAC,WACtB6mI,cAAa9mI,IAAAA,KAAAC,WAEb1G,OAAMyG,IAAAA,OAENygD,MAAKzgD,IAAAA,KACLo/L,cAAap/L,IAAAA,SAAAtD,EAGI8oM,EAAkB,eACb,CAClBjsM,OAAQq2C,EAAAA,GAAamsD,UCe7B,SAAe/5F,EAAAA,EAAAA,UAtBf,SAAyBxP,EAAoB2hC,GAAiB,IAAAm/K,EAAAC,EAC1D,MAAM1+M,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnB8K,GAAO82B,EAAAA,EAAAA,IAAQ5hC,EAAO2hC,EAAS/iC,QAC/BohN,EAA2D,SAAlC39M,EAAO2+M,uBAChCV,GAA4Br1I,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAY25L,6BAA8B35L,EAAAA,GAAY45L,sCACpIC,EAAkBnB,IAA0BvT,EAAAA,EAAAA,IAA0B,QAAdqU,EAACn/K,EAAS5mB,YAAI,IAAA+lM,GAAO,QAAPC,EAAbD,EAAe15M,aAAK,IAAA25M,OAAP,EAAbA,EAAsBlU,mBACrF,IAAID,EAKJ,OAJIuU,IACAvU,EAAgBltM,EAAAA,GAAQ0hN,eAAeD,IAGpC,CACHb,4BACAN,uBAA0D,SAAlC39M,EAAO2+M,uBAC/BpU,gBACAt4D,cAAwC,SAAzBjyI,EAAOmyI,cACtBztI,QAAQslD,EAAAA,EAAAA,IAAmBrsD,EAAO2hC,EAAS/iC,QAC3CqvD,MAAOh6C,QAAQnJ,GAAQA,EAAKnC,QAC5BmC,OAER,GAEA,CAAwCkoM,E,mFCVxC,SAAexjM,EAAAA,EAAAA,UAjBf,WACI,MAAM6xM,GAAuBC,EAAAA,EAAAA,MAE7B,MAAO,CAACthN,EAAoB2hC,KACxB,MAAM5mB,EAAOsmM,EAAqBrhN,EAAO2hC,EAAS4/K,YAC5Cj2M,EAAUtL,EAAMuyB,SAAShG,SAASA,SAASxR,EAAKG,YAEtD,MAAO,CACHH,OACAsW,OAAQsQ,EAAS4/K,WACjBrS,gBAAiBvtK,EAASutK,gBAC1Bc,mBAAmBA,EAAAA,EAAAA,IAAkBhwM,EAAO+a,EAAMzP,GACrD,CAET,GAGA,CAA4Ck2M,EAAAA,E,qGC1B5C,MAAMpqJ,EAAc,CAChBC,EAAAA,GAAAA,GACAA,EAAAA,GAAAA,IAOEy8I,EAA2Bj0M,IAAY,IAAX,KAACg1F,GAAKh1F,EACpC,OACI6H,IAAAA,cAAC+5M,EAAAA,EAAc,KACX/5M,IAAAA,cAACkiD,EAAAA,GAAS,CACN1+C,MAAO2pF,EACP7qC,SAAS,EACTqB,mBAAmB,EACnBF,OAAQiM,IAEC,EAIzB08I,EAAc/jM,UAAY,CACtB8kF,KAAM6sH,IAAAA,UAAoB,CACtBA,IAAAA,OACAA,IAAAA,WAAqBp8L,QACtB7X,YAGP,SAAewpD,EAAAA,EAAAA,MAAK68I,E,qKC/BpB,MAAM18I,EAAc,CAChBC,EAAAA,GAAAA,GACAA,EAAAA,GAAAA,IASEsqJ,EAAoB9hN,IAA6D,IAA5D,SAAC+1E,EAAQ,YAAEgsI,EAAW,UAAEC,EAAS,aAAEC,GAAoBjiN,EAC9E,GAAiB,IAAb+1E,EACA,OAAO,KAGX,MAAMmsI,EAAUljK,IAAW,uBAAwB,CAC/CmjK,UAAWJ,EACXnjJ,IAAKojJ,EACLI,gBAAiBH,IAGrB,OACIp6M,IAAAA,cAAA,OACIC,UAAWo6M,EACX,cAAY,qBAEZr6M,IAAAA,cAAA,WACIA,IAAAA,cAAA,YACIA,IAAAA,cAACkiD,EAAAA,GAAS,CACN1+C,MAAO0qE,EACP5rB,SAAS,EACTmB,OAAQiM,MAIlB,EAEZuqJ,EAAA5xM,UAAA,CAjCE6xM,YAAWp0M,IAAAA,KAAAC,WACXmoE,SAAQpoE,IAAAA,UAAA,CAAAA,IAAAA,WAAA8X,MAAA9X,IAAAA,SAAAC,WACRq0M,aAAYt0M,IAAAA,KAAAC,WACZo0M,UAASr0M,IAAAA,MAgCb,QAAe9F,IAAAA,KAAWi6M,GCX1B,GAAenyM,EAAAA,EAAAA,UAjBf,SAAyBxP,EAAoB2hC,GACzC,IAAItQ,EAASsQ,EAAStQ,OACtB,GAAI6wL,EAAAA,GAAyC7wL,GAAS,CAClD,MAAM8wL,EAAcD,EAAAA,GAAoD7wL,GAExEA,EAAS8wL,EAAYA,EAAYrxM,OAAS,EAC9C,CAEA,MAAMiK,GAAO8X,EAAAA,EAAAA,IAAQ7yB,EAAOqxB,GAEtBywL,EAAengL,EAASkgL,WAAYO,EAAAA,EAAAA,IAAqBpiN,IAASqiN,EAAAA,EAAAA,GAAeriN,GACvF,MAAO,CACH41E,SAAU76D,EAAOA,EAAKuL,UAAY,EAClCw7L,eAER,GAEA,CAAwCH,E,qGC1BxC,MAAMW,EAAwBziN,IAAuB,IAAtB,SAACk8D,GAAgBl8D,EAC5C,OACI6H,IAAAA,cAAA,OACIC,UAAU,kCACV,cAAY,yBAEZD,IAAAA,cAAA,MAAIC,UAAU,kBACbo0D,GACGr0D,IAAAA,cAAA,OAAKC,UAAU,mBACVo0D,GAGP,EAEZumJ,EAAAvyM,UAAA,CAjBEgsD,SAAQvuD,IAAAA,MAmBZ,QAAe9F,IAAAA,KAAW46M,GCPpBC,EAAsB1iN,IAMf,IANgB,4BACzB2iN,EAA2B,UAC3B1oM,EAAS,SACT47K,EAAQ,WACRp2E,EAAU,YACVmjG,GACI5iN,EACJ,MAAMwlB,EAAeq9L,EAAAA,GAA2CD,GAE1DvyI,EAAcsyI,aAA2B,EAA3BA,EAChBz3M,KAAK1D,IACD,IAAKA,EAAKhC,UACN,OAAO,KAGX,MAAMmrE,EAAYnpE,EAAKhC,UACvB,OACIqC,IAAAA,cAAC8oE,EAAS,CACNprE,IAAKiC,EAAK5I,GACV4mB,aAAcA,EACdvL,UAAWA,EACX47K,SAAUA,GACZ,IAId,OACIhuL,IAAAA,cAAA,OACI46C,IAAKg9D,EACL33G,UAAU,iBAEVD,IAAAA,cAAC46M,EAAqB,KAClB56M,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oBACH0S,eAAe,iBAElB++D,GAEH,EAEZqyI,EAAAxyM,UAAA,CA/CE0yM,YAAWj1M,IAAAA,OAAAC,WAEX+0M,4BAA2Bh1M,IAAAA,MAAAC,WAC3BqM,UAAStM,IAAAA,OACTkoL,SAAQloL,IAAAA,QA6CZ,SAAeypD,EAAAA,EAAAA,MAAKsrJ,E,6HCjDdxO,EAAmBrsM,IAAAA,YAAiB,CAACN,EAAck7C,KACrD,MAAM,SACFyZ,EAAQ,KACRhhD,GAEA3T,EADG25E,E,qWAAUx5B,CACbngD,EAAKogD,GAEH1lC,GAAY6gM,EAAAA,EAAAA,IAAiB5nM,GAEnC,OACIrT,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKA,EACL,aAAYxgC,GACRi/D,GAEHhlB,EACC,IAIdg4I,EAAiB7lM,YAAc,mBAE/B,S,2UCzBA,SAAS00M,EAAeC,GACpB,YAAwBngN,IAAjBmgN,EAAM7sM,aAAwCtT,IAAhBmgN,EAAM9sM,KAC/C,CAEO,SAAS+sM,EAAqBC,EAAeC,GAChD,OAAOx3M,KAAKy3M,KAAKz3M,KAAK03M,IAAIH,EAAOhtM,MAAQitM,EAAOjtM,MAAO,GAAKvK,KAAK03M,IAAIH,EAAO/sM,OAASgtM,EAAOhtM,OAAQ,GACxG,C,ojCCYA,MAAMmtM,EAAiC,CACnCntM,OAAQ,GACRD,MAAO,IAGLqtM,EAAoB,EAAI,EA2CvB,MAUD92B,EAA0BzsL,IAAyF,IAAAkwL,EAAA,IAAxF,cAACszB,EAAa,KAAEtoM,EAAI,QAAEtQ,EAAO,KAAE60E,EAAI,cAAEk7D,EAAa,eAAEg0D,GAA+B3uM,EAAZkkG,E,qWAAIx8C,CAAA1nD,EAAA2nD,GACxG,MAAM,cAACt2C,IAAiBgQ,EAAAA,EAAAA,YACjB/G,QAASmpM,IAAiB/vJ,EAAAA,EAAAA,QAjC9B,SAAsB8vJ,EAAmC5+C,GAA4C,IAAA8+C,EACxG,GAAKF,SAAqB,QAARE,EAAbF,EAAet5B,cAAM,IAAAw5B,IAArBA,EAAuBzyM,OACxB,OAAO,KAIX,MAAMi5K,EAASs5B,EAAct5B,OAAOh/K,KAAK2uJ,IAAkC,IAAA8pD,EAAAC,EAAAC,EACvE,MAAMr8B,EAAW3tB,EAAMswB,YAActwB,EAAMjxJ,IAE3C,OAAAjK,EAAAA,EAAA,GACOk7J,GAAK,IACR1jJ,OAAQ0jJ,EAAM1jJ,SAAUyuJ,SAA0B,QAAZ++C,EAAd/+C,EAAiB4iB,UAAS,IAAAm8B,OAAZ,EAAdA,EAA4BxtM,UAAW,EAC/DD,MAAO2jJ,EAAM3jJ,QAAS0uJ,SAA0B,QAAZg/C,EAAdh/C,EAAiB4iB,UAAS,IAAAo8B,OAAZ,EAAdA,EAA4B1tM,SAAU,EAC5D++E,QAAkB,QAAV4uH,EAAAhqD,EAAM92J,YAAI,IAAA8gN,OAAA,EAAVA,EAAYx3K,MAAM,KAAK,KAAMwtH,EAAM92J,MAAQ,GACnD+gN,WAAY,GAAC,IAIrB,ODnDoDC,ECmDdT,EAAgCp5B,EDlDxD9vK,QAAO,CAAC4pM,EAAShB,IACvBD,EAAeiB,IAAYjB,EAAeC,IAC1CC,EAAqBD,EAAOe,IAAUd,EAAqBe,EAASD,GAC7DC,EAEJhB,GACR,CAAC,GAPD,IAAiDe,CCoDxD,CAc2DE,CAAaT,EAAetoM,EAAKqZ,SAAS21J,SAC3Fg6B,EAAoE,UAAjDhpM,SAAW,QAAPg1K,EAAJh1K,EAAM3T,aAAK,IAAA2oL,OAAP,EAAJA,EAAc3pK,EAAAA,GAAU49L,sBAGjD,IAAKjgH,EAAKkgH,qBAAuBzV,GAAkBuV,EAC/C,OAAO,KAGX,IAAKhpM,IAAQq+K,EAAAA,EAAAA,IAAgBr+K,GACzB,OAAO,KAGX,IAAKsoM,EACD,OAAO,KAGX,MAgBM36B,GAAW3pB,EAAAA,EAAAA,KAAYskD,aAAa,EAAbA,EAAe56M,MAAO62E,GAEnD,OACI53E,IAAAA,cAAC03C,EAAAA,EAAY,CACTz3C,UAAU,0BACV6M,KAAK,OACLqpC,KAAM6qI,EACN9yK,OAAOytM,aAAa,EAAbA,EAAeztM,SAASytM,aAAa,EAAbA,EAAe56M,MAAO62E,EACrDzlE,SAAS,6BAERkqF,EAAKv2E,gBAAkBzS,EAAKoL,UAAYq0H,GACrC9yI,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO1E,EAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,yBAE9EzJ,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,4BACV,aAAW,SACXqP,QAlCQ/Y,UACxB4I,EAAEyK,iBAGFzK,EAAEy0D,kBACF,MAAMl0D,EAAQU,OAAOC,OAAO,CAAC,EAAGgT,EAAK3T,OACrCA,EAAMgf,EAAAA,GAAU49L,qBAAuB,OAEvC,MAAME,EAAc,CAChBzlN,GAAIsc,EAAKtc,GACT2I,SAGJ,OAAOqD,EAAQ0yB,SAAS+mL,EAAY,EAsBpB,cAAY,2BAEZx8M,IAAAA,cAAC8nF,EAAAA,UAAS,CACNhnF,KAAM,GACNuuD,MAAO,mBAKvBrvD,IAAAA,cAACy8M,EAA2B,CACxB3pE,cAAeA,EACf4pE,SAAUf,aAAa,EAAbA,EAAegB,UACzBzuM,OAAOytM,aAAa,EAAbA,EAAeztM,SAASytM,aAAa,EAAbA,EAAe56M,MAAO62E,EACrD13E,YAAay7M,aAAa,EAAbA,EAAez7M,cAEhCF,IAAAA,cAAC48M,EAA4B,CACzBlwE,cAAekvE,EACf1tM,MAAOytM,aAAa,EAAbA,EAAeztM,MACtB4kI,cAAeA,EACfO,eAAgBh3C,EAAKg3C,eACrBb,sBAAuBn2C,EAAKm2C,wBAErB,EAErBoyC,EAAAv8K,UAAA,CA9HEshB,OAAM7jB,IAAAA,OAAAC,WACN6xE,KAAI9xE,IAAAA,OAAAC,WACJ+f,cAAahgB,IAAAA,OAGby2M,mBAAkBz2M,IAAAA,KAClBghM,eAAchhM,IAAAA,KACdutI,eAAcvtI,IAAAA,KACd0sI,sBAAqB1sI,IAAAA,KAAAC,WACrBhD,QAAO+C,IAAAA,MAAA,CACH2vB,SAAQ3vB,IAAAA,KAAAC,aAAAA,WAEZ+sI,cAAahtI,IAAAA,KACb+2M,eAAc/2M,IAAAA,MA0HX,MAAM22M,GAA8BltJ,EAAAA,EAAAA,OAAK3xD,IAAwE,IAAvE,MAACsQ,EAAK,cAAE4kI,EAAa,SAAE4pE,EAAW,GAAE,YAAEx8M,EAAc,IAActC,EAC/G,OAAOsQ,EACHlO,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,gCAAiC,CAAC27F,oBACtDA,GAAiB4pE,GAAa18M,IAAAA,cAAA,QAAMC,UAAU,YAAYy8M,GAC7D18M,IAAAA,cAAA,QAAMC,UAAU,SAASiO,GACxBhO,GAAeF,IAAAA,cAAA,QAAMC,UAAU,eAAeC,IAEnD,IAAI,IAWC08M,GAA+BrtJ,EAAAA,EAAAA,OAAK+G,IAA0G,IAAzG,cAACo2E,EAAa,cAAEoG,EAAa,sBAAEN,EAAqB,eAAEa,GAAiB,EAAI,MAAEnlI,EAAQ,IAAeooD,EAClJ,MAAM,cAAC9sD,IAAiBgQ,EAAAA,EAAAA,WAExB,IAAKkzH,GAAiBoG,EAClB,OAAO,KAGX,MAAMgqE,EAzHsBnmN,KAC5B,IAAKA,EACD,OAAO,EAGX,MAAM,OAAC2X,EAAM,MAAED,GAAS1X,EAExB,OAAO0X,GAjDe,KAiDgBA,EAAQC,GAAWotM,CAAiB,EAkH5DqB,CAAgBrwE,GACxBn+H,EAAMm+H,EAAc41C,YAAc51C,EAAc3rI,KAAO,GAUvDi8M,EAAiBxzM,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,uBAElFwzM,EACFj9M,IAAAA,cAAA,UACIC,UAAU,6BACVqP,QAboBnQ,IACxBA,EAAEyK,iBAGFzK,EAAEy0D,kBACF4+E,GAAuB,GAUlBa,EACGrzI,IAAAA,cAACk9M,EAAAA,aAAY,CACTp8M,KAAM,GACNuuD,MAAM,iBAGVrvD,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACm9M,EAAAA,cAAa,CACVr8M,KAAM,GACNuuD,MAAM,iBAET2tJ,IAMXhrD,EACFhyJ,IAAAA,cAACssI,EAAAA,EAAa,CACV/9H,IAAKA,EACLm+H,cAAeA,IAEbt8H,GACEpQ,IAAAA,cAAAA,IAAAA,SAAA,KACK88M,GAASG,EACVj9M,IAAAA,cAAA,cACIA,IAAAA,cAAA,OACIuO,IAAK6B,EACLhC,IAAKF,QAQ7B,OACIlO,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,iCAAkC,CAAC2lK,QAAO54E,WAAYmP,KAC5EypE,EACG98M,IAAAA,cAACy1E,EAAAA,EAAkB,CACfC,SAAU29D,EAAiB,EAAI,EAC/B19D,MAAOq8E,EACPp8E,MAAOqnI,IAEXjrD,EACF,IAId,ICpNA,GAAelqJ,EAAAA,EAAAA,UA5Bf,SAAyBxP,EAAoB2hC,GACzC,MAAMt/B,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnBukN,GAAiBO,EAAAA,EAAAA,IAAqB9kN,GAE5C,MAAO,CACHwtB,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAChCikN,mBAAkD,SAA9B5hN,EAAO0iN,mBAC3B1B,eAAe/4B,EAAAA,EAAAA,IACXtqL,EACA2hC,EAAStQ,OACTsQ,EAAS29C,MAEbkvH,gBAAgBnnL,EAAAA,EAAAA,IACZrnB,EACAsnB,EAAAA,GAAY4jD,0BACZ5jD,EAAAA,GAAYmnL,sBACZ,GAEJ8V,iBAER,IAEA,SAA4BxmN,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CAACytB,SAAQA,EAAAA,IAAGp/B,GAEhD,GAEA,CAA4DuuL,E,yOClC5D,MCqDA,GAAe98K,EAAAA,EAAAA,UAvBf,SAAyBxP,EAAoB2hC,GACzC,MAAMnU,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjC+a,EAAO4mB,EAAStQ,QAASwB,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAAStQ,aAAU3uB,EAC3DkyB,GAAUC,EAAAA,EAAAA,IAAW70B,GACrBqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnBsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,GAAO+a,aAAI,EAAJA,EAAMG,aAAc,IAEhDs9C,GAAuC3L,EAAAA,EAAAA,IAAmB7sD,GAC1DglN,EAAYjqM,GAAOkqM,EAAAA,EAAAA,IAAYjlN,EAAO+a,QAAQrY,EAIpD,MAAO,CAACw+L,gBAFe75K,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYggL,mBAAmB,GAEpF9uI,WAAUwsJ,YAAWjqM,OAAMgnL,UADnChnL,IAAOmqM,EAAAA,EAAAA,IAAYllN,EAAO+a,EAAM6Z,EAASvyB,EAAQiJ,EAASkiB,GAE9E,IAEA,SAA4BzvB,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBy1M,oBAAmBA,EAAAA,IACpBpnN,GAEX,GAEA,EDrD4B8B,IAAoH,IAAnH,OAACwxB,EAAM,eAAE6vK,EAAc,SAAE1oI,EAAQ,SAAEksG,EAAW,EAAC,UAAEsgD,EAAS,KAAEjqM,EAAI,QAAEgnL,EAAO,QAAEt3L,GAAe5K,EACnH,MAAM,cAACqR,EAAa,WAAEk0M,EAAU,WAAEC,IAAcnkM,EAAAA,EAAAA,WAEhD,IAAKmQ,GAAuB,IAAbqzI,EACX,OAAO,KAGX,MAAM4gD,EAAa9sJ,GAAW+sJ,EAAAA,EAAAA,IAAmB,IAAIjgM,KAAKo/I,GAAWlsG,GAAY,IAAIlzC,KAAKo/I,GAE1F,IAAI7vE,EACJ,QAAQ,GACR,KAAK2wH,EAAAA,EAAAA,IAAUF,GACXzwH,EAAO3jF,EAAc,CAACzS,GAAI,iBAAkB0S,eAAgB,WAC5D,MACJ,KAAKs0M,EAAAA,EAAAA,IAAYH,GACbzwH,EAAO3jF,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,eAChE,MACJ,KAAKu0M,EAAAA,EAAAA,IAAiBJ,GAClBzwH,EAAOuwH,EAAWE,EAAY,CAAC/tJ,QAAS,SACxC,MACJ,MAAMmuJ,EAAAA,EAAAA,IAAiBJ,GACvB,QACIzwH,EAAOuwH,EAAWE,EAAY,CAAC5tJ,MAAO,OAAQC,IAAK,YAGvD,MAAM7nC,EAAOu1L,EAAWC,EAAY,CAACr7J,KAAM,UAAWC,OAAQ,UAAW+2I,QAASC,IAE5EykB,EAAaz0M,EAAc,CAC7BzS,GAAI,2BACJ0S,eAAgB,WAGdy0M,EAAgB10M,EAAc,CAChCzS,GAAI,qBACJ0S,eAAgB,8BAEpB,CACI00M,eAAgBhxH,EAChB/kE,SAEEg2L,EAAkB50M,EAAc,CAClCzS,GAAI,2CACJ0S,eAAgB,0BAGd40M,EAAwBf,GAAajjB,EACvCr6L,IAAAA,cAAA,QAAMC,UAAU,sBAAsBm+M,GACtC,KAEEE,EAAuBn/M,IACzBA,EAAEyK,iBACEyJ,SAAAA,EAAMtc,IACNgM,EAAQ06M,oBAAoBpqM,EAChC,EASEkrM,EACFv+M,IAAAA,cAAA,QACIjJ,GAAE,cAAA4J,OAAgBgpB,GAClB1pB,UAAU,yBACV,eAAc0pB,EACd,iBAAgBqzI,GAEhBh9J,IAAAA,cAACw/L,EAAAA,kBAAiB,CAAC1+L,KAAM,KACxBm9M,GAIHO,EAAmBlB,GAAajjB,EAClCr6L,IAAAA,cAAA,UACIC,UAAW,cACXu1D,SAAU,EACVlmD,QAASgvM,EACTznI,QAvBgB13E,IAChBA,EAAEzB,MAAQ+nB,EAAAA,GAAUoxC,SAAS+Z,MAAM,IAAMzxE,EAAEzB,MAAQ+nB,EAAAA,GAAUoxC,SAASorG,MAAM,IAC5Eq8C,EAAoBn/M,EACxB,EAqBI,aAAY8+M,GAEXM,GAELA,EAEJ,OAAQ50L,GAAuB,IAAbqzI,EACdh9J,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAAA,IAAAA,SAAA,QAAAW,OACQs9M,EAAU,KAAAt9M,OAAIu9M,GACjBG,IAIRG,GAT0B,IAWlC,G,mZEvFL,MAKMC,EAA2B/+M,IAC7B,MAAM,SAAC20D,EAAQ,UAAEp0D,EAAS,KAAE23E,EAAI,mBAAEmgH,GAAsBr4L,EAClDo7F,GAAUC,EAAAA,EAAAA,cAEV9iG,EATwB2/E,KAC9B,MAAMg6D,GAAQze,EAAAA,EAAAA,WAAsBv7C,EAAM,CAACn1D,KAAM,0BACjD,OAAOmvH,aAAK,EAALA,EAAO35I,MAAM,EAOLymN,CAAyB9mI,GAElCvhF,GAAWsxD,EAAAA,EAAAA,eAEX7hC,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5BokM,GAAiC5nK,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAAsmN,EAAA,OAAKC,EAAAA,EAAAA,IAA0BvmN,EAAuB,QAAlBsmN,EAAE3mN,aAAM,EAANA,EAAQmkD,gBAAQ,IAAAwiK,EAAAA,EAAI,GAAG,IAC7HvrM,GAAO0jC,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAAwmN,EAAA,OAAK3zL,EAAAA,EAAAA,IAAQ7yB,EAAqB,QAAhBwmN,EAAE7mN,aAAM,EAANA,EAAQ0xB,cAAM,IAAAm1L,EAAAA,EAAI,GAAG,IAC/E7hM,GAAa85B,EAAAA,EAAAA,aAAY75B,EAAAA,IAEzB+rJ,GAAgBxvJ,EAAAA,EAAAA,cAAata,IAC/B,MAAM,QAACoqE,GAAWpqE,EAAEq7D,OAIpB,GAHAr7D,EAAEy0D,mBACe,CAAC,IAAK,MAAO,SAAU,KAG1BznB,SAASo9B,IACmB,WAAlCpqE,EAAEq7D,OAAOqqF,aAAa,SACtB1lJ,EAAEq7D,OAAOv6D,YAAc,0BAALU,OAA+BV,GACvD,CACE,MAAMk3C,EAAa,CACf,sBACA,uBACA,aACA,aAGJ,GAAIl/C,GAAU0mN,GAAkC1hM,GAAc5J,GAAQA,EAAKI,QAEvE,YADApd,GAAS0oN,EAAAA,EAAAA,GAAU9mN,EAAO0xB,OAAQiuD,EAAM9xD,EAAe,CAACk5L,4BAA4B,KAGnF7nK,EAAW7V,MAAMrhC,GAAcd,EAAEq7D,OAAOv6D,UAAUksC,SAASlsC,MAA+B,oBAAhBd,EAAEq7D,OAAOzjE,IACpF+jG,EAAQ9oF,KAAK4lE,EAErB,IACD,CAAC33E,EAAWgd,EAAY5mB,EAAUykG,EAASljB,EAAM3/E,EAAQob,EAAMsrM,EAAgC74L,IAClG,OACI9lB,IAAAA,cAAA,OACIC,UAAS,0BAAAU,OAA4BV,GACrC6M,KAAMirL,OAAqB/8L,EAAY,SACvCsU,QAASyoL,OAAqB/8L,EAAYiuK,GAE1CjpK,IAAAA,cAAA,OACIC,UAAS,4CAAAU,OAA8CV,IAEvDD,IAAAA,cAAA,OACIC,UAAS,yDAAAU,OAA2DV,IAEpED,IAAAA,cAAA,OACIC,UAAS,kDAAAU,OAAoDV,IAE5Do0D,KAIX,EAEZoqJ,EAAAp2M,UAAA,CA5EEpI,UAAS6F,IAAAA,OACTuuD,SAAQvuD,IAAAA,QACRiyL,mBAAkBjyL,IAAAA,KAClB8xE,KAAI9xE,IAAAA,OAAAC,YA2ER,UCjDM8+K,EAAsBnlL,IAAiB,IAAAoiG,EAAAm9G,EAAAl9G,EAAAm9G,EACzC,MAAM,eAACC,EAAc,mBAAE18I,EAAkB,KAAEr/D,EAAI,YAAEg8M,EAAW,SAAE1yL,EAAQ,eAAE2mH,EAAc,eAAEhF,EAAc,mBAAE0pD,EAAkB,qBAAEC,EAAoB,yBAAE7nD,EAAwB,sBAAE9uD,GAAyB3hF,EAE/L8yI,EAAwBA,KACtB4sE,GACA1/M,EAAMqD,QAAQyvI,sBAAsB4sE,EAAYroN,GACpD,EAmBJ,IAAKqoN,EACD,OAAO,KAGX,MAAM74J,EAAQh6C,QAAQnJ,GAAQA,EAAKnC,QAC7BywL,EAAkBvB,EAAAA,GAA0BivB,GAC5ChH,EAAcjoB,EAAAA,GAAwBivB,GACtC7c,EAAoBpS,EAAAA,GAA4BivB,GAEhD7wM,EAzBiBwqM,EAACV,EAAoB9V,EAA4B6V,KACpE,MAAM,uBAACE,EAAsB,cAAE1rE,EAAa,YAAEwyE,GAAe1/M,EACvD64M,EAAY6G,aAAW,EAAXA,EAAa1/M,MACzB84M,GAAsBzT,EAAAA,EAAAA,IAAawT,aAAS,EAATA,EAAWpT,mBAC9CsT,GAAc1T,EAAAA,EAAAA,IAAawT,aAAS,EAATA,EAAWG,eAE5C,OAAKnW,GAAqB6V,IAAgBK,GAAeH,EACjDE,GAA+C,KAAxBA,EAChBroB,EAAAA,GAAsBqoB,EAAqB5rE,GAE/CnnH,EAAAA,GAAUkzL,qBAGdN,CAAU,EAYTU,CADOn4M,EAAAA,GAA8B,QAATkhG,EAAC1+F,aAAI,EAAJA,EAAMrM,UAAE,IAAA+qG,EAAAA,EAAI,IACdygG,EAAmB6V,GAE1D,IAAIiH,EACAr/M,IAAAA,cAACa,EAAAA,EAAM,CACHC,KAAM,KACNC,IAAKwN,EACLtO,UAAW,yBAGfyxL,GAAoB0mB,GAAgB7xJ,EAE7BnjD,SAAAA,EAAMrM,KACbsoN,EACIr/M,IAAAA,cAACa,EAAAA,EAAM,CACHN,SAAU6C,EAAK7C,SACfO,KAAM,KACNC,IAAKwN,EACLtO,UAAW,yBAPnBo/M,EAAUr/M,IAAAA,cAACu3C,EAAAA,EAAc,CAACt3C,UAAU,SAYxC,IAAIq/M,EAAwB,MAEtBF,EAAY5yL,UAAY4yL,EAAY5yL,SAASpjB,OAAS,GAAOg2M,EAAY/kJ,WAAa+kJ,EAAY/kJ,UAAUjxD,OAAS,KACvHk2M,EACIt/M,IAAAA,cAACytM,EAAAA,EAA2B,CACxBp6L,KAAM+rM,EACN/wE,eAAgBA,EAChByE,eAAe,EACf3C,yBAA0BA,KAKtC,IAAIovE,EAAa,KAEjB,GAAIH,GAAeA,EAAY1yL,UAAY0yL,EAAY1yL,SAASu3J,OAAQ,CACpE,MAAMN,EAAQy7B,EAAY1yL,SAASu3J,OAAO,GAEtCN,GAAwB,cAAfA,EAAMzoL,OACfqkN,EACIv/M,IAAAA,cAAC4kL,EAAAA,EAAuB,CACpBj7J,OAAQy1L,EAAYroN,GACpB6gF,KAAM+rG,EAAM5iL,IACZsyI,eAAgBA,EAChBhgI,KAAM+rM,EACN5sE,sBAAuBA,EACvBM,eAAe,IAI/B,CAEA,IAAI1tH,EAAU,IAAHzkB,OAAO+rB,EAAS4qK,WACvB5qK,EAAS8qK,eAAiB5wJ,EAAAA,GAAQzW,YAAczD,EAAS8qK,eAAiB5wJ,EAAAA,GAAQlhB,aAClFN,EAAU+5L,GAGd,MAAMK,EAAgB/8I,GAAsBu1H,EACxCh4L,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,SACKg4L,GACGh4L,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,sCACfjB,OAAQ,CACJ5E,QAAS6+D,OAM7B,KAEEwiI,GAAgBF,EAAAA,EAAAA,IAA8B,QAAlBka,EAACG,EAAY1/M,aAAK,IAAAu/M,OAAA,EAAjBA,EAAmBja,mBAEtD,OACIhlM,IAAAA,cAACy+M,EAAuB,CACpBx+M,UAAU,YACV23E,KAAI,GAAAj3E,OAAKykB,EAAO,QAAAzkB,OAAO+rB,EAAS1Y,SAChC+jL,mBAAoBA,GAEpB/3L,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,OAAKC,UAAU,iBACXD,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,QAAMC,UAAU,gBACXo/M,KAIbr/M,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,gBAAiB,wBACxCn3C,IAAAA,cAACy/M,EAAAA,EAAoB,CACjBvoN,OAAgB,QAAV6qG,EAAE3+F,aAAI,EAAJA,EAAMrM,UAAE,IAAAgrG,EAAAA,EAAI,GACpBqjG,gBAAgB,EAChBH,cAAeA,KAGvBjlM,IAAAA,cAAA,OAAKC,UAAU,iCACXD,IAAAA,cAACkiD,EAAAA,GAAS,CACN1+C,MAAO47M,EAAYxgM,UACnB01G,MAAO,CACH,MACA,SACA,OACA,OAEJhyE,SAAS,EACT2N,IAAK,UACLhwD,UAAU,wBAEO,QAApBi/M,EAAAE,EAAY1yL,gBAAQ,IAAAwyL,OAAA,EAApBA,EAAsBvlI,WAAY0H,GAC/BrhF,IAAAA,cAAA,QAAMC,UAAU,oBACZD,IAAAA,cAAC65E,EAAAA,EAAa,CAACF,SAAUylI,EAAY1yL,SAASitD,SAASA,cAKvE35E,IAAAA,cAAC+lL,EAAAA,EAAe,CACZ1yK,KAAM+rM,EACNM,aAAa,WACbnsI,UAAW,MAEdgsI,EACAD,EACAE,GAEiB,EAEhC36B,EAAAx8K,UAAA,CAlLE82M,eAAcr5M,IAAAA,OAAAC,WACd08D,mBAAkB38D,IAAAA,OAElB8mI,cAAa9mI,IAAAA,KAAAC,WACbuyM,uBAAsBxyM,IAAAA,KAAAC,WACtBstI,eAAcvtI,IAAAA,KAAAC,WACdsoI,eAAcvoI,IAAAA,KAAAC,WACds7E,sBAAqBv7E,IAAAA,KAAAC,WACrBoqI,yBAAwBrqI,IAAAA,KACxB/C,QAAO+C,IAAAA,MAAA,CACH0sI,sBAAqB1sI,IAAAA,KAAAC,aAAAA,YA0K7B,UC1IA,GAAe+B,EAAAA,EAAAA,UA1Cf,WACI,MAAMod,GAAa+8C,EAAAA,EAAAA,MAEnB,MAAO,CAAC3pE,EAAoB2hC,KACxB,MAAMt/B,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnB6mN,GAAiB75L,EAAAA,EAAAA,IAA0BhtB,GACjD,IAAI8K,EAAO,KACPu8M,GAAe,EACfl9I,EAAqBxoC,EAASvN,SAAS6qK,qBAC3C,MAAM6nB,GAAcj0L,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAASvN,SAAS1Y,SASM,IAAAutE,EAI3D,OAXI69H,GAAeA,EAAY3gM,UAC3Brb,GAAO82B,EAAAA,EAAAA,IAAQ5hC,EAAO8mN,EAAY3gM,UAElC2gM,GAAeA,EAAYroN,KAC3B4oN,GAAetsE,EAAAA,EAAAA,IAAe/6I,EAAO8mN,EAAYroN,KAGjDkjC,EAASvN,SAAS8qK,eAAiB5wJ,EAAAA,GAAQzW,aAC3CsyC,GAAoE,QAA/C8e,EAAAr8D,EAAW5sB,EAAO2hC,EAASvN,SAASlZ,mBAAW,IAAA+tE,OAAA,EAA/CA,EAAiD1hF,eAAgB,IAGnF,CACHs/M,iBACA18I,qBACAmqE,cAAwC,SAAzBjyI,EAAOmyI,cACtBwrE,uBAA0D,SAAlC39M,EAAO2+M,uBAC/B8F,cACAh8M,OACAiwI,eAAgBssE,EAChBtxE,gBAAgB9qE,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYunL,gBAAiBvnL,EAAAA,GAAYwnL,2BAA6BxnL,EAAAA,GAAYynL,wBACpJhmH,uBAAuBA,EAAAA,EAAAA,IAAsB/oF,GAChD,CAET,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CAACwqI,sBAAqBA,EAAAA,IAAGn8I,GAE7D,GAEA,CAAgEwuL,E,ymBChCjD,MAAMkB,UAAwB/lL,IAAAA,cAUzCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,0BAcG,KAIhBE,KAAKgH,UAAUvF,IACJ,CAACi5K,cAAej5K,EAAUi5K,cAAgB,KACnD,IACL56K,EAAA,6BAEuB8L,IAChBA,EAAS,GACT5L,KAAKy6K,mBACT,IACH36K,EAAA,iCAa2BrD,GACxByB,EAAAA,GAA+BzB,EAAGuD,KAAKhD,MAAMi/K,0BAvC7Cj8K,KAAKpK,MAAQ,CACTsnN,UAAU,EACVC,aAAa,EACbziC,cAAe,GAGnB16K,KAAKw6J,WAAa,CACdrpB,cAAenxI,KAAKu6K,qBACpB6B,qBAAsBp8K,KAAKy6K,kBAEnC,CAiBA2iC,iBAAAA,GACI,OACI9/M,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oBACH0S,eAAe,sBAI/B,CAKA9D,MAAAA,GAAS,IAAA0iL,EACL,MAAM,KACFh1K,EAAI,iBACJkpJ,EAAgB,QAChBx+J,EAAO,gBACP6nL,EAAe,eACfv3C,EAAc,MACdjtE,EAAK,MACLw0C,EAAK,aACL8pG,EAAY,UACZnsI,GACA7wE,KAAKhD,MAET,GAAI2T,EAAK/a,QAAUixB,EAAAA,GAAM4V,aACrB,OAAOz8B,KAAKo9M,oBAGhB,IAAKvjD,EACD,OAAOv8J,IAAAA,cAAA,YAAOqT,EAAKjU,SAGvB,MAAM24D,EAAuC,iBAAX,QAAjBswH,EAAOh1K,EAAK3T,aAAK,IAAA2oL,OAAA,EAAVA,EAAYntL,MAAoBmY,EAAK3T,MAAMxE,KAAOmY,EAAKnY,KAE/E,GAAI0qL,GAAmBxlL,OAAO20C,OAAO6wI,EAAiB7tH,GAAW,CAC7D,MAAMgoJ,EAAkBn6B,EAAgB7tH,GAAUp6D,UAClD,OACIqC,IAAAA,cAAC+/M,EAAe,CACZ1sM,KAAMA,EACNg7H,eAAgBA,EAChBjtE,MAAOA,EACPw0C,MAAOA,GAGnB,CAEA,IAAIx2G,EAAUiU,EAAKjU,QACnB,MAAMgjM,GAAcC,EAAAA,EAAAA,IAAgBhvL,GACpC,GAAIg7H,GAAkB+zD,EAAa,CAC/B,MAAM+I,EAAiBvqM,EAAAA,GAAsB,CAAC7J,GAAI,oCAAqC0S,eAAgB,2BACvGrK,EAAUA,EAAQuB,OAAOwqM,EAC7B,CAEA,MAAMp0M,EAAKqqE,EAAQ,sBAAHzgE,OAAyB0S,EAAKtc,IAAE,mBAAA4J,OAAwB0S,EAAKtc,IAE7E,OACIiJ,IAAAA,cAACy/K,EAAAA,EAAQ,CACLrC,cAAe16K,KAAKpK,MAAM8kL,cAC1B5yK,KAAMpL,EACNsgN,aAAcA,EACdnsI,UAAWA,GAEXvzE,IAAAA,cAAA,OACIw1D,SAAU,EACVz+D,GAAIA,EACJkJ,UAAU,qBACVwrG,IAAI,OACJn8F,QAAS5M,KAAKk+K,0BAEd5gL,IAAAA,cAACu0M,EAAAA,EAAY,CACTn1M,QAASA,EACT89J,WAAYx6J,KAAKw6J,WACjBn/J,QAASA,EACTsV,KAAMA,EACNjB,UAAWiB,EAAKG,WAChBikM,wBAAyB/0M,KAAKhD,MAAM+3M,2BAG5Cz3M,IAAAA,cAAC2wL,EAAAA,QAAS,CACNC,cAAc,wBACdjnK,OAAQtW,EAAKtc,GACbggF,eAAgBr0E,KAAKu6K,uBAIrC,EACHz6K,EAjIoBujL,EAAe,aApBhCxpB,iBAAgBz2J,IAAAA,KAEhBuoI,eAAcvoI,IAAAA,KACds7D,MAAKt7D,IAAAA,KACLk6M,UAASl6M,IAAAA,KACTm6M,cAAan6M,IAAAA,KAEb8/K,gBAAe9/K,IAAAA,IACf64K,uBAAsB74K,IAAAA,OAAAC,WAEtBwtE,UAASztE,IAAAA,OACT2xM,wBAAuB3xM,IAAAA,OAAAtD,EASNujL,EAAe,eAGV,CAClBhoL,QAAS,CAAC,EACVqjE,OAAO,EACPwkH,gBAAiB,CAAC,EAClB85B,kBAAc1kN,ICvBtB,SAAe8M,EAAAA,EAAAA,UAXf,SAAyBxP,GACrB,MAAO,CACHikK,kBAAkB58I,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAYuvD,2BAA4B,cAAc,GACvF8wI,eAAe/2I,EAAAA,EAAAA,IAAiB5wE,GAChC0nN,WAAWrlM,EAAAA,EAAAA,GAAariB,GACxBstL,gBAAiBttL,EAAM+oE,QAAQ4lI,UAC/BrxF,OAAOC,EAAAA,EAAAA,IAASv9G,GAChBqmL,wBAAwBr5J,EAAAA,EAAAA,IAA0BhtB,GAE1D,GAEA,CAAwCytL,E,yiBCEzB,MAAMtG,UAAiBz/K,IAAAA,cAKlCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,uBAiCCrD,IACdA,EAAEyK,iBACFzK,EAAEy0D,kBACFlxD,KAAKgH,UAAUvF,IACJ,CACH+7M,aAAc/7M,EAAU+7M,eAE9B,IACL19M,EAAA,0BAEmB,KACZE,KAAKy9M,aACLzuM,OAAOi0H,qBAAqBjjI,KAAKy9M,aAErCz9M,KAAKy9M,YAAczuM,OAAO22F,uBAAsB,KAC5C,IAAI+3G,GAAa,EAEb19M,KAAK29M,cAAc5tM,SAAW/P,KAAK29M,cAAc5tM,QAAQw4F,aAAevoG,KAAK6wE,YAC7E6sI,GAAa,GAGbA,IAAe19M,KAAKpK,MAAM8nN,YAC1B19M,KAAKgH,SAAS,CACV02M,cAER,GACF,IACL59M,EAAA,qBAEc,KACXE,KAAK49M,mBAAmB,IA9DxB59M,KAAK6wE,UAAY7wE,KAAKhD,MAAM6zE,WA3BZ,IA4BhB7wE,KAAK29M,cAAgBrgN,IAAAA,YACrB0C,KAAKpK,MAAQ,CACT4nN,aAAa,EACbE,YAAY,EAEpB,CAEAnlK,iBAAAA,GACIv4C,KAAK49M,oBAEL5uM,OAAO6rD,iBAAiB,SAAU76D,KAAKwpD,aAC3C,CAEA/Q,kBAAAA,CAAmBC,GAEX14C,KAAKhD,MAAM8K,OAAS4wC,EAAU5wC,MAC9B9H,KAAKhD,MAAMugN,gBAAkB7kK,EAAU6kK,eACvCv9M,KAAKhD,MAAMsgN,YAAc5kK,EAAU4kK,WACnCt9M,KAAKhD,MAAM09K,gBAAkBhiI,EAAUgiI,eAEvC16K,KAAK49M,mBAEb,CAEAtgJ,oBAAAA,GACItuD,OAAO+rD,oBAAoB,SAAU/6D,KAAKwpD,cACtCxpD,KAAKy9M,aACLzuM,OAAOi0H,qBAAqBjjI,KAAKy9M,YAEzC,CAmCAx6M,MAAAA,GACI,MAAM,YACFu6M,EAAW,WACXE,GACA19M,KAAKpK,OAEH,SACF+7D,EAAQ,iBACRqrH,EAAgB,eAChBrxC,EAAc,aACdqxE,GACAh9M,KAAKhD,MAET,IACI6gN,EADAtgN,EAAY,eAEZigN,GACAK,EAA0B79M,KAAK6wE,UAC/BtzE,GAAa,4BAEbA,GAAa,0BAGjB,MAAMugN,EAAwB9gC,EAAmB,sCAAwC,2BAEzF,IAAI+gC,EAAyB,KAC7B,GAAIL,EAAY,EACP1gC,GAAoBwgC,GAAe7xE,GAChCkyE,IACAA,GAvHmB,IA2H3B,IAAIG,EAAW,iBACXC,EACA3gN,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,cAGnBy2M,IACAQ,EAAW,mBACXC,EACI3gN,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,eAKtB,aADGi2M,GAEJe,EACIzgN,IAAAA,cAAA,UACIjJ,GAAG,iBACHkJ,UAAU,sDACVqP,QAAS5M,KAAKk+M,gBAEbD,GAGT1gN,GAAa,oCAIbwgN,EACIzgN,IAAAA,cAAA,OAAKC,UAAU,iBACXD,IAAAA,cAAA,OAAKC,UAAWugN,GACZxgN,IAAAA,cAAA,OAAKC,UAAU,kCACfD,IAAAA,cAAA,UACIjJ,GAAG,iBACHkJ,UAAU,kCACVqP,QAAS5M,KAAKk+M,gBAEd5gN,IAAAA,cAAA,QAAMC,UAAWygN,IAChBC,GAEL3gN,IAAAA,cAAA,OAAKC,UAAU,oCAI3BA,GAAa,0BAGrB,CAEA,OACID,IAAAA,cAAA,OAAKC,UAAWA,GACZD,IAAAA,cAAA,OACIoN,MAAO,CAACmmE,UAAWgtI,GACnBtgN,UAAU,+BACV26C,IAAKl4C,KAAK29M,eAEThsJ,GAEJosJ,EAGb,EACHj+M,EAzKoBi9K,EAAQ,aAhBzBprH,SAAQvuD,IAAAA,KACRs3K,cAAat3K,IAAAA,OACb45K,iBAAgB55K,IAAAA,KAChBm6M,cAAan6M,IAAAA,KAAAC,WACbi6M,UAASl6M,IAAAA,KAAAC,WACTyE,KAAI1E,IAAAA,OACJuoI,eAAcvoI,IAAAA,KAAAC,WACd25M,aAAY55M,IAAAA,MAAA,CAbyB,aAcrCytE,UAASztE,IAAAA,SCGb,SAAegC,EAAAA,EAAAA,UARf,SAAyBxP,GACrB,MAAO,CACH2nN,eAAe/2I,EAAAA,EAAAA,IAAiB5wE,GAChC0nN,WAAWrlM,EAAAA,EAAAA,GAAariB,GACxB+1I,gBAAgB9qE,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYunL,gBAAiBvnL,EAAAA,GAAYwnL,2BAA6BxnL,EAAAA,GAAYynL,wBAE5J,GAEA,CAAwC5nB,E,2DCZxC,MAMA,EANqB//K,GACTM,IAAAA,cAAA,KAAGC,UAAU,iCAChBP,EAAM20D,S,4TCeR,MAAMwsJ,EAA0B,IAI1BC,EAAyC,KAEtD,SAASC,EAAmBrhN,GACxB,MAAOshN,EAAYC,IAAiB1nM,EAAAA,EAAAA,WAAS,GACvCljB,GAAWsxD,EAAAA,EAAAA,gBACjBvC,EAAAA,EAAAA,YAAU,MAID1lD,EAAMwhN,YAAcxhN,EAAMmM,MAC3BnM,EAAMyhN,YACV,GACD,CAACzhN,EAAMmM,KAAMnM,EAAMwhN,cAEtB97J,EAAAA,EAAAA,YAAU,KACF47J,GAGCthN,EAAMwhN,YAGXj2L,YAAW,KACPg2L,GAAc,GAGdh2L,YAAW,KACP50B,EAAS,CAAC6E,KAAMuhC,EAAAA,GAAa2kL,yBAA0BzvM,MAAM,GAAO,GA7BxD,IA8BO,GACxBkvM,EAAwB,GAC5B,CAACG,EAAYthN,EAAMwhN,aAEtB,IAAIG,EAAY,0BACX3hN,EAAMwhN,aACPG,GAAa,4CAEjB,MAAMl/M,EACFnC,IAAAA,cAAA,OAAKC,UAAWohN,GACZrhN,IAAAA,cAAA,OAAKC,UAAU,+BACXD,IAAAA,cAAA,OACIuO,IAAK+yM,KAGbthN,IAAAA,cAACsN,EAAAA,EAAK,KACFtN,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8CACH0S,eAAe,kCAGvBzJ,IAAAA,cAAC+8E,EAAAA,EAAW,KACR/8E,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oDACH0S,eAAe,iCAM/B,IAAI2yF,EAAU,KAuCd,OArCIA,EADA18F,EAAMwhN,WAEFlhN,IAAAA,cAACsvD,EAAAA,EAAa,CACV3hD,GAAIjO,EAAMmM,OAASm1M,EACnB9rL,QAjEY,IAkEZiiB,WAAY,sCACZmrH,MAAM,EACN3mG,OAAO,EACPgvE,cAAc,EACdC,eAAe,GAEf5qI,IAAAA,cAAA,OACIC,UAAU,2CACVmN,MAAO,CACH3L,OAAQ/B,EAAM+B,SAGlBzB,IAAAA,cAAA,OAAKC,UAAU,6CACXD,IAAAA,cAACuhN,EAAAA,EAAO,OAEXp/M,IAOTnC,IAAAA,cAACsvD,EAAAA,EAAa,CACV3hD,GAAIjO,EAAMmM,KACVqpB,QAASssL,EAAAA,GAAWC,WACpBtqK,YAAYuqK,EAAAA,EAAAA,IAA0B,qBAAsBhiN,EAAMiiN,qBAClEh3E,cAAc,EACdC,eAAe,GAEdzoI,GAINi6F,CACX,CAAC2kH,EAAA14M,UAAA,CA3GG64M,WAAUp7M,IAAAA,KACVrE,OAAMqE,IAAAA,QA4GV,S,oIC9HO,MAAM87M,EAAc,CACvBC,aAAc,eACdC,QAAS,UACTC,cAAe,gBACfhB,mBAAoB,sBAGXS,EAAa,CACtBC,WAAY,IACZO,QAAS,CACLC,gBAAiB,kBACjBC,eAAgB,iBAChBC,aAAc,eACdC,YAAa,gBAId,SAASC,EAAkB30C,GAC9B,OAAQA,GACR,KAAKk0C,EAAYC,aACb,MAAO,qCACX,KAAKD,EAAYE,QACb,MAAO,gCACX,KAAKF,EAAYG,cACb,MAAO,uCACX,KAAKH,EAAYb,mBACb,MAAO,0CACX,QACI,MAAO,gCAEf,CAEO,SAASuB,EAAkB50C,GAC9B,OAAQA,GACR,KAAKk0C,EAAYC,aACb,MAAO,yCACX,KAAKD,EAAYE,QACb,MAAO,oCACX,KAAKF,EAAYG,cACb,MAAO,2CACX,KAAKH,EAAYb,mBACb,MAAO,8CACX,QACI,MAAO,oCAEf,CAEO,SAASwB,EAAkB70C,GAC9B,OAAQA,GACR,KAAKk0C,EAAYC,aACb,MAAO,yCACX,KAAKD,EAAYE,QACb,MAAO,oCACX,KAAKF,EAAYG,cACb,MAAO,2CACX,KAAKH,EAAYb,mBACb,MAAO,8CACX,QACI,MAAO,oCAEf,CAEO,SAASyB,EAAoB90C,GAChC,OAAQA,GACR,KAAKk0C,EAAYC,aACb,MAAO,4CACX,KAAKD,EAAYE,QACb,MAAO,uCACX,KAAKF,EAAYG,cACb,MAAO,8CACX,KAAKH,EAAYb,mBACb,MAAO,iDACX,QACI,MAAO,uCAEf,CAEO,SAAS0B,EAAkB/0C,GAC9B,OAAQA,GACR,KAAKk0C,EAAYC,aACb,MAAO,qCACX,KAAKD,EAAYE,QACb,MAAO,gCACX,KAAKF,EAAYG,cACb,MAAO,uCACX,KAAKH,EAAYb,mBACb,MAAO,0CACX,QACI,MAAO,gCAEf,CAMO,SAASW,EAA0BgB,EAAqBC,GAC3D,OAAQA,GACR,KAAKnB,EAAWQ,QAAQG,aACpB,MAAO,GAAPxhN,OAAU+hN,EAAW,oBACzB,KAAKlB,EAAWQ,QAAQI,YACpB,MAAO,GAAPzhN,OAAU+hN,EAAW,mBACzB,KAAKlB,EAAWQ,QAAQE,eACpB,MAAO,GAAPvhN,OAAU+hN,EAAW,sBACzB,KAAKlB,EAAWQ,QAAQC,gBAExB,QACI,MAAO,GAAPthN,OAAU+hN,EAAW,uBAE7B,CAKO,MAAME,EAAuC,CAChDC,OAAQ,SACRC,OAAQ,8CACRC,KAAM,OACNC,KAAM,OACNC,WAAY,gCAkCHC,GAAYC,EAAAA,EAAAA,GAAW,CAChCC,aAAc,GACdC,iBAAkB,KAClBC,YAAY,EACZC,QAAS,CACLC,QAAQ,EACRC,WAAW,EACX5+L,UAAU,GAEdw8C,QAAS,CACLwhJ,QAAQ,EACRC,QAAQ,EACRC,MAAM,EACNC,MAAM,EACNC,YAAY,EAGZS,SAAS,GAEb9/M,QAAS,CACLzD,KAAM,GACNujN,SAAS,GAEb1hL,YAAa,CACTktH,SAAU,GACVy0D,QAAS,GACTD,SAAS,I,2DC9KjB,MAMA,EANehkN,GACHM,IAAAA,cAAA,MAAIC,UAAU,2BACjBP,EAAM20D,S,uQCgBf,MAAMuvJ,EAAkB/hK,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,mBAAVq7C,CAAU,qCACbniD,GAAUA,EAAMmkN,UAC3BnkN,GAAUA,EAAM2vD,QAG1B,SAASy0J,EAAUpkN,GACf,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WAClB60E,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,IACtB5gF,GAAekhC,EAAAA,EAAAA,aAAYshD,EAAAA,IAC3BnrE,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtB42L,EAAkD,SAApB72L,EAAQ82L,QAE5C,IAAIx5M,EAAO9K,EAAM8K,KAUjB,OARI9K,EAAMukN,wBAA2B51H,GAA2C,UAAhCx4E,aAAY,EAAZA,EAAc+5E,gBAA6Bm0H,KAKvFv5M,EAAOhB,EAAc,CAACzS,GAAI,qCAAsC0S,eAAgB,6BAA8B,CAAC0nD,KAJvFrtD,KAAKinD,KACzB8kC,EAAAA,EAAAA,IAAoCk0H,EAA8B95J,SAAS/8B,EAAQunE,UAAW,IAAM5+E,aAAY,EAAZA,EAAcu5E,cAClHxB,EAAAA,GAAgBkC,kBAMpB9vF,IAAAA,cAAC4jN,EAAe,CACZ3jN,UAAU,YACV4jN,QAASnkN,EAAMmkN,QACfx0J,MAAO3vD,EAAM2vD,OAEZ3vD,EAAMwkN,SACN15M,EACA9K,EAAMykN,UAGnB,CAACL,EAAAz7M,UAAA,CA9CGmC,KAAI1E,IAAAA,OAAAC,WACJ89M,QAAO/9M,IAAAA,OAAAC,WACPspD,MAAKvpD,IAAAA,OAAAC,WACLm+M,SAAQp+M,IAAAA,QAAAC,WACRo+M,UAASr+M,IAAAA,QACTm+M,sBAAqBn+M,IAAAA,MA2CzB,U,eC1De,SAASs+M,IACpB,OACIpkN,IAAAA,cAAA,OACIqO,MAAM,KACNC,OAAO,KACP6xC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENrgD,IAAAA,cAAA,QACI4gD,EAAE,+lBACFR,KAAK,YAIrB,C,8CCfA,MAqgBA,EArgBuBikK,IAEfrkN,IAAAA,cAAA,OACIqO,MAAM,MACNC,OAAO,MACP6xC,QAAQ,cACRC,KAAK,OACLC,MAAM,6BACNC,WAAW,gCAEXtgD,IAAAA,cAAA,KAAGuiH,SAAS,yBACRviH,IAAAA,cAAA,QACIuhD,QAAQ,OACRC,SAAS,UACTC,SAAS,UACTb,EAAE,qaACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,iuBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kXACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2kBACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4kBACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+kBACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+hBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,+ZACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,+MACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+MACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,kBAEHsqD,UAAU,iBACV1nB,EAAE,KACFsnB,EAAE,IACF5yC,MAAM,MACNC,OAAO,OAEPtO,IAAAA,cAAA,QACI4gD,EAAE,+MACFR,KAAK,aAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,yBACJthD,IAAAA,cAAA,QACI4gD,EAAE,mZACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mZACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,aACFsnB,EAAE,WACF5yC,MAAM,UACNC,OAAO,SACP8xC,KAAK,oBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,qvDACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wkBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,glBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,uzBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+MACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,m5EACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIjJ,GAAG,kBACHsqD,UAAU,iBACV1nB,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,OAEPtO,IAAAA,cAAA,QACI4gD,EAAE,m5EACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,yBACJthD,IAAAA,cAAA,QACI25B,EAAE,aACFsnB,EAAE,WACF5yC,MAAM,UACNC,OAAO,UACP8xC,KAAK,iBACLO,YAAY,UAGpB3gD,IAAAA,cAAA,QACI4gD,EAAE,kyBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2NACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4mBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gWACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kUACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iaACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIjJ,GAAG,kBACHsqD,UAAU,iBACV1nB,EAAE,KACFsnB,EAAE,IACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,uzBACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,yBACJthD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,YACFsnB,EAAE,WACF5yC,MAAM,UACNC,OAAO,UACP8xC,KAAK,oBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,uTACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,uZACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,kBACHsqD,UAAU,iBACV1nB,EAAE,MACFsnB,EAAE,KACF5yC,MAAM,MACNC,OAAO,OAEPtO,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,yBACJthD,IAAAA,cAAA,QACI4gD,EAAE,8PACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8PACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,kBACHsqD,UAAU,iBACV1nB,EAAE,MACFsnB,EAAE,MACF5yC,MAAM,MACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,8PACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,yBACJthD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,SACF5yC,MAAM,UACNC,OAAO,UACP8xC,KAAK,iBACLO,YAAY,UAGpB3gD,IAAAA,cAAA,QACI4gD,EAAE,gTACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIjJ,GAAG,kBAEHsqD,UAAU,iBACV1nB,EAAE,MACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,gTACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,yBACJthD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,SACP8xC,KAAK,oBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,wfACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kOACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8kBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIjJ,GAAG,kBACHsqD,UAAU,iBACV1nB,EAAE,MACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,8kBACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,yBACJthD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,SACF5yC,MAAM,UACNC,OAAO,SACP8xC,KAAK,oBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,6mBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8aACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+TACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wbACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,aAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,8WACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kFACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kXACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,uiCACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,aAGbpgD,IAAAA,cAAA,YACIA,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,oBACVjiE,UAAU,kCAGlB1gD,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,oBACVjiE,UAAU,kCAGlB1gD,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,oBACVjiE,UAAU,iCAGlB1gD,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,oBACVjiE,UAAU,kCAGlB1gD,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,oBACVjiE,UAAU,kCAGlB1gD,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,oBACVjiE,UAAU,kCAGlB1gD,IAAAA,cAAA,YAAUjJ,GAAG,mBACTiJ,IAAAA,cAAA,QACIqO,MAAM,MACNC,OAAO,MACP8xC,KAAK,WAGbpgD,IAAAA,cAAA,SACIjJ,GAAG,mBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,uuuEAEd3iH,IAAAA,cAAA,SACIjJ,GAAG,mBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,+1jBAEd3iH,IAAAA,cAAA,SACIjJ,GAAG,mBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,264BAEd3iH,IAAAA,cAAA,SACIjJ,GAAG,mBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,2w2EAEd3iH,IAAAA,cAAA,SACIjJ,GAAG,mBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,mumCAEd3iH,IAAAA,cAAA,SACIjJ,GAAG,mBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,i+rCC7c9B,EAhDA,WACI,OACI3iH,IAAAA,cAAA,OACIqO,MAAM,KACNC,OAAO,KACP6xC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENrgD,IAAAA,cAAA,KAAGuiH,SAAS,yBACRviH,IAAAA,cAAA,QACI4gD,EAAE,wZACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6zFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2OACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4vHACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6CACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kfACFR,KAAK,aAGbpgD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,mBACTiJ,IAAAA,cAAA,QACIqO,MAAM,KACNC,OAAO,KACP8xC,KAAK,YAM7B,EC8DA,EA5GA,WACI,OACIpgD,IAAAA,cAAA,OACIqO,MAAM,KACNC,OAAO,KACP6xC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENrgD,IAAAA,cAAA,UACIugD,GAAG,KACHC,GAAG,KACHC,EAAE,KACFL,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0CACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+DACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oGACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4VACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mWACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gaACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wUACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gWACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iZACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gFACFR,KAAK,YAKrB,EC7FO,IAAKkkK,EAAuB,SAAvBA,GAAuB,OAAvBA,EAAuB,gBAAvBA,EAAuB,gBAAvBA,EAAuB,kBAAvBA,EAAuB,sBAAvBA,EAAuB,cAAvBA,CAAuB,MA+CnC,MAAMC,EAAY1iK,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,aAAVq7C,CAAU,2BACPniD,GAAUA,EAAMmkN,UAG9B,SAASW,IACZ,MAAM,cAACh7M,IAAiBgQ,EAAAA,EAAAA,YACjB,CAAE4nG,IAAoBjwB,EAAAA,EAAAA,KAE7B,OACInxF,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,OAAKC,UAAU,SACXD,IAAAA,cAACqkN,EAAc,OAGnBrkN,IAAAA,cAAA,OAAKC,UAAU,eACXD,IAAAA,cAAA,OAAKC,UAAU,SACXD,IAAAA,cAAA,QAAMC,UAAU,aACXuJ,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,gBAEnEzJ,IAAAA,cAAA,QAAMC,UAAU,WACZD,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,sBACTgkC,KAAMirE,GAEL53G,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,kBAI5EzJ,IAAAA,cAAA,OAAKC,UAAU,WACVuJ,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,mGAGvEzJ,IAAAA,cAAA,WACAA,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,QAAMC,UAAU,cACXuJ,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,iCAEjFzJ,IAAAA,cAAA,QAAMC,UAAU,SACZD,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,sBACTgkC,KAAMsuK,EAAAA,GAAoBC,UAEzBl7M,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,kBAMxF,CAuHA,QArHA,SAAc/J,GAAkB,IAAAilN,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC5B,MAAM,cAACx7M,IAAiBgQ,EAAAA,EAAAA,WAClByrM,EAAkB9tK,IAAW,SAAU,CACzC+tK,cAAexlN,EAAM2uF,UAGnB82H,EAA2BhuK,IAAW,oBAAqB,CAC7DiuK,2BAA4B1lN,EAAM2uF,UAGhCg3H,EAA+BluK,IAAW,wBAAyB,kCAEnEmuK,EAAgCnuK,IAAW,0BAA2B,qCAEtEouK,EAAyBpuK,IAAW,kBAAmB,6BAEvDquK,EAAuBruK,IAAW,eAAgB,0BAExD,OACIn3C,IAAAA,cAAA,OACIjJ,GAAI2I,EAAM3I,GACVkJ,UAAU,YAETP,EAAM+lN,WACL/lN,EAAM2uF,SACJruF,IAAAA,cAACukN,EAAS,CACNtkN,UAAU,MACV4jN,QAASnkN,EAAMgmN,WAIvB1lN,IAAAA,cAAA,OAAKC,UAAWglN,GACZjlN,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,OAAKC,UAAWqlN,GACZtlN,IAAAA,cAAA,UAAKN,EAAMimN,MACX3lN,IAAAA,cAAA,SAAIN,EAAMkmN,aACTlmN,EAAMmmN,MAAQ7lN,IAAAA,cAAA,UAAKN,EAAMmmN,OAAc7lN,IAAAA,cAAA,OAAKC,UAAWulN,GAAsBxlN,IAAAA,cAAC8lN,EAAW,OAC1F9lN,IAAAA,cAAA,QAAMC,UAAU,aAAaP,EAAMqmN,OAGvC/lN,IAAAA,cAAA,OAAKC,UAAWslN,GACX7lN,EAAMsmN,sBAGXhmN,IAAAA,cAAA,OAAKC,UAAU,gBACVP,EAAMumN,qBACHjmN,IAAAA,cAAA,UACIjJ,GAAI2I,EAAM3I,GAAK,UACfkJ,UAAS,mBAAAU,OAAwC,QAAnBgkN,EAAAjlN,EAAMwmN,qBAAa,IAAAvB,GAAnBA,EAAqBt9M,SAAWi9M,EAAwB6B,OAA4B,QAAtBvB,EAAGllN,EAAMwmN,qBAAa,IAAAtB,OAAA,EAAnBA,EAAqBwB,aACpH/+M,SAA6B,QAArBw9M,EAAEnlN,EAAMwmN,qBAAa,IAAArB,OAAA,EAAnBA,EAAqBx9M,SAC/BiI,QAA4B,QAArBw1M,EAAEplN,EAAMwmN,qBAAa,IAAApB,OAAA,EAAnBA,EAAqB/qM,QAEV,QAFiBgrM,EAEpCrlN,EAAMwmN,qBAAa,IAAAnB,OAAA,EAAnBA,EAAqBv6M,OAKlCxK,IAAAA,cAAA,OAAKC,UAAWklN,GACXzlN,EAAM2mN,iBACHrmN,IAAAA,cAAA,WACIA,IAAAA,cAAA,SAAIwJ,EAAc,CAACzS,GAAI,mBAAoB0S,eAAgB,QAC1D/J,EAAM2mN,kBAInBrmN,IAAAA,cAAA,OAAKC,UAAU,iBACVP,EAAM4mN,oBACPtmN,IAAAA,cAAA,OAAKC,UAAWolN,GACZrlN,IAAAA,cAAA,QAAMC,UAAU,SAASP,EAAM6mN,SAASr4M,OACnB,QADgC82M,EACpDtlN,EAAM6mN,SAAS96M,aAAK,IAAAu5M,OAAA,EAApBA,EAAsB3hN,KAAK++B,GAEpBpiC,IAAAA,cAAA,OACIC,UAAU,OACVvC,IAAK0kC,GAELpiC,IAAAA,cAAA,KAAGC,UAAU,wBAAuBD,IAAAA,cAAA,SAAIoiC,SAQ/D1iC,EAAM8mN,gBACHxmN,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,OAAKC,UAAU,gBAAeD,IAAAA,cAACymN,EAAO,OACtCzmN,IAAAA,cAAA,MAAIC,UAAU,SAASP,EAAM8mN,eAAet4M,OAC3CxO,EAAM8mN,eAAe/6M,MAAMpI,KAAK++B,IAAM,IAAAskL,EACnC,OACI1mN,IAAAA,cAAA,OACIC,UAAU,OACVvC,IAAK0kC,EAAEl0B,OAEPlO,IAAAA,cAAA,OAAKC,UAAU,cAAaD,IAAAA,cAAA,KAAGC,UAAU,8BAA6BD,IAAAA,cAAA,SAAIoiC,EAAEl0B,QACpE,QADoFw4M,EAC3FtkL,EAAE32B,aAAK,IAAAi7M,OAAA,EAAPA,EAASrjN,KAAKsjN,GAEP3mN,IAAAA,cAAA,OACIC,UAAU,UACVvC,IAAKipN,GAEL3mN,IAAAA,cAAA,OAAKC,UAAU,iBAAgBD,IAAAA,cAAA,KAAGC,UAAU,8BAA6BD,IAAAA,cAAA,SAAI2mN,OAKvF,MAUtC,EChMA,SAASC,EAAQlnN,GACb,MAAM,cAAC8J,EAAa,aAAEiuG,IAAgBj+F,EAAAA,EAAAA,WAEhCmyE,GAAU50C,EAAAA,EAAAA,aAAY7T,EAAAA,IAEtBrtB,GAAekhC,EAAAA,EAAAA,aAAYshD,EAAAA,IAC3BwuH,GAAiB9vK,EAAAA,EAAAA,aAAY80C,EAAAA,IAC7B91E,GAAWghC,EAAAA,EAAAA,aAAY+vK,EAAAA,IAEvBC,GAAiBC,EAAAA,EAAAA,IAAuBjxM,GAAY,CAAC,GAErDkxM,GAA+BJ,aAAc,EAAdA,EAAgBK,sBAAuBC,EAAAA,GAAmBC,MACzFC,GAAeR,aAAc,EAAdA,EAAgB96H,OAAQC,EAAAA,GAAcs7H,WACrDC,EAAoD,UAAhC1xM,aAAY,EAAZA,EAAc+5E,eAClC43H,GAA4BC,EAAAA,EAAAA,IAAiBV,EAAgB/6H,EAAAA,GAAc07H,cAC3EC,EAAoBlwG,IAAc+vG,aAAyB,EAAzBA,EAA2BI,iBAAkB,GAAK,GAAI,CAACC,sBAAuB,IAEhHC,GAAiBjB,aAAc,EAAdA,EAAgB96H,OAAQC,EAAAA,GAAc07H,aACvDK,EAA2Cd,GAAgCa,EAE3EE,EAA4C,KAA/BnyM,aAAY,EAAZA,EAAcu5E,cAEjC,IAAI64H,GAAc,EACbpyM,GAAgBA,EAAau5E,aAAe,IAAOm4H,GAAqBF,IACzEY,GAAc,GAGlB,MAAOC,EAA8BC,EAAiCC,IAAiC98C,EAAAA,EAAAA,GAAe,CAClHxgF,QAASthF,EAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,6BAChFgiK,YACIzrK,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,KAAGC,UAAU,oBACZuJ,EAAc,CAACzS,GAAI,2CAA4C0S,eAAgB,mBAEzF,CACC4+M,iBAAkBxuD,EAAAA,GAAmByuD,wBACrCC,cAAevuD,EAAAA,GAAYwuD,WAC3BC,mBAAoBT,IAWlBU,EANSl/M,EADPu+M,EACqB,CAAChxN,GAAI,qCAAsC0S,eAAgB,4BAG/D,CAAC1S,GAAI,6BAA8B0S,eAAgB,cAKrEynF,IAAoBC,EAAAA,EAAAA,KAmD3B,OACInxF,IAAAA,cAAA,OAAKC,UAAU,WACXD,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACjN,UAAU,wBACpBD,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,SACTuJ,EAAc,CAACzS,GAAI,sBAAuB0S,eAAgB,mBAE/DzJ,IAAAA,cAAA,WAAMwJ,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,mCAEvEzJ,IAAAA,cAAA,UACIjJ,GAAG,YACHkJ,UAAU,QACV,aAAW,QACXiO,MAAM,QACNoB,QAAS5P,EAAMiN,QAEf3M,IAAAA,cAAA,QAAM,cAAY,QAAQ,OAGlCA,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,OACIC,UAAU,qBACVmN,MAAO,CAAC+5G,UAAW,SAElB2gG,GACD9nN,IAAAA,cAAC2oN,EAAI,CACD5xN,GAAG,eACH2uN,SAAS,yBACTC,KAAK,eACLC,YAAap8M,EAAc,CAACzS,GAAI,yCAA0C0S,eAAgB,6CAA8C,CACpI4pM,GAAIrzM,IAAAA,cAAA,aAER6lN,MAAK,IAAAllN,OAAMgnN,GACX5B,KAAMv8M,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,mDAAoD,CAC5H4pM,GAAIrzM,IAAAA,cAAA,WACJsS,EAAIuwC,GACA7iD,IAAAA,cAAA,QAAMC,UAAU,mBACX4iD,KAIbwrC,SAAS,EACTo3H,UAAWqC,EACP9nN,IAAAA,cAAC8jN,EAAS,CACNt5M,KAlDbhB,EADPs+M,IAAmBn8H,EACE,CAAC50F,GAAI,sCAAuC0S,eAAgB,gBAGhE,CAAC1S,GAAI,6CAA8C0S,eAAgB,iCAgDhE4lD,MAAM,6BACNw0J,QAAQ,2BACRK,SAAUlkN,IAAAA,cAACokN,EAAY,aACrBppN,EACVkrN,cAjGT,CACHnsM,OAAQA,OACRvP,KAAMk+M,EACNrhN,UAAU,EACV++M,YAAc6B,EAAe3D,EAAwBsE,QAAUtE,EAAwB/uM,QA8F3EgxM,SAAU,CACNr4M,MAAO1E,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,mCACnFgC,MAAO,CACHjC,EAAc,CAACzS,GAAI,qEAAsE0S,eAAgB,2CACzGD,EAAc,CAACzS,GAAI,qDAAsD0S,eAAgB,oBACzFD,EAAc,CAACzS,GAAI,uDAAwD0S,eAAgB,oDAC3FD,EAAc,CAACzS,GAAI,oDAAqD0S,eAAgB,0DACxFD,EAAc,CAACzS,GAAI,sDAAuD0S,eAAgB,mDAC1FD,EAAc,CAACzS,GAAI,wDAAyD0S,eAAgB,0CAKxGzJ,IAAAA,cAAC2oN,EAAI,CACD5xN,GAAG,aACH2uN,SAAS,UACTC,KAAK,aACLC,YAAap8M,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,6DACxF4kF,SAAS,EACTo3H,UACI4B,EACIrnN,IAAAA,cAAC8jN,EAAS,CACNt5M,KAAMhB,EAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,iBAChF4lD,MAAM,6BACNw0J,QAAQ,2BACRK,SAAUlkN,IAAAA,cAACokN,EAAY,MACvBH,uBAAuB,SACrBjpN,EACdkrN,cAtHS2C,MACzB,GAAIl9H,EACA,MAAO,CACH5xE,OAAQA,MACJxb,EAAAA,EAAAA,IAAWwvF,EAAAA,GAAqB4yB,cAAe,kCAC/CzvB,GAAkB,EAEtB1mF,KAAMhB,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,kBAC3E28M,YAAa9B,EAAwBsE,SAI7C,IAAIE,EAAgBxE,EAAwBsE,QAU5C,OARIE,EADAb,EACgB3D,EAAwBsE,QAExBtE,EAAwB/uM,OAGxC6yM,IAAkCzpG,EAAAA,EAAaG,UAC/CgqG,EAAgBxE,EAAwByE,OAErC,CACHhvM,OAAS5a,IACLgpN,EAAgChpN,EAAG,qCAAqC,EAE5EqL,KAAM09M,EACN7gN,SAAUggN,EACVjB,YAAa0C,EAChB,EAyF8BD,GACfvC,yBAAqBtrN,EACrBurN,SAAU,CACNr4M,MAAO1E,EAAc,CAACzS,GAAI,2CAA4C0S,eAAgB,8BACtFgC,MAAO,CACHjC,EAAc,CAACzS,GAAI,8CAA+C0S,eAAgB,uBAClFD,EAAc,CAACzS,GAAI,wDAAyD0S,eAAgB,mCAC5FD,EAAc,CAACzS,GAAI,iEAAkE0S,eAAgB,mCACrGD,EAAc,CAACzS,GAAI,mDAAoD0S,eAAgB,4DACvFD,EAAc,CAACzS,GAAI,4DAA6D0S,eAAgB,mCAGxG+8M,eAAgB,CACZt4M,MAAO1E,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,sBACxEgC,MAAO,CACH,CAACyC,MAAO1E,EAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,qBAClF,CAACyE,MAAO1E,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,2BACnF,CAACyE,MAAO,kBACR,CAACA,MAAO1E,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,8BAC7E,CAACyE,MAAO1E,EAAc,CAACzS,GAAI,2CAA4C0S,eAAgB,uDACvF,CAACyE,MAAO1E,EAAc,CAACzS,GAAI,2CAA4C0S,eAAgB,kCACvF,CAACyE,MAAO1E,EAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,wBAC/E,CAACyE,MAAO1E,EAAc,CAACzS,GAAI,2CAA4C0S,eAAgB,+BACvF,CAACyE,MAAO1E,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,8BAI/FzJ,IAAAA,cAACwkN,EAAS,QAK9B,CAACoC,EAAAv+M,UAAA,CA1NGsE,OAAM7G,IAAAA,KAAAC,WAIN86G,UAAS/6G,IAAAA,QAwNb,U,kEC3OA,MAAMkjN,EAAUnnK,IAAAA,EAAQC,WAAA,CAAAt7C,YAAA,WAARq7C,CAAQ,8JAmCxB,EAxBA,WACI,MAAM,cAACr4C,IAAiBgQ,EAAAA,EAAAA,YACjBumF,IAAiB5O,EAAAA,EAAAA,KAElB9C,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,IAE5B,OACIz2F,IAAAA,cAACgpN,EAAO,CACJjyN,GAAG,sBACHuY,QAAUnQ,IACNA,EAAEyK,iBACEykF,GACA9vF,EAAAA,EAAAA,IAAWwvF,EAAAA,GAAqB4yB,cAAe,mCAE/CpiH,EAAAA,EAAAA,IAAW,sBAAuB,kCAEtCwhG,GAAe,GAGlBv2F,EAAc,CAACzS,GAAI,yCAA0C0S,eAAgB,kBAG1F,ECtCMw/M,EAAgBpnK,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,iBAAXq7C,CAAW,oKAU3BspH,EAAOtpH,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,QAAXq7C,CAAW,sBAgCxB,EA5BA,WACI,MAAM,cAACr4C,IAAiBgQ,EAAAA,EAAAA,WAElBpa,EAAUoK,EAAc,CAC1BzS,GAAI,uCACJ0S,eAAgB,8NACjB,CACCy/M,KAAOrmK,GAAoD7iD,IAAAA,cAACmrK,EAAI,KAAEtoH,GAClEsmK,cAAgBx5M,GACZ3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAMmrE,EAAAA,GAAa8nG,oCACnBj3M,SAAS,uBAERxC,GAGT05M,YAAc15M,GACV3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAMoC,EAAAA,GAAWG,eACjBvmC,SAAS,uBAERxC,KAIb,OAAQ3P,IAAAA,cAACipN,EAAa,KAAE7pN,EAC5B,ECZA,SAASkqN,EAAkB5pN,GACvB,MAAOioN,EAAmB4B,IAAwBhwM,EAAAA,EAAAA,UAAS,MC5BhD,WACX,MAAMw3E,GAAgBh6C,EAAAA,EAAAA,aAAY7T,EAAAA,IAC5B7sC,GAAWsxD,EAAAA,EAAAA,gBACV6hK,EAAWC,IAAgBlwM,EAAAA,EAAAA,WAAS,GACrCmwM,EAAUtpN,OAAO+I,MAAK4tC,EAAAA,EAAAA,aAAYt3B,EAAAA,KAAYrW,OAAS,GAE7Dg8C,EAAAA,EAAAA,YAAU,MACF2rC,GAAkBy4H,GAAcE,IAChCrzN,GAASszN,EAAAA,EAAAA,OACTF,GAAa,GACjB,GACD,CAAC14H,EAAey4H,EAAWE,GAClC,CDiBIE,GACA,MAAM,cAACpgN,IAAiBgQ,EAAAA,EAAAA,WAClBnjB,GAAWsxD,EAAAA,EAAAA,gBACVo4C,IAAiB5O,EAAAA,EAAAA,MAExB/rC,EAAAA,EAAAA,YAAU,KACN/uD,GAASwzN,EAAAA,EAAAA,MAAsB,GAChC,KAEHzkK,EAAAA,EAAAA,YAAU,MACN7uD,iBACI,IACI,MACMuzN,SADiB9xN,EAAAA,GAAQ+xN,yBACM5+M,MAAM6+M,GAASA,EAAKj+H,MAAQiuE,EAAAA,GAAYC,cAAgB+vD,EAAK9C,qBAAuBC,EAAAA,GAAmB8C,OACtIpE,EAAQiE,EAAsBA,EAAoBlC,eAAe5jN,WAlBlD,KAmBrBulN,EAAqB,IAAD5oN,OAAKklN,GAC7B,CAAE,MAAOnvN,GACL6yN,EAAqB,IAAD5oN,OArBC,MAsBzB,CACJ,CAEAupN,EAAyB,GAC1B,IAEH,MAAMv+H,GAAU50C,EAAAA,EAAAA,aAAY7T,EAAAA,IAEtBhW,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtBg9L,GAA6BpzK,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAASwrE,MAAMsD,mBAEtFoqH,EAAkD,SAApB72L,EAAQ82L,QAEtCoG,EAAmC,UAAvBl9L,EAAQG,WACpBy6L,EAAiB56L,EAAQqmE,eAAiBymE,EAAAA,GAAYC,aACtDotD,EAAen6L,EAAQqmE,eAAiBymE,EAAAA,GAAYwuD,WACpD6B,EAA4E,SAA1CF,EAA2B98L,YAE5D6jE,IAAoBC,EAAAA,EAAAA,KAMrBm5H,EAAkB,CACpB9gN,EAAc,CAACzS,GAAI,iDAAkD0S,eAAgB,8BACrFD,EAAc,CAACzS,GAAI,+CAAgD0S,eAAgB,iCACnFD,EAAc,CAACzS,GAAI,0CAA2C0S,eAAgB,iCAC9ED,EAAc,CAACzS,GAAI,+CAAgD0S,eAAgB,kCACnFD,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,qBAGzE8gN,EAAuB,CACzB/gN,EAAc,CAACzS,GAAI,0CAA2C0S,eAAgB,uBAC9ED,EAAc,CAACzS,GAAI,oDAAqD0S,eAAgB,0DACxFD,EAAc,CAACzS,GAAI,sDAAuD0S,eAAgB,mDAC1FD,EAAc,CAACzS,GAAI,wDAAyD0S,eAAgB,uCAI1F+gN,EAAqB,CACvBhhN,EAAc,CAACzS,GAAI,8CAA+C0S,eAAgB,uBAClFD,EAAc,CAACzS,GAAI,mDAAoD0S,eAAgB,4DACvFD,EAAc,CAACzS,GAAI,wDAAyD0S,eAAgB,mCAC5FD,EAAc,CAACzS,GAAI,iEAAkE0S,eAAgB,mCACrGD,EAAc,CAACzS,GAAI,4DAA6D0S,eAAgB,kCAoCpG,OACIzJ,IAAAA,cAAA,OAAKC,UAAU,gCACXD,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACjN,UAAU,wBACpBD,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,MAAIC,UAAU,SACTuJ,EAAc,CAACzS,GAAI,sBAAuB0S,eAAgB,mBAE/DzJ,IAAAA,cAAA,WAAMwJ,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,mCAEvEzJ,IAAAA,cAAA,UACIjJ,GAAG,YACHkJ,UAAU,QACV,aAAW,QACXiO,MAAM,QACNoB,QAASA,MACL/Q,EAAAA,EAAAA,IAAW,sBAAuB,uBAClCmB,EAAMiN,QAAQ,GAGlB3M,IAAAA,cAAA,QAAM,cAAY,QAAQ,OAGlCA,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KArDXzN,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,YACKwJ,EAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,iCAE/EzJ,IAAAA,cAAC03C,EAAAA,EAAY,CACTpoC,QAASA,MACL/Q,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqB08H,uBACrB,mCACH,EAGLt0K,KAAMu0K,EAAAA,GAAWC,kBACjBx4M,SAAS,qCACX3I,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,gCAyC9EzJ,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAC2oN,EAAI,CACD5xN,GAAG,OACH2uN,SAAS,UACTC,KAAK,OACLC,YAAap8M,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,2CAClFo8M,MAAM,KACNx3H,SAAS,EACTo3H,UACI2E,EACIpqN,IAAAA,cAAC8jN,EAAS,CACNt5M,KAAMhB,EAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,iBAChF4lD,MAAM,6BACNw0J,QAAQ,2BACRK,SAAUlkN,IAAAA,cAACokN,EAAY,aACrBppN,EACdkrN,cAAe,CACXnsM,OAAQA,OACRvP,KAAMhB,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,cACxEpC,UAAU,EACV++M,YAAa9B,EAAwB/uM,QAEzCgxM,SAAU,CACNr4M,MAAO1E,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,iBAC1EgC,MAAO6+M,KAGftqN,IAAAA,cAAC2oN,EAAI,CACD5xN,GAAG,eACH2uN,SAAS,yBACTC,KAAK,eACLC,YAAap8M,EAAc,CAACzS,GAAI,yCAA0C0S,eAAgB,6CAA8C,CACpI4pM,GAAIrzM,IAAAA,cAAA,aAER6lN,MAAO8B,EACP5B,KAAMv8M,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,mDAAoD,CAC5H4pM,GAAIrzM,IAAAA,cAAA,WACJsS,EAAIuwC,GACA7iD,IAAAA,cAAA,QAAMC,UAAU,mBACZD,IAAAA,cAAA,SAAI6iD,MAIhBwrC,SAAS,EACTo3H,UACIqC,EACI9nN,IAAAA,cAAC8jN,EAAS,CACNt5M,KAAMhB,EAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,iBAChF4lD,MAAM,6BACNw0J,QAAQ,2BACRK,SAAUlkN,IAAAA,cAACokN,EAAY,aACrBppN,EACdkrN,cAAe,CACXnsM,OAAQA,MACJxb,EAAAA,EAAAA,IAAW,sBAAuB,wBAClCwhG,GAAe,EAEnBv1F,KAAMhB,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,YACtEpC,UAAWskF,GAAWm8H,EACtB1B,YAAaiE,EAAkC/F,EAAwBsE,QAAUtE,EAAwB/uM,QAG7GgxM,SAAU,CACNr4M,MAAO1E,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,iBAC1EgC,MAAO8+M,KAGfvqN,IAAAA,cAAC2oN,EAAI,CACD5xN,GAAG,aACH2uN,SAAS,UACTC,KAAK,aACLC,YAAap8M,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,6DACxF4kF,SAAS,EACTo3H,UACI4B,EACIrnN,IAAAA,cAAC8jN,EAAS,CACNt5M,KAAMhB,EAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,iBAChF4lD,MAAM,6BACNw0J,QAAQ,2BACRK,SAAUlkN,IAAAA,cAACokN,EAAY,MACvBH,uBAAuB,SACrBjpN,EACdkrN,cAAgBmE,IAAoC1+H,EAAW,CAC3D5xE,OAAQA,MACJxb,EAAAA,EAAAA,IAAW,sBAAuB,kCAClC2yF,GAAkB,EAEtB1mF,KAAMhB,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,kBAC3E28M,YAAa9B,EAAwBsE,cACrC5tN,EACJirN,qBAAuBoE,GAAmC1+H,EA5HtE3rF,IAAAA,cAACmiJ,EAAAA,EAAa,CACVvnD,YAAY,6CACZynD,gBAAgB,EAChBh7I,SAAU08M,EACV3hE,SAAQ,mBAAAzhJ,OAAqBojN,EAA8BO,EAAwB6B,OAAS7B,EAAwBsE,SACpHt5M,QAxDcs7M,KACtBv0N,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBy7E,eAAe,SAgLhCxzF,EACJsrN,qBAAuB+D,GAAmC1+H,EAAW3rF,IAAAA,cAAC6qN,EAAiB,WAAK7vN,EAC5FqrN,gBAAkBgE,IAAoC1+H,OAAW3wF,EAAYgF,IAAAA,cAAC8qN,EAAe,MAC7FvE,SAAU,CACNr4M,MAAO1E,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,iBAC1EgC,MAAO++M,OAOnC,CAAClB,EAAAjhN,UAAA,CA1OGsE,OAAM7G,IAAAA,KAAAC,YA4OV,UElPA,SAAS0oF,EAAa/uF,GAClB,MAAOwrF,EAAW6/H,IAAgBxxM,EAAAA,EAAAA,WAAS,GACrCljB,GAAWsxD,EAAAA,EAAAA,eACX0mC,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,IACtBu0H,GAA2Bj0K,EAAAA,EAAAA,cAAaz+C,IAAuB8gG,EAAAA,EAAAA,GAAY9gG,EAAOya,EAAAA,GAAiBk4M,kBAEnGt+M,EAASA,KAGPq+M,EACA30N,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBy7E,gBAErCu8H,GAAa,EACjB,EAGE3uH,EAAU/N,EACZruF,IAAAA,cAAC4mN,EAAO,CACJj6M,OAAQA,EACRk0G,UAAWnhH,EAAMmhH,YAGrB7gH,IAAAA,cAACspN,EAAiB,CACd38M,OAAQA,IAIhB,OACI3M,IAAAA,cAACyM,EAAAA,MAAK,CACFxM,UAAU,eACV4L,KAAMq/E,EACNn0F,GAAG,eACH6V,SAAUA,KACNvW,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBy7E,eAAe,EAExD,cAAY,eACZ9hF,gBAAgB,cAChBC,OAAQA,EACRG,KAAK,OACL,aAAW,OACX,kBAAgB,uBAEfsvF,EAIb,CAAC3N,EAAApmF,UAAA,CAjDGw4G,UAAS/6G,IAAAA,QAmDb,S,6IClEA,MAAMolN,EAA6C,CAC/CzmG,OAAQ,oBACRE,KAAM,aACNE,IAAK,oBACL9vD,QAAS,uBAGPo2J,EAAgBhzN,IAA0C,IAAzC,UAAC8H,EAAY,GAAE,OAAEZ,EAAS,IAAUlH,EACvD,IAAKkH,EACD,OAAO,KAGX,MAAM+rN,EAAWF,EAAgB7rN,IAAW6rN,EAAgBn2J,QAE5D,OAAO/0D,IAAAA,cAAA,KAAGC,UAAS,GAAAU,OAAKyqN,EAAQ,KAAAzqN,OAAIV,IAAc,EACpDkrN,EAAA9iN,UAAA,CAnBEpI,UAAS6F,IAAAA,OACTzG,OAAMyG,IAAAA,QAoBV,QAAe9F,IAAAA,KAAWmrN,G,eCK1B,SAASxtK,EAAej+C,GAAc,IAAA2rN,EAGlC,MAAMxS,EAAyC,iBAArBn5M,EAAMm5M,YAAgD,KAArBn5M,EAAMm5M,WAAoBn5M,EAAMm5M,WAAan5M,EAAM6O,IAExG+8M,EAAmB,gBAAH3qN,OAAmBjB,EAAMw5M,QAAU,QAAU,IAE7Dh3G,EAAaxiG,EAAM6mD,OAAS7mD,EAAM6iM,mBAAqB7iM,EAAM04M,YAEjD,IAAAmT,EAAlB,OAAI7rN,EAAMxI,OAEF8I,IAAAA,cAACiiG,EAAAA,EAAc,CACX2F,sBAAuBzwD,IAAW,iBAAkBz3C,EAAM8rN,cAC1Dt0N,OAAQwI,EAAMxI,OACdqX,IAAKsqM,EACLzmM,UAAW1S,EAAM0S,UACjB8vF,WAAYA,EACZgjG,cAAexlM,EAAMwlM,cACrBD,cAAevlM,EAAMulM,cACrBmT,YAAa14M,EAAM04M,aAEnBp4M,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACyrN,EAAW,CACRxrN,UAAU,cACVa,KAAiB,QAAbyqN,EAAE7rN,aAAK,EAALA,EAAOoB,YAAI,IAAAyqN,EAAAA,EAAI,MAErBvrN,IAAAA,cAAA,QAAMC,UAAWqrN,GACbtrN,IAAAA,cAACa,EAAAA,EAAM,CACHN,SAAUb,EAAMa,SAChBO,KAAMpB,EAAMoB,KACZC,IAAKrB,EAAM6O,QAIvBvO,IAAAA,cAACoiG,EAAAA,EAAU,CAAC/iG,OAAQK,EAAML,WAOtCW,IAAAA,cAAA,QACIC,UAAWk3C,IAAW,iBAAkB,cAAez3C,EAAM8rN,eAE7DxrN,IAAAA,cAAA,QAAMC,UAAWqrN,GACbtrN,IAAAA,cAACa,EAAAA,EAAM,CACHC,KAAiB,QAAbuqN,EAAE3rN,aAAK,EAALA,EAAOoB,YAAI,IAAAuqN,EAAAA,EAAI,KACrBtqN,IAAKrB,EAAM6O,OAGlB7O,EAAMgsN,cACH1rN,IAAAA,cAACmrN,EAAa,CACVlrN,UAAWP,EAAMisN,YACjBtsN,OAAQK,EAAML,SAGlBW,IAAAA,cAACoiG,EAAAA,EAAU,CAAC/iG,OAAQK,EAAML,SAI1C,CAACs+C,EAAAt1C,UAAA,CA7EG6wM,QAAOpzM,IAAAA,KACP0lN,aAAY1lN,IAAAA,OACZ+yM,WAAU/yM,IAAAA,OACVyI,IAAGzI,IAAAA,OAAAC,WACHwgD,MAAKzgD,IAAAA,KACLy8L,kBAAiBz8L,IAAAA,KACjBzG,OAAMyG,IAAAA,OACNsyM,YAAWtyM,IAAAA,KACX5O,OAAM4O,IAAAA,OACNsM,UAAStM,IAAAA,OACTvF,SAAQuF,IAAAA,OACRo/L,cAAap/L,IAAAA,OACbm/L,cAAan/L,IAAAA,OACb4lN,cAAa5lN,IAAAA,KACb6lN,YAAW7lN,IAAAA,QAiEf,MAAM2lN,EAAc5pK,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,eAAbq7C,CAAa,iDAEnBw5D,IAAMuwG,EAAAA,EAAAA,GAAevwG,EAAEv6G,QACtBu6G,IAAMuwG,EAAAA,EAAAA,GAAevwG,EAAEv6G,QAGtC,G,wXCtFA,MAAM+qN,EAAuB1zN,IAKhB,IALiB,SAC1BoI,EAAQ,WACR2hG,EAAU,OACV7iG,EAAM,OACNysN,GACI3zN,EACJ,OACI6H,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAACa,EAAAA,EAAM,CACH9J,GAAG,aACH+J,KAAK,MACLP,SAAUA,EACVQ,IAAK+qN,EACLt2J,UAAW,IAEfx1D,IAAAA,cAACoiG,EAAAA,EAAU,CACPniG,UAAU,6BACVZ,OAAQ6iG,OAAalnG,EAAYqE,EACjCqjJ,QAAQ,IAEV,EAEZmpE,EAAAxjN,UAAA,CA3BE9H,SAAQuF,IAAAA,OACRo8F,WAAUp8F,IAAAA,KACVzG,OAAMyG,IAAAA,OACNgmN,OAAMhmN,IAAAA,OAAAC,YA0BV,U,0BCvBA,MAAMgmN,EAAiC5zN,IAE1B,IAF2B,OACpCs8G,GACIt8G,EACJ,MAAM9B,GAAWsxD,EAAAA,EAAAA,gBACVqkK,EAAuBC,IAA4B1yM,EAAAA,EAAAA,UAAiC,CAAC,GACtF2yM,GAA+Bn1K,EAAAA,EAAAA,cAAaz+C,IAAuB6zN,EAAAA,EAAAA,IAA2B7zN,MAEpG8sD,EAAAA,EAAAA,YAAU,KAKN/uD,GAAS+1N,EAAAA,EAAAA,OAJW71N,WAChB,MAAM6c,QAAiBpb,EAAAA,GAAQq0N,qCAAqC53G,GACpEw3G,EAAyB74M,EAAS,EAGtCk5M,EAAa,GACd,CAAC73G,EAAQp+G,IACZ,MAAMk2N,EAAoBnsN,OAAOoI,OAAO0jN,GAA8B7oN,KAAKmpN,IACvE,MAAMhpN,EAAQwoN,EAAsBQ,EAAUz1N,IAC9C,OAAKyM,EAIDxD,IAAAA,cAAA,OACItC,IAAK,mBAAqB8uN,EAAUz1N,GACpCkJ,UAAU,mCAEVD,IAAAA,cAAA,UACIjJ,GAAE,yCAAA4J,OAA2C6rN,EAAUz1N,IACvDkJ,UAAU,0BAETusN,EAAUrsN,MAEfH,IAAAA,cAAA,KACI,2DAAAW,OAA0D6rN,EAAUz1N,IACpEkJ,UAAU,+BAETuD,IAjBF,IAmBD,IAGd,OACIxD,IAAAA,cAAAA,IAAAA,SAAA,KAAGusN,EAAqB,EAE9BR,EAAA1jN,UAAA,CA7CEosG,OAAM3uG,IAAAA,OAAAC,YA+CV,U,gFC5BA,MAAMw1G,EAAmC,CACrCC,YAAa,EACbntG,MAAO,GACPC,OAAQ,IAENm+M,EAA6Bt0N,IAQtB,IARuB,cAChC2tB,EAAa,WACbo8E,EAAU,KACV9+F,EAAI,KACJ+8F,EAAI,YACJlf,EAAW,oBACXyrI,EAAmB,iBACnBC,GACIx0N,EACJ,MAAM9B,GAAWsxD,EAAAA,EAAAA,eACXy/D,GAAkBztG,EAAAA,EAAAA,SAAQ0tG,EAAAA,GAAqB,IAC/CljF,GAAe4S,EAAAA,EAAAA,cAAaz+C,GAAuB8uH,EAAgB9uH,EAAO8K,EAAKrM,MAC/EwwH,GAAwBxwE,EAAAA,EAAAA,cAAaz+C,IAAuBs0N,EAAAA,EAAAA,IAAyBt0N,EAAO6rC,KAC5FsjF,GAAwB1wE,EAAAA,EAAAA,cAAaz+C,IAAuBu0N,EAAAA,EAAAA,IAAyBv0N,KAErFw0N,GAAwBrzM,EAAAA,EAAAA,cAAY,KACtC0mF,SAAAA,IACA,MAAM4sH,EAA6B,CAC/Bj6M,QAASC,EAAAA,GAAiB64G,cAC1B34G,WAAY+2G,EAAAA,EACZ92G,YAAa,CAACtG,SAAUq0E,IAE5B5qF,GAASwc,EAAAA,EAAAA,GAAUk6M,GAA4B,GAChD,CAAC5sH,EAAMlf,IAEJ+rI,IAAmB7oL,aAAY,EAAZA,EAAc35B,QAAQ25B,aAAY,EAAZA,EAAcE,UAAWkjF,EAClE0lG,EAAiBD,GAAmB7oL,EAAayjF,YAAczjF,EAAauiE,WAAamhB,EAAAA,EAAqBC,WAC9GolG,EAAqB9pN,EAAKrM,KAAO+uB,EAGvC,IAF+B2hG,GAA0BklG,GAAqBzqH,IAAe8qH,IAAmBE,EAG5G,OAAO,KAGX,IAAIC,EAgCJ,OA/BIH,EACAG,EACIntN,IAAAA,cAAA,OACIC,UAAU,8BACV,kBAAgB,qCAEhBD,IAAAA,cAACw0G,EAAAA,EAAiB,CACdC,OAAQrxG,EAAKrM,GACbwyF,aAAa,EACburB,WAAYyG,IAEhBv7G,IAAAA,cAACwoH,EAAAA,EAAgB,CACbh+G,KAAM25B,EAAa35B,MAAQ,MAIhC0iN,IACPC,EACIntN,IAAAA,cAAA,UACIC,UAAU,qDACVqP,QAASw9M,GAET9sN,IAAAA,cAAA,KAAGC,UAAU,oCACbD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,mBAO3BzJ,IAAAA,cAAA,OACIjJ,GAAG,sBACHkJ,UAAU,uCAEVD,IAAAA,cAAA,UACIjJ,GAAG,oCACHkJ,UAAU,0BAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,WAElBwjN,GACGjtN,IAAAA,cAAC+nH,EAAAA,EAAU,CACP3/F,KAAM+b,EAAayjF,WACnBtiE,SAAUonK,EACVp7F,gBAAgB,KAI3B67F,EACC,EAEZV,EAAApkN,UAAA,CAvGEyd,cAAahgB,IAAAA,OAAAC,WACbm8F,WAAUp8F,IAAAA,KACVq6F,KAAIr6F,IAAAA,KACJm7E,YAAWn7E,IAAAA,KACX4mN,oBAAmB5mN,IAAAA,OACnB6mN,iBAAgB7mN,IAAAA,KAAAC,YAoGpB,UCvHMqnN,EAAsBj1N,IAIf,IAJgB,MACzBgB,EAAK,iBACLwzN,EAAgB,MAChBpmK,GACIpuD,EACJ,OAAKgB,GAASotD,GAASomK,EACZ,KAIP3sN,IAAAA,cAAA,OACIkO,MAAO/U,EACP8G,UAAU,+BAGVD,IAAAA,cAAA,KACIC,UAAU,0BACV,cAAY,SAEhBD,IAAAA,cAAA,KACIm2C,KAAM,UAAYh9C,GAEjBA,GAEH,EAEZi0N,EAAA/kN,UAAA,CA9BElP,MAAK2M,IAAAA,OACL6mN,iBAAgB7mN,IAAAA,KAChBygD,MAAKzgD,IAAAA,MA8BT,U,eCtBA,MAAMunN,EAA2Bl1N,IAEpB,IAFqB,OAC9BjB,GACIiB,EACJ,MAAMm1N,GAAwBv2K,EAAAA,EAAAA,cAAaz+C,IAAuBi1N,EAAAA,EAAAA,IAAyBj1N,EAAOpB,KAC5Fs2N,GAAuBz2K,EAAAA,EAAAA,cAA0Bz+C,IAAUm1N,EAAAA,EAAAA,IAAuBn1N,EAAOpB,KACzFw2N,GAAiB32K,EAAAA,EAAAA,cAAaz+C,IAAuBq1N,EAAAA,EAAAA,IAA4Br1N,EAAOpB,KAE9F,OAAKs2N,EAKDxtN,IAAAA,cAAA,OAAKC,UAAU,4BACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,0BACfjB,OAAQ,CACJgW,UACIxe,IAAAA,cAACkiD,EAAAA,GAAS,CACN1+C,MAAO8pN,EACPh5F,MAAOo5F,EACPprK,SAAS,EACTl1C,MAAO,cAdpB,IAmBD,EAEZigN,EAAAhlN,UAAA,CA/BEnR,OAAM4O,IAAAA,OAAAC,YAiCV,UCvBA,EAbqC5N,IAExB,IAFyB,eAClCy1N,GACIz1N,EACJ,OACI6H,IAAAA,cAAA,KACIC,UAAU,oCACViO,MAAO0/M,GAENA,EACD,E,eCRZ,MAAMC,GAAyB11N,IAIlB,IAJmB,SAC5B21N,EAAQ,SACRvtN,EAAQ,SACRwtN,GACI51N,EACJ,IAAK21N,EACD,OAAO,KAGX,IAAIn6B,EAAa,KAUjB,OATIo6B,IACAp6B,EACI3zL,IAAAA,cAACguN,EAAAA,EAAmB,CAChB/tN,UAAU,mBACVs0G,aAAa,KAMrBv0G,IAAAA,cAAA,OACI,kCAAAW,OAAiCJ,GACjCN,UAAU,iCAEVD,IAAAA,cAAA,KAAGkO,MAAO4/M,GAAWA,GACpBn6B,EACC,EAEZk6B,GAAAxlN,UAAA,CAhCEylN,SAAQhoN,IAAAA,OAAAC,WACRxF,SAAQuF,IAAAA,OAAAC,WACRgoN,SAAQjoN,IAAAA,QAgCZ,YCdA,GAf+B3N,IAElB,IAFmB,SAC5B0uD,GACI1uD,EACJ,MAAM81N,EAAuBpnK,EAAUv3B,UAAU,EAAG7J,EAAAA,GAAUyoM,qBAE9D,OACIluN,IAAAA,cAAA,KACIC,UAAU,oCACViO,MAAO24C,GAENonK,EACD,ECdNE,GAAyBh2N,IAGlB,IAHmB,YAC5Bi2N,EAAW,SACX7tN,GACIpI,EACJ,OACI6H,IAAAA,cAAA,KACIjJ,GAAG,sBACHkJ,UACImuN,EAAc,oCAAsC,gCAExDlgN,MAAO3N,GAAS,IAAAI,OAEXJ,GACL,EAEV4tN,GAAA9lN,UAAA,CAnBE+lN,YAAWtoN,IAAAA,KAAAC,WACXxF,SAAQuF,IAAAA,OAAAC,YAoBZ,YCVMsoN,GAAqBl2N,IAId,IAJe,KACxBiL,EAAI,iBACJupN,EAAgB,SAChBmB,GACI31N,EACJ,OACI6H,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACsuN,GAAQ,CACLR,SAAUA,EACVC,SAAU3qN,EAAK6vG,UACf1yG,SAAU6C,EAAK7C,WAEjB6C,EAAKnC,SAAW0rN,GACd3sN,IAAAA,cAACuuN,EAAc,CACXX,eAAgBxqN,EAAKorN,kBAG7BxuN,IAAAA,cAACyuN,GAAQ,CACLL,YAAa7hN,QAAQuhN,GACrBvtN,SAAU6C,EAAK7C,WAEjB6C,EAAKyjD,WAAa8lK,GAChB3sN,IAAAA,cAAC0uN,GAAQ,CACL7nK,SAAUzjD,EAAKyjD,WAGxB,EAETwnK,GAAAhmN,UAAA,CAhCEskN,iBAAgB7mN,IAAAA,KAAAC,WAEhB+nN,SAAQhoN,IAAAA,OAAAC,YAgCZ,Y,qMCTA,MAAM4oN,GAAyC3uN,IAAAA,YAAkE,CAACN,EAAOk7C,KACrH,MAAM,KAACj7C,GAAQD,EACTkE,EAAUjE,EAAKiE,QACfo7L,EAAoBp7L,EAAQkgB,WAAmC,IAAtBlgB,EAAQkgB,UAEjDtd,EAAc5C,EAAQ/D,aAC5B,IAAIE,EAAO,KAeX,OAdIi/L,EACAj/L,EACIC,IAAAA,cAAA,KAAGC,UAAU,+CAEV2D,EAAQ1I,OAASuqB,EAAAA,GAAUyB,aAClCnnB,EACIC,IAAAA,cAAA,KAAGC,UAAU,qCAEV2D,EAAQ1I,OAASuqB,EAAAA,GAAU0B,kBAClCpnB,EACIC,IAAAA,cAAA,KAAGC,UAAU,6CAKjBD,IAAAA,cAAC4uN,GAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,GAEJM,IAAAA,cAAA,QAAMC,UAAU,sDAAsDF,GACtEC,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,QAAMC,UAAU,yBAAyBuG,IAE3B,IAG9BmoN,GAAuCnoN,YAAc,yCAErD,IAAIshB,GAAS,GAEb,SAAS+mM,GAAoBC,EAA0BC,GACnD,MAAMC,IAAcF,EAASlrN,QAAQkgB,WAA2C,IAA/BgrM,EAASlrN,QAAQkgB,UAC5DmrM,IAAcF,EAASnrN,QAAQkgB,WAA2C,IAA/BirM,EAASnrN,QAAQkgB,UAClE,GAAIkrM,IAAgBC,EAChB,OAAO,EACJ,IAAKD,GAAeC,EACvB,OAAQ,EAGZ,MAAM1rM,GAAS2rM,EAAAA,GAAAA,GAAqB54N,GAAAA,QAAMqf,YAEpCitC,EAAIksK,EAASlrN,QACb0O,EAAIy8M,EAASnrN,QAEburN,EAAevsK,EAAE/iD,aAAaoD,cAC9BmsN,EAAe98M,EAAEzS,aAAaoD,cAE9BosN,EAAcF,EAAat9M,WAAWiW,IACtCwnM,EAAcF,EAAav9M,WAAWiW,IAC5C,OAAIunM,GAAeC,GACRC,EAAAA,GAAAA,IAAiChsM,EAAQq/B,EAAGtwC,GAC3C+8M,GAAgBC,EAEjBD,GACC,EAGL,GALIE,EAAAA,GAAAA,IAAiChsM,EAAQq/B,EAAGtwC,EAM3D,CAEe,MAAMk9M,WAA6C1tD,GAAAA,EAG9Dx/J,WAAAA,CAAYmtN,GACRltN,QACAG,KAAKgtN,8BAAgCD,CACzC,CAEAE,uBAAAA,CAAwBC,GACpB,MAAMC,EAAqBD,EAAc3sN,cAEzC,OAAQW,IACJ,MAAMtL,EAAQhC,GAAAA,QAAMqf,WACdvD,EAAYxO,EAAQ7M,GACpBsD,GAASogB,EAAAA,EAAAA,IAAiBniB,GAE1Bw3N,EAAelsN,EAAQ/D,aAE7B,OAAI+D,EAAQ1I,OAASuqB,EAAAA,GAAUyB,eAC3B0F,EAAAA,GAAAA,IAAuBt0B,EAAO+B,EAAQ+X,EAAWya,GAAAA,GAAYgwH,kCAEtDj5I,EAAQ1I,OAASuqB,EAAAA,GAAU0B,mBAClCyF,EAAAA,GAAAA,IAAuBt0B,EAAO+B,EAAQ+X,EAAWya,GAAAA,GAAY+vH,mCAFtDkzE,EAAa7sN,cAAckpC,SAAS0jL,EAMnC,CAEpB,CAEAn6B,oBAAAA,CAAqBk6B,EAAuBG,GACxC,GAAIH,EAAe,CACf9nM,GAAS8nM,EACTltN,KAAKstN,gBAAgBJ,GACrB,MAAMt3N,EAAQhC,GAAAA,QAAMqf,WAGdkP,GAAW23H,EAAAA,GAAAA,IAAyBlkJ,GAC1CoK,KAAKutN,0BAA0BL,EAAeG,EAAiBlrM,GAG/DniB,KAAKwtN,cAAcN,EAAeG,EACtC,CAEA,OAAO,CACX,CAEA,mBAAMG,CAAcN,EAAuBG,GACvC,MAAMz3N,EAAQhC,GAAAA,QAAMqf,WACdtb,GAASogB,EAAAA,EAAAA,IAAiBniB,GAChC,IAAK+B,EACD,OAGJ,MAAM81N,EAAgBztN,KAAKgtN,8BAA8Br1N,EAAQu1N,GAEjE,IAAIQ,EAAgC,GACpC,IACI,MAAM,KAACz5N,SAAcw5N,EACrBC,EAAqBz5N,QAAAA,EAAQ,EACjC,CAAE,MAAOC,GACLN,GAAAA,QAAMD,UAASq/B,EAAAA,GAAAA,IAAS9+B,GAC5B,CAEA,GAAI8L,KAAK2tN,qBAAqBT,GAC1B,OAGJ,MAAM/qM,GAAW23H,EAAAA,GAAAA,IAAyBlkJ,GAAOqI,OAAOyvN,GACxD1tN,KAAKutN,0BAA0BL,EAAeG,EAAiBlrM,EACnE,CAEAorM,yBAAAA,CAA0BL,EAAuBG,EAAkDO,GAC/F,MAAMzrM,EAAW,GAEXvsB,EAAQhC,GAAAA,QAAMqf,WAEdwrB,GAAUxa,EAAAA,EAAAA,IAAwBruB,GAExC,GAAIoK,KAAK2tN,qBAAqBT,GAC1B,OAGJ,MAAMW,EAAoD,CAAC,EAErDC,EAAgB9tN,KAAKitN,wBAAwBC,GAG7C1pL,EAAmE,UAD1DzmB,EAAAA,EAAAA,IAAUnnB,GACW6tC,iCAEpC,IAAK,MAAMviC,KAAW0sN,EAClB,IAAIC,EAAkB3sN,EAAQ7M,KAI1By5N,EAAc5sN,GAAU,CACxB,MAAM6sN,EAAarwN,OAAOC,OAAO,CAAC,EAAGuD,GAC/Bo7L,EAA0C,IAAtBp7L,EAAQkgB,UAE5B4sM,EAAiB,CAAC9sN,QAAS6sN,EAAYtwN,KAAMswN,EAAWtwN,KAAMuzL,aAAa,EAAOx4L,KAAMu1N,EAAWv1N,MACzG,IAAKgrC,GAAwB84J,EACzB,SACG,IAAK79J,EAAQv9B,EAAQ7M,IACxB,SACG,GAAI6M,EAAQ1I,OAASuqB,EAAAA,GAAUyB,cAAgBtjB,EAAQ1I,OAASuqB,EAAAA,GAAU0B,gBAC7E,SAEJopM,EAAkB3sN,EAAQ7M,KAAM,EAChC8tB,EAAS7S,KAAK0+M,EAClB,CAOJX,EAAgB,CACZY,eAAgBf,EAChBgB,MANiB/rM,EACjBg0C,KAAKg2J,IACLxrN,KAAKqtN,GAAmBA,EAAe9sN,QAAQzD,OAK/CsL,MAAOoZ,EACPlnB,UAAWgxN,IAEnB,E,0aCnIW,MAAMkC,WAA8B7wN,IAAAA,cAI/CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,8BAcO,KACpBE,KAAKouN,oBAAoB,GAAGC,mBAAoB,CAAK,IACxDvuN,GAAA,qBAEc,KACX,GAA6B,MAAzBE,KAAKsuN,iBACL,OAGJ,MAAMnpJ,EAAUnlE,KAAKsuN,iBAAiBC,aAClC/uN,SAAS+8D,gBAAkB4I,IAC3BA,EAAQnmD,SACRwvM,EAAAA,EAAAA,IAAgBrpJ,GACpB,IACHrlE,GAAA,sBAEgBrD,IACbuD,KAAKgH,SAAS,CAACc,KAAMrL,EAAEq7D,OAAOh3D,MAAOqzL,kBAAmB,MAAM,IACjEr0L,GAAA,eAEQ,KACLE,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAC/BrJ,GAAA,iBAEU,KACPE,KAAKhD,MAAMkN,UAAU,IACxBpK,GAAA,wBAEkBykD,IACfvkD,KAAKsuN,iBAAmB/pK,EACxBvkD,KAAKqmE,cAAc,IACtBvmE,GAAA,0BAEoB9L,IACbA,GACAgM,KAAKgH,SAAS,CAACynN,YAAaz6N,EAAM0I,QAAS+5C,QAAQ,GACvD,IACH32C,GAAA,yBAEmB4uN,IAChB,MAAMxtN,EAAUwtN,EAAUxtN,QACpB1M,EAASwL,KAAKhD,MAAM0D,KAAKrM,GAE/B2L,KAAKgH,SAAS,CACVc,KAAM5G,EAAQ/D,aACdg3L,kBAAmBjzL,EAAQ7M,GAC3Bs6N,uBAAuB,EACvBF,YAAa,KAGjBzuN,KAAKhD,MAAMqD,QAAQ4vG,iBAAiB/uG,EAAQ7M,GAAIG,GAAQgV,MAAK,KACzDxJ,KAAKgH,SAAS,CAAC2nN,uBAAuB,GAAO,GAC/C,IACL7uN,GAAA,qBAEerD,IACRA,GAAKA,EAAEyK,gBACPzK,EAAEyK,iBAGN,MAAMwI,EAAY1P,KAAKpK,MAAMu+L,kBACvBzzL,EAAOV,KAAKhD,MAAM0D,KAEnBgP,IAID1P,KAAK4uN,sBAAsBl/M,IAAc1P,KAAKpK,MAAM6gD,SAIxDz2C,KAAKgH,SAAS,CAACyvC,QAAQ,IAEvBz2C,KAAKhD,MAAMqD,QAAQkuM,iBAAiB7+L,EAAWhP,EAAKrM,IAAImV,MAAK/T,IAAa,IAAZ,MAACzB,GAAMyB,EAC7DzB,EACAgM,KAAK6uN,kBAAkB76N,GAEvBgM,KAAKiK,QACT,KACF,IACLnK,GAAA,8BAEwB4P,IACrB,MAAMhP,EAAOV,KAAKhD,MAAM0D,KAClBojM,EAAc9jM,KAAKhD,MAAM8xN,eAE/B,QAAKp/M,KAIAo0L,EAAYp0L,IAIV7F,QAAQi6L,EAAYp0L,GAAWhP,EAAKrM,IAAI,IA1G/C2L,KAAKpK,MAAQ,CACTuT,MAAM,EACNstC,QAAQ,EACRk4K,uBAAuB,EACvB7mN,KAAM,GACNqsL,kBAAmB,KACnBs6B,YAAa,IAEjBzuN,KAAKouN,oBAAsB,CAAC,IAAItB,GAAqC9vN,EAAMqD,QAAQ2sN,gCACnFhtN,KAAK+uN,uBACT,CAmGA9rN,MAAAA,GACI,MAAMvC,EAAOV,KAAKhD,MAAM0D,KAClBgP,EAAY1P,KAAKpK,MAAMu+L,kBACvB66B,EAAsChvN,KAAK4uN,sBAAsBl/M,GAEvE,IAKIhG,EALAjM,GAAOwxN,EAAAA,GAAAA,IAAYvuN,GAClBjD,IACDA,EAAO,IAAHQ,OAAOyC,EAAK7C,WAIfmC,KAAKpK,MAAM6gD,SACRz2C,KAAKpK,MAAM64N,YACX/kN,EACIpM,IAAAA,cAAA,QACIjJ,GAAG,0CACHkJ,UAAU,wCAETyC,KAAKpK,MAAM64N,aAGbO,IACPtlN,EACIpM,IAAAA,cAAA,QACIjJ,GAAG,4CACHkJ,UAAU,wCAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kDACH0S,eAAe,6CACfjB,OAAQ,CACJrI,aAQxB,MAAMyxN,EACF5xN,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,2EAIjB2yF,EACFp8F,IAAAA,cAAC+oG,GAAAA,EAEG,CACAnuD,IAAKl4C,KAAKmvN,gBACV5xN,UAAU,uBACV0C,SAAUD,KAAKgrJ,cACflqJ,MAAOd,KAAKpK,MAAMkS,KAClB0+F,eAAgBxmG,KAAKovN,iBACrBlqN,cAAeC,GAAAA,EACfb,UAAU,KACVyhG,UAAW/lG,KAAKouN,oBAChBjoH,aAAa,SACbM,eAAe,EACf4oH,kBAAkB,EAClBzoH,eAAe,IAIjB0oH,EAAyBN,GAC3BhvN,KAAKpK,MAAM+4N,uBACX9kN,SAAS7J,KAAKpK,MAAMu+L,oBACpBn0L,KAAKpK,MAAM6gD,OAEf,OACIn5C,IAAAA,cAACyM,GAAAA,MAAK,CACFC,gBAAgB,8BAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiK,OACbC,SAAUlK,KAAKkK,SACfqN,cAAc,EACdnN,KAAK,OACL,kBAAgB,wBAEhB9M,IAAAA,cAACyM,GAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,GAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,wBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kCACH0S,eAAe,0BACfjB,OAAQ,CACJrI,YAKhBH,IAAAA,cAAA,QACI8M,KAAK,OACLC,SAAUrK,KAAKsK,cAEfhN,IAAAA,cAACyM,GAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,OAAKC,UAAU,eACV2xN,GAEL5xN,IAAAA,cAAA,OAAKC,UAAU,gBACVm8F,GAELp8F,IAAAA,cAAA,WACKoM,IAGTpM,IAAAA,cAACyM,GAAAA,MAAMsB,OAAM,KACT/N,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,mBACVqP,QAAS5M,KAAKiK,QAEd3M,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,YAGvBzJ,IAAAA,cAAA,UACI9E,KAAK,SACLnE,GAAG,wCACHkJ,UAAU,kBACVqP,QAAS5M,KAAKsK,aACd3F,SAAU2qN,GAEVhyN,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,WAO3C,EC7TJ,UAAe3B,EAAAA,EAAAA,UAjBf,SAAyBxP,GAErB,MAAO,CACHk5N,gBAFmBpwL,EAAAA,GAAAA,IAA4B9oC,IAAU,CAAC,EAIlE,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,GAAAA,oBAAmB,CACxBipM,iBAAgB,KAChBt+F,iBAAgB,KAChB+8G,8BAA6BA,EAAAA,IAC9Br5N,GAEX,GAEA,CAA4Dw6N,I,4BCE5D,MAAMoB,GAA6B95N,IAKtB,IALuB,kBAChC+5N,EAAiB,YACjBjxI,EAAW,KACX79E,EAAI,KACJ+8F,GACIhoG,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB24M,GAA0Cp7K,EAAAA,EAAAA,cAAaz+C,IAAuB85N,EAAAA,GAAAA,IAA2C95N,KACzH+5N,GAAkBt7K,EAAAA,EAAAA,cAAaz+C,GAfzC,SAA4BA,EAAoBpB,GAC5C,MAAM2qB,GAAOsE,EAAAA,EAAAA,IAAe7tB,GACtB2pC,EAAapgB,GAAOy5H,EAAAA,EAAAA,IAAchjJ,EAAOupB,EAAK9qB,GAAIG,QAAU8D,EAClE,OAAOuR,QAAQ01B,IAAyC,KAA1BA,aAAU,EAAVA,EAAYne,UAC9C,CAWgEwuM,CAAmBh6N,EAAO8K,EAAKrM,MAErFw7N,GAAqB94M,EAAAA,EAAAA,cAAY,KACnC0mF,SAAAA,IACA+xH,GAAmB,GACpB,CAAC/xH,EAAM+xH,IAEV,OAAKC,GAA4CE,EAK7CryN,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAO1E,EAAc,CACjBzS,GAAI,mCACJ0S,eAAgB,sBAIpBzJ,IAAAA,cAAA,YACIA,IAAAA,cAAC2vG,GAAAA,EAAiB,CACd54G,GAAG,qBACHkJ,UAAU,sBACVma,UAAW5Q,EAAc,CACrBzS,GAAI,mCACJ0S,eAAgB,qBAEpBqJ,QAASC,EAAAA,GAAiBy/M,oBAC1Bv/M,WAAY49M,GACZ39M,YAAa,CAAC9P,OAAMwJ,SAAUq0E,GAC9B3xE,QAASijN,GAETvyN,IAAAA,cAAA,KACIC,UAAU,iCACV,cAAY,YA1BrB,IA8BO,EAEpBgyN,GAAA5pN,UAAA,CA5DE44E,YAAWn7E,IAAAA,KAAAC,WACXmsN,kBAAiBpsN,IAAAA,KAAAC,WACjBo6F,KAAIr6F,IAAAA,MA4DR,Y,cC5De,SAAS2sN,GAAwBt6N,GAA4G,IAA3G,qBAACu6N,EAAoB,cAAEvwM,EAAa,YAAEwwM,EAAW,aAAEC,EAAY,UAAEC,EAAS,cAAE/sM,EAAa,OAAE5uB,GAAciB,EACtJ,MAAO26N,EAAcC,IAAmBx5M,EAAAA,EAAAA,WAAS,GAC3Cy5M,GAAkBnnK,EAAAA,EAAAA,QAAO8mK,GACzBt8N,GAAWsxD,EAAAA,EAAAA,eAYjB,IAVAvC,EAAAA,EAAAA,YAAU,KACF4tK,EAAgBvgN,UAAYkgN,IAC5BI,GAAgB,GAChB9nM,YAAW,KACP8nM,GAAgB,EAAK,GACtBttM,EAAAA,GAAUwtM,wCAEjBD,EAAgBvgN,QAAUkgN,CAAW,GACtC,CAACA,IAEgC,IAAhCD,EAAqBtpN,OACrB,OAAO,KAGX,MAUMzJ,EAAO+yN,EAAqB,GAK5BQ,EAAe38N,UACbu8N,GALgBv8N,WAAY,IAAA48N,EAChC,MAAMC,OAZW78N,WACjB,IAAKs8N,EAAW,CACZ,MAAM,KAACl8N,SAAcN,GAASg9N,EAAAA,EAAAA,IAAoBvtM,EAAe5uB,IACjE,GAAIP,EACA,OAAOA,CAEf,CACA,OAAOk8N,CAAS,EAKaS,GAClB,QAAXH,EAAAxzN,EAAKoa,cAAM,IAAAo5M,GAAXA,EAAAjiN,KAAAvR,EAAcyzN,EAAgBjxM,EAAc,EAIxCoxM,EACJ,EAGJ,OACIvzN,IAAAA,cAAA,OACIsP,QAAS4jN,EACTxyJ,WAAYwyJ,GAEXN,EAGb,CAACH,GAAApqN,UAAA,CAxDGqqN,qBAAoB5sN,IAAAA,MAAAC,WACpB4sN,YAAW7sN,IAAAA,KAAAC,WACX+f,cAAahgB,IAAAA,OAAAC,WACb7O,OAAM4O,IAAAA,OAAAC,WACN6sN,aAAY9sN,IAAAA,SCChB,UAAegC,EAAAA,EAAAA,UATf,SAAyBxP,GACrB,MAAO,CACHo6N,qBAAsBp6N,EAAM+oE,QAAQ7hE,WAAWg0N,WAC/CrxM,eAAesxM,EAAAA,GAAAA,IAA8Bn7N,GAC7Cq6N,YAAar6N,EAAM8kD,MAAM2Z,IAAI28J,cAC7B5tM,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAExC,GAEA,CAAwCm6N,ICYjC,SAASkB,GAAar7N,EAAoBpB,EAAgBkb,GAC7D,MAAMwhN,GAAiBC,EAAAA,GAAAA,IAAmBv7N,GAAO8Z,IAAc,CAAC,EAEhE,IAAK,MAAM0hN,KAAW1zN,OAAOoI,OAAOorN,GAChC,GAAIE,EAAQr1M,UAAYvnB,EACpB,OAAO,EAIf,OAAO,CACX,CAEA,MAAMs8N,GAAar7N,IAKN,IALO,OAChBjB,EAAM,cACN4uB,EAAa,SACbgoM,EAAQ,SACRvtN,GACIpI,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB4kI,GAAiBrnG,EAAAA,EAAAA,cAAaz+C,IAAuBy7N,EAAAA,GAAAA,IAAkBz7N,KACvEu6N,GAAY97K,EAAAA,EAAAA,cAAaz+C,IAAuBysB,EAAAA,GAAAA,IAAiBzsB,GAAO07N,EAAAA,EAAAA,IAAqBluM,EAAe5uB,MAE5G+8N,GAAqBl9K,EAAAA,EAAAA,cAAaz+C,IAAuB,IAAA47N,EAAAzyI,EAAA0yI,EAE3D,SAAK/1E,IAKDg2E,EAAAA,GAAAA,IAA+B97N,EAAoB,QAAf47N,EAAErB,aAAS,EAATA,EAAW97N,UAAE,IAAAm9N,EAAAA,EAAI,OAMvDnjI,EAAAA,GAAAA,IAA2C,QAA9BtP,GAACvnD,EAAAA,EAAAA,IAAQ5hC,EAAOwtB,UAAc,IAAA27D,OAAA,EAA7BA,EAA+BrgF,UAK7CizN,EAAAA,GAAAA,IAAe/7N,GAAOg8N,kBAKtBC,EAAAA,GAAAA,IAA8Bj8N,EAAoB,QAAf67N,EAAEtB,aAAS,EAATA,EAAW97N,UAAE,IAAAo9N,EAAAA,EAAI,IAI9C,IAGVK,GAAYz9K,EAAAA,EAAAA,cAAaz+C,MACvB8lJ,IAAkBy0E,KACXc,GAAar7N,EAAOwtB,EAAe+sM,EAAU97N,KAAO48N,GAAar7N,EAAOpB,EAAQ27N,EAAU97N,OAKzG,IAAKk9N,EACD,OAAO,KAIX,MAAM5sN,EAAWmtN,EACXC,EAAmBD,EAAYhrN,EAAc,CAC/CzS,GAAI,4BACJ0S,eAAgB,+BACjB,CAACrG,KAAM0qN,GAAYvtN,IAClBiJ,EAAc,CACdzS,GAAI,uCACJ0S,eAAgB,eAEdirN,EACF10N,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAOumN,GAEPz0N,IAAAA,cAAA,UACIjJ,GAAG,kBACHmE,KAAK,SACLmM,SAAUA,EACVpH,UAAU,kCACV,aAAYw0N,GAEZz0N,IAAAA,cAAA,QACIC,UAAU,kBACV,cAAY,WAM5B,OAAIoH,EACOqtN,EAIP10N,IAAAA,cAACyyN,GAAwB,CACrBI,UAAWA,EACX37N,OAAQA,EACR07N,aAAc8B,GAChB,EAERlB,GAAAnrN,UAAA,CA9GEnR,OAAM4O,IAAAA,OAAAC,WACN+f,cAAahgB,IAAAA,OAAAC,WACb+nN,SAAQhoN,IAAAA,OAAAC,WACRxF,SAAQuF,IAAAA,OAAAC,YA6GZ,YCrHM4uN,GAA6Bx8N,IAStB,IATuB,cAChC2tB,EAAa,iBACb6mM,EAAgB,KAChBvpN,EAAI,wBACJwxN,EAAuB,kBACvB1C,EAAiB,YACjBjxI,EAAW,KACXkf,EAAI,SACJ2tH,GACI31N,EACJ,OAAIiL,EAAKrM,KAAO+uB,GAAiB6mM,EACtB,KAIP3sN,IAAAA,cAAA,OAAKC,UAAU,sCACXD,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,yBACVqP,QAASslN,GAET50N,IAAAA,cAAA,KACIC,UAAU,iBACV,cAAY,SAEhBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,aAGvBzJ,IAAAA,cAAA,OAAKC,UAAU,gCACXD,IAAAA,cAACiyN,GAA0B,CACvBC,kBAAmBA,EACnBjxI,YAAaA,EACb79E,KAAMA,EACN+8F,KAAMA,IAEVngG,IAAAA,cAAC60N,GAA+B,CAC5B/uM,cAAeA,EACfgoM,SAAUA,EACV52N,OAAQkM,EAAKrM,GACbwJ,SAAU6C,EAAK7C,YAGrB,EAEZo0N,GAAAtsN,UAAA,CAvDEylN,SAAQhoN,IAAAA,OAAAC,WACR+f,cAAahgB,IAAAA,OAAAC,WACb4mN,iBAAgB7mN,IAAAA,KAAAC,WAChB6uN,wBAAuB9uN,IAAAA,KAAAC,WACvBk7E,YAAWn7E,IAAAA,KAAAC,WACXmsN,kBAAiBpsN,IAAAA,KAAAC,WACjBo6F,KAAIr6F,IAAAA,MAmDR,YC5DMgvN,GAAmC38N,IAG5B,IAH6B,SACtCoI,EAAQ,iBACRosN,GACIx0N,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAExB,OAAKmzM,EAKD3sN,IAAAA,cAAA,KACIC,UAAU,sCAETuJ,EAAc,CACXzS,GAAI,wCACJ0S,eAAgB,4DAEpB,CACIlJ,cAZD,IAcH,EAEVu0N,GAAAzsN,UAAA,CA1BE9H,SAAQuF,IAAAA,OAAAC,WACR4mN,iBAAgB7mN,IAAAA,KAAAC,YA2BpB,Y,gBCXA,MAAMgvN,GAA4B58N,IAQrB,IARsB,OAC/BjB,EAAM,cACN4uB,EAAa,iBACb6mM,EAAgB,KAChBxsH,EAAI,YACJlf,EAAW,kBACXixI,EAAiB,wBACjB0C,GACIz8N,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClBnjB,GAAWsxD,EAAAA,EAAAA,eAEXqtK,GAA4Bv7M,EAAAA,EAAAA,cAAY,KAC1C0mF,SAAAA,IACA9pG,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiB2d,cAC1Bzd,WAAY0d,GAAAA,QACZzd,YAAa,CAAC0d,0BAA0B,EAAOhkB,SAAUq0E,MAE7DixI,GAAmB,GACpB,CAAC/xH,EAAMlf,EAAaixI,IAEvB,OAAIh7N,IAAW4uB,GAAiB6mM,EACrB,KAIP3sN,IAAAA,cAAA,OACIC,UAAU,sCAEVD,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,yBACVqP,QAAS0lN,GAETh1N,IAAAA,cAAA,KACIC,UAAU,4BACV,cAAY,SAEhBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,kBAGvBzJ,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAO1E,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,6BAE3EzJ,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,sBACVqP,QAASslN,EACT,aAAYprN,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,6BAEhFzJ,IAAAA,cAAA,KACIC,UAAU,iBACV,cAAY,WAItB,EAEZ80N,GAAA1sN,UAAA,CAtEEnR,OAAM4O,IAAAA,OAAAC,WACN+f,cAAahgB,IAAAA,OAAAC,WACb4mN,iBAAgB7mN,IAAAA,KAAAC,WAChBo6F,KAAIr6F,IAAAA,KACJm7E,YAAWn7E,IAAAA,KAAAC,WACXmsN,kBAAiBpsN,IAAAA,KAAAC,WACjB6uN,wBAAuB9uN,IAAAA,KAAAC,YAkE3B,Y,4BCpEA,MAAMkvN,GAAqB98N,IAOtB,IAPuB,oBACxBu0N,EAAmB,oBACnBwI,GAIH/8N,EAEG,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAExB,IAAKkzM,EACD,OAAO,KAEX,MAAMyI,EAAkB3vK,GAAAA,SAASC,QAAQC,QAAQgnK,GAC3C0I,EAAkB5vK,GAAAA,SAASC,QAAQC,QAAQwvK,GAE3CxnK,EAAS2nK,GAAAA,SAASC,WAAW,CAC/B9kG,OAAQ4kG,EAAgB1nK,OAASynK,EAAgBznK,QAAU,KAG/D,IAAKA,EAAOiF,UACR,OAAO,KAGX,MAAM4iK,EAAa7nK,EAAO8nK,QAAQ,CAACC,YAAa,QAASC,YAAa,UAEtE,OAAOhoK,EAAOiF,UAAY,EACtB3yD,IAAAA,cAAAA,IAAAA,SAAA,KACKwJ,EACG,CACIzS,GAAI,kCACJ0S,eAAgB,wBAEpB,CAAC8rN,gBAITv1N,IAAAA,cAAAA,IAAAA,SAAA,KAEQwJ,EACI,CACIzS,GAAI,mCACJ0S,eAAgB,yBAEpB,CAAC8rN,eAIhB,EAGCI,GAAkB/3N,IAII,IAJH,oBACrB8uN,EAAmB,oBACnBwI,EAAmB,iBACnBvI,GACmB/uN,EACnB,MAAM,cAAC4L,IAAiBgQ,EAAAA,EAAAA,WAExB,GAAImzM,IAAqBuI,EACrB,OAAO,KAGX,MAAMU,GAAkBC,EAAAA,GAAAA,IAAuBX,IAAwB,MACjEY,EAAuBF,EAAkBpwK,GAAAA,SAAS3nC,MAAM6nC,QAAQkwK,GAAiBG,qBAAkB/6N,EAEzG,OACIgF,IAAAA,cAAA,OACIC,UAAU,uCAEVD,IAAAA,cAAA,UACIjJ,GAAG,+BACHkJ,UAAU,0BAET61N,EAAuBtsN,EACpB,CACIzS,GAAI,6CACJ0S,eAAgB,2BAEpB,CACI67C,SAAUwwK,IAEdtsN,EAAc,CACdzS,GAAI,iCACJ0S,eAAgB,gBAGxBzJ,IAAAA,cAAA,KACI,kBAAgB,+BAChBC,UAAU,+BAEVD,IAAAA,cAACkiD,EAAAA,GAAS,CACNC,aAAa,EACbC,SAAS,EACTC,aAAc6yK,EACd5yK,QAAS,CACLC,KAAM,UACNC,OAAQ,aAGf,IACDxiD,IAAAA,cAACi1N,GAAkB,CACfvI,oBAAqBA,EACrBwI,oBAAqBU,KAG3B,EAEZD,GAAAttN,UAAA,CA9GEskN,iBAAgB7mN,IAAAA,KAAAC,YAgHpB,Y,wCC5EA,MAAMiwN,GAAsB79N,IAOf,IAPgB,MACzBouD,EAAK,MACLnlD,EAAK,YACL6/E,EAAW,KACXkf,EAAI,OACJjpG,EAAM,UACNkb,GACIja,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB8qF,GAAWz4C,EAAAA,EAAAA,QAA0B,MAErCu8F,GAAcrxG,EAAAA,EAAAA,cAAaz+C,GAjCrC,SAAwBA,EAAoBpB,GACxC,MAAM2qB,GAAOsE,EAAAA,EAAAA,IAAe7tB,GACtB2pC,EAAapgB,GAAOy5H,EAAAA,EAAAA,IAAchjJ,EAAOupB,EAAK9qB,GAAIG,QAAU8D,EAElE,OAAOuR,QAAQ01B,GAAcA,EAAW6X,aAC5C,CA4B4Dm8K,CAAe39N,EAAOpB,KACxE07G,GAAiB77D,EAAAA,EAAAA,cAAaz+C,GA3BxC,SAA2BA,EAAoBpB,EAAgBkb,GAC3D,IAAKA,EACD,OAAO,EAGX,MAAM+P,GAAgBwwF,EAAAA,GAAAA,IAAiBr6G,EAAO8Z,EAAWlb,GAEzD,QAA2B,YAAvB2jB,EAAAA,EAAAA,IAAYviB,IAAwC,MAAjB6pB,IAAyBA,EAAc23B,aAKlF,CAe+Do8K,CAAkB59N,EAAOpB,EAAQkb,KAmB5F,IAAI+jN,EAkDJ,OAnEA/wK,EAAAA,EAAAA,YAAU,KAENljD,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQ8pC,EAAS7xF,QACjBmyF,cAAc,KAGxB,GACH,IAQCr+C,EACA4vK,EACIn2N,IAAAA,cAACkB,GAAAA,EAAM,CACHjB,UAAU,qBACVa,KAAM,QAGPK,EAAAA,GAAAA,GAAQC,GACf+0N,EACIn2N,IAAAA,cAACqB,GAAAA,EAAQ,CACLpB,UAAU,qBACVa,KAAM,QAGPiwF,EAAAA,GAAAA,IAAc3vF,GACrB+0N,EACIn2N,IAAAA,cAAC+0H,GAAAA,EAAG,CACA90H,UAAU,qBACVa,KAAM,KACN0J,KAAMhB,EAAc,CAChBzS,GAAI,sCACJ0S,eAAgB,mBAIrB2+I,EACP+tE,EACIn2N,IAAAA,cAAC+0H,GAAAA,EAAG,CACA90H,UAAU,qBACVa,KAAM,KACN0J,KAAMhB,EAAc,CAChBzS,GAAI,oCACJ0S,eAAgB,iBAIrBmpG,IACPujH,EACIn2N,IAAAA,cAAC+0H,GAAAA,EAAG,CACA90H,UAAU,qBACVa,KAAM,KACN0J,KAAMhB,EAAc,CAChBzS,GAAI,uCACJ0S,eAAgB,qBAO5BzJ,IAAAA,cAAA,OAAKC,UAAU,8BACVk2N,EACDn2N,IAAAA,cAAA,UACI46C,IAAK0pD,EACLrkG,UAAU,kDACVqP,QA7DZ,WACI6wF,SAAAA,IACAlf,GACJ,EA2DY,aAAYz3E,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,gCAErEzJ,IAAAA,cAAA,KAAGC,UAAU,qBAEf,EAEZ+1N,GAAA3tN,UAAA,CA5HEk+C,MAAKzgD,IAAAA,KACL1E,MAAK0E,IAAAA,OAAAC,WACLk7E,YAAWn7E,IAAAA,KAAAC,WACXo6F,KAAIr6F,IAAAA,KACJ5O,OAAM4O,IAAAA,OAAAC,WACNqM,UAAStM,IAAAA,QAyHb,YCzFMm8F,GAAiB9pG,IAUV,IAVW,OACpBjB,EAAM,IACNqX,EACA6D,UAAWgkN,EAAa,WACxBl0H,EAAU,YACVk2G,EAAW,KACXj4G,EAAI,YACJlf,EAAW,cACXikH,EAAa,cACbD,GACI9sM,EACJ,MAAM9B,GAAWsxD,EAAAA,EAAAA,eACXvkD,GAAO2zC,EAAAA,EAAAA,cAAaz+C,IAAuB4hC,EAAAA,EAAAA,IAAQ5hC,EAAOpB,KAC1D6uB,GAAgBgxB,EAAAA,EAAAA,cAAaz+C,IAAuBmiB,EAAAA,EAAAA,IAAiBniB,KACrE8Z,GAAY2kC,EAAAA,EAAAA,cAAaz+C,GAAwB89N,GAgL3D,SAA6B99N,GACzB,MAAMsuB,GAAeC,EAAAA,EAAAA,IAAgBvuB,GACrC,OAAOsuB,EAAaG,OAASH,EAAapT,YAAa6H,EAAAA,EAAAA,IAAoB/iB,EAC/E,CAnL4E+9N,CAAoB/9N,KACtFuzI,GAAe90F,EAAAA,EAAAA,aAAYiQ,EAAAA,IAC3B5hC,GAAU2xB,EAAAA,EAAAA,aAAYzxB,EAAAA,IACtBgxM,GAASv/K,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAM8kD,MAAMk5K,SACzDj3N,GAAS03C,EAAAA,EAAAA,cAAaz+C,IAAuBqsD,EAAAA,EAAAA,IAAmBrsD,EAAOpB,IAAWw+C,EAAAA,GAAamsD,UAC/F6qH,GAAsB31K,EAAAA,EAAAA,aAAYoO,EAAAA,IAClCr/B,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5Bg8M,GAAgCx/K,EAAAA,EAAAA,cAAaz+C,GAAiF,UAA1DouE,EAAAA,EAAAA,IAAoBpuE,EAAO,8BAE9Fk+N,EAAkBC,IAAuBl9M,EAAAA,EAAAA,YAE1Cm9M,GAAoB/8M,EAAAA,EAAAA,UAAQ,KAC9B,GAAIsnE,EACA,OAAOA,EAGX,MAAM01I,EAAoBz0N,SAAS+8D,cACnC,MAAO,KACH/8D,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQm8J,EACR/xH,cAAc,KAGxB,CACL,GACF,CAAC3jB,IAEEixI,GAAoBz4M,EAAAA,EAAAA,cAAY,KAClC,IAAK,MAAMunE,KAASs1I,aAAM,EAANA,EAAQM,WACnBx2N,OAAO20C,OAAOuhL,EAAQt1I,IAGvBs1I,SAAAA,EAAQM,WAAW51I,GAAOrvE,MAC1Btb,GAASomG,EAAAA,EAAAA,GAAWzb,GAE5B,GACD,CAACs1I,EAAQjgO,IAENu+N,GAA0Bn7M,EAAAA,EAAAA,cAAYljB,UACxC4I,EAAEyK,iBACGxG,QAIoBpI,IAArBw7N,IAGJC,EAAoBrzN,EAAKrM,IAEzBm7N,WACqB77N,GAASmvB,EAAAA,EAAAA,IAA0BpiB,EAAKrM,MACjDL,QACJm1I,GACA97G,EAAAA,KAEJ0mM,OAAoBz7N,GACpBmlG,SAAAA,KACApuF,EAAAA,EAAAA,KAAaC,KAAK,GAADrR,OAAIykB,EAAO,eAAAzkB,OAAcyC,EAAK7C,YACnD,GACD,CAAC6C,EAAMozN,EAAkBtE,EAAmBrmF,EAAc1rC,EAAM/6E,EAAS/uB,IAY5E,IAVA+uD,EAAAA,EAAAA,YAAU,KACFr/B,GAAiB7uB,GACjBb,ECnIL,SAAkCgE,EAAgBnD,EAAgBkb,GACrE,OAAQ/b,GACG00B,QAAQyuB,IAAI,CACfnjD,GAASilJ,EAAAA,EAAAA,IAAcjhJ,EAAQnD,IAC/Bkb,GAAa/b,GAASs8G,EAAAA,EAAAA,IAAiBvgG,EAAWlb,KAG9D,CD4HqB2/N,CACL9wM,EACA7uB,EACAkb,GAER,GACD,CAACA,EAAWlb,EAAQ6uB,EAAe1vB,KAEjC+M,EACD,OAAO,KAGX,MAAM0oN,EAAS5mB,GAAiB32L,EAC1Bo+M,EAAmBpgN,QAAQ24L,GAAiBD,GAC5C6oB,EAAW7oB,GAAiBrkM,EAAAA,GAAkBwC,GAEpD,OACIpD,IAAAA,cAAA,OAAKC,UAAU,kCACXD,IAAAA,cAACg2N,GAAmB,CAChB5jN,UAAWA,EACXm0C,MAAOnjD,EAAKnC,OACZggF,YAAay1I,EACbt1N,MAAOgC,EAAKhC,MACZlK,OAAQkM,EAAKrM,GACbopG,KAAMA,IAEVngG,IAAAA,cAAA,OAAKC,UAAU,gCACXD,IAAAA,cAAC6rN,EAAoB,CACjB3pH,WAAYA,EACZ4pH,OAAQA,EACRvrN,SAAU6C,EAAK7C,SACflB,OAAQA,IAEZW,IAAAA,cAACqtN,EAAwB,CAACn2N,OAAQkM,EAAKrM,KACvCiJ,IAAAA,cAACquN,GAAkB,CACfjrN,KAAMA,EACNupN,iBAAkBA,EAClBmB,SAAUA,IAEd9tN,IAAAA,cAAA,WACAA,IAAAA,cAACotN,EAAmB,CAChBj0N,MAAOiK,EAAKjK,MACZwzN,iBAAkBA,EAClBpmK,MAAOnjD,EAAKnC,SAEhBjB,IAAAA,cAAA,OAAKC,UAAU,mCACXD,IAAAA,cAAC2wL,EAAAA,QAAS,CACNC,cAjJyB,wBAkJzBxtL,KAAMA,EACN+8F,KAAMA,EACN9gG,OAAQ6iG,EAAa,KAAO7iG,EAC5B+4M,YAAaA,KAIpBme,GACGv2N,IAAAA,cAAC+rN,EAA8B,CAC3Bt3G,OAAQv9G,IAGhB8I,IAAAA,cAAC82N,GAAsB,CACnBpK,oBAAqBA,EACrBwI,oBAAqB9xN,EAAKkiD,SAC1BqnK,iBAAkBA,IAEtB3sN,IAAAA,cAACysN,EAA0B,CACvB3mM,cAAeA,EACf4mM,oBAAqBA,EACrBC,iBAAkBA,EAClBzqH,WAAYA,EACZ9+F,KAAMA,EACN69E,YAAay1I,EACbv2H,KAAMA,KAGdngG,IAAAA,cAAA,OAAKC,UAAU,mCACXD,IAAAA,cAAA,MAAIC,UAAU,gCACdD,IAAAA,cAAC80N,GAAgC,CAC7BnI,iBAAkBA,EAClBpsN,SAAU6C,EAAK7C,WAEnBP,IAAAA,cAAC+0N,GAAyB,CACtBjvM,cAAeA,EACfosM,kBAAmBA,EACnB0C,wBAAyBA,EACzBjI,iBAAkBA,EAClB1rI,YAAay1I,EACbx/N,OAAQkM,EAAKrM,GACbopG,KAAMA,IAEVngG,IAAAA,cAAC20N,GAA0B,CACvB7uM,cAAeA,EACfgoM,SAAUA,EACVoE,kBAAmBA,EACnB0C,wBAAyBA,EACzBjI,iBAAkBA,EAClB1rI,YAAay1I,EACbtzN,KAAMA,EACN+8F,KAAMA,IAEVngG,IAAAA,cAAC2wL,EAAAA,QAAS,CACNC,cAAc,qBACdxtL,KAAMA,EACN+8F,KAAMA,EACN9gG,OAAQ6iG,EAAa,KAAO7iG,KAGlC,EAEZ4iG,GAAA55F,UAAA,CA7MEnR,OAAM4O,IAAAA,OAAAC,WACNwI,IAAGzI,IAAAA,OAAAC,WACHqM,UAAStM,IAAAA,OACTo8F,WAAUp8F,IAAAA,KACVsyM,YAAWtyM,IAAAA,KACXq6F,KAAIr6F,IAAAA,KACJm7E,YAAWn7E,IAAAA,KACXo/L,cAAap/L,IAAAA,OACbm/L,cAAan/L,IAAAA,QA4MjB,SAAe9F,IAAAA,KAAWiiG,I,89BEjLnB,SAAS80H,GAAiEr3N,GAAoC,IAAAs3N,EACjH,MAAO9wH,EAAQC,IAAW5sF,EAAAA,EAAAA,WAAS,IAE7B,KAAC4zC,EAAI,eAAEi5C,EAAgBt2F,QAASu2F,IAAmB/4C,EAAAA,EAAAA,IAAY,CACjE37C,KAAMu0F,EACN34C,aAAc44C,EACdhmB,qBAAsBC,EAAAA,GACtB3yB,WAAY,EAAC64C,EAAAA,EAAAA,OAAiB/lB,EAAAA,EAAAA,UAG5B,UAACgmB,EAAWnkG,OAAQokG,IAAoBC,EAAAA,EAAAA,IAAoBJ,EAAiB4wH,IAE7ErwH,GAAoB/4C,EAAAA,EAAAA,IAASw4C,GAC7BQ,GAAqBz4C,EAAAA,EAAAA,IAAWi4C,GAChCv5F,GAAO6zE,EAAAA,EAAAA,IAAQ0lB,IAEf,kBAACv4C,EAAiB,iBAAEE,IAAoBE,EAAAA,EAAAA,IAAgB,CAC1D04C,EACAC,EACA/5F,IAGEnC,GAAa8O,EAAAA,EAAAA,cAAY,KAC3B0sF,GAAQ,EAAM,GACf,IAEG+wH,EAA2C,QAA3BF,EAAGt3N,EAAMy3N,0BAAkB,IAAAH,EAAAA,EAAI,OAErD,OACIh3N,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACk3N,EAAgB92N,OAAAC,OAAA,CACbtJ,GAAI2I,EAAM03N,mBACVx8K,IAAKuS,EAAKC,aACVntD,UAAWP,EAAMkoG,sBACjBx6F,MAAO1N,EAAM23N,uBACTvpK,KAEHpuD,EAAM20D,UAGVkyC,GACGvmG,IAAAA,cAAC8gF,EAAAA,GAAc,CAAC/pF,GAAIugO,EAAAA,IAChBt3N,IAAAA,cAAC8mG,EAAAA,GAAe,CACZ7mG,UAAU,wCACV8mG,YAAY,GAEZ/mG,IAAAA,cAAC+gF,EAAAA,GAAoB,CAACjxE,QAASu2F,GAC3BrmG,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKuS,EAAKE,YACVjgD,MAAKtW,GAAAA,GAAA,GAAMsvG,GAAmBI,GAC9BvmG,UAAWk3C,IAAW,uBAAwB47B,EAAAA,GAAeG,QACzDllB,KAEJhuD,IAAAA,cAACiiG,GAAc,CACX/qG,OAAQwI,EAAMxI,OACdqX,IAAK7O,EAAM6O,IACX6D,UAAW1S,EAAM0S,UACjB8vF,WAAYxiG,EAAMwiG,WAClBk2G,YAAa14M,EAAM04M,YACnBj4G,KAAMx1F,EACNs2E,YAAavhF,EAAMuhF,YACnBikH,cAAexlM,EAAMwlM,cACrBD,cAAevlM,EAAMulM,oBASzD,CAAC8xB,GAAA1uN,UAAA,CApHG8uN,mBAAkBrxN,IAAAA,KAQlByI,IAAGzI,IAAAA,OAAAC,WAKHsuD,SAAQvuD,IAAAA,KAAAC,WAORk/L,cAAan/L,IAAAA,OAKbo/L,cAAap/L,IAAAA,OAKbsyM,YAAWtyM,IAAAA,KACXo8F,WAAUp8F,IAAAA,KASVm7E,YAAWn7E,IAAAA,KAEXy3E,SAAQz3E,IAAAA,MA4EZ,MAAMmxN,GAAyB,CAC3BvwH,SAAU,CACN/0F,KAAM4lN,EAAAA,GAAgBC,iBACtBtjM,MAAOqjM,EAAAA,GAAgBE,mBAE3BC,QAASC,EAAAA,GAAwB/qD,OCvJrC,K,kLCwCA,GA7BuC5rG,EAAAA,EAAAA,aACnC,CAAA7oE,EAA6DyiD,KAAQ,IAApE,UAAC36C,EAAS,aAAE2I,EAAY,UAAE5B,GAAgC7O,EAAlBuH,E,qWAAKmgD,CAAA1nD,EAAA2nD,GAC1C,MAAM83K,EAAiBhvN,EAAeA,EAAaQ,OAASpC,EAAY,EAElEqzM,EAAkBljK,IAAW,CAC/B+2E,gBAAgB,EAChB,CAACjuH,GAAYsM,QAAQtM,GACrB,YAAa23N,EAAS,IAG1B,OACI53N,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,QAAAI,OAAAC,OAAA,CACIJ,UAAWo6M,EACXzxM,aAAcA,EACdgyC,IAAKA,GACDl7C,IAEPk4N,EAAS,GACN53N,IAAAA,cAAA,QAAMC,UAAU,8BACX,IACA23N,GAGV,G,mtCC+CR,MAAM/xH,UAAmB7lG,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,6BA2BxB,KACtBE,KAAKukD,OAASvkD,KAAKukD,MAAMzjD,QAAUd,KAAKhD,MAAM8D,QAInDd,KAAKukD,MAAMzjD,MAAQd,KAAKhD,MAAM8D,MAAK,IACtChB,EAAA,oBAEsBykD,IACfvkD,KAAKhD,MAAMm4N,eAC4B,mBAA5Bn1N,KAAKhD,MAAMm4N,aAClBn1N,KAAKhD,MAAMm4N,aAAa5wK,GAExBvkD,KAAKhD,MAAMm4N,aAAaplN,QAAUw0C,GAI1CvkD,KAAKukD,MAAQA,CAAK,IACrBzkD,EAAA,gBAEkBrD,IAA8D,IAAA24N,EAC7E34N,EAAEyK,iBACFzK,EAAEy0D,kBAEElxD,KAAKhD,MAAMqmG,SACXrjG,KAAKhD,MAAMqmG,UAGL,QAAV+xH,EAAAp1N,KAAKukD,aAAK,IAAA6wK,GAAVA,EAAYp2M,OAAO,GACtB,CA/CDu5B,iBAAAA,GACQv4C,KAAKhD,MAAM0H,WACXihG,uBAAsB,KAAM,IAAA0vH,EACd,QAAVA,EAAAr1N,KAAKukD,aAAK,IAAA8wK,GAAVA,EAAYr2M,OAAO,GAG/B,CAEAy5B,kBAAAA,CAAmBC,GACXA,EAAU53C,QAAUd,KAAKhD,MAAM8D,QAC3Bd,KAAKhD,MAAMqyN,iBACX1pH,sBAAsB3lG,KAAKs1N,sBAE3Bt1N,KAAKs1N,uBAGjB,CAiCAryN,MAAAA,GACI,IAAIsyN,EAAuBv1N,KAAKhD,MAAMu4N,sBAAwB,GACzDA,IACDA,EACIj4N,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,cACJ0S,eAAe,WAK3B,MAAA8gI,EAOI7nI,KAAKhD,OAPH,MACF8D,EAAK,eACLyqH,EAAc,UACdnoB,EAAS,eACTuoB,EAAc,sBACdF,GAEHoc,EADM7qI,E,qWAAKmgD,CAAA0qF,EAAAzqF,GAGZ1oB,QAAQC,eAAe33B,EAAO,oBAC9B03B,QAAQC,eAAe33B,EAAO,WAC9B03B,QAAQC,eAAe33B,EAAO,wBAC9B03B,QAAQC,eAAe33B,EAAO,aAC9B03B,QAAQC,eAAe33B,EAAO,kBAC9B03B,QAAQC,eAAe33B,EAAO,mBAC9B03B,QAAQC,eAAe33B,EAAO,gBAE1BuuH,IAAmB7jB,EAAAA,IACnBhzE,QAAQC,eAAe33B,EAAO,kBAC9B03B,QAAQC,eAAe33B,EAAO,kBAGlC,MAAMw4N,EAAel4N,IAAAA,cACjBiuH,GAAkB,QAAOn3H,EAAAA,EAAA,GAElB4I,GAAK,IACRk7C,IAAKl4C,KAAKy1N,YACVvvN,aAAcpF,KAIhB6kH,EAAkB3lH,KAAKhD,MAAMqmG,UAAYooB,GAA0BroB,GAAatiG,GAEtF,OACIxD,IAAAA,cAAA,OAAKC,UAAU,iBACVi4N,EACA7vG,GACGroH,IAAAA,cAACq1D,EAAAA,EAAW,CAACnnD,MAAO+pN,GAChBj4N,IAAAA,cAAA,UACI,cAAY,cACZC,UAAWk3C,IAAWk3E,EAAgB,uBACtC/+G,QAAS5M,KAAKqjG,SAEd/lG,IAAAA,cAAA,QACIC,UAAU,gBACV,cAAY,QAEZD,IAAAA,cAAA,KAAGC,UAAU,8BAOzC,EACHuC,EA5HYqjG,EAAU,eAGG,CAClBksH,kBAAkB,EAClBvuN,MAAO,GACPsiG,WAAW,IA0HnB,MAAMsyH,EAAYp4N,IAAAA,YAAyE,CAACN,EAAOk7C,IAC/F56C,IAAAA,cAAC6lG,EAAUzlG,OAAAC,OAAA,CACPw3N,aAAcj9K,GACVl7C,MAGZ04N,EAAU5xN,YAAc,aAExB,S,srCC9MA,MAAM+W,EAA8D,CAChEonG,MAAMztD,EAAAA,EAAAA,gBAAe,CACjBmhK,uBAAwB,CACpBthO,GAAI,kDACJ0S,eAAgB,iFAEpBi5I,OAAQ,CACJ3rJ,GAAI,kCACJ0S,eAAgB,wBAEpByyD,OAAQ,CACJnlE,GAAI,kCACJ0S,eAAgB,kBAEpBrK,QAAS,CACLrI,GAAI,mCACJ0S,eAAgB,mDAEpByE,MAAO,CACHnX,GAAI,iCACJ0S,eAAgB,kCAGxBo7G,KAAK3tD,EAAAA,EAAAA,gBAAe,CAChBmhK,uBAAwB,CACpBthO,GAAI,iDACJ0S,eAAgB,2FAEpBi5I,OAAQ,CACJ3rJ,GAAI,iCACJ0S,eAAgB,kCAEpByyD,OAAQ,CACJnlE,GAAI,iCACJ0S,eAAgB,4BAEpBrK,QAAS,CACLrI,GAAI,kCACJ0S,eAAgB,6DAEpByE,MAAO,CACHnX,GAAI,gCACJ0S,eAAgB,4CAGxB6uN,SAASphK,EAAAA,EAAAA,gBAAe,CACpBmhK,uBAAwB,CACpBthO,GAAI,qDACJ0S,eAAgB,oFAEpBi5I,OAAQ,CACJ3rJ,GAAI,qCACJ0S,eAAgB,2BAEpByyD,OAAQ,CACJnlE,GAAI,qCACJ0S,eAAgB,kBAEpBrK,QAAS,CACLrI,GAAI,sCACJ0S,eAAgB,sDAEpByE,MAAO,CACHnX,GAAI,oCACJ0S,eAAgB,qCAGxBg7G,QAAQvtD,EAAAA,EAAAA,gBAAe,CACnBmhK,uBAAwB,CACpBthO,GAAI,oDACJ0S,eAAgB,mFAEpBi5I,OAAQ,CACJ3rJ,GAAI,oCACJ0S,eAAgB,0BAEpBrK,QAAS,CACLrI,GAAI,qCACJ0S,eAAgB,uDAGxB8uN,KAAKrhK,EAAAA,EAAAA,gBAAe,CAChBgF,OAAQ,CACJnlE,GAAI,iCACJ0S,eAAgB,wBAEpByE,MAAO,CACHnX,GAAI,gCACJ0S,eAAgB,4CAyDb,MAAMi9E,UAAyB1mF,IAAAA,cAC1CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,kBA2BG,IAAYE,KAAKgH,SAAS,CAACmC,MAAM,MAAOrJ,EAAA,kBAExCwiH,IAChBtiH,KAAKy0H,YAEL,MAAMxwC,EAAS7vF,EAAA,GAAO4L,KAAKpK,MAAMkgO,mBAIjC,GAHA7xI,EAAUtnF,OAASqD,KAAKpK,MAAMquF,UAC9BjkF,KAAKhD,MAAMqD,QAAQo8G,UAAUx4B,GAEzBq+B,EAAS,CACT,MAAMl2B,EAAO,CAAC1+D,SAAUxQ,EAAAA,GAAY64M,kCAAmCh6M,QAASkoE,EAAUloE,QAASte,KAAMwmF,EAAUloE,QAASjb,MAAO,QACnId,KAAKhD,MAAMqD,QAAQ0tB,gBAAgBq+D,EAAKrwE,QAAS,CAACqwE,GACtD,KACHtsF,EAAA,iBAEkBwiH,IAGf,GAFAtiH,KAAKy0H,YAEDnS,EAAS,CACT,MAAM3lH,EAAMvI,EAAA,GAAO4L,KAAKpK,MAAMkgO,mBACxB1pI,EAAO,CAAC1+D,SAAUxQ,EAAAA,GAAY64M,kCAAmCh6M,QAASpf,EAAOof,QAASte,KAAMd,EAAOof,QAASjb,MAAO,SAC7Hd,KAAKhD,MAAMqD,QAAQ0tB,gBAAgBq+D,EAAKrwE,QAAS,CAACqwE,GACtD,KACHtsF,EAAA,2BAE4B,IACrBE,KAAKhD,MAAM84N,oBAAsB9iL,EAAAA,GAAayvC,cACvC5nE,EAAS7a,KAAKpK,MAAMquF,WAAc3mF,IAAAA,cAACgK,EAAAA,iBAAqBuT,EAAS7a,KAAKpK,MAAMquF,WAAW0xI,wBAA6B,GAGxH96M,EAAS7a,KAAKpK,MAAMquF,WAAc3mF,IAAAA,cAACgK,EAAAA,iBAAqBuT,EAAS7a,KAAKpK,MAAMquF,WAAWvnF,SAAc,KAvD5GsD,KAAKpK,MAAQ,CACTuT,MAAM,EACN2sN,kBAAmB,CAAC,EACpB7xI,UAAWjnF,EAAMinF,WAAa,SAEtC,CAEO1rC,iBAAAA,GACHv4C,KAAKhD,MAAMqD,QAAQ21N,kBAAkBxsN,MAChCwI,IACG,GAAqB,OAAjBA,EAAO/d,KACP,OAEJ,MAAM0I,EAASqV,EAAO/d,KAChBgiO,EAAiBt5N,aAAM,EAANA,EAAQklJ,OACzBq0E,EAAmD,KAA7Bl2N,KAAKhD,MAAMm5N,cAEvCn2N,KAAKgH,SAAS,CACV8uN,kBAAmBn5N,EACnBwM,KAAMU,SAAQlN,aAAM,EAANA,EAAQA,UAAWq2C,EAAAA,GAAayvC,eAAkBwzI,GAAkBC,IACpF,GAGd,CAmCOjzN,MAAAA,GAAsB,IAAAmzN,EACzB,MAAMC,GAAyC,QAA5BD,EAAAp2N,KAAKpK,MAAMkgO,yBAAiB,IAAAM,OAAA,EAA5BA,EAA8Bz5N,SAAU,GACrD25N,EAAoBz7M,EAASw7M,GAAe/4N,IAAAA,cAACgK,EAAAA,iBAAqBuT,EAASw7M,GAAY7qN,OAAY,GAEnG+qN,EAAsBv2N,KAAKw2N,qBAC3BC,EAAqB57M,EAAS7a,KAAKpK,MAAMquF,WAAc3mF,IAAAA,cAACgK,EAAAA,iBAAqBuT,EAAS7a,KAAKpK,MAAMquF,WAAW+7D,QAAa,GACzH02E,EAAqB77M,EAASw7M,GAAe/4N,IAAAA,cAACgK,EAAAA,iBAAqBuT,EAASw7M,GAAY78J,QAAa,GAErGm9J,EACFr5N,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,wBAIjB6vN,EAAe52N,KAAKhD,MAAM84N,oBAAsB9iL,EAAAA,GAAayvC,cAEnE,OACInlF,IAAAA,cAACklH,EAAAA,EAAY,CACTr5G,KAAMnJ,KAAKpK,MAAMuT,KACjBqC,MAAO8qN,EACP55N,QAAS65N,EACT19I,kBAAmB49I,EACnBllK,UAAWvxD,KAAKuxD,UAChBunB,iBAAkB49I,EAClBlxK,SAAUxlD,KAAKwlD,SACft7C,SAAUlK,KAAKhD,MAAMkN,SACrB0sN,aAAcA,EACdC,aAAcF,GAG1B,EACH72N,EA9FoBkkF,EAAgB,aA/CjCmyI,cAAa/yN,IAAAA,OAKb0yN,kBAAiB1yN,IAAAA,OAKjB6gF,UAAS7gF,IAAAA,OAKT6G,OAAM7G,IAAAA,KAKN8G,SAAQ9G,IAAAA,KAER/C,QAAO+C,IAAAA,MAAA,CAKH4yN,gBAAe5yN,IAAAA,KAAAC,WAKfo5G,UAASr5G,IAAAA,KAAAC,WAKT0qB,gBAAe3qB,IAAAA,KAAAC,aAAAA,aCnHvB,SAAe+B,EAAAA,EAAAA,UAlBf,SAAyBxP,GACrB,MAAM,cAACwtB,GAAiBxtB,EAAMuyB,SAAS3nB,MACvC,MAAO,CACH21N,eAAet1J,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY64M,kCAAmC3yM,EAAe,IACxF0yM,mBAAmB7zK,EAAAA,EAAAA,IAAmBrsD,EAAOwtB,GAErD,IAEA,SAA4BzvB,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB0wN,gBAAe,KACfv5G,UAAS,KACT1uF,gBAAeA,EAAAA,IAChBp6B,GAEX,GAEA,CAA4DqwF,E,kSCrBrD,SAAS8yI,IACZ,OAAQnjO,GACG00B,QAAQyuB,IAAI,CACfnjD,GAeDE,gBAYGw0B,QAAQyuB,IAFU,GAEGn2C,KAAI9M,UAC3B,IAAKkjO,CAAAA,EAAkB7tI,EAAQ70F,IAE3B,YADA2gC,QAAQ8C,IAAI,WAAD75B,OAAYirF,EAAQ70F,GAAE,gCAOrC,IAAI2iO,EASA/qN,EAZJ+oB,QAAQ8C,IAAI,mBAAD75B,OAAoBirF,EAAQ70F,GAAE,QAIzC,IACI2iO,EAAU9tI,EAAQ+tI,MACtB,CAAE,MAAOx6N,GAEL,YADAu4B,QAAQhhC,MAAM,iBAADiK,OAAkBirF,EAAQ70F,IAAMoI,EAEjD,CAIA,IACIwP,QAAc+qN,EAAQ/qN,KAC1B,CAAE,MAAOxP,GAEL,YADAu4B,QAAQhhC,MAAM,2BAADiK,OAA4BirF,EAAQ70F,IAAMoI,EAE3D,CAWAu4B,QAAQ8C,IAAI,wBAAD75B,OAAyBirF,EAAQ70F,GAAE,QAE9C,KAeZ,SAA2BA,EAAY6iO,GACnC,MAAMC,EAAS,IAAID,EACbE,EAAW,IAAIC,EAAAA,EAAehjO,GAEpC8iO,EAAOv/L,WAAWw/L,EAAUxjO,EAAAA,QAChC,CAnBgB0jO,CAAkBpuI,EAAQ70F,GAAI4X,EAAMomD,QACxC,CAAE,MAAO51D,GACLu4B,QAAQhhC,MAAM,0CAADiK,OAA2CirF,EAAQ70F,IAAMoI,EAC1E,CAEAu4B,QAAQ8C,IAAI,WAAD75B,OAAYirF,EAAQ70F,GAAE,iBAAgB,KAG9C,CAACJ,MAAM,MAxEVN,GAOD,CAACA,EAAUsf,IACPoV,QAAQC,QAAQ,CAACr0B,MAAM,OALtC,C,0HCWO,SAASsjO,IACZ,OAAO1jO,MAAOF,EAAUsf,KAEpB,UACUoV,QAAQyuB,IAAI,CACdnjD,GAASgmC,EAAAA,EAAAA,OACThmC,GAAS6jO,EAAAA,EAAAA,QAEjB,CAAE,MAAOxjO,GAEL,OADAL,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CACHyjO,UAAU,EAElB,CAGA,KAAKn1E,EAAAA,EAAAA,MACD,MAAO,CACHm1E,UAAU,EACVC,eAAe,GAKvB,MAAMC,EAAgB1kN,IAAWkV,SAASmrB,QAAQqkL,eAAiBriO,EAAAA,GAAQsiO,mBAC3EjkO,EAAS,CAAC6E,KAAMuhC,EAAAA,GAAa89L,wBAAyB5jO,KAAM0jO,IAE5D,UACUtvM,QAAQyuB,IAAI,CACdnjD,GAASmkO,EAAAA,EAAAA,OACTnkO,GAASokO,EAAAA,EAAAA,OACTpkO,GAASstB,EAAAA,EAAAA,OACTttB,GAASiyJ,EAAAA,EAAAA,SAGbjyJ,GAAS4yJ,EAAAA,EAAAA,KAAiB/rI,EAAAA,EAAAA,IAA0BvH,OACpDtf,GAAS4mG,EAAAA,EAAAA,KACb,CAAE,MAAOvmG,GAEL,OADAL,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CACHyjO,UAAU,EAElB,CAEA,MAAO,CACHA,UAAU,EACVC,eAAe,EAClB,CAET,CAEO,SAASM,EAA2Bx/N,EAAcyC,EAAgB5G,GACrE,OAAOR,UAEHF,EAAS,CACL6E,KAAMc,EAAAA,GAAY2+N,+BAClBhkO,KAAM,CACFikO,WAAY7jO,EACZkG,SAAUlG,EACVmE,OACAyC,eAGD,CAAChH,MAAM,GAEtB,CAEO,SAASkkO,EAAkC//H,EAAkBh4E,GAChE,OAAOvsB,MAAOF,EAAUsf,KAAa,IAAAmlN,EACjC,MAAMxiO,EAAQqd,IAEd,KADoButB,EAAAA,EAAAA,IAAyB5qC,GAGzC,YADAuqB,EAAAA,EAAAA,IAA0BC,GAI9B,MAAMsa,GAAQxZ,EAAAA,EAAAA,IAAmBtrB,GAE3B4qB,GAAwBC,EAAAA,EAAAA,IAA2B7qB,GAEzD,GAAI8kC,EAAMh0B,OAAS,IAAM8Z,EAErB,YADAL,EAAAA,EAAAA,IAA0BC,GAI9B,MAAMi4M,QAAgC1kO,GAAS2kO,EAAAA,EAAAA,OAC/C,GAAID,SAAAA,EAAyBpkO,KAEzB,YADAksB,EAAAA,EAAAA,IAA0BC,GAI9B,MAAMm4M,QAAuB5kO,GAASioD,EAAAA,EAAAA,IAAY,EAAG1X,EAAAA,GAAQ+jH,mBAAoB,CAACvpJ,MAAOwlC,EAAAA,GAAQs0L,qBACjG,GAAID,EAAevkO,MAEf,YADAmsB,EAAAA,EAAAA,IAA0BC,GAG9B,MAAMme,GAAcle,EAAAA,EAAAA,IAAepN,KAC7BwlN,EAAmC,QAAtBL,EAAGG,EAAetkO,YAAI,IAAAmkO,OAAA,EAAnBA,EAAqBvoN,QACvC,CAACqrG,EAAkCK,KAC/BL,EAAIK,EAAKlnH,IAAMknH,EACRL,IAEX,CAAC,GAEDu9G,IAAiBC,EAAAA,EAAAA,IAAkBn6L,EAAak6L,GAChDrgI,EAAQ9oF,KAAK,yBAIjB6Q,EAAAA,EAAAA,IAA0BC,EAAa,CAE/C,CAEO,SAASu4M,EAAwBl8N,GACpC,MAAO,CAAC9I,EAAUsf,KAEd,MAAM2lN,EAA0BzjN,GAAwBA,EAAM0jN,cAAgB7pI,cAAgB75E,EAAMy4F,SAMpG,GAJInxG,EAAEzB,MAAQypE,EAAAA,GAAgBq0J,QAAUF,EAAuBn8N,KAC3Du4B,QAAQ8C,IAAI,yCACZnhC,EAAAA,EAAAA,IAAuB,KAAK,GAAO,IAEnC8F,EAAEzB,MAAQypE,EAAAA,GAAgBs0J,OAASH,EAAuBn8N,GAAI,CAK9D,IAJmB4jB,EAAAA,EAAAA,IAAepN,KAK9B,OAIJ,SAAS+lN,IACLvpN,SAASyrF,QACb,CACAlsF,OAAO6rD,iBAAiB,QAASm+J,EACrC,EAER,C,+PC9JO,MAAMC,EACTp9N,UAAAA,CAAWrH,EAAgB0kO,EAAmBxrM,EAAkBvY,GAAoD,IAArCnY,EAA8BuG,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC7G,MAAM41N,EAAaz7N,OAAOC,OAAO,CAC7B+vB,WACAl1B,KAAM2c,EACNikN,iBAAkBC,EAAeH,GACjC,CAAC3pK,EAAAA,mBAAoB/6D,GACtBwI,GAeHs8N,EAAAA,MAAsB,QAASH,EAdf,CACZ/rN,QAAS,CACLmsN,GAAI,WAERh9N,KAAM,CACFwjB,KAAM,GACNy5M,SAAU,GACVt5M,OAAQ,GACR1U,MAAO,GACPnN,IAAK,IAETo7N,YAAa,8BAIrB,CAEApqK,iBAAAA,CAAkB76D,EAAgB0kO,EAAmBQ,EAAqBvkN,GAAoD,IAArCnY,EAA8BuG,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EACvH,MAAM41N,EAAaz7N,OAAOC,OAAO,CAC7B+vB,SAAUisM,GAAiBxkN,GAC3B3c,KAAM2c,EACN,CAACo6C,EAAAA,mBAAoB/6D,EACrB4kO,iBAAkBC,EAAeH,IAClCl8N,GAEG3B,EAAU,CACZ+R,QAAS,CACL8pJ,QAAS,CACLz5J,KAAMi8N,EACNE,KAAMC,EAAQ1kN,MAK1BmkN,EAAAA,MAAsBnkN,EAAOgkN,EAAY99N,EAC7C,CAEAy+N,WAAAA,CAAYtlO,EAAgB0kO,EAAmBxrM,EAAkBjwB,GAC7D67N,EAAAA,KACI5rM,EACAjwB,EACA,CACIsiB,KAAM,GACNy5M,SAAU,GACVt5M,OAAQ,GACR1U,MAAO,GACPnN,IAAK,GACL+6N,iBAAkBC,EAAeH,GACjC,CAAC3pK,EAAAA,mBAAoB/6D,GAEzB,CACI4Y,QAAS,CACLmsN,GAAI,WAERE,YAAa,8BAGzB,EAGJ,SAASJ,EAAeH,GACpB,OAAOA,IAAa7qI,EAAAA,EAAAA,IAAc6qI,GAAa,4BAA8B,aACjF,CAEA,SAASW,EAAQpmD,GACb,MAAMmmD,EAA6BG,EAAAA,UAAUtmD,GAQ7C,YANan7K,IAATshO,GAGA5kM,QAAQymF,KAAK,SAADx9G,OAAUw1K,EAAS,0BAG5BmmD,QAAAA,EAAQ,EACnB,CAEA,SAASD,GAAiBlmD,GACtB,MAAM/lJ,EAA+BssM,EAAAA,cAAcvmD,GAOnD,YALiBn7K,IAAbo1B,GAEAsH,QAAQymF,KAAK,SAADx9G,OAAUw1K,EAAS,6BAG5B/lJ,QAAAA,EAAYusM,EAAAA,iBACvB,C,kRC5FA,MAAMC,GAAyC/6K,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,0CAAVq7C,CAAU,qfAmCnDg7K,GAAgBh7K,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,iBAAXq7C,CAAW,sBAI3BtkC,IACF25C,EAAAA,GAAAA,gBAAe,CACX4lK,IAAK,CACD/lO,GAAI,gBACJ0S,eAAgB,WAEpBszN,KAAM,CACFhmO,GAAI,iBACJ0S,eAAgB,iBAEpBuoJ,MAAO,CACHj7J,GAAI,kBACJ0S,eAAgB,SAEpBuzN,MAAO,CACHjmO,GAAI,kBACJ0S,eAAgB,SAEpBwzN,MAAO,CACHlmO,GAAI,kBACJ0S,eAAgB,SAEpByzN,aAAc,CACVnmO,GAAI,yBACJ0S,eAAgB,2BAEpB0zN,YAAa,CACTpmO,GAAI,wBACJ0S,eAAgB,qBAEpBuuE,KAAM,CACFjhF,GAAI,iBACJ0S,eAAgB,aAEpB2zN,MAAO,CACHrmO,GAAI,kBACJ0S,eAAgB,cAEpBmmK,IAAK,CACD74K,GAAI,gBACJ0S,eAAgB,mBAEpBe,KAAM,CACFzT,GAAI,iBACJ0S,eAAgB,eAItB4zN,GAAgCr9N,IAAAA,YAGpC,CAAA7H,EAA+CyiD,KAAQ,IAAtD,KAACj7C,EAAI,QAAE2P,EAAO,eAAEqhN,EAAc,YAAE2M,GAAYnlO,EAC3C,MAAMoR,GAAOiQ,EAAAA,GAAAA,WAEP+jN,GAAgB9jN,EAAAA,EAAAA,cAAY,KAC9BnK,EAAQ3P,EAAK6D,MAAOmtN,EAAe,GACpC,CAACrhN,EAAS3P,EAAK6D,MAAOmtN,IAEnB6M,EAAYjgN,GAAS5d,EAAKzE,MAC5BqO,EAAKC,cAAc+T,GAAS5d,EAAKzE,OACjCyE,EAAKzE,KAET,OACI8E,IAAAA,cAAC48N,GAAsC,CACnChiL,IAAKA,EACL36C,UAAWk3C,IAAW,CAACjxC,SAAUo3N,IACjChuN,QAASiuN,GAETv9N,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,aAAasmL,EAAAA,EAAAA,IAAwB99N,EAAKzE,SACpEsiO,EACDx9N,IAAAA,cAAC68N,GAAa,UAAAl8N,OAAOhB,EAAK6D,MAAK,MACM,IAGjD65N,GAA8B72N,YAAc,gCAE5C,YClHMk3N,GAAoC,GAC1Cj4M,EAAAA,GAAUk4M,WAAWj1N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,OAAQsI,MAAOypI,MAC1GxnH,EAAAA,GAAUm4M,YAAYl1N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,QAASsI,MAAOypI,MAC5GxnH,EAAAA,GAAUo4M,YAAYn1N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,QAASsI,MAAOypI,MAC5GxnH,EAAAA,GAAUq4M,YAAYp1N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,QAASsI,MAAOypI,MAC5GxnH,EAAAA,GAAUs4M,mBAAmBr1N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,eAAgBsI,MAAOypI,MAC1HxnH,EAAAA,GAAUu4M,kBAAkBt1N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,cAAesI,MAAOypI,MACxHxnH,EAAAA,GAAUw4M,WAAWv1N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,OAAQsI,MAAOypI,MAC1GxnH,EAAAA,GAAUy4M,WAAWx1N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,OAAQsI,MAAOypI,MAC1GxnH,EAAAA,GAAU04M,UAAUz1N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,MAAOsI,MAAOypI,MACxGxnH,EAAAA,GAAU24M,YAAY11N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,QAASsI,MAAOypI,MAC5GxnH,EAAAA,GAAU44M,UAAU31N,SAASukI,GAAcywF,GAAiB1rN,KAAK,CAACpQ,MAAOqrI,EAAW/xI,KAAM,MAAOsI,MAAOypI,MACxGywF,GAAiB7kK,MAAK,CAACjW,EAAGtwC,IAAMswC,EAAEhhD,MAAMk3D,cAAcxmD,EAAE1Q,SAEjD,MAAM08N,WAAoCx8D,GAAAA,EAC7C4zB,oBAAAA,CAAqBzW,EAAiB8wC,GAClC,MAAMwO,EAAY,uBAAwB7vM,KAAKuwJ,EAAQh8K,eACvD,GAAIs7N,EAAU,CACV,MAAM5N,EAAiB4N,EAAS,GAEhC,IAAIC,EAA8B,IAAId,IAClC/M,EAAevnN,OAAS,GACxBo1N,EAAaA,EAAWr7N,QAAQ8pI,GAAcA,EAAUrrI,MAAMiQ,WAAW8+M,EAAe1tN,iBACxFu7N,EAAaA,EAAW1sN,MAAM,EAAG,KAEjC0sN,EAAa,CACT,CAAC58N,MAAO,OAAQ1G,KAAM,OAAQsI,MAAO,OACrC,CAAC5B,MAAO,OAAQ1G,KAAM,OAAQsI,MAAO,QACrC,CAAC5B,MAAO,cAAe1G,KAAM,cAAesI,MAAO,QACnD,CAAC5B,MAAO,eAAgB1G,KAAM,eAAgBsI,MAAO,QACrD,CAAC5B,MAAO,MAAO1G,KAAM,MAAOsI,MAAO,OACnC,CAAC5B,MAAO,QAAS1G,KAAM,QAASsI,MAAO,OACvC,CAAC5B,MAAO,QAAS1G,KAAM,QAASsI,MAAO,OACvC,CAAC5B,MAAO,QAAS1G,KAAM,QAASsI,MAAO,OACvC,CAAC5B,MAAO,QAAS1G,KAAM,QAASsI,MAAO,QAI/C,MAAMotN,EAAQ4N,EAAWn7N,KAAK4pI,GAAcA,EAAUzpI,QAEtDusN,EAAgB,CACZY,iBACAC,QACAnlN,MAAO+yN,EACP7gO,UAAW0/N,IAEnB,CAEA,OAAO9wN,QAAQgyN,EACnB,CAEAE,aAAAA,GACI,OAAO,CACX,CAEAC,gBAAAA,GACI,MAAO,MACX,E,mDCxDJ,MAAMC,GAAuB98K,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,wBAAVq7C,CAAU,+IAUjC+8K,GAAe/8K,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,gBAAbq7C,CAAa,qSAgB5Bg9K,GAAc1mO,IAA8F,IAA7F,eAAC2mO,EAAc,WAAEC,EAAU,YAAE3pH,EAAW,kBAAE4pH,EAAiB,OAAEC,GAAc9mO,EAC5F,MAAMoR,GAAOiQ,EAAAA,GAAAA,WACb,IAAI4e,EAAU8mM,EAAAA,GAAkB/7N,QAAQA,GAAiC,MAAtBA,EAAOm3C,YAA4C,OAAtBn3C,EAAOm3C,aAKvF,MAJmB,UAAfykL,IACA3mM,EAAU+mM,EAAAA,GAAuBh8N,QAAQA,GAAiC,MAAtBA,EAAOm3C,YAA4C,OAAtBn3C,EAAOm3C,cAGxF2kL,EACOj/N,IAAAA,cAAAA,IAAAA,SAAA,MAGPg/N,EAEIh/N,IAAAA,cAAC2+N,GAAoB,CAAC5nO,GAAG,eACrBiJ,IAAAA,cAAA,KAAGC,UAAU,8BACbD,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,2BAM3B2rG,EAAYhsG,OAAS,GAA6C,MAAxCgsG,EAAYA,EAAYhsG,OAAS,GAEvDpJ,IAAAA,cAAC2+N,GAAoB,CAAC5nO,GAAG,eACrBiJ,IAAAA,cAAA,KAAGC,UAAU,8BACbD,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,2BAO3BzJ,IAAAA,cAAC2+N,GAAoB,CAAC5nO,GAAG,eACrBiJ,IAAAA,cAAA,KAAGC,UAAU,gCACbD,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,6BAElB2uB,EAAQ/0B,KAAKF,GACVnD,IAAAA,cAAC4+N,GAAY,CACTlhO,IAAKyF,EAAOm3C,WACZhrC,QAASA,IAAMwvN,EAAe37N,EAAOm3C,aAErCt6C,IAAAA,cAAA,QAAMkO,MAAO3E,EAAKC,cAAcrG,EAAO/D,UAClC+D,EAAOm3C,eAID,EAE7BukL,GAAAx2N,UAAA,CAvFEy2N,eAAch5N,KAAAA,KAAAC,WACdg5N,WAAUj5N,KAAAA,OAAAC,WACVqvG,YAAWtvG,KAAAA,OAAAC,WACXi5N,kBAAiBl5N,KAAAA,KAAAC,WACjBk5N,OAAMn5N,KAAAA,KAAAC,YAqFV,YC3EMq5N,GAAiBjnO,IAA8F,IAA7F,YAACi9G,EAAW,eAAEiqH,EAAc,WAAEN,EAAU,gBAAEO,EAAe,eAAE78N,EAAc,MAAEif,GAAavpB,EAC5G,MAAMonO,GAAyB9lN,EAAAA,EAAAA,cAAatW,IACpCiyG,EAAY9+D,SAAS,MAA+B,IAAvB8+D,EAAYhsG,QACzCi2N,EAAejqH,EAAcjyG,GAC7Bue,EAAM0zF,EAAYhsG,OAASjG,EAAOiG,UAElCi2N,EAAejqH,EAAc,IAAMjyG,GACnCue,EAAM0zF,EAAYhsG,OAASjG,EAAOiG,OAAS,GAC/C,GACD,CAACgsG,EAAaiqH,EAAgB39M,IAE3B89M,GAAuB/lN,EAAAA,EAAAA,cAAY,CAACjW,EAAemtN,KACrD,MAAM8O,EAAej8N,EAAMyjC,QAAQ0pL,EAAgB,IACnD0O,EAAejqH,EAAcqqH,EAAe,KAC5C/9M,EAAM0zF,EAAYhsG,OAASq2N,EAAar2N,OAAS,EAAE,GACpD,CAACgsG,EAAaiqH,EAAgB39M,IAE3Bg+M,GAAoB3oL,EAAAA,EAAAA,aAAY4oL,EAAAA,IAEtC,GAAmB,KAAfZ,GAAoC,aAAfA,GAA4C,UAAfA,EAClD,OACI/+N,IAAAA,cAAC6+N,GAAW,CACRC,eAAgBS,EAChBR,WAAYA,EACZ3pH,YAAaA,EACb4pH,kBAAmBzyN,QAAQ+yN,GAAmBA,EAAgB7zN,MAAMrC,OAAS,IAAyB,IAApB3G,GAClFw8N,QAAQK,aAAe,EAAfA,EAAiB3hO,aAAciiO,GAAAA,IAKnD,MAAMC,EAAsBH,EAAkBv0N,MAAKvN,IAAqB,IAApB,SAACX,GAAcW,EAC/D,OAAImhO,IAAe9hO,CAGP,IAGhB,IAAK4iO,EACD,OAAO,KAGX,MAAM/2J,EAAiB+2J,EAAoBliO,UAE3C,OACIqC,IAAAA,cAAC8/N,GAAAA,EAAa,KACV9/N,IAAAA,cAAC8oE,EAAS,CACNprE,IAAKmiO,EAAoB5iO,SACzB8iO,eAAgBP,EAChBpqH,YAAaA,IAEL,EAEtBgqH,GAAA/2N,UAAA,CA7DE+sG,YAAWtvG,KAAAA,OAAAC,WACXs5N,eAAcv5N,KAAAA,KAAAC,WACdg5N,WAAUj5N,KAAAA,OAAAC,WACVtD,eAAcqD,KAAAA,OAAAC,WAEd2b,MAAK5b,KAAAA,KAAAC,YA0DT,Y,gBChEA,MAAMi6N,GAAuBn+K,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,wBAAVq7C,CAAU,ukBA0CjCo+K,GAAcp+K,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,eAAbq7C,CAAa,iOAoB3Bq+K,GAAcA,CAAA/nO,EAAqE+uD,KAA0C,IAA9G,YAACkuD,EAAW,WAAE2pH,EAAU,eAAEM,EAAc,UAAE1oJ,EAAS,MAAEj1D,GAAavpB,EACnF,MAAMoR,GAAOiQ,EAAAA,GAAAA,WACb,IAAI2mN,EAAoB52N,EAAKC,cAAc,CAACzS,GAAI,oBAAqB0S,eAAgB,WAElE,aAAfs1N,GAA4C,KAAfA,IAC7BoB,EAAoB52N,EAAKC,cAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,qBAE3E,UAAfs1N,IACAoB,EAAoB52N,EAAKC,cAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,kBAG3F,MAAMpT,GAAWsxD,EAAAA,EAAAA,eAEXy4K,GAAsB3mN,EAAAA,EAAAA,cAAata,IACrCkgO,EAAelgO,EAAEq7D,OAAOh3D,MAAM,GAC/B,CAAC67N,IAEEgB,GAAc5mN,EAAAA,EAAAA,cAAY,KAC5B4lN,EAAe,IACfhpO,GAASiqO,EAAAA,GAAAA,IAAkB,KAC3BjqO,GAASkqO,EAAAA,GAAAA,IAAiB,aAC1B7+M,EAAM,EAAE,GACT,CAACA,EAAO29M,IAEX,OACIr/N,IAAAA,cAACggO,GAAoB,KACjBhgO,IAAAA,cAAA,KAAGC,UAAU,sBACbD,IAAAA,cAAC6lG,GAAAA,EAAU,CACPjrD,IAAKsM,EACLjnD,UAAW,0BACX,mBAAkB,uBAClB,aAAYkgO,EACZ97N,YAAa87N,EACb38N,MAAO4xG,EACPzyG,SAAUy9N,EACVllO,KAAK,SACL62N,kBAAkB,EAClBjsH,WAAW,EACX1+F,WAAW,EACXuvE,UAAWA,EACXnhB,SAAU,IAEb4/C,EAAYhsG,OAAS,GAClBpJ,IAAAA,cAACigO,GAAW,CACRhgO,UAAU,2BACVqP,QAAS+wN,GAETrgO,IAAAA,cAAA,KAAGC,UAAU,2BACbD,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,mBACH0S,eAAe,WAIR,EAE7By2N,GAAA73N,UAAA,CA/DE+sG,YAAWtvG,KAAAA,OAAAC,WACXg5N,WAAUj5N,KAAAA,OAAAC,WACVs5N,eAAcv5N,KAAAA,KAAAC,WACd4wE,UAAS7wE,KAAAA,KAAAC,WACT2b,MAAK5b,KAAAA,KAAAC,YA6DT,UAAei7D,EAAAA,EAAAA,YAAoCk/J,ICvH7CM,GAAoB3+K,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,qBAAVq7C,CAAU,iKAU9B4+K,GAAkB5+K,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,mBAAVq7C,CAAU,6FAgB5B6+K,GAAoBvoO,IAA6I,IAA5I,WAAC4mO,EAAU,YAAE3pH,EAAW,kBAAEurH,EAAiB,gBAAErB,EAAe,eAAE78N,EAAc,kBAAEm+N,EAAiB,SAAEC,EAAQ,qBAAEC,GAA4B3oO,EAC9J,MAAM4oO,GAAYtnN,EAAAA,EAAAA,cAAa27F,IAC3ByrH,EAAS9B,EAAY3pH,EAAY,GAClC,CAACyrH,EAAU9B,IAERiC,GAA0BjqL,EAAAA,EAAAA,aAAYkqL,EAAAA,IA2B5C,GAAmB,KAAflC,GAAoC,aAAfA,GAA4C,UAAfA,EAClD,OAAKO,EAKDt/N,IAAAA,cAACygO,GAAe,KACZzgO,IAAAA,cAACwgO,GAAiB,KAAEG,GACnBrB,EAAgB3hO,WAAa2hO,EAAgB7zN,MAAMhJ,IAChDzC,IAAAA,cAAA,OACI,YAAU,SACV8M,KAAK,QACL7M,UAAU,UACVvC,IAAK4hO,EAAgB1O,MAAMnuN,IAtCxB9C,KACnB,IAAIiC,EAAQ,GAqBZ,OApBIjC,EAAKY,UACLqB,EAAQjC,EAAKY,UACRZ,EAAKa,YAAcb,EAAKc,YAAcd,EAAKe,SAC5CkB,GAAS,IAAJjB,OAAQhB,EAAKa,WAAU,KAAAG,OAAIhB,EAAKc,UAAS,KAAAE,OAAIhB,EAAKe,UAChDf,EAAKe,SACZkB,GAAS,IAAJjB,OAAQhB,EAAKe,WACXf,EAAKa,YAAcb,EAAKc,aAC/BmB,GAAS,IAAJjB,OAAQhB,EAAKa,WAAU,KAAAG,OAAIhB,EAAKc,aAEpB,MAAdd,EAAKzE,MAA8B,MAAdyE,EAAKzE,KACjC0G,EAAQjC,EAAKE,cACQ,MAAdF,EAAKzE,MAA8B,MAAdyE,EAAKzE,MAE1ByE,EAAK0kC,SADZziC,EAAQjC,EAAKQ,MAKbyB,IACAA,EAAQA,EAAMqB,eAEXrB,CAAK,EAkBKs/N,CAAc5B,EAAgB7zN,MAAMhJ,KAG5C68N,EAAgB7zN,MAAMpI,KAAI,CAAC1D,EAAM8xM,KAC9B,IAAK6tB,EAAgB3hO,UACjB,OAAO,KAEX,MAAMmrE,EAAYw2J,EAAgB3hO,UAClC,OACIqC,IAAAA,cAAC8oE,EAAS,CACNprE,IAAK4hO,EAAgB1O,MAAMnf,GAC3B9xM,KAAMA,EACNi4B,KAAM0nM,EAAgB1O,MAAMnf,GAC5Bkf,eAAgB2O,EAAgB3O,eAChC2M,YAAa7rB,IAAQhvM,EACrB6M,QAASwxN,EACTpmL,YAAaA,KACTkmL,EAAkBnvB,EAAI,GAE5B,KAhCP,KAuCf,MAAMouB,EAAsBmB,EAAwB71N,MAAKvN,IAAqB,IAApB,SAACX,GAAcW,EACrE,OAAImhO,IAAe9hO,CAGP,IAGhB,IAAK4iO,EACD,OAAO,KAGX,MAAM/2J,EAAiB+2J,EAAoBliO,UAE3C,OACIqC,IAAAA,cAAC8/N,GAAAA,EAAa,KACV9/N,IAAAA,cAAC8oE,EAAS,CACNprE,IAAKmiO,EAAoB5iO,SACzBm4G,YAAaA,EACb2qH,eAAgBe,EAChBK,YAAaJ,IAEL,EAEtBL,GAAAr4N,UAAA,CA1GE02N,WAAUj5N,KAAAA,OAAAC,WACVqvG,YAAWtvG,KAAAA,OAAAC,WACXtD,eAAcqD,KAAAA,OAAAC,WACd66N,kBAAiB96N,KAAAA,KAAAC,WACjB46N,kBAAiB76N,KAAAA,KAAAC,WAEjB86N,SAAQ/6N,KAAAA,KAAAC,WACR+6N,qBAAoBh7N,KAAAA,KAAAC,YAqGxB,YChIMq7N,GAA8Bv/K,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,+BAAVq7C,CAAU,2MAgBxCw/K,GAAiBx/K,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,kBAAbq7C,CAAa,gRAIXniD,GAAWA,EAAMwG,SAAW,mCAAqC,gBAC5ExG,GAAWA,EAAMwG,SAAW,mBAAqB,gDAiBzDo7N,GAAqBnpO,IAAwC,IAAvC,WAAC4mO,EAAU,cAAEwC,GAAqBppO,EAC1D,MAAMqpO,GAAwB/nN,EAAAA,EAAAA,cAAY,IAAM8nN,EAAc,aAAa,CAACA,IACtEE,GAAqBhoN,EAAAA,EAAAA,cAAY,IAAM8nN,EAAc,UAAU,CAACA,IAEhEG,GAAsB3qL,EAAAA,EAAAA,aAAY4qL,EAAAA,IAExC,OACI3hO,IAAAA,cAACohO,GAA2B,KACxBphO,IAAAA,cAACqhO,GAAc,CACXn7N,SAAyB,aAAf64N,EACVzvN,QAASkyN,GAETxhO,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,cAGvBzJ,IAAAA,cAACqhO,GAAc,CACXn7N,SAAyB,UAAf64N,EACVzvN,QAASmyN,GAETzhO,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,WAGtBi4N,EAAoBr+N,KAAIzF,IAAgC,IAA/B,UAACD,EAAS,SAAEV,GAAcW,EAChD,MAAMkrE,EAAYnrE,EAClB,OACIqC,IAAAA,cAACqhO,GAAc,CACX3jO,IAAKT,EACLiJ,SAAU64N,IAAe9hO,EACzBqS,QAASA,IAAMiyN,EAActkO,IAE7B+C,IAAAA,cAAC8/N,GAAAA,EAAa,KACV9/N,IAAAA,cAAC8oE,EAAS,OAED,IAGC,EAEpCw4J,GAAAj5N,UAAA,CA9CE02N,WAAUj5N,KAAAA,OAAAC,WACVw7N,cAAaz7N,KAAAA,KAAAC,YA+CjB,aC7EM,SAAC8wD,IAAYpxC,EAAAA,GASbm8M,GAAqB//K,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,sBAAVq7C,CAAU,qMA2B/BimC,GAAYjmC,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,aAAbq7C,CAAa,sDAOzBggL,IAAY7gK,EAAAA,EAAAA,aACd,CAAA7oE,EAEIyiD,KACc,IAFd,QAAC4jC,EAAO,SAAEqiJ,EAAQ,mBAAEiB,EAAkB,kBAAEC,GAAyB5pO,EAGjE,MAAMoR,GAAOiQ,EAAAA,GAAAA,YACNksD,EAAeC,IAAoBpsD,EAAAA,EAAAA,UAAiB,IACpD67F,EAAaiqH,IAAkB9lN,EAAAA,EAAAA,UAAiBuoN,IAChD/C,EAAYwC,IAAiBhoN,EAAAA,EAAAA,UAAiBwoN,GAAqB,aACnEt/N,EAAgBm+N,IAAqBrnN,EAAAA,EAAAA,WAAkB,GAExD2tC,GAAW2E,EAAAA,EAAAA,QAAgC,MAE3Cm2K,GAAmBvoN,EAAAA,EAAAA,cAAY,KAAM,IAAAwoN,EACvC,OAAuB,QAAhBA,EAAA/6K,EAASz0C,eAAO,IAAAwvN,OAAA,EAAhBA,EAAkBnzK,eAAgB,CAAC,GAC3C,IAEGozK,GAAgBzoN,EAAAA,EAAAA,cAAa0oN,IAC/B9C,EAAe8C,GACfl3M,YAAW,KAAM,IAAAm3M,EACG,QAAhBA,EAAAl7K,EAASz0C,eAAO,IAAA2vN,GAAhBA,EAAkBxrF,kBAAkBurF,EAAe/4N,OAAQ+4N,EAAe/4N,QAC1Eu8D,EAAiBw8J,EAAe/4N,OAAO,GACxC,EAAE,GACN,KAEHg8C,EAAAA,EAAAA,YAAU,KACN,SAASi9K,IAAsB,IAAAC,EAC3B38J,GAAiC,QAAhB28J,EAAAp7K,EAASz0C,eAAO,IAAA6vN,OAAA,EAAhBA,EAAkBxzK,eAAgB,EACvD,CAEA,MAAM7H,EAAQC,EAASz0C,QAgBvB,OAdIw0C,IACAA,EAAMsW,iBAAiB,SAAU8kK,GACjCp7K,EAAMsW,iBAAiB,WAAY8kK,GACnCp7K,EAAMsW,iBAAiB,QAAS8kK,GAChCp7K,EAAMsW,iBAAiB,YAAa8kK,GACpCp7K,EAAMsW,iBAAiB,aAAc8kK,GACrCp7K,EAAMsW,iBAAiB,QAAS8kK,GAChCp7K,EAAMsW,iBAAiB,QAAS8kK,GAChCp7K,EAAMsW,iBAAiB,MAAO8kK,GAC9Bp7K,EAAMsW,iBAAiB,YAAa8kK,GACpCp7K,EAAMsW,iBAAiB,SAAU8kK,GACjCp7K,EAAMsW,iBAAiB,cAAe8kK,IAGnC,KACCp7K,IACAA,EAAMwW,oBAAoB,SAAU4kK,GACpCp7K,EAAMwW,oBAAoB,WAAY4kK,GACtCp7K,EAAMwW,oBAAoB,YAAa4kK,GACvCp7K,EAAMwW,oBAAoB,QAAS4kK,GACnCp7K,EAAMwW,oBAAoB,aAAc4kK,GACxCp7K,EAAMwW,oBAAoB,QAAS4kK,GACnCp7K,EAAMwW,oBAAoB,QAAS4kK,GACnCp7K,EAAMwW,oBAAoB,MAAO4kK,GACjCp7K,EAAMwW,oBAAoB,YAAa4kK,GACvCp7K,EAAMwW,oBAAoB,SAAU4kK,GACpCp7K,EAAMwW,oBAAoB,cAAe4kK,GAC7C,CACH,GACF,CAACn7K,EAASz0C,UAEb,MAAO6sN,EAAiBqB,GCtGH4B,EAACxD,EAAoB3pH,EAAqB1vC,EAAuBs8J,EAAgCpB,KAC1H,MAAMvqO,GAAWsxD,EAAAA,EAAAA,gBAEV23K,EAAiBkD,IAAsBjpN,EAAAA,EAAAA,UAAuC,OAC9EonN,EAAmB8B,IAAwBlpN,EAAAA,EAAAA,UAA0BvZ,IAAAA,cAAA,cAEtE8wN,GAAsBjlK,EAAAA,EAAAA,QAAmB,CAC3C,IAAI62K,GAAAA,EACJ,IAAIC,GAAAA,GAAsB,CAAC/qM,EAAcnhC,EAAyCC,IAAuCL,GAASq5N,EAAAA,GAAAA,IAA8B93L,EAAMnhC,EAASC,MAC/K,IAAIksO,GAAAA,GAAoBriO,GAAqBlK,GAASwsO,EAAAA,GAAAA,IAAwBtiO,MAC9E,IAAI+9N,KAGFlnN,GAAUuC,EAAAA,EAAAA,UAA2B,IAAM,CAC7C3Z,IAAAA,cAAA,QAAMtC,IAAK,IACXsC,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,sBACH0S,eAAe,WACf/L,IAAK,IAETsC,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,mBACH0S,eAAe,QACf/L,IAAK,IAETsC,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,wBACH0S,eAAe,aACf/L,IAAK,MAEV,IAkCH,OAhCA0nD,EAAAA,EAAAA,YAAU,KAEN,GADAo9K,EAAmB,MACA,KAAfzD,GAAoC,aAAfA,GAA4C,UAAfA,EAClD,OAGJ,MAAM+D,EAAqB1tH,EAAYtjG,MAAM,EAAG4zD,GAC5C0vC,EAAYhsG,OAASs8D,GAAgD,MAA/B0vC,EAAY1vC,IAIlDA,EAAgB,GAAwC,MAAnC0vC,EAAY1vC,EAAgB,IAIrDorJ,EAAoBr+M,QAAQ/J,SAAQ,CAACyrL,EAAUsd,KAC3Ctd,EAASuB,qBAAqBotC,GAAqB34N,IACnC,IAARsnM,GAA4B,UAAfstB,GAGbr5J,IAAkBs8J,MAGtB73N,EAAIsB,MAAQtB,EAAIsB,MAAMqG,MAAM,EAAG,IAC/B3H,EAAIymN,MAAQzmN,EAAIymN,MAAM9+M,MAAM,EAAG,IAC/B0wN,EAAmBr4N,GACnBy2N,EAAkB,GAClB6B,EAAqBrrN,EAAQq6L,IAAK,GACpC,GACJ,GACH,CAACr8F,EAAa2pH,EAAYr5J,IAEtB,CAAC45J,EAAiBqB,EAAkB,EDsCM4B,CACzCxD,EACA3pH,EACA1vC,EACAs8J,EACApB,GAGEl/M,GAAQjI,EAAAA,EAAAA,cAAaspN,IACnB77K,EAASz0C,UACTy0C,EAASz0C,QAAQiP,QACjBuJ,YAAW,KAAM,IAAA+3M,EACG,QAAhBA,EAAA97K,EAASz0C,eAAO,IAAAuwN,GAAhBA,EAAkBpsF,kBAAkBmsF,EAAaA,EAAY,GAC9D,GACP,GACD,IAEGE,GAAoBxpN,EAAAA,EAAAA,cACtB,CAACjW,EAAemtN,KACZ,MAAMuS,GAAwBC,EAAAA,GAAAA,IAAYxS,GACpCjrJ,EAAgBs8J,IAChBoB,EAAa19J,IAAkB0vC,EAAYhsG,OAAS,IAAM,GAChEi2N,EACIjqH,EAAYtjG,MAAM,EAAG4zD,GAAez+B,QAAQ,IAAIuW,OAAO0lL,EAAwB,IAAK,KAAM,IAC1F1/N,EACA4/N,EACAhuH,EAAYtjG,MAAM4zD,IAEtBhkD,EAAOgkD,EAAgBliE,EAAM4F,OAAS,EAAKunN,EAAevnN,OAAO,GAErE,CAACgsG,EAAaiqH,EAAgB39M,EAAOsgN,IAGnClzJ,GAAgBr1D,EAAAA,EAAAA,cACjBta,IAWG,GAVIwxE,GAAAA,EAAsBxxE,EAAU03D,GAASua,UACzCjyE,EAAEy0D,kBACFz0D,EAAEyK,iBACG01N,GAAqD,KAAlCA,aAAe,EAAfA,EAAiB7zN,MAAMrC,UAAoC,IAApB3G,EAG3Dm+N,GAAmB,GAFnBpiJ,KAMJ7N,GAAAA,EAAsBxxE,EAAU03D,GAAS8a,MAAO,CAChDxyE,EAAEy0D,kBACFz0D,EAAEyK,iBACF,MAAMy5N,GAAa/D,aAAe,EAAfA,EAAiB7zN,MAAMrC,SAAU,EAChD3G,EAAiB,EAAI4gO,GACrBzC,EAAkBn+N,EAAiB,EAE3C,CAUA,GARIkuE,GAAAA,EAAsBxxE,EAAU03D,GAASya,MACzCnyE,EAAEy0D,kBACFz0D,EAAEyK,iBACEnH,EAAiB,GACjBm+N,EAAkBn+N,EAAiB,IAIvCkuE,GAAAA,EAAsBxxE,EAAU03D,GAAS+Z,OAGzC,GAFAzxE,EAAEy0D,kBACFz0D,EAAEyK,iBACG01N,GAAqD,KAAlCA,aAAe,EAAfA,EAAiB7zN,MAAMrC,UAAoC,IAApB3G,EAExD,CACH,MAAMkuN,EAAiB2O,aAAe,EAAfA,EAAiB3O,eAClCntN,EAAQ87N,aAAe,EAAfA,EAAiB1O,MAAMnuN,GACrCwgO,EAAkBz/N,EAAOmtN,GACzBiQ,GAAmB,EACvB,MANIC,EAAS9B,EAAY3pH,EAO7B,GAEJ,CAACkqH,EAAiB9gJ,EAAS/7E,EAAgBo+N,EAAU9B,EAAY3pH,EAAa6tH,IAG5EK,GAAe7pN,EAAAA,EAAAA,cAChBta,IACGA,EAAEy0D,kBACF4qB,GAAS,GAEb,CAACA,IASL,OANAp5B,EAAAA,EAAAA,YAAU,KACF8B,EAASz0C,SACTy0C,EAASz0C,QAAQiP,OACrB,GACD,CAACq9M,IAGA/+N,IAAAA,cAAC4hO,GAAkB,CACfhnL,IAAKA,EACL7jD,GAAG,YACH,aAAYwS,EAAKC,cAAc,CAC3BzS,GAAI,oBACJ0S,eAAgB,WAEpB,mBAAiB,cACjBqD,KAAK,aAEL9M,IAAAA,cAAC8nF,GAAS,CACN,cAAY,iBACZ7nF,UAAU,qBACVqP,QAASg0N,GAETtjO,IAAAA,cAAA,KAAGC,UAAU,qBAEjBD,IAAAA,cAACshO,GAAkB,CACfvC,WAAYA,EACZwC,cAAeA,IAEnBvhO,IAAAA,cAACkgO,GAAW,CACRtlL,IAAKsM,EACLkuD,YAAaA,EACb2pH,WAAYA,EACZM,eAAgBA,EAChB1oJ,UAAW7H,EACXptD,MAAOA,IAEX1hB,IAAAA,cAAC0gO,GAAiB,CACd3B,WAAYA,EACZ3pH,YAAaA,EACburH,kBAAmBA,EACnBrB,gBAAiBA,EACjB78N,eAAgBA,EAChBm+N,kBAAmBA,EACnBC,SAAUA,EACVC,qBAAsBmC,IAE1BjjO,IAAAA,cAACo/N,GAAc,CACXhqH,YAAaA,EACbiqH,eAAgB6C,EAChBnD,WAAYA,EACZO,gBAAiBA,EACjB78N,eAAgBA,EAChBif,MAAOA,IAEM,IAKjC,MEnPM6hN,GAAgB1hL,IAAOokI,GAAAA,GAAQnkI,WAAA,CAAAt7C,YAAA,iBAAfq7C,CAAe,4HAa/B2hL,GAAkB3hL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,mBAAVq7C,CAAU,mTAsB5BimC,GAAYjmC,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,aAAVq7C,CAAU,oNAgBtB4hL,GAAqB5hL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,sBAAVq7C,CAAU,sXAiOrC,GA7MkB6hL,KACd,MAAMC,GAAqB5sL,EAAAA,EAAAA,aAAY6sL,GAAAA,IACjCxuH,GAAcr+D,EAAAA,EAAAA,aAAY8sL,EAAAA,KAAmB,GAC7C9E,GAAahoL,EAAAA,EAAAA,aAAY+sL,EAAAA,KAAkB,GAC3CC,GAAehtL,EAAAA,EAAAA,aAAY4qL,EAAAA,IAE3BtrO,GAAWsxD,EAAAA,EAAAA,gBACV4gD,EAASutB,IAAcv8G,EAAAA,EAAAA,WAAkB,IACzCiL,EAAgBw/M,IAAqBzqN,EAAAA,EAAAA,UAAS,IAC/C0qN,GAAep4K,EAAAA,EAAAA,QAA8B,MAC7Cq4K,GAAkBr4K,EAAAA,EAAAA,QAA8B,OAEtDzG,EAAAA,EAAAA,YAAU,KACN,MAAM08D,GAAYC,EAAAA,GAAAA,QAAkBoiH,EAAAA,GAAAA,IAAoCC,EAAAA,GAAAA,MAAqB,SAEvFt1J,EAAiB3vE,IAanB,GAZIwxE,GAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAASua,UAC5CjyE,EAAEyK,iBACFo6N,EAAkB,IAClBluG,GAAW,IAGXnlD,GAAAA,EAA0BxxE,IAAMwxE,GAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAASwtK,MAC5EllO,EAAEyK,iBACFo6N,EAAkB,IAClBluG,GAAW,IAGXnlD,GAAAA,EAA0BxxE,IAAMwxE,GAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAAS4lI,GAAI,CAChF,IAAK36E,IAAc3iH,EAAEu/D,SACjB,OAIJ,IAAI4lK,EAAAA,GAAAA,OAAcnlO,EAAEqxE,QAChB,OAGJrxE,EAAEyK,iBACFo6N,EAAkBL,GAAsB,IACxC7tG,GAAW,EACf,GAIJ,OADA5zH,SAASq7D,iBAAiB,UAAWuR,GAC9B,KACH5sE,SAASu7D,oBAAoB,UAAWqR,EAAc,CACzD,GACF,CAAC60J,KAEJv+K,EAAAA,EAAAA,YAAU,KACN,MAAMrF,EAAe5gD,IACb8kO,EAAaxxN,UACTtT,EAAEq7D,SAAWypK,EAAaxxN,SAAYwxN,EAAaxxN,QAAQorD,SAAS1+D,EAAEq7D,UACtEs7D,GAAW,GACXkuG,EAAkB,KAE1B,EAIJ,OADA9hO,SAASq7D,iBAAiB,QAASxd,EAAa,CAACwkL,SAAS,IACnD,KACHriO,SAASu7D,oBAAoB,QAAS1d,EAAY,CACrD,GACF,IAEH,MAAMykL,GAAiB/qN,EAAAA,EAAAA,cAAY,KAC/Bq8G,GAAW,GACXkuG,EAAkB,IACdE,EAAgBzxN,UAChBvQ,SAAS+6D,cACL,IAAID,YAAkC0nC,EAAAA,GAAqBC,MAAO,CAC9D/oC,OAAQ,CACJpB,OAAQ0pK,EAAgBzxN,QACxBmyF,cAAc,MAI1B6/H,GAAAA,EAAeC,qBACnB,GACD,IAEGC,GAAgBlrN,EAAAA,EAAAA,cAAY,KAC9Bq8G,GAAW,GACPouG,EAAgBzxN,SAChBgyN,GAAAA,EAAeG,mBAAmBV,EAAgBzxN,QACtD,GACD,IAEGoyN,GAA0BprN,EAAAA,EAAAA,cAC3Bta,IACiB,UAAVA,EAAEzB,KAA6B,YAAVyB,EAAEzB,KAA+B,SAAVyB,EAAEzB,MAI9CizE,GAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAAS0zI,OAG5C55H,GAAAA,EAA0BxxE,IAAMwxE,GAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAASwtK,IAC5EvuG,GAAW,GAGf6uG,KAAe,GAEnB,CAACA,IAGC5D,GAAYtnN,EAAAA,EAAAA,cACd,CAACslN,EAAoB3pH,KACjB/+G,GAASkqO,EAAAA,GAAAA,IAAiBxB,IAC1B1oO,GAASiqO,EAAAA,GAAAA,IAAkBlrH,IAER,KAAf2pH,GAAoC,aAAfA,GAA4C,UAAfA,EAClD1oO,GAASyuO,EAAAA,GAAAA,KAAkB,IAE3Bf,EAAar7N,SAASq8N,IACdA,EAAW9nO,WAAa8hO,GACxBgG,EAAWhrN,OAAOq7F,EACtB,IAGR0gB,GAAW,GACXkuG,EAAkB,GAAG,GAEzB,CAACD,IAGCvlJ,GAAU/kE,EAAAA,EAAAA,cAAata,IACzBA,EAAEy0D,kBACFv9D,GAASkqO,EAAAA,GAAAA,IAAiB,KAC1BlqO,GAASiqO,EAAAA,GAAAA,IAAkB,IAAI,GAChC,IAEG0E,GAAkBvrN,EAAAA,EAAAA,cAAY,IAAMpjB,GAASkqO,EAAAA,GAAAA,IAAiB,MAAM,IAE1E,OACIvgO,IAAAA,cAACyjO,GAAkB,CACfjuK,SAAU,EACVmhB,UAAWkuJ,EACXv1N,QAASq1N,EACT5tO,GAAG,sBACH+V,KAAK,SACL7M,UAAU,eACV26C,IAAKspL,GAELlkO,IAAAA,cAAA,KAAGC,UAAU,uBACI,aAAf8+N,GAA4C,UAAfA,IAC3B/+N,IAAAA,cAACwjO,GAAe,KACI,aAAfzE,GACG/+N,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,aAGP,UAAfs1N,GACG/+N,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,UAGvBzJ,IAAAA,cAAA,KACIC,UAAU,0BACVqP,QAAS01N,KAIpB5vH,GAAep1G,IAAAA,cAAA,QAAMw1D,SAAU,GAAI4/C,GACnCA,GACGp1G,IAAAA,cAAC8nF,GAAS,CACN,cAAY,cACZh7E,KAAK,SACLwC,QAASkvE,GAETx+E,IAAAA,cAAA,QACIC,UAAU,gBACV,cAAY,QAEZD,IAAAA,cAAA,KAAGC,UAAU,8BAIvBm1G,GACEp1G,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,oBACH0S,eAAe,WAGtB8+F,GACGvoG,IAAAA,cAACujO,GAAa,CACVxsO,GAAG,gBACHy2D,UAAU,UAEVxtD,IAAAA,cAAC6hO,GAAS,CACNjnL,IAAKqpL,EACLzlJ,QAASgmJ,EACT3D,SAAUE,EACVe,mBAAoBt9M,EAAiB,MAAH7jB,OAAS6jB,EAAc,KAAM4wF,EAC/D2sH,kBAAmBhD,KAId,EChP7B,GApCwBkG,KACpB,MAAM5uO,GAAWsxD,EAAAA,EAAAA,eACXk0G,GAAW9kH,EAAAA,EAAAA,cAAaz+C,IAAuBuiB,EAAAA,EAAAA,IAAYviB,KAsBjE,OApBA8sD,EAAAA,EAAAA,YAAU,KACN,MAAM8/K,EAAkB/lO,IAChBwxE,GAAAA,EAA0BxxE,IAAMA,EAAEu/D,UAC9BiS,GAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAASsuK,KAC5ChmO,EAAEyK,iBACEiyJ,IAAa/gJ,EAAAA,GAAUihJ,QACvB1lK,GAAS4nB,EAAAA,GAAAA,OAET5nB,GAASwgK,EAAAA,GAAAA,OAGrB,EAIJ,OADA30J,SAASq7D,iBAAiB,UAAW2nK,GAC9B,KACHhjO,SAASu7D,oBAAoB,UAAWynK,EAAe,CAC1D,GACF,CAACrpE,EAAUxlK,IAGV2J,IAAAA,cAAColO,GAAAA,EAAI,CACD/pG,KAAK,EACLhtH,MAAO,IACPumG,KAAM,EACNywH,UAAU,UAEVrlO,IAAAA,cAAC0jO,GAAS,MACP,E,ifCnBf,MAAM4B,WAA0BtlO,IAAAA,cAC5BsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,mCAMarD,IAC1BA,EAAEyK,iBACFlH,KAAKhD,MAAMqD,QAAQ8P,UAAU,CACzBC,QAASC,EAAAA,GAAiB8c,yBAC1B5c,WAAY6c,GAAAA,SACd,IACLttB,GAAA,0BAEoB+iO,IACjB7iO,KAAKgH,SAAS,CACV87N,aAAcD,GAChB,IACL/iO,GAAA,6BAEsB,MACnBjE,EAAAA,GAAAA,IAAW,KAAM,yBAAyB,IAC7CiE,GAAA,4BAEqB,KAClB,MAAM,KACF+G,EAAI,gBACJkoI,GACA/uI,KAAKhD,MAEH8oE,EAAcipE,aAAe,EAAfA,EAAiBpuI,KAAK1D,GAElCK,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZz8G,GAAI4I,EAAK5I,GAAK,kBACdmjI,cAAc,sBACdx8H,IAAKiC,EAAK5I,GAAK,kBACfuY,QAAS3P,EAAKoa,OACdvP,KAAM7K,EAAK6K,SAKvB,OACIxK,IAAAA,cAAC4Z,GAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,GAAAA,EAAKw/I,iBAAgB,CAClBriK,GAAG,0BACHmjI,cAAc,yBACdn5H,IA/DY,yDAgEZyJ,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,4BAEtF/G,KAAKhD,MAAM25J,UACRr5J,IAAAA,cAAC4Z,GAAAA,EAAKw/I,iBAAgB,CAClBriK,GAAG,wBACHmjI,cAAc,yBACdn5H,IArEM,kCAsENyJ,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,yBAGlD,SAAtC/G,KAAKhD,MAAM+lO,wBACRzlO,IAAAA,cAAC4Z,GAAAA,EAAKw/I,iBAAgB,CAClBriK,GAAG,sBACHmjI,cAAc,YACdn5H,IA5EG,8DA6EHyJ,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,sBAC/E6F,QAAS5M,KAAKgjO,uBAGrBhjO,KAAKhD,MAAM45J,oBACRt5J,IAAAA,cAAC4Z,GAAAA,EAAKw/I,iBAAgB,CAClBriK,GAAG,qBACHmjI,cAAc,qBACdn5H,IAAK2B,KAAKhD,MAAM45J,mBAChB9uJ,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,uBAGtFzJ,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZz8G,GAAG,oBACHmjI,cAAc,uBACd5qH,QAAS5M,KAAKijO,2BACdn7N,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,yBAEpF++D,EACQ,IAjFjB9lE,KAAKpK,MAAQ,CACTktO,cAAc,EAEtB,CAkFA7/N,MAAAA,GACI,MAAM,KAAC4D,GAAQ7G,KAAKhD,MACdkmH,EACF5lH,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAI,+BACJ0S,eAAe,SAIvB,OACIzJ,IAAAA,cAACka,GAAAA,EAAW,CACRnjB,GAAG,iBACHkJ,UAAU,gBACVs9E,SAAU76E,KAAKkjO,mBAEf5lO,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAO03G,GAEP5lH,IAAAA,cAACgwH,GAAAA,GAAU,CACPlvH,KAAM,KACNf,KAAM,sBACNuP,QAASA,OACTiG,OAAQ7S,KAAKpK,MAAMktO,aACnBK,UAAU,EACVC,SAAS,EACT,gBAAc,qBACd,gBAAepjO,KAAKpK,MAAMktO,aAC1B,aAAYj8N,EAAKC,cAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,YAG5FzJ,IAAAA,cAAC4Z,GAAAA,EAAI,CACDO,UAAU,EACV2mD,QAAQ,EACR/pE,GAAG,qBACHqjB,UAAW7Q,EAAKC,cAAc,CAACzS,GAAI,sDAAuD0S,eAAgB,0BAEzG/G,KAAKqjO,uBAItB,EACHvjO,GAjIK8iO,GAAiB,aATnBnzN,SAAQrM,KAAAA,MAAA,CACJ6c,SAAQ7c,KAAAA,OAAAC,aAAAA,aA2IhB,UAAeyJ,EAAAA,GAAAA,YAAW81N,ICxHpB5sC,IAAY5wL,EAAAA,EAAAA,UAvBlB,SAAyBxP,GACrB,MAAM,SAAC4iK,EAAQ,mBAAEC,EAAkB,uBAAE6qE,IAA0BvmN,EAAAA,EAAAA,IAAUnnB,GAEzE,MAAO,CACH+gK,SAAU6B,GAAY,GACtBrvB,cAAc7kF,EAAAA,GAAAA,IAAgB1uD,GAC9BghK,mBAAoB6B,GAAsB,GAC1CsqE,uBAAwBO,GAA0B,GAClD5gN,SAASE,EAAAA,EAAAA,IAA0BhtB,GACnCm5I,iBAAiBw0F,EAAAA,EAAAA,IAAoC3tO,GACrDgrB,cAAcA,EAAAA,EAAAA,IAAahrB,GAC3B4qB,uBAAuBC,EAAAA,EAAAA,IAA2B7qB,GAE1D,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAASA,GAAAA,GACVxc,GAEX,IAMA,IAAe69H,EAAAA,EAAAA,YAAWwkE,GAAU4sC,KCnC9BY,GAA0BrkL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,2BAAVq7C,CAAU,6HAoC1C,GAnBuB1pD,IAA4C,IAA3C,UAACguO,EAAY,MAAYhuO,EAC7C,OACI6H,IAAAA,cAACkmO,GAAuB,MACnBE,EAAAA,GAAAA,IAAWD,GACRnmO,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACilO,GAAe,MAChBjlO,IAAAA,cAACslO,GAAiB,OAGtBtlO,IAAAA,cAAC2wL,GAAAA,QAAS,CACNC,cAAe,UACfy1C,iBAAkB,wBAClBC,YAAaH,IAGC,E,wCCzBlC,MAAMI,GAA0B1kL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,2BAAVq7C,CAAU,uEChB1C,GDyBuB2kL,KACnB,MAAM1rI,GAAUC,EAAAA,EAAAA,cACVxxF,GAAOiQ,EAAAA,GAAAA,YAENitN,EAAWC,IAAgBntN,EAAAA,EAAAA,WAAS,IACpCotN,EAAcC,IAAmBrtN,EAAAA,EAAAA,WAAS,GAE3CstN,EAAcvxK,GAChBt1D,IAAAA,cAAC61D,GAAAA,EAAwB,CACrBP,SAAUA,EACVU,kBAAkB,EAClBC,iBAAiB,IAgBnB6wK,EAAiBvwO,UACnB,MAAM,UAACkwO,EAAS,aAAEE,SAAsB1lN,GAAAA,EAAW8lN,0BACnDC,EAAcP,EAAWE,EAAa,EAGpCK,EAAgBA,CAACC,EAAqBC,KACxCR,EAAaO,GACbL,EAAgBM,EAAc,EAQlC,OALA9hL,EAAAA,EAAAA,YAAU,IACMnkC,GAAAA,EAAWkmN,8BAA8BH,IAEtD,IAGChnO,IAAAA,cAACumO,GAAuB,KACpBvmO,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAO24N,EAAW/wK,GAAAA,EAAmBoqF,qBAErClgJ,IAAAA,cAACgwH,GAAAA,GAAU,CACPjwH,KAAM,aACNuP,QAlCDq3G,MACXpoH,EAAAA,GAAAA,IAAW,KAAM,mBACjBu8F,EAAQ6rB,SACRmgH,GAAgB,EAgCJhmO,KAAM,KACNglO,SAAS,EACTD,UAAU,EACVx+N,UAAWo/N,EACX,aAAYl9N,EAAKC,cAAc,CAACzS,GAAI,6CAA8C0S,eAAgB,YAG1GzJ,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAO24N,EAAW/wK,GAAAA,EAAmBqqF,qBAErCngJ,IAAAA,cAACgwH,GAAAA,GAAU,CACPjwH,KAAM,cACNuP,QAzCE83N,MACd7oO,EAAAA,GAAAA,IAAW,KAAM,sBACjBu8F,EAAQssI,YACRN,GAAgB,EAuCJhmO,KAAM,KACNglO,SAAS,EACTD,UAAU,EACVx+N,UAAWs/N,EACX,aAAYp9N,EAAKC,cAAc,CAACzS,GAAI,gDAAiD0S,eAAgB,eAGvF,E,gBE/F3B,SAAS49N,GAAe/uO,GAC3B,OAAOA,EAAM8kD,MAAMkqL,YAAYC,YACnC,C,mDCIA,MAAMC,GAA2B3lL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,4BAAVq7C,CAAU,+DA4B3C,GAnBwB4lL,KACpB,MAAM5gB,GAAiB6gB,EAAAA,GAAAA,MAEjB3lL,EAAO8kK,SAAAA,EAAgB8gB,aAAeC,KAAS/gB,EAAe8gB,cAAgBE,GAAAA,oBAEpF,OACI7nO,IAAAA,cAACwnO,GAAwB,CAAChyK,SAAU,GAChCx1D,IAAAA,cAAC+hD,EAAI,CAACjhD,KAAM,KACZd,IAAAA,cAACqlG,GAAAA,GAAO,CACJv7F,QAAQ,KACRhJ,KAAM,IACN0zL,OAAO,QAENqyB,EAAiBA,EAAeihB,aAAe,YAE7B,E,gBC3BnC,MAAMC,GAAsClmL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,uCAAVq7C,CAAU,+DAShDmmL,GAAanmL,IAAOomL,GAAAA,GAAKnmL,WAAA,CAAAt7C,YAAA,cAAZq7C,CAAY,oDAMzBqmL,GAAQrmL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,SAAVq7C,CAAU,+TA6BxB,GAZmCsmL,IAE3BnoO,IAAAA,cAAC+nO,GAAmC,CAACvyK,SAAU,GAC3Cx1D,IAAAA,cAACgoO,GAAU,CACP35N,MAAO,IACPC,OAAQ,KAEZtO,IAAAA,cAACkoO,GAAK,KAAE,iBC1BdzqJ,GAAW57B,IAAOiB,EAAAA,MAAKhB,WAAA,CAAAt7C,YAAA,YAAZq7C,CAAY,mSA0BvBumL,GAAwBvmL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,yBAAVq7C,CAAU,kFAQlCwmL,GAAkBlwO,IAAgG,IAA/F,KAAC4H,EAAI,YAAEuoO,EAAW,KAAE99N,EAAI,OAAE+K,EAAM,QAAEjG,EAAO,QAAEi5N,EAAO,GAAExxO,GAAyBoB,EAClG,MAAMqwO,EAAcZ,KAAS7nO,GAE7B,OACIC,IAAAA,cAACy9E,GAAQ,CACL99B,GAAI2oL,EACJh5N,QAASA,EACTvY,GAAIA,GAEJiJ,IAAAA,cAACwoO,EAAW,CACR1nO,KAAM,GACNuuD,MAAO,qBAEXrvD,IAAAA,cAACooO,GAAqB,KACjB59N,GAEJ+K,GACGvV,IAAAA,cAACk9E,GAAAA,UAAS,CACNp8E,KAAM,GACNuuD,MAAO,qBAGdk5K,GAAW,KACL,EAEjBF,GAAAhgO,UAAA,CArEEigO,YAAWxiO,KAAAA,OAAAC,WAEXyE,KAAI1E,KAAAA,KAAAC,WACJwP,OAAMzP,KAAAA,KAAAC,WACNuJ,QAAOxJ,KAAAA,KAAAC,WAEPwiO,QAAOziO,KAAAA,KACP/O,GAAE+O,KAAAA,QAgEN,Y,uICnBA,MAAM2iO,GAAmB/oO,IACrB,MAAM,OACFrF,EAAM,SACN+hD,EAAQ,SACRo9G,EAAQ,YACRv4H,EAAW,gBACX81H,EAAe,YACf2xE,EAAW,eACX/wE,EAAc,uBACdF,EAAsB,2BACtBG,EAA0B,uBAC1BF,EAAsB,oBACtBG,EAAmB,sBACnBE,EAAqB,wBACrB4wE,EAAuB,2BACvBC,EAA0B,cAC1BrwI,EAAa,YACbpK,EAAW,QACX7+E,EAAO,wBACPu5N,EAAuB,SACvB9hL,GAAW,EAAK,uBAChB+hL,GACAppO,GACE,cAAC8J,IAAiBgQ,EAAAA,GAAAA,WAMxB,IAJA4rC,EAAAA,EAAAA,YAAU,KACN1lD,EAAMqD,QAAQ8mN,qBAAqB,GACpC,KAEE5oL,EACD,OAAO,KAGX,MAAM4jE,EAAkBA,KACpBnlG,EAAMqD,QAAQ8P,UAAU,CACpBC,QAASC,EAAAA,GAAiB+xF,YAC1B7xF,WAAY8xF,GAAAA,EACZ7xF,YAAa,CACT8xF,iBAAkBH,IAExB,EAIAizD,GAAoB/wG,IADK0wG,GAA0BC,GAA0BC,GAAkBC,GAA8BC,IACnEE,EAEhE,OACI/3J,IAAAA,cAAC4Z,GAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAA,OAAKsP,QAASA,GACVtP,IAAAA,cAAC4Z,GAAAA,EAAK4+I,WAAU,CAACzhK,GAAG,mBACpBiJ,IAAAA,cAAC4Z,GAAAA,EAAKmvN,eAAc,CAAChyO,GAAG,uBACxBiJ,IAAAA,cAACs4J,GAAAA,EAAoB,CAAC11B,YAAa/1G,EAAAA,GAAYm8M,6BAC3ChpO,IAAAA,cAAC4Z,GAAAA,EAAKq/I,SAAQ,CACVliK,GAAG,gBACH8U,MAAOk7C,EACPpH,GAAG,iBACHn1C,KACIxK,IAAAA,cAAAA,IAAAA,SAAA,KACKwJ,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,mBAC9Dm/N,GACG5oO,IAAAA,cAAA,OACIsP,QAASu5N,EACT5oO,UAAW,wBAEXD,IAAAA,cAACmtK,GAAAA,GAAsB,QAKvCptK,KAAMC,IAAAA,cAACipO,GAAAA,mBAAkB,CAACnoO,KAAM,QAGxCd,IAAAA,cAAC4Z,GAAAA,EAAKq/I,SAAQ,CACVliK,GAAG,eACH8U,KAAM68N,GAAe5wE,EACrBn4G,GAAI,IAAMvD,EAAW,gBACrB5xC,KAAMhB,EAAc,CAACzS,GAAI,+BAAgC0S,eAAgB,iBACzE1J,KAAMC,IAAAA,cAACkpO,GAAAA,oBAAmB,CAACpoO,KAAM,OAErCd,IAAAA,cAAC4Z,GAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,aACH+b,QAASC,EAAAA,GAAiB+xF,YAC1Bj5F,KAAMi9N,GAA0BvwI,GAAiBpK,EACjDl7E,WAAY8xF,GAAAA,EACZ7xF,YAAa,CACT8xF,iBAAkBH,GAEtBr6F,KAAMhB,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,gBACvE1J,KAAMC,IAAAA,cAACssG,GAAAA,2BAA0B,CAACxrG,KAAM,KACxCuG,SAAUkxF,EACVmhE,SAAUnhE,GAAiBpK,IACvBnuF,IAAAA,cAAC25J,GAAAA,EAAmB,CAChB59J,QAASw8F,EACTqhE,QAASC,EAAAA,GAAmBsvE,mBAC5BpvE,8BAA+BC,EAAAA,GAAYC,aAC3C10C,eAAgB/7G,EAAc,CAC1BzS,GAAI,oDACJ0S,eAAgB,+GAEpBywJ,mBAAoB1wJ,EAAc,CAC9BzS,GAAI,sDACJ0S,eAAgB,gDAEpB0wJ,qBAAsB3wJ,EAAc,CAChCzS,GAAI,wDACJ0S,eAAgB,kJAEpB,CACI2wJ,YAAaC,GAAAA,KAGjBC,oBAAqB9wJ,EAAc,CAC/BzS,GAAI,uDACJ0S,eAAgB,4CAEpB8wJ,sBAAuB/wJ,EAAc,CACjCzS,GAAI,yDACJ0S,eAAgB,gKAEpB+wJ,aAAchxJ,EAAc,CACxBzS,GAAI,gDACJ0S,eAAgB,wCAEpBgxJ,eAAgBjxJ,EAAc,CAC1BzS,GAAI,kDACJ0S,eAAgB,kGAKhCzJ,IAAAA,cAAC+rJ,GAAAA,EAAkB,CACf1xJ,OAAQA,EACRuoI,YAAa,CAAC/1G,EAAAA,GAAYiE,2BAE1B9wB,IAAAA,cAAC4Z,GAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,mBACH+b,QAASC,EAAAA,GAAiBie,mBAC1BnlB,KAAM68N,IAAgB3hL,GAAY4hL,EAClC11N,WAAYge,GAAAA,EACZ/d,YAAa,CAACge,WAAY,gBAC1B1mB,KAAMhB,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,oBACxE1J,KAAMC,IAAAA,cAACopO,GAAAA,wBAAuB,CAACtoO,KAAM,QAG7Cd,IAAAA,cAAC4Z,GAAAA,EAAKw/I,iBAAgB,CAClBriK,GAAG,gBACH8U,KAAMkrJ,IAAoBnnI,GAAAA,KAC1B7uB,KAAKs2J,EAAAA,GAAAA,IAAYN,GACjBvsJ,KAAMhB,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,kBACvE1J,KAAMC,IAAAA,cAACqpO,GAAAA,oBAAmB,CAACvoO,KAAM,OAErCd,IAAAA,cAAC4Z,GAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,QACH+b,QAASC,EAAAA,GAAiBwmJ,MAC1BtmJ,WAAYilC,GAAAA,EACZ1tC,KAAMhB,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,oBAAqB,CAAC4tC,SAAUmiH,IAClGz5J,KAAMC,IAAAA,cAACyvD,GAAAA,uBAAsB,CAAC3uD,KAAM,QAGnC,EAEnB2nO,GAAApgO,UAAA,CA3LE0+C,SAAQjhD,KAAAA,KAAAC,WACR1L,OAAMyL,KAAAA,OACNs2C,SAAQt2C,KAAAA,OACR0zJ,SAAQ1zJ,KAAAA,OAAAC,WAERgxJ,gBAAejxJ,KAAAA,OAAAC,WACf2iO,YAAW5iO,KAAAA,KAAAC,WACX4xJ,eAAc7xJ,KAAAA,KAAAC,WACd0xJ,uBAAsB3xJ,KAAAA,KAAAC,WACtB6xJ,2BAA0B9xJ,KAAAA,KAAAC,WAC1B2xJ,uBAAsB5xJ,KAAAA,KAAAC,WACtB8xJ,oBAAmB/xJ,KAAAA,KAAAC,WACnBgyJ,sBAAqBjyJ,KAAAA,KAAAC,WACrB4iO,wBAAuB7iO,KAAAA,KAAAC,WACvB6iO,2BAA0B9iO,KAAAA,KAAAC,WAC1BwyF,cAAazyF,KAAAA,KAAAC,WACbooF,YAAWroF,KAAAA,KAAAC,WACXuJ,QAAOxJ,KAAAA,KACP+iO,wBAAuB/iO,KAAAA,KAAAC,WACvB+iO,uBAAsBhjO,KAAAA,KACtB/C,QAAO+C,KAAAA,MAAA,CACH+M,UAAS/M,KAAAA,KAAAC,WACT8jN,oBAAmB/jN,KAAAA,KAAAC,aAAAA,YAuK3B,YC3HA,IAAe+B,EAAAA,EAAAA,UAnEf,SAAyBxP,GACrB,MAAMqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnB4tB,GAAcC,EAAAA,EAAAA,IAAe7tB,GAC7B2oC,GAAcle,EAAAA,EAAAA,IAAezqB,GAE7By+J,EAAkBp8J,EAAOigK,iBAAmB,GAC5CjD,EAA2C,SAA1Bh9J,EAAOkgK,eACxBrB,EAAW7+J,EAAO28C,UAAY,aAC9BmgH,EAA2D,SAAlC98J,EAAOmgK,uBAChClD,EAAmE,SAAtCj9J,EAAOogK,2BACpCrD,EAA2D,SAAlC/8J,EAAOqgK,uBAChC2tE,GAA0B53M,EAAAA,EAAAA,IAAqBz4B,GAC/C8iK,GAA6BvqI,EAAAA,GAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAYwuI,yBAA0BxqI,EAAAA,GAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAYyuI,gBAAiBzqI,EAAAA,GAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAY0uI,4BAA6B1qI,EAAAA,GAAAA,IAA2Bv4B,EAAOu0B,EAAAA,GAAY2uI,0BAC7R3D,GAAuBh0H,EAAAA,GAAAA,IAAsBvrC,EAAO,CAACwrC,WAAYjX,EAAAA,GAAY4uI,gBAAiB53H,EAAAA,GAAAA,IAAsBvrC,EAAO,CAACwrC,WAAYjX,EAAAA,GAAY6uI,qBACpJ3D,EAAwBqD,GAA6BvD,EAErD+wE,GADOrkK,EAAAA,EAAAA,IAAOjsE,EAAOwzK,GAAAA,GAAwBC,GAAAA,EAAoBK,qBAAsB,KACjDU,GAAAA,GAAmBf,GAAAA,EAAoBK,sBAAsB7jJ,QACnGugN,GAAyBr7M,EAAAA,EAAAA,IAAsBn1B,GAC/CyuD,GAAWC,EAAAA,GAAAA,IAAgB1uD,GAE3Bud,GAAeC,EAAAA,EAAAA,IAAqBxd,GACpC40B,GAAUC,EAAAA,EAAAA,IAAW70B,GACrBq4F,GAAsBC,EAAAA,EAAAA,IAAuBt4F,GAE7C+1F,GAAUytE,EAAAA,GAAAA,IAAe5uI,GACzBo8M,EAAqBj7I,IAAWsC,aAAmB,EAAnBA,EAAqB5E,OAAQC,EAAAA,GAAcC,QAC3Es9I,EAAmBl7I,GAA2C,UAAhCx4E,aAAY,EAAZA,EAAc+5E,eAG5C45I,EADoD,SAAhC7uO,EAAOy9C,sBACwC,UAAvBlrB,EAAQG,WACpDo8M,EAA4C,SAApBv8M,EAAQ82L,QAEhCzrH,EAAgB+wI,GAAsBE,EACtCr7I,EAAco7I,GAAoBE,EAExC,MAAO,CACH1iL,WACAgwG,kBACAY,iBACAI,wBACAN,yBACAG,6BACAF,yBACAG,sBACA8wE,0BACAl3F,gBAAiBn5I,EAAM+oE,QAAQ7hE,WAAWi3J,SAC1C+C,WACAn/J,OAAQ6rB,aAAW,EAAXA,EAAanvB,GACrBqlD,SAAUl2B,aAAW,EAAXA,EAAa/lB,KACvB8gC,cACAmP,kCAAkC+nI,EAAAA,EAAAA,IAAoC7/K,GACtEswO,6BACAE,yBACAvwI,gBACApK,cAER,IAEA,SAA4B93F,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAAS,KACTg3M,oBAAmBA,GAAAA,IACpBxzN,GAEX,GAEA,CAA4DoyO,ICtE/CiB,GAAuB7nL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,wBAAVq7C,CAAU,+EAUjC8nL,GAAoB9nL,IAAOmuE,GAAAA,IAAYnN,OAAM,KAAM,CAC5D9rH,GAAI,sBACJgJ,KAAM,WACNe,KAAM,KAKNwO,QAASA,OACTu2N,UAAU,EACVC,SAAS,MACVhkL,WAAA,CAAAt7C,YAAA,qBAX8Bq7C,CAW9B,sDAgGH,GAzFoB+nL,KAChB,MAAM,cAACpgO,IAAiBgQ,EAAAA,GAAAA,WAClBzD,GAAW8zN,EAAAA,GAAAA,MACXxzO,GAAWsxD,EAAAA,EAAAA,eACX4/K,GAAexwL,EAAAA,EAAAA,aAAYswL,IAC3ByC,GAAUj+K,EAAAA,EAAAA,QAAuB,MACjCk+K,GAAmBC,EAAAA,GAAAA,MACnB98M,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IAEtB4yB,EAAcA,IAAM1pD,GAASqgC,EAAAA,GAAAA,IAA4B6wM,IAEzD0C,GAA2B58D,EAAAA,GAAAA,MAE3B68D,EAA6Bn+D,GAAAA,EAAoBK,sBAOvD90B,EAAAA,GAAAA,IAAmBwyF,GAAS,KACnBvC,GAGLlxO,GAASqgC,EAAAA,GAAAA,IAA2B,GAAO,IAG/C,MAAMyzM,EAAep0N,aAAQ,EAARA,EAAU1S,KAAKuoF,GAI5B5rF,IAAAA,cAACqoO,GAAe,CACZ3qO,IAAKkuF,EAAQ70F,GACbuxO,YAAa18I,EAAQw+I,gBACrBrqO,KAAM6rF,EAAQ+7I,aACdn9N,KAAMohF,EAAQk8I,aACdvyN,OAAQq2E,EAAQ70F,KAAOgzO,EACvBz6N,QAASywC,EACTwoL,aAVJA,EAWIxxO,GAAE,qBAAA4J,OAAuBirF,EAAQ3uF,UAAY2uF,EAAQ70F,QAKjE,OACIiJ,IAAAA,cAAA,OAAK46C,IAAKkvL,GACN9pO,IAAAA,cAACka,GAAAA,EAAW,CACRvI,KAAM41N,GAENvnO,IAAAA,cAAC0pO,GAAoB,CAACp6N,QAASywC,GAC3B//C,IAAAA,cAAC2pO,GAAiB,CACdp0N,OAAQgyN,EACR,gBAAeA,EACf,aAAY/9N,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,wBAClF,gBAAc,0BAEM,UAAvByjB,EAAQG,YAA0BrtB,IAAAA,cAACmoO,GAA0B,MACtC,SAAvBj7M,EAAQG,YAAyBrtB,IAAAA,cAACynO,GAAe,OAEtDznO,IAAAA,cAAC4Z,GAAAA,EAAI,CACDywN,OAAQ,iCACRpqO,UAAW,wBACXlJ,GAAI,wBACJqjB,UAAW,gBAEXpa,IAAAA,cAACqoO,GAAe,CACZC,YAAa,IACbvoO,KAAM,mBACNyK,KAAM,WACN+K,QAAQ6wN,EAAAA,GAAAA,IAAW2D,GACnBz6N,QAASywC,IAEZoqL,EACDnqO,IAAAA,cAACyoO,GAAe,CACZC,aAAatC,EAAAA,GAAAA,IAAW2D,GACxBz6N,QAASywC,EACT8oL,wBA9DYA,KAC5B,MAAMltI,EAAQmxE,GAAAA,GAAmBo9D,GACjCD,EAAyBC,EAA4BvuI,EAAMkxE,UAAU,EAAM,UAC3En7E,aAAaQ,QAAQ45E,GAAAA,GAAwB,OAAO,IA6DxC9rK,IAAAA,cAAC4Z,GAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,GAAAA,EAAK8+I,WAAU,CACZ3hK,GAAG,kBAKjB,ECvIRuzO,GAAwBzoL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,yBAAVq7C,CAAU,yGAmBxC,GAPqB0oL,IACjBvqO,IAAAA,cAACsqO,GAAqB,KAClBtqO,IAAAA,cAAC4pO,GAAW,OACX7nH,EAAAA,GAAAA,OAAkB/hH,IAAAA,cAACwmO,GAAc,O,wCCrBnC,SAASgE,GAAqBlyO,GACjC,OAAOA,EAAM8kD,MAAMqtL,eAAevkI,MACtC,C,sICWA,MAAMwkI,IAAsBhpK,EAAAA,GAAAA,GAAmB,sBAAuB1hE,IAAAA,MAAW,IAAM,kCAsBvF,IAAe8H,EAAAA,EAAAA,UApBf,SAAyBxP,GAKrB,MAAO,CACHpB,QALWqjB,EAAAA,EAAAA,IAAiBjiB,GAM5BirB,QALWC,EAAAA,GAAAA,GAAiBlrB,GAM5Bs9G,OALUC,EAAAA,EAAAA,IAASv9G,GAO3B,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBm3G,UAASA,EAAAA,IACV9oH,GAEX,GAEA,CAA4Dq0O,I,0dCmCrD,MAAMC,GAA4E,CACrFpS,KAAKrhK,EAAAA,GAAAA,gBAAe,CAChB/2D,KAAM,CACFpJ,GAAI,0BACJ0S,eAAgB,iBAEpBmhO,MAAO,CACH7zO,GAAI,gCACJ0S,eAAgB,mCAGxBg7G,QAAQvtD,EAAAA,GAAAA,gBAAe,CACnB/2D,KAAM,CACFpJ,GAAI,6BACJ0S,eAAgB,YAGxBk7G,MAAMztD,EAAAA,GAAAA,gBAAe,CACjB/2D,KAAM,CACFpJ,GAAI,2BACJ0S,eAAgB,UAGxBo7G,KAAK3tD,EAAAA,GAAAA,gBAAe,CAChB/2D,KAAM,CACFpJ,GAAI,0BACJ0S,eAAgB,oBAGxB6uN,SAASphK,EAAAA,GAAAA,gBAAe,CACpB/2D,KAAM,CACFpJ,GAAI,8BACJ0S,eAAgB,cAKrB,MAAMohO,WAAuB7qO,IAAAA,cAchCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,gBAdN,CACP,CAACzL,GAAI,aAAc6K,OAAOsN,EAAAA,GAAAA,eAAc,CAACnY,GAAI,+CAAgD0S,eAAgB,iBAC7G,CAAC1S,GAAI,iBAAkB6K,OAAOsN,EAAAA,GAAAA,eAAc,CAACnY,GAAI,mDAAoD0S,eAAgB,aACrH,CAAC1S,GAAI,WAAY6K,OAAOsN,EAAAA,GAAAA,eAAc,CAACnY,GAAI,6CAA8C0S,eAAgB,YACzG,CAAC1S,GAAI,YAAa6K,OAAOsN,EAAAA,GAAAA,eAAc,CAACnY,GAAI,8CAA+C0S,eAAgB,aAC3G,CAAC1S,GAAI,WAAY6K,OAAOsN,EAAAA,GAAAA,eAAc,CAACnY,GAAI,6CAA8C0S,eAAgB,cACzG,CAAC1S,GAAI,SAAU6K,OAAOsN,EAAAA,GAAAA,eAAc,CAACnY,GAAI,2CAA4C0S,eAAgB,4BACxGjH,GAAA,yBAgBkB,KACfE,KAAKhD,MAAMqD,QAAQ8P,UAAU,CACzBC,QAASC,EAAAA,GAAiB2d,cAC1Bzd,WAAY0d,GAAAA,QACZzd,YAAa,CAAC0d,0BAA0B,IAC1C,IACLpuB,GAAA,kBAEW,CAACnD,EAAgByrO,KACzBpoO,KAAKhD,MAAMqD,QAAQo8G,UAAU,CACzB1gG,QAAS/b,KAAKhD,MAAMxI,OACpBmI,SACA0rO,aAAcD,GAChB,IACLtoO,GAAA,0BAEmB,IACTE,KAAKhD,MAAML,SAAWq2C,EAAAA,GAAayvC,gBAC7C3iF,GAAA,kBAEYqV,IACTA,EAAMjO,iBACNlH,KAAKy8G,UAAUzpE,EAAAA,GAAaC,OAAO,IACtCnzC,GAAA,mBAEaqV,IACVA,EAAMjO,iBACNlH,KAAKy8G,UAAUzpE,EAAAA,GAAamsD,QAAQ,IACvCr/F,GAAA,gBAEUqV,IACPA,EAAMjO,iBACNlH,KAAKy8G,UAAUzpE,EAAAA,GAAas1L,KAAK,IACpCxoO,GAAA,eAESmM,IACN,MAAMgrL,GAAc1uE,EAAAA,GAAAA,IAA4BvoH,KAAKhD,MAAM4lD,UAC3D,IAAIs0I,EAAUD,EACd,OAAQhrL,GACR,KAAK,EACDirL,EAAUn/G,KAAO,GACjB,MACJ,KAAK,EAEDm/G,EAAUD,EAAYpgK,IAAI,GAAI,WAC9B,MACJ,KAAK,EAEDqgK,EAAUD,EAAYpgK,IAAI,EAAG,QAC7B,MACJ,KAAK,EAEDqgK,EAAUD,EAAYpgK,IAAI,EAAG,SAC7B,MACJ,KAAK,EAEDqgK,EAAUD,EAAYpgK,IAAI,EAAG,OAAO64B,IAAI,CAAC7P,KAAM,EAAGC,OAAQ,IAI9D9/C,KAAKy8G,UAAUzpE,EAAAA,GAAakP,IAAKg1I,EAAQqxC,MAAMC,OAAO,IACzD1oO,GAAA,0BAEmB,KAChB,MAAM2oO,EAAsB,CACxBr4N,QAASC,EAAAA,GAAiBq4N,uBAC1Bn4N,WAAYy3N,GACZx3N,YAAa,CACTymL,YAAaj3L,KAAKhD,MAAM4lD,UAAW+lL,EAAAA,GAAAA,IAA8B3oO,KAAKhD,MAAM4lD,UAAY,IAAI1nC,OAIpGlb,KAAKhD,MAAMqD,QAAQ8P,UAAUs4N,EAAoB,IACpD3oO,GAAA,qCAE+BnD,IAC5B,MAAMmnF,EAAuB,CACzB1zE,QAASC,EAAAA,GAAiB0zE,aAC1BxzE,WAAYyzE,GAAAA,QACZxzE,YAAa,CAACyzE,UAAWtnF,IAG7BqD,KAAKhD,MAAMqD,QAAQ8P,UAAU2zE,EAAqB,IACrDhkF,GAAA,6BAEuB1B,GACf4B,KAAKhD,MAAM4rO,eAIZtrO,IAAAA,cAACa,GAAAA,EAAM,CACHC,KAAMA,EACNC,IAAK2B,KAAKhD,MAAM4rO,eAChB91K,cAAUx6D,IANP,OASdwH,GAAA,0BAEoBrD,IACjBA,EAAEy0D,kBACFz0D,EAAEyK,iBACFlH,KAAKhD,MAAMqD,QAAQ4oH,mBAAmB,IACzCnpH,GAAA,qCAE8B,KAC3ButB,EAAAA,IAAsC,IACzCvtB,GAAA,iBAEWmP,IACRjP,KAAKhD,MAAMqD,QAAQi2B,kBAAkBrnB,EAAK,IAC7CnP,GAAA,sCAE+B,KAC5B,MAAM8qK,EAAWvB,GAAAA,EAAoBI,sBAC/BxwE,EAAQmxE,GAAAA,GAAmBQ,GAC3BxnJ,EAAgBpjB,KAAKhD,MAAMuhC,YAAYlqC,GACvCoyC,EAAc,CAChB,CACI1qB,QAASqH,EACTsK,SAAU07I,GAAAA,GACV3rK,KAAMmtK,EACN9pK,MAAOm4F,EAAMkxE,SAAS7oK,aAG9BtB,KAAKhD,MAAMqD,QAAQ0tB,gBAAgB3K,EAAeqjB,EAAY,IACjE3mC,GAAA,qCAE+BqV,IAC5BA,EAAM+7C,kBACN,MAAMm5J,EAA6B,CAC/Bj6M,QAASC,EAAAA,GAAiB64G,cAC1B34G,WAAY+2G,GAAAA,GAEhBtnH,KAAKhD,MAAMqD,QAAQ8P,UAAUk6M,EAA2B,IAC3DvqN,GAAA,2BAEqBmoH,IAAgD,IAAA4gH,EAAAC,EAClE,IAAK9oO,KAAKhD,MAAM+nH,sBACZ,OAAO,KAEX,MAAM,aAACtjF,GAAgBzhC,KAAKhD,MAE5B,IAAI+rO,EACAC,EACJ,QAAQ,GACR,KAAK/gH,IAAexmF,aAAY,EAAZA,EAAc35B,OAAQ25B,EAAa35B,KAAKpB,OAAS,EACjEqiO,EAAmBtnM,aAAY,EAAZA,EAAc35B,KACjC,MACJ,KAAKmgH,KAAgBxmF,SAAAA,EAAc35B,QAAQ25B,aAAY,EAAZA,EAAcuiE,YAAamhB,GAAAA,EAAqBC,WACvF4jH,EAAuBhpO,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,8BAC7G,MACJ,KAAKkhH,KAAgBxmF,SAAAA,EAAc35B,QAAQ25B,aAAY,EAAZA,EAAcuiE,YAAamhB,GAAAA,EAAqBC,WACvF2jH,EAAmB,GACnB,MACJ,KAAM9gH,EACF+gH,EAAuBhpO,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,wBAG5G,MAAMijH,EAAoB/B,EACtB3qH,IAAAA,cAAA,QAAMC,UAAU,UACZD,IAAAA,cAACw0G,GAAAA,EAAiB,CACdjrB,aAAa,EACburB,WAAY,CAAC7W,WAAY,MAIjCj+F,IAAAA,cAAC2sH,GAAAA,EAAS,CAAC1sH,UAAW,wBAGpB0rO,GAAgBhhH,GAAejoH,KAAKhD,MAAMksO,8BAC5C5rO,IAAAA,cAAC6rO,GAAAA,GAAY,MAGX5T,EACFj4N,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAI,cACJ0S,eAAe,UAIjB2+G,EAAcuC,IAAgBghH,GAChC3rO,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,wCAAyC,uBAC/D7nC,QAAS5M,KAAK4pH,kBACd5rD,WAAYh+D,KAAK4pH,mBAEjBtsH,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAO+pN,GAEPj4N,IAAAA,cAAA,QACIC,UAAU,gBACV,cAAY,QAEZD,IAAAA,cAAA,KAAGC,UAAU,8BAMvBopH,EAAasB,IAAexmF,aAAY,EAAZA,EAAcyjF,aAAczjF,EAAauiE,WAAamhB,GAAAA,EAAqBC,YAErG9nH,IAAAA,cAAC+nH,GAAAA,EAAU,CACP3/F,KAAM+b,EAAayjF,WACnBtiE,SAAU5iD,KAAKhD,MAAM4lD,SACrBrlD,UAAWk3C,IAAW,wBAAyB,CAC3C20L,QAAQ3nM,SAAkB,QAANonM,EAAZpnM,EAAc35B,YAAI,IAAA+gO,OAAN,EAAZA,EAAoBniO,QAAS,IAEzCkoH,gBAAgB,IAI5B,OACItxH,IAAAA,cAAC4Z,GAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,GAAAA,EAAKw+I,qBAAoB,CACtBh+I,UAAWqxN,GAAoBC,EAC/B54N,QAASC,EAAAA,GAAiB64G,cAC1B34G,WAAY+2G,GAAAA,EACZ/pH,UAAWk3C,IAAW,4CAA6C,CAC/Dy9D,KAAqC,KAA/BzwE,SAAkB,QAANqnM,EAAZrnM,EAAc35B,YAAI,IAAAghO,OAAN,EAAZA,EAAoBpiO,UAE9BrS,GAAI,6BAEJiJ,IAAAA,cAAA,QAAMC,UAAU,4BACZD,IAAAA,cAAA,QAAMC,UAAU,uBACXysH,GAEL1sH,IAAAA,cAACwoH,GAAAA,EAAgB,CACbh+G,KAAMihO,EACNxrO,UAAU,wBAEdD,IAAAA,cAAC88E,GAAAA,GAAI,CACD03G,OAAO,QAENk3C,GAEJtjH,EACAujH,GAEJtiH,GAEI,IAEpB7mH,GAAA,2BAEoB,CAACsoO,EAAqBxlL,KACvC,KAAMwlL,GAAcA,EAAa,GAC7B,OAAOpoO,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,+BAG/F,MAAMixE,EAAKp1B,IAAYshG,EAAAA,GAAAA,MACjB57B,EAAcvwC,OAASC,GAAGA,GAC1Bk/G,EAAUn/G,KAAAA,KAAYqwJ,GAAYpwJ,GAAGA,GAE3C,IAAIqxJ,EAIJ,OAFiBnyC,EAAQnoE,QAAQnC,QAAQ,OAAOnjC,KAAK6+B,EAAYyG,QAAQnC,QAAQ,OAAQ,SAGzF,KAAK,EACDy8G,EACI/rO,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,eACfjB,OAAQ,CAAC4f,KAAMwxK,EAAQxsG,OAAO,aAGtC,MACJ,KAAK,EACD2+I,EACI/rO,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,wBACfjB,OAAQ,CAAC4f,KAAMwxK,EAAQxsG,OAAO,aAGtC,MACJ,QACI2+I,EACI/rO,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,eACfjB,OAAQ,CAAC4f,KAAMwxK,EAAQxsG,OAAO,UAK1C,OAAO2+I,CAAgB,IAC1BvpO,GAAA,eAEQ,KAAmB,IAAAwpO,EAAAC,EAAA9zO,EACxB,MAAM,KAACoR,GAAQ7G,KAAKhD,MACdwsO,EAAexpO,KAAKypO,qBAAoD,KAA7BzpO,KAAKhD,MAAMm5N,eACtD,OAACx5N,EAAM,aAAE8kC,EAAY,sBAAEojF,EAAqB,YAAEtmF,EAAW,SAAEqkB,EAAQ,WAAEwlL,GAAcpoO,KAAKhD,MACxFirH,EAAcxmF,IAAiBojF,KAA2C,QAAjBykH,EAAA7nM,EAAa35B,YAAI,IAAAwhO,OAAA,EAAjBA,EAAmB5iO,QAAS,IAAuB,QAAlB6iO,EAAA9nM,EAAaE,aAAK,IAAA4nM,OAAA,EAAlBA,EAAoB7iO,QAAS,GAEvHgjO,EAAYF,EAAe,IAAMxpO,KAAK2pO,6BAA6B,UAAY3pO,KAAK0pO,UACpFE,EAASJ,EAAe,IAAMxpO,KAAK2pO,6BAA6B,OAAS3pO,KAAK4pO,OAC9EC,EAAUL,EAAe,IAAMxpO,KAAK2pO,6BAA6B,QAAU3pO,KAAK6pO,QAChFC,EAAaN,EAAe,IAAMxpO,KAAK2pO,6BAA6B,WAAa3pO,KAAK8pO,WACtFC,EAAoBP,EAAe,IAAMxpO,KAAK2pO,6BAA6B,OAAS3pO,KAAK+pO,kBAEzFC,EACF1sO,IAAAA,cAACk9E,GAAAA,UAAS,CACNp8E,KAAM,GACNuuD,MAAO,qBAITs9K,EAOL,QAPoBx0O,EAAI,CACrB,CACIpB,GAAI,oBACJi/E,UAAW,QACXxrE,KAAM9H,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,iBAChGmjO,UAAU,WAEjB,IAAAz0O,OAAA,EAPuBA,EAONwI,OACd+B,KAAKmqO,SAASxpO,KAAc,CAAAzF,EAAc+Q,KAAU,IAAvB,GAAC5X,EAAE,MAAE6K,GAAMhE,EAChC4M,EAAyB9H,KAAKhD,MAAM6J,KAAKC,cAAc5H,GAC3D,GAAc,IAAV+M,EAAa,CACb,MAAMwqL,GAAWluE,EAAAA,GAAAA,IAA4BvoH,KAAKhD,MAAM4lD,UAAU/rB,IAAI,EAAG,OAAO64B,IAAI,CAAC7P,KAAM,EAAGC,OAAQ,IAAI04B,SAC1G1wE,EACIxK,IAAAA,cAAAA,IAAAA,SAAA,KACKwK,EACDxK,IAAAA,cAAA,QAAMC,UAAS,WAAAU,OAAa5J,EAAE,eAC1BiJ,IAAAA,cAACo5L,GAAAA,cAAa,CACV51L,MAAO21L,EACPtpI,QAAQ,QACRiB,SAAUpuD,KAAKhD,MAAM4lD,WAExB,KACDtlD,IAAAA,cAACq5L,GAAAA,cAAa,CACV71L,MAAO21L,EACPG,UAAU,QACVC,QAAS72L,KAAKhD,MAAM85L,eACpB1oI,SAAUpuD,KAAKhD,MAAM4lD,YAKzC,CACA,MAAO,CACHvuD,GAAI,WAAF4J,OAAa5J,GACfi/E,UAAW,QACXxrE,OACAuP,OACc,IAAVpL,EAAc,IAAM89N,IAAsB,IAAMH,EAAO39N,GAC9D,KAIHm+N,EAAwBpqO,KAAKqqO,mBAAmBpiH,GAEtD,IAAIqiH,EACJ,OAAQtqO,KAAKhD,MAAML,QACnB,KAAKq2C,EAAAA,GAAas1L,KACdgC,EAAoBzjO,EAAKC,cAAc,CACnCzS,GAAI,4CACJ0S,eAAgB,kEAEpB,MACJ,KAAKisC,EAAAA,GAAakP,IACdooL,EAAoBzjO,EAAKC,cAAc,CACnCzS,GAAI,2CACJ0S,eAAgB,4EAEpB,MACJ,KAAKisC,EAAAA,GAAamsD,QACdmrI,EAAoBzjO,EAAKC,cAAc,CACnCzS,GAAI,+CACJ0S,eAAgB,qEAEpB,MACJ,KAAKisC,EAAAA,GAAaC,OACdq3L,EAAoBzjO,EAAKC,cAAc,CACnCzS,GAAI,8CACJ0S,eAAgB,oEAEpB,MACJ,KAAKisC,EAAAA,GAAayvC,cACd6nJ,EAAoBzjO,EAAKC,cAAc,CACnCzS,GAAI,2CACJ0S,eAAgB,2EAEpB,MACJ,QACIujO,EAAoBzjO,EAAKC,cAAc,CACnCzS,GAAI,uCACJ0S,eAAgB,4CAIxB,MAAMwjO,EAAevqO,KAAKwqO,mBAAmBpC,EAAYxlL,GAEzD,OACItlD,IAAAA,cAACka,GAAAA,EAAW,CACRqjE,SAAU76E,KAAK66E,SACf5rE,KAAMjP,KAAKhD,MAAM8qO,qBACjBvqO,UAAWk3C,IAAW,0DAA2D,CAC7E5hC,OAAQ7S,KAAKhD,MAAM8qO,sBAAwB7/G,KAG/C3qH,IAAAA,cAAA,UACIC,UAAU,6BACV,aAAY+sO,EACZ,gBAAetqO,KAAKhD,MAAM8qO,qBAC1B,gBAAc,sBAEdxqO,IAAAA,cAACw0G,GAAAA,EAAiB,CACdjrB,aAAa,EACburB,WAAY,CAAC0G,YAAa,OAC1BlsG,QAAS5M,KAAKyqO,+BAEjBzqO,KAAK0qO,qBAAqB,MAC3BptO,IAAAA,cAAA,OACIC,UAAU,UAEVD,IAAAA,cAACoiG,GAAAA,GAAU,CACPthG,KAAM,KACNzB,OAASqD,KAAKhD,MAAML,QAAU,cAI1CW,IAAAA,cAAC4Z,GAAAA,EAAI,CACDQ,UAAW1X,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,iBAC/F1S,GAAI,qBACJszO,OAAQ,8BAEPppM,GACGjhC,IAAAA,cAAC4Z,GAAAA,EAAK1M,OAAM,CAACoC,QAAS5M,KAAK2qO,kBACtB3qO,KAAK0qO,qBAAqB,MAC3BptO,IAAAA,cAAA,OAAKC,UAAW,oBACZD,IAAAA,cAAC88E,GAAAA,GAAI,CACD78E,UAAW,OACXu0L,OAAQ,QAAO,GAAA7zL,OACdsgC,EAAYzgC,WAAU,KAAAG,OAAIsgC,EAAYxgC,YAC3CT,IAAAA,cAAC88E,GAAAA,GAAI,CACD03G,OAAQ,OACRv0L,UAAYghC,EAAYzgC,YAAeygC,EAAYxgC,UAAqB,WAAT,OAC/D4uD,MAAQpuB,EAAYzgC,YAAeygC,EAAYxgC,UAAwB,eAAZzF,GAE1D,IAAMimC,EAAY1gC,YAKnCP,IAAAA,cAAC4Z,GAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZ3nG,KAAMnJ,KAAKypO,oBACX78N,QAAS88N,EACThyN,UAAW1X,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuBpS,IAAIp4N,MACpEqK,KAAM9H,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuBpS,IAAIp4N,MAC/DJ,KACIC,IAAAA,cAACstO,GAAAA,WAAU,CACPj+K,MAAO,gDAGfgpG,UAAW31J,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuBpS,IAAIqS,OACpE2C,eAAgBb,KAGvBI,EACD9sO,IAAAA,cAAC4Z,GAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZlkG,QAAS88N,EACThyN,UAAW1X,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuBlmH,OAAOtkH,MACvEqK,KAAM9H,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuBlmH,OAAOtkH,MAClEJ,KACIC,IAAAA,cAACoiG,GAAAA,GAAU,CACP/iG,OAAQ,SACRY,UAAW,gBAGnBstO,eAA2B,WAAXluO,GAAuBqtO,EACvC31O,GAAI,uBAERiJ,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZlkG,QAASi9N,EACTnyN,UAAW1X,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuBhmH,KAAKxkH,MACrEqK,KAAM9H,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuBhmH,KAAKxkH,MAChEJ,KACIC,IAAAA,cAACoiG,GAAAA,GAAU,CACP/iG,OAAQ,OACRY,UAAW,gBAGnBstO,eAA2B,SAAXluO,GAAqBqtO,EACrC31O,GAAI,qBAERiJ,IAAAA,cAAC4Z,GAAAA,EAAKC,YAAW,CACbC,QAAS6yN,EACTvyN,UAAS,GAAAzZ,OAAK+B,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuB9lH,IAAI1kH,MAAK,MAAAQ,OAAKssO,GACjFziO,KAAM9H,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuB9lH,IAAI1kH,MAC/Dk4J,UAAW40E,EACXltO,KACIC,IAAAA,cAACoiG,GAAAA,GAAU,CACP/iG,OAAQ,MACRY,UAAW,gBAGnBstO,eAA2B,QAAXluO,GAAoBqtO,EACpC12J,UAAW,OACXlV,OAAQp+D,KAAKpK,MAAMwoE,OACnB/pE,GAAI,kBACJgjB,OAAQA,IAAMuyN,EAAO,KAEzBtsO,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZlkG,QAASk9N,EACTpyN,UAAW1X,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuBrS,QAAQn4N,MACxEqK,KAAM9H,KAAKhD,MAAM6J,KAAKC,cAAcmhO,GAAuBrS,QAAQn4N,MACnEJ,KACIC,IAAAA,cAACoiG,GAAAA,GAAU,CACP/iG,OAAQ,UACRY,UAAW,gBAGnBstO,eAA2B,YAAXluO,GAAwBqtO,EACxC31O,GAAI,yBAGZiJ,IAAAA,cAAC4Z,GAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,GAAAA,EAAKw+I,qBAAoB,CACtBrhK,GAAG,kBACHqjB,UAAU,UACVtH,QAASC,EAAAA,GAAiB2d,cAC1Bzd,WAAY0d,GAAAA,QACZzd,YAAa,CAAC0d,0BAA0B,GACxCpmB,KAAM9H,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,YAC5F1J,KACIC,IAAAA,cAACwtO,GAAAA,mBAAkB,CACf1sO,KAAM,GACNuuD,MAAO,iDAId3sD,KAAKhD,MAAM+tO,6BACRztO,IAAAA,cAAA,OACIsP,QAAS5M,KAAKgrO,8BACdztO,UAAW,6BAEXD,IAAAA,cAACguK,GAAAA,GAAuB,SAKxChuK,IAAAA,cAAC4Z,GAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAA,QAAMC,UAAW,gBACbD,IAAAA,cAAC4Z,GAAAA,EAAK45F,WAAU,CACZz8G,GAAG,SACHuY,QAAS5M,KAAK+2J,6BACdjvJ,KAAM9H,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,YACnF1J,KACIC,IAAAA,cAAC2tO,GAAAA,cAAa,CACV7sO,KAAM,GACNuuD,MAAO,qDAOrB,IAvjBlB3sD,KAAKpK,MAAQ,CACTwoE,QAAQ,EACRzyD,MAAO,EACPs8G,aAAa,EAErB,EAqjBHnoH,GA3kBYqoO,GAAc,eASD,CAClB3zO,OAAQ,GACRo0O,eAAgB,KAikBxB,UAAe97N,EAAAA,GAAAA,YAAWq7N,ICpnB1B,IAAe/iO,EAAAA,EAAAA,UA1Cf,WACI,MAAMs/G,GAAkBC,EAAAA,GAAAA,MAExB,OAAO,SAAyB/uH,GAC5B,MAAM2oC,GAAcle,EAAAA,EAAAA,IAAezqB,GAE7BpB,EAAS+pC,aAAW,EAAXA,EAAalqC,GACtBotC,EAAeijF,EAAgB9uH,EAAOpB,GACtCsiM,GAAiB75K,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYggL,mBAAmB,GAEtG6tC,GADOlpK,EAAAA,EAAAA,IAAOjsE,EAAOwzK,GAAAA,GAAwBC,GAAAA,EAAoBI,sBAAuB,KACjDW,GAAAA,GAAmBf,GAAAA,EAAoBI,uBAAuB5jJ,QAC3G,MAAO,CACHrxB,SACAo0O,eAAgBtzO,EAAAA,GAAQ4lD,qBAAqB1mD,EAAQ+pC,aAAW,EAAXA,EAAa4c,qBAClEg7K,eAAet1J,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAY64M,kCAAmCvhO,EAAQ,IACjFmI,QAAQslD,EAAAA,EAAAA,IAAmBrsD,EAAOpB,GAClCitC,eACAlD,cACAwmF,uBAAuBA,EAAAA,GAAAA,IAAsBnvH,GAC7CivH,uBAAuBA,EAAAA,GAAAA,IAAsBjvH,EAAO6rC,GACpDq1J,iBACAgxC,qBAAsBA,GAAqBlyO,GAC3CszO,8BAA8B/gH,EAAAA,GAAAA,IAA+BvyH,GAC7Dm1O,8BACAnoL,UAAUH,EAAAA,GAAAA,IAAmB7sD,GAC7BwyO,YAAY8C,EAAAA,EAAAA,GAAuBt1O,EAAOpB,GAElD,CACJ,IAEA,SAA4Bb,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAAS,KACTssG,UAAS,KACTwM,kBAAiB,KACjB3yF,kBAAiB,KACjBvI,gBAAeA,EAAAA,IAChBp6B,GAEX,GAEA,CAAgEw0O,I,4BCrDhE,MA6CA,GA7CyBgD,KACrB,MAAM,cAACrkO,IAAiBgQ,EAAAA,GAAAA,WAClBnjB,GAAWsxD,EAAAA,EAAAA,eACXk0G,GAAW9kH,EAAAA,EAAAA,cAAaz+C,IAAuBuiB,EAAAA,EAAAA,IAAYviB,KAWjE,OACI0H,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,oBAEnBzJ,IAAAA,cAAC61D,GAAAA,EAAwB,CACrBP,SAAUQ,GAAAA,EAAmBqpF,YAC7B0B,iBAAiB,EACjB5qF,iBAAiB,MAK7Bj2D,IAAAA,cAACgwH,GAAAA,GAAU,CACPlvH,KAAM,KACNf,KAAM,KACNs9E,QAASw+E,IAAa/gJ,EAAAA,GAAUihJ,QAChCzsJ,QA7BgBnQ,IACxBA,EAAEyK,iBACEiyJ,IAAa/gJ,EAAAA,GAAUihJ,QACvB1lK,GAAS4nB,EAAAA,GAAAA,OAET5nB,GAASwgK,EAAAA,GAAAA,MACb,EAwBQgvE,UAAU,EACVC,SAAS,EACT,gBAAejqE,IAAa/gJ,EAAAA,GAAUihJ,QACtC,gBAAc,kBACd,aAAYvyJ,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,sBAE1E,E,4BCzCtB,MAAMqkO,GAAgBjsL,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,iBAAbq7C,CAAa,kQAgBnC,IAAI4pC,GAEJ,MA6DA,GA7D0BsiJ,KACtB,MAAM13O,GAAWsxD,EAAAA,EAAAA,gBACX,cAACn+C,IAAiBgQ,EAAAA,GAAAA,WAExBiyE,IAAmBC,EAAAA,GAAAA,KACnB,MAAM2C,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,KAE5BrxC,EAAAA,EAAAA,YAAU,KACFipC,IACAh4F,GAASyf,EAAAA,GAAAA,OACTzf,GAAS2f,EAAAA,GAAAA,OACb,GACD,CAACq4E,IAEJ,MAAM1C,GAAU50C,EAAAA,EAAAA,aAAY7T,EAAAA,IACtBrtB,GAAekhC,EAAAA,EAAAA,aAAYshD,EAAAA,IAC3BzM,GAAU70C,EAAAA,EAAAA,aAAY80C,EAAAA,IACtBlxF,GAASo8C,EAAAA,EAAAA,aAAYt3B,EAAAA,IACrByN,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IAEtBo6L,EAAoD,UAAhC1xM,aAAY,EAAZA,EAAc+5E,eAElCo+I,GAAcpiJ,aAAO,EAAPA,EAASG,OAAQC,EAAAA,GAAcC,QAE7C83H,GAA+B11H,GAA+B,SAApBnhE,EAAQ82L,QAClDwlB,EAA6C,UAAvBt8M,EAAQG,WAC9B+uF,EAAoD,SAAhCzhH,EAAOy9C,qBAEjC,OAAKuzC,GAKAywB,KAKD/tB,GAAa2/I,GAAezmB,KAK3Bl5H,GAAam7I,GAAuBzlB,GAKrC/jN,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAO1E,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,mCAEvEzJ,IAAAA,cAAC8tO,GAAa,CACV/2O,GAAG,gBACH,gBAAc,SACduY,QAASA,IAAMm8E,GAAiB,CAACuF,iBAAkB,uCAElDxnF,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,iBA3BpE,IA6BO,ECvCtB,GAtCyBwkO,KACrB,MAAM,cAACzkO,IAAiBgQ,EAAAA,GAAAA,WAClBnjB,GAAWsxD,EAAAA,EAAAA,eACXk0G,GAAW9kH,EAAAA,EAAAA,cAAaz+C,IAAuBuiB,EAAAA,EAAAA,IAAYviB,KAWjE,OACI0H,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,oBAIvBzJ,IAAAA,cAACgwH,GAAAA,GAAU,CACPlvH,KAAM,KACNf,KAAM,mBACNs9E,QAASw+E,IAAa/gJ,EAAAA,GAAUitL,KAChCz4L,QAtBmBnQ,IAC3BA,EAAEyK,iBACEiyJ,IAAa/gJ,EAAAA,GAAUitL,KACvB1xM,GAAS4nB,EAAAA,GAAAA,OAET5nB,GAASsgK,EAAAA,GAAAA,MACb,EAiBQkvE,UAAU,EACVC,SAAS,EACT,gBAAejqE,IAAa/gJ,EAAAA,GAAUitL,KACtC,gBAAc,kBACd,aAAYv+L,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,qBAEnE,EC/BhBykO,GAAkBxuO,IACpB,MAAM,cAAC8J,IAAiBgQ,EAAAA,GAAAA,WAExB,OACIxZ,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,cAIvBzJ,IAAAA,cAACgwH,GAAAA,GAAU,CACPlvH,KAAM,KACNf,KAAM,mBACNuP,QAASA,KACL5P,EAAMqD,QAAQ8P,UAAU,CAACC,QAASC,EAAAA,GAAiB2d,cAAezd,WAAY0d,GAAAA,QAAmBzd,YAAa,CAAC0d,0BAA0B,IAAO,EAEpJi1M,UAAU,EACVC,SAAS,EACT,gBAAc,SACd,aAAYt8N,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,eAE1E,EAEpBykO,GAAA7lO,UAAA,CA9BEtF,QAAO+C,KAAAA,MAAA,CACH+M,UAAS/M,KAAAA,KAAAC,aAAAA,YA+BjB,YC7BA,IAAe+B,EAAAA,EAAAA,SAAQ,MARvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAASA,GAAAA,GACVxc,GAEX,GAEA,CAAiD63O,ICS3CC,GAAyBtsL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,0BAAVq7C,CAAU,mJAcnCusL,GAAoCvsL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,qCAAVq7C,CAAU,iDAM9CwsL,GAAuBxsL,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,wBAAVq7C,CAAU,sBAiDvC,GAzCsB1pD,IAA4C,IAA3C,UAACguO,EAAY,MAAYhuO,EAE5C,MACMusE,GADc3tB,EAAAA,EAAAA,cAAaz+C,IAAuBqsE,EAAAA,EAAAA,IAAuBrsE,KAChDssE,GAAAA,GAAiC0pK,qBAAuBxpK,GAAAA,GAAoBwpK,qBAErGC,GAAmBC,EAAAA,GAAAA,IAA8B9pK,GAEvD,OACI1kE,IAAAA,cAACmuO,GAAsB,CACnBp3O,GAAI,0BAEJiJ,IAAAA,cAAC+tO,GAAiB,OACjB3H,EAAAA,GAAAA,IAAWD,GACRnmO,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAC6tO,GAAgB,MACjB7tO,IAAAA,cAACiuO,GAAgB,OAGrBjuO,IAAAA,cAAC2wL,GAAAA,QAAS,CACNC,cAAe,UACfy1C,iBAAkB,uBAClBC,YAAaH,IAGrBnmO,IAAAA,cAACouO,GAAiC,CAACr3O,GAAG,gCAE9BqvO,EAAAA,GAAAA,IAAWD,GACPnmO,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACkuO,GAAc,MACdK,GAAoBvuO,IAAAA,cAACyuO,GAAAA,GAA2B,OAErD,KAERzuO,IAAAA,cAACquO,GAAoB,KACjBruO,IAAAA,cAAC6qO,GAAc,QAGF,EC3E3B6D,GAAwB7sL,IAAAA,OAAaC,WAAA,CAAAt7C,YAAA,yBAAbq7C,CAAa,oQAwC3C,GApBqB8sL,KACjB,MAAM94I,GAAauoB,EAAAA,GAAAA,MACb2rH,GAAmBC,EAAAA,GAAAA,MACnBp0H,GAAQ7+D,EAAAA,EAAAA,aAAY8+D,EAAAA,IAE1B,OAAKhgB,EAKD71F,IAAAA,cAACo2G,GAAAA,QAAoB,CAACR,MAAOA,GACzB51G,IAAAA,cAAC0uO,GAAqB,CAAC33O,GAAG,iBACtBiJ,IAAAA,cAACuqO,GAAY,MACbvqO,IAAAA,cAAC4uO,GAAc,CAACzI,UAAW4D,IAC3B/pO,IAAAA,cAAC6uO,GAAa,CAAC1I,UAAW4D,MAR3B,IAUgB,E,gBC1C/B,MAAM78N,GAASlN,IAAAA,MAAW,IAAM,kCAC1B+N,GAAS/N,IAAAA,MAAW,IAAM,kCASnB8uO,GAAU32O,IAAgD,IAA/C,KAACsqB,EAAM9kB,UAAWmrE,GAAwB3wE,EAC9D,MAAO42O,EAAaC,IAAkBz1N,EAAAA,EAAAA,UAAsB,CAAC,GAEvD01N,GAAuCx1N,EAAAA,EAAAA,cAAa/Z,IACtDsvO,EAAetvO,EAAM,GACtB,IAEH,OACIM,IAAAA,cAACkvO,EAAAA,MAAK,CACFzsN,KAAMA,EACN9c,OAAQA,IACJ3F,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACA,IAAAA,SAAc,CAACs2J,SAAU,MACtBt2J,IAAAA,cAACkpF,GAAAA,QAAe,OAEpBlpF,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,iCACXD,IAAAA,cAACA,IAAAA,SAAc,CAACs2J,SAAU,MACtBt2J,IAAAA,cAACkN,GAAW6hO,IAEhB/uO,IAAAA,cAACA,IAAAA,SAAc,CAACs2J,SAAU,MACtBt2J,IAAAA,cAAC8oE,EAAS,CAACqmK,kBAAmBF,KAElCjvO,IAAAA,cAACA,IAAAA,SAAc,CAACs2J,SAAU,MACtBt2J,IAAAA,cAAC+N,GAAM,WAM7B,EAER+gO,GAAAzmO,UAAA,CApCEoa,KAAI3c,KAAAA,OAAAC,WACJpI,UAASmI,KAAAA,YAAAC,Y,gZCXb,MAAMqpO,GAAuBpvO,IAAAA,MAAW,IAAM,kCACxCkkJ,GAAWlkJ,IAAAA,MAAW,IAAM,0CAMrBqvO,GAAWl3O,IAAA,IAAEwF,UAAWmrE,GAA0B3wE,EAAZkkG,EAAIx8C,GAAA1nD,EAAA2nD,IAAA,OACnD9/C,IAAAA,cAACkvO,EAAAA,MAAK9uO,OAAAC,OAAA,GACEg8F,EAAI,CACR12F,OAASjG,GACLM,IAAAA,cAACA,IAAAA,SAAc,CAACs2J,SAAU,MACtBt2J,IAAAA,cAACovO,GAAyB1vO,EACtBM,IAAAA,cAAC8oE,EAAcppE,OAI7B,EAGO4vO,GAAmB1xO,IAAA,IAAED,UAAWmrE,GAA0BlrE,EAAZy+F,EAAIx8C,GAAAjiD,EAAA2xO,IAAA,OAC3DvvO,IAAAA,cAACkvO,EAAAA,MAAK9uO,OAAAC,OAAA,GACEg8F,EAAI,CACR12F,OAASjG,GACLM,IAAAA,cAACA,IAAAA,SAAc,CAACs2J,SAAU,MACtBt2J,IAAAA,cAACkkJ,GAAaxkJ,EACVM,IAAAA,cAACA,IAAAA,SAAc,CAACs2J,SAAU,MACtBt2J,IAAAA,cAACovO,GAAyB1vO,EACtBM,IAAAA,cAAC8oE,EAAcppE,SAMrC,E,yDC7BA8vO,IAAqB9tK,EAAAA,GAAAA,GAAmB,sBAAsBC,EAAAA,EAAAA,OAAK,IAAM,mCAQhE,SAAS8tK,GAAc/vO,GAClC,MAAO/B,UAAWmrE,EAAS,MAAE8sC,GAAkBl2G,EAAR28F,E,qWAAIx8C,CAAIngD,EAAKogD,IAEpD,OACI9/C,IAAAA,cAACkvO,EAAAA,MAAK9uO,OAAAC,OAAA,GACEg8F,EAAI,CACR12F,OAAS+pO,GACL1vO,IAAAA,cAACkkJ,GAAAA,QAAawrF,EACT95H,GACG51G,IAAAA,cAACo2G,GAAAA,QAAoB,CAACR,MAAOA,GACzB51G,IAAAA,cAACwvO,GAAkB,OAG3BxvO,IAAAA,cAAC8oE,EAAe4mK,MAKpC,CAACD,GAAApnO,UAAA,CAvBG1K,UAASmI,KAAAA,YAAAC,WACT0c,KAAI3c,KAAAA,UAAA,CAAAA,KAAAA,OAAAA,KAAAA,QAAAA,KAAAA,UAAAC,Y,oDCdR,MAEa4pO,GAAqB,CAC9Bh0K,MAHuB,IAIvB2mG,KAJuB,KCkBrBstE,GAAmBz3O,IAKZ,IAJTqhK,SAAUq2E,EACV/jF,gBAAiBgkF,EAAsB,OACvC5pI,EAAM,aACN2lC,GACI1zI,EACAqhK,EAAW,GACQ,MAAnBq2E,IACAr2E,EAAWq2E,GAEf,IAAI/jF,EAAkB0N,EAKtB,OAJIs2E,IACAhkF,EAAkBgkF,GAIlB9vO,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,gBAAiB,CAAC,aAAc+uD,GAAU2lC,IAChE90I,GAAG,gBAEHiJ,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAC8iD,EAAAA,KAAI,CACD7iD,UAAU,aACV0/C,GAAE,aAAAh/C,OAAe8kB,EAAAA,GAAUuP,kBAE1B82H,IAIT9rJ,IAAAA,cAAA,OAAKC,UAAU,yCACXD,IAAAA,cAACsvD,GAAAA,EAAa,CACV3hD,GAAIu4F,GAAU2lC,EACd10F,WAAW,yBACXwkB,OAAO,EACP2mG,MAAM,EACN33B,cAAc,EACdC,eAAe,EACf11G,QAASy6M,IAET3vO,IAAAA,cAACy2J,GAAAA,EAAQ,CAACa,QAAQ,MAGxB,EAEZs4E,GAAAvnO,UAAA,CAlDEwjI,aAAY/lI,KAAAA,KAAAC,WACZmgG,OAAMpgG,KAAAA,KAAAC,WACN+lJ,gBAAehmJ,KAAAA,OACf0zJ,SAAQ1zJ,KAAAA,QAiDZ,UAAeypD,EAAAA,EAAAA,MAAKqgL,ICtCpB,IAAe9nO,EAAAA,EAAAA,UAdf,SAAyBxP,GACrB,MAAMqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnB4tB,GAAcC,EAAAA,EAAAA,IAAe7tB,GAE7BkhK,EAAW7+J,EAAO28C,SAExB,MAAO,CACHw0G,gBAAiB5lI,GAAeA,EAAYrmB,aAC5CgsI,cAAc7kF,EAAAA,GAAAA,IAAgB1uD,GAC9B4tG,QAAQ6pI,EAAAA,EAAAA,IAAiBz3O,GACzBkhK,WAER,GAEA,CAAwCw2E,I,+DClBzB,SAASC,KACpB,MAAM1sN,GAASwzB,EAAAA,EAAAA,aAAYvzB,GAAAA,IAE3B4hC,EAAAA,EAAAA,YAAU,KACN8qL,GAAAA,SAASC,cAAgB5sN,CAAM,GAChC,CAACA,IAEJ,MAAMm3D,GAAK3jC,EAAAA,EAAAA,aAAYoO,GAAAA,IAKvB,OAJAC,EAAAA,EAAAA,YAAU,KACN8qL,GAAAA,SAASE,YAAc11J,QAAAA,EAAM,QAAQ,GACtC,CAACA,IAEG,IACX,C,gBChBA,MAAM21J,GAAqB,CAGvB,CAAC,gBAAiB,QAClB,CAAC,cAAe,gBAGhB,CAAC,mBAAoB,mBACrB,CAAC,eAAgB,gBAGjB,CAAC,iBAAkB,kBACnB,CAAC,gBAAiB,iBAClB,CAAC,mBAAoB,oBAGrB,CAAC,eAAgB,kBACjB,CAAC,gBAAiB,kBAKf,SAASC,GAAsBxmO,GAClC,IAAI44J,EAAiC54J,EAErC,KAAO44J,GAAgB,CACnB,IAAK,MAAM6tE,KAAcF,GACrB,GAAI3tE,EAAe3rK,KAAOw5O,EAAW,IAAM7tE,EAAelnG,UAAUqC,SAAS0yK,EAAW,IACpF,OAAOA,EAAW,GAI1B7tE,EAAiBA,EAAe8tE,aACpC,CAEA,MAAO,OACX,C,6+BCsBe,MAAMC,GAqBjBnuO,WAAAA,CAAYouO,EAAiBp6O,EAA2Bq6O,GC/CrD,IAAmCC,EAA4BC,EAA4B14O,EAAA24O,ED2C9FtuO,GAAA,wBAC6B,KAASA,GAAA,0BACP,MAASA,GAAA,+BAgMP,KACI,WAA7BN,SAAS6uO,iBACTruO,KAAKsuO,iBACT,IAhMAtuO,KAAKguO,OAASA,EACdhuO,KAAKpM,MAAQA,EACboM,KAAKiuO,WAAaA,EAElBjuO,KAAKuuO,cCnFLrhN,GAAAA,KACO,MACAA,GAAAA,KACA,UACAA,GAAAA,KACA,QACAA,GAAAA,KACA,QACAA,GAAAA,KACA,UAGJ,QDwEHltB,KAAKwuO,eCpELthN,GAAAA,KACO,UACAA,GAAAA,MAAyBA,GAAAA,KACzB,UACAA,GAAAA,KACA,OACAA,GAAAA,MAAwBA,GAAAA,KACxB,SACAA,GAAAA,KACA,SAGJ,QD2DHltB,KAAKyuO,mBCxD6BP,EDwDiBD,EAAWS,gBCvDb,QAArDj5O,EAAuC,QAAvC24O,EAAOD,OAD2DA,EDwDiBF,EAAWU,6BCvDtE,EAAjBR,EAAmBrsM,MAAM,KAAK,UAAE,IAAAssM,EAAAA,EAAIF,SAAU,IAAAz4O,EAAAA,EAAI,WDyDrDuK,KAAK4uO,SAAW,IAAI7jD,IACpB/qL,KAAK6uO,kBAAoB,GAIzB7uO,KAAK8uO,SAAW,IAAIC,qBAAqBnoO,GAAY5G,KAAKgvO,mBAAmBpoO,IACjF,CAEOmjD,OAAAA,GACH,MAAMklL,EAAqB,CAAC,OAAQ,WAChCF,oBAAoBG,oBAAoBzlM,SAAS,aACjDwlM,EAAmB3/N,KAAK,YAG5BtP,KAAK8uO,SAAS/kL,QAAQ,CAClBolL,WAAYF,IAKhBjvO,KAAKovO,yBAGLC,EAAAA,GAAAA,KAAOv0D,GAAW96K,KAAKsvO,eAAex0D,MACtCy0D,EAAAA,GAAAA,KAAOz0D,GAAW96K,KAAKsvO,eAAex0D,MACtC00D,EAAAA,GAAAA,KAAO10D,GAAW96K,KAAKsvO,eAAex0D,MACtC20D,EAAAA,GAAAA,KAAO30D,GAAW96K,KAAKsvO,eAAex0D,KAItC96K,KAAK0vO,cAAgB1gO,OAAOuZ,YAAW,IAAMvoB,KAAK2vO,uBAAuB3vO,KAAK4vO,eAI9E/0K,iBAAiB,mBAAoB76D,KAAK2iJ,wBAErC3iJ,KAAKiuO,WAAW4B,UACjB7vO,KAAK8vO,mBAAqB9vO,KAAKiuO,WAAW8B,kBAAkBC,GAAYhwO,KAAKiwO,yBAAyBD,KAE9G,CAEQZ,qBAAAA,GACJ,MAAMxoO,EAAUspO,YAAYC,iBAAiB,cAE7C,GAAuB,IAAnBvpO,EAAQF,OACR,OAGJ,MAAM0pO,EAAQxpO,EAAQ,GAChBypO,EAAKn1N,KAAKC,MAEhBnb,KAAK6uO,kBAAkBv/N,KAAK,CACxBwrK,OAAQ7kC,GAAAA,GAAQq6F,KAChBxvO,MAAOsvO,EAAMG,cACbz0N,UAAWu0N,IAEfrwO,KAAK6uO,kBAAkBv/N,KAAK,CACxBwrK,OAAQ7kC,GAAAA,GAAQu6F,KAChB1vO,MAAOsvO,EAAMK,YACb30N,UAAWu0N,IAEfrwO,KAAK6uO,kBAAkBv/N,KAAK,CACxBwrK,OAAQ7kC,GAAAA,GAAQy6F,eAChB5vO,MAAOsvO,EAAMO,eACb70N,UAAWu0N,IAEfrwO,KAAK6uO,kBAAkBv/N,KAAK,CACxBwrK,OAAQ7kC,GAAAA,GAAQ26F,SAChB9vO,MAAOsvO,EAAMpsI,SACbloF,UAAWu0N,GAEnB,CAKUrmL,UAAAA,GAAa,IAAA6mL,EACnB91K,oBAAoB,mBAAoB/6D,KAAK2iJ,wBAE7C9vG,aAAa7yC,KAAK0vO,eAClB1vO,KAAK0vO,mBAAgBp3O,EAErB0H,KAAK8uO,SAAS9kL,aAES,QAAvB6mL,EAAA7wO,KAAK8vO,0BAAkB,IAAAe,GAAvBA,EAAAriO,KAAAxO,KACJ,CAEUgvO,kBAAAA,CAAmBj8H,GACzB,IAAK,MAAMq9H,KAASr9H,EAAK+9H,aACjBC,GAAqBX,GACrBpwO,KAAKgxO,cAAcZ,GACZa,GAAkBb,GACzBpwO,KAAKkxO,WAAWd,GACTe,GAAsBf,IAC7BpwO,KAAKoxO,gBAGjB,CAEQJ,aAAAA,CAAcZ,GAClB,IAAIiB,EACJ,IAAI,IAAAC,EACAD,EAASxnO,QAAoB,QAAbynO,EAAClB,EAAMl3K,cAAM,IAAAo4K,OAAA,EAAZA,EAAcD,OACnC,CAAE,MAAAphO,GAGEohO,GAAS,CACb,CAEKA,GAILrxO,KAAK6uO,kBAAkBv/N,KAAK,CACxBwrK,OAAQs1D,EAAM3yO,KACdqD,MAAOsvO,EAAMpsI,SACb90C,OAAQkhL,EAAMl3K,OAAOhK,OACrBpzC,UAAWZ,KAAKC,OAExB,CAEQ+1N,UAAAA,CAAWd,GACf,IAAIiB,EACJ,IAAI,IAAAE,EACAF,EAASxnO,QAAoB,QAAb0nO,EAACnB,EAAMl3K,cAAM,IAAAq4K,OAAA,EAAZA,EAAcF,OACnC,CAAE,MAAAG,GAGEH,GAAS,CACb,CAEKA,GAILrxO,KAAKyxO,iBAAiBrB,EAAM3yO,KAChC,CAEQ2zO,cAAAA,GACJpxO,KAAKyxO,iBAAiB,aAC1B,CAEQA,gBAAAA,CAAiBh0O,GAAc,IAAAi0O,EACnC,MAAM3hO,EAAiC,QAA1B2hO,EAAG1xO,KAAK4uO,SAAS/tK,IAAIpjE,UAAK,IAAAi0O,EAAAA,EAAI,EAC3C1xO,KAAK4uO,SAASl/K,IAAIjyD,EAAMsS,EAAU,EACtC,CAEQu/N,cAAAA,CAAex0D,GACnB,IAAI5rH,EAEJ,GAgMkB,QAhMF4rH,EAgMPr9K,KAhMgB,KAAAk0O,EACrB,MAAMC,EAA6B,QAArBD,EAAG72D,EAAO+2D,mBAAW,IAAAF,OAAA,EAAlBA,EAAoBvqO,QAC/BA,EAAUwqO,EAAWpyO,SAASk5D,cAAck5K,GAAY,KAE1DxqO,IACA8nD,EAAS,CACL4iL,OAAQlE,GAAsBxmO,IAG1C,MAAO,GA2LW,QA3LK0zK,EA2Ldr9K,KA3LuB,KAAAs0O,EAC5B7iL,EAAS,CACL8iL,YAA+B,QAApBD,EAAEj3D,EAAO+2D,mBAAW,IAAAE,OAAA,EAAlBA,EAAoBE,gBAEzC,CAEAjyO,KAAK6uO,kBAAkBv/N,KAAK,CACxBwrK,OAAQA,EAAOr9K,KACfqD,MAAOg6K,EAAOh6K,MACdgb,UAAWZ,KAAKC,MAChB+zC,UAER,CAEQygL,mBAAAA,GACJ3vO,KAAKsuO,kBAELtuO,KAAK0vO,cAAgB1gO,OAAOuZ,YAAW,IAAMvoB,KAAK2vO,uBAAuB3vO,KAAK4vO,cAClF,CASQA,WAAAA,GAEJ,MAAM5nN,GAAW,EAAI5mB,KAAKC,SAAY,GAAKrB,KAAKkyO,mBAChD,OAAOlyO,KAAKmyO,iBAAmBnqN,CACnC,CAEQoqN,gBAAAA,GACJ,MAAMx8O,EAAQoK,KAAKpM,MAAMqf,WAEzB,MAA6C,WAAzC8J,EAAAA,EAAAA,IAAUnnB,GAAOy8O,qBAIW,MAA5Bx6N,EAAAA,EAAAA,IAAiBjiB,EAKzB,CAEU04O,eAAAA,GACN,MAAMO,EAAoB7uO,KAAK6uO,kBAC/B7uO,KAAK6uO,kBAAoB,GAEzB,MAAMD,EAAW5uO,KAAK4uO,SACtB5uO,KAAK4uO,SAAW,IAAI7jD,IAEa,IAA7B8jD,EAAkBnoO,QAAkC,IAAlBkoO,EAASxwO,MAI1C4B,KAAKoyO,oBAIVpyO,KAAKsyO,WAAWtyO,KAAKuyO,eAAe1D,EAAmBD,GAC3D,CAEQ2D,cAAAA,CAAe1D,EAA+CD,GAClE,MAAMzzN,EAAMD,KAAKC,MAEXq3N,EAAkBxyO,KAAKyyO,mBAAmBt3N,EAAKyzN,GAErD,OAAAx6O,GAAAA,GAAA,CACI6qD,QAAS,QAETiQ,OAAQ,CACJwjL,SAAU1yO,KAAKuuO,cACfoE,MAAO3yO,KAAKwuO,eACZoE,oBAAqB5yO,KAAKyuO,oBAG3BzuO,KAAK6yO,kBAAkB13N,EAAK0zN,EAAmB2D,IAAgB,IAElE5D,SAAU5uO,KAAKyyO,mBAAmBt3N,EAAKyzN,GACvCkE,WAAYjE,GAEpB,CAEQgE,iBAAAA,CAAkB13N,EAAa0zN,EAA+C2D,GAClF,IAAIxmL,EAAQ7wC,EACR8wC,EAAM,EAEV,IAAK,MAAM8mL,KAAWlE,EAClB7iL,EAAQ5qD,KAAKinD,IAAI2D,EAAO+mL,EAAQj3N,WAChCmwC,EAAM7qD,KAAKs2D,IAAIzL,EAAK8mL,EAAQj3N,WAEhC,IAAK,MAAMi3N,KAAWP,EAClBxmL,EAAQ5qD,KAAKinD,IAAI2D,EAAO+mL,EAAQj3N,WAChCmwC,EAAM7qD,KAAKs2D,IAAIzL,EAAK8mL,EAAQj3N,WAGhC,MAAO,CACHkwC,QACAC,MAER,CAEQwmL,kBAAAA,CAAmBt3N,EAAayzN,GACpC,MAAM4D,EAAkB,GAExB,IAAK,MAAO/0O,EAAMqD,KAAU8tO,EAAShoO,UACjC4rO,EAAgBljO,KAAK,CACjBwrK,OAAQr9K,EACRqD,QACAgb,UAAWX,IAInB,OAAOq3N,CACX,CAEQF,UAAAA,CAAWjB,GACf,MAAMhzO,EAAM2B,KAAKguO,OAAOgF,wBAClB/+O,EAAOyhB,KAAK4iE,UAAU+4J,GAETrxO,KAAKizO,WAAW50O,EAAKpK,IAIpCi/O,MAAM70O,EAAK,CAACoW,OAAQ,OAAQhV,KAAMxL,GAE1C,CAEUg/O,UAAAA,CAAW50O,EAAmBpK,GAEpC,QAAKk/O,UAAUF,YAIRE,UAAUF,WAAW50O,EAAKpK,EACrC,CAEUg8O,wBAAAA,CAAyBmD,GAC/B,MAAMj4N,EAAMD,KAAKC,MAEjB,IAAK,MAAOk4N,EAAarD,KAAYoD,EAAWxsO,UAAW,CACvD,IAAI0sO,EAAUD,EACVC,EAAQnkO,WAAW,aACnBmkO,EAAU,UAGVtD,EAAQuD,KACRvzO,KAAK6uO,kBAAkBv/N,KAAK,CACxBwrK,OAAQ,cACRh/J,UAAWX,EACX+zC,OAAQ,CAACokL,WACTxyO,MAAOkvO,EAAQuD,MAInBvD,EAAQwD,QACRxzO,KAAK6uO,kBAAkBv/N,KAAK,CACxBwrK,OAAQ,iBACRh/J,UAAWX,EACX+zC,OAAQ,CAACokL,WACTxyO,MAAOkvO,EAAQwD,QAG3B,CACJ,EAGJ,SAASrC,GAAsBf,GAC3B,MAA2B,aAApBA,EAAMqD,SACjB,CAEA,SAASxC,GAAkBb,GACvB,MAA2B,SAApBA,EAAMqD,SACjB,CAEA,SAAS1C,GAAqBX,GAC1B,MAA2B,YAApBA,EAAMqD,SACjB,CE1ae,SAASC,KACpB,MAAM9/O,GAAQ+/O,EAAAA,EAAAA,YAERC,GAAWzqL,EAAAA,EAAAA,UAajB,OAXAzG,EAAAA,EAAAA,YAAU,KACNkxL,EAAS7jO,QAAU,IAAIg+N,GAAoBz4O,EAAAA,GAAS1B,EAAOigP,GAAAA,GAC3DD,EAAS7jO,QAAQg6C,UAGV,KAEH/0B,QAAQhhC,MAAM,uEAAuE,IAE1F,CAACJ,IAEG,IACX,C,kcCLe,MAAMkgP,WAAqBx2O,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,GAAA,2BAc3C+gB,IAClBvrB,EAAAA,GAAQy+O,kBAAkBlzN,GAE1B7gB,KAAKg0O,4BAA4BnzN,EAAO,IAC3C/gB,GAAA,oCAE8B+gB,IAC3B,GAAI7gB,KAAKhD,MAAMu3B,aAEX,OAEJ,MAAM0/M,EAAaC,GAAAA,GAAqBrzN,GAEnCozN,GAILj0O,KAAKhD,MAAMqD,QAAQu0B,iBAAiB/T,EAAQozN,EAAW51O,IAAI,GAC9D,CA/BDk6C,iBAAAA,IAEI47L,EAAAA,GAAAA,GAAoBj+N,EAAAA,IAEpBlW,KAAKo0O,mBAAmBp0O,KAAKhD,MAAM6jB,OACvC,CAEA43B,kBAAAA,CAAmBC,GACXA,EAAU73B,SAAW7gB,KAAKhD,MAAM6jB,QAChC7gB,KAAKo0O,mBAAmBp0O,KAAKhD,MAAM6jB,OAE3C,CAsBA5d,MAAAA,GACI,OAAKjD,KAAKhD,MAAMu3B,aAKZj3B,IAAAA,cAAC+2O,GAAAA,aAAgB,CACbr5O,IAAKgF,KAAKhD,MAAM6jB,OAChBA,OAAQ7gB,KAAKhD,MAAM6jB,OACnBhG,SAAU7a,KAAKhD,MAAMu3B,aACrB+/M,cAAc,OACdC,8BAA8B,GAE7Bv0O,KAAKhD,MAAM20D,UAXT,IAcf,EC1CJ,UAAevsD,EAAAA,EAAAA,UAjBf,SAAyBxP,GACrB,MAAMirB,GAASC,EAAAA,GAAAA,GAAiBlrB,GAEhC,MAAO,CACHirB,SACA0T,cAAcD,EAAAA,GAAAA,GAAgB1+B,EAAOirB,GAE7C,IAEA,SAA4BltB,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBsvB,iBAAgBA,GAAAA,IACjBjhC,GAEX,GAEA,CAA4DmgP,I,gBCjB7C,SAASU,GAAax3O,GACjC,OACIM,IAAAA,cAACw2O,GAAY,KACTx2O,IAAAA,cAACm3O,GAAAA,EAAiBr1E,SAAQ,CAACt+J,MAAOid,GAAAA,GAC7B/gB,EAAM20D,UAIvB,C,89BCDe,SAAS+iL,GAAa13O,GACjC,MAAMo7F,GAAUC,EAAAA,EAAAA,cACV5oF,GAAW0+J,EAAAA,EAAAA,eAmBjB,OAjBAzrH,EAAAA,EAAAA,YAAU,KACF1lD,EAAMomB,gBACFpmB,EAAM23O,mCACN33O,EAAMqD,QAAQi4N,6BAA6B9uN,MAAMorO,KAEN,IAAnCA,EAA0B3gP,MAAkB+I,EAAM4jB,eAAiB5jB,EAAM63O,cACzEz8I,EAAQ9oF,KAAK,wBAEb+d,EAAAA,GAAwC,IAAIynN,gBAAgBrlO,EAASyQ,QACzE,IAGJmN,EAAAA,GAAwC,IAAIynN,gBAAgBrlO,EAASyQ,SAE7E,GACD,CAACljB,EAAMomB,cAAepmB,EAAM23O,qCAE3B33O,EAAMomB,cAEC,KAIP9lB,IAAAA,cAACymJ,EAAAA,SAAQ,CACL9mG,GAAE7oD,GAAAA,GAAA,GACK4I,EAAMyS,UAAQ,IACjBwQ,SAAU,YAI1B,CDjCCu0N,GAAA7uO,UAAA,CAXGgsD,SAAQvuD,KAAAA,KAAAC,YC4CXqxO,GAAA/uO,UAAA,CA5CGgvO,mCAAkCvxO,KAAAA,KAAAC,WAClC+f,cAAahgB,KAAAA,OAAAC,WAEbud,aAAYxd,KAAAA,KAAAC,WACZwxO,cAAazxO,KAAAA,KAAAC,WACbhD,QAAO+C,KAAAA,MAAA,CACHk1N,2BAA0Bl1N,KAAAA,KAAAC,aAAAA,YCsBlC,UAAe+B,EAAAA,EAAAA,UAvBf,SAAyBxP,GACrB,MAAM4qB,GAAwBC,EAAAA,EAAAA,IAA2B7qB,GACnD8kC,GAAQxZ,EAAAA,EAAAA,IAAmBtrB,GACjC,IAAI++O,EAAqCn0N,EAIzC,OAHIm0N,IACAA,GAAqCn0M,EAAAA,EAAAA,IAAyB5qC,IAE3D,CACHwtB,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAChC++O,qCACA/zN,cAAcA,EAAAA,EAAAA,IAAahrB,GAC3Bi/O,cAAehrO,QAAQ6wB,EAAMh0B,QAErC,IAEA,SAA4B/S,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBgzN,2BAA0BA,EAAAA,IAC3B3kO,GAEX,GAEA,CAA4D+gP,I,6hBCmB7C,MAAMK,WAA0Bz3O,IAAAA,cAG3CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,qBA6DF,KACXE,KAAKgH,SAAS,CAACsC,SAAS,GAAO,IAClCxJ,GAAA,iBAEWvD,IACRyD,KAAKhD,MAAMqD,QAAQ20O,4CAA4Cz4O,EAAO,EA/GvD,GA+G0E,GAAI,GAAI,CAACsW,QAAQ,GAAM,IACnH/S,GAAA,qBAEeo1B,IACZl1B,KAAKhD,MAAMqD,QAAQ40B,mBAAmBC,EAAK,IApE3Cl1B,KAAKs4C,gBAAkB,EAEvBt4C,KAAKpK,MAAQ,CACT0T,SAAS,EAEjB,CAEA,uBAAMivC,GACF,MAAM,QACFl4C,EAAO,iBACPqY,EAAgB,cAChB2K,GACArjB,KAAKhD,YAEHqrB,QAAQyuB,IAAI,CACdz2C,EAAQ20O,4CAA4C,EAAGjyN,EAAAA,GAAUklI,mBAAoB5kI,EAAe3K,EAAkB,CAAC7F,QAAQ,IAC/HxS,EAAQ40O,kBAAkBv8N,GAC1BrY,EAAQyY,gBAAgBJ,KAE5B1Y,KAAKgoJ,cACT,CAEA1qF,oBAAAA,GACIt9D,KAAKhD,MAAMqD,QAAQ40B,mBAAmB,GAC1C,CAEAwjB,kBAAAA,CAAmBC,GACf,GAAIA,EAAUd,aAAe53C,KAAKhD,MAAM46C,WAAY,CAChD/E,aAAa7yC,KAAKs4C,iBAClB,MAAMV,EAAa53C,KAAKhD,MAAM46C,WAE9B,GAAmB,KAAfA,EAGA,OAFA53C,KAAKgoJ,oBACLhoJ,KAAKs4C,gBAAkB,GAI3B,MAAMA,EAAkBtpC,OAAOuZ,YAC3B10B,UACI,MAAM,KAACI,SAAcykD,EAAUr4C,QAAQy7C,eAAelE,EAAY,CAAC9/B,QAAS9X,KAAKhD,MAAMqmB,cAAe6xN,cAAel1O,KAAKhD,MAAM0b,mBAE5H4/B,IAAoBt4C,KAAKs4C,kBAI7Bt4C,KAAKhD,MAAMqD,QAAQw8C,4BAA4B5oD,GAC/C+L,KAAKhD,MAAMqD,QAAQ80O,gDAAgDlhP,EAAO+L,KAAKhD,MAAMqmB,cAAerjB,KAAKhD,MAAM0b,kBAAkBlP,MAAK/T,IAA2B,IAAzBxB,KAAMk0J,GAAc1yJ,EACpJ0yJ,GACAnoJ,KAAKgoJ,cACT,IACF,GAENjlI,EAAAA,GAAU41B,6BAGd34C,KAAKs4C,gBAAkBA,CAC3B,CACJ,CAcAr1C,MAAAA,GACI,GAAIjD,KAAKpK,MAAM0T,QACX,OAAQhM,IAAAA,cAACmjJ,GAAAA,EAAa,MAE1B,MAAM67C,EAAqD,IAAjCt8L,KAAKhD,MAAMkE,QAAQkgB,UAC7C,OACI9jB,IAAAA,cAACkrJ,GAAAA,EAAkB,CACfhoJ,MAAOR,KAAKhD,MAAMurJ,eAClBE,aA9HO,GA+HPlzI,MAAOvV,KAAKhD,MAAMo4O,oBAClBz3I,SAAU39F,KAAK29F,SACfz9E,OAAQlgB,KAAKq1O,aACbh1O,QAASi8L,EAAoB,GAAK,CAACptF,GAAAA,GACnCo5C,gBAAiBtoJ,KAAKhD,MAAMsrJ,gBAC5BK,cAAez7H,GAAAA,MAG3B,E,89BACHptB,GA/FoBi1O,GAAiB,aAtClC1xN,cAAajgB,KAAAA,OAAAC,WACbqV,iBAAgBtV,KAAAA,OAAAC,WAChBu0C,WAAUx0C,KAAAA,OAAAC,WACVklJ,eAAcnlJ,KAAAA,MAAAC,WACdilJ,gBAAellJ,KAAAA,SAAAA,KAAAA,MAAA,CAGPm8B,WAAUn8B,KAAAA,IAAAC,cAAAA,WAIlB+xO,oBAAmBhyO,KAAAA,OAAAC,WAEnBhD,QAAO+C,KAAAA,MAAA,CACH04C,eAAc14C,KAAAA,KAAAC,WACd4xO,kBAAiB7xO,KAAAA,KAAAC,WACjByV,gBAAe1V,KAAAA,KAAAC,WACf4xB,mBAAkB7xB,KAAAA,KAAAC,WAClB2xO,4CAA2C5xO,KAAAA,KAAAC,WAO3Cw5C,4BAA2Bz5C,KAAAA,KAAAC,WAC3B8xO,gDAA+C/xO,KAAAA,KAAAC,aAAAA,aCjBvD,MAAMiyO,IAA8B5tL,EAAAA,GAAAA,IAChC,+BACA,CAAC9xD,EAAoB4K,IAAyBA,GAC9CouG,EAAAA,GACA2mI,GAAAA,GACAxzN,GAAAA,IACA,WAAgE,IAA/DvhB,EAAK+C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAAI+7B,EAAW/7B,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAAGurN,EAAcvrN,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAAGrC,EAAOqC,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EACvD,MAAMgwJ,EAMF,CAAC,EACCC,EAAgC,GAEtC,IAAKrnJ,EACD,MAAO,CACHqnJ,iBACAD,mBAGR,IAAK,IAAI5oH,EAAI,EAAGA,EAAIl/B,EAAMkG,OAAQg5B,IAAK,CACnC,MAAMh/B,EAAOF,EAAMk/B,GAEfJ,EAAY5+B,EAAKrM,KAAOy6N,EAAepuN,EAAKrM,KAA0B,IAAnBqM,EAAK0gB,YACxDmnI,EAAej5I,KAAK5O,GAEpB4nJ,EAAgB5nJ,EAAKrM,IAAM,CACvB6M,UACAq+B,WAAYD,EAAY5+B,EAAKrM,IAC7BorB,cAAeqvM,EAAepuN,EAAKrM,KAG/C,CAEA,MAAO,CACHk0J,eAAgBA,EAAepyF,KAAKq/K,EAAAA,IACpCltF,kBAER,IAsCJ,IAAeljJ,EAAAA,EAAAA,UAnCf,SAAyBxP,GACrB,MAAMgiD,EAAahiD,EAAM8kD,MAAMx6B,OAAOy6B,YAEtC,IAAIn6C,EAEAA,EADAo3C,GACQ69L,EAAAA,EAAAA,IAA+B7/O,EAAOgiD,IAEtC82D,EAAAA,EAAAA,IAA4B94G,GAGxC,MAAM0nB,GAAQC,EAAAA,GAAAA,IAAuB3nB,IAAU,CAAC6nB,aAAc,GAE9D,OAAArpB,GAAAA,GAAA,GACOkhP,GAA4B1/O,EAAO4K,IAAM,IAC5C6iB,cAAeztB,EAAMuyB,SAASuS,MAAMrX,cACpC3K,iBAAkB9iB,EAAMuyB,SAAShG,SAASzJ,iBAC1Ck/B,aACAw9L,oBAAqB93N,EAAMG,cAEnC,IAEA,SAA4B9pB,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB2vO,kBAAiB,MACjBn5L,eAAc,IACdhjC,gBAAe,MACfmc,mBAAkB,MAClB+/M,4CAA2C,MAC3Cn4L,4BAA2B,MAC3Bs4L,gDAA+CA,GAAAA,IAChDxhP,GAEX,GAEA,CAA4DohP,I,0ZCjE7C,MAAMW,WAA4Bp4O,IAAAA,cAC7CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,mBAOJ,KACTE,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAC/BrJ,GAAA,8BAEuB,KACpB,MAAM,QAACoB,EAAO,QAAEb,GAAWL,KAAKhD,MAEhCqD,EAAQ8P,UAAU,CACdC,QAASC,EAAAA,GAAiB08F,eAC1Bx8F,WAAYs6F,GAAAA,EACZr6F,YAAa,CAACtP,aAGlBlB,KAAKiI,YAAY,IAlBjBjI,KAAKpK,MAAQ,CACTuT,MAAM,EAEd,CAkBAlG,MAAAA,GACI,MAAMq5L,EAAqD,IAAjCt8L,KAAKhD,MAAMkE,QAAQkgB,UAC7C,OACI9jB,IAAAA,cAAA,WACIA,IAAAA,cAACyM,GAAAA,MAAK,CACFC,gBAAgB,4CAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAKiI,WACbiC,SAAUlK,KAAKhD,MAAMkN,SACrBE,KAAK,OACL,kBAAgB,2BAChB/V,GAAG,uBAEHiJ,IAAAA,cAACyM,GAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,GAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,4BAEHiJ,IAAAA,cAAA,QAAMC,UAAU,QAAQyC,KAAKhD,MAAMkE,QAAQ/D,cAC3CG,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,cAGtB/G,KAAKhD,MAAM24O,0BAA4Br5C,GACpCh/L,IAAAA,cAAA,KACIjJ,GAAG,kBACHkJ,UAAU,yBACVk2C,KAAK,IACL7mC,QAAS5M,KAAK41O,uBAEdt4O,IAAAA,cAACgK,GAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,mBAK/BzJ,IAAAA,cAACyM,GAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAACy3O,GAAiB,CACd7zO,QAASlB,KAAKhD,MAAMkE,YAM5C,EACHpB,GAxEoB41O,GAAmB,aArBpCC,wBAAuBvyO,KAAAA,KAAAC,WAUvB6G,SAAQ9G,KAAAA,KAAAC,WAERhD,QAAO+C,KAAAA,MAAA,CACH+M,UAAS/M,KAAAA,KAAAC,aAAAA,aCnBjB,MAQA,IAAe+B,EAAAA,EAAAA,UARUxP,IAAkB,CACvC+/O,yBAAyBA,EAAAA,GAAAA,IAAwB//O,OAGzBjC,IAAkB,CAC1C0M,SAASiF,EAAAA,EAAAA,oBAAmB,CAAC6K,UAASA,GAAAA,GAAGxc,MAG7C,CAA4D+hP,I,uICE5D,IAAIG,GAAoB,GACxBjiP,EAAAA,QAAMkiP,WAAU,KACZ,MAAMlgP,EAAQhC,EAAAA,QAAMqf,WACdy3B,EAAmB90C,EAAMuyB,SAASwiB,aAAaC,gBAEjDF,IAAqBmrM,KAIzBA,GAAoBnrM,GAEL90C,EAAMuyB,SAASwiB,aAAaH,QAAU,CAAC,GAC3Clb,aAAeob,GAI1B92C,EAAAA,QAAMD,UAASwc,EAAAA,GAAAA,GAAU,CAACC,QAASC,EAAAA,GAAiBw6B,mBAAoBt6B,WAAYu6B,GAAAA,KAAoB,I,iDC7BtGirM,GAAgBz4O,IAAAA,YAAiB,CAACN,EAAck7C,KAClD,MAAM,oBACF89L,GAEAh5O,EADG25E,E,qWAAUx5B,CACbngD,EAAKogD,IAET,OACI9/C,IAAAA,cAACu2E,GAAAA,GAAOn2E,OAAAC,OAAA,CACJu6C,IAAKA,EACLy9E,uBAAwBqgH,GACpBr/J,GACN,IAIV,M,iaCgEA3nE,OAAO1R,MAAQ24O,EAAQ,OACvBjnO,OAAOukJ,SAAW0iF,EAAQ,OAC1BjnO,OAAOknO,UAAYD,EAAQ,OAC3BjnO,OAAOmnO,MAAQF,EAAQ,OACvBjnO,OAAOonO,WAAaH,EAAQ,OAC5BjnO,OAAOqnO,eAAiBJ,EAAQ,OAChCjnO,OAAOsnO,eAAiBL,EAAQ,OAChCjnO,OAAOsoM,UAAY2+B,EAAQ,OAC3BjnO,OAAOunO,MAAQN,EAAQ,OACvBjnO,OAAOwnO,iBAAmBP,EAAQ,OAGlCjnO,OAAOy+K,UAAY,CACf1yB,WAAU,MACVC,uBAAwB,SAACy7E,GAIrB,IAAIp7O,EAOJ,OANyB,IAArBkI,UAAAmD,QAAA,IAAAnD,UAAAmD,OAAA,GACArL,EAAOkI,UAAAmD,QAAA,OAAApO,EAAAiL,UAAA,GACqB,IAArBA,UAAAmD,QAAA,IAAAnD,UAAAmD,OAAA,IAAkD,iBAAxBnD,UAAAmD,QAAA,OAAApO,EAAAiL,UAAA,MACjClI,EAAOkI,UAAAmD,QAAA,OAAApO,EAAAiL,UAAA,KAGJy3J,EAAAA,GAAAA,GAAuBy7E,EAAMp7O,EACxC,GAEJ2T,OAAO0nO,sBF3GA,SAA+BlsM,GAClC52C,EAAAA,QAAMD,SAAS,CAAC6E,KAAM+2B,EAAAA,GAAiBkb,gBAAiBx2C,KAAMu2C,IAE9D52C,EAAAA,QAAMD,UAASwc,EAAAA,GAAAA,GAAU,CAACC,QAASC,EAAAA,GAAiBw6B,mBAAoBt6B,WAAYu6B,GAAAA,IACxF,EEwGA97B,OAAO45J,eAAiBA,GAAAA,EACxB55J,OAAO2nO,YAAc,CACjB,kBAAIC,GACA,OAAOvnO,EAAAA,GAAAA,IACX,EACAukN,OAAQ,CAACzjN,UAAS,KAAEE,iBAAgBA,EAAAA,IACpCwmO,mBAAoB,CAACC,KAAMC,GAAAA,GAAyBC,SAAUD,GAAAA,IAC9DE,4BAA6BC,GAAAA,GAC7BC,iBAAmB3mO,IAAgBL,EAAAA,GAAAA,GAAU,CACzCC,QAASC,EAAAA,GAAiB2d,cAC1Bzd,WAAY0d,GAAAA,QACZzd,iBAQRxB,OAAO+5E,iBAAmB,IAAMA,GAKhC/5E,OAAOooO,WAAa,CAChBvjK,QAAO,GACPr0B,UAAS,MACTqrD,mBAAkB,KAClB6qI,oBAAmB,GACnBv3O,OAAM,KACNG,gBAAe,KACf+4O,SAAU74O,GAAAA,EACVwgH,oBAAmB,KACnBs4H,aAAY,KACZn1D,mBAAkB,KAClBjjH,mBAAkBA,GAAAA,GAKtBlwD,OAAOuoO,WAAa,CAChB9wL,aAAY,MACZ+wL,mBAAkB,MAClBC,kBAAmBhD,GAAAA,EACnBiD,SAAUn8N,GAAAA,GACVo8N,cAAeC,GAAAA,GACfC,qBAAsBzzN,EAAAA,GACtBnM,aAAYA,EAAAA,GAIhBjJ,OAAOuP,WAAaA,GAAAA,ECxHpB,MAAMu5N,IAAoB94K,EAAAA,GAAAA,GAAmB,qBAAqBC,EAAAA,EAAAA,OAAK,IAAM,mCACvE84K,IAAqB/4K,EAAAA,GAAAA,GAAmB,sBAAsBC,EAAAA,EAAAA,OAAK,IAAM,mCACzE+4K,IAAYh5K,EAAAA,GAAAA,GAAmB,aAAaC,EAAAA,EAAAA,OAAK,IAAM,mCACvDg5K,IAAQj5K,EAAAA,GAAAA,GAAmB,mBAAmBC,EAAAA,EAAAA,OAAK,IAAM,4DACzDi5K,IAAgBl5K,EAAAA,GAAAA,GAAmB,iBAAiBC,EAAAA,EAAAA,OAAK,IAAM,mCAC/Dk5K,IAAwBn5K,EAAAA,GAAAA,GAAmB,yBAAyBC,EAAAA,EAAAA,OAAK,IAAM,mCAC/Em5K,IAAoBp5K,EAAAA,GAAAA,GAAmB,qBAAqBC,EAAAA,EAAAA,OAAK,IAAM,mCACvEo5K,IAASr5K,EAAAA,GAAAA,GAAmB,oBAAoBC,EAAAA,EAAAA,OAAK,IAAM,4DAC3Dq5K,IAAoBt5K,EAAAA,GAAAA,GAAmB,qBAAqBC,EAAAA,EAAAA,OAAK,IAAM,mCACvEs5K,IAAgBv5K,EAAAA,GAAAA,GAAmB,iBAAiBC,EAAAA,EAAAA,OAAK,IAAM,mCAC/Du5K,IAAkBx5K,EAAAA,GAAAA,GAAmB,mBAAmBC,EAAAA,EAAAA,OAAK,IAAM,mCACnEw5K,IAAiBz5K,EAAAA,GAAAA,GAAmB,kBAAkBC,EAAAA,EAAAA,OAAK,IAAM,mCACjEy5K,IAAqB15K,EAAAA,GAAAA,GAAmB,sBAAsBC,EAAAA,EAAAA,OAAK,IAAM,mCACzE05K,IAAe35K,EAAAA,GAAAA,GAAmB,gBAAgBC,EAAAA,EAAAA,OAAK,IAAM,wFAC7D25K,IAAa55K,EAAAA,GAAAA,GAAmB,cAAcC,EAAAA,EAAAA,OAAK,IAAM,mCACzD45K,IAAY75K,EAAAA,GAAAA,GAAmB,aAAaC,EAAAA,EAAAA,OAAK,IAAM,kCACvD65K,IAAa95K,EAAAA,GAAAA,GAAmB,cAAcC,EAAAA,EAAAA,OAAK,IAAM,mCACzD85K,IAAM/5K,EAAAA,GAAAA,GAAmB,OAAOC,EAAAA,EAAAA,OAAK,IAAM,mCAC3C+5K,IAAqBh6K,EAAAA,GAAAA,GAAmB,sBAAsBC,EAAAA,EAAAA,OAAK,IAAM,4DACzEgvH,IAAYjvH,EAAAA,GAAAA,GAAmB,aAAaC,EAAAA,EAAAA,OAAK,IAAM,yCAA8B,I,MAAAg6K,GAAAC,IAAAjrD,IAAA7uI,WAAA,CAAAt7C,YAAA,qBAAAo1O,CA+etC,CAACvwJ,SAAU,WAASwwJ,GAAAC,IAAAnrD,GAAAmrD,CAAAC,K,GAAA,Q,qBAAAA,G,6EAAA1gI,GAAAA,EAAA2gI,QAAAC,GAAA7wJ,IAAAulG,GAAAvlG,CA5ChB,CAACC,SAAU,WAlcpE,MAAM01H,IAAqBr/I,EAAAA,GAAAA,GAAmB,sBAAsBC,EAAAA,EAAAA,OAAK,IAAM,2CACzEy0C,IAAuB10C,EAAAA,GAAAA,GAAmB,wBAAwBC,EAAAA,EAAAA,OAAK,IAAM,2CAC7Eu6K,IAAiBx6K,EAAAA,GAAAA,GAAmB,kBAAkBC,EAAAA,EAAAA,OAAK,IAAM,gFACjEu8B,IAA4Bx8B,EAAAA,GAAAA,GAAmB,6BAA6BC,EAAAA,EAAAA,OAAK,IAAM,2CACvFw6K,IAAez6K,EAAAA,GAAAA,GAAmB,gBAAgBC,EAAAA,EAAAA,OAAK,IAAM,mCAC7Dy6K,IAAe16K,EAAAA,GAAAA,GAAmB,gBAAgBC,EAAAA,EAAAA,OAAK,IAAM,mCAC7D06K,IAAc36K,EAAAA,GAAAA,GAAmB,eAAeC,EAAAA,EAAAA,OAAK,IAAM,2DAC3D26K,IAAe56K,EAAAA,GAAAA,GAAmB,gBAAgBC,EAAAA,EAAAA,OAAK,IAAM,sEAC7D46K,IAAkB76K,EAAAA,GAAAA,GAAmB,mBAAmBC,EAAAA,EAAAA,OAAK,IAAM,kCACnE66K,IAAS96K,EAAAA,GAAAA,GAAmB,UAAUC,EAAAA,EAAAA,OAAK,IAAM,mCACjD86K,IAAmB/6K,EAAAA,GAAAA,GAAmB,oBAAoBC,EAAAA,EAAAA,OAAK,IAAM,mCAErElG,GAAOA,OAQE,MAAMihL,WAAa18O,IAAAA,cAG9BsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,wBAcC,KACd,MAAMo4F,EAAcl4F,KAAKhD,MAAMk7F,YAG/B,IAAI+hJ,EAAY,GAChB,OAAQj6O,KAAKhD,MAAMk9O,oBACnB,KAAKC,EAAAA,GAAmBC,WACpBH,EAAY,8BACZ,MACJ,KAAKE,EAAAA,GAAmBE,KACpBJ,EAAY,8BAEhB,KAAKE,EAAAA,GAAmBG,KAIxB,GAAkB,KAAdL,GAAoBj6O,KAAKhD,MAAMu9O,iBAAkB,CACjD,MAAMC,EAAwC,CAAC,EAC/C,GAA2B,KAAvBx6O,KAAKhD,MAAMlC,QACX,IACI0/O,EAAUC,gBAAkB,IAAIxiN,IAAIj4B,KAAKhD,MAAMlC,SAAW,IAAI4/O,QAClE,CAAE,MAAO7oH,GAEL78F,QAAQhhC,MAAM,8CAClB,CAGJslO,EAAAA,KAAqB2gB,EAxBP,gCAwBmCO,GAEjDlhB,EAAAA,SAAyBphI,EAAa,CAAC,EAAG,CACtC9qF,QAAS,CACLmsN,GAAI,WAERh9N,KAAM,CACFwjB,KAAM,GACNy5M,SAAU,GACVt5M,OAAQ,GACR1U,MAAO,GACPnN,IAAK,IAETo7N,YAAa,+BAGjBH,EAAAA,KAAqB,oBAAqB,CACtCv5M,KAAM,GACNy5M,SAAU,GACVt5M,OAAS,GACT1U,MAAO,GACPnN,IAAK,IAET,CACI+O,QAAS,CACLmsN,GAAI,WAERE,YAAa,+BAGjB,MAAMkhB,EAAY36O,KAAK46O,mBACvBthB,EAAAA,OAAsB,KAClBhkO,EAAAA,GAAQulP,oBAAoB,IAAI5hB,GAC5B0hB,IACA9+O,EAAAA,GAAAA,IAAW,aAAc,aAAc8+O,EAC3C,GAER,KACH76O,GAAA,uBAEgB,KACbuoB,QAAQyuB,IAAI,CACR92C,KAAKhD,MAAMqD,QAAQy2N,sBACnBgkB,EAAAA,GAAAA,QACDtxO,MAAK,KACJxJ,KAAKgH,SAAS,CAAC+zO,sBAAsB,GAAM,IAG/C/6O,KAAKhD,MAAMqD,QAAQ26O,sBACnBh7O,KAAKhD,MAAMqD,QAAQ46O,+BAEnBj7O,KAAKk7O,6BAELl7O,KAAKm7O,YAAY,IACpBr7O,GAAA,mCAEoC,KAAM,IAAAs7O,EAElCp7O,KAAKhD,MAAMq+O,4BAMZh8H,EAAAA,GAAAA,QAAkBi8H,EAAAA,GAAAA,QAKlBC,EAAAA,GAAAA,QAAmBv7O,KAAKhD,MAAMw+O,sBAK9BC,EAAAA,GAAAA,QAAez7O,KAAKhD,MAAM0+O,iBAKzB17O,KAAKhD,MAAMq3J,kBAKZh2I,GAAAA,EAAas9N,sBAKoB,6BAAjC37O,KAAKhD,MAAMyS,SAASwQ,UAKa,mBAAjCjgB,KAAKhD,MAAMyS,SAASwQ,WAKpBjgB,KAAKhD,MAAMyS,SAASwQ,SAASwpB,SAAS,aAKtCzpC,KAAKhD,MAAM2uF,SAKa,QAA5ByvJ,EAAIpsO,OAAOS,SAASirO,gBAAQ,IAAAU,GAAxBA,EAA0BxnM,SAAS,0BAIvC5zC,KAAKhD,MAAMo7F,QAAQ9oF,KAAK,YAActP,KAAKhD,MAAMyS,SAASwQ,SAAWjgB,KAAKhD,MAAMyS,SAASyQ,QACzF7B,GAAAA,EAAau9N,oBAAmB,MAAK,IACxC97O,GAAA,2BAqEoBjM,UACjB,MAAM,SAAC4jO,EAAQ,cAAEC,SAAuB13N,KAAKhD,MAAMqD,QAAQk3N,kBAEvDE,IAC2D,MAAjCz3N,KAAKhD,MAAMyS,SAASwQ,WAGtCy3M,EACA13N,KAAKhD,MAAMqD,QAAQ83N,kCAAkCn4N,KAAKhD,MAAMo7F,QAAS,IAAI08I,gBAAgB90O,KAAKhD,MAAMyS,SAASyQ,SAC1GlgB,KAAKhD,MAAM6+O,YAClB77O,KAAKhD,MAAMo7F,QAAQ9oF,KAAK,0BAIhCtP,KAAK87O,iBACT,IACHh8O,GAAA,wBAEkBrD,IACXA,EAAE07D,cAAgB17D,EAAE07D,aAAapvD,MAAMrC,OAAS,GAAsC,SAAjCjK,EAAE07D,aAAapvD,MAAM,GAAG2yD,OAC7Ej/D,EAAEyK,iBACFzK,EAAEy0D,kBACN,IACHpxD,GAAA,4BAEsBrD,KACdk9D,EAAAA,EAAAA,IAAqBl9D,IAAO+C,SAASC,KAAKq5D,UAAUqC,SAAS,qBAC9D1+D,EAAEyK,iBACFzK,EAAEy0D,kBACN,IACHpxD,GAAA,gCAyB0BrD,IACvBuD,KAAKhD,MAAMqD,QAAQs4N,wBAAwBl8N,EAAE,IAChDqD,GAAA,oBAEa,KACV,MAAMwX,EAAO9X,SAAS2tE,eAAe,QAErC,IAAK,MAAO5vE,EAAW6xH,KAAY1xH,OAAOkJ,QAAQ,CAC9C,kBAAmB5G,KAAKhD,MAAM++O,iBAC9B,WAAY/7O,KAAKhD,MAAMg/O,UACvB,oBAAqBh8O,KAAKhD,MAAMi/O,gBAEhC3kO,EAAKwhD,UAAUznC,OAAO9zB,EAAW6xH,EACrC,KAnSA8sH,EAAAA,EAAAA,KAAOntO,EAAAA,GAAAA,OAGPzZ,EAAAA,GAAQ6mP,eAAgB,GAExBC,EAAAA,EAAAA,IAAgB,IAAIxlN,IAAIylN,GAAAA,GAAoB51O,SAE5CzG,KAAKpK,MAAQ,CACTmlP,sBAAsB,EAE9B,CAkJAI,UAAAA,GAGQn7O,KAAKhD,MAAMyS,SAASwQ,SAAS9Q,WAAW,oBAI5CgsO,EAAAA,EAAAA,IAAWn7O,KAAKhD,MAAMk2G,MAC1B,CAEAz6D,kBAAAA,CAAmBC,EAAkBj3C,GAsUlC,IAA+Cwe,EArUzCq8N,IAAU5jM,EAAUw6D,MAAOlzG,KAAKhD,MAAMk2G,QACvClzG,KAAKm7O,aAG4B,MAAjCn7O,KAAKhD,MAAMyS,SAASwQ,WAChBjgB,KAAKhD,MAAM6+O,WACXnjM,EAAU0/C,QAAQ9oF,KAAK,yBAChBtP,KAAKhD,MAAMgnJ,oBAClBtrG,EAAU0/C,QAAQ9oF,KAAK,sBAK3BtP,KAAKhD,MAAM++O,mBAAqBrjM,EAAUqjM,kBAC1C/7O,KAAKhD,MAAMg/O,YAActjM,EAAUsjM,WACnCh8O,KAAKhD,MAAMi/O,gBAAkBvjM,EAAUujM,eAEvCj8O,KAAKu8O,eAGJ7jM,EAAU8jM,gBAAkBx8O,KAAKhD,MAAMw/O,gBACxCx8O,KAAKy8O,mBAG8B,IAAnCh7O,EAAUs5O,uBAAsE,IAApC/6O,KAAKpK,MAAMmlP,uBA6Sb96N,EA5SCjgB,KAAKhD,MAAMyS,SAASwQ,SA+SlC,IAAI66B,OAAO,2FAAD78C,OAA4Fy+O,EAAAA,GAAyB,aAEhIvkN,KAAKlY,KAhT7B1B,GAAAA,EAAWo+N,sBACXC,GAAAA,EAAqB9mG,KAAK,SAGtC,CAEA8kG,gBAAAA,GACI,MAAMiC,EAAK,IAAI/H,gBAAgB9lO,OAAOS,SAASyQ,QAKzC48N,EAFO,CAAC,aAAc,aAAc,gBAEpBjtO,QAAO,CAACqrG,EAAKlgH,KAC/B,GAAI6hP,EAAGxwN,IAAIrxB,GAAM,CACb,MAAM8F,EAAQ+7O,EAAGh8K,IAAI7lE,GACjB8F,IACAo6G,EAAIlgH,GAAO8F,GAEf+7O,EAAGE,OAAO/hP,EACd,CACA,OAAOkgH,CAAG,GACX,CAAC,GAEJ,OAAIx9G,OAAO+I,KAAKq2O,GAAUp2O,OAAS,GAC/B1G,KAAKhD,MAAMo7F,QAAQ7zD,QAAQ,CAACrkB,OAAQ28N,EAAGv7O,aAChCw7O,GAEJ,IACX,CAkCAvkM,iBAAAA,IACI3e,EAAAA,GAAAA,IAA8BC,EAAAA,GAAgBmjN,WAE9Ch9O,KAAKi9O,sBAELC,EAAAA,GAAAA,OACAC,EAAAA,GAAAA,MAGAnuO,OAAO6rD,iBAAiB,UAAW76D,KAAKo9O,yBAGxC59O,SAASq7D,iBAAiB,OAAQ76D,KAAKq9O,iBAEvC79O,SAASq7D,iBAAiB,WAAY76D,KAAKs9O,oBAC/C,CAEAhgL,oBAAAA,GACItuD,OAAO+rD,oBAAoB,UAAW/6D,KAAKo9O,yBAC3C59O,SAASu7D,oBAAoB,OAAQ/6D,KAAKq9O,iBAC1C79O,SAASu7D,oBAAoB,WAAY/6D,KAAKs9O,oBAClD,CAkBAr6O,MAAAA,GAAS,IAAAs6O,EAAAC,EAAAC,EACL,OAAKz9O,KAAKpK,MAAMmlP,qBAKZz9O,IAAAA,cAACk3O,GAAY,KACTl3O,IAAAA,cAACw6O,GAAiB,MAClBx6O,IAAAA,cAACiwO,GAAe,MAChBjwO,IAAAA,cAACo2O,GAA6B,MAC9Bp2O,IAAAA,cAACogP,EAAAA,OAAM,KACHpgP,IAAAA,cAACkvO,EAAAA,MAAK,CACFzsN,KAAM,SACN9kB,UAAW+8O,KAEf16O,IAAAA,cAAC8uO,GAAO,CACJrsN,KAAM,SACN9kB,UAAWg9O,KAEf36O,IAAAA,cAAC8uO,GAAO,CACJrsN,KAAM,kBACN9kB,UAAWi9O,KAEf56O,IAAAA,cAACqvO,GAAQ,CACL5sN,KAAM,kBACN9kB,UAAWk9O,KAEf76O,IAAAA,cAACqvO,GAAQ,CACL5sN,KAAM,2BACN9kB,UAAWm9O,KAEf96O,IAAAA,cAAC8uO,GAAO,CACJrsN,KAAM,wBACN9kB,UAAWo9O,KAEf/6O,IAAAA,cAAC8uO,GAAO,CACJrsN,KAAM,uBACN9kB,UAAWq9O,KAEfh7O,IAAAA,cAAC8uO,GAAO,CACJrsN,KAAM,mBACN9kB,UAAWs9O,KAEfj7O,IAAAA,cAACqvO,GAAQ,CACL5sN,KAAM,SACN9kB,UAAWu9O,KAEfl7O,IAAAA,cAACyvO,GAAa,CACVhtN,KAAM,oBACN9kB,UAAWw9O,KAEfn7O,IAAAA,cAACkvO,EAAAA,MAAK,CACFzsN,KAAM,WACN9kB,UAAWy9O,KAEd14O,KAAKhD,MAAM2gP,kBACRrgP,IAAAA,cAACkvO,EAAAA,MAAK,CACFzsN,KAAM,qBACN9kB,UAAW8+O,KAGnBz8O,IAAAA,cAACkvO,EAAAA,MAAK,CACFzsN,KAAM,kBAENziB,IAAAA,cAACogP,EAAAA,OAAM,KACHpgP,IAAAA,cAACyvO,GAAa,CACV75H,MAAOh2F,EAAAA,GAAY0gO,OAAOC,MAC1B99N,KAAM,iBACN9kB,UAAW09O,KAEfr7O,IAAAA,cAACo3O,GAAY,QAGrBp3O,IAAAA,cAACsvO,GAAgB,CACb7sN,KAAM,eACN9kB,UAAW29O,KAEft7O,IAAAA,cAACsvO,GAAgB,CACb7sN,KAAM,mBACN9kB,UAAW49O,KAEfv7O,IAAAA,cAACsvO,GAAgB,CACb7sN,KAAM,eACN9kB,UAAW69O,KAEfx7O,IAAAA,cAACyvO,GAAa,CACVhtN,KAAM,OACN9kB,UAAW89O,KAEfz7O,IAAAA,cAACyvO,GAAa,CACVhtN,KAAM,uBACN9kB,UAAW+9O,KAEf17O,IAAAA,cAACymJ,EAAAA,SAAQ,CACL7tF,KAAM,oCACNjZ,GAAE,IAAAh/C,OAAM+B,KAAKhD,MAAM8gP,0BAAyB,6BAEhDxgP,IAAAA,cAACymJ,EAAAA,SAAQ,CACL7tF,KAAM,wBACNjZ,GAAE,IAAAh/C,OAAM+B,KAAKhD,MAAM8gP,0BAAyB,iBAEhDxgP,IAAAA,cAACo2G,GAAoB,CAACR,MAAOlzG,KAAKhD,MAAMk2G,OAClClzG,KAAKhD,MAAM+gP,yBAA2B/9O,KAAKhD,MAAMyS,SAASwQ,SAASwpB,SAAS,yBAC1EnsC,IAAAA,cAAC+gN,GAAkB,CACfG,YAAY,EACZz/M,OAAQq/M,GAAAA,uCACRj1M,MAAM,EACNs1M,WAAY1lJ,GACZkmJ,oBAAqBH,GAAAA,GAAWQ,QAAQC,kBAGhDjiN,IAAAA,cAACy6O,GAAkB,MACnBz6O,IAAAA,cAACu8O,GAAe,MAChBv8O,IAAAA,cAACk+F,GAAyB,MAC1Bl+F,IAAAA,cAACm8O,GAAY,MACbn8O,IAAAA,cAAC2uO,GAAY,MACb3uO,IAAAA,cAACo8O,GAAY,MACbp8O,IAAAA,cAACq8O,GAAW,MACZr8O,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAACogP,EAAAA,OAAM,KACiB,QADjBH,EACFv9O,KAAKhD,MAAMqW,gBAAQ,IAAAkqO,OAAA,EAAnBA,EAAqB98O,QAAQyoF,GAAYr/E,QAAQq/E,EAAQ80J,mBAAkBr9O,KAAKuoF,GAC7E5rF,IAAAA,cAACkvO,EAAAA,MAAK,CACFxxO,IAAG,GAAAiD,OAAKirF,EAAQ70F,GAAE,WAClB0rB,KAAI,GAAA9hB,OAAKirF,EAAQ+0J,QAAO,WACxBh7O,OAASjG,GAEDM,IAAAA,cAAAi8O,GAAA77O,OAAAC,OAAA,CACIuwL,cAAe,UACfy1C,iBAAkB,kBAClBC,YAAa16I,EAAQ70F,IAEjB2I,QAMJ,QADlBwgP,EACDx9O,KAAKhD,MAAMqW,gBAAQ,IAAAmqO,OAAA,EAAnBA,EAAqB78O,KAAKuoF,GACvB5rF,IAAAA,cAACkvO,EAAAA,MAAK,CACFxxO,IAAKkuF,EAAQ70F,GACb0rB,KAAMmpE,EAAQ+0J,QACdh7O,OAASjG,IACL,IAAIkhP,EACA5gP,IAAAA,cAAA67O,GAAA,CACIjrD,cAAe,UACfy1C,iBAAkB,gBAClBC,YAAa16I,EAAQ70F,GACrBwtL,gBAAiBA,GAAAA,EAAgBy3D,MAC5BpwJ,EAAQi1J,aAAU7lP,EAAY,CAACqwF,SAAU,YAUtD,OAPIO,EAAQi1J,UACRD,EACI5gP,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,CAAC,kBAAmB,CAACyT,MAAOghC,EAAQk1J,oBAC1DF,IAKT5gP,IAAAA,cAACkkJ,GAAAA,QAAaxkJ,EACTkhP,EACM,MAKR,QADjBT,EACDz9O,KAAKhD,MAAM2hE,eAAO,IAAA8+K,OAAA,EAAlBA,EAAoB98O,KAAKw2N,GACtB75N,IAAAA,cAACkvO,EAAAA,MAAK,CACFxxO,IAAKm8N,EAAO9iO,GACZ0rB,KAAM,SAAYo3M,EAAen/H,MACjC/0F,OAAQA,IACJ3F,IAAAA,cAAA27O,GAAA,CACI/qD,cAAe,uBACf01C,YAAazM,EAAO9iO,SAMpCiJ,IAAAA,cAACyvO,GAAa,CACV75H,MAAOlzG,KAAKhD,MAAMk2G,MAClBnzF,KAAI,UAAA9hB,OAAYogP,GAAAA,GAAsB,KACtCpjP,UAAWu+O,KAEfl8O,IAAAA,cAACo3O,GAAY,OAEjBp3O,IAAAA,cAACs8O,GAAY,OAEjBt8O,IAAAA,cAAC2wL,GAAS,CAACC,cAAc,WACzB5wL,IAAAA,cAACw8O,GAAM,MACPx8O,IAAAA,cAACgwO,GAAsB,SA5L5BhwO,IAAAA,cAAA,WAiMf,EC3eJ,MAAM04L,IAAY5wL,EAAAA,EAAAA,UAtDlB,SAAyBxP,GACrB,MAAMqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACnBouJ,GAAqBK,EAAAA,EAAAA,IAAyBzuJ,GAC9C+oE,EAAU/oE,EAAM+oE,QAAQ7hE,WAAWwhP,qBACnCjrO,EAAWzd,EAAM+oE,QAAQ7hE,WAAWo6N,QACpC1iO,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAE1B+B,EAASqhB,EAAAA,EAAkB+H,kBAAkBvsB,GAC7C+pP,GAAwBp9N,EAAAA,EAAAA,IAAQvrB,EAAO+B,GAEvC6kP,EAAiBvkP,IAAW+zF,IAAQ/zF,GAE1C,MAAO,CACHi7G,OAAOC,EAAAA,EAAAA,IAASv9G,GAChB4mP,iBACAjC,iBAAgD,SAA9BtiP,EAAOumP,mBACzB3C,WAAkC,SAAtB5jP,EAAOwmP,WACnBvmJ,YAAajgG,EAAOymP,aACpBxE,mBAAoBjiP,EAAOkiP,mBAC3Br/O,QAAS7C,EAAOs7C,QAChBmoM,gBAAiBzjP,EAAO0mP,mBACxBnD,oBAAqBvjP,EAAO2mP,uBAC5BvqF,gBAAiBp8J,EAAOigK,gBACxBmjF,yBAA8D,SAApCpjP,EAAO4mP,yBACjCf,0BAA2BS,EAAwBA,EAAsB9gP,KAAO,GAChFumJ,qBACArlF,UACAtrD,WACA0qO,wBAAwBe,EAAAA,EAAAA,IAA0BlpP,GAClDqmP,eAAez1K,EAAAA,EAAAA,IAAiB5wE,GAChComP,WAAW/jO,EAAAA,EAAAA,GAAariB,GACxBujK,UAAUhhJ,EAAAA,EAAAA,IAAYviB,GACtBmmP,kBAAkBA,EAAAA,EAAAA,IAAiBnmP,GACnC+1F,SAASoI,EAAAA,EAAAA,IAAsBn+F,GAC/B+nP,kBAAkBA,EAAAA,EAAAA,IAAiB/nP,GAE3C,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBiyN,gBAAe,EACfe,2BAA0B,KAC1B18K,YAAW,KACXq/L,6BAA4B,KAC5BD,oBAAmB,KACnBhjB,2BAA0B,EAC1BlB,mBAAkB,EAClB6B,wBAAuB,EACvBR,kCAAiCA,GAClCxkO,GAEX,IAMA,IAAe69H,EAAAA,EAAAA,YAAWwkE,GAAUgkD,I,2NChF9B1zE,EAA8B7wK,IAkB9B,IAlB+B,OACjCghD,GAAS,EAAK,SACd9xC,GAAW,EAAK,cAChB6hK,EACIlpK,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,WAEtB,eACDA,EACIzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mBACH0S,eAAe,SAEtB,SACD24I,EAAW,GAAE,aACbq/F,EAAe,IAElBtpP,EADMuH,E,qWAAKmgD,CAAA1nD,EAAA2nD,GAEJ7/C,EAAY,MAahB,OAZKmiJ,IACDniJ,GAAa,gBAGZoH,IAAY8xC,IACbl5C,GAAa,IAAMmiJ,GAGnBq/F,IACAxhP,GAAa,IAAMwhP,GAInBzhP,IAAAA,cAAA,SAAAI,OAAAC,OAAA,CACInF,KAAK,SACL,cAAY,cACZnE,GAAG,cACHkJ,UAAWA,EACXoH,SAAUA,GACN3H,GAEJM,IAAAA,cAACs1K,EAAAA,EAAc,CACXtpK,QAASmtC,EACT3uC,KAAM0+J,GAENlpK,IAAAA,cAAA,YAAOyJ,IAEN,EAEfu/J,EAAA3gK,UAAA,CA3DE8wC,OAAMrzC,IAAAA,KACNuB,SAAQvB,IAAAA,KACR/O,GAAE+O,IAAAA,OACFwJ,QAAOxJ,IAAAA,KACPojK,cAAapjK,IAAAA,KACb2D,eAAc3D,IAAAA,KACds8I,SAAQt8I,IAAAA,OACR27O,aAAY37O,IAAAA,QAsDhB,S,+RChDA,MAAM47O,EAAe7/L,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,gBAAXq7C,CAAW,wDCEhC,GAAe/5C,EAAAA,EAAAA,UAPf,SAAyBxP,EAAoB2hC,GACzC,MAAM72B,EAAO62B,EAAS72B,KACtB,MAAO,CACH/D,QAAQslD,EAAAA,EAAAA,IAAmBrsD,EAAO8K,EAAKrM,IAE/C,GAEA,EDkCoBoB,IAA0H,IAAzH,KAACiL,EAAI,OAAE/D,EAAM,UAAEsiP,EAAY,GAAE,QAAE5+O,EAAU,GAAE,YAAE6+O,EAAW,gBAAE52F,EAAkB,CAAC,EAAC,MAAEr8I,EAAK,WAAEqrF,EAAU,UAAEwlB,GAAiBrnH,EACjIiX,EAAU,KACVrM,IACAqM,EAAUrM,EAAQM,KAAI,CAACw+O,EAAQC,IAEvB9hP,IAAAA,cAAC6hP,EAAMzhP,OAAAC,OAAA,CACH3C,IAAKokP,EAAY99O,WACjBZ,KAAMA,EACNuL,MAAOA,EACPqrF,WAAYA,GACR4nJ,EACA52F,OAOpB,IAEI+2F,EAwBAC,EACAC,EA3BAC,EAAuB9+O,EAAKjK,MAC5BgpP,EAAa,0BAgCjB,OA9BIR,GAAaA,EAAUv4O,OAAS,GAChC84O,EACIliP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,kCACfjB,OAAQ,CACJrP,MAAOiK,EAAKjK,MACZivD,OAASvF,GAA4B7iD,IAAAA,cAAA,cAAS6iD,MAI1Ds/L,EAAa,IAEbJ,EADO3+O,EAAK/D,OACC+D,EAAK/D,OAELA,EAGb+D,EAAKnC,SACL8gP,OAAa/mP,EACbknP,OAAYlnP,GAKZwkH,GAAaA,GAAa,IAC1BwiI,GAAcI,EAAAA,EAAAA,IAAa,kBAAoB5iI,GAC/CyiI,GAAiBG,EAAAA,EAAAA,IAAa,mBAAqB5iI,IAInDx/G,IAAAA,cAAA,OACItC,IAAK0F,EAAKrM,GACVkJ,UAAU,mBAEVD,IAAAA,cAAC29C,EAAAA,EAAc,CACXpvC,IAAKvW,EAAAA,GAAQ4lD,qBAAqBx6C,EAAKrM,GAAIqM,EAAKy6C,qBAChDx+C,OAAQ0iP,EACRjhP,KAAK,KACL5J,OAAQkM,EAAKrM,GACbwJ,SAAU6C,EAAK7C,WAEnBP,IAAAA,cAAA,OACIC,UAAU,sBACV,cAAY,uBAEZD,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,OACIjJ,GAAIirP,EACJ/hP,UAAU,oBAEVD,IAAAA,cAACyoL,EAAAA,EAAW,CACRvxL,OAAQkM,EAAKrM,GACbwM,iBAAiB,KAGhBH,EAAK5C,YAAc4C,EAAK3C,WAAa2C,EAAK1C,WACvCV,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACq4C,EAAAA,EAAI,MACJ,IACDr4C,IAAAA,cAACq4C,EAAAA,EAAI,OAEDgqM,EAAAA,EAAAA,IAA8Bj/O,KAOlDpD,IAAAA,cAAC0hP,EAAY,KACT1hP,IAAAA,cAACw0G,EAAAA,EAAiB,CACdC,OAAQrxG,EAAKrM,GACb29G,UAAW,GACXnrB,aAAa,EACborB,UAAW,CACPhL,QAAS,OACTiL,KAAM,WACNC,WAAY,cAM5B70G,IAAAA,cAAA,OACIjJ,GAAIkrP,EACJhiP,UAAWkiP,GAEVD,GAEJP,GAEL3hP,IAAAA,cAAA,OACI,cAAY,sBACZC,UAAU,uBAETmP,GAEH,I,yZEtIC,MAAMuzF,UAAiB3iG,IAAAA,cAUlCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,oBAIH,KACNE,KAAK4/O,aAAa7vO,UAClB/P,KAAK4/O,aAAa7vO,QAAQ2mK,UAAY,EAC1C,IANA12K,KAAK4/O,aAAetiP,IAAAA,WACxB,CAQA2F,MAAAA,GACI,MAAMzC,EAAQR,KAAKhD,MAAMwD,MACnBq/O,EAAmB7/O,KAAKhD,MAAM8iP,iBAEpC,IAAIpmJ,EACJ,OAAa,MAATl5F,EACOlD,IAAAA,cAACmjJ,EAAAA,EAAa,OAErB/mD,EADOl5F,EAAMkG,OAAS,GAAKm5O,GAAoB7/O,KAAKhD,MAAMkiP,YAChD1+O,EAAMG,KAAI,CAACD,EAAmBuL,KACpC,MAAM,gBAACq8I,EAAe,UAAE22F,GAAaj/O,KAAKhD,MACpCxI,EAASkM,EAAKrM,GACpB,OACIiJ,IAAAA,cAACuiP,EAAgB,CACb7kP,IAAK0F,EAAKrM,GACVqM,KAAMA,EACNu+O,UAAWA,aAAS,EAATA,EAAYzqP,GACvB6L,QAASL,KAAKhD,MAAMqD,QACpB6+O,YAAal/O,KAAKhD,MAAMkiP,YACxB52F,gBAAiBA,aAAe,EAAfA,EAAkB9zJ,GACnCyX,MAAOA,EACPqrF,WAAY92F,EAAMkG,OAClBo2G,UAAW7wG,GAAS,EAAIA,GAAS,EACjC9J,WAAYnC,KAAKhD,MAAMmF,YACzB,IAKN7E,IAAAA,cAAA,OACItC,IAAI,iBACJuC,UAAU,8BACV,cAAY,gBAEZD,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,qBAQ/BzJ,IAAAA,cAAA,OAAK46C,IAAKl4C,KAAK4/O,cACVlmJ,GAGb,E,yZACH55F,EAtEoBmgG,EAAQ,eACH,CAClBz/F,MAAO,GACPy+O,UAAW,CAAC,EACZ5+O,QAAS,GACT6+O,YAAa,CAAC,EACdY,iBAAkBC,ICjC1B,MA4CMC,EAAchjP,GAChBM,IAAAA,cAAA,MAAAI,OAAAC,OAAA,GACQX,EAAK,CACTO,UAAU,qBAIZ0iP,EAAwBA,IAC1B3iP,IAAAA,cAAA,YAGE4iP,EAAuBljP,GACzBM,IAAAA,cAAA,MAAAI,OAAAC,OAAA,GACQX,EAAK,CACTO,UAAU,yBAQlB,MAAMirJ,UAA2BlrJ,IAAAA,cAyB7BsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,oBAYI,KAAY,IAAAqgP,EACH,QAA1BA,EAAAngP,KAAKogP,cAAcrwO,eAAO,IAAAowO,GAA1BA,EAA4BE,aAAa,IAC5CvgP,EAAA,iBAgBWrD,IACRA,EAAEyK,iBAEFlH,KAAKgH,SAAS,CAACs5O,cAAc,IAC7BtgP,KAAKugP,cAAgBh4N,YAAW,IAAMvoB,KAAKgH,SAAS,CAACs5O,cAAc,KA9H/C,KAgIpBtgP,KAAKhD,MAAM2gG,WACX39F,KAAKqgP,aAAa,IACrBvgP,EAAA,qBAEerD,IACZA,EAAEyK,iBAEFlH,KAAKhD,MAAMwjP,eACXxgP,KAAKqgP,aAAa,IACrBvgP,EAAA,uBAEgB,KACTE,KAAKhD,MAAM2rJ,cAAgB3oJ,KAAKygP,UAAU1wO,SAC1C/P,KAAKygP,UAAU1wO,QAAQiP,OAC3B,IACHlf,EAAA,oBAEcrD,IACPA,IACAuD,KAAKhD,MAAM0jP,aAAajkP,EAAEmkI,cAAc9/H,OACxCd,KAAKhD,MAAMkjB,OAAOzjB,EAAEmkI,cAAc9/H,OACtC,IACHhB,EAAA,oBAEcU,IACX,IAAKA,IAAUR,KAAKhD,MAAMwD,MACtB,OAAO,KAGX,GAAIR,KAAKhD,MAAMyD,OACX,OAAO,KAGX,MAAM6R,EAAQ9R,EAAMkG,OACd6O,EAAQvV,KAAKhD,MAAMuY,MACnBorO,EAAW92O,QAAQ7J,KAAKhD,MAAMk4B,MAEpC,IAAI0rH,EACAC,EAYJ,OAXI8/F,GACA//F,GAAc,EACdC,GAAY,IAEZD,EAAa5gJ,KAAKhD,MAAMT,KAAOyD,KAAKhD,MAAMyrJ,aAC1C5H,EAAWz/I,KAAKinD,IAAIu4F,EAAa5gJ,KAAKhD,MAAMyrJ,aAAclzI,GACtDvV,KAAKhD,MAAMwD,MAAMkG,OAASm6I,IAC1BA,EAAW7gJ,KAAKhD,MAAMwD,MAAMkG,SAIhC1G,KAAKhD,MAAM4jP,YACJ5gP,KAAKhD,MAAM4jP,YAAYtuO,EAAOtS,KAAKhD,MAAMuY,MAAOqrI,EAAYC,EAAU8/F,GAG7E3gP,KAAKhD,MAAMuY,MACPorO,EAEIrjP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,yFACfjB,OAAQ,CACJwM,QACAiD,WAOZjY,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,mHACfjB,OAAQ,CACJwM,QACAsuI,WAAYA,EAAa,EACzBC,WACAtrI,WAMT,IAAI,IApHXvV,KAAKugP,cAAgB,CAAC,EAEtBvgP,KAAKpK,MAAQ,CACT0qP,cAAc,GAGlBtgP,KAAKogP,cAAgB9iP,IAAAA,YACrB0C,KAAKygP,UAAYnjP,IAAAA,WACrB,CAMAi7C,iBAAAA,GACIv4C,KAAK6gP,gBACT,CAEApoM,kBAAAA,CAAmBC,GACX14C,KAAKhD,MAAMT,OAASm8C,EAAUn8C,MAAQyD,KAAKhD,MAAMk4B,OAASwjB,EAAUxjB,MACpEl1B,KAAKqgP,aAEb,CAEA/iL,oBAAAA,GACIzqB,aAAa7yC,KAAKugP,cACtB,CA6FAt9O,MAAAA,GACI,IAAImiK,EACAC,EACA9c,EA6CAu4F,EA3CJ,GAAI9gP,KAAKhD,MAAMk4B,OAASl1B,KAAKhD,MAAMwD,MAC/B+nJ,EAAiBvoJ,KAAKhD,MAAMwD,WACzB,IAAKR,KAAKhD,MAAMk4B,KAAM,CACzB,MAAMwwI,EAAY1lK,KAAKhD,MAAMT,KAAOyD,KAAKhD,MAAMyrJ,aAC/C,IAAIkd,EAAUD,EAAY1lK,KAAKhD,MAAMyrJ,aACjCzoJ,KAAKhD,MAAMwD,MAAMkG,OAASi/J,IAC1BA,EAAU3lK,KAAKhD,MAAMwD,MAAMkG,QAG/B6hJ,EAAiBvoJ,KAAKhD,MAAMwD,MAAM4O,MAAMs2J,EAAWC,GAE/CA,EAAU3lK,KAAKhD,MAAMuY,QACrB6vJ,EACI9nK,IAAAA,cAAA,UACIjJ,GAAG,4BACHkJ,UAAU,8DACVqP,QAAS5M,KAAK29F,SACdh5F,SAAU3E,KAAKpK,MAAM0qP,cAErBhjP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,WAM3B/G,KAAKhD,MAAMT,KAAO,IAClB8oK,EACI/nK,IAAAA,cAAA,UACIjJ,GAAG,4BACHkJ,UAAU,8DACVqP,QAAS5M,KAAKwgP,cAEdljP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,cAKnC,CAgCA,OA7BK/G,KAAKhD,MAAM+jP,mBAERD,EADA9gP,KAAKhD,MAAMgkP,gBACChhP,KAAKhD,MAAMgkP,gBAAgBhhP,KAAKm6C,aAGxC78C,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,SACIC,UAAU,eACVk4H,QAAQ,oBAERn4H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,kBAGvBzJ,IAAAA,cAAC6lG,EAAAA,EAAU,CACPjrD,IAAKl4C,KAAKygP,UACVpsP,GAAG,mBACHkJ,UAAU,8BACVoE,YAAa3B,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,iBAC7F,aAAY/G,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,iBAC5F6gG,QAAS5nG,KAAKm6C,YACdr5C,MAAOd,KAAKhD,MAAMk4B,SAQlC53B,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,OAAKC,UAAU,cACVujP,EACDxjP,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAAA,QACIjJ,GAAG,0BACHkJ,UAAU,yBACV,YAAU,UAETyC,KAAK4gP,YAAYr4F,MAI9BjrJ,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAC2jP,EAAAA,GAAU,CACP/oM,IAAKl4C,KAAKogP,cACVc,UAAU,EACVC,gBAAiB,IACjBC,iBAAkB,IAClBnB,sBAAuBA,EACvBC,oBAAqBA,EACrBF,WAAYA,GAEZ1iP,IAAAA,cAAC2iG,EAAQ,CACLz/F,MAAO+nJ,EACP02F,UAAWj/O,KAAKhD,MAAMiiP,UACtB5+O,QAASL,KAAKhD,MAAMqD,QACpB6+O,YAAal/O,KAAKhD,MAAMkiP,YACxB52F,gBAAiBtoJ,KAAKhD,MAAMsrJ,gBAC5Bw3F,iBAAkB9/O,KAAKhD,MAAM8iP,iBAC7B39O,WAAYnC,KAAKhD,MAAMmF,eAInC7E,IAAAA,cAAA,OAAKC,UAAU,mBACV8nK,EACAD,GAIjB,EACHtlK,EA3QK0oJ,EAAkB,aA/DpBhoJ,MAAK4C,IAAAA,UAAA,CAAAA,IAAAA,MAAAA,IAAAA,MAAA,UACLqlJ,aAAYrlJ,IAAAA,OACZmS,MAAKnS,IAAAA,OAAAC,WACL47O,UAAS77O,IAAAA,SAAAA,IAAAA,QAAAA,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,YACTu6F,SAAQv6F,IAAAA,KAAAC,WACRm9O,aAAYp9O,IAAAA,KAAAC,WACZ6c,OAAM9c,IAAAA,KAAAC,WACNhD,QAAO+C,IAAAA,QAAAA,IAAAA,MACP29O,iBAAgB39O,IAAAA,KAChB87O,YAAW97O,IAAAA,MAAA,CACPi+O,WAAUj+O,IAAAA,KAAAC,WACVi+O,uBAAsBl+O,IAAAA,KAAAC,WACtBk+O,yCAAwCn+O,IAAAA,KAAAC,WACxCm+O,gBAAep+O,IAAAA,KAAAC,WACfo+O,aAAYr+O,IAAAA,KAAAC,WACZq+O,cAAat+O,IAAAA,KAAAC,WACbs+O,cAAav+O,IAAAA,KAAAC,WACbu+O,eAAcx+O,IAAAA,KAAAC,WACdlB,WAAUiB,IAAAA,OAEdklJ,gBAAellJ,IAAAA,SAAAA,IAAAA,MAAA,KAOfulJ,aAAYvlJ,IAAAA,KACZw9O,YAAWx9O,IAAAA,KACX3C,OAAM2C,IAAAA,OACN49O,gBAAe59O,IAAAA,KACf7G,KAAI6G,IAAAA,OAAAC,WACJ6xB,KAAI9xB,IAAAA,OAAAC,WACJq9O,aAAYt9O,IAAAA,KAAAC,WAEZlB,WAAUiB,IAAAA,KAGV08O,iBAAgB18O,IAAAA,cAAAtD,EAyBd0oJ,EAAkB,eACkB,CAClChoJ,MAAO,GACPioJ,aAAc,GACdw2F,UAAW,CAAC,EACZ5+O,QAAS,GACT6+O,YAAa,CACTmC,YAAY,EACZC,wBAAwB,EACxBC,0CAA0C,EAC1CC,eAAAA,GAAmB,EACnBC,YAAAA,GAAgB,EAChBC,aAAAA,GAAiB,EACjBC,aAAAA,GAAiB,EACjBC,cAAAA,GAAkB,EAClBz/O,YAAY,GAEhBmmJ,gBAAiB,CAAC,EAClBK,cAAc,IA2PtB,SAAe77I,EAAAA,EAAAA,YAAW07I,GCtTX,SAASq5F,EAA4B7kP,GAChD,MAAOk4B,EAAM4sN,IAAWjrO,EAAAA,EAAAA,UAAS,KAC1Bta,EAAMw5K,IAAWl/J,EAAAA,EAAAA,UAAS,GAuBjC,OACIvZ,IAAAA,cAACkrJ,EAAkB9qJ,OAAAC,OAAA,GACXX,EAAK,CACT2gG,SApBSA,KACbo4E,EAAQx5K,EAAO,GACfS,EAAM2gG,SAASphG,EAAO,EAAE,EAmBpBikP,aAhBaA,KACjBzqE,EAAQx5K,EAAO,EAAE,EAgBb2jB,OAbQgV,IACZl4B,EAAMkjB,OAAOgV,GAEA,KAATA,GACA6gJ,EAAQ,EACZ,EASIx5K,KAAMA,EACN24B,KAAMA,EACNwrN,aA7BkBxrN,IACtB4sN,EAAQ5sN,EAAK,IA+BrB,CAAC2sN,EAAAl8O,UAAA,CAhEGnF,MAAK4C,IAAAA,UAAA,CAAAA,IAAAA,MAAAA,IAAAA,MAAA,UACLqlJ,aAAYrlJ,IAAAA,OAAAC,WACZkS,MAAKnS,IAAAA,OAAAC,WACL47O,UAAS77O,IAAAA,SAAAA,IAAAA,QAAAA,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,YACTu6F,SAAQv6F,IAAAA,KAAAC,WACR6c,OAAM9c,IAAAA,KAAAC,WACNhD,QAAO+C,IAAAA,QAAAA,IAAAA,MACP87O,YAAW97O,IAAAA,MAAA,CACPi+O,WAAUj+O,IAAAA,KAAAC,WACVi+O,uBAAsBl+O,IAAAA,KAAAC,WACtBk+O,yCAAwCn+O,IAAAA,KAAAC,WACxCm+O,gBAAep+O,IAAAA,KAAAC,WACfo+O,aAAYr+O,IAAAA,KAAAC,WACZq+O,cAAat+O,IAAAA,KAAAC,WACbs+O,cAAav+O,IAAAA,KAAAC,WACbu+O,eAAcx+O,IAAAA,KAAAC,aAGlBilJ,gBAAellJ,IAAAA,SAAAA,IAAAA,MAAA,KAAAC,WAOfslJ,aAAYvlJ,IAAAA,K,yHCxBhB,MAAM2+O,EAAsBtsP,IAGf,IAHgB,OACzBuqJ,EAAM,YACNgiG,GACIvsP,EACJ,MAAMkoI,EAAUqiB,EAAOhnC,YAAe17G,IAAAA,cAAA,KAAGC,UAAWk3C,IAAW,OAAQurG,EAAOhnC,eAAmB,KAC3F4kB,EAAWoiB,EAAOiiG,aAAgB3kP,IAAAA,cAAA,KAAGC,UAAWk3C,IAAW,OAAQurG,EAAOiiG,gBAAoB,KACpG,OACI3kP,IAAAA,cAAA,UACIsP,QAASozI,EAAOpzI,QAChBrP,UAAWk3C,IAAW,iCAAkCutM,GACxDr9O,SAAUq7I,EAAOr7I,UAEhBq7I,EAAO12I,SAAYhM,IAAAA,cAAA,KAAGC,UAAU,gCAChCogI,EACAqiB,EAAOl4I,KACP81H,EACI,EAEfmkH,EAAAp8O,UAAA,CArBEq8O,YAAW5+O,IAAAA,MAAA,CAAE,cAAgB,gBAAkB,eAAiB,aAAUC,YAuB9E,UCPM6+O,EAAa,CACfv5K,KAAM,2BACN/mE,KAAM,yBACN7N,QAAS,aACT8sH,OAAQ,qBACRy4D,QAAS,qBACT6oE,aAAS7pP,GAGPi5H,EAAgB97H,IAUT,IAVU,MACnB+V,EAAK,KACL1D,EAAI,cACJs6O,EAAa,gBACbC,EAAe,eACfC,EAAc,WACdC,EAAU,KACV/pP,EAAO,OAAM,cACbqzF,EAAa,eACb22J,GACI/sP,EACJ,MAAMoR,GAAOiQ,EAAAA,EAAAA,WACPzZ,EAAO6kP,EAAW1pP,GAClBiqP,EAAc54O,QAAQgiF,GAAiB22J,GACvCE,EAAa74O,QAAQu4O,GAAiBC,GAAmBC,GAAkBC,GACjF,OACIjlP,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,yBAA0Bj8C,IACjD8E,IAAAA,cAAA,OAAKC,UAAW,wBACXF,GAAQC,IAAAA,cAAA,KAAGC,UAAWk3C,IAAW,yBAA0Bp3C,EAAM7E,KAClE8E,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,MAAIC,UAAWk3C,IAAW,qBAAsB,CAAC0tM,QAAkB,YAAT3pP,EAAoBmqP,QAAS76O,KAAS0D,GAC/F1D,GAAQxK,IAAAA,cAAC6G,EAAAA,EAAQ,CAACzH,QAASoL,IAC3B46O,GACGplP,IAAAA,cAAA,OAAKC,UAAU,wBACV6kP,GACG9kP,IAAAA,cAACykP,EAAmB,CAChB/hG,OAAQoiG,EACRJ,YAAY,gBAGnBK,GACG/kP,IAAAA,cAACykP,EAAmB,CAChB/hG,OAAQqiG,EACRL,YAAY,kBAGnBM,GACGhlP,IAAAA,cAACykP,EAAmB,CAChB/hG,OAAQsiG,EACRN,YAAY,iBAGnBO,GACGjlP,IAAAA,cAACykP,EAAmB,CAChB/hG,OAAQuiG,EACRP,YAAY,gBAOnCS,GACGnlP,IAAAA,cAAA,UACIC,UAAU,yCACVqP,QAAS41O,EACT,aAAY37O,EAAKC,cAAc,CAC3BzS,GAAI,wBACJ0S,eAAgB,oBAGpBzJ,IAAAA,cAAA,KAAGC,UAAU,qBAGnB,EAEZg0H,EAAA5rH,UAAA,CAtFE6F,MAAKpI,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,UAAAC,WACLyE,KAAI1E,IAAAA,OAKJ5K,KAAI4K,IAAAA,MAAA,CAAG,OAAS,UAAY,SAAW,UAAY,UAAY,SAC/DyoF,cAAazoF,IAAAA,KACbo/O,eAAcp/O,IAAAA,MAgFlB,S,qGC1FA,MAAMwuG,EAA2C50G,IAC7C,MAAMi0L,EAAc3zL,IAAAA,cAAA,KAAGC,UAAS,GAAAU,OAAKjB,EAAMO,WAAa,GAAE,mCAE1D,IAAKP,EAAM60G,YACP,OAAOo/E,EAGX,MAAM2xD,EACFtlP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,sCAIvB,OACIzJ,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOo3O,GAEN3xD,EACS,EAEpBr/E,EAAAjsG,UAAA,CAzBEpI,UAAS6F,IAAAA,OACTyuG,YAAWzuG,IAAAA,MA0Bf,S,yHCbA,MAAMkoN,EAAuBtuN,IACzB,MAAM6J,GAAOiQ,EAAAA,EAAAA,WAEPm6K,EACF3zL,IAAAA,cAAA,KACIC,UAAWk3C,IAAW,oCAAqCz3C,EAAMO,WACjE,aAAYP,EAAM0a,WAAa7Q,EAAKC,cAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,0BAC3GqD,KAAMpN,aAAK,EAALA,EAAOoN,OAIrB,OAAKpN,EAAM60G,YAKPv0G,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOxO,EAAMwO,OAAS3E,EAAKC,cAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,gCAE9FkqL,GAPEA,CAQO,EAEpBq6B,EAAA3lN,UAAA,CA9BE6F,MAAKpI,IAAAA,OAIL7F,UAAS6F,IAAAA,OACTyuG,YAAWzuG,IAAAA,MA2Bf,S,2GCvCO,IAAKu7I,EAAkB,SAAlBA,GAAkB,OAAlBA,EAAkB,oBAAlBA,EAAkB,kBAAlBA,EAAkB,0BAAlBA,EAAkB,yBAAlBA,CAAkB,MAYvB,MAAMD,EAAcjpJ,IAAwD,IAAvD,SAACk8D,EAAQ,QAAEgzB,GAA0BlvF,EAC7D,OACI6H,IAAAA,cAAA,QACIC,UAAWk3C,IAAW,eAAgB,CAClC,yBAA0BkwC,IAAYg6D,EAAmBkkG,SACzD,wBAAyBl+J,IAAYg6D,EAAmBC,QACxD,6BAA8Bj6D,IAAYg6D,EAAmBmkG,YAC7D,+BAAgCn+J,IAAYg6D,EAAmBE,iBAGlEltF,EACE,EAEb+sF,EAAA/4I,UAAA,CAjBEg/E,QAAOvhF,IAAAA,MAAA,iDACPuuD,SAAQvuD,IAAAA,KAAAC,W,4qBCOZ,MAAM0/O,EAAiB,GAoFhB,MAAM7xG,UAAuB5zI,IAAAA,cAKhCsC,WAAAA,CAAY5C,GAAc,IAAAgmP,EAAAC,EACtBpjP,MAAM7C,GAAO8C,EAAA,qBALM,GAACA,EAAA,gBACP,GAAKA,EAAA,eACkB,MAAIA,EAAA,4BA2BrBkwI,GACZA,GAAcA,EAAWrkI,OAASqkI,EAAWpkI,SACvD9L,EAAA,qBAEc,CAAC6L,EAAeC,IACpBD,EAAQo3O,GAAkBn3O,EAASm3O,IAC7CjjP,EAAA,mBAEaqV,IACV,GAAInV,KAAKi6G,QAAS,CACd,MAAMq1C,EAAQn6I,EAAM2iD,OACdorL,EAAeljP,KAAKkjP,aAAa5zF,EAAM6zF,aAAc7zF,EAAM8zF,eACjEpjP,KAAKgH,SAAS,CACVsO,QAAQ,EACRthB,OAAO,EACPkvP,eACAG,WAAY/zF,EAAM6zF,eACnB,KACKnjP,KAAKhD,MAAMm0I,eAAiBme,EAAM8zF,eAClCpjP,KAAKhD,MAAMm0I,cAAc,CAACvlI,OAAQ0jJ,EAAM8zF,cAAez3O,MAAO2jJ,EAAM6zF,cACxE,GAER,KACHrjP,EAAA,oBAEa,KACNE,KAAKi6G,UACDj6G,KAAKhD,MAAMsmP,iBACXtjP,KAAKhD,MAAMsmP,kBAEftjP,KAAKgH,SAAS,CAAChT,OAAO,IAC1B,IACH8L,EAAA,yBAEmBrD,IAAoC,IAAA8mP,EAAA17G,EAClC,QAAlB07G,GAAA17G,EAAA7nI,KAAKhD,OAAM4P,eAAO,IAAA22O,GAAlBA,EAAA/0O,KAAAq5H,EAAqBprI,EAAGuD,KAAKhD,MAAM6O,IAAI,IAC1C/L,EAAA,uBAEiBrD,IACS,IAAA+mP,EAAA/pD,EAAT,UAAVh9L,EAAEzB,MACgB,QAAlBwoP,GAAA/pD,EAAAz5L,KAAKhD,OAAM4P,eAAO,IAAA42O,GAAlBA,EAAAh1O,KAAAirL,EAAqBh9L,EAAGuD,KAAKhD,MAAM6O,KACvC,IACH/L,EAAA,kCAE2B,IACnBE,KAAKpK,MAAM0f,SAAUtV,KAAKhD,MAAMq0I,YAAerxI,KAAKpK,MAAM5B,MASxD,KAPCsJ,IAAAA,cAAA,OAAKoN,MAAO,CAACy5C,SAAU,WAAYS,IAAK,MAAO5G,UAAW,wBAAyBsO,KAAM,QACrFhvD,IAAAA,cAAC+jJ,EAAAA,EAAmB,CAChB96C,eAAgB,2BAMnCzmG,EAAA,yCAEkC,KAAM,IAAA2jP,EACrC,MAAA/oD,EAQI16L,KAAKhD,OARH,SACF6Y,EAAQ,WACRm6H,EAAU,IACVnkI,EAAG,QACHwkI,EAAO,iBACPvB,EAAgB,KAChBjoI,GAEH6zL,EADM19L,E,qWAAKmgD,CAAAu9I,EAAAt9I,GAEZ1oB,QAAQC,eAAe33B,EAAO,cAC9B03B,QAAQC,eAAe33B,EAAO,iBAC9B03B,QAAQC,eAAe33B,EAAO,mBAC9B03B,QAAQC,eAAe33B,EAAO,cAC9B03B,QAAQC,eAAe33B,EAAO,6BAC9B03B,QAAQC,eAAe33B,EAAO,oBAC9B03B,QAAQC,eAAe33B,EAAO,WAC9B03B,QAAQC,eAAe33B,EAAO,iBAC9B03B,QAAQC,eAAe33B,EAAO,qBAC9B03B,QAAQC,eAAe33B,EAAO,QAE9B,IAOI0mP,EAPAj1G,EAAiB5nI,EAAKC,cAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,mBACtF8O,IACA44H,GAAkB,IAAAxwI,OAAI4X,EAASpY,MAAO8C,gBAGzBsqI,EAAAA,EAAAA,IAA+B,QAApB44G,EAAC5tO,aAAQ,EAARA,EAAU00H,iBAAS,IAAAk5G,EAAAA,EAAI,MAGnCvvO,EAAAA,GAAUo3H,MACvBo4G,EAA+B,CAC3B/3O,OAAOqkI,aAAU,EAAVA,EAAYrkI,QAASo3O,EAC5Bn3O,OAAQ,SAIhB,MAAM0jJ,EACFhyJ,IAAAA,cAAA,MAAAI,OAAAC,OAAA,GACQX,EAAK,CACT,aAAYyxI,EACZ37E,SAAU,EACVlmD,QAAS5M,KAAK4rI,iBACd33D,UAAWj0E,KAAK2jP,eAChBpmP,UACIyC,KAAKhD,MAAMO,WACVyC,KAAKhD,MAAMs0I,2BACRtxI,KAAKpK,MAAMstP,aAAe,iCAAmC,IACrEr3O,IAAKA,EACLoI,QAASjU,KAAK4jP,YACd16F,OAAQlpJ,KAAK6jP,WACbn5O,MAAOg5O,KAQTI,EAAsB9jP,KAAKpK,MAAMmuP,mBACnCzmP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,wCACJ0S,eAAgB,WAGpBzJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,sCACJ0S,eAAgB,cAGlBqtI,EACF92I,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOs4O,GAEPxmP,IAAAA,cAAA,UACIC,UAAWk3C,IAAW,cAAe,8BAA+B,CAChE,+CAAgDz0C,KAAKpK,MAAMmuP,qBAE/D,aAAYl9O,EAAKC,cAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,cAC3F6F,QAAS5M,KAAKgkP,iBAEbhkP,KAAKpK,MAAMmuP,mBACRzmP,IAAAA,cAACk9E,EAAAA,UAAS,CACNj9E,UAAW,wBACXa,KAAM,KAGVd,IAAAA,cAAC63E,EAAAA,gBAAe,CACZ53E,UAAW,cACXa,KAAM,OAOpB6lP,EACF3mP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,aAGjBqlI,EACF9uI,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOy4O,GAEP3mP,IAAAA,cAAA,KACIw6D,OAAO,SACPo0E,IAAI,sBACJz4F,KAAMzzC,KAAKkkP,gBAAkB7zG,EAAUxkI,EACvCtO,UAAU,yCACV6uI,UAAU,EACVhiI,KAAMpK,KAAKkkP,gBAAkB,cAAW5rP,EACxC,aAAYuO,EAAKC,cAAc,CAACzS,GAAI,qCAAsC0S,eAAgB,cAE1FzJ,IAAAA,cAACqpO,EAAAA,oBAAmB,CAChBppO,UAAW,cACXa,KAAM,OAMtB,GAAI4B,KAAKhD,MAAMs0I,2BAA6BtxI,KAAKpK,MAAMstP,aAAc,CACjE,IAAI3lP,EAAY,sDACZyC,KAAKpK,MAAMytP,WAAaN,IACxBxlP,GAAa,sCAIjB,MAAM4mP,EAA0B,GAAKnkP,KAAKpK,MAAMytP,WAAcN,EAOxDqB,EAAqBt1G,EAAmB,EAAI,EAG5Cu1G,EAAsBrkP,KAAKpK,MAAMytP,WArTP,IAqT0D,GAAK,EAGzFiB,EAAYtkP,KAAKpK,MAAMytP,WAAaN,EAAiB,CACvDz2L,KAAM,OAAFruD,OAASkmP,GAA0BC,EAAqBC,GAAoB,oBAAApmP,OAAmB,IAAMmmP,EAAqBC,GAAoB,QAClJ,CAAC,EAECE,EAAsBvkP,KAAKpK,MAAMytP,WAAaN,EAAiB,CACjEp3O,MAAO3L,KAAKpK,MAAMytP,WAAa,GAC/B,CAAC,EACL,OACI/lP,IAAAA,cAAA,OACIC,UAAU,uCAEVD,IAAAA,cAAA,OACIsP,QAAS5M,KAAK4rI,iBACdruI,UAAWk3C,IAAWl3C,GACtBmN,MAAO65O,GAENj1F,GAELhyJ,IAAAA,cAAA,QACIC,UAAWk3C,IAAW,0CAA2C,uDAAwD,CACrH,uEAAwEq6F,IAE5EpkI,MAAO45O,GAENx1G,GAAoBsF,EACpBhI,GAIjB,CAGA,MAAMo4G,EAAwBxkP,KAAKhD,MAAMu0I,eAAkBvxI,KAAKpK,MAAMstP,eAAiBljP,KAAKkkP,gBAAmB,KAEvG5mP,IAAAA,cAAA,QACIC,UAAWk3C,IAAW,0CAA2C,CAG7D,uDAAwDz0C,KAAKpK,MAAMytP,WA9V/C,IA+VpB,wEAAyEv0G,IAAqB9uI,KAAKkkP,kBAAoBlkP,KAAKpK,MAAMytP,WA/V9G,QAkWtBv0G,IAAqB9uI,KAAKkkP,kBAAoB9vG,EAC/ChI,GAGb,OACI9uI,IAAAA,cAAA,UAAQC,UAAWk3C,IAAW,2BACzB66G,EACAk1F,EACI,IAEhB1kP,EAAA,8BAEuB,KACpB,MAAM,WACFkwI,EAAU,SACVn6H,GACA7V,KAAKhD,MAET,IAKI42J,EALAnlB,EAAiBzuI,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,mBAOrG,GANI8O,IACA44H,GAAkB,IAAAxwI,OAAI4X,EAASpY,MAAO8C,eAKtCP,KAAKykP,oBAAoBz0G,KAAgBhwI,KAAKpK,MAAM0f,OAAQ,KAAAovO,EAAAC,EAAAC,EAAAC,EAC5D,MAAMC,GAA2B,QAAnBJ,EAAC10G,aAAU,EAAVA,EAAYpkI,cAAM,IAAA84O,EAAAA,EAAI,GA3XxB,SA2XsF,QAAtBC,EAAI30G,aAAU,EAAVA,EAAYpkI,cAAM,IAAA+4O,EAAAA,EAAI,GAAK,EACtG/4O,GAA4B,QAAnBg5O,EAAC50G,aAAU,EAAVA,EAAYpkI,cAAM,IAAAg5O,EAAAA,EAAI,GAAKE,EACrCn5O,GAA0B,QAAlBk5O,EAAC70G,aAAU,EAAVA,EAAYrkI,aAAK,IAAAk5O,EAAAA,EAAI,GAAKC,EAEnCC,GAAcC,EAAAA,EAAAA,IAAsBnvO,GAGtC+9I,EADAmxF,EAEIznP,IAAAA,cAAA,OACIC,UAAS,4BAAAU,OAA8B+B,KAAKhD,MAAMO,WAClDmN,MAAO,CAAC2mE,SAAU2+D,aAAU,EAAVA,EAAYrkI,QAE9BrO,IAAAA,cAAA,OACI,aAAYmxI,EACZlxI,UAAWyC,KAAKhD,MAAMO,UACtBsO,IAAKk5O,EACLjyL,SAAU,EACVlnD,OAAQA,EACRD,MAAOA,KAMfrO,IAAAA,cAAA,OACIC,UAAS,4BAAAU,OAA8B+B,KAAKhD,MAAMO,WAClDmN,MAAO,CAAC2mE,SAAU1lE,IAEjB3L,KAAKilP,4BACN3nP,IAAAA,cAAA,OACIqgD,MAAM,6BACNF,QAAO,OAAAx/C,OAAS0N,EAAK,KAAA1N,OAAI2N,GACzBlB,MAAO,CAACmmE,UAAWjlE,EAAQylE,SAAU1lE,EAAOu5O,cAAe,YAK/E,CAEA,MAAMC,GAAiBnlP,KAAKykP,oBAAoBz0G,IAAehwI,KAAKpK,MAAM0f,OAE1E,OACIhY,IAAAA,cAAAA,IAAAA,SAAA,KACKs2J,EACDt2J,IAAAA,cAAA,OACIC,UAAU,uBACVmN,MAAO,CAACu8F,QAASk+I,EAAgB,eAAiB,SAEjDnlP,KAAKolP,oCAEX,IAEVtlP,EAAA,4BAE0CxH,IAAxB0H,KAAKhD,MAAM6Y,UAAoD,OAAxB7V,KAAKhD,MAAM6Y,UAAkB/V,EAAA,uBAEtE,KAEbE,KAAKgH,SAAS,CAAC+8O,oBAAoB,IAC/B/jP,KAAKwyB,SACLqgB,aAAa7yC,KAAKwyB,SAEtBxyB,KAAKwyB,QAAUjK,YAAW,KACtBvoB,KAAKgH,SAAS,CAAC+8O,oBAAoB,EAAOsB,oBAAoB,GAAO,GACtE,KAAK,IACXvlP,EAAA,wBAEiBjM,UAEd,IAAsC,IAAlCmM,KAAKpK,MAAMyvP,mBAA6B,CAKb,IAAAC,EAA3B,GAHAtlP,KAAKgH,SAAS,CAACq+O,oBAAoB,KAG9BrlP,KAAKkkP,gBAGN,OAFA9gI,EAAAA,EAAAA,IAA8B,QAAfkiI,EAACtlP,KAAKhD,MAAM6O,WAAG,IAAAy5O,EAAAA,EAAI,SAClCtlP,KAAKulP,iBAKT,GAAIvlP,KAAKhD,MAAM+yI,kBAAmB,KAAAy1G,EAC9B,MACMn1G,EAAmB,QAAZm1G,SADWxlP,KAAKhD,MAAM+yI,qBACd97I,YAAI,IAAAuxP,OAAA,EAATA,EAAWtwK,MAC3BkuC,EAAAA,EAAAA,IAAgBitB,QAAAA,EAAW,IAC3BrwI,KAAKulP,gBACT,CACJ,KAzXA,MAAOv1G,WAAAA,GAAchzI,EAErBgD,KAAKpK,MAAQ,CACT0f,QAAQ,EACR4tO,eAAcljP,KAAKykP,oBAAoBz0G,IAAchwI,KAAKkjP,aACrC,QADiDF,EAClEhzG,aAAU,EAAVA,EAAYrkI,aAAK,IAAAq3O,EAAAA,EAAI,EAAqB,QAApBC,EAAEjzG,aAAU,EAAVA,EAAYpkI,cAAM,IAAAq3O,EAAAA,EAAI,GAClDc,oBAAoB,EACpBsB,oBAAoB,EACpBrxP,OAAO,EACPqvP,WAAY,GAGhBrjP,KAAKylP,cAAgB,CACzB,CAEAltM,iBAAAA,GACIv4C,KAAKi6G,SAAU,CACnB,CAEA38C,oBAAAA,GACIt9D,KAAKi6G,SAAU,CACnB,CAuWAh3G,MAAAA,GACI,OACIjD,KAAK0lP,uBAEb,EAGJ,SAAe54O,EAAAA,EAAAA,YAAWokI,E,gJCvepB7kI,EAAgB5W,IAKT,IALU,SACnB6W,GAAW,EAAK,aAChBC,EAAY,SACZolD,GAEIl8D,EADDuH,E,qWAAKmgD,CAAA1nD,EAAA2nD,GAER,OACI9/C,IAAAA,cAAA,SAAAI,OAAAC,OAAA,CACIgH,SAAU2H,GACNtP,GAEJM,IAAAA,cAACs1K,EAAAA,EAAc,CACXtpK,QAASgD,EACTxE,KAAMyE,GAELolD,GAEA,EAGjB,EAAer0D,IAAAA,KAAW+O,E,oUCzB1B,MAAMs5O,EAAqClwP,IAAA,IAAC,OAACmW,EAAS,IAAG,MAAED,EAAQ,KAAclW,EAAA,OAC7E6H,IAAAA,cAAA,OACIqO,MAAOA,EAAMrK,WACbsK,OAAQA,EAAOtK,WACfm8C,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAENrgD,IAAAA,cAAA,KAAGuiH,SAAS,yBACRviH,IAAAA,cAAA,QACI4gD,EAAE,6bACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,uIACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,qEACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kEACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mEACFR,KAAK,YAETpgD,IAAAA,cAAA,KAAGuiH,SAAS,yBACRviH,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,UACPoyC,UAAU,6BACVN,KAAK,UAETpgD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP8xC,KAAK,YAETpgD,IAAAA,cAAA,WACIuhD,QAAQ,OACRhB,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,SACHhB,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,WACIuhD,QAAQ,OACRhB,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,WACIuhD,QAAQ,OACRhB,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,WACIuhD,QAAQ,OACRhB,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,WACIuhD,QAAQ,OACRhB,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,WACIuhD,QAAQ,OACRhB,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,WACIuhD,QAAQ,OACRhB,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,WACIuhD,QAAQ,OACRhB,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,SACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,WACIuhD,QAAQ,OACRhB,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,OACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,SACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,SACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,WACIugD,GAAG,QACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,WACIugD,GAAG,SACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,UACHd,KAAK,UACLO,YAAY,UAGpB3gD,IAAAA,cAAA,QACI4gD,EAAE,ofACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oIACFR,KAAK,aAGbpgD,IAAAA,cAAA,KAAGuiH,SAAS,yBACRviH,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,UACHd,KAAK,YAETpgD,IAAAA,cAAA,QACIwhD,SAAS,UACTC,SAAS,UACTb,EAAE,goBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,wNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oOACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oDACFR,KAAK,UAETpgD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,SACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,SACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,SACNC,OAAO,UACP8xC,KAAK,YAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,MACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,WACHd,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,MACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,IACHd,KAAK,UAETpgD,IAAAA,cAAA,QACIuhD,QAAQ,MACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP4yC,GAAG,IACHd,KAAK,WAGbpgD,IAAAA,cAAA,YACIA,IAAAA,cAAA,YAAUjJ,GAAG,mBACTiJ,IAAAA,cAAA,QACIqO,MAAM,MACNC,OAAO,MACP8xC,KAAK,WAGbpgD,IAAAA,cAAA,YAAUjJ,GAAG,mBACTiJ,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,UACP8xC,KAAK,QACLM,UAAU,gCAGlB1gD,IAAAA,cAAA,YAAUjJ,GAAG,mBACTiJ,IAAAA,cAAA,QACIqO,MAAM,KACNC,OAAO,MACP8xC,KAAK,QACLM,UAAU,wBAIpB,EAER2nM,EAAAhgP,UAAA,CApmBEiG,OAAMxI,IAAAA,OACNuI,MAAKvI,IAAAA,QAqmBT,UC5lBA,SAASwiP,EAAcnwP,GAAmB,IAAlB,QAACqmF,GAAermF,EACpC,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClB+uO,EACFvoP,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,+BACTgkC,KAAK,iCAEJ,iCAGT,OACIn2C,IAAAA,cAACyM,EAAAA,MAAK,CACFxM,UAAW,iBACXyM,gBAAiB,yBACjBb,MAAM,EACN9U,GAAG,iBACH+V,KAAK,OACLH,OAAQA,IAAM6xE,aAAO,EAAPA,KAEdx+E,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAAA,OAAKC,UAAU,SACVuJ,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,0BAGtEzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,OAAKC,UAAU,QACXD,IAAAA,cAAA,OAAKC,UAAU,eAEPuJ,EACI,CACIzS,GAAI,+BACJ0S,eAAgB,qEAEpB,CACImuE,KAAM2wK,KAKtBvoP,IAAAA,cAAA,OAAKC,UAAU,QACXD,IAAAA,cAACqoP,EAAkC,CAC/Bh6O,MAAO,IACPC,OAAQ,QAIpBtO,IAAAA,cAAA,OAAKC,UAAU,WACXD,IAAAA,cAACorK,EAAAA,OAAM,CACHnrK,UAAU,cACVqP,QAASA,IAAMkvE,aAAO,EAAPA,KAEdh1E,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,aAMtF,CAAC6+O,EAAAjgP,UAAA,CA5DGm2E,QAAO14E,IAAAA,MA8DX,U,0BCpDe,SAAS0iP,EAAY9oP,GAChC,MAAM,KACFK,EAAI,MACJrJ,EAAK,oBACL+xP,EAAmB,2BACnBC,EAA0B,eAC1BC,EAAc,kBACdC,EAAiB,kBACjBC,EAAiB,cACjBC,EAAa,sBACbC,EAAqB,OACrBrgJ,EAAM,OACNktB,EAAM,UACN31H,GACAP,EAEJ,IAAIgjJ,EAAS,KACT+lG,GAAuBK,IACvBpmG,EACI1iJ,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,qBAAsBzgD,EAAQ,QAAU,KAC/DsJ,IAAAA,cAAA,UACIC,UAAU,2BACVqP,QAASw5O,GAERL,KAMjB,IAAIO,EAAc,KACdN,GAA8BK,IAC9BC,EACIhpP,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,8BAA+BzgD,EAAQ,QAAU,KACxEsJ,IAAAA,cAAA,UACIC,UAAU,eACVqP,QAASy5O,GAERL,KAMjB,IAAI9wK,EAAO,KACPixK,IACAjxK,EACI53E,IAAAA,cAAA,OAAKC,UAAU,oBACV4oP,IAIb,MAAMI,EAAuC,CAAC,EAK9C,OAJIrzH,IACAqzH,EAAW,eAAiBrzH,GAI5B51H,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACItJ,GAAG,0BACHkJ,UAAU,eACNgpP,GAEJjpP,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,UAAWl3C,GAAa,KAC/CD,IAAAA,cAAA,OAAKC,UAAU,4BACVF,GAELC,IAAAA,cAAA,MAAIC,UAAU,kBACT0oP,GAAkB,MAEvB3oP,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,kBAAmBzgD,GAAS,KAClDkyP,GAAqB,MAE1B5oP,IAAAA,cAAA,OAAKC,UAAU,uBACV+oP,EACAtmG,GAEJ9qE,EACA8wB,GAIjB,C,SAAC8/I,EAAAngP,UAAA,CAhGGtI,KAAI+F,IAAAA,QAAAC,WACJrP,MAAKoP,IAAAA,KACL2iP,oBAAmB3iP,IAAAA,QACnB+iP,kBAAiB/iP,IAAAA,KACjB4iP,2BAA0B5iP,IAAAA,QAC1B6iP,eAAc7iP,IAAAA,QACd8iP,kBAAiB9iP,IAAAA,KACjBgjP,cAAahjP,IAAAA,KACbijP,sBAAqBjjP,IAAAA,KACrB4iG,OAAM5iG,IAAAA,QACN8vH,OAAM9vH,IAAAA,OACN7F,UAAS6F,IAAAA,QAuFb0iP,EAAY/5H,aAAe,CACvB/3H,OAAO,EACPm0K,SAAU,GACV19E,KAAM,GACNltF,UAAW,I,uBCzGA,SAASipP,EAASxpP,GAC7B,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,eAErEzJ,IAAAA,cAAA,QAAM4gD,EAAE,4EAIxB,C,waCMA,MAAMuoM,UAAwBnpP,IAAAA,cAA2BsC,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,aACrCxC,IAAAA,aAAiCwC,EAAA,qBAa3B,KAClByoB,YAAW,KACP,MAAMm+N,EAAuBlnP,SAAS+8D,cAClCv8D,KAAKs+E,OAASt+E,KAAKs+E,MAAMvuE,UAAY/P,KAAKs+E,MAAMvuE,QAAQorD,SAASurL,IACjE1mP,KAAKs+E,MAAMvuE,QAAQiP,OACvB,GACF,IACLlf,EAAA,uBAEyBrD,IACtB,QAA8BnE,IAA1B0H,KAAKhD,MAAM2pP,YAA4B3mP,KAAKhD,MAAM2pP,YAAwB,WAAVlqP,EAAEzB,IAClE,OAGJ,MAAM0rP,EAAuBlnP,SAAS+8D,eACjCv8D,KAAKhD,MAAM4pP,qBAAiC,WAAVnqP,EAAEzB,KAAoBgF,KAAKhD,MAAMmM,MAAQ1M,EAAEq7D,QAAU93D,KAAKs+E,MAAMvuE,SAAW/P,KAAKs+E,MAAMvuE,QAAQorD,SAASurL,IAC1I1mP,KAAKwxB,QAELxxB,KAAKhD,MAAM4pP,qBAAiC,WAAVnqP,EAAEzB,KAAoBgF,KAAKhD,MAAMmM,MACnEnJ,KAAKwxB,OACT,IACH1xB,EAAA,cAEe,KACZE,KAAKhD,MAAM8+E,SAAS,GACvB,CApCMvjC,iBAAAA,GACH/4C,SAASq7D,iBAAiB,UAAW76D,KAAK6mP,gBAC1CrnP,SAASq7D,iBAAiB,QAAS76D,KAAKuX,aAAcvX,KAAKhD,MAAM4pP,qBACjE5mP,KAAKuX,cACT,CAEO+lD,oBAAAA,GACH99D,SAASu7D,oBAAoB,UAAW/6D,KAAK6mP,gBAC7CrnP,SAASu7D,oBAAoB,QAAS/6D,KAAKuX,aAAcvX,KAAKhD,MAAM4pP,oBACxE,CA6BO3jP,MAAAA,GACH,OACI3F,IAAAA,cAACsvD,EAAAA,EAAa,CACV3hD,GAAIjL,KAAKhD,MAAMmM,KACfsrC,WAAW,kBACXwzF,cAAc,EACdC,eAAe,EACf11G,QA9DW,IA+DXs0N,QAAQ,GAERxpP,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OACIC,UAAU,kBACV26C,IAAKl4C,KAAKs+E,MACVxrB,UAAW,EACX,cAAY,EACZ,aAAY9yD,KAAKhD,MAAM0a,UACvB,kBAAiB1X,KAAKhD,MAAM+pP,eAC5B38O,KAAK,QAEJpK,KAAKhD,MAAMgqP,UACR1pP,IAAAA,cAAA,UACIsP,QAAS5M,KAAKhD,MAAMgqP,SACpBzpP,UAAU,OACV,aAAYyC,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,UAEzFzJ,IAAAA,cAACkpP,EAAQ,CAACnyP,GAAG,cAErBiJ,IAAAA,cAAA,UACIsP,QAAS5M,KAAKwxB,MACdj0B,UAAU,UACV,aAAYyC,KAAKhD,MAAM6J,KAAKC,cAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,WAE1FzJ,IAAAA,cAAC8nF,EAAAA,EAAS,CAAC/wF,GAAG,eAEjB2L,KAAKhD,MAAM20D,UAEhBr0D,IAAAA,cAAA,OACIw1D,SAAU,EACVpoD,MAAO,CAACu8F,QAAS,WAKrC,EACHnnG,EAtFK2mP,EAAe,aAXjBt9O,KAAI/F,IAAAA,KAAAC,WACJy4E,QAAO14E,IAAAA,KAAAC,WACP2jP,SAAQ5jP,IAAAA,KACRuuD,SAAQvuD,IAAAA,KAAAC,WACRqU,UAAStU,IAAAA,OACT2jP,eAAc3jP,IAAAA,OACdyD,KAAIzD,IAAAA,IAAAC,WACJujP,oBAAmBxjP,IAAAA,KACnBujP,WAAUvjP,IAAAA,OA2Fd,MAAMi7D,GAAmBvxD,EAAAA,EAAAA,YAAW25O,EAAiB,CAACnoL,YAAY,IAClED,EAAiBv6D,YAAc,8BAC/Bu6D,EAAiB0tD,aAAe,CAC5B66H,qBAAqB,GAEzB,UCvFe,SAASK,EAAWxxP,GAAyJ,IAAxJ,KAAC+C,EAAI,KAAE6E,EAAI,MAAEmO,EAAK,SAAE28J,EAAQ,kBAAE++E,EAAiB,qBAAEC,EAAoB,WAAEtZ,EAAU,4BAAEuZ,EAA2B,WAAEC,EAAU,WAAEV,EAAU,OAAE18O,GAAcxU,EACtL,MAAM9B,GAAWsxD,EAAAA,EAAAA,gBAEVqiM,GC1BJ,SAAwCC,GAC3C,MAAMh0O,GAAW8gC,EAAAA,EAAAA,aAAY7gC,EAAAA,IACvB6qG,GAAgB9qG,aAAQ,EAARA,EAAU9c,QAAS,GAEnC4H,GAAMmpP,EAAAA,EAAAA,IAAoBnpI,EAAekpI,EDsBiC,GCtBXv4O,OAAOS,SAAS2oB,MAMrF,MAAO,EAJoBrhB,EAAAA,EAAAA,cACvB,KAAM0wO,EAAAA,EAAAA,IAAqBppI,EAAekpI,EDmBkC,GCnBZv4O,OAAOS,SAAS2oB,OAChF,CAACimF,EAAekpI,EDkB4D,KChBpDlpP,EAChC,CDeiCqpP,CAA+B,oBAEtDC,GAAoBtzM,EAAAA,EAAAA,cAAaz+C,IACnC8gG,EAAAA,EAAAA,GAAY9gG,EAAOi4O,KAGjB5lO,EAAaA,KACftU,GAASomG,EAAAA,EAAAA,GAAW8zI,IACpB5jO,SAAAA,GAAU,EAGR29O,EAAY,kCAAH3pP,OAAqCopP,GACpD,MAAa,UAAT7uP,EAEI8E,IAAAA,cAACyM,EAAAA,MAAK,CACFxM,UAAU,qBACV4L,KAAMw+O,EACN19O,OAAQhC,GAER3K,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,IAC3BnN,IAAAA,cAAA,OAAKC,UAAWqqP,GACZtqP,IAAAA,cAACwoP,EAAW,CACRG,eAAgBz6O,EAChB06O,kBAAmB/9E,EACnBn0K,OAAO,EACPqJ,KAAMA,EACN0oP,oBAAqBmB,EACrBd,cAAee,EACf5pP,UAAW,UACXyoP,2BACIoB,EACI9pP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,2DACJ0S,eAAgB,yBAEpBzO,EAER+tP,sBAAuBe,EAA8BE,OAAqBhvP,MAQ1FgF,IAAAA,cAACmpP,EAAe,CACZt9O,KAAMw+O,EACN7rK,QAAS7zE,EACT0+O,WAAYA,GAEZrpP,IAAAA,cAAA,OAAKC,UAAWqqP,GACZtqP,IAAAA,cAACwoP,EAAW,CACRG,eAAgBz6O,EAChB06O,kBAAmB/9E,EACnBn0K,OAAO,EACPqJ,KAAMA,EACN0oP,oBAAqBmB,EACrBd,cAAee,EACf5pP,UAAW,UACXyoP,2BACIoB,EAEI9pP,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,2DACJ0S,eAAgB,yBACdzO,EAEd+tP,sBAAuBe,EAA8BE,OAAqBhvP,KAK9F,CAAC2uP,EAAAthP,UAAA,CAxFGnN,KAAI4K,IAAAA,OACJ6G,OAAM7G,IAAAA,KACN/F,KAAI+F,IAAAA,QAAAC,WACJmI,MAAKpI,IAAAA,QAAAC,WACL8kK,SAAQ/kK,IAAAA,QAAAC,WACR6jP,kBAAiB9jP,IAAAA,QAAAC,WACjB8jP,qBAAoB/jP,IAAAA,KAAAC,WACpBwqO,WAAUzqO,IAAAA,OAAAC,WACV+jP,4BAA2BhkP,IAAAA,KAC3BikP,WAAUjkP,IAAAA,OAAAC,WACVsjP,WAAUvjP,IAAAA,KAAAC,YEpBd,MAAM68G,EAAOljH,IAAe,IAAA2iH,EAAAC,EAAA,OACxBtiH,IAAAA,cAAA,OACIqO,OAAkB,QAAXg0G,EAAA3iH,EAAM2O,aAAK,IAAAg0G,OAAA,EAAXA,EAAar+G,aAAc,MAClCsK,QAAoB,QAAZg0G,EAAA5iH,EAAM4O,cAAM,IAAAg0G,OAAA,EAAZA,EAAct+G,aAAc,MACpCm8C,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAENrgD,IAAAA,cAAA,QACI4gD,EAAE,+bACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oIACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oEACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oEACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oEACFR,KAAK,YAETpgD,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,UACPoyC,UAAU,6BACVN,KAAK,UAETpgD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,MACNC,OAAO,KACP8xC,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,0eACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oIACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,0MACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gSACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,ukBACFR,KAAK,YAEP,EACRwiE,EAAAv6G,UAAA,CAnEEgG,MAAKvI,IAAAA,OACLwI,OAAMxI,IAAAA,QAoEV,UCtDe,SAASykP,EAA0B7qP,GAC9C,MAAMrJ,GAAWsxD,EAAAA,EAAAA,eAEX6iM,EAAoBA,KAAM,IAAAC,EACZ,QAAhBA,EAAA/qP,EAAMgrP,kBAAU,IAAAD,GAAhBA,EAAAv5O,KAAAxR,GACArJ,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiB43O,+BAA+B,EAGlEz8O,EAAQxO,EAAMwO,OAChBlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbP,eAAgB,mBAChB1S,GAAI,8CAIN8zK,EACF7qK,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,+CACJ0S,eAAgB,sDAEpBzJ,IAAAA,cAAA,WACAA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,gDACJ0S,eAAgB,0CAKtB69K,EAAa5nL,EAAM4nL,YACrBtnL,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wDACH0S,eAAgB,cAIxB,OACIzJ,IAAAA,cAAC2pP,EAAW,CACRC,kBAAmBtiE,EACnBuiE,qBAAsBW,EACtB79O,OAAQ69O,EACRja,WAAYx9N,EAAAA,GAAiB43O,8BAC7B9/E,SAAUA,EACV38J,MAAOA,EACPm7O,YAAY,EACZnuP,KAAK,QACL6uP,WAAW,UACXhqP,KACIC,IAAAA,cAAC4qP,EAAc,CACXv8O,MAAO,IACPC,OAAQ,MAGhBw7O,6BAA6B,GAGzC,CAACS,EAAAliP,UAAA,CA9DGqiP,WAAU5kP,IAAAA,KACVoI,MAAKpI,IAAAA,QACL+kK,SAAQ/kK,IAAAA,QACRwhL,WAAUxhL,IAAAA,SCkBd,MAAM+kP,GAAqBnpL,EAAAA,EAAAA,GAAmB,qBAAsB1hE,IAAAA,MAAW,IAAM,0CAAiE,IAEjJ8qP,EAAe,SAAfA,GAAe,OAAfA,EAAe,yBAAfA,EAAe,kBAAfA,EAAe,kBAAfA,EAAe,gBAAfA,CAAe,EAAfA,GAAe,KAOpB5zL,EAAAA,EAAAA,gBAAe,CACX6zL,UAAW,CACPh0P,GAAI,YACJ0S,eAAgB,QAEpBuhP,aAAc,CACVj0P,GAAI,eACJ0S,eAAgB,UAEpBwhP,mBAAoB,CAChBl0P,GAAI,qBACJ0S,eAAgB,WAEpByhP,qBAAsB,CAClBn0P,GAAI,uBACJ0S,eAAgB,YAEpB0hP,qBAAsB,CAClBp0P,GAAI,uBACJ0S,eAAgB,aAEpB2hP,iCAAkC,CAC9Br0P,GAAI,mCACJ0S,eAAgB,WAIjB,IAAK4hP,EAAO,SAAPA,GAAO,OAAPA,EAAO,iBAAPA,EAAO,sBAAPA,EAAO,6BAAPA,EAAO,gCAAPA,EAAO,iCAAPA,EAAO,yCAAPA,CAAO,MAcnB,SAAS3pI,EAAoBhiH,GACzB,MAAOL,EAAQisP,IAAiB/xO,EAAAA,EAAAA,UAASuxO,EAAgBlsI,YACnDvoH,GAAWsxD,EAAAA,EAAAA,eACX1mB,GAAc8V,EAAAA,EAAAA,aAAYh0B,EAAAA,KACzB5iB,EAAM8zJ,IAAW16I,EAAAA,EAAAA,UAAS,KAC1BpgB,EAAOoyP,IAAYhyO,EAAAA,EAAAA,UAAS0nB,EAAY9nC,QACxCy9C,EAAa40M,IAAkBjyO,EAAAA,EAAAA,UAAS,KACxCkyO,EAASC,IAAcnyO,EAAAA,EAAAA,aACvBu4J,EAAS65E,IAAcpyO,EAAAA,EAAAA,UAAS,KAChCqyO,EAAoBC,IAAyBtyO,EAAAA,EAAAA,eAA6Cve,IAC3F,cAACwO,IAAiBgQ,EAAAA,EAAAA,WAClBsyO,GAAkB9vI,EAAAA,EAAAA,KAClBnwG,GAAOkrC,EAAAA,EAAAA,cAAaz+C,IAAuB8gG,EAAAA,EAAAA,GAAY9gG,EAAOya,EAAAA,GAAiB0uG,0BAC/EznB,GAAaC,EAAAA,EAAAA,IAAuB,IAAS,GAC5C8xJ,EAASC,IAAczyO,EAAAA,EAAAA,WAAS,GAEjC0yO,EAA8B11P,UAChCy1P,GAAW,GACN7yP,QAIyBkb,EAAAA,EAAAA,IAAsBlb,EAAtBkb,GAG1Bw3O,OAAsB7wP,GAI1B6wP,EAAsB,CAClB3wP,KAAM,QACNsI,MAAOgG,EAAc,CAACzS,GAAI,0CAA2C0S,eAAgB,mDAZrFoiP,OAAsB7wP,EAcxB,EAUN,IAPAoqD,EAAAA,EAAAA,YAAU,MACN7mD,EAAAA,EAAAA,IAAWwvF,EAAAA,GAAqB6gF,8BAA+B,eAC3Dz1K,IAAU4yP,GACVE,EAA4B9yP,EAChC,GACD,CAACA,EAAO4yP,KAENlgP,EACD,OAAO,KAGX,MASMqgP,EAA2BA,KAC7B71P,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiB43O,gCACrCW,EAAcR,EAAgBlsI,WAAW,EAkFvCzkB,EAAgBA,KACdz6F,EAAM8+E,SACN9+E,EAAM8+E,WAEVjgF,EAAAA,EAAAA,IAAWwvF,EAAAA,GAAqB6gF,8BAA+B,eAC/Dv4K,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiB0uG,wBAAwB,EAa3D0qI,GACDhsP,IACAhH,IACAy9C,IACA60M,IACA35E,GACDvlK,QAAQq/O,IACRvsP,IAAWyrP,EAAgBjsI,SAC3Bx/G,IAAWyrP,EAAgBhsI,QAG/B,OAAIgtI,IAAoB/vI,EAAAA,EAA0BQ,YAE1Cv8G,IAAAA,cAACsoP,EAAc,CACX9pK,QAAS2b,IAMjBn6F,IAAAA,cAACyM,EAAAA,MAAK,CACFxM,UAAWk3C,IAAW,sBAAuB,CAACzgD,MAAOo0P,EAAgB/rI,SAAW1/G,IAChFqN,gBAAgB,cAChBb,KAAMA,EACN9U,GAAG,sBACH+V,KAAK,OACLH,OAAQwtF,GAERn6F,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAAA,OAAKC,UAAU,SACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+BACH0S,eAAe,iBAGvBzJ,IAAAA,cAAA,OAAKC,UAAU,eACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,sEAI3BzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAC4mH,EAAAA,EAAK,CACF3mH,UAAW,aACXE,KAAK,OACLjF,KAAK,OACLsI,MAAOrD,EACPy5K,UAAWC,EAAAA,EAAKjmJ,MAChBjxB,SAAWxD,GAAM80J,EAAQ90J,EAAEq7D,OAAOh3D,OAClCqyH,UAAU,EACVxxH,YAAamF,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,WAE7EzJ,IAAAA,cAAC4mH,EAAAA,EAAK,CACF3mH,UAAW,cACX+2E,OAAS73E,GAAM8sP,EAA4B9sP,EAAEq7D,OAAOh3D,OACpDrD,KAAK,QACLjF,KAAK,OACLsI,MAAOrK,EACPygL,UAAWC,EAAAA,EAAKjmJ,MAChBjxB,SAAWxD,GAAMosP,EAASpsP,EAAEq7D,OAAOh3D,OACnCqyH,UAAU,EACVxxH,YAAamF,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,mBAC1Eq9G,cAAe8kI,IAEnB5rP,IAAAA,cAAC4mH,EAAAA,EAAK,CACF3mH,UAAW,qBACXE,KAAK,eACLjF,KAAK,OACL0+K,UAAWC,EAAAA,EAAKjmJ,MAChBpwB,MAAOozC,EACPj0C,SAAWxD,GAAMqsP,EAAersP,EAAEq7D,OAAOh3D,OACzCqyH,UAAU,EACVxxH,YAAamF,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,mBAErFzJ,IAAAA,cAAC4xK,EAAAA,EAAa,CACV3xK,UAAW,wBACX0C,SAAWxD,IACPusP,EAAWvsP,EAAEqE,MAAiB,EAElCA,WAzFW,IAAZioP,EACAA,EAEJ,CACHjoP,MAAOioP,EACP7pP,MAAO4H,EAAc,CAACzS,GAAI00P,EAAShiP,eAAgB4hP,EAAQI,MAqFnD1tP,QAASqC,OAAOkJ,QAAQ+hP,GAAShoP,KAAIlL,IAAA,IAAEqL,EAAO5B,GAAMzJ,EAAA,MAAM,CAACqL,QAAO5B,QAAM,IACxE+zH,OAAQnsH,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,iBAC5EpF,YAAamF,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,iBACjFtJ,KAAK,0BAETH,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAC2xK,EAAAA,EAAe,CACZhvK,SAAWxD,GAAMwsP,EAAWxsP,EAAEqE,OAC9BA,MAAOsuK,KAGf9xK,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,yLACfjB,OAAQ,CACJ4jP,UAAYz8O,GACR3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAK,wDACLhkC,SAAS,0BAERxC,GAGT08O,cAAgB18O,GACZ3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAMoC,EAAAA,GAAWG,eACjBvmC,SAAS,0BAERxC,OAMrB3P,IAAAA,cAAA,OAAKC,UAAU,WACXD,IAAAA,cAACorK,EAAAA,OAAM,CACH/jK,SAAU8kP,EACVlsP,UAAU,cACVqP,QAzNG/Y,UACnB+0P,EAAcR,EAAgBjsI,SAC9B,MACMytI,EAAmB,CACrBppP,MAFmBY,KAAKs2D,IAAI4/B,EAAY,IAGxCuyJ,gBAAgB,EAChBC,yBAAyB,EACzBC,aAActsP,EACdusP,cAAevzP,EACfwzP,aAAc/1M,EACdg2M,gBAAiB96E,EACjB+6E,aAAcpB,IAEZ,MAAC/0P,EAAK,KAAEC,SAAcN,GAAS0I,EAAAA,EAAAA,IAAoButP,EAAkB5sP,EAAMT,MAAQ,YACzF,GAAIvI,EAAO,CAEP,IAAIwX,EACA28J,EACAyc,EAHJgkE,EAAcR,EAAgB/rI,QAI9B,IAAI2rI,EAAawB,EAsCjB,OApC6B,MAAxBv1P,EAAa0I,SACd6O,EAASlO,IAAAA,cAAAA,IAAAA,SAAA,MACT6qK,EACI7qK,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,gNACfjB,OAAQ,CACJovE,KAAOptE,GACHxK,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,eACTgkC,KAAMmrE,EAAAA,GAAawrI,qBAElBtiP,MAMrB88K,EACItnL,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+CACH0S,eAAe,UAGvBihP,EAAavwJ,QAEjB9jG,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiB43O,8BAC1B13O,WAAYs3O,EACZr3O,YAAa,CACTw3O,aACAx8O,QACA28J,WACAyc,gBAIZ,CAEAgkE,EAAcR,EAAgBhsI,eACxBzoH,GAAS6jO,EAAAA,EAAAA,OACf7jO,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiB0uG,yBA3ErCprH,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBsmF,qBAC1BpmF,WAAY43O,EACZ33O,YAAa,CAAC65O,kBAAkB,KAyEZ,GAGX1tP,KACb,OAAQA,GACR,KAAKyrP,EAAgBjsI,QACjB,OAAOr1G,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,eAC3E,KAAKqhP,EAAgBhsI,QACjB,OAAOt1G,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,YAC1E,KAAKqhP,EAAgB/rI,OACjB,OAAOv1G,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,WAC1E,QACI,OAAOD,EAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,gBAClF,EA+IiB2nF,CAAQ/xF,MAMjC,CAACqiH,EAAAr5G,UAAA,CAlSGm2E,QAAO14E,IAAAA,KACP7G,KAAI6G,IAAAA,QAmSR,S,0FC/We,SAASknP,EAAqBttP,GACzC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACR/yC,MAAOA,EACPN,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,eAE9EzJ,IAAAA,cAAA,QACIC,UAAU,aACV2gD,EAAE,4yBAKtB,CAEA,MAAMxzC,EAAuB,CACzBo0C,SAAU,UACVC,SAAU,UACVT,eAAgB,QAChBwhE,iBAAkB,SCzBP,SAASyqI,EAAevtP,GACnC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACR/yC,MAAOA,EACPN,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,eAE9EzJ,IAAAA,cAAA,QACIC,UAAU,aACV2gD,EAAE,6YAKtB,CAEA,MAAMxzC,EAAuB,CACzBo0C,SAAU,UACVC,SAAU,UACVT,eAAgB,QAChBwhE,iBAAkB,SC1BP,SAAS0qI,EAAoBxtP,GACxC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACI25B,EAAE,MACFsnB,EAAE,MACF5yC,MAAM,OACNC,OAAO,OACP6xC,QAAQ,iBACR6xI,iBAAiB,qBACjBllL,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,yBAE7EzJ,IAAAA,cAAA,SACIA,IAAAA,cAAA,WACIC,UAAU,YACVsgD,GAAG,SACHC,GAAG,MACHU,GAAG,MACHE,GAAG,QAEPphD,IAAAA,cAAA,QACIC,UAAU,YACV2gD,EAAE,iQAGV5gD,IAAAA,cAAA,QACIC,UAAU,YACV2gD,EAAE,gIAKtB,CCjCe,SAASusM,EAAcztP,GAClC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACR/yC,MAAOA,EACPN,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,yBAE7EzJ,IAAAA,cAAA,QACIC,UAAU,YACV2gD,EAAE,sRAKtB,CAEA,MAAMxzC,EAAuB,CACzBo0C,SAAU,UACVC,SAAU,UACVT,eAAgB,QAChBwhE,iBAAkB,SC1BP,SAAS4qI,EAAwB1tP,GAC5C,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACI25B,EAAE,MACFsnB,EAAE,MACF5yC,MAAM,OACNC,OAAO,OACP6xC,QAAQ,iBACR6xI,iBAAiB,qBACjBllL,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,kBAEjFzJ,IAAAA,cAAA,SACIA,IAAAA,cAAA,SACIA,IAAAA,cAAA,WACIC,UAAU,gBACVsgD,GAAG,SACHC,GAAG,MACHU,GAAG,MACHE,GAAG,QAEPphD,IAAAA,cAAA,QACIC,UAAU,gBACV2gD,EAAE,qOAId5gD,IAAAA,cAAA,SACIA,IAAAA,cAAA,QACIC,UAAU,gBACV2gD,EAAE,qTAM1B,CCrCe,SAASysM,EAAkB3tP,GACtC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACPrO,UAAU,gBACVkgD,QAAQ,YACR/yC,MAAOA,EACPN,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,kBAEjFzJ,IAAAA,cAAA,QAAM4gD,EAAE,iNAIxB,CAEA,MAAMxzC,EAAuB,CACzBo0C,SAAU,UACVC,SAAU,UACVT,eAAgB,QAChBwhE,iBAAkB,SCxBP,SAAS8qI,EAAuB5tP,GAC3C,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACI25B,EAAE,MACFsnB,EAAE,MACF5yC,MAAM,OACNC,OAAO,OACP6xC,QAAQ,iBACR6xI,iBAAiB,qBACjBllL,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,iBAEhFzJ,IAAAA,cAAA,SACIA,IAAAA,cAAA,QACIC,UAAU,eACV2gD,EAAE,8GAEN5gD,IAAAA,cAAA,WACIC,UAAU,eACVsgD,GAAG,SACHC,GAAG,MACHU,GAAG,MACHE,GAAG,SAGXphD,IAAAA,cAAA,QACIC,UAAU,eACV2gD,EAAE,wOAEN5gD,IAAAA,cAAA,SACIA,IAAAA,cAAA,SACIA,IAAAA,cAAA,QACIC,UAAU,eACV2gD,EAAE,wLAO9B,CCzCe,SAAS2sM,EAAiB7tP,GACrC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACR/yC,MAAOA,EACPN,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,iBAEhFzJ,IAAAA,cAAA,QACIC,UAAU,eACV2gD,EAAE,wkBAKtB,CAEA,MAAMxzC,EAAuB,CACzBo0C,SAAU,UACVC,SAAU,UACVT,eAAgB,QAChBwhE,iBAAkB,SCXhBpgB,EAAajqG,IAKN,IALO,UAChB8H,EAAY,GAAE,OACdyiJ,GAAS,EAAK,OACdrjJ,EAAM,KACNnE,GACI/C,EACJ,IAAKkH,EACD,OAAO,KAGX,IAAI66H,EAAgB,UAAHv5H,OAAaV,GAM9B,OAJIyiJ,IACAxoB,EAAgBj6H,GAAa,IAGpB,WAAT/E,EACe,WAAXmE,EACOW,IAAAA,cAACstP,EAAsB,CAACrtP,UAAWi6H,IACxB,SAAX76H,EACAW,IAAAA,cAACgtP,EAAoB,CAAC/sP,UAAWi6H,IACtB,QAAX76H,EACAW,IAAAA,cAACktP,EAAmB,CAACjtP,UAAWi6H,IAEpCl6H,IAAAA,cAACotP,EAAuB,CAACntP,UAAWi6H,IACzB,WAAX76H,EACAW,IAAAA,cAACutP,EAAgB,CAACttP,UAAWi6H,IAClB,SAAX76H,EACAW,IAAAA,cAACitP,EAAc,CAAChtP,UAAWi6H,IAChB,QAAX76H,EACAW,IAAAA,cAACmtP,EAAa,CAACltP,UAAWi6H,IAE9Bl6H,IAAAA,cAACqtP,EAAiB,CAACptP,UAAWi6H,GAAgB,EACvD93B,EAAA/5F,UAAA,CAvCEq6I,OAAM58I,IAAAA,KACNzG,OAAMyG,IAAAA,OACN7F,UAAS6F,IAAAA,OACT5K,KAAI4K,IAAAA,QAsCR,SAAeypD,EAAAA,EAAAA,MAAK6yC,E,4lCCOb,IAAKorJ,EAAU,SAAVA,GAAU,OAAVA,EAAU,cAAVA,EAAU,kBAAVA,EAAU,wBAAVA,EAAU,oCAAVA,EAAU,gCAAVA,EAAU,wCAAVA,EAAU,cAAVA,EAAU,YAAVA,EAAU,wCAAVA,EAAU,wBAAVA,EAAU,8BAAVA,EAAU,0BAAVA,EAAU,sBAAVA,EAAU,oBAAVA,EAAU,gCAAVA,EAAU,gCAAVA,EAAU,cAAVA,EAAU,oCAAVA,EAAU,8CAAVA,EAAU,oDAAVA,EAAU,gDAAVA,EAAU,4CAAVA,EAAU,0CAAVA,EAAU,sDAAVA,EAAU,sDAAVA,EAAU,sDAAVA,EAAU,4CAAVA,EAAU,YAAVA,CAAU,MAqCtB,MAAMC,GAAqBx8D,EAAAA,EAAAA,IAAwBnd,EAAAA,GAAoB45E,SACjEC,GAAwBv8D,EAAAA,EAAAA,IAA0Btd,EAAAA,GAAoB45E,SAErE,MAAME,EAgBTtrP,WAAAA,CAAYmtB,EAAiBo+N,EAAwBtkP,GAAW,IAAAT,EAAA,KAAAtG,EAAA,aAfxDgrP,EAAWM,OAAKtrP,EAAA,SAEpB,GAACA,EAAA,kBACQ,IAAEA,EAAA,uBACG,GAACA,EAAA,gBAKR,GAACA,EAAA,cACkC,CAAC,GAACA,EAAA,gBACrC,IAAEA,EAAA,aACL,IAAEA,EAAA,gBASSpD,IACfsD,KAAKpK,MAAQk1P,EAAW7gO,MACxBjqB,KAAKhM,MAAQ0I,EACNsD,QAGXF,EAAA,qBACsBjM,eAAOw3P,GAAoF,IAAAC,EAAAC,EAAA,IAArDC,EAAgBjoP,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GACxE,GAA+B,IAA3B8nP,EAAgB3kP,OAChB,OAAON,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,gCACJ0S,eAAgB,0BAGxB,IAAIiJ,EAAWq7O,EAEXK,GAAO,EACX,MAAQA,GAAM,CACV,IAAInnO,EAAI,GAKR,OAJIne,EAAKs5B,EAAIt5B,EAAK2mB,QAAQrmB,SACtB6d,EAAIne,EAAK2mB,QAAQ3mB,EAAKs5B,IAGlBt5B,EAAKxQ,OACb,KAAKk1P,EAAWM,MACZ,GAAU,MAAN7mO,EACA,OAAOne,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,mCACJ0S,eAAgB,oCAGxBX,EAAKs5B,IACLt5B,EAAKulP,WAAa,GAClBvlP,EAAKwlP,gBAAkBxlP,EAAKs5B,EAC5Bt5B,EAAKxQ,MAAQk1P,EAAWe,QACxB,MAGJ,KAAKf,EAAWe,QACZ,OAAQtnO,GACR,IAAK,GACGinO,EAEAE,GAAO,EAEPtlP,EAAKxQ,MAAQk1P,EAAWgB,WAE5B,MAEJ,IAAK,IACL,IAAK,KACD1lP,EAAKxQ,MAAQk1P,EAAWgB,WACxB,MAEJ,QACI1lP,EAAKulP,YAAcpnO,EACnBne,EAAKs5B,IAGT,MAGJ,KAAKorN,EAAWgB,WAAY,CACxB,MAAM59O,EAAU8B,EAASvH,MAAMmH,GAAkBA,EAAE1Q,MAAMqB,gBAAkB6F,EAAKulP,WAAWprP,gBAC3F,IAAK2N,EAAS,CAGVw9O,GAAO,EACP,KACJ,CACAtlP,EAAK8H,QAAUA,EACf9H,EAAKqJ,UAAY,IAAMvB,EAAQhP,MAC/B8Q,EAAW9B,EAAQ8B,UAAY,GAC/B5J,EAAKxQ,MAAQk1P,EAAWiB,iBACxB,KACJ,CAEA,KAAKjB,EAAWiB,iBAKZ,OAJU,KAANxnO,IACAmnO,GAAO,GAGHnnO,GACR,IAAK,IACL,IAAK,KACDne,EAAKs5B,IACL,MAEJ,QACIt5B,EAAKulP,WAAa,GAClBvlP,EAAKwlP,gBAAkBxlP,EAAKs5B,EAC5Bt5B,EAAKxQ,MAAQk1P,EAAWe,QAI5B,MAGJ,QACI,OAAOzlP,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,qCACJ0S,eAAgB,6DACjB,CACCnR,MAAOwQ,EAAKxQ,SAIxB,CAEA,IAAKwQ,EAAK8H,QACN,OAAIs9O,EACOplP,EAGJA,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,6BACJ0S,eAAgB,6DACjB,CACCgmB,QAAS3mB,EAAK2mB,WAItB,IAAKy+N,GAAyC,QAAzBF,EAAIllP,EAAK8H,QAAQ8B,gBAAQ,IAAAs7O,GAArBA,EAAuB5kP,OAC5C,OAAON,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,qCACJ0S,eAAgB,mCAIxB,GAA0B,QAAtBwkP,EAACnlP,EAAK8H,QAAQ8B,gBAAQ,IAAAu7O,IAArBA,EAAuB7kP,OAExB,GAAIN,EAAK8H,QAAQxG,SAAWtB,EAAK8H,QAAQrI,KAGrCO,EAAK4lP,aAAe,CAChBtkP,OAAQtB,EAAK8H,QAAQxG,YAEtB,KAAItB,EAAK8H,QAAQrI,MAASO,EAAK8H,QAAQxG,OAa1C,OAAOtB,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,oBACJ0S,eAAgB,0BACjB,CACC/S,MAAO,mEAjBuC,IAAAi4P,EAIlD,IADa7lP,EAAK8H,QAAQrI,KAChB6B,OAAQ,CACd,MAAMwkP,QAAgB9lP,EAAK+kP,WAAWgB,mBAAmB/lP,EAAKqJ,SAAUrJ,EAAK8H,SAC7E,GAAIg+O,SAAAA,EAASl4P,MACT,OAAOoS,EAAKqlP,QAAQS,EAAQl4P,OAEhCoS,EAAK4lP,aAAeE,aAAO,EAAPA,EAASrmP,IACjC,CACAO,EAAK4lP,aAA2B,QAAfC,EAAG7lP,EAAK8H,eAAO,IAAA+9O,OAAA,EAAZA,EAAcpmP,IAQtC,CAEJ,OAAOO,CACX,IAEAtG,EAAA,kBACmB,WAA6C,IAAAssP,EAAA,IAA5CZ,EAAgBjoP,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAChC,GAAI6C,EAAKxQ,QAAUk1P,EAAW7gO,QAAU7jB,EAAK4lP,aACzC,OAAO5lP,EAGX,IAAIL,EAAqB,GACrBK,EAAK4lP,aAAajmP,SAClBA,EAASK,EAAK4lP,aAAajmP,QAG/BA,EAASA,EAAOtF,QAAQwF,GAAMA,EAAEzN,OAASoK,EAAAA,GAAcqC,WAAagB,EAAE7D,WACtEgE,EAAKxQ,MAAQk1P,EAAWuB,eACxBjmP,EAAKs5B,EAAIt5B,EAAKwlP,iBAAmB,EACjC,IAAIU,GAAiB,EACjBC,GAAU,EAGd,OAAa,CACT,IAAIhoO,EAAI,GAKR,OAJIne,EAAKs5B,EAAIt5B,EAAK2mB,QAAQrmB,SACtB6d,EAAIne,EAAK2mB,QAAQ3mB,EAAKs5B,IAGlBt5B,EAAKxQ,OACb,KAAKk1P,EAAWuB,eACZ,OAAQ9nO,GACR,IAAK,GACD,OAAOne,EACX,IAAK,IAEDA,EAAKxQ,MAAQk1P,EAAW0B,MACxBpmP,EAAKs5B,IACL,MAEJ,IAAK,IAEDt5B,EAAKxQ,MAAQk1P,EAAW2B,KACxBrmP,EAAKs5B,IACLt5B,EAAKulP,WAAa,GAClBvlP,EAAKwlP,gBAAkBxlP,EAAKs5B,EAC5B4sN,GAAiB,EACjB,MAEJ,QAAS,CAELlmP,EAAK+9C,WACL,IAAIhkD,EAAQ4F,EAAO0C,MAAMxC,GAAgBA,EAAEk+C,WAAa/9C,EAAK+9C,WAC7D,IAAKhkD,EAAO,CAER,GADAA,EAAQ4F,EAAO0C,MAAMxC,IAAsB,IAAhBA,EAAEk+C,UAAmBl+C,EAAEzN,OAASoK,EAAAA,GAAcwB,QACpEjE,GAASiG,EAAKN,OAAO3F,EAAM1C,MAC5B,OAAO2I,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,sCACJ0S,eAAgB,kCAGxBX,EAAKwlP,gBAAkBxlP,EAAKs5B,EAC5Bt5B,EAAKulP,WAAa,GAClBvlP,EAAKjG,MAAQA,EACbiG,EAAKxQ,MAAQk1P,EAAW4B,KACxB,KACJ,CACAtmP,EAAKjG,MAAQA,EACbiG,EAAKxQ,MAAQk1P,EAAW6B,WACxB,KACJ,EAEA,MAGJ,KAAK7B,EAAW4B,KACZ,IAAKtmP,EAAKjG,MACN,OAAOiG,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,wCACJ0S,eAAgB,6BAIxB,GAAIykP,GAA0B,KAANjnO,EACpB,OAAOne,EAGX,GAAU,KAANme,EAEA,OADAne,EAAKN,OAAOM,EAAKjG,MAAM1C,MAAQ2I,EAAKulP,WAC7BvlP,EAGXA,EAAKs5B,IACLt5B,EAAKulP,YAAcpnO,EACnB,MAGJ,KAAKumO,EAAW8B,mBAEZ,OADAxmP,EAAKwlP,gBAAkBxlP,EAAKs5B,EACpBnb,GACR,IAAK,GAED,OADAne,EAAKxQ,MAAQk1P,EAAWuB,eACjBjmP,EACX,IAAK,IACL,IAAK,KACDA,EAAKs5B,IACL,MAEJ,QACIt5B,EAAKxQ,MAAQk1P,EAAWuB,eAG5B,MAGJ,KAAKvB,EAAW0B,MAEF,MAANjoO,GACAne,EAAKs5B,IAETt5B,EAAKxQ,MAAQk1P,EAAW2B,KACxBrmP,EAAKulP,WAAa,GAClBvlP,EAAKwlP,gBAAkBxlP,EAAKs5B,EAC5B4sN,GAAiB,EACjB,MAGJ,KAAKxB,EAAW2B,KACZ,GAAU,KAANloO,GAAYinO,EACZ,OAAOplP,EAGX,OAAQme,GACR,IAAK,GACL,IAAK,IACL,IAAK,KACL,IAAK,IAAK,CACN,MAAMpkB,EAAQ4F,EAAO0C,MAAMxC,IAAC,IAAA4mP,EAAA,OAAY,QAAPA,EAAA5mP,EAAE/G,aAAK,IAAA2tP,OAAA,EAAPA,EAAStsP,iBAAkB6F,EAAKulP,WAAWprP,aAAa,IACzF,IAAKJ,EACD,OAAOiG,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,oCACJ0S,eAAgB,8CACjB,CACC+lP,SAAU1mP,EAAKulP,cAGvBvlP,EAAKxQ,MAAQk1P,EAAWiC,mBACxB3mP,EAAKjG,MAAQA,EACbiG,EAAKulP,WAAa,GAClB,KACJ,CACA,QACIvlP,EAAKulP,YAAcpnO,EACnBne,EAAKs5B,IAIT,MAGJ,KAAKorN,EAAWiC,mBAEZ,OADA3mP,EAAKwlP,gBAAkBxlP,EAAKs5B,EACpBnb,GACR,IAAK,GACD,GAAIinO,EACA,OAAOplP,EAEXA,EAAKxQ,MAAQk1P,EAAW6B,WACxB,MAEJ,IAAK,IACL,IAAK,KACDvmP,EAAKs5B,IACL,MAEJ,IAAK,IACD,GAAI4sN,EACA,OAAOlmP,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,mCACJ0S,eAAgB,yCAGxBulP,GAAiB,EACjBlmP,EAAKs5B,IACL,MAEJ,QACIt5B,EAAKxQ,MAAQk1P,EAAW6B,WAG5B,MAGJ,KAAK7B,EAAW6B,WAGZ,OAFAvmP,EAAKulP,WAAa,GAClBvlP,EAAKwlP,gBAAkBxlP,EAAKs5B,EACpBnb,GACR,IAAK,IACDne,EAAKxQ,MAAQk1P,EAAWkC,YACxB5mP,EAAKs5B,IACL,MAEJ,IAAK,IACDt5B,EAAKxQ,MAAQk1P,EAAWmC,UACxB7mP,EAAKs5B,IACL,MAEJ,IAAK,IACL,IAAK,KACD,OAAOt5B,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,0CACJ0S,eAAgB,yCAExB,IAAK,IACD,GAAe,QAAXqlP,EAAChmP,EAAKjG,aAAK,IAAAisP,IAAVA,EAAYlqP,YACb,OAAOkE,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,+CACJ0S,eAAgB,8BAGxBX,EAAKxQ,MAAQk1P,EAAWoC,iBACxB9mP,EAAKs5B,IACL,MACJ,QACIt5B,EAAKxQ,MAAQk1P,EAAWqC,cAI5B,MAGJ,KAAKrC,EAAWqC,cACZ,OAAQ5oO,GACR,IAAK,GACL,IAAK,IACL,IAAK,KACDne,EAAKxQ,MAAQk1P,EAAWsC,SACxB,MAEJ,QACIhnP,EAAKulP,YAAcpnO,EACnBne,EAAKs5B,IAIT,MAGJ,KAAKorN,EAAWkC,YACZ,OAAQzoO,GACR,IAAK,GACD,OAAKinO,EAMEplP,EALIA,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,kCACJ0S,eAAgB,yDAK5B,IAAK,IACD,GAAIX,EAAKwlP,kBAAoBxlP,EAAKs5B,EAAI,EAClC,OAAOt5B,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,gCACJ0S,eAAgB,kCAGxBX,EAAKs5B,IACLt5B,EAAKxQ,MAAQk1P,EAAWuC,eACxB,MAEJ,IAAK,KACDd,GAAU,EACVnmP,EAAKs5B,IACL,MAEJ,QACIt5B,EAAKulP,YAAcpnO,EACnBne,EAAKs5B,IACD6sN,IAEAA,GAAU,GAKlB,MAGJ,KAAKzB,EAAWmC,UACZ,OAAQ1oO,GACR,IAAK,GACD,OAAKinO,EAMEplP,EALIA,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,iCACJ0S,eAAgB,uDAK5B,IAAK,IACD,GAAIX,EAAKwlP,kBAAoBxlP,EAAKs5B,EAAI,EAClC,OAAOt5B,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,gCACJ0S,eAAgB,kCAGxBX,EAAKs5B,IACLt5B,EAAKxQ,MAAQk1P,EAAWwC,eACxB,MAEJ,QACIlnP,EAAKulP,YAAcpnO,EACnBne,EAAKs5B,IAIT,MAGJ,KAAKorN,EAAWwC,eAChB,KAAKxC,EAAWuC,eAChB,KAAKvC,EAAWsC,SACZ,IAAKhnP,EAAKjG,MACN,OAAOiG,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,wCACJ0S,eAAgB,6BAOxB,GAAIX,EAAKjG,MAAM3H,OAASoK,EAAAA,GAAckC,OAChC0mP,IAAqB,OAAOr8O,WAAW/I,EAAKulP,cAAgB,QAAQx8O,WAAW/I,EAAKulP,cACpFH,GAAwC,SAApBplP,EAAKulP,YAA6C,UAApBvlP,EAAKulP,YAEzDvlP,EAAKs5B,EAAIt5B,EAAKwlP,gBACdxlP,EAAKN,OAAOM,EAAKjG,MAAM1C,MAAQ,OAC/B2I,EAAKxQ,MAAQk1P,EAAWuB,mBACrB,CACH,GAAIb,GAA0B,KAANjnO,EACpB,OAAOne,EAKX,GAHAA,EAAKN,OAAOM,EAAKjG,MAAM1C,MAAQ2I,EAAKulP,WACpCvlP,EAAKulP,WAAa,GAClBvlP,EAAKwlP,gBAAkBxlP,EAAKs5B,EAClB,KAANnb,EACA,OAAOne,EAEXA,EAAKxQ,MAAQk1P,EAAW8B,kBAC5B,CACA,MAGJ,KAAK9B,EAAWoC,iBACZ,IAAK9mP,EAAKjG,MACN,OAAOiG,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,wCACJ0S,eAAgB,6BAKxB,OADAX,EAAKN,OAAQM,EAAKjG,MAAM1C,MAAQ,GACxB8mB,GACR,IAAK,IACL,IAAK,KACDne,EAAKs5B,IACL,MACJ,IAAK,IACDt5B,EAAKs5B,IACLt5B,EAAKxQ,MAAQk1P,EAAW8B,mBACxB,MACJ,QACIxmP,EAAKxQ,MAAQk1P,EAAWyC,sBAG5B,MAEJ,KAAKzC,EAAWyC,sBAGZ,OAFAnnP,EAAKulP,WAAa,GAClBvlP,EAAKwlP,gBAAkBxlP,EAAKs5B,EACpBnb,GACR,IAAK,GACD,OAAKinO,EAMEplP,EALIA,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,qCACJ0S,eAAgB,kCAI5B,IAAK,IACDX,EAAKxQ,MAAQk1P,EAAW0C,uBACxBpnP,EAAKs5B,IACL,MAEJ,IAAK,IACDt5B,EAAKxQ,MAAQk1P,EAAW2C,qBACxBrnP,EAAKs5B,IACL,MAEJ,IAAK,IACL,IAAK,KACD,OAAOt5B,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,0CACJ0S,eAAgB,yCAExB,IAAK,IACD,OAAOX,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,qCACJ0S,eAAgB,uBAExB,QACIX,EAAKxQ,MAAQk1P,EAAW4C,yBAI5B,MAEJ,KAAK5C,EAAW4C,yBACZ,OAAQnpO,GACR,IAAK,GACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,IACDne,EAAKxQ,MAAQk1P,EAAW6C,oBACxB,MAEJ,QACIvnP,EAAKulP,YAAcpnO,EACnBne,EAAKs5B,IAIT,MAGJ,KAAKorN,EAAW0C,uBACZ,OAAQjpO,GACR,IAAK,GACD,OAAKinO,EAMEplP,EALIA,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,kCACJ0S,eAAgB,yDAK5B,IAAK,IACD,GAAIX,EAAKwlP,kBAAoBxlP,EAAKs5B,EAAI,EAClC,OAAOt5B,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,gCACJ0S,eAAgB,kCAGxBX,EAAKs5B,IACLt5B,EAAKxQ,MAAQk1P,EAAW8C,0BACxB,MAEJ,IAAK,KACDrB,GAAU,EACVnmP,EAAKs5B,IACL,MAEJ,QACIt5B,EAAKulP,YAAcpnO,EACnBne,EAAKs5B,IACD6sN,IAEAA,GAAU,GAKlB,MAGJ,KAAKzB,EAAW2C,qBACZ,OAAQlpO,GACR,IAAK,GACD,OAAKinO,EAMEplP,EALIA,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,iCACJ0S,eAAgB,uDAK5B,IAAK,IACD,GAAIX,EAAKwlP,kBAAoBxlP,EAAKs5B,EAAI,EAClC,OAAOt5B,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,gCACJ0S,eAAgB,kCAGxBX,EAAKs5B,IACLt5B,EAAKxQ,MAAQk1P,EAAW+C,0BACxB,MAEJ,QACIznP,EAAKulP,YAAcpnO,EACnBne,EAAKs5B,IAIT,MAGJ,KAAKorN,EAAW+C,0BAChB,KAAK/C,EAAW8C,0BAChB,KAAK9C,EAAW6C,oBACZ,IAAKvnP,EAAKjG,MACN,OAAOiG,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,wCACJ0S,eAAgB,6BAIxB,GAAIykP,GAA0B,KAANjnO,EACpB,OAAOne,EAKX,GAHCA,EAAKN,OAAQM,EAAKjG,MAAM1C,MAAmB6R,KAAKlJ,EAAKulP,YACtDvlP,EAAKulP,WAAa,GAClBvlP,EAAKwlP,gBAAkBxlP,EAAKs5B,EAClB,KAANnb,EACA,OAAOne,EAEXA,EAAKxQ,MAAQk1P,EAAWgD,0BACxB,MAGJ,KAAKhD,EAAWgD,0BACZ,OAAQvpO,GACR,IAAK,GACD,OAAKinO,EAMEplP,EALIA,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,qCACJ0S,eAAgB,kCAI5B,IAAK,IACDX,EAAKs5B,IACLt5B,EAAKxQ,MAAQk1P,EAAW8B,mBACxB,MACJ,IAAK,IACL,IAAK,KACDxmP,EAAKs5B,IACL,MACJ,IAAK,IACDt5B,EAAKs5B,IACLt5B,EAAKxQ,MAAQk1P,EAAWiD,qBACxB,MACJ,QACI,OAAO3nP,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,yCACJ0S,eAAgB,2BAGxB,MACJ,KAAK+jP,EAAWiD,qBACZ,OAAQxpO,GACR,IAAK,IACL,IAAK,KACDne,EAAKs5B,IACL,MACJ,QACIt5B,EAAKxQ,MAAQk1P,EAAWyC,sBAE5B,MACJ,QACI,OAAOnnP,EAAKqlP,QAAQrlP,EAAKS,KAAKC,cAAc,CACxCzS,GAAI,qCACJ0S,eAAgB,6DACjB,CACCnR,MAAOwQ,EAAKxQ,SAGxB,CACJ,IApuBIoK,KAAK+sB,QAAUA,EACf/sB,KAAKmrP,WAAaA,GAAc,GAChCnrP,KAAK6G,KAAOA,CAChB,EAouBG,MAAMgoB,EAOTjvB,WAAAA,CAAYhM,EAAmBiT,EAAYsK,GAAiD,IAAA68O,EAAA,SAA9B/hN,EAAM1oC,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAAI0qP,EAAU1qP,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAQxFzD,EAAA,iCACkCjM,UAA0F,IAAAq6P,EACxH,IAAIC,EAAS,IAAIjD,EAAcn+N,EAAS/sB,KAAMA,KAAK6G,MAEnD,MAAMwkP,EAAkBrrP,KAAK+qP,qBAC7B,IAAKM,EACD,MAAO,CAACh+O,KAAM,KACVxF,aAAc7H,KAAK6G,KAAKC,cAAc,CAClCzS,GAAI,gCACJ0S,eAAgB,0BAM5B,GAFAonP,QAAeA,EAAOC,aAAa/C,GAAiB,GACpD8C,EAASA,EAAOE,WAAU,GACtBF,EAAOv4P,QAAUk1P,EAAW7gO,MAC5B,MAAO,CAAC5c,KAAM,KAAMxF,cAAcymP,EAAAA,EAAAA,IAAmBtuP,KAAK6G,KAAMsnP,EAAOn6P,MAAOm6P,EAAOphO,QAASohO,EAAOzuN,UAGnG1/B,KAAKuuP,4BAA4BJ,GAEvC,MAAMK,EAAUxuP,KAAKyuP,iBAAiBN,GACtC,GAAIK,EAAQ9nP,OAAS,EAAG,CACpB,MAAMgoP,EAAaF,EAAQ7tP,KAAKsF,GAAMA,EAAE/G,QAAO+nD,KAAK,MACpD,MAAO,CAAC55C,KAAM,KACVxF,aAAc7H,KAAK6G,KAAKC,cAAc,CAClCzS,GAAI,mCACJ0S,eAAgB,2CACjB,CACC4nP,UAAWD,IAEvB,CAEA,MAAM,KAACrhP,EAAI,aAAExF,SAAsB7H,KAAK4uP,mBAAmBT,EAA2B,QAArBD,EAAEC,EAAOnC,oBAAY,IAAAkC,OAAA,EAAnBA,EAAqBxmP,QACxF,OAAIG,EACO,CAACwF,KAAM,KAAMxF,gBAGjB,CAACwF,OAAK,IAChBvN,EAAA,+BAE+BjM,UAC5B,IAAIs6P,EAAS,IAAIjD,EAAcn+N,EAAS/sB,KAAMA,KAAK6G,MAEnD,MAAMwkP,EAAkBrrP,KAAK+qP,qBAC7B,IAAKM,EACD,MAAO,CACHxlP,KAAM,KACNuH,QAAS,KACTvF,aAAc7H,KAAK6G,KAAKC,cAAc,CAClCzS,GAAI,gCACJ0S,eAAgB,0BAI5BonP,QAAeA,EAAOC,aAAa/C,GAAiB,GACpD8C,EAASA,EAAOE,WAAU,GAE1B,MAAMxoP,EAAO6P,KAAKC,MAAMD,KAAK4iE,UAAU61K,EAAOnC,eAC9C,IAAKnmP,EACD,MAAO,CACHA,KAAM,KACNuH,QAAS,KACTvF,aAAc7H,KAAK6G,KAAKC,cAAc,CAClCzS,GAAI,4BACJ0S,eAAgB,oBAK5B,MAAMjB,EAAwBqoP,EAAOroP,aAC/B9F,KAAK6uP,cAAcV,EAAQroP,GAEjC,IAAK,MAAM3F,KAAS0F,EAAKE,QAAU,GAC3BD,EAAO3F,EAAM1C,QACb0C,EAAMW,MAAQgF,EAAO3F,EAAM1C,OAIlB,IAAAqxP,EAKjB,OALKjpP,EAAK2F,QACN3F,EAAK2F,MAAsB,QAAjBsjP,EAAGX,EAAOjgP,eAAO,IAAA4gP,OAAA,EAAdA,EAAgBr/O,UAI1B,CAAC5J,OAAMuH,QADEpN,KAAK+uP,cAAcZ,EAAOjgP,SACpB,IA6D1BpO,EAAA,2BAC6By8K,IACzB,MAAMxvJ,EAAUwvJ,EAAQh8K,cAClByR,EAAmC,GAEnChC,EAAWhQ,KAAK+qP,qBAEtB,IAAK,MAAM78O,KAAW8B,EAAU,CAC5B,IAAIgxG,EAAO9yG,EAAQhP,MACd8hH,IAIW,MAAZA,EAAK,KACLA,EAAO,IAAMA,GAGbA,EAAK7xG,WAAW4d,IAChB/a,EAAO1C,KAAK,CACR0/O,SAAU9gP,EAAQhP,MAClB+vP,WAAYjuI,EACZ3mC,YAAansE,EAAQ1Q,aAAe,GACpC0xP,KAAMhhP,EAAQtM,MAAQ,GACtButP,SAAUjhP,EAAQ7Q,MAAQ,GAC1B7E,KAAMuqB,EAAAA,GAAUqsO,aAAapE,UAGzC,CAEA,OAAOh5O,CAAM,IAGjBlS,EAAA,uBACwBjM,UAAsE,IAAAw7P,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC1F,IAAIxB,EAAS,IAAIjD,EAAc3uE,EAASv8K,KAAMA,KAAK6G,MAC/C+oP,EAAgD,GAEpD,MAAMvE,EAAkBrrP,KAAK+qP,qBAC7B,IAAKM,EACD,MAAO,GAYX,GATA8C,QAAeA,EAAOC,aAAa/C,GAAiB,GAChD8C,EAAOv4P,QAAUk1P,EAAW7gO,QAC5B2lO,EAAc5vP,KAAK6vP,mBAAmB1B,IAGtCA,EAAOv4P,QAAUk1P,EAAWe,UAC5B+D,EAAc5vP,KAAK8vP,sBAAsB3B,IAGzCA,EAAOnC,cAAgBmC,EAAOxC,WAAY,CAC1CwC,EAASA,EAAOE,WAAU,GACtBF,EAAOv4P,QAAUk1P,EAAW7gO,QAC5B2lO,EAAc5vP,KAAK6vP,mBAAmB1B,IAE1C,MAAM4B,QAAuB/vP,KAAKgwP,wBAAwB7B,GAC1DyB,EAAcA,EAAY3xP,OAAO8xP,EACrC,CAIA,MAAME,EAA6B,CAC/BnF,EAAWgB,WACXhB,EAAWiB,iBACXjB,EAAWuB,eACXvB,EAAW8B,mBACX9B,EAAWsC,SACXtC,EAAW4B,MAGTwD,EAAwB,CAC1BpF,EAAWuB,eACXvB,EAAW7gO,MACX6gO,EAAWmC,UACXnC,EAAWkC,YACXlC,EAAWsC,SACXtC,EAAW4B,KACX5B,EAAW2B,KACX3B,EAAWiC,oBAETv+O,GAA0B,QAAnB6gP,EAAAlB,EAAOnC,oBAAY,IAAAqD,OAAA,EAAnBA,EAAqB3nP,UAAwB,QAAlB4nP,EAAInB,EAAOjgP,eAAO,IAAAohP,GAAM,QAANC,EAAdD,EAAgBzpP,YAAI,IAAA0pP,OAAN,EAAdA,EAAsB7nP,QAC5DyoP,EAAuD,IAAzCnwP,KAAKyuP,iBAAiBN,GAAQznP,OAC5C0pP,EAAYjC,EAAOv4P,QAAUk1P,EAAWsC,UAAae,EAAOhuP,YAA8C7H,IAArC61P,EAAOroP,OAAOqoP,EAAOhuP,MAAM1C,MAEtG,GAAIwyP,EAAiBxmN,SAAS0kN,EAAOv4P,QAAU4Y,GAAQ2hP,GAAeC,EAAU,CAC5E,MAAMC,GAAUC,EAAAA,EAAAA,IAAqBnC,GACjCkC,IACAT,EAAc,CAACS,KAAYT,GAEnC,MAAkC,IAAvBA,EAAYlpP,SAA6B,QAAZ8oP,EAAArB,EAAOhuP,aAAK,IAAAqvP,OAAA,EAAZA,EAAch3P,QAASoK,EAAAA,GAAcG,OAAoB,QAAZ0sP,EAAAtB,EAAOhuP,aAAK,IAAAsvP,OAAA,EAAZA,EAAcj3P,QAASoK,EAAAA,GAAcI,UACtH4sP,EAAc5vP,KAAKuwP,2BAGvB,GAAIL,EAAYzmN,SAAS0kN,EAAOv4P,QAAU4Y,GAA2B,QAAvBkhP,EAAIvB,EAAOnC,oBAAY,IAAA0D,GAAQ,QAARC,EAAnBD,EAAqB3pP,cAAM,IAAA4pP,GAA3BA,EAA6BjpP,OAAQ,CACnF,MAAMuI,GAAOuhP,EAAAA,EAAAA,IAAyBrC,GAClCl/O,IACA2gP,EAAc,IAAIA,EAAa3gP,GAEvC,CAEA,OAAO2gP,EAAYjvP,KAAK4pH,GAAevqH,KAAKywP,2BAA2BtC,EAAQ5jI,IAAY,IAC9FzqH,EAAA,gCAEyB,IACf,CAAC,CACJkvP,SAAU,GACVC,WAAY,GACZC,KAAMlvP,KAAK6G,KAAKC,cAAc,CAC1BzS,GAAI,gCACJ0S,eAAgB,6BAEpBooP,SAAUuB,EAAAA,GACVr2K,YAAa,OAEpBv6E,EAAA,2BAEqBquP,GACX,CAAC,CACJa,SAAU,GACVC,WAAY,GACZC,KAAMlvP,KAAK6G,KAAKC,cAAc,CAC1BzS,GAAI,sCACJ0S,eAAgB,kBAEpBooP,SAAUuB,EAAAA,GACVr2K,YAAa8zK,EAAOn6P,UAI5B8L,EAAA,2BAC6BjM,MAAOs6P,EAAuB3/O,KACvD,IAAK2/O,EAAOjgP,QACR,MAAO,CAACb,KAAM,KACVxF,aAAc7H,KAAK6G,KAAKC,cAAc,CAClCzS,GAAI,oCACJ0S,eAAgB,+BAG5B,IAAKyH,EACD,MAAO,CAACnB,KAAM,KACVxF,aAAc7H,KAAK6G,KAAKC,cAAc,CAClCzS,GAAI,mCACJ0S,eAAgB,wCAI5B,MAAMjB,EAAwBqoP,EAAOroP,QAC/B,aAAC+B,SAAsB7H,KAAK6uP,cAAcV,EAAQroP,GACxD,GAAI+B,EACA,MAAO,CAACwF,KAAM,KAAMxF,gBAGxB,MAAMuF,EAAUpN,KAAK+uP,cAAcZ,EAAOjgP,SAC1C,MAAO,CAACb,MAAMC,EAAAA,EAAAA,IAAkBkB,EAAMpB,EAAS,CAAC,EAAGtH,EAAQqoP,EAAOphO,SAAS,IAC9EjtB,EAAA,sBAEuBjM,MAAOs6P,EAAuBroP,KAA4D,IAAA6qP,EAC9G,GAAwB,QAApBA,EAACxC,EAAOnC,oBAAY,IAAA2E,IAAnBA,EAAqB5qP,OACtB,MAAO,CAAC,EAGZ,MAAMiC,EAAkC,CAAC,EA+NzC,SA9NMqgB,QAAQyuB,IAAIq3M,EAAOnC,aAAajmP,OAAOpF,KAAI9M,UAC7C,GAAKiS,EAAOG,EAAExI,MAGd,OAAQwI,EAAEzN,MACV,KAAKoK,EAAAA,GAAcC,eACf,GAAIoD,EAAE/D,aAAewB,MAAMC,QAAQmC,EAAOG,EAAExI,OAAQ,CAChD,MAAMpC,EAA6B,GAC7Bu1P,EAAgB9qP,EAAOG,EAAExI,MAC/B,IAAK,MAAMqD,KAAS8vP,EACZv1P,EAAQoN,MAAMkE,GAAMA,EAAE7L,QAAUA,MAChCkH,EAAO/B,EAAExI,MAAQuC,KAAK6G,KAAKC,cAAc,CACrCzS,GAAI,iCACJ0S,eAAgB,wDACjB,CACC4nP,UAAW1oP,EAAExI,KACbgG,OAAQ3C,KAIpBgF,EAAOG,EAAExI,MAAQpC,EACjB,KACJ,CAEAyK,EAAOG,EAAExI,MAAQ,CAACyB,MAAO4G,EAAOG,EAAExI,MAAOqD,MAAOgF,EAAOG,EAAExI,OACzD,MACJ,KAAKmF,EAAAA,GAAcE,cAAe,CAC9B,MAAM+tP,EAAa/vP,IAAkB,IAAAgwP,EACjC,OAAgB,QAAhBA,EAAO7qP,EAAE5K,eAAO,IAAAy1P,OAAA,EAATA,EAAWroP,MAAMkE,GAAOA,EAAE7L,QAAUA,GAAO,EAGhDiwP,EAAkBjwP,IACpBkH,EAAO/B,EAAExI,MAAQuC,KAAK6G,KAAKC,cAAc,CACrCzS,GAAI,oCACJ0S,eAAgB,uDACjB,CACC4nP,UAAW1oP,EAAExI,KACbgG,OAAQ3C,IAEZgF,EAAOG,EAAExI,WAAQnF,CAAS,EAG9B,GAAI2N,EAAE/D,aAAewB,MAAMC,QAAQmC,EAAOG,EAAExI,OAAQ,CAChD,MAAMpC,EAA6B,GAC7Bu1P,EAAgB9qP,EAAOG,EAAExI,MAC/B,IAAK,MAAMqD,KAAS8vP,EAAe,CAC/B,MAAMntP,EAASotP,EAAU/vP,GACzB,IAAK2C,EAED,YADAstP,EAAejwP,GAGfzF,EAAQoN,MAAMkE,GAAMA,EAAE7L,QAAU2C,EAAO3C,UACvCkH,EAAO/B,EAAExI,MAAQuC,KAAK6G,KAAKC,cAAc,CACrCzS,GAAI,iCACJ0S,eAAgB,wDACjB,CACC4nP,UAAW1oP,EAAExI,KACbgG,OAAQ3C,KAGhBzF,EAAQiU,KAAK7L,EACjB,CACAqC,EAAOG,EAAExI,MAAQpC,EACjB,KACJ,CAEA,MAAMoI,EAASotP,EAAU/qP,EAAOG,EAAExI,OAClC,IAAKgG,EAED,YADAstP,EAAejrP,EAAOG,EAAExI,OAG5BqI,EAAOG,EAAExI,MAAQgG,EACjB,KACJ,CACA,KAAKb,EAAAA,GAAcG,KAAM,CACrB,MAAMy0B,EAAU3jC,UACZ,IAAI6M,GAAOswP,EAAAA,EAAAA,IAAqBhxP,KAAKpM,MAAMqf,WAAYg+O,GACvD,IAAKvwP,EAAM,CACP,MAAMwwP,QAAuBlxP,KAAKpM,MAAMD,UAASkvB,EAAAA,EAAAA,IAAkBouO,IACnE,GAAI,UAAWC,EACX,OAAO,KAEXxwP,EAAOwwP,EAAej9P,IAC1B,CACA,OAAOyM,CAAI,EAGTywP,EAAgBtzP,IAClBmK,EAAO/B,EAAExI,MAAQuC,KAAK6G,KAAKC,cAAc,CACrCzS,GAAI,kCACJ0S,eAAgB,qDACjB,CACC4nP,UAAW1oP,EAAExI,KACbgG,OAAQ5F,GACV,EAGN,GAAIoI,EAAE/D,aAAewB,MAAMC,QAAQmC,EAAOG,EAAExI,OAAQ,CAChD,MAAMpC,EAA6B,GAC7Bu1P,EAAgB9qP,EAAOG,EAAExI,MAE/B,IAAK,MAAMqD,KAAS8vP,EAAe,CAC/B,IAAIK,EAAWnwP,EACK,MAAhBmwP,EAAS,KACTA,EAAWA,EAASxhO,OAAO,IAE/B,MAAM/uB,QAAa82B,EAAQy5N,GAC3B,IAAKvwP,EAED,YADAywP,EAAaF,GAIb51P,EAAQoN,MAAMkE,GAAMA,EAAE7L,SAAUJ,aAAI,EAAJA,EAAMrM,QACtC2T,EAAO/B,EAAExI,MAAQuC,KAAK6G,KAAKC,cAAc,CACrCzS,GAAI,+BACJ0S,eAAgB,sDACjB,CACC4nP,UAAW1oP,EAAExI,KACbgG,OAAQwtP,KAGhB51P,EAAQiU,KAAK,CAACpQ,MAAOwB,EAAK7C,SAAUiD,MAAOJ,EAAKrM,IACpD,CAEAyR,EAAOG,EAAExI,MAAQpC,EACjB,KACJ,CAEA,IAAI41P,EAAWnrP,EAAOG,EAAExI,MACJ,MAAhBwzP,EAAS,KACTA,EAAWA,EAASxhO,OAAO,IAE/B,MAAM/uB,QAAa82B,EAAQy5N,GAC3B,IAAKvwP,EAED,YADAywP,EAAaF,GAGjBnrP,EAAOG,EAAExI,MAAQ,CAACyB,MAAOwB,EAAK7C,SAAUiD,MAAOJ,EAAKrM,IACpD,KACJ,CACA,KAAKuO,EAAAA,GAAcI,QAAS,CACxB,MAAMwf,EAAa3uB,UACf,IAAIqN,GAAUkwP,EAAAA,EAAAA,IAAoBpxP,KAAKpM,MAAMqf,WAAY/V,GACzD,IAAKgE,EAAS,CACV,MAAMie,GAAOsE,EAAAA,EAAAA,IAAezjB,KAAKpM,MAAMqf,YACvC,IAAKkM,EACD,OAAO,KAEX,MAAM+xO,QAAuBlxP,KAAKpM,MAAMD,UAASisB,EAAAA,EAAAA,IAA4BT,EAAK1hB,KAAMP,IACxF,GAAI,UAAWg0P,EACX,OAAO,KAEXhwP,EAAUgwP,EAAej9P,IAC7B,CACA,OAAOiN,CAAO,EAGZmwP,EAAmBn0P,IACrB8K,EAAO/B,EAAExI,MAAQuC,KAAK6G,KAAKC,cAAc,CACrCzS,GAAI,qCACJ0S,eAAgB,wDACjB,CACC4nP,UAAW1oP,EAAExI,KACbgG,OAAQvG,GACV,EAGN,GAAI+I,EAAE/D,aAAewB,MAAMC,QAAQmC,EAAOG,EAAExI,OAAQ,CAChD,MAAMpC,EAA6B,GAC7Bu1P,EAAgB9qP,EAAOG,EAAExI,MAE/B,IAAK,MAAMqD,KAAS8vP,EAAe,CAC/B,IAAI1zP,EAAc4D,EACK,MAAnB5D,EAAY,KACZA,EAAcA,EAAYuyB,OAAO,IAErC,MAAMvuB,QAAgBshB,EAAWtlB,GACjC,IAAKgE,EAED,YADAmwP,EAAgBn0P,GAIhB7B,EAAQoN,MAAMkE,GAAMA,EAAE7L,SAAUI,aAAO,EAAPA,EAAS7M,QACzC2T,EAAO/B,EAAExI,MAAQuC,KAAK6G,KAAKC,cAAc,CACrCzS,GAAI,kCACJ0S,eAAgB,yDACjB,CACC4nP,UAAW1oP,EAAExI,KACbgG,OAAQvG,KAIhB7B,EAAQiU,KAAK,CAACpQ,MAAOgC,aAAO,EAAPA,EAAS/D,aAAc2D,MAAOI,aAAO,EAAPA,EAAS7M,IAChE,CAEAyR,EAAOG,EAAExI,MAAQpC,EACjB,KACJ,CAEA,IAAI6B,EAAc4I,EAAOG,EAAExI,MACJ,MAAnBP,EAAY,KACZA,EAAcA,EAAYuyB,OAAO,IAErC,MAAMvuB,QAAgBshB,EAAWtlB,GACjC,IAAKgE,EAED,YADAmwP,EAAgBn0P,GAGpB4I,EAAOG,EAAExI,MAAQ,CAACyB,MAAOgC,aAAO,EAAPA,EAAS/D,aAAc2D,MAAOI,aAAO,EAAPA,EAAS7M,IAChE,KACJ,CACA,KAAKuO,EAAAA,GAAckC,KAEgB,SADdgB,EAAOG,EAAExI,MACb8C,cACTuF,EAAOG,EAAExI,OAAQ,EAEjBqI,EAAOG,EAAExI,OAAQ,EAGzB,KAG+B,IAA/BC,OAAO+I,KAAKuB,GAAQtB,OACpB,MAAO,CAAC,EAGZ,IAAImB,EAAe,GAInB,OAHAnK,OAAO+I,KAAKuB,GAAQhC,SAAS2wC,IACzB9uC,EAAeA,EAAeG,EAAO2uC,GAAK,IAAI,IAE3C,CAAC9uC,eAAa,IAGzB/H,EAAA,mCACqC,CAACquP,EAAuBmD,KACzD,GAAIA,EAAOtC,WACPsC,EAAOtC,SAASp7M,SAAS29M,EAAAA,KACzBD,EAAOtC,SAASp7M,SAAS49M,EAAAA,KACzB,OAAOF,EAGX,IAAIG,EAAc,EACM,KAApBH,EAAOtC,WACPyC,EAAc,GAElB,IAAIC,EAAWvD,EAAOphO,QAAQH,UAAU,EAAGuhO,EAAOvC,gBAAkB6F,GAKpE,OAJAC,QAAgCp5P,IAApBg5P,EAAOtC,SAAyBsC,EAAOrC,WAAaqC,EAAOtC,SACvEsC,EAAOpC,KAAOoC,EAAOpC,MAAQ,GAC7BwC,EAAWA,EAAS9kO,UAAU,GAE9Bx4B,EAAAA,EAAA,GACOk9P,GAAM,IACTtC,SAAU0C,GAAQ,IAK1B5xP,EAAA,2BAC6B,KACzB,MAAMlK,EAAQoK,KAAKpM,MAAMqf,WACzB,OAAIjT,KAAKiuP,WACEhD,EAAsBr1P,GAE1Bm1P,EAAmBn1P,EAAM,IAGpCkK,EAAA,mBACqB,KACjB,MAAMlK,EAAQoK,KAAKpM,MAAMqf,WACzB,OAAOqO,EAAAA,EAAAA,IAAc1rB,EAAOoK,KAAKmR,UAAU,IAC9CrR,EAAA,0BAE0B,SAACqR,GAAwD,IAArC86B,EAAM1oC,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAAI0qP,EAAmB1qP,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EAC3E01P,EAAK78O,UAAYA,EACjB68O,EAAKC,WAAaA,EAClBD,EAAK/hN,OAASA,CAClB,IAIAnsC,EAAA,qBACuBy8K,IACnB,MAAMxvJ,EAAUwvJ,EAAQh8K,cACxB,IAAK,MAAM2N,KAAWlO,KAAK+qP,qBAAsB,CAC7C,IAAI/pI,EAAO9yG,EAAQhP,MACnB,GAAK8hH,IAIW,MAAZA,EAAK,KACLA,EAAO,IAAMA,GAGbj0F,EAAQ5d,WAAW6xG,EAAO,MAC1B,OAAO,CAEf,CACA,OAAO,CAAK,IAGhBlhH,EAAA,sBACyBoO,IACrB,MAAMd,EAAsB,CACxBolK,OAAQtkK,EAAQskK,OAChB/iK,SAAUvB,EAAQuB,SAClBsB,QAAS/Q,KAAKiuP,YAGZ/sP,EAAUlB,KAAKwiB,aACrB,OAAKthB,GAILkM,EAAQ0D,WAAa5P,EAAQ7M,GAC7B+Y,EAAQ0K,QAAU5W,EAAQ4W,UAAWC,EAAAA,EAAAA,IAAiB/X,KAAKpM,MAAMqf,YAE1D7F,GANIA,CAMG,IAGlBtN,EAAA,6BAC+BjM,MAAO6Z,EAAiBN,KAA+E,IAAAukP,EAClI,MAAMlqN,GAAUn6B,EAAAA,EAAAA,IAAkBI,EAAQN,GACpC3F,QAAYzH,KAAKpM,MAAMD,UAASia,EAAAA,EAAAA,IAAe65B,EAASznC,KAAK6G,OACnE,GAAIY,EAAIzT,MAEJ,MAAO,CAACA,MADcyT,EAAIzT,MACG8T,MAAQ9H,KAAK6G,KAAKC,cAAc,CACzDzS,GAAI,qBACJ0S,eAAgB,6BAIxB,MAAMmB,EAAeT,EAAIxT,KACzB,OAAQiU,EAAa1P,MACrB,KAAK4P,EAAAA,GAAqBC,KACtB,MACJ,KAAKD,EAAAA,GAAqBG,SAC1B,KAAKH,EAAAA,GAAqBE,GACtB,MAAO,CAACtU,MAAOgM,KAAK6G,KAAKC,cAAc,CACnCzS,GAAI,uCACJ0S,eAAgB,6DACjB,CACCvO,KAAM0P,EAAa1P,QAE3B,QACI,MAAO,CAACxE,MAAOgM,KAAK6G,KAAKC,cAAc,CACnCzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAM0P,EAAa1P,QAI3B,OAAsB,QAAlBm5P,EAACzpP,EAAarC,YAAI,IAAA8rP,GAAjBA,EAAmBjqP,OAOjB,CAAC7B,KAAMqC,EAAarC,MANhB,CAAC7R,MAAOgM,KAAK6G,KAAKC,cAAc,CACnCzS,GAAI,mCACJ0S,eAAgB,uCAIQ,IACnCjH,EAAA,2BAE2BjM,MAAO4b,EAAkBvB,KAA+E,IAAAqyK,EAChI,MAAMxsI,EAAS/zC,KAAKiuP,YAAc,GAC5BjzP,EAAM,GAAHiD,OAAM+B,KAAKmR,UAAS,KAAAlT,OAAI81C,EAAM,KAAA91C,OAAIwR,GACrCmiP,EAAkB5xP,KAAKiuP,YAAa4D,EAAAA,EAAAA,IAAqB7xP,KAAKpM,MAAMqf,WAAYjY,IAAO82P,EAAAA,EAAAA,IAAkB9xP,KAAKpM,MAAMqf,WAAYjY,GACtI,GAAI42P,EACA,MAAO,CAAC/rP,KAAM+rP,GAGlB,GAAiB,QAAbrxE,EAACryK,EAAQrI,YAAI,IAAA06K,IAAZA,EAAc7yK,OACf,MAAO,CAAC1Z,MAAOgM,KAAK6G,KAAKC,cAAc,CACnCzS,GAAI,mCACJ0S,eAAgB,yCAGxB,MAAMqG,EAAUpN,KAAK+uP,cAAc7gP,GAC7Bg+O,QAAgBlsP,KAAK+xP,qBAAqB7jP,EAAQrI,KAAK6H,OAAQN,GACrE,GAAI8+O,SAAAA,EAASrmP,KAAM,CACf,IAAImsP,EAAqBjiN,EAAAA,GAAUkiN,0BAC/BjyP,KAAKiuP,aACL+D,EAAajiN,EAAAA,GAAUmiN,+BAE3BlyP,KAAKpM,MAAMD,SAAS,CAChBM,KAAM,CAAC4R,KAAMqmP,EAAQrmP,KAAM4J,SAAUzU,GACrCxC,KAAMw5P,GAEd,CACA,OAAO9F,CAAO,IAGlBpsP,EAAA,8BACiCquP,IAAoD,IAAAgE,EAAAC,EACjF,GAAmB,QAAfD,EAAChE,EAAOjgP,eAAO,IAAAikP,GAAU,QAAVC,EAAdD,EAAgBniP,gBAAQ,IAAAoiP,IAAxBA,EAA0B1rP,OAC3B,MAAO,GAEX,MAAMsJ,EAAWm+O,EAAOjgP,QAAQ8B,SAC1BgC,EAAmC,GAezC,OAbAhC,EAAShK,SAAS4J,IACVA,EAAE1Q,MAAMqB,cAAc4O,WAAWg/O,EAAOxC,WAAWprP,gBACnDyR,EAAO1C,KAAK,CACR0/O,SAAUp/O,EAAE1Q,MACZ+vP,WAAYr/O,EAAE1Q,MACdm7E,YAAazqE,EAAEpS,aAAe,GAC9B0xP,KAAMt/O,EAAEhO,MAAQ,GAChButP,SAAUv/O,EAAEvS,MAAQ,GACpB7E,KAAMuqB,EAAAA,GAAUqsO,aAAapE,SAErC,IAGGh5O,CAAM,IAGjBlS,EAAA,gCACkCjM,UAC9B,OAAQs6P,EAAOv4P,OACf,KAAKk1P,EAAWuB,eAAgB,KAAAgG,EAAAC,EAE5B,MAAMC,EAAgC,QAAtBF,EAAGlE,EAAOnC,oBAAY,IAAAqG,GAAQ,QAARC,EAAnBD,EAAqBtsP,cAAM,IAAAusP,OAAR,EAAnBA,EAA6B7pP,MAAMxC,GAAgBA,EAAEk+C,WAAagqM,EAAOhqM,SAAW,IACvG,OAAIouM,GACApE,EAAOhuP,MAAQoyP,EACRvyP,KAAKwyP,oBAAoBrE,IAE7BnuP,KAAKyyP,uBAAuBtE,EACvC,CAEA,KAAKrD,EAAW2B,KACZ,OAAOzsP,KAAKyyP,uBAAuBtE,GAEvC,KAAKrD,EAAWiC,mBAAoB,KAAA2F,EAChC,MAAM9C,QAAoB5vP,KAAKwyP,oBAAoBrE,GAUnD,OATgB,QAAhBuE,EAAIvE,EAAOhuP,aAAK,IAAAuyP,GAAZA,EAAcxwP,aACd0tP,EAAYp9L,QAAQ,CAChBw8L,SAAU,IACVC,WAAY,IACZ50K,YAAa,wBACb60K,KAAM,GACNC,SAAU,KAGXS,CACX,CACA,KAAK9E,EAAWsC,SAChB,KAAKtC,EAAWqC,cAChB,KAAKrC,EAAWiD,qBAChB,KAAKjD,EAAWoC,iBAChB,KAAKpC,EAAW4C,yBAChB,KAAK5C,EAAW6C,oBAChB,KAAK7C,EAAWyC,sBACZ,OAAOvtP,KAAKwyP,oBAAoBrE,GACpC,KAAKrD,EAAWuC,eAChB,KAAKvC,EAAWkC,YAChB,KAAKlC,EAAW0C,uBACZ,OAAOxtP,KAAKwyP,oBAAoBrE,EAAQ,KAC5C,KAAKrD,EAAWwC,eAChB,KAAKxC,EAAWmC,UAChB,KAAKnC,EAAW2C,qBACZ,OAAOztP,KAAKwyP,oBAAoBrE,EAAQ,KAC5C,KAAKrD,EAAWgD,0BACZ,OAAO9tP,KAAK2yP,yCAChB,KAAK7H,EAAW4B,KACZ,OAAO1sP,KAAKwyP,oBAAoBrE,GAGpC,MAAO,EAAE,IACZruP,EAAA,+CAEgD,IACtC,CACH,CACIkvP,SAAU,IACVC,WAAY,IACZ50K,YAAa,kBACb60K,KAAM,GACNC,SAAU,IAEd,CACIH,SAAU,IACVC,WAAY,IACZ50K,YAAa,WACb60K,KAAM,GACNC,SAAU,OAKtBrvP,EAAA,yBAC4BquP,IACxB,MAAMtoP,EAAOsoP,EAAOnC,aACpB,IAAKnmP,EACD,MAAO,GAGX,MAAM2oP,EAAsB,GAEtB1oP,EAASqoP,EAAOroP,QAAU,GAC1BC,EAASF,EAAKE,QAAU,GAC9B,IAAK,MAAM5F,KAAS4F,EACZ5F,EAAM8D,cAAgB6B,EAAO3F,EAAM1C,OACnC+wP,EAAQl/O,KAAKnP,GAIrB,OAAOquP,CAAO,IAGlB1uP,EAAA,+BACkCquP,IAAoD,IAAAyE,EAAAC,EAClF,GAAwB,QAApBD,EAACzE,EAAOnC,oBAAY,IAAA4G,GAAQ,QAARC,EAAnBD,EAAqB7sP,cAAM,IAAA8sP,IAA3BA,EAA6BnsP,OAC9B,MAAO,GAIX,MAAMosP,EAAgB3E,EAAOvC,gBAAkB,EAC/C,IAAIxmO,EAAS,KACb,IAAK,IAAIsa,EAAIozN,EAAepzN,EAAI,GAAKA,GAAKyuN,EAAOvC,gBAAkB,GAA2B,MAAtBuC,EAAOphO,QAAQ2S,GAAYA,IAC/Fta,EAASA,EAAOwH,UAAU,GAE1BkmO,EAAgB,GAAuC,MAAlC3E,EAAOphO,QAAQ+lO,KACpC1tO,EAAS,IAGb,MAAM2tO,EAAa5E,EAAOnC,aAAajmP,OAAOtF,QAAQN,GAAUA,EAAMjB,OAASiB,EAAMjB,MAAMqB,cAAc4O,WAAWg/O,EAAOxC,WAAWprP,iBAAmB4tP,EAAOroP,OAAO3F,EAAM1C,QAC7K,OAAIs1P,EACOA,EAAWpyP,KAAKsF,IAAM,IAAA+sP,EACzB,MAAO,CACHhE,SAAU5pO,GAAUnf,EAAE/G,OAAS+G,EAAExI,MACjCwxP,WAAY,MAAQhpP,EAAE/G,OAAS+G,EAAExI,MACjC48E,YAAap0E,EAAEzI,aAAe,GAC9B0xP,KAAMjpP,EAAErE,MAAQ,GAChButP,UAAwB,QAAd6D,EAAA7E,EAAOjgP,eAAO,IAAA8kP,OAAA,EAAdA,EAAgB31P,OAAQ,GACrC,IAIF,EAAE,IAGbyC,EAAA,4BAC8BjM,MAAOs6P,EAAuB8E,KAAkE,IAAAC,EAC1H,IAAK/E,IAAWA,EAAOhuP,MACnB,MAAO,GAEX,MAAM8F,EAAIkoP,EAAOhuP,MAEjB,OAAQ8F,EAAEzN,MACV,KAAKoK,EAAAA,GAAcG,KACf,OAAO/C,KAAKmzP,wBAAwBhF,GACxC,KAAKvrP,EAAAA,GAAcI,QACf,OAAOhD,KAAKozP,2BAA2BjF,GAC3C,KAAKvrP,EAAAA,GAAckC,KACf,OAAO9E,KAAKqzP,sBAAsBlF,GACtC,KAAKvrP,EAAAA,GAAcC,eACf,OAAO7C,KAAKszP,4BAA4BnF,EAAQ8E,GACpD,KAAKrwP,EAAAA,GAAcE,cACf,OAAO9C,KAAKuzP,2BAA2BpF,EAAQ8E,GAGnD,MAAMO,QAA2BC,EAAAA,EAAAA,IAAyBtF,EAAOxC,WAAY3rP,KAAKpM,MAAOoM,KAAKmR,UAAWnR,KAAKisC,OAAQgnN,GACtH,GAAIO,EACA,OAAOA,EAIX,IAAI9B,EAAWvD,EAAOxC,WAClB+F,GAAYuB,IACZvB,EAAWuB,EAAYvB,EAAWuB,GAGtC,MAAMtE,EAAYR,EAAOhuP,MAAM4D,aAAeoqP,EAAOhuP,MAAMjB,OAASivP,EAAOhuP,MAAM1C,KACjF,MAAO,CAAC,CACJuxP,SAAU0C,EACVzC,WAAY,GAAFhxP,OAAK0wP,EAAS,MAAA1wP,OAAKg1P,GAAa,KAAGh1P,OAAGkwP,EAAOxC,YAAU1tP,OAAGg1P,GAAa,KACjF54K,YAAap0E,EAAEzI,aAAe,GAC9B0xP,KAAM,GACNC,UAAwB,QAAd+D,EAAA/E,EAAOjgP,eAAO,IAAAglP,OAAA,EAAdA,EAAgB71P,OAAQ,IACpC,IAGNyC,EAAA,mCACqC,CAACquP,EAAuB8E,KAAiD,IAAAS,EAC1G,MAAMztP,EAAIkoP,EAAOhuP,MACX6vB,EAAgB,QAAZ0jO,EAAGztP,EAAE5K,eAAO,IAAAq4P,OAAA,EAATA,EAAWjzP,QAAQg7K,GAAQA,EAAIv8K,MAAMqB,cAAc4O,WAAWg/O,EAAOxC,WAAWprP,iBAC7F,OAAKyvB,SAAAA,EAAMtpB,OAYJspB,EAAKrvB,KAAK86K,IAAQ,IAAAk4E,EACrB,IAAIjC,EAAWj2E,EAAI36K,MAMnB,OALImyP,EACAvB,EAAWuB,EAAYvB,EAAWuB,EAC3BW,EAAYn4E,EAAI36K,SACvB4wP,EAAW,IAAMA,EAAW,KAEzB,CACH1C,SAAU0C,EACVzC,WAAYxzE,EAAIv8K,MAChBgwP,KAAMjpP,EAAErE,MAAQ,GAChBy4E,YAAap0E,EAAEzI,aAAe,GAC9B2xP,SAAU1zE,EAAI16K,YAA2B,QAAlB4yP,EAAIxF,EAAOjgP,eAAO,IAAAylP,OAAA,EAAdA,EAAgBt2P,OAAQ,GACtD,IAxBM,CAAC,CACJ2xP,SAAU,GACVC,WAAY,GACZC,KAAMlvP,KAAK6G,KAAKC,cAAc,CAC1BzS,GAAI,4BACJ0S,eAAgB,yBAEpBszE,YAAa,GACb80K,SAAUuB,EAAAA,IAiBhB,IAGN5wP,EAAA,oCACsCjM,MAAOs6P,EAAuB8E,KAA0D,IAAAY,EAAAC,EAAAhrP,EAAAirP,EAC1H,MAAM9tP,EAAIkoP,EAAOhuP,MACjB,IAAK8F,EAED,OAAOjG,KAAKg0P,iCAAiCh0P,KAAK6G,KAAKC,cAAc,CACjEzS,GAAI,qCACJ0S,eAAgB,uBAIxB,MAAM,KAACsG,EAAI,aAAExF,SAAsB7H,KAAK4uP,mBAAmBT,EAAQloP,EAAE4H,QACrE,IAAKR,EACD,OAAOrN,KAAKg0P,iCAAiCh0P,KAAK6G,KAAKC,cAAc,CACjEzS,GAAI,4CACJ0S,eAAgB,kDACjB,CACCc,kBAGRwF,EAAKS,MAAQqgP,EAAOxC,WACpBt+O,EAAKM,eAA6B,QAAfkmP,EAAG1F,EAAOhuP,aAAK,IAAA0zP,OAAA,EAAZA,EAAcp2P,KAEpC,MAAMgK,QAAYzH,KAAKpM,MAAMD,UAASoa,EAAAA,EAAAA,IAAYV,EAAMrN,KAAK6G,OAE7D,GAAIY,EAAIzT,MAAO,CACX,MAAM4T,EAAgBH,EAAIzT,MAC1B,OAAOgM,KAAKg0P,iCAAiCpsP,EAAcE,MAAQ9H,KAAK6G,KAAKC,cAAc,CACvFzS,GAAI,qBACJ0S,eAAgB,4BAExB,CAEA,MAAMmB,EAAeT,EAAIxT,KACzB,OAAQiU,EAAa1P,MACrB,KAAK4P,EAAAA,GAAqBE,GACtB,MACJ,KAAKF,EAAAA,GAAqBG,SAC1B,KAAKH,EAAAA,GAAqBC,KACtB,OAAOrI,KAAKg0P,iCAAiCh0P,KAAK6G,KAAKC,cAAc,CACjEzS,GAAI,uCACJ0S,eAAgB,6DACjB,CACCvO,KAAM0P,EAAa1P,QAE3B,QACI,OAAOwH,KAAKg0P,iCAAiCh0P,KAAK6G,KAAKC,cAAc,CACjEzS,GAAI,oCACJ0S,eAAgB,2DACjB,CACCvO,KAAM0P,EAAa1P,QAI3B,IAAIuQ,EAAQb,SAAkB,QAAN4rP,EAAZ5rP,EAAcjU,YAAI,IAAA6/P,OAAN,EAAZA,EAAoB/qP,MAEhC,OADAA,EAAa,QAARD,EAAGC,SAAK,IAAAD,OAAA,EAALA,EAAOrI,OAAOuI,EAAAA,IACZ,QAAN+qP,EAAChrP,SAAK,IAAAgrP,GAALA,EAAOrtP,OAgBLqC,EAAMpI,KAAKsnG,IAA8B,IAAAgsJ,EAC5C,IAAIvC,EAAWzpJ,EAAEnnG,MAMjB,OALImyP,EACAvB,EAAWuB,EAAYvB,EAAWuB,EAC3BW,EAAY3rJ,EAAEnnG,SACrB4wP,EAAW,IAAMA,EAAW,KAExB,CACJ1C,SAAU0C,EACVr3K,YAAa4tB,EAAE/oG,OAAS+oG,EAAEnnG,MAC1BmuP,WAAYhnJ,EAAEnnG,MACdouP,KAAM,GACNC,SAAUlnJ,EAAElnG,YAA2B,QAAlBkzP,EAAI9F,EAAOjgP,eAAO,IAAA+lP,OAAA,EAAdA,EAAgB52P,OAAQ,GACpD,IA5BM,CAAC,CACJ2xP,SAAU,GACVC,WAAY,GACZC,KAAMlvP,KAAK6G,KAAKC,cAAc,CAC1BzS,GAAI,4BACJ0S,eAAgB,yBAEpBooP,SAAU,GACV90K,YAAar6E,KAAK6G,KAAKC,cAAc,CACjCzS,GAAI,6BACJ0S,eAAgB,kDAmB1B,IACLjH,EAAA,yCAE2CpD,IACxC,MAAMiM,EAAS3I,KAAK6G,KAAKC,cAAc,CACnCzS,GAAI,aACJ0S,eAAgB,kBACjB,CACC/S,MAAO0I,IAEX,MAAO,CAAC,CACJsyP,SAAU,GACVC,WAAY,GACZC,KAAMlvP,KAAK6G,KAAKC,cAAc,CAC1BzS,GAAI,gCACJ0S,eAAgB,yBAEpBooP,SAAUuB,EAAAA,GACVr2K,YAAa1xE,GACf,IACL7I,EAAA,gCAEiCjM,UAC9B,IAAI0wD,EAAQ4pM,EAAOxC,WAAW9+N,OACb,MAAb03B,EAAM,KACNA,EAAQA,EAAM33B,UAAU,IAE5B,MAAM,KAAC34B,SAAc+L,KAAKpM,MAAMD,UAASwxB,EAAAA,EAAAA,IAA2Bo/B,EAAOvkD,KAAKmR,YAChF,OAAO+iP,EAAAA,EAAAA,IAAmBjgQ,EAAK,IAClC6L,EAAA,mCAEoCjM,UACjC,IAAI0wD,EAAQ4pM,EAAOxC,WAAW9+N,OACb,MAAb03B,EAAM,KACNA,EAAQA,EAAM33B,UAAU,IAE5B,MAAM,KAAC34B,SAAc+L,KAAKpM,MAAMD,UAASsN,EAAAA,EAAAA,IAAqBjB,KAAKisC,OAAQsY,IAC3E,OAAO4vM,EAAAA,EAAAA,IAAsBlgQ,EAAK,IAGtC6L,EAAA,8BACiCquP,IAC7B,MAAMyB,EAAwC,GAEJ,IAAAwE,EAAAC,EAAAC,EASCC,EAAAC,EAAAC,EAS3C,MAlBI,OAAOtlP,WAAWg/O,EAAOxC,aACzBiE,EAAYtgP,KAAK,CACb0/O,SAAU,OACVC,WAAY,OACZ50K,aAAyB,QAAZ+5K,EAAAjG,EAAOhuP,aAAK,IAAAi0P,OAAA,EAAZA,EAAc52P,cAAe,GAC1C0xP,MAAkB,QAAZmF,EAAAlG,EAAOhuP,aAAK,IAAAk0P,OAAA,EAAZA,EAAczyP,OAAQ,GAC5ButP,UAAwB,QAAdmF,EAAAnG,EAAOjgP,eAAO,IAAAomP,OAAA,EAAdA,EAAgBj3P,OAAQ,KAGtC,QAAQ8R,WAAWg/O,EAAOxC,aAC1BiE,EAAYtgP,KAAK,CACb0/O,SAAU,QACVC,WAAY,QACZ50K,aAAyB,QAAZk6K,EAAApG,EAAOhuP,aAAK,IAAAo0P,OAAA,EAAZA,EAAc/2P,cAAe,GAC1C0xP,MAAkB,QAAZsF,EAAArG,EAAOhuP,aAAK,IAAAq0P,OAAA,EAAZA,EAAc5yP,OAAQ,GAC5ButP,UAAwB,QAAdsF,EAAAtG,EAAOjgP,eAAO,IAAAumP,OAAA,EAAdA,EAAgBp3P,OAAQ,KAGnCuyP,CAAW,IArjClB5vP,KAAKpM,MAAQA,IAAS8gQ,EAAAA,EAAAA,MACtB10P,KAAKmR,UAAYA,EACjBnR,KAAKiuP,WAAaA,EAClBjuP,KAAKisC,OAASA,EACdjsC,KAAK6G,KAAOA,CAChB,CAyFA,iCAAc0nP,CAA4BJ,GAAuB,IAAAwG,EAAAC,EACrC,QAApBD,EAACxG,EAAOnC,oBAAY,IAAA2I,GAAnBA,EAAqB5uP,cAIpBsiB,QAAQyuB,KAAuB,QAAnB89M,EAAAzG,EAAOnC,oBAAY,IAAA4I,OAAA,EAAnBA,EAAqB7uP,OAAOpF,KAAI9M,UAC9C,GAAKoS,EAAEnF,QAIHmF,EAAE7D,YAAc6D,EAAExI,QAAQ0wP,EAAOroP,SACjC,OAAQG,EAAEzN,MACV,KAAKoK,EAAAA,GAAcwB,KACf+pP,EAAOroP,OAAOG,EAAExI,MAAQwI,EAAEnF,MAC1B,MACJ,KAAK8B,EAAAA,GAAckC,KACfqpP,EAAOroP,OAAOG,EAAExI,MAAQ,OACxB,MACJ,KAAKmF,EAAAA,GAAcG,KAAM,CACrB,MAAMgvG,EAAU9rG,EAAEnF,MAA0BA,MAC5C,IAAIJ,GAAOm0P,EAAAA,EAAAA,IAAW70P,KAAKpM,MAAMqf,WAAY8+F,GAC7C,IAAKrxG,EAAM,CACP,MAAMwwP,QAAuBlxP,KAAKpM,MAAMD,UAAS6jC,EAAAA,EAAAA,IAAQu6E,IACzD,GAAI,UAAWm/I,EAEX,MAEJxwP,EAAOwwP,EAAej9P,IAC1B,CACAk6P,EAAOroP,OAAOG,EAAExI,MAAQiD,EAAK7C,SAC7B,KACJ,CACA,KAAK+E,EAAAA,GAAcI,QAAS,CACxB,MAAMmO,EAAalL,EAAEnF,MAA0B5B,MAC/C,IAAIgC,GAAUogB,EAAAA,EAAAA,IAActhB,KAAKpM,MAAMqf,WAAY9B,GACnD,IAAKjQ,EAAS,CACV,MAAMgwP,QAAuBlxP,KAAKpM,MAAMD,UAAS6uB,EAAAA,EAAAA,GAAWrR,IAC5D,GAAI,UAAW+/O,EAEX,MAEJhwP,EAAUgwP,EAAej9P,IAC7B,CACAk6P,EAAOroP,OAAOG,EAAExI,MAAQyD,EAAQzD,KAChC,KACJ,CACA,KAAKmF,EAAAA,GAAcE,cACnB,KAAKF,EAAAA,GAAcC,eACfsrP,EAAOroP,OAAOG,EAAExI,MAASwI,EAAEnF,MAA0BA,MAEzD,KAAK8B,EAAAA,GAAcqC,UAIvB,MACE,GACV,EAm6BJ,SAAS2uP,EAAY9yP,GACjB,OAA4B,IAAxBA,EAAM0rB,QAAQ,OAIW,IAAzB1rB,EAAM0rB,QAAQ,KAKtB,C,+mBC15DO,MAAMsoO,EAA6B/xO,EAAAA,GAAUqsO,aAAa0F,2BACpDC,EAA0BhyO,EAAAA,GAAUqsO,aAAa2F,wBAEvDlhQ,eAAe4/P,EAAyBl3E,EAAiB3oL,EAAcud,EAAmB86B,GAA0E,IAA1DgnN,EAAS1vP,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACzH,MAAMyxP,EAAiBz4E,EAAQz6I,MAAM,KAC/BmzN,EAAyBD,EAAe5lP,MAAM,GAAI,GAAG63C,KAAK,KAC1DiuM,EAAWF,EAAeA,EAAetuP,OAAS,GACxD,GAAIwuP,EAAS/lP,WAAW,KAAM,CAC1B,MAAM,KAAClb,SAAcL,EAAMD,UAASwxB,EAAAA,EAAAA,IAA2B+vO,EAAStoO,UAAU,GAAIzb,IAChF3Q,QAAc0zP,EAAmBjgQ,GAQvC,OAPAuM,EAAMwF,SAASomG,IACX,IAAIslJ,EAAWuD,EAAyBA,EAAyB,IAAM7oJ,EAAE4iJ,SAAW5iJ,EAAE4iJ,SAClFiE,IACAvB,EAAWuB,EAAYvB,GAE3BtlJ,EAAE4iJ,SAAW0C,CAAQ,IAElBlxP,CACX,CAEA,GAAI00P,EAAS/lP,WAAW,OAAS+lP,EAAS/lP,WAAW,MAAO,CACxD,MAAM,KAAClb,SAAcL,EAAMD,UAASsN,EAAAA,EAAAA,IAAqBgrC,EAAQipN,EAAStoO,UAAU,KAC9EzK,QAAiBgyO,EAAsBlgQ,GAQ7C,OAPAkuB,EAASnc,SAASue,IACd,IAAImtO,EAAWuD,EAAyBA,EAAyB,IAAM1wO,EAAEyqO,SAAWzqO,EAAEyqO,SAClFiE,IACAvB,EAAWuB,EAAYvB,GAE3BntO,EAAEyqO,SAAW0C,CAAQ,IAElBvvO,CACX,CAEA,OAAO,IACX,CAEOtuB,eAAeqgQ,EAAmBiB,GAAyE,IAAAC,EAAAC,EAC9G,MAAMC,EAAsB,CAAC,CACzBtG,SAAU,GACVC,WAAY,GACZ50K,YAAa,gBACb60K,KAAM,GACNC,SAAU,KAEd,IAAKgG,EACD,OAAOG,EAGX,KAAKH,EAAkB30P,MAAMkG,QAA2C,QAAjC0uP,EAACD,EAAkB5vO,sBAAc,IAAA6vO,GAAhCA,EAAkC1uP,QACtE,OAAO4uP,EAGX,MAAMvsP,EAAkC,GAQxC,OAPAosP,EAAkB30P,MAAMwF,SAASomG,IAC7BrjG,EAAMuG,KAAKimP,EAAkBnpJ,GAAG,IAEJ,QAAhCipJ,EAAAF,EAAkB5vO,sBAAc,IAAA8vO,GAAhCA,EAAkCrvP,SAASomG,IACvCrjG,EAAMuG,KAAKimP,EAAkBnpJ,GAAG,IAG7BrjG,CACX,CAEOlV,eAAesgQ,EAAsBhyO,GACxC,MAAMqzO,EAAqB,CAAC,CACxBxG,SAAU,GACVC,WAAY,GACZ50K,YAAa,mBACb60K,KAAM,GACNC,SAAU,KAEd,OAAKhtO,GAGAA,EAASzb,OAIAyb,EAASxhB,KAAK4jB,IACjB,CACHyqO,SAAU,IAAMzqO,EAAE9mB,KAClBwxP,WAAY1qO,EAAE9mB,KACd48E,YAAa,GACb60K,KAAM,GACNC,SAAU,GACV32P,KAAMs8P,EACN73P,KAAMsnB,MAdHixO,CAmBf,CAEA,SAASD,EAAkBnpJ,GACvB,MAAO,CACH4iJ,SAAU,IAAM5iJ,EAAEvuG,SAClBoxP,WAAY7iJ,EAAEvuG,SACdw8E,YAAa,GACb60K,KAAM,GACNC,SAAU,GACV32P,KAAMu8P,EACN93P,KAAMmvG,EAEd,C,eCjDO,MAAMsoJ,EAAWA,IAAMe,EAAAA,QAIjBlE,EAAkCxuO,EAAAA,GAAUqsO,aAAamC,gCACzDC,EAAgCzuO,EAAAA,GAAUqsO,aAAaoC,8BACvDd,EAA2B3tO,EAAAA,GAAUqsO,aAAasB,yBAClDoE,EAA6B/xO,EAAAA,GAAUqsO,aAAa0F,2BACpDC,EAA0BhyO,EAAAA,GAAUqsO,aAAa2F,wBAIjDzE,EAAwBnC,IACjC,IAAInzP,EAAM,OAKV,OAJIqqD,EAAAA,EAAAA,QACArqD,EAAM,KAGH,CACHg0P,SAAUb,EAAOphO,QAAQH,UAAU,GAAK2kO,EACxCtC,WAAY,0BACZC,KAAM,GACN70K,YAAa,6BAA+Br/E,EAAM,yCAClDm0P,SAAUoC,EACb,EAGQf,EAA4BrC,IAC9B,CACHa,SAAUb,EAAOphO,QAAQH,UAAU,GAAK4kO,EACxCvC,WAAY,gBACZC,KAAM,GACN70K,YAAa,6DACb80K,SAAUqC,IAaL1iO,EAAW,CACpBhoB,cAAeA,CAAC7O,EAA+C6N,KACpD4vP,EAAAA,EAAAA,IAAyBz9P,EAAQ6N,IAInC+B,EAAeA,CAAChB,EAAuB7S,EAAe2hQ,EAAkBC,IAC1E/uP,EAAKC,cAAc,CACtBzS,GAAI,oBACJ0S,eAAgB,0BACjB,CACC/S,S,0FC9GR,MAAM6hQ,EAA2Bv4P,IAAAA,YAA2D,CAACN,EAAOk7C,KAChG,MAAM,KAACj7C,GAAQD,EAETE,EAAcD,EAAKE,aACnBC,EAAUH,EAAKG,QAEfC,EACFC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAU,qDAIfC,EAAc,KAAOP,EAAKQ,KAAO,IAEvC,OACIH,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,GAEHK,EACDC,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,QAAMC,UAAU,yBACXL,GAEJM,EACAJ,GAEa,IAG9By4P,EAAyB/xP,YAAc,2BAExB,MAAMgzI,UAA+BsoB,EAAAA,EAEhDx/J,WAAAA,CAAYmtN,GACRltN,QAEAG,KAAKiB,qBAAuB8rN,CAChC,CAEA/5B,oBAAAA,CAAqBzW,EAAiB8wC,GAClC,MAAMyoC,EAAoBv5E,EAAQh8K,cAmBlC,OAlBAP,KAAKstN,gBAAgBwoC,GAErB91P,KAAKiB,qBACD60P,GACC3zO,IACOniB,KAAK2tN,qBAAqBmoC,IAI9BzoC,EAAgB,CACZY,eAAgB6nC,EAChB5nC,MAAO/rM,EAASxhB,KAAKO,GAAqBA,EAAQ/D,eAClD4L,MAAOoZ,EACPlnB,UAAW46P,GACb,KAIH,CACX,E,4JC1DJ,MAAME,EAAwBz4P,IAAAA,YAA+D,CAACN,EAAOk7C,KACjG,MAAM,KAACj7C,GAAQD,EAETa,EAAWZ,EAAKY,SACtB,IAAIL,EAAc,GAUlB,OARKP,EAAKa,YAAcb,EAAKc,YAAcd,EAAKe,SAC5CR,EAAc,KAAHS,OAAQC,EAAAA,GAAkBjB,GAAK,MAAAgB,OAAKhB,EAAKe,SAAQ,KACrDf,EAAKe,SACZR,EAAc,MAAHS,OAAShB,EAAKe,SAAQ,MAC1Bf,EAAKa,YAAcb,EAAKc,aAC/BP,EAAc,KAAHS,OAAQC,EAAAA,GAAkBjB,KAIrCK,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,GAEJM,IAAAA,cAACa,EAAAA,EAAM,CACHC,KAAK,MACLP,SAAUA,EACVQ,IAAK/I,EAAAA,GAAQ0gQ,gBAAkB,IAAM/4P,EAAK5I,GAAK,aAAe4I,EAAKk+C,qBAAuB,KAE9F79C,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,QAAMC,UAAU,yBACX,IAAMM,GAEVL,GAEJP,EAAKsB,QAAUjB,IAAAA,cAACkB,EAAAA,EAAM,OACtBC,EAAAA,EAAAA,GAAQxB,EAAKyB,QAAUpB,IAAAA,cAACqB,EAAAA,EAAQ,MACf,IAG9Bo3P,EAAsBjyP,YAAc,wBAErB,MAAM+yI,UAA4BuoB,EAAAA,EAG7Cx/J,WAAAA,CAAYq2P,GACRp2P,QACAG,KAAKM,kBAAoB21P,CAC7B,CAEAjjE,oBAAAA,CAAqBzW,EAAiB8wC,GAClC,MAAMyoC,EAAoBv5E,EAAQh8K,cAkBlC,OAjBAP,KAAKstN,gBAAgBwoC,GAErB91P,KAAKM,kBAAkBw1P,GAAmBtsP,MAAMvV,IAC5C,GAAI+L,KAAK2tN,qBAAqBmoC,GAC1B,OAGJ,MAAMt1P,EAAQvM,EAAKuM,MAEnB6sN,EAAgB,CACZY,eAAgB6nC,EAChB5nC,MAAO1tN,EAAMG,KAAKD,GAAsBA,EAAK7C,WAC7CkL,MAAOvI,EACPvF,UAAW86P,GACb,KAGC,CACX,E,mGCtEJ,MAAMG,EAAuB54P,IAAAA,YAA8D,CAACN,EAAOk7C,KAC/F,MAAM,KAACj7C,GAAQD,EAEf,OACIM,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,GAEHC,EAAK6K,KACY,IAG9BouP,EAAqBpyP,YAAc,uBAEpB,MAAMkzI,UAA2BooB,EAAAA,EAG5Cx/J,WAAAA,CAAYvE,GACRwE,QACAG,KAAK3E,QAAUA,CACnB,CAEA23L,oBAAAA,CAAqB5tK,EAAgBioM,GACjC,OAAsB,IAAlBjoM,EAAO1e,QACP1G,KAAKm2P,kBAAkB9oC,IAChB,KAGPjoM,IACAplB,KAAKo2P,cAAchxO,EAAQioM,IACpB,EAIf,CAEA,uBAAM8oC,CAAkB9oC,GAGpBA,EAAgB,CACZY,eAAgB,GAChBC,MAJUluN,KAAK3E,QAAQsF,KAAK8C,GAAWA,EAAOqE,OAK9CiB,MAAO/I,KAAK3E,QACZJ,UAAWi7P,GAEnB,CAEA,mBAAME,CAAchxO,EAAgBioM,GAChC,MAAMgpC,EAAkBr2P,KAAK3E,QAAQoF,QAAQgD,GAAWA,EAAOqE,KAAKvH,cAAcisB,QAAQpH,EAAO7kB,gBAAkB,IAC7G2tN,EAAQmoC,EAAgB11P,KAAK8C,GAAWA,EAAOqE,OAErDulN,EAAgB,CACZY,eAAgB7oM,EAChB8oM,QACAnlN,MAAOstP,EACPp7P,UAAWi7P,GAEnB,E,okCCrBW,MAAM/wP,UAA4B7H,IAAAA,cAK7CsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,2BAcI,KACjB,GAAIE,KAAKhD,MAAMwnD,SAASz0C,QAAS,CAC7B,MAAMumP,EAAOt2P,KAAKhD,MAAMwnD,SAASz0C,QAAQ40C,wBACzC,MAAO,CAACC,IAAK0xM,EAAK1xM,IAAKoQ,OAAQshM,EAAKthM,OAAQrpD,MAAO2qP,EAAK3qP,MAC5D,CACA,MAAO,CAACi5C,IAAK,EAAGoQ,OAAQ,EAAGrpD,MAAO,EAAE,IACvC7L,EAAA,sBAEgBrD,IACb,MAAMy+D,EAAcz+D,EAAEq7D,OAClB93D,KAAKpK,MAAMg+E,SAAW1Y,EAAYw7G,WACZ,IAAtB12K,KAAKu2P,cACLv2P,KAAKgH,SAAS,CAAC4sE,OAAQ1Y,EAAYw7G,WACvC,IACH52K,EAAA,uBA4CgB,KAAM,IAAA02P,EAAAC,EAAAC,EACnB,IAAK12P,KAAK8mG,UAAU/2F,QAChB,OAAO,EAGX,MAAM4mP,EAAiC,QAAtBH,EAAGx2P,KAAK+zE,sBAAc,IAAAyiL,GAAS,QAATC,EAAnBD,EAAqBzmP,eAAO,IAAA0mP,GAAc,QAAdC,EAA5BD,EAA8BG,oBAAY,IAAAF,OAAvB,EAAnBA,EAA6C,GACjE,OAAKC,EAIEA,EAAYhyM,wBAAwB/4C,OAHhC,CAGsC,IACpD9L,EAAA,0BAEmB,KAChB,MAAM+2P,EAAc72P,KAAK82P,qBAMzB,OALID,EAAYjyM,MAAQ5kD,KAAKpK,MAAMihQ,YAAYjyM,KAC3CiyM,EAAY7hM,SAAWh1D,KAAKpK,MAAMihQ,YAAY7hM,QAC9C6hM,EAAYlrP,QAAU3L,KAAKpK,MAAMihQ,YAAYlrP,OAC7C3L,KAAKgH,SAAS,CAAC6vP,gBAEZA,CAAW,IACrB/2P,EAAA,uBAEiBi3P,IACd,IAAIF,EAAcE,EAKlB,GAJKA,IACDF,EAAc72P,KAAKpK,MAAMihQ,cAGxB72P,KAAK8mG,UAAU/2F,QAChB,OAGJ/P,KAAKu2P,aAAev2P,KAAKg3P,iBAEzB,IAAItyM,EAAc1kD,KAAKhD,MAAMmnD,SACzBn1C,OAAO+5H,YAAc8tH,EAAY7hM,OAASh1D,KAAKu2P,eAC/C7xM,EAAc,OAEdmyM,EAAYjyM,IAAM5kD,KAAKu2P,aAAe,IACtC7xM,EAAc,UAGd1kD,KAAKpK,MAAMuuD,WAAaO,GACxB1kD,KAAKgH,SAAS,CAACm9C,SAAUO,GAC7B,IACH5kD,EAAA,0BAEmB,KAChB,IAAKE,KAAK8mG,UAAU/2F,QAChB,OAGJ,MAAMknP,EAAqBj3P,KAAK8mG,UAAU/2F,QAAQyjJ,QAAQ,eACpD0jG,EAAcD,aAAkB,EAAlBA,EAAoBtyM,wBAEpCuyM,IACIl3P,KAAKpK,MAAMshQ,YAAYtyM,MAAQsyM,EAAYtyM,KAAO5kD,KAAKpK,MAAMshQ,YAAYliM,SAAWkiM,EAAYliM,QAChGh1D,KAAKgH,SAAS,CAACkwP,YAAa,CAACtyM,IAAKsyM,EAAYtyM,IAAKoQ,OAAQkiM,EAAYliM,UAE/E,IAlIAh1D,KAAKpK,MAAQ,CACTg+E,OAAQ,EACRsjL,YAAa,CAACtyM,IAAK,EAAGoQ,OAAQ,GAC9B6hM,YAAa,CAACjyM,IAAK,EAAGoQ,OAAQ,EAAGrpD,MAAO,GACxCw4C,SAAUnnD,EAAMmnD,UAGpBnkD,KAAK8mG,UAAYxpG,IAAAA,YACjB0C,KAAK+zE,eAAiBz2E,IAAAA,YACtB0C,KAAKu2P,aAAe,CACxB,CAkBAh+M,iBAAAA,GACI,GAAIv4C,KAAK8mG,UAAU/2F,QAAS,CACxB,MAAMknP,EAAqBj3P,KAAK8mG,UAAU/2F,QAAQyjJ,QAAQ,eAC1DyjG,SAAAA,EAAoBp8L,iBAAiB,SAAU76D,KAAKm3P,cACxD,CACAnoP,OAAO6rD,iBAAiB,SAAU76D,KAAKo3P,kBAC3C,CAEA95L,oBAAAA,GACI,GAAIt9D,KAAK8mG,UAAU/2F,QAAS,CACxB,MAAMknP,EAAqBj3P,KAAK8mG,UAAU/2F,QAAQyjJ,QAAQ,eAC1DyjG,SAAAA,EAAoBl8L,oBAAoB,SAAU/6D,KAAKm3P,cAC3D,CACAnoP,OAAO+rD,oBAAoB,SAAU/6D,KAAKo3P,kBAC9C,CAEA3+M,kBAAAA,CAAmBC,EAAkBj3C,GACjC,GAAKzB,KAAKhD,MAAMiS,OAAQjP,KAAKhD,MAAMq6P,UAI/B3+M,EAAUzpC,OAASjP,KAAKpK,MAAMqZ,MAC9BypC,EAAU2+M,UAAYr3P,KAAKpK,MAAMyhQ,SACjC51P,EAAUmyE,SAAW5zE,KAAKpK,MAAMg+E,QAChCnyE,EAAUy1P,YAAYtyM,MAAQ5kD,KAAKpK,MAAMshQ,YAAYtyM,KACrDnjD,EAAUy1P,YAAYliM,SAAWh1D,KAAKpK,MAAMshQ,YAAYliM,QAAQ,CAChE,MAAM+hM,EAAiB/2P,KAAKs3P,oBAG5B,GAFAt3P,KAAKu3P,eAAeR,GAEhB/2P,KAAK8mG,UAAU/2F,QAAS,CACxB,MAAMknP,EAAqBj3P,KAAK8mG,UAAU/2F,QAAQyjJ,QAAQ,eACpDgkG,EAAgBP,aAAkB,EAAlBA,EAAoBtyM,wBAC1C,GAAI6yM,IAAmBT,EAAe/hM,OAASwiM,EAAc5yM,KAASmyM,EAAenyM,IAAM4yM,EAAcxiM,QAErG,YADAh1D,KAAKhD,MAAMy6P,kBAGnB,CAEAz3P,KAAKo3P,mBACT,CACJ,CAiEAn0P,MAAAA,GACI,MAAA4kI,EAEI7nI,KAAKhD,MADFA,EAAKU,OAAAC,OAAA,I,oEAAA+5P,CAAA7vH,GAAAA,IAGZnzG,QAAQC,eAAe33B,EAAO,oBAE9B,IAAImnD,EAAW,CAAC,EAKhB,MAJ4B,QAAxBnkD,KAAKpK,MAAMuuD,WACXA,EAAW,CAAC6Q,OAAQh1D,KAAKpK,MAAMshQ,YAAYliM,OAASh1D,KAAKpK,MAAMihQ,YAAYjyM,MAI3EtnD,IAAAA,cAAA,OACIoN,MAAKtW,EAAA,CAAG+vD,SAAU,WAAYplD,OAAQ,IAAK4M,MAAO3L,KAAKpK,MAAMihQ,YAAYlrP,OAAUw4C,GACnFjM,IAAKl4C,KAAK8mG,WAEVxpG,IAAAA,cAAC4O,EAAAA,EAAcxO,OAAAC,OAAA,GACPX,EAAK,CACTmnD,SAAUnkD,KAAKpK,MAAMuuD,SACrBjM,IAAKl4C,KAAK+zE,kBAI1B,EACHj0E,EAtKoBqF,EAAmB,aAvCpCwyP,eAAcv0P,IAAAA,QAAAA,IAAAA,QACdsjG,gBAAetjG,IAAAA,KACfw0P,aAAYx0P,IAAAA,KACZy0P,YAAWz0P,IAAAA,KAAAC,WACXy0P,eAAc10P,IAAAA,KAAAC,WACdk5K,QAAOn5K,IAAAA,OAAAC,WACP4qN,eAAc7qN,IAAAA,QAAAA,IAAAA,QAAAC,WACd0F,MAAK3F,IAAAA,QAAAA,IAAAA,QAAAC,WACL6qN,MAAK9qN,IAAAA,QAAAA,IAAAA,QAAAC,WACLqrN,UAAStrN,IAAAA,OAAAC,WAET00P,cAAa30P,IAAAA,OAIb40P,kBAAiB50P,IAAAA,MAAA,CACbinJ,WAAUjnJ,IAAAA,OAAAC,WACV40P,cAAa70P,IAAAA,OAAAC,WACb60P,cAAa90P,IAAAA,OAAAC,aAKjB4L,KAAI7L,IAAAA,KAAAC,WACJg0P,QAAOj0P,IAAAA,KAAAC,WAEPo0P,iBAAgBr0P,IAAAA,KAAAC,WAChB8gD,SAAQ/gD,IAAAA,MAAA,CAAG,MAAQ,Y,mCClBR,MAAeg8J,EAS1Bx/J,WAAAA,GACII,KAAKm4P,aAAe,GACpBn4P,KAAKo4P,gBAAiB,EACtBp4P,KAAKquN,mBAAoB,EACzBruN,KAAKo2H,gBAAiB,EACtBp2H,KAAK2xL,eAAgB,CACzB,CAIA0mE,YAAAA,GACIr4P,KAAKo2H,gBAAiB,CAC1B,CAEAk3F,eAAAA,CAAgBloM,GACZplB,KAAKm4P,aAAe/yO,EACpBplB,KAAKo4P,gBAAiB,EACtBp4P,KAAKo2H,gBAAiB,CAC1B,CAEAu3F,oBAAAA,CAAqBvoM,GACjB,GAAIplB,KAAK2xL,cACL,OAAO,EAGX,GAAI3xL,KAAKquN,kBACL,OAAO,EAGX,IAAKruN,KAAKo2H,eACN,OAAO,EAGX,GAAIhxG,IAAWplB,KAAKm4P,aAChBn4P,KAAKo4P,gBAAiB,OACnB,GAAIp4P,KAAKo4P,eACZ,OAAO,EAGX,OAAO,CACX,CAEAr8B,aAAAA,GACI,OAAO,CACX,CAEAC,gBAAAA,GACI,MAAO,MACX,E,wQCAJ,MAAMs8B,EAA0Bh7P,IAAAA,YAAwC,CAACN,EAAOk7C,KAC5E,MAAM,KAACj7C,EAAI,cAAEs7P,EAAa,cAAEn1O,GAAiBpmB,EAEvCw7P,EA/DV,SAAoBv7P,EAAemmB,GAC/B,OAAInmB,EAAKzE,OAASuqB,EAAAA,GAAU0K,WAQjB,CACHpwB,KAPAC,IAAAA,cAACa,EAAAA,EAAM,CACHE,KAAKC,EAAAA,EAAAA,KAAgBqvB,EAAAA,EAAAA,IAAyBvK,EAAenmB,EAAKQ,OAClEW,KAAK,OAMTX,KAAM,IAAMR,EAAKE,aACjBK,YAAa,IAIjBP,EAAKzE,OAASuqB,EAAAA,GAAUC,WACjB,CACH3lB,KACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,OAAKC,UAAU,wBAAwB,MAG/CE,KAAM,IAAMR,EAAKE,aAAaonC,QAAQ,KAAM,IAC5C/mC,YAAa,IAIjBP,EAAKzE,OAASuqB,EAAAA,GAAUyB,aACjB,CACHnnB,KACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAU,qDAGrBE,KAAMR,EAAKE,aACXK,YAAa,IAAMP,EAAKQ,MAI5BR,EAAKzE,OAASuqB,EAAAA,GAAU0B,gBACjB,CACHpnB,KACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAU,4DAGrBE,KAAMR,EAAKE,aACXK,YAAa,IAAMP,EAAKQ,MAIzB,IACX,CAUuBg7P,CAAWx7P,EAAMmmB,GACpC,IAAKo1O,EACD,OAAQl7P,IAAAA,cAAAA,IAAAA,SAAA,MAGZ,MAAM,KAACD,EAAI,KAAEI,EAAI,YAAED,GAAeg7P,EAE5B/mF,EAAMx0K,EAAKzE,OAASuqB,EAAAA,GAAU0K,YAAc8qO,EAAgBj7P,IAAAA,cAACkB,EAAAA,EAAM,MAAK,KAE9E,OACIlB,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,GAEHK,EACDC,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,QAAMC,UAAU,yBACXE,GAEJD,GAEJi0K,EACiB,IAE3B6mF,EAAA3yP,UAAA,CA/BCyd,cAAahgB,IAAAA,OAAAC,WACbk1P,cAAan1P,IAAAA,KAAAC,YA+BjBi1P,EAAwBx0P,YAAc,0BACtC,UChFA,GAAesB,EAAAA,EAAAA,UATS8wH,CAACtgI,EAAoB2hC,KACzC,MAAM+qB,GAAWmuI,EAAAA,EAAAA,IAAkB76L,EAAO2hC,EAASt6B,KAAK5I,IAExD,MAAO,CACHkkQ,cAAe1uP,QAAQy4C,GAAYA,EAAS/jD,QAC5C6kB,eAAevL,EAAAA,EAAAA,IAAiBjiB,GACnC,GAGmC,KAAM,KAAM,CAAC0oE,YAAY,GAAjE,CAAwEg6L,GCVlErlP,EAAWrf,EAAAA,QAAMqf,SAEvB,SAASylP,EAAWC,EAAqB17P,GACrC,MAAMmoB,EAASuzO,EAAa,GAAK,IACjC,OAAI17P,EAAKzE,OAASuqB,EAAAA,GAAU0K,WACjBrI,EAASnoB,EAAKE,aAErBF,EAAKzE,OAASuqB,EAAAA,GAAUC,WACjBoC,EAASnoB,EAAKE,aAAaonC,QAAQ,KAAM,KAEhDtnC,EAAKzE,OAASuqB,EAAAA,GAAUyB,eAAgBvnB,EAAKzE,KAASuqB,EAAAA,GAAU0B,iBACzDxnB,EAAKQ,KAGpB,CAIe,MAAMwiO,UAA8B7gE,EAAAA,EAG/Cx/J,WAAAA,CAAYmtN,GACRltN,QACAG,KAAKgtN,8BAAgCD,CACzC,CAEA/5B,oBAAAA,CAAqBzW,EAAiB8wC,GAClC,MAAMwO,EAAY,8BAA+B7vM,KAAKuwJ,EAAQh8K,eAC9D,GAAIs7N,EAAU,CACV,IAAI3O,EAAgB2O,EAAS,GAC7B,MAAM88B,EAAazrC,EAAc/9M,WAAW,KACxCwpP,IACAzrC,EAAgBA,EAAc3oL,QAAQ,KAAM,KAE1B2oL,EAAc/9M,WAAW,OAE3C+9M,EAAgBA,EAAc3oL,QAAQ,KAAM,KAEhDvkC,KAAKstN,gBAAgBJ,GAErBltN,KAAKgtN,8BACDE,GACCj5N,IACG,GAAI+L,KAAK2tN,qBAAqBT,GAC1B,OAGJ,IAAI/qM,EAAWluB,EACX0kQ,IACAx2O,EAAWA,EAAS1hB,QAAQm4P,IAAgBC,EAAAA,EAAAA,IAAgBD,KAAOE,EAAAA,EAAAA,IAAeF,MAGtF,MAAM/3O,GAASC,EAAAA,EAAAA,GAAiB7N,KAEhCkP,EAAWA,EAASg0C,KAAK4iM,EAAAA,GAAqC37J,KAAK,KAAMv8E,EAAQ,CAACkC,EAAAA,GAAUyB,aAAczB,EAAAA,GAAU0B,gBAAiB1B,EAAAA,GAAU0K,WAAY1K,EAAAA,GAAUC,cACrK,MAAMg2O,EAAe72O,EAASxhB,IAAI+3P,EAAWt7J,KAAK,KAAMu7J,IAExDtrC,EAAgB,CACZY,eAAgBf,EAChBgB,MAAO8qC,EACPjwP,MAAOoZ,EACPlnB,UAAWq9P,GACb,GAGd,CAEA,OAAOzuP,QAAQgyN,EACnB,E,8EC5EW,MAAMmE,UAA2B5gE,EAAAA,EAC5C4zB,oBAAAA,CAAqBzW,EAAiB8wC,GAClC,MAAMwO,EAAY,mCAAoC7vM,KAAKuwJ,EAAQh8K,eACnE,GAAIs7N,EAAU,CACV,MAAMo9B,EAAap9B,EAAS,GAE5B77N,KAAKstN,gBAAgB2rC,GAErB,MAAMC,EAAoBx7P,OAAOC,OAAO,GAAI,CAAC,CAACuB,MAAO,gBAAiBurF,KAAMwuK,KAG5E5rC,EAAgB,CACZY,eAAgBgrC,EAChB/qC,MAJUgrC,EAAMv4P,KAAK8pF,GAASA,EAAKA,OAKnC1hF,MAAOmwP,EACPj+P,UAAWiiO,EAAAA,GAEnB,CAEA,OAAOrzN,QAAQgyN,EACnB,CAEAE,aAAAA,GACI,OAAO,CACX,CAEAC,gBAAAA,GACI,MAAO,MACX,E,kLCfJ,MAYMm9B,EAAmB,CAACzpI,UANRA,IAEVpyH,IAAAA,cAAA,KAAGC,UAAU,4BAIgBoyH,SAZpBA,IAETryH,IAAAA,cAAA,KAAGC,UAAU,4BAYf2/N,EAAuBznO,IAOhB,IAPiB,YAC1BwhM,EAAW,aACXmiE,EAAY,OACZv4O,EAAM,aACN+2O,EAAY,eACZ3pC,EAAc,QACdrhN,GACInX,EACAy5H,EAAwC,CAAC,EAC7CA,EAAgBhxH,EAAAA,GAAqC2iB,EAAQquG,GAC7D,MAAOmqI,EAAmBC,IAAwBziP,EAAAA,EAAAA,WAAS,GAErD0iP,GAAiBxiP,EAAAA,EAAAA,cAAaw2C,IAChC,MAAMisM,EAAY,IAAIt+O,KAAKA,KAAKu+O,IAAIlsM,EAAInY,cAAemY,EAAImsM,WAAYnsM,EAAIosM,YAAYjwI,cAAc5nF,MAAM,KAAK,GAChHl1B,EAAQ4sP,EAAWvrC,EAAe,GACnC,CAACrhN,EAASqhN,IAgBb,OAdAvrK,EAAAA,EAAAA,YAAU,KACN,MAAM0pB,EAAiB3vE,IAAqB,IAAA0/D,EACpC8R,EAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAAS8a,OAAwC,eAAT,QAAtB9S,EAAA38D,SAAS+8D,qBAAa,IAAAJ,OAAA,EAAtBA,EAAwB9nE,IAC7EilQ,GAAqB,GACdrrL,EAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAASua,UACnD0qL,SAAAA,IACJ,EAGJ,OADA55P,SAASq7D,iBAAiB,UAAWuR,GAC9B,KACH5sE,SAASu7D,oBAAoB,UAAWqR,EAAc,CACzD,GACF,CAACgtL,IAGA97P,IAAAA,cAACmyH,EAAAA,GAAS,CACNhC,WAAY8rI,EACZnrI,iBAAiB,EACjBriE,KAAM,SACNlrC,OAAQquG,EAAcruG,GACtB29D,aAAc66K,EACdO,cAAehC,EACfvjQ,GAAG,mBACHmP,SAAUyzL,EACVn6L,WAAYq8P,GACd,EAERj8B,EAAAv3N,UAAA,CAhEEsxL,YAAW7zL,IAAAA,WAAA8X,MACXk+O,aAAYh2P,IAAAA,KACZyd,OAAMzd,IAAAA,OAAAC,WACNu0P,aAAYx0P,IAAAA,MA8DhB,QAAe9F,IAAAA,KAAW4/N,GCvD1B,GAAe93N,EAAAA,EAAAA,UAXf,SAAyBxP,GACrB,MAAMgtD,GAAWH,EAAAA,EAAAA,IAAmB7sD,GAC9BirB,GAASC,EAAAA,EAAAA,GAAiBlrB,GAGhC,MAAO,CACHqhM,aAHgB4iE,EAAAA,EAAAA,IAA0Bj3M,GAI1C/hC,SAER,GAEwC,KAAM,KAAM,CAACy9C,YAAY,GAAjE,CAAwE4+J,E,sJCPjE,MAAM48B,EAAuBx8P,IAAAA,YAA+D,CAACN,EAAOk7C,KACvG,MAAM,KAACj7C,GAAQD,EAETa,EAAWZ,EAAKY,SACtB,IAUIozL,EAVAzzL,EAAc,GAmBlB,OAjBKP,EAAKa,YAAcb,EAAKc,YAAcd,EAAKe,SAC5CR,EAAc,GAAHS,OAAMC,EAAAA,GAAkBjB,GAAK,MAAAgB,OAAKhB,EAAKe,SAAQ,KACnDf,EAAKe,SACZR,EAAc,IAAHS,OAAOhB,EAAKe,SAAQ,MACxBf,EAAKa,YAAcb,EAAKc,aAC/BP,EAAc,GAAHS,OAAMC,EAAAA,GAAkBjB,KAInCA,EAAKszG,YACL0gF,EACI3zL,IAAAA,cAACguN,EAAAA,EAAmB,CAChB/tN,UAAU,+BAMlBD,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,GAEJM,IAAAA,cAACa,EAAAA,EAAM,CACHC,KAAK,KACLP,SAAUA,EACVQ,IAAKH,EAAAA,GAAsBjB,EAAK5I,GAAI4I,EAAKk+C,uBAE7C79C,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,QAAMC,UAAU,yBACX,IAAKM,GAETZ,EAAKsB,QAAUjB,IAAAA,cAACkB,EAAAA,EAAM,MACtBhB,GAEJyzL,EACiB,IAG9B6oE,EAAqBh2P,YAAc,uBAEpB,MAAMo8N,UAA2B9gE,EAAAA,EAE5Cx/J,WAAAA,CAAYm6P,GACRl6P,QACAG,KAAKmgO,wBAA0B45B,CACnC,CAEA/mE,oBAAAA,CAAqBzW,EAAiB8wC,GAClC,MAAMwO,EAAY,oBAAqB7vM,KAAKuwJ,EAAQh8K,eAIpD,OAFAP,KAAKg6P,eAAen+B,EAAUxO,GAEvBxjN,QAAQgyN,EACnB,CAEA,oBAAMm+B,CAAen+B,EAAkCxO,GACnD,IAAKwO,EACD,OAGJ,MAAMo+B,EAAiBp+B,EAAS,GAEhC77N,KAAKstN,gBAAgB2sC,GAErB,MAAMhmQ,QAAa+L,KAAKmgO,wBAAwB85B,GAEhD,GAAIj6P,KAAK2tN,qBAAqBssC,GAC1B,OAGJ,MAAMz5P,EAAQ9C,OAAOC,OAAO,GAAI1J,EAAKuM,OAGrC6sN,EAAgB,CACZY,eAAgBgsC,EAChB/rC,MAJa1tN,EAAMG,KAAKD,GAAsBA,EAAK7C,WAKnDkL,MAAOvI,EACPvF,UAAW6+P,GAEnB,CAEA/9B,aAAAA,GACI,OAAO,CACX,E,qOCzFE7P,EAAsB5uN,IAAAA,YAA2D,CAACN,EAAOk7C,KAC3F,MAAM,SACFyZ,EAAQ,KACRz8B,EAAI,eACJ+4L,EAAc,YACd2M,EAAW,QAEXhuN,EAAO,YACPorC,EAAW,KAEX5tC,EAAO,SAAQ,SACf0oD,GAAW,GAEX91D,EADG25E,E,qWAAUx5B,CACbngD,EAAKogD,GAET1oB,QAAQC,eAAegiD,EAAY,QAEnC,MAAMt5B,GAActmC,EAAAA,EAAAA,cAAata,IAC7BA,EAAEyK,iBAEF0F,EAAQsoB,EAAM+4L,EAAe,GAC9B,CAACrhN,EAASsoB,EAAM+4L,IAEbisC,GAAkBnjP,EAAAA,EAAAA,cAAata,IACjCA,EAAEyK,iBAEF8wC,EAAY9iB,EAAK,GAClB,CAAC8iB,EAAa9iB,IAEjB,OACI53B,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKA,EACL36C,UAAWk3C,IAAW,wBAAyB,CAAC,uBAAwBmmL,IACxEhuN,QAASywC,EACTrF,YAAakiN,EACb9vP,KAAMA,EACN0oD,SAAUA,GACN6jB,GAEHhlB,EACC,IAEXu6J,EAAAvmN,UAAA,CAnDCuvB,KAAI9xB,IAAAA,OAAAC,WACJ4qN,eAAc7qN,IAAAA,OAAAC,WACdu3N,YAAWx3N,IAAAA,KAAAC,WAEXsuD,SAAQvuD,IAAAA,KACRwJ,QAAOxJ,IAAAA,KAAAC,WACP20C,YAAW50C,IAAAA,KAAAC,YA+Cf6oN,EAAoBpoN,YAAc,qB,ysBClDlC,MAAMytP,EAAkCxuO,EAAAA,GAAUqsO,aAAamC,gCACzDC,EAAgCzuO,EAAAA,GAAUqsO,aAAaoC,8BACvDr9L,EAAWpxC,EAAAA,GAAUoxC,SAEZ,MAAMkyC,UAAsB/oG,IAAAA,cA8KvCsC,WAAAA,CAAY5C,GAAO,IAAAoJ,EACfvG,MAAM7C,GAAMoJ,EAAApG,KAAAF,EAAA,mBA8DH,IACJE,KAAKwkD,SAASz0C,QAIZ/P,KAAKwkD,SAASz0C,QAHV,OAIdjQ,EAAA,mCAE4B,WACzByoB,YAAW,KACPniB,EAAKm2J,QACLn2J,EAAK4sL,qBAAqB,GAAG,GAHFzvL,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAKtC,IAACzD,EAAA,mCAE4B,KACzBE,KAAKm6P,gCAAiC,CAAI,IAC7Cr6P,EAAA,uBAEiBrD,IACVuD,KAAKm6P,+BACLn6P,KAAKm6P,gCAAiC,EAMtCn6P,KAAK8mG,UAAU3rC,SAAS1+D,EAAE29P,gBAI1BltO,EAAAA,OAAsBzwB,EAAE29P,gBAMvBp6P,KAAKhD,MAAMq9P,0BACZr6P,KAAKs6P,6BAGTt6P,KAAKgH,SAAS,CAAC6+F,SAAS,IAEpB7lG,KAAKhD,MAAMs3E,QACXt0E,KAAKhD,MAAMs3E,OAAO73E,GACtB,IACHqD,EAAA,sBAEgBrD,IAKTuD,KAAK8mG,UAAU3rC,SAAS1+D,EAAE29P,gBAAkBp6P,KAAKm6P,iCAIrDn6P,KAAKgH,SAAS,CAAC6+F,SAAS,KAEpB7lG,KAAKhD,MAAM2pG,aAAe3mG,KAAKhD,MAAM4pG,gBACrCr+E,YAAW,KACP,MAAM48C,EAAUnlE,KAAKuuN,aACrB,GAAIppJ,EAAS,CACT,MAAMo3G,EAAUp3G,EAAQrkE,MAAM8rB,UAAU,EAAGu4C,EAAQ/Y,eAC/CpsD,KAAKhD,MAAM4pG,eAAiB21E,EAAQ71K,QAAU1G,KAAKhD,MAAMu9P,qBACrDv6P,KAAKu8K,UAAYA,GACjBv8K,KAAKgzL,qBAAqBzW,EAGtC,KAIJv8K,KAAKhD,MAAMu3E,SACXv0E,KAAKhD,MAAMu3E,UACf,IACHz0E,EAAA,qBAEerD,IACZ,MAAM0oE,EAAUnlE,KAAKuuN,aACfhyC,EAAUv8K,KAAKhD,MAAMw9P,yBAA2Br1L,EAAQrkE,MAAM+rB,OAASs4C,EAAQrkE,MAAM8rB,UAAU,EAAGu4C,EAAQ/Y,cAE3GpsD,KAAKy6P,WAAaz6P,KAAKu8K,UAAYA,GACpCv8K,KAAKgzL,qBAAqBzW,GAG1Bv8K,KAAKhD,MAAMiD,UACXD,KAAKhD,MAAMiD,SAASxD,EACxB,IACHqD,EAAA,+BAEwB,KACrBE,KAAKy6P,WAAY,EACbz6P,KAAKhD,MAAMo3E,eACXp0E,KAAKhD,MAAMo3E,eACf,IACHt0E,EAAA,gCAE0BrD,IACvB,IAAKA,EAAExI,KACH,OAIJ,MAAMkxE,EAAUnlE,KAAKuuN,aACfhyC,EAAUp3G,EAAQrkE,MAAM8rB,UAAU,EAAGu4C,EAAQhZ,gBAAkB1vD,EAAExI,KAEvE+L,KAAKgzL,qBAAqBzW,GACtBv8K,KAAKhD,MAAMo3E,eACXp0E,KAAKhD,MAAMo3E,eACf,IACHt0E,EAAA,6BAEsB,KACnBE,KAAKy6P,WAAY,EACbz6P,KAAKhD,MAAMo3E,eACXp0E,KAAKhD,MAAMo3E,eACf,IACHt0E,EAAA,uBAEgB,CAACo1B,EAAM+4L,KACpB,MAAM9oJ,EAAUnlE,KAAKuuN,aACfmsC,EAAQv1L,EAAQ/Y,aAChBtkD,EAAO9H,KAAKhD,MAAM8D,MAClBy7K,EAAUp3G,EAAQrkE,MAAM8rB,UAAU,EAAGu4C,EAAQ/Y,cAEnD,IAAIhnC,EACAu1O,GAAc,EAClB,GAAIp+E,EAAQh8K,cAAcqzC,SAASq6K,EAAe1tN,eAC9C6kB,EAASm3J,EAAQ3vJ,UAAU,EAAG2vJ,EAAQ71K,OAASunN,EAAevnN,YAC3D,CAEH,MAAMk0P,EAAqB1lO,EAAKtI,UAAUqhM,EAAevnN,QACnDm0P,EAAUx0J,EAAcy0J,YAAYv+E,EAASq+E,GAEnDD,EAAiC,IAAnBE,EAAQn0P,OACtB0e,EAASm3J,EAAQ3vJ,UAAU,EAAG2vJ,EAAQ71K,OAASm0P,EAAQn0P,OAASunN,EAAevnN,OACnF,CAEA,GAAIi0P,EAEA,OAGJ,MAAMh2L,EAAS78D,EAAK8kB,UAAU8tO,GAExB9sJ,EAAWxoF,EAAS8P,EAAO,IAAMyvC,EAGvC,GAFAQ,EAAQrkE,MAAQ8sG,EAEZ5tG,KAAKhD,MAAMiD,SAAU,CAErB,MAAMxD,EAAI,CACNq7D,OAAQqN,GAIZnlE,KAAKhD,MAAMiD,SAASxD,EACxB,CAGAuS,OAAO22F,uBAAsB,KACrBxgC,EAAQrkE,QAAU8sG,GAClB1vG,EAAAA,GAAuBinE,EAAS//C,EAAO1e,OAASwuB,EAAKxuB,OAAS,EAClE,GACF,IACL5G,EAAA,oBAEco1B,IACX,MAAMiwC,EAAUnlE,KAAKuuN,aAGrB,GAFAppJ,EAAQrkE,MAAQo0B,EAEZl1B,KAAKhD,MAAMiD,SAAU,CAErB,MAAMxD,EAAI,CACNq7D,OAAQqN,GAIZnlE,KAAKhD,MAAMiD,SAASxD,EACxB,KACHqD,EAAA,2BAEoB,CAACo1B,EAAM+4L,EAAgBxxN,KACxC,IAAIs+P,EAAY7lO,EACZ8lO,GAAS,EACTC,GAAqB,EAoBzB,GAnBI/lO,EAAK0e,SAAS29M,KACdwJ,EAAY7lO,EAAKtI,UAAU,EAAGsI,EAAKxuB,OAAS6qP,EAAgC7qP,QAC5Es0P,GAAS,GAGT9lO,EAAK0e,SAAS49M,KACduJ,EAAY7lO,EAAKtI,UAAU,EAAGsI,EAAKxuB,OAAS8qP,EAA8B9qP,QAC1Es0P,GAAS,EACTC,GAAqB,GAGpBD,IACGh7P,KAAKhD,MAAM6pG,wBACX7mG,KAAKk7P,YAAYH,GAEjB/6P,KAAKm7P,eAAeJ,EAAW9sC,IAInCjuN,KAAKhD,MAAMwpG,eAAgB,CAC3B,MAAMz9F,EAAQ/I,KAAKpK,MAAMmT,MACnBmlN,EAAQluN,KAAKpK,MAAMs4N,MACzB,IAAK,IAAIxuL,EAAI,EAAGA,EAAIwuL,EAAMxnN,OAAQg5B,IAC9B,GAAIwuL,EAAMxuL,KAAOq7N,EAAW,CACxB/6P,KAAKhD,MAAMwpG,eAAez9F,EAAM22B,IAChC,KACJ,CAER,CAKA,GAHA1/B,KAAKu8J,QACLv8J,KAAKgzL,qBAAqB,IAEtBioE,EAAoB,CACpB,MAAMG,EAAcp7P,KAAKhD,MAAM+oG,UAAUt9F,MAAMkwG,GAAMA,EAAE0iJ,2BACvD,QAAKD,IAGLA,EAAYC,yBAAyBN,GACrC/6P,KAAKhD,MAAMqD,QAAQwrB,sBAAsBkvO,GACzC/6P,KAAKwkD,SAASz0C,QAAQjP,MAAQ,GAC9Bd,KAAKk+D,aAAa,CAACpG,OAAQ93D,KAAKwkD,SAASz0C,WAClC,EACX,CAIA,GAFA/P,KAAKwkD,SAASz0C,QAAQiP,QAElBg8O,GAAUh7P,KAAKhD,MAAMg3E,WAAY,CACjC,IAAIsnL,EAAK7+P,EAUT,OATKA,IAAKwxE,EAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAAS0zI,OAClDyzD,EAAK,IAAIC,cAAc,UAAW,CAC9BC,SAAS,EAAMC,YAAY,EAAMC,QAAS,KAE1Cj/P,GACAA,EAAEyK,kBAGVlH,KAAKhD,MAAMg3E,WAAWsnL,IACf,CACX,CAEA,IAAKN,EACD,IAAK,MAAMvpE,KAAYzxL,KAAKhD,MAAM+oG,UAC1B0rF,EAASkqE,oBACTlqE,EAASkqE,mBAAmBZ,EAAW9sC,EAAgBjuN,KAAKgzL,sBAIxE,OAAO,CAAK,IACflzL,EAAA,mBAEY,KACTE,KAAK47P,oBAAoB,EAAE,IAC9B97P,EAAA,uBAEgB,KACbE,KAAK47P,qBAAqB,EAAE,IAC/B97P,EAAA,4BAEsB+7P,IACnB,IAAIC,EAAiB97P,KAAKpK,MAAMs4N,MAAM1hM,QAAQxsB,KAAKpK,MAAM84N,YAEjC,IAApBotC,GAOJA,GAAkBD,EAEdC,EAAiB,EACjBA,EAAiB,EACVA,EAAiB97P,KAAKpK,MAAMs4N,MAAMxnN,OAAS,IAClDo1P,EAAiB97P,KAAKpK,MAAMs4N,MAAMxnN,OAAS,GAG/C1G,KAAKgH,SAAS,CACV0nN,UAAW1uN,KAAKpK,MAAMs4N,MAAM4tC,GAC5BA,oBAhBA97P,KAAKgH,SAAS,CACV0nN,UAAW,IAgBjB,IACL5uN,EAAA,qBAEeo1B,IACZ,MAAM4mO,EAAiB97P,KAAKpK,MAAMs4N,MAAM1hM,QAAQxsB,KAAKpK,MAAM84N,WAE3D1uN,KAAKgH,SAAS,CACV0nN,UAAWx5L,EACX4mO,kBACF,IACLh8P,EAAA,cAEO,KACCE,KAAKpK,MAAMyhQ,SACZr3P,KAAKgH,SAAS,CACVqwP,SAAS,EACTppC,eAAgB,GAChBC,MAAO,GACPnlN,MAAO,GACPjM,WAAY,GACZ4xN,UAAW,GACXspC,uBAAmB1/P,GAE3B,IACHwH,EAAA,uBAEgB,IACNE,KAAKpK,MAAMmT,MAAM61B,MAAM3hC,IAAUA,EAAKqM,YAChDxJ,EAAA,sBAEgBrD,IACb,IAAKuD,KAAKhD,MAAM4pG,eAAiB5mG,KAAKhD,MAAM8D,QAAUd,KAAK+7P,iBAAkB,CACzE,MAAMluL,EAAuBpxE,EAAEqxE,SAAWrxE,EAAEsxE,QAC5C,GAAIE,EAAAA,EAAsBxxE,EAAG03D,EAASya,IAClC5uE,KAAKg8P,iBACLv/P,EAAEyK,sBACC,GAAI+mE,EAAAA,EAAsBxxE,EAAG03D,EAAS8a,MACzCjvE,KAAKi8P,aACLx/P,EAAEyK,sBACC,GAAK+mE,EAAAA,EAAsBxxE,EAAG03D,EAAS+Z,SAAWL,GAA0B7tE,KAAKhD,MAAMypG,eAAiBx4B,EAAAA,EAAsBxxE,EAAG03D,EAAS0zI,KAAO,CACpJ,IAAIomB,EAAiB,GACrB,IAAK,IAAIvuL,EAAI,EAAGA,EAAI1/B,KAAKpK,MAAMs4N,MAAMxnN,OAAQg5B,IACrC1/B,KAAKpK,MAAMs4N,MAAMxuL,KAAO1/B,KAAKpK,MAAM84N,YACnCT,EAAiBjuN,KAAKpK,MAAMq4N,eAAevuL,IAMnD,GAAI1/B,KAAKu8K,QAAQh8K,cAAcqzC,SAASq6K,EAAe1tN,gBACnD,GAAIP,KAAK27P,mBAAmB37P,KAAKpK,MAAM84N,UAAWT,EAAgBxxN,GAC9D,YAGJo2C,aAAa7yC,KAAK6sE,WAClB7sE,KAAKk8P,2BAA2Bl8P,KAAKu8K,SAAS,GAG9Cv8K,KAAKhD,MAAMi3E,WACXj0E,KAAKhD,MAAMi3E,UAAUx3E,GAEzBA,EAAEyK,gBACN,MAAW+mE,EAAAA,EAAsBxxE,EAAG03D,EAASua,SACzC1uE,KAAKu8J,QACLv8J,KAAKgH,SAAS,CAACg1N,iBAAkB,SACjCv/N,EAAEyK,kBACKlH,KAAKhD,MAAMi3E,WAClBj0E,KAAKhD,MAAMi3E,UAAUx3E,EAE7B,MAAWuD,KAAKhD,MAAMi3E,WAClBj0E,KAAKhD,MAAMi3E,UAAUx3E,EACzB,IACHqD,EAAA,2BAEoB,KACbE,KAAKwkD,SAASz0C,SACdvQ,SAAS+6D,cAAc,IAAID,YACvB0nC,EAAAA,GAAqBC,MAAO,CACxB/oC,OAAQ,CACJpB,OAAQ93D,KAAKwkD,SAASz0C,QACtBmyF,cAAc,KAI9B,IACHpiG,EAAA,kCAE4B8vP,IACzB,IAAIuM,EAAgB,GACpB,MAAMC,EAAa,GACfp8P,KAAKhD,MAAMq/P,uBACXr8P,KAAKhD,MAAMq/P,sBAAsBzM,GAGrC,IAAK,IAAIlwN,EAAI,EAAGA,EAAIkwN,EAAY1hC,MAAMxnN,OAAQg5B,IAC1Cy8N,EAAc7sP,KAAKsgP,EAAY30P,WAC/BmhQ,EAAW9sP,KAAKsgP,EAAY3hC,gBAG5B2hC,EAAY9yP,aACZq/P,EAAgBvM,EAAY9yP,YAGhC,MAAMoxN,EAAQ0hC,EAAY1hC,MACpBnlN,EAAQ6mP,EAAY7mP,MAC1B,IAAI2lN,EAAY1uN,KAAKpK,MAAM84N,UAmB3B,OAlBuBR,EAAM1hM,QAAQkiM,KACd1uN,KAAKpK,MAAMkmQ,iBAC1B5tC,EAAMxnN,OAAS,EACfgoN,EAAYR,EAAM,GACXluN,KAAKpK,MAAM84N,YAClBA,EAAY,KAIpB1uN,KAAKgH,SAAS,CACVqwP,SAAS,EACT3oC,YACAR,QACAnlN,QACAjM,WAAYq/P,EACZluC,eAAgBmuC,IAGb,CAAC1tC,YAAWT,eAAgB2hC,EAAY3hC,eAAe,IACjEnuN,EAAA,iDAE0C,KACvC,IAAIw8P,GAAgB,EACpB,OAAQ1M,IACJ,MAAM,UAAClhC,EAAS,eAAET,GAAkBjuN,KAAKu8P,0BAA0B3M,GAE/DlhC,GAAa4tC,IACbt8P,KAAK27P,mBAAmBjtC,EAAWT,GACnCquC,GAAgB,EACpB,CACH,IACJx8P,EAAA,mCAE4B,SAACy8K,GAA8B,IAArBm1E,EAAQnuP,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAC3C,MAAM,iBAACiwL,GAAoBptL,EAAKpJ,MAChCoJ,EAAKm2K,QAAUA,EACf,IAAIigF,GAAU,EACVxiQ,EAAWoM,EAAKm2P,0BAChB7K,IACA13P,EAAWoM,EAAKq2P,4CAEpB,IAAK,MAAMhrE,KAAYrrL,EAAKpJ,MAAM+oG,UAG9B,GAFAy2J,EAAU/qE,EAASuB,qBAAqBzW,EAASviL,IAAawiQ,EAE1DA,EAAS,CACT,IAAKp2P,EAAKxQ,MAAMoiQ,mBAAqB,CAAC,IAAK,IAAK,IAAK,KAAKvuN,SAASgoJ,EAASirE,kBAAmB,CAC3F,MAAMC,EAAOlrE,EAASirE,iBAChBE,EAAgB1+P,EAAAA,GAAuBy+P,GAGvC3E,EAAoB95P,EAAAA,GAA2BkI,EAAKmoN,aAAcquC,EAAeppE,GACvFptL,EAAKY,SAAS,CACVgxP,qBAER,CAEA5xP,EAAKY,SAAS,CACVg1N,iBAAkBvqC,EAASuqC,mBAC3BD,cAAetqC,EAASsqC,kBAG5B,KACJ,CAECygC,GACDp2P,EAAKm2J,OAEb,IAACz8J,EAAA,gCAE0By8K,IACvB1pI,aAAa7yC,KAAK6sE,WAClB7sE,KAAK6sE,UAAYtkD,YAAW,IAAMvoB,KAAKk8P,2BAA2B3/E,IAAUx5J,EAAAA,GAAU41B,4BAA4B,IACrH74C,EAAA,6BAEuBy8K,IACpBv8K,KAAKu8K,QAAUA,EACfv8K,KAAK68P,wBAAwBtgF,EAAQ,IACxCz8K,EAAA,aAEM,KACHE,KAAKwkD,SAASz0C,QAAQ81D,MAAM,IAC/B/lE,EAAA,cAEO,KACJ,MAAMykD,EAAQvkD,KAAKwkD,SAASz0C,QACR,OAAhBw0C,EAAMzjD,OAAkByjD,EAAMzjD,MAAM8yC,SAAS,OAC7C2Q,EAAM4H,eAAiB5H,EAAMzjD,MAAM4F,OAAS,EAC5C69C,EAAM6H,aAAe7H,EAAMzjD,MAAM4F,OAAS,GAE1C69C,EAAM4H,eAAiB5H,EAAMzjD,MAAM4F,OAEvC69C,EAAMvlC,QAENhf,KAAKk+D,aAAa,CAACpG,OAAQ93D,KAAKwkD,SAASz0C,SAAS,IACrDjQ,EAAA,wBAEkBgnG,IAEX9mG,KAAK8mG,YACL9mG,KAAK8mG,UAAU/rC,oBAAoB,UAAW/6D,KAAK88P,eACnD98P,KAAK8mG,UAAU/rC,oBAAoB,WAAY/6D,KAAK+8P,iBAGpDj2J,IACAA,EAAUjsC,iBAAiB,UAAW76D,KAAK88P,eAC3Ch2J,EAAUjsC,iBAAiB,WAAY76D,KAAK+8P,iBAIhD/8P,KAAK8mG,UAAYA,CAAS,IAC7BhnG,EAAA,wBAEkBqmG,GACVnmG,KAAKpK,MAAMoiQ,mBAIQ,WAAjB7xJ,GAA6BnmG,KAAKpK,MAAMoiQ,kBAAkBgF,eAAiB,MAHvE72J,IAvjBXnmG,KAAKi9P,kBAAoB3/P,IAAAA,YAGzB0C,KAAKy6P,WAAY,EAEjBz6P,KAAKu8K,QAAU,GAGfv8K,KAAK6sE,UAAY,GAGjB7sE,KAAKm6P,gCAAiC,EAQtCn6P,KAAKpK,MAAQ,CACTiwG,SAAS,EACTwxJ,SAAS,EACTppC,eAAgB,GAChBllN,MAAO,GACPmlN,MAAO,GACPpxN,WAAY,GACZ4xN,UAAW,GACXotC,eAAgB,EAChB//B,eAAe,EACfC,iBAAkB,OAClBg8B,uBAAmB1/P,GAGvB0H,KAAKwkD,SAAWlnD,IAAAA,WACpB,CAEAi7C,iBAAAA,GACIv4C,KAAKgzL,qBAAqBhzL,KAAKu8K,QACnC,CAEA9jI,kBAAAA,CAAmBC,GACf,MAAM,MAAC53C,GAASd,KAAKhD,MAGrB,GAAc,KAAV8D,GAAgBd,KAAKu8K,UAAYz7K,GAKrC,GAAI43C,EAAUwkN,YAAcl9P,KAAKhD,MAAMkgQ,UAAW,CAC9C,MAAM/3L,EAAUnlE,KAAKuuN,aACfhyC,EAAUp3G,EAAQrkE,MAAM8rB,UAAU,EAAGu4C,EAAQ/Y,cAAc7rD,cAEjEP,KAAKgzL,qBAAqBzW,EAC9B,OATIv8K,KAAKgzL,qBAAqBlyL,EAUlC,CAEAw8D,oBAAAA,GACIzqB,aAAa7yC,KAAK6sE,UACtB,CAkgBA5pE,MAAAA,GACI,MAAA4kI,EAMI7nI,KAAKhD,OANH,cACFmgQ,EAAa,cACbj4P,EAAa,aACbihG,EAAY,gBACZO,GAEHmhC,EADM7qI,E,qWAAKmgD,CAAA0qF,EAAAzqF,GAKZ,IAAIu6M,EACA33P,KAAKpK,MAAMmmO,gBACX47B,EAAiB33P,KAAKhD,MAAM26P,gBAIhCjjO,QAAQC,eAAe33B,EAAO,aAC9B03B,QAAQC,eAAe33B,EAAO,YAC9B03B,QAAQC,eAAe33B,EAAO,iBAC9B03B,QAAQC,eAAe33B,EAAO,kBAC9B03B,QAAQC,eAAe33B,EAAO,iBAC9B03B,QAAQC,eAAe33B,EAAO,sBAC9B03B,QAAQC,eAAe33B,EAAO,eAC9B03B,QAAQC,eAAe33B,EAAO,iBAC9B03B,QAAQC,eAAe33B,EAAO,WAC9B03B,QAAQC,eAAe33B,EAAO,UAC9B03B,QAAQC,eAAe33B,EAAO,kBAC9B03B,QAAQC,eAAe33B,EAAO,2BAC9B03B,QAAQC,eAAe33B,EAAO,kBAC9B03B,QAAQC,eAAe33B,EAAO,aAC9B03B,QAAQC,eAAe33B,EAAO,4BAC9B03B,QAAQC,eAAe33B,EAAO,yBAC9B03B,QAAQC,eAAe33B,EAAO,WAC9B03B,QAAQC,eAAe33B,EAAO,4BAC9B03B,QAAQC,eAAe33B,EAAO,oBAG9B,MAAMogQ,EAA0Bl4P,EAC1Bm4P,EAA0BF,EAEhC,OACI7/P,IAAAA,cAAA,OACI46C,IAAKl4C,KAAKs9P,gBACV//P,UAAWyC,KAAKhD,MAAMupG,gBAEtBjpG,IAAAA,cAAA,OACI46C,IAAKl4C,KAAKi9P,kBACV,YAAU,SACV7yP,KAAK,QACL7M,UAAU,YAEdD,IAAAA,cAAC6lG,EAAAA,EAAUzlG,OAAAC,OAAA,CACPu6C,IAAKl4C,KAAKwkD,SACVj6C,aAAa,OACTvN,EAAK,CACT4qG,QAAS5nG,KAAKk+D,aACdq/L,mBAAoBv9P,KAAKw9P,uBACzBC,oBAAqBz9P,KAAK09P,wBAC1BC,iBAAkB39P,KAAK49P,qBACvB3pL,UAAWj0E,KAAKosE,kBAElBpsE,KAAKhD,MAAM4pG,eAAiB5mG,KAAKhD,MAAM8D,MAAM4F,QAAU1G,KAAKhD,MAAMu9P,qBAAuD,SAAhCv6P,KAAKpK,MAAMomO,kBAClG1+N,IAAAA,cAAC8/P,EAAuB,CACpBS,YAAa79P,KAAKi9P,kBAClBhuP,KAAMjP,KAAKpK,MAAMiwG,SAAW7lG,KAAKhD,MAAMq9P,yBACvC99E,QAASv8K,KAAKu8K,QACdp4H,SAAUnkD,KAAK89P,gBAAgB33J,GAC/BwxJ,eAAgBA,EAChBjxJ,gBAAiBA,EACjBoxJ,eAAgB93P,KAAK27P,mBACrB/D,aAAc53P,KAAK+9P,2BACnBlG,YAAa73P,KAAKg+P,aAClB3G,QAASr3P,KAAKpK,MAAMyhQ,QACpBppC,eAAgBjuN,KAAKpK,MAAMq4N,eAC3BllN,MAAO/I,KAAKpK,MAAMmT,MAClBmlN,MAAOluN,KAAKpK,MAAMs4N,MAClB8pC,kBAAmBh4P,KAAKpK,MAAMoiQ,kBAC9BtpC,UAAW1uN,KAAKpK,MAAM84N,UACtB5xN,WAAYkD,KAAKpK,MAAMkH,WACvB0nD,SAAUxkD,KAAKwkD,SACfizM,iBAAkBz3P,KAAK6lE,QAG7B7lE,KAAKhD,MAAM4pG,eAAiB5mG,KAAKhD,MAAM8D,MAAM4F,QAAU1G,KAAKhD,MAAMu9P,qBAAuD,SAAhCv6P,KAAKpK,MAAMomO,kBAClG1+N,IAAAA,cAAC+/P,EAAuB,CACpBt0P,MAAO/I,KAAKpK,MAAMmT,MAClBmlN,MAAOluN,KAAKpK,MAAMs4N,MAClBpxN,WAAYkD,KAAKpK,MAAMkH,WACvBmxN,eAAgBjuN,KAAKpK,MAAMq4N,eAC3B6pC,eAAgB93P,KAAK27P,mBACrB/D,aAAc53P,KAAK+9P,2BACnB3E,aAAcp5P,KAAKi+P,qBAKvC,CAIA,kBAAOnD,CAAY56M,EAAGtwC,GAClB,MAAMsuP,EAASh+M,EAAE3/C,cACX49P,EAASvuP,EAAErP,cAEjB,IAAK,IAAIm/B,EAAIy+N,EAAOz3P,OAAQg5B,EAAI,EAAGA,IAAK,CACpC,MAAM9S,EAAYuxO,EAAOvxO,UAAU,EAAG8S,GAEtC,GAAIw+N,EAAOtqN,SAAShnB,GAChB,OAAOA,CAEf,CAEA,MAAO,EACX,EACH9sB,EAh2BoBumG,EAAa,YACX,CAKfnhG,cAAeoyM,IAAAA,IAAcj0M,WAK7B8iG,aAAcmxG,IAAAA,MAAgB,CAAC,MAAO,WAKtC/rF,eAAgB+rF,IAAAA,YAKhB6lD,cAAe7lD,IAAAA,IAKfx2M,MAAOw2M,IAAAA,OAAiBj0M,WAKxB0iG,UAAWuxG,IAAAA,QAAkBA,IAAAA,QAAkBj0M,WAK/CkjG,eAAgB+wG,IAAAA,OAMhBqgD,eAAgBrgD,IAAAA,QAAkBA,IAAAA,QAKlC5wG,gBAAiB4wG,IAAAA,KAKjBkjD,yBAA0BljD,IAAAA,KAK1B7wG,cAAe6wG,IAAAA,KAKf/iI,QAAS+iI,IAAAA,KAKThjI,OAAQgjI,IAAAA,KAKRr3M,SAAUq3M,IAAAA,KAKVrjI,UAAWqjI,IAAAA,KACXtjI,WAAYsjI,IAAAA,KACZljI,cAAekjI,IAAAA,KAEf8mD,qBAAsB9mD,IAAAA,KAKtB9wG,eAAgB8wG,IAAAA,KAKhBijD,mBAAoBjjD,IAAAA,OAKpB3wG,YAAa2wG,IAAAA,KAKb3yM,SAAU2yM,IAAAA,KAKV1wG,cAAe0wG,IAAAA,KAKfzwG,wBAAyBywG,IAAAA,KAMzB4lD,UAAW5lD,IAAAA,OAKX+kD,sBAAuB/kD,IAAAA,KAKvB+iD,yBAA0B/iD,IAAAA,KAK1B9jB,iBAAkB8jB,IAAAA,KAElBj3M,QAASi3M,IAAAA,MAAgB,CACrBzrL,sBAAuByrL,IAAAA,KAAej0M,aACvCA,WAKHhP,GAAIijN,IAAAA,OACJ/5M,UAAW+5M,IAAAA,OACX31M,YAAa21M,IAAAA,OACbhzM,UAAWgzM,IAAAA,OACX+X,iBAAkB/X,IAAAA,KAClB+mD,WAAY/mD,IAAAA,OACZpjI,UAAWojI,IAAAA,KACXnjI,QAASmjI,IAAAA,KACTjjI,eAAgBijI,IAAAA,KAChB3iI,cAAe2iI,IAAAA,KACfrnI,QAASqnI,IAAAA,KACT5sM,MAAO4sM,IAAAA,OACPxkJ,SAAUwkJ,IAAAA,OACV9+M,KAAM8+M,IAAAA,OACNl0G,UAAWk0G,IAAAA,KACXj0G,QAASi0G,IAAAA,OACZx3M,EA7JgBumG,EAAa,eA+JR,CAClBF,aAAc,MACdI,eAAgB,GAChBoxJ,eAAgB,GAChBjxJ,iBAAiB,EACjB8zJ,0BAA0B,EAC1B/zJ,eAAe,EACf8zJ,mBAAoB,EACpB5zJ,aAAa,EACbC,eAAe,EACfC,yBAAyB,EACzBwzJ,0BAA0B,EAC1B7mE,kBAAkB,IC3K1B,SAAepuL,EAAAA,EAAAA,SAAQ,MAPvB,SAA4BzR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBumB,sBAAqBA,EAAAA,IACtBl4B,GAEX,GACiD,KAAM,CAAC2qE,YAAY,GAApE,CAA2E+nC,E,uqCCwB5D,MAAMn6F,UAAuB5O,IAAAA,cAYxCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,wBAgCC,KAAM,IAAAw+P,EAAAC,EAAAC,EACpB,GAAwB,QAApBF,EAACt+P,KAAKhD,MAAMwnD,gBAAQ,IAAA85M,IAAnBA,EAAqBvuP,QACtB,OAGJ,MAAM0uP,EAA8F,QAAnFF,EAAqE,QAArEC,EAAIx+P,KAAKhD,MAAMwnD,SAA+Cz0C,eAAO,IAAAyuP,OAAA,EAAlEA,EAAoEE,oBAAY,IAAAH,EAAAA,EAAI,EAExGv+P,KAAK6wE,UAAYzvE,KAAKinD,IAClBr5C,OAAO+5H,aAAe01H,EAAc17O,EAAAA,GAAU47O,oBAC9C57O,EAAAA,GAAU67O,2BAGV5+P,KAAKu7I,WAAWxrI,UAChB/P,KAAKu7I,WAAWxrI,QAAQrF,MAAMmmE,UAAY,GAAH5yE,OAAM+B,KAAK6wE,UAAS,MAC/D,IACH/wE,EAAA,mBAsCY,IACFE,KAAKu7I,WAAWxrI,UAC1BjQ,EAAA,qBAEeo1B,IACZ,MAAMwkE,EAAU15F,KAAK42P,aACrB,IAAKl9J,EACD,OAGJ,MAAMmlK,EAAuBnlK,EAAQglK,aAGrC,GAAIG,EAFwBnlK,EAAQ6O,aAEY,CAC5C,MAAMu2J,EAAaplK,EAAQg9E,UACrBqoF,EAAoB/+P,KAAKg/P,uBAAuBtlK,EAAS,cACzDulK,EAAuBj/P,KAAKg/P,uBAAuBtlK,EAAS,cAE5Dz8F,EAAOs2J,IAAAA,YAAqBvzJ,KAAKk/P,SAASr+L,IAAI3rC,IACpD,IAAKj4B,EACD,OAGJ,MAAMkiQ,EAAWliQ,EAAqBmiQ,UAAYp/P,KAAKg/P,uBAAuB/hQ,EAAM,aAC9EoiQ,EAAmBr/P,KAAKg/P,uBAAuB/hQ,EAAM,gBAAkB+C,KAAKg/P,uBAAuB/hQ,EAAM,iBACzGqiQ,EAAcriQ,EAAqBmiQ,UAAYp/P,KAAKg/P,uBAAuB/hQ,EAAM,UAAYoiQ,EAC/FF,EAAUJ,EAAoBD,EAE9BplK,EAAQg9E,UAAYyoF,EAAUJ,EACvBO,EAAaP,EAAoBE,EAAuBH,EAAaD,IAE5EnlK,EAAQg9E,UAAa4oF,EAAaT,EAAwBE,EAAoBE,EAEtF,KApHAj/P,KAAKu7I,WAAaj+I,IAAAA,YAClB0C,KAAKk1G,WAAa53G,IAAAA,YAClB0C,KAAKk/P,SAAW,IAAIn0E,IACpB/qL,KAAKu/P,aAAe,GACpBv/P,KAAKw/P,YAAc,CAAC,EACpBx/P,KAAK6wE,UAAY,CACrB,CAEAt4B,iBAAAA,GACIv4C,KAAKy/P,iBACT,CAEAhnN,kBAAAA,CAAmBC,GACX14C,KAAKhD,MAAM0xN,YAAch2K,EAAUg2K,WAAa1uN,KAAKhD,MAAM0xN,WAC3D1uN,KAAKokI,aAAapkI,KAAKhD,MAAM0xN,YAG5BgxC,EAAAA,EAAAA,IAAc1/P,KAAKw/P,cACpBx/P,KAAKw+N,cAAcx+N,KAAKw/P,aAGxBx/P,KAAKhD,MAAM+L,MAAMrC,OAAS,GAAgC,IAA3BgyC,EAAU3vC,MAAMrC,QAC/C1G,KAAKy/P,iBAEb,CAEAniM,oBAAAA,GACIt9D,KAAK2/P,aACT,CAmBAC,aAAAA,GAAgB,IAAAC,EACZ,MAAM5C,EAA0C,QAAzB4C,EAAG7/P,KAAKhD,MAAM6gQ,mBAAW,IAAAgC,OAAA,EAAtBA,EAAwB9vP,QAC9CktP,IACAA,EAAkB6C,YAAc9/P,KAAKu/P,aAE7C,CAEAI,WAAAA,GAAc,IAAAI,EACV,MAAM9C,EAA0C,QAAzB8C,EAAG//P,KAAKhD,MAAM6gQ,mBAAW,IAAAkC,OAAA,EAAtBA,EAAwBhwP,QAC9CktP,IACAA,EAAkB6C,YAAc,GAExC,CAEAthC,aAAAA,CAAcvhO,GACNA,EAAKY,UACLmC,KAAKu/P,aAAetiQ,EAAKY,UACpBZ,EAAKa,YAAcb,EAAKc,YAAcd,EAAKe,SAC5CgC,KAAKu/P,cAAgB,IAAJthQ,OAAQhB,EAAKa,WAAU,KAAAG,OAAIhB,EAAKc,UAAS,KAAAE,OAAIhB,EAAKe,UAC5Df,EAAKe,SACZgC,KAAKu/P,cAAgB,IAAJthQ,OAAQhB,EAAKe,WACvBf,EAAKa,YAAcb,EAAKc,aAC/BiC,KAAKu/P,cAAgB,IAAJthQ,OAAQhB,EAAKa,WAAU,KAAAG,OAAIhB,EAAKc,aAEhC,qBAAdd,EAAKzE,KACZwH,KAAKu/P,aAAetiQ,EAAKiE,QAAQ/D,aAC1BF,EAAK0kC,QACZ3hC,KAAKu/P,aAAetiQ,EAAKQ,MAGzBuC,KAAKu/P,eACLv/P,KAAKu/P,aAAev/P,KAAKu/P,aAAah/P,eAE1CP,KAAK4/P,eACT,CAsCAZ,sBAAAA,CAAuB53P,EAAyB44P,GAC5C,OAAOz4M,SAASkhD,iBAAiBrhG,GAAwB64P,iBAAiBD,IAAa,IAAK,GAChG,CAEAE,YAAAA,GACI,IAAKlgQ,KAAKhD,MAAMg7P,kBACZ,MAAO,CAAC,EAGZ,MAAM,WAAC3tG,EAAU,cAAE4tG,GAAiBj4P,KAAKhD,MAAMg7P,kBAC/C,IAAIE,EAAgBl4P,KAAKhD,MAAMg7P,kBAAkBE,cAejD,MAb4B,WAAxBl4P,KAAKhD,MAAMmnD,UAAyB+zM,IAEpCA,IAAkB7tG,GAAc,GAAK,GAMrC6tG,EADA7tG,GAAc6tG,GACEA,EAAgB7tG,EAAa6tG,EAE7B,EAGb,CACHl6M,UAAW,aAAF//C,OAAeg6P,EAAa,QAAAh6P,OAAOi6P,EAAa,OAEjE,CAEArqE,aAAAA,CAAcr1L,GACV,MAAMnE,EAAKmE,EAAO,cAAgBA,EAAO,qBACzC,OACI8E,IAAAA,cAAA,OACItC,IAAKxC,EAAO,WACZ+E,UAAU,4BAEVD,IAAAA,cAAA,YACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CAACjT,GAAIA,KAItC,CAEAqyG,eAAAA,GACI,OACIppG,IAAAA,cAAA,OACItC,IAAI,kBACJuC,UAAU,8BACV26C,IAAKl4C,KAAKu7I,YAEVj+I,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,gCACfjB,OAAQ,CACJhF,MAAOd,KAAKhD,MAAMu/K,SAAW,KAC7B3sK,EAAIuwC,GAAmB7iD,IAAAA,cAAA,SAAI6iD,MAK/C,CAEAl9C,MAAAA,GACI,MAAM,eAAC00P,GAAkB33P,KAAKhD,MAE9B,IAAKgD,KAAKhD,MAAMiS,MAAQjP,KAAKhD,MAAMq6P,QAC/B,OAAO,KAGX,MAEMtuP,EAAQ,GACd,GAA2B,IAHP+3J,IAAU9gK,KAAKhD,MAAM+L,OAGzBrC,OAAc,CAC1B,IAAK1G,KAAKhD,MAAM0pG,gBACZ,OAAO,KAEX39F,EAAMuG,KAAKtP,KAAK0mG,kBACpB,CAEA,IAAIy5J,EAAe,KACnB,IAAK,IAAIzgO,EAAI,EAAGA,EAAI1/B,KAAKhD,MAAM+L,MAAMrC,OAAQg5B,IAAK,CAC9C,MAAMziC,EAAO+C,KAAKhD,MAAM+L,MAAM22B,GACxBxK,EAAOl1B,KAAKhD,MAAMkxN,MAAMxuL,GACxBk7L,EAAc1lM,IAASl1B,KAAKhD,MAAM0xN,UAGlCtoJ,EAAYpmE,KAAKhD,MAAMF,WAAW4iC,IACnCi4N,SAAAA,EAAgBluN,SAAS,QAAUkuN,SAAAA,EAAgBluN,SAASxsC,EAAKzE,QAAU2nQ,IAAiBljQ,EAAKzE,OAClGuQ,EAAMuG,KAAKtP,KAAK6tL,cAAc5wL,EAAKzE,OACnC2nQ,EAAeljQ,EAAKzE,MAGpByE,EAAKqM,QACLP,EAAMuG,KAAKhS,IAAAA,cAAC4N,EAAAA,EAAc,CAAClQ,IAAKiC,EAAKzE,SAIrCoiO,IACA56N,KAAKw/P,YAAcviQ,GAGvB8L,EAAMuG,KACFhS,IAAAA,cAAC8oE,EAAS,CACNprE,IAAKk6B,EACLgjB,IAAMA,GAAal4C,KAAKk/P,SAASxvM,IAAIx6B,EAAMgjB,GAC3Cj7C,KAAM+C,KAAKhD,MAAM+L,MAAM22B,GACvBxK,KAAMA,EACN+4L,eAAgBjuN,KAAKhD,MAAMixN,eAAevuL,GAC1Ck7L,YAAaA,EACbhuN,QAAS5M,KAAKhD,MAAM86P,eACpB9/M,YAAah4C,KAAKhD,MAAM66P,eAGpC,CACA,MAAMuI,EAAY,oCAAsCpgQ,KAAKhD,MAAMmnD,SAC7Dk8M,EAAe,sDAAwDrgQ,KAAKhD,MAAMmnD,SAExF,OACI7mD,IAAAA,cAAA,OACI46C,IAAKl4C,KAAKk1G,WACV33G,UAAW6iQ,GAEX9iQ,IAAAA,cAAA,OACIjJ,GAAG,iBACH,cAAY,iBACZ+V,KAAK,OACL8tC,IAAKl4C,KAAKu7I,WACV7wI,MAAKtW,EAAA,CACDy8E,UAAW7wE,KAAK6wE,WACb7wE,KAAKkgQ,gBAEZ3iQ,UAAW8iQ,EACXxrH,YAAa70I,KAAKhD,MAAM46P,cAEvB7uP,GAIjB,EACHjJ,EAlRoBoM,EAAc,aAzB/B+C,KAAI7L,IAAAA,KAAAC,WACJ8gD,SAAQ/gD,IAAAA,MAAA,CAAG,MAAQ,WACnBu0P,eAAcv0P,IAAAA,QAAAA,IAAAA,QACdsjG,gBAAetjG,IAAAA,KACf00P,eAAc10P,IAAAA,KAAAC,WACdu0P,aAAYx0P,IAAAA,KACZy0P,YAAWz0P,IAAAA,KAAAC,WACXk5K,QAAOn5K,IAAAA,OAAAC,WACPg0P,QAAOj0P,IAAAA,KAAAC,WACP4qN,eAAc7qN,IAAAA,QAAAA,IAAAA,QAAAC,WACd0F,MAAK3F,IAAAA,QAAAA,IAAAA,KAAAC,WACL6qN,MAAK9qN,IAAAA,QAAAA,IAAAA,QAAAC,WACLqrN,UAAStrN,IAAAA,OAAAC,WACTvG,WAAUsG,IAAAA,QAAAA,IAAAA,aAAAC,WACV00P,cAAa30P,IAAAA,OAIb40P,kBAAiB50P,IAAAA,MAAA,CACbinJ,WAAUjnJ,IAAAA,OACV60P,cAAa70P,IAAAA,OACb80P,cAAa90P,IAAAA,WAAAtD,EAIAoM,EAAc,eACT,CAClByrP,eAAgB,GAChBjxJ,iBAAiB,G,y9CC4BzB,MAAM45J,GAAiCC,EAAAA,EAAAA,MAEjCC,EAA8B,CAChCnsQ,GAAI,UACJoJ,KAAM,UACNN,aAAc,UACd3E,KAAMuqB,EAAAA,GAAUG,QAChB/G,UAAW,EACXiF,UAAW,GAaf,SAASq/O,EAAcxjQ,GACnB,OAAO4M,QAAQ5M,KAGnB,SAAuBA,GACnB,OAAO4M,QAAQ5M,MAAW,cAAeA,EAC7C,CAL6ByjQ,CAAczjQ,KAAU0jQ,EAAoB1jQ,EACzE,CAMA,SAAS0jQ,EAAoB1jQ,GACzB,OAAO4M,QAAQ5M,GAAQ,WAAYA,EACvC,CAsBA,MAAM2jQ,EAA0BtjQ,IAAAA,YAAwC,CAACN,EAAOk7C,KAC5E,MAAM,KAACj7C,EAAI,OAAEN,EAAM,iBAAE+/B,EAAgB,KAAEvd,EAAI,oBAAEwxK,GAAuB3zL,EAC9DkE,EAAUjE,EAAKiE,QACfo7L,EAAoBp7L,EAAQkgB,WAAmC,IAAtBlgB,EAAQkgB,UAEjDgC,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAE5BW,EAASxb,EAAMyiB,cACf6iC,EAAWtlD,EAAM6jQ,kBACvB,IAAIC,EAAQ,KAEZ,GAAKtoP,GAAUA,EAAOuoP,cAAiB9jQ,EAAK0xC,gBAAiB,CACzD,IAAIqyN,EAEAA,EADA/jQ,EAAK0xC,gBACY1xC,EAAK0xC,gBAELjS,EAAmBlkB,EAAOslB,mBAAqBtlB,EAAOolB,cAEvEojO,EAAiB,IAAM1kE,IACvBwkE,EACIxjQ,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,kCAAoCk8I,EAAsB,eAAiB,KAClGrzL,IAAAA,cAAA,QAAMC,UAAU,SACXyjQ,IAKrB,CAEA,IAEI3jQ,EAFAI,EAAOyD,EAAQ/D,aACfK,EAAc,IAAM0D,EAAQzD,KAE5B6+L,EACAj/L,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAU,+BAGdP,EAAMikQ,SACb5jQ,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAU,8BAGd2D,EAAQ1I,OAASuqB,EAAAA,GAAUyB,aAClCnnB,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAU,qBAGd2D,EAAQ1I,OAASuqB,EAAAA,GAAU0B,gBAClCpnB,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAU,4BAGd2D,EAAQ1I,OAASuqB,EAAAA,GAAUG,QAClC7lB,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAU,oCAGd2D,EAAQ1I,OAASuqB,EAAAA,GAAUC,WAClC3lB,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,OAAKC,UAAU,wBAAwB,MAGxC+kD,IACPjlD,EACIC,IAAAA,cAAC29C,EAAAA,EAAc,CACXpvC,IAAK3N,EAAAA,GAAsBokD,EAASjuD,GAAIiuD,EAASnH,qBACjDx+C,OAAQ2lD,EAAS/jD,YAASjG,EAAYqE,EACtCyB,KAAK,QAKjB,IAAIqzK,EAAM,KACNhwI,EAAe,KACnB,GAAIvgC,EAAQ1I,OAASuqB,EAAAA,GAAU0K,YAAc60B,EAAU,CAC/CA,GAAYA,EAAS/jD,OACrBkzK,EAAMn0K,IAAAA,cAACkB,EAAAA,EAAM,OACNC,EAAAA,EAAAA,GAAQ6jD,EAAWA,EAAS5jD,MAAQ,MAC3C+yK,EAAMn0K,IAAAA,cAACqB,EAAAA,EAAQ,OAGnB8iC,EACInkC,IAAAA,cAACw0G,EAAAA,EAAiB,CACdjrB,aAAa,EACbkrB,OAAQzvD,EAASjuD,GACjB+9G,WAAY,CACR2+E,aAAc,KAK1B,IAAIC,EAAc,GACd1uI,EAASlhC,YACT4vK,EAAe,MAAQh0L,EAAM6J,KAAKC,cAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,kBAGzG7F,EAAQ/D,cAAkBmlD,GAAYA,EAAS/jD,QAG/Cd,EAAO6kD,EAASzkD,SACZykD,EAASjuD,KAAO+uB,IAChB3lB,GAAS,IAAMT,EAAM6J,KAAKC,cAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,WAE9FvJ,EAAcwzL,GANdxzL,EAAc,IAAM8kD,EAASzkD,SAAWmzL,CAQhD,MAAW9vL,EAAQ1I,OAASuqB,EAAAA,GAAUC,aAElCvlB,EAAOyD,EAAQ/D,aACfK,EAAc,IAGlB,IAAIyzL,EAAa,KACbwvE,EAAcv/P,IAAYA,EAAQg/D,SAClC+wH,EACI3zL,IAAAA,cAACs0G,EAAAA,EAAsB,CACnBr0G,UAAU,yBAKtB,IAAIm8C,EAAW,KACX+mN,EAAcv/P,IAAYA,EAAQ4W,SAAWqH,IAC7Cu6B,EAAYp8C,IAAAA,cAAA,QAAMC,UAAU,mCAAmC4hB,EAAKhiB,eAExE,MAAM+jQ,GAAYvwE,GAAuBzvL,EAAQ1I,OAASuqB,EAAAA,GAAU0K,aAAevsB,EAAQ1I,OAASuqB,EAAAA,GAAUG,QAE9G,OACI5lB,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,EACL7jD,GAAE,iBAAA4J,OAAmBiD,EAAQzD,MAC7B,cAAayD,EAAQzD,KACrB2M,KAAK,YACDpN,GAEHK,EACDC,IAAAA,cAAA,OAAKC,UAAU,mDACXD,IAAAA,cAAA,QAAMC,UAAU,yBACZD,IAAAA,cAAA,QAAMC,UAAWk3C,IAAW,CAAC,0BAA2Bx3C,EAAKkkQ,SAAW7kE,KAAsB7+L,GAC7FyjQ,GAAY1jQ,GAAeF,IAAAA,cAAA,QAAMC,UAAU,8BAA8BC,IAE7EikC,EACAwvJ,EACAxf,EACAqvF,GACCnwE,GAAuBj3I,GAEX,IAE3BknN,EAAAj7P,UAAA,CAlKC+2B,iBAAgBt5B,IAAAA,KAAAC,WAEhB49P,SAAQ79P,IAAAA,KAAAC,WACRstL,oBAAmBvtL,IAAAA,KAAAC,WACnB1G,OAAMyG,IAAAA,QA+JVw9P,EAAwB98P,YAAc,0BAyCtC,MAAMs9P,GAAmCh8P,EAAAA,EAAAA,UArCzC,SAAmDxP,EAAoB2hC,GACnE,MAAMr2B,EAAUq2B,EAASt6B,MAAQs6B,EAASt6B,KAAKiE,QACzCwO,EAAYxO,EAAUA,EAAQ7M,GAAK,GACnCs1B,IAAQja,IAAY2xP,EAAAA,EAAAA,IAAazrQ,EAAO6uE,EAAAA,GAAgBC,MAAOh1D,GAErE,IAAImxP,EAOAlkQ,EANA8jQ,EAAcv/P,IAAYA,EAAQ1I,OAASuqB,EAAAA,GAAU0K,WACrDozO,GAAoBpwE,EAAAA,EAAAA,IAAkB76L,EAAOsL,EAAQ7M,IAC9CssQ,EAAoBz/P,KAC3B2/P,GAAoBrpO,EAAAA,EAAAA,IAAQ5hC,EAAOsL,EAAQ1M,SAI3CqsQ,IACAlkQ,GAASslD,EAAAA,EAAAA,IAAmBrsD,EAAOirQ,EAAkBxsQ,KAGzD,MAAMqoC,GAAmBliB,EAAAA,EAAAA,IAA0B5kB,GAEnD,IAAIupB,EACAshP,EAAcv/P,KACdie,GAAOgC,EAAAA,EAAAA,IAAQvrB,EAAOsL,EAAQ4W,UAGlC,MAAM64K,EAAmD,KAA7B1vK,EAAAA,EAAAA,IAAWrrB,GAAO8Q,OAE9C,MAAO,CACH+Y,eAAewE,EAAAA,EAAAA,IAAwBruB,GAAO8Z,GAC9CuxP,SAAUt3O,GAAS9f,QAAQ8f,EAAMjtB,QAAQmwB,QAAUlD,EAAM8B,UAAU/kB,QAAUijB,EAAMsnB,kBAAkBvqC,QACrGm6P,oBACAlkQ,SACA+/B,mBACAvd,OACAwxK,sBAER,GAE4F,KAAM,KAAM,CAACryH,YAAY,GAA5El5D,EAAmF0H,EAAAA,EAAAA,YAAW8zP,IAEvI,IAAIx7O,EAAS,GAEb,SAASk8O,EAA2Cl1C,EAA0BC,GAC1E,OAAID,EAAS/wM,gBAAkBgxM,EAAShxM,eAC7BgxM,EAAShxM,eAAiB+wM,EAAS/wM,eACnC+wM,EAAS/wM,gBACR,EACDgxM,EAAShxM,eACT,GAIJwxM,EAAAA,EAAAA,IAAiC,KAAMT,EAASlrN,QAAoBmrN,EAASnrN,QACxF,CAEO,SAASqgQ,EAAkBn1C,EAA0BC,GACxD,MAAMC,IAAcF,EAASlrN,QAAQkgB,WAA2C,IAA/BgrM,EAASlrN,QAAQkgB,UAC5DmrM,IAAcF,EAASnrN,QAAQkgB,WAA2C,IAA/BirM,EAASnrN,QAAQkgB,UAElE,GAAIkrM,IAAgBC,EAChB,OAAO,EACJ,IAAKD,GAAeC,EACvB,OAAQ,EAGZ,GAAIH,EAASp7B,cAAgBq7B,EAASr7B,YAClC,OAAO,EACJ,GAAIq7B,EAASr7B,cAAgBo7B,EAASp7B,YACzC,OAAQ,EAGZ,MAAM9wI,EAAIksK,EAASlrN,QACb0O,EAAIy8M,EAASnrN,QAEnB,IAAIurN,EAAevsK,EAAE/iD,aAAaoD,cAC9BmsN,EAAe98M,EAAEzS,aAAaoD,cAE9B2/C,EAAE1nD,OAASuqB,EAAAA,GAAU0K,YAAcg/L,EAAat9M,WAAW,OAC3Ds9M,EAAeA,EAAa7/L,UAAU,IAGtChd,EAAEpX,OAASuqB,EAAAA,GAAU0K,YAAci/L,EAAav9M,WAAW,OAC3Du9M,EAAeA,EAAa9/L,UAAU,IAG1C,MAAM+/L,EAAcF,EAAat9M,WAAWiW,IAAWgnM,EAAS3uN,KAAK8C,cAAc4O,WAAWiW,GACxFwnM,EAAcF,EAAav9M,WAAWiW,IAAWinM,EAAS5uN,KAAK8C,cAAc4O,WAAWiW,GAG9F,OAAI86B,EAAE1nD,OAASuqB,EAAAA,GAAUyB,cAAiB4nM,EAAS/wM,gBAAmBzL,EAAEpX,OAASuqB,EAAAA,GAAUyB,eAAgB6nM,EAAShxM,eAEzGzL,EAAEpX,OAASuqB,EAAAA,GAAUyB,cAAiB6nM,EAAShxM,eAKtDsxM,IAAgBC,GACR,GACAD,GAAeC,EAChB,EAEJ00C,EAA2Cl1C,EAAUC,IAThD,EAFD,CAYf,CAkDe,MAAM36B,UAA8BtyB,EAAAA,EAASx/J,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,aAChD0hQ,EAAAA,QAAW,CAQnBxuE,oBAAAA,CAAqBk6B,EAAuBG,GACxC,GAAIH,EAAe,CAGf,GAFA9nM,EAAS8nM,EACTltN,KAAKstN,gBAAgBJ,GACjBltN,KAAK2tN,qBAAqBT,GAC1B,OAAO,EAIX,IAAI/qM,GAAWs/O,EAAAA,EAAAA,IAAsBzhQ,KAAKpM,MAAMqf,YAAYhV,QAAOyjQ,EAAAA,EAAAA,IAA0B1hQ,KAAKpM,MAAMqf,aAAaxS,QAAQ8jB,GAAsB,IAAhBA,EAAEnD,YACrIe,EAAWniB,KAAK2hQ,gCAAgCx/O,GAChD,MAAM3hB,EAAQ8/P,EAA+BtgQ,KAAKpM,MAAMqf,WAAYi6M,GAAe,GAC7E00C,EAAgB5hQ,KAAKquM,WAAW6e,EAAe,CAACszC,KAAmBr+O,GAAW3hB,GAAO,GAAM,GAC7FohQ,GACAv0C,EAAgBu0C,GAIpB5hQ,KAAK6hQ,sBAAsB30C,EAAeG,EAC9C,MACIrtN,KAAK8yL,qCAAqCu6B,GAG9C,OAAO,CACX,CAEA,2BAAMw0C,CAAsB30C,EAAuBG,GAC/C,MAAMz3N,EAAQoK,KAAKpM,MAAMqf,WACnBtb,GAASogB,EAAAA,EAAAA,IAAiBniB,GAEhC,IAAK+B,EACD,OAIJ,IAAImqQ,EAEAA,EADiC,UAFtB/kP,EAAAA,EAAAA,IAAUnnB,GAEdmsQ,sBACMzsQ,EAAAA,GAAQgL,kBAAkB4sN,EAAev1N,EAAQ,IAEjDrC,EAAAA,GAAQgL,kBAAkB4sN,EAAe,GAAI,IAG9D,MAAMO,EAAgBztN,KAAKpM,MAAMD,UAASquQ,EAAAA,EAAAA,IAAkB90C,EAAe,CAAC+0C,gBAAgB,KAE5F,IAAIC,EACAx0C,EAEJ,IACIw0C,QAAwBJ,EAExBp0C,SAD+BD,GACyBx5N,IAC5D,CAAE,MAAOC,GAEL,YADA8L,KAAKpM,MAAMD,UAASq/B,EAAAA,EAAAA,IAAS9+B,GAEjC,CAEA,GAAI8L,KAAK2tN,qBAAqBT,GAC1B,OAGJ,MAAM9pM,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GAGvC,IAAIusQ,GAAmBV,EAAAA,EAAAA,IAAsB7rQ,GAAOqI,QAAOyjQ,EAAAA,EAAAA,IAA0B9rQ,IAAQ6K,QAAQ8jB,GAAsB,IAAhBA,EAAEnD,aAAoB,GACjI+gP,EAAmBniQ,KAAK2hQ,gCAAgCQ,GACxD,MAAMC,EAAgB9B,EAA+B1qQ,EAAOs3N,GAAe,GACrEm1C,EAAqBriQ,KAAKquM,WAAW6e,EAAe,CAACszC,KAAmB2B,GAAmBC,GACjG,IAAIE,EAAoB50C,EAAmBzvN,QAAOskQ,EAAAA,EAAAA,IAAiB3sQ,KAAW,GAC9E0sQ,EAAoBtiQ,KAAK2hQ,gCAAgCW,GAEzD,MAAME,EAAiBN,EAAgB1hQ,OAAS,GAC1CiiQ,EAAsBziQ,KAAKquM,WAAW6e,EAAeo1C,EAAmBE,GAAgB,GAE9FxiQ,KAAKpM,MAAMD,SAAS,CAChB6E,KAAM2+B,EAAAA,GAAUurO,uBAChBzuQ,KAAM,IAAImuQ,EAAc3hQ,QAAQC,GAASA,EAAKrM,KAAO+uB,OAAmBo/O,EAAe/hQ,QAAQC,GAASA,EAAKrM,KAAO+uB,OAExH,MAAMu/O,EAAgB,IAAIN,EAAmBn0C,SAAUu0C,EAAoBv0C,MAAMztN,QAAQy0B,IAAUmtO,EAAmBn0C,MAAMzkL,SAASvU,MAC/H0tO,EAAgB,IAAIP,EAAmBt5P,SAAU05P,EAAoB15P,MAAMtI,QAAQxD,IAAeolQ,EAAmBn0C,MAAMzkL,SAAUxsC,EAAKiE,QAA8B1M,QAAUyI,EAAKiE,QAAQ7M,OAErMg5N,EAAej5N,EAAAA,EAAC,CAAC,EACViuQ,GAAkB,IACrBt5P,MAAO65P,EACP10C,MAAOy0C,IAEf,CAEAE,kBAAAA,CAAmBniQ,EAAmBQ,GAClC,MAAM2F,GAAOi8P,EAAAA,EAAAA,MAEb,IAAIh/P,EAAc,GAClB,MAAMsf,GAAgBvL,EAAAA,EAAAA,IAAiB7X,KAAKpM,MAAMqf,YAmBlD,OAfKvS,EAAK5C,YAAc4C,EAAK3C,YAAc2C,EAAK1C,UAC5C8F,GAAe5F,EAAAA,GAAkBwC,GAC7BA,EAAKrM,KAAO+uB,IACZtf,GAAe,KAAJ7F,OAASyC,EAAK1C,SAAQ,QAE9B0C,EAAK1C,UAAa0C,EAAK5C,YAAe4C,EAAK3C,WAE3C2C,EAAK5C,YAAc4C,EAAK3C,aAC/B+F,GAAe,GAAJ7F,OAAOC,EAAAA,GAAkBwC,KAFpCoD,GAAe,GAAJ7F,OAAOyC,EAAK1C,UAKvB0C,EAAKrM,KAAO+uB,GAAiBtf,IAC7BA,GAAgB,IAAM+C,EAAKC,cAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,WAGxF,CACH7F,QAAS,CACL/D,aAAc2G,EACdrG,KAAMiD,EAAK7C,SACXxJ,GAAI6M,EAAUA,EAAQ7M,GAAKqM,EAAKrM,GAChCG,OAAQkM,EAAKrM,GACb8nB,UAAWzb,EAAKyb,UAChBiF,UAAW,EACX5oB,KAAMuqB,EAAAA,GAAU0K,YAEpBj1B,KAAM,gBACNiF,KAAMiD,EAAK7C,SACXmzL,YAAannL,QAAQnJ,EAAK0gB,WAElC,CAEAitL,UAAAA,CAAW6e,EAAuBU,EAA4BptN,GAA+D,IAAzCuiQ,IAAax/P,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,KAAAA,UAAA,GAASy/P,EAASz/P,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAC/G,MAAM4e,EAAW,GAEXsc,GAAUxa,EAAAA,EAAAA,IAAwBjkB,KAAKpM,MAAMqf,YAE7C46M,EAAwD,CAAC,EAEzDC,EA9Ld,SAAiCm1C,EAAuB/1C,GACpD,MAAMC,EAAqBD,EAAc3sN,cACnC2iQ,EAAqB/1C,EAAmBtgM,OAAOiV,MAAM,SACrDqhO,GAAkBC,EAAAA,EAAAA,IAAqBH,GACvCI,EAA2D,CAAC,EAGlE,OAAQniQ,IACJ,IAAIksN,EAAe,GAAHnvN,OAAMiD,EAAQ/D,cAAYc,OAH5B,OAGwCA,OAAGiD,EAAQzD,MACjE,GAAIyD,EAAQ1I,OAASuqB,EAAAA,GAAUC,YAAc9hB,EAAQ1I,OAASuqB,EAAAA,GAAU0K,WAAY,CAChF,MAAM61O,EAAiBH,EAAgBjiQ,EAAQ7M,KAAO,IAAIuiC,IAAI,IAG9D,IAAK0sO,EAAellQ,MAAQ8C,EAAQ1I,OAASuqB,EAAAA,GAAU0K,WAAY,CAC/D,MAAMj5B,EAAS0J,EAAAA,GAA6BgD,EAAQzD,OACvC+5B,EAAAA,EAAAA,IAAQyrO,EAAUzuQ,IAE3B8uQ,EAAezsO,IAAIriC,EAE3B,CAEA,IAAK,MAAMA,KAAU8uQ,EAAgB,CACjC,IAAIC,EAAaF,EAAkB7uQ,GAEnC,IAAK+uQ,EAAY,CACb,MAAM7iQ,GAAO82B,EAAAA,EAAAA,IAAQyrO,EAAUzuQ,GAC/B,IAAKkM,EACD,SAEJ,MAAM,SAAC1C,EAAQ,SAAEH,GAAY6C,EAC7B6iQ,EAAa,CAACvlQ,EAAUH,EAAUK,EAAAA,GAAkBwC,IAAOumD,KAzBzD,OA0BFo8M,EAAkB7uQ,GAAU+uQ,CAChC,CACAn2C,GAAgBm2C,CACpB,CACJ,CAEA,GAAIL,EAAmBx8P,OAAS,EAAG,CAC/B,MAAM88P,EAAkBp2C,EAAa7sN,cACrC,OAAO2iQ,EAAmBO,OAAOC,GACtBF,EAAgB/5N,SAASi6N,IAExC,CAEA,OAAOt2C,EAAa7sN,cAAckpC,SAAS0jL,EAAmB,CAEtE,CAgJ8BF,CAAwBjtN,KAAKpM,MAAMqf,WAAYi6M,GAE/Dt3N,EAAQoK,KAAKpM,MAAMqf,WAEnBuwB,EAAmE,UAD1DzmB,EAAAA,EAAAA,IAAUnnB,GACW6tC,iCAC9BkgO,GAAsBC,EAAAA,EAAAA,IAA4BhuQ,GAClDiuQ,EAAyB,IAAIjtO,IAAI+sO,GACjCvgP,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GAEvC,IAAK,MAAMsL,KAAW0sN,EAClB,IAAIC,EAAkB3sN,EAAQ7M,KAG1By5N,EAAc5sN,GAAU,CACxB,MAAM6sN,EAAU35N,EAAA,GAAO8M,GACjBo7L,EAA0C,IAAtBp7L,EAAQkgB,UAElC,IAAI4sM,EAAiC,CAAC9sN,QAAS6sN,EAAYtwN,KAAMswN,EAAWtwN,KAAMuzL,aAAa,GAC/F,GAAIvyJ,EAAQv9B,EAAQ7M,IAChB25N,EAAe3yM,eAAiBojB,EAAQv9B,EAAQ7M,IAAIgnB,oBACjD,GAAI0nP,GAAkBh1C,EAAWv1N,OAASuqB,EAAAA,GAAUG,QACvD,SAGJ,IAAKsgB,GAAwB84J,EACzB,SACG,GAAIA,GAAqB79J,EAAQv9B,EAAQ7M,IAC5C25N,EAAex1N,KAAOuqB,EAAAA,GAAU+gP,sBAC7B,GAAI/1C,EAAWv1N,OAASuqB,EAAAA,GAAUyB,aACrCwpM,EAAex1N,KAAOuqB,EAAAA,GAAUghP,6BAC7B,GAAIh2C,EAAWv1N,OAASuqB,EAAAA,GAAU0B,gBACrCupM,EAAex1N,KAAOuqB,EAAAA,GAAUihP,6BAC7B,IAAI1nE,IAAsB79J,EAAQv9B,EAAQ7M,IAC7C,SACG,GAAI05N,EAAWv1N,OAASuqB,EAAAA,GAAUG,QAAS,CAC9C,MAAM+gP,EAAajkQ,KAAKkkQ,eAAe,SACvC,IAAID,EAGA,SAFAj2C,EAAiBi2C,CAIzB,MAAO,GAAIl2C,EAAWv1N,OAASuqB,EAAAA,GAAUC,YAKrC,GAJA+qM,EAAWtwN,KAAOswN,EAAW5wN,aAC7B6wN,EAAevwN,KAAOswN,EAAWtwN,KACjCuwN,EAAex1N,KAAOuqB,EAAAA,GAAUohP,iBACZC,EAAAA,EAAAA,IAA8BxuQ,EAAOsL,EAAQ7M,KAC7C0uQ,EAChB,cAED,GAAIh1C,EAAWv1N,OAASuqB,EAAAA,GAAU0K,WAAY,CACjD,MAAMj5B,EAAS0J,EAAAA,GAA6B6vN,EAAWtwN,MACjDiD,EAAOF,EAAMiI,MAAM2jG,GAAMA,EAAE/3G,KAAOG,IAExC,IAAIkM,EAUA,SATAmtN,EAAkBntN,EAAKrM,KAAM,EAC7B25N,EAAiBhuN,KAAK6iQ,mBAClBniQ,EACAqtN,GAEAtvL,EAAQv9B,EAAQ7M,MAChB25N,EAAe3yM,eAAiBojB,EAAQv9B,EAAQ7M,IAAIgnB,eAKhE,EAEewoP,EAAuBx3O,IAAI0hM,EAAW15N,OAAQgwQ,EAAAA,EAAAA,IAAe5lO,EAAQv9B,EAAQ7M,OAExF25N,EAAemzC,QAAS,GAE5BtzC,EAAkB3sN,EAAQ7M,KAAM,EAChC8tB,EAAS7S,KAAK0+M,EAClB,CAGJ,IAAK,IAAItuL,EAAI,EAAGA,EAAIl/B,EAAMkG,OAAQg5B,IAAK,CACnC,MAAMh/B,EAAOF,EAAMk/B,GAEnB,GAAImuL,EAAkBntN,EAAKrM,IACvB,SAGJ,MAAM6I,EAAcgB,EAAAA,GAA2BklB,EAAe1iB,EAAKrM,IAC7D6M,GAAUmhB,EAAAA,EAAAA,IAAiBzsB,EAAOsH,GAElC8wN,EAAiBhuN,KAAK6iQ,mBAAmBniQ,EAAMQ,GAErD,GAAIA,GAAWu9B,EAAQv9B,EAAQ7M,IAC3B25N,EAAe3yM,eAAiBojB,EAAQv9B,EAAQ7M,IAAIgnB,oBACjD,GAAI0nP,EACP,SAGA7hQ,GACe2iQ,EAAuBx3O,IAAInrB,EAAQ7M,OAAQgwQ,EAAAA,EAAAA,IAAe5lO,EAAQv9B,EAAQ7M,OAErF25N,EAAemzC,QAAS,GAIhCtzC,EAAkBntN,EAAKrM,KAAM,EAC7B8tB,EAAS7S,KAAK0+M,EAClB,CAEA,MAAMgrC,EAAe72O,EACjBg0C,KAAKorM,GACL5gQ,KAAKqtN,GACG2yC,EAAoB3yC,EAAe9sN,UAAY8sN,EAAe9sN,QAAQ1M,OAC/Dw5N,EAAe9sN,QAAQ1M,OAG3Bw5N,EAAe9sN,QAAQ7M,KAUtC,OAPI2uQ,IAAc7gP,EAASzb,QACvByb,EAAS7S,KAAK,CACV9W,KAAMuqB,EAAAA,GAAUoyK,sBAChB7rL,SAAS,IAIV,CACH2kN,eAAgBf,EAChBgB,MAAO8qC,EACPjwP,MAAOoZ,EACPlnB,UAAWmmQ,EAEnB,CAEAO,+BAAAA,CAAgCx/O,GAC5B,MAAMvsB,EAAQoK,KAAKpM,MAAMqf,WACnBqxP,GAAcpjP,EAAAA,EAAAA,IAAmBtrB,GAAO+K,KAAKwe,GAAeA,EAAK9qB,KAOvE,OANoB8tB,EAAS1hB,QAAQS,IAC5BA,EAAQ4W,SAGNwsP,EAAY76N,SAASvoC,EAAQ4W,UAG5C,CAEAg7K,oCAAAA,CAAqCu6B,GACjC,MAAMz3N,EAAQoK,KAAKpM,MAAMqf,WACzB,IAAIsxP,GAAiB9C,EAAAA,EAAAA,IAAsB7rQ,GAAOqI,QAAOyjQ,EAAAA,EAAAA,IAA0B9rQ,IACnF2uQ,EAAiBvkQ,KAAK2hQ,gCAAgC4C,GACtD,MAAMC,EAAwBxkQ,KAAKykQ,aAAaF,EAAgBxhP,EAAAA,GAAU2hP,yBACpEC,GAAiBC,EAAAA,EAAAA,IAAgChvQ,GACjDypC,GAAYpb,EAAAA,EAAAA,IAAwBruB,GACpCivQ,EAA0BF,EAAelkQ,QAAQS,IACnD,MAAMsX,EAAS6mB,EAAUn+B,EAAQ7M,IACjC,QAAQgwQ,EAAAA,EAAAA,IAAe7rP,EAAO,IAC/BpJ,MAAM,EAAG,GACZ,IAAI01P,EAAuB9kQ,KAAKykQ,aAAaI,EAAyB9hP,EAAAA,GAAUgiP,gBAC3C,IAAjCP,EAAsB99P,SACtB0e,EAAS,GACTplB,KAAKstN,gBAAgB,IACrBttN,KAAKwtN,cAAcH,IAEvB,MAAM23C,EAAyBF,EAAqBnkQ,KAAKqtN,GAAmBA,EAAe9sN,QAAQ7M,KAC7F4wQ,EAAuBT,EAAsB/jQ,QAAQutN,IAAoBg3C,EAAuBv7N,SAASukL,EAAe9sN,QAAQ7M,MAClI8hE,KAAKmrM,GAA4ClyP,MAAM,EAAG,IACxD81P,EAAcllQ,KAAKkkQ,eAAe,SAAUnhP,EAAAA,GAAUgiP,gBACxDG,IACAJ,EAAuB,CAACI,KAAgBJ,GAAsB11P,MAAM,EAAG,IAE3E,MAAM+1P,EAAiB,IAAIL,KAAyBG,GAEpD53C,EAAgB,CACZY,eAAgB,GAChBC,MAHiBi3C,EAAexkQ,KAAKqtN,GAAmBA,EAAe9sN,QAAQ7M,KAI/E0U,MAAOo8P,EACPlqQ,UAAWmmQ,GAEnB,CAEA8C,cAAAA,GAAuD,IAAxCkB,EAAS7hQ,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,QAAS8hQ,EAAiB9hQ,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EACjD,MAAM1C,EAAQoK,KAAKpM,MAAMqf,WACnBqyP,GAASC,EAAAA,EAAAA,IAA6B3vQ,GACtC8mC,GAAmBliB,EAAAA,EAAAA,IAA0B5kB,GAGnD,IAAIsvQ,EAA8B,CAC9BhkQ,QAASs/P,EACT/iQ,KAAM+iQ,EAAe/iQ,KACrB0jQ,OAAQt3P,QAAQy7P,aAAM,EAANA,EAAQE,sBACxB72N,iBAAiB22N,aAAM,EAANA,EAAQG,wBAAyB,EAClDz0E,aAAa,EACb31K,eAAgBH,KAAKC,OAKzB,OAHIkqP,IACAH,EAAW9wQ,EAAAA,EAAA,GAAO8wQ,GAAW,IAAE1sQ,KAAM6sQ,KAErC3oO,IAAoC,WAAd0oO,SAA0BE,GAAAA,EAAQE,sBAAwC,UAAdJ,GAC3EF,EAGJ,IACX,CAEAQ,qBAAAA,CAAsBC,EAA+Cj4O,EAAkBjwB,GACnF,MAAM2uF,EAAOu5K,GAAcC,EAAAA,EAAAA,GAAiBl4O,EAAUjwB,IAChDooQ,EAAYz5K,EAAOA,EAAKtrF,MAAQ,IACtC,OAAOymD,SAASs+M,QAAAA,EAAa,GAAI,GACrC,CAEAC,eAAAA,CAAgBttP,EAA2BmtP,EAA+CzkQ,GAItF,OAAOE,KAAKs2D,IACRl/C,EAAO6C,eACPrb,KAAK0lQ,sBAAsBC,EAAezoP,EAAAA,GAAY6oP,uCAAwC7kQ,EAAQ7M,IACtG2L,KAAK0lQ,sBAAsBC,EAAezoP,EAAAA,GAAY8oP,2BAA4B9kQ,EAAQ7M,IAElG,CAEAowQ,YAAAA,CAAatiP,EAAqB69C,GAC9B,MAAMpqE,EAAQoK,KAAKpM,MAAMqf,WACnB6O,GAAiBC,EAAAA,EAAAA,IAAkBnsB,GACnCypC,GAAYpb,EAAAA,EAAAA,IAAwBruB,GACpC+vQ,GAAgB5tC,EAAAA,EAAAA,IAAiBniO,GACjC+tQ,GAAsBC,EAAAA,EAAAA,IAA4BhuQ,GAClDiuQ,EAAyB,IAAIjtO,IAAI+sO,GAEjCsC,EAAc,GACpB,IAAK,IAAIvmO,EAAI,EAAGA,EAAIvd,EAASzb,OAAQg5B,IAAK,CACtC,MAAMx+B,EAAUihB,EAASud,GACzB,GAAIx+B,EAAQ7M,MAAOytB,aAAc,EAAdA,EAAgBztB,IAC/B,SAEJ,IAAI25N,EAAiC,CAAC9sN,UAASzD,KAAMyD,EAAQzD,KAAMuzL,aAAa,GAChF,MAAMx4K,EAAS6mB,EAAUn+B,EAAQ7M,IAIjC,GAHImkB,IACAw1M,EAAe3yM,eAAiBrb,KAAK8lQ,gBAAgBttP,EAAQmtP,EAAezkQ,IAE5EA,EAAQ1I,OAASuqB,EAAAA,GAAUC,WAC3BgrM,EAAevwN,KAAOyD,EAAQ/D,kBAC3B,GAAI+D,EAAQ1I,OAASuqB,EAAAA,GAAU0K,WAAY,CAC9C,MAAM/sB,GAAO82B,EAAAA,EAAAA,IAAQx3B,KAAKpM,MAAMqf,WAAY/U,EAAAA,GAA6BgD,EAAQzD,OAEjF,IAAKiD,EACD,SAEJ,MAAMmiQ,EAAqB7iQ,KAAK6iQ,mBAC5BniQ,EACAQ,GAEJ8sN,EAAc55N,EAAAA,EAAA,GAAO45N,GAAmB60C,EAC5C,CACegB,EAAuBx3O,IAAInrB,EAAQ7M,OAAQgwQ,EAAAA,EAAAA,IAAe7rP,KAErEw1M,EAAemzC,QAAS,GAG5BnzC,EAAex1N,KAAOwnE,EACtBimM,EAAY32P,KAAK0+M,EACrB,CACA,OAAOi4C,CACX,CAEA,mBAAMz4C,CAAcH,GAChB,MAAMz3N,EAAQoK,KAAKpM,MAAMqf,WAEzB,KADe8E,EAAAA,EAAAA,IAAiBniB,GAE5B,OAEJ,MAAM63N,EAAgBztN,KAAKpM,MAAMD,UAASymC,EAAAA,EAAAA,OAC1C,IAAIjY,EAEJ,IACI,MAAM,KAACluB,SAAcw5N,EACrBtrM,EAAWluB,CACf,CAAE,MAAOC,GAEL,YADA8L,KAAKpM,MAAMD,UAASq/B,EAAAA,EAAAA,IAAS9+B,GAEjC,CAEA,GAA0B,KAAtB8L,KAAKm4P,aACL,OAEJ,MAAMgN,EAAiBnlQ,KAAKykQ,aAAatiP,EAAUY,EAAAA,GAAUghP,yBAAyB30P,MAAM,EAAG,IAG/Fi+M,EAAgB,CACZY,eAAgB,GAChBC,MAJiBi3C,EAAexkQ,KAAKqtN,GAAmBA,EAAe9sN,QAAQ7M,KAK/E0U,MAAOo8P,EACPlqQ,UAAWmmQ,GAEnB,GAGJ5sM,EAAAA,EAAAA,gBAAe,CACX0xM,aAAc,CACV7xQ,GAAI,kCACJ0S,eAAgB,kBAEpBo/P,uBAAwB,CACpB9xQ,GAAI,sCACJ0S,eAAgB,oBAEpBw9P,eAAgB,CACZlwQ,GAAI,qCACJ0S,eAAgB,UAEpB49P,eAAgB,CACZtwQ,GAAI,4BACJ0S,eAAgB,W,wdCj1BxB,MAAMq/P,EAAsB9oQ,IAAAA,YAAwD,CAACN,EAAOk7C,KACxF,MAAM,KAACj7C,GAAQD,EAET6J,GAAOiQ,EAAAA,EAAAA,WAEb,IAAIuvP,EACA7oQ,EACAH,EACAokC,EACkB,QAAlBxkC,EAAKY,UACLwoQ,EAAW,MACX7oQ,EACIF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,sCAGvB1J,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KACIC,UAAU,qCACViO,MAAO3E,EAAKC,cAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,oBAI1D,YAAlB9J,EAAKY,UACZwoQ,EAAW,UACX7oQ,EACIF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6BACH0S,eAAe,sCAGvB1J,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KACIC,UAAU,qCACViO,MAAO3E,EAAKC,cAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,oBAI1D,SAAlB9J,EAAKY,UACZwoQ,EAAW,OACX7oQ,EACIF,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,6CAGvB1J,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KACIC,UAAU,qCACViO,MAAO3E,EAAKC,cAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,oBAI5E9J,EAAKzE,OAASuqB,EAAAA,GAAUohP,gBAC/BkC,EAAWppQ,EAAKQ,KAChBD,EACIF,IAAAA,cAAA,QAAMC,UAAU,QAAQ,KAAMN,EAAKE,cAEvCE,EACIC,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KACIC,UAAU,qCACViO,MAAO3E,EAAKC,cAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,qBAKnFs/P,EAAWppQ,EAAKY,SAEZZ,EAAKqpQ,eACDrpQ,EAAKa,YAAcb,EAAKc,aACxBP,EAAcF,IAAAA,cAAA,YAAOY,EAAAA,GAAkBjB,MAEpCA,EAAKa,YAAcb,EAAKc,WAAad,EAAKe,YACjDR,EAAcF,IAAAA,cAAA,YAAO,GAAAW,OAAGC,EAAAA,GAAkBjB,GAAK,KAAAgB,OAAIhB,EAAKe,SAAW,IAAHC,OAAOhB,EAAKe,SAAQ,KAAM,IAAK6uB,SAGnGxvB,EACIC,IAAAA,cAAA,QAAMC,UAAU,8BACZD,IAAAA,cAAA,QAAMC,UAAU,gBACZD,IAAAA,cAACa,EAAAA,EAAM,CACHN,SAAUZ,GAAQA,EAAKY,SACvBO,KAAK,KACLC,IAAKH,EAAAA,GAAsBjB,EAAK5I,GAAI4I,EAAKk+C,wBAGjD79C,IAAAA,cAACoiG,EAAAA,EAAU,CAAC/iG,OAAQM,GAAQA,EAAKN,UAIzC8kC,EACInkC,IAAAA,cAACw0G,EAAAA,EAAiB,CACdjrB,aAAa,EACbkrB,OAAQ90G,EAAK5I,GACb29G,UAAW,GACXI,WAAY,CACR0/E,OAAQ,gBAMxB,MAAMy0E,EAAatpQ,EAAKqpQ,cACpBhpQ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,UAEnB,KAEEkqL,EAAah0L,EAAKszG,UACpBjzG,IAAAA,cAACguN,EAAAA,EAAmB,CAChB/tN,UAAU,qBAEd,KAEJ,IAAIipQ,EAmBJ,OAlBIvpQ,EAAKzE,OAASuqB,EAAAA,GAAUohP,iBACxBqC,EACIlpQ,IAAAA,cAAA,QAAMC,UAAU,gCACZD,IAAAA,cAAC+0H,EAAAA,EAAG,CACAvqH,KACIxK,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,sEACfjB,OAAQ,CACJ2X,aAAexgB,EAAewgB,oBAUtDngB,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,EAAK,CACT,mCAAAiB,OAAkCooQ,KAEjChpQ,EACDC,IAAAA,cAAA,QAAMC,UAAU,6BACZD,IAAAA,cAAA,QAAMC,UAAU,yBACX,IAAM8oQ,GAEVppQ,EAAKsB,QAAUjB,IAAAA,cAACkB,EAAAA,EAAM,MACtBhB,EACA+oQ,EACA9kO,EACAwvJ,GACAxyL,EAAAA,EAAAA,GAAQxB,EAAKyB,QAAUpB,IAAAA,cAACqB,EAAAA,EAAQ,OAEpC6nQ,EACiB,IAI9BJ,EAAoBtiQ,YAAc,sBAClC,U,u+BC9KA,MAAM2iQ,EAA2B,CAAC5zP,QAAQ,GACpC6zP,EAAoB,mnSAkCX,MAAMC,UAA0BvnG,EAAAA,EAe3Cx/J,WAAAA,CAAY5C,GACR6C,QAEA,MAAM,cAACujB,EAAa,UAAE1T,EAAS,2BAAEyV,EAA0B,mBAAEqO,EAAkB,mBAAEozO,EAAkB,mCAAE72O,EAAkC,iBAAE82O,GAAoB7pQ,EAE7JgD,KAAKojB,cAAgBA,EACrBpjB,KAAK0P,UAAYA,EACjB1P,KAAKmlB,2BAA6BA,EAClCnlB,KAAKwzB,mBAAqBA,EAC1BxzB,KAAK4mQ,mBAAqBA,EAC1B5mQ,KAAK+vB,mCAAqCA,EAC1C/vB,KAAK6mQ,iBAAmBA,EAExB7mQ,KAAK/L,KAAO,KACZ+L,KAAK8mQ,kBAAoB,GACzB9mQ,KAAK+mQ,wBAA0B,GAC/B/mQ,KAAK08P,iBAAmB,IACxB18P,KAAKmsG,sBAAuBmC,EAAAA,EAAAA,MAC5BtuG,KAAKqlB,yBAA0BC,EAAAA,EAAAA,IACnC,CAEA0hP,QAAAA,CAAQvxQ,GAA8J,IAA7J,cAAC2tB,EAAa,UAAE1T,EAAS,2BAAEyV,EAA0B,mBAAEqO,EAAkB,mBAAEozO,EAAkB,mCAAE72O,EAAkC,iBAAE82O,GAAwBpxQ,EAChKuK,KAAKojB,cAAgBA,EACrBpjB,KAAK0P,UAAYA,EACjB1P,KAAKmlB,2BAA6BA,EAClCnlB,KAAKwzB,mBAAqBA,EAC1BxzB,KAAK4mQ,mBAAqBA,EAC1B5mQ,KAAK+vB,mCAAqCA,EAC1C/vB,KAAK6mQ,iBAAmBA,CAC5B,CAGA9vL,eAAAA,GACI,OAAI/2E,KAAKm4P,aAAahpP,WAAW,UAAYnP,KAAKwzB,mBACvC,GAGJ,CAAC,OAAQ,UAAW,OAAO/yB,QAAQxD,GACtCA,EAAKkS,WAAWnP,KAAKm4P,gBACvBx3P,KAAKlD,IAAI,CACPI,SAAUJ,EACVjF,KAAMuqB,EAAAA,GAAUkkP,mBAExB,CAIAC,qBAAAA,CAAsB7lK,GAClB,MAAM8lK,EAA+B,GACrC,IAAK9lK,EACD,OAAO8lK,EAGX,GAAI9lK,EAAQxjG,SAAU,CAClB,MAAMupQ,GAAsBC,EAAAA,EAAAA,IAA8BhmK,EAAQxjG,SAAS0C,cAAewiB,EAAAA,GAAUukP,+BACpGH,EAAmB73P,QAAQ83P,EAC/B,CAOA,MANA,CAAC/lK,EAAQvjG,WAAYujG,EAAQtjG,UAAWsjG,EAAQrjG,UAAUgI,SAASg6P,IAC/D,MAAMpQ,GAAc2X,EAAAA,EAAAA,IAAsBvH,EAASz/P,cAAe,KAClE4mQ,EAAmB73P,QAAQsgP,EAAY,IAE3CuX,EAAmB73P,KAAK+xF,EAAQvjG,WAAWyC,cAAgB,IAAM8gG,EAAQtjG,UAAUwC,eAE5E4mQ,CACX,CAIAK,mBAAAA,CAAoBv8N,GAChB,MAAMw8N,EAA6B,GACnC,IAAKx8N,EACD,OAAOw8N,EAGX,GAAIx8N,EAAMxtC,KAAM,CACZ,MAAMiqQ,GAAuBL,EAAAA,EAAAA,IAA8Bp8N,EAAMxtC,KAAK8C,cAAewiB,EAAAA,GAAUukP,+BAC/FG,EAAiBn4P,QAAQo4P,EAC7B,CAEA,MAAM9X,GAAc2X,EAAAA,EAAAA,IAAsBt8N,EAAM9tC,aAAaoD,cAAe,KAI5E,OAHAknQ,EAAiBn4P,QAAQsgP,GAEzB6X,EAAiBn4P,KAAK27B,EAAM9tC,aAAaoD,eAClCknQ,CACX,CAGAE,eAAAA,CAAgBlqQ,GACZ,OAAOA,EAAKmqQ,UAAU,OAAOrjO,QAAQ,mBAAoB,GAC7D,CAGAsjO,aAAAA,CAAcxmK,GACV,IAAKA,EACD,OAAO,EAGX,MAAMymK,EAAc9nQ,KAAKm4P,aAAa53P,cAEtC,OAD2BP,KAAKknQ,sBAAsB7lK,GAC5BziE,MAAM2rF,GAC5BvqH,KAAK2nQ,gBAAgBp9I,GAAYp7G,WAAWnP,KAAK2nQ,gBAAgBG,KAEzE,CAGAC,WAAAA,CAAY98N,GACR,IAAKA,EACD,OAAO,EAGX,MAAM68N,EAAc9nQ,KAAKm4P,aAAa53P,cAEtC,OADyBP,KAAKwnQ,oBAAoBv8N,GAC1BrM,MAAM2rF,GAAeA,EAAWp7G,WAAW24P,IACvE,CAEAE,kCAAAA,GACI,MAAMpyQ,EAAQhC,EAAAA,QAAMqf,WAEdg1P,EAAoBjoQ,KAAKmsG,qBAAqBv2G,EAAOoK,KAAK0P,UAAW+2P,GAG3E,OAFwCzmQ,KAAKqlB,wBAAwBzvB,EAAOqyQ,EAGhF,CAGAC,YAAAA,GAMI,OALqBloQ,KAAKgoQ,qCACtBvnQ,QAAQ4gG,GAAYrhG,KAAK6nQ,cAAcxmK,KACvC1gG,KAAK0gG,GAAYrhG,KAAKmoQ,kBAAkB9mK,EAASt+E,EAAAA,GAAUqlP,mBAC3D3/L,OAAO,EAAG,GAGlB,CAEA4/L,sBAAAA,GACI,OAAKroQ,KAAK6mQ,iBAIe7mQ,KAAK6mQ,iBAC1BpmQ,QAAQ4gG,GAAYrhG,KAAK6nQ,cAAcxmK,KACvC1gG,KAAK0gG,GAAYrhG,KAAKmoQ,kBAAkB9mK,EAASt+E,EAAAA,GAAUqlP,mBALpD,EAQf,CAGAE,WAAAA,GACI,IAAKtoQ,KAAK4mQ,mBACN,MAAO,GAGX,MAAM0B,EAActoQ,KAAK4mQ,mBACrBnmQ,QAAQwqC,GAAUjrC,KAAK+nQ,YAAY98N,KACnCtqC,KAAKsqC,GAAUjrC,KAAKuoQ,gBAAgBt9N,EAAOloB,EAAAA,GAAUohP,kBACrDhuM,MAAK,CAACjW,EAAGtwC,IAAMswC,EAAEziD,KAAK24D,cAAcxmD,EAAEnS,QACtCgrE,OAAO,EAAG,IAEd,OAAO6/L,CACX,CAGAE,aAAAA,GACI,OAAKxoQ,KAAK/L,MAIa+L,KAAK/L,KAAKuM,OAAS,IACtCC,QAAQ4gG,GAAuCrhG,KAAK6nQ,cAAcxmK,KAClE1gG,KAAK0gG,GAAuCrhG,KAAKmoQ,kBAAkB9mK,EAASt+E,EAAAA,GAAUqlP,mBAL/E,EAQf,CAGAK,YAAAA,GACI,IAAKzoQ,KAAK/L,KACN,MAAO,GAEX,MAAMw0Q,GAAiBzoQ,KAAK/L,KAAKi4C,QAAU,IACvCzrC,QAAQwqC,GAAiBjrC,KAAK+nQ,YAAY98N,KAC1CtqC,KAAKsqC,GAAiBjrC,KAAKuoQ,gBAAgBt9N,EAAOloB,EAAAA,GAAUohP,kBAEhE,OAAOsE,CACX,CAIAC,gBAAAA,GACI,OAAK1oQ,KAAK/L,MAIF+L,KAAK/L,KAAKsxB,gBAAkB,IAChC9kB,QAAQ4gG,GAAuCrhG,KAAK6nQ,cAAcxmK,KAClE1gG,KAAK0gG,GAAkCjtG,EAAA,CACnCoE,KAAMuqB,EAAAA,GAAU4lP,oBACbtnK,KAPA,EASf,CAEAt4F,KAAAA,GACI,MAAM6/P,EAA+C,CAAC,EAChD/B,EAAmB7mQ,KAAKqoQ,yBAE9BxB,EAAiB7gQ,SAASwS,IACtBowP,EAAoBpwP,EAAOnkB,KAAM,CAAI,IAGzC,MAAM0iF,EAAkB/2E,KAAK+2E,kBACvBmxL,EAAeloQ,KAAKkoQ,eAAeznQ,QAAQ+X,IAAYowP,EAAoBpwP,EAAOnkB,MAElFw0Q,EAAwC,CAAC,EAE/CX,EAAaliQ,SAASwS,IAClBqwP,EAAarwP,EAAOnkB,KAAM,CAAI,IAGlC,MAAMm0Q,EAAgBxoQ,KAAKwoQ,gBAAgB/nQ,QAAQ+X,IAA4BqwP,EAAarwP,EAAOnkB,MAAQu0Q,EAAoBpwP,EAAOnkB,MAGhIy0Q,EAAaA,CAAC5oN,EAAmBtwC,KACnC,MAAM+8M,EAAczsK,EAAEriD,SAASsR,WAAWnP,KAAKm4P,cACzCvrC,EAAch9M,EAAE/R,SAASsR,WAAWnP,KAAKm4P,cAE/C,OAAIxrC,IAAgBC,GACR,GACAD,GAAeC,EAChB,EAIP1sK,EAAE7kC,gBAAkBzL,EAAEyL,eACfzL,EAAEyL,eAAiB6kC,EAAE7kC,eACrB6kC,EAAE7kC,gBACD,EACDzL,EAAEyL,eACF,EAGJ6kC,EAAEriD,SAASu4D,cAAcxmD,EAAE/R,SAAS,EAIzCkrQ,EAAwBb,EAAajqQ,OAAOuqQ,GAAeryM,KAAK2yM,GAGhER,EAActoQ,KAAKsoQ,cAEnBU,EAAyC,CAAC,EAChDV,EAAYtiQ,SAASilC,IACjB+9N,EAAc/9N,EAAM52C,KAAM,CAAI,IAGlC,MAAMo0Q,EAAezoQ,KAAKyoQ,eAAehoQ,QAAQwqC,IAAW+9N,EAAc/9N,EAAM52C,MAoB1E40Q,EAAuBX,EAAYrqQ,OAAOwqQ,GAActyM,MAjB1C+yM,CAAChpN,EAAiBtwC,KAClC,MAAM+8M,EAAczsK,EAAEziD,KAAK0R,WAAWnP,KAAKm4P,cACrCvrC,EAAch9M,EAAEnS,KAAK0R,WAAWnP,KAAKm4P,cAE3C,OAAIxrC,GAAeC,EACR1sK,EAAEziD,KAAK24D,cAAcxmD,EAAEnS,MAE9BkvN,GACQ,EAERC,EACO,EAEJ1sK,EAAEziD,KAAK24D,cAAcxmD,EAAEnS,KAAK,IAMjCirQ,EAAmB1oQ,KAAK0oQ,mBAC1BjoQ,QAAQ+X,IAAYqwP,EAAarwP,EAAOnkB,MACxC8hE,KAAK2yM,GAET,MAAO,IAAIjC,KAAqBkC,KAA0BE,KAAyBlyL,KAAoB2xL,EAC3G,CAGAS,aAAAA,CAAcC,EAAiCrgQ,GACtB,IAAjBA,EAAMrC,OACN1G,KAAK+mQ,wBAA0B/mQ,KAAKm4P,aAC7Bn4P,KAAK+mQ,0BAA4B/mQ,KAAKm4P,eAC7Cn4P,KAAK+mQ,wBAA0B,IAEnC,MAAMpsP,EAAW5R,EAAMpI,KAAK1D,GACpBA,EAAKY,SACE,IAAMZ,EAAKY,SACXZ,EAAKQ,KACL,IAAMR,EAAKQ,KAEf,KAGX2rQ,EAAe,CACXn7C,eAAgB,IAAFhwN,OAAM+B,KAAKm4P,cACzBjqC,MAAOvzM,EACP5R,QACA9N,UAAWmrQ,GAEnB,CAEApzE,oBAAAA,CAAqBzW,EAAiB6sF,GAClC,MAAMvtC,EAAW6qC,EAAkB16O,KAAKuwJ,EAAQh8K,eAChD,IAAKs7N,EACD,OAAO,EAGX,GAAI77N,KAAK8mQ,mBAAqBjrC,EAAS,GAAGhvM,OAAO1d,WAAWnP,KAAK8mQ,kBAAkBj6O,QAE/E,OAAO,EAGX,MAAMzH,EAASy2M,EAAS,GACxB,GAAI77N,KAAK+mQ,yBAA2B3hP,EAAOjW,WAAWnP,KAAK+mQ,yBAEvD,OAAO,EAGX/mQ,KAAKstN,gBAAgBloM,GACrBplB,KAAKmpQ,cAAcC,EAAgBppQ,KAAK+I,SAGxC,IAAIsgQ,EAA8C9gP,YAAW,KACrDvoB,KAAK2tN,qBAAqBvoM,KAI9BplB,KAAKmpQ,cAAcC,EAAgB,IAAIppQ,KAAK+I,QAAa,CACrDvQ,KAAMuqB,EAAAA,GAAUumP,qBAChBhgQ,SAAS,KAGb+/P,EAAuB,KAAI,GAC5B,KAmBH,OAhBArpQ,KAAKmlB,2BAA2BC,GAAQ5b,MAAKtO,IAAY,IAAX,KAACjH,GAAKiH,EAC5CmuQ,GACAx2N,aAAaw2N,GAEbrpQ,KAAK2tN,qBAAqBvoM,KAG9BplB,KAAK/L,KAAOA,EACZ+L,KAAK+vB,mCAAmC3K,GAAQ5b,MAAM+/P,IAC9CvpQ,KAAK/L,MAAQs1Q,GAAcA,EAAWt1Q,OACtC+L,KAAK/L,KAAKi4C,OAASq9N,EAAWt1Q,MAElC+L,KAAKmpQ,cAAcC,EAAgBppQ,KAAK+I,QAAQ,IAClD,KAGC,CACX,CAEA4yP,kBAAAA,CAAmBzmO,GACfl1B,KAAK8mQ,kBAAoB5xO,EACzBl1B,KAAK+mQ,wBAA0B,EACnC,CAEAoB,iBAAAA,CAAkB9mK,EAAkD7oG,GAChE,OAAI6oG,EAAQhtG,KAAO2L,KAAKojB,cACpBhvB,EAAAA,EAAA,CACIoE,QACG6oG,GAAO,IACVilK,eAAe,IAIvBlyQ,EAAA,CACIoE,QACG6oG,EAEX,CAEAknK,eAAAA,CAAgBt9N,EAAczyC,GAC1B,OAAApE,EAAA,CACIoE,QACGyyC,EAEX,GAGJupB,EAAAA,EAAAA,gBAAe,CACXg1M,aAAc,CACVn1Q,GAAI,0BACJ0S,eAAgB,kBAEpB0iQ,cAAe,CACXp1Q,GAAI,6BACJ0S,eAAgB,mBAEpB2iQ,mBAAoB,CAChBr1Q,GAAI,iCACJ0S,eAAgB,iBAEpB4iQ,iBAAkB,CACdt1Q,GAAI,gCACJ0S,eAAgB,kBAEpB6iQ,eAAgB,CACZv1Q,GAAI,6BACJ0S,eAAgB,sBC7dxB,U,mCCgBO,MAQM8iQ,EAA2BvsQ,IAAAA,YAAkE,CAACN,EAAOk7C,KAAQ,IAAA4xN,EAAAC,EACtH,MAAM,KAAC9sQ,GAAQD,EACTs/L,EAAoBr/L,EAAKiE,SAAWjE,EAAKiE,QAAQkgB,WAAwC,IAA3BnkB,EAAKiE,QAAQkgB,UAE3ElkB,EAA0B,QAAf4sQ,EAAG7sQ,EAAKiE,eAAO,IAAA4oQ,OAAA,EAAZA,EAAc3sQ,aAClC,IAAI6sQ,EAOG,IAAAC,EALHD,EADA1tE,EAEIh/L,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAU,+BAKjBD,IAAAA,cAAA,QAAMC,UAAU,sDACZD,IAAAA,cAAA,KAAGC,UAAS,8BAAAU,QAA4C,QAAZgsQ,EAAAhtQ,EAAKiE,eAAO,IAAA+oQ,OAAA,EAAZA,EAAczxQ,QAASuqB,EAAAA,GAAUyB,aAAe,QAAU,mBAKlH,MAAMhnB,EAAc,KAAkB,QAAfusQ,EAAG9sQ,EAAKiE,eAAO,IAAA6oQ,OAAA,EAAZA,EAActsQ,MAExC,OACIH,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,GAEHgtQ,EACD1sQ,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,QAAMC,UAAU,yBACXL,GAEJM,GAEa,IAG9BqsQ,EAAyB/lQ,YAAc,2BAExB,MAAMomQ,UAA+B9qG,EAAAA,EAQhDx/J,WAAAA,CAAYmtN,EAAuHo9C,GAC/HtqQ,QAEAG,KAAKoqQ,kBAAoB,GACzBpqQ,KAAK+mQ,wBAA0B,GAC/B/mQ,KAAK8mQ,kBAAoB,GACzB9mQ,KAAK08P,iBAAmB,IAExB18P,KAAKiB,qBAAuB8rN,EAC5B/sN,KAAKmqQ,yBAA2BA,CACpC,CAEAnD,QAAAA,CAAShqQ,GACLgD,KAAKmqQ,yBAA2BntQ,EAAMmtQ,wBAC1C,CAEAn3E,oBAAAA,CAAqBzW,EAAiB6sF,GAClCppQ,KAAKq4P,eAEL,MAAMx8B,EAAY,qBAAsB7vM,KAAKuwJ,EAAQh8K,eAErD,IAAKs7N,EAED,OAAO,EAGX,GAAIA,EAAS5vN,MAAQ,GAAqC,MAAhCswK,EAAQs/C,EAAS5vN,MAAQ,GAE/C,OAAO,EAGX,MAAMmZ,EAASy2M,EAAS,GAExB,GAAI77N,KAAKmqQ,0BAA4B/kP,EAAO1e,OAxFb,EAyF3B,OAAO,EAGX,GAAI1G,KAAKoqQ,mBAAqBhlP,EAAOyH,SAAW7sB,KAAKoqQ,kBAEjD,OAAO,EAKX,GAFApqQ,KAAKoqQ,kBAAoBhlP,EAAOyH,OAE5B7sB,KAAK+mQ,yBAA2B3hP,EAAOjW,WAAWnP,KAAK+mQ,yBAEvD,OAAO,EAGX,GAAI/mQ,KAAK8mQ,mBAAqBjrC,EAAS,GAAG1sN,WAAWnP,KAAK8mQ,mBAEtD,OAAO,EAIX9mQ,KAAK8mQ,kBAAoB,GAEzB9mQ,KAAKstN,gBAAgBloM,GAErB,MAAMilP,EAAQjlP,EAAO7kB,cAAcuhC,MAAM,OACnCwoO,EAA6C,CAAC,EACpD,IAAIC,EAAoC,IACxCjmP,EAAAA,EAAAA,IAAc1wB,EAAAA,QAAMqf,YAAYjN,SAAS/I,IACrC,GAAkB,MAAdA,EAAKzE,MAAgByE,EAAKmkB,UAAY,EACtC,OAEJ,MAAMopP,EAAYvtQ,EAAKQ,KAAK8C,cAAcuhC,MAAM,OAAO7jC,OAAOhB,EAAKE,aAAaoD,cAAcuhC,MAAM,QACpG,IAAI2oO,GAAU,EACd,IAAK,IAAI30M,EAAI,EAAG20M,GAAW30M,EAAIu0M,EAAM3jQ,OAAQovD,IAAK,CAC9C,IAAKu0M,EAAMv0M,GACP,SAEJ,IAAI40M,GAAc,EAClB,IAAK,IAAIhrO,EAAI,EAAGA,EAAI8qO,EAAU9jQ,OAAQg5B,IAClC,GAAI8qO,EAAU9qO,GAAGvwB,WAAWk7P,EAAMv0M,IAAK,CACnC40M,GAAc,EACd,KACJ,CAEJ,IAAKA,EAAa,CACdD,GAAU,EACV,KACJ,CACJ,CACKA,IAGLH,EAAkBrtQ,EAAK5I,KAAM,EAC7Bk2Q,EAAgBj7P,KAAK,CACjB9W,KAAMuqB,EAAAA,GAAU4nP,iBAChBzpQ,QAASjE,IACX,IAENstQ,EAAkBA,EAAgBp0M,MAAK,CAACjW,EAAGtwC,KAIhCi9M,EAAAA,EAAAA,IAAiC,KAAM3sK,EAAEh/C,QAAoB0O,EAAE1O,WAE1E,MAAMu4J,EAAkB8wG,EAAgB5pQ,KAAK1D,IAAI,IAAA2tQ,EAAA,MAAK,KAAkB,QAAfA,EAAG3tQ,EAAKiE,eAAO,IAAA0pQ,OAAA,EAAZA,EAAcntQ,KAAK,IAC/E2rQ,EAAe,CACXl7C,MAAOz0D,EAAgBx7J,OAAO,CAAC,MAC/B8K,MAAOwhQ,EAAgBtsQ,OAAO,CAAC,CAC3BzF,KAAMuqB,EAAAA,GAAUoyK,sBAChB7rL,SAAS,KAEbrO,UAAW4uQ,EACX57C,eAAgB4N,EAAS,KAG7B,MAAMgvC,EAAiBA,CAAC1oP,EAAqB2oP,KACzC,GAAI1lP,IAAWplB,KAAKm4P,cAAgBn4P,KAAK2tN,qBAAqBvoM,GAC1D,OAGJ,MAAMia,GAAYpb,EAAAA,EAAAA,IAAwBrwB,EAAAA,QAAMqf,YAExB,IAApBkP,EAASzb,QAAiBokQ,IAC1B9qQ,KAAK+mQ,wBAA0B3hP,GAInC,MAAM2lP,EAAwC,GAC9C5oP,EAASnc,SAAS/I,IACd,KAAIA,EAAKmkB,UAAY,IAAMie,EAAUpiC,EAAK5I,IAA1C,CAIA,GAAIgrC,EAAUpiC,EAAK5I,MAAQi2Q,EAAkBrtQ,EAAK5I,IAM9C,OALAi2Q,EAAkBrtQ,EAAK5I,KAAM,OAC7Bk2Q,EAAgBj7P,KAAK,CACjB9W,KAAMuqB,EAAAA,GAAU4nP,iBAChBzpQ,QAASjE,IAKjB,IAAIoiC,EAAUpiC,EAAK5I,MAAOi2Q,EAAkBrtQ,EAAK5I,IAAjD,CAIA,IAAKgrC,EAAUpiC,EAAK5I,KAAOi2Q,EAAkBrtQ,EAAK5I,IAAK,QAC5Ci2Q,EAAkBrtQ,EAAK5I,IAC9B,MAAM06M,EAAMw7D,EAAgB5pQ,KAAK2yJ,IAAE,IAAA03G,EAAA,OAAe,QAAfA,EAAK13G,EAAGpyJ,eAAO,IAAA8pQ,OAAA,EAAVA,EAAY32Q,EAAE,IAAEm4B,QAAQvvB,EAAK5I,IACjE06M,GAAO,GACPw7D,EAAgB9hM,OAAOsmI,EAAK,EAEpC,CAEAg8D,EAAoBz7P,KAAK,CACrB9W,KAAMuqB,EAAAA,GAAUoyK,sBAChBj0L,QAASjE,GAZb,CAbA,CA0BE,IAGNstQ,EAAkBA,EAAgBp0M,MAAK,CAACjW,EAAGtwC,KAIhCi9M,EAAAA,EAAAA,IAAiC,KAAM3sK,EAAEh/C,QAAoB0O,EAAE1O,WAG1E,MAAMi9O,EAAUosB,EAAgBtsQ,OAAO8sQ,GACjCpwP,EAAWwjO,EAAQx9O,KAAK1D,IAAI,IAAAguQ,EAAA,MAAK,KAAkB,QAAfA,EAAGhuQ,EAAKiE,eAAO,IAAA+pQ,OAAA,EAAZA,EAAcxtQ,KAAK,IAEhE2rQ,EAAe,CACXn7C,eAAgB4N,EAAS,GACzB3N,MAAOvzM,EACP5R,MAAOo1O,EACPljP,UAAW4uQ,GACb,EASN,OANA7pQ,KAAKiB,qBACDmkB,GACCjD,GAAwB0oP,EAAe1oP,GAAU,KAClD,IAAM0oP,EAAe,IAAI,MAGtB,CACX,CAEAlP,kBAAAA,CAAmBzmO,GACfl1B,KAAK8mQ,kBAAoB5xO,EACzBl1B,KAAK+mQ,wBAA0B,EACnC,GAGJvyM,EAAAA,EAAAA,gBAAe,CACX02M,kBAAmB,CACf72Q,GAAI,8BACJ0S,eAAgB,iB,6kCC/OxB,MAAMwqP,GAAkCxuO,EAAAA,GAAUqsO,aAAamC,gCACzDC,GAAgCzuO,EAAAA,GAAUqsO,aAAaoC,8BACvDd,GAA2B3tO,EAAAA,GAAUqsO,aAAasB,yBAElDya,GAAoB7tQ,IAAAA,YAA0E,CAACN,EAAOk7C,KACxG,MAAM,KAACj7C,GAAQD,EAEf,IAAIouQ,EAAa9tQ,IAAAA,cAAA,YAAO,KACxB,OAAQL,EAAKkyP,UACb,KAAKoC,GACD6Z,EAAa9tQ,IAAAA,cAAA,QAAMC,UAAU,cAAc,KAC3C,MACJ,KAAKi0P,GACD4Z,EACI9tQ,IAAAA,cAAA,QAAMC,UAAU,cACZD,IAAAA,cAAC+tQ,EAAAA,eAAc,CAACjtQ,KAAM,MAG9B,MACJ,KAAKsyP,GACD0a,EAAa9tQ,IAAAA,cAAA,YAAO,KAGxB,IAAID,EAAOC,IAAAA,cAAA,OAAKC,UAAU,uBAAuB6tQ,GAWjD,OAVInuQ,EAAKkyP,WAAa,CAACoC,GAAiCb,GAA0Bc,IAA+B/nN,SAASxsC,EAAKkyP,YAC3H9xP,EACIC,IAAAA,cAAA,OACIC,UAAU,sBACVmN,MAAO,CAACu8E,gBAAiB,gBAEzB3pF,IAAAA,cAAA,OAAKuO,IAAK5O,EAAKkyP,aAKvB7xP,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,GAEHK,EACDC,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,OAAKC,UAAU,wBACVN,EAAKgyP,WAAWriO,UAAU,GAAK,IAAM3vB,EAAKiyP,MAE/C5xP,IAAAA,cAAA,OAAKC,UAAU,uBACVN,EAAKo9E,cAGI,IAG9B8wL,GAAkBrnQ,YAAc,oBASjB,MAAMwnQ,WAAwBlsG,EAAAA,EAMzCx/J,WAAAA,CAAY5C,GACR6C,QAEAG,KAAKpM,MAAQ4tQ,EAAAA,QACbxhQ,KAAKhD,MAAQA,EACbgD,KAAKurQ,iBAAmB,IAAI18O,EAAAA,GAAiB7uB,KAAKpM,MAAck7B,EAAAA,GAAU9xB,EAAM0S,UAAW1S,EAAMrF,OAAQqF,EAAM8W,QAC/G9T,KAAK08P,iBAAmB,GAC5B,CAEAsK,QAAAA,CAAShqQ,GACLgD,KAAKhD,MAAQA,EACbgD,KAAKurQ,iBAAiBC,kBAAkBxuQ,EAAM0S,UAAW1S,EAAMrF,OAAQqF,EAAM8W,OACjF,CAEAk/K,oBAAAA,CAAqBzW,EAAiB6sF,GAClC,QAAK7sF,EAAQptK,WAAWnP,KAAK08P,qBAIzB1iP,EAAAA,EAAAA,IAAYha,KAAKpM,MAAMqf,aAAejT,KAAKurQ,iBAAiBx8O,aAAawtJ,IACzEv8K,KAAKurQ,iBAAiBE,eAAelvF,GAAS/yK,MAAMomP,IAChD,MAAMjpD,EAAUipD,EAAYjvP,KAAK4pH,GAAUn2H,GAAAA,GAAA,GACpCm2H,GAAU,IACbykI,SAAU,IAAMzkI,EAAWykI,SAC3BC,WAAY,IAAM1kI,EAAW0kI,eAG3B/gC,EAAQvnB,EAAQhmM,KAAK4pH,GAAeA,EAAWykI,WACrDoa,EAAe,CACXn7C,eAAgB1xC,EAChB2xC,QACAnlN,MAAO49L,EACP1rM,UAAWkwQ,IACb,KAEC,IAGPj+O,GAAAA,KACAltB,KAAK0rQ,aAAanvF,EAAS6sF,GAE3BppQ,KAAK2rQ,aAAapvF,EAAS6sF,IAGxB,GACX,CAEAzN,kBAAAA,CAAmBzmO,EAAcqnJ,EAAiBviL,GAC9CA,EAASk7B,EAAO,IACpB,CAEAw2O,YAAAA,CAAanvF,EAAiB6sF,GAC1B,MAAM,OAACzxQ,GAAUqI,KAAKhD,MAEhB+vB,EAAUwvJ,EAAQh8K,cACxBjL,GAAAA,GAAQs2Q,gBAAgBj0Q,GAAQ6R,MAC3BvV,IACG,IAAI0yM,EAAoC,GACxC,IAAI3sL,EAAAA,EAAAA,IAAYha,KAAKpM,MAAMqf,YAAa,CACpC,MAAM44P,EAAwB7rQ,KAAKurQ,iBAAiBO,mBAAmBvvF,GACvEoqB,EAAUA,EAAQ1oM,OAAO4tQ,EAC7B,CAEA53Q,EAAK+R,SAAS2mB,IACV,GAAKA,EAAIo/O,eAIW,cAAhBp/O,EAAIq/O,SAIuD,KAA1DhsQ,KAAK08P,iBAAmB/vO,EAAIq/O,SAASx/O,QAAQO,GAAgB,CAC9D,MAAMk7E,EAAIjoG,KAAK08P,iBAAmB/vO,EAAIq/O,QACtC,IAAIpqQ,EAAO,GACP+qB,EAAIs/O,oBAAwD,IAAlCt/O,EAAIs/O,mBAAmBvlQ,SACjD9E,EAAO+qB,EAAIs/O,oBAEftlE,EAAQr3L,KAAK,CACT2/O,WAAYhnJ,EACZ+mJ,SAAU,GACVE,KAAMttP,EACNy4E,YAAa1tD,EAAIu/O,mBACjB/c,SAAU,GACV32P,KAAMuqB,EAAAA,GAAUqsO,aAAapE,SAErC,KAGJrkD,EAAUA,EAAQxwI,MAAK,CAACjW,EAAGtwC,IAAMswC,EAAE+uM,WAAW74L,cAAcxmD,EAAEq/O,cAG9D,MAAM/gC,EAAQvnB,EAAQhmM,KAAK4pH,GAAeA,EAAW0kI,aAErDma,EAAe,CACXn7C,eAAgBlhM,EAChBmhM,QACAnlN,MAAO49L,EACP1rM,UAAWkwQ,IACb,GAGd,CAEAQ,YAAAA,CAAapvF,EAAiB6sF,GAC1B,MAAMr8O,EAAUwvJ,EAAQh8K,eAElB,OAAC5I,EAAM,UAAE+X,EAAS,OAAEoE,GAAU9T,KAAKhD,MACnCwU,EAAoB,CACtBsG,QAASngB,EACTmZ,WAAYpB,EACZqB,QAAS+C,GAGbxe,GAAAA,GAAQ62Q,sCAAsCp/O,EAASp1B,EAAQ6Z,GAAMhI,MAC/DvV,IACE,IAAI0yM,EAAoC,GAEpCh6K,EAAM,OAKV,GAJIO,GAAAA,OACAP,EAAM,MAGN3S,EAAAA,EAAAA,IAAYha,KAAKpM,MAAMqf,YAAa,CACpC,MAAM44P,EAAwB7rQ,KAAKurQ,iBAAiBO,mBAAmBvvF,GAAS57K,KAAK4pH,GAAUn2H,GAAAA,GAAA,GACxFm2H,GAAU,IACbykI,SAAU,IAAMzkI,EAAWykI,SAC3BC,WAAY1kI,EAAW0kI,eAE3BtoD,EAAUA,EAAQ1oM,OAAO4tQ,EAC7B,CAEA53Q,EAAK+R,SAASiiG,IACLjoG,KAAKm7D,SAASwrI,EAAS3mM,KAAK08P,iBAAmBz0J,EAAE+mJ,WAClDroD,EAAQr3L,KAAK,CACT0/O,SAAUhvP,KAAK08P,iBAAmBz0J,EAAE+mJ,SACpCC,WAAYjvP,KAAK08P,iBAAmBz0J,EAAEgnJ,WACtCC,KAAMjnJ,EAAEinJ,KACR70K,YAAa4tB,EAAE5tB,YACf80K,SAAUlnJ,EAAEknJ,SACZ32P,KAAMuqB,EAAAA,GAAUqsO,aAAapE,SAErC,IAICzuE,EAAQ9yI,SAAS,MAClBk9J,EAAQxwI,MAAK,CAACjW,EAAGtwC,IACTswC,EAAE+uM,WAAW1uP,cAAgBqP,EAAEq/O,WAAW1uP,cACnC,EACA2/C,EAAE+uM,WAAW1uP,cAAgBqP,EAAEq/O,WAAW1uP,eACzC,EAEL,IAIXP,KAAKosQ,qBAAqBn4Q,EAAMsoL,IAChCoqB,EAAQn0I,QAAQ,CACZw8L,SAAUzyE,EAAUg1E,GACpBtC,WAAY,2BACZC,KAAM,GACN70K,YAAa,6BAA+B1tD,EAAM,yCAClDwiO,SAAUoC,GACV/4P,KAAMuqB,EAAAA,GAAUqsO,aAAapE,UAKrC,MAAM98B,EAAQvnB,EAAQhmM,KAAK4pH,GAAeA,EAAWykI,WAErDoa,EAAe,CACXn7C,eAAgBlhM,EAChBmhM,QACAnlN,MAAO49L,EACP1rM,UAAWkwQ,IACb,GAGd,CAEAiB,oBAAAA,CAAqBn4Q,EAAgCsoL,GACjD,OAAoB,IAAhBtoL,EAAKyS,SAG2B,MAAhC61K,EAAQA,EAAQ71K,OAAS,KAKgC,IAAtDzS,EAAKyyC,WAAWzpC,GAA6B,KAApBA,EAAKgyP,aACzC,CAEA9zL,QAAAA,CAASwrI,EAAmC+qD,GACxC,OAAsE,IAA/D/qD,EAAQjgK,WAAWwoG,GAAUA,EAAM8/G,WAAa0C,GAC3D,E,+9BAGJl9L,EAAAA,EAAAA,gBAAe,CACX63M,gBAAiB,CACbh4Q,GAAI,sBACJ0S,eAAgB,cCtQT,MAAMulQ,WAA2BltG,EAAAA,EAK5Cx/J,WAAAA,CAAY5C,GACR6C,QAEAG,KAAKpM,MAAQ4tQ,EAAAA,QACbxhQ,KAAKurQ,iBAAmB,IAAI18O,EAAAA,GAAiB7uB,KAAKpM,MAAck7B,EAAAA,GAAU9xB,EAAM0S,UAAW1S,EAAMrF,OAAQqF,EAAM8W,QAC/G9T,KAAK08P,iBAAmB,GAC5B,CAEAsK,QAAAA,CAAShqQ,GACLgD,KAAKurQ,iBAAiBC,kBAAkBxuQ,EAAM0S,UAAW1S,EAAMrF,OAAQqF,EAAM8W,OACjF,CAEAk/K,oBAAAA,CAAqBzW,EAAiB6sF,GAClC,SAAK7sF,EAAQptK,WAAWnP,KAAK08P,qBAIxB1iP,EAAAA,EAAAA,IAAYha,KAAKpM,MAAMqf,cAIvBjT,KAAKurQ,iBAAiBx8O,aAAawtJ,KAIxCv8K,KAAKurQ,iBAAiBE,eAAelvF,GAAS/yK,MAAMomP,IAChD,MAAMxoP,EAA+B,GAC/Bu/L,EAAUipD,EAAYjvP,KAAK4pH,IAC7B,OAAQA,EAAW/xH,MACnB,KAAKu8P,EAAAA,GAED,OADA3tP,EAAQkI,KAAK82P,GACbhyQ,GAAAA,GAAA,GAAWm2H,EAAWttH,MAAI,IAAkBzE,KAAMuqB,EAAAA,GAAUqsO,aAAapE,UAC7E,KAAK8J,EAAAA,GAED,OADA1tP,EAAQkI,KAAKu6P,GACN,CAAC3oQ,QAASqpH,EAAWttH,KAAkBzE,KAAMuqB,EAAAA,GAAUqsO,aAAapE,SAC/E,QAEI,OADA5jP,EAAQkI,KAAK67P,IACb/2Q,GAAAA,GAAA,GACOm2H,GAAU,IACbykI,SAAU,IAAMzkI,EAAWykI,SAC3BC,WAAY,IAAM1kI,EAAW0kI,WAC7Bz2P,KAAMuqB,EAAAA,GAAUqsO,aAAapE,UAErC,IAGE98B,EAAQ0hC,EAAYjvP,KAAK4pH,GAAe,IAAMA,EAAWykI,WAC/Doa,EAAe,CACXn7C,eAAgB1xC,EAChB2xC,QACAnlN,MAAO49L,EACP7pM,WAAYsK,GACd,IAEC,GACX,CAEA,8BAAai0P,CAAyB9+E,GAClC,MAAM,KAAC12K,EAAI,QAAEuH,SAAiBpN,KAAKurQ,iBAAiBgB,uBAAuBhwF,GACtE12K,GAASuH,GAGdpN,KAAKpM,MAAMD,UAASuc,EAAAA,EAAAA,IAAcrK,EAAMuH,GAC5C,E,gEC/EG,MACMo/P,GAAsC,CAAC,YAQ9CC,GAAsB,QAEtBC,GAAqBpvQ,IAAAA,YAA6D,CAACN,EAAOk7C,KAC5F,MAAMpwC,EAAO9K,EAAMk4B,KACbyM,EAAQ3kC,EAAMC,KAAK0kC,MAEzB,OACIrkC,IAAAA,cAAC4uN,EAAAA,EAAmBxuN,OAAAC,OAAA,CAChBu6C,IAAKA,GACDl7C,GAEJM,IAAAA,cAAA,OAAKC,UAAU,kDACXD,IAAAA,cAAA,OACIoO,IAAK5D,EACLvK,UAAU,6BACVsO,KAAK+qH,EAAAA,GAAAA,IAAiBj1F,GACtBn2B,MAAO1D,KAGfxK,IAAAA,cAAA,OAAKC,UAAU,aACVuK,GAEa,IAG9B4kQ,GAAmB5oQ,YAAc,qBAElB,MAAM6oQ,WAAyBvtG,EAAAA,EAC1Cx/J,WAAAA,GACIC,QAEAG,KAAK08P,iBAAmB,GAC5B,CAEA1pE,oBAAAA,CAAqBzW,EAAiB8wC,GAElC,MAAMwO,EAAY,8BAA+B7vM,KAAKuwJ,EAAQh8K,eAC9D,IAAKs7N,EACD,OAAO,EAGX,MAAMz2M,EAASy2M,EAAS,GAClB/zN,EAAO+zN,EAAS,GAChB+wC,EAAc/wC,EAAS,GAE7B,GAAI+wC,EAAYlmQ,OAtDW,EAuDvB,OAAO,EAIX,GAAe,MAAX0e,GAA6B,MAAXA,EAClB,IAAK,MAAMynP,KAAYnvQ,OAAO+I,KAAKqmQ,GAAAA,IAC/B,GAAIA,GAAAA,GAA2BD,GAAU10O,KAAKrwB,GAE1C,OAAO,EAWnB,MANmE,SAA/DlU,EAAAA,QAAMqf,WAAWkV,SAASmrB,QAAQr7C,OAAO80Q,kBACzCn5Q,EAAAA,QAAMD,UAASq5Q,EAAAA,GAAAA,IAAyBJ,IAAcpjQ,MAAK,IAAMxJ,KAAKitQ,qBAAqBnlQ,EAAM8kQ,EAAav/C,KAE9GrtN,KAAKitQ,qBAAqBnlQ,EAAM8kQ,EAAav/C,IAG1C,CACX,CAEA6/C,YAAAA,CAAajhP,GACT,OAAOA,EAAOtrB,KAAK1D,GAAS,IAAMA,EAAKQ,KAAO,KAClD,CAYAwvQ,oBAAAA,CAAqBnlQ,EAAc8kQ,EAAqBv/C,GAA6C,IAAA8/C,EAAAC,EAAAC,EACjG,MAAMC,EAA6B,GAC7B7C,EAAuB,GACvB70Q,EAAQhC,EAAAA,QAAMqf,WACds6P,GAAyB,QAAdJ,EAAAv3Q,EAAMuyB,gBAAQ,IAAAglP,GAAa,QAAbC,EAAdD,EAAgB1mO,mBAAW,IAAA2mO,GAAwC,QAAxCC,EAA3BD,EAA6BzH,cAAc,gCAAwB,IAAA0H,OAArD,EAAdA,EAAqEvsQ,QAAS,UACzFqrB,GAAWsqG,EAAAA,GAAAA,IAAY7gI,GACvBwlI,GAAe+L,EAAAA,GAAAA,IAAqBvxI,GAG1C,IAAK,MAAO6H,EAAMkkC,KAAUxV,EACxB,IAAIqgP,GAAoC/iO,SAAS9H,EAAMjU,UAIvD,IAAIqrG,EAAAA,GAAAA,IAAcp3F,IAEd,IAAK,MAAM6rO,KAAS7rO,EAAMw5F,YACtB,IAAoC,IAAhCqyI,EAAMhhP,QAAQogP,GAAqB,CACnC,MAAMa,EAAeryI,EAAa3xF,SAAS+jO,IAAUpyI,EAAa3xF,SAAShsC,GAAQ6vQ,EAAgB7C,GAG/FvuI,EAAAA,GAAAA,IAAiBv6F,EAAO4rO,IACxBE,EAAan+P,KAAK,CAAC7R,KAAM+vQ,EAAO7rO,QAAOnpC,KAAMi0Q,KAEjD,KACJ,OAED,IAAmC,IAA/BhvQ,EAAK+uB,QAAQogP,GAAqB,CAEzC,GAAIzgP,EAASuhP,eAAejwQ,GAExB,UAGiB29H,EAAa3xF,SAAShsC,GAAQ6vQ,EAAgB7C,GAEtDn7P,KAAK,CAAC7R,OAAMkkC,QAAOnpC,KAAMi0Q,IAC1C,CAGJ,MAAMkB,EAAmBA,CAACztN,EAActwC,KAC7BmsH,EAAAA,GAAAA,IAAc77E,EAAEve,MAAO/xB,EAAE+xB,MAAOirO,GAG3CU,EAAcn3M,KAAKw3M,GAEnBlD,EAAQt0M,KAAKw3M,GAabtgD,EAAgB,CACZY,eAAgBnmN,EAChBomN,MAbU,IACPluN,KAAKktQ,aAAaI,MAClBttQ,KAAKktQ,aAAazC,IAYrB1hQ,MATU,IACPukQ,KACA7C,GAQHxvQ,UAAWyxQ,IAEnB,GAGJl4M,EAAAA,EAAAA,gBAAe,CACXo5M,cAAe,CACXv5Q,GAAI,mBACJ0S,eAAgB,W,qbC1JxB,MAAM8mQ,GAAM,CAAC,OA+CPC,GAAU,CAACC,WAAY,WACvBC,GAAS,CAACD,WAAY,UAEb,MAAMl6L,WAAgBv2E,IAAAA,cAYjCsC,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,qBAwCDrD,IACZuD,KAAKhD,MAAMiD,SAASxD,EAAE,IACzBqD,GAAA,2BAsEqBpD,IAClB,GAAIsD,KAAKhD,MAAM2zE,gBACX,GAAIj0E,EAAQgK,OAAS1G,KAAKhD,MAAMy3E,eAAgB,CAC5C,MAAM5sE,EACFvK,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4BACH0S,eAAe,8DACfjB,OAAQ,CACJY,OAAQhK,EAAQgK,OAChBiuG,MAAO30G,KAAKhD,MAAMy3E,kBAG9Bz0E,KAAKhD,MAAM2zE,gBAAgB9oE,EAC/B,MACI7H,KAAKhD,MAAM2zE,gBAAgB,KAEnC,IAGJ7wE,GAAA,sBACiBrD,IAAsD,IAAAwxQ,EAAApmI,EAE/C,QAApBomI,GAAApmI,EAAA7nI,KAAKhD,OAAMi3E,iBAAS,IAAAg6L,GAApBA,EAAAz/P,KAAAq5H,EAAuBprI,EAAmC,IAC7DqD,GAAA,sBAEgBrD,IAA6B,IAAAyxQ,EAAAz0E,EAAA,OAAyB,QAAzBy0E,GAAKz0E,EAAAz5L,KAAKhD,OAAMk3E,iBAAS,IAAAg6L,OAAA,EAApBA,EAAA1/P,KAAAirL,EAAuBh9L,EAAE,IAAAqD,GAAA,oBAE7DrD,IAAgC,IAAA0xQ,EAAAzzE,EAAA,OAAuB,QAAvByzE,GAAKzzE,EAAA16L,KAAKhD,OAAMm3E,eAAO,IAAAg6L,OAAA,EAAlBA,EAAA3/P,KAAAksL,EAAqBj+L,EAAE,IAE3EqD,GAAA,mBACcrD,IAAmD,IAAA2xQ,EAAAC,EAE5C,QAAjBD,GAAAC,EAAAruQ,KAAKhD,OAAMs3E,cAAM,IAAA85L,GAAjBA,EAAA5/P,KAAA6/P,EAAoB5xQ,EAAgC,IACvDqD,GAAA,oBAEa,KAAM,IAAAwuQ,EAChB,OAA2B,QAA3BA,EAAOtuQ,KAAKtD,QAAQqT,eAAO,IAAAu+P,OAAA,EAApBA,EAAsB//C,YAAY,IAC5CzuN,GAAA,cAEO,KACJ,MAAMqlE,EAAUnlE,KAAKolE,cACjBD,IACAA,EAAQnmD,QACR9gB,EAAAA,GAAsBinE,GACtB58C,YAAW,KACPrqB,EAAAA,GAAoBinE,EAAQ,IAIhCnlE,KAAKuuQ,mBAAmBppM,EAAQrkE,OACpC,IACHhB,GAAA,aAEM,KAAM,IAAA0uQ,EACS,QAAlBA,EAAAxuQ,KAAKolE,qBAAa,IAAAopM,GAAlBA,EAAoB3oM,MAAM,IAC7B/lE,GAAA,iBAEU,IACAE,KAAKhD,MAAM03E,QAAUs5L,GAASF,KAxKrC9tQ,KAAKouN,oBAAsB,GAEvBpxN,EAAM04H,kBACN11H,KAAKouN,oBAAoB9+M,KAAK,IAAIg9P,GAAmB,CACjD30Q,OAAQqI,KAAKhD,MAAMqmB,cACnB3T,UAAW1P,KAAKhD,MAAM0S,UACtBoE,OAAQ9T,KAAKhD,MAAM8W,UAI3B9T,KAAKouN,oBAAoB9+M,KACrB,IAAIq3P,EAAkB,CAClBvjP,cAAepjB,KAAKhD,MAAMomB,cAC1B1T,UAAW1P,KAAKhD,MAAM0S,UACtByV,2BAA6BC,GAAmBplB,KAAKhD,MAAMqD,QAAQ8kB,2BAA2BC,EAAQplB,KAAKhD,MAAM0S,WACjH8jB,mBAAoBxzB,KAAKhD,MAAMw2B,mBAC/BozO,mBAAoB5mQ,KAAKhD,MAAM4pQ,mBAC/B72O,mCAAqC3K,GAAmBplB,KAAKhD,MAAMqD,QAAQ0vB,mCAAmC3K,EAAQplB,KAAKhD,MAAMqmB,cAAerjB,KAAKhD,MAAM0S,WAC3Jm3P,iBAAkB7mQ,KAAKhD,MAAM6pQ,mBAEjC,IAAIqD,EAAuBltQ,EAAMqD,QAAQY,qBAAsBjE,EAAMmtQ,0BACrE,IAAIwC,IAGJ3vQ,EAAM04H,kBACN11H,KAAKouN,oBAAoB9+M,KAAK,IAAIg8P,GAAgB,CAC9C3zQ,OAAQqI,KAAKhD,MAAMqmB,cACnB3T,UAAW1P,KAAKhD,MAAM0S,UACtBoE,OAAQ9T,KAAKhD,MAAM8W,UAI3B9T,KAAKuuQ,mBAAmBvxQ,EAAM8D,OAC9Bd,KAAKyuQ,QAAUnxQ,IAAAA,YACf0C,KAAKtD,QAAUY,IAAAA,YACf0C,KAAK00E,QAAUp3E,IAAAA,WACnB,CAMAoxQ,iBAAAA,CAAkBh2N,GACd,GAAI14C,KAAKhD,MAAM0S,YAAcgpC,EAAUhpC,WACnC1P,KAAKhD,MAAMomB,gBAAkBs1B,EAAUt1B,eACvCpjB,KAAKhD,MAAM4pQ,qBAAuBluN,EAAUkuN,oBAC5C5mQ,KAAKhD,MAAMw2B,qBAAuBklB,EAAUllB,oBAC5CxzB,KAAKhD,MAAMqmB,gBAAkBq1B,EAAUr1B,eACvCrjB,KAAKhD,MAAM6pQ,mBAAqBnuN,EAAUmuN,iBAE1C,IAAK,MAAMp1E,KAAYzxL,KAAKouN,oBACpB38B,aAAoBk1E,GACpBl1E,EAASu1E,SAAS,CACd5jP,cAAepjB,KAAKhD,MAAMomB,cAC1B1T,UAAW1P,KAAKhD,MAAM0S,UACtByV,2BAA6BC,GAAmBplB,KAAKhD,MAAMqD,QAAQ8kB,2BAA2BC,EAAQplB,KAAKhD,MAAM0S,WACjH8jB,mBAAoBxzB,KAAKhD,MAAMw2B,mBAC/BozO,mBAAoB5mQ,KAAKhD,MAAM4pQ,mBAC/B72O,mCAAqC3K,GAAmBplB,KAAKhD,MAAMqD,QAAQ0vB,mCAAmC3K,EAAQplB,KAAKhD,MAAMqmB,cAAerjB,KAAKhD,MAAM0S,WAC3Jm3P,iBAAkB7mQ,KAAKhD,MAAM6pQ,mBAM7C,GAAI7mQ,KAAKhD,MAAM0S,YAAcgpC,EAAUhpC,WACnC1P,KAAKhD,MAAMqmB,gBAAkBq1B,EAAUr1B,eACvCrjB,KAAKhD,MAAM8W,SAAW4kC,EAAU5kC,OAEhC,IAAK,MAAM29K,KAAYzxL,KAAKouN,oBACpB38B,aAAoB65E,IACpB75E,EAASu1E,SAAS,CACdrvQ,OAAQqI,KAAKhD,MAAMqmB,cACnB3T,UAAW1P,KAAKhD,MAAM0S,UACtBoE,OAAQ9T,KAAKhD,MAAM8W,SAGvB29K,aAAoB66E,IACpB76E,EAASu1E,SAAS,CACdrvQ,OAAQqI,KAAKhD,MAAMqmB,cACnB3T,UAAW1P,KAAKhD,MAAM0S,UACtBoE,OAAQ9T,KAAKhD,MAAM8W,SAMnC,GAAI9T,KAAKhD,MAAMmtQ,2BAA6BzxN,EAAUyxN,yBAClD,IAAK,MAAM14E,KAAYzxL,KAAKouN,oBACpB38B,aAAoBy4E,GACpBz4E,EAASu1E,SAAS,CACdmD,yBAA0BnqQ,KAAKhD,MAAMmtQ,2BAMjDzxN,EAAU53C,QAAUd,KAAKhD,MAAM8D,OAC/Bd,KAAKuuQ,mBAAmBvuQ,KAAKhD,MAAM8D,MAE3C,CAEA23C,kBAAAA,CAAmBC,GAC+B,IAAAi2N,GAAzCj2N,EAAUg8B,SAAW10E,KAAKhD,MAAM03E,UACb,QAApBi6L,EAAA3uQ,KAAK00E,QAAQ3kE,eAAO,IAAA4+P,GAApBA,EAAsB3vP,SAG1Bhf,KAAK0uQ,kBAAkBh2N,EAC3B,CA+DAz1C,MAAAA,GACI,IAAI2rQ,EAAmB,iDAWvB,OAVI5uQ,KAAKhD,MAAMw3E,eACXo6L,GAAoB,kCAEpB5uQ,KAAKhD,MAAMojE,gBACXwuM,GAAoB,mBAEpB5uQ,KAAKhD,MAAM82E,YACX86L,GAAoB,yBAIpBtxQ,IAAAA,cAAA,OACI46C,IAAKl4C,KAAKyuQ,QACVlxQ,UAAWk3C,IAAW,mBAAoB,CAAC,2BAA4Bz0C,KAAKhD,MAAM03E,WAElFp3E,IAAAA,cAAA,OACIw1D,SAAU9yD,KAAKhD,MAAM81D,UAAY,EACjC5a,IAAKl4C,KAAK00E,QACVn3E,UAAWk3C,IAAW,oDAAqD,CAAC,uBAAwBz0C,KAAKhD,MAAM82E,YAC/GE,WAAYh0E,KAAKhD,MAAMg3E,WACvBC,UAAWj0E,KAAKosE,cAChBkI,OAAQt0E,KAAK8wE,YAEbxzE,IAAAA,cAACu0M,EAAAA,EAAY,CACTn1M,QAASsD,KAAKhD,MAAM8D,MACpB4O,UAAW1P,KAAKhD,MAAM0S,UACtB8qJ,WAAY,CAACjpB,eAAe,MAGpCj0I,IAAAA,cAAC+oG,GAAAA,EAEG,CACAnuD,IAAKl4C,KAAKtD,QACVrI,GAAI2L,KAAKhD,MAAM3I,GACfkJ,UAAWqxQ,EACXvQ,WAAW,OACX18P,YAAa3B,KAAKhD,MAAMq1E,cACxBpyE,SAAUD,KAAKk+D,aACf8V,WAAYh0E,KAAKhD,MAAMg3E,WACvBC,UAAWj0E,KAAKosE,cAChB8H,UAAWl0E,KAAK6uQ,cAChB16L,QAASn0E,KAAK8uQ,YACd16L,cAAep0E,KAAKhD,MAAMo3E,cAC1BE,OAAQt0E,KAAK8wE,WACbyD,QAASv0E,KAAKhD,MAAMu3E,QACpBF,eAAgBr0E,KAAKhD,MAAMq3E,eAC3BM,cAAe30E,KAAKhD,MAAM23E,cAC1B1E,QAASjwE,KAAKhD,MAAMizE,QACpBvlE,MAAO1K,KAAK+uQ,WACZxjJ,eAAgBvrH,KAAKhD,MAAMuuH,eAC3BrmH,cAAelF,KAAKhD,MAAM+2E,eAC1BoyB,aAAcnmG,KAAKhD,MAAM24H,uBACzB5vB,UAAW/lG,KAAKouN,oBAChBttN,MAAOd,KAAKhD,MAAM8D,MAClB62P,eAAgBkW,GAChBlpQ,SAAU3E,KAAKhD,MAAM2H,SACrBu4P,UAAWl9P,KAAKhD,MAAM0S,UACtBk3F,cAAe5mG,KAAKhD,MAAM4pG,cAC1B4sF,iBAAkBxzL,KAAKhD,MAAMw2L,mBAI7C,EACH1zL,GA3PoB+zE,GAAO,eAMF,CAClB6hD,kBAAkB,EAClBnK,eAAgB7jB,EAAAA,EAChB3zB,eAAgB7nE,GAAAA,I,gBC0CxB,SAlHA,SAAqBzW,GAMX,IAMFu5Q,GAZc,YAClB5rM,EAAW,mBACX4yD,EAAkB,QAClBF,GAAU,EAAK,0BACfC,GAA4B,EAAK,cACjCF,GACIpgI,EAQAw5Q,EAAgB,GAEhBl5I,IACAk5I,EAAgB,UAIhBD,EADAh5I,GAII14H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,eACH0S,eAAe,iBAK3B,MAAMmoQ,EACF5xQ,IAAAA,cAAA,UACIjJ,GAAG,cACHuY,QA3BenQ,IACnBA,EAAEyK,iBACF2uH,SAAAA,GAAiBzyD,EAAY,EA0BzB7lE,UAAU,gDAET6lE,EACG4rM,EAEA1xQ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,kBACH0S,eAAe,aAMzB7D,EACF5F,IAAAA,cAAA,OACIoN,MAAO,CAACqjQ,WAAYj4I,EAAU,UAAY,SAAUj3E,QAASi3E,EAAU,OAAS,KAChFv4H,UAAU,qBAEVD,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,eACH0S,eAAe,cAGvBzJ,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,cAGvBzJ,IAAAA,cAAA,YACK,KACDA,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iBACH0S,eAAe,YAGtB,OAELzJ,IAAAA,cAAA,YACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,mBAGvBzJ,IAAAA,cAAA,YACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,wBAGvBzJ,IAAAA,cAAA,YACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gBACH0S,eAAe,aAM/B,OACIzJ,IAAAA,cAAA,OAAKC,UAAW,cAAgB0xQ,GAC3B/rQ,EACAgsQ,EACD5xQ,IAAAA,cAAC03C,GAAAA,EAAY,CACTvlC,SAAS,gBACTgkC,KAAM,+DACNl2C,UAAU,qBAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,eACH0S,eAAe,UAKnC,EClEA,IAAe3B,EAAAA,EAAAA,UAhCa+pQ,KACxB,MAAMC,GAAuBC,EAAAA,EAAAA,MAC7B,MAAO,CAACz5Q,EAAoB2hC,KAAoB,IAAA+3O,EAC5C,MAAM33Q,GAASogB,EAAAA,EAAAA,IAAiBniB,GAC1B40B,GAAUC,EAAAA,EAAAA,IAAW70B,GAMrBgxQ,EAL2C,UAAxBp8O,aAAO,EAAPA,EAASG,aAAiD,UAAxBH,aAAO,EAAPA,EAASI,cAAyBV,EAAAA,EAAAA,IAAuBt0B,EAChH+B,EACA4/B,EAAS7nB,UACTya,EAAAA,EAAYU,qBAE8B0kP,EAAAA,EAAAA,IAAgC35Q,EAAO+B,EAAQ4/B,EAAS7nB,WAAa,KAEnH,MAAO,CACH0T,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAChCytB,cAAe1rB,EACfivQ,qBACAC,iBAAkBuI,EAAqBx5Q,EAAsB,QAAjB05Q,EAAE/3O,EAASzjB,cAAM,IAAAw7P,EAAAA,EAAI,IACjEnF,yBAAwE,UAA9CptP,EAAAA,EAAAA,IAAUnnB,GAAO45Q,yBAC9C,CACJ,IAGuB77Q,IAAkB,CAC1C0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6f,2BAA0B,KAC1BlkB,qBAAoB,KACpB8uB,mCAAkCA,EAAAA,GACnCp8B,MAKyD,KAAM,CAAC2qE,YAAY,GAAnF,CAA0FuV,G,sMC3C1F,SAAS60F,EAAMjzK,GASG,IATF,QACZ62L,EAAO,OACPt3K,EAAM,SACN28C,EAAQ,SACRniB,EAAQ,OACRigO,EAAM,UACNhrJ,EAAS,kBACTirJ,GAAoB,GAERj6Q,EADT0qH,E,qWAAKhjE,CAAA1nD,EAAA2nD,GAER,OACI9/C,IAAAA,cAAA,SAAAI,OAAAC,OAAA,GACQwiH,EAAK,CACT5iH,UAAWk3C,IAAW,8BAA+B,CAAC,YAAajF,EAAUkgO,qBAAoBvvJ,EAAM5iH,aAEtG+uL,GACGhvL,IAAAA,cAAA,QAAMC,UAAU,oBACX+uL,GAGThvL,IAAAA,cAAA,QAAMC,UAAWk3C,IAAW,eAAgB,CAACk7N,WAAYlrJ,KACpD9yD,EACA89M,GAAUnyQ,IAAAA,cAAA,QAAMC,UAAU,SAE9ByX,GACG1X,IAAAA,cAAA,QAAMC,UAAU,mBACXyX,GAKrB,CAEA,SAAe63C,EAAAA,EAAAA,MAAK67G,E,wJCvCpB,SAAS6jB,EAAY92L,GAGqC,IAHpC,YAClBq2L,GAEoDr2L,EADjDuH,E,qWAAKmgD,CAAA1nD,EAAA2nD,GAER,MAAM,cAACt2C,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAACorK,EAAAA,EAAMhrK,OAAAC,OAAA,GACCX,EAAK,CACTO,UAAWk3C,IAAWz3C,EAAMO,UAAW,gBACvCoH,SAAUkF,QAAQ7M,EAAM2H,UACxB6qC,SAAUs8I,SAAAA,IAEKhlL,EAAdglL,EAA4B,CACzBz3L,GAAI,sBACJ0S,eAAgB,aACD,CACf1S,GAAI,yBACJ0S,eAAgB,WAIhC,CAEA,SAAe8lD,EAAAA,EAAAA,MAAK0/H,E,mCC9Bb,MAAMC,EAA4D,CACrE56D,MAAO,CACH,MACA,SACA,OACA,MACA,QAEJhyE,SAAS,EACT2N,IAAK,U,8eCOT,SAASqiN,EAAgBn6Q,GAMf,IANgB,cACtBo6Q,EAAa,QACbjjQ,EAAO,UACPg4E,EAAS,MACTj5E,EAAK,QACLtL,GACI5K,EACJ,MACMq6Q,GADOh5P,EAAAA,EAAAA,WACehQ,cAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,0BAEhG27C,EAAAA,EAAAA,YAAU,KACNriD,EAAQ0vQ,wBAAwBF,EAAc,GAC/C,CAACA,IAEJ,MAAMrtC,GAAiBzrN,EAAAA,EAAAA,cAAata,KAC5Bw/D,EAAAA,EAAAA,GAAax/D,EAAGsmB,EAAAA,GAAUoxC,SAASua,SAC/BmhM,GACAjrL,GAER,GACD,CAACirL,IAUJ,OARAntN,EAAAA,EAAAA,YAAU,KACNljD,SAASq7D,iBAAiB,UAAW2nK,GAE9B,KACHhjO,SAASu7D,oBAAoB,UAAWynK,EAAe,IAE5D,CAACA,IAGAllO,IAAAA,cAAA,OACIC,UAAU,qBACVmN,MAAO,CAACiB,UAERrO,IAAAA,cAAC0yQ,EAAAA,EAAK,CACF7mQ,KAAM0mQ,EACNI,aAAa,EACbrjQ,QAASA,EACTg4E,UAAWA,EACXkrL,eAAgBA,EAChBnkQ,MAAO,KAEPrO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,iBAKnC,CAAC6oQ,EAAAjqQ,UAAA,CA3DGkqQ,cAAazsQ,IAAAA,KAAAC,WACbsI,MAAKvI,IAAAA,OAAAC,WACLuJ,QAAOxJ,IAAAA,KAAAC,WACPuhF,UAASxhF,IAAAA,KAAAC,WACThD,QAAO+C,IAAAA,MAAA,CACH2sQ,wBAAuB3sQ,IAAAA,KAAAC,aAAAA,YAwD/B,SAAewpD,EAAAA,EAAAA,MAAK+iN,GCfpB,GAAexqQ,EAAAA,EAAAA,UAtBf,WACI,MAAM8qQ,EAdV,WACI,MAAMC,GAAoBC,EAAAA,EAAAA,MAE1B,OAAO1oN,EAAAA,EAAAA,IACH,4BACAyoN,EACA9vP,EAAAA,IACA,CAACgwP,EAAqBC,EAAmBC,IAAuBA,IAChE,CAACpqP,EAAOoY,EAAagyO,IAAepqP,EAChCyY,MAAMjuB,GAASA,EAAKuL,UAAYq0P,GAAc5/P,EAAKoL,UAAYwiB,EAAYlqC,MAEvF,CAGkCm8Q,GAE9B,MAAO,CAAC56Q,EAAoB2hC,KACxB,MAAM,SAAC+zJ,EAAQ,iBAAEmlF,EAAgB,QAAEC,GAAWn5O,EAI9C,MAAO,CACHs4O,gBAHkBa,GAAUR,EAAsBt6Q,EAAO01L,EAAUmlF,GAItE,CAET,IAEA,SAA4B98Q,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxByqQ,wBAAuBA,EAAAA,IACxBp8Q,GAEX,GAEA,CAAgEi8Q,G,iFC9BhE,MAAMe,EAAwBl7Q,IAMjB,IANkB,UAC3Bia,EAAS,OACToE,EAAM,aACNsrD,EAAY,YACZz9D,EAAW,YACXioB,GACIn0B,EACJ,OACI6H,IAAAA,cAAC4hE,EAAAA,EAAkB,CACfzvD,SAAU+wC,EAAAA,GAAUC,YACpB/wC,UAAWA,EACXuX,OAAQnT,EACRsrD,aAAcA,EACdz9D,YAAaA,EACbioB,YAAaA,GACf,EAER+mP,EAAAhrQ,UAAA,CA/BE+J,UAAStM,IAAAA,OAAAC,WAGTyQ,OAAM1Q,IAAAA,OAAAC,WAEN+7D,aAAYh8D,IAAAA,KACZzB,YAAWyB,IAAAA,OAKXwmB,YAAWxmB,IAAAA,MAsBf,MC5CA,ED4Ce9F,IAAAA,KAAWqzQ,G,gBEtB1B,MAAMC,IAAgBtyM,EAAAA,EAAAA,aAAkC,CAAA7oE,EAK9CyiD,KAAQ,IALuC,SACrDoK,EAAQ,SACRgpI,EAAQ,aACRlsH,EAAY,YACZz9D,GACIlM,EACJ,MAAM+sB,GAAavL,EAAAA,EAAAA,SAAQsoD,EAAAA,GAAgB,IACrCtiC,GAAWoX,EAAAA,EAAAA,cAAaz+C,IAAuB6yB,EAAAA,EAAAA,IAAQ7yB,EAAO01L,KAC9DulF,GAAkBx8N,EAAAA,EAAAA,aAAYy8N,EAAAA,IAAiBC,QAAQzlF,GACvDpqL,GAAUmzC,EAAAA,EAAAA,cAAaz+C,GACrBi7Q,EACO,KAEJruP,EAAW5sB,EAAOqnC,EAASnsB,cAEtC,IAAK5P,GAAW2vQ,EACZ,OAAO,KAEX,MAAMG,EAAoB/zO,EAASzkC,OAASuqB,EAAAA,GAAAA,UAAoBkuP,oBAE1DjxM,EAAc9+D,EAAQ1I,KACtB8jM,EAA0C,IAAtBp7L,EAAQkgB,UAElC,OAAI4+C,IAAgBj9C,EAAAA,GAAU0K,YAA1BuyC,MAAwC1d,GAAAA,EAAUlhC,UAE9C9jB,IAAAA,cAAA,OACIC,UAAU,uBAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iDACH0S,eAAe,+GACfjB,OAAQ,CACJ4/C,OAASvF,GAAmB7iD,IAAAA,cAAA,cAAS6iD,OAOrD6wN,EACO,KAGP10E,EAEIh/L,IAAAA,cAAA,OAAKC,UAAU,uCACXD,IAAAA,cAAC+5M,GAAAA,EAAc,MACf/5M,IAAAA,cAAA,OAAKC,UAAU,qCACXD,IAAAA,cAACoxI,EAAAA,mBAAkB,CACftwI,KAAM,GACNuuD,MAAO,gDAEXrvD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iDACH0S,eAAe,qGACfjB,OAAQ,CACJ4/C,OAASvF,GAAmB7iD,IAAAA,cAAA,cAAS6iD,QASzD7iD,IAAAA,cAAA,OACIC,UAAU,yBACV26C,IAAKA,EACL,cAAY,kBAEZ56C,IAAAA,cAACqzQ,EAAqB,CAClBhvQ,YAAaA,EACb+N,UAAWxO,EAAQ7M,GACnByf,OAAQw3K,EACRlsH,aAAcA,IAEhB,IAId,IAAevS,EAAAA,EAAAA,MAAK+jN,I,oDC3FpB,MAAMM,GAAmCz7Q,IAAc,IAAb,OAACwxB,GAAOxxB,EAC9C,MAAMkb,GAAO0jC,EAAAA,EAAAA,cAAaz+C,IAAuB6yB,EAAAA,EAAAA,IAAQ7yB,EAAOqxB,KAC1DukK,GAAuBv0K,EAAAA,EAAAA,SAAQw0K,EAAAA,GAA0B,IAEzDG,GAAev3I,EAAAA,EAAAA,cAAaz+C,GACf41L,EAAqB51L,EAAO+a,GAC7Bm9B,aAAe,IAGjC,OAAqB,IAAjB89I,EACO,KAIPtuL,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,WACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,oEACfjB,OAAQ,CAAC8lL,mBAGf,EAEZslF,GAAAvrQ,UAAA,CA3BEshB,OAAM7jB,IAAAA,OAAAC,YA6BV,YCnBA,SAAS8tQ,GAAK17Q,GAOJ,IAPK,UACX27Q,EAAS,WACThyE,EAAU,YACViyE,EAAW,KACX1gQ,EAAI,eACJmyL,EAAc,eACdh0E,GACIr5H,EACJ,OACI6H,IAAAA,cAACg0Q,GAAAA,EAAa,CACVF,UAAWA,EACX9mE,gBAAiB+mE,EACjBjyE,WAAYA,EACZzuL,KAAMA,EACNmyL,eAAgBA,EAChBh0E,eAAgBA,EAChBr/G,SAAU+wC,EAAAA,GAAUC,aAGhC,CAAC0wN,GAAAxrQ,UAAA,CA7BGyrQ,UAAShuQ,IAAAA,OAAAC,WACT+f,cAAahgB,IAAAA,OAAAC,WACb+7L,WAAUh8L,IAAAA,KAAAC,WACVguQ,YAAWjuQ,IAAAA,KAAAC,WAEXy/L,eAAc1/L,IAAAA,OAAAC,YA0BlB,UAAewpD,EAAAA,EAAAA,MAAKskN,ICLpB,IAAe/rQ,EAAAA,EAAAA,UArBf,SAAyBxP,EAAoB2hC,GACzC,MAAM0sK,GAAmBpjI,EAAAA,EAAAA,IACrBjrE,EACAsnB,EAAAA,GAAY4jD,0BACZ5jD,EAAAA,GAAYgnL,iBACZhnL,EAAAA,GAAYinL,0BAEVC,GAAiBnnL,EAAAA,EAAAA,IACnBrnB,EACAsnB,EAAAA,GAAY4jD,0BACZ5jD,EAAAA,GAAYmnL,qBACiC,SAA7CnnL,EAAAA,GAAYonL,8BAGhB,MAAO,CACH3zL,MAAM8X,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAASljC,IAC9B+vM,iBACAH,mBAER,GAEA,CAAwCktE,ICJxC,SAASp4M,KAAQ,CACjB,SAASw4M,GAAe97Q,GAWd,IAXe,UACrB27Q,EAAS,cACThuP,EAAa,WACbouP,EAAU,WACVpyE,EAAU,OACVuoC,EAAM,YACN0pC,EAAW,eACXvuE,EAAc,eACdh0E,EAAc,SACdw8D,EAAQ,4BACR8sB,GACI3iN,EACJ,QAAQ,GACR,KAAKqiN,EAAAA,GAAyB6vB,GAAS,CACnC,MAAMl9I,EAAOqtH,EAAAA,GAAiC6vB,GAC9C,OACIrqO,IAAAA,cAACosM,GAAAA,EAAa,CACV1uM,IAAKyvF,EACLA,KAAMA,GAGlB,CAEA,KAAKqtH,EAAAA,GAAmC6vB,GACpC,OACIrqO,IAAAA,cAAC66M,GAAAA,EAAmB,CAChBE,YAAasvB,EACbr8C,SAAUA,EACV8sB,4BAA6BA,IAIzC,KAAKo5D,EACD,OACIl0Q,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACg0Q,GAAAA,EAAa,CACVrqP,OAAQ0gN,EACRvoC,WAAYA,EACZkL,gBAAiB+mE,EACjBviJ,eAAgBA,EAChBr/G,SAAU+wC,EAAAA,GAAUuvB,WAExBzyE,IAAAA,cAAC4zQ,GAAe,CAACjqP,OAAQ0gN,KAGrC,KAAK7vB,EAAAA,GAAyC6vB,GAC1C,OACIrqO,IAAAA,cAACm0Q,GAAAA,EAAwB,CACrBhiQ,SAAU+wC,EAAAA,GAAUwvB,OACpBmnI,WAAYwwB,EACZ7kC,eAAgBA,EAChB1D,WAAYA,EACZ0F,iBAAiB,EACjB2B,eAAgB1tI,KAI5B,QACI,OACIz7D,IAAAA,cAAC6zQ,GAAK,CACFC,UAAWA,EACXhuP,cAAeA,EACf/uB,GAAIszO,EACJvoC,WAAYA,EACZiyE,YAAaA,EACbvuE,eAAgBA,EAChBh0E,eAAgBA,IAIhC,CAACyiJ,GAAA5rQ,UAAA,CAnFGyrQ,UAAShuQ,IAAAA,OAAAC,WACT+f,cAAahgB,IAAAA,OAAAC,WACbmuQ,WAAUpuQ,IAAAA,KAAAC,WACV+7L,WAAUh8L,IAAAA,KAAAC,WACVskO,OAAMvkO,IAAAA,OAAAC,WACNguQ,YAAWjuQ,IAAAA,KAAAC,WACXy/L,eAAc1/L,IAAAA,OAAAC,WAEdioL,SAAQloL,IAAAA,OAAAC,WACR+0M,4BAA2Bh1M,IAAAA,MAAAC,YA4E/B,UAAewpD,EAAAA,EAAAA,MAAK0kN,I,89BClDpB,MAAMG,GAAiB,CACnBvtN,SAAU,WACVwtN,WAAY,YACZlqK,UAAW,OACXmqK,eAAgB,OAChB58M,OAAQ,MACR6b,UAAW,QAGTghM,GAAc,CAChB5uG,WAAY,QAGVupB,GAA0Cp4L,GAAAA,GAAA,GACzC09Q,EAAAA,GAAmB,IACtBlgJ,MAAO,CACH,MACA,SACA,OACA,MACA,OACA,QACA,UAaR,MAAMmgJ,WAAgC78M,EAAAA,cAQlCt1D,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,GAAA,gBARC,GAAKA,GAAA,0BAEM,GAACA,GAAA,0BAgEV,KAChB,MAAM,kBAACwjM,EAAiB,aAAE0uE,GAAgBhyQ,KAAKhD,MAE/C,GAAIsmM,EAEA,MAAO,CACHr3L,MAFU+lQ,EAAaxlP,QAAQ82K,GAG/Bn/I,SAAU,UAIlB,MAAM8tN,GAA4BC,EAAAA,EAAAA,GAAoBF,GACtD,OAAIC,EAA4B,EACrB,CACHhmQ,MAAOgmQ,EACP9tN,SAAU,QACV6G,QA5Fa,IAgGd,CACH/+C,MAAO,EACPk4C,SAAU,MACb,IACJrkD,GAAA,qBAEcrK,IAAwF,IAAvF,aAAC8yG,EAAY,yBAAE4pK,EAAwB,aAAElzI,EAAY,aAAEy/H,GAA2BjpQ,EAC9F,GAAI8yG,GAAgB,EAChB,OAGJ,MAAM6pK,EAA+B,CAAC,EAEhCC,EAAuB9pK,EAAe02B,EAzGvB,GAyG8Dy/H,EAE9EyT,IACDnyQ,KAAKsyQ,mBAAqB,EAE1BF,EAAaC,qBAAuBA,EAEhCryQ,KAAKhD,MAAMmsI,eACNnpI,KAAKpK,MAAM4hN,cACZ46D,EAAa56D,aAAc,GAG3Bx3M,KAAKuyQ,kBACLvyQ,KAAKuyQ,iBAAiB74M,UAAU32C,EAAAA,GAAUyvP,gBAKlDH,IACAD,EAAa3B,iBAAmBv1P,KAAKC,OAGzCnb,KAAKgH,SAASorQ,EAAsB,IACvCtyQ,GAAA,gCAE0B2yQ,IAClBzyQ,KAAKhD,MAAMg1Q,cAIhBhyQ,KAAKgH,SAAS,CACV0rQ,cAAcC,EAAAA,EAAAA,IAAgB3yQ,KAAKhD,MAAMg1Q,aAAa5iQ,MAAMqjQ,KAC9D,IACL3yQ,GAAA,wBAEiB5E,IAKS,IALR,kBACf03Q,EAAiB,iBACjBC,EAAgB,mBAChBC,EAAkB,kBAClBC,GACkB73Q,EACd8E,KAAKhD,MAAMmsI,cACXnpI,KAAKgzQ,wBAAwBJ,GAEjC5yQ,KAAKgH,SAAS,CACV4rQ,oBACAC,mBACAC,qBACAC,qBACF,IACLjzQ,GAAA,4BAEqB,KAClB,IAAImzQ,EAAY,EAQhB,OALIA,EADAjzQ,KAAKhD,MAAMsmM,kBACCtjM,KAAKhD,MAAMg1Q,aAAatrO,WAAWzf,GAAWA,IAAWjnB,KAAKhD,MAAMsmM,qBAEpE4uE,EAAAA,EAAAA,GAAoBlyQ,KAAKhD,MAAMg1Q,eAGzB,IAAfiB,EAAmB,EAAIA,CAAS,IAC1CnzQ,GAAA,6BAEuBmM,IACpB,GAAIA,EAAQ,GAAKA,GAASjM,KAAKhD,MAAMg1Q,aAAatrQ,OAC9C,OAEJ,MAAM,kBAACqsQ,EAAiB,mBAAED,GAAsB9yQ,KAAKpK,MAE3B,MAAtBk9Q,GAA8B7mQ,EAAQ6mQ,GACtC9yQ,KAAKkzQ,uBAAuBjnQ,EAAO7K,KAAKs2D,IAAIo7M,EAAqB,EAAG,IAG/C,MAArBC,GAA6B9mQ,EAAQ8mQ,GACrC/yQ,KAAKkzQ,uBAAuBjnQ,EAAO7K,KAAKinD,IAAI0qN,EAAoB,EAAG/yQ,KAAKhD,MAAMg1Q,aAAatrQ,OAAS,GACxG,IACH5G,GAAA,+BAEwB,CAACmM,EAAeknQ,KAEjCnzQ,KAAKsyQ,mBAAqB,KAI9BtyQ,KAAKsyQ,qBAILtyQ,KAAKokI,aAAa+uI,EAAW,SAE7BnkQ,OAAO22F,uBAAsB,KACzB3lG,KAAKokI,aAAan4H,EAAO,QAAQ,IACnC,IACLnM,GAAA,qBAEc,CAACmM,EAAek4C,EAAkB6G,KACzChrD,KAAK4jK,QAAQ7zJ,SACb/P,KAAK4jK,QAAQ7zJ,QAAQq0H,aAAan4H,EAAOk4C,EAAU6G,EACvD,IACHlrD,GAAA,uBAEgB,KACbE,KAAKokI,aAAa,EAAG,MAAM,IAC9BtkI,GAAA,2BAEoB,KACjBE,KAAKgH,SAAS,CAACypQ,iBAAkBv1P,KAAKC,OAAO,IAChDrb,GAAA,yBAEkB,KACf,MAAMmM,GAAQimQ,EAAAA,EAAAA,GAAoBlyQ,KAAKhD,MAAMg1Q,cACzC/lQ,GAAS,EACTjM,KAAKokI,aAAan4H,EAAO,SA9NR,IAgOjBjM,KAAKozQ,gBACT,IACHtzQ,GAAA,gCAEyB,KACtB,MAAM,kBAACwjM,EAAiB,aAAE0uE,GAAgBhyQ,KAAKhD,MAE3CsmM,GACAtjM,KAAKgH,SAAS,CAACqrQ,sBAAsB,IAAQ,KACzCryQ,KAAKokI,aAAa4tI,EAAaxlP,QAAQ82K,GAAoB,SAAS,GAE5E,IACHxjM,GAAA,yBAEkB,KACXE,KAAKi6G,SACLj6G,KAAKgH,SAAS,CAACwwM,aAAa,GAChC,IACH13M,GAAA,kBAEW8zD,IAAiE,IAAhE,KAAC3/D,EAAI,OAAE09B,EAAM,MAAEjnB,GAA4CkpD,EACpE,MAAM3nD,EAAQhY,EAAKu4B,QAAQmF,GAC3B,IAAIp0B,EAAY,GACZ6zQ,EAAY,EAChB,MAAMiC,EAAmB,oBACnBC,GAA6B,IAAXrnQ,GAAgBA,EAAQhY,EAAKyS,OAAS,EAAKzS,EAAKgY,EAAQ,GAAK,GAC/EsnQ,EAActnQ,EAAQ,GAAKA,EAAQhY,EAAKyS,OAAUzS,EAAKgY,EAAQ,GAAK,KAEtEunQ,EAAAA,EAAAA,IAAWD,KAAeE,EAAAA,EAAAA,IAAqBF,MAC/Ch2Q,GAAa81Q,EAAmB,aAGhCG,EAAAA,EAAAA,IAAWF,KAAmBG,EAAAA,EAAAA,IAAqBH,MAC/C/1Q,EAAUksC,SAAS4pO,GACnB91Q,GAAa,OAEbA,GAAa81Q,EAAmB,QAIxC,MAAMj0E,EAAaztK,IAAW3xB,KAAKhD,MAAM02Q,SAASr/Q,GAC5Cm9Q,EAAa7/O,IAAW3xB,KAAKhD,MAAMwG,SAASnP,GAMlD,OAJKm/Q,EAAAA,EAAAA,IAAW7hP,KAAY8hP,EAAAA,EAAAA,IAAqB9hP,KAAYgiP,EAAAA,EAAAA,IAAgBhiP,IAAY6/O,GACrFJ,IAIA9zQ,IAAAA,cAAA,OACIoN,MAAOA,EACPnN,UAAWA,GAEXD,IAAAA,cAACkmL,GAAG,CACA4tF,UAAWA,EACXhuP,cAAepjB,KAAKhD,MAAMomB,cAC1BouP,WAAYA,EACZpyE,WAAYA,EACZuoC,OAAQh2M,EACR0/O,YAAarxQ,KAAKhD,MAAMq0Q,YACxBvuE,gBAAgB8wE,EAAAA,EAAAA,IAAkB3/Q,EAAMgY,GACxC6iH,eAAgB9uH,KAAKhD,MAAM62Q,qBAAuBrnF,QAAiBl0L,EACnEgzL,SAAUtrL,KAAKhD,MAAMwG,SAASnP,GAC9B+jN,4BAA6Bp4M,KAAKhD,MAAMo7M,8BAE1C,IAEbt4M,GAAA,uBAEgB,KACb,IAAKE,KAAKhD,MAAM62Q,qBACZ,OAAOhC,EAGK,IACnB/xQ,GAAA,6BAEsB,KACnB,MAAM,iBAAC+yQ,GAAoB7yQ,KAAKpK,MAC1Bq8Q,GAA4BC,EAAAA,EAAAA,GAAoBlyQ,KAAKhD,MAAMg1Q,cACjE,OAAwB,MAApBa,GACOA,EAAmBZ,CAElB,IACfnyQ,GAAA,oBAEc6L,IACX,MAAM,iBAACknQ,EAAgB,iBAAEpC,EAAgB,qBAAE4B,GAAwBryQ,KAAKpK,MAClE86Q,EACmB,IAArBmC,IACC7yQ,KAAK8zQ,yBACLzB,EAEL,OACI/0Q,IAAAA,cAACsyQ,EAAgB,CACbtkF,SAAUtrL,KAAKhD,MAAMwG,SAASnP,GAC9Bo8Q,iBAAkBA,EAClBC,QAASA,EACT9rL,UAAW5kF,KAAK+zQ,mBAChBpoQ,MAAOA,EACPiB,QAAS5M,KAAKg0Q,kBAChB,IAhTN,MAAMf,EAAYjzQ,KAAKi0Q,sBAEvBj0Q,KAAKk0Q,kBAAoB,CACrB9yQ,KAAKs2D,IAAIu7M,EAAY,GAAI,GACzB7xQ,KAAKs2D,IAAIu7M,EAAY,GAAI7xQ,KAAKinD,IAAIrrD,EAAMg1Q,aAAatrQ,OAAS,EAAG,MAGrE1G,KAAK4jK,QAAUtmK,IAAAA,YACf0C,KAAKm0Q,SAAW72Q,IAAAA,YAChB0C,KAAKuyQ,iBAAmB,IAAI35M,EAAAA,EAAc54D,KAAKo0Q,kBAE/Cp0Q,KAAKpK,MAAQ,CACT4hN,aAAa,EACb66D,sBAAsB,EACtBK,kBAAcp6Q,EACdm4Q,iBAAkBv1P,KAAKC,MACvBy3P,uBAAmBt6Q,EACnBu6Q,sBAAkBv6Q,EAClBw6Q,wBAAoBx6Q,EACpBy6Q,uBAAmBz6Q,EAE3B,CAEAigD,iBAAAA,GACIv4C,KAAKi6G,SAAU,EAEfj6G,KAAKhD,MAAMq3Q,kBACf,CAEA/2M,oBAAAA,GACIt9D,KAAKi6G,SAAU,CACnB,CAEAxhE,kBAAAA,CAAmBC,GAAkB,IAAA47N,EACjC,MAAM,kBAAChxE,EAAiB,sBAAEixE,EAAqB,SAAEb,EAAQ,cAAEtwP,EAAa,eAAE4gL,GAAkBhkM,KAAKhD,OAG7FgnM,aAAc,EAAdA,EAAgB5iL,cAAsC,QAA7BkzP,EAAK57N,EAAUsrJ,sBAAc,IAAAswE,OAAA,EAAxBA,EAA0BlzP,YACxDphB,KAAKozQ,iBAGJ9vE,GAAqB5qJ,EAAU4qJ,oBAAsBA,GACtD5qJ,EAAU67N,wBAA0BA,EACpCv0Q,KAAKw0Q,0BAEL97N,EAAUg7N,SAASr/Q,KAAOq/Q,EAASr/Q,IAClCq/Q,EAAS33P,UAAYqH,IAAiBpjB,KAAKpK,MAAMy8Q,sBAElDryQ,KAAKozQ,gBAEb,CAEAqB,gBAAAA,GACI,OAAOpsP,QAAQC,SACnB,CA8PArlB,MAAAA,GACI,MAAM,aAACyvQ,GAAgB1yQ,KAAKpK,MAE5B,OACI0H,IAAAA,cAAA,OAAKC,UAAU,qBACVyC,KAAKhD,MAAMmsI,cAAgBupI,IAAiB1yQ,KAAKhD,MAAM62Q,sBACpDv2Q,IAAAA,cAACi6M,EAAAA,EAAiB,CACdE,WAAW,EACXD,YAAax3M,KAAKpK,MAAM4hN,YACxBvwL,OAAQyrP,IAGhBp1Q,IAAAA,cAAA,OACI8M,KAAK,cACL,aAAYlM,EAAAA,GAAsB,CAAC7J,GAAI,oCAAqC0S,eAAgB,yCAC5FxJ,UAAU,mCACVmN,MAAO,CAACkB,OAAQ,QAChB,uBAAqB,IACrB,yBAAuB,EACvB,4BAA0B,GAE1BtO,IAAAA,cAACojG,EAAAA,EAAS,MACLoS,IAAA,IAAC,MAACnnG,EAAK,OAAEC,GAAOknG,EAAA,OACbx1G,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACo3Q,EAAAA,EAAe,CACZD,iBAAkBz0Q,KAAKy0Q,iBACvB7oQ,OAAQA,EACRsoQ,kBAAmBl0Q,KAAKk0Q,kBACxBS,kBAAmB30Q,KAAK20Q,kBACxBC,eAAgB50Q,KAAK60Q,iBACrBV,SAAUn0Q,KAAKm0Q,SACfv0I,SAAU5/H,KAAKhD,MAAMg1Q,aACrB8C,eAAgB90Q,KAAK+0Q,qBACrBj0K,gBAAiB9gG,KAAK8gG,gBACtBg/B,SAAU9/H,KAAKk/H,aACf81I,sBApWJ,GAqWIC,qBAtWL,GAuWK/8N,IAAKl4C,KAAK4jK,QACVl5J,MAAOgnQ,GACP/lQ,MAAOA,EACPpO,UAAW,0BACX23Q,uBAAuB,GAEtBl1Q,KAAK0gJ,WAET1gJ,KAAKm1Q,YAAYxpQ,GACnB,KAIfrO,IAAAA,cAACszQ,GAAa,CACVjvQ,YAAa3B,KAAKhD,MAAMo4Q,iBACxBh2M,aAAcp/D,KAAKhD,MAAMoiE,aACzB9c,SAAUtiD,KAAKhD,MAAMgnM,eACrB1Y,SAAUtrL,KAAKhD,MAAMwG,SAASnP,KAI9C,EAGJ,YC5ZM6yD,GAAqB,CACvBmtN,iBAAgBA,EAAAA,IAGpB,IAAejvQ,EAAAA,EAAAA,UApCf,WACI,MAAMiwQ,GAA+BC,EAAAA,EAAAA,MAC/BC,GAAwBC,EAAAA,EAAAA,MAE9B,MAAO,CAAC5/Q,EAAoB2hC,KACxB,MAAM,QAACk+O,EAAO,qBAAE5B,EAAoB,SAAErwQ,EAAQ,UAAEkM,GAAa6nB,EAEvDmF,GAAmBliB,EAAAA,EAAAA,IAA0B5kB,GAC7CwtB,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjCqlB,EAAes6P,EAAsB3/Q,EAAO4N,EAASnP,IACrD2vM,GAAiBvT,EAAAA,EAAAA,IAAkB76L,EAAO8Z,GAE1CgkQ,GAAWjrP,EAAAA,EAAAA,IAAQ7yB,EAAO6/Q,EAAQ,IAElCzD,EAAeqD,EAA6Bz/Q,EAAO,CACrD6/Q,UACAC,UAAW7B,EACX54P,aAAcyhB,EAAmBzhB,OAAe3iB,IAE9C8/M,EAA8BxiN,EAAM+oE,QAAQ7hE,WAAW64Q,2BAE7D,MAAO,CACHvyP,gBACA4gL,iBACA76D,cAAc7kF,EAAAA,EAAAA,IAAgB1uD,GAC9B89Q,WACA1B,eACA55D,8BACH,CAET,GAM4ClxJ,GAA5C,CAAgE6qN,I,0ZCvChE,MAAM6D,IAA2B3lJ,EAAAA,EAAAA,GAAqB8hJ,IAoCvC,MAAMz6B,WAAqBh6O,IAAAA,cAC/BsC,WAAAA,CAAY5C,GAAc,IAAAoJ,EAC7BvG,MAAM7C,GAAMoJ,EAAApG,KA4GhBF,GAAA,eACiBjM,iBAA8C,IAAAgiR,EAAA,IAAvCC,EAAWvyQ,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAWiC,IAAA8yH,EAVhEjwH,EAAKY,SAAS,CAAC4uI,WAAYkgI,UACrB1vQ,EAAKpJ,MAAMqD,QAAQ28B,eAAiC,QAAnB64O,EAAAzvQ,EAAKpJ,MAAMwG,gBAAQ,IAAAqyQ,OAAA,EAAnBA,EAAqBxhR,KAAM+R,EAAKpJ,MAAM+4Q,YAAaD,GAGtF1vQ,EAAKpJ,MAAMwd,2BACc,MAAzBpU,EAAKpJ,MAAMg5Q,kBAEL5vQ,EAAK22B,cAGX32B,EAAKpJ,MAAMkE,SAAWkF,EAAKpJ,MAAMi5Q,2BACjCl4P,EAAAA,EAAgBm4P,mBAAmB9vQ,EAAKpJ,MAAMoiE,aAAgC,QAApBi3D,EAAEjwH,EAAKpJ,MAAMkE,eAAO,IAAAm1H,OAAA,EAAlBA,EAAoBhiI,IAEpF+R,EAAKY,SAAS,CAAC4uI,WAAW,GAC9B,IAAC91I,GAAA,wBAE0B6Q,IAClBA,GAIL3Q,KAAKhD,MAAMqD,QAAQ4lM,eAAet1L,EAAK,IAjIvC3Q,KAAKpK,MAAQ,CACTggJ,WAAW,EAEnB,CAEOr9F,iBAAAA,GAOyB,IAAA+9E,EAAA6/I,EANxBn2Q,KAAKhD,MAAMwd,2BAAuD,OAA1Bxa,KAAKhD,MAAMg5Q,YACnDh2Q,KAAKo2Q,iBAGTp2Q,KAAKq2Q,SAEDr2Q,KAAKhD,MAAMgd,aACXha,KAAKhD,MAAMqD,QAAQ2zC,sBAAuC,QAAlBsiF,EAAAt2H,KAAKhD,MAAMkE,eAAO,IAAAo1H,OAAA,EAAlBA,EAAoBjiI,KAAM,IAAuB,QAAnB8hR,EAAAn2Q,KAAKhD,MAAMwG,gBAAQ,IAAA2yQ,OAAA,EAAnBA,EAAqB9hR,KAAM2L,KAAKhD,MAAM+4Q,WAEpH,CAEOz4M,oBAAAA,GACCt9D,KAAKhD,MAAMi5Q,2BACXl4P,EAAAA,EAAgBm4P,mBAAmBl2Q,KAAKhD,MAAMoiE,aAAc,GAEpE,CAEO3mB,kBAAAA,CAAmBC,GAAkB,IAAA49N,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACxC,MAAMb,EAAc91Q,KAAKhD,MAAM45Q,yBAA2Bl+N,EAAUk+N,uBAEpE,IAAK52Q,KAAKhD,MAAMwG,SACZ,OAGJ,MAAMqzQ,EAAkB72Q,KAAKhD,MAAMwG,SAASnP,MAAyB,QAAvBiiR,EAAK59N,EAAUl1C,gBAAQ,IAAA8yQ,OAAA,EAAlBA,EAAoBjiR,IAepE,IAAAyiR,GAbChB,GAAee,IACf72Q,KAAKq2Q,OAAOP,GAIZ91Q,KAAKhD,MAAMwd,4BACU,QAArB+7P,EAAAv2Q,KAAKhD,MAAMg5Q,kBAAU,IAAAO,OAAA,EAArBA,EAAuBliR,OAA2B,QAAzBmiR,EAAK99N,EAAUs9N,kBAAU,IAAAQ,OAAA,EAApBA,EAAsBniR,KAEpD2L,KAAKo2Q,kBAGLp2Q,KAAKhD,MAAMgd,cACO,QAAlBy8P,EAAAz2Q,KAAKhD,MAAMkE,eAAO,IAAAu1Q,OAAA,EAAlBA,EAAoBpiR,OAAwB,QAAtBqiR,EAAKh+N,EAAUx3C,eAAO,IAAAw1Q,OAAA,EAAjBA,EAAmBriR,KAAM2L,KAAKhD,MAAMwG,SAASnP,MAAyB,QAAvBsiR,EAAKj+N,EAAUl1C,gBAAQ,IAAAmzQ,OAAA,EAAlBA,EAAoBtiR,KAEnG2L,KAAKhD,MAAMqD,QAAQ2zC,sBAAuC,QAAlB8iO,EAAA92Q,KAAKhD,MAAMkE,eAAO,IAAA41Q,OAAA,EAAlBA,EAAoBziR,KAAM,GAAI2L,KAAKhD,MAAMwG,SAASnP,GAElG,CAEO0iR,gBAAAA,GACH,MAAM12E,EAAargM,KAAKyxH,gBACxB,OAAO5nH,QAAQ7J,KAAKhD,MAAMwG,WAAaxD,KAAKhD,MAAMy4Q,QAAQ/uQ,OAAU25L,EAAa,CACrF,CAEO5uE,aAAAA,GAAwB,IAAAulJ,EAAAC,EAC3B,OAA2B,QAApBD,EAACh3Q,KAAKhD,MAAMwG,gBAAQ,IAAAwzQ,OAAA,EAApBA,EAA+BlpO,eAAoC,QAAzBmpO,EAAIj3Q,KAAKhD,MAAMg5Q,kBAAU,IAAAiB,OAAA,EAArBA,EAAuBnpO,cAAe,CAC/F,CAEA/Q,WAAAA,GAAc,IAAAm6O,EACV,MACI72Q,SAAS,UACLw8B,GACH,cACDzZ,EAAa,cACbC,EAAa,SACb7f,GACAxD,KAAKhD,MAET,OAAIwG,GAAYxD,KAAKyxH,iBAAuC,QAAxBylJ,EAAKl3Q,KAAKhD,MAAMwG,gBAAQ,IAAA0zQ,GAApBA,EAA+B3nO,aAC5D1S,EACHzZ,EACAC,EACA7f,EAASnP,IACT,GAIDg0B,QAAQC,QAAQ,CAACr0B,MAAM,GAClC,CAEAmiR,cAAAA,GAYU,IAAAe,EAXFn3Q,KAAKhD,MAAMg5Q,aAEXh2Q,KAAKhD,MAAMqD,QAAQmuC,uBACfxuC,KAAKhD,MAAMg5Q,WAAW3hR,GACtB2L,KAAKhD,MAAMg5Q,WAAW36P,iBAItBrb,KAAKhD,MAAMg5Q,WAAW36P,eAAiBrb,KAAKhD,MAAMg5Q,WAAW16O,eAC7Dt7B,KAAKhD,MAAMg5Q,WAAWrnO,iBACtB3uC,KAAKhD,MAAMg5Q,WAAWjnO,iBAEtB/uC,KAAKhD,MAAMqD,QAAQqvC,iBACf1vC,KAAKhD,MAAMomB,cACXpjB,KAAKhD,MAAMqmB,eACQ,QAAnB8zP,EAAAn3Q,KAAKhD,MAAMwG,gBAAQ,IAAA2zQ,OAAA,EAAnBA,EAAqB9iR,KAAM2L,KAAKhD,MAAM+4Q,WACtC76P,KAAKC,OAIrB,CA8BOlY,MAAAA,GACH,OAA0B,MAAtBjD,KAAKhD,MAAMy4Q,SAA0C,MAAvBz1Q,KAAKhD,MAAMwG,UAAqBxD,KAAKhD,MAAMkE,QAMzElB,KAAKpK,MAAMggJ,WAAa51I,KAAKhD,MAAMy4Q,QAAQ/uQ,OAAS,EAEhDpJ,IAAAA,cAACmjJ,EAAAA,EAAa,CACV/1I,MAAO,CACHu8F,QAAS,OACTmwK,aAAc,SACdllK,KAAM,OAOlB50G,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,eAAgBz0C,KAAKhD,MAAMO,YAClDD,IAAAA,cAAA,OAAKC,UAAU,iCACXD,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACi2E,EAAAA,QAAiB,CACdF,YAAY,QACZh/E,GAAI0+I,EAAAA,KAEP/yI,KAAKhD,MAAMwG,UACRlG,IAAAA,cAACs4Q,GAAwB,CACrBR,iBAAkBp1Q,KAAKhD,MAAMo4Q,iBAC7Bp6Q,IAAKgF,KAAKhD,MAAMwG,SAASnP,GACzBqb,UAAW1P,KAAKhD,MAAMkE,QAAQ7M,GAC9Bg9Q,YAAarxQ,KAAKsqM,gBAClBmrE,QAASz1Q,KAAKhD,MAAMy4Q,QACpBjyQ,SAAUxD,KAAKhD,MAAMwG,SACrBqwQ,qBAAsB7zQ,KAAKhD,MAAM62Q,uBAAwB,EACzDvwE,kBAAmBtjM,KAAKhD,MAAMsmM,kBAC9BixE,sBAAuBv0Q,KAAKhD,MAAMu3Q,sBAClCn1M,aAAcv1D,QAAQ7J,KAAKhD,MAAMwd,2BAA6Bxa,KAAKhD,MAAMoiE,oBApC7F9hE,IAAAA,cAAA,YA4CZ,EC1JJ,UAAe8H,EAAAA,EAAAA,UAvDf,WACI,MAAMiyQ,GAAsBC,EAAAA,EAAAA,MACtB90P,GAAa+8C,EAAAA,EAAAA,MAEnB,OAAO,SAAyB3pE,EAAoB2hC,GAChD,MAAMnU,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GACjCytB,GAAgBtL,EAAAA,EAAAA,IAAiBniB,GACjC4N,GAAWilB,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAASw+O,YACnCtuP,GAAeC,EAAAA,EAAAA,GAAgB9xB,GAC/B0tM,GAAoBC,EAAAA,EAAAA,IAAqB3tM,GACzC2+Q,GAAwBjzM,EAAAA,EAAAA,IAA0B1rE,GAElDqgR,EAAsE,UADtCl5P,EAAAA,EAAAA,IAAUnnB,GACP2hR,+BAEzC,IAEIr2Q,EAFAu0Q,EAAoB,GACpBO,EAAgC,KASpC,OANIxyQ,IACAiyQ,EAAU4B,EAAoBzhR,EAAO4N,EAASnP,IAC9C2hR,GAAan5O,EAAAA,EAAAA,IAAUjnC,EAAO4N,EAASnP,IACvC6M,EAAUshB,EAAW5sB,EAAO4N,EAASsN,aAGlC,CACH0J,2BAA2BA,EAAAA,EAAAA,IAA0B5kB,GACrDokB,aAAaA,EAAAA,EAAAA,IAAYpkB,GACzBwtB,gBACAC,gBACA2yP,aACAxyQ,WACAiyQ,UACAmB,uBAAwBnvP,EAAa2uB,UACrCl1C,UACAoiM,oBACAixE,wBACA0B,4BAER,CACJ,IAEA,SAA4BtiR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB0uC,qBAAoB,IACpBwjO,oBAAmB,KACnBx6O,cAAa,KACbH,UAAWE,EAAAA,GACXkpK,eAAc,KACdz3J,uBAAsB,KACtBkB,iBAAgBA,EAAAA,IACjB/7C,GAEX,GAEA,CAAgE2jP,G,6MCnFzD,MAAMmgC,EAAmC,CAC5CC,OAAQ,CAAC,OAAQ,GACjBzwK,QAAS,CAAC,QAGD0wK,EAAoC,CAC7CC,OAAQ,CAAC,MAAO,GAChB3wK,QACI3pG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,WAKd8wQ,EAAwC,CACjDD,OAAQ,CAAC,OAAQ,GACjB3wK,QACI3pG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,2BACH0S,eAAe,eAKd+wQ,EAAuC,CAChDF,OAAQ,CAAC,MAAO,GAChB3wK,QACI3pG,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,cAKdgxQ,EAAmD,CAC5D58P,IAAK,CAACu8P,OAAQ,CAAC,UAAW,IAAKzwK,QAAS,CAAC,SAAU,IACnDt3C,OAAQ,CAAC+nN,OAAQ,CAAC,UAAW,IAAKzwK,QAAS,CAAC,WAC5CnnD,OAAQ,CAAC43N,OAAQ,CAAC,UAAW,IAAKzwK,QAAS,CAAC,WAC5CpnD,KAAM,CAAC63N,OAAQ,CAAC,QAAS,OAAQzwK,QAAS,CAAC,SAC3C,kBAAmBwwK,EACnBO,MAAOL,EACPM,UAAWJ,EACXtqN,IAAK,CAACmqN,OAAQ,CAAC,OAAQ,GAAIzwK,QAAS,CAAC,QACrCixK,KAAM,CAACR,OAAQ,CAAC,QAAS,GAAIzwK,QAAS,CAAC,SACvC35C,MAAO,CAACoqN,OAAQ,CAAC,SAAU,IAAKzwK,QAAS,CAAC,UAC1CkxK,QAAS,CAACT,OAAQ,CAAC,WAAY,GAAIzwK,QAAS,CAAC,YAC7CgoB,KAAM,CAACyoJ,OAAQ,CAAC,QAAS,KAAOzwK,QAAS,CAAC,U,iIChDvC,SAAS3+E,EACZq0I,EACAy7G,EACAC,GAEA,MAAuB,mBAAT17G,EAAuBA,EAA+Cy7G,EAAKC,GAAQ17G,CACrG,C,qDCDM27G,EAA0B7iR,IAInB,IAJoB,MAC7BqL,EAAK,SACL6wD,GAEIl8D,EADDuH,E,qWAAKmgD,CAAA1nD,EAAA2nD,GAER,OACI9/C,IAAAA,cAAA,OAAAI,OAAAC,OAAA,GACQX,EAAK,CACT6jD,SAAUiC,EAAAA,SAASyrE,WAAWztH,GAAOy3Q,UAAUC,MAAM,CAACC,eAAe,MAEpE9mN,EACE,EAIf,GAAe9E,EAAAA,EAAAA,MAAKyrN,G,ogCCIb,MAAMI,EAAoB7uQ,QAAU,IAAI8uQ,KAAKC,eAAe,QAAS,CAAC/4N,KAAM,YAAag5N,kBAAsCC,WAMtI,SAASC,EAAaD,EAAyCjiF,GAC3D,OAAOA,QAAAA,IAA0B,QAAdiiF,GAAqC,QAAdA,EAC9C,CAuBA,MAAME,EAA0B,IAAIjuF,IAAuD,CACvF,CAAC,OAAQ,KACT,CAAC,SAAU,IACX,CAAC,SAAU,KAsBf,SAASkuF,EAAyBC,GAC9B,GAAoB,iBAATA,GAAqC,iBAATA,EACnC,OAAOnB,EAAemB,GAE1B,GArBJ,SAA0BA,GACtB,OAAOv1Q,IAAQu1Q,IAA4B,iBAAZA,EAAK,EACxC,CAmBQC,CAAiBD,GAAO,CACxB,MAAO9sK,EAAGvE,GAAKqxK,EACf,MAAO,CAACxB,OAAQ,CAACtrK,EAAGvE,GAAIZ,QAAS,CAACmF,GACtC,CACA,OAAO8sK,CACX,CA6DA,MAAM15N,UAAkB0V,EAAAA,cACpBt1D,WAAAA,CAAY5C,GACR6C,MAAM7C,GAAO8C,EAAA,kBAyBkC,MAAIA,EAAA,gBAC7C,GAzBNE,KAAKpK,MAAQ,CACTulB,IAAK,IAAID,KACTk+P,UAAWp8Q,EAAM8D,MAEzB,CAuBAy3C,iBAAAA,GACIv4C,KAAKi6G,SAAU,CACnB,CAEAo/J,WAAAA,CAAYv4Q,EAAWrL,GAA8F,IAA3F6jR,SAAUC,EAAW9uL,KAAM+uL,EAAY9zP,KAAM+zP,GAA4BhkR,EAC/F,IACI,IAAI6jR,EACA7uL,EACA/kE,EAEJ,GA1I6C,OAA7CglE,OADcA,EA2IO6uL,QA1If,EAAN7uL,EAAkChuF,SA2I9B48Q,EAAWC,EAAU78Q,aAClB,GAtJnB,SAAoBguF,GAChB,OAAO7gF,QAAS6gF,aAAM,EAANA,EAA4BwuL,KAChD,CAoJuBQ,CAAWH,KAClBD,EAAWt5Q,KAAK25Q,eAAe74Q,EAAOy4Q,GAEf,QAAnBA,EAAUL,OAAmBO,GAC7B,MAAO,CAACH,YAQhB,GAJgB,MAAZA,GAAoBE,IACpB/uL,EAAOzqF,KAAK45Q,eAAe94Q,EAAO04Q,IAGlCC,EAAY,CACZ,MAAM,UACFX,EAAS,OACTjiF,GAAS6hF,OAAoBpgR,EAAYygR,EAAaD,KACtD94Q,KAAKhD,MAET0oB,EAAO1lB,KAAK45Q,eAAe94Q,EAAK1M,EAAA,CAAG0kR,YAAWjiF,UAAW4iF,GAC7D,CAEA,MAAO,CAACH,WAAU7uL,OAAM/kE,OAC5B,CAAE,MAAAzV,GAEE,MAAM,SAACm+C,EAAQ,UAAE0qN,EAAS,OAAEjiF,GAAU72L,KAAKhD,MAErC68Q,EAAc9hM,IAAAA,IAAWj3E,EAAM+2F,WAMrC,OAJIzpC,GACAyrN,EAAY7hM,GAAG5pB,GAGZ,CACHq8B,KAAM+uL,GAAch6N,EAAUs6N,WAAWD,EAAWzlR,EAAA,GAAMolR,IAC1D9zP,KAAM+zP,GAAcj6N,EAAUu6N,WAAWF,EAAWzlR,EAAA,CAAG0kR,YAAWjiF,UAAW4iF,IAErF,CAjLR,IAA0B/uL,CAkLtB,CAEAivL,cAAAA,CAAe74Q,EAAW5F,GAA6E,IAC/FuuF,GADoB,KAACyvL,EAAI,WAAEc,EAAU,kBAAEC,GAA8C/+Q,EAAxBwvF,E,qWAAMvtC,CAAAjiD,EAAAkiD,GAGpD,IAAf48N,EACAvwL,EAAO,GAEPA,GAAOywL,EAAAA,EAAAA,IAAQp5Q,EAAOd,KAAKpK,MAAMulB,IAAKnb,KAAKhD,MAAMoxD,SAAU8qN,EAAMe,GAC/C,MAAdD,IACAvwL,EAAOroF,KAAK+4Q,MAAM1wL,EAAOuwL,GAAcA,IAIlC,IAATvwL,IACAA,EAAO3oF,GAASd,KAAKpK,MAAMulB,KAAO,EAAI,GAG1C,MAAM+wH,EAAMlsI,KAAKhD,MAAM6J,KAAKuzQ,mBAAmB3wL,EAAMyvL,EAAMxuL,GAC3D,OAAOA,EAAO2vL,WAAaC,IAAKpuI,GAAOA,CAC3C,CAEA0tI,cAAAA,CAAe94Q,EAAa4pF,GACxB,MAAM,SAACt8B,EAAUvnD,MAAM,OAACga,IAAW7gB,KAAKhD,MAExC,OAAQ,IAAI27Q,KAAKC,eAAe/3P,EAAMzsB,EAAA,CAAGg6D,YAAas8B,IAAiBA,OAAO5pF,EAClF,CAEA,iBAAOi5Q,CAAWj5Q,EAAa8yD,GAA0E,IAAxE,KAAC/T,EAAI,OAAEC,EAAM,UAAEg5N,EAAS,OAAEjiF,GAAwBjjI,EAC/E,GAAI/T,GAAQC,EACR,OAAOh/C,EAAM4pF,OAAOquL,EAAaD,EAAWjiF,GAAU,SAAW,QAGzE,CAEA,iBAAOijF,CAAWh5Q,EAAagyG,GAAoE,IAAlE,QAAC3lD,EAAO,IAAEI,EAAG,MAAED,EAAK,KAAE2hE,GAAsBnc,EACzE,OAAI3lD,GAAWI,GAAOD,GAAS2hE,EACpBnuH,EAAM4pF,OAAO,uBACbn9B,GAAOD,GAAS2hE,EAChBnuH,EAAM4pF,OAAO,iBACbn9B,GAAOD,EACPxsD,EAAM4pF,OAAO,WACbv9B,EACArsD,EAAM4pF,OAAO,aADjB,CAIX,CAEA6vL,SAAAA,CAAUz5Q,GAAyF,IAAA05Q,EAAA,IAA5E5oJ,EAAqBruH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAIvD,KAAKhD,MAAM40H,OAAS5xH,KAAKhD,MAAM+jD,OAC3E,OAQE,QARFy5N,EAAO5oJ,aAAK,EAALA,EAAOjxH,IAAIs4Q,GAA0BxwQ,MAAKs3H,IAAsB,IAArB,OAAC63I,EAAM,OAAEF,GAAO33I,EAC9D,OAAc,MAAV63I,GACO/pK,EAAAA,EAAAA,IAAQ/sG,EAAOd,KAAKpK,MAAMulB,IAAKnb,KAAKhD,MAAMoxD,YAAawpN,GAEpD,MAAVF,IACO+C,EAAAA,EAAAA,IAAS35Q,EAAOd,KAAKpK,MAAMulB,IAAKnb,KAAKhD,MAAMoxD,YAAaspN,EAEvD,WACd,IAAA8C,EAAAA,EAAI,CACFvzK,QAAS,CAACjnG,KAAKhD,MAAMk8Q,MACrBwB,wBAAyB16Q,KAAKhD,MAAM09Q,wBAE5C,CAEQC,UAAAA,CAAW75Q,GACf,MAAM,QACFu1D,EAAO,MACP3rD,EAAK,YACL+0C,EAAcA,KACV,MAAM,QACFwnD,EAAO,wBACPyzK,EAA0B16Q,KAAKhD,MAAM09Q,wBAAuB,WAC5DL,EAAar6Q,KAAKhD,MAAMq9Q,YACxBr6Q,KAAKu6Q,UAAUz5Q,GAEnB,GAAImmG,EAAS,CACT,IAAI2zK,EAAAA,EAAAA,oBAAmB3zK,KAAavjG,MAAMC,QAAQsjG,GAC9C,MAAO,CACHvqG,QAASuqG,EACTyzK,2BAIR,MACIxB,EACAc,EAAah6Q,KAAKhD,MAAMg9Q,WACxBC,EAAoBj6Q,KAAKhD,MAAMi9Q,mBAC/BhzK,EAEJ,GAAIiyK,EACA,MAAO,CACHA,OACAc,aACAC,oBACA5jN,UACA3rD,QACAgwQ,wBAAyBA,QAAAA,EAA2B1B,EAAwBn4M,IAAIq4M,GAChFmB,aAGZ,CAEA,OAAO,CAAK,EACf,KACDprJ,EAAI,MACJ3hE,EAAK,IACLC,EAAG,QACHJ,EAAO,KACPtN,EAAI,OACJC,EAAM,SACNsO,EAAQ,QACR1O,EAAUA,KACF+6N,EAAAA,EAAAA,IAAS35Q,EAAOd,KAAKpK,MAAMulB,IAAKizC,EAAU,OAAQ,GAC3C,CAACjB,YAER0tN,EAAAA,EAAAA,IAAW/5Q,GACJ,CAACysD,MAAKD,SAGV,CAAC2hE,OAAM3hE,QAAOC,OACxB,QACD3N,EAAU,CAACC,OAAMC,WACjB9/C,KAAKhD,MAEHs8Q,EAAWhxP,EAAQm3B,EAAa,CAAC3+C,SAAQd,KAAKhD,OAIpD,MAAO,CAACs8Q,WAAU7uL,MAHJ6uL,GAAYhxP,EAAQo3B,EAAS,CAAC5+C,SAAQd,KAAKhD,OAGjC0oB,KAFX4C,EAAQs3B,EAAS,CAAC9+C,SAAQd,KAAKhD,OAGhD,CAEAsgE,oBAAAA,GACIt9D,KAAKi6G,SAAU,EACXj6G,KAAK86Q,aACLjoO,aAAa7yC,KAAK86Q,YAClB96Q,KAAK86Q,WAAa,KAE1B,CAEA,+BAAOv5Q,CAAyBvE,EAAcpH,GAC1C,OAAIoH,EAAM8D,QAAUlL,EAAMwjR,UACd,CAACj+P,IAAK,IAAID,KAAQk+P,UAAWp8Q,EAAM8D,OAGxC,IACX,CAEQi6Q,WAAAA,CAAYzB,GAChB,OAAKA,GACAA,EAASoB,wBAGPnyP,YAAW,KACVvoB,KAAKi6G,SACLj6G,KAAKgH,SAAS,CAACmU,IAAK,IAAID,MAC5B,GACkC,IAAnCo+P,EAASoB,yBAND,IAOf,CAEA,aAAOhwL,CAAMswL,GAAoD,IAAnD,SAAC1B,EAAQ,KAAE7uL,EAAI,KAAE/kE,GAAqBs1P,EAChD,OAAQ1B,GAAY7uL,IAAS/kE,EACzBpoB,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,6BACfjB,OAAQ,CACJ21M,eAAgB69D,GAAY7uL,EAC5B/kE,UAGR4zP,GAAY7uL,GAAQ/kE,CAC5B,CAEA,kBAAOu1P,CAAYn6Q,EAAastD,GAC5B,MAAMyrN,EAAc9hM,IAAOj3E,GAM3B,OAJIstD,GACAyrN,EAAY7hM,GAAG5pB,GAGZyrN,EAAYv4Q,YAAc8sD,EAAW,KAAHnwD,OAAQ47Q,EAAY7hM,KAAI,KAAM,GAC3E,CAEA/0E,MAAAA,GACI,MACInC,MAAOo6Q,EAAWl7Q,KAAKpK,MAAMulB,IAAG,SAChCw2C,EAAQ,kBACR1Q,GAAoB,EAAI,SACxBmN,EAAQ,MACRlvD,EAAK,UACL3B,GACAyC,KAAKhD,MAEH8D,EAAQo6Q,aAAoBhgQ,KAAOggQ,EAAW,IAAIhgQ,KAAKggQ,GACvDC,EAAUn7Q,KAAK26Q,WAAW75Q,GAC1B6yC,EAAQ3zC,KAAKq5Q,YAAYv4Q,EAAOq6Q,GACtC,IAAI1uF,EAAYjtI,EAAUkrC,OAAO/2C,GAgBjC,OAdIsN,IACAwrI,EACInvL,IAAAA,cAACg7Q,EAAY,CACTx3Q,MAAOA,EACP,aAAY5B,EACZ3B,UAAWA,GAEVkvL,IAKbzsL,KAAK86Q,WAAa96Q,KAAK+6Q,YAAYI,EAAQ7B,UAEvC3nN,EACOrpC,EAAQqpC,EAAQv9D,EAAA,CAAG0M,QAAOstD,WAAUq+H,aAAc94I,GAAQwnO,GAG9D1uF,CACX,EACH3sL,EAvSK0/C,EAAS,eAS2B,CAGlC6W,QAAS,OACT3rD,MAAO,OACPsvQ,WAAY,EAGZ/qJ,KAAM,UACN3hE,MAAO,OACPC,IAAK,UACLJ,QAAS,OACTtN,KAAM,UACNC,OAAQ,UACR6P,OAAQ,UACRmpN,UAAW,MACXsC,aAAc,UAgRtB,SAAetuQ,EAAAA,EAAAA,YAAW0yC,GC5Z1B,GAAep6C,EAAAA,EAAAA,UAhBR,SAAyBxP,EAAoB2hC,GAAiB,IAAA8jP,EACjE,MAAMjtN,GAAuC+kK,EAAAA,EAAAA,IAA4C,QAAtBkoD,EAAC9jP,EAASooB,oBAAY,IAAA07N,EAAAA,GAAIC,EAAAA,EAAAA,IAAuB1lR,UAAW0C,EAC/H,IAAIwgR,EACAjiF,EAEJ,MAAM0kF,GAAkBt+P,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAY4jD,0BAA2B5jD,EAAAA,GAAYggL,mBAAmB,GAItG,IAAAs+E,EAIP,OANI9C,EACAI,EAAYvhP,EAASuhP,YAAcyC,EAAkB,MAAQ,OAE7D1kF,EAAwB,QAAlB2kF,EAAGjkP,EAASs/J,cAAM,IAAA2kF,EAAAA,GAAMD,EAG3B,CAACntN,SAAU72B,EAAS62B,UAAYA,EAAU0qN,YAAWjiF,SAChE,GAEA,CAAwCr3I,E,qGCpCzB,SAASi8N,EAAgBz+Q,GACpC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OACQN,EAGJM,IAAAA,cAAA,OACIoN,MAAO,CAACszC,UAAW,cACnBL,MAAM,6BACNhyC,MAAM,KACNC,OAAO,KACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,mBAEzEzJ,IAAAA,cAAA,QAAM4gD,EAAE,yFAIxB,C,qCCGe,SAAS8xN,EAAKv6Q,GAUnB,IAVoB,QAC1BmX,EAAO,eACPkjQ,EAAc,UACdlrL,EAAS,SACTjzB,EAAQ,KACRxoD,EAAI,YACJ8mQ,EAAW,MACXtkQ,EAAK,aACLozO,EAAe,GAAE,cACjB28B,EAAgB,QACZjmR,EAOJ,MAAMkmR,EAAalnO,IAAW,QAAS,CACnCmnO,eAAgBzyQ,EAChB,CAAC41O,GAAeA,EAAar4O,OAAS,IAGpCm1Q,EAAmBpnO,IAAW,iBAAkB,CAClDqnO,eAAgB7L,IAGpB,OACI3yQ,IAAAA,cAAA,OAAKC,UAAWo+Q,GACZr+Q,IAAAA,cAAA,OACIC,UAAWs+Q,EACXjvQ,QAASqjQ,EAAcrjQ,OAAUtU,GAEhC23Q,GACG3yQ,IAAAA,cAAA,OAAKC,UAAU,eACQ,SAAlBm+Q,EAA4Bp+Q,IAAAA,cAACy+Q,EAAAA,EAAe,MAAOz+Q,IAAAA,cAACm+Q,EAAe,MACnE9vQ,EAAQoX,EAAAA,GAAU4uE,qBAAuBm+K,GAGjDn+M,GAELr0D,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,uBACH0S,eAAe,UAEnBzJ,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qBACH0S,eAAe,UAK/BpC,UAAWsrQ,IAAgB9mQ,GAE3B7L,IAAAA,cAAA,OACIC,UAAU,iBACVqP,QAhDhB,WAC6B,mBAAdg4E,GACPA,GAER,EA6CgB,cAAam6J,EAAe,gBAAH9gP,OAAmB8gP,GAAiB,gBAE7DzhP,IAAAA,cAAC8nF,EAAAA,EAAS,CACN7nF,UAAU,YACVlJ,GAAG,mBAM3B,C,mGCjFA,MAAMumF,EAA2B59E,IAC7B,MAAM,SACF69E,EAAQ,QACRF,EAAO,SACPh2E,EAAQ,OACRq3Q,EAAM,QACNC,EAAO,GACP5nR,EAAE,eACF6nR,EAAc,KACd99Q,EAAO,SAAQ,gBACf08E,EAAkB,cAClB99E,EACJ,IAAIm/Q,EAAa,GAAHl+Q,OAAM5J,EAAE,WAClB6nR,IACAC,EAAa9nR,GAAM,IAGvB,MAAMkJ,EAAYk3C,IACd,MACAr2C,EACA08E,EACA,CACIjoE,OAAQ8nE,EACRh2E,aAIR,OACIrH,IAAAA,cAAA,UACI,cAAa6+Q,EACb9nR,GAAIA,EACJmE,KAAK,SACLoU,QAASiuE,EACTt9E,UAAWA,EACX,eAAco9E,EAAU,OAAS,QACjCh2E,SAAUA,GAEVrH,IAAAA,cAAA,OAAKC,UAAU,WAM3B,SAAco9E,EAAmBqhM,EAA0BC,GACvD,OAAKthM,IAAYqhM,IAAarhM,IAAYshM,EAC/B,KAEH3+Q,IAAAA,cAAA,OAAKC,UAAS,WAAAU,OAAa08E,EAAU,KAAO,QAAUA,EAAUqhM,EAASC,EACrF,CAVan0Q,CAAK6yE,EAASqhM,EAAQC,GAClB,EAEfrhM,EAAAj1E,UAAA,CApDEk1E,SAAQz3E,IAAAA,KAAAC,WACRs3E,QAAOv3E,IAAAA,KACPuB,SAAQvB,IAAAA,KACR44Q,OAAM54Q,IAAAA,KACN64Q,QAAO74Q,IAAAA,KACP/O,GAAE+O,IAAAA,OACF84Q,eAAc94Q,IAAAA,KACdhF,KAAIgF,IAAAA,MAAA,CAAG,SAAW,SAAU,WAC5B03E,gBAAe13E,IAAAA,QAqDnB,S,gHC7CA,MAAM6pG,EAAoBx3G,IAYb,IAZc,UACvBiiB,EAAS,SACTi6C,EAAQ,QACRvhD,EAAO,WACPG,EAAU,YACVC,EAAc,CAAC,EAAC,QAChB5D,EAAO,UACPrP,EAAY,GAAE,WACdqd,EAAU,SACVjW,EAAQ,GACRtQ,EAAE,KACF+V,GACI3U,EACJ,MAAMoR,GAAOiQ,EAAAA,EAAAA,WAEPnjB,GAAWsxD,EAAAA,EAAAA,eAgBXm3N,EAAmB1kQ,EAAY7Q,EAAKC,cAAc,CACpDzS,GAAI,8BACJ0S,eAAgB,uBACjB,CACCs1Q,WAAY3kQ,SACXpf,EAECwoQ,EAAQlmP,EAAatd,IAAAA,cAAA,QAAMC,UAAW,iBAAoB,KAQhE,OACID,IAAAA,cAAA,UACIC,UAAW,eAAiBA,EAC5B,aAAY6+Q,EACZxvQ,QATcnQ,IAClBmQ,SAAAA,IAzBUnQ,KACNA,GACAA,EAAEyK,iBAGN,MAAMo1Q,EAAY,CACdlsQ,UACAI,cACAD,cAGJ5c,GAASwc,EAAAA,EAAAA,GAAUmsQ,GAAW,EAe9BnzQ,CAAK1M,EAAE,EAQHpI,GAAIA,EACJsQ,SAAUA,EACVyF,KAAMA,GAELunD,EACAmvM,EACI,EAEf7zJ,EAAAtnG,UAAA,CAxEE+R,UAAStU,IAAAA,OACTuuD,SAAQvuD,IAAAA,KAAAC,WACR+M,QAAOhN,IAAAA,OAAAC,WACPkN,WAAUnN,IAAAA,YAAAC,WACVmN,YAAWpN,IAAAA,SAAAA,IAAAA,KACXwJ,QAAOxJ,IAAAA,KACP7F,UAAS6F,IAAAA,OACTwX,WAAUxX,IAAAA,KACVuB,SAAQvB,IAAAA,KACR/O,GAAE+O,IAAAA,OACFgH,KAAIhH,IAAAA,QAgER,S,qHCjFO,MAAM+mK,EAAW,IACXoyG,EAAU,IAGjBC,EAAmB,oBAEZ9tG,EAAiB,CAC1BC,QAAS,EACT8tG,SAAU,GAIDC,EAAe,gBAIf56M,EAAmB,CAC5BC,yBAA0B,gBAC1B46M,oCAAqC,0BACrCC,kBAAmB,oBACnBC,qBAAsB,uBACtBC,iBAAkB,oBAGT16M,EAAsB,CAC/BosG,6BAA8B,EAC9BuuG,yBAA0B,EAC1BxzG,cAAe,EACfpnG,aAAc,EACdypK,qBAAsB,EACtBzhE,YAGSjoG,EAAmC,CAC5CC,aAAc,EACdypK,qBAAsB,EACtBzhE,YAGS6yG,EAAmB,CAC5BC,gBAAiB,EACjBC,aAAc,EACdC,eAAgB,EAChBhzG,YASSsE,EAAyB,CAClC,CAAC3sG,EAAiBC,0BAA2BD,EAAiBC,yBAA2By6M,EACzF,CAAC16M,EAAiB86M,mBAAoB,gCACtC,CAAC96M,EAAiB+6M,sBAAuB/6M,EAAiB+6M,qBAAuBL,GAGxEY,EAAuB,CAChC,CAACt7M,EAAiBC,0BAA2BK,EAC7C,CAACN,EAAiB66M,qCAAsCz6M,EACxD,CAACJ,EAAiB86M,mBAAoBI,E,oUC3CnC,MAAM7oN,EAA6C,CACtD+Z,MAAO,CAAC,QAAS,IACjBmvM,UAAW,CAAC,YAAa,MAItB,SAASphN,EAAa9mD,EAAsBna,GAK/C,OAAIma,EAAMumP,UAAYvnM,EAASkpN,UAAU,UAKhB,IAAdloQ,EAAMna,KAAqC,iBAAdma,EAAMna,KAAwC,SAAdma,EAAMna,MAClDma,EAAMna,MAAQA,EAAI,IAAMma,EAAMna,MAAQA,EAAI,GAAGypI,gBAOlEtvH,EAAMumP,UAAY1gQ,EAAI,GACjC,CAEO,MAAMsiR,EAAeC,GACjB7/Q,OAAOoI,OAAOy3Q,GAAO1tQ,QAAO,CAAC2tQ,EAASC,IAErCA,EAAmBD,GAAWC,IAAqBtzG,EAAAA,GAC5CszG,EAEJD,GACR/jM,OAAOikM,mBCxCdlpN,EAAAA,EAAAA,gBAAe,CACXmpN,OAAQ,CACJtpR,GAAI,mBACJ0S,eAAgB,0BAEpB62Q,WAAY,CACRvpR,GAAI,oBACJ0S,eAAgB,wBAsBjB,MAAM82Q,EAAkBpoR,IAgBH,IAhBI,MAC5B+V,EAAK,OACLo6D,EAAM,SACNk4M,EAAQ,gBACRjzG,EAAe,UACfM,EAAS,sBACTD,EAAqB,sBACrBD,EAAqB,OACrBjgH,EAAS,EAAE,GAAI,GAAE,UACjBF,EAAY,cAAa,MACzBn/C,EAAQ,IAAG,aACX4iK,EAAY,aACZwvG,GAAe,EAAK,eACpBC,GAAiB,EAAK,WACtB5yG,GAAa,EAAI,oBACjBC,GAAsB,GACH51K,EACnB,MAAM,KACF0T,EAAI,YACJ80Q,EAAW,UACXC,EAAS,WACTC,EAAU,cACV5uL,EAAa,WACb6uL,EAAU,eACVC,EAAc,WACdC,EAAU,WACVC,GCjC0BhwG,KAC9B,MAAOplK,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,GAC3BqnQ,EAAYM,EAAgBjwG,GAG5B56K,GAAWsxD,EAAAA,EAAAA,eACX7hC,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5Ba,GAAmB27B,EAAAA,EAAAA,aAAY17B,EAAAA,IAC/BslQ,GAAc5pO,EAAAA,EAAAA,cAAaz+C,IAAuBisE,EAAAA,EAAAA,IAAOjsE,EAAO24K,EAAcnrJ,EAAe,KAE7Fq7P,GADiBpqO,EAAAA,EAAAA,cAAaz+C,IAAuBisE,EAAAA,EAAAA,IAAOjsE,EAAO24K,EAAcE,EAAAA,GAAuBF,GAAe,OAChFG,EAAAA,GAAeC,QACtD+vG,EAAgBC,EAAmCpwG,GAEnDqwG,GAA8B7nQ,EAAAA,EAAAA,cAChC,SAAC8nQ,EAAmBC,GAAgE,IAAvCC,IAAQx7Q,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,KAAAA,UAAA,GAAS1H,IAAU0H,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,KAAAA,UAAA,GACpE,MAAMkjC,EAAc,CAChB,CACI1qB,QAASqH,EACTsK,SAAU6gJ,EACV9wK,KAAM2lB,EACNtiB,MAAO+9Q,EAAUv9Q,YAErB,CACIya,QAASqH,EACTsK,SAAU6gJ,EACV9wK,KAAMgxK,EAAAA,GAAuBF,GAC7BztK,OAAQi+Q,GAA8B,YAAhBD,GAA6C,YAAhBA,EAA6BpwG,EAAAA,GAAeC,QAAUD,EAAAA,GAAe+tG,UAAUn7Q,aAI1I,GADA3N,GAASg6K,EAAAA,EAAAA,IAAqBvqJ,EAAeqjB,IACzC5qC,EAAY,CACZ,MAAMiyK,EAAc,GAAH7vK,OAAM4gR,EAAS,MAAA5gR,OAAK6gR,GAC/B/wG,GAAeC,EAAAA,EAAAA,IAAqB0uG,EAAAA,GAAcnuG,EAAcT,IACtEG,EAAAA,EAAAA,IAAiBM,EAAcR,EACnC,CACJ,GACA,CAAC3qJ,EAAe1K,EAAkB61J,IAKhCywG,EAAoCviR,IACtCA,EAAEy0D,kBACFz0D,EAAEyK,gBAAgB,GAGtBw7C,EAAAA,EAAAA,YAAU,KACF+7N,GACA7nQ,GAAQ,EACZ,GACD,CAAC6nQ,IAEJ,MAAMx2Q,GAAa8O,EAAAA,EAAAA,cAAY,KAC3BH,GAAQ,EAAM,GACf,IAEGunQ,GAAapnQ,EAAAA,EAAAA,cAAata,IAC5BuiR,EAAiCviR,GACjCma,GAAQ,EAAK,GACd,CAAC6nQ,IAEEQ,GAAwBloQ,EAAAA,EAAAA,cAAamoQ,IACvC,IACI1mR,EADAqmR,EAAYZ,GAEC,IAAbiB,GACAL,GAAa,EACbrmR,EAAO,SACa,IAAb0mR,GACPL,GAAa,EACbrmR,EAAO,SAEPqmR,EAAYK,EACZ1mR,EAAO,QAEXyP,IACA22Q,EAA4BC,EAAWrmR,GACvCkmR,EAAcG,EAAWZ,EAAY,GACtC,CAACA,EAAah2Q,EAAY22Q,EAA6BF,IAEpDnvL,GAAgBx4E,EAAAA,EAAAA,cAAata,IAC/BuiR,EAAiCviR,GACjCwL,IACA22Q,EAA4BX,EAAa,WAAW,EAAM,GAC3D,CAACW,EAA6B32Q,IAE3Bo2Q,GAAiBtnQ,EAAAA,EAAAA,cAAata,IAChCuiR,EAAiCviR,GACjCwiR,GAAsB,EAAM,GAC7B,CAACA,IAEEb,GAAarnQ,EAAAA,EAAAA,cAAata,IACxBA,GACAuiR,EAAiCviR,GAEjC6gR,EAAYY,KAAeD,EAC3BgB,EAAsB90G,EAAAA,IAEtB80G,GAAsB,EAC1B,GACD,CAACA,IAEEV,GAAaxnQ,EAAAA,EAAAA,cAAY,CAACta,EAAqB0iR,KAC7C1iR,GACAuiR,EAAiCviR,GAErCwiR,EAAsBE,EAAS,GAChC,CAACF,IAEEX,GAAavnQ,EAAAA,EAAAA,cAAata,IAC5BuiR,EAAiCviR,GACjCwL,IACA22Q,EAA4BrC,EAAAA,GAAS,WAAW,GAChDmC,EAAcnC,EAAAA,GAAS0B,EAAY,GACpC,CAACW,EAA6B32Q,IAajC,OAXAy6C,EAAAA,EAAAA,YAAU,KACN,MAAM0pB,EAAiB3vE,IACfw/D,EAAax/D,EAAG03D,EAAS+Z,QAAU/kE,GACnCi1Q,GACJ,EAGJ,OADApvQ,OAAO6rD,iBAAiB,UAAWuR,GAC5B,IACHp9D,OAAO+rD,oBAAoB,UAAWqR,EAAc,GACzD,CAACgyM,EAAYj1Q,IAET,CACHA,OACA80Q,cACAC,YACAC,aACA5uL,gBACA6uL,aACAG,aACAF,iBACAC,aACH,EDtGGc,CAAkB7wG,GAEhB8wG,EACF/hR,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,KAAGC,UAAU,2BACbD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mBACH0S,eAAe,cAqC3B,OACIzJ,IAAAA,cAACytK,EAAAA,GAAO,CACJ5hK,KAAMA,EACN+0Q,UAAWA,EACX1yQ,MAAOA,EACPo6D,OAAQA,EACRulG,UAAWA,EACX2yG,SAAUA,EACVjzG,gBAAiBA,EACjBy0G,QAzCQA,MACZ,IAAI16F,EACAtnL,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,kBACJ0S,eAAgB,SAEpBzJ,IAAAA,cAAA,KAAGC,UAAU,6BAGrB,GAAI4tK,EAOA,OANAyZ,EACItnL,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,sBACJ0S,eAAgB,WAGjB69K,EAGX,MAAM26F,EAAWjC,EAAYY,GAS7B,OARID,IAAgBsB,IAChB36F,EACItnL,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAI,oBACJ0S,eAAgB,UAIrB69K,CAAU,EAYJ06F,GACTD,QAASl0G,OAAY7yK,EAAY+mR,EACjCr0G,KAAMizG,EACNnzN,UAAWA,EACXmgH,sBAAuBA,EACvBC,sBAAuBA,EACvBv/J,MAAOA,EACPq/C,OAAQA,EACRmzN,WAAYA,EACZ5uL,cAAeA,EACf6uL,WAAYA,EACZC,eAAgBA,EAChBC,WAAYA,EACZC,WAAYA,EACZR,aAAcA,EACdC,eAAgBA,EAChB5yG,WAAYA,EACZC,oBAAqBA,GACvB,EAERwyG,EAAAl4Q,UAAA,CArHEigE,OAAMxiE,IAAAA,QAAAC,WACNmI,MAAKpI,IAAAA,QAAAC,WACLy6Q,SAAQ16Q,IAAAA,OAER+nK,UAAS/nK,IAAAA,KAGT8nK,sBAAqB9nK,IAAAA,MAAA,CAAI6zB,EAAC7zB,IAAAA,OAAAC,WAAUk7C,EAACn7C,IAAAA,OAAAC,aAErCsI,MAAKvI,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,SACLmrK,aAAYnrK,IAAAA,OAAAC,WACZ06Q,aAAY36Q,IAAAA,KACZ46Q,eAAc56Q,IAAAA,KACdgoK,WAAUhoK,IAAAA,KACVioK,oBAAmBjoK,IAAAA,M,qEEbhB,MAAMo7Q,EAAmBjwG,IAC5B,MAAM1B,GAAcx4H,EAAAA,EAAAA,cAAaz+C,IAAuBqsE,EAAAA,EAAAA,IAAuBrsE,KAE/E,IAAIsoR,EAAoCd,EAAAA,GAAqB7uG,GAM7D,OAJIA,IAAiBzsG,EAAAA,GAAiBC,0BAA4B8qG,IAE9DqxG,EAAYd,EAAAA,GAAqBt7M,EAAAA,GAAiB66M,sCAE/CuB,CAAS,EAGPS,EAAsCpwG,IAC/C,MAAM56K,GAAWsxD,EAAAA,EAAAA,eACX7hC,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAC5B6K,GAAU2xB,EAAAA,EAAAA,cAAaz+C,IAAuBgtB,EAAAA,EAAAA,IAA0BhtB,KAExE4pR,GAAkBzoQ,EAAAA,EAAAA,cAAai0J,IACjC,GAAIuD,IAAiBzsG,EAAAA,GAAiBC,yBAClC,OAAQipG,GACR,KAAK5oG,EAAAA,GAAoBosG,6BACrB76K,GAAS8rR,EAAAA,EAAAA,OACT,MAEJ,KAAKr9M,EAAAA,GAAoB26M,yBAIzB,KAAK36M,EAAAA,GAAoBmnG,cACrB51K,GAAS8tB,EAAAA,EAAAA,IAAsB,IAC/B,MAEJ,KAAK2gD,EAAAA,GAAoBD,aACrBxuE,GAAS0+B,EAAAA,EAAAA,OACT,MAEJ,KAAK+vC,EAAAA,GAAoB+nG,SAAU,CAC/B,IAAI1jI,EAAc,CACd,CACI1qB,QAASqH,EACTsK,SAAU07I,EAAAA,GACV3rK,KAAM4rK,EAAAA,EAAoBC,cAC1BxoK,MAAOqpK,EAAAA,GAAS7oK,aAGxBmlC,EAAc,IAAIA,EACd,CACI1qB,QAASqH,EACTsK,SAAU07I,EAAAA,GACV3rK,KAAMmsK,EAAAA,GAAmBC,0BACzB/oK,MAAO,SAGfnN,GAASo6B,EAAAA,EAAAA,IAAgB3K,EAAeqjB,IACxC,KACJ,OAGG,GAAI8nI,IAAiBzsG,EAAAA,GAAiB86M,kBACzC,OAAQ5xG,GACR,KAAKgyG,EAAAA,GAAiBC,gBAClBtpR,GAAS8rR,EAAAA,EAAAA,OACT,MAEJ,KAAKzC,EAAAA,GAAiBE,aAAe,CACjC,MAAMwC,EAAU,GAAHzhR,OAAMykB,EAAO,aAC1BrT,EAAAA,EAAAA,KAAaC,KAAKowQ,GAClB,KACJ,CACA,KAAK1C,EAAAA,GAAiBG,gBAK1B,GACD,CAAC/5P,EAAeV,EAAS6rJ,IAEtBoxG,GAAkB5oQ,EAAAA,EAAAA,cAAawoQ,IACjC,GAAIhxG,IAAiBzsG,EAAAA,GAAiBC,yBAClC,OAAQw9M,GACR,KAAKn9M,EAAAA,GAAoB26M,yBAIzB,KAAK36M,EAAAA,GAAoBmnG,cACrB51K,GAAS8tB,EAAAA,EAAAA,IAAsB,SAK5B8sJ,IAAiBzsG,EAAAA,GAAiB86M,mBACjC2C,IACHvC,EAAAA,GAAiBC,iBAClBtpR,GAASkrB,EAAAA,EAAAA,MAKjB,GACD,CAACuE,EAAemrJ,IAEnB,OAAOx3J,EAAAA,EAAAA,cAAY,CAACi0J,EAAcu0G,KAC9BI,EAAgBJ,GAChBC,EAAgBx0G,EAAK,GACtB,CAACw0G,EAAiBG,GAAiB,C,gICxHnC,MAAM7zC,EAAiC8zC,IAC1C,MAAMx8P,GAAgBixB,EAAAA,EAAAA,aAAYx8B,EAAAA,IAGlC,OADaw8B,EAAAA,EAAAA,cADQz+C,IAAuBisE,EAAAA,EAAAA,IAAOjsE,EAAOksE,EAAAA,GAAiBC,yBAA0B3+C,EAAe,OAEpGw8P,CAAU,E,oECR9B,MASA,EAT2B5iR,GAEnBM,IAAAA,cAACugR,EAAAA,GAAengR,OAAAC,OAAA,GACRX,EAAK,CACTuxK,aAAczsG,EAAAA,GAAiBC,4BCFrCyoG,EAAY,CAACvzI,EAAG,EAAGsnB,EAAG,IAEfshO,EAA4BA,KACrC,MAAMr0Q,EACFlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,6CACH0S,eAAgB,6BAGlB6+D,EACFtoE,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mDACH0S,eAAgB,uKAKtB8jK,GAAkBC,EAAAA,EAAAA,IAAoB,CAAC,mBAAoB,kBAAmB,GAAI,CAACvsH,GAAI,EAAG3yC,OAAQ,GAAIqrB,EAAG,EAAGtrB,MAAO,IAEzH,OACIrO,IAAAA,cAACwiR,EAAiB,CACdt0Q,MAAOA,EACPo6D,OAAQA,EACR9a,UAAU,cACVmgH,sBAAsB,cACtBC,sBAAuBV,EACvB7+J,MAAO,IACPk/J,gBAAiBA,GACnB,EC7BJL,EAAY,CAACvzI,EAAG,EAAGsnB,GAAI,IAEhBwhO,EAAmBA,KAC5B,MAAMv0Q,EACFlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAgB,8BAGlB6+D,EACFtoE,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0CACH0S,eAAgB,2GAKtB8jK,GAAkBC,EAAAA,EAAAA,IAAoB,CAAC,gBAAiB,GAAI,CAACvsH,GAAI,EAAG3yC,OAAQ,GAAIqrB,EAAG,EAAGtrB,MAAO,IAEnG,OACIrO,IAAAA,cAACwiR,EAAiB,CACdt0Q,MAAOA,EACPo6D,OAAQA,EACR9a,UAAU,cACVmgH,sBAAsB,YACtBC,sBAAuBV,EACvB7+J,MAAO,IACPk/J,gBAAiBA,GACnB,E,+FCjBV,MAAMm1G,EAAevqR,IAAoD,IAAnD,iBAACwqR,GAA6CxqR,EAChE,OACI6H,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4DACH0S,eAAe,0DACfjB,OAAQ,CAACm6Q,qBACX,EAIGC,EAAgChlR,IAA+B,IAAA2+I,EAAAsmI,EAAA,IAA9B,iBAACF,GAAwB/kR,EACnE,MAAMklR,GAAiB/rO,EAAAA,EAAAA,cAAaz+C,IAAuBqsB,EAAAA,EAAAA,IAAgCrsB,KACrFmkJ,GAAiE,QAAzCF,EAAAumI,EAAer9P,EAAAA,GAAUuP,wBAAgB,IAAAunH,OAAA,EAAzCA,EAA2C18I,eAAgB4lB,EAAAA,GAAUi3H,wBAC7FqmI,GAAgE,QAA1CF,EAAAC,EAAer9P,EAAAA,GAAUu9P,yBAAiB,IAAAH,OAAA,EAA1CA,EAA4ChjR,eAAgB4lB,EAAAA,GAAUw9P,yBAE5F/0Q,EACFlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qDACH0S,eAAgB,iCAGlB6+D,EACFtoE,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,SACK2iR,GAAoB3iR,IAAAA,cAAC0iR,EAAY,CAACC,iBAAkBA,IACrD3iR,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wDACH0S,eAAgB,qFAGxBzJ,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0DACH0S,eAAe,qGACfjB,OAAQ,CAAC06Q,WAAYzmI,EAAuB0mI,SAAUJ,EAAqBzwQ,EAAI9O,GAAkBxD,IAAAA,cAAA,SAAIwD,OAG7GxD,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8DACH0S,eAAe,4FACfjB,OAAQ,CAAC8J,EAAI9O,GAAkBxD,IAAAA,cAAA,SAAIwD,QAM7C+pK,GAAkBC,EAAAA,EAAAA,IAAoB,CAAC,gCAAiC,IAE9E,OACIxtK,IAAAA,cAACwiR,EAAiB,CACdt0Q,MAAOA,EACPo6D,OAAQA,EACRk4M,SAAU4C,EACV51N,UAAU,cACVmgH,sBAAsB,QACtBt/J,MAAO,IACPk/J,gBAAiBA,GACnB,EAERq1G,EAAAv6Q,UAAA,CA/DEs6Q,iBAAgB78Q,IAAAA,Q,6CCPdonK,EAAY,CAACvzI,GAAI,GAAIsnB,EAAG,GACxByM,EAA2B,CAAC,GAAI,GAEzB+gL,EAA8BA,KACvC,MAAMvgO,EACFlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+CACH0S,eAAgB,8BAGlB6+D,EACFtoE,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qDACH0S,eAAgB,gLAKtB8jK,GAAkBC,EAAAA,EAAAA,IAAoB,CAAC,+BAAgC,IAE7E,OACIxtK,IAAAA,cAACwiR,EAAiB,CACdt0Q,MAAOA,EACPo6D,OAAQA,EACRk4M,SAAU6C,EACV71N,UAAU,eACVmgH,sBAAsB,YACtBC,sBAAuBV,EACvBx/G,OAAQA,EACRr/C,MAAO,IACPk/J,gBAAiBA,GACnB,E,8CCnBV,MAAM+1G,EAAkBzhO,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,mBAAXq7C,CAAW,8CAK7B0hO,EAAgB1hO,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,iBAAVq7C,CAAU,kCAK1B2hO,EAAkBrrR,IAAuD,IAAtD,UAACia,EAAS,cAAE0T,EAAa,eAAEouD,GAAsB/7E,EACtE,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClBkpD,GAAc3rB,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAAipF,EAAA,OAAiC,QAA5BA,GAAAr8D,EAAAA,EAAAA,GAAW5sB,EAAO8Z,UAAU,IAAAmvE,OAAA,EAA5BA,EAA8BrmF,OAAQuqB,EAAAA,GAAUyB,YAAY,IAC9Gu8P,GAAoB1sO,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAAorR,EAAA,OAAwC,QAAnCA,GAAAvwF,EAAAA,EAAAA,IAAkB76L,EAAO8Z,UAAU,IAAAsxQ,OAAA,EAAnCA,EAAqC3sR,KAAM,EAAE,IACrGyqF,GAA0BzqC,EAAAA,EAAAA,cAAaz+C,IAAkB,IAAAmpF,EAAA,OAAsC,QAAjCA,GAAAvnD,EAAAA,EAAAA,IAAQ5hC,EAAOmrR,UAAkB,IAAAhiM,OAAA,EAAjCA,EAAmClhF,WAAY,EAAE,IAE/GojR,GAAQhqQ,EAAAA,EAAAA,UAAQ,KAClB,MAAMiqQ,EAAa,CACf/rQ,MAAO,oCACPzY,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,GACJ0S,eAAgB,KAEpBkgG,SAASz6F,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,gCACJ0S,eAAgB,sBAEpBiyG,YAAa,IAGjB,OACIh5C,IAAgBj9C,EAAAA,GAAUyB,cAC1Bw7C,IAAgBj9C,EAAAA,GAAU0B,iBAC1Bu7C,IAAgBj9C,EAAAA,GAAUC,WAEnB,CACH,CACI7N,MAAO,qCACPzY,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,6CACJ0S,eAAgB,oBAEpBkgG,SAASz6F,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,qCACJ0S,eAAgB,aAEpBiyG,YAAa,QAEjB,CACI7jG,MAAO,0CACPzY,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,kDACJ0S,eAAgB,uCAEpBkgG,SAASz6F,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,0CACJ0S,eAAgB,wBAEpBiyG,YAAa,gBAEjB,CACI7jG,MAAO,sCACPzY,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,8CACJ0S,eAAgB,0BAEpBkgG,SAASz6F,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,sCACJ0S,eAAgB,kBAEpBiyG,YAAa,SAEjBkoK,GAIJH,IAAsB39P,EACf,CACH,CACIjO,MAAO,uCACPzY,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,uCACJ0S,eAAgB,oBAEpBkgG,SAASz6F,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,uCACJ0S,eAAgB,oBAEpBiyG,YAAa,IAEjB,CACI7jG,MAAO,yCACPzY,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,yCACJ0S,eAAgB,yBAEpBkgG,SAASz6F,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,yCACJ0S,eAAgB,yBAEpBiyG,YAAa,IAEjBkoK,GAID,CACH,CACI/rQ,MAAO,oCACPzY,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,4CACJ0S,eAAgB,2BAEpBkgG,SAASz6F,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,oCACJ0S,eAAgB,QAEpBiyG,YAAa,QAEjB,CACI7jG,MAAO,sCACPzY,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,8CACJ0S,eAAgB,iBAEpBkgG,SAASz6F,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,sCACJ0S,eAAgB,aAEpBiyG,YAAa,KAEjBkoK,EACH,GACF,CAAClhN,EAAa+gN,EAAmB39P,IAEpC,OACI9lB,IAAAA,cAACujR,EAAa,KACTI,EAAMtgR,KAAIzF,IAA4C,IAA3C,MAACia,EAAK,QAAEzY,EAAO,QAAEuqG,EAAO,YAAE+R,GAAY99G,EAC9C,MAAM4K,EAAS,CAACjI,SAAUihF,GACpBqiM,EAAmBzkR,EAAQrI,GAAKyS,EAClCpK,EACAoJ,GACA,GAEEmzG,EAAkC,sCAAfv8G,EAAQrI,GAC7BiJ,IAAAA,cAACsjR,EAAe,KACX,IAAK9hM,GAEV,KAEJ,OACIxhF,IAAAA,cAACy7G,EAAAA,EAAI,CACD/9G,IAAKisG,EAAQ5yG,GACb4yG,QAASA,EACTgS,iBAAkBA,EAClBnzG,OAAQA,EACR8G,QAASA,KACDuI,IACAtZ,EAAAA,EAAAA,IAAW,KAAMsZ,GAErBq8D,EAAe2vM,GAAkB,EAAK,EAE1CvoK,aAAcl8G,EAAQrI,GACtB2kH,YAAaA,GACf,IAGE,EAEtB8nK,EAAAn7Q,UAAA,CA9KE6rE,eAAcpuE,IAAAA,KAAAC,WACdqM,UAAStM,IAAAA,OAAAC,WACT+f,cAAahgB,IAAAA,OAAAC,YA8KjB,SAAewpD,EAAAA,EAAAA,MAAKi0N,GClLdt2G,EAAY,CAACvzI,GAAI,EAAGsnB,GAAI,GAEjBq2B,EAAkBn/E,IAIlB,IAJmB,eAC5B+7E,EAAc,UACd9hE,EAAS,cACT0T,GACI3tB,EACJ,MAAMwrR,EACF3jR,IAAAA,cAACwjR,EAAe,CACZtvM,eAAgBA,EAChB9hE,UAAWA,EACX0T,cAAeA,IAIjB5X,EACFlO,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAgB,kBAIlB6+D,EACFtoE,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,SACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAgB,2LAGxBzJ,IAAAA,cAAA,WACK2jR,IAIPp2G,GAAkBC,EAAAA,EAAAA,IAAoB,CAAC,eAAgB,GAAI,CAACvsH,GAAI,GAAI3yC,OAAQ,GAAIqrB,EAAG,EAAGtrB,MAAO,IAEnG,OACIrO,IAAAA,cAACwiR,EAAiB,CACdt0Q,MAAOA,EACPo6D,OAAQA,EACR9a,UAAU,YACVmgH,sBAAsB,YACtBC,sBAAuBV,EACvB7+J,MAAO,IACPk/J,gBAAiBA,GACnB,EAERj2F,EAAAjvE,UAAA,CArDE6rE,eAAcpuE,IAAAA,KAAAC,WACdqM,UAAStM,IAAAA,OAAAC,WACT+f,cAAahgB,IAAAA,OAAAC,W,kUCLjB,MAAM+9Q,EAA0BpkR,GAC5BM,IAAAA,cAAA,OACIqO,MAAO3O,EAAM2O,MAAQ3O,EAAM2O,MAAMrK,WAAa,MAC9CsK,OAAQ5O,EAAM4O,OAAS5O,EAAM4O,OAAOtK,WAAa,MACjDm8C,QAAQ,cACRC,KAAK,OACLC,MAAM,8BAENrgD,IAAAA,cAAA,KAAGuiH,SAAS,0BACRviH,IAAAA,cAAA,QACI4gD,EAAE,iUACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kIACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,u8CACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,uZACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mpBACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kQACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+kBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,irBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+SACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,8PACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iWACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iWACFR,KAAK,QACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,mBACHqW,MAAO,CAACq1G,SAAU,SAClBphE,UAAU,iBACV1nB,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,OAEPtO,IAAAA,cAAA,QACI4gD,EAAE,+VACFR,KAAK,aAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,0BACJthD,IAAAA,cAAA,QACI25B,EAAE,UACFsnB,EAAE,SACF5yC,MAAM,UACNC,OAAO,UACP8xC,KAAK,oBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,oLACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4IACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kTACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gfACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gMACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mJACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oMACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2IACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2LACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iJACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mJACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mJACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,iJACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+LACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,gJACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mLACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6bACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,6bACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACIjJ,GAAG,mBACHqW,MAAO,CAACq1G,SAAU,SAClBphE,UAAU,iBACV1nB,EAAE,KACFsnB,EAAE,KACF5yC,MAAM,KACNC,OAAO,MAEPtO,IAAAA,cAAA,QACI4gD,EAAE,6bACFR,KAAK,WAGbpgD,IAAAA,cAAA,KAAGshD,KAAK,0BACJthD,IAAAA,cAAA,QACIuhD,QAAQ,MACR5nB,EAAE,UACFsnB,EAAE,UACF5yC,MAAM,UACNC,OAAO,UACP8xC,KAAK,oBAGbpgD,IAAAA,cAAA,QACI4gD,EAAE,mZACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2YACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kQACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,+SACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kNACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mTACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4vJACFR,KAAK,UACLO,YAAY,SAEhB3gD,IAAAA,cAAA,QACI4gD,EAAE,uiCACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mXACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,UAETpgD,IAAAA,cAAA,QACI4gD,EAAE,4oBACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,2WACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,giCACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,kFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,mFACFR,KAAK,YAETpgD,IAAAA,cAAA,QACI4gD,EAAE,oFACFR,KAAK,YAETpgD,IAAAA,cAAA,WACIugD,GAAG,UACHC,GAAG,UACHU,GAAG,UACHE,GAAG,UACHhB,KAAK,QACLO,YAAY,UAGpB3gD,IAAAA,cAAA,YACIA,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,qBACVjiE,UAAU,gCAGlB1gD,IAAAA,cAAA,WACIjJ,GAAG,WACH2rH,oBAAoB,oBACpBr0G,MAAM,IACNC,OAAO,KAEPtO,IAAAA,cAAA,OACI2iH,UAAU,qBACVjiE,UAAU,kCAGlB1gD,IAAAA,cAAA,YAAUjJ,GAAG,oBACTiJ,IAAAA,cAAA,QACIqO,MAAM,UACNC,OAAO,MACP8xC,KAAK,QACLM,UAAU,wBAGlB1gD,IAAAA,cAAA,SACIjJ,GAAG,oBACHsX,MAAM,KACNC,OAAO,MACPq0G,UAAU,21aAEd3iH,IAAAA,cAAA,SACIjJ,GAAG,oBACHsX,MAAM,MACNC,OAAO,MACPq0G,UAAU,i2MAIxBmhK,EAAAz7Q,UAAA,CA7UEgG,MAAKvI,IAAAA,OAAAC,WACLuI,OAAMxI,IAAAA,OAAAC,YA8UV,U,0BC/TA,MAAMg+Q,EAAyB5rR,IAWQ,IAVnC,GACIpB,EAAE,MACFmX,EAAK,YACLhO,EAAW,oBACXg7F,EAAmB,WACnBC,EAAU,kBACVgzE,EAAiB,YACjB/yE,EAAW,QACXC,EAAO,QACP7c,GAC0BrmF,EAC9B,OACI6H,IAAAA,cAAA,OACIjJ,GAAE,0BAAA4J,OAA4B5J,GAC9BkJ,UAAU,0CAEVD,IAAAA,cAAA,OAAKC,UAAU,SACViO,GAELlO,IAAAA,cAAA,OAAKC,UAAU,eACVC,GAEHm7F,GAAWD,GACTp7F,IAAAA,cAACouK,EAAAA,EAA0B,CACvBr3K,GAAIA,EACJ2jG,MAAOW,EACPj8F,QAASg8F,EACT9rF,QAASkvE,IAGjBx+E,IAAAA,cAAA,OAAKC,UAAS,GAAAU,OAAKu6F,EAAmB,iBACjCC,GAEJgzE,GACGnuK,IAAAA,cAAA,OAAKC,UAAU,4BACVkuK,GAGP,EAEZ41G,EAAA17Q,UAAA,CArDEtR,GAAE+O,IAAAA,OAAAC,WACFmI,MAAKpI,IAAAA,OAAAC,WACL7F,YAAW4F,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,UAAAC,WACXm1F,oBAAmBp1F,IAAAA,OAAAC,WACnBo1F,WAAUr1F,IAAAA,KAAAC,WACVooK,kBAAiBroK,IAAAA,OACjBs1F,YAAWt1F,IAAAA,OACXu1F,QAAOv1F,IAAAA,OACPuoF,QAAOvoF,IAAAA,KACP04E,QAAO14E,IAAAA,MA8CX,U,SCzBM+kP,EAAqB1yP,IAIM,IAJL,QACxBqmF,EAAO,SACP5xE,EAAQ,iBACRmgP,GACI50P,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB0T,GAAU6pB,EAAAA,EAAAA,cAAaz+C,IAAuB60B,EAAAA,EAAAA,IAAW70B,KACzDuT,GAAOkrC,EAAAA,EAAAA,cAAaz+C,IAAuB8gG,EAAAA,EAAAA,GAAY9gG,EAAOya,EAAAA,GAAiBsmF,yBAI/E,SAAC12E,IAAYkuJ,EAAAA,EAAAA,eACbE,EAAkE,OAAjD59C,EAAAA,EAAAA,WAAUxwG,EAAU,CAACF,KAAM,mBAE5C4rE,EAA6B,UAAnBnhE,aAAO,EAAPA,EAASwU,OAEnBsiP,EC5CK,WACX,MAAM3tR,GAAWsxD,EAAAA,EAAAA,eACjB,OAAOluC,EAAAA,EAAAA,cAAY,MACflb,EAAAA,EAAAA,IAAW,gBAAiB,kCAC5BlI,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBoiB,WAC1BliB,WAAYmiB,EAAAA,UACb,GACJ,CAAC/+B,GACR,CDmCkC4tR,IAE9B7+N,EAAAA,EAAAA,YAAU,KACD2nM,IACDxuP,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqB6gF,8BACrB,sCAER,GACD,IAGH,MACMhyE,EAAeniB,IAAAA,MAAa0B,OAAOjvD,aAAO,EAAPA,EAASunE,YAAc,IAAI72E,KAAKA,KAAKC,OAAO08E,UADvD,SAC2F,KAAMnN,OAAO,gBAEhIgO,EAAc5xF,EAAc,CAACzS,GAAI,oDAAqD0S,eAAgB,mCAEtGkyF,GAAuChiF,EAAAA,EAAAA,UAAQ,IAAM,CACvD,CACI5iB,GAAI,SACJmX,MAAO1E,EAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,8CAC9EvJ,YAAasJ,EAAc,CAACzS,GAAI,yCAA0C0S,eAAgB,oGAC1FyxF,oBAAqB,iBACrBC,WACIn7F,IAAAA,cAAC47F,EAAAA,EAAc,CACXvtF,MAAO,IACPC,OAAQ,MAGhB+sF,QAASQ,EAAAA,GAASC,WAClBV,eAEJ,CACIrkG,GAAI,OACJmX,MAAO1E,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,kDAC5EvJ,YAAasJ,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,2IACxFyxF,oBAAqB,eACrBC,WACIn7F,IAAAA,cAAC+7F,EAAAA,EAAkB,CACf1tF,MAAO,IACPC,OAAQ,MAGhB+sF,QAASQ,EAAAA,GAASgzE,WAClBzzE,eAEJ,CACIrkG,GAAI,gBACJmX,MAAO1E,EAAc,CAACzS,GAAI,0CAA2C0S,eAAgB,oDACrFvJ,YAAasJ,EAAc,CAACzS,GAAI,gDAAiD0S,eAAgB,4HACjGyxF,oBAAqB,eACrBC,WACIn7F,IAAAA,cAACkgD,EAAAA,EAAc,CACX7xC,MAAO,IACPC,OAAQ,MAGhB+sF,QAASzC,EAAAA,GAAaqD,QACtBb,eAEJ,CACIrkG,GAAI,YACJmX,MAAO1E,EAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,8BACjFvJ,YAAasJ,EAAc,CAACzS,GAAI,4CAA6C0S,eAAgB,wHAC7FyxF,oBAAqB,iBACrBC,WACIn7F,IAAAA,cAAC8jR,EAAsB,CACnBz1Q,MAAO,IACPC,OAAQ,MAGhB+sF,QAAS,mBACTD,YAAa5xF,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,sBAE7F,IAEH,IAAIy6Q,EAAwB16Q,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,+DAEnG4kF,IACA61L,EAAwB16Q,EAAc,CAACzS,GAAI,4CAA6C0S,eAAgB,6BAI5G,MAAM06Q,EAA8B,CAChCptR,GAAI,aACJmX,MAAOg2Q,EACPhkR,YACIF,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oDACH0S,eAAe,qFACfjB,OAAQ,CACJ47Q,oBAAqBxnL,KAG7B58F,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mDACH0S,eAAe,wSACfjB,OAAQ,CACJ67Q,kBAAoB75Q,GAChBxK,IAAAA,cAAC0/C,EAAAA,EAAa,CACVC,GAAIi5C,EAAAA,GAAa0rL,eACjBh1Q,QAAS6qF,GAER3vF,GAGT+5Q,0BAA4B/5Q,GACxBxK,IAAAA,cAAC0/C,EAAAA,EAAa,CACVC,GAAIi5C,EAAAA,GAAa4rL,kBACjBl1Q,QAAS6qF,GAER3vF,GAGTi6Q,8BAAgCj6Q,GAC5BxK,IAAAA,cAAC0/C,EAAAA,EAAa,CACVC,GAAIi5C,EAAAA,GAAa8rL,yBACjBp1Q,QAAS6qF,GAER3vF,OAOzB0wF,oBAAqB,WACrBC,WACIn7F,IAAAA,cAAC8iH,EAAAA,EAAU,CACPz0G,MAAO,IACPC,OAAQ,QAIhB6/J,kBAAmB3kK,EAAc,CAACzS,GAAI,2CAA4C0S,eAAgB,2BAClG4kF,WAGE8L,GAAgB1gF,EAAAA,EAAAA,cAAY,KAC1B+kE,GACAA,IAGJ5xE,GAAU,GACX,CAAC4xE,EAAS5xE,IAEP+3Q,EAAeA,KACjBX,IACA7pL,GAAe,EAGb20E,GAA6Br1J,EAAAA,EAAAA,cAAasgG,IAAuB,IAAAg1D,EACnE,MAAMC,EAA+B,QAAxBD,EAAGpzE,EAAMoe,EAAa,UAAE,IAAAg1D,OAAA,EAArBA,EAAuBh4K,GAEnCi4K,IACAzwK,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqB6gF,8BACrB,8BAAgCI,EAExC,GACD,CAACrzE,IAEEszE,GAAYx1J,EAAAA,EAAAA,cAAY,IAAMkiF,EAAMt4F,KAAIzF,IAAA,IAAC,GAAC7G,GAAY6G,EAALy+F,E,qWAAIx8C,CAAAjiD,EAAAkiD,GAAA,OACvD9/C,IAAAA,cAAC+jR,EAAsB3jR,OAAAC,OAAA,GACfg8F,EAAI,CACRtlG,GAAIA,EACJ2G,IAAK3G,EACLynF,QAAS2b,IACX,KACF,CAACwB,EAAOxB,IA8FZ,OACIn6F,IAAAA,cAACo8E,EAAAA,GAAY,CACTn8E,UAAU,qBACV4L,KAAMA,EACN9U,GAAG,qBACH6V,SAAUutF,GAnBV4yJ,EA9EuBz2L,KAQI,IARH,GAC5Bv/D,EAAE,MACFmX,EAAK,YACLhO,EAAW,oBACXg7F,EAAmB,WACnBC,EAAU,kBACVgzE,EAAiB,QACjB9/E,GAC0B/3B,EAGtBwjD,EACA95G,IAAAA,cAAA,KACIC,UAAS,GAAAU,OAAK0tF,EAAU,iBAAmB,mBAC3C/+E,QAAS6qF,GAETn6F,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wDACH0S,eAAe,WAkB3B,OAbI4kF,IAAY0iF,IACZj3D,EACI95G,IAAAA,cAAA,KACIC,UAAU,iBACVqP,QAASq1Q,GAET3kR,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,+DACH0S,eAAe,oBAM3BzJ,IAAAA,cAAA,OACIjJ,GAAE,6BAAA4J,OAA+B5J,GACjCkJ,UAAU,6DAETouF,GAAWruF,IAAAA,cAAA,OAAKC,UAAS,GAAAU,OAAKu6F,EAAmB,iBAC7CC,GAELn7F,IAAAA,cAAA,OAAKC,UAAU,SACViO,GAELlO,IAAAA,cAAA,OAAKC,UAAU,eACVC,IAEHmuF,GAAWruF,IAAAA,cAAA,OAAKC,UAAS,GAAAU,OAAKu6F,EAAmB,iBAC9CC,GAELn7F,IAAAA,cAAA,OAAKC,UAAU,2BACV65G,GACCzrB,GACEruF,IAAAA,cAAC0/C,EAAAA,EAAa,CACVz/C,UAAU,iBACV0/C,GAAIi5C,EAAAA,GAAa0rL,eACjBh1Q,QAAS6qF,GAETn6F,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wDACH0S,eAAe,4BAK9B0kK,GACGnuK,IAAAA,cAAA,OAAKC,UAAU,4BACVkuK,GAGP,EAMCy2G,CAAuBT,GAG9BnkR,IAAAA,cAACq5G,EAAAA,EAAQ,CACLC,WAAY21D,IACZl4K,GAAI,6BACJwiH,eAAe,EACfC,iBAAkBs1D,EAClBr1D,iBAAkBq1D,IAaX,EAErB+7E,EAAAxiP,UAAA,CAxSEm2E,QAAO14E,IAAAA,KACP8G,SAAQ9G,IAAAA,KAAAC,WACRgnP,iBAAgBjnP,IAAAA,MAwSpB,S,gHExTA,MAAMsoK,EAA6Bj2K,IAQQ,IAPvC,GACIpB,EAAE,MACF2jG,EAAK,QACLt7F,EAAO,QACPkQ,EAAO,UACPqrF,GAAY,EAAK,YACjBC,EAAc,kBACgBziG,EAClC,MAAM2iG,GAAUC,EAAAA,EAAAA,cAEVC,GAAWvhF,EAAAA,EAAAA,cAAY,KACQ,IAA7BihF,EAAMxrE,QAAQ,YAAkD,IAA9BwrE,EAAMxrE,QAAQ,YAChDxd,OAAOC,KAAK+oF,GAEZI,EAAQ9oF,KAAK0oF,GAGbprF,GACAA,KAGJ/Q,EAAAA,EAAAA,IACIwvF,EAAAA,GAAqB6gF,8BACrBh0E,EAAc,mBAAqB7jG,EACtC,GACF,CAAC2jG,EAAOprF,IAEX,OACItP,IAAAA,cAAA,KACIC,UAAS,8BAAAU,OAAgCg6F,EAAY,GAAK,qBAC1DrrF,QAAS0rF,GAER57F,EACD,EAEVgvK,EAAA/lK,UAAA,CA5CEtR,GAAE+O,IAAAA,OAAAC,WACF20F,MAAK50F,IAAAA,OAAAC,WACL3G,QAAO0G,IAAAA,OAAAC,WACP60F,YAAW90F,IAAAA,OACXwJ,QAAOxJ,IAAAA,KACP60F,UAAS70F,IAAAA,MAyCb,S,uXCrCA,SAAS++Q,IACL,MAAOh5Q,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,IAC1BurQ,EAAWC,IAAgBxrQ,EAAAA,EAAAA,WAAS,GAErCljB,GAAWsxD,EAAAA,EAAAA,gBACX,cAACn+C,IAAiBgQ,EAAAA,EAAAA,YACjBumF,IAAiB5O,EAAAA,EAAAA,MAExB/rC,EAAAA,EAAAA,YAAU,KACN/uD,GAASwzN,EAAAA,EAAAA,MAAsB,GAChC,IAEH,MAAMm7D,GAAcr5L,EAAAA,EAAAA,KAAQ50C,EAAAA,EAAAA,aAAYh0B,EAAAA,IAAgB3hB,OAClDitF,GAAUt3C,EAAAA,EAAAA,aAAY0/C,EAAAA,IACtBmD,GAAiB7iD,EAAAA,EAAAA,aAAY5pB,EAAAA,IAC7BwsE,GAAmB5iD,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAASwrE,MAAMsD,mBAC5E/N,GAAU70C,EAAAA,EAAAA,aAAY80C,EAAAA,IAEtBo5L,GAAmBluO,EAAAA,EAAAA,aAAYmuO,EAAAA,IAE/BC,EADyD,UAAjCxrL,aAAgB,EAAhBA,EAAkBtsE,aACH43P,EAEvCG,GAA2BxrL,aAAc,EAAdA,EAAgBrG,gBAAiBymE,EAAAA,GAAYC,aACxEorH,GAAsBz5L,aAAO,EAAPA,EAASG,OAAQC,EAAAA,GAAc07H,aACrDI,EAAiBs9D,GAA4BC,EAEnD,IAAKx5Q,EACD,OAAO,KAGX,MAAMy5Q,EAAwB,IAAI1nQ,KAAKqsC,SAAS2vC,aAAc,EAAdA,EAAgBnF,UAAW,KAErE8wL,EACFvlR,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAAA,OAAKC,UAAU,4BACfD,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,KAAGC,UAAU,SAASuJ,EAAc,CAACzS,GAAI,qCAAsC0S,eAAgB,6BAC/FzJ,IAAAA,cAAA,KAAGC,UAAU,YAAYuJ,EAAc,CAACzS,GAAI,6CAA8C0S,eAAgB,6IAA8I,CAAC+7Q,QAAS/qM,IAAO6qM,GAAuB5qM,IAAGksE,EAAAA,EAAAA,OAAsBx5D,OAAO,mBAChUptF,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,UACIC,UAAU,yBACVqP,QAASywF,GAERv2F,EAAc,CAACzS,GAAI,0CAA2C0S,eAAgB,gBAEnFzJ,IAAAA,cAAA,UACIC,UAAU,uBACVqP,QAASA,IAAMgK,GAAQ,IAEtB9P,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,iBAOjG,GAAIq7Q,EACA,OAAOS,EAGX,IAAKP,EACD,OAAO,KAGX,IAAKl9D,EACD,OAAO,KAGX,IAAI29D,EACAzlR,IAAAA,cAACmiJ,EAAAA,EAAa,CACVC,SAAS,qBACTxnD,YAAa,oDACbynD,gBAAgB,EAChB/yI,QAASA,IAAMy1Q,GAAa,KAcpC,OAXII,GAAe92L,KACfo3L,EACIzlR,IAAAA,cAAA,UACIC,UAAU,qBACVqP,QAASywF,GAERv2F,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,2BAM9EzJ,IAAAA,cAAA,OACIjJ,GAAG,wBACHkJ,UAAU,yBAEVD,IAAAA,cAAA,OAAKC,UAAU,WACXD,IAAAA,cAAA,KAAGC,UAAU,kCACZuJ,EAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,8CAE/EzJ,IAAAA,cAAA,OAAKC,UAAU,iBACVwlR,EACDzlR,IAAAA,cAAA,UACI9E,KAAK,SACL,aAAW,QACX+E,UAAU,eACVqP,QAASA,IAAMgK,GAAQ,IAEvBtZ,IAAAA,cAAA,QAAM,cAAY,QAAQ,KAC1BA,IAAAA,cAAA,QAAMC,UAAU,WAAW,WAK/C,CAEA,SAAesvD,EAAAA,EAAAA,MAAKs1N,G,0BCxHpB,MAAMa,EAAoBhmR,IACtB,MAAM,eACFimR,EAAc,UACdC,GACAlmR,EAEE6J,GAAOiQ,EAAAA,EAAAA,WAEPqsQ,GAAmBpsQ,EAAAA,EAAAA,cAAY,KACjCmsQ,EAAU,EAAG,MAAM,GACpB,CAACA,IAEEE,GAAkBrsQ,EAAAA,EAAAA,cAAY,KAChCmsQ,EAAU,EAAG,KAAK,GACnB,CAACA,IAEEG,GAAwBtsQ,EAAAA,EAAAA,cAAY,KACtCmsQ,EAAU,EAAG,WAAW,GACzB,CAACA,IAEEI,GAAcvsQ,EAAAA,EAAAA,cAAY,IACL,QAAnBksQ,EACOp8Q,EAAKC,cAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,qBACxD,OAAnBk8Q,EACAp8Q,EAAKC,cAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,oBACvD,aAAnBk8Q,EACAp8Q,EAAKC,cAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,0BAEpF,IACR,CAACk8Q,IAEJ,OACI3lR,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAACka,EAAAA,EAAW,CAACnjB,GAAG,wBACZiJ,IAAAA,cAAA,SACIA,IAAAA,cAAA,YAAOgmR,KACPhmR,IAAAA,cAAA,QAAMC,UAAU,4BAEpBD,IAAAA,cAAC4Z,EAAAA,EAAI,CACDO,UAAU,EACVC,UAAW7Q,EAAKC,cAAc,CAACzS,GAAI,oCAAqC0S,eAAgB,wBAExFzJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAG,oBACH2tP,YAAY,oBACZp1O,QAASu2Q,EACTr7Q,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,eAC7E8jO,eAAmC,QAAnBo4C,GAA4B3lR,IAAAA,cAAA,KAAGC,UAAU,sBAE7DD,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAG,mBACH2tP,YAAY,oBACZp1O,QAASw2Q,EACTt7Q,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,cAC5E8jO,eAAmC,OAAnBo4C,GAA2B3lR,IAAAA,cAAA,KAAGC,UAAU,uBAGhED,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZz8G,GAAG,yBACH2tP,YAAY,oBACZp1O,QAASy2Q,EACTv7Q,KAAMjB,EAAKC,cAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,oBAClF8jO,eAAmC,aAAnBo4C,GAAiC3lR,IAAAA,cAAA,KAAGC,UAAU,yBAK5E,EAEZylR,EAAAr9Q,UAAA,CA3EEs9Q,eAAc7/Q,IAAAA,OAAAC,WACd6/Q,UAAS9/Q,IAAAA,KAAAC,YA4Eb,QAAe/F,IAAAA,KAAW0lR,G,qEC7C1B,MAAMO,EAAkBvmR,IACpB,MAAM,OACFkvC,EAAM,WACN0L,EAAU,QACVtuC,EAAO,oBACPk6Q,EAAmB,YACnB/kL,EAAW,eACXglL,EAAc,iBACdnhL,EAAgB,SAChBp4F,EAAQ,QACR7J,GACArD,EAEEkhG,GAAoB/0C,EAAAA,EAAAA,QAA8B,MAClDg1C,GAAsBh1C,EAAAA,EAAAA,QAAgC,OACrDi1C,EAAYC,IAAiBxnF,EAAAA,EAAAA,WAAS,IACtC6sQ,EAAeC,IAAoB9sQ,EAAAA,EAAAA,UAAS,YAC7C,cAAC/P,IAAiBgQ,EAAAA,EAAAA,YAExB4rC,EAAAA,EAAAA,YAAU,KACgB,IAAlBxW,EAAOxlC,QACPi9Q,EAAiB,UACrB,GACD,CAACz3O,KAEJwW,EAAAA,EAAAA,YAAU,KACF07C,IACIF,EAAkBnuF,SAClBmuF,EAAkBnuF,QAAQuuF,0BAE1BH,EAAoBpuF,SACpBouF,EAAoBpuF,QAAQwuF,gBAAgB,IAGpDF,GAAc,EAAK,GACpB,CAACzmD,EAAY1L,EAAOxlC,OAAQ03F,IAE/B,MAAMM,EAAYD,EAAcvyD,EAAOxlC,OAAS,EAAIwlC,EAAOxlC,OAErDi4F,EAAgBr1F,EAAU,OAAWm6Q,EAErC7iL,EAAgB30F,IACVwyF,GAAexyF,EAAQigC,EAAOxlC,OAGpCk9Q,GAAe7sQ,EAAAA,EAAAA,cAAYljB,gBACvBwM,EAAQujR,aAAaloO,EAAQ,GACpC,CAACr7C,EAAQujR,eAENC,GAAe9sQ,EAAAA,EAAAA,cAAYljB,gBACvBwM,EAAQwjR,aAAanoO,EAAQ,GACpC,CAACr7C,EAAQwjR,eAENC,GAAqB/sQ,EAAAA,EAAAA,cAAak0B,IACpC5qC,EAAQ8P,UAAU,CACdC,QAASC,EAAAA,GAAiBmyF,gBAC1BjyF,WAAYkyF,EAAAA,EACZjyF,YAAa,CACTkrC,QAASzQ,EAAM52C,GACfquG,mBAAoBJ,EACpBA,iBAAkBA,KACdwhL,EAAmB74O,EAAM,KAIrC/gC,GAAU,GACX,CAAC7J,EAAQ8P,UAAWjG,EAAUo4F,IAS3B7nB,EAAOhlF,IAA6C,IAA5C,MAACwW,EAAK,MAAEvB,GAA+BjV,EACjD,GAAsB,IAAlBy2C,EAAOxlC,QAAgBkxC,EACvB,OACIt6C,IAAAA,cAAC+iG,EAAAA,EAAkB,CACf1b,QAAS2b,EAAAA,EAAiBwmC,OAC1BtmC,YAAa,CAACtjG,YAAa,GAAFe,OAAK25C,MAI1C,GAAIgpD,EAAa30F,GAAQ,CACrB,MAAMg/B,EAAQiB,EAAOjgC,GACrB,OAAKg/B,EAKD3tC,IAAAA,cAAA,OACIC,UAAU,YACVmN,MAAOA,EACP1P,IAAKiwC,EAAM52C,GACXuY,QAASA,KACLk3Q,EAAmB74O,EAAM,GAG7B3tC,IAAAA,cAAA,QAAMC,UAAU,sBAER0tC,EAAM7pB,UAAY,GAClB9jB,IAAAA,cAAA,KAAGC,UAAU,8BAEhB0tC,EAAM9tC,cAEXG,IAAAA,cAAA,QAAMC,UAAU,cACX,IAAK0tC,EAAMxtC,MAEhBH,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,gCACH0S,eAAe,sEACfjB,OAAQ,CACJ2X,aAAcwtB,EAAMxtB,iBAIhCngB,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAACka,EAAAA,EAAW,CACRrV,YAAY,EACZgtI,yBAAyB,EACzB96I,GAAE,iBAAA4J,OAAmBgtC,EAAM52C,KAE3BiJ,IAAAA,cAAA,UAAQC,UAAU,uBACdD,IAAAA,cAAA,KAAGC,UAAU,6BAEjBD,IAAAA,cAAC4Z,EAAAA,EAAI,CACDO,UAAU,EACV2mD,QA7DH2lN,EA6D2B93Q,EA5DrB,IAAvB83Q,GA6DoBxmR,UAAW,qBACXma,UAAW5Q,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,uBAE/EzJ,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZlkG,QAASA,KACLk3Q,EAAmB74O,EAAM,EAE7B5tC,KAAMC,IAAAA,cAAA,KAAGC,UAAU,kCACnBuK,KAAMhB,EAAc,CAACzS,GAAI,8BAA+B0S,eAAgB,eACxEpC,UAAU,KAGlBrH,IAAAA,cAAC4Z,EAAAA,EAAKiwG,MAAK,KACP7pH,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ3nG,KAAMq6Q,EAAoBv4O,EAAM52C,IAAI2vR,WACpCp3Q,QAASA,KACLg3Q,EAAa34O,EAAM52C,GAAG,EAE1BgJ,KAAMC,IAAAA,cAAA,KAAGC,UAAU,yBACnBuK,KAAMhB,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,kBAC3EpC,UAAU,EACVosG,aAAa,IAEjBzzG,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ3nG,KAAMq6Q,EAAoBv4O,EAAM52C,IAAI4vR,YACpCr3Q,QAASA,KACLi3Q,EAAa54O,EAAM52C,GAAG,EAE1BgJ,KAAMC,IAAAA,cAAA,KAAGC,UAAU,iBACnBuK,KAAMhB,EAAc,CAACzS,GAAI,iCAAkC0S,eAAgB,kBAC3EpC,UAAU,SA1E3B,IAkFf,CArGqBo/Q,MAsGrB,OAAIz6Q,EACOhM,IAAAA,cAACmjJ,EAAAA,EAAa,MAElB,IAAI,EAGf,OACInjJ,IAAAA,cAAA,OACIC,UAAU,8CACVmN,MAAO,CAACq8F,SAAU28K,IAElBpmR,IAAAA,cAACqjG,EAAAA,EAAc,CACXzoD,IAAKgmD,EACL0C,aAAcA,EACdlC,UAAW,IACXC,cAAeA,IAEdzjG,IAAA,IAAC,gBAAC4lG,EAAe,IAAE5oD,GAAIh9C,EAAA,OACpBoC,IAAAA,cAACyjG,EAAAA,GAAgB,CACbrC,UAAWA,EACXoC,gBAAiBA,EACjB5oD,IAAKA,EACL8oD,SAAUA,IAAM,GAChBp1F,OAAQsgC,EAAOxlC,QAAU,EAAI,IAAmC,GAA7BtF,KAAKs2D,IAAIxrB,EAAOxlC,OAAQ,GAC3DiF,MAAO,QAEN8uE,EACc,IAE3Bn9E,IAAAA,cAAC6kR,EAAkB,MACjB,EAEZoB,EAAA59Q,UAAA,CAzNEumC,OAAM9oC,IAAAA,MAAAC,WACNu0C,WAAUx0C,IAAAA,OAAAC,WACViG,QAAOlG,IAAAA,KAAAC,WAEPogR,eAAcrgR,IAAAA,KAAAC,WACd6G,SAAQ9G,IAAAA,KAAAC,WACRi/F,iBAAgBl/F,IAAAA,KAAAC,WAChBo7F,YAAWr7F,IAAAA,KAAAC,WACXhD,QAAO+C,IAAAA,MAAA,CACHwgR,aAAYxgR,IAAAA,KAAAC,WACZwgR,aAAYzgR,IAAAA,KAAAC,WACZ8M,UAAS/M,IAAAA,KAAAC,aAAAA,YAgNjB,QAAe/F,IAAAA,KAAWimR,GCrN1B,GAAen+Q,EAAAA,EAAAA,UAjBf,SAAyBxP,GAErB,MAAO,CACH4tR,qBAFwBU,EAAAA,EAAAA,IAAwBtuR,GAIxD,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAAS,IACTyzQ,aAAY,KACZC,aAAYA,EAAAA,IACblwR,GAEX,GAE4D,KAAM,CAAC2qE,YAAY,GAA/E,CAAsFilN,G,0BCXtF,MAAMY,EAAyBnnR,IAC3B,MAAMonR,GAAkBrtQ,EAAAA,EAAAA,cAAY,KAChC/Z,EAAMqD,QAAQ8P,UAAU,CACpBC,QAASC,EAAAA,GAAiBg0Q,mBAC1B9zQ,WAAY8yG,EAAAA,QACZ7yG,YAAa,CACTkyF,mBAAoB1lG,EAAMslG,oBAGlCtlG,EAAMkN,UAAU,GACjB,CAAClN,EAAMqD,QAAQ8P,UAAWnT,EAAMslG,iBAAkBtlG,EAAMkN,WAE3D,OACI5M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,wBAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,iBAInB/J,EAAMsnR,uBACNhnR,IAAAA,cAAA,UACIC,UAAU,8CACVqP,QAASw3Q,GAET9mR,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,kBAIhB,EAErBo9Q,EAAAx+Q,UAAA,CA7CE2+Q,sBAAqBlhR,IAAAA,KAAAC,WACrB6G,SAAQ9G,IAAAA,KAAAC,WACRi/F,iBAAgBl/F,IAAAA,KAAAC,WAChBhD,QAAO+C,IAAAA,MAAA,CACH+M,UAAS/M,IAAAA,KAAAC,aAAAA,YA2CjB,QAAe/F,IAAAA,KAAW6mR,GC7B1B,GAAe/+Q,EAAAA,EAAAA,UAhBf,SAAyBxP,GAGrB,MAAO,CACH0uR,uBAH0BnjP,EAAAA,EAAAA,IAAsBvrC,EAAO,CAACwrC,WAAYjX,EAAAA,GAAYo6P,sBAKxF,IAEA,SAA4B5wR,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAASA,EAAAA,GACVxc,GAEX,GAEA,CAA4DwwR,G,w9BCR5D,MAwBM9hL,EAAmBrlG,IACrB,MAAOs7C,EAAiBksO,IAAsB3tQ,EAAAA,EAAAA,UAAS,IAChDvN,EAASqoJ,IAAc96I,EAAAA,EAAAA,WAAS,IAChC1N,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,IAC1BosQ,EAAgBwB,IAAqB5tQ,EAAAA,EAAAA,UAAS,QAC9C6tQ,EAAYC,IAAiB9tQ,EAAAA,EAAAA,WAAS,IACtCq1B,EAAQ04O,IAAa/tQ,EAAAA,EAAAA,UAAS7Z,EAAMkvC,SAEpC3vC,EAAMw5K,GCnDV,SAAuB8uG,GAC1B,MAAOtoR,EAAMw5K,IAAWl/J,EAAAA,EAAAA,UAAS,IAC1BiuQ,EAAcC,IAAmBluQ,EAAAA,EAAAA,UAAS,IAC1CmuQ,EAAoBC,IAAyBpuQ,EAAAA,EAAAA,UAAS,GAC7D,MAAkB,QAAdguQ,EACO,CAACtoR,EAAMw5K,GACO,OAAd8uG,EACA,CAACC,EAAcC,GAGnB,CACHC,EACAC,EAER,CDqC4BC,CAAcjC,IAEtCvgO,EAAAA,EAAAA,YAAU,KACiB,QAAnBugO,GACA2B,EAAU5nR,EAAMkvC,QAEG,OAAnB+2O,GACA2B,EAAU5nR,EAAMmoR,UAEG,aAAnBlC,GACA2B,EAAU5nR,EAAMooR,eACpB,GACD,CAACnC,EAAgBjmR,EAAMkvC,OAAQlvC,EAAMmoR,WAExC,MAIMjC,GAAYnsQ,EAAAA,EAAAA,cAAYljB,MAAO0I,EAAcsoR,KAC/C,MAAM,QAACxkR,EAAO,cAAE+iB,GAAiBpmB,EACjC20J,GAAW,GACX,MAAM0zH,EAAgC,CAClCn1P,wBAAwB,EACxB3zB,OACA4zB,SAxDY,GAyDZC,sBAAsB,GAE1B,IAAIn8B,EAA8B,CAACA,KAAM,IAEzC,GAAkB,QAAd4wR,EACAQ,EAAaC,kBAAmB,EAChCrxR,QAAaoM,EAAQ6iR,UAAUmC,QAC5B,GAAkB,OAAdR,EAAoB,CAC3B,MAAMU,EAAgBnxR,EAAAA,EAAA,GACfixR,GAAY,IACfG,kBAAmBpiQ,EACnBkiQ,kBAAkB,IAEtBrxR,QAAaoM,EAAQolR,2BAA2BF,EACpD,KAAyB,aAAdV,IACPQ,EAAaK,iBAAkB,EAC/BzxR,QAAaoM,EAAQ6iR,UAAUmC,IAG/BpxR,GAA8B,IAAtBA,EAAKA,KAAMyS,OACnBi+Q,GAAc,GAEdA,GAAc,GAElBhzH,GAAW,GACX8yH,EAAkBI,EAAU,GAC7B,CAAC7nR,EAAMqD,QAAQ6iR,UAAWlmR,EAAMqD,QAAQolR,2BAA4BzoR,EAAMomB,iBAE7Es/B,EAAAA,EAAAA,YAAU,KACNwgO,EAAU,EAAG,OACN,KACHlmR,EAAMqD,QAAQ40B,mBAAmB,GAAG,IAEzC,KAEHytB,EAAAA,EAAAA,YAAU,KACN7P,aAAayF,GACb,MAAMV,EAAa56C,EAAM46C,WAEzB,GAAmB,KAAfA,EAGA,OAFA+5G,GAAW,QACX6yH,EAAmB,GAIvB,MAAM33M,EAAY79D,OAAOuZ,YACrB10B,UACI,MAAM0B,EAA4B,CAC9B06B,EAAG2nB,EACH1nB,wBAAwB,EACxB3zB,OACA4zB,SA5GI,GA6GJm1P,kBAAkB,EAClBl1P,sBAAsB,GAEH,QAAnB6yP,QACMjmR,EAAMqD,QAAQiwB,aAAa/6B,GACP,OAAnB0tR,GACP1tR,EAAOiwR,kBAAoBxoR,EAAMomB,oBAC3BpmB,EAAMqD,QAAQiwB,aAAa/6B,IACP,aAAnB0tR,IACP1tR,EAAOmwR,iBAAkB,QACnB1oR,EAAMqD,QAAQiwB,aAAa/6B,GACrC,GAEJwtB,EAAAA,GAAU41B,6BAGd6rO,EAAmB33M,EAAU,GAC9B,CAAC7vE,EAAM46C,WAAY4sO,IAEtB,MAAMnvC,GAAet+N,EAAAA,EAAAA,cAAata,IAC9B,MAAMy4B,EAAOz4B,EAAEq7D,OAAOh3D,MACtB9D,EAAMqD,QAAQ40B,mBAAmBC,EAAK,GACvC,CAACl4B,EAAMqD,QAAQ40B,qBAEZwuP,GAAiB1sQ,EAAAA,EAAAA,cAAY,KAC/B,MAAM4uQ,EAAUppR,EAAO,EACvBw5K,EAAQ4vG,GACe,QAAnB1C,GAA6B35Q,GAC7B45Q,EAAUyC,EAAS,OAEA,OAAnB1C,GAA4B35Q,GAC5B45Q,EAAUyC,EAAS,MAEA,aAAnB1C,GAAkC35Q,GAClC45Q,EAAUyC,EAAS,WACvB,GACD,CAAC1C,EAAgB1mR,EAAM2mR,EAAW55Q,IAE/BolH,GAAcz3G,EAAAA,EAAAA,UAAQ,IACjB3Z,IAAAA,cAAA,KAAGC,UAAW,uBACtB,IAEGqoR,GAAgB3uQ,EAAAA,EAAAA,UAAQ,IACH,aAAnBgsQ,EACO3iL,EAAAA,EAAiBunE,mBAErBvnE,EAAAA,EAAiBqnE,YACzB,CAACs7G,IAEJ,OACI3lR,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,gCAChBb,KAAMA,EACNc,OApHOyqC,KACX99B,GAAQ,EAAM,EAoHV1M,SAAUlN,EAAMkN,SAChBE,KAAK,OACL,kBAAgB,uBAChB/V,GAAG,mBAEHiJ,IAAAA,cAAC6mR,EAAqB,CAClBj6Q,SAAUlN,EAAMkN,SAChBo4F,iBAAkBtlG,EAAMslG,mBAE5BhlG,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACPzN,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAC4mH,EAAAA,EAAK,CACF1rH,KAAK,OACLmJ,aAAa6K,EAAAA,EAAAA,eAAc,CAACnY,GAAI,iCAAkC0S,eAAgB,kBAClF9G,SAAUo1O,EACVv0O,MAAO9D,EAAM46C,WACb,cAAY,cACZr6C,UAAW,0BACXmxH,YAAaA,KAGrBpxH,IAAAA,cAAC0lR,EAAgB,CACbC,eAAgBA,EAChBC,UAAWA,IAEK,IAAlBh3O,EAAOxlC,QAAiB1J,EAAM46C,WAK1Bt6C,IAAAA,cAAAA,IAAAA,SAAA,KACFA,IAAAA,cAACimR,EAAc,CACXr3O,OAAQA,EACR0L,WAAY56C,EAAM46C,WAClBtuC,QAASA,EACTm1F,aAAcimL,EACdjB,eAAgBA,EAChBv5Q,SAAUlN,EAAMkN,SAChBo4F,iBAAkBtlG,EAAMslG,oBAbchlG,IAAAA,cAAAA,IAAAA,SAAA,KAC1CA,IAAAA,cAAC+iG,EAAAA,EAAkB,CACf1b,QAASihM,IAEbtoR,IAAAA,cAAC6kR,EAAkB,QAcvB,EAEd9/K,EAAA18F,UAAA,CA7MEuE,SAAQ9G,IAAAA,KAAAC,WACR6oC,OAAM9oC,IAAAA,MAAAC,WACN8hR,SAAQ/hR,IAAAA,MAAAC,WACR+hR,eAAchiR,IAAAA,MAAAC,WACdu0C,WAAUx0C,IAAAA,OAAAC,WACV+f,cAAahgB,IAAAA,OAAAC,WACbi/F,iBAAgBl/F,IAAAA,KAAAC,WAChBhD,QAAO+C,IAAAA,MAAA,CACH8/Q,UAAS9/Q,IAAAA,KAAAC,WAGT4xB,mBAAkB7xB,IAAAA,KAAAC,WAClBoiR,2BAA0BriR,IAAAA,KAAAC,WAG1BitB,aAAYltB,IAAAA,KAAAC,aAAAA,YAgMpB,QAAe/F,IAAAA,KAAW+kG,GE1K1B,IAAej9F,EAAAA,EAAAA,UA1Cf,WACI,MAAM6oG,GAAqCC,EAAAA,EAAAA,MACrC23K,GAA6BC,EAAAA,EAAAA,MAEnC,OAAO,SAAyBlwR,GAC5B,MAAMgiD,EAAahiD,EAAM8kD,MAAMx6B,OAAOy6B,YAEtC,IAAIzO,EAAkB,GAClBi5O,EAAoB,GACpBC,EAA0B,GAW9B,OAVIxtO,GACA1L,GAAS65O,EAAAA,EAAAA,IAA4BnwR,EAAOgiD,GAAY,GACxDutO,GAAWa,EAAAA,EAAAA,IAA8BpwR,EAAOgiD,GAAY,GAC5DwtO,GAAiBa,EAAAA,EAAAA,IAAqBrwR,EAAOgiD,KAE7C1L,EAAS+hE,EAAmCr4G,GAAO,GACnDuvR,EAAWU,EAA2BjwR,GAAO,GAC7CwvR,GAAiBc,EAAAA,EAAAA,IAAkBtwR,IAGhC,CACH4yF,WAAWkO,EAAAA,EAAAA,GAAY9gG,EAAOya,EAAAA,GAAiB+xF,aAC/Cl2D,SACA0L,aACAutO,WACAC,iBACAhiQ,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAExC,CACJ,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB49Q,UAAS,IACTjuP,mBAAkB,KAClBwwP,2BAA0B,KAC1Bn1P,aAAYA,EAAAA,IACb38B,GAEX,GAEgE,KAAM,CAAC2qE,YAAY,GAAnF,CAA0F+jC,E,gNC1D1F,MAEa8jL,EAAuB,IAAIp7F,ICmBxC,SAASokF,IACL,MAAM5tN,GAAiBC,EAAAA,EAAAA,MAEvB,MAAO,CAAC5rD,EAAoB2hC,KACxB,MAAM72B,GAAO82B,EAAAA,EAAAA,IAAQ5hC,EAAO2hC,EAAS/iC,QAC/B0+G,GAAQC,EAAAA,EAAAA,IAASv9G,GAEvB,MAAO,CACHkO,YAAay9C,EAAe3rD,EAAO2hC,EAAS/iC,QAAQ,GACpDkM,OACAwyG,QACAkzK,SAAUv8Q,QAAQnJ,GAAQA,EAAK6vG,WAClC,CAET,EAEkBnrG,EAAAA,EAAAA,SAAQ+pQ,GAA1B,MAIA,GAAe/pQ,EAAAA,EAAAA,SAAQ+pQ,EAAvB,EC1Be,SAAoB15Q,GAYzB,IACFgI,GAb4B,eAChCilM,GAAiB,EAAK,gBACtB7hM,GAAkB,EAAK,WACvB2+F,GAAa,EAAK,cAClB+iG,EAAgB,GAAE,SAClBT,GAAW,EAAK,KAChBphM,EAAI,YACJoD,EAAW,MACXovG,EAAK,OACL1+G,EAAM,UACNkb,EAAS,cACT8yL,GACI/sM,EAGAgI,EADAiD,GAAQG,EACD,IAAH5C,OAAQyC,EAAK7C,UAEV0kM,GAAiBz+L,GAAe,MAG3C,IAKIuiR,EALAC,EAAYpzK,aAAK,EAALA,EAAO4oD,mBAUvB,GATIp7J,GAAQwyG,IACRozK,EFjCD,SAAuBzoR,EAAkBypG,GAC5C,MAAMi/K,EAAW,GAAHtoR,OAAMJ,EAAQ,KAAAI,OAAIqpG,GAC1Bk/K,EAAcL,EAAqBtlN,IAAI0lN,GAC7C,GAAIC,EACA,OAAOA,EAGX,IAAIF,EAAYh/K,EACZm/K,EAAgB,EAChBC,EAAc7oR,EAClB,MAAM8oR,EAAU,IAAIC,KACdC,EAAY,IAAIC,KAEhBC,EAAsBJ,EAAQK,eAAe1/K,GACnD,IAAK,IAAI2/K,EAAQ,GAAIA,EAAQ,EAAGA,IAAS,CACrC,MAAM9/L,EAAY0/L,EAAUK,IAAIR,GAE1BS,EAAKR,EAAQS,iBACfT,EAAQK,eAAe7/L,GACvB4/L,GAQJ,GALII,EAAKV,IACLH,EAAYn/L,EACZs/L,EAAgBU,GAGhBA,GA/BiB,IAgCjB,MAGJT,GAAe,MACnB,CAGA,OADAP,EAAqBz2N,IAAI62N,EAAUD,GAC5BA,CACX,CEHoBe,CAAc3mR,EAAK7C,SAAUq1G,EAAM0oD,kBAI/CkmC,IACAukF,EAAY,CAAC15N,MAAO25N,IAGpB5jF,EACA,OACIplM,IAAAA,cAAA,OACIC,UAAU,eACVmN,MAAO27Q,GAEN5oR,GAKb,IAAIonK,EAAa,GACbyiH,GAAe,EAQnB,OAPI5mR,IACAmkK,GAAavmK,EAAAA,EAAAA,IAAgBoC,EAAKrM,GAAIqM,EAAKy6C,qBACvCz6C,EAAK6vG,YACL+2K,GAAe,IAKnBhqR,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACiiG,EAAAA,EAAc,CACXk1H,mBAAmB,SACnBvvH,sBAAsB,2BACtByvH,sBAAuB0xD,EACvB7xR,OAAQA,EACRqX,IAAKg5J,EACLn1J,UAAWA,EACX8vF,WAAYA,EACZgjG,cAAeA,EACfD,cAAeA,GAEd9kM,GAEJ6pR,GACDhqR,IAAAA,cAACguN,EAAAA,EAAmB,CAChB/tN,UAAU,mBACVs0G,aAAa,IAGfnxG,GAAQA,EAAKnC,QAAWjB,IAAAA,cAACkB,EAAAA,EAAM,MAC/BkC,IAAQjC,EAAAA,EAAAA,GAAQiC,EAAKhC,QAAWpB,IAAAA,cAACqB,EAAAA,EAAQ,MAGvD,G,wKC5EA,MAAM4oR,GAAyBvoN,E,SAAAA,GAAmB,qBAAqBC,EAAAA,EAAAA,OAAK,IAAM,sEA+BlF,GAAe75D,EAAAA,EAAAA,UA3Bf,SAAyBxP,EAAoB2hC,GACzC,MAAMt/B,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GAEnB4xR,EAA2D,SAAlCvvR,EAAOg6F,uBAChCw1L,EAA+D,SAApCxvR,EAAOyvR,yBAIxC,MAAO,CACHhnR,KAHS62B,EAASowP,WAAapwP,EAASw6E,QAAS61K,EAAAA,EAAAA,IAAgBhyR,EAAO2hC,EAASw6E,SAAU1xF,EAAAA,EAAAA,IAAezqB,GAI1GiyR,gBAAiBtwP,EAASowP,WAAapwP,EAASw6E,QAAS+1K,EAAAA,EAAAA,IAA2BlyR,EAAO2hC,EAASw6E,aAAUz5G,EAC9GkvR,yBACAC,2BACAM,gBAAgBC,EAAAA,EAAAA,IAAsBpyR,GAE9C,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB2iR,sBAAqB,KACrBC,mBAAkB,KAClB1wP,QAAOA,EAAAA,IACR7jC,GAEX,GAEA,CAA4D4zR,E,4WCnB5D,MAAMY,EAAyBnrR,IAAiB,IAAAoiG,EAC5C,MAAM,KACF1+F,EAAI,MACJuqC,EAAK,QACLyQ,GACA1+C,EAEEorR,GAAsBrxQ,EAAAA,EAAAA,cAAYljB,UACpC,MAAM,QAACwM,EAAO,qBAAEgoR,GAAwBrrR,QAElCqD,EAAQioR,qBAAqB5sO,EAAS,CAACh7C,EAAKrM,KAAKmV,MAAMvV,IACpDA,EAAKD,OACNq0R,GACJ,GACF,GACH,CAAC3nR,EAAKrM,GAAIqnD,EAAS1+C,EAAMqrR,qBAAsBrrR,EAAMqD,QAAQioR,uBAE1D3rR,GAAS03C,EAAAA,EAAAA,cAAaz+C,IAAuBqsD,EAAAA,EAAAA,IAAmBrsD,EAAO8K,aAAI,EAAJA,EAAMrM,KAAO2+C,EAAAA,GAAamsD,UAEvG,OACI7hG,IAAAA,cAAA,OACItC,IAAK0F,EAAKrM,GACVkJ,UAAU,oBAEVD,IAAAA,cAAA,QAAMC,UAAU,kBAEZD,IAAAA,cAACa,EAAAA,EAAM,CACHN,SAAU6C,EAAK7C,SACfO,KAAM,KACNC,IAAKH,EAAAA,GAA8B,QAATkhG,EAAC1+F,aAAI,EAAJA,EAAMrM,UAAE,IAAA+qG,EAAAA,EAAI,IACvC7hG,UAAW,wBAEfD,IAAAA,cAACoiG,EAAAA,EAAU,CACP/iG,OAAQA,KAGhBW,IAAAA,cAAA,OAAKC,UAAU,qBACVW,EAAAA,GAAkBwC,IAEvBpD,IAAAA,cAAA,OAAKC,UAAU,yBAAuB,IAAAU,OAC7ByC,EAAK7C,WAGTotC,EAAMv9B,OAAOnN,gBAAkBihF,EAAAA,GAAYC,MAAQzkF,EAAMurR,wBAC1DjrR,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,0CACV,aAAW,QACXqP,QAASw7Q,GAET9qR,IAAAA,cAAA,KACIC,UAAU,iCAIpB,EAEZ4qR,EAAAxiR,UAAA,CAnEE+1C,QAAOt4C,IAAAA,OAAAC,WAGPglR,qBAAoBjlR,IAAAA,KAAAC,WACpBklR,uBAAsBnlR,IAAAA,KAAAC,WACtBhD,QAAO+C,IAAAA,MAAA,CACHklR,qBAAoBllR,IAAAA,KAAAC,aAAAA,YA+D5B,QAAe/F,IAAAA,KAAW6qR,GCrD1B,GAAe/iR,EAAAA,EAAAA,UAlBf,SAAyBxP,EAAoB2hC,GAIzC,MAAO,CACH0T,OAJUu9O,EAAAA,EAAAA,IAAa5yR,EAAO2hC,EAASmkB,SAKvC6sO,wBAJ2BE,EAAAA,EAAAA,GAAqB7yR,EAAO2hC,EAASmkB,QAASvxB,EAAAA,GAAYu+P,6BAM7F,IAEA,SAA4B/0R,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBgjR,qBAAoBA,EAAAA,IACrB30R,GAEX,GAEA,CAA4Dw0R,G,eCT5D,MAAMQ,EAAwB3rR,IAC1B,MAAOmM,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,IAC1B4/B,EAAQmyO,IAAa/xQ,EAAAA,EAAAA,WAAS,IAC9BysG,EAAYulK,IAAiBhyQ,EAAAA,EAAAA,UAAwB,KACrD2sG,EAAkBslK,IAAuBjyQ,EAAAA,EAAAA,WAAS,IACnD,cAAC/P,IAAiBgQ,EAAAA,EAAAA,WAElB49B,GAAS39B,EAAAA,EAAAA,cAAY,KACvBH,GAAQ,EAAM,GACf,IAEG4tG,GAAgBztG,EAAAA,EAAAA,cAAY,IACvBusG,EAAW58G,OAAS,GAC5B,CAAC48G,IAEEhoE,GAAkBvkC,EAAAA,EAAAA,cAAavW,IACjCqoR,EAAcroR,EAAM,GACrB,IAEG+6C,GAAqBxkC,EAAAA,EAAAA,cAAavW,IACpCqoR,EAAcroR,EAAM,GACrB,IAEGyjH,GAASltG,EAAAA,EAAAA,cAAY,KACvB/Z,EAAM0lG,qBACN1lG,EAAMkN,UAAU,GACjB,CAAClN,EAAM0lG,mBAAoB1lG,EAAMkN,WAE9B6+Q,GAAkBhyQ,EAAAA,EAAAA,cAAYljB,UAEhC,GADA+0R,GAAU,IACLpoR,GAA0B,IAAjBA,EAAMkG,OAEhB,YADAkiR,GAAU,GAGd,MAAMtxO,EAAU92C,EAAMG,KAAKD,GAChBA,EAAKrM,KAGVJ,QAAa+I,EAAMqD,QAAQ0oR,gBAAgB/rR,EAAM0+C,QAASpE,GAE5DrjD,SAAAA,EAAMD,OACN80R,GAAoB,GACpBF,GAAU,IAEV3kK,GACJ,GACD,CAACA,EAAQjnH,EAAMqD,QAAQ0oR,gBAAiB/rR,EAAM0+C,UAE3CK,GAAgB9kC,EAAAA,EAAAA,UAAQ,KACnB,CACH+xQ,gBAAiBhsR,EAAM0+C,WAE5B,CAAC1+C,EAAM0+C,UAEJutO,GAAahyQ,EAAAA,EAAAA,UAAQ,KAChB,CACHg0B,MAAOjuC,EAAMiuC,MAAM9tC,gBAExB,CAACH,EAAMiuC,MAAM9tC,eAEhB,OACIG,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,uCAChBb,KAAMA,EACNc,OAAQyqC,EACRxqC,SAAUlN,EAAMkN,SAChBE,KAAK,OACL,kBAAgB,6BAChB/V,GAAG,yBAEHiJ,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,wCACV,aAAYuJ,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,SAChF6F,QAASq3G,GAET3mH,IAAAA,cAAA,KAAGC,UAAU,0BAEjBD,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,8BAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,wBACfjB,OAAQmjR,OAKxB3rR,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,CACPxN,UAAU,qBAEVD,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,QAAM8M,KAAK,QACP9M,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAC+9C,EAAAA,EAAyB,CACtBc,gBAAiB,qBACjBN,iBAAkBktO,EAClBvsO,aAAa,EACbC,cAAe+nE,IACflpE,gBAAiBA,EACjBC,mBAAoBA,EACpBG,QAAS1+C,EAAM0+C,QACfK,cAAeA,EACfjD,kBAAkBtsC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,+BAAgC0S,eAAgB,eACrFgyC,yBAAyBvsC,EAAAA,EAAAA,eAAc,CAACnY,GAAI,qBAAsB0S,eAAgB,cAClF21C,gBAAiBunE,EACjBtnE,gBAAiB,mBACjBlG,OAAQA,KAIZ+sE,GACAlmH,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,KAAGC,UAAU,4BACbD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,uCAOnC,EAEd4hR,EAAAhjR,UAAA,CA3IEuE,SAAQ9G,IAAAA,KAAAC,WACRq4C,QAAOt4C,IAAAA,OAAAC,WAEPq/F,mBAAkBt/F,IAAAA,KAAAC,WAClBhD,QAAO+C,IAAAA,MAAA,CACH2lR,gBAAe3lR,IAAAA,KAAAC,WACf8M,UAAS/M,IAAAA,KAAAC,aAAAA,YAuIjB,QAAe/F,IAAAA,KAAWqrR,GC3H1B,GAAevjR,EAAAA,EAAAA,UAjBf,SAAyBxP,EAAoBoH,GAGzC,MAAO,CACHiuC,OAHUO,EAAAA,EAAAA,IAAS51C,EAAOoH,EAAM0+C,SAKxC,IAEA,SAA4B/nD,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxByjR,gBAAe,KACf54Q,UAASA,EAAAA,GACVxc,GAEX,GAEA,CAA4Dg1R,G,gFCJ5D,MAAMO,EAAuBzzR,IAMhB,IANiB,QAC1B4K,EAAO,mBACPqiG,EAAkB,MAClBz3D,EAAK,QACLyQ,EAAO,SACPxxC,GACIzU,EACJ,MAAO0zR,EAAYC,IAAiBvyQ,EAAAA,EAAAA,WAAS,IACtCpZ,EAAM8zJ,IAAW16I,EAAAA,EAAAA,UAASo0B,EAAM9tC,eAChCujF,EAAS2oM,IAAcxyQ,EAAAA,EAAAA,UAAS,IAAD5Y,OAAKgtC,EAAMxtC,QAC1Cg5C,EAAQmyO,IAAa/xQ,EAAAA,EAAAA,WAAS,IAC9B1N,EAAMyN,IAAWC,EAAAA,EAAAA,WAAS,IAC1B4sG,EAAuB6lK,IAA4BzyQ,EAAAA,EAAAA,UAAS,KAC5D6sG,EAAoB6lK,IAAyB1yQ,EAAAA,EAAAA,UAAS,KACtD2sG,EAAkBslK,IAAuBjyQ,EAAAA,EAAAA,WAAS,IAClD0sG,EAAwBimK,IAA6B3yQ,EAAAA,EAAAA,WAAS,IAE/D,cAAC/P,IAAiBgQ,EAAAA,EAAAA,WAElB49B,GAAS39B,EAAAA,EAAAA,cAAY,KACvBH,GAAQ,EAAM,GACf,IAEG4tG,GAAgBztG,EAAAA,EAAAA,cAAY,IACvBtZ,EAAKiJ,OAAS,GAAKg6E,EAAQh6E,OAAS,GAAKyiR,IAAe1yO,GAChE,CAACh5C,EAAMijF,EAASyoM,EAAY1yO,IAEzB0tE,GAAkBptG,EAAAA,EAAAA,cAAata,IACjC,MAAMqE,EAAQrE,EAAEq7D,OAAOh3D,MACvB,IAAI2oR,EAAa/oM,EACZ6iC,IACDkmK,EAAa3oR,EAAMyjC,QAAQ,qBAAsB,IAAIhkC,cAClB,MAA/BkpR,EAAW78P,UAAU,EAAG,KACxB68P,EAAa,IAAHxrR,OAAOwrR,KAGzBl4H,EAAQzwJ,GACRsoR,GAAc,GACdC,EAAWI,EAAW,GACvB,CAAC/oM,EAAS6iC,IAEPe,GAAqBvtG,EAAAA,EAAAA,cAAata,IACpC,MAAMqE,EAAQrE,EAAEq7D,OAAOh3D,MACvBsoR,GAAc,GACdC,EAAWvoR,GACX0oR,GAA0B,EAAK,GAChC,IAEGvlK,GAASltG,EAAAA,EAAAA,cAAY,KACvB2rF,IACAx4F,GAAU,GACX,CAACw4F,EAAoBx4F,IAElBw/Q,GAAa3yQ,EAAAA,EAAAA,cAAYljB,UAC3B+0R,GAAU,GACV,IAAIa,EAAa/oM,EACjB,MAAM58E,EAAcrG,EAEpB,IAAKqG,IAAgBA,EAAY+oB,OAG7B,OAFA08P,EAAsBziR,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,oCAC1F6hR,GAAU,GAQd,GAJmC,MAA/Ba,EAAW78P,UAAU,EAAG,KACxB68P,EAAaA,EAAW78P,UAAU,EAAG68P,EAAW/iR,SAGhD+iR,EAAW/iR,OAAS,EAGpB,OAFA4iR,EAAyBxiR,EAAc,CAACzS,GAAI,mCAAoC0S,eAAgB,uCAChG6hR,GAAU,GAId,GAAI7lQ,EAAAA,GAAU4gG,iBAAiBl6E,SAASggP,EAAWlpR,eAG/C,OAFA+oR,EAAyBxiR,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,4CACrG6hR,GAAU,GAKd,IADqB,IAAI9tO,OAAO,mBACd3iB,KAAKsxP,GAGnB,OAFAH,EAAyBxiR,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,wCACrG6hR,GAAU,GAId,MAAM39O,EAA0B,CAC5BxtC,KAAMgsR,EACNtsR,aAAc2G,GAEZ7P,QAAaoM,EAAQqpR,WAAWhuO,EAASzQ,GAC9B,IAAA84E,EAAAC,EAAb/vH,SAAAA,EAAMD,MAC8B,kCAAtB,QAAV+vH,EAAA9vH,EAAKD,aAAK,IAAA+vH,OAAA,EAAVA,EAAYzvH,kBACZg1R,EAAyBxiR,EAAc,CAACzS,GAAI,qCAAsC0S,eAAgB,iCAClG6hR,GAAU,IAC6B,iCAAtB,QAAV5kK,EAAA/vH,EAAKD,aAAK,IAAAgwH,OAAA,EAAVA,EAAY1vH,kBACnBg1R,EAAyBxiR,EAAc,CAACzS,GAAI,4CAA6C0S,eAAgB,uEACzG6hR,GAAU,KAEVE,GAAoB,GACpBF,GAAU,IAGd3kK,GACJ,GACD,CAACvjC,EAASjjF,EAAM4C,EAASq7C,EAAS50C,EAAem9G,IAE9C73C,GAAgBr1D,EAAAA,EAAAA,cAAata,IAC3BwxE,EAAAA,EAAsBxxE,EAAGsmB,EAAAA,GAAUoxC,SAAS+Z,QAAUs2C,KACtDklK,GACJ,GACD,CAACllK,EAAeklK,IAEbC,GAAc5yQ,EAAAA,EAAAA,cAAyDta,IACzEA,EAAEyK,iBACFwiR,GAAY,GACb,CAACA,IAEEE,GAAc7yQ,EAAAA,EAAAA,cAAyDta,IACzEA,EAAEyK,iBACF+8G,GAAQ,GACT,CAACA,IAOJ,OALAvhE,EAAAA,EAAAA,YAAU,KACNljD,SAASq7D,iBAAiB,UAAWuR,GAC9B,IAAM5sE,SAASu7D,oBAAoB,UAAWqR,KACtD,CAACA,IAGA9uE,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,uCAChBb,KAAMA,EACNc,OAAQyqC,EACRxqC,SAAUA,EACVE,KAAK,OACL,kBAAgB,6BAChB/V,GAAG,yBAEHiJ,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,wCACV,aAAYuJ,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,SAChF6F,QAASq3G,GAET3mH,IAAAA,cAAA,KAAGC,UAAU,0BAEjBD,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,0BAEHiJ,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,yBAI3BzJ,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,CACPxN,UAAU,qBAEVD,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,OAAKC,UAAU,4BACXD,IAAAA,cAAC4mH,EAAAA,EAAK,CACF1rH,KAAK,OACLmJ,YAAamF,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,SAC1E9G,SAAUkkH,EACVrjH,MAAOrD,EACP,cAAY,YACZiH,WAAW,EACX0/G,cAAe,CAAC5rH,KAAM6rH,EAAAA,GAAW11G,MAAO7N,MAAO4iH,MAGvDpmH,IAAAA,cAAA,OAAKC,UAAU,+BACXD,IAAAA,cAAC4mH,EAAAA,EAAK,CACF1rH,KAAK,OACLmJ,YAAamF,EAAc,CAACzS,GAAI,4BAA6B0S,eAAgB,YAC7E9G,SAAUqkH,EACVxjH,MAAO4/E,EACP,cAAY,YACZ0jC,cAAe,CAAC5rH,KAAM6rH,EAAAA,GAAW11G,MAAO7N,MAAO2iH,MAGvDnmH,IAAAA,cAAA,OAAKC,UAAU,0BAEPimH,GACAlmH,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,KAAGC,UAAU,4BACbD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,iCACH0S,eAAe,oCAI3BzJ,IAAAA,cAAA,UACIsP,QAASg9Q,EACTrsR,UAAU,oBAEVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,UAGvBzJ,IAAAA,cAACgpK,EAAAA,EAAU,CACPjyK,GAAG,YACHoiD,OAAQA,EACR9xC,UAAW6/G,IACX53G,QAAS+8Q,EACT5iR,eAAgBD,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,iBACpFy/J,cAAe1/J,EAAc,CAACzS,GAAI,kCAAmC0S,eAAgB,mBAKjG,EAEdmiR,EAAAvjR,UAAA,CAlOEuE,SAAQ9G,IAAAA,KAAAC,WACRq4C,QAAOt4C,IAAAA,OAAAC,WAEPq/F,mBAAkBt/F,IAAAA,KAAAC,WAClBhD,QAAO+C,IAAAA,MAAA,CACHsmR,WAAUtmR,IAAAA,KAAAC,WACV8M,UAAS/M,IAAAA,KAAAC,aAAAA,YA8NjB,QAAe/F,IAAAA,KAAW4rR,GCtN1B,GAAe9jR,EAAAA,EAAAA,UAjBf,SAA6BxP,EAAoBoH,GAG7C,MAAO,CACHiuC,OAHUO,EAAAA,EAAAA,IAAS51C,EAAOoH,EAAM0+C,SAKxC,IAEA,SAA4B/nD,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBokR,WAAU,KACVv5Q,UAASA,EAAAA,GACVxc,GAEX,GAEA,CAAgEu1R,G,0BCGhE,MAAMW,EAA8B7sR,IAChC,MAAM,MACFiuC,EAAK,cACL6+O,EAAa,cACb1mQ,EAAa,qBACbilQ,EAAoB,qBACpB0B,EAAoB,mBACpBrnL,EAAkB,iBAClBJ,EAAgB,SAChBp4F,EAAQ,QACR7J,GACArD,EAEEgtR,GAAqBjzQ,EAAAA,EAAAA,cAAY,KACnC1W,EAAQ8P,UAAU,CACdC,QAASC,EAAAA,GAAiB45Q,iBAC1B15Q,WAAY24Q,EACZ14Q,YAAa,CACTkrC,QAASzQ,EAAM52C,GACfquG,mBAAoBJ,KAG5Bp4F,GAAU,GACX,CAAC7J,EAAQ8P,UAAW86B,EAAM52C,GAAIiuG,EAAkBp4F,IAE7CggR,GAAanzQ,EAAAA,EAAAA,cAAYljB,gBACrBwM,EAAQioR,qBAAqBr9O,EAAM52C,GAAI,CAAC+uB,IAAgB5Z,MAAK,KAC/D6+Q,GAAsB,GACxB,GACH,CAACp9O,EAAM52C,GAAIgM,EAAQioR,qBAAsBD,EAAsBjlQ,IAE5D+mQ,GAAYpzQ,EAAAA,EAAAA,cAAYljB,gBACpBwM,EAAQ0oR,gBAAgB99O,EAAM52C,GAAI,CAAC+uB,IAAgB5Z,MAAK,KAC1DugR,GAAsB,GACxB,GACH,CAAC9+O,EAAM52C,GAAIgM,EAAQ0oR,gBAAiBgB,EAAsB3mQ,IAEvDwgQ,GAAe7sQ,EAAAA,EAAAA,cAAYljB,gBACvBwM,EAAQujR,aAAa34O,EAAM52C,IAAImV,MAAK,KACtCk5F,IACAx4F,GAAU,GACZ,GACH,CAAC+gC,EAAM52C,GAAIgM,EAAQujR,aAAclhL,EAAoBx4F,KAElD,cAACpD,IAAiBgQ,EAAAA,EAAAA,WAExB,OACIxZ,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAACka,EAAAA,EAAW,CACRrV,YAAY,EACZgtI,yBAAyB,EACzB96I,GAAE,wBAAA4J,OAA0BgtC,EAAM52C,KAElCiJ,IAAAA,cAAA,UAAQC,UAAU,gBACdD,IAAAA,cAAA,KACIC,UAAU,0BACV,aAAYuJ,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,YAGxFzJ,IAAAA,cAAC4Z,EAAAA,EAAI,CACDO,UAAU,EACV2mD,QAAQ,EACR1mD,UAAWxZ,EAAAA,GAAsB,CAAC7J,GAAI,gCAAiC0S,eAAgB,uBAEvFzJ,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ3nG,KAAMnM,EAAMotR,sBACZx9Q,QAASo9Q,EACTliR,KAAM5J,EAAAA,GAAsB,CAAC7J,GAAI,gCAAiC0S,eAAgB,iBAClFpC,UAAU,IAEdrH,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ3nG,KAAMnM,EAAMqtR,wBAA0BP,EACtCl9Q,QAASu9Q,EACTriR,KAAM5J,EAAAA,GAAsB,CAAC7J,GAAI,8BAA+B0S,eAAgB,eAChFpC,UAAU,IAEdrH,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ3nG,KAAMnM,EAAMurR,wBAA0BuB,EACtCl9Q,QAASs9Q,EACTpiR,KAAM5J,EAAAA,GAAsB,CAAC7J,GAAI,+BAAgC0S,eAAgB,gBACjFpC,UAAU,EACVosG,aAAa,IAEjBzzG,IAAAA,cAAC4Z,EAAAA,EAAK45F,WAAU,CACZ3nG,KAAMnM,EAAMstR,yBACZ19Q,QAASg3Q,EACT97Q,KAAM5J,EAAAA,GAAsB,CAAC7J,GAAI,iCAAkC0S,eAAgB,kBACnFpC,UAAU,EACVosG,aAAa,MAIvB,EAEZ84K,EAAAlkR,UAAA,CAjHEuE,SAAQ9G,IAAAA,KAAAC,WACRq/F,mBAAkBt/F,IAAAA,KAAAC,WAClBi/F,iBAAgBl/F,IAAAA,KAAAC,WAChB+mR,sBAAqBhnR,IAAAA,KAAAC,WACrBgnR,sBAAqBjnR,IAAAA,KAAAC,WACrBklR,uBAAsBnlR,IAAAA,KAAAC,WACtBinR,yBAAwBlnR,IAAAA,KAAAC,WACxBymR,cAAa1mR,IAAAA,KAAAC,WACb+f,cAAahgB,IAAAA,OAAAC,WACb0mR,qBAAoB3mR,IAAAA,KAAAC,WACpBglR,qBAAoBjlR,IAAAA,KAAAC,WACpBhD,QAAO+C,IAAAA,MAAA,CACH+M,UAAS/M,IAAAA,KAAAC,WACTilR,qBAAoBllR,IAAAA,KAAAC,WACpB0lR,gBAAe3lR,IAAAA,KAAAC,WACfugR,aAAYxgR,IAAAA,KAAAC,aAAAA,YAoGpB,QAAe/F,IAAAA,KAAWusR,GCvG1B,GAAezkR,EAAAA,EAAAA,UAjBf,SAAyBxP,GACrB,MAAO,CACHwtB,eAAevL,EAAAA,EAAAA,IAAiBjiB,GAExC,IAEA,SAA4BjC,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAAS,IACTm4Q,qBAAoB,KACpBS,gBAAe,KACfnF,aAAYA,EAAAA,IACbjwR,GAEX,GAEA,CAA4Dk2R,GCStDU,EAA2B90R,IAepB,IAfqB,QAC9BimD,EAAO,MACPzQ,EAAK,SACL/gC,EAAQ,mBACRw4F,EAAkB,iBAClBJ,EAAgB,sBAChB8nL,EAAqB,sBACrBC,EAAqB,uBACrB9B,EAAsB,yBACtB+B,EAAwB,yBACxBE,EAAwB,cACxBV,EAAa,qBACbC,EAAoB,qBACpB1B,EAAoB,QACpBhoR,GACI5K,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElB2zQ,GAAqB1zQ,EAAAA,EAAAA,cAAY,KACnC1W,EAAQ8P,UAAU,CACdC,QAASC,EAAAA,GAAiBq6Q,mBAC1Bn6Q,WAAYo4Q,EACZn4Q,YAAa,CACTkrC,UACAgnD,mBAAoBJ,KAG5Bp4F,GAAU,GACX,CAAC7J,EAAQ8P,UAAWurC,EAASxxC,EAAUo4F,IAEpCuhL,GAAe9sQ,EAAAA,EAAAA,cAAYljB,gBACvBwM,EAAQwjR,aAAanoO,EAAQ,GACpC,CAACr7C,EAAQwjR,aAAcnoO,IAEpBivO,GAAc5zQ,EAAAA,EAAAA,cAAY,IACrBqzQ,GACCC,GACA9B,GACA+B,GACT,CAACF,EAAuBC,EAAuB9B,EAAwB+B,IAEpEM,GAAa7zQ,EAAAA,EAAAA,cAAY,IACvBk0B,EAEI3tC,IAAAA,cAACyM,EAAAA,MAAMa,MAAK,CACRC,eAAe,KACfxW,GAAG,wBAEF42C,EAAM9tC,aAEH8tC,EAAM7pB,UAAY,GAClB9jB,IAAAA,cAAA,KAAGC,UAAU,+BAKrBD,IAAAA,cAAAA,IAAAA,SAAA,OACT,CAAC2tC,IAEE4/O,GAAkB9zQ,EAAAA,EAAAA,cAAY,IAC5BszQ,EAEI/sR,IAAAA,cAAA,UACIC,UAAU,gCACVqP,QAAS69Q,GAETntR,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,8BACH0S,eAAe,gBAKvBzJ,IAAAA,cAAAA,IAAAA,SAAA,OACT,CAAC+sR,EAAuBI,IAErBK,GAAqB/zQ,EAAAA,EAAAA,cAAY,IAC/ByzQ,EAEIltR,IAAAA,cAAA,UACIC,UAAU,4CACVqP,QAASi3Q,GAETvmR,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,wCACH0S,eAAe,mBAKvBzJ,IAAAA,cAAAA,IAAAA,SAAA,OACT,CAACktR,EAA0B3G,IAuBxB5/J,GAASltG,EAAAA,EAAAA,cAAY,KACvB2rF,IACAx4F,GAAU,GACX,CAACw4F,EAAoBx4F,IAExB,OACI5M,IAAAA,cAACyM,EAAAA,MAAMS,OAAM,CAACC,aAAa,GACvBnN,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAAA,UACI9E,KAAK,SACL+E,UAAU,wCACV,aAAYuJ,EAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,SAChF6F,QAASq3G,GAET3mH,IAAAA,cAAA,KACIC,UAAU,0BAGjBqtR,KAELttR,IAAAA,cAAA,OAAKC,UAAU,6BACVstR,IACAC,IA1CL7/O,GAAS0/O,IAELrtR,IAAAA,cAACusR,EAA0B,CACvB5+O,MAAOA,EACP6+O,cAAeA,EACfzB,qBAAsBA,EACtB0B,qBAAsBA,EACtBrnL,mBAAoBA,EACpBJ,iBAAkBA,EAClBp4F,SAAUA,EACVkgR,sBAAuBA,EACvBC,sBAAuBA,EACvB9B,uBAAwBA,EACxB+B,yBAA0BA,IAI/B,MA4BQ,EAErBC,EAAA5kR,UAAA,CAnKE+1C,QAAOt4C,IAAAA,OAAAC,WAEP6G,SAAQ9G,IAAAA,KAAAC,WACRq/F,mBAAkBt/F,IAAAA,KAAAC,WAClBi/F,iBAAgBl/F,IAAAA,KAAAC,WAChB+mR,sBAAqBhnR,IAAAA,KAAAC,WACrBgnR,sBAAqBjnR,IAAAA,KAAAC,WACrBklR,uBAAsBnlR,IAAAA,KAAAC,WACtBinR,yBAAwBlnR,IAAAA,KAAAC,WACxBmnR,yBAAwBpnR,IAAAA,KAAAC,WACxBymR,cAAa1mR,IAAAA,KAAAC,WACb0mR,qBAAoB3mR,IAAAA,KAAAC,WACpBglR,qBAAoBjlR,IAAAA,KAAAC,WACpBhD,QAAO+C,IAAAA,MAAA,CACH+M,UAAS/M,IAAAA,KAAAC,WACTilR,qBAAoBllR,IAAAA,KAAAC,WACpB0lR,gBAAe3lR,IAAAA,KAAAC,WACfugR,aAAYxgR,IAAAA,KAAAC,WACZwgR,aAAYzgR,IAAAA,KAAAC,aAAAA,YAmJpB,QAAe/F,IAAAA,KAAWitR,GClI1B,GAAenlR,EAAAA,EAAAA,UAjCf,SAAyBxP,EAAoB2hC,GACzC,MAAMuyP,GAAgBiB,EAAAA,EAAAA,IAAUn1R,EAAO2hC,EAASmkB,SAC1CzQ,GAAQu9O,EAAAA,EAAAA,IAAa5yR,EAAO2hC,EAASmkB,SAQ3C,MAAO,CACH0uO,uBAP0B3B,EAAAA,EAAAA,GAAqB7yR,EAAO2hC,EAASmkB,QAASvxB,EAAAA,GAAY6gQ,mBAQpFX,uBAP0B5B,EAAAA,EAAAA,GAAqB7yR,EAAO2hC,EAASmkB,QAASvxB,EAAAA,GAAYu+P,6BAQpFH,wBAP2BE,EAAAA,EAAAA,GAAqB7yR,EAAO2hC,EAASmkB,QAASvxB,EAAAA,GAAYu+P,6BAQrF4B,0BAP6B7B,EAAAA,EAAAA,GAAqB7yR,EAAO2hC,EAASmkB,QAASvxB,EAAAA,GAAY8gQ,qBAQvFT,0BAP6B/B,EAAAA,EAAAA,GAAqB7yR,EAAO2hC,EAASmkB,QAASvxB,EAAAA,GAAY+gQ,sBAQvFpB,gBACA7+O,QAER,IAEA,SAA4Bt3C,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAAS,IACTm4Q,qBAAoB,KACpBS,gBAAe,KACfnF,aAAY,KACZC,aAAYA,EAAAA,IACblwR,GAEX,GAEA,CAA4D42R,G,yZCF7C,MAAM9nL,UAA2BnlG,IAAAA,cAI5CsC,WAAAA,CAAY5C,GAAc,IAAAmuR,EACtBtrR,MAAM7C,GAAO8C,EAAA,6BAaM,KACnBE,KAAKgH,SAAS,CAAC++I,YAAa/lJ,KAAKpK,MAAMmwJ,YAAc,GAAG,IAC3DjmJ,EAAA,6BAEsB,KACnBE,KAAKgH,SAAS,CAAC++I,YAAa/lJ,KAAKpK,MAAMmwJ,YAAc,GAAG,IAC3DjmJ,EAAA,eAEQ,KACLE,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAC/BrJ,EAAA,uBA4CiBwS,IACdtS,KAAKgH,SAAS,CAAC++I,YAAazzI,GAAO,IACtCxS,EAAA,kBAEW,KACRE,KAAKgH,SAAS,CAACsC,SAAS,GAAM,IACjCxJ,EAAA,qBAEc,KACXE,KAAKgH,SAAS,CAACsC,SAAS,GAAO,IAClCxJ,EAAA,qBAEerD,IACZ,MAAMy4B,EAAOz4B,EAAEq7D,OAAOh3D,MACtBd,KAAKhD,MAAMqD,QAAQ40B,mBAAmBC,EAAK,IAC9Cp1B,EAAA,wBAEiB2pD,EAAAA,EAAAA,KACd51D,UACI,MAAM,QAACwM,EAAO,QAAEq7C,GAAW17C,KAAKhD,OAC1B,KAACT,GAAQyD,KAAKpK,MACd+vR,EAAUppR,EAAO,EAEvByD,KAAKgH,SAAS,CAACzK,KAAMopR,IAErB3lR,KAAKorR,kBACC/qR,EAAQw+F,gBAAgBnjD,EAASiqO,EA5H5B,IA6HX3lR,KAAKgoJ,cAAc,GAEvB,KACA,GACA,UACHloJ,EAAA,iBAEU,KAAM,IAAAurR,EAAAC,EAAAC,EACb,MAAMhjL,GAAwC,QAAzB8iL,EAAArrR,KAAKwrR,aAAaz7Q,eAAO,IAAAs7Q,OAAA,EAAzBA,EAA2B9iL,eAAgB,IACrB,QAAzB+iL,EAAAtrR,KAAKwrR,aAAaz7Q,eAAO,IAAAu7Q,OAAA,EAAzBA,EAA2B50G,YAAa,KACZ,QAAzB60G,EAAAvrR,KAAKwrR,aAAaz7Q,eAAO,IAAAw7Q,OAAA,EAAzBA,EAA2B7sB,eAAgB,GAE/B,IAAOn2J,GAAgBvoG,KAAKhD,MAAMiuC,OAAWjrC,KAAKhD,MAAMwD,MAAMkG,SAAW1G,KAAKhD,MAAMiuC,MAAMxtB,eAAuC,IAAvBzd,KAAKpK,MAAM0T,SAClJtJ,KAAKyrR,iBACT,IACH3rR,EAAA,oBAEa,KACV,MAAM,MAACmrC,GAASjrC,KAAKhD,MAErB,OAAIiuC,EAEI3tC,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,QAAMC,UAAU,cAAY,IAAAU,OAAMgtC,EAAMxtC,OAEpCwtC,EAAMv9B,OAAOnN,gBAAkBihF,EAAAA,GAAYC,MAC3CnkF,IAAAA,cAAA,QAAMC,UAAU,gBACZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,mCACH0S,eAAe,qBAO/BzJ,IAAAA,cAAAA,IAAAA,SAAA,KAAK,IAhIb0C,KAAKwrR,cAAe7jJ,EAAAA,EAAAA,aACpB3nI,KAAKs4C,gBAAkB,EACvBt4C,KAAKpK,MAAQ,CACT2G,KAAM,EACN+M,SAAS,EACTH,MAAM,EACN85Q,eAAgB,MAChBl9H,aAAwB,QAAXolI,EAAAnuR,EAAMiuC,aAAK,IAAAkgP,OAAA,EAAXA,EAAa1tQ,eAAgB,EAElD,CAcA,uBAAM86B,GACF,MAAM,QACFmD,EAAO,QACPr7C,GACAL,KAAKhD,YAEHqrB,QAAQyuB,IAAI,CACdz2C,EAAQmrC,SAASkQ,GAAS,GAC1Br7C,EAAQw+F,gBAAgBnjD,EAAS,EAhEtB,MAkEf17C,KAAKgoJ,cACT,CAEA1qF,oBAAAA,GACIt9D,KAAKhD,MAAMqD,QAAQ40B,mBAAmB,GAC1C,CAEAwjB,kBAAAA,CAAmBC,GAAkB,IAAAgzO,EAAAC,EAoBqCC,EAnBtE,GAAIlzO,EAAUd,aAAe53C,KAAKhD,MAAM46C,WAAY,CAChD/E,aAAa7yC,KAAKs4C,iBAClB,MAAMV,EAAa53C,KAAKhD,MAAM46C,WAE9B,GAAmB,KAAfA,EAGA,OAFA53C,KAAKgoJ,oBACLhoJ,KAAKs4C,gBAAkB,GAI3B,MAAMA,EAAkBtpC,OAAOuZ,YAC3B10B,gBACU6kD,EAAUr4C,QAAQy7C,eAAelE,EAAY,CAACmqD,YAAa/hG,KAAKhD,MAAM0+C,SAAS,GAEzF34B,EAAAA,GAAU41B,6BAGd34C,KAAKs4C,gBAAkBA,CAC3B,EACmB,QAAfozO,EAAAhzO,EAAUzN,aAAK,IAAAygP,OAAA,EAAfA,EAAiBjuQ,iBAAiC,QAArBkuQ,EAAK3rR,KAAKhD,MAAMiuC,aAAK,IAAA0gP,OAAA,EAAhBA,EAAkBluQ,eACpDzd,KAAK6rR,gBAA+B,QAAhBD,EAAA5rR,KAAKhD,MAAMiuC,aAAK,IAAA2gP,OAAA,EAAhBA,EAAkBnuQ,eAAgB,EAE9D,CAoEAxa,MAAAA,GACI,MAAM,QAACy4C,EAAO,MAAEzQ,EAAK,MAAEzqC,EAAK,SAAE0J,GAAYlK,KAAKhD,MAE/C,OACIM,IAAAA,cAACyM,EAAAA,MAAK,CACFC,gBAAgB,qCAChBb,KAAMnJ,KAAKpK,MAAMuT,KACjBc,OAAQjK,KAAK00C,OACbxqC,SAAUA,EACVE,KAAK,OACL,kBAAgB,2BAEhB9M,IAAAA,cAACitR,EAAwB,CACrBrgR,SAAUA,EACVwxC,QAASA,EACTgnD,mBAAoB1iG,KAAKhD,MAAM0lG,mBAC/BJ,iBAAkBtiG,KAAKhD,MAAMslG,iBAC7BynL,qBAAsB/pR,KAAK+pR,qBAC3B1B,qBAAsBroR,KAAKqoR,uBAE/B/qR,IAAAA,cAACyM,EAAAA,MAAMgB,KAAI,KACN/K,KAAKwkG,eACc,IAAjBhkG,EAAMkG,QAAiB1G,KAAKhD,MAAM46C,YAAe53C,KAAKpK,MAAM0T,UAAa2hC,EAKxE3tC,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAC4mH,EAAAA,EAAK,CACF1rH,KAAK,OACLmJ,aAAa6K,EAAAA,EAAAA,eAAc,CAACnY,GAAI,gCAAiC0S,eAAgB,yBACjF9G,SAAUD,KAAKq1O,aACfv0O,MAAOd,KAAKhD,MAAM46C,WAClB,cAAY,cACZr6C,UAAW,0BACXmxH,YAAapxH,IAAAA,cAAA,KAAGC,UAAW,yBAGnCD,IAAAA,cAAA,OACIC,UAAU,+CACVuiI,SAAU9/H,KAAK8/H,SACf5nF,IAAKl4C,KAAKwrR,cAES,IAAjBhrR,EAAMkG,QACRpJ,IAAAA,cAAA,MAAIC,UAAU,sBACVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,oCACH0S,eAAe,sEACfjB,OAAQ,CACJ2X,aAAczd,KAAKpK,MAAMmwJ,gBAKlB,IAAjBvlJ,EAAMkG,QAAgB1G,KAAKhD,MAAM46C,YACnCt6C,IAAAA,cAAC+iG,EAAAA,EAAkB,CACf1b,QAAS2b,EAAAA,EAAiBwmC,OAC1BtmC,YAAa,CAACtjG,YAAa,GAAFe,OAAK+B,KAAKhD,MAAM46C,eAG5Cp3C,EAAMG,KAAKD,GAEJpD,IAAAA,cAAC6qR,EAAqB,CAClBzsO,QAASA,EACTh7C,KAAMA,EACN2nR,qBAAsBroR,KAAKqoR,qBAC3BrtR,IAAK0F,EAAKrM,OAKlB2L,KAAKpK,MAAM0T,SACXhM,IAAAA,cAACmjJ,EAAAA,EAAa,QAlD1BnjJ,IAAAA,cAAC+iG,EAAAA,EAAkB,CACf1b,QAAS2b,EAAAA,EAAiBsnE,oBAyDlD,ECxNJ,SAAexiK,EAAAA,EAAAA,UA/Bf,SAAyBxP,EAAoB2hC,GACzC,MAAMqgB,EAAahiD,EAAM8kD,MAAMx6B,OAAOy6B,YAEhC1P,GAAQu9O,EAAAA,EAAAA,IAAa5yR,EAAO2hC,EAASmkB,SAE3C,IAAIl7C,EAAuB,GAO3B,OALIA,EADAo3C,GACQk0O,EAAAA,EAAAA,IAAsBl2R,EAAO2hC,EAASmkB,QAAS9D,IAE/Cm0O,EAAAA,EAAAA,IAAmBn2R,EAAO2hC,EAASmkB,SAGxC,CACHzQ,QACAzqC,QACAo3C,aAER,IAEA,SAA4BjkD,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxBkmC,SAAQ,KACRqzD,gBAAe,KACf5pE,mBAAkB,KAClB9kB,UAAS,IACT2rC,eAAcA,EAAAA,GACfnoD,GAEX,GAEA,CAA4D8uG,E,sEClD7C,SAASynG,EAAYltM,GAChC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,kBAExEzJ,IAAAA,cAAA,QAAM4gD,EAAE,4WAIxB,C,sECfe,SAAS0mH,EAAqB5nK,GACzC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,sBAAuB0S,eAAgB,gBAEtEzJ,IAAAA,cAAA,QACI4gD,EAAE,iNAKtB,C,sECjBe,SAASknC,EAAUpoF,GAC9B,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,sBAAuB0S,eAAgB,gBAEtEzJ,IAAAA,cAAA,QACIwhD,SAAS,UACTZ,EAAE,uHAKtB,C,2DCjBA,MAAM+rE,EAAajtH,GAEXM,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAW,cAEX9M,IAAAA,cAAA,QAAM4gD,EAAE,w8DAMxB,GAAe2O,EAAAA,EAAAA,MAAKo9D,E,sECjBL,SAAS/Y,IACpB,MAAM,cAACpqG,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,KACIC,UAAU,mBACViO,MAAO1E,EAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,mBAGhF,C,sECRe,SAAS2pJ,IACpB,MAAM,cAAC5pJ,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,KACIC,UAAU,sBACViO,MAAO1E,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,eAG5E,C,sECRe,SAASytI,IACpB,MAAM,cAAC1tI,IAAiBgQ,EAAAA,EAAAA,WAExB,OACIxZ,IAAAA,cAAA,KACIC,UAAU,cACViO,MAAO1E,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,kBAG/E,C,sECTe,SAASg3L,EAAS/gM,GAC7B,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,eAErEzJ,IAAAA,cAAA,QAAM4gD,EAAE,iSAIxB,C,sECde,SAASrJ,EAAe73C,GACnC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACI2hD,QAAQ,MACRhoB,EAAE,MACFsnB,EAAE,MACFd,QAAQ,cACR6xI,iBAAiB,kBACjBllL,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,qBAE3EzJ,IAAAA,cAAA,SACIA,IAAAA,cAAA,SACIA,IAAAA,cAAA,QACIoN,MAAOA,EACPwzC,EAAE,+QAGV5gD,IAAAA,cAAA,QACIoN,MAAOA,EACPwzC,EAAE,8ZAM1B,CAEA,MAAMxzC,EAAuB,CACzBo0C,SAAU,UACVC,SAAU,U,sECjCC,SAAS8yH,EAAW70K,GAC/B,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqO,MAAM,OACNC,OAAO,OACP6xC,QAAQ,YACR,aAAY32C,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,iBAEvEzJ,IAAAA,cAAA,KACI6gD,OAAO,OACPM,YAAY,IACZf,KAAK,UACLoB,SAAS,WAETxhD,IAAAA,cAAA,KACI0gD,UAAU,sCACVN,KAAK,WAELpgD,IAAAA,cAAA,KAAG0gD,UAAU,+HACT1gD,IAAAA,cAAA,KAAG0gD,UAAU,kCACT1gD,IAAAA,cAAA,QACI4gD,EAAE,kiCACFF,UAAU,2FAEd1gD,IAAAA,cAAA,QACI4gD,EAAE,s5CACFF,UAAU,gGAS9C,C,sECrCe,SAAS+9N,EAAgB/+Q,GACpC,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAA,OAAUN,EACNM,IAAAA,cAAA,OACIqgD,MAAM,6BACNhyC,MAAM,KACNC,OAAO,KACP6xC,QAAQ,YACRrzC,KAAK,MACL,aAAYtD,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,qBAE3EzJ,IAAAA,cAAA,QAAM4gD,EAAE,yFAIxB,C,8hBCLO,IAAKi5H,EAAI,SAAJA,GAAI,OAAJA,EAAI,gBAAJA,EAAI,cAAJA,CAAI,MA4BhB,MAAMjzD,EAAQ5mH,IAAAA,YAAiB,CAAA7H,EA8B3ByiD,KACC,IA9BD,KACIz6C,EAAI,MACJqD,EAAK,MACL5B,EAAK,YACLyC,EAAW,UACXy1K,GAAY,EAAI,UAChB75K,EAAS,SACTu5E,EAAQ,SACRq8C,EAAQ,MACRJ,EAAK,WACLC,EAAU,YACVtE,EAAW,YACXs9J,EAAW,mBACXn9H,EAAkB,iBAClBo9H,EAAgB,eAChB/lL,EAAc,MACdyO,EAAK,cACLyP,EAAa,UACb9/G,EAAS,UACT4yK,EAAYC,EAAKnmJ,OAAM,SACvBrsB,EAAQ,UACRy+F,EAAS,qBACTmyH,EAAoB,QACpBhhJ,EAAO,OACPD,EAAM,SACNr0E,EAAQ,QACRojG,GAES5tG,EADNkhF,E,qWAAUx5B,CAAA1nD,EAAA2nD,GAIjB,MAAM,cAACt2C,IAAiBgQ,EAAAA,EAAAA,YAEjB+uF,EAASutB,IAAcv8G,EAAAA,EAAAA,WAAS,IAChCw8G,EAAkBC,IAAuBz8G,EAAAA,EAAAA,UAAiC,OAEjF6rC,EAAAA,EAAAA,YAAU,KACF0hE,QAUAA,SAAyDv6G,QAAQu6G,EAActjH,QAC/EwyH,EAAoBlP,GAVK,OAArBiP,GAIAC,EAAoBlP,GAAiB,KAO7C,GACD,CAACA,IAEJ,MAAM8nK,EAAiB/2Q,IACnBi+G,GAAW,GAEP7+C,GACAA,EAAQp/D,EACZ,EAGEg3Q,EAAgBh3Q,IAClBi+G,GAAW,GACXK,IAEIn/C,GACAA,EAAOn/D,EACX,EAGEyhK,EAAkBzhK,IACpBm+G,EAAoB,MAEhBrzH,GACAA,EAASkV,EACb,EAGE0hK,EAAgBA,KACdxzE,GACAA,GACJ,EAGEowB,EAAgBA,KAClB,IAAKN,GAAuB,OAAVryH,GAA4B,KAAVA,EAChC,OAEJ,MAAM4yH,EAAqB5sH,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,2BACvFusH,EAAoB,CAAC96H,KAAM6rH,EAAAA,GAAW11G,MAAO7N,MAAO4yH,GAAoB,EAGtEE,EAAa/pH,QAAQg8F,GAAW/kG,GAChC9M,EAAmC,WAA3Bq/H,aAAgB,EAAhBA,EAAkB76H,MAC1B4zR,EAAgBz3K,GAAS7zG,IAAU4C,MAAMC,QAAQ7C,GAASA,EAAMQ,WAAWoF,OAASiuG,EAAQ,EAE5F+Q,EAAc5kH,GAASsiG,EACzB9lG,IAAAA,cAAA,OACIC,UAAU,eACVs3I,YAAagiC,EACb74G,WAAY64G,GAEZv5K,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO+pN,GAAwBzuN,EAAc,CAACzS,GAAI,qBAAsB0S,eAAgB,WAExFzJ,IAAAA,cAAC+uR,EAAAA,gBAAe,CAACjuR,KAAM,OAG/B,KA4CJ,OACId,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,kBAAmBo6G,EAAoB,CAAClqJ,cAC/DrH,IAAAA,cAAA,YACIC,UAAWk3C,IAAW,iBAAkBl3C,EAAW,CAC/Cu2H,uBAAwB9/H,GAAS8iF,GAAYs1M,EAAgB,EAC7Dr4J,wBAAyBH,KAG5BwjD,GACG95K,IAAAA,cAAA,UAAQC,UAAWk3C,IAAW,eAAgB,CAACu/E,qBAAsBJ,KAChEA,GAAauyC,EAAAA,EAAAA,IAAer/J,EAAe5H,GAASyC,GAAe,MAG5ErE,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,gBAAiBw3O,IACvCv9J,EACAsE,GAAc11H,IAAAA,cAAA,YAAO01H,GAzDhBs5J,MAClB,MAAMC,GAAmBpmH,EAAAA,EAAAA,IAAer/J,EAAe++F,EAAW3mG,GAASyC,GAAgBzC,EAAQA,GAASyC,GACtG+V,GAAYyuJ,EAAAA,EAAAA,IAAer/J,EAAe5H,GAASyC,GAEzD,MAAwB,aAApBg1E,EAAWn+E,KAEP8E,IAAAA,cAAA,WAAAI,OAAAC,OAAA,CACIu6C,IAAKA,EACL7jD,GAAE,SAAA4J,OAAWR,GAAQ,IACrBF,UAAWk3C,IAAW,qBAAsByiI,EAAWhxE,EAAgB,CAAC+tB,aAAcL,IACtF9yH,MAAOA,EACPa,YAAa4qR,EACb,aAAY70Q,EACZmxF,KAAM,EACNprG,KAAMA,EACNkH,SAAUA,GACNgyE,EAAU,CACdryE,UAAWqwG,OAAQr8G,EAAYgM,EAC/BiwE,QAAS23M,EACT53M,OAAQ63M,EACRlsR,SAAU22K,KAIlBt5K,IAAAA,cAAA,QAAAI,OAAAC,OAAA,CACIu6C,IAAKA,EACL7jD,GAAE,SAAA4J,OAAWR,GAAQ,IACrBF,UAAWk3C,IAAW,qBAAsByiI,EAAWhxE,EAAgB,CAAC+tB,aAAcL,IACtF9yH,MAAOA,EACPa,YAAa4qR,EACb,aAAY70Q,EACZja,KAAMA,EACNkH,SAAUA,GACNgyE,EAAU,CACdryE,UAAWqwG,OAAQr8G,EAAYgM,EAC/BiwE,QAAS23M,EACT53M,OAAQ63M,EACRlsR,SAAU22K,IACZ,EAoBO01G,GACAF,EAAgB,GACb9uR,IAAAA,cAAA,QAAMC,UAAU,wBACX,IAAK6uR,GAGbJ,EACAtmK,GAEJqN,GAEJM,GACG/1H,IAAAA,cAAA,OAAKC,UAAS,iCAAAU,OAAmCo1H,EAAiB76H,OAC7D66H,EAAiB76H,MACd8E,IAAAA,cAAA,KACIC,UAAWk3C,IAAW,QAADx2C,OAASo1H,EAAiB76H,MAAQ,CACnD,qBAAsB66H,EAAiB76H,OAAS6rH,EAAAA,GAAWiyB,QAC3D,4BAA6BjjB,EAAiB76H,OAAS6rH,EAAAA,GAAW11G,MAClE,2BAA4B0kH,EAAiB76H,OAAS6rH,EAAAA,GAAWkyB,KACjE,aAAcljB,EAAiB76H,OAAS6rH,EAAAA,GAAW99F,YAG/DjpB,IAAAA,cAAA,YAAO+1H,EAAiBvyH,QAG9B,IAEXojH,EAAAv+G,UAAA,CAvNCwtH,SAAQ/vH,IAAAA,KACR0zE,SAAQ1zE,IAAAA,KACR2vH,MAAK3vH,IAAAA,QACL4vH,WAAU5vH,IAAAA,OACVsrH,YAAWtrH,IAAAA,QACX4oR,YAAW5oR,IAAAA,QAGXyrJ,mBAAkBzrJ,IAAAA,OAClB6oR,iBAAgB7oR,IAAAA,OAChB8iG,eAAc9iG,IAAAA,OACduxG,MAAKvxG,IAAAA,OACLg0K,UAASh0K,IAAAA,KACTghH,cAAahhH,IAAAA,UAAA,CAAAA,IAAAA,MAAA,CAhBqB5K,KAAI4K,IAAAA,MAAA,CAAG,OAAS,QAAU,UAAY,YAAWtC,MAAKsC,IAAAA,KAAAC,aAAAD,IAAAA,MAAA,UAiBxF8zK,UAAS9zK,IAAAA,MAAA,oBACTggG,UAAShgG,IAAAA,KACTmyN,qBAAoBnyN,IAAAA,OACpBigG,QAAOjgG,IAAAA,MAwMX,S,qGCpOA,MAAM8H,EAAiBzV,IAA0B,IAAzB,KAACqS,EAAI,MAAE4C,GAAajV,EACxC,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAExB,OACIxZ,IAAAA,cAAA,QACIjJ,GAAG,iBACHkJ,UAAWk3C,IAAW,iBAAkB,CAAC,YAAa5qC,QAAQ/B,KAC9D4C,MAAOA,EACP,cAAY,kBAEZpN,IAAAA,cAAA,QACIC,UAAU,uCACViO,MAAO1E,EAAc,CAACzS,GAAI,wBAAyB0S,eAAgB,oBAEtEo+J,EAAAA,EAAAA,IAAkBr9J,GAChB,EAIf,EAAexK,IAAAA,KAAW4N,E,0FCnB1B,MAAM0nK,EAAiBn9K,IAA6C,IAA5C,QAAC6T,GAAU,EAAI,KAAExB,EAAI,SAAE6pD,GAAgBl8D,EAC3D,OACI6H,IAAAA,cAAAA,IAAAA,SAAA,KACKgM,EAAUhM,IAAAA,cAAC4N,EAAAA,EAAc,CAACpD,KAAMA,IAAU6pD,EAC5C,EAETihH,EAAAjtK,UAAA,CAXE2D,QAAOlG,IAAAA,KAEPuuD,SAAQvuD,IAAAA,MAWZ,QAAe9F,IAAAA,KAAWs1K,E,4DCXnB,SAASvuH,IACZ,OAAOC,EAAAA,EAAAA,IAAgB1wD,EAAAA,QAAMqf,WACjC,C,wICEA,MAAMu5Q,EAAa/2R,IAAgC,IAA/B,SAACk8D,EAAQ,QAAE/kD,GAAenX,EAC1C,OACI6H,IAAAA,cAAA,MACIC,UAAU,aACVqP,QAASA,GAER+kD,EACA,EAEX66N,EAAA7mR,UAAA,CAhBEgsD,SAAQvuD,IAAAA,KACRwJ,QAAOxJ,IAAAA,MAiBX,QAAe9F,IAAAA,KAAWkvR,G,mKCC1B,MAAMC,EAAiBh3R,IAAqC,IAApC,GAACpB,GAAUoB,EAC/B,MAAM0d,GAAekhC,EAAAA,EAAAA,aAAYjhC,EAAAA,IAC3B66E,GAAsB55C,EAAAA,EAAAA,aAAY65C,EAAAA,IAClC1jE,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtB92B,GAAWsxD,EAAAA,EAAAA,eAEX0mC,EAA6B,UAAnBnhE,aAAO,EAAPA,EAASwU,OACnBysD,EAA8C,UAAhCt4E,aAAY,EAAZA,EAAc+5E,eAC5Bw/L,EAAkB30M,IAAO5kE,aAAY,EAAZA,EAAcu5E,cAAchC,OAAO,WAC5DzB,GAAU50C,EAAAA,EAAAA,aAAY7T,EAAAA,IACtBuoD,GAAmBC,EAAAA,EAAAA,KAEnB2jM,EAAyB94R,gBACrBF,GAASwc,EAAAA,EAAAA,GAAU,CACrBC,QAASC,EAAAA,GAAiBsmF,qBAC1BpmF,WAAY43O,EAAAA,UACb,EAGD9tJ,EAA0BxwF,SAAQywF,EAAAA,EAAAA,IAAiCtB,EAAAA,EAAAA,MAAetL,EAAAA,EAAAA,KAAe,KAEvG,IAAK/B,EACD,OAAO,KAGX,MAAM+7H,GAAYz5H,aAAmB,EAAnBA,EAAqB5E,OAAQC,EAAAA,GAAcC,QAE7D,GAAI8Q,IAA6BqtH,IAAcj8H,EAC3C,OAAO,KAIX,IAAKxC,IAAYwC,EACb,OAAO,KAGX,MAAMmhM,EACFtvR,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,MAAIC,UAAU,6CACVD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,sCACH0S,eAAe,sBAGvBzJ,IAAAA,cAAA,OAAKC,UAAU,+CACXD,IAAAA,cAAA,OAAKC,UAAU,6DACXD,IAAAA,cAAA,KAAGC,UAAU,uCAEjBD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,4CACH0S,eAAe,4HACfjB,OACI,CACI+mR,YAAaH,EACbI,cAAgB7/Q,GACZ3P,IAAAA,cAAA,KACIC,UAAU,uCACVqP,QAASq8E,EAAU0jM,EAAyB,IAAM5jM,EAAiB,CAACuF,iBAAkB,sBAErFrhF,QAW3B8/Q,EACFzvR,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yCACH0S,eAAe,uGACfjB,OACI,CACIgnR,cAAgB7/Q,GACZ3P,IAAAA,cAAA,KACIC,UAAU,kCACVqP,QAASA,IAAMm8E,EAAiB,CAACuF,iBAAkB,sBAElDrhF,MAQzB,OACI3P,IAAAA,cAAA,MACIC,UAAU,iBACV6M,KAAK,WACL/V,GAAIA,GAEHo3F,EAAcmhM,EAAmBG,EACjC,EAEXN,EAAA9mR,UAAA,CApGEtR,GAAE+O,IAAAA,OAAAC,YAqGN,U,cCzGO,MAAM2pR,EAAqBv3R,IAAA,IAAC,QAC/BmX,EAAO,UACP8K,EAAS,KACT5P,EAAI,UACJ6tJ,EAAS,GACTthK,EAAE,YACF2tP,EAAW,eACXnX,EAAc,YACd95H,EAAW,SACXpsG,EAAQ,QACRqyJ,EAAO,cACPx/B,GACI/hI,EAAA,OACJ6H,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,UACI,cAAajJ,EACbA,GAAIA,EACJ,aAAYqjB,EACZna,UAAWk3C,IAAW,cAAeutM,EAAa,CAC9C,sBAAuBrsF,EACvB,yBAA0BqB,EAC1BryJ,WACAsoR,oBAAqBl8K,IAEzBnkG,QAASA,EACTjI,SAAUA,GAET6yH,GAAiBl6H,IAAAA,cAAA,KAAGC,UAAS,QAAAU,OAAUu5H,KACvC1vH,GAAQxK,IAAAA,cAAA,QAAMC,UAAU,0BAA0BuK,EAAM+iO,GACxDl1E,GAAar4J,IAAAA,cAAA,QAAMC,UAAU,uBAAuBo4J,IAExDqB,EACF,EAELg2H,EAAArnR,UAAA,CA9CEiH,QAAOxJ,IAAAA,KAAAC,WACPqU,UAAStU,IAAAA,OACT0E,KAAI1E,IAAAA,KAAAC,WACJsyJ,UAASvyJ,IAAAA,OACT/O,GAAE+O,IAAAA,OACF4+O,YAAW5+O,IAAAA,OACXynO,eAAcznO,IAAAA,KACd2tG,YAAW3tG,IAAAA,KACXuB,SAAQvB,IAAAA,KACR4zJ,QAAO5zJ,IAAAA,KACPo0H,cAAap0H,IAAAA,QAsCjB,MAAM8pR,GAAiBlyM,EAAAA,EAAAA,GAASgyM,GAChCE,EAAeppR,YAAc,iBAE7B,U,qCCtCe,SAASqpR,IAAwB,IAAAC,EAAA1yK,EAAA2yK,EAAA1yK,EAC5C,MAAMhnH,GAAWsxD,EAAAA,EAAAA,eACXikC,GAAU70C,EAAAA,EAAAA,aAAY65C,EAAAA,IACtB6K,GAAQC,EAAAA,EAAAA,KACRnyF,GAAOiQ,EAAAA,EAAAA,WACPiyE,GAAmBC,EAAAA,EAAAA,MAElBr1E,IAAU+5E,EAAAA,EAAAA,KAEX4lB,EAAgB,CAClB52G,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,qCACJ0S,eAAgB,eAEpB6F,QAASA,IAAMm8E,EAAiB,CAACuF,iBAAkB,yCAEjD+kB,EAAkB,CACpB32G,SAAS8P,EAAAA,EAAAA,eAAc,CACnBnY,GAAI,gCACJ0S,eAAgB,UAEpB6F,QAASA,KACLjZ,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBi9Q,cAAc,GAGrDtyK,GAAe1gB,EAAAA,EAAAA,GAAiCvB,EAAOplF,GAC7D,IAAInI,GAAiBgB,EAAAA,EAAAA,eAAc,CAC/BnY,GAAI,8CACJ0S,eAAgB,oBAChBjB,OAAQ,CACJynR,SAAUrkM,aAAO,EAAPA,EAASzrF,QAIvBD,GAAuBgP,EAAAA,EAAAA,eAAc,CACrCnY,GAAI,+DACJ0S,eAAgB,qFAChBjB,OAAQ,CACJynR,SAAUrkM,aAAO,EAAPA,EAASzrF,KACnBod,SAAUhU,EAAKkuG,aAAsC,QAA1Bq4K,EAACz5Q,SAAgB,QAAV+mG,EAAN/mG,EAAQkH,gBAAQ,IAAA6/F,OAAV,EAANA,EAAkBtiB,eAAO,IAAAg1L,EAAAA,EAAII,EAAAA,GAAsB3yQ,SAASu9E,SACxFq1L,SAAS34K,EAAAA,EAAAA,IAAuC,QAA7Bu4K,EAAC15Q,SAAa,QAAPgnG,EAANhnG,EAAQ+X,aAAK,IAAAivF,OAAP,EAANA,EAAe9F,qBAAa,IAAAw4K,EAAAA,EAAIG,EAAAA,GAAsB9hQ,MAAMkpF,aAAc/tG,EAAKkuG,iBAgB3G,OAZIiG,GAAgBA,EAAa3mH,KAAOgnH,EAAAA,GAAW1uC,iBAC/CnhE,GAAQgB,EAAAA,EAAAA,eAAc,CAClBnY,GAAI,+DACJ0S,eAAgB,oBAGpBvJ,GAAcgP,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,qEACJ0S,eAAgB,gKAKpBzJ,IAAAA,cAAC01G,EAAAA,EAAe,CACZxnG,MAAOA,EACPhO,YAAaA,EACb81G,cAAeA,EACfD,gBAAiBA,EACjBv3B,QAASA,KACLnoF,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBi9Q,cAAc,GAInE,C,0BC3DA,MAAMI,EAAqBj4R,IAAiB,IAAhB,GAACpB,GAAUoB,EACnC,MAAM9B,GAAWsxD,EAAAA,EAAAA,eACX9xC,GAAekhC,EAAAA,EAAAA,aAAYjhC,EAAAA,IAC3BkvQ,GAAcr5L,EAAAA,EAAAA,KAAQ50C,EAAAA,EAAAA,aAAYh0B,EAAAA,IAAgB3hB,OAClDitF,GAAUt3C,EAAAA,EAAAA,aAAY+kH,EAAAA,IACtB3tE,EAA8C,UAAhCt4E,aAAY,EAAZA,EAAc+5E,gBAC3Bv5E,IAAU+5E,EAAAA,EAAAA,KACXqL,GAAQC,EAAAA,EAAAA,KACRgiB,GAAe1gB,EAAAA,EAAAA,GAAiCvB,EAAOplF,GACvD02P,EClBK,SAAkBrvJ,EAAoCsnK,EAAsBpkK,GACvF,MAAMr3G,GAAOiQ,EAAAA,EAAAA,WACPiyE,GAAmBC,EAAAA,EAAAA,KACzB,IAAKgyB,EACD,OAAO,EAEX,MAAM2yK,EAAc3yK,EAAajiB,MAAQiiB,EAAarG,MAAS,IAE/D,IAAIi5K,EAAe/mR,EAAKC,cAAc,CAClCzS,GAAI,yCACJ0S,eAAgB,eAGhBu7Q,IACAsL,EAAe/mR,EAAKC,cAAc,CAC9BzS,GAAI,mDACJ0S,eAAgB,2BAIxB,MAAMjB,EAAiJ,CACnJ8nR,eACA1tO,EAAIC,GACA7iD,IAAAA,cAAA,KACIjJ,GAAG,iBACHuY,QAASA,IAAMm8E,EAAiB,CAACuF,iBAAkB4vB,KAElD/9D,IAKb,IAAI0tO,EAAoB,GACxB,OAAQ7yK,EAAa3mH,IACrB,KAAKgnH,EAAAA,GAAW1uC,eACZkhN,EAAoB12H,EAAAA,GAAmB22H,mBACvC,MACJ,KAAKzyK,EAAAA,GAAWC,YACZuyK,EAAoB12H,EAAAA,GAAmB42H,uBAsB3C,QAhBKzL,IAAgBqL,GAAcnyK,EAAAA,GAAgBqF,QAAU8sK,GAAcnyK,EAAAA,GAAgBkF,YACvF56G,EAAO8nR,aAAe/mR,EAAKC,cAAc,CACrCzS,GAAI,2CACJ0S,eAAgB,iBAEpBjB,EAAOo6C,EAAKC,GACR7iD,IAAAA,cAAC0rK,EAAAA,EAAc,CACX5gF,QAASjoC,EACT+9D,WAAYA,EACZgrD,kBAAmB,CACfy8C,iBAAkBkoE,EAClBhoE,cAAevuD,EAAAA,GAAYC,aAC3BwuD,oBAAoB,MAI5B/qG,EAAa3mH,IACrB,KAAKgnH,EAAAA,GAAW1uC,eAAgB,CAC5B,IAAInvE,GAAcgP,EAAAA,EAAAA,eAAc,CAC5BnY,GAAI,oDACJ0S,eAAgB,mFA4CpB,OA1CAjB,EAAO6uG,MAAQ9tG,EAAKkuG,aAAaiG,EAAarG,OAC1Cg5K,GAAcnyK,EAAAA,GAAgBqF,SAE1BrjH,EADA8kR,GACc91Q,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,wDACJ0S,eAAgB,0FAGNyF,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,kEACJ0S,eAAgB,wHAIxB4mR,GAAcnyK,EAAAA,GAAgBwyK,UAC1B1L,GACA9kR,GAAcgP,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,uDACJ0S,eAAgB,4IAEpBjB,EAAO6uG,OAAQD,EAAAA,EAAAA,IAAIsG,EAAarG,QAEhCn3G,GAAcgP,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,iEACJ0S,eAAgB,uHAIxB4mR,GAAcnyK,EAAAA,GAAgBkF,WAC1B4hK,GACA9kR,GAAcgP,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,oDACJ0S,eAAgB,yIAEpBjB,EAAO6uG,OAAQD,EAAAA,EAAAA,IAAIsG,EAAarG,QAEhCn3G,GAAcgP,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,8DACJ0S,eAAgB,oHAIrB,CACHyE,MAAO3E,EAAKC,cAAc,CACtBzS,GAAI,uCACJ0S,eAAgB,mBAEpBvJ,YAAaqJ,EAAKC,cACdtJ,EACAsI,GAEJnJ,QAAQ+3G,EAAAA,EAAAA,IAAIsG,EAAajiB,OAEjC,CACA,KAAKsiB,EAAAA,GAAWC,YAAa,CACzB,IAAI99G,GAAcgP,EAAAA,EAAAA,eAAc,CAC5BnY,GAAI,iDACJ0S,eAAgB,mFAsBpB,OApBAjB,EAAO6uG,OAAQG,EAAAA,EAAAA,IAAWkG,EAAarG,MAAO9tG,EAAKkuG,cAC/C44K,GAAcnyK,EAAAA,GAAgBqF,SAC9BrjH,GAAcgP,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,qDACJ0S,eAAgB,oFAGpB4mR,GAAcnyK,EAAAA,GAAgBwyK,UAC9BxwR,GAAcgP,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,oDACJ0S,eAAgB,sIAGpB4mR,GAAcnyK,EAAAA,GAAgBkF,WAC9BljH,GAAcgP,EAAAA,EAAAA,eAAc,CACxBnY,GAAI,iDACJ0S,eAAgB,mIAIjB,CACHyE,MAAO3E,EAAKC,cAAc,CACtBzS,GAAI,2CACJ0S,eAAgB,uBAEpBvJ,YAAaqJ,EAAKC,cACdtJ,EACAsI,GAEJnJ,QAAQm4G,EAAAA,EAAAA,IAAWkG,EAAajiB,MAAOlyF,EAAKkuG,cAEpD,CACA,QACI,OAAO,EAEf,CD9IkBk5K,CAASjzK,EAAcsnK,EAAa,yBAMlD,IAJa32L,GAAYF,IAIX4+K,IAAUrvJ,EACpB,OAAO,KAGX,IAAIkzK,EAAY,qBAOhB,OANMlzK,EAAajiB,MAAQiiB,EAAarG,MAAS,KAAQ6G,EAAAA,GAAgBqF,SACrEqtK,GAAa,iCAMb5wR,IAAAA,cAAA,MACIC,UAAW2wR,EACX9jR,KAAK,WACL/V,GAAIA,GAEJiJ,IAAAA,cAAA,OAAKC,UAAU,6BACV8sQ,EAAM7+P,MACN,IACDlO,IAAAA,cAAA,KACIC,UAAU,gCACVqP,QAASA,IAAMjZ,GAASwc,EAAAA,EAAAA,GAAU,CAC9BC,QAASC,EAAAA,GAAiBi9Q,aAC1B/8Q,WAAY48Q,QAIxB7vR,IAAAA,cAAA,OAAKC,UAnBY,mCAmBkB8sQ,EAAM7sQ,aACzCF,IAAAA,cAAA,OAAKC,UAAU,6BACXD,IAAAA,cAACu2G,EAAAA,EAAe,CACZz+F,QAAShU,KAAKiU,MAAO2lG,EAAajiB,MAAQiiB,EAAarG,MAAS,OAEpEr3G,IAAAA,cAAA,QAAMC,UAAU,mCAAmC8sQ,EAAM1tQ,SAE5D,EAEX+wR,EAAA/nR,UAAA,CAvDEtR,GAAE+O,IAAAA,OAAAC,YAyDN,U,eErEO,MAAM8qR,EAA4C14R,IAAA,IAAC,IAAC4I,EAAG,KAAEyJ,EAAI,cAAE0vH,EAAa,QAAE5qH,GAAenX,EAAA,OAChG6H,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAMp1C,EACNuO,QAASA,EACT6C,SAAS,2BAER+nH,GAAiBl6H,IAAAA,cAAA,KAAGC,UAAS,QAAAU,OAAUu5H,KACxCl6H,IAAAA,cAAA,QAAMC,UAAU,0BACXuK,GAEM,EACjBqmR,EAAAxoR,UAAA,CAhBEtH,IAAG+E,IAAAA,OAAAC,WACHyE,KAAI1E,IAAAA,KAAAC,WACJuJ,QAAOxJ,IAAAA,KACPo0H,cAAap0H,IAAAA,QAejB,MAAMgrR,GAAuBpzM,EAAAA,EAAAA,GAASmzM,GACtCC,EAAqBtqR,YAAc,uBACnC,U,eCbO,MAAMuqR,EAAmB54R,IAAA,IAAC,GAACwnD,EAAE,KAAEn1C,EAAI,UAAEvK,EAAS,SAAEoH,EAAQ,QAAEqyJ,GAAevhK,EAAA,OAC5E6H,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAC8iD,EAAAA,KAAI,CACDnD,GAAIA,EACJ1/C,UAAWk3C,IAAWl3C,EAAW,CAAC,yBAA0By5J,EAASryJ,aACrEA,SAAUA,GAEVrH,IAAAA,cAAA,QAAMC,UAAU,0BAA0BuK,IAE7CkvJ,EACF,EACLq3H,EAAA1oR,UAAA,CAlBEs3C,GAAE75C,IAAAA,OAAAC,WACFyE,KAAI1E,IAAAA,KAAAC,WACJ9F,UAAS6F,IAAAA,OACTuB,SAAQvB,IAAAA,KACR4zJ,QAAO5zJ,IAAAA,MAgBX,MAAMkrR,GAAetzM,EAAAA,EAAAA,GAASqzM,GAC9BC,EAAaxqR,YAAc,eAE3B,U,eCRO,MAAMyqR,EAAgD94R,IAAA,IAAC,QAAC2a,EAAO,WAAEG,EAAU,YAAEC,EAAW,KAAE1I,EAAI,UAAE4P,EAAS,UAAEi+I,EAAS,SAAEhkG,EAAQ,UAAEp0D,EAAS,QAAEy5J,EAAO,WAAEp8I,EAAU,SAAEjW,EAAQ,QAAEiI,GAAenX,EAAA,OAC5L6H,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAC2vG,EAAAA,EAAiB,CACdv1F,UAAWA,EACXtH,QAASA,EACTG,WAAYA,EACZC,YAAaA,EACbjT,UAAWk3C,IAAW,CAClB,sBAAuBkhH,EACvB,CAAC,GAAD13J,OAAIV,IAAcA,EAClB,yBAA0By5J,EAC1BryJ,aAEJiW,WAAYA,EACZjW,SAAUA,EACViI,QAASA,GAER9E,GAAQxK,IAAAA,cAAA,QAAMC,UAAU,0BAA0BuK,GAClD6tJ,GAAar4J,IAAAA,cAAA,QAAMC,UAAU,uBAAuBo4J,GACpDhkG,GAEJqlG,EACF,EACLu3H,EAAA5oR,UAAA,CArCEyK,QAAOhN,IAAAA,OAAAC,WACPkN,WAAUnN,IAAAA,YAAAC,WACVmN,YAAWpN,IAAAA,SAAAA,IAAAA,KACXuyJ,UAASvyJ,IAAAA,OACT0E,KAAI1E,IAAAA,KACJsU,UAAStU,IAAAA,OACT7F,UAAS6F,IAAAA,OACTuuD,SAAQvuD,IAAAA,KACR4zJ,QAAO5zJ,IAAAA,KACPwX,WAAUxX,IAAAA,KACVuB,SAAQvB,IAAAA,KACRwJ,QAAOxJ,IAAAA,MA4BX,MAAMorR,GAA2BxzM,EAAAA,EAAAA,GAASuzM,GAC1CC,EAAyB1qR,YAAc,2BAEvC,U,eCrCA,MAAM2qR,E,MAAmBtvO,GAAAA,IAAUC,WAAA,CAAAt7C,YAAA,oBAAVq7C,CAAU,8TAoB7BuvO,GAAkB1xR,IACpB,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WAElB0T,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IAG5B,MAA0B,UAFAD,aAAO,EAAPA,EAASG,YAGxB,KAIPrtB,IAAAA,cAAA,MACIC,UAAW,iBACX6M,KAAK,WACL/V,GAAI2I,EAAM3I,IAEViJ,IAAAA,cAACmxR,EAAgB,KAAE,gBACnBnxR,IAAAA,cAAA,OAAKC,UAAU,eACVuJ,EACG,CACIzS,GAAI,8BACJ0S,eAAgB,oEAEpB,CACImuE,KAAOjoE,GACH3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvlC,SAAS,oCACTgkC,KAAMmrE,EAAAA,GAAa+vK,aAElB1hR,MAMpB,EAEXyhR,GAAA/oR,UAAA,CAxCEtR,GAAE+O,IAAAA,OAAAC,YA0CN,Y,odCJO,MAAMurR,WAAoBtxR,IAAAA,cAUtBsC,WAAAA,CAAY5C,GACf6C,MAAM7C,GAAO8C,GAAA,aAQV,KACHE,KAAKgH,SAAS,CAACmC,MAAM,GAAM,IAC9BrJ,GAAA,aAEM,KACHE,KAAKgH,SAAS,CAACmC,MAAM,GAAO,IAC/BrJ,GAAA,gBAEkBqV,IACfA,EAAMjO,iBACN,MAAM,GAAC7S,EAAE,OAAE4yB,EAAM,QAAE7P,EAAO,OAAEC,EAAM,KAAEC,EAAI,SAAE4yN,GAAYlqO,KAAKhD,MACrDqnD,GAAWwqO,EAAAA,GAAAA,KACb3kD,EACA/0N,EAAM+7C,kBAGN7M,EACIjtC,GAAWA,EAAQ1Q,QACd4Q,GACDnC,EAAM+7C,mBAEV11C,EAAAA,GAAAA,IAAuBpE,IAChBC,GACPA,EAAO4P,IAIS,YAAf9R,EAAM3c,MAAsB2c,EAAMyrH,cAAcvsI,KAAOA,GACxD8gB,EAAM2iD,OAAOg2K,cAAcz5O,KAAOA,IACdgjB,GACpBA,EAAO4P,EAEf,IACHnnB,GAAA,sBAEgBqV,IACT84D,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAAS+Z,SAC5CluE,KAAKhD,MAAMqa,OACXrX,KAAK4M,QAAQuI,GAEbnV,KAAKmJ,QAIT8kE,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAAS2uG,SACnB,UAAzB9iK,KAAKhD,MAAMs2E,UACXtzE,KAAKmJ,OAELnJ,KAAKy9F,QAITxvB,GAAAA,EAAsB94D,EAAO4N,EAAAA,GAAUoxC,SAAS6uG,QACnB,SAAzBhjK,KAAKhD,MAAMs2E,UACXtzE,KAAKmJ,OAELnJ,KAAKy9F,OAEb,IAjEAz9F,KAAKk6D,KAAO58D,IAAAA,YAEZ0C,KAAKpK,MAAQ,CACTuT,MAAM,EAEd,CA+DOlG,MAAAA,GACH,MAAM,GAAC5O,EAAE,OAAE4yB,EAAM,KAAEnf,EAAI,kBAAEgnR,EAAiB,QAAE13Q,EAAO,KAAE/Z,EAAI,OAAEoD,EAAM,UAAEiX,EAAS,UAAE47D,EAAS,oBAAEy7M,EAAmB,UAAEp5H,EAAS,eAAEq5H,EAAc,eAAEnkD,EAAc,SAAE/3K,EAAQ,KAAEjsD,GAAQ7G,KAAKhD,MAC1KqnD,GAAWwqO,EAAAA,GAAAA,KAEjB,GAAIpuR,IAAWA,EAAOpM,GAClB,MAAQ,GAGZ,IAAI46R,EAAWnnR,EACXzK,IACA4xR,EACI3xR,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,QAAMC,UAAWk3C,IAAW,CAAC,OAAQ,CAAC,oBAAqBs6O,MAAyB1xR,GACnF4xR,IAKb,MAAMC,EAAa93Q,GAAWA,EAAQ1Q,OAChCyoR,EAA8B,CAChCphB,WAAa/tQ,KAAKpK,MAAMuT,MAAQ+lR,IAAe7qO,EAAW,UAAY,SACtEO,IAAK5kD,KAAKk6D,MAAQl6D,KAAKk6D,KAAKnqD,QAAUu1D,OAAOtlE,KAAKk6D,KAAKnqD,QAAQqvP,WAAa,KAAO,SAGjFgwB,EAAa,OACD,SAAd97M,EACA67M,EAAap6N,MAAQq6N,EAErBD,EAAa7iO,KAAO8iO,EAGxB,IAAIC,EAAkC,GA8CtC,OA5CKhrO,IACDgrO,EACI/xR,IAAAA,cAAA,MACIC,UAAWk3C,IAAW,CAAC,yCAA0C,CAACs6O,yBAClErkR,MAAOykR,GAEND,EAAa93Q,EAASzW,KAAKsnG,IACxB,MAAMqnL,EAAsB,8BAATrnL,EAAE5zG,GACrB,IAAIk7R,EAAO73Q,EAIX,OAHIuwF,EAAE5wF,SACFk4Q,EAAOtnL,EAAEngG,OAASgnR,EAAoB7mL,EAAEngG,KAAO,IAAMjB,EAAKC,cAAc,CAACzS,GAAI,6BAA8B0S,eAAgB,aAAekhG,EAAEngG,KAAO,IAAMjB,EAAKC,cAAc,CAACzS,GAAI,gCAAiC0S,eAAgB,kBAGlOzJ,IAAAA,cAAA,QACIC,UAAWk3C,IAAW,CAAC,uBAAwB,CAAC66O,gBAChDt0R,IAAKitG,EAAE5zG,GACPy+D,SAAUm1C,EAAE5zG,GAAGo1C,SAAS,WAAa,EAAI,GAEzCnsC,IAAAA,cAACsxR,GAAW,CACRv6R,GAAI4zG,EAAE5zG,GACN4yB,OAAQA,EACRnf,KAAMmgG,EAAEngG,KACRgnR,kBAAmB7mL,EAAE6mL,kBACrBzxR,KAAM4qG,EAAE5qG,KACR+Z,QAAS6wF,EAAE7wF,QACXC,OAAQ4wF,EAAE5wF,OACV5W,OAAQwnG,EAAExnG,OACViX,UAAW63Q,EACXj4Q,MAAM,EACNg8D,UAAW20B,EAAE30B,UACb42J,SAAUjiI,EAAEiiI,SACZp3K,SAAU,EACVjsD,KAAM7G,KAAKhD,MAAM6J,OAEpBohG,EAAEngG,OAASgnR,GAAqBxxR,IAAAA,cAAA,QAAMC,UAAU,yBAC7CD,IAAAA,cAAA,KAAGC,UAAU,gBAEd,IAEV,KAMbD,IAAAA,cAAA,MACIC,UAAWk3C,IAAW,CAAC,uBAAwB,CAACs6O,yBAChD3kR,KAAK,WACL/V,GAAIA,EAAK,YACT6jD,IAAKl4C,KAAKk6D,KACVttD,QAAS5M,KAAK4M,SAEdtP,IAAAA,cAAA,OACIC,UAAWk3C,IAAW,CAAC,CAAC+6O,uBAAwBT,KAChD16R,GAAIA,EACJ,aAAYqjB,EACZowE,aAAc9nF,KAAKmJ,KACnBy8G,aAAc5lH,KAAKy9F,KACnB3qC,SAAUA,QAAAA,EAAY,EACtBmhB,UAAWj0E,KAAKosE,eAEhB9uE,IAAAA,cAAA,OAAKC,UAAWF,EAAO,OAAS,QAC3B4xR,EAAUpkD,EACVmkD,GAAkB1xR,IAAAA,cAAA,QAAMC,UAAU,YAAYuxR,GACvC,8BAAPz6R,GACGiJ,IAAAA,cAAA,QACIjJ,GAAI,kCAAoCA,EACxCkJ,UAAWk3C,IAAW,CAAC,wCAADx2C,OAAyCixR,EAAa,GAAK,UAAY,CAACt6H,OAAQvwG,KACtG,aAAYx9C,EAAKC,cAAc,CAACzS,GAAI,yBAA0B0S,eAAgB,iBAAiBxG,iBAI1Go1J,GAAar4J,IAAAA,cAAA,QAAMC,UAAU,uBAAuBo4J,GACpD05H,GAIjB,EACHvvR,GA/LY8uR,GAAW,eAGS,CACzBzlR,MAAM,EACNmqE,UAAW,OACXm8M,aAAc,OACdT,gBAAgB,IA0LxB,UAAeliR,EAAAA,EAAAA,YAAW8hR,I,0ZCtOX,MAAM13Q,WAAa5Z,IAAAA,cAevBsC,WAAAA,CAAY5C,GACf6C,MAAM7C,GAAO8C,GAAA,6BAKa,KAC1B,GAA0B,OAAtBE,KAAKk6D,KAAKnqD,QACV,OAGJ/P,KAAK8uO,SAAS9kL,aACd,MAAM2H,EAAWj0D,OAAOoI,OAAO9F,KAAKk6D,KAAKnqD,QAAQ4hD,UAAUviD,MAAM,EAAGpP,KAAKk6D,KAAKnqD,QAAQ4hD,SAASjrD,QAG/F,IAAIgpR,GAAiB,EACjBC,GAAgB,EACpB,IAAK,MAAMj6K,KAAS/jD,EACZ+jD,EAAM58C,UAAUqC,SAAS,iBAAmBu6C,EAAM58C,UAAUqC,SAAS,wBACrEu6C,EAAMhrG,MAAMu8F,QAAU,SAClB0oL,GAAiBD,KACjBh6K,EAAMhrG,MAAMu8F,QAAU,QAE1ByoL,GAAiB,IAEjBC,GAAgB,EAChBD,GAAiB,GAGzB/9N,EAAS4xE,UAGT,IAAK,MAAM7tB,KAAS/jD,EAAU,CAC1B,IAAI+jD,EAAM58C,UAAUqC,SAAS,kBAAmBu6C,EAAM58C,UAAUqC,SAAS,uBAGrE,MAFAu6C,EAAMhrG,MAAMu8F,QAAU,MAI9B,CACAjnG,KAAK8uO,SAAS/kL,QAAQ/pD,KAAKk6D,KAAKnqD,QAAS,CAAC6/Q,YAAY,EAAMC,WAAW,EAAMC,SAAS,GAAM,IAC/FhwR,GAAA,wBAsBkBrD,IACXA,EAAEq7D,SAAW93D,KAAKk6D,KAAKnqD,UACvBtT,EAAEyK,iBACFzK,EAAEy0D,kBACN,IAhEAlxD,KAAKk6D,KAAO58D,IAAAA,YACZ0C,KAAK8uO,SAAW,IAAIihD,iBAAiB/vR,KAAKgwR,qBAC9C,CAsCOz3O,iBAAAA,GACHv4C,KAAKgwR,sBACT,CAEOv3O,kBAAAA,GACHz4C,KAAKgwR,sBACT,CAEO1yN,oBAAAA,GACHt9D,KAAK8uO,SAAS9kL,YAClB,CAGOssM,IAAAA,GACH,OAAIt2P,KAAKk6D,MAAQl6D,KAAKk6D,KAAKnqD,QAChB/P,KAAKk6D,KAAKnqD,QAAQ40C,wBAEtB,IACX,CASO1hD,MAAAA,GACH,MAAM,SAAC0uD,EAAQ,OAAEyM,EAAM,SAAE3mD,EAAQ,GAAEpjB,EAAE,OAAEszO,EAAM,UAAEjwN,EAAS,aAAEo9C,GAAgB90D,KAAKhD,MAC/E,IAAI0C,EAAwB,CAAC,EAK7B,OAJIo1D,IACAp1D,EAASo1D,GAITx3D,IAAAA,cAAA,OACI,aAAYoa,EACZna,UAAU,mBACVlJ,GAAIA,EACJ+V,KAAK,QAEL9M,IAAAA,cAAA,MACIjJ,GAAIszO,EACJzvL,IAAKl4C,KAAKk6D,KACVxvD,MAAOhL,EACPnC,UAAWk3C,IACP,8BACA,CACIh9B,WACA2mD,UAEJp+D,KAAKhD,MAAMO,WAEfqP,QAAS5M,KAAKiwR,iBAEbt+N,GAIjB,EACH7xD,GArHoBoX,GAAI,SACEs1Q,GAAU1sR,GADhBoX,GAAI,QAEC2lE,EAAAA,GAAS/8E,GAFdoX,GAAI,aAGMg2Q,GAAcptR,GAHxBoX,GAAI,mBAIYk3Q,GAAoBtuR,GAJpCoX,GAAI,WAKIo3Q,GAAYxuR,GALpBoX,GAAI,uBAMgBs3Q,GAAwB1uR,GAN5CoX,GAAI,cAOO03Q,IAAW9uR,GAPtBoX,GAAI,aAQMu1Q,GAAc3sR,GARxBoX,GAAI,aASMw3Q,IAAc5uR,GATxBoX,GAAI,iBAUUw2Q,E,+EC7BnC,MAAM7wM,EAAa7/E,IAAiB,IAAAkzR,EAChC,MAKMlhJ,EAAuB,QAAhBkhJ,EAAGlzR,EAAMgyI,eAAO,IAAAkhJ,EAAAA,EACzB5yR,IAAAA,cAAA,MACIC,UAAU,yBACVqP,QARoBnQ,IACxBA,EAAEyK,iBACFzK,EAAEy0D,iBAAiB,IAUvB,OACI5zD,IAAAA,cAAAA,IAAAA,SAAA,KACK0xI,EACAhyI,EAAM20D,SACR,EAETkrB,EAAAl3E,UAAA,CA1BEqpI,QAAO5rI,IAAAA,KACPuuD,SAAQvuD,IAAAA,MA2BZ,QAAe9F,IAAAA,KAAWu/E,E,6kBCzBX,SAAS7B,EAAS5U,GAO7B,MAAM2U,UAAiBz9E,IAAAA,cAOZ2F,MAAAA,GACH,MAAA4kI,EAAyC7nI,KAAKhD,OAAxC,GAAC3I,EAAE,KAAE8U,EAAI,KAAE9L,EAAI,KAAEyK,GAAe+/H,EAAN7qI,E,qWAAKmgD,CAAA0qF,EAAAzqF,GACrC,IAAKj0C,EACD,OAAO,KAGX,IAAI8lR,EAA4BnnR,EAUhC,OATIzK,IACA4xR,EACI3xR,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,QAAMC,UAAU,QAAQF,GACxBC,IAAAA,cAAA,OAAKC,UAAU,QAAQuK,KAM/BxK,IAAAA,cAAA,MACIC,UAAWk3C,IAAW,WAAY,CAC9B,sBAAuBp3C,IAE3B+M,KAAK,WACL/V,GAAIA,GAEJiJ,IAAAA,cAAC8oE,EAAS1oE,OAAAC,OAAA,CACNmK,KAAMmnR,EACNv3Q,UAAW5P,aAAI,EAAJA,EAAMxG,WACjBjN,GAAIA,EAAK,WACL2I,IAIpB,EAEJ,OADC8C,EAxCKi7E,EAAQ,aALV5xE,KAAI/F,IAAAA,KACJ/O,GAAE+O,IAAAA,OACF/F,KAAI+F,IAAAA,KACJ0E,KAAI1E,IAAAA,OAAAtD,EAEFi7E,EAAQ,eACmB,CACzB5xE,MAAM,IAuCP4xE,CACX,C,6SClBA,MAAMo1M,EAAyB16R,IAUI,IAVH,mBAC5B+hK,EAAkB,qBAClBC,EAAoB,oBACpBG,EAAmB,sBACnBC,EAAqB,aACrBC,EAAY,eACZC,EAAc,sBACdq4H,EAAqB,QACrBl5H,EAAO,8BACPG,GAC0B5hK,EAC1B,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAClBnjB,GAAWsxD,EAAAA,EAAAA,gBAEjBvC,EAAAA,EAAAA,YAAU,KACN/uD,GAASwzN,EAAAA,EAAAA,MAAsB,GAChC,IAEH,MAGMkpE,EAF0D,UADvCh8O,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAMuyB,SAASwrE,MAAMsD,mBACjCtsE,WAG3C0jE,GAAgBh6C,EAAAA,EAAAA,aAAY7T,EAAAA,IAC5Br3B,GAAOkrC,EAAAA,EAAAA,cAAaz+C,IAAuB8gG,EAAAA,EAAAA,GAAY9gG,EAAOya,EAAAA,GAAiBigR,4BAC/E9lQ,GAAU6pB,EAAAA,EAAAA,aAAY5pB,EAAAA,IACtBkhE,EAA6B,UAAnBnhE,aAAO,EAAPA,EAASwU,OACnB+pD,GAAmBC,EAAAA,EAAAA,MAElBunM,EAAoB7zK,EAAa8zK,IAAuB5nH,EAAAA,EAAAA,GAAe,CAC1ExgF,QAASthF,EAAc,CACnBzS,GAAI,yCACJ0S,eAAgB,kBAErB,CACC4+M,iBAAkBzuD,GAAW,GAC7B2uD,cAAexuD,GAAiC,GAChD0uD,oBAAoB,IAGxB,IAAK58M,EACD,OAAO,KAGX,MAAM4iK,EAAgBA,KAClBp4K,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBigR,0BAA0B,EA4B7DG,EAAiBpiM,IAAkBgiM,IAAkB1kM,EAG3D,IAAI+kM,EAAkB5pR,EAAc,CAACzS,GAAI,wCAAyC0S,eAAgB,eAC7FsnF,IACDqiM,EAAkBH,GAEtB,IAAII,EAhC0Bl0R,IACtB4xF,GACAtF,EAAiB,CAACuF,iBAAkB,6BACpCy9E,KAEArvD,EAAYjgH,EAAG,2BACnB,EA2BA2zR,IACAM,EAAkBN,EAAsBnjR,IACxC0jR,EAAqBP,EAAsB/4Q,QAG/C,MAAMu5Q,EACFtzR,IAAAA,cAACmiJ,EAAAA,EAAa,CACV7yI,QAASm/J,EACT7zE,YAAY,yDACZwnD,SAAS,kBACTC,gBAAgB,IAIxB,OACIriJ,IAAAA,cAACo8E,EAAAA,GAAY,CACTrlF,GAAG,yBACHkJ,UAAU,yBACVs8E,eAAe,EACfG,gBA1CAqU,EACQgiM,EAAiBz4H,EAAsBJ,EAG5CM,EAuCH5tJ,SAAU6hK,GAEVzuK,IAAAA,cAAA,OAAKC,UAAU,gCACXD,IAAAA,cAAA,KAAGC,UAAU,uCAtCjB8wF,EACQgiM,EAAiBx4H,EAAwBJ,EAG9CM,GAqCE04H,GACGnzR,IAAAA,cAAA,KAAGC,UAAU,iCACTD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,qCACH0S,eAAe,oPACfjB,OAAQ,CACJ4xJ,YAAaC,EAAAA,GACbk5H,UAAY5jR,GACR3P,IAAAA,cAAA,cAAS2P,GAEb6jR,eAAiB7jR,GACb3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAMmrE,EAAAA,GAAa8nG,oCACnBj3M,SAAS,4BAERxC,GAGT05M,YAAc15M,GACV3P,IAAAA,cAAC03C,EAAAA,EAAY,CACTvB,KAAMoC,EAAAA,GAAWG,eACjBvmC,SAAS,4BAERxC,OAOzB3P,IAAAA,cAAA,OAAKC,UAAWk3C,IAAW,kCAAmC,CAACs8O,QAASN,KACpEnzR,IAAAA,cAAA,UACIjJ,GAAG,eACHkJ,UAAU,eACVqP,QAAS+jR,EACThsR,SAAU6rR,IAAwBv0K,EAAAA,EAAaK,iBAE9Co0K,GAEJD,GACGG,IAID,EAErBT,EAAAxqR,UAAA,CAnKE6xJ,mBAAkBp0J,IAAAA,OAAAC,WAClBo0J,qBAAoBr0J,IAAAA,OAAAC,WACpBu0J,oBAAmBx0J,IAAAA,OACnBy0J,sBAAqBz0J,IAAAA,OACrB00J,aAAY10J,IAAAA,OACZ20J,eAAc30J,IAAAA,OACdgtR,sBAAqBhtR,IAAAA,MAAA,CAAK6J,IAAG7J,IAAAA,OAAAC,WAAUgU,OAAMjU,IAAAA,KAAAC,aAC7C6zJ,QAAO9zJ,IAAAA,OACPi0J,8BAA6Bj0J,IAAAA,QA6JjC,U,0BC5JA,MAAM6zJ,EAAsBxhK,IAiBf,IAAAyF,EAAA,IAjBgB,SACzB81R,GAAW,EAAI,QACf33R,EAAO,aACPsvL,EAAY,eACZ9lE,EAAc,sBACdouK,EAAqB,mBACrBz5H,EAAkB,qBAClBC,EAAoB,oBACpBG,EAAmB,sBACnBC,EAAqB,aACrBC,EAAY,eACZC,EAAc,gBACdm5H,EAAe,cACfC,EAAa,6BACbC,EAA4B,QAC5Bl6H,EAAO,8BACPG,GACI5hK,EACJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElBu6Q,GAA2Bt6Q,EAAAA,EAAAA,cAAY,IACpCk6Q,EAWmC,iBAA1BA,EAAqCA,EAAwBnqR,EAAcmqR,EAAuB,CAC5Gv5H,YAAaC,EAAAA,GACb25H,QAASj6H,IAAkCC,EAAAA,GAAYwuD,WAAa,KAAO,IAC3EzuD,kCAbOvwJ,EACH,CACIzS,GAAI,+CACJ0S,eAAgB,yEACjB,CACC2wJ,YAAaC,EAAAA,MAU1B,CAACs5H,IAEE5zR,EAAOC,IAAAA,cAAA,KAAGC,UAAWk3C,IAAW,oCAAqC,OAAQp7C,EAAU,mBAAqB,WAQlH,OACIiE,IAAAA,cAAA,QAAMC,UAAU,+CACZD,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MACIlO,IAAAA,cAAA,OAAKC,UAAU,qCACXD,IAAAA,cAAA,QAAMC,UAAU,SACXorL,GAAgB7hL,EAAc,CAACzS,GAAI,qCAAsC0S,eAAgB,2CAA4C,CAACswJ,+BAzDpIpvD,EAyDyLovD,GAxD7MpvD,SAAY,QAAXspL,EAADtpL,EAAGuoD,OAAO,UAAE,IAAA+gI,OAAX,EAADA,EAAc9sJ,gBAAgBx8B,aAAC,EAADA,EAAG74F,MAAM,QA0D1B9R,IAAAA,cAAA,QAAMC,UAAU,WACXlE,EACGg4R,IAEAxuK,GAAkB/7G,EAAc,CAACzS,GAAI,sCAAuC0S,eAAgB,2DAM3GiqR,GAAY33R,EACTiE,IAAAA,cAAA,YACIA,IAAAA,cAAC2vG,EAAAA,EAAiB,CACd54G,GAAc,QAAZ6G,EAAA,GAAA+C,OAAKi5J,EAAO,oCAAAh8J,OAAA,EAAVA,EAAmCs2R,WAAW,IAAK,KACvDj0R,UAAU,8BACV6S,QAASC,EAAAA,GAAiBigR,yBAC1B//Q,WAAY4/Q,EACZvjR,QA/BI6kR,KACpBN,GACAA,GACJ,EA6BoB3gR,YAAa,CACTgnJ,qBACAC,uBACAG,sBACAC,wBACAC,eACAC,iBACAq4H,sBAAuBgB,EACvBl6H,UACAG,kCAGHh6J,EACA6zR,IAIT5zR,IAAAA,cAAA,OAAKC,UAAU,gCACVF,EACA6zR,KAhGzB,IAA+BjpL,EAAWspL,CAoG3B,EAEbt6H,EAAAtxJ,UAAA,CAxHEqrR,SAAQ5tR,IAAAA,KACR/J,QAAO+J,IAAAA,KACP8zJ,QAAO9zJ,IAAAA,OACPi0J,8BAA6Bj0J,IAAAA,OAC7BulL,aAAYvlL,IAAAA,KACZy/G,eAAcz/G,IAAAA,KAEdo0J,mBAAkBp0J,IAAAA,KAClBq0J,qBAAoBr0J,IAAAA,KACpBw0J,oBAAmBx0J,IAAAA,KACnBy0J,sBAAqBz0J,IAAAA,KACrB00J,aAAY10J,IAAAA,KACZ20J,eAAc30J,IAAAA,KACd8tR,gBAAe9tR,IAAAA,KACf+tR,cAAa/tR,IAAAA,KACbguR,6BAA4BhuR,IAAAA,MAAA,CAAI6J,IAAG7J,IAAAA,OAAAC,WAAUgU,OAAMjU,IAAAA,KAAAC,cA2GvD,S,0HC1He,SAASquR,EAAqB10R,GACzC,OAAIqnD,EAAAA,EAAAA,KACIrnD,EAAMmM,KACCnM,EAAM20D,SAGV,KAIPr0D,IAAAA,cAACsvD,EAAAA,EAAa,CACV3hD,GAAIjO,EAAMmM,KACVsrC,WAAW,uBACXwkB,OAAO,EACP2mG,MAAM,EACN33B,cAAc,EACdC,eAAe,EACf11G,QA3Be,IA6Bdx1B,EAAM20D,SAGnB,C,yZAAC+/N,EAAA/rR,UAAA,CA7BGgsD,SAAQvuD,IAAAA,KACR+F,KAAI/F,IAAAA,KAAAC,YC2BO,MAAMmU,UAAoBla,IAAAA,cAQ9BsC,WAAAA,CAAY5C,GAEf,GADA6C,MAAM7C,GAAO8C,EAAA,sBAiDQrD,IACjBA,EAAEzB,MAAQ+nB,EAAAA,GAAUoxC,SAASua,OAAO,IACpC1uE,KAAKwxB,QAGL/0B,EAAEzB,MAAQ+nB,EAAAA,GAAUoxC,SAAS0zI,IAAI,IACjC7nM,KAAK2xR,YAAYl1R,EACrB,IACHqD,EAAA,oBAEsBrD,IACfuD,KAAKk6D,MAAQl6D,KAAKk6D,KAAKnqD,SAAWtT,EAAEq7D,QAAU93D,KAAKk6D,KAAKnqD,QAAQorD,SAAS1+D,EAAEq7D,SAI/E93D,KAAKwxB,OAAO,IACf1xB,EAAA,cAEc,KACPE,KAAKpK,MAAMqZ,OACXjP,KAAKgH,SAAS,CAACiI,MAAM,IACjBjP,KAAKhD,MAAM69E,UACX76E,KAAKhD,MAAM69E,UAAS,GAE5B,IACH/6E,EAAA,eAESrD,IAOFuD,KAAKhD,MAAMmyI,0BACX1yI,EAAEyK,iBACFzK,EAAEy0D,mBAEN,MAAMwjE,GAAY10H,KAAKpK,MAAMqZ,KAC7BjP,KAAKgH,SAAS,CAACiI,KAAMylH,IAAW,KACxB10H,KAAKhD,MAAM69E,UACX76E,KAAKhD,MAAM69E,SAAS65C,EACxB,GACF,KA3FGhxH,MAAMC,QAAQ3G,EAAM20D,WAAuC,IAA1B30D,EAAM20D,SAASjrD,OACjD,MAAM,IAAIujB,MAAM,wCAEpBjqB,KAAKpK,MAAQ,CACTqZ,MAAM,GAEVjP,KAAKk6D,KAAO58D,IAAAA,WAChB,CAEOi7C,iBAAAA,GACCv4C,KAAKpK,MAAMqZ,MACXjP,KAAK4xR,mBAEb,CAEA,+BAAOrwR,CAAyBvE,EAAcpH,GAC1C,YAAmB0C,IAAf0E,EAAMiS,MAAsBjS,EAAMiS,OAASrZ,EAAMqZ,KAC1C,CACHA,KAAMjS,EAAMiS,MAGb,IACX,CAEOwpC,kBAAAA,CAAmBC,EAAkBj3C,GACpCzB,KAAKpK,MAAMqZ,OAASxN,EAAUwN,KAC9BjP,KAAK4xR,qBACG5xR,KAAKpK,MAAMqZ,MAAQxN,EAAUwN,MACrCjP,KAAK6xR,sBAEb,CAEOv0N,oBAAAA,GACCt9D,KAAKpK,MAAMqZ,MACXjP,KAAK6xR,sBAEb,CAEQD,iBAAAA,GACJpyR,SAASq7D,iBAAiB,QAAS76D,KAAK2xR,aAAa,GACrDnyR,SAASq7D,iBAAiB,QAAS76D,KAAK8xR,eAAe,EAC3D,CAEQD,oBAAAA,GACJryR,SAASu7D,oBAAoB,QAAS/6D,KAAK2xR,aAAa,GACxDnyR,SAASu7D,oBAAoB,QAAS/6D,KAAK8xR,eAAe,EAC9D,CAgDO7uR,MAAAA,GACH,MAAM,SAAC0uD,GAAY3xD,KAAKhD,MAElB+0R,EAAY/xR,KAAKhD,MAAMg1R,mBAE7B,OACI10R,IAAAA,cAAA,OACIjJ,GAAI2L,KAAKhD,MAAM3I,GACfkJ,UAAW,eAAiByC,KAAKhD,MAAMO,WAAayC,KAAKpK,MAAMqZ,KAAO,qBAAuB,IAC7FrC,QAAS5M,KAAKqxB,OACd6mB,IAAKl4C,KAAKk6D,KACVv1D,SAAU3E,KAAKhD,MAAMmF,YAEpBwvD,EAAWj0D,OAAOoI,OAAO6rD,GAAU,GAAK,CAAC,EAC1Cr0D,IAAAA,cAACy0R,EAAS,CAAC5oR,KAAMnJ,KAAKpK,MAAMqZ,MACvB0iD,EAAWj0D,OAAOoI,OAAO6rD,GAAU,GAAK,CAAC,GAI1D,EACH7xD,EA5HoB0X,EAAW,aAjB5Bm6C,SAAQvuD,IAAAA,KACR7F,UAAS6F,IAAAA,OACTy3E,SAAQz3E,IAAAA,KACR4uR,mBAAkB5uR,IAAAA,IAClB/O,GAAE+O,IAAAA,OACFjB,WAAUiB,IAAAA,KACV+rI,wBAAuB/rI,IAAAA,KACvB6L,KAAI7L,IAAAA,OAAAtD,EAUa0X,EAAW,eAGC,CACzBja,UAAW,GACXy0R,mBAAoBN,G,2ICb5B,SAAS1kI,EAAev3J,GAA4I,IAA3I,MAAC+V,EAAK,YAAEhO,EAAW,QAAEk8F,EAAO,UAAEn8F,EAAS,MAAEvJ,EAAK,wBAAE+3J,GAA0B,EAAK,gBAAEkmI,GAAkB,EAAK,WAAE9V,GAAkB1mR,EACjJ,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAElBo7Q,EAAiB1mR,GACnBlO,IAAAA,cAAA,MACI,cAAY,uCACZC,UAAU,wCAETiO,GAIH2mR,EAAuB30R,GACzBF,IAAAA,cAAA,KACI,cAAY,6CACZC,UAAU,8CAETC,GAIHysB,EAAQj2B,GACVsJ,IAAAA,cAAA,OACI,cAAY,uCACZC,UAAU,wCAEVD,IAAAA,cAAC89E,EAAAA,uBAAsB,MACtBt0E,EAAc,CAACzS,GAAIL,EAAMK,GAAI0S,eAAgB/S,EAAM+S,gBAAiB/S,EAAM8R,SAInF,OACIxI,IAAAA,cAAA,OACI,cAAa6+Q,EACb5+Q,UAAWk3C,IAAW,gCAAiCl3C,IAEtD20R,EACAnmI,EAA0BomI,OAAuB75R,EAClDgF,IAAAA,cAAA,OACI,cAAY,yCACZC,UAAWk3C,IAAW,yCAA0C,CAC5D29O,OAAQH,KAGXv4L,GAEJqyD,OAA0BzzJ,EAAY65R,EACtCloQ,EAGb,CAAC+iI,EAAArnJ,UAAA,CA/DG6F,MAAKpI,IAAAA,OACL5F,YAAW4F,IAAAA,OAEX+4Q,WAAU/4Q,IAAAA,OAIVs2F,QAAOt2F,IAAAA,QAAAC,WACP4uR,gBAAe7uR,IAAAA,KACf7F,UAAS6F,IAAAA,OACT2oJ,wBAAuB3oJ,IAAAA,MAuD3B,S,mGCxDe,SAASyoJ,EAAmBp2J,GAUjC,IAVkC,MACxC+V,EAAK,YACLhO,EAAW,eACXwuJ,EAAc,gBACdC,EAAe,gBACfH,EAAe,aACf5tF,EAAY,UACZ3gE,EAAS,WACT4+Q,EAAU,wBACVpwH,GAA0B,GACtBt2J,EACJ,MAAMikG,EACFp8F,IAAAA,cAAA,YACItC,IAAKgxJ,EAAevuJ,KACpBF,UAAU,wDAEVD,IAAAA,cAAA,SAAOC,UAAU,oDACbD,IAAAA,cAAA,SACIC,UAAU,gDACV,cAAayuJ,EAAemwH,WAC5B3jR,KAAK,WACLiF,KAAMuuJ,EAAevuJ,KACrB6kH,QAAS2pC,EACThsJ,SAAWxD,GAAMyhE,EAAazhE,EAAEq7D,OAAOwqD,WAE1CwpC,IAKb,OACIxuJ,IAAAA,cAAC0vJ,EAAAA,EAAe,CACZtzD,QAASA,EACTluF,MAAOA,EACPhO,YAAaA,EACb2+Q,WAAYA,EACZ5+Q,UAAWA,EACXwuJ,wBAAyBA,GAGrC,CAACF,EAAAlmJ,UAAA,CApDGqmJ,eAAc5oJ,IAAAA,MAAA,CALd+4Q,WAAU/4Q,IAAAA,OACV3F,KAAI2F,IAAAA,OAAAC,aAAAA,WAKJ4oJ,gBAAe7oJ,IAAAA,KAAAC,WAKfyoJ,gBAAe1oJ,IAAAA,KAAAC,WACf66D,aAAY96D,IAAAA,KAAAC,WACZ9F,UAAS6F,IAAAA,OACT2oJ,wBAAuB3oJ,IAAAA,K,mECyB3B,QAlCA,SAAqB3N,GAKX,IALY,MAClB+V,EAAK,YACLhO,EAAW,QACXk8F,EAAO,YACP24L,GACI58R,EACJ,MAAMy8R,EAAiB1mR,GACnBlO,IAAAA,cAAA,MAAIC,UAAU,qBACTiO,EACA6mR,GAIHF,EAAuB30R,GACzBF,IAAAA,cAAA,KAAGC,UAAU,2BACRC,GAIT,OACIF,IAAAA,cAAA,WAASC,UAAU,6BACbiO,GAAShO,IACPF,IAAAA,cAAA,OAAKC,UAAU,sBACV20R,EACAC,GAGT70R,IAAAA,cAAA,OAAKC,UAAU,uBACVm8F,GAIjB,C,0FCxCA,MAAM44L,EAAU,CAACC,GAAI,SAAUC,GAAI,QAASC,GAAI,SAAUC,GAAI,SAgBxDnvG,EAAUjmL,IAAAA,YAAmC,CAAA7H,EAWhDyiD,KAAS,IAXwC,UAChD4S,EAAY,QAAO,YACnB6nO,EAAc,KAAI,SAClBhhO,EAAQ,aACRihO,EAAe,OAAM,MACrBpnR,EAAK,GACLnX,EAAE,WACFw+R,EAAU,YACVt1J,EAAW,UACXhgI,EAAS,MACTmN,GACHjV,EACG,OACI6H,IAAAA,cAACw1R,EAAAA,QAAS,CACNz+R,GAAIA,EACJqW,MAAOA,EACPnN,UAAWA,EACXw1R,QAASH,EACT9nO,UAAWA,EACX0qE,QAAQ,UACRhqH,MAAOA,EACPwnR,OAAQL,GAAeL,EAAQK,GAC/BE,WAAYA,EACZt1J,YAAaA,EACbrlF,IAAKA,GAEJyZ,EACO,IAEjB4xH,EAAA59K,UAAA,CAzCCtR,GAAE+O,IAAAA,OACFuuD,SAAQvuD,IAAAA,KACRwvR,aAAYxvR,IAAAA,MAAA,CAAG,SACfuvR,YAAWvvR,IAAAA,MAAA,CANK,KAAO,KAAO,KAAO,OAOrCoI,MAAKpI,IAAAA,KACL0nD,UAAS1nD,IAAAA,MAAA,CAAG,SAAW,MAAQ,QAAU,SACzC7F,UAAS6F,IAAAA,OAETyvR,WAAUzvR,IAAAA,KACVm6H,YAAWn6H,IAAAA,MAkCfmgL,EAAQz/K,YAAc,UAEtB,QAAexG,IAAAA,KAAWimL,E,2DC7C1B,MAAM8zB,EAAiB5hN,IAAuB,IAAtB,SAACk8D,GAAgBl8D,EACrC,OACI6H,IAAAA,cAAA,OACI,cAAY,iBACZC,UAAU,4BAEVD,IAAAA,cAAA,MAAIC,UAAU,kBACbo0D,GACGr0D,IAAAA,cAAA,OAAKC,UAAU,mBACVo0D,GAGP,EAId,EAAer0D,IAAAA,KAAW+5M,E,0FCN1B,MAAMryM,EAAcvP,IAWP,IAXQ,GACjBpB,EAAE,MACF6K,EAAK,eACL+mG,EAAiB,GAAE,SACnB/iG,EAAQ,YACRvB,EAAW,MACXb,EAAK,SACL6D,EAAQ,eACRuhG,EAAiB,GAAE,SACnBjmG,EAAQ,UACRyE,GACIjP,EAKJ,OACI6H,IAAAA,cAACm5I,EAAAA,EAAO,CACJv3I,MAAOA,EACP+mG,eAAgBA,EAChBC,eAAgBA,EAChBhjG,SAAUA,EACVwzI,QAASriJ,GAETiJ,IAAAA,cAAA,OAAKC,UAAU,YACXD,IAAAA,cAAA,aACIA,IAAAA,cAAA,SACIjJ,GAAIA,EACJsQ,SAAUA,EACVD,UAAWA,EACXlM,KAAK,WACL8pH,QAASxhH,EACTb,SApBExD,IAClBwD,EAAS5L,EAAIoI,EAAEq7D,OAAOwqD,QAAQ,IAqBlBhlH,IAAAA,cAAA,YAAOqE,KAGT,EAEhBqD,EAAAW,UAAA,CAnDEtR,GAAE+O,IAAAA,OAAAC,WACFnE,MAAKkE,IAAAA,KAAAC,WACL4iG,eAAc7iG,IAAAA,OACdF,SAAQE,IAAAA,KACRzB,YAAWyB,IAAAA,OAAAC,WACXvC,MAAKsC,IAAAA,KAAAC,WACLsB,SAAQvB,IAAAA,KACR8iG,eAAc9iG,IAAAA,OAEdsB,UAAStB,IAAAA,MA4Cb,QAAe9F,IAAAA,KAAW0H,E,+EC/C1B,MAAMyxI,EAA2BhhJ,IAQpB,IARqB,QAC9BihJ,EAAO,MACPx3I,EAAK,eACL+mG,EAAc,eACdC,EAAc,SACdv0C,EAAQ,OACRq0C,EAAM,SACN9iG,GACIzN,EACJ,OACI6H,IAAAA,cAAA,OACI,cAAao5I,EACbn5I,UAAU,cAET2B,GACG5B,IAAAA,cAAA,SACI,cAAao5I,EAAU,QACvBn5I,UAAW,iBAAmB0oG,EAC9BwvB,QAASihB,GAERx3I,GAGT5B,IAAAA,cAAA,OAAKC,UAAW2oG,GACXv0C,EACDr0D,IAAAA,cAAA,OACI,cAAao5I,EAAU,YACvBn5I,UAAU,aAET2F,GAEJ8iG,GAEH,EAEZywC,EAAA9wI,UAAA,CA5CE+wI,QAAOtzI,IAAAA,OACPlE,MAAKkE,IAAAA,KAAAC,WACL4iG,eAAc7iG,IAAAA,OACd8iG,eAAc9iG,IAAAA,OACduuD,SAAQvuD,IAAAA,KAAAC,WACRH,SAAQE,IAAAA,KACR4iG,OAAM5iG,IAAAA,MAwCV,S,wFC5CA,MAAM6vR,EAAc,CAAC,OAAQ,WAAY,SAAU,QAAS,MAAO,MAAO,YA8F1E,EAvEA,SAAqBj2R,GACjB,MAAM,eAACipG,EAAiB,GAAE,eAAEC,EAAiB,GAAE,UAAE5hG,GAAY,EAAE,UAAEM,GAAY,EAAI,KAAEpM,EAAO,QAAUwE,EAEpG,SAASkhE,EAAa/oD,GACC,WAAfnY,EAAMxE,KACNwE,EAAMiD,SAASjD,EAAM3I,GAAIkzD,SAASpyC,EAAM2iD,OAAOh3D,MAAO,KAChC,SAAf9D,EAAMxE,MAAmBwE,EAAMwgE,SACX,KAAvBroD,EAAM2iD,OAAOh3D,MACb9D,EAAMiD,SAASjD,EAAM3I,GAAI,IAEzB2I,EAAMiD,SAASjD,EAAM3I,GAAI8gB,EAAM2iD,OAAOh3D,MAAMghC,MAAM,MAGtD9kC,EAAMiD,SAASjD,EAAM3I,GAAI8gB,EAAM2iD,OAAOh3D,MAE9C,CAEA,IAAIyjD,EAAQ,KACZ,GAAa,aAAT/rD,EACA+rD,EACIjnD,IAAAA,cAAA,YACIjJ,GAAI2I,EAAM3I,GACV,iBAAA4J,OAAgBjB,EAAM3I,GAAE,SACxBkJ,UAAU,eACVmH,UAAW1H,EAAM0H,UACjBqkG,IAAI,OACJF,KAAM,EACNlnG,YAAa3E,EAAM2E,YACnB+I,OAAqB,IAAd9F,EAAsB,CAACsuR,OAAQ,aAAU56R,EAChDwI,MAAO9D,EAAM8D,MACbwD,UAAWA,EACXrE,SAAUi+D,EACVv5D,SAAU3H,EAAM2H,eAGrB,CACH,MAAMwuR,EAAYF,EAAYxpP,SAASjxC,GAAQA,EAAO,OAGhD06H,EAAuB,SAAdigK,EAAuB,GAAHl1R,OAAMjB,EAAM3I,GAAE,YAAA4J,OAAajB,EAAM3I,IAAE4J,OAAGk1R,GAEzE5uO,EACIjnD,IAAAA,cAAA,SACIjJ,GAAI2I,EAAM3I,GACV,cAAa6+H,EACb31H,UAAU,eACVmH,UAAW1H,EAAM0H,UACjBlM,KAAM26R,EACNxxR,YAAa3E,EAAM2E,YACnBb,MAAO9D,EAAM8D,MACbwD,UAAWA,EACXrE,SAAUi+D,EACVv5D,SAAU3H,EAAM2H,UAG5B,CAEA,OACIrH,IAAAA,cAACm5I,EAAAA,EAAO,CACJv3I,MAAOlC,EAAMkC,MACb+mG,eAAgBA,EAChBC,eAAgBA,EAChBhjG,SAAUlG,EAAMkG,SAChBwzI,QAAS15I,EAAM3I,GACf2xG,OAAQhpG,EAAMgpG,QAEbzhD,EAGb,C,yHCrFA,MAAM/lD,EAAS/I,IAA0C,IAAzC,UAAC8H,EAAY,GAAE,KAAEa,EAAO,MAAY3I,EAChD,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WACxB,OACIxZ,IAAAA,cAAC+0H,EAAAA,EAAG,CACAC,WAAW,EACXl0H,KAAMA,EACNb,UAAWk3C,IAAW,SAAUl3C,GAChCuK,KAAMhB,EAAc,CAChBzS,GAAI,kBACJ0S,eAAgB,SAEtB,EAERvI,EAAAmH,UAAA,CAjBEpI,UAAS6F,IAAAA,QAmBb,S,+ICVA,MAAMzE,EAAWlJ,IAA0C,IAAzC,UAAC8H,EAAY,GAAE,KAAEa,EAAO,MAAY3I,EAClD,MAAM,cAACqR,IAAiBgQ,EAAAA,EAAAA,WAGxB,OAFsBu9B,EAAAA,EAAAA,cAAaz+C,GAA0D,UAAnCmnB,EAAAA,EAAAA,IAAUnnB,GAAO4/M,gBAGhE,KAIPl4M,IAAAA,cAAC+0H,EAAAA,EAAG,CACA90H,UAAWk3C,IAAW,WAAYl3C,GAClCa,KAAMA,EACN0J,KAAMhB,EAAc,CAChBzS,GAAI,oBACJ0S,eAAgB,WAEtB,EAERpI,EAAAgH,UAAA,CAtBEpI,UAAS6F,IAAAA,QAwBb,S,6NCbMgwR,EAAaj0O,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,cAAVq7C,CAAU,2jCAkBvB1pD,IAAA,IAAC,UAAC68H,GAAU78H,EAAA,OACV68H,GAAY3+D,EAAAA,EAAAA,KAAG,sDAGXA,EAAAA,EAAAA,KAAG,yBAEN,IA2DHz4D,IAAA,IAAC,QAAC0R,GAAQ1R,EAAA,MAAwB,mBAAZ0R,IACpB+mD,EAAAA,EAAAA,KAAG,yFAON,IAIC0/N,EAAUl0O,IAAAA,KAAWC,WAAA,CAAAt7C,YAAA,WAAXq7C,CAAW,+EAOrBkzE,EAAMz+D,IASC,IATA,QACT+wB,EAAO,QACP/3E,EAAO,UACPrP,EAAS,KACTuK,EACAzK,KAAMqrN,EAAQ,KACdtqN,EAAO,KAAI,UACXk0H,GAAY,GAER1+D,EADD+lC,E,qWAAIx8C,CAAAyW,EAAAxW,GAEP,MAAMiC,EAAOqpK,EAAWwc,IAASxc,GAAY,KACvCthN,EAAUwF,EAAU,SAAW,MAE/B0mR,GAAWr8Q,EAAAA,EAAAA,UAAQ,KACrB,OAAQ7Y,GACR,IAAK,KACD,OAAO,GACX,IAAK,KACD,OAAO,GACX,IAAK,KACD,OAAO,GAEX,QACI,OAAO,GACX,GACD,CAACA,IAEJ,OACId,IAAAA,cAAC81R,EAAU11R,OAAAC,OAAA,GACHg8F,EAAI,CACRklE,GAAIz3J,EACJkrH,UAAWA,EACX1lH,QAASA,EACTrP,UAAWk3C,IAAW,MAAO,CAAC,CAAC,QAADx2C,OAAS0mF,IAAYA,EAAS,CAAC,QAAD1mF,OAASG,IAASA,GAAOb,KAEpF8hD,GAAQ/hD,IAAAA,cAAC+hD,EAAI,CAACjhD,KAAMk1R,IACrBh2R,IAAAA,cAAC+1R,EAAO,KAAEvrR,GACD,EAIrB,GAAe+kD,EAAAA,EAAAA,MAAKwlE,E,sNC1JP62F,EAAkB9qN,IAC3B,OAAQA,GACR,IAAK,MACD,OAAO,GACX,IAAK,KACD,OAAO,GACX,IAAK,KACD,OAAO,GACX,IAAK,KACD,OAAO,GACX,IAAK,KACD,OAAO,GACX,IAAK,KACD,OAAO,GACX,IAAK,eACD,OAAO,GACX,IAAK,eACD,OAAO,GACX,IAAK,MACD,OAAO,IAEX,OAAO,CAAC,EAeND,GAASmgE,EAAAA,EAAAA,aAAuC,CAAA7oE,EAMnDyiD,KAAQ,IAN4C,IACnD75C,EAAG,SACHR,EAAQ,KACRO,EAAO,KAAI,KACX0J,GAEHrS,EADM0qH,E,qWAAKhjE,CAAA1nD,EAAA2nD,GAER,MAAM,cAACt2C,IAAiBgQ,EAAAA,EAAAA,WAElB6gM,EAAUljK,IAAW,iBAADx2C,OAAkBG,GAAQ+hH,EAAM5iH,WAE1D,OAAIuK,EAEIxK,IAAAA,cAAA,MAAAI,OAAAC,OAAA,GACQwiH,EAAK,CACTjoE,IAAKA,EACL36C,UAAWk3C,IAAWkjK,EAAS,gBAC/B,eAAc7vM,KActBxK,IAAAA,cAAA,MAAAI,OAAAC,OAAA,GACQwiH,EAAK,CACTjoE,IAAKA,EACL36C,UAAWo6M,EACXjsM,IAAK5E,EAAc,CAACzS,GAAI,aAAc0S,eAAgB,4BAA6B,CAC/ElJ,SAAUA,GAAY,SAE1BgO,IAAKxN,EACLiL,QAAQ,OACR2K,QAlBR,SAAuBxX,GACnB,MAAM82R,EAAel1R,GA1BPA,IAAgBA,EAAI8Q,WAAW7Z,EAAAA,GAAQ0gQ,iBA0BzBw9B,CAAan1R,GAzBVA,IAAgBA,EAAIkmC,QAAQ,YAAa,YAyBvBkvP,CAA8Bp1R,GAAOq1R,EAElFj3R,EAAEmkI,cAAc/0H,MAAQ0nR,IACxB92R,EAAEmkI,cAAc/0H,IAAM0nR,EAE9B,IAaM,IAIVp1R,EAAO2F,YAAc,SAErB,SAAe+oD,EAAAA,EAAAA,MAAK1uD,E,4RClDd6qG,GAAoBC,EAAAA,EAAAA,MAE1B,SAAS0qL,EAAUl+R,GAKgB,IALf,OAChBjB,GAI6BiB,EAH1BuH,E,qWAAKmgD,CAAA1nD,EAAA2nD,GAIR,MAAM18C,GAAO2zC,EAAAA,EAAAA,cAAaz+C,IAAuBi/P,EAAAA,EAAAA,IAAWj/P,EAAOpB,KAC7DiJ,GAAO42C,EAAAA,EAAAA,cAAaz+C,GAAuBozG,EAAkBpzG,GAAO,EAAzBozG,CAA+BtoG,KAE1EkzR,EAAoBp/R,GAAS8J,EAAAA,EAAAA,IAAgB9J,GAAU,GAE7D,OACI8I,IAAAA,cAACiiG,EAAAA,EAAc,CACXk1H,mBAAmB,SACnBvvH,sBAAsB,6BACtB1wG,OAAQA,EACRqX,IAAK+nR,GAELt2R,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAO/N,GAEPH,IAAAA,cAACa,EAAAA,EAAMT,OAAAC,OAAA,CACHU,KAAKC,EAAAA,EAAAA,IAAgB9J,EAAQkM,aAAI,EAAJA,EAAMy6C,qBACnC2X,UAAW,GACP91D,KAKxB,CAEA,SAASqvL,EAAOnxL,GAKN,IALO,KACbkD,EAAI,QACJk5C,EAAO,WACPggD,EAAU,kBACVsN,GAAoB,GAChB1pG,EACJ,MAAM,cAAC4L,IAAiBgQ,EAAAA,EAAAA,WAClBnjB,GAAWsxD,EAAAA,EAAAA,gBACV4uO,EAAgBC,GAAiB,qBAACC,EAAoB,gBAAEC,IAxDnE,SACIjrR,GAEmE,IADnEwM,EAAKhS,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAGwF,EAAMrC,OAEd,MAAMutR,EAAU7yR,KAAKs2D,IAAI3uD,EAAMrC,OAAQ6O,GAAS,EAAI,EAAI,EAElD2+Q,EAAenrR,EAAMqG,MAAM,EAAG6kR,GAC9BE,EAAgBprR,EAAMqG,MAAM6kR,GAE5BF,EAAuB3yR,KAAKs2D,IAAIniD,EAAQ2+Q,EAAaxtR,OAASytR,EAAcztR,OAAQ,GAG1F,MAAO,CAACwtR,EAAcC,EAAe,CAACJ,uBAAsBC,gBAFpCG,EAAcztR,OAASqtR,GAGnD,CA2CuFK,CAAU98O,EAASggD,GAChGmS,GAAgBp1D,EAAAA,EAAAA,cAAaz+C,GACxBk+R,EAAgBnzR,KAAKnM,GAAWw0G,EAAkBpzG,GAAO,EAAzBozG,EAA+B6rJ,EAAAA,EAAAA,IAAWj/P,EAAOpB,MAAUyyD,KAAK,SAGrG,gBAAC20G,EAAe,mBAAEE,IAAsBznH,EAAAA,EAAAA,aAAY8+D,EAAAA,IACpDkhL,GAA6Bp9Q,EAAAA,EAAAA,UAAQ,KAAM,CAC7CqwF,WAAYgtL,EAAAA,EAAUC,IAAI34H,EAAiBE,EAAoB,GAAG04H,iBAClE,CAAC54H,EAAiBE,KAEtBp5G,EAAAA,EAAAA,YAAU,KACFkiD,GACAjxG,GAASyzD,EAAAA,EAAAA,IAAwB9P,GACrC,GACD,CAACstD,EAAmBttD,IAEvB,IAAIm9O,EAAuB,GAwB3B,OAvBIT,IAEIS,EADAX,EAAgBptR,OACOI,EACnB,CACIzS,GAAI,wBACJ0S,eAAgB,wGAEpB,CACIgtR,uBACAxrG,MAAO9+E,IAIQ3iG,EACnB,CACIzS,GAAI,8BACJ0S,eAAgB,mEAEpB,CAACgtR,0BAMTz2R,IAAAA,cAAA,OACIC,UAAS,qBAAAU,OAAuBG,IAE/By1R,EAAelzR,KAAKtM,GACjBiJ,IAAAA,cAACq2R,EAAU,CACPjpR,MAAO2pR,EACPr5R,IAAK3G,EACLG,OAAQH,EACR+J,KAAMA,MAGbyL,QAAQmqR,IACL12R,IAAAA,cAACq1D,EAAAA,EAAW,CACRnnD,MAAOipR,GAEPn3R,IAAAA,cAACa,EAAAA,EAAM,CACHuM,MAAO2pR,EACPj2R,KAAMA,EACN00D,SAAU,EACVhrD,KAAMksR,EAtHD,GAsH0C,GAAH/1R,OAtHvC,GAsHiE,SAAAA,OAAU+1R,MAMxG,CAEA,SAAennO,EAAAA,EAAAA,MAAKw/H,E,qNCnIpB,SAASqoG,EAAe13R,GACpB,MAAM,cAAC8J,IAAiBgQ,EAAAA,EAAAA,WAExB,IAAItL,EAAQxO,EAAMwO,OACd6yI,EAAAA,EAAAA,IAAoB7yI,KACpBA,EAAQ1E,EAAc0E,IAG1B,IAAI5J,EAAO5E,EAAM4E,KAKjB,OAJIy8I,EAAAA,EAAAA,IAAoBz8I,KACpBA,EAAOkF,EAAclF,IAIrBtE,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,QACIC,UAAWk3C,IAAW,+BAAgC,CAClD6wE,aAActoH,EAAMsoH,gBAGvBtoH,EAAM2kC,OACHrkC,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAAC47G,EAAAA,EAAW,CACRC,UAAWn8G,EAAM2kC,MACjBvjC,KAAMpB,EAAMsoH,aAlCJ,GADN,MAuCdhoH,IAAAA,cAAA,QAAMC,UAAU,uBAAuBiO,IAE1CxO,EAAM4E,MACHtE,IAAAA,cAAA,QAAMC,UAAU,sBAAsBqE,GAEzC5E,EAAM41D,UACHt1D,IAAAA,cAAA,QAAMC,UAAU,0BACZD,IAAAA,cAACq3R,EAAAA,EAAe,CAAC/hO,SAAU51D,EAAM41D,YAKrD,CAAC8hO,EAAA/uR,UAAA,CA9CGg8B,MAAKv+B,IAAAA,OACLkiH,aAAYliH,IAAAA,MA+ChB,SAAeypD,EAAAA,EAAAA,MAAK6nO,G,w9BCkBL,SAAS/hO,EAAWl9D,GAYzB,IAZ0B,SAChCk8D,EAAQ,MACRnmD,EAAK,MACLm2B,EAAK,aACL2jF,GAAe,EAAK,KACpB1jH,EAAI,SACJgxD,EAAQ,WACR0yB,GAAa,EAAI,WACjBgD,GAAa,EAAK,UAClB/qF,EAAS,OACTsrL,EAAM,SACNlkL,GACIlP,EACJ,MAAOwZ,EAAMw0F,IAAW5sF,EAAAA,EAAAA,WAAS,GAE3B+9Q,GAAWzrO,EAAAA,EAAAA,QAAO,MAUlB0rO,GAAa59Q,EAAAA,EAAAA,UAAqD,KACpE,IAAI+9M,EACAphE,EAQJ,OAPItuE,GACA0vI,EAAU,MACVphE,EAAW,CAAC,SAAU,QAAS,UAE/BohE,EAAU,QACVphE,EAAW,CAAC,OAAQ,MAAO,WAExB,CAACohE,UAASphE,WAAS,GAC3B,CAACtuE,KAEG76B,MAAM,aAACC,EAAY,YAAEC,GAAY,eAAE+4C,EAAgBt2F,QAASu2F,IAAmB/4C,EAAAA,EAAAA,IAAY,CAC9F37C,MAAMtK,GAAmBsK,EACzB47C,aAvBJ,SAAsB57C,GAClBw0F,EAAQx0F,GAEJ45K,GAAU55K,GACV45K,GAER,EAkBIprG,qBAAsBC,EAAAA,GACtB5yB,UAAW+pO,EAAW7/D,QACtBjqK,WAAY,EACRC,EAAAA,EAAAA,IAAO8pO,EAAAA,GAAaC,SACpBp3M,EAAAA,EAAAA,IAAK,CACDC,mBAAoBi3M,EAAWjhI,YAEnCohI,EAAAA,EAAAA,IAAM,CACF5tR,QAASwtR,QAKf,UAAC/wL,EAAWnkG,OAAQokG,IAAoBC,EAAAA,EAAAA,IAAoBJ,EAAiB4wH,GAE7E1yG,GAAQyiE,EAAAA,EAAAA,IAAS3gF,EAAiB,CACpC8gF,OAAQowC,EAAAA,GAAgBogE,6BACxBzwG,MAAO,CACHv1K,KAAM4lN,EAAAA,GAAgBqgE,yBACtB1jQ,MAAO82D,EAAausI,EAAAA,GAAgBsgE,oCAAsCtgE,EAAAA,GAAgBugE,4BAG5Fp2Q,GAAQq2Q,EAAAA,EAAAA,IAAS1xL,GACjBl4C,GAAUC,EAAAA,EAAAA,IAAWi4C,GACrBv5F,GAAO6zE,EAAAA,EAAAA,IAAQ0lB,EAAiB,CAACv5F,KAAM,aAEvC,kBAACghD,EAAiB,iBAAEE,IAAoBE,EAAAA,EAAAA,IAAgB,CAACq2D,EAAO7iG,EAAOysC,EAASrhD,KAEjFkrR,EAAAA,EAAAA,gBAAe3jO,IAEhB38B,QAAQhhC,MAAM,0DAGlB,MAAMuhS,GAAaC,EAAAA,EAAAA,IAAa,CAAC9qO,EAAeiH,aAAQ,EAARA,EAAkBzZ,MAE5D8zN,GAAUypB,EAAAA,EAAAA,cACZ9jO,EACAvG,EAAiBh3D,EAAC,CACd8jD,IAAKq9O,GACF5jO,EAAS30D,SAIpB,OACIM,IAAAA,cAAAA,IAAAA,SAAA,KACK0uQ,EAEAnoK,GACGvmG,IAAAA,cAAC8gF,EAAAA,GAAc,CAAC/pF,GAAIugO,EAAAA,IAChBt3N,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKyS,EACLptD,UAAWk3C,IAAW,mBAAoBl3C,GAC1CmN,MAAKtW,EAAAA,EAAA,GAAMsvG,GAAmBI,IAC1Bx4C,KAEJhuD,IAAAA,cAACo3R,EAAc,CACXlpR,MAAOA,EACPm2B,MAAOA,EACP2jF,aAAcA,EACd1jH,KAAMA,EACNgxD,SAAUA,IAEdt1D,IAAAA,cAACo4R,EAAAA,GAAa,CACVx9O,IAAK08O,EACLxnR,QAASu2F,EACTh4F,MAAOmpR,EAAAA,GAAaa,MACpB/pR,OAAQkpR,EAAAA,GAAac,WAOjD,EAnKSppR,EAAAA,EAAAA,eAAc,CACfnY,GAAI,wBACJ0S,eAAgB,SAGdyF,EAAAA,EAAAA,eAAc,CAChBnY,GAAI,yBACJ0S,eAAgB,UAGbyF,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,0BACJ0S,eAAgB,UAyJxB,MAAMwtN,EAAyB,CAC3BvwH,SAAU,CACN/0F,KAAM4lN,EAAAA,GAAgBC,iBACtBtjM,MAAOqjM,EAAAA,GAAgBE,mBAE3BC,QAASC,EAAAA,GAAwB/qD,M,kICpM9B,MAAMz3G,EAAe,CACxB/mD,KAAKc,EAAAA,EAAAA,eAAc,CACfnY,GAAI,wBACJ0S,eAAgB,QAEpB4lB,IAAK,IACL+lC,MAAMlmD,EAAAA,EAAAA,eAAc,CAChBnY,GAAI,yBACJ0S,eAAgB,SAEpBtD,OAAQ,IACRo6E,OAAOrxE,EAAAA,EAAAA,eAAc,CACjBnY,GAAI,0BACJ0S,eAAgB,WAexB,SAAS4tR,EAAgB33R,GACrB,IAAI41D,EAAW51D,EAAM41D,SAASP,QAK9B,OAJIr1D,EAAM41D,SAASN,MAAOjN,EAAAA,EAAAA,QACtBuN,EAAW51D,EAAM41D,SAASN,KAI1Bh1D,IAAAA,cAAAA,IAAAA,SAAA,KACKs1D,EAASjyD,KAAK82L,IACX,IAAIz8L,EACA0+F,EASJ,OARI2kD,EAAAA,EAAAA,IAAoBo5C,IACpBz8L,EAAMy8L,EAAYpjM,GAClBqlG,EAAUp8F,IAAAA,cAACgK,EAAAA,iBAAqBmwL,KAEhCz8L,EAAMy8L,EACN/9F,EAAU+9F,GAIVn6L,IAAAA,cAACohJ,EAAAA,EAAW,CACR1jJ,IAAKA,EACL2pF,QAASg6D,EAAAA,EAAmBC,SAE3BllD,EACS,IAKlC,CAACi7L,EAAAhvR,UAAA,CAjCGitD,SAAQxvD,IAAAA,MAAA,CALRivD,QAAOjvD,IAAAA,MAAAC,WACPivD,IAAGlvD,IAAAA,QAAAC,YAuCP,SAAewpD,EAAAA,EAAAA,MAAK8nO,E,suBCnCb,SAASkB,EAAOpgS,GAAkE,IAAjE,YAACqgS,EAAc,GAAE,UAAEC,EAAY,GAAE,SAAEC,EAAQ,OAAEC,GAAkBxgS,EACnF,MAAMygS,EAAY,CACdC,aAAcL,EACdM,WAAYL,EACZM,UAAWL,EACXM,QAASL,GAEb,OAAO7gS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQugS,QACpB7hR,UAAW,CAACm2B,EAAAA,GAAWosP,eACvBhhS,OAAQ,CACJ2gS,IAGZ,CAEO,SAASM,IAAyE,IAA5Dj6R,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQuyP,uBAC7D,OAAOrhS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQkhS,aACpBxiR,UAAW,CAACm2B,EAAAA,GAAWusP,qBACvBnhS,OAAQ,CACJgH,EACA09C,IAGZ,CAEO,SAAS08O,IAAiE,IAAvDp6R,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ0yP,kBAC1D,OAAOxhS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQqhS,UACpB3iR,UAAW,CAACm2B,EAAAA,GAAW0sP,iBACvBthS,OAAQ,CACJgH,EACA09C,IAGZ,CAEO,SAASl9B,IACZ,OAAO3nB,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQynB,UACpB/I,UAAW,CAACm2B,EAAAA,GAAW2sP,kBAE/B,CAEO,SAASC,EAAY9+R,GACxB,OAAO7C,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQyhS,YACpB/iR,UAAW,CAACm2B,EAAAA,GAAW2sP,iBACvBvhS,OAAQ,CACJ0C,IAGZ,CAEO,SAASnE,IACZ,OAAOsB,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQxB,cAE5B,CAEO,SAASkjS,IACZ,OAAO5hS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ0hS,qBACpBhjR,UAAW,CAACm2B,EAAAA,GAAW8sP,8BAE/B,CAEO,SAASC,EAAUj/R,GACtB,OAAO7C,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ4hS,UACpB3hS,OAAQ,CACJ0C,IAGZ,CAEO,SAAS4C,EAAYC,GACxB,OAAO1F,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQuF,YACpBtF,OAAQ,CACJuF,IAGZ,CAEO,SAAS5C,EAAiBD,GAC7B,OAAO7C,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ4C,iBACpB3C,OAAQ,CACJ0C,IAGZ,CAEO,SAASk/R,IACZ,OAAO/hS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ6hS,kBAE5B,CAEO,SAASC,IACZ,OAAOhiS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ8hS,iBAE5B,CAEO,SAASC,EAAuB9+R,GACnC,OAAOnD,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ+hS,uBACpBC,UAAWntP,EAAAA,GAAWotP,0BACtBvjR,UAAW,CAACm2B,EAAAA,GAAWqtP,2BAA4BrtP,EAAAA,GAAWstP,2BAC9DC,UAAWvtP,EAAAA,GAAWwtP,0BACtBpiS,OAAQ,CACJgD,IAGZ,CAYO,SAASq/R,IAA4E,IAAvDr7R,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ0yP,kBACrE,OAAOxhS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQsiS,qBACpB5jR,UAAW,CAACm2B,EAAAA,GAAW0tP,6BACvBtiS,OAAQ,CACJgH,EACA09C,IAGZ,CAEO,SAASrjD,EAAiBkhS,GAC7B,OAAO1iS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQsB,iBACpBrB,OAAQ,CACJuiS,IAGZ,CAEO,SAAShhS,IACZ,OAAO1B,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQwB,kBAE5B,CAEO,SAASpC,IACZ,OAAOU,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQZ,iBACpBsf,UAAW,CAACm2B,EAAAA,GAAW4tP,0BAE/B,CAEO,SAASC,IACZ,OAAO5iS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ0iS,UAE5B,CAQO,SAASC,IAAsG,IAAxF17R,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQg0P,kBAAmBloQ,EAAqBzsB,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC0sB,EAAG,IAC7G,OAAO76B,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ2iS,cACpBjkR,UAAW,CAACm2B,EAAAA,GAAWguP,sBACvB5iS,OAAQ,CACJgH,EACA09C,EACAjqB,IAGZ,CAEO,SAASooQ,EAAcp9R,GAC1B,OAAOnH,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQ8iS,cAAcp9R,EACvC,CAAE,MAAOhH,GAIL,OAHAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EAAS,CAAC6E,KAAM2xC,EAAAA,GAAWkuP,wBAAyBrkS,QAAOC,KAAM+G,IACjErH,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAYA,OAVAL,EAAS,CACL6E,KAAM2xC,EAAAA,GAAWmuP,kBACjBrkS,KAAM,CACFskS,YAAav9R,EACbyC,KAAMxJ,EAAKkJ,aACXq7R,oBAAqBvkS,EAAKI,GAC1BokS,eAAe,KAIhB,CAACxkS,MAAM,EAAK,CAE3B,CAEO,SAASykS,EAAgB19R,GAC5B,OAAOnH,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQojS,gBAAgB19R,EAClC,CAAE,MAAOhH,GAIL,OAHAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EAAS,CAAC6E,KAAM2xC,EAAAA,GAAWwuP,0BAA2B3kS,QAAOC,KAAM+G,IACnErH,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAOA,OALAL,EAAS,CACL6E,KAAM2xC,EAAAA,GAAWyuP,oBACjB3kS,KAAM+G,IAGH,CAAC/G,MAAM,EAAK,CAE3B,CASO,SAAS8C,EAA4B8hS,GACxC,OAAOzjS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQyB,4BACpBxB,OAAQ,CACJsjS,IAGZ,CAEO,SAAS5hS,EAA6B4hS,GACzC,OAAOzjS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ2B,6BACpB1B,OAAQ,CACJsjS,IAGZ,CAEO,SAAS3hS,EAA4B2hS,GACxC,OAAOzjS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ4B,4BACpB3B,OAAQ,CACJsjS,IAGZ,CAEO,SAAS1hS,EAA6B0hS,GACzC,OAAOzjS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ6B,6BACpB5B,OAAQ,CACJsjS,IAGZ,CAEO,SAASzhS,EAAyByhS,GACrC,OAAOzjS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ8B,yBACpB7B,OAAQ,CACJsjS,IAGZ,CAEO,SAASxhS,IACZ,OAAOjC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQwjS,6BAE5B,CAEO,SAASxhS,IACZ,OAAOlC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQyjS,8BAE5B,CAEO,SAASxhS,IACZ,OAAOnC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ0jS,6BAE5B,CAEO,SAASxhS,IACZ,OAAOpC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ2jS,8BAE5B,CAEO,SAASxhS,IACZ,OAAOrC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ4jS,0BAE5B,CAEO,SAASC,EAAkBlhS,GAC9B,OAAO7C,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ6jS,kBACpB5jS,OAAQ,CACJ0C,IAGZ,CAEO,SAASmhS,EAA0BhhS,GACtC,OAAOhD,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ8jS,0BACpB7jS,OAAQ,CACJ6C,IAGZ,CAEO,SAASihS,EAAcR,GAC1B,OAAOzjS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ+jS,cACpB9jS,OAAQ,CACJsjS,IAGZ,CAEO,SAASS,IACZ,OAAOzlS,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQgkS,eAClB,CAAE,MAAOtlS,GAGL,OAFAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,MAAOA,EACnB,CAIA,aAFML,GAAS4mG,EAAAA,EAAAA,MAER,CAACtmG,MAAM,EAAK,CAE3B,CAEO,SAASkzN,IACZ,OAAOtzN,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQ6xN,qBACzB,CAAE,MAAOnzN,GAEL,OADAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GAChD,CAACjf,QACZ,CAGA,OADAL,EAAS,CAAC6E,KAAM2xC,EAAAA,GAAWovP,2BAA4BtlS,SAChD,CAACA,OAAK,CAErB,CAEO,SAASulS,EAAa/7R,GAA4C,IAA9B9F,EAAM4L,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAChD,OAAO1P,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQkkS,aAAa/7R,EAAM9F,EAC5C,CAAE,MAAO3D,GAGL,OAFAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAQA,OALIL,EADW,KAAXgE,EACS,CAACa,KAAM2xC,EAAAA,GAAWsvP,0BAA2BxlS,OAAMwJ,QAEnD,CAACjF,KAAM2xC,EAAAA,GAAWuvP,wBAAyBzlS,OAAMwJ,OAAM9F,WAG7D,CAAC1D,OAAK,CAErB,CAEO,SAASyD,IACZ,OAAO8hS,EAAa,WADmBj2R,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAE9C,CAEO,SAAS3L,IACZ,OAAO4hS,EAAa,eADmBj2R,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAE9C,CAEO,SAASzL,IACZ,OAAO0hS,EAAa,kBADsBj2R,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAEjD,CAEO,SAAS1L,IACZ,OAAO2hS,EAAa,sBADyBj2R,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAEpD,CAEO,SAASxL,IACZ,OAAOyhS,EAAa,6BADsBj2R,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAEjD,CAEO,SAASo2R,EAAad,GAAgD,IAAhCe,EAAKr2R,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAC9C,OAAO1P,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQqkS,aAAad,EAAUe,EAChD,CAAE,MAAO5lS,GAGL,OAFAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAEA,MAAO,CAACC,OAAK,CAErB,CAEO,SAAS4lS,EAAqBx7R,GAA6C,IAAhCu7R,EAAKr2R,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GACnD,OAAO1P,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQukS,qBAAqBx7R,EAAKu7R,EACnD,CAAE,MAAO5lS,GAGL,OAFAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAEA,MAAO,CAACC,OAAK,CAErB,CAEO,SAASu7K,KACZ,OAAOp6K,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQk6K,WACpBx7J,UAAW,CAACm2B,EAAAA,GAAW2vP,mBAE/B,CAEO,SAASvjH,KACZ,OAAOnhL,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQihL,kBACpBviK,UAAW,CAACm2B,EAAAA,GAAWC,2BAE/B,CAEO,SAAShB,GAAa7uC,GACzB,OAAO1G,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQ8zC,aAAa7uC,EAC/B,CAAE,MAAOvG,GAGL,OAFAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAOA,OALAL,GAASoiB,EAAAA,EAAAA,IAAa,CAClB,CAACvd,KAAM2xC,EAAAA,GAAW4vP,eAAgB9lS,KAAMsG,GACxC,CAAC/B,KAAM2xC,EAAAA,GAAW6vP,gBAAiB/lS,KAAMsG,MAGtC,CAACtG,MAAM,EAAK,CAE3B,CAEO,SAASgmS,GAAa1/R,GACzB,OAAO1G,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQ2kS,aAAa1/R,EAC/B,CAAE,MAAOvG,GAGL,OAFAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAIA,OAFAL,EAAS,CAAC6E,KAAM2xC,EAAAA,GAAW+vP,eAAgBjmS,KAAMsG,IAE1C,CAACtG,MAAM,EAAK,CAE3B,CAEO,SAASkmS,GAAc5/R,GAC1B,OAAO1G,MAAOF,EAAUsf,KACpBtf,EAAS,CAAC6E,KAAM2xC,EAAAA,GAAWiwP,uBAAwBnmS,KAAMsG,IAEzD,UACUjF,EAAAA,GAAQ6kS,cAAc5/R,EAChC,CAAE,MAAOvG,GAGL,OAFAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAIA,OAFAL,EAAS,CAAC6E,KAAM2xC,EAAAA,GAAW6vP,gBAAiB/lS,KAAMsG,IAE3C,CAACtG,MAAM,EAAK,CAE3B,CAEO,SAASuH,GAAuBC,GACnC,OAAOrG,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQkG,uBACpBwY,UAAWm2B,EAAAA,GAAWkwP,gCACtB9kS,OAAQ,CACJkG,IAGZ,CAEO,SAASC,GAAkCC,GAC9C,OAAOvG,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQoG,kCACpBnG,OAAQ,CACJoG,IAGZ,CAEO,SAAS2+R,KAA+G,IAAhF/9R,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAO12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAC/D,OAAO1P,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQglS,+BAA+B/9R,EAAM09C,EAC9D,CAAE,MAAOjmD,GAQL,OAPAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EACI,CACI6E,KAAM2xC,EAAAA,GAAWowP,wCACjBvmS,UAGD,CAACA,QACZ,CAMA,OAJAL,EACI,CAAC6E,KAAM2xC,EAAAA,GAAWowP,wCAAyCtmS,SAGxD,CAACA,OAAK,CAErB,CAEO,SAASumS,GAA6BnmS,GACzC,OAAOR,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQklS,6BAA6BnmS,EACtD,CAAE,MAAOL,GAQL,OAPAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EACI,CACI6E,KAAM2xC,EAAAA,GAAWswP,sCACjBzmS,UAGD,CAACA,QACZ,CAMA,OAJAL,EACI,CAAC6E,KAAM2xC,EAAAA,GAAWswP,sCAAuCxmS,SAGtD,CAACA,OAAK,CAErB,CAEO,SAASymS,GAAgCrmS,GAC5C,OAAOR,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQolS,gCAAgCrmS,EAClD,CAAE,MAAOL,GAQL,OAPAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EACI,CACI6E,KAAM2xC,EAAAA,GAAWwwP,4CACjB3mS,UAGD,CAACA,QACZ,CACA,MAAMC,EAAO,CACTI,MAMJ,OAJAV,EACI,CAAC6E,KAAM2xC,EAAAA,GAAWywP,4CAA6C3mS,SAG5D,CAACA,OAAK,CAErB,CAEO,SAAS4mS,GAAkCxmS,GAA2F,IAA/EkI,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ42P,iBAC9F,OAAOjnS,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQulS,kCAAkCxmS,EAAIkI,EAAM09C,EACrE,CAAE,MAAOjmD,GAQL,OAPAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EACI,CACI6E,KAAM2xC,EAAAA,GAAW4wP,4CACjB/mS,UAGD,CAACA,QACZ,CAMA,OAJAL,EACI,CAAC6E,KAAM2xC,EAAAA,GAAW4wP,4CAA6C9mS,SAG5D,CAACA,OAAK,CAErB,CAEO,SAAS+mS,GAAqC3mS,GAA+H,IAAnHkI,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ42P,iBACjG,OAAOjnS,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQ0lS,qCAAqC3mS,EAAIkI,EAAM09C,EACxE,CAAE,MAAOjmD,GAQL,OAPAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EACI,CACI6E,KAAM2xC,EAAAA,GAAW8wP,+CACjBjnS,UAGD,CAACA,QACZ,CAMA,OAJAL,EACI,CAAC6E,KAAM2xC,EAAAA,GAAW8wP,+CAAgDhnS,SAG/D,CAACA,OAAK,CAErB,CAEO,SAASinS,GAAqC7mS,EAAY6gC,EAAclF,GAC3E,OAAOn8B,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQ4lS,qCAAqC7mS,EAAI6gC,EAAMlF,EACxE,CAAE,MAAOh8B,GAQL,OAPAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EACI,CACI6E,KAAM2xC,EAAAA,GAAWgxP,mDACjBnnS,UAGD,CAACA,QACZ,CAMA,OAJAL,EACI,CAAC6E,KAAM2xC,EAAAA,GAAWgxP,mDAAoDlnS,SAGnE,CAACA,OAAK,CAErB,CAEO,SAASmnS,GAAwC/mS,EAAY6gC,EAAclF,GAC9E,OAAOn8B,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQ8lS,wCAAwC/mS,EAAI6gC,EAAMlF,EAC3E,CAAE,MAAOh8B,GAQL,OAPAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EACI,CACI6E,KAAM2xC,EAAAA,GAAWkxP,sDACjBrnS,UAGD,CAACA,QACZ,CAMA,OAJAL,EACI,CAAC6E,KAAM2xC,EAAAA,GAAWkxP,sDAAuDpnS,SAGtE,CAACA,OAAK,CAErB,CAEO,SAASqnS,GAAgCC,GAC5C,OAAO1nS,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQkmS,0BAA0BD,EACnD,CAAE,MAAOvnS,GAEL,OADAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GAChD,CAACjf,QACZ,CAMA,OAJAL,EACI,CAAC6E,KAAM2xC,EAAAA,GAAWsxP,4CAA6CxnS,SAG5D,CAACA,OAAK,CAErB,CAEO,SAASynS,GAAgCrnS,EAAYknS,GACxD,OAAO1nS,MAAOF,EAAUsf,KACpB,IAAIhf,EACJ,IACIA,QAAaqB,EAAAA,GAAQqmS,0BAA0BtnS,EAAIknS,EACvD,CAAE,MAAOvnS,GAEL,OADAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GAChD,CAACjf,QACZ,CAMA,OAJAL,EACI,CAAC6E,KAAM2xC,EAAAA,GAAWyxP,4CAA6C3nS,SAG5D,CAACA,OAAK,CAErB,CAEO,SAAS4nS,GAAkCxnS,EAAYqmC,GAC1D,OAAOtlC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQwmS,4BACpB9nR,UAAWm2B,EAAAA,GAAW4xP,+CACtBxmS,OAAQ,CACJlB,EACAqmC,IAGZ,CAEO,SAASshQ,GAAqC3nS,EAAYqmC,GAC7D,OAAO7mC,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQ2mS,+BAA+B5nS,EAAIqmC,EACrD,CAAE,MAAO1mC,GAQL,OAPAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EACI,CACI6E,KAAM2xC,EAAAA,GAAW+xP,kDACjBloS,UAGD,CAACA,QACZ,CACA,MAAMC,EAAO,CACTymC,SAMJ,OAJA/mC,EACI,CAAC6E,KAAM2xC,EAAAA,GAAWgyP,kDAAmDloS,SAGlE,CAACA,OAAK,CAErB,CAEO,SAASmoS,GAAqC/nS,EAAY8tB,GAC7D,OAAO/sB,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ+mS,+BACpBroR,UAAWm2B,EAAAA,GAAWmyP,kDACtB/mS,OAAQ,CACJlB,EACA8tB,IAGZ,CAEO,SAASo6Q,GAAwCloS,EAAY8tB,GAChE,OAAOtuB,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQknS,kCAAkCnoS,EAAI8tB,EACxD,CAAE,MAAOnuB,GAQL,OAPAuiB,EAAAA,EAAAA,IAAuBviB,EAAsBL,EAAUsf,GACvDtf,EACI,CACI6E,KAAM2xC,EAAAA,GAAWsyP,qDACjBzoS,UAGD,CAACA,QACZ,CACA,MAAMC,EAAO,CACTkuB,YAMJ,OAJAxuB,EACI,CAAC6E,KAAM2xC,EAAAA,GAAWuyP,qDAAsDzoS,SAGrE,CAACA,OAAK,CAErB,CASO,SAAS0oS,KACZ,OAAOvnS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQqnS,4BAE5B,CAEO,SAAS7nS,KACZ,OAAOM,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQR,aACpBS,OAAQ,IAEhB,CAEO,SAASR,KACZ,OAAOK,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQP,aACpBQ,OAAQ,IAEhB,CAEO,SAASP,GAAe4nS,GAC3B,OAAOxnS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQN,eACpBO,OAAQ,CAACqnS,IAEjB,C,+GC91BO,SAAS3iR,EAAiB9I,GAC7B,OAAOtd,MAAOF,EAAUsf,KACpB,IAAK9B,EACD,MAAO,CAACld,MAAM,GAGlB,MAAM2B,EAAQqd,IACR/R,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAOub,GAC5B86B,GAAS/qC,aAAO,EAAPA,EAAS4W,WAAWC,EAAAA,EAAAA,IAAiBniB,GAEpD,OAAOjC,GAASyB,EAAAA,EAAAA,IAAe,CAC3BC,WAAYA,IAAMC,EAAAA,GAAQqa,gBAAgBwB,EAAW86B,GACrDj4B,UAAW+7B,EAAAA,GAAU8sP,sBACrBnF,UAAW3nP,EAAAA,GAAU+sP,+BACtB,CAEX,CAEO,SAAS9oP,EAAqB7iC,GACjC,OAAOtd,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IAER8pR,GAAmBpkR,EAAAA,EAAAA,IAAoB/iB,GACvCsL,GAAUshB,EAAAA,EAAAA,GAAW5sB,EAAOub,GAC5B86B,GAAS/qC,aAAO,EAAPA,EAAS4W,WAAWC,EAAAA,EAAAA,IAAiBniB,GAEpD,OAEWjC,EAFPwd,IAAc4rR,EAEE,CACZ9oS,KAFayhB,KAAKC,MAAMD,KAAK4iE,UAAU1iF,EAAMuyB,SAASwnJ,KAAKpuD,KAAKvxG,WAGhExX,KAAMu3C,EAAAA,GAAUitP,4BAIR5nS,EAAAA,EAAAA,IAAe,CAC3BC,WAAYA,IAAMC,EAAAA,GAAQqa,gBAAgBwB,EAAW86B,GACrDj4B,UAAW+7B,EAAAA,GAAUitP,0BACrBtF,UAAW3nP,EAAAA,GAAU+sP,+BACtB,CAEX,C,sHC3CO,SAAS1pR,IACZ,OAAOhe,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ2nS,gBACpBjpR,UAAW,CAAClC,EAAAA,GAAWw7B,6BACvBoqP,UAAW5lR,EAAAA,GAAWorR,0BACtB5F,UAAWxlR,EAAAA,GAAWqrR,4BAE9B,CAEO,SAAS7pR,EAAiB8pR,GAC7B,OAAOhoS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQge,iBACpBU,UAAW,CAAClC,EAAAA,GAAWurR,yBACvB3F,UAAW5lR,EAAAA,GAAWwrR,sBACtBhG,UAAWxlR,EAAAA,GAAWyrR,uBACtBhoS,OAAQ,CAAC6nS,IAEjB,CAEO,SAAS5pR,IACZ,OAAOpe,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQke,iBACpBQ,UAAW,CAAClC,EAAAA,GAAW0rR,yBACvB9F,UAAW5lR,EAAAA,GAAW2rR,sBACtBnG,UAAWxlR,EAAAA,GAAW4rR,wBAE9B,CAEO,SAAShqR,IACZ,OAAOte,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQoe,YACpBM,UAAW,CAAClC,EAAAA,GAAW6rR,yBACvBjG,UAAW5lR,EAAAA,GAAW8rR,sBACtBtG,UAAWxlR,EAAAA,GAAW+rR,wBAE9B,CAEO,SAASC,EAAoBC,GAChC,OAAO3oS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQwoS,oBACpB9pR,UAAW,CAAClC,EAAAA,GAAW0rR,yBACvBjoS,OAAQ,CAACwoS,IAEjB,CAEO,SAASC,EAA2BC,GACvC,OAAO7oS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ0oS,2BACpBhqR,UAAW,CAAClC,EAAAA,GAAW0rR,yBACvBjoS,OAAQ,CAAC0oS,IAEjB,C,ocCzCO,SAASC,EAAmBxnO,GAC/B,OAAOthE,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ6oS,sBACpBnqR,UAAW,CAACub,EAAAA,GAAiB6uQ,wBAC7B7oS,OAAQ,CACJmhE,IAGZ,CAEO,SAAS2nO,EAAgBC,GAC5B,OAAOlpS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQipS,mBACpBvqR,UAAW,CAACub,EAAAA,GAAiB6uQ,wBAC7B7oS,OAAQ,CACJ+oS,IAGZ,CAEO,SAASE,IAAgL,IAA/J7mS,EAAM4L,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAAIhH,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ0yP,kBAAmB6H,EAAiBl7R,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAClH,OAAO1P,MAAOF,EAAUsf,KACpB,IAAIhf,EAEJ,IACIA,QAAaqB,EAAAA,GAAQopS,oBAAoB/mS,EAAQ4E,EAAM09C,EAASwkP,EACpE,CAAE,MAAOzqS,GAGL,OAFAuiB,EAAAA,EAAAA,IAAuBviB,EAAOL,EAAUsf,GACxCtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAEA,MAAM2qS,EAAsBC,EAA4B3qS,GAElDoM,EAAuB,CAAC,CAC1B7H,KAAM+2B,EAAAA,GAAiBsvQ,wBACvB5qS,KAAM0qS,EAAuB1qS,EAAmC6qS,kBAAoB7qS,IAWxF,OARI0qS,GACAt+R,EAAQiP,KAAK,CACT9W,KAAM+2B,EAAAA,GAAiBwvQ,oCACvB9qS,KAAOA,EAAmC+qS,cAIlDrrS,GAASoiB,EAAAA,EAAAA,IAAa1V,IACf,CAACpM,OAAK,CAErB,CAEO,SAAS2qS,EAA4B3qS,GACxC,YAAyC,IAA3BA,EAAK6qS,mBACfp7R,MAAMC,QAAQ1P,EAAK6qS,oBACS,iBAArB7qS,EAAK+qS,WACpB,CAEO,SAASC,EAAmBX,GAC/B,OAAOzqS,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQ4pS,sBAAsBZ,EACxC,CAAE,MAAOtqS,GAIL,OAHAuiB,EAAAA,EAAAA,IAAuBviB,EAAOL,EAAUsf,GAExCtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CASA,OAPAL,GAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAM+2B,EAAAA,GAAiB4vQ,sBACvBlrS,KAAM,CAACI,GAAIiqS,OAIZ,CAACrqS,MAAM,EAAK,CAE3B,CAEO,SAASmrS,EAAmB1oO,GAC/B,OAAOthE,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ+pS,sBACpBrrR,UAAW,CAACub,EAAAA,GAAiB6uQ,wBAC7B7oS,OAAQ,CACJmhE,IAGZ,CAEO,SAAS4oO,EAAmB5oO,GAC/B,OAAOthE,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQiqS,sBACpBvrR,UAAW,CAACub,EAAAA,GAAiBiwQ,wBAC7BjqS,OAAQ,CACJmhE,IAGZ,CAEO,SAAS+oO,EAAgBnB,GAC5B,OAAOlpS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQoqS,mBACpB1rR,UAAW,CAACub,EAAAA,GAAiBiwQ,wBAC7BjqS,OAAQ,CACJ+oS,IAGZ,CAEO,SAASqB,IAAqG,IAApFjwR,EAASnM,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAAI5L,EAAM4L,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAAIhH,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ0yP,kBAC9F,OAAOxhS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQsqS,oBACpB5rR,UAAW,CAACub,EAAAA,GAAiBswQ,yBAC7BtqS,OAAQ,CACJma,EACA/X,EACA4E,EACA09C,IAGZ,CAEO,SAAS6lP,EAAmBxB,GAC/B,OAAOzqS,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQyqS,sBAAsBzB,EACxC,CAAE,MAAOtqS,GAIL,OAHAuiB,EAAAA,EAAAA,IAAuBviB,EAAOL,EAAUsf,GAExCtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CASA,OAPAL,GAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAM+2B,EAAAA,GAAiBywQ,sBACvB/rS,KAAM,CAACI,GAAIiqS,OAIZ,CAACrqS,MAAM,EAAK,CAE3B,CAEO,SAASgsS,EAAmBvpO,GAC/B,OAAOthE,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ4qS,sBACpBlsR,UAAW,CAACub,EAAAA,GAAiBiwQ,wBAC7BjqS,OAAQ,CACJmhE,IAGZ,CAEO,SAASypO,EAAuB7B,GACnC,OAAOlpS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ6qS,uBACpBnsR,UAAW,CAACub,EAAAA,GAAiBiwQ,wBAC7BjqS,OAAQ,CACJ+oS,IAGZ,CAwBO,SAAS8B,EAAsBzoS,GAClC,OAAOvC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ8qS,sBACpBpsR,UAAW,CAACub,EAAAA,GAAiB8wQ,+BAC7B9qS,OAAQ,CACJoC,IAGZ,CAEO,SAAS2oS,EAAWvzQ,GACvB,OAAO33B,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQgrS,WACpBtsR,UAAW,CAACub,EAAAA,GAAiBgxQ,kBAC7BhrS,OAAQ,CACJw3B,IAGZ,CAEO,SAASyzQ,EAAYzzQ,GACxB,OAAO33B,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQkrS,YACpBxsR,UAAW,CAACub,EAAAA,GAAiBgxQ,kBAC7BhrS,OAAQ,CACJw3B,IAGZ,CAYO,SAAS0zQ,EAAkBpsS,GAC9B,OAAOR,MAAOF,EAAUsf,KACpB,IAAIxL,EACJ,IACIA,QAAYnS,EAAAA,GAAQmrS,kBAAkBpsS,EAC1C,CAAE,MAAOL,GAIL,OAHAuiB,EAAAA,EAAAA,IAAuBviB,EAAOL,EAAUsf,GAExCtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAYA,OAVAL,GAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAM+2B,EAAAA,GAAiBmxQ,uBACvBzsS,KAAM,CACFI,KACA6B,MAAOuR,EAAIvR,WAKhB,CAACjC,MAAM,EAAK,CAE3B,CAEO,SAAS0sS,EAActsS,GAC1B,OAAOR,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQqrS,cAActsS,EAChC,CAAE,MAAOL,GAIL,OAHAuiB,EAAAA,EAAAA,IAAuBviB,EAAOL,EAAUsf,GAExCtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CASA,OAPAL,GAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAM+2B,EAAAA,GAAiBqxQ,gBACvB3sS,KAAM,CAACI,UAIR,CAACJ,MAAM,EAAK,CAE3B,CAEO,SAAS4sS,EAAY1vH,GACxB,OAAO/7K,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQwrS,eACpB9sR,UAAW,CAACub,EAAAA,GAAiBwxQ,oBAC7BxrS,OAAQ,CACJ47K,IAGZ,CAEO,SAAS6vH,EAAa7vH,GACzB,OAAO/7K,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ0rS,aACpBhtR,UAAWub,EAAAA,GAAiBwxQ,mBAC5BxrS,OAAQ,CACJ47K,IAGZ,CAEO,SAAS8vH,IAAoE,IAAvD1kS,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ0yP,kBAC7D,OAAOxhS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ2rS,aACpBjtR,UAAW,CAACub,EAAAA,GAAiB2xQ,qBAC7B3rS,OAAQ,CACJgH,EACA09C,IAGZ,CAEO,SAASknP,EAA4BxpS,GAAuE,IAAvD4E,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ0yP,kBAC5F,OAAOxhS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ6rS,4BACpBntR,UAAW,CAACub,EAAAA,GAAiB6xQ,qCAC7B7rS,OAAQ,CACJoC,EACA4E,EACA09C,IAGZ,CAEO,SAASonP,EAAuC1pS,EAAgB2pS,GAAyE,IAAvD/kS,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ0yP,kBACzH,OAAOxhS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ+rS,uCACpBrtR,UAAW,CAACub,EAAAA,GAAiB6xQ,qCAC7B7rS,OAAQ,CACJoC,EACA2pS,EACA/kS,EACA09C,IAGZ,CAEO,SAASsnP,EAA2B5pS,EAAgB6pS,GACvD,OAAOpsS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQmsS,8BACpBztR,UAAW,CAACub,EAAAA,GAAiBmyQ,oCAC7BnsS,OAAQ,CACJoC,EACA6pS,IAGZ,CAEO,SAASG,EAA4BhqS,EAAgB6pS,GACxD,OAAOpsS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQqsS,4BACpB3tR,UAAWub,EAAAA,GAAiBmyQ,mCAC5BnsS,OAAQ,CACJoC,EACA6pS,IAGZ,CAEO,SAASI,EAA2BjqS,EAAgByvC,GACvD,OAAOhyC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQssS,2BACpB5tR,UAAW,CAACub,EAAAA,GAAiBmyQ,oCAC7BnsS,OAAQ,CACJoC,EACAyvC,IAGZ,CAEO,SAASy6P,EAAgClqS,EAAgB6pS,GAC5D,OAAOpsS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQusS,gCACpBtsS,OAAQ,CACJoC,EACA6pS,IAGZ,CAEO,SAASM,IACZ,OAAO1sS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQwsS,mBACpB9tR,UAAW,CAACub,EAAAA,GAAiBwyQ,8BAErC,CAEO,SAASC,IACZ,OAAO5sS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ0sS,cACpBhuR,UAAW,CAACub,EAAAA,GAAiB0yQ,wBAErC,CAEO,SAASC,EAAYC,GACxB,OAAO/sS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ4sS,YACpBluR,UAAW,CAACub,EAAAA,GAAiBwxQ,oBAC7BxrS,OAAQ,CACJ4sS,IAGZ,CAEO,SAASC,IACZ,OAAOvuS,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IACRmQ,GAAgBvL,EAAAA,EAAAA,IAAiBjiB,GAEvC,IAAI3B,EACJ,IACIA,QAAaqB,EAAAA,GAAQ8sS,uBAAuBh/Q,EAChD,CAAE,MAAOpvB,GAKL,OAJAuiB,EAAAA,EAAAA,IAAuBviB,EAAOL,EAAUsf,GAExCtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IAEX,CAACA,QACZ,CAEA,MAAO,CAACC,OAAK,CAErB,CAEO,SAASouS,EAAoBltS,GAChC,OAAOC,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ+sS,oBACpB9sS,OAAQ,CAACJ,IAEjB,CAEO,SAASmtS,EAAejuS,GAC3B,OAAOR,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQgtS,eAAejuS,EACjC,CAAE,MAAOL,GAIL,OAHAuiB,EAAAA,EAAAA,IAAuBviB,EAAOL,EAAUsf,GAExCtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CASA,OAPAL,GAASoiB,EAAAA,EAAAA,IAAa,CAClB,CACIvd,KAAM+2B,EAAAA,GAAiBgzQ,kBACvBtuS,KAAM,CAACI,UAIR,CAACJ,MAAM,EAAK,CAE3B,CAEO,SAASuuS,EAAoBL,GAChC,OAAO/sS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQktS,oBACpBxuR,UAAW,CAACub,EAAAA,GAAiBwxQ,oBAC7BxrS,OAAQ,CACJ4sS,IAGZ,CAEO,SAASM,EAA8BpuS,GAC1C,OAAOR,MAAOF,EAAUsf,KACpB,UACU3d,EAAAA,GAAQmtS,8BAA8BpuS,EAChD,CAAE,MAAOL,GAIL,OAHAuiB,EAAAA,EAAAA,IAAuBviB,EAAOL,EAAUsf,GAExCtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAOA,OALAL,EAAS,CACL6E,KAAM+2B,EAAAA,GAAiBmzQ,kCACvBzuS,KAAM,CAACI,QAGJ,CAACJ,MAAM,EAAK,CAE3B,CAEO,SAAS2jJ,EAAwBrwI,GACpC,OAAO1T,MAAOF,EAAUsf,KACpB,MAAMrd,EAAQqd,IAId,IAAIhf,EAHJsT,EAAWuJ,YAAa6H,EAAAA,EAAAA,IAAoB/iB,GAC5C2R,EAAWuQ,SAAUC,EAAAA,EAAAA,IAAiBniB,GAGtC,IACI3B,QAAaqB,EAAAA,GAAQsiJ,wBAAwBrwI,EACjD,CAAE,MAAOvT,GAIL,OAHAuiB,EAAAA,EAAAA,IAAuBviB,EAAOL,EAAUsf,GAExCtf,GAASq/B,EAAAA,EAAAA,IAASh/B,IACX,CAACA,QACZ,CAEA,MAAO,CAACC,OAAK,CAErB,C,sGCtfO,SAAS+E,EAAUT,GACtB,OAAOnD,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ0D,UACpBgb,UAAWvb,EAAAA,GAASkqS,aACpBptS,OAAQ,CACJgD,IAGZ,CAuBO,SAASqqS,EAAcpqS,GAAoE,IAArD+D,EAAIgH,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAAG02C,EAAe12C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG2gC,EAAAA,GAAQ2+P,gBAC7E,OAAOztS,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQstS,cACpB5uR,UAAW,CAACvb,EAAAA,GAASqqS,cAAerqS,EAAAA,GAASsqS,uBAC7CxtS,OAAQ,CACJiD,EACA+D,EACA09C,IAGZ,CAEO,SAAS+oP,EAAUzqS,GACtB,OAAOnD,EAAAA,EAAAA,IAAe,CAClBC,WAAYC,EAAAA,GAAQ0tS,UACpBztS,OAAQ,CACJgD,IAGZ,C,gjCCrDO,SAAS0rJ,EAAmBg/I,GAC/B,OAAOpvS,MAAOF,EAAUsf,KACpB,MAAMsrB,GAAcle,EAAAA,EAAAA,IAAepN,KAC7BiwR,GAAkB5nB,EAAAA,EAAAA,IAAuBroQ,KACzCkwR,EAAoBD,EAAgB7hP,oBAAsB4hP,EAEhE,GAAIC,EAAgB9hP,sBAAwB+hP,EAAmB,CAC3D,MAAMvgP,EAAW,CACbxB,qBAAsB,OACtBC,kBAAmB4hP,EACnB3hP,eAAgB4hP,EAAgB5hP,gBAG9B8hP,EAAWhvS,EAAAA,EAAA,GACVmqC,GAAW,IACdqkB,aAGJjvD,GAAS0vS,EAAAA,EAAAA,IAASD,GACtB,CAEA,MAAO,CAACnvS,MAAM,EAAK,CAE3B,C,yXC5BO,MAAMqvS,EAAuB,eACvBC,EAAqB,aAGrB75L,EAAqB,gBACrB85L,EAA8B,mBAC9Bl0O,EAA6B,kBAG7Bq6C,EAAwB,sCACxB85L,EAA4B,0BAG5BC,EAAsB,SACtBzpE,EAAoB,gBAGpB1qK,EAAoB,iBACpBC,EAAyB,aAEzBuqK,EAAyC,CAClD,CAACpwH,GAAwB,CAAC25L,EAAsBC,GAChD,CAACE,GAA4B,CAACH,EAAsBC,IAG3CvpE,EAA2C,CACpD,CAACrwH,GAAwB+5L,EACzB,CAACD,GAA4BC,E,2KCpB1B,MAEMC,GAAyBj8O,EAAAA,EAAAA,IAClC,2BACC9xD,IAAuBmnB,EAAAA,EAAAA,IAAUnnB,KACjCqC,GACgF,UAAtEA,aAAM,EAANA,EAAiC,0BAInC+hB,GAAc0tC,EAAAA,EAAAA,IACvB,cACAi8O,GAZgC/tS,GAAuBA,EAAMuyB,SAASwnJ,KAAKi0H,gBAc3E,CAACC,EAA6BD,IACnBC,GAAsBD,IAIxBE,GAAgBp8O,EAAAA,EAAAA,IACzB,iBACC9xD,IAAuBmnB,EAAAA,EAAAA,IAAUnnB,KACjCqC,GACoC,WAA1BA,aAAM,EAANA,EAAQ8rS,iBAIVx1G,EAA2B9+K,IAC7Bi4C,EAAAA,EAAAA,IACH,2BACC9xD,GAAuBA,EAAMuyB,SAASwnJ,KAAKpuD,KAAKvxG,WAChDpa,GAAuBokB,EAAYpkB,KACpC,CAACoa,EAAwBg0R,IAChBA,GAAmBh0R,EAIDA,EAASvP,QAAQmP,GAAMA,EAAEH,WAAaA,IACvCI,QAAO,CAACC,EAAqBC,IAAwBD,EAAM7R,OAAO8R,EAAQC,UAAY,KAAK,IAJtG,KASVi0R,GAA8Bv8O,EAAAA,EAAAA,IACvC,8BACAo8O,EACAv1G,EAAwBnd,EAAAA,GAAoB8yH,sBAC5C,CAAC90K,EAAkB+0K,IACR/0K,EAAU,GAAK+0K,IAIjBC,GAAuB18O,EAAAA,EAAAA,IAChC,uBACAo8O,EACAv1G,EAAwBnd,EAAAA,GAAoB8yH,qBAC5C31G,EAAwBnd,EAAAA,GAAoBizH,UAC5C,CAACj1K,EAAkB+0K,EAAqCG,KACpD,IAAKl1K,EACD,MAAO,GAGX,MAAMm1K,EAASD,EAAe3jS,KAAKiP,GAAMA,EAAE4iK,SACrCgyH,EAA8BL,EAAsB1jS,QAAQmP,IAAO20R,EAAO96P,SAAS75B,EAAE4iK,UAE3F,OAAO8xH,EAAermS,OAAOumS,EAA4B,IAIpD91G,EAA6Bj/K,IAC/Bi4C,EAAAA,EAAAA,IACH,6BACC9xD,GAAuBA,EAAMuyB,SAASwnJ,KAAKt7G,IAAIrkD,WAC/Cpa,GAAuBokB,EAAYpkB,KACpC,CAACoa,EAAwBg0R,IAChBA,GAAmBh0R,EAIDA,EAASvP,QAAQmP,GAAMA,EAAEH,WAAaA,IACvCI,QAAO,CAACC,EAAqBC,IAAwBD,EAAM7R,OAAO8R,EAAQC,UAAY,KAAK,IAJtG,KASV8hP,EAAoBA,CAACl8P,EAAoB6Z,IAC3C7Z,EAAMuyB,SAASwnJ,KAAKpuD,KAAKkjL,MAAMh1R,GAG7BoiP,EAAuBA,CAACj8P,EAAoB6Z,IAC9C7Z,EAAMuyB,SAASwnJ,KAAKt7G,IAAIowO,MAAMh1R,E,6ICvFlC,SAASoC,EAAejc,GAC3B,OAAOA,EAAMuyB,SAASmsB,MAAM3gC,OAAOA,MACvC,CAEO,SAASP,EAAqBxd,GACjC,OAAOA,EAAMuyB,SAASmsB,MAAMnhC,YAChC,CACO,SAASK,EAAiB5d,GAC7B,OAAOA,EAAMuyB,SAASmsB,MAAM/gC,QAChC,CAEO,SAASD,EAAiB1d,GAC7B,OAAOA,EAAMuyB,SAASmsB,MAAMjhC,QAChC,CAEO,SAASwoG,EAAqBjmH,GACjC,OAAOA,EAAMuyB,SAASmsB,MAAM3gC,OAAO+wR,YACvC,CAEO,SAASxxR,EAAetd,GAC3B,OAAOA,EAAMuyB,SAASmsB,MAAMtsC,MAChC,CAEO,SAAS28R,EAAiB/uS,GAC7B,OAAOA,EAAMuyB,SAASmsB,MAAM7gC,QAChC,CAEO,SAASy6E,EAAuBt4F,GACnC,MAAMud,EAAeC,EAAqBxd,GAC1C,IAAKud,EACD,OAEJ,MAAME,EAAWC,EAAiB1d,GAClC,OAAKyd,EAIEA,EAASF,EAAayxR,iBAJ7B,CAKJ,CAEO,SAASC,EAA2BjvS,GAA4B,IAAAkvS,EACnE,OAAoC,QAA7BA,EAAA52M,EAAuBt4F,UAAM,IAAAkvS,OAAA,EAA7BA,EAA+BrnS,OAAQ,EAClD,CAEO,SAAS+kR,EAAmB5sR,GAC/B,MAAMud,EAAeC,EAAqBxd,GAC1C,OAAOiU,QAAwC,WAAhCsJ,aAAY,EAAZA,EAAc+5E,iBAA6B/5E,aAAY,EAAZA,EAAcu5E,cAAe,EAC3F,CAEO,SAASqH,EAAsBn+F,GAClC,MAAM40B,GAAUC,EAAAA,EAAAA,IAAW70B,GAC3B,MAA0B,UAAnB40B,aAAO,EAAPA,EAASwU,MACpB,C,yGCxDA,MAAM+lQ,EAAsB,GAOrB,SAASC,IACZ,OAAOt9O,EAAAA,EAAAA,IACH,+BACC9xD,GAAuBA,EAAMuyB,SAAS2lC,eAAem3O,OACtD,CAACrvS,EAAoB+B,EAAgButS,IAAmCA,IACxE,CAACtvS,EAAoB+B,IAAmB/B,EAAMuyB,SAAS2lC,eAAeq3O,SAASxtS,IAAWotS,IACzFnvS,GAAuBA,EAAMuyB,SAAS2lC,eAAeq3O,SAASC,gBAAkBL,IACjF,CAACM,EAAiDH,EAAgCI,EAAiCC,KAC/G,MAAMz3O,EAAkC,GAElC03O,EAAaC,IACf,MAAMl6Q,EAAgB85Q,EAAmBI,GACrCl6Q,GACAuiC,EAAex+C,KAAKic,EACxB,EAYJ,OATA+5Q,EAAsBt/R,QAAQw/R,GAE1BN,GACAK,EAA+Bv/R,QAAQw/R,GAI3C13O,EAAeqI,MAAK,CAACjW,EAAGtwC,IAAMswC,EAAEY,aAAelxC,EAAEkxC,cAAgBZ,EAAEhkC,UAAYtM,EAAEsM,YAE1E4xC,CAAc,GAGjC,CAEO,SAAS43O,EAA6B9vS,EAAoB+B,EAAgButS,GAAgC,IAAAS,EAC7G,IAAIrzR,GAAsD,QAA9CqzR,EAAA/vS,EAAMuyB,SAAS2lC,eAAeq3O,SAASxtS,UAAO,IAAAguS,OAAA,EAA9CA,EAAgDj/R,SAAU,EAC3C,IAAAk/R,EAI3B,OAJIV,IACA5yR,IAA+D,QAArDszR,EAAAhwS,EAAMuyB,SAAS2lC,eAAeq3O,SAASC,sBAAc,IAAAQ,OAAA,EAArDA,EAAuDl/R,SAAU,GAGxE4L,CACX,CAEO,SAASuzR,EAAsBjwS,EAAoB+B,GAAgB,IAAAmuS,EAAAC,EACtE,OAA2D,QAApDD,EAAAlwS,EAAMuyB,SAAS2lC,eAAek4O,eAAeruS,UAAO,IAAAmuS,OAAA,EAApDA,EAAsDp/R,QAAS,IAAgE,QAA3Dq/R,EAAAnwS,EAAMuyB,SAAS2lC,eAAek4O,eAAeZ,sBAAc,IAAAW,OAAA,EAA3DA,EAA6Dr/R,QAAS,CACrJ,CAEO,SAASg6C,EAA0C9qD,EAAoBqwS,GAC1E,MACMC,GAD2BtwS,EAAMuyB,SAAS2lC,eAAeq4O,oBAAoBF,IAAsBlB,GACjDtkS,QAAQglS,IAC5D,MAAMl6Q,EAAgB31B,EAAMuyB,SAAS2lC,eAAem3O,KAAKQ,GACzD,QAAQl6Q,SAAAA,EAAe66Q,WAAU,IAG/BnyS,EAAO,CACTqe,MAAO4zR,EAAuBx/R,QAGlC,GAAmB,IAAfzS,EAAKqe,MAAa,CAClB,MAAMmzR,EAAkBS,EAAuB,GAC/CjyS,EAAKs3B,cAAgB31B,EAAMuyB,SAAS2lC,eAAem3O,KAAKQ,EAC5D,CAEA,OAAOxxS,CACX,CAEO,MAAMyvD,GAAuDgE,EAAAA,EAAAA,IAChE,0BACA3qC,EAAAA,GACA0N,EAAAA,IACA,CAACxyB,EAA+BuyB,IACK,SAA1BvyB,EAAOouS,gBAAoD,SAAvB77Q,EAAQG,Y,kBC/EpD,SAAS2yF,EAAS1nH,GACrB,OAAOA,EAAMuyB,SAAS4wE,KAC1B,C,gkCCGO,SAASzzE,IACZ,OAAOoiC,EAAAA,EAAAA,IACH,8BACA7vC,EAAAA,GACAoM,EAAAA,GACAqiR,EAAAA,GACAvpP,EAAAA,IACA,CAAC80E,EAAgBtoF,IAA4BA,IAC7C,CAACnmB,EAAe0gL,EAAayiG,EAAevrP,EAAczR,IACCA,EAAS5oC,KAAK0gG,IACjE,MAAMnkG,GAAco0N,EAAAA,EAAAA,IAAqBluM,EAAei+E,EAAQhtG,IAC1D6M,EAAUqlS,EAAcrpS,GACxBm1G,EAAanxG,EAAU4iM,EAAY5iM,EAAQ7M,IAAM,KACjDsI,EAASq+C,EAAaqmD,EAAQhtG,IAEpC,OAAAD,EAAAA,EAAA,GACOitG,GAAO,IACV1kG,SACA0e,eAAgBna,GAAWmxG,EAAaA,EAAWh3F,eAAiB,GAAC,KAOzF,C,kBC1BO,SAAShU,EAA2BmwI,EAAqB12I,GAC5D,IAAMA,GAAmB,IAAVA,IAAiB02I,EAAK3qI,SACjC,MAAO,CACHxY,GAAI,oCACJ0S,eAAgB,2BAIxB,MAAMvO,EAAOg/I,EAAKh/I,KAElB,GAAa,SAATA,GAA4B,aAATA,EAAqB,CACxC,GAAIsI,GAASA,EAAM4F,OAAS8wI,EAAKgvJ,WAC7B,MAAO,CACHnyS,GAAI,qCACJ0S,eAAgB,uCAChBjB,OAAQ,CAAC2gS,UAAWjvJ,EAAKgvJ,aAIjC,GAAqB,UAAjBhvJ,EAAKnzI,SACDvD,IAAUA,EAAM2oC,SAAS,KACzB,MAAO,CACHp1C,GAAI,qCACJ0S,eAAgB,kCAK5B,GAAqB,WAAjBywI,EAAKnzI,SACDvD,GAASutD,MAAMvtD,GACf,MAAO,CACHzM,GAAI,sCACJ0S,eAAgB,qBAK5B,GAAqB,QAAjBywI,EAAKnzI,SACDvD,IAAUA,EAAM2oC,SAAS,aAAe3oC,EAAM2oC,SAAS,YACvD,MAAO,CACHp1C,GAAI,mCACJ0S,eAAgB,wCAIhC,MAAO,GAAa,UAATvO,EAAkB,CACzB,MAAM6C,EAAUm8I,EAAKn8I,QAErB,QAAqB,IAAVyF,GAAyB4C,MAAMC,QAAQtI,KAAaA,EAAQujC,MAAMniC,GAAMA,EAAEqE,QAAUA,IAC3F,MAAO,CACHzM,GAAI,0CACJ0S,eAAgB,yBAG5B,CAEA,OAAO,IACX,CAKO,SAASJ,IAAgG,IAArEqB,EAA8BzE,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAAG8C,EAAyB9C,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACxG,IAAK,MAAM9F,KAAQuK,EACf,GAAKtK,OAAO20C,OAAOrqC,EAAQvK,GAG3B,IAAK,MAAM+5I,KAAQnxI,EACf,GAAImxI,EAAK/5I,OAASA,EACd,OAAO,EAKnB,OAAO,CACX,C,wVCzEO,MAAMipS,EAAsB39P,GACvBp1C,IACJA,EAASgzS,EAAc59P,EAAS10C,KAChCV,EAAS,CAAC6E,KAAMc,EAAAA,GAAYstS,sBAAuB3yS,KAAM80C,IAClD,CAAC90C,MAAM,IAKhB0yS,EAAiBE,GACZ,CAAClzS,EAAUsf,KACd,MAAMrd,EAAQqd,IACR6zR,EAAalxS,EAAM+oE,QAAQ7hE,WAAWiqS,2BAA6B,GACnEnjE,GAAcojE,EAAAA,EAAAA,IAAepxS,GAOnC,OANwBkxS,EAAWr+R,MAAMrB,GAAYA,EAAQ/S,KAAOuvO,GAAex8N,EAAQ7M,WAAassS,KAIpGlzS,GAASszS,EAAAA,EAAAA,IAAoBrjE,IAE1B,CAAC3vO,MAAM,EAAK,ECyC3B,SAASizS,EAAkBtxS,GACvB,QAAwC,UAApCmnB,EAAAA,EAAAA,IAAUnnB,GAAOuxS,iBAKjBnqR,EAAAA,EAAAA,IAA8BpnB,KAC9BqnB,EAAAA,EAAAA,IAAQrnB,EAAOsnB,EAAAA,GAAYC,+BAAgCD,EAAAA,GAAYkqR,6BAM/E,CAGOvzS,eAAeinP,IAClB,IAAKosD,EAAkBtzS,EAAAA,QAAMqf,YACzB,OAGJ,MAAM,KAAChf,EAAI,MAAED,SAAeJ,EAAAA,QAAMD,SAAS67K,KACvCx7K,EACAghC,QAAQhhC,MAAMA,GAIN,MAARC,GAAgC,IAAhBA,EAAKyS,eAInB2hB,QAAQyuB,IAAI7iD,EAAK0M,KAAK6+B,GACjByJ,EAAWzJ,GAAG7gB,OAAO0oR,IACxBryQ,QAAQhhC,MAAMqzS,EAAQ3qS,QAAQ,QAItC4qS,EAAAA,EAAAA,IAA0BrzS,GAC9B,CAGO,SAASu7K,IACZ,OAAO37K,UACH,IAAI8qE,EACJ,IACIA,QAAgBrpE,EAAAA,GAAQiyS,kBAC5B,CAAE,MAAOvzS,GACL,MAAO,CAACA,QACZ,CAIA,OAFAL,EAAS,CAAC6E,KAAMc,EAAAA,GAAYkuS,wBAAyBvzS,KAAM0qE,IAEpD,CAAC1qE,KAAM0qE,EAAQ,CAE9B,CA1EA3vD,OAAOy4R,mBAAqBA,IAG5Bz4R,OAAO2vD,QAAU,CAAC,EAelB3vD,OAAO04R,eARP,SAAwBrzS,EAAY8iO,GAChC,MAAMwwE,EAAY34R,OAAO2vD,QAAQtqE,GAC7BszS,GAAaA,EAAUC,cACvBD,EAAUC,eAGd54R,OAAO2vD,QAAQtqE,GAAM8iO,CACzB,EA4DA,MAAM0wE,EAAmD,CAAC,EAGpDC,EAAkB/+P,GACpB,UAAYA,EAAS10C,GAAK,aAAe00C,EAASkW,QAK/C,SAAShW,EAAWF,GACvB,OAAO,IAAI1gB,SAAQ,CAACC,EAASy/Q,KAAW,IAAAC,EAAAC,EAAAC,EACpC,IAAKhB,EAAkBtzS,EAAAA,QAAMqf,YACzB,OAIJ,MAAMk1R,EAAcN,EAAc9+P,EAAS10C,IAC3C,GAAI8zS,IAAiC,QAAlBH,EAAAG,EAAYC,cAAM,IAAAJ,OAAA,EAAlBA,EAAoBK,gBAA+B,QAApBJ,EAAKl/P,EAASq/P,cAAM,IAAAH,OAAA,EAAfA,EAAiBI,aAEpE,YADA//Q,IAIA6/Q,GAEAv0S,EAAAA,QAAMD,SAAS+yS,EAAmB39P,IActC,IAAIu/P,EAA4B,QAAlBJ,EAAGn/P,EAASq/P,cAAM,IAAAF,OAAA,EAAfA,EAAiBG,YAC9BC,GAAcA,EAAW7+P,SAAS,cAAgB6+P,EAAW7+P,SAAS,sBACtE6+P,EAAaA,EAAW/jQ,QAAQ,WAAY,qBAGhDvP,QAAQ8C,IAAI,WAAagwQ,EAAe/+P,IAExC,MAAMw/P,EAAS/oS,SAASgpS,cAAc,UACtCD,EAAOl0S,GAAK,UAAY00C,EAAS10C,GACjCk0S,EAAO/vS,KAAO,kBACd+vS,EAAO18R,KAAMkD,EAAAA,EAAAA,MAAeu5R,EAC5BC,EAAOE,OAAQ,EACfF,EAAO/yR,OAvBP,YAiCR,SAA0BuzB,GAEtB,MAAMouL,EAASnoN,OAAO2vD,QAAQ51B,EAAS10C,IACjC+iO,EAAW,IAAIC,EAAAA,EAAetuL,EAAS10C,IACzC8iO,GAAUA,EAAOv/L,YACjBu/L,EAAOv/L,WAAWw/L,EAAUxjO,EAAAA,QAEpC,CAvCY80S,CAAiB3/P,GACjB/T,QAAQ8C,IAAI,UAAYgwQ,EAAe/+P,IACvCzgB,GACJ,EAoBAigR,EAAOlyR,QAlBP,WACI0xR,EAAO,IAAI99Q,MAAM,6BAA+B69Q,EAAe/+P,IACnE,EAkBAvpC,SAASmpS,qBAAqB,QAAQ,GAAGC,YAAYL,GACrDV,EAAc9+P,EAAS10C,IAAM00C,CAAQ,GAE7C,CAgBO,SAASK,EAAaL,GAAgC,IAAA8/P,EACzD,IAAKhB,EAAc9+P,EAAS10C,IACxB,OAEJ2gC,QAAQ8C,IAAI,YAAcgwQ,EAAe/+P,WAElC8+P,EAAc9+P,EAAS10C,IAE9BT,EAAAA,QAAMD,SAAS+yS,EAAmB39P,IAElC,MAAMouL,EAASnoN,OAAO2vD,QAAQ51B,EAAS10C,IACnC8iO,GAAUA,EAAOywE,aACjBzwE,EAAOywE,eAGAzwE,GAAUA,EAAO2xE,cACxB3xE,EAAO2xE,gBAEXptQ,EAAAA,EAAAA,IAAmCqN,EAAS10C,KAC5CqlC,EAAAA,EAAAA,IAAiCqP,EAAS10C,IAC1CT,EAAAA,QAAMD,UAASgH,EAAAA,EAAAA,IAA6BouC,EAAS10C,MACrDogC,EAAAA,EAAAA,IAAmCsU,EAAS10C,IAC5C,MAAMk0S,EAAS/oS,SAAS2tE,eAAe,UAAYpkC,EAAS10C,IACvDk0S,IAGY,QAAjBM,EAAAN,EAAOQ,kBAAU,IAAAF,GAAjBA,EAAmBG,YAAYT,GAC/BvzQ,QAAQ8C,IAAI,WAAagwQ,EAAe/+P,IAC5C,CAIOl1C,eAAeinC,IAClB,IAAKosQ,EAAkBtzS,EAAAA,QAAMqf,YACzB,OAGJ,MAAMg2R,EAAer1S,EAAAA,QAAMqf,WAAW0rD,QAAQA,SAExC,MAAC3qE,SAAeJ,EAAAA,QAAMD,SAAS67K,KACrC,GAAIx7K,EAEA,YADAghC,QAAQhhC,MAAMA,GAIlB,MAAMk1S,EAAet1S,EAAAA,QAAMqf,WAAW0rD,QAAQA,QAG9CjhE,OAAOoI,OAAOojS,GAAcljS,SAASmjS,IACjC,MAAMhB,EAAcc,EAAaE,EAAY90S,IACxC8zS,GAAeA,EAAYlpP,UAAYkqP,EAAYlqP,SACpDhW,EAAWkgQ,GAAaxqR,OAAO0oR,IAC3BryQ,QAAQhhC,MAAMqzS,EAAQ3qS,QAAQ,GAEtC,IAIJgB,OAAO+I,KAAKwiS,GAAcjjS,SAAS3R,IAC1BqJ,OAAO20C,OAAO62P,EAAc70S,IAE7B+0C,EADoB6/P,EAAa50S,GAErC,GAER,C,ihBC1PA,MAAM+0S,E,MAAajqP,GAAAA,IAAUC,WAAA,CAAAt7C,YAAA,cAAVq7C,CAAU,mNAmBd,MAAMkqP,UAA+B/rS,IAAAA,cAAkCsC,WAAAA,GAAA,SAAA2D,WAAAzD,EAAA,aAC1E,CACJg3E,UAAU,IACbh3E,EAAA,wBAQkBrD,IACfA,EAAEyK,iBACFzK,EAAEy0D,kBAEFlxD,KAAKgH,SAAS,CAAC8vE,UAAU,GAAO,GACnC,CAXD,+BAAOwyN,GACH,MAAO,CACHxyN,UAAU,EAElB,CASA7zE,MAAAA,GACI,OAAIjD,KAAKpK,MAAMkhF,SAEPx5E,IAAAA,cAAC8rS,EAAU,KACP9rS,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,0BACH0S,eAAe,8CACfjB,OAAQ,CACJvL,SAAUyF,KAAKhD,MAAMzC,YAG7B+C,IAAAA,cAAA,WACAA,IAAAA,cAAA,KACIm2C,KAAK,IACL7mC,QAAS5M,KAAKupS,iBAEdjsS,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,yBACH0S,eAAe,WACfjB,OAAQ,CACJvL,SAAUyF,KAAKhD,MAAMzC,cAQtCyF,KAAKhD,MAAM20D,QACtB,EACH7xD,EAhDoBupS,EAAsB,aA3BvC13O,SAAQvuD,IAAAA,KAAAC,WACR9I,SAAQ6I,IAAAA,Q,kPC+CG,SAAS6qL,EAAUjxL,GAC9B,MAAM,WACFF,EAAU,YACV8mO,EAAW,cACX11C,EAAa,iBACby1C,EAAmB,GAAE,MACrBzwH,GAEAl2G,EADG25E,E,qWAAUx5B,CACbngD,EAAKogD,GAET,IAAK8wI,IAAkBxwL,OAAO20C,OAAOv1C,EAAYoxL,GAC7C,OAAO,KAGX,IASIx0F,EATA8vM,EAAmB1sS,EAAWoxL,GAsDlC,OApDI01C,IACA4lE,EAAmBA,EAAiB/oS,QAC/B2G,GAAYA,EAAQ/S,KAAOuvO,KAQhClqI,EADkB,YAAlBw0F,EACWs7G,EAAwC7oS,KAAK8oS,IACpD,IAAK9lE,IAAqB8lE,EAAG9lE,GACzB,OAAO,KAGX,MAAMv9J,EAAYqjO,EAAG9lE,GAErB,OACIrmO,IAAAA,cAAC+rS,EAAAA,EAAsB,CACnBruS,IAAKkzL,EAAgBu7G,EAAGp1S,GACxBkG,SAAUkvS,EAAGlvS,UAEb+C,IAAAA,cAAC8oE,EAAS1oE,OAAAC,OAAA,GACFg5E,EAAU,CACdu8B,MAAOA,KAEU,IAIvBs2L,EAAiB7oS,KAAKg4G,IAC5B,IAAKA,EAAE19G,UACH,OAAO,KAGX,MAAMmrE,EAAYuyC,EAAE19G,UAEpB,OACIqC,IAAAA,cAAC+rS,EAAAA,EAAsB,CACnBruS,IAAKkzL,EAAgBv1E,EAAEtkH,GACvBkG,SAAUo+G,EAAEp+G,UAEZ+C,IAAAA,cAAC8oE,EAAS1oE,OAAAC,OAAA,GACFg5E,EAAU,CACdu8B,MAAOA,EACP2uE,gBAAiBA,EAAAA,KAEA,IAMjCvkL,IAAAA,cAAAA,IAAAA,SAAA,KACKo8F,EAGb,CAACu0F,EAAAtoL,UAAA,CA5GGuoL,cAAa9qL,IAAAA,OAAAC,WAebugO,YAAWxgO,IAAAA,OAOXugO,iBAAgBvgO,IAAAA,MAAA,CAAG,gBAAkB,kBAAoB,wBAA0B,0BCzBvF,SAAegC,EAAAA,EAAAA,UAPf,SAAyBxP,GACrB,MAAO,CACHkH,WAAYlH,EAAM+oE,QAAQ7hE,WAC1Bo2G,OAAOC,EAAAA,EAAAA,IAASv9G,GAExB,GAEA,CAAwCq4L,E,wPCMjC,SAASy7G,EAAsDC,EAA8BC,GAEhG,OAAO,WAA8B,QAAA3uL,EAAA13G,UAAAmD,OAA1B8K,EAAI,IAAA9N,MAAAu3G,GAAAnpC,EAAA,EAAAA,EAAAmpC,EAAAnpC,IAAJtgE,EAAIsgE,GAAAvuE,UAAAuuE,GACX,MAAM+3N,EAAoC,IAAhBr4R,EAAK9K,QAAgBojS,IAAct4R,EAAK,IAG5Du4R,EAAUF,GAAqBnsS,OAAO+I,KAAK+K,EAAK,IAChDw4R,EAAYD,GAAWE,IAAaF,EAASJ,GAAUjjS,SAAWqjS,EAAQrjS,OAEhF,OAAOkjS,EAAKC,GAAqBG,EAAYx4R,EAAK,GAAK04R,IAAUP,EAAUn4R,GAC/E,CACJ,C,u+BCKA,MAAM24R,EAAsBA,KAAM,EAGlC,SAASC,EAA8B3sS,EAAwClD,EAAkBU,GAA4D,IAAnB5G,EAAEkP,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,IAAG4zD,EAAAA,EAAAA,MAW3I,OAVAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,OACAxJ,KAAM,CACFI,KACAkG,WACAU,eAID5G,CACX,CAGA,MAAMi2S,EAAuBljS,GAErBA,IACC9J,IAAAA,eAAqB8J,KACtBwzQ,EAAAA,EAAAA,oBAAmBxzQ,IACA,iBAAZA,EAGA9J,IAAAA,cAAoB8J,GAGxBA,EAGLmjS,EAAoBvyM,IACtB,IAAIwyM,EAAaxyM,EAAMnrE,OAIvB,MAHsB,MAAlB29Q,EAAW,KACXA,EAAaA,EAAW59Q,UAAU,IAE/B49Q,CAAU,EAGN,MAAMnzE,EAEjBz3N,WAAAA,CAAYvL,GAAYyL,EAAA,gBAIb,CACP2qS,cAAc,EACdC,WAAW,IAIf5qS,EAAA,6BACwB4pS,EAAM,CAAC,cAAcj0S,IAAuC,IAAtC,UAACwF,GAAgCxF,EAC3E,OAAO20S,EAA8B,OAAQpqS,KAAK3L,GAAI4G,EAAU,KAIpE6E,EAAA,8CACyC4pS,EAAM,CAAC,cAAcxuS,IAAuC,IAAtC,UAACD,GAAgCC,EAC5F,OAAOkvS,EAA8B,wBAAyBpqS,KAAK3L,GAAI4G,EAAU,KAIrF6E,EAAA,2CACsC4pS,EAAM,CAAC,cAAc91O,IAAuC,IAAtC,UAAC34D,GAAgC24D,EACzF,OAAOw2O,EAA8B,qBAAsBpqS,KAAK3L,GAAI4G,EAAU,KAIlF6E,EAAA,0CACqC4pS,EAAM,CAAC,cAAc52L,IAAuC,IAAtC,UAAC73G,GAAgC63G,EACxF,OAAOs3L,EAA8B,oBAAqBpqS,KAAK3L,GAAI4G,EAAU,KAKjF6E,EAAA,0CACqC4pS,EAAM,CAAC,cAAc3pK,IAAuC,IAAtC,UAAC9kI,GAAgC8kI,EACxF,OAAOqqK,EAA8B,oBAAqBpqS,KAAK3L,GAAI4G,EAAU,KAIjF6E,EAAA,8CACyC4pS,EAAM,CAAC,cAAc1uB,IAAuC,IAAtC,UAAC//Q,GAAgC+/Q,EAC5F,OAAOovB,EAA8B,wBAAyBpqS,KAAK3L,GAAI4G,EAAU,KAIrF6E,EAAA,iCAC2B6qS,IAA0E,IAAzE,gBAACC,EAAe,qBAAEC,EAAoB,eAAEC,EAAc,OAAEzzR,GAAYszR,EAC5F,MAAMt2S,GAAK8iE,EAAAA,EAAAA,MAaX,OAZAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,gBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACf4G,UAAW2vS,EACXvzR,YAGR+yR,EAA8B,oBAAqBpqS,KAAK3L,GAAIw2S,EAAsBx2S,GAClF+1S,EAA8B,cAAepqS,KAAK3L,GAAIy2S,EAAgBz2S,GAC/DA,CAAE,IAObyL,EAAA,oCAC+B4pS,EAAM,CAAC,cAAcqB,IAAuC,IAAtC,UAAC9vS,GAAgC8vS,EAClF,OAAOX,EAA8B,cAAepqS,KAAK3L,GAAI4G,EAAU,KAK3E6E,EAAA,0CACqC4pS,EAAM,CAAC,YAAa,WAAWsB,IAAyB,IAAxB,UAAC/vS,EAAS,OAAEoc,GAAO2zR,EACpF,MAAM32S,GAAK8iE,EAAAA,EAAAA,MAaX,OAXAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,0BACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACf4G,YACAoc,YAIDhjB,CAAE,KASbyL,EAAA,yCACoC4pS,EAAM,CACtC,OACA,SACA,eACA,gBACDuB,IAUG,IAVF,KACA5tS,EAAI,OACJga,EAAM,aACN6zR,EAAY,YACZhoL,GAMH+nL,EACG,MAAM52S,GAAK8iE,EAAAA,EAAAA,MAELljE,EAAO,CACTI,KACAkG,SAAUyF,KAAK3L,GACfgJ,KAAMitS,EAAoBjtS,GAC1Bga,SACA6zR,aAAcZ,EAAoBY,GAClChoL,YAAaonL,EAAoBpnL,IAerC,OAZAtvH,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,sBACNxJ,SAGJL,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,4BACNxJ,SAGGI,CAAE,KAObyL,EAAA,wCACmC4pS,EAAM,CACrC,OACA,SACA,SACDyB,IAQG,IARF,KACA9tS,EAAI,OACJga,EAAM,KACNvP,GAKHqjS,EACG,MAAM92S,GAAK8iE,EAAAA,EAAAA,MAELljE,EAAO,CACTI,KACAkG,SAAUyF,KAAK3L,GACfgJ,KAAMitS,EAAoBjtS,GAC1Bga,SACAvP,QASJ,OANAlU,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,qBACNxJ,SAGGI,CAAE,KAUbyL,EAAA,gCAC2B4pS,EAAM,CAC7B,SACA,iBACA,WACD0B,IAQG,IARF,OACAprJ,EAAM,eACNqrJ,EAAc,OACdh0R,GAKH+zR,EACG,MAAM/2S,GAAK8iE,EAAAA,EAAAA,MAELljE,EAAO,CACTI,KACAkG,SAAUyF,KAAK3L,GACf2rJ,OAAQsqJ,EAAoBtqJ,GAC5BqrJ,eAAgBf,EAAoBe,GACpCh0R,UAeJ,OAZAzjB,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,aACNxJ,SAGJL,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,4BACNxJ,SAGGI,CAAE,KAObyL,EAAA,iCAC4B4pS,EAAM,CAAC,OAAQ,cAAc4B,IAAuB,IAAtB,KAAC9yS,EAAI,UAAEyC,GAAUqwS,EACvE,MAAMj3S,GAAK8iE,EAAAA,EAAAA,MAYX,OAVAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY2+N,+BAClBhkO,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfmE,OACAyC,eAID5G,CAAE,KAMbyL,EAAA,qCACgC4pS,EAAM,CAAC,OAAQ,cAAc6B,IAAuB,IAAtB,KAAC/yS,EAAI,UAAEyC,GAAUswS,EAC3E,MAAMl3S,GAAK8iE,EAAAA,EAAAA,MAYX,OAVAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAYkyS,oCAClBv3S,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfmE,OACAyC,eAID5G,CAAE,KAYbyL,EAAA,4CACuC4pS,EAAM,CAAC,QAAS,YAAa,eAAe+B,IAAoC,IAAnC,MAACv8J,EAAK,UAAEj0I,EAAS,WAAE2mL,GAAW6pH,EAC9G,MAAMp3S,GAAK8iE,EAAAA,EAAAA,MAcX,OAZAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,+BACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACf4G,YACAi0I,QACA0yC,gBAIDvtL,CAAE,KAQbyL,EAAA,8BACyB4pS,EAAM,CAC3B,OACA,SACA,eACDgC,IAQG,IARF,KACA5jS,EAAI,OACJuP,EAAM,WACNw9I,GAKH62I,EACG,MAAMr3S,GAAK8iE,EAAAA,EAAAA,MAcX,OAZAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,WACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfyT,KAAMwiS,EAAoBxiS,GAC1BuP,SACAw9I,WAAYy1I,EAAoBz1I,MAIjCxgK,CAAE,KASbyL,EAAA,uCACkC4pS,EAAM,CACpC,OACA,SACA,iBACDiC,IAQG,IARF,KACA7jS,EAAI,OACJuP,EAAM,aACN+4G,EAAe+5K,GAKlBwB,EACG,MAAMt3S,GAAK8iE,EAAAA,EAAAA,MAcX,OAZAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,gBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfyT,KAAMwiS,EAAoBxiS,GAC1BuP,SACA+4G,kBAID/7H,CAAE,KAQbyL,EAAA,sCACiC4pS,EAAM,CACnC,QACA,OACA,WACDkC,IAQG,IARF,MACA18J,EAAK,KACLpnI,EAAI,OACJuP,GAKHu0R,EACG,MAAMv3S,GAAK8iE,EAAAA,EAAAA,MAcX,OAZAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,gBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACf66I,QACApnI,KAAMwiS,EAAoBxiS,GAC1BuP,YAIDhjB,CAAE,KAObyL,EAAA,2CACsC4pS,EAAM,CACxC,OACA,WACDmC,IAMG,IANF,KACA/jS,EAAI,OACJuP,GAIHw0R,EACG,MAAMx3S,GAAK8iE,EAAAA,EAAAA,MAaX,OAXAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,oBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfyT,KAAMwiS,EAAoBxiS,GAC1BuP,YAIDhjB,CAAE,KAIbyL,EAAA,mCAC8B4pS,EAAM,CAAC,cAAcoC,IAAuC,IAAtC,UAAC7wS,GAAgC6wS,EACjF,OAAO1B,EAA8B,aAAcpqS,KAAK3L,GAAI4G,EAAU,KAI1E6E,EAAA,yCACoC4pS,EAAM,CAAC,cAAcqC,IAAuC,IAAtC,UAAC9wS,GAAgC8wS,EACvF,OAAO3B,EAA8B,mBAAoBpqS,KAAK3L,GAAI4G,EAAU,KAIhF6E,EAAA,wCACmC4pS,EAAM,CAAC,cAAcsC,IAAuC,IAAtC,UAAC/wS,GAAgC+wS,EACtF,OAAO5B,EAA8B,kBAAmBpqS,KAAK3L,GAAI4G,EAAU,KAI/E6E,EAAA,mDAC8C4pS,EAAM,CAAC,cAAcuC,IAAuC,IAAtC,UAAChxS,GAAgCgxS,EACjG,OAAO7B,EAA8B,6BAA8BpqS,KAAK3L,GAAI4G,EAAU,KAQ1F6E,EAAA,sCACiC4pS,EAAM,CACnC,OACA,SACA,WACDwC,IAQG,IARF,KACApkS,EAAI,OACJuP,EAAM,OACN5W,GAKHyrS,EACG,MAAM73S,GAAK8iE,EAAAA,EAAAA,MAcX,OAZAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,mBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfyT,KAAMwiS,EAAoBxiS,GAC1BuP,SACA5W,YAIDpM,CAAE,KAUbyL,EAAA,yCACoC4pS,EAAM,CACtC,OACA,SACA,WACDyC,IAQG,IARF,KACArkS,EAAI,OACJuP,EAAM,OACN5W,GAKH0rS,EACG,MAAM93S,GAAK8iE,EAAAA,EAAAA,MAELi1O,EAAmBA,CACrB7xS,EACAlG,EACAg4S,EACAC,EACAC,EACAC,KAEA54S,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,mBACNxJ,KAAM,CACFI,KACAg4S,eACA9xS,WACAuN,KAAMwiS,EAAoBgC,GAC1Bl1R,QAAS,GACTC,OAAQk1R,EACR9rS,OAAQ+rS,KAUT,WACH,GAAIH,EACA,MAAM,IAAIpiR,MAAM,qDACnB,QAAAgxF,EAAA13G,UAAAmD,OAHkC8K,EAAI,IAAA9N,MAAAu3G,GAAAnpC,EAAA,EAAAA,EAAAmpC,EAAAnpC,IAAJtgE,EAAIsgE,GAAAvuE,UAAAuuE,GAKvC,OAAOs6N,EAAiB7xS,GAAU48D,EAAAA,EAAAA,MAAc9iE,KAAOmd,EAC3D,GAGJ,MAAO,CAACnd,KAAIo4S,qBAAsBL,EAAiBpsS,KAAK3L,GAAIA,EAAI,KAAMyT,EAAMuP,EAAQ5W,GAAQ,KAIhGX,EAAA,yCACoC4pS,EAAM,CAAC,cAAcgD,IAAuC,IAAtC,UAACzxS,GAAgCyxS,EACvF,OAAOtC,EAA8B,uBAAwBpqS,KAAK3L,GAAI4G,EAAU,KAQpF6E,EAAA,gCAC2B4pS,EAAM,CAC7B,OACA,SACA,SACDiD,IAQG,IARF,KACAtvS,EAAI,OACJga,EAAM,KACNvP,GAKH6kS,EACG,MAAMt4S,GAAK8iE,EAAAA,EAAAA,MAcX,OAZAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,mBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfyT,OACAuP,SACAha,UAIDhJ,CAAE,KASbyL,EAAA,mCAC8B4pS,EAAM,CAAC,SAASkD,IAAY,IAAX,KAACl2O,GAAKk2O,EACjD,MAAMv4S,GAAK8iE,EAAAA,EAAAA,MAYX,OAVAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,sBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfqiE,UAIDriE,CAAE,KAKbyL,EAAA,2BACsB4pS,EAAM,CAAC,gBAAgBmD,IAA0C,IAAzC,YAACz7G,GAAmCy7G,EAC9Ej5S,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAYwzS,yBAClBz4S,GAAI+8L,GACN,KAKNtxL,EAAA,mCAC8B4pS,EAAM,CAAC,gBAAgBqD,IAA0C,IAAzC,YAAC37G,GAAmC27G,EACtFn5S,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY0zS,8BAClB34S,GAAI+8L,GACN,KAKNtxL,EAAA,uBACkB4pS,EAAM,CAAC,YAAYuD,IAAmC,IAAlC,QAACzyS,GAA4ByyS,EAC/DC,EAAAA,EAAgBC,SAAS,WAAantS,KAAK3L,GAAImG,EAAQ,KAQ3DsF,EAAA,qCACgC4pS,EAAM,CAAC,QAAS,YAAY0D,IAAsB,IAArB,MAACj4R,EAAK,QAAEskB,GAAQ2zQ,GACzE7xQ,EAAAA,EAAAA,IAA6Bv7B,KAAK3L,GAAI8gB,EAAOskB,EAAQ,KAKzD35B,EAAA,uCACkC4pS,EAAM,CAAC,UAAU2D,IAAa,IAAZ,MAACl4R,GAAMk4R,GACvD7xQ,EAAAA,EAAAA,IAA+Bx7B,KAAK3L,GAAI8gB,EAAM,KAKlDrV,EAAA,gCAC2B4pS,EAAM,CAAC,YAAY4D,IAAe,IAAd,QAAC7zQ,GAAQ6zQ,GACpD9zQ,EAAAA,EAAAA,IAA+Bx5B,KAAK3L,GAAIolC,EAAQ,KAmBpD35B,EAAA,uCACkC4pS,EAAM,CAAC,SAAS6D,IAAY,IAAX,KAAC72O,GAAK62O,EACrD,MAAMl5S,GAAK8iE,EAAAA,EAAAA,MAYX,OAVAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,sBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfqiE,UAIDriE,CAAE,KAsBbyL,EAAA,4CACuC4pS,EAAM,CAAC,SAAS8D,IAAY,IAAX,KAAC92O,GAAK82O,EAC1D,MAAMn5S,GAAK8iE,EAAAA,EAAAA,MAYX,OAVAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,2BACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfqiE,UAIDriE,CAAE,KAObyL,EAAA,qCACgC4pS,EAAM,CAAC,SAAS+D,IAAY,IAAX,KAAC/2O,GAAK+2O,EACnD,MAAMp5S,GAAK8iE,EAAAA,EAAAA,MAYX,OAVAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,oBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfqiE,UAIDriE,CAAE,KASbyL,EAAA,oCAC+B4pS,EAAM,CAAC,WAAY,cAAcgE,IAA2B,IAA1B,SAACC,EAAQ,UAAE1yS,GAAUyyS,EAClF,MAAMr5S,GAAK8iE,EAAAA,EAAAA,MAaX,OAXAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,cACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfs5S,WACA1yS,eAID5G,CAAE,KACXyL,EAAA,4BAEqB4pS,EAAM,CAAC,6BAA6BkE,IAAuF,IAAtF,yBAACC,GAAgFD,EACzIh6S,EAAAA,QAAMD,UAASwgC,EAAAA,EAAAA,IAAiCn0B,KAAK3L,GAAIw5S,GAA0B,KAUvF/tS,EAAA,kCAC6B4pS,EAAM,CAAC,SAASoE,IAAY,IAAX,KAAClE,GAAKkE,EAChDl6S,EAAAA,QAAMD,UAAS2G,EAAAA,EAAAA,IAA2B0F,KAAK3L,GAAIu1S,GAAM,KAgB7D9pS,EAAA,yCACoC4pS,EAAM,CACtC,MACA,YACA,YACDqE,IAQG,IARF,IACA/yS,EAAG,UACHC,EACAI,SAAS,UAACF,GAAa,CAACA,WAAW,IAKtC4yS,EACGn6S,EAAAA,QAAMD,UAASoH,EAAAA,EAAAA,IAAkCiF,KAAK3L,GAAI2G,EAAKC,EAAW,CAACE,cAAY,KAM3F2E,EAAA,yCACoC4pS,EAAM,CACtC,MACA,cACDsE,IAMG,IANF,IACAhzS,EAAG,UACHC,GAIH+yS,EACGp6S,EAAAA,QAAMD,UAAS2H,EAAAA,EAAAA,IAAkC0E,KAAK3L,GAAI2G,EAAKC,GAAW,KAW9E6E,EAAA,yCACoC4pS,EAAM,CAAC,YAAa,UAAUuE,IAA2F,IAA1F,UAAChzS,EAAS,MAAEuQ,GAAyEyiS,EACpJ,MAAM55S,GAAK8iE,EAAAA,EAAAA,MAaX,OAXAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,4BACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACf4G,YACAuQ,MAAO8+R,EAAoB9+R,MAI5B,CAACnX,KAAI65S,eAAeA,EAAAA,EAAAA,IAAc75S,GAAKsyS,eAAeA,EAAAA,EAAAA,IAActyS,GAAK85S,iBAAiBA,EAAAA,EAAAA,IAAgB95S,GAAI,KAQzHyL,EAAA,8BACyB4pS,EAAM,CAC3B,QACA,cACD0E,IAMG,IANF,MACAp2M,EAAK,UACL/8F,GAIHmzS,EACG,MAAM/5S,GAAK8iE,EAAAA,EAAAA,MACX,IAAIqzO,EAAaD,EAAiBvyM,GAclC,OAbAwyM,EAAaxqS,KAAK3L,GAAK,IAAMm2S,EAE7B52S,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,qBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACf4G,YACA+8F,MAAOwyM,KAIRn2S,CAAE,KAGbyL,EAAA,2BAQsB4pS,EAAM,CACxB,QACA,cACD2E,IAMG,IANF,MACAr2M,EAAK,UACL/8F,GAIHozS,EACG,MAAMh6S,GAAK8iE,EAAAA,EAAAA,MACX,IAAIqzO,EAAaD,EAAiBvyM,GAclC,OAbAwyM,EAAaxqS,KAAK3L,GAAK,IAAMm2S,EAE7B52S,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,uBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACf4G,YACA+8F,MAAOwyM,KAIRn2S,CAAE,KAGbyL,EAAA,uBAOkB4pS,EAAM,CACpB,UACA,eACA,eACA,kBACA,gBACA,wBACA,uBACA,kBACA,aACA,UACA,oBACD4E,IAY8C,IAZ7C,QACArwD,EAAO,aACPhZ,EAAY,aACZG,EAAY,gBACZsC,EAAe,cACf6mE,EAAa,sBACbC,EAAwBA,IAAM,KAAI,qBAClCC,EAAuBA,IAAM,KAAI,gBACjCrwD,GAAkB,EAAK,WACvBswD,GAAa,EAAK,QAClBvwD,GAAU,EAAI,gBACdH,GACwCswD,EACxC,MAAMj6S,GAAK8iE,EAAAA,EAAAA,MAsBX,OApBAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,UACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACf4wO,eACAG,aAAcklE,EAAoBllE,GAClC6Y,QAAS,IAAMssD,EAAiBtsD,GAChCvW,gBAAiB,IAAM6iE,EAAiB7iE,GACxC6mE,gBACAC,wBACAC,uBACArwD,kBACAswD,aACAvwD,UACAH,qBAID3pP,CAAE,KAabyL,EAAA,wCACmC4pS,EAAM,CAAC,SAASiF,IAAY,IAAX,KAACj4O,GAAKi4O,EACtD,MAAMt6S,GAAK8iE,EAAAA,EAAAA,MAYX,OAVAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,uBACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfqiE,UAIDriE,CAAE,KAMbyL,EAAA,gDAC2C4pS,EAAM,CAAC,cAAckF,IAAuC,IAAtC,UAAC3zS,GAAgC2zS,EAC9F,OAAOxE,EAA8B,0BAA2BpqS,KAAK3L,GAAI4G,EAAU,KAMvF6E,EAAA,qCACgC4pS,EAAM,CAAC,cAAcmF,IAAuC,IAAtC,UAAC5zS,GAAgC4zS,EACnF,OAAOzE,EAA8B,eAAgBpqS,KAAK3L,GAAI4G,EAAU,KAM5E6E,EAAA,+BAC0B4pS,EAAM,CAAC,cAAcoF,IAAuC,IAAtC,UAAC7zS,GAAgC6zS,EAC7E,OAAO1E,EAA8B,SAAUpqS,KAAK3L,GAAI4G,EAAU,KAGtE6E,EAAA,+BAY0B4pS,EAAM,CAC5B,UACA,SACA,cACA,sBACA,eACA,aACDqF,IAmBI,IAnBH,QACA/2J,EAAO,OACP3gI,EAAM,YACN6rG,EAAW,oBACX8rL,EAAsB,KAAI,aAC1BC,EAAY,SACZC,GAaFH,EACE,MAAM16S,GAAK8iE,EAAAA,EAAAA,MAELg4O,EAAyBF,GAAgBjvS,KAAKovS,kCAAkC,CAAC5jS,MAAO0jS,EAAUj0S,UAAWg0S,IAoBnH,OAlBAr7S,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,SACNxJ,KAAIG,EAAA,CACAC,KACAkG,SAAUyF,KAAK3L,GACf2jJ,UACA90B,YAAaonL,EAAoBpnL,GACjC8rL,uBACGG,EAAyB,CACxB93R,OAAQA,IAAMzjB,EAAAA,QAAMD,SAASw7S,EAAuBhB,iBACpDkB,eAAgBF,EAAuB96S,IACvC,CACAgjB,aAKL83R,EAAyB,CAAC96S,KAAI46S,aAAcE,GAA0B96S,CAAE,KAOnFyL,EAAA,qCACgC4pS,EAAM,CAAC,YAAY4F,IAAe,IAAd,QAAC71Q,GAAQ61Q,EACzD,MAAMr7S,EAAO,CACTsG,SAAUyF,KAAK3L,GACfolC,WAEJ7lC,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAYi2S,8BAClBt7S,QACF,KAkCN6L,EAAA,uCACkC4pS,EAAM,CAAC,SAAS8F,IAAY,IAAX,KAAC94O,GAAK84O,EACrD,MAAMn7S,GAAK8iE,EAAAA,EAAAA,MAYX,OAVAvjE,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAY+wS,0BAClB5sS,KAAM,2BACNxJ,KAAM,CACFI,KACAkG,SAAUyF,KAAK3L,GACfqiE,UAIDriE,CAAE,KASbyL,EAAA,4BACuB4pS,EAAM,CAAC,YAAY+F,IAAe,IAAd,QAACC,GAAQD,EAChD,MAAMx7S,EAAO,CACTsG,SAAUyF,KAAK3L,GACfq7S,WAEJ97S,EAAAA,QAAMD,SAAS,CACX6E,KAAMc,EAAAA,GAAYq2S,8BAClB17S,QACF,KA7qCF+L,KAAK3L,GAAKA,CACd,CAkqBAu7S,0BAAAA,IACIl2Q,EAAAA,EAAAA,IAAiC15B,KAAK3L,GAC1C,CAgIAsG,4BAAAA,GACI/G,EAAAA,QAAMD,UAASgH,EAAAA,EAAAA,IAA6BqF,KAAK3L,IACrD,E,kHC/2BJ,MAAMw7S,EAAe,WAAH5xS,OAAc6xS,EAAAA,GAAe/xJ,OAExC,SAASrC,EAAe9lJ,GAA0C,IAAtBm6S,EAAUxsS,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,QAC5D,OAAOsG,QAAQjU,EAAM+oE,QAAQA,QAAQmxO,EAAAA,GAAe/xJ,QAChDs1B,IAAAA,IAAW/tG,OAAO+tG,IAAAA,MAAaz9K,EAAM+oE,QAAQA,QAAQmxO,EAAAA,GAAe/xJ,OAAO9+F,SAAW,UAAW8wP,GACzG,CAGO,SAASC,EAA8Bp6S,GAAoB,IAAAq6S,EAAAC,EAG9D,OAAOrmS,QAA2B,QAApBomS,EAACr6S,EAAMi6S,UAAa,IAAAI,GAAa,QAAbC,EAAnBD,EAAqBE,mBAAW,IAAAD,OAAb,EAAnBA,EAAkCE,cACrD,CAEO,SAASj/E,EAAmBv7N,GAAsE,IAAAy6S,EAGrG,OAA0B,QAAnBA,EAAAz6S,EAAMi6S,UAAa,IAAAQ,OAAA,EAAnBA,EAAqBC,WAAY,CAAC,CAC7C,CAEO,SAAS3+E,EAAe/7N,GAAiC,IAAA26S,EAG5D,OAA0B,QAA1BA,EAAO36S,EAAMi6S,UAAa,IAAAU,OAAA,EAAnBA,EAAqBJ,WAChC,CAEO,SAASK,EAAqB56S,EAAoB8Z,GAGrD,OAAK9Z,EAAMi6S,IAAkBj6S,EAAMi6S,GAAc1tR,UAK1CvsB,EAAMi6S,GAAc1tR,SAASzS,IAJzB,CAAC,CAKhB,CAEO,SAASmiN,EAA8Bj8N,EAAoB8Z,GAC9D,OAAO7F,QAAQ2mS,EAAqB56S,EAAO8Z,GAAW0/G,QAC1D,CAEO,SAASsiG,EAA+B97N,EAAoB8Z,GAC/D,MAAM0/G,EAAUohL,EAAqB56S,EAAO8Z,GAAW0/G,QACvD,YAA2B,IAAZA,IAA6BA,CAChD,C,qHCzCO,MAAM9sG,EAA4B1sB,IACrC,MAAMpB,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAC1B+B,GAASogB,EAAAA,EAAAA,IAAiBniB,GAEhC,OAAO66S,EAAAA,EAAkBx3R,uBAAuBzkB,EAAQmD,EAAO,EAGtD+4S,EAAmC96S,IAC5C,MAAMpB,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAC1B+B,GAASogB,EAAAA,EAAAA,IAAiBniB,GAEhC,OAAO66S,EAAAA,EAAkBxrR,0BAA0BzwB,EAAQmD,EAAO,EAQzDg5S,EAAqCA,CAAC/6S,EAAoB8jD,KACnE,MAAMllD,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAC1BupB,GAAOyxR,EAAAA,EAAAA,IAAch7S,EAAO8jD,GAC5B/hD,EAASwnB,GAAQA,EAAK9qB,GAE5B,OAAOo8S,EAAAA,EAAkBx3R,uBAAuBzkB,EAAQmD,GAAU,GAAG,EAG5Dk5S,EAA8BA,CAACj7S,EAAoB8jD,KAC5D,MAAMllD,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAC1BupB,GAAOyxR,EAAAA,EAAAA,IAAch7S,EAAO8jD,GAC5B/hD,EAASwnB,GAAQA,EAAK9qB,GAE5B,OAAOo8S,EAAAA,EAAkBt3R,sBAAsB3kB,EAAQmD,GAAU,GAAG,EAG3DopB,EAAqBnrB,IAC9B,MAAMpB,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAEhC,OAAO66S,EAAAA,EAAkB1vR,kBAAkBvsB,EAAO,EAGzCs8S,EAAiCl7S,IAC1C,MAAMm7S,EAAiBhwR,EAAkBnrB,GACnCpB,GAASqjB,EAAAA,EAAAA,IAAiBjiB,GAEhC,OAAO66S,EAAAA,EAAkBt3R,sBAAsB3kB,EAAQu8S,GAAkB,GAAIn7S,EAAM,C,oJC5ChF,SAASo7S,EAAoBp7S,GAChC,OAAOq7S,EAAAA,EAAAA,IAAUr7S,EAAOsnB,EAAAA,GAAYg0R,yBAA0BC,EAAAA,GAA2BC,qBAAsB,GACnH,CAEO,SAAStyD,EAA0BlpP,GACtC,OAAOA,EAAM8kD,MAAMk5K,OAAOmqB,sBAC9B,CAaO,MAAMw/B,EAAoB,CAC7B,CACIlpR,GAAI88S,EAAAA,GAA2BE,iBAC/B3yS,MAAO,IAEX,CACIrK,GAAI88S,EAAAA,GAA2BG,WAC/B5yS,MAAO,CAAC,gBAEZ,CACIrK,GAAI88S,EAAAA,GAA2BI,mBAC/B7yS,MAAO,CAAC,gBAEZ,CACIrK,GAAI88S,EAAAA,GAA2BK,kBAC/B9yS,MAAO,CAAC,gBAEZ,CACIrK,GAAI88S,EAAAA,GAA2BM,eAC/B/yS,MAAO,CAAC,eAAgB,gBAE5B,CACIrK,GAAI88S,EAAAA,GAA2BO,cAC/BhzS,MAAO,KAKR,SAASizS,EAAc3mI,EAAgBtsK,GAC1C,MAAMw6N,EAAYx6N,aAAK,EAALA,EAAOojC,MAAM,KAC/B,OACIo3L,aAAS,EAATA,EAAWt6L,MAAMx0B,GAAS4gK,EAAKtsK,MAAM+qC,SAASr/B,OACtB,IAAtB4gK,EAAKtsK,MAAMgI,MAErB,CAEA,MAAMkrS,GAAWlqP,EAAAA,EAAAA,IACb,YACC9xD,IAAuByqB,EAAAA,EAAAA,IAAezqB,KACtCA,IAAuBgrB,EAAAA,EAAAA,IAAahrB,KACrC,CAAC2oC,EAAaszQ,KACV,MAAMnzS,EAAQmzS,EAAa,eAAH5zS,OAAkBsgC,aAAW,EAAXA,EAAa7/B,OAAU6/B,aAAW,EAAXA,EAAa7/B,MAC9E,OAAO6+Q,EAAM98Q,QAAQuqK,GAAS2mI,EAAc3mI,EAAMtsK,IAAO,IAI3DozS,GAA0B7kN,EAAAA,EAAAA,IAAgB,0BAA2B/vE,EAAAA,GAAY60R,wBAC1ErlI,GAA+Bz/E,EAAAA,EAAAA,IAAgB,+BAAgCm8E,EAAAA,IAiB/E4oI,IAd6BtqP,EAAAA,EAAAA,IACtC,6BACAoqP,GACCl8S,IAAuByqB,EAAAA,EAAAA,IAAezqB,KACtCA,IAAuBgrB,EAAAA,EAAAA,IAAahrB,KACpCA,GAAuBg8S,EAASh8S,KACjC,CAACq8S,EAAiB1zQ,EAAaszQ,EAAYK,KACvC,MAAMxzS,EAAQmzS,EAAa,eAAH5zS,OAAkBsgC,aAAW,EAAXA,EAAa7/B,OAAU6/B,aAAW,EAAXA,EAAa7/B,MAE9E,OAAQwzS,EAAQzuC,OADGz4F,GAAmBinI,EAAgBrzQ,MAAMwtD,GAAUA,EAAK3uF,OAASutK,EAAK32K,IAAqB,SAAf+3F,EAAKtrF,QAAsB6wS,EAAc3mI,EAAMtsK,MAC9G,KAKKgpD,EAAAA,EAAAA,IACzC,gCACAoqP,GACCl8S,GAAuBg8S,EAASh8S,KACjC,CAACq8S,EAAiBC,IAEPA,EAAQtzQ,MADIosI,GAAmBinI,EAAgBrzQ,MAAMwtD,GAAUA,EAAK3uF,OAASutK,EAAK32K,UAKpF89S,GAAsBzqP,EAAAA,EAAAA,IAC/B,sBACAglH,EACAolI,EACAxtP,EAAAA,IACC1uD,IAAuBqnB,EAAAA,EAAAA,IAAQrnB,EAAOwzK,EAAAA,GAAwBQ,EAAAA,GAAmBE,6BACjFl0K,GAAuBo8S,EAA8Bp8S,KACtD,CAACw8S,EAAuBC,EAAwBlpK,EAAcmpK,EAAgBC,KAG1E,MAAMC,EAA0CJ,aAAqB,EAArBA,EAAuBxzQ,MAAMwtD,GACzEA,EAAK3uF,OAASmsK,EAAAA,GAAmBE,2BAA6B19E,EAAK3uF,OAASmsK,EAAAA,GAAmBC,4BAEnG,GAAI2oI,EACA,MAAO,CAAEF,IAAmBnpK,GAAe,GAU/C,MAAMspK,EAA+BJ,EAAuBzzQ,MAAMwtD,GAAUA,EAAK3uF,OAAS0zS,EAAAA,GAA2BuB,OAC/GC,EAA4BN,EAAuBzzQ,MAAMwtD,GAAUA,EAAK3uF,OAAS0zS,EAAAA,GAA2BhjN,MAAuB,UAAf/B,EAAKtrF,QAK/H,IAFwC0xS,IAFbC,GAAgCE,IAA8BJ,EAKrF,MAAO,EAAGppK,GAAe,GAM7B,MAAMypK,EAAwBP,EAAuBzzQ,MAAMwtD,GAAUA,EAAK3uF,OAAS0zS,EAAAA,GAA2BuB,MAAuB,SAAftmN,EAAKtrF,QACrH+xS,EAA0BR,EAAuBzzQ,MAAMwtD,GAAUA,EAAK3uF,OAAS0zS,EAAAA,GAA2BhjN,MAAuB,SAAf/B,EAAKtrF,QAEvHgyS,GAAsDF,IAA0BC,EAKtF,MAAO,CAHcC,IAAuD3pK,EAChD2pK,EAEc,G,8NC1I3C,MAAM9qB,GAAwBtgO,EAAAA,EAAAA,IACjC,yBACC9xD,GAAuBA,EAAM+oE,QAAQo0O,eACrC94O,GACUA,GAAY,CAAC,IAIfs1E,GAAkC7nF,EAAAA,EAAAA,IAC3C,mCACC9xD,GAAuBA,EAAM+oE,QAAQ7hE,WAAWk2S,gBAChDl2S,GACWA,GAAc,KAIjBymO,GAAsC77K,EAAAA,EAAAA,IAC/C,uCACC9xD,GAAuBA,EAAM+oE,QAAQ7hE,WAAW8lO,oBAChD9lO,GACUA,IAIFm2S,GAAmCvrP,EAAAA,EAAAA,IAC5C,oCACC9xD,IAAuBkuS,EAAAA,EAAAA,IAAcluS,KACrCA,GAAuBA,EAAM+oE,QAAQ7hE,WAAWo2S,sBAChDt9S,GAAuBA,EAAM+oE,QAAQ7hE,WAAWg9O,SACjD,SAAC1qH,GAAiE,IAAxD+jL,EAAuB5vS,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAAI6vS,EAAgB7vS,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACvD,IAAK6rH,IAAYgkL,EAAiB1sS,OAC9B,OAAOysS,EAIX,MAAME,EAAkBD,EAAiBzyS,KAAK2yS,GAAoBA,EAAgB/4S,WAClF,OAAO44S,EAAwB1yS,QAAQ8yS,IAA4BF,EAAgB5pQ,SAAS8pQ,EAAuBh5S,WACvH,IAGEi5S,GAAmD9rP,EAAAA,EAAAA,IACrD,oDACC9xD,GAAuBA,IACvBA,GAAuBA,EAAM+oE,QAAQ7hE,WAAW22S,gBACjD,SAAC79S,GACG,OAD+B2N,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,IACC5C,KAAK1F,GACE,mBAA3BA,EAAUm1H,cACVn1H,EAAUm1H,aAAax6H,IAK1C,IAGS89S,GAAuCC,EAAAA,EAAAA,IAChD,uCACAH,GACC59S,GAAuBA,EAAM+oE,QAAQ7hE,WAAW22S,gBACjD,WAAkE,IAAjEG,EAAqBrwS,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACrB,OADoDA,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,IACpB9C,QAAO,CAACxF,EAAW8zM,IAAQ6kG,EAAsB7kG,IACxF,IAGS8kG,GAA+BnsP,EAAAA,EAAAA,IACxC,gCACC9xD,GAAuBA,EAAM+oE,QAAQ7hE,WAAWg3S,qBACjD,WACI,OADOvwS,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAEd,IAGSwwS,GAA4BrsP,EAAAA,EAAAA,IACrC,6BACC9xD,GAAuBA,EAAM+oE,QAAQ7hE,WAAWg9O,SACjD,WACI,OADOv2O,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAEd,IAGSw4O,GAAmBr0L,EAAAA,EAAAA,IAC5B,mBACAo8O,EAAAA,GACAM,EAAAA,GACA2P,EACAd,GACA,CAAC7jL,EAAkBp/G,EAAwBojS,EAAqCD,IACrE/jL,GAAWvlH,QAAQmG,EAAStJ,QAAU0sS,EAAiB1sS,QAAUysS,EAAwBzsS,UAIjG,SAASstS,EAAoCp+S,GAChD,MAAMq+S,GAAoBpzO,EAAAA,EAAAA,IAAIjrE,EAAOsnB,EAAAA,GAAYmnR,QAASnnR,EAAAA,GAAYg3R,mCAAoC,IAE1G,MAD+C,KAAtBD,IAA8G,IAAlFv+R,KAAKC,MAAMs+R,GAAmB/2R,EAAAA,GAAYg3R,mCAEnG,CAEO,MAAM31E,GAA6B72K,EAAAA,EAAAA,IACtC,6BACAj9B,EAAAA,IACC70B,GAAuBA,EAAM+oE,QAAQ7hE,WAAWkhO,oBACjD,SAACxzM,GAA6B,IAApB1tB,EAAUyG,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACnB,MAA2B,SAAvBinB,EAAQG,WACD,GAEJ7tB,CACX,IAGSmgO,GAAoBv1K,EAAAA,EAAAA,IAC7B,oBACAj9B,EAAAA,IACC70B,GAAuBA,EAAM+oE,QAAQ7hE,WAAWq/N,cACjD,SAAC3xM,GAA6B,IAApB1tB,EAAUyG,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACnB,MAA2B,SAAvBinB,EAAQG,WACD,GAEJ7tB,CACX,IAGSmiO,GAAmBv3K,EAAAA,EAAAA,IAC5B,mBACAj9B,EAAAA,IACC70B,GAAuBA,EAAM+oE,QAAQ7hE,WAAWq3S,gBACjD,SAAC3pR,GAA6B,IAApB1tB,EAAUyG,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GACnB,MAA2B,SAAvBinB,EAAQG,WACD,GAEJ7tB,CACX,G,qECvIG,SAASs3S,EAAqBx+S,EAAoBqqB,GACrD,OAAOo0R,EAAAA,EAAAA,IAAkBC,EAAe1+S,GAAQqqB,EACpD,CAEO,SAASs0R,EAAuB3+S,EAAoBqqB,GAAqC,IAAAu0R,EAAAC,EAC5F,OAAgD,QAAhDD,EAA4C,QAA5CC,EAAOL,EAAqBx+S,EAAOqqB,UAAS,IAAAw0R,OAAA,EAArCA,EAAuCpgT,UAAE,IAAAmgT,EAAAA,EAAI,IACxD,CAEO,MAAMF,EAAkB1+S,GAAuBA,EAAM+oE,QAAQ7hE,WAAWo6N,O,kBCbxE,SAAS35K,EAAqB3nD,GACjC,OAAOA,EAAM8kD,MAAMi5C,MAAM+gN,gBAAgBr7S,OAC7C,CAEO,SAASs7S,EAAqB/+S,GACjC,OAAOA,EAAM8kD,MAAMi5C,MAAM+gN,gBAAgBC,oBAC7C,CAEO,SAAS16S,EAAyBrE,GACrC,OAAOA,EAAM8kD,MAAMi5C,MAAM+gN,gBAAgBj7S,qBAC7C,CAEO,SAASm7S,EAAkCh/S,GAC9C,OAAOA,EAAM8kD,MAAMi5C,MAAMkhN,8BAC7B,CAEO,SAASC,EAA6Cl/S,GACzD,OAAOA,EAAM8kD,MAAMi5C,MAAMohN,yCAC7B,C,gGClBO,MAAMltR,EAAgCA,CAACjyB,EAAoB8Z,IAAsB9Z,EAAM8kD,MAAMx5C,QAAQ8zS,aAAatlS,GAC5GuoM,EAAkBriN,GAAuBA,EAAM8kD,MAAMx5C,QAAQ+zS,W,kBCDnE,SAASv+M,EAAY9gG,EAAoBwa,GAC5C,OAAOvG,QAAQjU,EAAM8kD,MAAMk5K,OAAOM,WAAW9jN,IAAYxa,EAAM8kD,MAAMk5K,OAAOM,WAAW9jN,GAASnB,KACpG,CACO,SAASizJ,EAAetsK,GAC3B,OAAOiU,QAAQjU,EAAM8kD,MAAMk5K,OAAOM,YAGtC,SAAuBt+N,GACnB,IAAI4tG,GAAS,EACb,MAAM0xM,EAAmBt/S,EAAM8kD,MAAMk5K,OAAOM,WAC5C,IAAK,MAAM51I,KAAS42N,EAChB,GAAI52N,GAAS42N,EAAiB52N,GAAOrvE,KAAM,CACvCu0F,GAAS,EACT,KACJ,CAEJ,OAAOA,CACX,CAboD2xM,CAAcv/S,GAClE,C,2DCLO,MAAM8xB,EAAmB9xB,GAAuBA,EAAMmlC,S,wEC0G7D,MAEA,EAFqB,IAxGrB,MAIIzc,YAAAA,GACI,GAAIte,KAAKo1S,0BAA2B,CAEhC,MAAMC,EAAWn3S,EAAAA,KAEjBA,EAAAA,GAAmCumE,EAAAA,GAAgBvxC,cACnDh1B,EAAAA,GAAmCumE,EAAAA,GAAgB6wO,aAEnDC,eAAe/lN,QAAQ/qB,EAAAA,GAAgBq0J,OAAQu8E,GAC/CrmN,aAAaQ,QAAQ/qB,EAAAA,GAAgBq0J,OAAQu8E,GAC7CrmN,aAAawmN,WAAW/wO,EAAAA,GAAgBq0J,OAC5C,CACJ,CAEA28E,kBAAAA,CAAmBJ,GACf,OAAOA,IAAaE,eAAetmN,QAAQxqB,EAAAA,GAAgBq0J,OAC/D,CAEAj1E,WAAAA,GACI,GAAI7jJ,KAAKo1S,0BAA2B,CAEhC,MAAMp/S,EAAUkI,EAAAA,KAEhBq3S,eAAe/lN,QAAQ/qB,EAAAA,GAAgBs0J,MAAO/iO,GAC9Cg5F,aAAaQ,QAAQ/qB,EAAAA,GAAgBs0J,MAAO/iO,GAC5Cg5F,aAAawmN,WAAW/wO,EAAAA,GAAgBs0J,MAC5C,CACJ,CAEA28E,iBAAAA,CAAkB1/S,GACd,OAAOA,IAAYu/S,eAAetmN,QAAQxqB,EAAAA,GAAgBs0J,MAC9D,CAEAq8E,uBAAAA,GACI,GAAIp1S,KAAK21S,uBACL,OAAO31S,KAAK41S,sBAGhB51S,KAAK41S,uBAAwB,EAE7B,IACI5mN,aAAaQ,QAAQ,gBAAiB,KACQ,MAA1CR,aAAaC,QAAQ,mBACrBjvF,KAAK41S,uBAAwB,GAEjC5mN,aAAawmN,WAAW,gBAC5B,CAAE,MAAO/4S,GACLuD,KAAK41S,uBAAwB,CACjC,CAEA,IACIL,eAAe/lN,QAAQ,kBAAmB,KAC1C+lN,eAAeC,WAAW,kBAC9B,CAAE,MAAO/4S,IAEL4S,EAAAA,EAAAA,KAAaC,KAAK,eAAiBumS,EAAAA,GAAeC,cACtD,CAIA,OAFA91S,KAAK21S,wBAAyB,EAEvB31S,KAAK41S,qBAChB,CAEAj6D,kBAAAA,GACI,OAAO3sJ,aAAaC,QAAQxqB,EAAAA,GAAgBsxO,kBAChD,CAEAn6D,kBAAAA,CAAmBo6D,GACfhnN,aAAaQ,QAAQ/qB,EAAAA,GAAgBsxO,kBAAmBzwO,OAAO0wO,GACnE,CAEAC,oBAAAA,CAAqBC,GACjB,OAAOlnN,aAAaC,QAAQxqB,EAAAA,GAAgB0xO,mBAAqB7wO,OAAO4wO,GAC5E,CAEAE,mCAAAA,CAAoCF,GAChClnN,aAAaQ,QAAQ/qB,EAAAA,GAAgB0xO,mBAAqB7wO,OAAO4wO,GAAUG,EAAAA,GAAuBC,cACtG,CAEAC,6BAAAA,CAA8BL,GAC1BlnN,aAAaQ,QAAQ/qB,EAAAA,GAAgB0xO,mBAAqB7wO,OAAO4wO,GAAUG,EAAAA,GAAuBG,QACtG,CAEAC,sBAAAA,CAAuBP,GACnBlnN,aAAawmN,WAAW/wO,EAAAA,GAAgB0xO,mBAAqB7wO,OAAO4wO,GACxE,CAEApjN,0CAAAA,GACI,MAA6F,SAAtF9D,aAAaC,QAAQxqB,EAAAA,GAAgBiyO,4CAChD,CAEA1jN,0CAAAA,GACIhE,aAAaQ,QAAQ/qB,EAAAA,GAAgBiyO,4CAA6C,OACtF,CAEAl4R,4CAAAA,GACIwwE,aAAawmN,WAAW/wO,EAAAA,GAAgBiyO,4CAC5C,E,iBCzEG,SAAS7xO,EAAiBl7C,GAA2B,IAAA2B,EAAAqrR,EACxD,MAAMC,EAAsC,KAAzBjtR,EAAMjtB,QAAQmwB,OAC3BgqR,GAA+B,QAAfvrR,EAAA3B,EAAM8B,iBAAS,IAAAH,OAAA,EAAfA,EAAiB5kB,QAAS,EAC1CowS,GAA2C,QAAvBH,EAAAhtR,EAAMsnB,yBAAiB,IAAA0lQ,OAAA,EAAvBA,EAAyBjwS,QAAS,EAE5D,OAAQkwS,IAAeC,IAAkBC,CAC7C,CAEO,SAASC,EAAyBxrR,GAAyC,IAAAyrR,EAC9E,MAAO,CACHt6S,QAAS6uB,EAAc7uB,QACvB+uB,WAAiC,QAAtBurR,EAAAzrR,EAAcvB,gBAAQ,IAAAgtR,OAAA,EAAtBA,EAAwBtrR,QAAS,GAC5CulB,kBAAmB,GACnBj0C,MAAOuuB,EAAcvuB,MACrB0S,UAAW6b,EAAcza,WACzBgD,OAAQyX,EAAcxa,QACtBy6D,SAAU,EACVC,SAAU,EACVzhD,SAAU,CACNitD,SAAU1rD,EAAc0rD,UAGpC,C,4EC3CO,IAAKnlD,EAAW,SAAXA,GAAW,OAAXA,EAAW,YAAXA,EAAW,YAAXA,EAAW,kBAAXA,CAAW,MAMXmlR,EAAO,SAAPA,GAAO,OAAPA,EAAO,gBAAPA,EAAO,kBAAPA,CAAO,K,ohBCbnB,MAAMC,EAAkB,CACpBr1E,SAAS,GCFb,EADuB,IDMR,MAsCXjiO,WAAAA,GArCAE,EAAA,4BACuBE,KAAKm3S,iBAC2Br3S,EAAA,2BACjCE,KAAKo3S,gBAAct3S,EAAA,2BACnBE,KAAKq3S,gBAAcv3S,EAAA,uBAMxB,GAOjBA,EAAA,gCAC0B,GAAKA,EAAA,iCACJ,GAAIA,EAAA,oBAEjB,GAAKA,EAAA,0BAEC,GAAKA,EAAA,uBACR,GAAKA,EAAA,4BACA,GAAKA,EAAA,8BACH,GAAKA,EAAA,wBACX,GAAKA,EAAA,0BACH,GAAKA,EAAA,sBACT,GAAKA,EAAA,wBACH,GAAKA,EAAA,wBACL,GAAIA,EAAA,qBACe,MAErCA,EAAA,wBACkB,GAusBlBA,EAAA,sBAEiBqV,IACb,KACMA,aAAiBomP,eAClBpmP,EAAM2iD,QACL3iD,EAAM2iD,kBAAkBw/O,aAE1B,OAGJt3S,KAAKu3S,0BAA2B,EAEhC,MAAMC,EACariS,EAAM24D,QADnB0pO,EAEYriS,EAAMi5D,OAFlBopO,EAGcriS,EAAM6mD,SAE1B,QAAQ,GACR,KAAKC,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAAS0zI,KAExC,GADA7nM,KAAKy3S,yBAA0B,IACzBpyP,EAAAA,EAAAA,OAAWmyP,IAA8Bz7O,EAAAA,EAAAA,GAAiB5mD,GAC5D,OAEJnV,KAAK03S,iBAAkB,EACvB,MACJ,KAAKz7O,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASwjP,OAExC,GADA33S,KAAKy3S,yBAA0B,GAC1Bz3S,KAAK43S,UAAY53S,KAAK43S,QAAQlxS,OAC/B,OAIA8wS,IAA+BA,IAC/Bx3S,KAAK63S,mBAAoB,EACzB1iS,EAAMjO,iBACFswS,EACAx3S,KAAK83S,iBAEL93S,KAAK+3S,cAGb,MACJ,KAAK97O,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASwtK,IAExC,GADA3hO,KAAKy3S,yBAA0B,IAC1Bp4L,EAAAA,EAAAA,SAAmBtjD,EAAAA,EAAAA,GAAiB5mD,GACrC,OAEJnV,KAAKg4S,gBAAiB,EACtB7iS,EAAMjO,iBACFswS,EACAx3S,KAAK83S,iBAEL93S,KAAK+3S,aAET,MACJ,KAAK97O,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASya,IAExC,GADA5uE,KAAKy3S,yBAA0B,GAC1Bz3S,KAAKi4S,uBAAyBj4S,KAAKk4S,WAAal4S,KAAKk4S,SAASxxS,OAC/D,OAEJ1G,KAAKm4S,qBAAsB,EAC3BhjS,EAAMjO,iBACFlH,KAAKo4S,sBACLp4S,KAAKq4S,cAELr4S,KAAKs4S,kBAET,MACJ,KAAKr8O,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAAS8a,MAExC,GADAjvE,KAAKy3S,yBAA0B,GAC1Bz3S,KAAKi4S,uBAAyBj4S,KAAKk4S,WAAal4S,KAAKk4S,SAASxxS,OAC/D,OAEJ1G,KAAKu4S,uBAAwB,EAC7BpjS,EAAMjO,iBACFlH,KAAKo4S,sBACLp4S,KAAKs4S,kBAELt4S,KAAKq4S,cAET,MACJ,KAAKp8O,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASua,QAGxC,GAFA1uE,KAAKw4S,iBAAkB,EACvBx4S,KAAKy3S,yBAA0B,GAC1Bz3S,KAAKi4S,qBACN,OAEJ9iS,EAAMjO,iBACNlH,KAAKrG,mBACL,MACJ,KAAKsiE,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAAS+Z,OACxCluE,KAAKy4S,mBAAoB,EACzB,MACJ,KAAKx8O,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASorG,OACV,WAA1BpqJ,EAAM2iD,OAAO4gP,WACbvjS,EAAMjO,iBACNiO,EAAM+7C,kBACN/7C,EAAM2iD,OAAO5M,SAEjB,MACJ,KAAK+Q,EAAAA,EAAAA,GAAa9mD,EAAO4N,EAAAA,GAAUoxC,SAASwkP,GAExC34S,KAAKy3S,yBAA0B,EAC/Bz3S,KAAK44S,eAAgB,EAEzB,IACH94S,EAAA,oBAEa,KACVE,KAAK64S,yBAAyB,IACjC/4S,EAAA,yBAEmBqV,IAEXnV,KAAKy4S,oBACNz4S,KAAKy3S,yBAA0B,GAE/BtiS,EAAM2iD,SAAW93D,KAAKu8D,eAG1Bv8D,KAAKrG,kBAAkB,IAC1BmG,EAAA,wBAEiB,KACdE,KAAK84S,gBAAiB,EACtB94S,KAAKu3S,0BAA2B,CAAK,IACxCz3S,EAAA,sBAEe,KACZE,KAAK84S,gBAAiB,CAAK,IAC9Bh5S,EAAA,oBAEcqV,IACPA,EAAM2iD,kBAAkBw/O,aAMpBt3S,KAAKy3S,yBAA2Bz3S,KAAK+4S,iBAAuC,iBAApB5jS,EAAM2iD,OAAOzjE,IACrE2L,KAAKg5S,YAAY7jS,EAAM2iD,OAAQ3iD,EAAM8jS,iBAAkB,GAK1Dj5S,KAAK+4S,kBACN/4S,KAAK+4S,iBAAkB,EAC3B,IACHj5S,EAAA,wBAEkBqV,IACTA,aAAiBmlD,cAIlB4+O,EAAAA,EAAAA,IAAuB/jS,EAAM+jD,SAAY/jD,EAAM+jD,OAAOpB,UAItD3iD,EAAM+jD,OAAOgpC,cAAgBliG,KAAKu3S,0BACnCv3S,KAAKm5S,aAAc,EACnBn5S,KAAKg5S,YAAY7jS,EAAM+jD,OAAOpB,QAAQ,GACtC93D,KAAKm5S,aAAc,GAEnBhkS,EAAM+jD,OAAOpB,OAAO94C,QACxB,IACHlf,EAAA,yBAEmBqV,IACZA,EAAM2iD,SAAW9oD,SACjBhP,KAAK+4S,iBAAkB,EAC3B,IACHj5S,EAAA,iCAE0B,KACnBE,KAAKi4S,uBACLj4S,KAAKo5S,qBACDp5S,KAAKq5S,iBAAmBr5S,KAAKs5S,cAC7Bt5S,KAAKu5S,oBAAmB,GAEhC,IACHz5S,EAAA,kCAE2B,KACpBE,KAAKi4S,uBACLj4S,KAAKw5S,sBACDx5S,KAAKq5S,iBAAmBr5S,KAAKy5S,eAC7Bz5S,KAAKu5S,oBAAmB,GAEhC,IACHz5S,EAAA,kCAE2B,KACpBE,KAAKi4S,uBACLj4S,KAAK05S,sBACD15S,KAAKq5S,iBAAmBr5S,KAAKu8D,eAC7Bv8D,KAAKu5S,oBAAmB,GAEhC,IA34BA/5S,SAASq7D,iBAAiBhyC,EAAAA,GAAW23I,SAAUxgK,KAAKosE,cAAe8qO,GACnE13S,SAASq7D,iBAAiBhyC,EAAAA,GAAW8wR,OAAQ35S,KAAK8uQ,YAAaooC,GAC/D13S,SAASq7D,iBAAiBhyC,EAAAA,GAAW63I,MAAO1gK,KAAK45S,iBAAkB1C,GACnE13S,SAASq7D,iBAAiBhyC,EAAAA,GAAWgxR,WAAY75S,KAAK85S,gBAAiB5C,GACvE13S,SAASq7D,iBAAiBhyC,EAAAA,GAAWkxR,SAAU/5S,KAAK6uQ,cAAeqoC,GACnE13S,SAASq7D,iBAAiBhyC,EAAAA,GAAWo5E,MAAOjiG,KAAK+wE,YAAammO,GAC9D13S,SAASq7D,iBAAiBmnC,EAAAA,GAAqBC,MAAOjiG,KAAKg6S,gBAAiB9C,GAC5EloS,OAAO6rD,iBAAiBhyC,EAAAA,GAAWoxR,KAAMj6S,KAAKk6S,iBAAkBhD,EACpE,CAEAzhK,OAAAA,GACIz1I,KAAKm6S,oBACLn6S,KAAKo6S,oBAEL56S,SAASu7D,oBAAoBlyC,EAAAA,GAAW23I,SAAUxgK,KAAKosE,cAAe8qO,GACtE13S,SAASu7D,oBAAoBlyC,EAAAA,GAAW8wR,OAAQ35S,KAAK8uQ,YAAaooC,GAClE13S,SAASu7D,oBAAoBlyC,EAAAA,GAAW63I,MAAO1gK,KAAK45S,iBAAkB1C,GACtE13S,SAASu7D,oBAAoBlyC,EAAAA,GAAWgxR,WAAY75S,KAAK85S,gBAAiB5C,GAC1E13S,SAASu7D,oBAAoBlyC,EAAAA,GAAWkxR,SAAU/5S,KAAK6uQ,cAAeqoC,GACtE13S,SAASu7D,oBAAoBlyC,EAAAA,GAAWo5E,MAAOjiG,KAAK+wE,YAAammO,GACjE13S,SAASu7D,oBAAoBinC,EAAAA,GAAqBC,MAAOjiG,KAAKg6S,gBAAiB9C,GAC/EloS,OAAO+rD,oBAAoBlyC,EAAAA,GAAWoxR,KAAMj6S,KAAKk6S,iBAAkBhD,EACvE,CAUAh1E,kBAAAA,CAAmB96N,GACfpH,KAAKq6S,cAAgBjzS,CACzB,CAOA46N,kBAAAA,GACIhiO,KAAKq6S,cAAgB,IACzB,CAWA,wBAAIpC,GACA,UAAKj4S,KAAK43S,SAAY53S,KAAK43S,QAAQlxS,QAAW1G,KAAKs6S,eAAet6S,KAAKs5S,iBAGlEt5S,KAAKy3S,yBAGNz3S,KAAKu6S,aAAev6S,KAAKw6S,cAGxBx6S,KAAKs6S,eAAet6S,KAAKu8D,eAIlC,CAKA,WAAIq7O,GACA,IAAI6C,EAAcz6S,KAAK06S,6BAA6B16S,KAAK26S,sBAIzD,OAHAF,EAAcA,EAAYh6S,QAAQ2G,GACvBpH,KAAK46S,iBAAiBxzS,KAE1BqzS,CACX,CAKA,YAAIvC,GACA,IAAIuC,EAAcz6S,KAAK06S,6BAA6B16S,KAAK66S,uBAOzD,OANAJ,EAAcA,EAAYh6S,QAAQ2G,GACvBpH,KAAK46S,iBAAiBxzS,KAE7BpH,KAAKo4S,uBACLqC,EAAYl3K,UAETk3K,CACX,CAKA,qBAAIK,GACA,OAAK96S,KAAKs5S,aAGHt5S,KAAK43S,QAAQprR,QAAQxsB,KAAKs5S,eAFrB,CAGhB,CAKA,sBAAIyB,GACA,OAAK/6S,KAAKy5S,cAGHz5S,KAAKk4S,SAAS1rR,QAAQxsB,KAAKy5S,gBAFtB,CAGhB,CAKA,yBAAIrB,GACA,QAAKp4S,KAAKs5S,cAGHt5S,KAAKg7S,yBAAyBh7S,KAAKs5S,aAC9C,CAKA,kBAAID,GACA,IAAIA,EAQJ,OAPIr5S,KAAKu8D,cACL88O,EAAiBr5S,KAAKu8D,cACfv8D,KAAKy5S,cACZJ,EAAiBr5S,KAAKy5S,cACfz5S,KAAKs5S,eACZD,EAAiBr5S,KAAKs5S,cAEnBD,CACX,CAKA,oBAAI4B,GACA,OAAOj7S,KAAKg4S,gBACLh4S,KAAKm4S,qBACLn4S,KAAKu4S,uBACLv4S,KAAK03S,iBACL13S,KAAK63S,mBACL73S,KAAK44S,eACL54S,KAAKw4S,eAChB,CAMA,eAAI+B,GACA,OAAOv6S,KAAKk7S,oBAAoBx0S,OAAS,CAC7C,CAMA,eAAI8zS,GACA,OAAOx6S,KAAKm7S,oBAAoBz0S,OAAS,CAC7C,CAOA,qBAAI00S,GACA,OAAOp7S,KAAKs5S,cAA0F,SAA1Et5S,KAAKs5S,aAAan3J,aAAak5J,EAAAA,GAAmBC,mBAClF,CAOAvD,UAAAA,GACI,MAAMH,EAAU53S,KAAK43S,QACrB,GACKA,GACAA,EAAQlxS,SACT1G,KAAKu6S,cACLv6S,KAAKw6S,YAJT,CAQA,IAAKx6S,KAAKo7S,kBAAmB,CACzB,IAAIG,EAMAA,GAJCv7S,KAAKs5S,cACNt5S,KAAK86S,oBAAsBlD,EAAQlxS,OAAS,GAC5C1G,KAAKw7S,gBAEO5D,EAAQ,GAERA,EAAQ53S,KAAK86S,kBAAoB,GAEjD96S,KAAKy7S,gBAAgBF,EACzB,CACAv7S,KAAK07S,kBACL17S,KAAKw7S,iBAAkB,CAfvB,CAgBJ,CAKA1D,cAAAA,GACI,MAAMF,EAAU53S,KAAK43S,QACrB,GACKA,GACAA,EAAQlxS,SACT1G,KAAKu6S,cACLv6S,KAAKw6S,YAJT,CAQA,IAAKx6S,KAAKo7S,kBAAmB,CACzB,IAAIG,EAEAA,GADCv7S,KAAKs5S,cAA4C,IAA3Bt5S,KAAK86S,mBAA2B96S,KAAKw7S,gBAChD5D,EAAQ,GACc,IAA3B53S,KAAK86S,kBACAlD,EAAQA,EAAQlxS,OAAS,GAEzBkxS,EAAQ53S,KAAK86S,kBAAoB,GAEjD96S,KAAKy7S,gBAAgBF,EACzB,CACAv7S,KAAK07S,kBACL17S,KAAKw7S,iBAAkB,CAbvB,CAcJ,CAKAnD,WAAAA,GACI,MAAMH,EAAWl4S,KAAKk4S,SAChByD,EAAuB37S,KAAK47S,2BAA2B57S,KAAKs5S,cAClE,IACIt5S,KAAKu6S,cACLv6S,KAAKw6S,aACJtC,GACAA,EAASxxS,SACRi1S,GAAwB37S,KAAK+6S,qBAAuB7C,EAASxxS,OAAS,GAL5E,CASA,IAAK1G,KAAKo7S,kBAAmB,CACzB,IAAIS,EAEAA,EADA77S,KAAKy5S,eAAiBz5S,KAAK+6S,mBAAqB7C,EAASxxS,OAAS,EACrDwxS,EAASl4S,KAAK+6S,mBAAqB,GAEnC7C,EAAS,GAE1Bl4S,KAAK87S,iBAAiBD,EAC1B,CACA77S,KAAK07S,kBACL17S,KAAKw7S,iBAAkB,CAXvB,CAYJ,CAKAlD,eAAAA,GACI,MAAMJ,EAAWl4S,KAAKk4S,SAChByD,EAAuB37S,KAAK47S,2BAA2B57S,KAAKs5S,cAClE,IACIt5S,KAAKu6S,cACLv6S,KAAKw6S,aACJtC,GACAA,EAASxxS,SACRi1S,GAAoD,IAA5B37S,KAAK+6S,oBALnC,CASA,IAAK/6S,KAAKo7S,kBAAmB,CACzB,IAAIS,EAEAA,EADA77S,KAAKy5S,eAAiBz5S,KAAK+6S,mBAAqB,EACnC7C,EAASl4S,KAAK+6S,mBAAqB,GACzC/6S,KAAKy5S,eAA6C,IAA5Bz5S,KAAK+6S,mBACrB7C,EAASA,EAASxxS,OAAS,GAE3BwxS,EAAS,GAE1Bl4S,KAAK87S,iBAAiBD,EAC1B,CACA77S,KAAK07S,kBACL17S,KAAKw7S,iBAAkB,CAbvB,CAcJ,CAQAxC,WAAAA,CAAY5xS,GAAoE,IAKxE0qO,EACAiqE,EAN0BC,EAAoCz4S,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAClE,IAAgB40G,IAML6jM,EALAt4S,MAAMC,QAAQw0G,MAOhBn4G,KAAKs5S,cAAgB0C,EAAYxvR,QAAQxsB,KAAKs5S,cAAgB,KAC/DxnE,EAASkqE,EAAYvzS,MAAMwzS,KAClBA,EAAYnjP,WAGVmjP,EAAYnjP,UAAUqC,SAASkV,EAAAA,GAAe6rO,aAKxDl8S,KAAKy5S,eAAiBuC,EAAYxvR,QAAQxsB,KAAKy5S,eAAiB,KACjEsC,EAAUC,EAAYvzS,MAAMwzS,KACnBA,EAAYnjP,WAGVmjP,EAAYnjP,UAAUqC,SAASkV,EAAAA,GAAe8rO,aAGtDH,GAA0C,mBAApB50S,EAAQosJ,UACrCs+E,EAAS1qO,EAAQosJ,QAAQ,IAADv1J,OAAKoyE,EAAAA,GAAe6rO,SAC5CH,EAAU30S,EAAQosJ,QAAQ,IAADv1J,OAAKoyE,EAAAA,GAAe8rO,WAE7CrqE,GAAU9xO,KAAKs5S,eAAiBxnE,GAChC9xO,KAAKy7S,gBAAgB3pE,GAAQ,GAE7BiqE,GAAW/7S,KAAKy5S,gBAAkBsC,GAClC/7S,KAAK87S,iBAAiBC,GAE1B/7S,KAAKo8S,iBAAiBh1S,GACtBpH,KAAK07S,kBACL17S,KAAKw7S,iBAAkB,CAC3B,CAEAa,kBAAAA,GACQr8S,KAAKq6S,eAAiBr6S,KAAKs6S,eAAet6S,KAAKq6S,iBAE/C76S,SAAS+6D,cACL,IAAID,YAAY0nC,EAAAA,GAAqBC,MAAO,CACxC/oC,OAAQ,CACJpB,OAAQ93D,KAAKq6S,cACbn4M,cAAc,MAI1B35E,YAAW,KACPvoB,KAAKq6S,cAAgB,IAAI,GAC1B,GAEX,CAKA1gT,gBAAAA,GACIqG,KAAKm6S,oBACLn6S,KAAK07S,kBACL17S,KAAK64S,yBACT,CAUA4C,eAAAA,CAAgBr0S,GAA4C,IAAtBk1S,IAAa/4S,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,KAAAA,UAAA,IAC1CvD,KAAKs6S,eAAelzS,EAAS,CAACpH,KAAKs5S,gBAAmBt5S,KAAKw7S,mBAKhEx7S,KAAKm6S,oBAGLn6S,KAAKs5S,aAAelyS,EACpBpH,KAAKs5S,aAAaz+O,iBAAiBmnC,EAAAA,GAAqB87F,OAAQ99L,KAAKu8S,0BACrEv8S,KAAKs5S,aAAa/+O,cAAc,IAAIsjI,MAAM77F,EAAAA,GAAqB+iE,WAG/D/kK,KAAKo5S,qBAGLp5S,KAAK66S,sBAAwB76S,KAAKw8S,wBAAwBx8S,KAAKs5S,cAG3DgD,GAAiBt8S,KAAKy8S,uBAAuBz8S,KAAKs5S,eAAiBt5S,KAAKk4S,UAAYl4S,KAAKk4S,SAASxxS,QAClG1G,KAAK87S,iBAAiB97S,KAAKk4S,SAAS,IAE5C,CAOA4D,gBAAAA,CAAiB10S,GACRpH,KAAKs6S,eAAelzS,EAAS,CAACpH,KAAKy5S,kBAKxCz5S,KAAK08S,qBAGL18S,KAAKy5S,cAAgBryS,EACrBpH,KAAKy5S,cAAc5+O,iBAAiBmnC,EAAAA,GAAqB87F,OAAQ99L,KAAK28S,2BACtE38S,KAAKy5S,cAAcl/O,cAAc,IAAIsjI,MAAM77F,EAAAA,GAAqB+iE,WAGhE/kK,KAAKw5S,sBACT,CAOA4C,gBAAAA,CAAiBh1S,GACRpH,KAAKs6S,eAAelzS,EAAS,CAACpH,KAAKu8D,kBAKxCv8D,KAAK48S,qBAGL58S,KAAKu8D,cAAgBn1D,EACrBpH,KAAKu8D,cAAc1B,iBAAiBmnC,EAAAA,GAAqB87F,OAAQ99L,KAAK68S,2BAClE78S,KAAKu8D,gBAAkBv8D,KAAKs5S,cAAgBt5S,KAAKu8D,gBAAkBv8D,KAAKy5S,eACxEz5S,KAAKu8D,cAAchC,cAAc,IAAIsjI,MAAM77F,EAAAA,GAAqB+iE,WAIpE/kK,KAAK05S,sBACT,CAKAgC,eAAAA,GACI17S,KAAKo6S,oBACAp6S,KAAKq5S,iBAKN75S,SAAS+8D,gBAAkBv8D,KAAKq5S,gBAChCr5S,KAAKq5S,eAAer6R,QAIxBhf,KAAKu5S,qBACT,CAKAH,kBAAAA,GACSp5S,KAAKs5S,eAGVt5S,KAAKs5S,aAAaxgP,UAAUjiC,IAAIw5C,EAAAA,GAAeysO,QAG1C98S,KAAKs5S,aAAan3J,aAAa,aAChCniJ,KAAKs5S,aAAa71J,aAAa,WAAY,MAEnD,CAKA+1J,mBAAAA,GACSx5S,KAAKy5S,gBAGVz5S,KAAKy5S,cAAc3gP,UAAUjiC,IAAIw5C,EAAAA,GAAeysO,QAG3C98S,KAAKy5S,cAAct3J,aAAa,aACjCniJ,KAAKy5S,cAAch2J,aAAa,WAAY,MAEpD,CAKAi2J,mBAAAA,GACS15S,KAAKu8D,eAGVv8D,KAAKu8D,cAAczD,UAAUjiC,IAAIw5C,EAAAA,GAAeysO,OACpD,CAKAvD,kBAAAA,GAAwC,IAAAwD,EAAA,IAArBC,EAAWz5S,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,IACpBvD,KAAKq5S,iBAAoBr5S,KAAKi7S,kBAAoBj7S,KAAKm5S,cAAkB6D,KAG5D,QAAnBD,EAAA/8S,KAAKq5S,sBAAc,IAAA0D,GAAnBA,EAAqBjkP,UAAUjiC,IAAIw5C,EAAAA,GAAe4sO,SACtD,CAKA9C,iBAAAA,GACQn6S,KAAKs5S,eACLt5S,KAAKs5S,aAAaxgP,UAAUO,OAAOgX,EAAAA,GAAeysO,QAClD98S,KAAKs5S,aAAa/+O,cAAc,IAAIsjI,MAAM77F,EAAAA,GAAqBijE,aAC/DjlK,KAAKs5S,aAAav+O,oBAAoBinC,EAAAA,GAAqB87F,OAAQ99L,KAAKu8S,0BACxEv8S,KAAKs5S,kBAAehhT,GAExB0H,KAAK08S,oBACT,CAKAA,kBAAAA,GACQ18S,KAAKy5S,gBACLz5S,KAAKy5S,cAAc3gP,UAAUO,OAAOgX,EAAAA,GAAeysO,QACnD98S,KAAKy5S,cAAcl/O,cAAc,IAAIsjI,MAAM77F,EAAAA,GAAqBijE,aAChEjlK,KAAKy5S,cAAc1+O,oBAAoBinC,EAAAA,GAAqB87F,OAAQ99L,KAAK28S,2BACzE38S,KAAKy5S,mBAAgBnhT,GAEzB0H,KAAK48S,oBACT,CAKAA,kBAAAA,GACQ58S,KAAKu8D,gBACDv8D,KAAKu8D,gBAAkBv8D,KAAKs5S,cAAgBt5S,KAAKu8D,gBAAkBv8D,KAAKy5S,gBACxEz5S,KAAKu8D,cAAczD,UAAUO,OAAOgX,EAAAA,GAAeysO,QACnD98S,KAAKu8D,cAAchC,cAAc,IAAIsjI,MAAM77F,EAAAA,GAAqBijE,cAEpEjlK,KAAKu8D,cAAcxB,oBAAoBinC,EAAAA,GAAqB87F,OAAQ99L,KAAK68S,2BACzE78S,KAAKu8D,mBAAgBjkE,EAE7B,CAKA8hT,iBAAAA,GAA6C,IAA3B8C,EAAiB35S,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,IAAAA,UAAA,GAC/BG,MAAMwyD,KAAK12D,SAASsnE,uBAAuBuJ,EAAAA,GAAe4sO,UAAUj3S,SAASoB,IACzEA,EAAQ0xD,UAAUO,OAAOgX,EAAAA,GAAe4sO,QAAQ,IAEhDC,GACC19S,SAAS+8D,cAA8BsJ,MAEhD,CAKAgzO,uBAAAA,GACI74S,KAAK84S,gBAAiB,EACtB94S,KAAKg4S,gBAAiB,EACtBh4S,KAAKm4S,qBAAsB,EAC3Bn4S,KAAKu4S,uBAAwB,EAC7Bv4S,KAAK03S,iBAAkB,EACvB13S,KAAK63S,mBAAoB,EACzB73S,KAAKy4S,mBAAoB,EACzBz4S,KAAKw4S,iBAAkB,EACvBx4S,KAAK44S,eAAgB,EACrB54S,KAAKy3S,yBAA0B,CACnC,CAQAN,aAAAA,GACI,OAAO33S,SAASsnE,uBAAuBuJ,EAAAA,GAAe6rO,OAC1D,CAMAM,uBAAAA,CAAwB1qE,GACpB,GAAKA,EAGL,OAAOA,EAAOhrK,uBAAuBuJ,EAAAA,GAAe8rO,QACxD,CAMAzB,4BAAAA,CAA6Br0S,GACzB,OAAKA,GAAaA,EAASK,OAGpBhD,MAAMwyD,KAAK7vD,GAAU8vD,MAAK,CAACgnP,EAAUC,KACxC,MAAMC,EAAgB91P,SAAS41P,EAASh7J,aAAak5J,EAAAA,GAAmBiC,aAAe,GAAI,IACrFC,EAAgBh2P,SAAS61P,EAASj7J,aAAak5J,EAAAA,GAAmBiC,aAAe,GAAI,IAE3F,OAAIjvP,MAAMgvP,IAAkBhvP,MAAMkvP,GACvB,EAEPlvP,MAAMkvP,IACE,EAERlvP,MAAMgvP,GACC,EAGJA,EAAgBE,CAAa,IAhB7B,EAkBf,CAMA3C,gBAAAA,CAAiBxzS,GACb,OAAOA,GACHA,aAAmBkwS,aACnBlwS,EAAQo2S,YAChB,CAKApG,YAAAA,GACI,OAAO53S,SAASsnE,uBAAuBuJ,EAAAA,GAAeC,MAC1D,CAKA+mO,YAAAA,GACI,OAAO73S,SAASsnE,uBAAuBuJ,EAAAA,GAAeG,MAC1D,CAMAorO,0BAAAA,CAA2Bx0S,GACvB,MAAMq2S,EAAiBr2S,aAAO,EAAPA,EAAS+6I,aAAak5J,EAAAA,GAAmBqC,iBAChE,OAAID,GAAmD,UAAjCA,EAAel9S,aAIzC,CAMAy6S,wBAAAA,CAAyB5zS,GACrB,MAAMq2S,EAAiBr2S,EAAQ+6I,aAAak5J,EAAAA,GAAmBsC,eAC/D,SAAIF,GAAmD,SAAjCA,EAAel9S,cAIzC,CAMAk8S,sBAAAA,CAAuBr1S,GACnB,MAAMq2S,EAAiBr2S,EAAQ+6I,aAAak5J,EAAAA,GAAmBuC,aAC/D,SAAIH,GAAmD,SAAjCA,EAAel9S,cAIzC,CAOA+5S,cAAAA,CAAelzS,GAAwF,IAAtDy2S,EAA+Ct6S,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAC/F,SACI6D,IACAA,EAAQ0xD,WACP+kP,EAAgBp0Q,SAASriC,GAKlC,E,ukCE7uBG,MAAM02S,EAAe,sBAErB,SAASxsI,EACZysI,EACAtuS,EACA0B,EACA86B,EACA+xQ,EACAjqQ,GAEA,MAAO,CACHy+H,OAAQurI,EACRtuS,WACAqB,WAAYK,EACZ2G,QAASm0B,EACT36B,QAAS0sS,EACTjtS,QAASgjC,EAEjB,CAEO,SAASzmC,EACZkB,EACApB,GAIc,IAHd6wS,EAAwB16S,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC5BuC,EAAsBvC,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EACtB4lT,EAAmB36S,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EAEnB,OAAAlE,EAAAA,EAAA,GACOoa,GAAI,IACPpB,UACAtH,SACA4lM,OAAMt3M,EAAAA,EAAA,GACC6pT,GACAzvS,EAAKk9L,QAEZyyG,YAAaD,GAErB,CAEO,MAAM/wS,EAAyBwhB,IAC3B,CACHn2B,KAAM4P,EAAAA,GAAqBuG,MAC3B7G,KAAM6mB,IAID3lB,EAAsBvF,GAA4BA,EAAO3C,QAAU2C,EAAO3C,MAAMouI,MAAM,W,kBC7B5F,SAASl5C,EAAsBziF,GAClC,IAAKA,EACD,OAAO,EAGX,MAAM6qS,EAAa7qS,EAAS8qS,eAAeC,SAG3C,QAAKF,GAMkB,IAAIljS,KAAKkjS,EAAY7qS,EAAS8qS,eAAeE,UAAW,IACtD,IAAIrjS,IACjC,C,6CAOO,MAAMy8I,EAA2C,E,kGCtCjD,IAAK6mJ,EAAkB,SAAlBA,GAAkB,OAAlBA,EAAkB,0CAAlBA,EAAkB,oCAAlBA,CAAkB,MAKlBC,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,oCAAnBA,EAAmB,uCAAnBA,EAAmB,sCAAnBA,EAAmB,kCAAnBA,EAAmB,kBAAnBA,EAAmB,0BAAnBA,CAAmB,MAcxB,MAAMC,EAA0BA,CAAC74S,EAA0B84S,KAC9D,IAAIC,EAAU,GAAH3gT,OAtBY,uDAsBY,oBAAAA,OAAmB4H,GAUtD,OARA84S,EAAa34S,SAAS64S,IAClBD,EAAUA,EAAQ3gT,OAAO,OAADA,OAAQ4gT,EAAYxqT,GAAE,KAAA4J,OAAI4gT,EAAYC,KAAM,IAGpEj5S,IAAS24S,EAAmBO,2BAC5BH,EAAUA,EAAQ3gT,OAAO,OAADA,OAAQwgT,EAAoBO,wBAAuB,iBAGxEJ,CAAO,EAGLn3D,EAAuBA,CAAChxP,EAAe8wP,EAAiB/pP,EAAqByhT,KACtF,MAAMp5S,EAAO24S,EAAmBU,mBAChC,IAAI7gT,EAAMqgT,EAAwB74S,EAAM,CACpC,CAACxR,GAAIoqT,EAAoBU,MAAOL,IAAKroT,GACrC,CAACpC,GAAIoqT,EAAoBW,QAASN,IAAKv3D,GACvC,CAAClzP,GAAIoqT,EAAoBY,YAAaP,IAAKthT,KAE/Ca,EAAMA,EAAIJ,OAAO,OAADA,OAAQwgT,EAAoBa,oBAAmB,KAAArhT,OAAIghT,IACnEjwS,OAAOC,KAAK5Q,EAAK,SAAS,EAGjBmpP,EAAsBA,CAAC/wP,EAAe8wP,EAAiB/pP,EAAqByhT,KACrF,MAAMp5S,EAAO24S,EAAmBU,mBAChC,IAAI7gT,EAAMqgT,EAAwB74S,EAAM,CACpC,CAACxR,GAAIoqT,EAAoBU,MAAOL,IAAKroT,GACrC,CAACpC,GAAIoqT,EAAoBW,QAASN,IAAKv3D,GACvC,CAAClzP,GAAIoqT,EAAoBY,YAAaP,IAAKthT,KAG/C,OADAa,EAAMA,EAAIJ,OAAO,OAADA,OAAQwgT,EAAoBa,oBAAmB,KAAArhT,OAAIghT,IAC5D5gT,CAAG,EAGRkhT,EAAgBt3M,GACXu3M,EAAAA,OAAOtpP,KAAK+xC,GAAG3mG,SAAS,UAGtBq9G,EAAaA,CAACs/H,EAAiB7zI,EAAmBkU,EAAkBpqE,EAAqBurQ,EAAuB/xS,EAAgBgyS,IAC3H,GAAHzhT,OAAMggP,EAAO,QAAAhgP,OAAOshT,EAAan1M,GAAU,QAAAnsG,OAAOshT,EAAajhM,GAAS,QAAArgH,OAAOshT,EAAarrQ,GAAY,QAAAj2C,OAAOshT,EAAaE,GAAc,gBAAAxhT,OAAeyP,EAAM,gBAAAzP,OAAeyhT,GAIhL5gM,EAAiCA,CAAC1U,EAAmBkU,EAAkBpqE,EAAqBurQ,EAAuB/xS,EAAgBgyS,KAC5I,MAAMrhT,EAAMsgH,EAAWC,EAAAA,GAAaC,cAAezU,EAAWkU,EAAUpqE,EAAaurQ,EAAe/xS,EAAQgyS,GAC5G1wS,OAAOC,KAAK5Q,EAAK,SAAS,C,iKCpE9B,MAAMshT,EAAiB,IAAI50H,IAA0C,CACjE,CAAC,QAAQ,GACT,CAAC,WAAW,GACZ,CAAC,SAAS,GACV,CAAC,QAAQ,GACT,CAAC,OAAO,GACR,CAAC,QAAQ,GACT,CAAC,UAAU,GACX,CAAC,UAAU,KAGR,SAAS0vF,EACZv6N,EACAtwC,GAKO,IAJPw+C,EAAgB7qD,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,IAAG,IAAIo1Q,KAAKC,gBAAiBC,kBAAkBzqN,SAC/D8qN,EAAiC31Q,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EACjCuoG,EAASt9F,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,EAGZ,MAAMkmF,EAAOywL,EAAQh6N,EAAGtwC,EAAGw+C,EAAU8qN,EAFpB31Q,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAGo8S,EAAe9+O,IAAIq4M,KAAS,GAGhD,OAAOr4K,GAAa,EAAIpX,GAAQoX,GAAapX,GAAQ,EAAIA,GAAQoX,GAAapX,GAAQ,CAC1F,CAEO,SAASokB,EACZ3tD,EACAtwC,GAKO,IAJPw+C,EAAgB7qD,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,IAAG,IAAIo1Q,KAAKC,gBAAiBC,kBAAkBzqN,SAC/D8qN,EAAiC31Q,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EAIjC,OAHSiL,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,KAGS22Q,EAAQh6N,EAAGtwC,EAAGw+C,EAAU8qN,EAF5B31Q,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAGo8S,EAAe9+O,IAAIq4M,KAAS,EAGpD,CAEO,SAASgB,EACZh6N,EACAtwC,GAIM,IAHNw+C,EAAgB7qD,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,IAAG,IAAIo1Q,KAAKC,gBAAiBC,kBAAkBzqN,SAC/D8qN,EAAiC31Q,UAAAmD,OAAA,EAAAnD,UAAA,QAAAjL,EACjC2hR,EAAiB12Q,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAGo8S,EAAe9+O,IAAIq4M,KAAS,EAEhD,MAAM0mC,EAAU7nO,IAAAA,IAAW73B,EAAE23C,WACvBgoN,EAAU9nO,IAAAA,IAAWnoE,EAAEioF,WAO7B,OALIzpC,IACAwxP,EAAQ5nO,GAAG5pB,GACXyxP,EAAQ7nO,GAAG5pB,IAGR6rN,EAAoB2lC,EAAQhzL,QAAQssJ,GAAMzvL,KAAKo2N,EAAQjzL,QAAQssJ,GAAOA,GAAQ0mC,EAAQn2N,KAAK75E,EAAGspQ,GAAM,EAC/G,CAEO,SAAS99D,EAAUl7J,GAAwC,IAA/BtwC,EAAOrM,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,IAAI2X,KAC7C,OAAOglC,EAAEy5M,YAAc/pP,EAAE+pP,WAStB,SAAqBz5M,GAAwC,IAA/BtwC,EAAOrM,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,IAAI2X,KAC/C,OAAOglC,EAAEw5M,aAAe9pP,EAAE8pP,YAAcmhB,EAAW36N,EAAGtwC,EAC1D,CAX0CkwS,CAAY5/P,EAAGtwC,EACzD,CAEO,SAAS0rM,EAAiBp7J,GAC7B,OAAO63B,IAAO73B,GAAG8uE,QACbj3C,MAASgoO,SAAS,EAAG,QAAQnzL,QAAQ,OAE7C,CAMO,SAASiuJ,EAAW36N,GAAwC,IAA/BtwC,EAAOrM,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,IAAI2X,KAC9C,OAAOglC,EAAE9K,gBAAkBxlC,EAAEwlC,aACjC,CAEO,SAASg9E,EAAQ3nC,GACpB,OAAO2wH,EAAU3wH,EACrB,CAEO,SAAS4wH,EAAY5wH,GACxB,MAAMu1N,EAAY,IAAI9kS,KAGtB,OAFA8kS,EAAUC,QAAQD,EAAUrmD,UAAY,GAEjCv+C,EAAU3wH,EAAMu1N,EAC3B,CAEO,SAAS7oH,EAAU1sG,GACtB,OAAOrpF,KAAK+4Q,MAAM,IAAIj/P,KAAKuvE,EAAKi/B,eAAe7xB,UAAY,IAC/D,CAEO,SAASy2B,EAAmB7jC,EAAc3jF,EAA4D4jF,GACzG,MAAMvvE,EAAM48D,MACNmoO,EAAYnoO,IAAO0S,GAEzB,OAAIy1N,EAAUrzL,OAAO1xG,EAAK,OACfrU,EAAc,CAACzS,GAAI,uBAAwB0S,eAAgB,UAC3Dm5S,EAAUrzL,OAAO1xG,EAAI4zG,QAAQgxL,SAAS,EAAG,QAAS,OAClDj5S,EAAc,CAACzS,GAAI,2BAA4B0S,eAAgB,cAC/Dm5S,EAAUrzL,OAAO1xG,EAAI4zG,QAAQl4F,IAAI,EAAG,QAAS,OAC7C/vB,EAAc,CAACzS,GAAI,0BAA2B0S,eAAgB,aAGrE2jF,EACO5nC,EAAAA,SAASyrE,WAAW9jC,EAAKjS,UAAUjoB,SAASm6B,GAGhD5nC,EAAAA,SAASyrE,WAAW9jC,EAAKjS,UAAUg2C,gBAC9C,C,mCC1Ge,MAAM51D,EAIVh5D,WAAAA,CAAYyX,GACfrX,KAAKqX,OAASA,EAEdrX,KAAKynM,OAAS,EAGdznM,KAAKmgT,KAAOngT,KAAKmgT,KAAK/iN,KAAKp9F,KAC/B,CAEOmgT,IAAAA,GACHngT,KAAKqX,SAELrX,KAAKynM,OAAS,CAClB,CAEO/tI,SAAAA,CAAUlnC,GACTxyB,KAAKynM,OAAS,GACdz4L,OAAO6jC,aAAa7yC,KAAKynM,OAG7BznM,KAAKynM,MAAQz4L,OAAOuZ,WAAWvoB,KAAKmgT,KAAM3tR,EAC9C,CAEOgnC,MAAAA,GACHxqD,OAAO6jC,aAAa7yC,KAAKynM,MAC7B,E,2KCtBG,MAAM24G,EAAY,CACrBC,IAAK,EACLC,KAAM,EACNC,SAAU,KACVC,SAAU,QACVC,SAAU,YAGP,SAASvoP,EAAejgE,GAC3B,MAAMyoT,EAAwBC,EAAyB1oT,GACjD2oT,EAiBH,SAAoC3oT,GACvC,MAAyC,SAAlCA,EAAO4oT,sBAClB,CAnBmCC,CAA2B7oT,GAE1D,QAAKyoT,KAIDxzR,EAAAA,MACO0zR,EAIf,CAEO,SAASD,EAAyB1oT,GACrC,MAAwC,SAAjCA,EAAO8oT,qBAClB,CAMO,SAASC,EAAqB/oT,GACjC,MAAmC,SAA5BA,EAAOq3I,gBAClB,CAEO,SAASF,EAAiBn3I,GAC7B,OAAIi1B,EAAAA,MAC2C,SAApCj1B,EAAOgpT,wBAItB,CAEO,SAASj1K,EAAap0E,GACzB,IAAIm0E,EAAkBn0E,EAKtB,OAJIA,EAASlxD,OAASqc,EAAAA,GAAUm+R,sBAC5Bn1K,EAAkBn0E,EAAShrC,UAAU,EAAGxrB,KAAKinD,IAAItlC,EAAAA,GAAUm+R,oBAAqBtpP,EAASlxD,SAAW,OAGjGqlI,CACX,CAEO,SAASjB,EAAoBq2K,GAChC,MAAMC,EAAuBD,EAASr/Q,MAAM,KACtCu/Q,EAAiBD,EAAqB,GACtCE,EAAiBF,EAAqB,GAE5C,GAAuB,UAAnBC,EACA,MAAO,QACJ,GAAuB,UAAnBA,EACP,MAAO,QACJ,GAAuB,UAAnBA,EACP,MAAO,QAGX,GAAIC,EAAgB,CAChB,GAAuB,QAAnBA,EACA,MAAO,MACJ,GAAIA,EAAe73Q,SAAS,iBAAmB63Q,EAAe73Q,SAAS,kBAAoB63Q,EAAe73Q,SAAS,qBAAuB63Q,EAAe73Q,SAAS,4BACrK,MAAO,cACJ,GAAI63Q,EAAe73Q,SAAS,sBAAwB63Q,EAAe73Q,SAAS,mBAAqB63Q,EAAe73Q,SAAS,wBAA0B63Q,EAAe73Q,SAAS,6BAC9K,MAAO,eACJ,GAAwB,WAAnB63Q,GAAgCA,EAAe73Q,SAAS,gBAAkB63Q,EAAe73Q,SAAS,oCAAsC63Q,EAAe73Q,SAAS,yBACxK,MAAO,MAEf,CAEA,MAAO,OACX,CAGO,SAAS83Q,EAAmBttT,GAC/B,MAAMutT,EAAO,IAAIC,SAASxtT,GAE1B,GAAiC,QAA7ButT,EAAKE,UAAU,GAAG,GAClB,OAAQ,EAGZ,MAAMh7S,EAAS86S,EAAKG,WACpB,IAAI32P,EAAS,EAEb,KAAOA,EAAStkD,GAAQ,CACpB,MAAMk7S,EAASJ,EAAKE,UAAU12P,GAAQ,GAGtC,GAFAA,GAAU,EAEK,QAAX42P,EAAmB,CACnB,GAA2C,aAAvCJ,EAAKK,UAAU72P,GAAU,GAAG,GAC5B,OAAQ,EAGZ,MAAM82P,EAAgD,QAAvCN,EAAKE,UAAU12P,GAAU,GAAG,GAC3CA,GAAUw2P,EAAKK,UAAU72P,EAAS,EAAG82P,GACrC,MAAMC,EAAOP,EAAKE,UAAU12P,EAAQ82P,GACpC92P,GAAU,EAEV,IAAK,IAAItrB,EAAI,EAAGA,EAAIqiR,EAAMriR,IACtB,GAAkD,MAA9C8hR,EAAKE,UAAU12P,EAAc,GAAJtrB,EAASoiR,GAClC,OAAON,EAAKE,UAAU12P,EAAc,GAAJtrB,EAAU,EAAGoiR,EAGzD,KAAO,IAA0B,OAArBF,EAGR,MAFA52P,GAAUw2P,EAAKE,UAAU12P,GAAQ,EAGrC,CACJ,CACA,OAAQ,CACZ,CAEO,SAASg3P,EAAqBt8O,GACjC,MAAM,UACF1nB,EACA,mBAAoB8T,IACpBmwP,EAAAA,EAAAA,GAASv8O,GACb,MAAO,CAAC1nB,YAAW8T,kBACvB,C,yIC9HA,MAAMowP,GAAQC,EAAAA,EAAAA,mBAKP,SAASr/C,IACZ,MAAMltQ,EAAQhC,EAAAA,QAAMqf,WACd4N,GAASC,EAAAA,EAAAA,GAAiBlrB,GAEhC,OAAOwsT,EAAAA,EAAAA,YAAW,CACdvhS,SACAhG,UAAUyZ,EAAAA,EAAAA,GAAgB1+B,EAAOirB,IAClCqhS,EACP,CAEO,SAAS7jK,EAAoBgkK,GAChC,OAAOx4S,QAAQw4S,GAAeA,EAAiChuT,GACnE,CAEO,SAAS8xK,EAAer/J,EAA2Cw7S,GACtE,GAAKA,EAIL,OAAIjkK,EAAoBikK,GACbx7S,EAAcw7S,GAGlBA,CACX,CAEO,SAASn9I,EAAkBo9I,GAC9B,OAAIlkK,EAAoBkkK,GACbjlT,IAAAA,cAACgK,EAAAA,iBAAqBi7S,GAG1BA,CACX,CAEO,SAASC,EAAa3hS,GACzB,MAAe,OAAXA,EAEO,QAGJ,MACX,CAKO,SAASxD,EAAEs5B,GACd,OAAOA,CACX,C,4LCpDA,MAAM8rQ,EAA8B,OAC9BC,EAAuB,MAEtB,SAAS9wN,EAAkBpnE,GAE9B,MAA2B,SAAvBA,EAAQG,aAAyByuI,EAAe5uI,KAI5B,SAApBA,EAAQ82L,SAIK/5J,SAAS/8B,EAAQunE,UAAW,IAAM72E,KAAKC,OACrCsnS,EACvB,CAEO,SAASzxN,EAAoBxmE,GAChC,GAA2B,SAAvBA,EAAQG,YAAyByuI,EAAe5uI,GAChD,OAGJ,MAAMs4P,EAAU,IAAI5nQ,KAAKqsC,SAAS/8B,aAAO,EAAPA,EAASunE,UAAW,KACtD,OAAOha,IAAO+qM,GAASl2J,QAAQ,OAAOnjC,KAAK1R,MAAS60C,QAAQ,OAAQ,OACxE,CAEO,SAASp8B,EAAiBhmE,GAC7B,GAA2B,SAAvBA,EAAQG,YAAyByuI,EAAe5uI,GAChD,OAAO,EAGX,MAAMs4P,EAAU,IAAI5nQ,KAAKqsC,SAAS/8B,aAAO,EAAPA,EAASunE,UAAW,KAEtD,OADiBha,IAAO+qM,GAASl2J,QAAQ,OAAOnjC,KAAK1R,MAAS60C,QAAQ,OAAQ,QAC5D,CACtB,CAEO,SAASr8B,EAAyB/lE,GACrC,MAA2B,SAAvBA,EAAQG,aAAyByuI,EAAe5uI,IAInCtP,KAAKC,MAAQosC,SAAS/8B,EAAQunE,UAAW,IACxC2wN,CACtB,CAEO,SAASzxN,EAAezmE,GAC3B,MAA2B,SAAvBA,EAAQG,aAIY,SAApBH,EAAQ82L,SASkB,SAHb/5J,SAAS/8B,EAAQunE,UAAW,IAAMxqC,SAAS/8B,EAAQm4R,SAAU,IAMlF,CAEO,SAASvpJ,EAAe5uI,GAC3B,MAA0B,UAAnBA,aAAO,EAAPA,EAASwU,MACpB,CAEO,SAAS4jR,EAAoBp4R,GAChC,OAAOA,aAAO,EAAPA,EAASqmE,gBAAiBymE,EAAAA,GAAYurJ,OACjD,CAEO,SAASC,EAAYt4R,GACxB,MAA6B,UAAtBA,aAAO,EAAPA,EAASsmE,SACpB,CAEO,SAASiyN,EAAyBv4R,GACrC,OAAOA,aAAO,EAAPA,EAASqmE,gBAAiBymE,EAAAA,GAAYwuD,aAAct7L,aAAO,EAAPA,EAASqmE,gBAAiBymE,EAAAA,GAAY0rJ,GACrG,CAEO,MAAMC,EAAuBz4R,IAChC,OAAQA,aAAO,EAAPA,EAASqmE,cACjB,KAAKymE,EAAAA,GAAYwuD,WACjB,KAAKxuD,EAAAA,GAAY0rJ,IACb,OAAO,EAGX,OAAO,CAAK,EAGHE,EAA0B14R,IAA6By4R,EAAoBz4R,GAE3E24R,EAAwC34R,IACjD,MAAM6+D,EAAM7+D,EAAQqmE,aACpB,OAAOxH,EAAImnE,OAAO,GAAG/rB,cAAgBp7C,EAAIj6E,MAAM,EAAE,EAG9C,SAAS0lM,EAAoCtqL,EAAwByjE,EAA0CyrB,GAClH,MACMktH,EAD6B,UAAnBp8M,aAAO,EAAPA,EAASwU,SACaivD,aAAmB,EAAnBA,EAAqB5E,OAAQC,EAAAA,GAAcC,QAE3Eu9I,EAAsBptH,GAA6C,UAAvBlvF,EAAQG,WAEpDy4R,EAA6C,SAAvB54R,EAAQG,YAAyBH,EAAQ64R,qBAAuBA,EAAAA,GAAmB95N,QAE/G,OAAOq9I,GAAsBE,GAAuBs8E,CACxD,C,gGC3GO,SAAStuM,EAAWwuM,EAAcvuM,GACrC,MAAO,GAAP92G,OAAU82G,EAAauuM,EAAOlD,EAAAA,GAAUK,SAAU,CAACt7F,sBAAuB,IAAG,KACjF,CAEO,SAASzwG,EAAIr8D,GAChB,MAAO,GAAPp6C,OAAUmD,KAAKiU,MAAMgjC,EAAM,KAAK,IACpC,CAUO,MAAMm1O,EAAwB,CACjC3yQ,SAAU,CACNu9E,QAAS,KAEb1sE,MAAO,CACHkpF,aAAcn7B,OAAO2mO,EAAAA,GAAUK,WAEnC/lR,MAAO,CACH7nB,OAAQ,IAkBT,SAAS0wS,EAAc5vS,GAC1B,OAAOjW,OAAO+I,KAAKkN,GAAQjN,OAAS,CACxC,CAEO,MAAM80G,EAAkB99G,OAAO8lT,OAAO,CACzC5iM,GAAI,EACJnF,KAAM,GACNoF,OAAQ,GACRmtK,QAAS,IACTttK,SAAU,aAGDrF,EAAa,CACtB1uC,eAAgB,iBAChB2uC,YAAa,c,0+BCpCV,SAAS3yD,EAActtD,GAC1B,MAAM,aAAC+wD,EAAY,eAAED,EAAc,QAAEzvD,EAAO,aAAEwvD,GAAgB7wD,EAE9D,GAAuB,OAAnB8wD,GAA4C,OAAjBC,EAQ3B,MAAO,CACH1vD,UACAyvD,eAAgBzvD,EAAQgK,OACxB0lD,aAAc1vD,EAAQgK,QAI9B,IAAIusP,EAQJ,OAAQ/mM,GACR,IAAK,OACD,OAwRR,SAA2B7wD,GACvB,OAAOooT,EAAuBrvT,EAAAA,EAAC,CAAC,EAAGiH,GAAO,IAAE6wD,aAAc,SAC9D,CA1Rew3P,CAAkB,CAACt3P,eAAcD,iBAAgBzvD,YAC5D,IAAK,SACD,OA0RR,SAA6BrB,GACzB,OAAOooT,EAAuBrvT,EAAAA,EAAC,CAAC,EAAGiH,GAAO,IAAE6wD,aAAc,WAC9D,CA5Rey3P,CAAoB,CAACv3P,eAAcD,iBAAgBzvD,YAC9D,IAAK,OACD,OA6VD,SAA0BqjI,GAAmG,IAAlG,aAAC3zE,EAAY,eAAED,EAAc,QAAEzvD,EAAO,IAAE2B,EAAMulT,GAAkD7jL,EAE9H,MAAM36G,EAAS1oB,EAAQ0S,MAAM,EAAG+8C,GAC1BuiK,EAAYhyN,EAAQ0S,MAAM+8C,EAAgBC,GAC1CuY,EAASjoE,EAAQ0S,MAAMg9C,GAEvBy3P,EAAiB,IACjBC,EAAe,KAAH7lT,OAAQI,EAAG,KAK7B,IAAIuvG,EACAm2M,EACAC,EAIJ,GARoB5+R,EAAOwuB,SAASiwQ,IAAmBl/O,EAAOx1D,WAAW20S,GAUrEl2M,EACIxoF,EAAOhW,MAAM,EAAGgW,EAAO1e,OAASm9S,GAChCn1F,EACA/pJ,EAAOv1D,MAAM00S,EAAap9S,QAC9Bq9S,EAAW53P,EAAiB03P,EAC5BG,EAAS53P,EAAey3P,OACrB,GAAuB,IAAnBnnT,EAAQgK,OAEfknG,EAAWi2M,EAAiBC,EAC5BC,EAAWF,EACXG,EAASH,OACN,GAAI13P,EAAiBC,EAExBwhD,EAAWxoF,EAASy+R,EAAiBn1F,EAAYo1F,EAAen/O,EAChEo/O,EAAW33P,EAjBEy3P,EAkBbG,EAASD,EAAW1lT,EAAIqI,WACrB,CAEH,MAAMu9S,EAAmD,MAArC7+R,EAAOorI,OAAOprI,EAAO1e,OAAS,GAC5Cw9S,EAAkC,MAArBv/O,EAAO6rF,OAAO,GAC3B2zJ,EACkB,IAAnBh4P,GAAwB83P,IAAgBC,GAAmC,IAAnB/3P,IAAyB+3P,EAChFE,EACDh4P,IAAiB1vD,EAAQgK,QAAUw9S,IAAeD,GAClD73P,IAAiB1vD,EAAQgK,SAAWu9S,EAEzC,GAAIE,EAAkB,CAElB,MAAM9pF,EAAO39N,EAAQ0S,MAAM+8C,EAAgBk4P,EAAY3nT,EAASyvD,IAEhEyhD,EAAWxoF,EAASy+R,EAAiBxpF,EAAOypF,EAAen/O,EAAOv1D,MAAMirN,EAAK3zN,QAC7Eq9S,EAAW53P,EAAiBkuK,EAAK3zN,OAlCxBm9S,EAmCTG,EAASD,EAnCAF,CAoCb,MAAO,GAAIO,EAGP,GAD0Bj4P,IAAmBC,GAAgBA,IAAiB1vD,EAAQgK,OAGlFknG,EAAWlxG,EAAU,IAAMmnT,EAAiBC,EAC5CC,EAAW33P,EAAe,EAAIy3P,EAC9BG,EAASD,MACN,CAEH,MAAM1pF,EAAO39N,EAAQ0S,MAAMk1S,EAAc5nT,EAASyvD,GAAiBA,GAEnEyhD,EACIxoF,EAAOhW,MAAM,EAAGgW,EAAO1e,OAAS2zN,EAAK3zN,QAAUm9S,EAAiBxpF,EAAOypF,EAAen/O,EAC1Fo/O,EAAW53P,EAlDN03P,EAmDLG,EAASD,EAnDJF,CAoDT,KACG,CAEH,MAAMU,EAAYD,EAAc5nT,EAASyvD,GACnCq4P,EAAUH,EAAY3nT,EAASyvD,GAC/BkuK,EAAO39N,EAAQ0S,MAAMm1S,EAAWC,GAEtC52M,EAAWxoF,EAAOhW,MAAM,EAAGm1S,GAAaV,EAAiBxpF,EAAOypF,EAAepnT,EAAQ0S,MAAMo1S,GAC7FT,EAAWS,EA5DFX,EA6DTG,EAASD,EA7DAF,CA8Db,CACJ,CAEA,MAAO,CACHnnT,QAASkxG,EACTzhD,eAAgB43P,EAChB33P,aAAc43P,EAEtB,CApbeS,CAAkB,CAACr4P,eAAcD,iBAAgBzvD,YAC5D,IAAK,KACD,OAAOgoT,EAAgB,CAACt4P,eAAcD,iBAAgBzvD,YAC1D,IAAK,KAED,OADAu2P,EAAY,KACL0xD,EAA6B,CAACv4P,eAAcD,iBAAgBzvD,UAASu2P,cAChF,IAAK,UAED,OADAA,EAAY,OACL0xD,EAA6B,CAACv4P,eAAcD,iBAAgBzvD,UAASu2P,cAChF,IAAK,QAED,OADAA,EAAY,KACL0xD,EAA6B,CAACv4P,eAAcD,iBAAgBzvD,UAASu2P,cAChF,IAAK,SAED,OADAA,EAAY,KACL2xD,EAAyB,CAACx4P,eAAcD,iBAAgBzvD,UAASu2P,cAC5E,IAAK,OACD,OAsaR,SAA0B+nB,GAAwE,IAAvE,aAAC5uN,EAAY,eAAED,EAAc,QAAEzvD,GAAsCs+Q,EAC5F,OAgBJ,SAA8Bt+Q,EAAiByvD,EAAwBC,GACnE,OAAO1vD,EAAQ0S,MAAM+8C,EAAgBC,GAAc3iB,SAAS,KAChE,CAlBQo7Q,CAAqBnoT,EAASyvD,EAAgBC,GACvCw4P,EAAyB,CAACx4P,eAAcD,iBAAgBzvD,UAASmnT,eAAgB,QAASC,aAAc,UAE5Gc,EAAyB,CAACx4P,eAAcD,iBAAgBzvD,UAASu2P,UAAW,KACvF,CA3ae6xD,CAAkB,CAAC14P,eAAcD,iBAAgBzvD,YAG5D,MAAMutB,MAAM,8BAAgCiiC,EAChD,C,iHAEA,MAAM64P,EAAsBpgP,GACpBA,EAAOx1D,WAAW,MACX,IAGsB,IAA1Bw1D,EAAOn4C,QAAQ,MAAem4C,EAASA,EAAOv1D,MAAM,EAAGu1D,EAAOn4C,QAAQ,OAG3Ew4R,EAAgBrgP,GACdA,EAAOx1D,WAAW,MACXw1D,GAGsB,IAA1BA,EAAOn4C,QAAQ,MAAe,GAAKm4C,EAAOv1D,MAAMu1D,EAAOn4C,QAAQ,OAGpEk4R,EAAkBjvT,IAA2E,IAA1E,aAAC22D,EAAY,eAAED,EAAc,QAAEzvD,GAAsCjH,EAC1F,MAAM2vB,EAAS1oB,EAAQ0S,MAAM,EAAG+8C,GAC1BuiK,EAAYhyN,EAAQ0S,MAAM+8C,EAAgBC,GAC1CuY,EAASjoE,EAAQ0S,MAAMg9C,GAEvB64P,EAAY7/R,EAAOqkB,SAAS,MAAQrkB,EAAOhW,MAAM,EAAGgW,EAAO82J,YAAY,OAAS,GAEhFgpI,EAAkBH,EAAmBpgP,GACrCwgP,EAAYH,EAAargP,GAGzBygP,EAAgB/sQ,IAClB+sQ,EAAaC,QAAUhtQ,GAAO+sQ,EAAaC,QACpC,GAAPpnT,OAAUmnT,EAAaC,UAAS,OAEpCD,EAAaC,QAAU,EAGvB,IAAIC,GADoBlgS,EAAOqkB,SAAS,MAAQrkB,EAAOhW,MAAMgW,EAAO82J,YAAY,OAAS92J,GAC9CspM,EAAYw2F,EACvD,MAAMK,GAAuBD,EAAmBn2S,WAAW,MAiB3D,IAAIy+F,EACAm2M,EACAC,EAEJ,GAnBIt1F,EAAUv/M,WAAW,QACrBm2S,EAAqBlgS,EAASspM,EAAYw2F,GAGhBM,MAC1B,MAAMC,GAAiBH,EAAmBp2K,MAAM,QAAU,IAAIxoI,OACxDg/S,GAAkCJ,EAAmBp2K,MAAM,aAAe,IAAIxoI,OAEpF,OAAIg/S,IAAmCD,IAAkBF,GAIlDE,IAAkBC,GAAmC,SAAUvtR,KAAKmtR,EAAmB,EAO9FE,GAAyB,CAErBD,IACAD,EAAqBA,EAAmBl2S,MAjCxB,IAoCpBw+F,EAAWq3M,EAAYK,EAAmB/gR,QAAQ,WAAY,MAAQ4gR,EACtE,IAAI7yS,EAAQ,EAERizS,GACAjzS,IAEJA,IAAUgzS,EAAmBp2K,MAAM,QAAU,IAAIxoI,OAEjDq9S,EAAW3iT,KAAKs2D,IAAIvL,EA5CA,EA4CkC,GACtD63P,EAAS5iT,KAAKs2D,IAAItL,EA7CE,EA6CgC95C,EAAQ,EAChE,KAAO,CACH,IAAIA,EAAQ,EACRizS,IACAD,EAAqBF,IAAiBE,EACtChzS,KAEJ,MAAMqzS,EAAejiT,MAAMwyD,KAAKovP,GAChC,IAAK,IAAI5lR,EAAI,EAAGA,EAAIimR,EAAaj/S,OAAQg5B,IACb,OAApBimR,EAAajmR,KACbimR,EAAajmR,GAAK,KAAHzhC,OAAQmnT,MAG/BE,EAAqBK,EAAa1+P,KAAK,IACvC2mD,EAAWq3M,EAAYK,EAAqBH,EAE5C7yS,IAAUgzS,EAAmBp2K,MAAM,IAAIp0F,OAAO,MAAO,OAAS,IAAIp0C,OAElEq9S,EAAW53P,EA/DS,EAgEpB63P,EAAS53P,EAhEW,EAgEuB95C,CAC/C,CAEA,MAAO,CACH5V,QAASkxG,EACTzhD,eAAgB43P,EAChB33P,aAAc43P,EACjB,EAGQW,EAA+BzpT,IAKR,IALS,aACzCkxD,EAAY,eACZD,EAAc,QACdzvD,EAAO,UACPu2P,GAC2B/3P,EAC3B,IAAK+3P,EAID,MAAO,CACHv2P,UACAyvD,iBACAC,gBAIR,MAAMhnC,EAAS1oB,EAAQ0S,MAAM,EAAG+8C,GAC1BuiK,EAAYhyN,EAAQ0S,MAAM+8C,EAAgBC,GAC1CuY,EAASjoE,EAAQ0S,MAAMg9C,GAEvB64P,EAAY7/R,EAAOqkB,SAAS,MAAQrkB,EAAOhW,MAAM,EAAGgW,EAAO82J,YAAY,OAAS,GAChF0pI,EAAkBxgS,EAAOqkB,SAAS,MAAQrkB,EAAOhW,MAAMgW,EAAO82J,YAAY,OAAS92J,EAEnF8/R,EAAkBH,EAAmBpgP,GACrCwgP,EAAYH,EAAargP,GAC/B,IAAI2gP,EAA6BM,EAAkBl3F,EAAYw2F,EAE/D,MAAMK,GAAuBD,EAAmBn2S,WAAW,MAkB3D,IAAIy+F,EACAm2M,EACAC,EAEJ,GApBIt1F,EAAUv/M,WAAW,QACrBm2S,EAAqBlgS,EAASspM,EAAYw2F,GAGhBM,MAC1B,MAAMC,GAAiBH,EAAmBp2K,MAAM,QAAU,IAAIxoI,OACxDg/S,GAAkCJ,EAAmBp2K,MAAM,IAAIp0F,OAAO,KAAD78C,OAAMg1P,GAAa,OAAS,IACnGvsP,OAEJ,OAAIg/S,IAAmCD,IAAkBF,GAIlDE,IAAkBC,GAAkCJ,EAAmBn2S,WAAW8jP,EAAU,EAOnGuyD,GAAyB,CAErBD,IACAD,EAAqBA,EAAmBl2S,MAAM6jP,EAAUvsP,SAG5DknG,EAAWq3M,EAAYK,EAAmB/gR,QAAQ,IAAIuW,OAAO,KAAD78C,OAAMg1P,GAAa,KAAM,MAAQkyD,EAC7F,IAAI7yS,EAAQ,EACRizS,GACAjzS,IAEJA,IAAUgzS,EAAmBp2K,MAAM,QAAU,IAAIxoI,OAEjDq9S,EAAW3iT,KAAKs2D,IAAIvL,EAAiB8mM,EAAUvsP,OAAQ,GACvDs9S,EAAS5iT,KAAKs2D,IAAItL,EAAgB6mM,EAAUvsP,OAAS4L,EAAQ,EACjE,KAAO,CACHs7F,EAAWq3M,EAAYK,EAAmB/gR,QAAQ,MAAO,KAAFtmC,OAAOg1P,IAAekyD,EAC7E,IAAI7yS,EAAQ,EACRizS,IACA33M,EAAWqlJ,EAAYrlJ,EACvBt7F,KAGJA,IAAUgzS,EAAmBp2K,MAAM,IAAIp0F,OAAO,MAAO,OAAS,IAAIp0C,OAElEq9S,EAAW53P,EAAiB8mM,EAAUvsP,OACtCs9S,EAAS53P,EAAgB6mM,EAAUvsP,OAAS4L,CAChD,CAEA,MAAO,CACH5V,QAASkxG,EACTzhD,eAAgB43P,EAChB33P,aAAc43P,EACjB,EAGCY,EAA2BhxP,IAOG,IAPF,aAC9BxH,EAAY,eACZD,EAAc,QACdzvD,EAAO,UACPu2P,EAAS,eACT4wD,EAAc,aACdC,GAC2BlwP,EAC3B,MAAMiyP,EAAmBhC,QAAAA,EAAkB5wD,EACrC6yD,EAAmBhC,QAAAA,EAAgB7wD,EACzC,IAAK4yD,IAAqBC,EAItB,MAAO,CACHppT,UACAyvD,iBACAC,gBAKR,IAAIhnC,EAAS1oB,EAAQ0S,MAAM,EAAG+8C,GAG1BuiK,EAAYhyN,EAAQ0S,MAAM+8C,EAAgBC,GAG1CuY,EAASjoE,EAAQ0S,MAAMg9C,GAG3B,MAAM25P,EAAqB3gS,EAAOwuB,SAASiyQ,IAAqBlhP,EAAOx1D,WAAW22S,GAElF,IAAIl4M,EACAm2M,EAAW53P,EACX63P,EAAS53P,EA0Bb,OAxBIsiK,EAAU96K,SAAS,OACnB86K,EAAYA,EAAUt/M,MAAM,GAAI,GAChCu1D,EAAS,IAAH1mE,OAAO0mE,GACbq/O,GAAU,GAGVt1F,EAAUv/M,WAAW,OACrBu/M,EAAYA,EAAUt/M,MAAM,GAC5BgW,EAAS,GAAHnnB,OAAMmnB,EAAM,KAClB2+R,GAAY,GAGZgC,GAEAn4M,EAAWxoF,EAAOhW,MAAM,EAAGgW,EAAO1e,OAASm/S,EAAiBn/S,QAAUgoN,EAAY/pJ,EAAOv1D,MAAM02S,EAAiBp/S,QAChHq9S,GAAY8B,EAAiBn/S,OAC7Bs9S,GAAU8B,EAAiBp/S,SAG3BknG,EAAWxoF,EAASygS,EAAmBn3F,EAAYo3F,EAAmBnhP,EACtEo/O,GAAY8B,EAAiBn/S,OAC7Bs9S,GAAU8B,EAAiBp/S,QAGxB,CACHhK,QAASkxG,EACTzhD,eAAgB43P,EAChB33P,aAAc43P,EACjB,EAWL,SAASP,EAAuB3wM,GAAmI,IAAlI,aAAC1mD,EAAY,eAAED,EAAc,QAAEzvD,EAAO,aAAEwvD,GAAwF4mD,EAC7J,MAAMkzM,EAAU,KAGVC,EAAiC,WAAjB/5P,EAChBg6P,EAA+B,SAAjBh6P,EAEpB,IAII0hD,EAJAxoF,EAAS1oB,EAAQ0S,MAAM,EAAG+8C,GAC1BuiK,EAAYhyN,EAAQ0S,MAAM+8C,EAAgBC,GAC1CuY,EAASjoE,EAAQ0S,MAAMg9C,GAGvB23P,EAAW53P,EACX63P,EAAS53P,EAETsiK,EAAU96K,SAAS,OACnB86K,EAAYA,EAAUt/M,MAAM,GAAI,GAChCu1D,EAAS,IAAH1mE,OAAO0mE,GACbq/O,GAAU,GAGVt1F,EAAUv/M,WAAW,OACrBu/M,EAAYA,EAAUt/M,MAAM,GAC5BgW,EAAS,GAAHnnB,OAAMmnB,EAAM,KAClB2+R,GAAY,GAIhB,IAAIoC,GAAyB,EACzBlzD,EAAY,GAEZizD,EACAjzD,EAAY+yD,EACLC,IACPhzD,EAhCc,IAiCdkzD,EAAyB/gS,EAAOwuB,SAASoyQ,IAAYrhP,EAAOx1D,WAAW62S,IAI3E,MAAMD,EAAqB3gS,EAAOwuB,SAASq/M,IAActuL,EAAOx1D,WAAW8jP,GAiB3E,OAdyB7tO,EAAOwuB,SAASoyQ,QAAwBrhP,EAAOx1D,WAAW62S,QAE1DD,IAAuBI,GAE5Cv4M,EAAWxoF,EAAOhW,MAAM,EAAGgW,EAAO1e,OAASusP,EAAUvsP,QAAUgoN,EAAY/pJ,EAAOv1D,MAAM6jP,EAAUvsP,QAClGq9S,GAAY9wD,EAAUvsP,OACtBs9S,GAAU/wD,EAAUvsP,SAGpBknG,EAAWxoF,EAAS6tO,EAAYvkC,EAAYukC,EAAYtuL,EACxDo/O,GAAY9wD,EAAUvsP,OACtBs9S,GAAU/wD,EAAUvsP,QAGjB,CACHhK,QAASkxG,EACTzhD,eAAgB43P,EAChB33P,aAAc43P,EAEtB,CAEO,MAAMJ,EAA0B,MAkGvC,SAASS,EAAYv8S,EAAckkD,GAC/B,MAAMw4P,EAAU18S,EAAK0kB,QAAQ,IAAKw/B,GAClC,OAAoB,IAAbw4P,EAAiB18S,EAAKpB,OAAS89S,CAC1C,CAEA,SAASF,EAAcx8S,EAAckkD,GACjC,MAAMu4P,EAAYz8S,EAAKo0K,YAAY,IAAKlwH,EAAQ,GAAK,EACrD,OAAsB,IAAfu4P,EAAmB,EAAIA,CAClC,C,6JCvfA,SAAS6B,EAAcppT,GACnB,MAAM+rF,GAAmBC,EAAAA,EAAAA,KAMzB,OACI1rF,IAAAA,cAAA,KACIjJ,GAAG,kBACHuY,QAPanQ,IACjBA,EAAEyK,iBACF6hF,EAAiB,CAACuF,iBAAkB,6BAA6B,GAO5DtxF,EAAMimN,KAInB,CAACmjG,EAAAzgT,UAAA,CAnBGs9M,KAAI7/M,IAAAA,OAAAC,YAqBR,U,uMCgBKkvG,EAAY,SAAZA,GAAY,OAAZA,EAAY,gBAAZA,EAAY,iCAAZA,EAAY,sBAAZA,CAAY,EAAZA,GAAY,IAWjB,MAAM8zM,EAAmBlnQ,IAAAA,IAAUC,WAAA,CAAAt7C,YAAA,oBAAVq7C,CAAU,6FAS7BmnQ,EAA2B,CAACjyT,GAAI,UAAWwJ,SAAU,WAE3D,SAAS0oT,EAA6BvpT,GAClC,MAAMrJ,GAAWsxD,EAAAA,EAAAA,eACXmzC,GAAUC,EAAAA,EAAAA,eACV,cAACvxF,IAAiBgQ,EAAAA,EAAAA,YAExB4rC,EAAAA,EAAAA,YAAU,KACN/uD,GAASyzD,EAAAA,EAAAA,IAAwBpqD,EAAMs6C,SAAS,GACjD,CAAC3jD,EAAUqJ,EAAMs6C,UAEpB,MAAMp2C,GAAUmzC,EAAAA,EAAAA,aAAYtyB,EAAAA,IACtBW,GAAU2xB,EAAAA,EAAAA,aAAYzxB,EAAAA,IACtBiqL,GAAex4J,EAAAA,EAAAA,aAAYtd,EAAAA,IAC3BikB,GAAe3G,EAAAA,EAAAA,aAAY0I,EAAAA,IAC3BypQ,GAAiBnyQ,EAAAA,EAAAA,aAAYhvC,EAAAA,IAC7B8D,GAAOkrC,EAAAA,EAAAA,cAAaz+C,IAAuB8gG,EAAAA,EAAAA,GAAY9gG,EAAOya,EAAAA,GAAiBo2S,wBAE/EhoR,EAAsBzhC,EAAMs6C,QAAQ32C,KAAKnM,IAC3C,MAAMkM,EAAOmsM,EAAar4M,GACpBmI,EAASq+C,EAAaxmD,GACtBsP,GAAcjD,EAAAA,EAAAA,IAAgBH,EAAM8lT,GAC1C,MAAO,CACHhuT,KAAM+5G,EAAad,OACnBx9G,KAAM,CACFyM,KAAMA,GAAQ4lT,EACdxiT,cACAnH,UAEP,IAGC21G,GAAoBv7F,EAAAA,EAAAA,cAAYljB,gBAE5BF,GAASmvB,EAAAA,EAAAA,IAA0BpiB,EAAKrM,KAG9C+jG,EAAQ9oF,KAAKoT,EAAU,cAAgBhiB,EAAK7C,SAAS,GACtD,CAACilB,EAAAA,GAA2Bs1E,EAAS11E,IAQxC,IAAKvZ,EACD,OAAO,KAGX,IAAKjI,EACD,OAAO,KAGX,MAAM0pR,EAAa9jR,EAAc,CAACzS,GAAI,wEAAyE0S,eAAgB,4BAEzHizE,EACF18E,IAAAA,cAAA,MACIjJ,GAAG,yBACHkJ,UAAU,eAAa,GAAAU,OAEnB2sR,GAAU3sR,OCxHnB,SAAmC5J,EAAYyS,GAClD,OAAQzS,GACR,KAAK8iK,EAAAA,GAAmByqH,eACpB,OAAO96Q,EAAc,CAACzS,GAAI,2CAA4C0S,eAAgB,mBAC1F,KAAKowJ,EAAAA,GAAmBsvE,mBACpB,OAAO3/N,EAAc,CAACzS,GAAI,+CAAgD0S,eAAgB,uBAC9F,KAAKowJ,EAAAA,GAAmBC,sBACpB,OAAOtwJ,EAAc,CAACzS,GAAI,kDAAmD0S,eAAgB,0BACjG,KAAKowJ,EAAAA,GAAmBuvJ,WACpB,OAAO5/S,EAAc,CAACzS,GAAI,uCAAwC0S,eAAgB,eACtF,KAAKowJ,EAAAA,GAAmBwvJ,gBACpB,OAAO7/S,EAAc,CAACzS,GAAI,4CAA6C0S,eAAgB,4BAC3F,KAAKowJ,EAAAA,GAAmB22H,mBACpB,OAAOhnR,EAAc,CAACzS,GAAI,+CAAgD0S,eAAgB,uBAC9F,KAAKowJ,EAAAA,GAAmB42H,uBACpB,OAAOjnR,EAAc,CAACzS,GAAI,mDAAoD0S,eAAgB,2BAClG,KAAKowJ,EAAAA,GAAmByvJ,0BACpB,OAAO9/S,EAAc,CAACzS,GAAI,6CAA8C0S,eAAgB,8BAC5F,KAAKowJ,EAAAA,GAAmByuD,wBACpB,OAAO9+M,EAAc,CAACzS,GAAI,2CAA4C0S,eAAgB,4BAC1F,KAAKowJ,EAAAA,GAAmB0vJ,6BACpB,OAAO//S,EAAc,CAACzS,GAAI,yDAA0D0S,eAAgB,wCACxG,KAAKowJ,EAAAA,GAAmB2vJ,+BACpB,OAAOhgT,EAAc,CAACzS,GAAI,2DAA4D0S,eAAgB,4CAC1G,QACI,MAAO,GAEf,CD6F6BggT,CAA0B/pT,EAAMk6J,QAASpwJ,KAIlE,OACIxJ,IAAAA,cAACo8E,EAAAA,GAAY,CACTrlF,GAAG,+BACHkJ,UAAU,+BACV4M,UAAU,EACVhB,KAAMA,EACNe,SA/BcutF,KAClB9jG,GAASomG,EAAAA,EAAAA,GAAW1pF,EAAAA,GAAiBo2S,sBAAsB,EA+BvD,aAAW,OACXzsO,gBAAiBA,GAEjB18E,IAAAA,cAAC+oT,EAAgB,KACb/oT,IAAAA,cAACk1G,EAAAA,EAAU,CACPtxG,QAASA,EACTu9B,QAASA,EACTi0E,YAAa,GACbhB,SAAS,EACTY,kBAAmBA,EACnBK,SAtCCA,OAuCDlU,aAAa,EACbgU,mBAAmB,KAKvC,CAAC8zM,EAAA5gT,UAAA,CAxHGuxJ,QAAO9zJ,IAAAA,OAAAC,WACPi0C,QAAOl0C,IAAAA,QAAAA,IAAAA,QAAAC,YAyHX,UEzIA,SAAS2jT,EAAsBhqT,GAC3B,MAAMrJ,GAAWsxD,EAAAA,EAAAA,eAajB,OACI3nD,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,KACIjJ,GAAE,GAAA4J,OAAKjB,EAAMiqB,OAAM,8BACnBra,QAhBQnQ,IAChBA,EAAEyK,iBACFvT,GAASwc,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBo2S,qBAC1Bl2S,WAAYg2S,EACZ/1S,YAAa,CACT8mC,QAASt6C,EAAMs6C,QACf4/G,QAASl6J,EAAM09J,gBAAgBusJ,oBAEpC,GASMjqT,EAAM8K,MAKvB,CAACk/S,EAAArhT,UAAA,CA/BGshB,OAAM7jB,IAAAA,OAAAC,WACNyE,KAAI1E,IAAAA,OAAAC,WACJi0C,QAAOl0C,IAAAA,QAAAA,IAAAA,QAAAC,WACPq3J,gBAAet3J,IAAAA,SAAAA,IAAAA,QAAAC,YA8BnB,U,qCC3BA,MAAM6jT,EAA6BzxT,IAA8C,IAA7C,KAAC6/E,EAAI,SAAE6xO,EAAQ,gBAAEC,GAAuB3xT,EACxE,MAAM4xT,GAAkBtwS,EAAAA,EAAAA,cAAY,KAChC,IAAIuwS,EAAeH,GAAY,GAY/B,OAXAG,EAAeA,EAAa/mT,cAEP,YAAjB+mT,GAA+C,cAAjBA,IAC9BA,EAAe,SAIE,SAAjBA,IACAA,EAAe,OAGZA,CAAY,GACpB,CAACH,IAEEG,EAAeD,IAErB,IAAI9pT,EAAY,YACX+pT,IACD/pT,GAAa,oBAGjB,IAAIqM,EAAsBtM,IAAAA,cAAAA,IAAAA,SAAA,MACtBiqT,EAA2BjqT,IAAAA,cAAAA,IAAAA,SAAA,MAC3BkqT,EAAAA,GAAgCF,KAChC19S,EACItM,IAAAA,cAAA,QAAMC,UAAU,uBACXiqT,EAAAA,GAAmCF,IAG5CC,EACIjqT,IAAAA,cAAA,OAAKC,UAAU,2BACViqT,EAAAA,GAAqClyO,KAQlD,MAAOokB,EAAS+tN,IAAc5wS,EAAAA,EAAAA,UAAS6wS,EAAAA,GAA4BpyO,KACnE5yB,EAAAA,EAAAA,YAAU,KACN,IAAIilQ,GAAmB,EAUvB,OARAH,EAAAA,GAA6BF,EAAchyO,GAAM9rE,MAAMkwF,IAG/CiuN,GACAF,EAAW/tN,EACf,IAGG,KACHiuN,GAAmB,CAAK,CAC3B,GACF,CAACL,EAAchyO,IAElB,IAAIsyO,EAAcluN,EACd0tN,IACAQ,EAAcR,EAAkB1tN,GAGpC,MAAMmuN,GAAmBxzQ,EAAAA,EAAAA,cAAaz+C,GAAuBA,EAAM+oE,QAAQ7hE,WAAWgrT,kBAChFhiP,EAAc+hP,aAAgB,EAAhBA,EAChBlnT,KAAK1D,IACD,IAAKA,EAAKhC,UACN,OAAO,KAGX,MAAMmrE,EAAYnpE,EAAKhC,UACvB,OACIqC,IAAAA,cAAC8oE,EAAS,CACNprE,IAAKiC,EAAK5I,GACVihF,KAAMA,GACR,IAId,OACIh4E,IAAAA,cAAA,OAAKC,UAAWA,GACZD,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAACmlH,EAAAA,EAAU,CAAC/oB,QAASpkB,IACpBxP,EACAl8D,GAELtM,IAAAA,cAAA,OAAKC,UAAU,QACVgqT,EACDjqT,IAAAA,cAAA,QAAMu2I,wBAAyB,CAACC,OAAQ8zK,MAE1C,EAEZV,EAAAvhT,UAAA,CAlGE2vE,KAAIlyE,IAAAA,OAAAC,WACJ8jT,SAAQ/jT,IAAAA,OAAAC,WACR+jT,gBAAehkT,IAAAA,QAkGnB,U,eClGA,MAAM2kT,EAAatyT,IAGN,IAHO,QAChBikG,EAAO,YACPsuN,GACIvyT,EACJ,MAAOwyT,EAAOC,IAAYrxS,EAAAA,EAAAA,YAQ1B,IANA6rC,EAAAA,EAAAA,YAAU,KACN,gCAAgBl5C,MAAMy+S,IAClBC,EAASD,EAAM51P,QAAQ,GACzB,GACH,KAEE21P,QAAyB1vT,IAAV2vT,EAChB,OACI3qT,IAAAA,cAAC4pT,EAAS,CACN5xO,KAAMokB,EACNytN,SAAS,UAKrB,IACI,MAAMgB,EAA6B,CAC/BC,cAAc,EACdC,aAAa,EACbC,QAAS,IACTC,UAAW,IACXC,OAAO,GAGL/xE,EAAOwxE,EAAMQ,eAAe/uN,EAASyuN,GAE3C,OACI7qT,IAAAA,cAAA,OACIC,UAAU,sBACVs2I,wBAAyB,CAACC,OAAQ2iG,GAClC,cAAY,iBAGxB,CAAE,MAAOh6O,GAEL,OACIa,IAAAA,cAAA,OACIC,UAAU,sBACV,cAAY,eAEZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,cACH0S,eAAgB,8EAIhC,GACFghT,EAAApiT,UAAA,CAzDE+zF,QAAOt2F,IAAAA,OAAAC,WACP2kT,YAAW5kT,IAAAA,MA0Df,QAAe9F,IAAAA,KAAWyqT,GCrD1B,GAAe3iT,EAAAA,EAAAA,UAPf,SAAyBxP,GAErB,MAAO,CACHoyT,YAAoC,UAFzBjrS,EAAAA,EAAAA,IAAUnnB,GAED8yT,YAE5B,GAEA,CAAwCX,GCJlCY,EAAclzT,IAAyC,IAAxC,QAACikG,EAAO,kBAAEkvN,GAAyBnzT,EACpD,MAAOwyT,EAAOC,IAAYrxS,EAAAA,EAAAA,eAA4Bve,GAQtD,IANAoqD,EAAAA,EAAAA,YAAU,KACN,gCAAgBl5C,MAAMq/S,IAClBX,EAASW,EAAYx2P,QAAQ,GAC/B,GACH,KAEEu2P,QAA+BtwT,IAAV2vT,EACtB,OACI3qT,IAAAA,cAAA,QACIC,UAAU,6BACV,cAAY,kBAEX,IAAMm8F,EAAU,KAK7B,IACI,MAAMyuN,EAA6B,CAC/BC,cAAc,EACdC,aAAa,EACbC,QAAS,IACTC,UAAW,IACXC,OAAO,GAGL/xE,EAAOwxE,EAAMQ,eAAe/uN,EAASyuN,GAE3C,OACI7qT,IAAAA,cAAA,QACIC,UAAU,6BACV,cAAY,gBACZs2I,wBAAyB,CAACC,OAAQ2iG,IAG9C,CAAE,MAAOh6O,GACL,OACIa,IAAAA,cAAA,QACIC,UAAU,6BACV,cAAY,eAEZD,IAAAA,cAACgK,EAAAA,iBAAgB,CACbjT,GAAG,cACH0S,eAAe,+EAI/B,GACF4hT,EAAAhjT,UAAA,CAvDE+zF,QAAOt2F,IAAAA,OAAAC,WACPulT,kBAAiBxlT,IAAAA,KAAAC,YAwDrB,QAAe/F,IAAAA,KAAWqrT,GCjD1B,GAAevjT,EAAAA,EAAAA,UAPf,SAAyBxP,GACrB,MAAMqC,GAAS8kB,EAAAA,EAAAA,IAAUnnB,GACzB,MAAO,CACHgzT,kBAA0C,SAAvB3wT,EAAOywT,aAAuD,SAA7BzwT,EAAO6wT,kBAEnE,GAEA,CAAwCH,G,6FCPxC,MCmBMzhQ,GAAqB,CACvB6hQ,4BAA2BA,EAAAA,IAO/B,IAJkB3jT,EAAAA,EAAAA,UAVM8wH,CAACtgI,EAAkBH,KAAmC,IAAjC,OAACwxB,EAAM,SAAE+hS,GAAmBvzT,EACrE,MAAO,CACHorM,YAAYooH,EAAAA,GAAAA,IAAqBrzT,EAAOqxB,EAAQ+hS,GACnD,GAOsC9hQ,GAI3C,ED3B6CzxD,IAAiG,IAAhG,SAACk8D,EAAQ,IAAEjmD,EAAG,WAAEm1L,EAAU,OAAE55K,EAAM,4BAAE8hS,EAA2B,SAAEluO,EAAQ,SAAEmuO,GAAgBvzT,GACrIitD,EAAAA,EAAAA,YAAU,KACFm4B,GACAA,EAASgmH,EACb,GACD,CAACA,IAEJ,MAAMqoH,EAA0BA,KAC5BH,EAA4B9hS,EAAQ+hS,EAAS,EAG3C/8B,EAAmB,yBAAHhuR,OAA4B4iM,EAAa,kCAAoC,IAEnG,OACIvjM,IAAAA,cAAA,OAAKC,UAAW0uR,GAERprF,GACAvjM,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,UACIC,UAAU,yCACV/E,KAAK,SACLoU,QAASs8S,GAET5rT,IAAAA,cAAA,QAAMC,UAAU,yBAEnBo0D,IAKJkvI,GACDvjM,IAAAA,cAAA,UACIC,UAAU,uCACV/E,KAAK,SACLoU,QAASs8S,GAET5rT,IAAAA,cAAA,QAAMC,UAAU,4DAEhBD,IAAAA,cAAA,QAAMC,UAAU,mCACXmO,IAIX,I,wdERC,MAAMy9S,WAAsBj0P,EAAAA,cAKvCt1D,WAAAA,CAAY5C,GAAc,IAAAoJ,EACtBvG,MAAM7C,GAAMoJ,EAAApG,KAAAF,GAAA,kBAQJ,KACR,MAAM,OACF8L,EAAM,cACNo+H,EAAa,MACbr+H,GACA3L,KAAKhD,MAET,IAAKgtI,EACD,OAAO,EAGX,IAAKp+H,EACD,OAAOo+H,EAAcp+H,OAGzB,GAAe,SAAXA,EAAmB,CACnB,MAAMw9S,EAAc7hQ,SAAS57C,EAAO,IAEpC,OAAQq+H,EAAcp+H,OAASo+H,EAAcr+H,MAASy9S,CAC1D,CAEA,OAAO7hQ,SAAS37C,EAAQ,GAAG,IAC9B9L,GAAA,gCAE0BzB,IACvB,MAAM4N,EAAQ5N,EAAI69K,YAAY,KAC9B,OAAOjwK,EAAQ,EAAI5N,EAAIuuB,UAAU3gB,EAAQ,GAAK,IAAI,IACrDnM,GAAA,kBAEW,SAACrD,GAA4E,IAAdy4E,EAAI3xE,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,GAC9E,MAAMgnI,EAAYnkI,EAAK+1K,wBAAwBjnG,GAEL,IAAAm0O,EAAAxhL,EAAAyhL,GAArCljT,EAAKpJ,MAAMusT,aAAeh/K,IAC3B9tI,EAAEyK,iBAEFd,EAAKpJ,MAAMqD,QAAQ8P,UAAU,CACzBC,QAASC,EAAAA,GAAiBs/H,mBAC1Bp/H,WAAYq/H,EAAAA,EACZp/H,YAAa,CACTq/H,WAAY,EACZ5oH,OAAQ7gB,EAAKpJ,MAAMiqB,OACnBwE,UAAW,CAAC,CACR++G,mBAAmB,EACnBt1D,OACAq1D,UAA4C,QAAnC8+K,EAAY,QAAZxhL,EAAEzhI,EAAKpJ,aAAK,IAAA6qI,GAAe,QAAfyhL,EAAVzhL,EAAYmC,qBAAa,IAAAs/K,OAAf,EAAVA,EAA2B5+N,cAAM,IAAA2+N,EAAAA,EAAI9+K,EAChD9sI,KAAM2I,EAAKpJ,MAAM0O,SAKrC,IAAC5L,GAAA,uBAEgB,KACbE,KAAKgH,SAAS,CAACwiT,YAAY,GAAM,IACpC1pT,GAAA,8BAEuB,IACbE,KAAKhD,MAAMq4D,UACdr1D,KAAKhD,MAAMq4D,WAAatyC,EAAAA,GAAAA,UAAoBktL,gBACnDnwM,GAAA,kBAMY2pT,IACLzpT,KAAKhD,MAAM6O,KAAO7L,KAAKhD,MAAM6O,MAAQ49S,GACrCzpT,KAAKgH,SAAS,CAACwiT,YAAY,GAC/B,IACH1pT,GAAA,0BAEmBrK,IAAsD,IAArD,OAACmW,EAAM,MAAED,GAAuClW,EACjEuK,KAAKgH,SAAS,CACVsO,QAAQ,IACT,KACKtV,KAAKhD,MAAMm0I,eACXnxI,KAAKhD,MAAMm0I,cAAc,CAACvlI,SAAQD,SACtC,GACF,IApFF3L,KAAKpK,MAAQ,CACT4zT,YAAY,EACZl0S,QAAQ,EAEhB,CA+DAmjC,kBAAAA,CAAmBC,GACf14C,KAAK0pT,UAAUhxQ,EAAU7sC,IAC7B,CAkBA5I,MAAAA,GACI,MAAM,cAAC+mI,EAAa,IAAEn+H,EAAG,IAAEH,EAAG,YAAE69S,GAAevpT,KAAKhD,MACpD,GAAY,KAAR6O,GAAc7L,KAAKpK,MAAM4zT,WAAY,CACrC,IAAIjsT,EAAY,mCAKhB,OAJIyC,KAAK2pT,0BACLpsT,GAAa,8BAIbD,IAAAA,cAAA,OAAKoN,MAAO,CAACu8F,QAAS,iBAClB3pG,IAAAA,cAAA,OACIC,UAAWA,EACXmO,IAAKA,EACLG,IAAK+9S,KAIrB,CACA,OAAI5pT,KAAKhD,MAAM6sT,kBACJvsT,IAAAA,cAAAA,IAAAA,SAAA,KAAGoO,GAGVpO,IAAAA,cAACssI,EAAAA,EAAa,CACV/9H,IAAKA,EACLm+H,cAAeA,IAEb8/K,IACE,IAAKA,EACD,OACIxsT,IAAAA,cAAC03C,EAAAA,EAAY,CACTz3C,UAAU,uBACVk2C,KAAM5nC,EACNL,MAAOxL,KAAKhD,MAAMwO,MAClBiE,SAAS,kBAER/D,GAKb,MAAM6+H,EAAYvqI,KAAKm8K,wBAAwB2tI,GAE/C,IAAIvsT,EAAY,GAChB,GAAIyC,KAAKpK,MAAM0f,OACX/X,EAAwC,GAAHU,OAAM+B,KAAKhD,MAAMO,UAA1CgsT,IAAgBh/K,EAAmC,6DAAsF,4DAEjJvqI,KAAK2pT,0BACLpsT,GAAa,yCAEd,CACH,MAAMwsT,EAAe/pT,KAAK2pT,wBAA0B,2CAA6C,+BACjGpsT,EAAY,GAAHU,OAAM+B,KAAKhD,MAAMO,UAAS,KAAAU,OAAI8rT,EAC3C,CAEA,MAAM,OAACn+S,EAAM,MAAED,EAAK,MAAEH,EAAK,OAAEyb,EAAM,qBAAEm1J,GAAwBp8K,KAAKhD,MAC5Du0I,EAAgBvxI,KAAK2pT,yBAA2B3pT,KAAKhD,MAAMu0I,cAEjE,IAAIy4K,EACA1sT,IAAAA,cAAC4zI,GAAAA,EAAc,CACXxlI,IAAKA,EACLnO,UAAWA,EACXsO,IAAKi+S,EACLl+S,OAAmB,SAAXA,OAAoBtT,EAAYsT,EACxCD,MAAiB,SAAVA,OAAmBrT,EAAYqT,EACtCH,MAAOA,EACPwkI,WAAYhG,EACZqH,YAAY,EACZzkI,QAAS5M,KAAKwoF,UACd+oD,cAAeA,EACf+xG,gBAAiBtjP,KAAKiqT,eACtB94K,cAAenxI,KAAKgtI,oBAkB5B,OAdqBhtI,KAAKkqT,aACNnnS,EAAAA,GAAUonS,qCAC1BH,EACI1sT,IAAAA,cAAC8sT,GAAmB,CAChB1+S,IAAKA,GAAOo+S,EACZ7iS,OAAQA,EACR+hS,SAAUc,EACVjvO,SAAUuhG,GAET4tI,IAKNA,CAAY,GAInC,EACHlqT,GA5LoBqpT,GAAa,eACQ,CAClCn/K,cAAe,CAAC,ICfxB,MAEA,IAFkB5kI,EAAAA,EAAAA,UAjBlB,SAAyBxP,EAAoB2hC,GAAiB,IAAAouJ,EAC1D,MAAMh1K,GAAO8X,EAAAA,EAAAA,IAAQ7yB,EAAO2hC,EAAStQ,QAGrC,MAAO,CACH4iS,kBAHoD,UAA9Bl5S,SAAW,QAAPg1K,EAAJh1K,EAAM3T,aAAK,IAAA2oL,OAAP,EAAJA,EAAa0kI,cAK3C,IAEA,SAA4B12T,GACxB,MAAO,CACH0M,SAASiF,EAAAA,EAAAA,oBAAmB,CACxB6K,UAASA,EAAAA,GACVxc,GAEX,GAIA,CAAyBw1T,I,ghCCCV,SAASmB,GAAkBttT,GACtC,MAAOwmG,EAAQC,IAAW5sF,EAAAA,EAAAA,WAAS,IAE5B4zC,MAAM,aAACC,EAAY,YAAEC,GAAY,eAAE+4C,EAAgBt2F,QAASu2F,IAAmB/4C,EAAAA,GAAAA,IAAY,CAC9F37C,KAAMu0F,EACN34C,aAAc44C,EACdhmB,qBAAsBC,GAAAA,GACtB3yB,WAAY,EACRqnO,EAAAA,GAAAA,OACAxuL,EAAAA,GAAAA,IAAc,CACV2mN,kBAAmB,CAAC,MAAO,gBAKjC,UAAC1mN,EAAWnkG,OAAQokG,IAAoBC,EAAAA,GAAAA,IAAoBJ,EAAiB4wH,IAE7Ei2F,GAAoBlmI,EAAAA,GAAAA,IAAS3gF,EAAiB8mN,IAC9CC,GAAoBr1B,EAAAA,GAAAA,IAAS1xL,GAC7BQ,GAAqBz4C,EAAAA,GAAAA,IAAWi4C,IAEhC,kBAACv4C,EAAiB,iBAAEE,IAAoBE,EAAAA,GAAAA,IAAgB,CAC1Dg/P,EACAE,EACAvmN,IAGJ,OACI7mG,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,IAAAI,OAAAC,OAAA,CACIu6C,IAAKwS,GACD1tD,EAAM2tT,eACNv/P,KAEHpuD,EAAM20D,UAGVkyC,GACGvmG,IAAAA,cAAC8gF,GAAAA,GAAc,CAAC/pF,GAAIugO,EAAAA,IAChBt3N,IAAAA,cAAC8mG,GAAAA,GAAe,CAAC7mG,UAAU,wCACvBD,IAAAA,cAAC+gF,GAAAA,GAAoB,CAACjxE,QAASu2F,GAC3BrmG,IAAAA,cAAA,MAAAI,OAAAC,OAAA,CACIu6C,IAAKyS,EACLjgD,MAAKtW,GAAAA,GAAA,GAAMsvG,GAAmBI,IAC1Bx4C,KAEJhuD,IAAAA,cAAC2wL,GAAAA,QAAS,CACNx6I,KAAMz2C,EAAM2tT,eAAel3Q,KAC3BtqC,MAAM,EACN+kL,cAAc,oBASlD,CAEA,MAAMqmC,GAAyB,CAC3BvwH,SAAU,CACN/0F,KAAM4lN,EAAAA,GAAgBC,iBACtBtjM,MAAOqjM,EAAAA,GAAgBE,mBAE3BC,QAASC,EAAAA,GAAwB/qD,OAG/BugJ,GAAc,CAChBhmI,OAAQowC,EAAAA,GAAgBogE,6BACxB21B,MAAM,EACN3xR,aAAayrJ,EAAAA,GAAAA,IAAY,CACrBmmI,eAAe,EACflmI,oBAAoB,K,wCChG5B,MAAMmmI,GAAYr1T,IAAuC,IAAtC,SAACk8D,EAAQ,KAAEl0D,EAAI,SAAEw/K,GAAgBxnL,EAChD,MAAMs1T,EAAY,IAAH9sT,OAAOR,EAAI,KACpButT,EAAqB,OAAH/sT,OAAUg/K,EAAQ,KAE1C,OAAKA,EAKD3/K,IAAAA,cAACq1D,GAAAA,EAAW,CACRnnD,MAAOu/S,EACPppR,MAAOlkC,EACP6nH,cAAc,GAEdhoH,IAAAA,cAAA,QACIC,UAAU,WACV,2BAAAU,OAA0B8sT,GAC1BrgT,MAAO,CAACmsH,gBAAiBm0L,IAExBr5P,IAdFr0D,IAAAA,cAAAA,IAAAA,SAAA,KAAGq0D,EAgBI,EAEpBm5P,GAAAnlT,UAAA,CA5BEgsD,SAAQvuD,IAAAA,KAAAC,WACR5F,KAAI2F,IAAAA,OAAAC,WACJ45K,SAAQ75K,IAAAA,OAAAC,YA4BZ,SAAe/F,IAAAA,KAAWwtT,ICZ1B,IAAe1lT,EAAAA,EAAAA,UATf,SAAyBxP,EAAoB2hC,GACzC,MACMoK,GADW80F,EAAAA,GAAAA,IAAY7gI,GACNirE,IAAItpC,EAAS95B,MAEpC,MAAO,CACHw/K,SAAUt7I,GAAQi1F,EAAAA,GAAAA,IAAiBj1F,GAAS,GAEpD,GAEA,CAAwCmpR,I,4pBCyCzB,SAAS9vJ,GAAuBy7E,GAAqC,IAAvBp7O,EAAgBkI,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC7E,IAAKkzO,EACD,OAAO,KAGX,MAAM7nN,EAAS,IAAKq8R,EAAAA,OACdC,EAAyB,IAAKC,EAAAA,uBAM9BC,EAAkD,CAGpD,CACIC,iBAAiB,EACjBC,kBAAoBpxP,GAA4B,QAAdA,EAAK1hE,MAAgC,UAAd0hE,EAAKz8D,MAA0C,aAAtBy8D,EAAKqxP,QAAQ/yT,KAC/FgzT,YAActxP,IACV,MAAMqxP,EAAUrxP,EAAKqxP,SAAW,CAAC,EAGjC,OAFArxP,EAAKqxP,QAAQjpM,QAAUz4G,QAAQ0hT,EAAQjpM,SAEhChlH,IAAAA,cAAoB,Q,kWAAOlJ,CAAA,GAAM8lE,EAAKqxP,SAAS,GAG9D,CACIF,iBAAiB,EACjBC,kBAAoBpxP,GAA4B,QAAdA,EAAK1hE,MAAgC,SAAd0hE,EAAKz8D,MAAmBy8D,EAAKqxP,QAAQ,wBAA0BrxP,EAAKqxP,QAAQ,yBAA2BlwT,EAAQ4rB,OACxKukS,YAAaA,IACFnwT,EAAQ4rB,QAAU5rB,EAAQi/J,UAAYj/J,EAAQi/J,SAAW,EAC5Dh9J,IAAAA,cAACA,IAAAA,SAAc,CAACtC,IAAG,UAAAiD,OAAY5C,EAAQ4rB,SAClC,IACD3pB,IAAAA,cAACq9J,GAAAA,EAAmB,CAChB1zI,OAAQ5rB,EAAQ4rB,OAChBqzI,SAAUj/J,EAAQi/J,YAG1B,OAmBhB,GAdIj/J,EAAQo/J,mBACR2wJ,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAoBpxP,GAA4B,QAAdA,EAAK1hE,MAAgC,MAAd0hE,EAAKz8D,MAAgBy8D,EAAKqxP,QAAQ93Q,KAC3F+3Q,YAAaA,CAACtxP,EAAWvI,IAEjBr0D,IAAAA,cAACgtT,GAAiB,CAACK,eAAgBc,GAA4BvxP,EAAKqxP,UAC/D55P,OAOf,aAAct2D,IAAYA,EAAQsf,SAAU,CAC9C,MAAMlV,IAAmB,qBAAsBpK,IAAUA,EAAQoK,iBAC3Dk/F,EAAwB,0BAA2BtpG,IAA4C,IAAlCA,EAAQspG,sBACrE+mN,EAAgB,eACtBN,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAoBpxP,GAASA,EAAKqxP,SAAWrxP,EAAKqxP,QAAQG,GAC1DF,YAAaA,CAACtxP,EAAWvI,KACrB,MAAM6yC,EAActqC,EAAKqxP,QAAQG,GAYjC,OAVIpuT,IAAAA,cAACgnG,EAAAA,EAAS,CACNE,YAAaA,EACbS,kBAAmBx/F,EACnBk/F,sBAAuBA,EACvBj1F,UAAWrU,EAAQqU,UACnBk1F,kBAAmBvpG,EAAQupG,mBAE1BjzC,EAGW,GAGhC,CAEA,GAAIt2D,EAAQ4/J,uBAAwB,CAChC,MAAMywJ,EAAgB,8BACtBN,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAoBpxP,GAAcA,EAAKqxP,SAAWrxP,EAAKqxP,QAAQG,GAC/DF,YAActxP,IACV,MAAMsqC,EAActqC,EAAKqxP,QAAQG,GAQjC,OANIpuT,IAAAA,cAAC0pT,EAAqB,CAClB//R,OAAQ5rB,EAAQ4rB,QAAU,GAC1BqwB,QAASj8C,EAAQi8C,SAAW,GAC5BojH,gBAAiBr/J,EAAQq/J,gBACzB5yJ,KAAM08F,GAEY,GAGtC,CAEA,GAAInpG,EAAQ6/J,eAAgB,CACxB,MAAMwwJ,EAAgB,oBACtBN,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAoBpxP,GAAcA,EAAKqxP,SAAWrxP,EAAKqxP,QAAQG,GAC/DF,YAActxP,IACV,MAAMsqC,EAActqC,EAAKqxP,QAAQG,GAKjC,OAHIpuT,IAAAA,cAAC8oT,EAAa,CACVnjG,KAAMz+G,GAEY,GAGtC,CAEA,KAAM,UAAWnpG,IAAYA,EAAQsmC,MAAO,CACxC,MAAMgqR,EAAc,gBACpBP,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAoBpxP,GAAcA,EAAKqxP,SAAWrxP,EAAKqxP,QAAQI,GAC/DH,YAAaA,CAACtxP,EAAWvI,KACrB,MAAMwnD,EAAYj/C,EAAKqxP,QAAQI,GAE/B,OAAOruT,IAAAA,cAACwtT,GAAS,CAACrtT,KAAM07G,GAAYxnD,EAAqB,GAGrE,CAuFA,MArFM,WAAYt2D,IAAYA,EAAQskL,QAClCyrI,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAoBpxP,GAA4B,QAAdA,EAAK1hE,MAAgC,QAAd0hE,EAAKz8D,KAC9D+tT,YAActxP,IACV,MAAA0xP,EAGI1xP,EAAKqxP,SAFL75P,MAAOn0D,GAEVquT,EADML,E,qWAAOpuQ,CAAAyuQ,EAAAxuQ,IAad,OACI9/C,IAAAA,cAAC6rT,GAAazrT,OAAAC,OAAA,CACVJ,UAAWA,EACXysI,cAAe3uI,EAAQg/J,gBAAkBh/J,EAAQg/J,eAAekxJ,EAAQ1/S,MACpE0/S,EACAlwT,EAAQm/J,WAAU,CACtBvzI,OAAQ5rB,EAAQ4rB,OAChBsiS,aAjBaxgB,EAiBY7uO,EAAK6uO,cAhB9BA,GACoB,QAApBA,EAAWvwS,MACS,MAApBuwS,EAAWtrS,OAeX43D,SAAUh6D,EAAQg6D,YAlBL0zO,KAmBf,IAMZ,UAAW1tS,IAAYA,EAAQwwT,OACjCT,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAoBpxP,GAAcA,EAAKqxP,SAAWrxP,EAAKqxP,QAAQ,cAC/DC,YAActxP,GAEN58D,IAAAA,cAACyqT,EAAU,CACP/sT,IAAKk/D,EAAKqxP,QAAQ,cAClB7xN,QAASx/B,EAAKqxP,QAAQ,kBAOpC,gBAAiBlwT,IAAYA,EAAQywT,aACvCV,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAoBpxP,GAASA,EAAKqxP,SAAWrxP,EAAKqxP,QAAQ,qBAC1DC,YAActxP,GAEN58D,IAAAA,cAACqrT,EAAW,CAACjvN,QAASx/B,EAAKqxP,QAAQ,yBAM7C,aAAclwT,IAAYA,EAAQw9K,UACpCuyI,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAoBpxP,GAASA,EAAKqxP,SAAWrxP,EAAKqxP,QAAQ,uBAC1DC,YAActxP,GAEN58D,IAAAA,cAAC4pT,EAAS,CACNlsT,IAAKk/D,EAAKqxP,QAAQ,uBAClBj2O,KAAMpb,EAAKqxP,QAAQ,uBACnBpE,SAAUjtP,EAAKqxP,QAAQ,2BACvBnE,gBAAiBltP,EAAKqxP,QAAQ,sCAOlDH,EAAuB97S,KAAK,CACxB+7S,iBAAiB,EACjBC,kBAAmBA,KAAM,EACzBE,YAAaN,EAAuBa,qBAGjCn9R,EAAOo9R,sBAAsBv1E,GA9MpC,WACI,OAAO,CACX,GA4MuD20E,EAC3D,CAOO,SAASK,GAA4BQ,GACxC,MAAMC,EAAoC,CAAC,EAE3C,IAAK,MAAOlxT,EAAK8F,KAAUpD,OAAOkJ,QAAQqlT,GACtC,OAAQjxT,GACR,IAAK,QACDkxT,EAAS3uT,UAAYuD,EACrB,MACJ,IAAK,MACDorT,EAASz2L,QAAU30H,EACnB,MACJ,IAAK,WACDorT,EAASp5P,SAAWhyD,EACpB,MACJ,IAAK,WACDorT,EAASz9L,SAAW3tH,EACpB,MACJ,QACIorT,EAASlxT,GAAO8F,EAIxB,OAAOorT,CACX,C,kDC9SO,MAAM33N,EAAgC9+F,IAAuE,IAAtE,YAACy+F,EAAW,eAAEL,GAAmDp+F,EAC3G,MAAM02T,EAAmB/qT,KAAKm/G,KAAK1sB,EAAiBu4N,EAAAA,GAAqBC,KAAOx4N,EAC1Ey4N,EAAmBlrT,KAAKm/G,KAAK1sB,EAAiBu4N,EAAAA,GAAqBG,KAAO14N,EAIhF,MAAO,CACHs4N,mBACAG,mBACAj4N,6CANiD83N,GAAoBj4N,GAAeA,EAAco4N,EAOlGh4N,+BANmCg4N,GAAoBp4N,EAO1D,C,0LCdE,SAASs4N,EAAsB1kT,GAClCtI,SAAS20I,YAAY,cAAc,EAAOrsI,EAC9C,C,qCCHA,MAAM2kT,EAAkB,I,SAAIC,GAAgB,CAACC,YAAa,MAAMtzP,OAAO,SACvEozP,EAAgBG,IAAIC,EAAAA,IAEpB,UCQO,SAASC,EAAa1xP,GAEzB,IAA8D,IAA1D13D,MAAMwyD,KAAKkF,EAAc7C,OAAO/rC,QAAQ,aACxC,OAAO,KAGX,MAAMiqN,EAAOr7K,EAAc4zG,QAAQ,aAEnC,IAAM,UAAW72I,KAAKs+M,GAClB,OAAO,KAGX,MAAMs2E,EAhBH,SAAwBt2E,GAC3B,OAAO,IAAIu2E,WAAYC,gBAAgBx2E,EAAM,aAAa/9K,cAAc,QAC5E,CAckBw0P,CAAez2E,GAC7B,OAAKs2E,GACM,IAIf,CAEO,SAASI,EAAY/xP,GACxB,OAAO13D,MAAMwyD,KAAKkF,EAAc7C,OAAO9uB,SAAS,cAAiB,MAAOtR,KAAKijC,EAAc4zG,QAAQ,aACvG,CAEO,SAASo+I,EAAkBC,GAE9B,MADgB,qBAAsBl1R,KAAKk1R,EAE/C,CAUO,SAAShyP,EAAaD,GACzB,QAAI13D,MAAMwyD,KAAKkF,EAAc7C,OAAO9uB,SAAS,eACnB2xB,EAAc4zG,QAAQ,cAEvBniJ,OAAOnmB,OAAS,CAG7C,CAYO,SAAS4mT,EAAsBlyP,EAA6B1+D,EAAkBsmE,GACjF,MAAMyzK,EAAOr7K,EAAc4zG,QAAQ,aAEnC,IAAIu+I,EAAoBd,EAAgBe,SAAS/2E,GAAM5pN,OAEvD,MAAMkgS,EAAQD,EAAa1xP,GAC3B,GAAI2xP,GAhBR,SAAiCA,GAC7B,OAA+C,IAAxCA,EAAMU,iBAAiB,MAAM/mT,MACxC,CAciBgnT,CAAwBX,GAAQ,CACzC,MAAMY,EAAiB,KACvBJ,EAAoB,GAAHtvT,OAAMsvT,GAAiBtvT,OAAG0vT,EAC/C,CAEA,IAAIt2K,EAWJ,OANIA,EAHC36I,OAE+B,IAAlBsmE,EACK,GAAH/kE,OAAMvB,EAAO,QAAAuB,OAAOsvT,GAEjB,CAAC7wT,EAAQ0S,MAAM,EAAG4zD,GAAiB,KAAMuqP,EAAmB7wT,EAAQ0S,MAAM4zD,IAC/D/b,KAAK,IALhBsmQ,EAQhB,CAACl2K,mBAAkBk2K,oBAC9B,CAgBO,SAASK,EAAqBn4T,GAA8I,IAA7I,QAACiH,EAAO,cAAE0+D,EAAa,eAAEjP,EAAc,aAAEC,GAA0C32D,EACrH,MAAMo4T,EAAiB1hQ,IAAmBC,GACpC,WAAC8d,EAAU,UAAEC,GAAa0jP,GAAiBC,EAAAA,EAAAA,IAAiC3hQ,QAAAA,EAAkBzvD,EAAQgK,OAAQ0lD,QAAAA,EAAgB1vD,EAAQgK,OAAQhK,IAAW0tE,EAAAA,EAAAA,IAAiCje,QAAAA,EAAkBzvD,EAAQgK,OAAQhK,GAI5NqxT,EAA6B,KAAd5jP,EAAmB,GAAK,KAEvC6jP,GAHgC,KAAf9jP,EAAoB,GAAK,MAGJ,QADtB9O,EAAc4zG,QAAQ,cAC0B,QAAU++I,EAGhF,MAAO,CAAC12K,iBAFiB,GAAHp5I,OAAMisE,GAAUjsE,OAAG+vT,GAAkB/vT,OAAGksE,GAEpC6jP,qBAC9B,CAsCO,SAAS99O,EAAa/6D,EAAuB1F,EAAkB/S,EAAiBswE,EAA8BhK,GACjH,MAAM,cAAC5H,EAAa,OAAEtD,GAAU3iD,EAE1Bq9D,EAAY/iE,IAAa+wC,EAAAA,GAAUC,YAAc,gBAAkB,eAEzE,IAAK2a,IAAkBA,EAAcryD,QAAU+uD,IAAWA,aAAM,EAANA,EAA2BzjE,MAAOm+E,EACxF,OAGJ,GAAIxF,EACA,OAGJ,MAAM,eAAC7gB,EAAc,aAAEC,GAAgB0L,EAEjCm2P,GAAgBC,IAAM/hQ,KAAoB+hQ,IAAM9hQ,IAAiBD,EAAiBC,EAClF+hQ,EApIH,SAAmB/yP,GACtB,MAAMgzP,EAAgBhzP,EAAc4zG,QAAQ,cAC5C,OAAOo/I,EAAcj/S,WAAW,YAAci/S,EAAcj/S,WAAW,WAC3E,CAiIuBk/S,CAAUjzP,GACvBkzP,EAAenB,EAAY/xP,GAC3BmzP,EAAYzB,EAAa1xP,GACzBozP,EAA0BP,GAAgBE,EAC1CM,EAA6BF,GAAanB,EAAkBmB,EAAUhxT,WAE5E,GAAKgxT,GAAcD,GAAiBE,EAOpC,GAHAr5S,EAAMjO,iBAGFsnT,EAAyB,CACzB,MAAME,EAtDP,SAAkCxzT,GAAoF,IAAnF,QAACwB,EAAO,cAAE0+D,EAAa,eAAEjP,EAAc,aAAEC,GAAwClxD,EACvH,MAAMyzT,EAAejyT,EAAQ0S,MAAM+8C,EAAgBC,GAC7CwiQ,EAAexzP,EAAc4zG,QAAQ,cAE3C,GAAI2/I,IAAiB/K,EAAAA,IACblnT,EAAQgK,OAASk9S,EAAAA,GAAwBl9S,OAAQ,CACjD,MAAMmoT,EAA4B,KAC5BC,EAA4B,IAE5BC,EAAaryT,EAAQ0S,MAAM+8C,EAAiB0iQ,EAA0BnoT,OAAQylD,GAC9E6iQ,EAAYtyT,EAAQ0S,MAAMg9C,EAAcA,EAAe0iQ,EAA0BpoT,QAIvF,GAAIqoT,IAAeF,GAA6BG,IAAcF,EAC1D,OAAOF,CAEf,CAIJ,MADqB,IAAH3wT,OAAO0wT,EAAY,MAAA1wT,OAAK2wT,EAAY,IAE1D,CAgC8BK,CAA0B,CAAC9iQ,iBAAgBC,eAAc1vD,UAAS0+D,kBACxFoxP,EAAsBkC,EAC1B,MAAO,GAAID,EAA4B,CACnC,MAAM,mBAACT,GAAsBJ,EAAsB,CAACzhQ,iBAAgBC,eAAc1vD,UAAS0+D,kBAC3FoxP,EAAsBwB,EAC1B,KAAO,CACH,MAAM,kBAACT,GAAqBD,EAAsBlyP,EAAe1+D,EAASsmE,GAC1EwpP,EAAsBe,EAC1B,CACJ,CAEO,SAASzxP,EAAgC7+D,EAAwB0+D,GACpE,MAAM3kE,EAAOiG,EAAKiyT,YAElB,IAAKl4T,EACD,OAAO,KAGX,IAAIm4T,EAAM,GACNn4T,EAAKyG,MAAQzG,EAAKyG,KAAKgsC,SAAS,KAChC0lR,EAAMn4T,EAAKyG,KAAK2R,MAAMpY,EAAKyG,KAAKy+K,YAAY,MACrCj/K,EAAKzE,KAAKixC,SAAS,OAC1B0lR,EAAM,IAAMlyT,EAAKzE,KAAK4W,MAAMnS,EAAKzE,KAAK0jL,YAAY,KAAO,GAAG37K,eAGhE,IAAI9C,EAAO,GACX,GAAIzG,EAAKyG,KACLA,EAAOzG,EAAKyG,SACT,CACH,MAAM0d,EAAM,IAAID,KACV+zG,EAAO9zG,EAAIi6B,cACXkY,EAAQnyC,EAAIu+O,WAAa,EACzBjvK,EAAOtvE,EAAIw+O,UACX95M,EAAO1kC,EAAIi0S,WAAW9tT,WAAW+tT,SAAS,EAAG,KAC7CvvQ,EAAS3kC,EAAIm0S,aAAahuT,WAAW+tT,SAAS,EAAG,KAEvD5xT,EAAO,GAAHQ,OAAM09D,GAAsB19D,OAAGgxH,EAAI,KAAAhxH,OAAIqvD,EAAK,KAAArvD,OAAIwsF,EAAI,KAAAxsF,OAAI4hD,EAAI,KAAA5hD,OAAI6hD,GAAM7hD,OAAGkxT,EACjF,CAEA,OAAO,IAAII,KAAK,CAACv4T,GAAeyG,EAAM,CAACjF,KAAMxB,EAAKwB,MACtD,C,qDCrOO,MAAMg3T,EAAkB,eAKlBnxE,EAAyB,gBAWzBoxE,EAA0B,qC,8KCHhC,MAOMpb,EAAoBA,CAC7BhhS,EACA4M,KAC0B,IAAAyvS,EAC1B,OAAuG,QAAvGA,EAAOr8S,aAAQ,EAARA,EAAU5K,MAAKhT,IAAA,IAAC,QAACwoP,GAAQxoP,EAAA,OAAKg7H,EAAAA,EAAAA,WAAUxwG,EAAU,CAACF,KAAMk+N,EAAS0xE,OAAO,EAAOC,QAAQ,GAAO,WAAC,IAAAF,EAAAA,EAAI,IAAI,EAGtGvoF,EAAcA,KAChB9yL,EAAAA,EAAAA,aAAYigQ,EAAAA,IAGVhtE,EAAsBA,KAC/B,MAAM,SAACrnN,IAAYkuJ,EAAAA,EAAAA,eACnB,OAAO95H,EAAAA,EAAAA,cAAaz+C,IAAuB2+S,EAAAA,EAAAA,IAAuB3+S,EAAOqqB,IAAU,EAG1E+kN,EAAoBA,KAC7B,MAAM,SAAC/kN,IAAYkuJ,EAAAA,EAAAA,eACnB,OAAO95H,EAAAA,EAAAA,cAAaz+C,IAAuBw+S,EAAAA,EAAAA,IAAqBx+S,EAAOqqB,IAAU,EAGxE4vS,EAAUA,CAACh6T,EAAqB4tO,EAA8BlpO,OACzD,MAAV1E,GAAiBA,SAAAA,EAAO4zC,SAAS,QAGjC/lC,MAAMC,QAAQ9N,GACPA,EAAM4zC,SAASg6L,SAA4BnrO,IAAbiC,GAA0B1E,EAAM4zC,SAASlvC,GAE3E1E,IAAU4tO,QAA2BnrO,IAAbiC,GAA0B1E,IAAU0E,GAG1DmpO,EAAcD,GAA+C,OAAdA,EAS/C1e,EAAmBA,CAAC1xM,EAAmCg2E,IACzD3rF,OAAOoI,OAAOuN,GAAU5K,MAAOygF,GAC3BA,EAAQG,MAAQA,IAmBlBi7H,EAA0BjxM,IACnC,OAV0Bpf,EAUEof,EAV6By8S,EAUlB5mO,GAAqBA,EAAQs7H,qBAAuBC,EAAAA,GAAmB8C,KATvG7pN,OAAO+I,KAAKxS,GAAM4b,QAAO,CAACqrG,EAA8BnrG,KACvD+/S,EAAU77T,EAAK8b,MACfmrG,EAAInrG,GAAW9b,EAAK8b,IAEjBmrG,IACR,CAAC,GANqB60M,IAAC97T,EAA+B67T,CAU0D,C,2DC1E7Gja,GAAema,eADlB,MAIDC,EAAW,CAAC,aAAc,gBAE1BC,EAAkB,CAAC,GAAI,QAAS,QAQ/B,SAAS5rK,EACZ5jJ,EACA8pB,EACAvyB,EACA8nB,GAEA,GACoB,SAAhByK,EAAQ2lS,KACmC,SAA3Cl4T,EAAOm4T,iCACqC,SAA5Cn4T,EAAOo4T,mCACqB,IAA5BJ,EAASzjS,QAAQzM,GACnB,CACE,GACIrf,IACAjC,EAAAA,EAAAA,GAAQiC,EAAKhC,QAC4C,SAAzDzG,EAAOq4T,8CAEP,OAAO,EAEX,GACI5vT,IACCA,EAAK6vT,aAC0C,IAAhDL,EAAgB1jS,QAAQ9rB,EAAK8vT,cAE7B,OAAO,CAEf,CACA,OAAO,CACX,C,kDC/CO,MAAM5/N,EAAoBA,CAAC6/N,EAAsBC,KACpD,IAAIC,EAAU,GACd,OAAQF,GACR,KAAKn5J,EAAAA,GAAY0rJ,IACb2N,EAAU,iBACV,MACJ,KAAKr5J,EAAAA,GAAYs5J,IACbD,EAAU,iBACV,MACJ,KAAKr5J,EAAAA,GAAYC,aACbo5J,EAAU,eACV,MACJ,KAAKr5J,EAAAA,GAAYurJ,QACb8N,EAAU,UACV,MACJ,QACIA,EAAU,aAMd,OAFAA,GAAWD,EAAW,OAAS,GAExBC,CAAO,C,8ICVlB,MAAME,E,SAAuC9tS,GAAU8tS,qBAEhDh9T,eAAeg9R,EAAUigC,EAAcx7O,GAC1C,MAAM6xO,EAAW4J,EAA2BD,GAE5C,GAAI3J,EACA,IAEI,aAyDZtzT,eAAgCm9T,GAC5B,MAAMC,EAEF,CACA,KAAMC,IAAM,gCACZC,aAAcA,IAAM,gCACpBC,YAAaA,IAAM,gCACnBC,KAAMA,IAAM,gCACZC,QAASA,IAAM,+BACfC,aAAcA,IAAM,+BACpBC,IAAKA,IAAM,+BACXC,OAAQA,IAAM,gCACd99P,IAAKA,IAAM,gCACXzV,EAAGA,IAAM,8BACTwzQ,KAAMA,IAAM,+BACZC,OAAQA,IAAM,+BACdloO,KAAMA,IAAM,+BACZmoO,OAAQA,IAAM,gCACdC,WAAYA,IAAM,+BAClBC,OAAQA,IAAM,gCACdC,OAAQA,IAAM,gCACdC,QAASA,IAAM,+BACfC,OAAQA,IAAM,gCACdC,MAAOA,IAAM,gCACbC,GAAIA,IAAM,gCACVC,OAAQA,IAAM,gCACdC,WAAYA,IAAM,gCAClBC,QAASA,IAAM,gCACfC,KAAMA,IAAM,gCACZC,KAAMA,IAAM,gCACZC,WAAYA,IAAM,gCAClBC,KAAMA,IAAM,gCACZC,MAAOA,IAAM,gCACbC,OAAQA,IAAM,gCACd/G,MAAOA,IAAM,gCACbgH,KAAMA,IAAM,gCACZC,KAAMA,IAAM,gCACZC,IAAKA,IAAM,gCACXC,SAAUA,IAAM,+BAChBn6I,SAAUA,IAAM,+BAChBo6I,OAAQA,IAAM,gCACdC,WAAYA,IAAM,gCAClBC,MAAOA,IAAM,gCACbC,KAAMA,IAAM,gCACZC,MAAOA,IAAM,+BACbC,IAAKA,IAAM,+BACXC,UAAWA,IAAM,gCACjBC,WAAYA,IAAM,+BAClBC,OAAQA,IAAM,gCACdC,OAAQA,IAAM,8BACd31Q,EAAGA,IAAM,gCACT41Q,KAAMA,IAAM,+BACZC,KAAMA,IAAM,gCACZC,MAAOA,IAAM,gCACbC,OAAQA,IAAM,gCACdC,KAAMA,IAAM,gCACZC,UAAWA,IAAM,+BACjBC,IAAKA,IAAM,+BACXC,OAAQA,IAAM,gCACdC,MAAOA,IAAM,gCACbC,WAAYA,IAAM,gCAClBC,MAAOA,IAAM,gCACbC,SAAUA,IAAM,gCAChBC,QAASA,IAAM,+BACfC,KAAMA,IAAM,gCACZC,IAAKA,IAAM,gCACXC,IAAKA,IAAM,+BACXC,KAAMA,IAAM,iCAGhB,IAAK1D,EAAgBD,GACjB,OAGJ,MAAM7J,SAAkB8J,EAAgBD,MAAiB3+P,QAEzDuiQ,EAAAA,EAAKC,iBAAiB7D,EAAc7J,EACxC,CAvIkB0N,CAAiB1N,GAChByN,EAAAA,EAAK/jC,UAAUv7M,EAAM,CAAC6xO,aAAWrmT,KAC5C,CAAE,MAAOrE,GACL,CAIR,OAAOirT,EAAAA,GAA4BpyO,EACvC,CAEO,SAASw/O,EAAkBx/O,GAC9B,MAAMy/O,EAAgBz/O,EAAKxzC,MAAM,eAAep7B,OAC1C6gT,EAAc,GACpB,IAAK,IAAI7nR,EAAI,EAAGA,EAAIq1R,EAAer1R,IAC/B6nR,EAAYj4S,MAAMowB,EAAI,GAAGp+B,YAG7B,OAAOimT,EAAYtgQ,KAAK,KAC5B,CAEO,SAAS+tQ,EAA6BzqL,GACzC,IAAK,MAAMvvI,KAAO61T,EACd,GAAIA,EAAqB71T,GAAK8gO,WAAWrzN,MAAMwuB,GAAcA,IAAMszG,IAC/D,OAAOvvI,EAIf,OAAO,IACX,CAEO,SAASi6T,EAAa9N,GACzB,OAAOt9S,QAAQknT,EAA2B5J,GAC9C,CAEO,SAAS+N,EAAgB/N,GAC5B,GAAI8N,EAAa9N,GAAW,CACxB,MAAM1pT,EAA2BszT,EAA2B5J,GAC5D,OAAK1pT,EAGEozT,EAAqBpzT,GAAMA,KAFvB,EAGf,CAEA,MAAO,EACX,CAEA,SAASszT,EAA2BtzT,GAChC,MAAM03T,EAAmB13T,EAAK8C,cAC9B,OAAIswT,EAAqBsE,GACdA,EAGJz3T,OAAO+I,KAAKoqT,GAAsBpoT,MAAMzN,IAC3C,MAAMkgI,EAAU21L,EAAqB71T,GAAKkgI,QAC1C,OAAOA,GAAWA,EAAQzyH,MAAMy3C,GAAMA,IAAMi1Q,GAAS,GAE7D,C,iBC/DO,SAAS5zS,EAAgDmZ,EAAY7Z,GACxE,IAAK6Z,EACD,MAAO,GAGX,MAAM06R,GAL4F7xT,UAAAmD,OAAA,QAAApO,IAAAiL,UAAA,GAAAA,UAAA,GAAG,IAKnEu+B,MAAM,KAElCuzR,EAAoB36R,EAAMj6B,QAAQ0e,GACvB,OAATA,GACOi2S,EAAe3rR,SAAStqB,EAAK9qB,MAGzC8hE,MAAK,CAACjW,EAAGtwC,IACDwlT,EAAe5oS,QAAQ0zB,EAAE7rD,IAAM+gU,EAAe5oS,QAAQ5c,EAAEvb,MAG7DihU,EAAa56R,EAAMj6B,QAAQ0e,GAChB,OAATA,IACQi2S,EAAe3rR,SAAStqB,EAAK9qB,MAG1C8hE,MAAK,CAACjW,EAAGtwC,IAhChB,SAAmCiR,EAAgBq/B,EAAStwC,GACxD,OAAuB,OAAnBswC,EAAE/iD,cACE+iD,EAAE/iD,eAAiByS,EAAEzS,aACd+iD,EAAE/iD,aAAai5D,cAAcxmD,EAAEzS,aAAc0jB,EAAQ,CAACw1C,SAAS,IAIvEnW,EAAEziD,KAAK24D,cAAcxmD,EAAEnS,KAAMojB,EAAQ,CAACw1C,SAAS,GAC1D,CAyBek/P,CAA0B10S,EAAQq/B,EAAGtwC,KAGhD,MAAO,IAAIylT,KAAsBC,GAAY70T,QAAQ0e,GAE1CA,IAAUA,EAAKiC,UAAkC,GAA0B,MAArBjC,EAAKhiB,cAE1E,CAEO,SAASq4T,EAAY1xT,EAAqBrG,GAC7C,MAAO,CACHpJ,GAAI,GACJ6nB,UAAW,EACXC,UAAW,EACXiF,UAAW,EACXjkB,aAAc2G,EACdrG,OACAD,YAAa,GACb/G,MAAO,GACP+B,KAAM,IACNyxP,aAAc,GACdp8F,gBAAiB,GACjBnB,UAAW,GACXoB,mBAAmB,EACnB2nK,UAAW,GACXvpN,mBAAmB,EAE3B,C,gIC3DO,MAAMuoI,E,MAAmBn3O,GAAAA,cAAqC,MCM9D,SAASmpD,EAAYhxD,GAAiC,IAAhC,QAACgkC,GAA6BhkC,EACvD,MAAMigU,EAAWl+E,KAEjB90L,EAAAA,EAAAA,YAAU,KACNgzQ,EAASl9R,mBAAmBiB,GAErB,KACHi8R,EAASx8R,sBAAsBO,EAAQ,IAE5C,CAACi8R,EAAUj8R,GAClB,CAEO,SAAS+9M,IACZ,OAAOl3E,EAAAA,EAAAA,YAAWm0E,EACtB,C,kBCzBAwB,EAAA,MAGA0/E,EAAQ,GAmBR,SAAShzI,EAAaxqE,GAClB,GAAmB,iBAARA,GAA4B,OAARA,EAC3B,OAAO,EAEX,MAAMjqG,EAAUiqG,EAChB,MAA8B,iBAAnBjqG,EAAQskK,QAAgD,iBAAlBtkK,EAAQhP,cAGhC5G,IAArB4V,EAAQuB,UAAsD,iBAArBvB,EAAQuB,mBAGfnX,IAAlC4V,EAAQ0nT,yBAAwC,EAAIC,EAAWC,gBAAgB5nT,EAAQ0nT,gCAGtEt9T,IAAjB4V,EAAQ7Q,MAA8C,iBAAjB6Q,EAAQ7Q,cAG5B/E,IAAjB4V,EAAQtM,MAA8C,iBAAjBsM,EAAQtM,cAGrBtJ,IAAxB4V,EAAQ1Q,aAA4D,iBAAxB0Q,EAAQ1Q,qBAGhClF,IAApB4V,EAAQ6nT,SAAoD,iBAApB7nT,EAAQ6nT,iBAGpBz9T,IAA5B4V,EAAQ8nT,iBAAoE,kBAA5B9nT,EAAQ8nT,yBAGzB19T,IAA/B4V,EAAQ+nT,oBAA0E,kBAA/B/nT,EAAQ+nT,4BAG/B39T,IAA5B4V,EAAQgoT,iBAAoE,kBAA5BhoT,EAAQgoT,yBAG5B59T,IAA5B4V,EAAQioT,iBAAoE,kBAA5BjoT,EAAQioT,0BAGnC79T,IAArB4V,EAAQ8B,YAA2B,EAAIomT,EAAY3zI,WAAWv0K,EAAQ8B,SAAU2yK,aAG/DrqL,IAAjB4V,EAAQrI,OAiEhB,SAAmB8wC,GACf,GAAiB,iBAANA,GAAwB,OAANA,EACzB,OAAO,EAEX,MAAM9wC,EAAO8wC,EACb,YAAmBr+C,IAAfuN,EAAK2F,OAA6C,iBAAf3F,EAAK2F,eAGxBlT,IAAhBuN,EAAK+D,QAA+C,iBAAhB/D,EAAK+D,gBAGzBtR,IAAhBuN,EAAKmgG,QAA+C,iBAAhBngG,EAAKmgG,gBAG3B1tG,IAAduN,EAAKxI,MAA2C,iBAAdwI,EAAKxI,cAGf/E,IAAxBuN,EAAKmG,gBAA+D,iBAAxBnG,EAAKmG,wBAG1B1T,IAAvBuN,EAAKwwT,eAA6D,kBAAvBxwT,EAAKwwT,uBAGtB/9T,IAA1BuN,EAAKqD,kBAAmE,kBAA1BrD,EAAKqD,2BAGnC5Q,IAAhBuN,EAAKE,UAAyB,EAAIqwT,EAAY3zI,WAAW58K,EAAKE,OAAQuwT,aAGtDh+T,IAAhBuN,EAAK6H,SAAyB6oT,EAAU1wT,EAAK6H,kBAG7BpV,IAAhBuN,EAAK6B,SAAyB6uT,EAAU1wT,EAAK6B,iBAGzBpP,IAApBuN,EAAK2wT,cAA6B,EAAIJ,EAAYtoH,eAAejoM,EAAK2wT,qBAI9E,CAxGuCC,CAAUvoT,EAAQrI,eAG9BvN,IAAnB4V,EAAQxG,SAAyB6uT,EAAUroT,EAAQxG,oBAI3D,EAlEA,MAAMmuT,EAAa5/E,EAAQ,MACrBmgF,EAAcngF,EAAQ,OAC5B,IAAIygF,EASAl2Q,EAwDJ,SAAS+1Q,EAAUp+M,GACf,GAAmB,iBAARA,GAA4B,OAARA,EAC3B,OAAO,EAEX,MAAM3pG,EAAO2pG,EACb,MAAyB,iBAAd3pG,EAAKuR,aAGIznB,IAAhBkW,EAAKk9L,SAMb,SAAqB/0J,GACjB,GAAiB,iBAANA,GAAwB,OAANA,EACzB,OAAO,EAEX,MAAM+0J,EAAS/0J,EACf,YAAmBr+C,IAAfozM,EAAOv6B,KAA2C,iBAAfu6B,EAAOv6B,aAGnB74K,IAAvBozM,EAAOn6B,aAA2D,iBAAvBm6B,EAAOn6B,qBAGdj5K,IAApCozM,EAAOirH,0BAAqF,iBAApCjrH,EAAOirH,kCAG5Cr+T,IAAnBozM,EAAOxqM,SAAmD,iBAAnBwqM,EAAOxqM,iBAG5B5I,IAAlBozM,EAAOzzM,QAAiD,iBAAlByzM,EAAOzzM,gBAGxBK,IAArBozM,EAAOkrH,WAAuD,iBAArBlrH,EAAOkrH,mBAGzBt+T,IAAvBozM,EAAOmrH,aAA2D,iBAAvBnrH,EAAOmrH,qBAGlCv+T,IAAhBozM,EAAO/6L,MAA6C,iBAAhB+6L,EAAO/6L,cAGtBrY,IAArBozM,EAAOorH,WAAuD,iBAArBprH,EAAOorH,mBAGhCx+T,IAAhBozM,EAAOvsL,MAA6C,iBAAhBusL,EAAOvsL,cAG3B7mB,IAAhBozM,EAAOhrM,MAA6C,iBAAhBgrM,EAAOhrM,aAGzBpI,IAAlBozM,EAAO7qL,QAAiD,iBAAlB6qL,EAAO7qL,iBAIrD,CAhDsCk2S,CAAYvoT,EAAKk9L,QAKvD,CAgGA,SAASsrH,EAAkBrgR,GACvB,GAAiB,iBAANA,GAAwB,OAANA,EACzB,OAAO,EAEX,MAAMlzC,EAASkzC,EACf,MAA4B,iBAAjBlzC,EAAOvE,OAA8C,iBAAjBuE,EAAO3C,aAG7BxI,IAArBmL,EAAO1C,WAAuD,iBAArB0C,EAAO1C,UAIxD,CACA,SAASu1T,EAAW3/Q,GAChB,GAAiB,iBAANA,GAAwB,OAANA,EACzB,OAAO,EAEX,MAAMx2C,EAAQw2C,EACd,QAA0B,iBAAfx2C,EAAM1C,MAA2C,iBAAf0C,EAAM3H,WAGzBF,IAAtB6H,EAAM8D,aAA0D,kBAAtB9D,EAAM8D,kBAG7B3L,IAAnB6H,EAAMiC,UAAoD,kBAAnBjC,EAAMiC,eAG7B9J,IAAhB6H,EAAMW,QAvCd,SAAwB61C,GACpB,MAAiB,iBAANA,GAGM,kBAANA,GAGD,OAANA,GAGGqgR,EAAkBrgR,EAC7B,CA4BsCsgR,CAAe92T,EAAMW,aAG7BxI,IAAtB6H,EAAM3C,aAA0D,iBAAtB2C,EAAM3C,kBAGhClF,IAAhB6H,EAAMjB,OAA8C,iBAAhBiB,EAAMjB,YAG3B5G,IAAf6H,EAAMyB,MAA4C,iBAAfzB,EAAMyB,WAGtBtJ,IAAnB6H,EAAMgkD,UAAoD,iBAAnBhkD,EAAMgkD,eAGvB7rD,IAAtB6H,EAAM4D,aAA0D,iBAAtB5D,EAAM4D,kBAG9BzL,IAAlB6H,EAAMkJ,SAAkD,kBAAlBlJ,EAAMkJ,cAG1B/Q,IAAlB6H,EAAM9E,WAA0B,EAAI+6T,EAAY3zI,WAAWtiL,EAAM9E,QAAS27T,SAGpD1+T,IAAtB6H,EAAM+B,aAA0D,kBAAtB/B,EAAM+B,kBAG/B5J,IAAjB6H,EAAM0N,SAAyB0oT,EAAUp2T,EAAM0N,cAG7BvV,IAAlB6H,EAAMkE,SAAkD,iBAAlBlE,EAAMkE,cAGvB/L,IAArB6H,EAAMqmS,YAAwD,iBAArBrmS,EAAMqmS,iBAG1BluS,IAArB6H,EAAMoE,YAAwD,iBAArBpE,EAAMoE,WAIvD,EAhPA,SAAWmyT,GACPA,EAA0C,8BAAI,mCAC9CA,EAAqB,SAAI,aACzBA,EAAsB,UAAI,cAC1BA,EAAiC,qBAAI,eACrCA,EAAyB,aAAI,gBAC7BA,EAA2B,eAAI,iBAClC,CAPD,CAOGA,IAAoCA,EAAa,CAAC,IAErD,SAAWl2Q,GACPA,EAAoB,SAAI,aACxBA,EAAyB,cAAI,kBAC7BA,EAAmB,QAAI,WACvBA,EAAkB,OAAI,UACzB,CALD,CAKGA,IAAkCA,EAAY,CAAC,G,iBCpBlD9iD,OAAO0oF,eAAeuvO,EAAS,aAAc,CAAE70T,OAAO,IACtD60T,EAAQG,eAER,SAAwBn/Q,GACpB,OAAU,OAANA,GAA2B,iBAANA,IAGlB,EAAIy/Q,EAAY3zI,WAAW9rI,GAAIl6C,GAAY,OAANA,GAA2B,iBAANk6C,GACrE,EANA,MAAMy/Q,EAAcngF,EAAQ,M,gBCD5B0/E,EAAQ,GAER,SAA+BhlT,EAAMkZ,GACjC,MAAO,CACHx1B,GAAI,GACJysD,aAAcj3B,EAAei3B,aAC7B5kC,UAAW,EACXC,UAAWxL,EAAKwL,UAChBJ,QAASpL,EAAKoL,QACdjL,WAAYH,EAAKG,WACjBC,QAASJ,EAAKI,QACdrU,QAASiU,EAAKjU,QACdM,MAAO2T,EAAK3T,MACZgtB,SAAUrZ,EAAKqZ,SACfitD,SAAUtmE,EAAKqZ,SAASitD,SAEhC,EAfA0+O,EAAQ,GAgBR,SAA6BpqS,GACzB,MAAM5a,EAAO,CACTkkM,QAAS,EACTqiH,SAAU,GACVh6R,WAAW,EACXi6R,YAAa,GACbptS,gBAAiB,GACjB+jB,YAAa,EACbt1C,KAAM,GACNnE,GAAIk3B,EAAcl3B,GAClB6nB,UAAWqP,EAAcrP,UACzBC,UAAWoP,EAAcpP,UACzBiF,UAAW,EACXrF,QAASwP,EAAcxP,QACvBjL,WAAYya,EAAcza,WAC1BC,QAASwa,EAAcxa,QACvBrU,QAAS6uB,EAAc7uB,QACvBM,MAAOuuB,EAAcvuB,MACrBgtB,SAAU,CACNu3J,OAAQ,GACRt1J,OAAQ,GACRP,MAAO,GACPi0J,OAAQ,CAAC,IAMjB,OAHIp0J,EAAcvB,WACdrZ,EAAKqZ,SAAWuB,EAAcvB,UAE3BrZ,CACX,C","sources":["webpack://mattermost-webapp/./src/actions/admin_actions.jsx","webpack://mattermost-webapp/./src/components/apps_form/apps_form_field/select_channel_option.tsx","webpack://mattermost-webapp/./src/components/apps_form/apps_form_field/select_user_option.tsx","webpack://mattermost-webapp/./src/components/apps_form/apps_form_field/apps_form_select_field.tsx","webpack://mattermost-webapp/./src/components/apps_form/apps_form_field/apps_form_field.tsx","webpack://mattermost-webapp/./src/components/apps_form/apps_form_field/index.ts","webpack://mattermost-webapp/./src/components/apps_form/apps_form_header.tsx","webpack://mattermost-webapp/./src/components/apps_form/apps_form_component.tsx","webpack://mattermost-webapp/./src/components/apps_form/apps_form_container.tsx","webpack://mattermost-webapp/./src/components/apps_form/index.ts","webpack://mattermost-webapp/./src/actions/apps.ts","webpack://mattermost-webapp/./src/actions/cloud.tsx","webpack://mattermost-webapp/./src/actions/file_actions.ts","webpack://mattermost-webapp/./src/components/widgets/menu/menu_modals/submenu_modal/submenu_modal.tsx","webpack://mattermost-webapp/./src/actions/global_actions.tsx","webpack://mattermost-webapp/./src/actions/views/add_channel_dropdown.ts","webpack://mattermost-webapp/./src/actions/views/channel.ts","webpack://mattermost-webapp/./src/actions/views/create_comment.tsx","webpack://mattermost-webapp/./src/actions/command.ts","webpack://mattermost-webapp/./src/actions/views/group.js","webpack://mattermost-webapp/./src/actions/views/lhs.ts","webpack://mattermost-webapp/./src/actions/views/notice.js","webpack://mattermost-webapp/./src/actions/views/onboarding_tasks.ts","webpack://mattermost-webapp/./src/actions/views/posts.js","webpack://mattermost-webapp/./src/actions/views/product_menu.ts","webpack://mattermost-webapp/./src/actions/views/root.ts","webpack://mattermost-webapp/./src/actions/views/search.js","webpack://mattermost-webapp/./src/actions/views/status_dropdown.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/websocket.ts","webpack://mattermost-webapp/./src/components/removed_from_channel_modal/removed_from_channel_modal.tsx","webpack://mattermost-webapp/./src/components/removed_from_channel_modal/index.ts","webpack://mattermost-webapp/./src/actions/websocket_actions.jsx","webpack://mattermost-webapp/./src/actions/views/system.js","webpack://mattermost-webapp/./src/components/about_build_modal/about_build_modal_cloud/about_build_modal_cloud.tsx","webpack://mattermost-webapp/./src/components/about_build_modal/about_build_modal.tsx","webpack://mattermost-webapp/./src/components/about_build_modal/index.ts","webpack://mattermost-webapp/./src/components/add_groups_to_team_modal/add_groups_to_team_modal.tsx","webpack://mattermost-webapp/./src/components/add_groups_to_team_modal/index.ts","webpack://mattermost-webapp/./src/components/add_user_to_group_multiselect/multiselect_option/multiselect_option.tsx","webpack://mattermost-webapp/./src/components/add_user_to_group_multiselect/add_user_to_group_multiselect.tsx","webpack://mattermost-webapp/./src/components/add_user_to_group_multiselect/index.ts","webpack://mattermost-webapp/./src/components/admin_console/blockable_link/blockable_link.tsx","webpack://mattermost-webapp/./src/components/admin_console/blockable_link/index.ts","webpack://mattermost-webapp/./src/components/admin_console/feature_discovery/features/images/system_roles_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/moon_svg.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/remote_user_hour.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/scheduled_post_indicator/short_scheduled_post_indicator.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/scheduled_post_indicator/scheduled_post_indicator.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_post_box_indicator.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/post_box_indicator/post_box_indicator.tsx","webpack://mattermost-webapp/./src/components/suggestion/rhs_suggestion_list.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/do_not_disturb_warning.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/edit_post_footer.tsx","webpack://mattermost-webapp/./src/components/message_submit_error.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/typing.ts","webpack://mattermost-webapp/./src/components/msg_typing/actions.ts","webpack://mattermost-webapp/./src/components/msg_typing/msg_typing.tsx","webpack://mattermost-webapp/./src/components/msg_typing/index.ts","webpack://mattermost-webapp/./src/components/advanced_text_editor/footer.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/formatting_bar/hooks.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/formatting_bar/formatting_bar.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/message_with_mentions_footer.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/send_button/send_post_options/recent_used_custom_date.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/send_button/send_post_options/core_menu_options.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/send_button/send_post_options/index.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/send_button/send_button.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/show_formatting/show_formatting.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/texteditor_actions/texteditor_actions.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/toggle_formatting_bar.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_key_handler.tsx","webpack://mattermost-webapp/./src/selectors/views/rhs.ts","webpack://mattermost-webapp/./src/components/file_upload/file_upload.tsx","webpack://mattermost-webapp/./src/utils/dragster.ts","webpack://mattermost-webapp/./src/components/file_upload/index.ts","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_upload_files.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/advanced_text_editor.tsx","webpack://mattermost-webapp/./src/selectors/views/system.ts","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_orientation_handler.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_plugin_items.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_textbox_focus.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_emoji_picker.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/formatting_bar/formatting_icon.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/priority_labels/index.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/send_button/scheduled_post_custom_time_modal/dm_user_timezone.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/send_button/scheduled_post_custom_time_modal/scheduled_post_custom_time_modal.tsx","webpack://mattermost-webapp/./src/components/persist_notification_confirm_modal.tsx","webpack://mattermost-webapp/./src/components/post_priority/post_priority_picker_item.tsx","webpack://mattermost-webapp/./src/components/post_priority/post_priority_picker.tsx","webpack://mattermost-webapp/./src/components/post_priority/post_priority_picker_overlay.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_priority.tsx","webpack://mattermost-webapp/./src/components/notify_confirm_modal.tsx","webpack://mattermost-webapp/./src/components/post_deleted_modal.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_submit.tsx","webpack://mattermost-webapp/./src/components/advanced_text_editor/use_groups.tsx","webpack://mattermost-webapp/./src/components/alert_banner/index.tsx","webpack://mattermost-webapp/./src/actions/views/announcement_bar.js","webpack://mattermost-webapp/./src/selectors/views/announcement_bar.ts","webpack://mattermost-webapp/./src/components/announcement_bar/default_announcement_bar/announcement_bar.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/default_announcement_bar/index.ts","webpack://mattermost-webapp/./src/components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/cloud_trial_announcement_bar/cloud_trial_announcement_bar.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/cloud_trial_announcement_bar/index.ts","webpack://mattermost-webapp/./src/components/announcement_bar/cloud_trial_ended_announcement_bar/index.tsx","webpack://mattermost-webapp/./src/components/common/hooks/useGetSubscription.ts","webpack://mattermost-webapp/./src/components/announcement_bar/renewal_link/renewal_link.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/renewal_link/index.ts","webpack://mattermost-webapp/./src/components/announcement_bar/text_dismissable_bar.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/configuration_bar/configuration_bar.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/configuration_bar/index.ts","webpack://mattermost-webapp/./src/components/announcement_bar/notification_permission_bar/notification_permission_never_granted_bar.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/notification_permission_bar/notification_permission_unsupported_bar.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/notification_permission_bar/index.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/overage_users_banner/index.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/payment_announcement_bar/index.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/show_start_trial_modal/show_start_trial_modal.tsx","webpack://mattermost-webapp/./src/components/three_days_left_trial_modal/learn_more_action_button.tsx","webpack://mattermost-webapp/./src/components/three_days_left_trial_modal/three_days_left_trial_modal_card.tsx","webpack://mattermost-webapp/./src/components/three_days_left_trial_modal/three_days_left_trial_modal.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/show_tree_days_left_trial_modal/show_three_days_left_trial_modal.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/limits.ts","webpack://mattermost-webapp/./src/components/announcement_bar/users_limits_announcement_bar/index.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/version_bar/version_bar.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/version_bar/index.ts","webpack://mattermost-webapp/./src/components/announcement_bar/announcement_bar_controller.tsx","webpack://mattermost-webapp/./src/components/announcement_bar/index.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/errors.ts","webpack://mattermost-webapp/./src/components/announcement_bar/purchase_link/purchase_link.tsx","webpack://mattermost-webapp/./src/components/user_group_popover/constants.ts","webpack://mattermost-webapp/./src/components/user_group_popover/group_member_list/group_member_list.tsx","webpack://mattermost-webapp/./src/components/user_group_popover/group_member_list/index.ts","webpack://mattermost-webapp/./src/components/user_group_popover/user_group_popover.tsx","webpack://mattermost-webapp/./src/components/user_group_popover/user_group_popover_controller.tsx","webpack://mattermost-webapp/./src/components/user_group_popover/index.ts","webpack://mattermost-webapp/./src/components/at_mention/at_mention.tsx","webpack://mattermost-webapp/./src/components/at_mention/index.tsx","webpack://mattermost-webapp/./src/components/at_mention/actions.ts","webpack://mattermost-webapp/./src/components/autocomplete_selector.tsx","webpack://mattermost-webapp/./src/components/autosize_textarea.tsx","webpack://mattermost-webapp/./src/components/channel_invite_modal/group_option/group_option.tsx","webpack://mattermost-webapp/./src/components/channel_invite_modal/team_warning_banner/team_warning_banner.tsx","webpack://mattermost-webapp/./src/components/channel_invite_modal/channel_invite_modal.tsx","webpack://mattermost-webapp/./src/components/channel_invite_modal/index.ts","webpack://mattermost-webapp/./src/components/channel_members_dropdown/channel_members_dropdown.tsx","webpack://mattermost-webapp/./src/components/channel_members_dropdown/index.ts","webpack://mattermost-webapp/./src/components/channel_members_rhs/member.tsx","webpack://mattermost-webapp/./src/components/channel_members_rhs/member_list.tsx","webpack://mattermost-webapp/./src/components/cloud_usage_modal/index.tsx","webpack://mattermost-webapp/./src/components/cloud_usage_modal/limit_line.tsx","webpack://mattermost-webapp/./src/components/cloud_usage_modal/workspace_limits_panel.tsx","webpack://mattermost-webapp/./src/components/common/auto_height_switcher.tsx","webpack://mattermost-webapp/./src/components/common/carousel/carousel.tsx","webpack://mattermost-webapp/./src/components/common/carousel/carousel_button.tsx","webpack://mattermost-webapp/./src/components/common/chip/chip.tsx","webpack://mattermost-webapp/./src/components/common/hocs/cloud/with_get_cloud_subscription.tsx","webpack://mattermost-webapp/./src/components/common/hooks/useCWSAvailabilityCheck.ts","webpack://mattermost-webapp/./src/components/common/hooks/useDidUpdate.ts","webpack://mattermost-webapp/./src/selectors/cloud.ts","webpack://mattermost-webapp/./src/components/common/hooks/useExpandOverageUsersCheck.ts","webpack://mattermost-webapp/./src/components/common/hooks/useGetHighestThresholdCloudLimit.ts","webpack://mattermost-webapp/./src/components/common/hooks/useGetLimits.ts","webpack://mattermost-webapp/./src/components/common/hooks/useGetNotifyAdmin.ts","webpack://mattermost-webapp/./src/components/common/hooks/useGetTotalUsersNoBots.ts","webpack://mattermost-webapp/./src/components/common/hooks/useGetUsage.ts","webpack://mattermost-webapp/./src/components/common/hooks/useOpenPricingModal.ts","webpack://mattermost-webapp/./src/components/common/hooks/useOpenSalesLink.ts","webpack://mattermost-webapp/./src/components/common/hooks/useOpenStartTrialFormModal.ts","webpack://mattermost-webapp/./src/components/common/hooks/use_desktop_notification_permission.ts","webpack://mattermost-webapp/./src/components/common/svg_images_components/guest_access_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/logo_dark_blue_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/monitor_imaclike_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/success_svg.tsx","webpack://mattermost-webapp/./src/components/common/usage_percent_bar/index.tsx","webpack://mattermost-webapp/./src/components/compass_theme_provider/compass_theme_provider.tsx","webpack://mattermost-webapp/./src/components/confirm_modal_redux/confirm_modal_redux.tsx","webpack://mattermost-webapp/./src/components/confirm_modal_redux/index.ts","webpack://mattermost-webapp/./src/components/copy_button.tsx","webpack://mattermost-webapp/./src/components/create_user_groups_modal/create_user_groups_modal.tsx","webpack://mattermost-webapp/./src/components/create_user_groups_modal/index.ts","webpack://mattermost-webapp/./src/components/custom_status/custom_status_emoji.tsx","webpack://mattermost-webapp/./src/components/custom_status/custom_status_suggestion.tsx","webpack://mattermost-webapp/./src/components/custom_status/expiry_menu.tsx","webpack://mattermost-webapp/./src/components/custom_status/custom_status_modal.tsx","webpack://mattermost-webapp/./src/components/custom_status/custom_status_text.tsx","webpack://mattermost-webapp/./src/components/custom_status/date_time_input.tsx","webpack://mattermost-webapp/./src/components/custom_status/expiry_time.tsx","webpack://mattermost-webapp/./src/components/date_picker/date_picker.tsx","webpack://mattermost-webapp/./src/components/date_time_picker_modal/date_time_picker_modal.tsx","webpack://mattermost-webapp/./src/components/deferComponentRender.tsx","webpack://mattermost-webapp/./src/components/delete_post_modal/delete_post_modal.tsx","webpack://mattermost-webapp/./src/components/delete_post_modal/index.ts","webpack://mattermost-webapp/./src/components/drafts/panel/panel_header.tsx","webpack://mattermost-webapp/./src/components/dropdown_input.tsx","webpack://mattermost-webapp/./src/actions/views/textbox.js","webpack://mattermost-webapp/./src/selectors/views/textbox.ts","webpack://mattermost-webapp/./src/components/edit_channel_header_modal/edit_channel_header_modal.tsx","webpack://mattermost-webapp/./src/components/edit_channel_header_modal/index.ts","webpack://mattermost-webapp/./src/components/edit_channel_purpose_modal/edit_channel_purpose_modal.tsx","webpack://mattermost-webapp/./src/components/edit_channel_purpose_modal/index.tsx","webpack://mattermost-webapp/./src/components/emoji/render_emoji.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_category.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/types/index.ts","webpack://mattermost-webapp/./src/components/emoji_picker/constants/index.ts","webpack://mattermost-webapp/./src/components/emoji_picker/utils/index.ts","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_categories.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_category_row.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_item.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_category_or_emoji_row.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_current_results.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_custom_emoji_button.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_preview.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_search.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_skin.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/emoji_picker.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/index.ts","webpack://mattermost-webapp/./src/components/emoji_picker/components/emoji_picker_header.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/giphy_icon.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/emoji_picker_tabs.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/emoji_picker_overlay/emoji_picker_overlay.tsx","webpack://mattermost-webapp/./src/utils/position_utils.tsx","webpack://mattermost-webapp/./src/components/emoji_picker/emoji_picker_overlay/index.ts","webpack://mattermost-webapp/./src/components/external_image/is_svg_image.ts","webpack://mattermost-webapp/./src/components/external_image/external_image.tsx","webpack://mattermost-webapp/./src/components/external_image/index.ts","webpack://mattermost-webapp/./src/components/file_attachment/file_thumbnail/file_thumbnail.tsx","webpack://mattermost-webapp/./src/components/file_attachment/file_thumbnail/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/attachment_icon.tsx","webpack://mattermost-webapp/./src/components/file_attachment/filename_overlay.tsx","webpack://mattermost-webapp/./src/components/file_attachment/archived_tooltip.tsx","webpack://mattermost-webapp/./src/components/file_attachment/file_attachment.tsx","webpack://mattermost-webapp/./src/components/file_attachment/index.ts","webpack://mattermost-webapp/./src/components/single_image_view/single_image_view.tsx","webpack://mattermost-webapp/./src/components/single_image_view/index.ts","webpack://mattermost-webapp/./src/components/file_attachment_list/file_attachment_list.tsx","webpack://mattermost-webapp/./src/components/file_attachment_list/index.ts","webpack://mattermost-webapp/./src/components/file_preview/file_progress_preview.tsx","webpack://mattermost-webapp/./src/components/file_preview/file_preview.tsx","webpack://mattermost-webapp/./src/components/file_preview/index.ts","webpack://mattermost-webapp/./src/components/file_preview_modal/index.ts","webpack://mattermost-webapp/./src/components/file_upload_overlay/file_upload_overlay.tsx","webpack://mattermost-webapp/./src/components/file_upload_overlay/index.ts","webpack://mattermost-webapp/./src/components/formatted_markdown_message.tsx","webpack://mattermost-webapp/./src/components/get_link_modal.tsx","webpack://mattermost-webapp/./src/components/get_public_link_modal/get_public_link_modal.tsx","webpack://mattermost-webapp/./src/components/get_public_link_modal/index.ts","webpack://mattermost-webapp/./src/components/global_header/hooks.tsx","webpack://mattermost-webapp/./src/components/html_entities/nbsp.tsx","webpack://mattermost-webapp/./src/components/initial_loading_screen/initial_loading_screen_class.ts","webpack://mattermost-webapp/./src/components/initial_loading_screen/index.ts","webpack://mattermost-webapp/./src/components/input_error.tsx","webpack://mattermost-webapp/./src/components/widgets/settings/radio_setting.tsx","webpack://mattermost-webapp/./src/components/interactive_dialog/dialog_element/dialog_element.tsx","webpack://mattermost-webapp/./src/components/interactive_dialog/dialog_element/index.ts","webpack://mattermost-webapp/./src/components/interactive_dialog/dialog_introduction_text.tsx","webpack://mattermost-webapp/./src/components/interactive_dialog/interactive_dialog.tsx","webpack://mattermost-webapp/./src/components/interactive_dialog/index.ts","webpack://mattermost-webapp/./src/actions/invite_actions.ts","webpack://mattermost-webapp/./src/components/invitation_modal/index.tsx","webpack://mattermost-webapp/./src/components/keyboard_shortcuts/keyboard_shortcuts_modal/keyboard_shortcuts_modal.tsx","webpack://mattermost-webapp/./src/components/keyboard_shortcuts/keyboard_shortcuts_sequence/keyboard_shortcuts_sequence.tsx","webpack://mattermost-webapp/./src/components/keyboard_shortcuts/keyboard_shortcuts_sequence/keyboard_shortcuts.ts","webpack://mattermost-webapp/./src/components/keyboard_shortcuts/keyboard_shortcuts_sequence/index.ts","webpack://mattermost-webapp/./src/components/learn_more_trial_modal/start_trial_btn.tsx","webpack://mattermost-webapp/./src/components/leave_channel_modal/leave_channel_modal.tsx","webpack://mattermost-webapp/./src/components/leave_channel_modal/index.ts","webpack://mattermost-webapp/./src/components/list_modal.tsx","webpack://mattermost-webapp/./src/components/loading_image_preview.tsx","webpack://mattermost-webapp/./src/components/loading_screen.tsx","webpack://mattermost-webapp/./src/components/logged_in/logged_in.tsx","webpack://mattermost-webapp/./src/components/logged_in/index.ts","webpack://mattermost-webapp/./src/components/leave_team_modal/leave_team_modal.tsx","webpack://mattermost-webapp/./src/components/leave_team_modal/index.ts","webpack://mattermost-webapp/./src/components/team_groups_manage_modal/team_groups_manage_modal.tsx","webpack://mattermost-webapp/./src/components/team_groups_manage_modal/index.ts","webpack://mattermost-webapp/./src/components/team_members_dropdown/team_members_dropdown.tsx","webpack://mattermost-webapp/./src/components/team_members_dropdown/index.ts","webpack://mattermost-webapp/./src/components/member_list_team/member_list_team.tsx","webpack://mattermost-webapp/./src/components/member_list_team/index.ts","webpack://mattermost-webapp/./src/components/team_members_modal/team_members_modal.tsx","webpack://mattermost-webapp/./src/components/team_members_modal/index.ts","webpack://mattermost-webapp/./src/components/widgets/modals/components/save_changes_panel.tsx","webpack://mattermost-webapp/./src/components/common/select_text_input/select_text_input.tsx","webpack://mattermost-webapp/./src/components/team_settings/team_access_tab/allowed_domains_select.tsx","webpack://mattermost-webapp/./src/components/team_settings/team_access_tab/invite_section_input.tsx","webpack://mattermost-webapp/./src/components/team_settings/team_access_tab/open_invite.tsx","webpack://mattermost-webapp/./src/components/team_settings/team_access_tab/team_access_tab.tsx","webpack://mattermost-webapp/./src/components/team_settings/team_access_tab/index.ts","webpack://mattermost-webapp/./src/components/team_settings/team_info_tab/team_description_section.tsx","webpack://mattermost-webapp/./src/components/team_settings/team_info_tab/team_name_section.tsx","webpack://mattermost-webapp/./src/components/team_settings/team_info_tab/team_picture_section.tsx","webpack://mattermost-webapp/./src/components/team_settings/team_info_tab/team_info_tab.tsx","webpack://mattermost-webapp/./src/components/team_settings/team_info_tab/index.ts","webpack://mattermost-webapp/./src/components/team_settings/team_settings.tsx","webpack://mattermost-webapp/./src/components/team_settings/index.ts","webpack://mattermost-webapp/./src/components/team_settings_modal/team_settings_modal.tsx","webpack://mattermost-webapp/./src/components/team_settings_modal/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/leave_team_icon.tsx","webpack://mattermost-webapp/./src/components/main_menu/main_menu.tsx","webpack://mattermost-webapp/./src/components/main_menu/index.tsx","webpack://mattermost-webapp/./src/components/main_menu/learn_about_teams_link.tsx","webpack://mattermost-webapp/./src/components/markdown/markdown.tsx","webpack://mattermost-webapp/./src/components/markdown/index.ts","webpack://mattermost-webapp/./src/components/compass_design_provider/index.tsx","webpack://mattermost-webapp/./src/components/menu/menu_context.ts","webpack://mattermost-webapp/./src/components/menu/menu_styled.tsx","webpack://mattermost-webapp/./src/components/menu/menu.tsx","webpack://mattermost-webapp/./src/components/menu/menu_item.tsx","webpack://mattermost-webapp/./src/components/menu/sub_menu.tsx","webpack://mattermost-webapp/./src/components/menu/menu_item_separator.tsx","webpack://mattermost-webapp/./src/components/multiselect/multiselect_list.tsx","webpack://mattermost-webapp/./src/components/multiselect/multiselect.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/search_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/channel_search_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/mentons_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/saved_messages_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/pin_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/channel_files_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/user_groups_svg.tsx","webpack://mattermost-webapp/./src/components/no_results_indicator/no_results_indicator.tsx","webpack://mattermost-webapp/./src/components/no_results_indicator/types.ts","webpack://mattermost-webapp/./src/components/notify_admin_cta/notify_admin_cta.tsx","webpack://mattermost-webapp/./src/components/onboarding_tasks/constants.ts","webpack://mattermost-webapp/./src/selectors/views/onboarding_tasks.ts","webpack://mattermost-webapp/./src/components/onboarding_tasks/visit_system_console_tour_tip.tsx","webpack://mattermost-webapp/./src/components/onboarding_tasks/complete_your_profile_tour_tip.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/channels_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/gears_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/handshake_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/phone_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/security_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/sunglasses_svg.tsx","webpack://mattermost-webapp/./src/components/learn_more_trial_modal/learn_more_trial_modal_step.tsx","webpack://mattermost-webapp/./src/components/learn_more_trial_modal/learn_more_trial_modal.tsx","webpack://mattermost-webapp/./src/components/onboarding_tasks/onboarding_tasks_manager.tsx","webpack://mattermost-webapp/./src/components/onboarding_tasks/utils.ts","webpack://mattermost-webapp/./src/utils/countries.ts","webpack://mattermost-webapp/./src/components/payment_form/country_selector.tsx","webpack://mattermost-webapp/./src/components/permissions_gates/any_team_permission_gate.tsx","webpack://mattermost-webapp/./src/components/permissions_gates/channel_permission_gate.tsx","webpack://mattermost-webapp/./src/components/permissions_gates/gate.tsx","webpack://mattermost-webapp/./src/components/permissions_gates/system_permission_gate.tsx","webpack://mattermost-webapp/./src/components/permissions_gates/team_permission_gate.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/utils/marketplace.ts","webpack://mattermost-webapp/./src/selectors/views/marketplace.ts","webpack://mattermost-webapp/./src/actions/marketplace.ts","webpack://mattermost-webapp/./src/components/plugin_marketplace/marketplace_item/marketplace_item.tsx","webpack://mattermost-webapp/./src/components/plugin_marketplace/marketplace_item/marketplace_item_app/marketplace_item_app.tsx","webpack://mattermost-webapp/./src/components/plugin_marketplace/marketplace_item/marketplace_item_app/index.ts","webpack://mattermost-webapp/./src/components/plugin_marketplace/marketplace_item/marketplace_item_plugin/marketplace_item_plugin.tsx","webpack://mattermost-webapp/./src/components/plugin_marketplace/marketplace_item/marketplace_item_plugin/index.ts","webpack://mattermost-webapp/./src/components/plugin_marketplace/marketplace_list/marketplace_list.tsx","webpack://mattermost-webapp/./src/components/plugin_marketplace/web_marketplace_banner.tsx","webpack://mattermost-webapp/./src/components/plugin_marketplace/marketplace_modal.tsx","webpack://mattermost-webapp/./src/components/post/actions.ts","webpack://mattermost-webapp/./src/components/edit_post/index.ts","webpack://mattermost-webapp/./src/components/edit_post/edit_post.tsx","webpack://mattermost-webapp/./src/utils/markdown/link_only_renderer.tsx","webpack://mattermost-webapp/./src/components/post_view/message_attachments/action_button/action_button.tsx","webpack://mattermost-webapp/./src/components/post_view/message_attachments/action_button/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_context.ts","webpack://mattermost-webapp/./src/components/post_view/message_attachments/action_menu/action_menu.tsx","webpack://mattermost-webapp/./src/components/post_view/message_attachments/action_menu/index.ts","webpack://mattermost-webapp/./src/components/post_view/message_attachments/message_attachment/message_attachment.tsx","webpack://mattermost-webapp/./src/components/post_view/message_attachments/message_attachment/index.ts","webpack://mattermost-webapp/./src/components/post_view/message_attachments/message_attachment_list.tsx","webpack://mattermost-webapp/./src/components/post_view/post_image/post_image.tsx","webpack://mattermost-webapp/./src/components/post_view/post_image/index.ts","webpack://mattermost-webapp/./src/utils/youtube.ts","webpack://mattermost-webapp/./src/components/youtube_video/youtube_video.tsx","webpack://mattermost-webapp/./src/components/youtube_video/index.ts","webpack://mattermost-webapp/./src/components/post_view/embedded_bindings/button_binding/button_binding.tsx","webpack://mattermost-webapp/./src/components/post_view/embedded_bindings/button_binding/index.ts","webpack://mattermost-webapp/./src/components/post_view/embedded_bindings/select_binding/select_binding.tsx","webpack://mattermost-webapp/./src/components/post_view/embedded_bindings/select_binding/index.ts","webpack://mattermost-webapp/./src/components/post_view/embedded_bindings/embedded_binding/embedded_binding.tsx","webpack://mattermost-webapp/./src/components/post_view/embedded_bindings/embedded_binding/index.ts","webpack://mattermost-webapp/./src/components/post_view/embedded_bindings/embedded_bindings.tsx","webpack://mattermost-webapp/./src/components/post_view/post_body_additional_content/post_body_additional_content.tsx","webpack://mattermost-webapp/./src/components/post_view/post_body_additional_content/index.ts","webpack://mattermost-webapp/./src/components/message_with_additional_content.tsx","webpack://mattermost-webapp/./src/components/post_view/acknowledgements/post_acknowledgements_users_popover.tsx","webpack://mattermost-webapp/./src/components/post_view/acknowledgements/post_acknowledgements.tsx","webpack://mattermost-webapp/./src/components/post_view/acknowledgements/index.ts","webpack://mattermost-webapp/./src/components/post_view/commented_on_files_message/commented_on_files_message.tsx","webpack://mattermost-webapp/./src/components/post_view/commented_on_files_message/index.ts","webpack://mattermost-webapp/./src/components/post_view/commented_on/commented_on.tsx","webpack://mattermost-webapp/./src/components/post_view/failed_post_options/failed_post_options.tsx","webpack://mattermost-webapp/./src/components/post_view/failed_post_options/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/flag_icon_filled.tsx","webpack://mattermost-webapp/./src/components/post_view/post_pre_header/post_pre_header.tsx","webpack://mattermost-webapp/./src/components/post_view/post_pre_header/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_time/post_time.tsx","webpack://mattermost-webapp/./src/components/post_view/post_time/index.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/reactions.ts","webpack://mattermost-webapp/./src/components/post_view/reaction/reaction_tooltip/reaction_tooltip.tsx","webpack://mattermost-webapp/./src/components/post_view/reaction/reaction_tooltip/index.ts","webpack://mattermost-webapp/./src/components/post_view/reaction/reaction.tsx","webpack://mattermost-webapp/./src/components/post_view/reaction/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/add_reaction_icon.tsx","webpack://mattermost-webapp/./src/components/post_view/reaction_list/reaction_list.tsx","webpack://mattermost-webapp/./src/components/post_view/reaction_list/index.ts","webpack://mattermost-webapp/./src/components/threading/channel_threads/thread_footer/thread_footer.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/info_small_icon.tsx","webpack://mattermost-webapp/./src/components/actions_menu/actions_menu_icon.tsx","webpack://mattermost-webapp/./src/components/actions_menu/actions_menu.tsx","webpack://mattermost-webapp/./src/components/actions_menu/index.ts","webpack://mattermost-webapp/./src/components/actions_menu/selectors.ts","webpack://mattermost-webapp/./src/components/widgets/icons/reply_icon.tsx","webpack://mattermost-webapp/./src/components/common/comment_icon.tsx","webpack://mattermost-webapp/./src/components/notification_box/notification_box.tsx","webpack://mattermost-webapp/./src/components/forward_post_modal/forward_post_channel_select_styles.tsx","webpack://mattermost-webapp/./src/components/forward_post_modal/forward_post_channel_select.tsx","webpack://mattermost-webapp/./src/components/forward_post_modal/forward_post_comment_input.tsx","webpack://mattermost-webapp/./src/components/forward_post_modal/index.tsx","webpack://mattermost-webapp/./src/components/move_thread_modal/move_thread_modal.tsx","webpack://mattermost-webapp/./src/components/move_thread_modal/index.ts","webpack://mattermost-webapp/./src/components/post_reminder_custom_time_picker_modal/index.ts","webpack://mattermost-webapp/./src/components/dot_menu/post_reminder_submenu.tsx","webpack://mattermost-webapp/./src/components/dot_menu/utils.tsx","webpack://mattermost-webapp/./src/components/dot_menu/dot_menu.tsx","webpack://mattermost-webapp/./src/components/dot_menu/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_flag_icon/post_flag_icon.tsx","webpack://mattermost-webapp/./src/components/post_view/post_flag_icon/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_reaction/post_reaction.tsx","webpack://mattermost-webapp/./src/components/post_view/post_reaction/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_recent_reactions/recent_reactions_emoji_item.tsx","webpack://mattermost-webapp/./src/components/post_view/post_recent_reactions/post_recent_reactions.tsx","webpack://mattermost-webapp/./src/components/post_view/post_recent_reactions/index.ts","webpack://mattermost-webapp/./src/components/post/post_options.tsx","webpack://mattermost-webapp/./src/components/post_view/post_header_custom_status/post_header_custom_status.tsx","webpack://mattermost-webapp/./src/components/post/user_profile.tsx","webpack://mattermost-webapp/./src/components/post/index.tsx","webpack://mattermost-webapp/./src/components/post/post_component.tsx","webpack://mattermost-webapp/./src/components/post_view/combined_system_message/last_users.tsx","webpack://mattermost-webapp/./src/components/post_view/combined_system_message/combined_system_message.tsx","webpack://mattermost-webapp/./src/components/post_view/combined_system_message/index.ts","webpack://mattermost-webapp/./src/components/post_view/gm_conversion_message/gm_conversion_message.tsx","webpack://mattermost-webapp/./src/components/post_view/post_add_channel_member/post_add_channel_member.tsx","webpack://mattermost-webapp/./src/components/post_view/post_add_channel_member/index.ts","webpack://mattermost-webapp/./src/components/post_markdown/system_message_helpers.tsx","webpack://mattermost-webapp/./src/components/post_markdown/post_markdown.tsx","webpack://mattermost-webapp/./src/components/post_markdown/index.ts","webpack://mattermost-webapp/./src/components/post_priority/error_messages.tsx","webpack://mattermost-webapp/./src/components/post_priority/post_priority_label.tsx","webpack://mattermost-webapp/./src/components/post_profile_picture/post_profile_picture.tsx","webpack://mattermost-webapp/./src/components/post_profile_picture/index.ts","webpack://mattermost-webapp/./src/components/post_view/combined_user_activity_post/index.ts","webpack://mattermost-webapp/./src/components/post_view/date_separator/date_separator.tsx","webpack://mattermost-webapp/./src/components/post_view/floating_timestamp/floating_timestamp.tsx","webpack://mattermost-webapp/./src/components/post_view/floating_timestamp/index.ts","webpack://mattermost-webapp/./src/components/widgets/separator/notification-separator.tsx","webpack://mattermost-webapp/./src/components/post_view/new_message_separator/new_message_separator.tsx","webpack://mattermost-webapp/./src/components/post_view/post_aria_label_div.tsx","webpack://mattermost-webapp/./src/components/post_view/post_attachment_opengraph/get_nearest_point.ts","webpack://mattermost-webapp/./src/components/post_view/post_attachment_opengraph/post_attachment_opengraph.tsx","webpack://mattermost-webapp/./src/components/post_view/post_attachment_opengraph/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_edited_indicator/post_edited_indicator.tsx","webpack://mattermost-webapp/./src/components/post_view/post_edited_indicator/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_attachment_container/post_attachment_container.tsx","webpack://mattermost-webapp/./src/components/post_view/post_message_preview/post_message_preview.tsx","webpack://mattermost-webapp/./src/components/post_view/post_message_preview/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_message_view/post_message_view.tsx","webpack://mattermost-webapp/./src/components/post_view/post_message_view/index.ts","webpack://mattermost-webapp/./src/components/post_view/show_more/show_more.tsx","webpack://mattermost-webapp/./src/components/post_view/show_more/index.ts","webpack://mattermost-webapp/./src/components/preparing_workspace/description.tsx","webpack://mattermost-webapp/./src/components/preparing_workspace/launching_workspace.tsx","webpack://mattermost-webapp/./src/components/preparing_workspace/steps.ts","webpack://mattermost-webapp/./src/components/preparing_workspace/title.tsx","webpack://mattermost-webapp/./src/components/common/plan_label/index.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/check_mark_icon.tsx","webpack://mattermost-webapp/./src/components/pricing_modal/blank_card_image.svg.tsx","webpack://mattermost-webapp/./src/components/pricing_modal/building.svg.tsx","webpack://mattermost-webapp/./src/components/pricing_modal/tada.svg.tsx","webpack://mattermost-webapp/./src/components/pricing_modal/card.tsx","webpack://mattermost-webapp/./src/components/pricing_modal/content.tsx","webpack://mattermost-webapp/./src/components/pricing_modal/contact_sales_cta.tsx","webpack://mattermost-webapp/./src/components/pricing_modal/start_trial_caution.tsx","webpack://mattermost-webapp/./src/components/pricing_modal/self_hosted_content.tsx","webpack://mattermost-webapp/./src/components/common/hooks/useFetchAdminConfig.ts","webpack://mattermost-webapp/./src/components/pricing_modal/index.tsx","webpack://mattermost-webapp/./src/components/status_icon_new.tsx","webpack://mattermost-webapp/./src/components/profile_picture/index.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_avatar.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_custom_attributes.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_custom_status.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_email.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_last_active.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_bot_description.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_full_name.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_position.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_user_name.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_name.tsx","webpack://mattermost-webapp/./src/components/suggestion/search_channel_with_permissions_provider.tsx","webpack://mattermost-webapp/./src/components/add_user_to_channel_modal/add_user_to_channel_modal.tsx","webpack://mattermost-webapp/./src/components/add_user_to_channel_modal/index.ts","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_add_to_channel.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_calls_button/profile_popover_call_button.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_calls_button/index.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_call_button_wrapper/index.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_other_user_row.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_override_disclaimer.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_self_user_row.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_timezone.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_title.tsx","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover.tsx","webpack://mattermost-webapp/./src/actions/views/profile_popover.ts","webpack://mattermost-webapp/./src/components/profile_popover/profile_popover_controller.tsx","webpack://mattermost-webapp/./src/components/profile_popover/index.ts","webpack://mattermost-webapp/./src/components/quick_input/max_length_input.tsx","webpack://mattermost-webapp/./src/components/quick_input/quick_input.tsx","webpack://mattermost-webapp/./src/components/reset_status_modal/reset_status_modal.tsx","webpack://mattermost-webapp/./src/components/reset_status_modal/index.ts","webpack://mattermost-webapp/./src/plugins/products.ts","webpack://mattermost-webapp/./src/components/root/actions/index.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/client/rudder.ts","webpack://mattermost-webapp/./src/components/new_search/extension_suggestions.tsx","webpack://mattermost-webapp/./src/components/new_search/extension_suggestions_provider.tsx","webpack://mattermost-webapp/./src/components/new_search/search_hint.tsx","webpack://mattermost-webapp/./src/components/new_search/search_box_hints.tsx","webpack://mattermost-webapp/./src/components/new_search/search_box_input.tsx","webpack://mattermost-webapp/./src/components/new_search/search_box_suggestions.tsx","webpack://mattermost-webapp/./src/components/new_search/search_box_type_selector.tsx","webpack://mattermost-webapp/./src/components/new_search/search_box.tsx","webpack://mattermost-webapp/./src/components/new_search/hooks.tsx","webpack://mattermost-webapp/./src/components/new_search/new_search.tsx","webpack://mattermost-webapp/./src/components/global_header/center_controls/global_search_nav/global_search_nav.tsx","webpack://mattermost-webapp/./src/components/global_header/center_controls/user_guide_dropdown/user_guide_dropdown.tsx","webpack://mattermost-webapp/./src/components/global_header/center_controls/user_guide_dropdown/index.ts","webpack://mattermost-webapp/./src/components/global_header/center_controls/center_controls.tsx","webpack://mattermost-webapp/./src/components/global_header/left_controls/history_buttons/history_buttons.tsx","webpack://mattermost-webapp/./src/components/global_header/left_controls/history_buttons/index.ts","webpack://mattermost-webapp/./src/selectors/views/product_menu.ts","webpack://mattermost-webapp/./src/components/global_header/left_controls/product_menu/product_branding/product_branding.tsx","webpack://mattermost-webapp/./src/components/global_header/left_controls/product_menu/product_branding_team_edition/product_branding_team_edition.tsx","webpack://mattermost-webapp/./src/components/global_header/left_controls/product_menu/product_menu_item/product_menu_item.tsx","webpack://mattermost-webapp/./src/components/global_header/left_controls/product_menu/product_menu_list/product_menu_list.tsx","webpack://mattermost-webapp/./src/components/global_header/left_controls/product_menu/product_menu_list/index.ts","webpack://mattermost-webapp/./src/components/global_header/left_controls/product_menu/product_menu.tsx","webpack://mattermost-webapp/./src/components/global_header/left_controls/left_controls.tsx","webpack://mattermost-webapp/./src/selectors/views/status_dropdown.ts","webpack://mattermost-webapp/./src/components/dnd_custom_time_picker_modal/index.ts","webpack://mattermost-webapp/./src/components/status_dropdown/status_dropdown.tsx","webpack://mattermost-webapp/./src/components/status_dropdown/index.ts","webpack://mattermost-webapp/./src/components/global_header/right_controls/at_mentions_button/at_mentions_button.tsx","webpack://mattermost-webapp/./src/components/global_header/right_controls/plan_upgrade_button/index.tsx","webpack://mattermost-webapp/./src/components/global_header/right_controls/saved_posts_button/saved_posts_button.tsx","webpack://mattermost-webapp/./src/components/global_header/right_controls/settings_button/settings_button.tsx","webpack://mattermost-webapp/./src/components/global_header/right_controls/settings_button/index.ts","webpack://mattermost-webapp/./src/components/global_header/right_controls/right_controls.tsx","webpack://mattermost-webapp/./src/components/global_header/global_header.tsx","webpack://mattermost-webapp/./src/components/header_footer_route/header_footer_route.tsx","webpack://mattermost-webapp/./src/components/header_footer_template_route.tsx","webpack://mattermost-webapp/./src/components/logged_in_route/index.tsx","webpack://mattermost-webapp/./src/components/sidebar_mobile_right_menu/constant.ts","webpack://mattermost-webapp/./src/components/sidebar_mobile_right_menu/sidebar_mobile_right_menu.tsx","webpack://mattermost-webapp/./src/components/sidebar_mobile_right_menu/index.ts","webpack://mattermost-webapp/./src/components/root/luxon_controller.tsx","webpack://mattermost-webapp/./src/utils/performance_telemetry/element_identification.ts","webpack://mattermost-webapp/./src/utils/performance_telemetry/reporter.ts","webpack://mattermost-webapp/./src/utils/performance_telemetry/platform_detection.ts","webpack://mattermost-webapp/./src/components/root/performance_reporter_controller.tsx","webpack://mattermost-webapp/./src/components/intl_provider/intl_provider.tsx","webpack://mattermost-webapp/./src/components/intl_provider/index.tsx","webpack://mattermost-webapp/./src/components/root/root_provider.tsx","webpack://mattermost-webapp/./src/components/root/root_redirect/root_redirect.tsx","webpack://mattermost-webapp/./src/components/root/root_redirect/index.ts","webpack://mattermost-webapp/./src/components/member_list_channel/member_list_channel.tsx","webpack://mattermost-webapp/./src/components/member_list_channel/index.ts","webpack://mattermost-webapp/./src/components/channel_members_modal/channel_members_modal.tsx","webpack://mattermost-webapp/./src/components/channel_members_modal/index.ts","webpack://mattermost-webapp/./src/plugins/interactive_dialog.ts","webpack://mattermost-webapp/./src/plugins/textbox/index.tsx","webpack://mattermost-webapp/./src/plugins/export.ts","webpack://mattermost-webapp/./src/components/root/root.tsx","webpack://mattermost-webapp/./src/components/root/index.ts","webpack://mattermost-webapp/./src/components/save_button.tsx","webpack://mattermost-webapp/./src/components/user_list_row/user_list_row.tsx","webpack://mattermost-webapp/./src/components/user_list_row/index.ts","webpack://mattermost-webapp/./src/components/user_list.tsx","webpack://mattermost-webapp/./src/components/searchable_user_list/searchable_user_list.tsx","webpack://mattermost-webapp/./src/components/searchable_user_list/searchable_user_list_container.tsx","webpack://mattermost-webapp/./src/components/section_notice/section_notice_button.tsx","webpack://mattermost-webapp/./src/components/section_notice/index.tsx","webpack://mattermost-webapp/./src/components/shared_channel_indicator.tsx","webpack://mattermost-webapp/./src/components/shared_user_indicator.tsx","webpack://mattermost-webapp/./src/components/shortcut_key/shortcut_key.tsx","webpack://mattermost-webapp/./src/components/size_aware_image.tsx","webpack://mattermost-webapp/./src/components/spinner_button.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/airgapped_trial_activation_confirm_svg.tsx","webpack://mattermost-webapp/./src/components/start_trial_form_modal/air_gapped_modal.tsx","webpack://mattermost-webapp/./src/components/purchase_modal/icon_message.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/back_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/modals/full_screen_modal.tsx","webpack://mattermost-webapp/./src/components/admin_console/billing/delete_workspace/result_modal.tsx","webpack://mattermost-webapp/./src/components/common/hooks/useOpenZendeskForm.ts","webpack://mattermost-webapp/./src/components/common/svg_images_components/laptop_with_warning_symbol_svg.tsx","webpack://mattermost-webapp/./src/components/start_trial_form_modal/failure_modal.tsx","webpack://mattermost-webapp/./src/components/start_trial_form_modal/index.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/status_away_avatar_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/status_away_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/status_dnd_avatar_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/status_dnd_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/status_offline_avatar_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/status_offline_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/status_online_avatar_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/status_online_icon.tsx","webpack://mattermost-webapp/./src/components/status_icon.tsx","webpack://mattermost-webapp/./src/components/suggestion/command_provider/app_command_parser/app_command_parser.ts","webpack://mattermost-webapp/./src/components/suggestion/command_provider/mentions/index.ts","webpack://mattermost-webapp/./src/components/suggestion/command_provider/app_command_parser/app_command_parser_dependencies.ts","webpack://mattermost-webapp/./src/components/suggestion/generic_channel_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/generic_user_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/menu_action_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/modal_suggestion_list.tsx","webpack://mattermost-webapp/./src/components/suggestion/provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/search_channel_suggestion/search_channel_suggestion.tsx","webpack://mattermost-webapp/./src/components/suggestion/search_channel_suggestion/index.ts","webpack://mattermost-webapp/./src/components/suggestion/search_channel_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/search_date_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/search_date_suggestion/search_date_suggestion.tsx","webpack://mattermost-webapp/./src/components/suggestion/search_date_suggestion/index.ts","webpack://mattermost-webapp/./src/components/suggestion/search_user_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/suggestion.tsx","webpack://mattermost-webapp/./src/components/suggestion/suggestion_box/suggestion_box.jsx","webpack://mattermost-webapp/./src/components/suggestion/suggestion_box/index.js","webpack://mattermost-webapp/./src/components/suggestion/suggestion_list.tsx","webpack://mattermost-webapp/./src/components/suggestion/switch_channel_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/at_mention_provider/at_mention_suggestion.tsx","webpack://mattermost-webapp/./src/components/suggestion/at_mention_provider/at_mention_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/at_mention_provider/index.ts","webpack://mattermost-webapp/./src/components/suggestion/channel_mention_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/command_provider/command_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/command_provider/app_provider.tsx","webpack://mattermost-webapp/./src/components/suggestion/emoticon_provider.tsx","webpack://mattermost-webapp/./src/components/textbox/textbox.tsx","webpack://mattermost-webapp/./src/components/textbox/textbox_links.tsx","webpack://mattermost-webapp/./src/components/textbox/index.ts","webpack://mattermost-webapp/./src/components/threading/common/button/button.tsx","webpack://mattermost-webapp/./src/components/threading/common/follow_button/follow_button.tsx","webpack://mattermost-webapp/./src/components/threading/common/options.ts","webpack://mattermost-webapp/./src/components/new_replies_banner/new_replies_banner.tsx","webpack://mattermost-webapp/./src/components/new_replies_banner/index.ts","webpack://mattermost-webapp/./src/components/advanced_create_comment/advanced_create_comment.tsx","webpack://mattermost-webapp/./src/components/advanced_create_comment/index.ts","webpack://mattermost-webapp/./src/components/threading/virtualized_thread_viewer/create_comment.tsx","webpack://mattermost-webapp/./src/components/root_post_divider/root_post_divider.tsx","webpack://mattermost-webapp/./src/components/threading/virtualized_thread_viewer/reply/reply.tsx","webpack://mattermost-webapp/./src/components/threading/virtualized_thread_viewer/reply/index.ts","webpack://mattermost-webapp/./src/components/threading/virtualized_thread_viewer/thread_viewer_row.tsx","webpack://mattermost-webapp/./src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx","webpack://mattermost-webapp/./src/components/threading/virtualized_thread_viewer/index.ts","webpack://mattermost-webapp/./src/components/threading/thread_viewer/thread_viewer.tsx","webpack://mattermost-webapp/./src/components/threading/thread_viewer/index.ts","webpack://mattermost-webapp/./src/components/timestamp/relative_ranges.tsx","webpack://mattermost-webapp/./src/utils/resolvable.ts","webpack://mattermost-webapp/./src/components/timestamp/semantic_time.tsx","webpack://mattermost-webapp/./src/components/timestamp/timestamp.tsx","webpack://mattermost-webapp/./src/components/timestamp/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/unread_above_icon.tsx","webpack://mattermost-webapp/./src/components/toast/toast.tsx","webpack://mattermost-webapp/./src/components/toggle.tsx","webpack://mattermost-webapp/./src/components/toggle_modal_button.tsx","webpack://mattermost-webapp/./src/components/tours/constant.ts","webpack://mattermost-webapp/./src/components/tours/utils.ts","webpack://mattermost-webapp/./src/components/tours/channels_tour_tip.tsx","webpack://mattermost-webapp/./src/components/tours/tour_manager.tsx","webpack://mattermost-webapp/./src/components/tours/hooks.ts","webpack://mattermost-webapp/./src/components/tours/onboarding_tour/hooks.ts","webpack://mattermost-webapp/./src/components/tours/onboarding_tour/onboarding_tour_tip.tsx","webpack://mattermost-webapp/./src/components/tours/onboarding_tour/create_and_join_channels_tour_tip.tsx","webpack://mattermost-webapp/./src/components/tours/onboarding_tour/invite_people_tour_tip.tsx","webpack://mattermost-webapp/./src/components/tours/onboarding_tour/channels_and_direct_messages_tour_tip.tsx","webpack://mattermost-webapp/./src/components/tours/onboarding_tour/customize_your_experience_tour_tip.tsx","webpack://mattermost-webapp/./src/components/advanced_create_post/prewritten_chips.tsx","webpack://mattermost-webapp/./src/components/tours/onboarding_tour/send_message_tour_tip.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/person_with_checklist.tsx","webpack://mattermost-webapp/./src/components/trial_benefits_modal/trial_benefits_modal_step.tsx","webpack://mattermost-webapp/./src/components/trial_benefits_modal/trial_benefits_modal.tsx","webpack://mattermost-webapp/./src/components/common/hooks/useOpenInvitePeopleModal.ts","webpack://mattermost-webapp/./src/components/trial_benefits_modal/trial_benefits_modal_step_more.tsx","webpack://mattermost-webapp/./src/components/user_groups_modal/ad_ldap_upsell_banner.tsx","webpack://mattermost-webapp/./src/components/user_groups_modal/user_groups_filter/user_groups_filter.tsx","webpack://mattermost-webapp/./src/components/user_groups_modal/user_groups_list/user_groups_list.tsx","webpack://mattermost-webapp/./src/components/user_groups_modal/user_groups_list/index.ts","webpack://mattermost-webapp/./src/components/user_groups_modal/user_groups_modal_header/user_groups_modal_header.tsx","webpack://mattermost-webapp/./src/components/user_groups_modal/user_groups_modal_header/index.ts","webpack://mattermost-webapp/./src/components/user_groups_modal/user_groups_modal.tsx","webpack://mattermost-webapp/./src/components/user_groups_modal/hooks.ts","webpack://mattermost-webapp/./src/components/user_groups_modal/index.ts","webpack://mattermost-webapp/./src/components/user_profile/utils.ts","webpack://mattermost-webapp/./src/components/user_profile/index.ts","webpack://mattermost-webapp/./src/components/user_profile/user_profile.tsx","webpack://mattermost-webapp/./src/components/user_settings/modal/index.ts","webpack://mattermost-webapp/./src/components/view_user_group_modal/view_user_group_list_item/view_user_group_list_item.tsx","webpack://mattermost-webapp/./src/components/view_user_group_modal/view_user_group_list_item/index.ts","webpack://mattermost-webapp/./src/components/add_users_to_group_modal/add_users_to_group_modal.tsx","webpack://mattermost-webapp/./src/components/add_users_to_group_modal/index.ts","webpack://mattermost-webapp/./src/components/update_user_group_modal/update_user_group_modal.tsx","webpack://mattermost-webapp/./src/components/update_user_group_modal/index.ts","webpack://mattermost-webapp/./src/components/view_user_group_modal/view_user_group_header_sub_menu/view_user_group_header_sub_menu.tsx","webpack://mattermost-webapp/./src/components/view_user_group_modal/view_user_group_header_sub_menu/index.ts","webpack://mattermost-webapp/./src/components/view_user_group_modal/view_user_group_modal_header/view_user_group_modal_header.tsx","webpack://mattermost-webapp/./src/components/view_user_group_modal/view_user_group_modal_header/index.ts","webpack://mattermost-webapp/./src/components/view_user_group_modal/view_user_group_modal.tsx","webpack://mattermost-webapp/./src/components/view_user_group_modal/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/archive_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/close_circle_solid_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/close_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/emoji_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_dropdown_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_edit_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_success_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/flag_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/mattermost_logo.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/plugin_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/unread_below_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/inputs/input/input.tsx","webpack://mattermost-webapp/./src/components/widgets/loading/loading_spinner.tsx","webpack://mattermost-webapp/./src/components/widgets/loading/loading_wrapper.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/is_mobile_view_hack.ts","webpack://mattermost-webapp/./src/components/widgets/menu/menu_header.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/menu_cloud_trial.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/menu_item_action.tsx","webpack://mattermost-webapp/./src/components/cloud_usage_modal/lhs_nearing_limit_modal.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/menu_item_cloud_limit.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/useWords.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/menu_item_external_link.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/menu_item_link.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/menu_item_toggle_modal_redux.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/menu_start_trial.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/submenu_item.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_group.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/menu_item.tsx","webpack://mattermost-webapp/./src/components/feature_restricted_modal/feature_restricted_modal.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_items/restricted_indicator.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_wrapper_animation.tsx","webpack://mattermost-webapp/./src/components/widgets/menu/menu_wrapper.tsx","webpack://mattermost-webapp/./src/components/widgets/modals/components/base_setting_item.tsx","webpack://mattermost-webapp/./src/components/widgets/modals/components/checkbox_setting_item.tsx","webpack://mattermost-webapp/./src/components/widgets/modals/components/modal_section.tsx","webpack://mattermost-webapp/./src/components/widgets/popover/index.tsx","webpack://mattermost-webapp/./src/components/widgets/separator/basic-separator.tsx","webpack://mattermost-webapp/./src/components/widgets/settings/bool_setting.tsx","webpack://mattermost-webapp/./src/components/widgets/settings/setting.tsx","webpack://mattermost-webapp/./src/components/widgets/settings/text_setting.tsx","webpack://mattermost-webapp/./src/components/widgets/tag/bot_tag.tsx","webpack://mattermost-webapp/./src/components/widgets/tag/guest_tag.tsx","webpack://mattermost-webapp/./src/components/widgets/tag/tag.tsx","webpack://mattermost-webapp/./src/components/widgets/users/avatar/avatar.tsx","webpack://mattermost-webapp/./src/components/widgets/users/avatars/avatars.tsx","webpack://mattermost-webapp/./src/components/with_tooltip/tooltip_content.tsx","webpack://mattermost-webapp/./src/components/with_tooltip/index.tsx","webpack://mattermost-webapp/./src/components/with_tooltip/tooltip_shortcut.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/admin.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/apps.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/cloud.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/integrations.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/jobs.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/timezone.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/constants/telemetry.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/apps.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/cloud.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/scheduled_posts.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/usage.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/utils.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/utils/integration_utils.ts","webpack://mattermost-webapp/./src/plugins/actions.ts","webpack://mattermost-webapp/./src/plugins/index.ts","webpack://mattermost-webapp/./src/plugins/pluggable/error_boundary.tsx","webpack://mattermost-webapp/./src/plugins/pluggable/pluggable.tsx","webpack://mattermost-webapp/./src/plugins/pluggable/index.ts","webpack://mattermost-webapp/./src/utils/func.ts","webpack://mattermost-webapp/./src/plugins/registry.ts","webpack://mattermost-webapp/./src/selectors/calls.ts","webpack://mattermost-webapp/./src/selectors/local_storage.ts","webpack://mattermost-webapp/./src/selectors/onboarding.ts","webpack://mattermost-webapp/./src/selectors/plugins.ts","webpack://mattermost-webapp/./src/selectors/products.ts","webpack://mattermost-webapp/./src/selectors/views/admin.ts","webpack://mattermost-webapp/./src/selectors/views/channel.ts","webpack://mattermost-webapp/./src/selectors/views/modals.ts","webpack://mattermost-webapp/./src/selectors/views/websocket.ts","webpack://mattermost-webapp/./src/stores/browser_store.tsx","webpack://mattermost-webapp/./src/types/store/draft.ts","webpack://mattermost-webapp/./src/types/store/lhs.ts","webpack://mattermost-webapp/./src/utils/a11y_controller.ts","webpack://mattermost-webapp/./src/utils/a11y_controller_instance.ts","webpack://mattermost-webapp/./src/utils/apps.ts","webpack://mattermost-webapp/./src/utils/cloud_utils.ts","webpack://mattermost-webapp/./src/utils/contact_support_sales.ts","webpack://mattermost-webapp/./src/utils/datetime.ts","webpack://mattermost-webapp/./src/utils/delayed_action.tsx","webpack://mattermost-webapp/./src/utils/file_utils.tsx","webpack://mattermost-webapp/./src/utils/i18n.tsx","webpack://mattermost-webapp/./src/utils/license_utils.ts","webpack://mattermost-webapp/./src/utils/limits.tsx","webpack://mattermost-webapp/./src/utils/markdown/apply_markdown.ts","webpack://mattermost-webapp/./src/components/at_plan_mention/index.tsx","webpack://mattermost-webapp/./src/components/at_sum_members_mention/notification_from_members_modal.tsx","webpack://mattermost-webapp/./src/utils/notify_admin_utils.ts","webpack://mattermost-webapp/./src/components/at_sum_members_mention/index.tsx","webpack://mattermost-webapp/./src/components/code_block/code_block.tsx","webpack://mattermost-webapp/./src/components/latex_block/latex_block.tsx","webpack://mattermost-webapp/./src/components/latex_block/index.ts","webpack://mattermost-webapp/./src/components/latex_inline/latex_inline.tsx","webpack://mattermost-webapp/./src/components/latex_inline/index.ts","webpack://mattermost-webapp/./src/components/markdown_image_expand/markdown_image_expand.tsx","webpack://mattermost-webapp/./src/components/markdown_image_expand/index.ts","webpack://mattermost-webapp/./src/components/markdown_image/markdown_image.tsx","webpack://mattermost-webapp/./src/components/markdown_image/index.ts","webpack://mattermost-webapp/./src/components/plugin_link_tooltip/index.tsx","webpack://mattermost-webapp/./src/components/post_emoji/post_emoji.tsx","webpack://mattermost-webapp/./src/components/post_emoji/index.tsx","webpack://mattermost-webapp/./src/utils/message_html_to_component.tsx","webpack://mattermost-webapp/./src/utils/overage_team.ts","webpack://mattermost-webapp/./src/utils/exec_commands.ts","webpack://mattermost-webapp/./src/utils/turndown.ts","webpack://mattermost-webapp/./src/utils/paste.tsx","webpack://mattermost-webapp/./src/utils/path.ts","webpack://mattermost-webapp/./src/utils/products.ts","webpack://mattermost-webapp/./src/utils/route.tsx","webpack://mattermost-webapp/./src/utils/subscription.ts","webpack://mattermost-webapp/./src/utils/syntax_highlighting.tsx","webpack://mattermost-webapp/./src/utils/team_utils.tsx","webpack://mattermost-webapp/./src/utils/use_websocket/context.ts","webpack://mattermost-webapp/./src/utils/use_websocket/hooks.ts","webpack://mattermost-webapp/../platform/types/lib/apps.js","webpack://mattermost-webapp/../platform/types/lib/products.js","webpack://mattermost-webapp/../platform/types/lib/schedule_post.js"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as AdminActions from 'mattermost-redux/actions/admin';\nimport {bindClientFunc} from 'mattermost-redux/actions/helpers';\nimport {createJob} from 'mattermost-redux/actions/jobs';\nimport * as TeamActions from 'mattermost-redux/actions/teams';\nimport * as UserActions from 'mattermost-redux/actions/users';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {emitUserLoggedOutEvent} from 'actions/global_actions';\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport {getOnNavigationConfirmed} from 'selectors/views/admin';\nimport store from 'stores/redux_store';\n\nimport {ActionTypes, JobTypes} from 'utils/constants';\n\nconst dispatch = store.dispatch;\n\nexport async function reloadConfig(success, error) {\n const {data, error: err} = await dispatch(AdminActions.reloadConfig());\n if (data && success) {\n dispatch(AdminActions.getConfig());\n dispatch(AdminActions.getEnvironmentConfig());\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function adminResetMfa(userId, success, error) {\n const {data, error: err} = await dispatch(UserActions.updateUserMfa(userId, false));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function getClusterStatus(success, error) {\n const {data, error: err} = await dispatch(AdminActions.getClusterStatus());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function ldapTest(success, error) {\n const {data, error: err} = await dispatch(AdminActions.testLdap());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function invalidateAllCaches(success, error) {\n const {data, error: err} = await dispatch(AdminActions.invalidateCaches());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function recycleDatabaseConnection(success, error) {\n const {data, error: err} = await dispatch(AdminActions.recycleDatabase());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function adminResetEmail(user, success, error) {\n const {data, error: err} = await dispatch(UserActions.patchUser(user));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function samlCertificateStatus(success, error) {\n const {data, error: err} = await dispatch(AdminActions.getSamlCertificateStatus());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function getIPFilters(success, error) {\n const {data, error: err} = await dispatch(AdminActions.getIPFilters());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error(err);\n }\n}\n\nexport async function getCurrentIP(success, error) {\n const {data, error: err} = await dispatch(AdminActions.getCurrentIP());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error(err);\n }\n}\n\nexport async function applyIPFilters(ipList, success, error) {\n const {data, error: err} = await dispatch(AdminActions.applyIPFilters(ipList));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error(err);\n }\n}\n\n/**\n * @param {string | null} clientId\n * @returns {ActionResult<OAuthApp>}\n */\nexport function getOAuthAppInfo(clientId) {\n return bindClientFunc({\n clientFunc: Client4.getOAuthAppInfo,\n params: [clientId],\n });\n}\n\n/**\n * @param {*}\n * @returns {ActionResult<{redirect: string}>}\n */\nexport function allowOAuth2({responseType, clientId, redirectUri, state, scope}) {\n return bindClientFunc({\n clientFunc: Client4.authorizeOAuthApp,\n params: [responseType, clientId, redirectUri, state, scope],\n });\n}\n\nexport async function emailToLdap(loginId, password, token, ldapId, ldapPassword, success, error) {\n const {data, error: err} = await dispatch(UserActions.switchEmailToLdap(loginId, password, ldapId, ldapPassword, token));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function emailToOAuth(loginId, password, token, newType, success, error) {\n const {data, error: err} = await dispatch(UserActions.switchEmailToOAuth(newType, loginId, password, token));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function oauthToEmail(currentService, email, password, success, error) {\n const {data, error: err} = await dispatch(UserActions.switchOAuthToEmail(currentService, email, password));\n if (data) {\n if (data.follow_link) {\n emitUserLoggedOutEvent(data.follow_link);\n }\n if (success) {\n success(data);\n }\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function uploadBrandImage(brandImage, success, error) {\n const {data, error: err} = await dispatch(AdminActions.uploadBrandImage(brandImage));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function deleteBrandImage(success, error) {\n const {data, error: err} = await dispatch(AdminActions.deleteBrandImage());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function uploadPublicSamlCertificate(file, success, error) {\n const {data, error: err} = await dispatch(AdminActions.uploadPublicSamlCertificate(file));\n if (data && success) {\n success('saml-public.crt');\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function uploadPrivateSamlCertificate(file, success, error) {\n const {data, error: err} = await dispatch(AdminActions.uploadPrivateSamlCertificate(file));\n if (data && success) {\n success('saml-private.key');\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function uploadPublicLdapCertificate(file, success, error) {\n const {data, error: err} = await dispatch(AdminActions.uploadPublicLdapCertificate(file));\n if (data && success) {\n success('ldap-public.crt');\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\nexport async function uploadPrivateLdapCertificate(file, success, error) {\n const {data, error: err} = await dispatch(AdminActions.uploadPrivateLdapCertificate(file));\n if (data && success) {\n success('ldap-private.key');\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function uploadIdpSamlCertificate(file, success, error) {\n const {data, error: err} = await dispatch(AdminActions.uploadIdpSamlCertificate(file));\n if (data && success) {\n success('saml-idp.crt');\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function removePublicSamlCertificate(success, error) {\n const {data, error: err} = await dispatch(AdminActions.removePublicSamlCertificate());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function removePrivateSamlCertificate(success, error) {\n const {data, error: err} = await dispatch(AdminActions.removePrivateSamlCertificate());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function removePublicLdapCertificate(success, error) {\n const {data, error: err} = await dispatch(AdminActions.removePublicLdapCertificate());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function removePrivateLdapCertificate(success, error) {\n const {data, error: err} = await dispatch(AdminActions.removePrivateLdapCertificate());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function removeIdpSamlCertificate(success, error) {\n const {data, error: err} = await dispatch(AdminActions.removeIdpSamlCertificate());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function getStandardAnalytics(teamId) {\n await dispatch(AdminActions.getStandardAnalytics(teamId));\n}\n\nexport async function getAdvancedAnalytics(teamId) {\n await dispatch(AdminActions.getAdvancedAnalytics(teamId));\n}\n\nexport async function getBotPostsPerDayAnalytics(teamId) {\n await dispatch(AdminActions.getBotPostsPerDayAnalytics(teamId));\n}\n\nexport async function getPostsPerDayAnalytics(teamId) {\n await dispatch(AdminActions.getPostsPerDayAnalytics(teamId));\n}\n\nexport async function getUsersPerDayAnalytics(teamId) {\n await dispatch(AdminActions.getUsersPerDayAnalytics(teamId));\n}\n\nexport async function elasticsearchTest(config, success, error) {\n const {data, error: err} = await dispatch(AdminActions.testElasticsearch(config));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function testS3Connection(success, error) {\n const {data, error: err} = await dispatch(AdminActions.testS3Connection());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function elasticsearchPurgeIndexes(success, error, indexes) {\n const {data, error: err} = await dispatch(AdminActions.purgeElasticsearchIndexes(indexes));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function jobCreate(success, error, job) {\n const {data, error: err} = await dispatch(createJob(job));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function rebuildChannelsIndex(success, error) {\n await elasticsearchPurgeIndexes(undefined, error, ['channels']);\n const job = {\n type: JobTypes.ELASTICSEARCH_POST_INDEXING,\n data: {\n index_posts: 'false',\n index_users: 'false',\n index_files: 'false',\n index_channels: 'true',\n sub_type: 'channels_index_rebuild',\n },\n };\n await jobCreate(undefined, error, job);\n success();\n}\n\nexport async function blevePurgeIndexes(success, error) {\n const purgeBleveIndexes = bindClientFunc({\n clientFunc: Client4.purgeBleveIndexes,\n params: [],\n });\n\n const {data, error: err} = await dispatch(purgeBleveIndexes);\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport function setNavigationBlocked(blocked) {\n return {\n type: ActionTypes.SET_NAVIGATION_BLOCKED,\n blocked,\n };\n}\n\nexport function deferNavigation(onNavigationConfirmed) {\n return {\n type: ActionTypes.DEFER_NAVIGATION,\n onNavigationConfirmed,\n };\n}\n\nexport function cancelNavigation() {\n return {\n type: ActionTypes.CANCEL_NAVIGATION,\n };\n}\n\nexport function confirmNavigation() {\n // have to rename these because of lint no-shadow\n return (thunkDispatch, thunkGetState) => {\n const callback = getOnNavigationConfirmed(thunkGetState());\n\n if (callback) {\n callback();\n }\n\n thunkDispatch({\n type: ActionTypes.CONFIRM_NAVIGATION,\n });\n };\n}\n\nexport async function invalidateAllEmailInvites(success, error) {\n const {data, error: err} = await dispatch(TeamActions.invalidateAllEmailInvites());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function testSmtp(success, error) {\n const {data, error: err} = await dispatch(AdminActions.testEmail());\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport function registerAdminConsolePlugin(pluginId, reducer) {\n return (storeDispatch) => {\n storeDispatch({\n type: ActionTypes.RECEIVED_ADMIN_CONSOLE_REDUCER,\n data: {\n pluginId,\n reducer,\n },\n });\n };\n}\n\nexport function unregisterAdminConsolePlugin(pluginId) {\n return (storeDispatch) => {\n storeDispatch({\n type: ActionTypes.REMOVED_ADMIN_CONSOLE_REDUCER,\n data: {\n pluginId,\n },\n });\n };\n}\n\nexport async function testSiteURL(success, error, siteURL) {\n const {data, error: err} = await dispatch(AdminActions.testSiteURL(siteURL));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport function registerAdminConsoleCustomSetting(pluginId, key, component, {showTitle}) {\n return (storeDispatch) => {\n storeDispatch({\n type: ActionTypes.RECEIVED_ADMIN_CONSOLE_CUSTOM_COMPONENT,\n data: {\n pluginId,\n key,\n component,\n options: {showTitle},\n },\n });\n };\n}\n\nexport function registerAdminConsoleCustomSection(pluginId, key, component) {\n return (storeDispatch) => {\n storeDispatch({\n type: ActionTypes.RECEIVED_ADMIN_CONSOLE_CUSTOM_SECTION,\n data: {\n pluginId,\n key,\n component,\n },\n });\n };\n}\n\nexport async function getSamlMetadataFromIdp(success, error, samlMetadataURL) {\n const {data, error: err} = await dispatch(AdminActions.getSamlMetadataFromIdp(samlMetadataURL));\n if (data && success) {\n success(data);\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport async function setSamlIdpCertificateFromMetadata(success, error, certData) {\n const {data, error: err} = await dispatch(AdminActions.setSamlIdpCertificateFromMetadata(certData));\n if (data && success) {\n success('saml-idp.crt');\n } else if (err && error) {\n error({id: err.server_error_id, ...err});\n }\n}\n\nexport function upgradeToE0() {\n return async () => {\n trackEvent('api', 'upgrade_to_e0_requested');\n const data = await Client4.upgradeToEnterprise();\n return data;\n };\n}\n\nexport function upgradeToE0Status() {\n return async () => {\n const data = await Client4.upgradeToEnterpriseStatus();\n return data;\n };\n}\n\nexport function restartServer() {\n return async () => {\n const data = await Client4.restartServer();\n return data;\n };\n}\n\nexport function ping(getServerStatus, deviceId) {\n return async () => {\n const data = await Client4.ping(getServerStatus, deviceId);\n return data;\n };\n}\n\nexport function requestTrialLicense(requestLicenseBody, page) {\n return async () => {\n try {\n trackEvent('api', 'api_request_trial_license', {from_page: page});\n\n const response = await Client4.requestTrialLicense(requestLicenseBody);\n return {data: response};\n } catch (e) {\n // In the event that the status code returned is 451, this request has been blocked because it originated from an embargoed country_dropdown\n return {error: e.message, data: {status: e.status_code}};\n }\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {components} from 'react-select';\nimport type {OptionProps} from 'react-select';\n\nimport type {AppSelectOption} from '@mattermost/types/apps';\n\nconst {Option} = components;\nexport const SelectChannelOption = (props: OptionProps<AppSelectOption>) => {\n const item = props.data;\n\n const channelName = item.display_name;\n const purpose = item.purpose;\n\n const icon = (\n <span className='select-option-icon select-option-icon--large'>\n <i className='icon icon--standard icon--no-spacing icon-globe'/>\n </span>\n );\n\n const description = '(~' + item.name + ')';\n\n return (\n <Option\n className='apps-form-select-option'\n {...props}\n >\n <div className='select-option-item'>\n {icon}\n <div className='select-option-item-label'>\n <span className='select-option-main'>\n {channelName}\n </span>\n <span className='ml-2'>\n {' '}\n {description}\n </span>\n <span className='ml-2'>\n {' '}\n {purpose}\n </span>\n </div>\n </div>\n </Option>);\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {components} from 'react-select';\nimport type {OptionProps} from 'react-select';\n\nimport type {AppSelectOption} from '@mattermost/types/apps';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\nimport Avatar from 'components/widgets/users/avatar/avatar';\n\nimport * as Utils from 'utils/utils';\nimport {imageURLForUser} from 'utils/utils';\n\nconst getDescription = (data: UserProfile): string => {\n if ((data.first_name || data.last_name) && data.nickname) {\n return ` - ${Utils.getFullName(data)} (${data.nickname})`;\n } else if (data.nickname) {\n return ` - (${data.nickname})`;\n } else if (data.first_name || data.last_name) {\n return ` - ${Utils.getFullName(data)}`;\n }\n return '';\n};\n\nconst {Option} = components;\n\nexport const SelectUserOption = (props: OptionProps<AppSelectOption>) => {\n const username = props.data.username;\n const description = getDescription(props.data);\n\n return (\n <Option\n className='apps-form-select-option'\n {...props}\n >\n <div className='select-option-item'>\n <Avatar\n size='xxs'\n username={username}\n url={imageURLForUser(props.data.id)}\n />\n <div className='select-option-item-label'>\n <span className='select-option-main'>\n {'@' + username}\n </span>\n <span>\n {' '}\n {description}\n </span>\n </div>\n {props.data.is_bot && <BotTag/>}\n {isGuest(props.data.roles) && <GuestTag/>}\n </div>\n </Option>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport ReactSelect from 'react-select';\nimport AsyncSelect from 'react-select/async';\n\nimport type {AppField, AppSelectOption} from '@mattermost/types/apps';\nimport type {UserAutocomplete} from '@mattermost/types/autocomplete';\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {AppFieldTypes} from 'mattermost-redux/constants/apps';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nimport {imageURLForUser} from 'utils/utils';\n\nimport {SelectChannelOption} from './select_channel_option';\nimport {SelectUserOption} from './select_user_option';\n\nexport type Props = {\n field: AppField;\n label: React.ReactNode;\n helpText: React.ReactNode;\n value: AppSelectOption | null;\n onChange: (value: AppSelectOption) => void;\n performLookup: (name: string, userInput: string) => Promise<AppSelectOption[]>;\n teammateNameDisplay?: string;\n actions: {\n autocompleteChannels: (term: string, success: (channels: Channel[]) => void, error: () => void) => Promise<ActionResult>;\n autocompleteUsers: (search: string) => Promise<UserAutocomplete>;\n };\n};\n\nexport type State = {\n refreshNonce: string;\n field: AppField;\n}\n\nconst reactStyles = {\n menuPortal: (provided: React.CSSProperties) => ({\n ...provided,\n zIndex: 9999,\n }),\n};\n\nconst commonComponents = {\n MultiValueLabel: (props: {data: {label: string}}) => (\n <div className='react-select__padded-component'>\n {props.data.label}\n </div>\n ),\n};\n\nconst commonProps = {\n isClearable: true,\n openMenuOnFocus: false,\n classNamePrefix: 'react-select-auto react-select',\n menuPortalTarget: document.body,\n styles: reactStyles,\n};\n\nexport default class AppsFormSelectField extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n field: props.field,\n refreshNonce: Math.random().toString(),\n };\n }\n static getDerivedStateFromProps(nextProps: Props, prevState: State) {\n if (nextProps.field !== prevState.field) {\n return {\n field: nextProps.field,\n refreshNonce: Math.random().toString(),\n };\n }\n\n return null;\n }\n\n onChange = (selectedOption: AppSelectOption) => {\n this.props.onChange(selectedOption);\n };\n\n loadDynamicOptions = async (userInput: string): Promise<AppSelectOption[]> => {\n return this.props.performLookup(this.props.field.name, userInput);\n };\n\n loadDynamicUserOptions = async (userInput: string): Promise<AppSelectOption[]> => {\n const usersSearchResults: UserAutocomplete = await this.props.actions.autocompleteUsers(userInput.toLowerCase());\n\n return usersSearchResults.users.filter((user) => !user.is_bot).map((user) => {\n const label = this.props.teammateNameDisplay ? displayUsername(user, this.props.teammateNameDisplay) : user.username;\n\n return {...user, label, value: user.id, icon_data: imageURLForUser(user.id)};\n });\n };\n\n loadDynamicChannelOptions = async (userInput: string): Promise<AppSelectOption[]> => {\n let channelsSearchResults: Channel[] = [];\n\n await this.props.actions.autocompleteChannels(userInput.toLowerCase(), (data) => {\n channelsSearchResults = data;\n }, () => {});\n\n return channelsSearchResults.map((channel) => ({...channel, label: channel.display_name, value: channel.id}));\n };\n\n renderDynamicSelect() {\n const {field} = this.props;\n const placeholder = field.hint || '';\n const value = this.props.value;\n\n return (\n <div className={'react-select'}>\n <AsyncSelect\n id={`MultiInput_${field.name}`}\n loadOptions={this.loadDynamicOptions}\n defaultOptions={true}\n isMulti={field.multiselect || false}\n placeholder={placeholder}\n value={value}\n onChange={this.onChange as any} // types are not working correctly for multiselect\n isDisabled={field.readonly}\n components={commonComponents}\n {...commonProps}\n />\n </div>\n );\n }\n\n renderUserSelect() {\n const {hint, name, multiselect, readonly} = this.props.field;\n const placeholder = hint || '';\n const value = this.props.value;\n\n return (\n <div className={'react-select'}>\n <AsyncSelect\n id={`MultiInput_${name}`}\n loadOptions={this.loadDynamicUserOptions}\n defaultOptions={true}\n isMulti={multiselect || false}\n placeholder={placeholder}\n value={value}\n onChange={this.onChange as any} // types are not working correctly for multiselect\n isDisabled={readonly}\n components={{...commonComponents, Option: SelectUserOption}}\n {...commonProps}\n />\n </div>\n );\n }\n\n renderChannelSelect() {\n const {hint, name, multiselect, readonly} = this.props.field;\n const placeholder = hint || '';\n const value = this.props.value;\n\n return (\n <div className={'react-select'}>\n <AsyncSelect\n id={`MultiInput_${name}`}\n loadOptions={this.loadDynamicChannelOptions}\n defaultOptions={true}\n isMulti={multiselect || false}\n placeholder={placeholder}\n value={value}\n onChange={this.onChange as any} // types are not working correctly for multiselect\n isDisabled={readonly}\n components={{...commonComponents, Option: SelectChannelOption}}\n {...commonProps}\n />\n </div>\n );\n }\n\n renderStaticSelect() {\n const {field} = this.props;\n\n const placeholder = field.hint || '';\n\n const options = field.options;\n const value = this.props.value;\n\n return (\n <div className={'react-select'}>\n <ReactSelect\n id={`MultiInput_${field.name}`}\n options={options}\n isMulti={field.multiselect || false}\n placeholder={placeholder}\n value={value}\n onChange={this.onChange as any} // types are not working correctly for multiselect\n isDisabled={field.readonly}\n components={commonComponents}\n {...commonProps}\n />\n </div>\n );\n }\n\n getAppFieldRenderer(type: string) {\n switch (type) {\n case AppFieldTypes.DYNAMIC_SELECT:\n return this.renderDynamicSelect();\n case AppFieldTypes.STATIC_SELECT:\n return this.renderStaticSelect();\n case AppFieldTypes.USER:\n return this.renderUserSelect();\n case AppFieldTypes.CHANNEL:\n return this.renderChannelSelect();\n default:\n return undefined;\n }\n }\n\n render() {\n const {field, label, helpText} = this.props;\n\n const selectComponent = this.getAppFieldRenderer(field.type);\n\n return (\n <div\n className='form-group'\n >\n {label && (\n <label>\n {label}\n </label>\n )}\n <React.Fragment key={this.state.refreshNonce}>\n {selectComponent}\n <div className='help-text'>\n {helpText}\n </div>\n </React.Fragment>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {AppField, AppSelectOption} from '@mattermost/types/apps';\nimport type {UserAutocomplete} from '@mattermost/types/autocomplete';\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {AppFieldTypes} from 'mattermost-redux/constants/apps';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport type AutocompleteSelector from 'components/autocomplete_selector';\nimport Markdown from 'components/markdown';\nimport ModalSuggestionList from 'components/suggestion/modal_suggestion_list';\nimport BoolSetting from 'components/widgets/settings/bool_setting';\nimport TextSetting from 'components/widgets/settings/text_setting';\nimport type {InputTypes} from 'components/widgets/settings/text_setting';\n\nimport AppsFormSelectField from './apps_form_select_field';\n\nconst TEXT_DEFAULT_MAX_LENGTH = 150;\nconst TEXTAREA_DEFAULT_MAX_LENGTH = 3000;\n\nexport interface Props {\n field: AppField;\n name: string;\n errorText?: React.ReactNode;\n teammateNameDisplay?: string;\n\n value: AppSelectOption | string | boolean | number | null;\n onChange: (name: string, value: any) => void;\n autoFocus?: boolean;\n listComponent?: React.ComponentProps<typeof AutocompleteSelector>['listComponent'];\n performLookup: (name: string, userInput: string) => Promise<AppSelectOption[]>;\n actions: {\n autocompleteChannels: (term: string, success: (channels: Channel[]) => void, error: () => void) => Promise<ActionResult>;\n autocompleteUsers: (search: string) => Promise<UserAutocomplete>;\n };\n}\n\nexport default class AppsFormField extends React.PureComponent<Props> {\n static defaultProps = {\n listComponent: ModalSuggestionList,\n };\n\n handleSelected = (selected: AppSelectOption | AppSelectOption[]) => {\n const {name, onChange} = this.props;\n\n const option = selected;\n\n if (Array.isArray(selected)) {\n const options = selected.map((selectedItem) => ({label: selectedItem.label, value: selectedItem.value}));\n onChange(name, options);\n } else if (selected) {\n onChange(name, {label: selected.label, value: selected.value});\n } else {\n onChange(name, option);\n }\n };\n\n render() {\n const {\n field,\n name,\n value,\n onChange,\n errorText,\n } = this.props;\n\n const placeholder = field.hint || '';\n\n const displayName = (field.modal_label || field.label) as string;\n let displayNameContent: React.ReactNode = (field.modal_label || field.label) as string;\n displayNameContent = (\n <>\n {displayName}\n {!field.is_required && (\n <span className='light'>\n {' (optional)'}\n </span>\n )}\n </>\n );\n\n const helpText = field.description;\n let helpTextContent: React.ReactNode = <Markdown message={helpText}/>;\n if (errorText) {\n helpTextContent = (\n <>\n <Markdown message={helpText}/>\n <div className='error-text mt-3'>\n {errorText}\n </div>\n </>\n );\n }\n\n switch (field.type) {\n case AppFieldTypes.TEXT: {\n const subtype = field.subtype || 'text';\n\n let maxLength = field.max_length;\n if (!maxLength) {\n if (subtype === 'textarea') {\n maxLength = TEXTAREA_DEFAULT_MAX_LENGTH;\n } else {\n maxLength = TEXT_DEFAULT_MAX_LENGTH;\n }\n }\n\n const textValue = value as string;\n return (\n <TextSetting\n autoFocus={this.props.autoFocus}\n id={name}\n disabled={field.readonly}\n type={subtype as InputTypes}\n label={displayNameContent}\n maxLength={maxLength}\n value={textValue || ''}\n placeholder={placeholder}\n helpText={helpTextContent}\n onChange={onChange}\n resizable={false}\n />\n );\n }\n case AppFieldTypes.CHANNEL:\n case AppFieldTypes.USER:\n case AppFieldTypes.STATIC_SELECT:\n case AppFieldTypes.DYNAMIC_SELECT: {\n return (\n <AppsFormSelectField\n {...this.props}\n teammateNameDisplay={this.props.teammateNameDisplay}\n field={field}\n label={displayNameContent}\n helpText={helpTextContent}\n onChange={this.handleSelected}\n value={this.props.value as AppSelectOption | null}\n />\n );\n }\n case AppFieldTypes.BOOL: {\n const boolValue = value as boolean;\n return (\n <BoolSetting\n autoFocus={this.props.autoFocus}\n id={name}\n disabled={field.readonly}\n label={displayNameContent}\n value={boolValue || false}\n helpText={helpTextContent}\n placeholder={placeholder}\n onChange={onChange}\n />\n );\n }\n case AppFieldTypes.MARKDOWN: {\n return (\n <Markdown\n message={field.description}\n />\n );\n }\n }\n\n return null;\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {autocompleteChannels} from 'actions/channel_actions';\nimport {autocompleteUsers} from 'actions/user_actions';\n\nimport AppsFormField from './apps_form_field';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n teammateNameDisplay: getTeammateNameDisplaySetting(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n autocompleteChannels,\n autocompleteUsers,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AppsFormField);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Markdown from 'components/markdown';\n\ntype Props = {\n id?: string;\n value: string;\n};\n\nconst markdownOptions = {singleline: false, mentionHighlight: false};\n\nconst AppsFormHeader: React.FC<Props> = (props: Props) => {\n return (\n <Markdown\n message={props.value}\n options={markdownOptions}\n />\n );\n};\n\nexport default AppsFormHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal, Fade} from 'react-bootstrap';\nimport {defineMessage, FormattedMessage, injectIntl} from 'react-intl';\nimport type {WrappedComponentProps} from 'react-intl';\n\nimport type {AppCallResponse, AppField, AppForm, AppFormValues, AppSelectOption, FormResponseData, AppLookupResponse, AppFormValue} from '@mattermost/types/apps';\nimport type {DialogElement} from '@mattermost/types/integrations';\n\nimport {AppCallResponseTypes, AppFieldTypes} from 'mattermost-redux/constants/apps';\nimport {\n checkDialogElementForError, checkIfErrorsMatchElements,\n} from 'mattermost-redux/utils/integration_utils';\n\nimport Markdown from 'components/markdown';\nimport SpinnerButton from 'components/spinner_button';\nimport ModalSuggestionList from 'components/suggestion/modal_suggestion_list';\nimport SuggestionList from 'components/suggestion/suggestion_list';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {filterEmptyOptions} from 'utils/apps';\n\nimport type {DoAppCallResult} from 'types/apps';\n\nimport AppsFormField from './apps_form_field';\nimport AppsFormHeader from './apps_form_header';\n\nimport './apps_form_component.scss';\n\nexport type AppsFormProps = {\n form: AppForm;\n isEmbedded?: boolean;\n onExited: () => void;\n actions: {\n submit: (submission: {\n values: AppFormValues;\n }) => Promise<DoAppCallResult<FormResponseData>>;\n performLookupCall: (field: AppField, values: AppFormValues, userInput: string) => Promise<DoAppCallResult<AppLookupResponse>>;\n refreshOnSelect: (field: AppField, values: AppFormValues) => Promise<DoAppCallResult<FormResponseData>>;\n };\n}\n\nexport type Props = AppsFormProps & WrappedComponentProps<'intl'>;\n\nexport type State = {\n show: boolean;\n values: AppFormValues;\n formError: string | null;\n fieldErrors: {[name: string]: React.ReactNode};\n loading: boolean;\n submitting: string | null;\n form: AppForm;\n}\n\nconst initFormValues = (form: AppForm): AppFormValues => {\n const values: AppFormValues = {};\n if (form && form.fields) {\n form.fields.forEach((f) => {\n let defaultValue: AppFormValue = null;\n if (f.type === AppFieldTypes.BOOL) {\n defaultValue = false;\n }\n\n values[f.name] = f.value || defaultValue;\n });\n }\n\n return values;\n};\n\nexport class AppsForm extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n const {form} = props;\n const values = initFormValues(form);\n\n this.state = {\n loading: false,\n show: true,\n values,\n formError: null,\n fieldErrors: {},\n submitting: null,\n form,\n };\n }\n\n static getDerivedStateFromProps(nextProps: Props, prevState: State) {\n if (nextProps.form !== prevState.form) {\n return {\n values: initFormValues(nextProps.form),\n form: nextProps.form,\n };\n }\n\n return null;\n }\n\n updateErrors = (elements: DialogElement[], fieldErrors?: {[x: string]: string}, formError?: string): boolean => {\n let hasErrors = false;\n const state = {} as State;\n\n if (formError) {\n hasErrors = true;\n state.formError = formError;\n }\n\n if (fieldErrors && Object.keys(fieldErrors).length >= 0) {\n hasErrors = true;\n if (checkIfErrorsMatchElements(fieldErrors, elements)) {\n state.fieldErrors = {};\n for (const [key, value] of Object.entries(fieldErrors)) {\n state.fieldErrors[key] = (<Markdown message={value}/>);\n }\n } else if (!state.formError) {\n const field = Object.keys(fieldErrors)[0];\n state.formError = this.props.intl.formatMessage({\n id: 'apps.error.responses.unknown_field_error',\n defaultMessage: 'Received an error for an unknown field. Field name: `{field}`. Error:\\n{error}',\n }, {\n field,\n error: fieldErrors[field],\n });\n }\n }\n\n if (hasErrors) {\n this.setState(state);\n }\n\n return hasErrors;\n };\n\n handleSubmit = async (e: React.FormEvent, submitName?: string, value?: string) => {\n e.preventDefault();\n\n const {fields} = this.props.form;\n const values = this.state.values;\n if (submitName && value) {\n values[submitName] = value;\n }\n\n const fieldErrors: {[name: string]: React.ReactNode} = {};\n\n const elements = fieldsAsElements(fields);\n elements?.forEach((element) => {\n const error = checkDialogElementForError( // TODO: make sure all required values are present in `element`\n element,\n values[element.name],\n );\n if (error) {\n fieldErrors[element.name] = (\n <FormattedMessage\n id={error.id}\n defaultMessage={error.defaultMessage}\n values={error.values}\n />\n );\n }\n });\n\n this.setState({fieldErrors});\n if (Object.keys(fieldErrors).length !== 0) {\n const formError = this.props.intl.formatMessage({\n id: 'apps.error.form.required_fields_empty',\n defaultMessage: 'Please fix all field errors',\n });\n\n this.setState({formError});\n return;\n }\n\n const submission = {\n values,\n };\n\n let submitting = 'submit';\n if (submitName && value) {\n submitting = value;\n }\n\n this.setState({submitting, formError: null});\n const res = await this.props.actions.submit(submission);\n this.setState({submitting: null});\n\n if (res.error) {\n const errorResponse = res.error;\n const errorMessage = errorResponse.text;\n const hasErrors = this.updateErrors(elements, errorResponse.data?.errors, errorMessage);\n if (!hasErrors) {\n this.handleHide(false);\n }\n return;\n }\n\n const callResponse = res.data as AppCallResponse<FormResponseData>;\n\n let hasErrors = false;\n let updatedForm = false;\n switch (callResponse.type) {\n case AppCallResponseTypes.FORM:\n updatedForm = true;\n break;\n case AppCallResponseTypes.OK:\n case AppCallResponseTypes.NAVIGATE:\n break;\n default:\n hasErrors = true;\n this.updateErrors([], undefined, this.props.intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResponse.type,\n }));\n }\n\n if (!hasErrors && !updatedForm) {\n this.handleHide(true);\n }\n };\n\n performLookup = async (name: string, userInput: string): Promise<AppSelectOption[]> => {\n const intl = this.props.intl;\n const field = this.props.form.fields?.find((f) => f.name === name);\n if (!field) {\n return [];\n }\n\n const res = await this.props.actions.performLookupCall(field, this.state.values, userInput);\n if (res.error) {\n const errorResponse = res.error;\n const errMsg = errorResponse.text || intl.formatMessage({\n id: 'apps.error.unknown',\n defaultMessage: 'Unknown error occurred.',\n });\n this.setState({\n fieldErrors: {\n ...this.state.fieldErrors,\n [field.name]: errMsg,\n },\n });\n return [];\n }\n\n const callResp = res.data!;\n switch (callResp.type) {\n case AppCallResponseTypes.OK: {\n let items = callResp.data?.items || [];\n items = items?.filter(filterEmptyOptions);\n return items;\n }\n case AppCallResponseTypes.FORM:\n case AppCallResponseTypes.NAVIGATE: {\n const errMsg = intl.formatMessage({\n id: 'apps.error.responses.unexpected_type',\n defaultMessage: 'App response type was not expected. Response type: {type}',\n }, {\n type: callResp.type,\n },\n );\n this.setState({\n fieldErrors: {\n ...this.state.fieldErrors,\n [field.name]: errMsg,\n },\n });\n return [];\n }\n default: {\n const errMsg = intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResp.type,\n },\n );\n this.setState({\n fieldErrors: {\n ...this.state.fieldErrors,\n [field.name]: errMsg,\n },\n });\n return [];\n }\n }\n };\n\n onHide = () => {\n this.handleHide(false);\n };\n\n handleHide = (submitted = false) => {\n const {form} = this.props;\n\n if (!submitted && form.submit_on_cancel) {\n // const dialog = {\n // url,\n // callback_id: callbackId,\n // state,\n // cancelled: true,\n // };\n\n // this.props.actions.submit(dialog);\n }\n\n this.setState({show: false});\n };\n\n onChange = (name: string, value: any) => {\n const field = this.props.form.fields?.find((f) => f.name === name);\n if (!field) {\n return;\n }\n\n const values = {...this.state.values, [name]: value};\n\n if (field.refresh) {\n this.setState({loading: true});\n this.props.actions.refreshOnSelect(field, values).then((res) => {\n this.setState({loading: false});\n if (res.error) {\n const errorResponse = res.error;\n const errorMsg = errorResponse.text;\n const errors = errorResponse.data?.errors;\n const elements = fieldsAsElements(this.props.form.fields);\n this.updateErrors(elements, errors, errorMsg);\n return;\n }\n\n const callResponse = res.data!;\n switch (callResponse.type) {\n case AppCallResponseTypes.FORM:\n return;\n case AppCallResponseTypes.OK:\n case AppCallResponseTypes.NAVIGATE:\n this.updateErrors([], undefined, this.props.intl.formatMessage({\n id: 'apps.error.responses.unexpected_type',\n defaultMessage: 'App response type was not expected. Response type: {type}',\n }, {\n type: callResponse.type,\n }));\n return;\n default:\n this.updateErrors([], undefined, this.props.intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResponse.type,\n }));\n }\n });\n }\n\n this.setState({values});\n };\n\n renderModal() {\n const {fields, header} = this.props.form;\n const loading = Boolean(this.state.loading);\n const bodyClass = loading ? 'apps-form-modal-body-loading' : 'apps-form-modal-body-loaded';\n const bodyClassNames = 'apps-form-modal-body-common ' + bodyClass;\n return (\n <Modal\n id='appsModal'\n dialogClassName='a11y__modal about-modal'\n show={this.state.show}\n onHide={this.onHide}\n onExited={this.props.onExited}\n backdrop='static'\n role='none'\n aria-labelledby='appsModalLabel'\n >\n <form\n onSubmit={this.handleSubmit}\n autoComplete={'off'}\n >\n <Modal.Header\n closeButton={true}\n style={{borderBottom: fields && fields.length ? '' : '0px'}}\n >\n <Modal.Title\n componentClass='h1'\n id='appsModalLabel'\n >\n {this.renderHeader()}\n </Modal.Title>\n </Modal.Header>\n {(fields || header) && (\n <Modal.Body>\n <Fade in={loading}>\n <div\n className={\n bodyClassNames\n }\n >\n <LoadingSpinner style={{fontSize: '24px'}}/>\n </div>\n </Fade>\n {this.renderBody()}\n </Modal.Body>\n )}\n <Modal.Footer>\n {this.renderFooter()}\n </Modal.Footer>\n </form>\n </Modal>\n );\n }\n\n renderEmbedded() {\n const {fields, header} = this.props.form;\n\n return (\n <form onSubmit={this.handleSubmit}>\n <div>\n {this.renderHeader()}\n </div>\n {(fields || header) && (\n <div>\n {this.renderBody()}\n </div>\n )}\n <div>\n {this.renderFooter()}\n </div>\n </form>\n );\n }\n\n renderHeader() {\n const {\n title,\n icon,\n } = this.props.form;\n\n let iconComponent;\n if (icon) {\n iconComponent = (\n <img\n id='appsModalIconUrl'\n alt={'modal title icon'}\n className='more-modal__image'\n width='36'\n height='36'\n src={icon}\n />\n );\n }\n\n return (\n <>\n {iconComponent}\n {title}\n </>\n );\n }\n\n renderElements() {\n const {isEmbedded, form} = this.props;\n\n const {fields} = form;\n if (!fields) {\n return null;\n }\n\n return fields.filter((f) => f.name !== form.submit_buttons).map((field, index) => {\n return (\n <AppsFormField\n field={field}\n key={field.name}\n autoFocus={index === 0}\n name={field.name}\n errorText={this.state.fieldErrors[field.name]}\n value={this.state.values[field.name]}\n performLookup={this.performLookup}\n onChange={this.onChange}\n listComponent={isEmbedded ? SuggestionList : ModalSuggestionList}\n />\n );\n });\n }\n\n renderBody() {\n const {fields, header} = this.props.form;\n\n return (fields || header) && (\n <>\n {header && (\n <AppsFormHeader\n id='appsModalHeader'\n value={header}\n />\n )}\n {this.renderElements()}\n </>\n );\n }\n\n renderFooter() {\n const {fields} = this.props.form;\n\n const submitText: React.ReactNode = (\n <FormattedMessage\n id='interactive_dialog.submit'\n defaultMessage='Submit'\n />\n );\n\n let submitButtons = [(\n <SpinnerButton\n id='appsModalSubmit'\n key='submit'\n type='submit'\n autoFocus={!fields || fields.length === 0}\n className='btn btn-primary save-button'\n spinning={Boolean(this.state.submitting)}\n spinningText={defineMessage({\n id: 'interactive_dialog.submitting',\n defaultMessage: 'Submitting...',\n })}\n >\n {submitText}\n </SpinnerButton>\n )];\n\n if (this.props.form.submit_buttons) {\n const field = fields?.find((f) => f.name === this.props.form.submit_buttons);\n if (field) {\n const buttons = field.options?.map((o) => (\n <SpinnerButton\n id={'appsModalSubmit' + o.value}\n key={o.value}\n type='submit'\n className='btn btn-primary save-button'\n spinning={this.state.submitting === o.value}\n spinningText={o.label}\n onClick={(e: React.MouseEvent) => this.handleSubmit(e, field.name, o.value)}\n >\n {o.label}\n </SpinnerButton>\n ));\n if (buttons) {\n submitButtons = buttons;\n }\n }\n }\n\n return (\n <>\n <div>\n {this.state.formError && (\n <div>\n <div className='error-text'>\n <Markdown message={this.state.formError}/>\n </div>\n </div>\n )}\n <button\n id='appsModalCancel'\n type='button'\n className='btn btn-tertiary cancel-button'\n onClick={this.onHide}\n >\n <FormattedMessage\n id='interactive_dialog.cancel'\n defaultMessage='Cancel'\n />\n </button>\n {submitButtons}\n </div>\n </>\n );\n }\n\n render() {\n return this.props.isEmbedded ? this.renderEmbedded() : this.renderModal();\n }\n}\n\nfunction fieldsAsElements(fields?: AppField[]): DialogElement[] {\n return fields?.map((f) => ({\n name: f.name,\n type: f.type,\n subtype: f.subtype,\n optional: !f.is_required,\n })) as DialogElement[];\n}\n\nexport default injectIntl(AppsForm);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {AppContext, AppField, AppForm, AppFormValues, FormResponseData, AppLookupResponse} from '@mattermost/types/apps';\n\nimport {AppCallResponseTypes} from 'mattermost-redux/constants/apps';\n\nimport {createCallRequest, makeCallErrorResponse} from 'utils/apps';\n\nimport type {DoAppSubmit, DoAppFetchForm, DoAppLookup, DoAppCallResult, PostEphemeralCallResponseForContext} from 'types/apps';\n\nimport AppsForm from './apps_form_component';\n\ntype Props = {\n intl: IntlShape;\n form?: AppForm;\n context?: AppContext;\n onExited: () => void;\n actions: {\n doAppSubmit: DoAppSubmit<any>;\n doAppFetchForm: DoAppFetchForm<any>;\n doAppLookup: DoAppLookup<any>;\n postEphemeralCallResponseForContext: PostEphemeralCallResponseForContext;\n };\n};\n\ntype State = {\n form?: AppForm;\n}\n\nclass AppsFormContainer extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {form: props.form};\n }\n\n submitForm = async (submission: {values: AppFormValues}): Promise<DoAppCallResult<FormResponseData>> => {\n const makeErrorMsg = (msg: string) => {\n return this.props.intl.formatMessage(\n {\n id: 'apps.error.form.submit.pretext',\n defaultMessage: 'There has been an error submitting the modal. Contact the app developer. Details: {details}',\n },\n {details: msg},\n );\n };\n const {form} = this.state;\n if (!form) {\n const errMsg = this.props.intl.formatMessage({id: 'apps.error.form.no_form', defaultMessage: '`form` is not defined.'});\n return {error: makeCallErrorResponse(makeErrorMsg(errMsg))};\n }\n if (!form.submit) {\n const errMsg = this.props.intl.formatMessage({id: 'apps.error.form.no_submit', defaultMessage: '`submit` is not defined'});\n return {error: makeCallErrorResponse(makeErrorMsg(errMsg))};\n }\n if (!this.props.context) {\n return {error: makeCallErrorResponse('unreachable: empty context')};\n }\n\n const creq = createCallRequest(form.submit, this.props.context, {}, submission.values);\n const res = await this.props.actions.doAppSubmit(creq, this.props.intl) as DoAppCallResult<FormResponseData>;\n if (res.error) {\n return res;\n }\n\n const callResp = res.data!;\n switch (callResp.type) {\n case AppCallResponseTypes.OK:\n if (callResp.text) {\n this.props.actions.postEphemeralCallResponseForContext(\n callResp,\n callResp.text,\n creq.context,\n );\n }\n break;\n case AppCallResponseTypes.FORM:\n this.setState({form: callResp.form});\n break;\n case AppCallResponseTypes.NAVIGATE:\n break;\n default:\n return {error: makeCallErrorResponse(makeErrorMsg(this.props.intl.formatMessage(\n {\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResp.type,\n },\n )))};\n }\n return res;\n };\n\n refreshOnSelect = async (field: AppField, values: AppFormValues): Promise<DoAppCallResult<FormResponseData>> => {\n const makeErrMsg = (message: string) => this.props.intl.formatMessage(\n {\n id: 'apps.error.form.update',\n defaultMessage: 'There has been an error updating the modal. Contact the app developer. Details: {details}',\n },\n {details: message},\n );\n\n const {form} = this.state;\n if (!form) {\n return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n id: 'apps.error.form.no_form',\n defaultMessage: '`form` is not defined.',\n })))};\n }\n if (!form.source) {\n return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n id: 'apps.error.form.no_source',\n defaultMessage: '`source` is not defined.',\n })))};\n }\n if (!field.refresh) {\n // Should never happen\n return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n id: 'apps.error.form.refresh_no_refresh',\n defaultMessage: 'Called refresh on no refresh field.',\n })))};\n }\n if (!this.props.context) {\n return {error: makeCallErrorResponse('unreachable: empty context')};\n }\n\n const creq = createCallRequest(form.source, this.props.context, {}, values);\n creq.selected_field = field.name;\n\n const res = await this.props.actions.doAppFetchForm(creq, this.props.intl);\n if (res.error) {\n return res;\n }\n\n const callResp = res.data!;\n switch (callResp.type) {\n case AppCallResponseTypes.FORM:\n this.setState({form: callResp.form});\n break;\n case AppCallResponseTypes.OK:\n case AppCallResponseTypes.NAVIGATE:\n return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n id: 'apps.error.responses.unexpected_type',\n defaultMessage: 'App response type was not expected. Response type: {type}',\n }, {\n type: callResp.type,\n },\n )))};\n default:\n return {error: makeCallErrorResponse(makeErrMsg(this.props.intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResp.type,\n },\n )))};\n }\n return res;\n };\n\n performLookupCall = async (field: AppField, values: AppFormValues, userInput: string): Promise<DoAppCallResult<AppLookupResponse>> => {\n const intl = this.props.intl;\n const makeErrorMsg = (message: string) => intl.formatMessage(\n {\n id: 'apps.error.form.refresh',\n defaultMessage: 'There has been an error fetching the select fields. Contact the app developer. Details: {details}',\n },\n {details: message},\n );\n if (!field.lookup) {\n return {error: makeCallErrorResponse(makeErrorMsg(intl.formatMessage({\n id: 'apps.error.form.no_lookup',\n defaultMessage: '`lookup` is not defined.',\n })))};\n }\n if (!this.props.context) {\n return {error: makeCallErrorResponse('unreachable: empty context')};\n }\n\n const creq = createCallRequest(field.lookup, this.props.context, {}, values);\n creq.selected_field = field.name;\n creq.query = userInput;\n\n return this.props.actions.doAppLookup(creq, intl);\n };\n\n render() {\n const {form} = this.state;\n\n if (!form?.submit || !this.props.context) {\n return null;\n }\n\n return (\n <AppsForm\n form={form}\n onExited={this.props.onExited}\n actions={{\n submit: this.submitForm,\n performLookupCall: this.performLookupCall,\n refreshOnSelect: this.refreshOnSelect,\n }}\n />\n );\n }\n}\n\n// Exported for tests\nexport {AppsFormContainer as RawAppsFormContainer};\n\nexport default injectIntl(AppsFormContainer);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {doAppSubmit, doAppFetchForm, doAppLookup, postEphemeralCallResponseForContext} from 'actions/apps';\n\nimport AppsFormContainer from './apps_form_container';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n doAppSubmit,\n doAppFetchForm,\n doAppLookup,\n postEphemeralCallResponseForContext,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(AppsFormContainer);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AnyAction} from 'redux';\n\nimport type {AppCallResponse, AppForm, AppCallRequest, AppContext, AppBinding} from '@mattermost/types/apps';\nimport type {CommandArgs} from '@mattermost/types/integrations';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {AppCallResponseTypes} from 'mattermost-redux/constants/apps';\nimport {cleanForm} from 'mattermost-redux/utils/apps';\n\nimport {openModal} from 'actions/views/modals';\n\nimport AppsForm from 'components/apps_form';\n\nimport {createCallRequest, makeCallErrorResponse} from 'utils/apps';\nimport {getHistory} from 'utils/browser_history';\nimport {ModalIdentifiers} from 'utils/constants';\nimport {getSiteURL, shouldOpenInNewTab} from 'utils/url';\n\nimport type {DoAppCallResult} from 'types/apps';\nimport type {ActionFuncAsync, ThunkActionFunc} from 'types/store';\n\nimport {sendEphemeralPost} from './global_actions';\n\nexport function handleBindingClick<Res=unknown>(binding: AppBinding, context: AppContext, intl: any): ThunkActionFunc<Promise<DoAppCallResult<Res>>> {\n return async (dispatch) => {\n // Fetch form\n let form = binding.form;\n if (form?.source) {\n const callRequest = createCallRequest(form.source, context);\n const res = await dispatch(doAppFetchForm<Res>(callRequest, intl));\n if (res.error) {\n return res;\n }\n form = res.data!.form;\n }\n\n // Open form\n if (form) {\n // This should come properly formed, but using preventive checks\n if (!form?.submit) {\n const errMsg = intl.formatMessage({\n id: 'apps.error.malformed_binding',\n defaultMessage: 'This binding is not properly formed. Contact the App developer.',\n });\n return {error: makeCallErrorResponse(errMsg)};\n }\n\n const res: AppCallResponse<Res> = {\n type: AppCallResponseTypes.FORM,\n form,\n };\n return {data: res};\n }\n\n // Submit binding\n // This should come properly formed, but using preventive checks\n if (!binding.submit) {\n const errMsg = intl.formatMessage({\n id: 'apps.error.malformed_binding',\n defaultMessage: 'This binding is not properly formed. Contact the App developer.',\n });\n return {error: makeCallErrorResponse(errMsg)};\n }\n\n const callRequest = createCallRequest(\n binding.submit,\n context,\n );\n\n const res = await dispatch(doAppSubmit<Res>(callRequest, intl));\n return res;\n };\n}\n\nexport function doAppSubmit<Res=unknown>(inCall: AppCallRequest, intl: any): ThunkActionFunc<Promise<DoAppCallResult<Res>>> {\n return async () => {\n try {\n const call: AppCallRequest = {\n ...inCall,\n context: {\n ...inCall.context,\n track_as_submit: true,\n },\n };\n const res = await Client4.executeAppCall(call, true) as AppCallResponse<Res>;\n const responseType = res.type || AppCallResponseTypes.OK;\n\n switch (responseType) {\n case AppCallResponseTypes.OK:\n return {data: res};\n case AppCallResponseTypes.ERROR:\n return {error: res};\n case AppCallResponseTypes.FORM:\n if (!res.form?.submit) {\n const errMsg = intl.formatMessage({\n id: 'apps.error.responses.form.no_form',\n defaultMessage: 'Response type is `form`, but no valid form was included in response.',\n });\n return {error: makeCallErrorResponse(errMsg)};\n }\n\n cleanForm(res.form);\n return {data: res};\n\n case AppCallResponseTypes.NAVIGATE: {\n if (!res.navigate_to_url) {\n const errMsg = intl.formatMessage({\n id: 'apps.error.responses.navigate.no_url',\n defaultMessage: 'Response type is `navigate`, but no url was included in response.',\n });\n return {error: makeCallErrorResponse(errMsg)};\n }\n if (shouldOpenInNewTab(res.navigate_to_url, getSiteURL())) {\n window.open(res.navigate_to_url);\n return {data: res};\n }\n const navigateURL = res.navigate_to_url.startsWith(getSiteURL()) ? res.navigate_to_url.slice(getSiteURL().length) : res.navigate_to_url;\n getHistory().push(navigateURL);\n return {data: res};\n }\n default: {\n const errMsg = intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {type: responseType});\n return {error: makeCallErrorResponse(errMsg)};\n }\n }\n } catch (error: any) {\n const errMsg = error.message || intl.formatMessage({\n id: 'apps.error.responses.unexpected_error',\n defaultMessage: 'Received an unexpected error.',\n });\n return {error: makeCallErrorResponse(errMsg)};\n }\n };\n}\n\nexport function doAppFetchForm<Res=unknown>(call: AppCallRequest, intl: any): ThunkActionFunc<Promise<DoAppCallResult<Res>>> {\n return async () => {\n try {\n const res = await Client4.executeAppCall(call, false) as AppCallResponse<Res>;\n const responseType = res.type || AppCallResponseTypes.OK;\n\n switch (responseType) {\n case AppCallResponseTypes.ERROR:\n return {error: res};\n case AppCallResponseTypes.FORM:\n if (!res.form?.submit) {\n const errMsg = intl.formatMessage({\n id: 'apps.error.responses.form.no_form',\n defaultMessage: 'Response type is `form`, but no valid form was included in response.',\n });\n return {error: makeCallErrorResponse(errMsg)};\n }\n cleanForm(res.form);\n return {data: res};\n default: {\n const errMsg = intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {type: responseType});\n return {error: makeCallErrorResponse(errMsg)};\n }\n }\n } catch (error: any) {\n const errMsg = error.message || intl.formatMessage({\n id: 'apps.error.responses.unexpected_error',\n defaultMessage: 'Received an unexpected error.',\n });\n return {error: makeCallErrorResponse(errMsg)};\n }\n };\n}\n\nexport function doAppLookup<Res=unknown>(call: AppCallRequest, intl: any): ThunkActionFunc<Promise<DoAppCallResult<Res>>> {\n return async () => {\n try {\n const res = await Client4.executeAppCall(call, false) as AppCallResponse<Res>;\n const responseType = res.type || AppCallResponseTypes.OK;\n\n switch (responseType) {\n case AppCallResponseTypes.OK:\n return {data: res};\n case AppCallResponseTypes.ERROR:\n return {error: res};\n\n default: {\n const errMsg = intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {type: responseType});\n return {error: makeCallErrorResponse(errMsg)};\n }\n }\n } catch (error: any) {\n const errMsg = error.message || intl.formatMessage({\n id: 'apps.error.responses.unexpected_error',\n defaultMessage: 'Received an unexpected error.',\n });\n return {error: makeCallErrorResponse(errMsg)};\n }\n };\n}\n\nexport function makeFetchBindings(location: string): (channelId: string, teamId: string) => ActionFuncAsync<AppBinding[]> {\n return (channelId: string, teamId: string): ActionFuncAsync<AppBinding[]> => {\n return async () => {\n try {\n const allBindings = await Client4.getAppsBindings(channelId, teamId);\n const headerBindings = allBindings.filter((b) => b.location === location);\n const bindings = headerBindings.reduce((accum: AppBinding[], current: AppBinding) => accum.concat(current.bindings || []), []);\n return {data: bindings};\n } catch {\n return {data: []};\n }\n };\n };\n}\n\nexport function openAppsModal(form: AppForm, context: AppContext): AnyAction {\n return openModal({\n modalId: ModalIdentifiers.APPS_MODAL,\n dialogType: AppsForm,\n dialogProps: {\n form,\n context,\n },\n });\n}\n\nexport function postEphemeralCallResponseForPost(response: AppCallResponse, message: string, post: Post) {\n return sendEphemeralPost(\n message,\n post.channel_id,\n post.root_id || post.id,\n response.app_metadata?.bot_user_id,\n );\n}\n\nexport function postEphemeralCallResponseForChannel(response: AppCallResponse, message: string, channelID: string) {\n return sendEphemeralPost(\n message,\n channelID,\n '',\n response.app_metadata?.bot_user_id,\n );\n}\n\nexport function postEphemeralCallResponseForContext(response: AppCallResponse, message: string, context: AppContext) {\n return sendEphemeralPost(\n message,\n context.channel_id,\n context.root_id || context.post_id,\n response.app_metadata?.bot_user_id,\n );\n}\n\nexport function postEphemeralCallResponseForCommandArgs(response: AppCallResponse, message: string, args: CommandArgs) {\n return sendEphemeralPost(\n message,\n args.channel_id,\n args.root_id,\n response.app_metadata?.bot_user_id,\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport {CloudTypes} from 'mattermost-redux/action_types';\nimport {getCloudCustomer, getCloudProducts, getCloudSubscription, getInvoices} from 'mattermost-redux/actions/cloud';\nimport {Client4} from 'mattermost-redux/client';\nimport {getCloudErrors} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport type {ActionFunc, ThunkActionFunc} from 'types/store';\n\nexport function getInstallation() {\n return async () => {\n try {\n const installation = await Client4.getInstallation();\n return {data: installation};\n } catch (e: any) {\n return {error: e.message};\n }\n };\n}\n\nexport function validateBusinessEmail(email = '') {\n trackEvent('api', 'api_validate_business_email');\n return async () => {\n try {\n const res = await Client4.validateBusinessEmail(email);\n return res.data.is_valid;\n } catch (error) {\n return false;\n }\n };\n}\n\nexport function validateWorkspaceBusinessEmail() {\n trackEvent('api', 'api_validate_workspace_business_email');\n return async () => {\n try {\n const res = await Client4.validateWorkspaceBusinessEmail();\n return res.data.is_valid;\n } catch (error) {\n return false;\n }\n };\n}\n\nexport function getCloudLimits(): ThunkActionFunc<Promise<boolean | ServerError>> {\n return async (dispatch) => {\n try {\n dispatch({\n type: CloudTypes.CLOUD_LIMITS_REQUEST,\n });\n const result = await Client4.getCloudLimits();\n if (result) {\n dispatch({\n type: CloudTypes.RECEIVED_CLOUD_LIMITS,\n data: result,\n });\n }\n } catch (error) {\n dispatch({\n type: CloudTypes.CLOUD_LIMITS_FAILED,\n });\n return error;\n }\n return true;\n };\n}\n\nexport function getMessagesUsage(): ThunkActionFunc<Promise<boolean | ServerError>> {\n return async (dispatch) => {\n try {\n const result = await Client4.getPostsUsage();\n if (result) {\n dispatch({\n type: CloudTypes.RECEIVED_MESSAGES_USAGE,\n data: result.count,\n });\n }\n } catch (error) {\n return error;\n }\n return true;\n };\n}\n\nexport function getFilesUsage(): ThunkActionFunc<Promise<boolean | ServerError>> {\n return async (dispatch) => {\n try {\n const result = await Client4.getFilesUsage();\n\n if (result) {\n // match limit notation in bits\n const inBits = result.bytes * 8;\n dispatch({\n type: CloudTypes.RECEIVED_FILES_USAGE,\n data: inBits,\n });\n }\n } catch (error) {\n return error;\n }\n return {data: true};\n };\n}\n\nexport function getTeamsUsage(): ThunkActionFunc<Promise<boolean | ServerError>> {\n return async (dispatch) => {\n try {\n const result = await Client4.getTeamsUsage();\n if (result) {\n dispatch({\n type: CloudTypes.RECEIVED_TEAMS_USAGE,\n data: {active: result.active, cloudArchived: result.cloud_archived},\n });\n }\n } catch (error) {\n return error;\n }\n return {data: false};\n };\n}\n\nexport function retryFailedCloudFetches(): ActionFunc<boolean> {\n return (dispatch, getState) => {\n const errors = getCloudErrors(getState());\n if (Object.keys(errors).length === 0) {\n return {data: true};\n }\n\n if (errors.subscription) {\n dispatch(getCloudSubscription());\n }\n\n if (errors.products) {\n dispatch(getCloudProducts());\n }\n\n if (errors.customer) {\n dispatch(getCloudCustomer());\n }\n\n if (errors.invoices) {\n dispatch(getInvoices());\n }\n\n if (errors.limits) {\n dispatch(getCloudLimits());\n }\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {FileTypes} from 'mattermost-redux/action_types';\nimport {getLogErrorAction} from 'mattermost-redux/actions/errors';\nimport {forceLogoutIfNecessary} from 'mattermost-redux/actions/helpers';\nimport {Client4} from 'mattermost-redux/client';\n\nimport type {FilePreviewInfo} from 'components/file_preview/file_preview';\n\nimport {localizeMessage} from 'utils/utils';\n\nimport type {ThunkActionFunc} from 'types/store';\n\nexport interface UploadFile {\n file: File;\n name: string;\n type: string;\n rootId: string;\n channelId: string;\n clientId: string;\n onProgress: (filePreviewInfo: FilePreviewInfo) => void;\n onSuccess: (data: any, channelId: string, rootId: string) => void;\n onError: (err: string | ServerError, clientId: string, channelId: string, rootId: string) => void;\n}\n\nexport function uploadFile({file, name, type, rootId, channelId, clientId, onProgress, onSuccess, onError}: UploadFile, isBookmark?: boolean): ThunkActionFunc<XMLHttpRequest> {\n return (dispatch, getState) => {\n dispatch({type: FileTypes.UPLOAD_FILES_REQUEST});\n\n let url = Client4.getFilesRoute();\n if (isBookmark) {\n url += '?bookmark=true';\n }\n\n const xhr = new XMLHttpRequest();\n\n xhr.open('POST', url, true);\n\n const client4Headers = Client4.getOptions({method: 'POST'}).headers;\n Object.keys(client4Headers).forEach((client4Header) => {\n const client4HeaderValue = client4Headers[client4Header];\n if (client4HeaderValue) {\n xhr.setRequestHeader(client4Header, client4HeaderValue);\n }\n });\n\n xhr.setRequestHeader('Accept', 'application/json');\n\n const formData = new FormData();\n formData.append('channel_id', channelId);\n formData.append('client_ids', clientId);\n formData.append('files', file, name); // appending file in the end for steaming support\n\n if (onProgress && xhr.upload) {\n xhr.upload.onprogress = (event) => {\n const percent = Math.floor((event.loaded / event.total) * 100);\n const filePreviewInfo = {\n clientId,\n name,\n percent,\n type,\n } as FilePreviewInfo;\n onProgress(filePreviewInfo);\n };\n }\n\n if (onSuccess) {\n xhr.onload = () => {\n if (xhr.status === 201 && xhr.readyState === 4) {\n const response = JSON.parse(xhr.response);\n const data = response.file_infos.map((fileInfo: FileInfo, index: number) => {\n return {\n ...fileInfo,\n clientId: response.client_ids[index],\n };\n });\n\n dispatch(batchActions([\n {\n type: FileTypes.RECEIVED_UPLOAD_FILES,\n data,\n channelId,\n rootId,\n },\n {\n type: FileTypes.UPLOAD_FILES_SUCCESS,\n },\n ]));\n\n onSuccess(response, channelId, rootId);\n } else if (xhr.status >= 400 && xhr.readyState === 4) {\n let errorMessage = '';\n try {\n const errorResponse = JSON.parse(xhr.response);\n errorMessage =\n (errorResponse?.id && errorResponse?.message) ? localizeMessage({id: errorResponse.id, defaultMessage: errorResponse.message}) : localizeMessage({id: 'file_upload.generic_error', defaultMessage: 'There was a problem uploading your files.'});\n } catch (e) {\n errorMessage = localizeMessage({id: 'file_upload.generic_error', defaultMessage: 'There was a problem uploading your files.'});\n }\n\n dispatch({\n type: FileTypes.UPLOAD_FILES_FAILURE,\n clientIds: [clientId],\n channelId,\n rootId,\n });\n\n onError?.(errorMessage, clientId, channelId, rootId);\n }\n };\n }\n\n if (onError) {\n xhr.onerror = () => {\n if (xhr.readyState === 4 && xhr.responseText.length !== 0) {\n const errorResponse = JSON.parse(xhr.response);\n\n forceLogoutIfNecessary(errorResponse, dispatch, getState);\n\n const uploadFailureAction = {\n type: FileTypes.UPLOAD_FILES_FAILURE,\n clientIds: [clientId],\n channelId,\n rootId,\n error: errorResponse,\n };\n\n dispatch(batchActions([uploadFailureAction, getLogErrorAction(errorResponse)]));\n onError(errorResponse, clientId, channelId, rootId);\n } else {\n const errorMessage = xhr.status === 0 || !xhr.status ? localizeMessage({id: 'file_upload.generic_error', defaultMessage: 'There was a problem uploading your files.'}) : localizeMessage({id: 'channel_loader.unknown_error', defaultMessage: 'We received an unexpected status code from the server.'}) + ' (' + xhr.status + ')';\n\n dispatch({\n type: FileTypes.UPLOAD_FILES_FAILURE,\n clientIds: [clientId],\n channelId,\n rootId,\n });\n\n onError({message: errorMessage}, clientId, channelId, rootId);\n }\n };\n }\n\n xhr.send(formData);\n\n return xhr;\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo, useState} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {useIntl} from 'react-intl';\n\nimport Menu from '../../menu';\nimport type SubMenuItem from '../../menu_items/submenu_item';\nimport MenuWrapper from '../../menu_wrapper';\n\nimport './submenu_modal.scss';\n\ntype Props = {\n elements?: Array<React.ComponentProps<typeof SubMenuItem>>;\n onExited: () => void;\n}\n\nconst SubMenuModal = ({\n elements,\n onExited,\n}: Props) => {\n const [show, setShow] = useState(true);\n const intl = useIntl();\n\n const onHide = useCallback(() => {\n setShow(false);\n }, []);\n\n const subMenuItems = useMemo(() => {\n if (!elements) {\n return undefined;\n }\n return elements.map(\n (element) => (\n <Menu.ItemSubMenu\n key={element.id}\n id={element.id}\n text={element.text}\n subMenu={element.subMenu}\n action={element.action}\n filter={element.filter}\n root={false}\n />),\n );\n }, [elements]);\n\n return (\n <Modal\n dialogClassName={'SubMenuModal a11y__modal mobile-sub-menu'}\n show={show}\n onHide={onHide}\n onExited={onExited}\n enforceFocus={false}\n id='submenuModal'\n role='none'\n >\n <Modal.Body\n data-testid={'SubMenuModalBody'}\n onClick={onHide}\n >\n <MenuWrapper>\n <Menu\n openLeft={true}\n ariaLabel={intl.formatMessage({id: 'post_info.submenu.mobile', defaultMessage: 'mobile submenu'})}\n >\n {subMenuItems}\n </Menu>\n <div/>\n </MenuWrapper>\n </Modal.Body>\n </Modal>\n );\n};\n\nexport default React.memo(SubMenuModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {Post} from '@mattermost/types/posts';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {ChannelTypes} from 'mattermost-redux/action_types';\nimport {fetchAppBindings} from 'mattermost-redux/actions/apps';\nimport {\n fetchChannelsAndMembers,\n getChannelByNameAndTeamName,\n getChannelStats,\n selectChannel,\n} from 'mattermost-redux/actions/channels';\nimport {fetchTeamScheduledPosts} from 'mattermost-redux/actions/scheduled_posts';\nimport {logout, loadMe} from 'mattermost-redux/actions/users';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {getCurrentChannelStats, getCurrentChannelId, getMyChannelMember, getRedirectChannelNameForTeam, getChannelsNameMapInTeam, getAllDirectChannels, getChannelMessageCount} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig, isPerformanceDebuggingEnabled} from 'mattermost-redux/selectors/entities/general';\nimport {getBool, getIsOnboardingFlowEnabled, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeamId, getMyTeams, getTeam, getMyTeamMember, getTeamMemberships, getActiveTeamsList} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser, getCurrentUserId, isFirstAdmin} from 'mattermost-redux/selectors/entities/users';\nimport {calculateUnreadCount} from 'mattermost-redux/utils/channel_utils';\n\nimport {handleNewPost} from 'actions/post_actions';\nimport {loadProfilesForSidebar} from 'actions/user_actions';\nimport {clearUserCookie} from 'actions/views/cookie';\nimport {close as closeLhs} from 'actions/views/lhs';\nimport {closeRightHandSide, closeMenu as closeRhsMenu, updateRhsState} from 'actions/views/rhs';\nimport * as WebsocketActions from 'actions/websocket_actions.jsx';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {getIsRhsOpen, getPreviousRhsState, getRhsState} from 'selectors/rhs';\nimport BrowserStore from 'stores/browser_store';\nimport LocalStorageStore from 'stores/local_storage_store';\nimport store from 'stores/redux_store';\n\nimport SubMenuModal from 'components/widgets/menu/menu_modals/submenu_modal/submenu_modal';\n\nimport WebSocketClient from 'client/web_websocket_client';\nimport {getHistory} from 'utils/browser_history';\nimport {ActionTypes, PostTypes, RHSStates, ModalIdentifiers, PreviousViewedTypes} from 'utils/constants';\nimport DesktopApp from 'utils/desktop_api';\nimport {filterAndSortTeamsByDisplayName} from 'utils/team_utils';\nimport * as Utils from 'utils/utils';\n\nimport type {ActionFuncAsync, ThunkActionFunc, GlobalState} from 'types/store';\n\nimport {openModal} from './views/modals';\n\nconst dispatch = store.dispatch;\nconst getState = store.getState;\n\nexport function emitChannelClickEvent(channel: Channel) {\n function switchToChannel(chan: Channel) {\n const state = getState();\n const userId = getCurrentUserId(state);\n const teamId = chan.team_id || getCurrentTeamId(state);\n const isRHSOpened = getIsRhsOpen(state);\n const isPinnedPostsShowing = getRhsState(state) === RHSStates.PIN;\n const isChannelFilesShowing = getRhsState(state) === RHSStates.CHANNEL_FILES;\n const member = getMyChannelMember(state, chan.id);\n const currentChannelId = getCurrentChannelId(state);\n const previousRhsState = getPreviousRhsState(state);\n\n dispatch(getChannelStats(chan.id));\n\n const penultimate = LocalStorageStore.getPreviousChannelName(userId, teamId);\n const penultimateType = LocalStorageStore.getPreviousViewedType(userId, teamId);\n if (penultimate !== chan.name) {\n LocalStorageStore.setPenultimateChannelName(userId, teamId, penultimate);\n LocalStorageStore.setPreviousChannelName(userId, teamId, chan.name);\n }\n\n if (penultimateType !== PreviousViewedTypes.CHANNELS || penultimate !== chan.name) {\n LocalStorageStore.setPreviousViewedType(userId, teamId, PreviousViewedTypes.CHANNELS);\n LocalStorageStore.setPenultimateViewedType(userId, teamId, penultimateType);\n }\n\n // When switching to a different channel if the pinned posts is showing\n // Update the RHS state to reflect the pinned post of the selected channel\n if (isRHSOpened && isPinnedPostsShowing) {\n dispatch(updateRhsState(RHSStates.PIN, chan.id, previousRhsState));\n }\n\n if (isRHSOpened && isChannelFilesShowing) {\n dispatch(updateRhsState(RHSStates.CHANNEL_FILES, chan.id, previousRhsState));\n }\n\n if (currentChannelId) {\n loadProfilesForSidebar();\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.SELECT_CHANNEL,\n data: chan.id,\n },\n {\n type: ActionTypes.SELECT_CHANNEL_WITH_MEMBER,\n data: chan.id,\n channel: chan,\n member: member || {},\n },\n setLastUnreadChannel(state, chan),\n ]));\n\n if (appsEnabled(state)) {\n dispatch(fetchAppBindings(chan.id));\n }\n }\n\n switchToChannel(channel);\n}\n\nfunction setLastUnreadChannel(state: GlobalState, channel: Channel) {\n const member = getMyChannelMember(state, channel.id);\n const messageCount = getChannelMessageCount(state, channel.id);\n\n let hadMentions = false;\n let hadUnreads = false;\n if (member && messageCount) {\n const crtEnabled = isCollapsedThreadsEnabled(state);\n\n const unreadCount = calculateUnreadCount(messageCount, member, crtEnabled);\n\n hadMentions = unreadCount.mentions > 0;\n hadUnreads = unreadCount.showUnread && unreadCount.messages > 0;\n }\n\n return {\n type: ActionTypes.SET_LAST_UNREAD_CHANNEL,\n channelId: channel.id,\n hadMentions,\n hadUnreads,\n };\n}\n\nexport const clearLastUnreadChannel = {\n type: ActionTypes.SET_LAST_UNREAD_CHANNEL,\n channelId: '',\n};\n\nexport function updateNewMessagesAtInChannel(channelId: string, lastViewedAt = Date.now()) {\n return {\n type: ActionTypes.UPDATE_CHANNEL_LAST_VIEWED_AT,\n channel_id: channelId,\n last_viewed_at: lastViewedAt,\n };\n}\n\nexport function emitCloseRightHandSide() {\n dispatch(closeRightHandSide());\n}\n\nexport function showMobileSubMenuModal(elements: any[]) { // TODO Use more specific type\n const submenuModalData = {\n modalId: ModalIdentifiers.MOBILE_SUBMENU,\n dialogType: SubMenuModal,\n dialogProps: {\n elements,\n },\n };\n\n dispatch(openModal(submenuModalData));\n}\n\nexport function sendEphemeralPost(message: string, channelId?: string, parentId?: string, userId?: string): ActionFuncAsync<boolean> {\n return (doDispatch, doGetState) => {\n const timestamp = Utils.getTimestamp();\n const post = {\n id: Utils.generateId(),\n user_id: userId || '0',\n channel_id: channelId || getCurrentChannelId(doGetState()),\n message,\n type: PostTypes.EPHEMERAL,\n create_at: timestamp,\n update_at: timestamp,\n root_id: parentId || '',\n props: {},\n } as Post;\n\n return doDispatch(handleNewPost(post));\n };\n}\n\nexport function sendAddToChannelEphemeralPost(user: UserProfile, addedUsername: string, addedUserId: string, channelId: string, postRootId = '', timestamp: number) {\n const post = {\n id: Utils.generateId(),\n user_id: user.id,\n channel_id: channelId || getCurrentChannelId(getState()),\n message: '',\n type: PostTypes.EPHEMERAL_ADD_TO_CHANNEL,\n create_at: timestamp,\n update_at: timestamp,\n root_id: postRootId,\n props: {\n username: user.username,\n addedUsername,\n addedUserId,\n },\n } as unknown as Post;\n\n dispatch(handleNewPost(post));\n}\n\nlet lastTimeTypingSent = 0;\nexport function emitLocalUserTypingEvent(channelId: string, parentPostId: string) {\n const userTyping: ActionFuncAsync = async (actionDispatch, actionGetState) => {\n const state = actionGetState();\n const config = getConfig(state);\n\n if (\n isPerformanceDebuggingEnabled(state) &&\n getBool(state, Preferences.CATEGORY_PERFORMANCE_DEBUGGING, Preferences.NAME_DISABLE_TYPING_MESSAGES)\n ) {\n return {data: false};\n }\n\n const t = Date.now();\n const stats = getCurrentChannelStats(state);\n const membersInChannel = stats ? stats.member_count : 0;\n\n const timeBetweenUserTypingUpdatesMilliseconds = Utils.stringToNumber(config.TimeBetweenUserTypingUpdatesMilliseconds);\n const maxNotificationsPerChannel = Utils.stringToNumber(config.MaxNotificationsPerChannel);\n\n if (((t - lastTimeTypingSent) > timeBetweenUserTypingUpdatesMilliseconds) &&\n (membersInChannel < maxNotificationsPerChannel) && (config.EnableUserTypingMessages === 'true')) {\n WebSocketClient.userTyping(channelId, parentPostId);\n lastTimeTypingSent = t;\n }\n\n return {data: true};\n };\n\n return dispatch(userTyping);\n}\n\nexport function emitUserLoggedOutEvent(redirectTo = '/', shouldSignalLogout = true, userAction = true) {\n // If the logout was intentional, discard knowledge about having previously been logged in.\n // This bit is otherwise used to detect session expirations on the login page.\n if (userAction) {\n LocalStorageStore.setWasLoggedIn(false);\n }\n\n dispatch(logout()).then(() => {\n if (shouldSignalLogout) {\n BrowserStore.signalLogout();\n DesktopApp.signalLogout();\n }\n\n BrowserStore.clearHideNotificationPermissionRequestBanner();\n\n WebsocketActions.close();\n\n clearUserCookie();\n\n getHistory().push(redirectTo);\n }).catch(() => {\n getHistory().push(redirectTo);\n });\n}\n\nexport function toggleSideBarRightMenuAction(): ThunkActionFunc<void> {\n return (doDispatch) => {\n doDispatch(closeRightHandSide());\n doDispatch(closeLhs());\n doDispatch(closeRhsMenu());\n };\n}\n\nexport function emitBrowserFocus(focus: boolean) {\n dispatch({\n type: ActionTypes.BROWSER_CHANGE_FOCUS,\n focus,\n });\n}\n\nexport async function getTeamRedirectChannelIfIsAccesible(user: UserProfile, team: Team) {\n let state = getState();\n let channel = null;\n\n const myMember = getMyTeamMember(state, team.id);\n if (!myMember || Object.keys(myMember).length === 0) {\n return null;\n }\n\n let teamChannels = getChannelsNameMapInTeam(state, team.id);\n if (!teamChannels || Object.keys(teamChannels).length === 0) {\n // This should be executed in pretty limited scenarios (empty teams)\n await dispatch(fetchChannelsAndMembers(team.id)); // eslint-disable-line no-await-in-loop\n state = getState();\n teamChannels = getChannelsNameMapInTeam(state, team.id);\n }\n\n const channelName = LocalStorageStore.getPreviousChannelName(user.id, team.id);\n channel = teamChannels[channelName];\n\n if (typeof channel === 'undefined') {\n const dmList = getAllDirectChannels(state);\n channel = dmList.find((directChannel) => directChannel.name === channelName);\n }\n\n let channelMember: ChannelMembership | undefined;\n if (channel) {\n channelMember = getMyChannelMember(state, channel.id);\n }\n\n if (!channel || !channelMember) {\n // This should be executed in pretty limited scenarios (when the last visited channel in the team has been removed)\n await dispatch(getChannelByNameAndTeamName(team.name, channelName)); // eslint-disable-line no-await-in-loop\n state = getState();\n teamChannels = getChannelsNameMapInTeam(state, team.id);\n channel = teamChannels[channelName];\n channelMember = getMyChannelMember(state, channel && channel.id);\n }\n\n if (!channel || !channelMember) {\n const redirectedChannelName = getRedirectChannelNameForTeam(state, team.id);\n channel = teamChannels[redirectedChannelName];\n channelMember = getMyChannelMember(state, channel && channel.id);\n }\n\n if (channel && channelMember) {\n return channel;\n }\n return null;\n}\n\nfunction historyPushWithQueryParams(path: string, queryParams?: URLSearchParams) {\n if (queryParams) {\n getHistory().push({\n pathname: path,\n search: queryParams.toString(),\n });\n } else {\n getHistory().push(path);\n }\n}\n\nexport async function redirectUserToDefaultTeam(searchParams?: URLSearchParams) {\n let state = getState();\n\n // Assume we need to load the user if they don't have any team memberships loaded or the user loaded\n let user = getCurrentUser(state);\n const shouldLoadUser = Utils.isEmptyObject(getTeamMemberships(state)) || !user;\n const onboardingFlowEnabled = getIsOnboardingFlowEnabled(state);\n if (shouldLoadUser) {\n await dispatch(loadMe());\n state = getState();\n user = getCurrentUser(state);\n }\n\n if (!user) {\n return;\n }\n\n // if the user is the first admin\n const isUserFirstAdmin = isFirstAdmin(state);\n\n const locale = getCurrentLocale(state);\n const teamId = LocalStorageStore.getPreviousTeamId(user.id);\n\n let myTeams = getMyTeams(state);\n const teams = getActiveTeamsList(state);\n if (teams.length === 0) {\n if (isUserFirstAdmin && onboardingFlowEnabled) {\n historyPushWithQueryParams('/preparing-workspace', searchParams);\n return;\n }\n\n historyPushWithQueryParams('/select_team', searchParams);\n return;\n }\n\n let team: Team | undefined;\n if (teamId) {\n team = getTeam(state, teamId);\n }\n\n if (team && team.delete_at === 0) {\n const channel = await getTeamRedirectChannelIfIsAccesible(user, team);\n if (channel) {\n dispatch(fetchTeamScheduledPosts(team.id, true));\n dispatch(selectChannel(channel.id));\n historyPushWithQueryParams(`/${team.name}/channels/${channel.name}`, searchParams);\n return;\n }\n }\n\n myTeams = filterAndSortTeamsByDisplayName(myTeams, locale);\n\n for (const myTeam of myTeams) {\n // This should execute async behavior in a pretty limited set of situations, so shouldn't be a problem\n const channel = await getTeamRedirectChannelIfIsAccesible(user, myTeam); // eslint-disable-line no-await-in-loop\n if (channel) {\n dispatch(selectChannel(channel.id));\n historyPushWithQueryParams(`/${myTeam.name}/channels/${channel.name}`, searchParams);\n return;\n }\n }\n\n historyPushWithQueryParams('/select_team', searchParams);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function setAddChannelDropdown(open: boolean) {\n return {\n type: ActionTypes.ADD_CHANNEL_DROPDOWN_TOGGLE,\n open,\n };\n}\n\nexport function setAddChannelCtaDropdown(open: boolean) {\n return {\n type: ActionTypes.ADD_CHANNEL_CTA_DROPDOWN_TOGGLE,\n open,\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AnyAction} from 'redux';\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {UserAutocomplete} from '@mattermost/types/autocomplete';\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {TeamTypes} from 'mattermost-redux/action_types';\nimport {\n leaveChannel as leaveChannelRedux,\n joinChannel,\n markChannelAsRead,\n unfavoriteChannel,\n deleteChannel as deleteChannelRedux,\n getChannel as loadChannel,\n} from 'mattermost-redux/actions/channels';\nimport * as PostActions from 'mattermost-redux/actions/posts';\nimport {selectTeam} from 'mattermost-redux/actions/teams';\nimport {autocompleteUsers} from 'mattermost-redux/actions/users';\nimport {Posts, RequestStatus} from 'mattermost-redux/constants';\nimport {\n getChannel,\n getChannelsNameMapInCurrentTeam,\n getCurrentChannel,\n getRedirectChannelNameForTeam,\n getMyChannels,\n getMyChannelMemberships,\n getAllDirectChannelsNameMapInCurrentTeam,\n isFavoriteChannel,\n isManuallyUnread,\n getCurrentChannelId,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getMostRecentPostIdInChannel, getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {\n getCurrentRelativeTeamUrl,\n getCurrentTeam,\n getCurrentTeamId,\n getRelativeTeamUrl,\n getTeamsList,\n} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId, getUserByUsername} from 'mattermost-redux/selectors/entities/users';\nimport {makeAddLastViewAtToProfiles} from 'mattermost-redux/selectors/entities/utils';\nimport {getChannelByName} from 'mattermost-redux/utils/channel_utils';\nimport EventEmitter from 'mattermost-redux/utils/event_emitter';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions';\nimport {loadCustomStatusEmojisForPostList} from 'actions/emoji_actions';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {markThreadAsRead} from 'actions/views/threads';\nimport {getLastViewedChannelName} from 'selectors/local_storage';\nimport {getSelectedPost, getSelectedPostId} from 'selectors/rhs';\nimport {getLastPostsApiTimeForChannel} from 'selectors/views/channel';\nimport {getSelectedThreadIdInCurrentTeam} from 'selectors/views/threads';\nimport {getSocketStatus} from 'selectors/views/websocket';\nimport LocalStorageStore from 'stores/local_storage_store';\n\nimport {getHistory} from 'utils/browser_history';\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport {Constants, ActionTypes, EventTypes, PostRequestTypes} from 'utils/constants';\n\nimport type {ActionFuncAsync, ThunkActionFunc} from 'types/store';\n\nexport function goToLastViewedChannel(): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const currentChannel = getCurrentChannel(state);\n const channelsInTeam = getChannelsNameMapInCurrentTeam(state);\n const directChannel = getAllDirectChannelsNameMapInCurrentTeam(state);\n const channels = Object.assign({}, channelsInTeam, directChannel);\n\n let channelToSwitchTo = getChannelByName(channels, getLastViewedChannelName(state));\n\n if (currentChannel?.id === channelToSwitchTo!.id) {\n channelToSwitchTo = getChannelByName(channels, getRedirectChannelNameForTeam(state, getCurrentTeamId(state)));\n }\n\n return dispatch(switchToChannel(channelToSwitchTo!));\n };\n}\n\nexport function switchToChannelById(channelId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const channel = getChannel(state, channelId);\n if (channel) {\n return dispatch(switchToChannel(channel));\n }\n return {data: true};\n };\n}\n\nexport function loadIfNecessaryAndSwitchToChannelById(channelId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n let channel = getChannel(state, channelId);\n if (!channel) {\n const res = await dispatch(loadChannel(channelId));\n channel = res.data!;\n }\n return dispatch(switchToChannel(channel));\n };\n}\n\nexport function switchToChannel(channel: Channel & {userId?: string}): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const selectedTeamId = channel.team_id;\n const teamUrl = selectedTeamId ? getRelativeTeamUrl(state, selectedTeamId) : getCurrentRelativeTeamUrl(state);\n\n if (channel.userId) {\n const username = channel.userId ? channel.name : channel.display_name;\n const user = getUserByUsername(state, username);\n if (!user) {\n return {error: true};\n }\n\n const direct = await dispatch(openDirectChannelToUserId(user.id));\n if (direct.error) {\n return {error: true};\n }\n getHistory().push(`${teamUrl}/messages/@${channel.name}`);\n } else if (channel.type === Constants.GM_CHANNEL) {\n const gmChannel = getChannel(state, channel.id);\n if (!gmChannel?.name) {\n return {error: true};\n }\n getHistory().push(`${teamUrl}/channels/${gmChannel.name}`);\n } else if (channel.type === Constants.THREADS) {\n getHistory().push(`${teamUrl}/${channel.name}`);\n } else {\n getHistory().push(`${teamUrl}/channels/${channel.name}`);\n }\n\n return {data: true};\n };\n}\n\nexport function joinChannelById(channelId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n const currentTeamId = getCurrentTeamId(state);\n\n return dispatch(joinChannel(currentUserId, currentTeamId, channelId));\n };\n}\n\nexport function leaveChannel(channelId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n let state = getState();\n const currentUserId = getCurrentUserId(state);\n const currentTeam = getCurrentTeam(state);\n if (!currentTeam) {\n return {data: false};\n }\n const channel = getChannel(state, channelId);\n const currentChannelId = getCurrentChannelId(state);\n\n if (isFavoriteChannel(state, channelId)) {\n dispatch(unfavoriteChannel(channelId));\n }\n\n const teamUrl = getCurrentRelativeTeamUrl(state);\n\n if (!isArchivedChannel(channel)) {\n LocalStorageStore.removePreviousChannel(currentUserId, currentTeam.id, state);\n }\n const {error} = await dispatch(leaveChannelRedux(channelId));\n if (error) {\n return {error};\n }\n state = getState();\n\n const prevChannelName = LocalStorageStore.getPreviousChannelName(currentUserId, currentTeam.id, state);\n const channelsInTeam = getChannelsNameMapInCurrentTeam(state);\n const prevChannel = getChannelByName(channelsInTeam, prevChannelName);\n if (!prevChannel || !getMyChannelMemberships(state)[prevChannel.id]) {\n LocalStorageStore.removePreviousChannel(currentUserId, currentTeam.id, state);\n }\n const selectedPost = getSelectedPost(state);\n const selectedPostId = getSelectedPostId(state);\n if (selectedPostId && selectedPost.exists === false) {\n dispatch(closeRightHandSide());\n }\n\n if (getMyChannels(getState()).filter((c) => c.type === Constants.OPEN_CHANNEL || c.type === Constants.PRIVATE_CHANNEL).length === 0) {\n LocalStorageStore.removePreviousChannel(currentUserId, currentTeam.id, state);\n dispatch(selectTeam(''));\n dispatch({type: TeamTypes.LEAVE_TEAM, data: currentTeam});\n getHistory().push('/');\n } else if (channelId === currentChannelId) {\n // We only need to leave the channel if we are in the channel\n getHistory().push(teamUrl);\n }\n\n return {\n data: true,\n };\n };\n}\n\nexport function leaveDirectChannel(channelName: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n const teams = getTeamsList(state); // dms are shared across teams but on local storage are set linked to one, we need to look into all.\n teams.forEach((currentTeam) => {\n const previousChannel = LocalStorageStore.getPreviousChannelName(currentUserId, currentTeam.id, state);\n const penultimateChannel = LocalStorageStore.getPenultimateChannelName(currentUserId, currentTeam.id, state);\n if (channelName === previousChannel) {\n LocalStorageStore.removePreviousChannel(currentUserId, currentTeam.id, state);\n } else if (channelName === penultimateChannel) {\n LocalStorageStore.removePenultimateChannelName(currentUserId, currentTeam.id);\n }\n });\n return {\n data: true,\n };\n };\n}\n\nexport function autocompleteUsersInChannel(prefix: string, channelId: string): ActionFuncAsync<UserAutocomplete> {\n const addLastViewAtToProfiles = makeAddLastViewAtToProfiles();\n return async (dispatch, getState) => {\n const state = getState();\n const currentTeamId = getCurrentTeamId(state);\n\n const response = await dispatch(autocompleteUsers(prefix, currentTeamId, channelId));\n\n const data = response.data;\n if (data) {\n return {\n ...response,\n data: {\n ...data,\n users: addLastViewAtToProfiles(state, data.users || []),\n out_of_channel: addLastViewAtToProfiles(state, data.out_of_channel || []),\n },\n };\n }\n\n return response;\n };\n}\n\nexport function loadUnreads(channelId: string, prefetch = false): ActionFuncAsync<{atLatestMessage: boolean; atOldestMessage: boolean}> {\n return async (dispatch) => {\n const time = Date.now();\n if (prefetch) {\n dispatch({\n type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n channelId,\n status: RequestStatus.STARTED,\n });\n }\n const {data, error} = await dispatch(PostActions.getPostsUnread(channelId));\n if (error) {\n if (prefetch) {\n dispatch({\n type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n channelId,\n status: RequestStatus.FAILURE,\n });\n }\n return {\n error,\n atLatestMessage: false,\n atOldestmessage: false,\n };\n }\n dispatch(loadCustomStatusEmojisForPostList(data!.posts));\n\n const actions = [];\n actions.push({\n type: ActionTypes.INCREASE_POST_VISIBILITY,\n data: channelId,\n amount: data!.order.length,\n });\n\n if (prefetch) {\n actions.push({\n type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n channelId,\n status: RequestStatus.SUCCESS,\n });\n }\n\n if (data!.next_post_id === '') {\n actions.push({\n type: ActionTypes.RECEIVED_POSTS_FOR_CHANNEL_AT_TIME,\n channelId,\n time,\n });\n }\n\n dispatch(batchActions(actions));\n return {\n atLatestMessage: data!.next_post_id === '',\n atOldestmessage: data!.prev_post_id === '',\n };\n };\n}\n\nexport function loadPostsAround(channelId: string, focusedPostId: string): ActionFuncAsync {\n return async (dispatch) => {\n const {data, error} = await dispatch(PostActions.getPostsAround(channelId, focusedPostId, Posts.POST_CHUNK_SIZE / 2));\n if (error) {\n return {\n error,\n atLatestMessage: false,\n atOldestmessage: false,\n };\n }\n\n dispatch({\n type: ActionTypes.INCREASE_POST_VISIBILITY,\n data: channelId,\n amount: data!.order.length,\n });\n return {\n atLatestMessage: data!.next_post_id === '',\n atOldestmessage: data!.prev_post_id === '',\n };\n };\n}\n\nexport function loadLatestPosts(channelId: string): ActionFuncAsync {\n return async (dispatch) => {\n const time = Date.now();\n const {data, error} = await dispatch(PostActions.getPosts(channelId, 0, Posts.POST_CHUNK_SIZE / 2));\n\n if (error) {\n return {\n error,\n atLatestMessage: false,\n atOldestmessage: false,\n };\n }\n\n dispatch({\n type: ActionTypes.RECEIVED_POSTS_FOR_CHANNEL_AT_TIME,\n channelId,\n time,\n });\n\n return {\n data,\n atLatestMessage: data!.next_post_id === '',\n atOldestmessage: data!.prev_post_id === '',\n };\n };\n}\n\nexport interface LoadPostsReturnValue {\n error?: string;\n moreToLoad: boolean;\n}\n\nexport type CanLoadMorePosts = typeof PostRequestTypes[keyof typeof PostRequestTypes] | undefined\n\nexport interface LoadPostsParameters {\n channelId: string;\n postId: string;\n type: CanLoadMorePosts;\n}\n\nexport function loadPosts({\n channelId,\n postId,\n type,\n}: LoadPostsParameters): ThunkActionFunc<Promise<LoadPostsReturnValue>> {\n //type here can be BEFORE_ID or AFTER_ID\n return async (dispatch) => {\n const POST_INCREASE_AMOUNT = Constants.POST_CHUNK_SIZE / 2;\n\n dispatch({\n type: ActionTypes.LOADING_POSTS,\n data: true,\n channelId,\n });\n\n const page = 0;\n let result;\n if (type === PostRequestTypes.BEFORE_ID) {\n result = await dispatch(PostActions.getPostsBefore(channelId, postId, page, POST_INCREASE_AMOUNT));\n } else {\n result = await dispatch(PostActions.getPostsAfter(channelId, postId, page, POST_INCREASE_AMOUNT));\n }\n\n const {data} = result;\n\n const actions: AnyAction[] = [{\n type: ActionTypes.LOADING_POSTS,\n data: false,\n channelId,\n }];\n\n if (result.error) {\n return {\n error: result.error,\n moreToLoad: true,\n };\n }\n\n dispatch(loadCustomStatusEmojisForPostList(data!.posts));\n actions.push({\n type: ActionTypes.INCREASE_POST_VISIBILITY,\n data: channelId,\n amount: data!.order.length,\n });\n\n dispatch(batchActions(actions));\n\n return {\n moreToLoad: type === PostRequestTypes.BEFORE_ID ? data!.prev_post_id !== '' : data!.next_post_id !== '',\n };\n };\n}\n\nexport function syncPostsInChannel(channelId: string, since: number, prefetch = false): ActionFuncAsync {\n return async (dispatch, getState) => {\n const time = Date.now();\n const state = getState();\n const socketStatus = getSocketStatus(state);\n let sinceTimeToGetPosts = since;\n const lastPostsApiCallForChannel = getLastPostsApiTimeForChannel(state, channelId);\n const actions = [];\n\n if (lastPostsApiCallForChannel && lastPostsApiCallForChannel < socketStatus.lastDisconnectAt) {\n sinceTimeToGetPosts = lastPostsApiCallForChannel;\n }\n\n if (prefetch) {\n dispatch({\n type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n channelId,\n status: RequestStatus.STARTED,\n });\n }\n\n const {data, error} = await dispatch(PostActions.getPostsSince(channelId, sinceTimeToGetPosts));\n if (data) {\n actions.push({\n type: ActionTypes.RECEIVED_POSTS_FOR_CHANNEL_AT_TIME,\n channelId,\n time,\n });\n }\n\n if (prefetch) {\n if (error) {\n actions.push({\n type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n channelId,\n status: RequestStatus.FAILURE,\n });\n } else {\n actions.push({\n type: ActionTypes.PREFETCH_POSTS_FOR_CHANNEL,\n channelId,\n status: RequestStatus.SUCCESS,\n });\n }\n }\n\n dispatch(batchActions(actions));\n\n return {data, error};\n };\n}\n\nexport function prefetchChannelPosts(channelId: string, jitter?: number): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const recentPostIdInChannel = getMostRecentPostIdInChannel(state, channelId);\n\n if (!state.entities.posts.postsInChannel[channelId] || !recentPostIdInChannel) {\n if (jitter) {\n await new Promise((resolve) => setTimeout(resolve, jitter));\n }\n return dispatch(loadUnreads(channelId, true));\n }\n\n const recentPost = getPost(state, recentPostIdInChannel);\n return dispatch(syncPostsInChannel(channelId, recentPost.create_at, true));\n };\n}\n\nexport function scrollPostListToBottom() {\n return () => {\n EventEmitter.emit(EventTypes.POST_LIST_SCROLL_TO_BOTTOM);\n };\n}\n\nexport function markAsReadOnFocus(): ThunkActionFunc<void> {\n return (dispatch, getState) => {\n const state = getState();\n const currentChannelId = getCurrentChannelId(state);\n const selectedThreadId = getSelectedThreadIdInCurrentTeam(state);\n const selectedPostId = getSelectedPostId(state);\n\n if (!isManuallyUnread(getState(), currentChannelId)) {\n dispatch(markChannelAsRead(currentChannelId));\n }\n\n if (selectedThreadId) {\n dispatch(markThreadAsRead(selectedThreadId));\n }\n\n if (currentChannelId && selectedPostId) {\n dispatch(markThreadAsRead(selectedPostId));\n }\n };\n}\n\nexport function updateToastStatus(status: boolean) {\n return {\n type: ActionTypes.UPDATE_TOAST_STATUS,\n data: status,\n };\n}\n\nexport function deleteChannel(channelId: string): ActionFuncAsync<boolean> {\n return async (dispatch, getState) => {\n const res = await dispatch(deleteChannelRedux(channelId));\n if (res.error) {\n return {data: false};\n }\n const state = getState();\n\n const selectedPost = getSelectedPost(state);\n const selectedPostId = getSelectedPostId(state);\n if (selectedPostId && !selectedPost.exists) {\n dispatch(closeRightHandSide());\n }\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {CommandArgs} from '@mattermost/types/integrations';\nimport type {Post, PostMetadata} from '@mattermost/types/posts';\nimport type {SchedulingInfo} from '@mattermost/types/schedule_post';\nimport {scheduledPostFromPost} from '@mattermost/types/schedule_post';\n\nimport type {CreatePostReturnType, SubmitReactionReturnType} from 'mattermost-redux/actions/posts';\nimport {addMessageIntoHistory} from 'mattermost-redux/actions/posts';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCustomEmojisByName} from 'mattermost-redux/selectors/entities/emojis';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getAssociatedGroupsForReferenceByMention} from 'mattermost-redux/selectors/entities/groups';\nimport {\n getLatestInteractablePostId,\n getLatestPostToEdit,\n} from 'mattermost-redux/selectors/entities/posts';\nimport {isCustomGroupsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport type {ExecuteCommandReturnType} from 'actions/command';\nimport {executeCommand} from 'actions/command';\nimport {runMessageWillBePostedHooks, runSlashCommandWillBePostedHooks} from 'actions/hooks';\nimport * as PostActions from 'actions/post_actions';\nimport {createSchedulePostFromDraft} from 'actions/post_actions';\n\nimport EmojiMap from 'utils/emoji_map';\nimport {containsAtChannel, groupsMentionedInText} from 'utils/post_utils';\nimport * as Utils from 'utils/utils';\n\nimport type {ActionFunc, ActionFuncAsync, GlobalState} from 'types/store';\nimport type {PostDraft} from 'types/store/draft';\n\nexport function submitPost(\n channelId: string,\n rootId: string,\n draft: PostDraft,\n afterSubmit?: (response: SubmitPostReturnType) => void,\n schedulingInfo?: SchedulingInfo,\n options?: OnSubmitOptions,\n): ActionFuncAsync<CreatePostReturnType> {\n return async (dispatch, getState) => {\n const state = getState();\n\n const userId = getCurrentUserId(state);\n\n const time = Utils.getTimestamp();\n\n let post = {\n file_ids: [],\n message: draft.message,\n channel_id: channelId,\n root_id: rootId,\n pending_post_id: `${userId}:${time}`,\n user_id: userId,\n create_at: time,\n metadata: {...draft.metadata},\n props: {...draft.props},\n } as unknown as Post;\n\n const channel = getChannel(state, channelId);\n if (!channel) {\n return {error: new Error('cannot find channel')};\n }\n const useChannelMentions = haveIChannelPermission(state, channel.team_id, channel.id, Permissions.USE_CHANNEL_MENTIONS);\n if (!useChannelMentions && containsAtChannel(post.message, {checkAllMentions: true})) {\n post.props.mentionHighlightDisabled = true;\n }\n\n const license = getLicense(state);\n const isLDAPEnabled = license?.IsLicensed === 'true' && license?.LDAPGroups === 'true';\n const useLDAPGroupMentions = isLDAPEnabled && haveIChannelPermission(state, channel.team_id, channel.id, Permissions.USE_GROUP_MENTIONS);\n\n const useCustomGroupMentions = isCustomGroupsEnabled(state) && haveIChannelPermission(state, channel.team_id, channel.id, Permissions.USE_GROUP_MENTIONS);\n\n const groupsWithAllowReference = useLDAPGroupMentions || useCustomGroupMentions ? getAssociatedGroupsForReferenceByMention(state, channel.team_id, channel.id) : null;\n if (!useLDAPGroupMentions && !useCustomGroupMentions && groupsMentionedInText(post.message, groupsWithAllowReference)) {\n post.props.disable_group_highlight = true;\n }\n\n const hookResult = await dispatch(runMessageWillBePostedHooks(post));\n if (hookResult.error) {\n return {error: hookResult.error};\n }\n\n post = hookResult.data!;\n\n if (schedulingInfo) {\n const scheduledPost = scheduledPostFromPost(post, schedulingInfo);\n scheduledPost.file_ids = draft.fileInfos.map((fileInfo) => fileInfo.id);\n if (draft.fileInfos?.length > 0) {\n if (!scheduledPost.metadata) {\n scheduledPost.metadata = {} as PostMetadata;\n }\n\n scheduledPost.metadata.files = draft.fileInfos;\n }\n const response = await dispatch(createSchedulePostFromDraft(scheduledPost));\n if (afterSubmit) {\n const result: CreatePostReturnType = {\n error: response.error,\n created: !response.error,\n };\n afterSubmit(result);\n }\n\n return response;\n }\n\n return dispatch(PostActions.createPost(post, draft.fileInfos, afterSubmit, options));\n };\n}\n\ntype SubmitCommandRerturnType = ExecuteCommandReturnType & CreatePostReturnType;\n\nexport function submitCommand(channelId: string, rootId: string, draft: PostDraft): ActionFuncAsync<SubmitCommandRerturnType> {\n return async (dispatch, getState) => {\n const state = getState();\n\n const teamId = getCurrentTeamId(state);\n\n let args: CommandArgs = {\n channel_id: channelId,\n team_id: teamId,\n root_id: rootId,\n };\n\n let {message} = draft;\n\n const hookResult = await dispatch(runSlashCommandWillBePostedHooks(message, args));\n if (hookResult.error) {\n return {error: hookResult.error};\n } else if (!hookResult.data!.message && !hookResult.data!.args) {\n // do nothing with an empty return from a hook\n // this is allowed by the registerSlashCommandWillBePostedHook API in case\n // a plugin intercepts and handles the command on the client side\n // but doesn't require it to be sent to the server. (e.g., /call start).\n return {};\n }\n\n message = hookResult.data!.message;\n args = hookResult.data!.args;\n\n const {error, data} = await dispatch(executeCommand(message, args));\n\n if (error) {\n if (error.sendMessage) {\n return dispatch(submitPost(channelId, rootId, draft));\n }\n throw (error);\n }\n\n return {data: data!};\n };\n}\n\nexport type SubmitPostReturnType = CreatePostReturnType & SubmitCommandRerturnType & SubmitReactionReturnType;\nexport type OnSubmitOptions = {\n ignoreSlash?: boolean;\n afterSubmit?: (response: SubmitPostReturnType) => void;\n afterOptimisticSubmit?: () => void;\n keepDraft?: boolean;\n}\n\nexport function onSubmit(\n draft: PostDraft,\n options: OnSubmitOptions,\n schedulingInfo?: SchedulingInfo,\n): ActionFuncAsync<SubmitPostReturnType> {\n return async (dispatch, getState) => {\n const {message, channelId, rootId} = draft;\n const state = getState();\n\n dispatch(addMessageIntoHistory(message));\n\n if (!schedulingInfo && !options.ignoreSlash) {\n const isReaction = Utils.REACTION_PATTERN.exec(message);\n\n const emojis = getCustomEmojisByName(state);\n const emojiMap = new EmojiMap(emojis);\n\n if (isReaction && emojiMap.has(isReaction[2])) {\n const latestPostId = getLatestInteractablePostId(state, channelId, rootId);\n if (latestPostId) {\n return dispatch(PostActions.submitReaction(latestPostId, isReaction[1], isReaction[2]));\n }\n return {error: new Error('no post to react to')};\n }\n\n if (message.indexOf('/') === 0 && !options.ignoreSlash) {\n return dispatch(submitCommand(channelId, rootId, draft));\n }\n }\n\n return dispatch(submitPost(channelId, rootId, draft, options.afterSubmit, schedulingInfo, options));\n };\n}\n\nexport function editLatestPost(channelId: string, rootId = ''): ActionFunc<boolean, GlobalState> {\n return (dispatch, getState) => {\n const state = getState();\n\n const lastPostId = getLatestPostToEdit(state, channelId, rootId);\n\n if (!lastPostId) {\n return {data: false};\n }\n\n return dispatch(PostActions.setEditingPost(\n lastPostId,\n rootId ? 'reply_textbox' : 'post_textbox',\n Boolean(rootId),\n ));\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AppCallResponse} from '@mattermost/types/apps';\nimport type {CommandArgs, CommandResponse} from '@mattermost/types/integrations';\n\nimport {IntegrationTypes} from 'mattermost-redux/action_types';\nimport {unfavoriteChannel} from 'mattermost-redux/actions/channels';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {Client4} from 'mattermost-redux/client';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {AppCallResponseTypes} from 'mattermost-redux/constants/apps';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {getCurrentChannel, getRedirectChannelNameForTeam, isFavoriteChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {isMarketplaceEnabled} from 'mattermost-redux/selectors/entities/general';\nimport {haveICurrentTeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentRelativeTeamUrl, getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport * as PostActions from 'actions/post_actions';\nimport {openModal} from 'actions/views/modals';\n\nimport KeyboardShortcutsModal from 'components/keyboard_shortcuts/keyboard_shortcuts_modal/keyboard_shortcuts_modal';\nimport LeaveChannelModal from 'components/leave_channel_modal';\nimport MarketplaceModal from 'components/plugin_marketplace/marketplace_modal';\nimport {AppCommandParser} from 'components/suggestion/command_provider/app_command_parser/app_command_parser';\nimport {intlShim} from 'components/suggestion/command_provider/app_command_parser/app_command_parser_dependencies';\nimport UserSettingsModal from 'components/user_settings/modal';\n\nimport {getHistory} from 'utils/browser_history';\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {isUrlSafe, getSiteURL} from 'utils/url';\nimport * as UserAgent from 'utils/user_agent';\nimport {localizeMessage, getUserIdFromChannelName} from 'utils/utils';\n\nimport type {ActionFuncAsync} from 'types/store';\n\nimport {doAppSubmit, openAppsModal, postEphemeralCallResponseForCommandArgs} from './apps';\nimport {trackEvent} from './telemetry_actions';\n\nexport type ExecuteCommandReturnType = {\n frontendHandled?: boolean;\n silentFailureReason?: Error;\n commandResponse?: CommandResponse;\n appResponse?: AppCallResponse;\n}\n\nexport function executeCommand(message: string, args: CommandArgs): ActionFuncAsync<ExecuteCommandReturnType> {\n return async (dispatch, getState) => {\n const state = getState();\n\n let msg = message;\n\n let cmdLength = msg.indexOf(' ');\n if (cmdLength < 0) {\n cmdLength = msg.length;\n }\n const cmd = msg.substring(0, cmdLength).toLowerCase();\n msg = cmd + ' ' + msg.substring(cmdLength, msg.length).trim();\n\n // Add track event for certain slash commands\n const commandsWithTelemetry = [\n {command: '/help', telemetry: 'slash-command-help'},\n {command: '/marketplace', telemetry: 'slash-command-marketplace'},\n ];\n for (const command of commandsWithTelemetry) {\n if (msg.startsWith(command.command)) {\n trackEvent('slash-commands', command.telemetry);\n break;\n }\n }\n\n switch (cmd) {\n case '/search':\n dispatch(PostActions.searchForTerm(msg.substring(cmdLength + 1, msg.length)));\n return {data: {frontendHandled: true}};\n case '/shortcuts':\n if (UserAgent.isMobile()) {\n const error = {message: localizeMessage({id: 'create_post.shortcutsNotSupported', defaultMessage: 'Keyboard shortcuts are not supported on your device'})};\n return {error};\n }\n\n dispatch(openModal({modalId: ModalIdentifiers.KEYBOARD_SHORTCUTS_MODAL, dialogType: KeyboardShortcutsModal}));\n return {data: {frontendHandled: true}};\n case '/leave': {\n // /leave command not supported in reply threads.\n if (args.channel_id && args.root_id) {\n dispatch(GlobalActions.sendEphemeralPost('/leave is not supported in reply threads. Use it in the center channel instead.', args.channel_id, args.root_id));\n return {data: {frontendHandled: true}};\n }\n const channel = getCurrentChannel(state);\n if (!channel) {\n return {data: {silentFailureReason: new Error('cannot find current channel')}};\n }\n if (channel.type === Constants.PRIVATE_CHANNEL) {\n dispatch(openModal({modalId: ModalIdentifiers.LEAVE_PRIVATE_CHANNEL_MODAL, dialogType: LeaveChannelModal, dialogProps: {channel}}));\n return {data: {frontendHandled: true}};\n }\n if (\n channel.type === Constants.DM_CHANNEL ||\n channel.type === Constants.GM_CHANNEL\n ) {\n const currentUserId = getCurrentUserId(state);\n let name;\n let category;\n if (channel.type === Constants.DM_CHANNEL) {\n name = getUserIdFromChannelName(channel);\n category = Constants.Preferences.CATEGORY_DIRECT_CHANNEL_SHOW;\n } else {\n name = channel.id;\n category = Constants.Preferences.CATEGORY_GROUP_CHANNEL_SHOW;\n }\n const currentTeamId = getCurrentTeamId(state);\n const redirectChannel = getRedirectChannelNameForTeam(state, currentTeamId);\n const teamUrl = getCurrentRelativeTeamUrl(state);\n getHistory().push(`${teamUrl}/channels/${redirectChannel}`);\n\n dispatch(savePreferences(currentUserId, [{category, name, user_id: currentUserId, value: 'false'}]));\n if (isFavoriteChannel(state, channel.id)) {\n dispatch(unfavoriteChannel(channel.id));\n }\n\n return {data: {frontendHandled: true}};\n }\n break;\n }\n case '/settings':\n dispatch(openModal({modalId: ModalIdentifiers.USER_SETTINGS, dialogType: UserSettingsModal, dialogProps: {isContentProductSettings: true}}));\n return {data: {frontendHandled: true}};\n case '/marketplace':\n // check if user has permissions to access the read plugins\n if (!haveICurrentTeamPermission(state, Permissions.SYSCONSOLE_WRITE_PLUGINS)) {\n return {error: {message: localizeMessage({id: 'marketplace_command.no_permission', defaultMessage: 'You do not have the appropriate permissions to access the marketplace.'})}};\n }\n\n // check config to see if marketplace is enabled\n if (!isMarketplaceEnabled(state)) {\n return {error: {message: localizeMessage({id: 'marketplace_command.disabled', defaultMessage: 'The marketplace is disabled. Please contact your System Administrator for details.'})}};\n }\n\n dispatch(openModal({modalId: ModalIdentifiers.PLUGIN_MARKETPLACE, dialogType: MarketplaceModal, dialogProps: {openedFrom: 'command'}}));\n return {data: {frontendHandled: true}};\n case '/collapse':\n case '/expand':\n dispatch(PostActions.resetEmbedVisibility());\n dispatch(PostActions.resetInlineImageVisibility());\n }\n\n if (appsEnabled(state)) {\n const getGlobalState = () => getState();\n const createErrorMessage = (errMessage: string) => {\n return {error: {message: errMessage}};\n };\n const parser = new AppCommandParser({dispatch, getState: getGlobalState} as any, intlShim, args.channel_id, args.team_id, args.root_id);\n if (parser.isAppCommand(msg)) {\n try {\n const {creq, errorMessage} = await parser.composeCommandSubmitCall(msg);\n if (!creq) {\n return createErrorMessage(errorMessage!);\n }\n\n const res = await dispatch(doAppSubmit(creq, intlShim));\n\n if (res.error) {\n const errorResponse = res.error;\n return createErrorMessage(errorResponse.text || intlShim.formatMessage({\n id: 'apps.error.unknown',\n defaultMessage: 'Unknown error occurred.',\n }));\n }\n\n const callResp = res.data!;\n switch (callResp.type) {\n case AppCallResponseTypes.OK:\n if (callResp.text) {\n dispatch(postEphemeralCallResponseForCommandArgs(callResp, callResp.text, args));\n }\n return {data: {appResponse: callResp}};\n case AppCallResponseTypes.FORM:\n if (callResp.form) {\n dispatch(openAppsModal(callResp.form, creq.context));\n }\n return {data: {appResponse: callResp}};\n case AppCallResponseTypes.NAVIGATE:\n return {data: {appResponse: callResp}};\n default:\n return createErrorMessage(intlShim.formatMessage(\n {\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n },\n {\n type: callResp.type,\n },\n ));\n }\n } catch (err: any) {\n const message = err.message || intlShim.formatMessage({\n id: 'apps.error.unknown',\n defaultMessage: 'Unknown error occurred.',\n });\n return createErrorMessage(message);\n }\n }\n }\n\n let data;\n try {\n data = await Client4.executeCommand(msg, args);\n } catch (err) {\n return {error: err};\n }\n\n const hasGotoLocation = data.goto_location && isUrlSafe(data.goto_location);\n\n if (msg.trim() === '/logout') {\n GlobalActions.emitUserLoggedOutEvent(hasGotoLocation ? data.goto_location : '/');\n return {data: {response: data}};\n }\n\n if (data.trigger_id) {\n dispatch({type: IntegrationTypes.RECEIVED_DIALOG_TRIGGER_ID, data: data.trigger_id});\n }\n\n if (hasGotoLocation) {\n if (data.goto_location.startsWith('/')) {\n getHistory().push(data.goto_location);\n } else if (data.goto_location.startsWith(getSiteURL())) {\n getHistory().push(data.goto_location.substr(getSiteURL().length));\n } else {\n window.open(data.goto_location);\n }\n }\n\n return {data: {response: data}};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {searchGroups} from 'mattermost-redux/actions/groups';\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {searchAssociatedGroupsForReferenceLocal} from 'mattermost-redux/selectors/entities/groups';\nimport {isCustomGroupsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\n\nexport function searchAssociatedGroupsForReference(prefix, teamId, channelId, opts = {}) {\n return async (dispatch, getState) => {\n const state = getState();\n if (!haveIChannelPermission(state,\n teamId,\n channelId,\n Permissions.USE_GROUP_MENTIONS,\n )) {\n return {data: []};\n }\n if (isCustomGroupsEnabled(state)) {\n const params = {\n q: prefix,\n filter_allow_reference: true,\n page: 0,\n per_page: 60,\n include_member_count: true,\n include_channel_member_count: channelId,\n ...opts,\n };\n\n await dispatch(searchGroups(params));\n }\n return {data: searchAssociatedGroupsForReferenceLocal(state, prefix, teamId, channelId)};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {selectChannel} from 'mattermost-redux/actions/channels';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\n\nimport {SidebarSize} from 'components/resizable_sidebar/constants';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants, {ActionTypes} from 'utils/constants';\n\nimport type {ActionFunc, ThunkActionFunc} from 'types/store';\nimport {LhsItemType} from 'types/store/lhs';\n\nexport const setLhsSize = (sidebarSize?: SidebarSize) => {\n let newSidebarSize = sidebarSize;\n if (!sidebarSize) {\n const width = window.innerWidth;\n\n switch (true) {\n case width <= Constants.SMALL_SIDEBAR_BREAKPOINT: {\n newSidebarSize = SidebarSize.SMALL;\n break;\n }\n case width > Constants.SMALL_SIDEBAR_BREAKPOINT && width <= Constants.MEDIUM_SIDEBAR_BREAKPOINT: {\n newSidebarSize = SidebarSize.MEDIUM;\n break;\n }\n case width > Constants.MEDIUM_SIDEBAR_BREAKPOINT && width <= Constants.LARGE_SIDEBAR_BREAKPOINT: {\n newSidebarSize = SidebarSize.LARGE;\n break;\n }\n default: {\n newSidebarSize = SidebarSize.XLARGE;\n }\n }\n }\n return {\n type: ActionTypes.SET_LHS_SIZE,\n size: newSidebarSize,\n };\n};\n\nexport const toggle = () => ({\n type: ActionTypes.TOGGLE_LHS,\n});\n\nexport const open = () => ({\n type: ActionTypes.OPEN_LHS,\n});\n\nexport const close = () => ({\n type: ActionTypes.CLOSE_LHS,\n});\n\nexport const selectStaticPage = (itemId: string) => ({\n type: ActionTypes.SELECT_STATIC_PAGE,\n data: itemId,\n});\n\nexport const selectLhsItem = (type: LhsItemType, id?: string): ThunkActionFunc<unknown> => {\n return (dispatch) => {\n switch (type) {\n case LhsItemType.Channel:\n dispatch(selectChannel(id || ''));\n dispatch(selectStaticPage(''));\n break;\n case LhsItemType.Page:\n dispatch(selectChannel(''));\n dispatch(selectStaticPage(id || ''));\n break;\n case LhsItemType.None:\n dispatch(selectChannel(''));\n dispatch(selectStaticPage(''));\n break;\n default:\n throw new Error('Unknown LHS item type: ' + type);\n }\n };\n};\n\nexport function switchToLhsStaticPage(id: string): ActionFunc<boolean> {\n return (dispatch, getState) => {\n const state = getState();\n const teamUrl = getCurrentRelativeTeamUrl(state);\n getHistory().push(`${teamUrl}/${id}`);\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function dismissNotice(type) {\n return (dispatch) => {\n dispatch({\n type: ActionTypes.DISMISS_NOTICE,\n data: type,\n });\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getCurrentUser, getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getCurrentTeamId, getTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getTeamRedirectChannelIfIsAccesible} from 'actions/global_actions';\nimport LocalStorageStore from 'stores/local_storage_store';\n\nimport InvitationModal from 'components/invitation_modal';\n\nimport {getHistory} from 'utils/browser_history';\nimport {ActionTypes, Constants, ModalIdentifiers} from 'utils/constants';\n\nimport type {ActionFunc, ActionFuncAsync} from 'types/store';\n\nimport {openModal} from './modals';\n\nexport function switchToChannels(): ActionFuncAsync<boolean> {\n return async (dispatch, getState) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n const user = getCurrentUser(state);\n const teamId = getCurrentTeamId(state) || LocalStorageStore.getPreviousTeamId(currentUserId);\n const team = getTeam(state, teamId || '');\n\n if (!team) {\n return {data: false};\n }\n\n const channel = await getTeamRedirectChannelIfIsAccesible(user, team);\n const channelName = channel?.name || Constants.DEFAULT_CHANNEL;\n\n getHistory().push(`/${team.name}/channels/${channelName}`);\n return {data: true};\n };\n}\n\nexport function openInvitationsModal(timeout = 1): ActionFunc {\n return (dispatch) => {\n dispatch(switchToChannels());\n setTimeout(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.INVITATION,\n dialogType: InvitationModal,\n dialogProps: {\n },\n }));\n }, timeout);\n return {data: true};\n };\n}\n\nexport function setShowOnboardingTaskCompletion(open: boolean) {\n return {\n type: ActionTypes.SHOW_ONBOARDING_TASK_COMPLETION,\n open,\n };\n}\n\nexport function setShowOnboardingCompleteProfileTour(open: boolean) {\n return {\n type: ActionTypes.SHOW_ONBOARDING_COMPLETE_PROFILE_TOUR,\n open,\n };\n}\n\nexport function setShowOnboardingVisitConsoleTour(open: boolean) {\n return {\n type: ActionTypes.SHOW_ONBOARDING_VISIT_CONSOLE_TOUR,\n open,\n };\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {logError} from 'mattermost-redux/actions/errors';\nimport * as PostActions from 'mattermost-redux/actions/posts';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getAssociatedGroupsForReferenceByMention} from 'mattermost-redux/selectors/entities/groups';\nimport {isCustomGroupsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveIChannelPermission, haveICurrentChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {getPermalinkURL} from 'selectors/urls';\n\nimport {ActionTypes, AnnouncementBarTypes} from 'utils/constants';\nimport {containsAtChannel, groupsMentionedInText} from 'utils/post_utils';\nimport {getSiteURL} from 'utils/url';\nimport {getTimestamp} from 'utils/utils';\n\nimport {runMessageWillBePostedHooks} from '../hooks';\n\nexport function editPost(post) {\n return async (dispatch) => {\n const result = await dispatch(PostActions.editPost(post));\n\n // Send to error bar if it's an edit post error about time limit.\n if (result.error && result.error.server_error_id === 'api.post.update_post.permissions_time_limit.app_error') {\n dispatch(logError({type: AnnouncementBarTypes.ANNOUNCEMENT, message: result.error.message}, true));\n }\n\n return result;\n };\n}\n\nexport function forwardPost(post, channel, message = '') {\n return async (dispatch, getState) => {\n const state = getState();\n const channelId = channel.id;\n\n const currentUserId = getCurrentUserId(state);\n const currentTeam = getCurrentTeam(state);\n\n const relativePermaLink = getPermalinkURL(state, currentTeam.id, post.id);\n const permaLink = `${getSiteURL()}${relativePermaLink}`;\n\n const license = getLicense(state);\n const isLDAPEnabled = license?.IsLicensed === 'true' && license?.LDAPGroups === 'true';\n const useLDAPGroupMentions = isLDAPEnabled && haveICurrentChannelPermission(state, Permissions.USE_GROUP_MENTIONS);\n const useChannelMentions = haveIChannelPermission(state, channel.team_id, channelId, Permissions.USE_CHANNEL_MENTIONS);\n const useCustomGroupMentions = isCustomGroupsEnabled(state) && haveICurrentChannelPermission(state, Permissions.USE_GROUP_MENTIONS);\n const groupsWithAllowReference = useLDAPGroupMentions || useCustomGroupMentions ? getAssociatedGroupsForReferenceByMention(state, currentTeam.id, channelId) : null;\n\n let newPost = {};\n\n newPost.channel_id = channelId;\n\n const time = getTimestamp();\n const userId = currentUserId;\n\n newPost.message = message ? `${message}\\n${permaLink}` : permaLink;\n newPost.pending_post_id = `${userId}:${time}`;\n newPost.user_id = userId;\n newPost.create_at = time;\n newPost.metadata = {};\n newPost.props = {};\n\n if (!useChannelMentions && containsAtChannel(newPost.message, {checkAllMentions: true})) {\n newPost.props.mentionHighlightDisabled = true;\n }\n\n if (!useLDAPGroupMentions && !useCustomGroupMentions && groupsMentionedInText(newPost.message, groupsWithAllowReference)) {\n newPost.props.disable_group_highlight = true;\n }\n\n const hookResult = await dispatch(runMessageWillBePostedHooks(newPost));\n\n if (hookResult.error) {\n return hookResult;\n }\n\n newPost = hookResult.data;\n\n return dispatch(PostActions.createPost(newPost, []));\n };\n}\n\nexport function selectAttachmentMenuAction(postId, actionId, cookie, dataSource, text, value) {\n return async (dispatch) => {\n dispatch({\n type: ActionTypes.SELECT_ATTACHMENT_MENU_ACTION,\n data: {\n postId,\n actions: {\n [actionId]: {\n text,\n value,\n },\n },\n },\n });\n\n dispatch(PostActions.doPostActionWithCookie(postId, actionId, cookie, value));\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function setProductMenuSwitcherOpen(open: boolean) {\n return {\n type: ActionTypes.SET_PRODUCT_SWITCHER_OPEN,\n open,\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {getCurrentLocale, getTranslations} from 'selectors/i18n';\n\nimport en from 'i18n/en.json';\nimport {ActionTypes} from 'utils/constants';\n\nimport type {ActionFuncAsync, ThunkActionFunc} from 'types/store';\nimport type {Translations} from 'types/store/i18n';\n\nconst pluginTranslationSources: Record<string, TranslationPluginFunction> = {};\n\nexport type TranslationPluginFunction = (locale: string) => Translations\n\nexport function registerPluginTranslationsSource(pluginId: string, sourceFunction: TranslationPluginFunction): ThunkActionFunc<void> {\n pluginTranslationSources[pluginId] = sourceFunction;\n return (dispatch, getState) => {\n const state = getState();\n const locale = getCurrentLocale(state);\n const immutableTranslations = getTranslations(state, locale);\n const translations = {};\n Object.assign(translations, immutableTranslations);\n if (immutableTranslations) {\n Object.assign(translations, sourceFunction(locale));\n dispatch({\n type: ActionTypes.RECEIVED_TRANSLATIONS,\n data: {\n locale,\n translations,\n },\n });\n }\n };\n}\n\nexport function unregisterPluginTranslationsSource(pluginId: string) {\n Reflect.deleteProperty(pluginTranslationSources, pluginId);\n}\n\nexport function loadTranslations(locale: string, url: string): ActionFuncAsync {\n return async (dispatch) => {\n const translations = {...en};\n Object.values(pluginTranslationSources).forEach((pluginFunc) => {\n Object.assign(translations, pluginFunc(locale));\n });\n\n // Need to go to the server for languages other than English\n if (locale !== 'en') {\n try {\n const serverTranslations = await Client4.getTranslations(url);\n Object.assign(translations, serverTranslations);\n } catch (error) {\n console.error(error); //eslint-disable-line no-console\n }\n }\n dispatch({\n type: ActionTypes.RECEIVED_TRANSLATIONS,\n data: {\n locale,\n translations,\n },\n });\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {SearchTypes} from 'utils/constants';\n\nexport function setModalSearchTerm(term) {\n return {\n type: SearchTypes.SET_MODAL_SEARCH,\n data: term,\n };\n}\n\nexport function setPopoverSearchTerm(term) {\n return {\n type: SearchTypes.SET_POPOVER_SEARCH,\n data: term,\n };\n}\n\nexport function setChannelMembersRhsSearchTerm(term) {\n return {\n type: SearchTypes.SET_CHANNEL_MEMBERS_RHS_SEARCH,\n data: term,\n };\n}\n\nexport function setModalFilters(filters = {}) {\n return {\n type: SearchTypes.SET_MODAL_FILTERS,\n data: filters,\n };\n}\n\nexport function setUserGridSearch(term) {\n return {\n type: SearchTypes.SET_USER_GRID_SEARCH,\n data: term,\n };\n}\n\nexport function setUserGridFilters(filters = {}) {\n return {\n type: SearchTypes.SET_USER_GRID_FILTERS,\n data: filters,\n };\n}\n\nexport function setTeamListSearch(term) {\n return {\n type: SearchTypes.SET_TEAM_LIST_SEARCH,\n data: term,\n };\n}\n\nexport function setChannelListSearch(term) {\n return {\n type: SearchTypes.SET_CHANNEL_LIST_SEARCH,\n data: term,\n };\n}\n\nexport function setChannelListFilters(filters = {}) {\n return {\n type: SearchTypes.SET_CHANNEL_LIST_FILTERS,\n data: filters,\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function setStatusDropdown(open: boolean) {\n return {\n type: ActionTypes.STATUS_DROPDOWN_TOGGLE,\n open,\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport {UserTypes} from 'mattermost-redux/action_types';\nimport {getCurrentUserId, getUsers} from 'mattermost-redux/selectors/entities/users';\nimport type {ActionFuncAsync} from 'mattermost-redux/types/actions';\n\nimport {getKnownUsers} from './users';\n\nexport function removeNotVisibleUsers(): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n let knownUsers: Set<string>;\n try {\n const fetchResult = await dispatch(getKnownUsers());\n knownUsers = new Set((fetchResult as any).data);\n } catch (err) {\n return {error: err};\n }\n knownUsers.add(getCurrentUserId(state));\n\n const allUsers = Object.keys(getUsers(state));\n const usersToRemove = new Set(allUsers.filter((x) => !knownUsers.has(x)));\n\n const actions = [];\n for (const userToRemove of usersToRemove.values()) {\n actions.push({type: UserTypes.PROFILE_NO_LONGER_VISIBLE, data: {user_id: userToRemove}});\n }\n if (actions.length > 0) {\n dispatch(batchActions(actions));\n }\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n currentUserId: string;\n onExited: () => void;\n channelName?: string;\n remover?: string;\n}\n\ntype State = {\n show: boolean;\n}\n\nexport default class RemovedFromChannelModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {show: true};\n }\n\n onHide = () => {\n this.setState({show: false});\n };\n\n render() {\n let channelName: JSX.Element | string;\n let remover: JSX.Element | string;\n\n channelName = (\n <FormattedMessage\n id='removed_channel.channelName'\n defaultMessage='the channel'\n />\n );\n if (this.props.channelName) {\n channelName = this.props.channelName;\n }\n\n remover = (\n <FormattedMessage\n id='removed_channel.someone'\n defaultMessage='Someone'\n />\n );\n if (this.props.remover) {\n remover = this.props.remover;\n }\n\n if (this.props.currentUserId === '') {\n return null;\n }\n\n return (\n <Modal\n dialogClassName='a11y__modal'\n show={this.state.show}\n onHide={this.onHide}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='removeFromChannelModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='removeFromChannelModalLabel'\n >\n <FormattedMessage\n id='removed_channel.from'\n defaultMessage='Removed from '\n />\n <span className='name'>\n {channelName}\n </span>\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <p>\n <FormattedMessage\n id='removed_channel.remover'\n defaultMessage='{remover} removed you from {channel}'\n values={{\n remover,\n channel: (channelName),\n }}\n />\n </p>\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-primary'\n onClick={this.onHide}\n id='removedChannelBtn'\n >\n <FormattedMessage\n id='removed_channel.okay'\n defaultMessage='Okay'\n />\n </button>\n </Modal.Footer>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentUserId, getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport RemovedFromChannelModal from './removed_from_channel_modal';\n\ntype Props = {\n removerId: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const remover = getUser(state, ownProps.removerId);\n return {\n currentUserId: getCurrentUserId(state),\n remover: remover && remover.username,\n };\n}\n\nexport default connect(mapStateToProps)(RemovedFromChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable max-lines */\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport {\n ChannelTypes,\n EmojiTypes,\n GroupTypes,\n PostTypes,\n TeamTypes,\n UserTypes,\n RoleTypes,\n GeneralTypes,\n AdminTypes,\n IntegrationTypes,\n PreferenceTypes,\n AppsTypes,\n CloudTypes,\n HostedCustomerTypes,\n ChannelBookmarkTypes,\n ScheduledPostTypes,\n} from 'mattermost-redux/action_types';\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\nimport {fetchAppBindings, fetchRHSAppsBindings} from 'mattermost-redux/actions/apps';\nimport {addChannelToInitialCategory, fetchMyCategories, receivedCategoryOrder} from 'mattermost-redux/actions/channel_categories';\nimport {\n getChannelAndMyMember,\n getMyChannelMember,\n getChannelStats,\n markMultipleChannelsAsRead,\n getChannelMemberCountsByGroup,\n fetchAllMyChannelMembers,\n fetchAllMyTeamsChannels,\n} from 'mattermost-redux/actions/channels';\nimport {getCloudSubscription} from 'mattermost-redux/actions/cloud';\nimport {clearErrors, logError} from 'mattermost-redux/actions/errors';\nimport {setServerVersion, getClientConfig} from 'mattermost-redux/actions/general';\nimport {getGroup as fetchGroup} from 'mattermost-redux/actions/groups';\nimport {\n getCustomEmojiForReaction,\n getPosts,\n getPostThread,\n getPostThreads,\n postDeleted,\n receivedNewPost,\n receivedPost,\n} from 'mattermost-redux/actions/posts';\nimport {loadRolesIfNeeded} from 'mattermost-redux/actions/roles';\nimport {fetchTeamScheduledPosts} from 'mattermost-redux/actions/scheduled_posts';\nimport {batchFetchStatusesProfilesGroupsFromPosts} from 'mattermost-redux/actions/status_profile_polling';\nimport * as TeamActions from 'mattermost-redux/actions/teams';\nimport {\n getThread as fetchThread,\n getCountsAndThreadsSince,\n handleAllMarkedRead,\n handleReadChanged,\n handleFollowChanged,\n handleThreadArrived,\n handleAllThreadsInChannelMarkedRead,\n updateThreadRead,\n decrementThreadCounts,\n} from 'mattermost-redux/actions/threads';\nimport {\n checkForModifiedUsers,\n getUser as loadUser,\n} from 'mattermost-redux/actions/users';\nimport {removeNotVisibleUsers} from 'mattermost-redux/actions/websocket';\nimport {Client4} from 'mattermost-redux/client';\nimport {General, Permissions} from 'mattermost-redux/constants';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {\n getChannel,\n getChannelMembersInChannels,\n getChannelsInTeam,\n getCurrentChannel,\n getCurrentChannelId,\n getRedirectChannelNameForTeam,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getIsUserStatusesConfigEnabled} from 'mattermost-redux/selectors/entities/common';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getGroup} from 'mattermost-redux/selectors/entities/groups';\nimport {getPost, getMostRecentPostIdInChannel, getTeamIdFromPost} from 'mattermost-redux/selectors/entities/posts';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveISystemPermission, haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {\n getTeamIdByChannelId,\n getMyTeams,\n getCurrentRelativeTeamUrl,\n getCurrentTeamId,\n getCurrentTeamUrl,\n getTeam,\n getRelativeTeamUrl,\n} from 'mattermost-redux/selectors/entities/teams';\nimport {getNewestThreadInTeam, getThread, getThreads} from 'mattermost-redux/selectors/entities/threads';\nimport {getCurrentUser, getCurrentUserId, getUser, getIsManualStatusForUserId, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport {loadChannelsForCurrentUser} from 'actions/channel_actions';\nimport {\n getTeamsUsage,\n} from 'actions/cloud';\nimport {loadCustomEmojisIfNeeded} from 'actions/emoji_actions';\nimport {redirectUserToDefaultTeam} from 'actions/global_actions';\nimport {sendDesktopNotification} from 'actions/notification_actions';\nimport {handleNewPost} from 'actions/post_actions';\nimport * as StatusActions from 'actions/status_actions';\nimport {setGlobalItem} from 'actions/storage';\nimport {loadProfilesForDM, loadProfilesForGM, loadProfilesForSidebar} from 'actions/user_actions';\nimport {syncPostsInChannel} from 'actions/views/channel';\nimport {setGlobalDraft, transformServerDraft} from 'actions/views/drafts';\nimport {openModal} from 'actions/views/modals';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {incrementWsErrorCount, resetWsErrorCount} from 'actions/views/system';\nimport {updateThreadLastOpened} from 'actions/views/threads';\nimport {getSelectedChannelId, getSelectedPost} from 'selectors/rhs';\nimport {isThreadOpen, isThreadManuallyUnread} from 'selectors/views/threads';\nimport store from 'stores/redux_store';\n\nimport InteractiveDialog from 'components/interactive_dialog';\nimport RemovedFromChannelModal from 'components/removed_from_channel_modal';\n\nimport WebSocketClient from 'client/web_websocket_client';\nimport {loadPlugin, loadPluginsIfNecessary, removePlugin} from 'plugins';\nimport {getHistory} from 'utils/browser_history';\nimport {ActionTypes, Constants, AnnouncementBarMessages, SocketEvents, UserStatuses, ModalIdentifiers, PageLoadContext} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\n\nimport {temporarilySetPageLoadContext} from './telemetry_actions';\n\nconst dispatch = store.dispatch;\nconst getState = store.getState;\n\nconst MAX_WEBSOCKET_FAILS = 7;\n\nconst pluginEventHandlers = {};\n\nexport function initialize() {\n if (!window.WebSocket) {\n // eslint-disable-next-line no-console\n console.log('Browser does not support WebSocket');\n return;\n }\n\n // eslint-disable-next-line no-console\n console.log('Initializing or re-initializing WebSocket');\n\n const config = getConfig(getState());\n let connUrl = '';\n if (config.WebsocketURL) {\n connUrl = config.WebsocketURL;\n } else {\n connUrl = new URL(getSiteURL());\n\n // replace the protocol with a websocket one\n if (connUrl.protocol === 'https:') {\n connUrl.protocol = 'wss:';\n } else {\n connUrl.protocol = 'ws:';\n }\n\n // append a port number if one isn't already specified\n if (!(/:\\d+$/).test(connUrl.host)) {\n if (connUrl.protocol === 'wss:') {\n connUrl.host += ':' + config.WebsocketSecurePort;\n } else {\n connUrl.host += ':' + config.WebsocketPort;\n }\n }\n\n connUrl = connUrl.toString();\n }\n\n // Strip any trailing slash before appending the pathname below.\n if (connUrl.length > 0 && connUrl[connUrl.length - 1] === '/') {\n connUrl = connUrl.substring(0, connUrl.length - 1);\n }\n\n connUrl += Client4.getUrlVersion() + '/websocket';\n\n WebSocketClient.addMessageListener(handleEvent);\n WebSocketClient.addFirstConnectListener(handleFirstConnect);\n WebSocketClient.addReconnectListener(reconnect);\n WebSocketClient.addMissedMessageListener(restart);\n WebSocketClient.addCloseListener(handleClose);\n\n WebSocketClient.initialize(connUrl, undefined, true);\n}\n\nexport function close() {\n WebSocketClient.close();\n\n WebSocketClient.removeMessageListener(handleEvent);\n WebSocketClient.removeFirstConnectListener(handleFirstConnect);\n WebSocketClient.removeReconnectListener(reconnect);\n WebSocketClient.removeMissedMessageListener(restart);\n WebSocketClient.removeCloseListener(handleClose);\n}\n\nconst pluginReconnectHandlers = {};\n\nexport function registerPluginReconnectHandler(pluginId, handler) {\n pluginReconnectHandlers[pluginId] = handler;\n}\n\nexport function unregisterPluginReconnectHandler(pluginId) {\n Reflect.deleteProperty(pluginReconnectHandlers, pluginId);\n}\n\nfunction restart() {\n reconnect();\n\n // We fetch the client config again on the server restart.\n dispatch(getClientConfig());\n}\n\nexport function reconnect() {\n // eslint-disable-next-line\n console.log('Reconnecting WebSocket');\n\n temporarilySetPageLoadContext(PageLoadContext.RECONNECT);\n\n dispatch({\n type: GeneralTypes.WEBSOCKET_SUCCESS,\n timestamp: Date.now(),\n });\n\n const state = getState();\n const currentTeamId = getCurrentTeamId(state);\n if (currentTeamId) {\n const currentUserId = getCurrentUserId(state);\n const currentChannelId = getCurrentChannelId(state);\n const mostRecentId = getMostRecentPostIdInChannel(state, currentChannelId);\n const mostRecentPost = getPost(state, mostRecentId);\n\n if (appsEnabled(state)) {\n dispatch(handleRefreshAppsBindings());\n }\n\n dispatch(fetchAllMyTeamsChannels());\n dispatch(fetchTeamScheduledPosts(currentTeamId, true, true));\n dispatch(fetchAllMyChannelMembers());\n dispatch(fetchMyCategories(currentTeamId));\n loadProfilesForSidebar();\n\n if (mostRecentPost) {\n dispatch(syncPostsInChannel(currentChannelId, mostRecentPost.create_at));\n } else if (currentChannelId) {\n // if network timed-out the first time when loading a channel\n // we can request for getPosts again when socket is connected\n dispatch(getPosts(currentChannelId));\n }\n\n const enabledUserStatuses = getIsUserStatusesConfigEnabled(state);\n if (enabledUserStatuses) {\n dispatch(StatusActions.addVisibleUsersInCurrentChannelAndSelfToStatusPoll());\n }\n\n const crtEnabled = isCollapsedThreadsEnabled(state);\n dispatch(TeamActions.getMyTeamUnreads(crtEnabled));\n if (crtEnabled) {\n const teams = getMyTeams(state);\n syncThreads(currentTeamId, currentUserId);\n\n for (const team of teams) {\n if (team.id === currentTeamId) {\n continue;\n }\n syncThreads(team.id, currentUserId);\n }\n }\n\n // Re-syncing the current channel and team ids.\n WebSocketClient.updateActiveChannel(currentChannelId);\n WebSocketClient.updateActiveTeam(currentTeamId);\n }\n\n loadPluginsIfNecessary();\n\n Object.values(pluginReconnectHandlers).forEach((handler) => {\n if (handler && typeof handler === 'function') {\n handler();\n }\n });\n\n if (state.websocket.lastDisconnectAt) {\n dispatch(checkForModifiedUsers());\n }\n\n dispatch(resetWsErrorCount());\n dispatch(clearErrors());\n}\n\nfunction syncThreads(teamId, userId) {\n const state = getState();\n const newestThread = getNewestThreadInTeam(state, teamId);\n\n // no need to sync if we have nothing yet\n if (!newestThread) {\n return;\n }\n dispatch(getCountsAndThreadsSince(userId, teamId, newestThread.last_reply_at));\n}\n\nexport function registerPluginWebSocketEvent(pluginId, event, action) {\n if (!pluginEventHandlers[pluginId]) {\n pluginEventHandlers[pluginId] = {};\n }\n pluginEventHandlers[pluginId][event] = action;\n}\n\nexport function unregisterPluginWebSocketEvent(pluginId, event) {\n const events = pluginEventHandlers[pluginId];\n if (!events) {\n return;\n }\n\n Reflect.deleteProperty(events, event);\n}\n\nexport function unregisterAllPluginWebSocketEvents(pluginId) {\n Reflect.deleteProperty(pluginEventHandlers, pluginId);\n}\n\nfunction handleFirstConnect() {\n dispatch(batchActions([\n {\n type: GeneralTypes.WEBSOCKET_SUCCESS,\n timestamp: Date.now(),\n },\n clearErrors(),\n ]));\n}\n\nfunction handleClose(failCount) {\n if (failCount > MAX_WEBSOCKET_FAILS) {\n dispatch(logError({type: 'critical', message: AnnouncementBarMessages.WEBSOCKET_PORT_ERROR}, true));\n }\n dispatch(batchActions([\n {\n type: GeneralTypes.WEBSOCKET_FAILURE,\n timestamp: Date.now(),\n },\n incrementWsErrorCount(),\n ]));\n}\n\nexport function handleEvent(msg) {\n switch (msg.event) {\n case SocketEvents.POSTED:\n case SocketEvents.EPHEMERAL_MESSAGE:\n handleNewPostEventDebounced(msg);\n break;\n\n case SocketEvents.POST_EDITED:\n handlePostEditEvent(msg);\n break;\n\n case SocketEvents.POST_DELETED:\n handlePostDeleteEvent(msg);\n break;\n\n case SocketEvents.POST_UNREAD:\n handlePostUnreadEvent(msg);\n break;\n\n case SocketEvents.LEAVE_TEAM:\n handleLeaveTeamEvent(msg);\n break;\n\n case SocketEvents.UPDATE_TEAM:\n handleUpdateTeamEvent(msg);\n break;\n\n case SocketEvents.UPDATE_TEAM_SCHEME:\n handleUpdateTeamSchemeEvent(msg);\n break;\n\n case SocketEvents.DELETE_TEAM:\n handleDeleteTeamEvent(msg);\n break;\n\n case SocketEvents.ADDED_TO_TEAM:\n handleTeamAddedEvent(msg);\n break;\n\n case SocketEvents.USER_ADDED:\n dispatch(handleUserAddedEvent(msg));\n break;\n\n case SocketEvents.USER_REMOVED:\n handleUserRemovedEvent(msg);\n break;\n\n case SocketEvents.USER_UPDATED:\n handleUserUpdatedEvent(msg);\n break;\n\n case SocketEvents.ROLE_ADDED:\n handleRoleAddedEvent(msg);\n break;\n\n case SocketEvents.ROLE_REMOVED:\n handleRoleRemovedEvent(msg);\n break;\n\n case SocketEvents.CHANNEL_SCHEME_UPDATED:\n handleChannelSchemeUpdatedEvent(msg);\n break;\n\n case SocketEvents.MEMBERROLE_UPDATED:\n handleUpdateMemberRoleEvent(msg);\n break;\n\n case SocketEvents.ROLE_UPDATED:\n handleRoleUpdatedEvent(msg);\n break;\n\n case SocketEvents.CHANNEL_CREATED:\n dispatch(handleChannelCreatedEvent(msg));\n break;\n\n case SocketEvents.CHANNEL_DELETED:\n handleChannelDeletedEvent(msg);\n break;\n\n case SocketEvents.CHANNEL_UNARCHIVED:\n handleChannelUnarchivedEvent(msg);\n break;\n\n case SocketEvents.CHANNEL_CONVERTED:\n handleChannelConvertedEvent(msg);\n break;\n\n case SocketEvents.CHANNEL_UPDATED:\n dispatch(handleChannelUpdatedEvent(msg));\n break;\n\n case SocketEvents.CHANNEL_MEMBER_UPDATED:\n handleChannelMemberUpdatedEvent(msg);\n break;\n\n case SocketEvents.CHANNEL_BOOKMARK_CREATED:\n dispatch(handleChannelBookmarkCreated(msg));\n break;\n\n case SocketEvents.CHANNEL_BOOKMARK_UPDATED:\n dispatch(handleChannelBookmarkUpdated(msg));\n break;\n\n case SocketEvents.CHANNEL_BOOKMARK_DELETED:\n dispatch(handleChannelBookmarkDeleted(msg));\n break;\n\n case SocketEvents.CHANNEL_BOOKMARK_SORTED:\n dispatch(handleChannelBookmarkSorted(msg));\n break;\n\n case SocketEvents.DIRECT_ADDED:\n dispatch(handleDirectAddedEvent(msg));\n break;\n\n case SocketEvents.GROUP_ADDED:\n dispatch(handleGroupAddedEvent(msg));\n break;\n\n case SocketEvents.PREFERENCE_CHANGED:\n handlePreferenceChangedEvent(msg);\n break;\n\n case SocketEvents.PREFERENCES_CHANGED:\n handlePreferencesChangedEvent(msg);\n break;\n\n case SocketEvents.PREFERENCES_DELETED:\n handlePreferencesDeletedEvent(msg);\n break;\n\n case SocketEvents.STATUS_CHANGED:\n dispatch(handleStatusChangedEvent(msg));\n break;\n\n case SocketEvents.HELLO:\n handleHelloEvent(msg);\n break;\n\n case SocketEvents.REACTION_ADDED:\n handleReactionAddedEvent(msg);\n break;\n\n case SocketEvents.REACTION_REMOVED:\n handleReactionRemovedEvent(msg);\n break;\n\n case SocketEvents.EMOJI_ADDED:\n handleAddEmoji(msg);\n break;\n\n case SocketEvents.MULTIPLE_CHANNELS_VIEWED:\n handleMultipleChannelsViewedEvent(msg);\n break;\n\n case SocketEvents.PLUGIN_ENABLED:\n handlePluginEnabled(msg);\n break;\n\n case SocketEvents.PLUGIN_DISABLED:\n handlePluginDisabled(msg);\n break;\n\n case SocketEvents.USER_ROLE_UPDATED:\n handleUserRoleUpdated(msg);\n break;\n\n case SocketEvents.CONFIG_CHANGED:\n handleConfigChanged(msg);\n break;\n\n case SocketEvents.LICENSE_CHANGED:\n handleLicenseChanged(msg);\n break;\n\n case SocketEvents.PLUGIN_STATUSES_CHANGED:\n handlePluginStatusesChangedEvent(msg);\n break;\n\n case SocketEvents.OPEN_DIALOG:\n handleOpenDialogEvent(msg);\n break;\n\n case SocketEvents.RECEIVED_GROUP:\n handleGroupUpdatedEvent(msg);\n break;\n\n case SocketEvents.GROUP_MEMBER_ADD:\n dispatch(handleGroupAddedMemberEvent(msg));\n break;\n\n case SocketEvents.GROUP_MEMBER_DELETED:\n dispatch(handleGroupDeletedMemberEvent(msg));\n break;\n\n case SocketEvents.RECEIVED_GROUP_ASSOCIATED_TO_TEAM:\n handleGroupAssociatedToTeamEvent(msg);\n break;\n\n case SocketEvents.RECEIVED_GROUP_NOT_ASSOCIATED_TO_TEAM:\n handleGroupNotAssociatedToTeamEvent(msg);\n break;\n\n case SocketEvents.RECEIVED_GROUP_ASSOCIATED_TO_CHANNEL:\n handleGroupAssociatedToChannelEvent(msg);\n break;\n\n case SocketEvents.RECEIVED_GROUP_NOT_ASSOCIATED_TO_CHANNEL:\n handleGroupNotAssociatedToChannelEvent(msg);\n break;\n\n case SocketEvents.SIDEBAR_CATEGORY_CREATED:\n dispatch(handleSidebarCategoryCreated(msg));\n break;\n\n case SocketEvents.SIDEBAR_CATEGORY_UPDATED:\n dispatch(handleSidebarCategoryUpdated(msg));\n break;\n\n case SocketEvents.SIDEBAR_CATEGORY_DELETED:\n dispatch(handleSidebarCategoryDeleted(msg));\n break;\n case SocketEvents.SIDEBAR_CATEGORY_ORDER_UPDATED:\n dispatch(handleSidebarCategoryOrderUpdated(msg));\n break;\n case SocketEvents.USER_ACTIVATION_STATUS_CHANGED:\n dispatch(handleUserActivationStatusChange());\n break;\n case SocketEvents.CLOUD_PAYMENT_STATUS_UPDATED:\n dispatch(handleCloudPaymentStatusUpdated(msg));\n break;\n case SocketEvents.CLOUD_SUBSCRIPTION_CHANGED:\n dispatch(handleCloudSubscriptionChanged(msg));\n break;\n case SocketEvents.FIRST_ADMIN_VISIT_MARKETPLACE_STATUS_RECEIVED:\n handleFirstAdminVisitMarketplaceStatusReceivedEvent(msg);\n break;\n case SocketEvents.THREAD_FOLLOW_CHANGED:\n dispatch(handleThreadFollowChanged(msg));\n break;\n case SocketEvents.THREAD_READ_CHANGED:\n dispatch(handleThreadReadChanged(msg));\n break;\n case SocketEvents.THREAD_UPDATED:\n dispatch(handleThreadUpdated(msg));\n break;\n case SocketEvents.APPS_FRAMEWORK_REFRESH_BINDINGS:\n dispatch(handleRefreshAppsBindings());\n break;\n case SocketEvents.APPS_FRAMEWORK_PLUGIN_ENABLED:\n dispatch(handleAppsPluginEnabled());\n break;\n case SocketEvents.APPS_FRAMEWORK_PLUGIN_DISABLED:\n dispatch(handleAppsPluginDisabled());\n break;\n case SocketEvents.POST_ACKNOWLEDGEMENT_ADDED:\n dispatch(handlePostAcknowledgementAdded(msg));\n break;\n case SocketEvents.POST_ACKNOWLEDGEMENT_REMOVED:\n dispatch(handlePostAcknowledgementRemoved(msg));\n break;\n case SocketEvents.DRAFT_CREATED:\n case SocketEvents.DRAFT_UPDATED:\n dispatch(handleUpsertDraftEvent(msg));\n break;\n case SocketEvents.DRAFT_DELETED:\n dispatch(handleDeleteDraftEvent(msg));\n break;\n case SocketEvents.SCHEDULED_POST_CREATED:\n dispatch(handleCreateScheduledPostEvent(msg));\n break;\n case SocketEvents.SCHEDULED_POST_UPDATED:\n dispatch(handleUpdateScheduledPostEvent(msg));\n break;\n case SocketEvents.SCHEDULED_POST_DELETED:\n dispatch(handleDeleteScheduledPostEvent(msg));\n break;\n case SocketEvents.PERSISTENT_NOTIFICATION_TRIGGERED:\n dispatch(handlePersistentNotification(msg));\n break;\n case SocketEvents.HOSTED_CUSTOMER_SIGNUP_PROGRESS_UPDATED:\n dispatch(handleHostedCustomerSignupProgressUpdated(msg));\n break;\n default:\n }\n\n Object.values(pluginEventHandlers).forEach((pluginEvents) => {\n if (!pluginEvents) {\n return;\n }\n\n if (Object.hasOwn(pluginEvents, msg.event) && typeof pluginEvents[msg.event] === 'function') {\n pluginEvents[msg.event](msg);\n }\n });\n}\n\n// handleChannelConvertedEvent handles updating of channel which is converted from public to private\nfunction handleChannelConvertedEvent(msg) {\n const channelId = msg.data.channel_id;\n if (channelId) {\n const channel = getChannel(getState(), channelId);\n if (channel) {\n dispatch({\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: {...channel, type: General.PRIVATE_CHANNEL},\n });\n }\n }\n}\n\nexport function handleChannelUpdatedEvent(msg) {\n return (doDispatch, doGetState) => {\n const channel = JSON.parse(msg.data.channel);\n\n const actions = [{type: ChannelTypes.RECEIVED_CHANNEL, data: channel}];\n\n // handling the case of GM converted to private channel.\n const state = doGetState();\n const existingChannel = getChannel(state, channel.id);\n\n // if the updated channel exists in store\n if (existingChannel) {\n // and it was a GM, converted to a private channel\n if (existingChannel.type === General.GM_CHANNEL && channel.type === General.PRIVATE_CHANNEL) {\n actions.push({type: ChannelTypes.GM_CONVERTED_TO_CHANNEL, data: channel});\n }\n }\n\n doDispatch(batchActions(actions));\n\n if (channel.id === getCurrentChannelId(state)) {\n // using channel's team_id to ensure we always redirect to current channel even if channel's team changes.\n const teamId = channel.team_id || getCurrentTeamId(state);\n getHistory().replace(`${getRelativeTeamUrl(state, teamId)}/channels/${channel.name}`);\n }\n };\n}\n\nfunction handleChannelMemberUpdatedEvent(msg) {\n const channelMember = JSON.parse(msg.data.channelMember);\n const roles = channelMember.roles.split(' ');\n dispatch(loadRolesIfNeeded(roles));\n dispatch({type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, data: channelMember});\n}\n\nfunction debouncePostEvent(wait) {\n let timeout;\n let queue = [];\n let count = 0;\n\n // Called when timeout triggered\n const triggered = () => {\n timeout = null;\n\n if (queue.length > 0) {\n dispatch(handleNewPostEvents(queue));\n }\n\n queue = [];\n count = 0;\n };\n\n return function fx(msg) {\n if (timeout && count > 4) {\n // If the timeout is going this is the second or further event so queue them up.\n if (queue.push(msg) > 200) {\n // Don't run us out of memory, give up if the queue gets insane\n queue = [];\n console.log('channel broken because of too many incoming messages'); //eslint-disable-line no-console\n }\n clearTimeout(timeout);\n timeout = setTimeout(triggered, wait);\n } else {\n // Apply immediately for events up until count reaches limit\n count += 1;\n dispatch(handleNewPostEvent(msg));\n clearTimeout(timeout);\n timeout = setTimeout(triggered, wait);\n }\n };\n}\n\nconst handleNewPostEventDebounced = debouncePostEvent(100);\n\nexport function handleNewPostEvent(msg) {\n return (myDispatch, myGetState) => {\n const post = JSON.parse(msg.data.post);\n\n if (window.logPostEvents) {\n // eslint-disable-next-line no-console\n console.log('handleNewPostEvent - new post received', post);\n }\n\n myDispatch(handleNewPost(post, msg));\n myDispatch(batchFetchStatusesProfilesGroupsFromPosts([post]));\n\n // Since status updates aren't real time, assume another user is online if they have posted and:\n // 1. The user hasn't set their status manually to something that isn't online\n // 2. The server hasn't told the client not to set the user to online. This happens when:\n // a. The post is from the auto responder\n // b. The post is a response to a push notification\n if (\n post.user_id !== getCurrentUserId(myGetState()) &&\n !getIsManualStatusForUserId(myGetState(), post.user_id) &&\n msg.data.set_online\n ) {\n myDispatch({\n type: UserTypes.RECEIVED_STATUSES,\n data: {[post.user_id]: UserStatuses.ONLINE},\n });\n }\n };\n}\n\nexport function handleNewPostEvents(queue) {\n return (myDispatch, myGetState) => {\n // Note that this method doesn't properly update the sidebar state for these posts\n const posts = queue.map((msg) => JSON.parse(msg.data.post));\n\n if (window.logPostEvents) {\n // eslint-disable-next-line no-console\n console.log('handleNewPostEvents - new posts received', posts);\n }\n\n posts.forEach((post, index) => {\n if (queue[index].data.should_ack) {\n WebSocketClient.acknowledgePostedNotification(post.id, 'not_sent', 'too_many_posts');\n }\n });\n\n // Receive the posts as one continuous block since they were received within a short period\n const crtEnabled = isCollapsedThreadsEnabled(myGetState());\n const actions = posts.map((post) => receivedNewPost(post, crtEnabled));\n myDispatch(batchActions(actions));\n\n // Load the posts' threads\n myDispatch(getPostThreads(posts));\n myDispatch(batchFetchStatusesProfilesGroupsFromPosts(posts));\n };\n}\n\nexport function handlePostEditEvent(msg) {\n // Store post\n const post = JSON.parse(msg.data.post);\n\n if (window.logPostEvents) {\n // eslint-disable-next-line no-console\n console.log('handlePostEditEvent - post edit received', post);\n }\n\n const crtEnabled = isCollapsedThreadsEnabled(getState());\n dispatch(receivedPost(post, crtEnabled));\n\n dispatch(batchFetchStatusesProfilesGroupsFromPosts([post]));\n}\n\nasync function handlePostDeleteEvent(msg) {\n const post = JSON.parse(msg.data.post);\n\n if (window.logPostEvents) {\n // eslint-disable-next-line no-console\n console.log('handlePostDeleteEvent - post delete received', post);\n }\n\n const state = getState();\n const collapsedThreads = isCollapsedThreadsEnabled(state);\n\n if (!post.root_id && collapsedThreads) {\n dispatch(decrementThreadCounts(post));\n }\n\n dispatch(postDeleted(post));\n\n // update thread when a comment is deleted and CRT is on\n if (post.root_id && collapsedThreads) {\n const thread = getThread(state, post.root_id);\n if (thread) {\n const userId = getCurrentUserId(state);\n const teamId = getTeamIdFromPost(state, post);\n if (teamId) {\n dispatch(fetchThread(userId, teamId, post.root_id, true));\n }\n } else {\n const res = await dispatch(getPostThread(post.root_id));\n const {order, posts} = res.data;\n const rootPost = posts[order[0]];\n dispatch(receivedPost(rootPost));\n }\n }\n\n if (post.is_pinned) {\n dispatch(getChannelStats(post.channel_id));\n }\n}\n\nexport function handlePostUnreadEvent(msg) {\n dispatch(\n {\n type: ActionTypes.POST_UNREAD_SUCCESS,\n data: {\n lastViewedAt: msg.data.last_viewed_at,\n channelId: msg.broadcast.channel_id,\n msgCount: msg.data.msg_count,\n msgCountRoot: msg.data.msg_count_root,\n mentionCount: msg.data.mention_count,\n mentionCountRoot: msg.data.mention_count_root,\n urgentMentionCount: msg.data.urgent_mention_count,\n },\n },\n );\n}\n\nasync function handleTeamAddedEvent(msg) {\n await dispatch(TeamActions.getTeam(msg.data.team_id));\n await dispatch(TeamActions.getMyTeamMembers());\n const state = getState();\n await dispatch(TeamActions.getMyTeamUnreads(isCollapsedThreadsEnabled(state)));\n const license = getLicense(state);\n if (license.Cloud === 'true') {\n dispatch(getTeamsUsage());\n }\n}\n\nexport function handleLeaveTeamEvent(msg) {\n const state = getState();\n\n const actions = [\n {\n type: UserTypes.RECEIVED_PROFILE_NOT_IN_TEAM,\n data: {id: msg.data.team_id, user_id: msg.data.user_id},\n },\n {\n type: TeamTypes.REMOVE_MEMBER_FROM_TEAM,\n data: {team_id: msg.data.team_id, user_id: msg.data.user_id},\n },\n ];\n\n const channelsPerTeam = getChannelsInTeam(state);\n const channels = (channelsPerTeam && channelsPerTeam[msg.data.team_id]) || [];\n\n for (const channel of channels) {\n actions.push({\n type: ChannelTypes.REMOVE_MEMBER_FROM_CHANNEL,\n data: {id: channel, user_id: msg.data.user_id},\n });\n }\n\n dispatch(batchActions(actions));\n const currentUser = getCurrentUser(state);\n\n if (currentUser.id === msg.data.user_id) {\n dispatch({type: TeamTypes.LEAVE_TEAM, data: {id: msg.data.team_id}});\n\n // if they are on the team being removed redirect them to default team\n if (getCurrentTeamId(state) === msg.data.team_id) {\n if (!global.location.pathname.startsWith('/admin_console')) {\n redirectUserToDefaultTeam();\n }\n }\n if (isGuest(currentUser.roles)) {\n dispatch(removeNotVisibleUsers());\n }\n } else {\n const team = getTeam(state, msg.data.team_id);\n const members = getChannelMembersInChannels(state);\n const isMember = Object.values(members).some((member) => member[msg.data.user_id]);\n if (team && isGuest(currentUser.roles) && !isMember) {\n dispatch(batchActions([\n {\n type: UserTypes.PROFILE_NO_LONGER_VISIBLE,\n data: {user_id: msg.data.user_id},\n },\n {\n type: TeamTypes.REMOVE_MEMBER_FROM_TEAM,\n data: {team_id: team.id, user_id: msg.data.user_id},\n },\n ]));\n }\n }\n}\n\nfunction handleUpdateTeamEvent(msg) {\n const state = store.getState();\n const license = getLicense(state);\n dispatch({type: TeamTypes.UPDATED_TEAM, data: JSON.parse(msg.data.team)});\n if (license.Cloud === 'true') {\n dispatch(getTeamsUsage());\n }\n}\n\nfunction handleUpdateTeamSchemeEvent() {\n dispatch(TeamActions.getMyTeamMembers());\n}\n\nfunction handleDeleteTeamEvent(msg) {\n const deletedTeam = JSON.parse(msg.data.team);\n const state = store.getState();\n const {teams} = state.entities.teams;\n const license = getLicense(state);\n if (license.Cloud === 'true') {\n dispatch(getTeamsUsage());\n }\n if (\n deletedTeam &&\n teams &&\n teams[deletedTeam.id] &&\n teams[deletedTeam.id].delete_at === 0\n ) {\n const {currentUserId} = state.entities.users;\n const {currentTeamId, myMembers} = state.entities.teams;\n const teamMembers = Object.values(myMembers);\n const teamMember = teamMembers.find((m) => m.user_id === currentUserId && m.team_id === currentTeamId);\n\n let newTeamId = '';\n if (\n deletedTeam &&\n teamMember &&\n deletedTeam.id === teamMember.team_id\n ) {\n const myTeams = {};\n getMyTeams(state).forEach((t) => {\n myTeams[t.id] = t;\n });\n\n for (let i = 0; i < teamMembers.length; i++) {\n const memberTeamId = teamMembers[i].team_id;\n if (\n myTeams &&\n myTeams[memberTeamId] &&\n myTeams[memberTeamId].delete_at === 0 &&\n deletedTeam.id !== memberTeamId\n ) {\n newTeamId = memberTeamId;\n break;\n }\n }\n }\n\n dispatch(batchActions([\n {type: TeamTypes.RECEIVED_TEAM_DELETED, data: {id: deletedTeam.id}},\n {type: TeamTypes.UPDATED_TEAM, data: deletedTeam},\n ]));\n\n if (currentTeamId === deletedTeam.id) {\n if (newTeamId) {\n dispatch({type: TeamTypes.SELECT_TEAM, data: newTeamId});\n const globalState = getState();\n const redirectChannel = getRedirectChannelNameForTeam(globalState, newTeamId);\n getHistory().push(`${getCurrentTeamUrl(globalState)}/channels/${redirectChannel}`);\n } else {\n getHistory().push('/');\n }\n }\n }\n}\n\nfunction handleUpdateMemberRoleEvent(msg) {\n const memberData = JSON.parse(msg.data.member);\n const newRoles = memberData.roles.split(' ');\n\n dispatch(loadRolesIfNeeded(newRoles));\n\n dispatch({\n type: TeamTypes.RECEIVED_MY_TEAM_MEMBER,\n data: memberData,\n });\n}\n\nfunction handleDirectAddedEvent(msg) {\n return fetchChannelAndAddToSidebar(msg.broadcast.channel_id);\n}\n\nfunction handleGroupAddedEvent(msg) {\n return fetchChannelAndAddToSidebar(msg.broadcast.channel_id);\n}\n\nfunction handleUserAddedEvent(msg) {\n return async (doDispatch, doGetState) => {\n const state = doGetState();\n const config = getConfig(state);\n const license = getLicense(state);\n const currentChannelId = getCurrentChannelId(state);\n if (currentChannelId === msg.broadcast.channel_id) {\n doDispatch(getChannelStats(currentChannelId));\n doDispatch({\n type: UserTypes.RECEIVED_PROFILE_IN_CHANNEL,\n data: {id: msg.broadcast.channel_id, user_id: msg.data.user_id},\n });\n if (license?.IsLicensed === 'true' && license?.LDAPGroups === 'true' && config.EnableConfirmNotificationsToChannel === 'true') {\n doDispatch(getChannelMemberCountsByGroup(currentChannelId));\n }\n }\n\n // Load the channel so that it appears in the sidebar\n const currentTeamId = getCurrentTeamId(doGetState());\n const currentUserId = getCurrentUserId(doGetState());\n if (currentTeamId === msg.data.team_id && currentUserId === msg.data.user_id) {\n doDispatch(fetchChannelAndAddToSidebar(msg.broadcast.channel_id));\n }\n\n // This event is fired when a user first joins the server, so refresh analytics to see if we're now over the user limit\n if (license.Cloud === 'true' && isCurrentUserSystemAdmin(doGetState())) {\n doDispatch(getStandardAnalytics());\n }\n };\n}\n\nfunction fetchChannelAndAddToSidebar(channelId) {\n return async (doDispatch) => {\n const {data, error} = await doDispatch(getChannelAndMyMember(channelId));\n\n if (!error) {\n doDispatch(addChannelToInitialCategory(data.channel));\n }\n };\n}\n\nexport function handleUserRemovedEvent(msg) {\n const state = getState();\n const currentChannel = getCurrentChannel(state) || {};\n const currentUser = getCurrentUser(state);\n const config = getConfig(state);\n const license = getLicense(state);\n\n if (msg.broadcast.user_id === currentUser.id) {\n dispatch(loadChannelsForCurrentUser());\n\n const rhsChannelId = getSelectedChannelId(state);\n if (msg.data.channel_id === rhsChannelId) {\n dispatch(closeRightHandSide());\n }\n\n if (msg.data.channel_id === currentChannel.id) {\n if (msg.data.remover_id !== msg.broadcast.user_id) {\n const user = getUser(state, msg.data.remover_id);\n if (!user) {\n dispatch(loadUser(msg.data.remover_id));\n }\n\n dispatch(openModal({\n modalId: ModalIdentifiers.REMOVED_FROM_CHANNEL,\n dialogType: RemovedFromChannelModal,\n dialogProps: {\n channelName: currentChannel.display_name,\n removerId: msg.data.remover_id,\n },\n }));\n }\n }\n\n const channel = getChannel(state, msg.data.channel_id);\n\n dispatch({\n type: ChannelTypes.LEAVE_CHANNEL,\n data: {\n id: msg.data.channel_id,\n user_id: msg.broadcast.user_id,\n team_id: channel?.team_id,\n },\n });\n\n if (msg.data.channel_id === currentChannel.id) {\n redirectUserToDefaultTeam();\n }\n\n if (isGuest(currentUser.roles)) {\n dispatch(removeNotVisibleUsers());\n }\n } else if (msg.broadcast.channel_id === currentChannel.id) {\n dispatch(getChannelStats(currentChannel.id));\n dispatch({\n type: UserTypes.RECEIVED_PROFILE_NOT_IN_CHANNEL,\n data: {id: msg.broadcast.channel_id, user_id: msg.data.user_id},\n });\n if (license?.IsLicensed === 'true' && license?.LDAPGroups === 'true' && config.EnableConfirmNotificationsToChannel === 'true') {\n dispatch(getChannelMemberCountsByGroup(currentChannel.id));\n }\n }\n\n if (msg.broadcast.user_id !== currentUser.id) {\n const channel = getChannel(state, msg.broadcast.channel_id);\n const members = getChannelMembersInChannels(state);\n const isMember = Object.values(members).some((member) => member[msg.data.user_id]);\n if (channel && isGuest(currentUser.roles) && !isMember) {\n const actions = [\n {\n type: UserTypes.PROFILE_NO_LONGER_VISIBLE,\n data: {user_id: msg.data.user_id},\n },\n {\n type: TeamTypes.REMOVE_MEMBER_FROM_TEAM,\n data: {team_id: channel.team_id, user_id: msg.data.user_id},\n },\n ];\n dispatch(batchActions(actions));\n }\n }\n\n const channelId = msg.broadcast.channel_id || msg.data.channel_id;\n const userId = msg.broadcast.user_id || msg.data.user_id;\n const channel = getChannel(state, channelId);\n if (channel && !haveISystemPermission(state, {permission: Permissions.VIEW_MEMBERS}) && !haveITeamPermission(state, channel.team_id, Permissions.VIEW_MEMBERS)) {\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILE_NOT_IN_TEAM,\n data: {id: channel.team_id, user_id: userId},\n },\n {\n type: TeamTypes.REMOVE_MEMBER_FROM_TEAM,\n data: {team_id: channel.team_id, user_id: userId},\n },\n ]));\n }\n}\n\nexport async function handleUserUpdatedEvent(msg) {\n // This websocket event is sent to all non-guest users on the server, so be careful requesting data from the server\n // in response to it. That can overwhelm the server if every connected user makes such a request at the same time.\n // See https://mattermost.atlassian.net/browse/MM-40050 for more information.\n\n const state = getState();\n const currentUser = getCurrentUser(state);\n const user = msg.data.user;\n if (user && user.props) {\n const customStatus = user.props.customStatus ? JSON.parse(user.props.customStatus) : undefined;\n dispatch(loadCustomEmojisIfNeeded([customStatus?.emoji]));\n }\n\n if (currentUser.id === user.id) {\n if (user.update_at > currentUser.update_at) {\n // update user to unsanitized user data received from websocket message\n dispatch({\n type: UserTypes.RECEIVED_ME,\n data: user,\n });\n dispatch(loadRolesIfNeeded(user.roles.split(' ')));\n }\n } else {\n dispatch({\n type: UserTypes.RECEIVED_PROFILE,\n data: user,\n });\n }\n}\n\nfunction handleRoleAddedEvent(msg) {\n const role = JSON.parse(msg.data.role);\n\n dispatch({\n type: RoleTypes.RECEIVED_ROLE,\n data: role,\n });\n}\n\nfunction handleRoleRemovedEvent(msg) {\n const role = JSON.parse(msg.data.role);\n\n dispatch({\n type: RoleTypes.ROLE_DELETED,\n data: role,\n });\n}\n\nfunction handleChannelSchemeUpdatedEvent(msg) {\n dispatch(getMyChannelMember(msg.broadcast.channel_id));\n}\n\nfunction handleRoleUpdatedEvent(msg) {\n const role = JSON.parse(msg.data.role);\n\n dispatch({\n type: RoleTypes.RECEIVED_ROLE,\n data: role,\n });\n}\n\nfunction handleChannelCreatedEvent(msg) {\n return async (myDispatch, myGetState) => {\n const channelId = msg.data.channel_id;\n const teamId = msg.data.team_id;\n const state = myGetState();\n\n if (getCurrentTeamId(state) === teamId) {\n let channel = getChannel(state, channelId);\n\n if (!channel) {\n await myDispatch(getChannelAndMyMember(channelId));\n\n channel = getChannel(myGetState(), channelId);\n }\n\n myDispatch(addChannelToInitialCategory(channel, false));\n }\n };\n}\n\nfunction handleChannelDeletedEvent(msg) {\n const state = getState();\n const config = getConfig(state);\n const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n if (getCurrentChannelId(state) === msg.data.channel_id && !viewArchivedChannels) {\n const teamUrl = getCurrentRelativeTeamUrl(state);\n const currentTeamId = getCurrentTeamId(state);\n const redirectChannel = getRedirectChannelNameForTeam(state, currentTeamId);\n getHistory().push(teamUrl + '/channels/' + redirectChannel);\n }\n\n dispatch({type: ChannelTypes.RECEIVED_CHANNEL_DELETED, data: {id: msg.data.channel_id, team_id: msg.broadcast.team_id, deleteAt: msg.data.delete_at, viewArchivedChannels}});\n}\n\nfunction handleChannelUnarchivedEvent(msg) {\n const state = getState();\n const config = getConfig(state);\n const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n\n dispatch({type: ChannelTypes.RECEIVED_CHANNEL_UNARCHIVED, data: {id: msg.data.channel_id, team_id: msg.broadcast.team_id, viewArchivedChannels}});\n}\n\nfunction handlePreferenceChangedEvent(msg) {\n const preference = JSON.parse(msg.data.preference);\n dispatch({type: PreferenceTypes.RECEIVED_PREFERENCES, data: [preference]});\n\n if (addedNewDmUser(preference)) {\n loadProfilesForDM();\n }\n\n if (addedNewGmUser(preference)) {\n loadProfilesForGM();\n }\n}\n\nfunction handlePreferencesChangedEvent(msg) {\n const preferences = JSON.parse(msg.data.preferences);\n dispatch({type: PreferenceTypes.RECEIVED_PREFERENCES, data: preferences});\n\n if (preferences.findIndex(addedNewDmUser) !== -1) {\n loadProfilesForDM();\n }\n\n if (preferences.findIndex(addedNewGmUser) !== -1) {\n loadProfilesForGM();\n }\n}\n\nfunction handlePreferencesDeletedEvent(msg) {\n const preferences = JSON.parse(msg.data.preferences);\n dispatch({type: PreferenceTypes.DELETED_PREFERENCES, data: preferences});\n}\n\nfunction addedNewDmUser(preference) {\n return preference.category === Constants.Preferences.CATEGORY_DIRECT_CHANNEL_SHOW && preference.value === 'true';\n}\n\nfunction addedNewGmUser(preference) {\n return preference.category === Constants.Preferences.CATEGORY_GROUP_CHANNEL_SHOW && preference.value === 'true';\n}\n\nexport function handleStatusChangedEvent(msg) {\n return {\n type: UserTypes.RECEIVED_STATUSES,\n data: {[msg.data.user_id]: msg.data.status},\n };\n}\n\nfunction handleHelloEvent(msg) {\n dispatch(setServerVersion(msg.data.server_version));\n dispatch(setConnectionId(msg.data.connection_id));\n dispatch(setServerHostname(msg.data.server_hostname));\n}\n\nfunction handleReactionAddedEvent(msg) {\n const reaction = JSON.parse(msg.data.reaction);\n\n dispatch(getCustomEmojiForReaction(reaction.emoji_name));\n\n dispatch({\n type: PostTypes.RECEIVED_REACTION,\n data: reaction,\n });\n}\n\nfunction setConnectionId(connectionId) {\n return {\n type: GeneralTypes.SET_CONNECTION_ID,\n payload: {connectionId},\n };\n}\n\nfunction setServerHostname(serverHostname) {\n return {\n type: GeneralTypes.SET_SERVER_HOSTNAME,\n payload: {serverHostname},\n };\n}\n\nfunction handleAddEmoji(msg) {\n const data = JSON.parse(msg.data.emoji);\n\n dispatch({\n type: EmojiTypes.RECEIVED_CUSTOM_EMOJI,\n data,\n });\n}\n\nfunction handleReactionRemovedEvent(msg) {\n const reaction = JSON.parse(msg.data.reaction);\n\n dispatch({\n type: PostTypes.REACTION_DELETED,\n data: reaction,\n });\n}\n\nfunction handleMultipleChannelsViewedEvent(msg) {\n if (getCurrentUserId(getState()) === msg.broadcast.user_id) {\n dispatch(markMultipleChannelsAsRead(msg.data.channel_times));\n }\n}\n\nexport function handlePluginEnabled(msg) {\n const manifest = msg.data.manifest;\n dispatch({type: ActionTypes.RECEIVED_WEBAPP_PLUGIN, data: manifest});\n\n loadPlugin(manifest).catch((error) => {\n console.error(error.message); //eslint-disable-line no-console\n });\n}\n\nexport function handlePluginDisabled(msg) {\n const manifest = msg.data.manifest;\n removePlugin(manifest);\n}\n\nfunction handleUserRoleUpdated(msg) {\n const user = store.getState().entities.users.profiles[msg.data.user_id];\n\n if (user) {\n const roles = msg.data.roles;\n const newRoles = roles.split(' ');\n const demoted = user.roles.includes(Constants.PERMISSIONS_SYSTEM_ADMIN) && !roles.includes(Constants.PERMISSIONS_SYSTEM_ADMIN);\n\n store.dispatch({type: UserTypes.RECEIVED_PROFILE, data: {...user, roles}});\n dispatch(loadRolesIfNeeded(newRoles));\n\n if (demoted && global.location.pathname.startsWith('/admin_console')) {\n redirectUserToDefaultTeam();\n }\n }\n}\n\nfunction handleConfigChanged(msg) {\n store.dispatch({type: GeneralTypes.CLIENT_CONFIG_RECEIVED, data: msg.data.config});\n}\n\nfunction handleLicenseChanged(msg) {\n store.dispatch({type: GeneralTypes.CLIENT_LICENSE_RECEIVED, data: msg.data.license});\n}\n\nfunction handlePluginStatusesChangedEvent(msg) {\n store.dispatch({type: AdminTypes.RECEIVED_PLUGIN_STATUSES, data: msg.data.plugin_statuses});\n}\n\nfunction handleOpenDialogEvent(msg) {\n const data = (msg.data && msg.data.dialog) || {};\n const dialog = JSON.parse(data);\n\n store.dispatch({type: IntegrationTypes.RECEIVED_DIALOG, data: dialog});\n\n const currentTriggerId = getState().entities.integrations.dialogTriggerId;\n\n if (dialog.trigger_id !== currentTriggerId) {\n return;\n }\n\n store.dispatch(openModal({modalId: ModalIdentifiers.INTERACTIVE_DIALOG, dialogType: InteractiveDialog}));\n}\n\nfunction handleGroupUpdatedEvent(msg) {\n const data = JSON.parse(msg.data.group);\n dispatch(\n {\n type: GroupTypes.PATCHED_GROUP,\n data,\n },\n );\n}\n\nexport function handleGroupAddedMemberEvent(msg) {\n return async (doDispatch, doGetState) => {\n const state = doGetState();\n const currentUserId = getCurrentUserId(state);\n const groupInfo = JSON.parse(msg.data.group_member);\n\n if (currentUserId === groupInfo.user_id) {\n const group = getGroup(state, groupInfo.group_id);\n if (group) {\n dispatch(\n {\n type: GroupTypes.ADD_MY_GROUP,\n id: groupInfo.group_id,\n },\n );\n } else {\n const {error} = await doDispatch(fetchGroup(groupInfo.group_id, true));\n if (!error) {\n dispatch(\n {\n type: GroupTypes.ADD_MY_GROUP,\n id: groupInfo.group_id,\n },\n );\n }\n }\n }\n };\n}\n\nfunction handleGroupDeletedMemberEvent(msg) {\n return (doDispatch, doGetState) => {\n const state = doGetState();\n const currentUserId = getCurrentUserId(state);\n const data = JSON.parse(msg.data.group_member);\n\n if (currentUserId === data.user_id) {\n dispatch(\n {\n type: GroupTypes.REMOVE_MY_GROUP,\n data,\n id: data.group_id,\n },\n );\n }\n };\n}\n\nfunction handleGroupAssociatedToTeamEvent(msg) {\n store.dispatch({\n type: GroupTypes.RECEIVED_GROUP_ASSOCIATED_TO_TEAM,\n data: {teamID: msg.broadcast.team_id, groups: [{id: msg.data.group_id}]},\n });\n}\n\nfunction handleGroupNotAssociatedToTeamEvent(msg) {\n store.dispatch({\n type: GroupTypes.RECEIVED_GROUP_NOT_ASSOCIATED_TO_TEAM,\n data: {teamID: msg.broadcast.team_id, groups: [{id: msg.data.group_id}]},\n });\n}\n\nfunction handleGroupAssociatedToChannelEvent(msg) {\n store.dispatch({\n type: GroupTypes.RECEIVED_GROUP_ASSOCIATED_TO_CHANNEL,\n data: {channelID: msg.broadcast.channel_id, groups: [{id: msg.data.group_id}]},\n });\n}\n\nfunction handleGroupNotAssociatedToChannelEvent(msg) {\n store.dispatch({\n type: GroupTypes.RECEIVED_GROUP_NOT_ASSOCIATED_TO_CHANNEL,\n data: {channelID: msg.broadcast.channel_id, groups: [{id: msg.data.group_id}]},\n });\n}\n\nfunction handleSidebarCategoryCreated(msg) {\n return (doDispatch, doGetState) => {\n const state = doGetState();\n\n if (!msg.broadcast.team_id) {\n return;\n }\n\n if (msg.broadcast.team_id !== getCurrentTeamId(state)) {\n // The new category will be loaded when we switch teams.\n return;\n }\n\n // Fetch all categories, including ones that weren't explicitly updated, in case any other categories had channels\n // moved out of them.\n doDispatch(fetchMyCategories(msg.broadcast.team_id));\n };\n}\n\nfunction handleSidebarCategoryUpdated(msg) {\n return (doDispatch, doGetState) => {\n const state = doGetState();\n\n if (!msg.broadcast.team_id) {\n return;\n }\n\n if (msg.broadcast.team_id !== getCurrentTeamId(state)) {\n // The updated categories will be loaded when we switch teams.\n return;\n }\n\n // Fetch all categories in case any other categories had channels moved out of them.\n // True indicates it is called from WebSocket\n doDispatch(fetchMyCategories(msg.broadcast.team_id, true));\n };\n}\n\nfunction handleSidebarCategoryDeleted(msg) {\n return (doDispatch, doGetState) => {\n const state = doGetState();\n\n if (!msg.broadcast.team_id) {\n return;\n }\n\n if (msg.broadcast.team_id !== getCurrentTeamId(state)) {\n // The category will be removed when we switch teams.\n return;\n }\n\n // Fetch all categories since any channels that were in the deleted category were moved to other categories.\n doDispatch(fetchMyCategories(msg.broadcast.team_id));\n };\n}\n\nfunction handleSidebarCategoryOrderUpdated(msg) {\n return receivedCategoryOrder(msg.broadcast.team_id, msg.data.order);\n}\n\nexport function handleUserActivationStatusChange() {\n return (doDispatch, doGetState) => {\n const state = doGetState();\n const license = getLicense(state);\n\n // This event is fired when a user first joins the server, so refresh analytics to see if we're now over the user limit\n if (license.Cloud === 'true') {\n if (isCurrentUserSystemAdmin(state)) {\n doDispatch(getStandardAnalytics());\n }\n }\n };\n}\n\nfunction handleCloudPaymentStatusUpdated() {\n return (doDispatch) => doDispatch(getCloudSubscription());\n}\n\nexport function handleCloudSubscriptionChanged(msg) {\n return (doDispatch, doGetState) => {\n const state = doGetState();\n const license = getLicense(state);\n\n if (license.Cloud === 'true') {\n if (msg.data.limits) {\n doDispatch({\n type: CloudTypes.RECEIVED_CLOUD_LIMITS,\n data: msg.data.limits,\n });\n }\n\n if (msg.data.subscription) {\n doDispatch({\n type: CloudTypes.RECEIVED_CLOUD_SUBSCRIPTION,\n data: msg.data.subscription,\n });\n }\n }\n return {data: true};\n };\n}\n\nfunction handleRefreshAppsBindings() {\n return (doDispatch, doGetState) => {\n const state = doGetState();\n\n doDispatch(fetchAppBindings(getCurrentChannelId(state)));\n\n const siteURL = state.entities.general.config.SiteURL;\n const currentURL = window.location.href;\n let threadIdentifier;\n if (currentURL.startsWith(siteURL)) {\n const parts = currentURL.substr(siteURL.length + (siteURL.endsWith('/') ? 0 : 1)).split('/');\n if (parts.length === 3 && parts[1] === 'threads') {\n threadIdentifier = parts[2];\n }\n }\n const rhsPost = getSelectedPost(state);\n let selectedThread;\n if (threadIdentifier) {\n selectedThread = getThread(state, threadIdentifier);\n }\n const rootID = threadIdentifier || rhsPost?.id;\n const channelID = selectedThread?.post?.channel_id || rhsPost?.channel_id;\n if (!rootID) {\n return {data: true};\n }\n\n doDispatch(fetchRHSAppsBindings(channelID));\n return {data: true};\n };\n}\n\nexport function handleAppsPluginEnabled() {\n dispatch(handleRefreshAppsBindings());\n\n return {\n type: AppsTypes.APPS_PLUGIN_ENABLED,\n };\n}\n\nexport function handleAppsPluginDisabled() {\n return {\n type: AppsTypes.APPS_PLUGIN_DISABLED,\n };\n}\n\nfunction handleFirstAdminVisitMarketplaceStatusReceivedEvent(msg) {\n const receivedData = JSON.parse(msg.data.firstAdminVisitMarketplaceStatus);\n store.dispatch({type: GeneralTypes.FIRST_ADMIN_VISIT_MARKETPLACE_STATUS_RECEIVED, data: receivedData});\n}\n\nfunction handleThreadReadChanged(msg) {\n return (doDispatch, doGetState) => {\n if (msg.data.thread_id) {\n const state = doGetState();\n const thread = getThreads(state)?.[msg.data.thread_id];\n\n // skip marking the thread as read (when the user is viewing the thread)\n if (thread && !isThreadOpen(state, thread.id)) {\n doDispatch(updateThreadLastOpened(thread.id, msg.data.timestamp));\n }\n\n doDispatch(\n handleReadChanged(\n msg.data.thread_id,\n msg.broadcast.team_id,\n msg.data.channel_id,\n {\n lastViewedAt: msg.data.timestamp,\n prevUnreadMentions: thread?.unread_mentions ?? msg.data.previous_unread_mentions,\n newUnreadMentions: msg.data.unread_mentions,\n prevUnreadReplies: thread?.unread_replies ?? msg.data.previous_unread_replies,\n newUnreadReplies: msg.data.unread_replies,\n },\n ),\n );\n } else if (msg.broadcast.channel_id) {\n doDispatch(handleAllThreadsInChannelMarkedRead(msg.broadcast.channel_id, msg.data.timestamp));\n } else {\n doDispatch(handleAllMarkedRead(msg.broadcast.team_id));\n }\n };\n}\n\nfunction handleThreadUpdated(msg) {\n return (doDispatch, doGetState) => {\n let threadData;\n try {\n threadData = JSON.parse(msg.data.thread);\n } catch {\n // invalid JSON\n return;\n }\n\n const state = doGetState();\n const currentUserId = getCurrentUserId(state);\n const currentTeamId = getCurrentTeamId(state);\n\n let lastViewedAt;\n\n // if current user has replied to the thread\n // make sure to set following as true\n if (currentUserId === threadData.post.user_id) {\n threadData.is_following = true;\n }\n\n if (isThreadOpen(state, threadData.id) && window.isActive && !isThreadManuallyUnread(state, threadData.id)) {\n lastViewedAt = Date.now();\n\n // Sometimes `Date.now()` was generating a timestamp before the\n // last_reply_at of the thread, thus marking the thread as unread\n // instead of read. Here we set the timestamp to after the\n // last_reply_at if this happens.\n if (lastViewedAt < threadData.last_reply_at) {\n lastViewedAt = threadData.last_reply_at + 1;\n }\n\n // prematurely update thread data as read\n // so we won't flash the indicators when\n // we mark the thread as read on the server\n threadData.last_viewed_at = lastViewedAt;\n threadData.unread_mentions = 0;\n threadData.unread_replies = 0;\n\n // mark thread as read on the server\n dispatch(updateThreadRead(currentUserId, currentTeamId, threadData.id, lastViewedAt));\n }\n\n handleThreadArrived(doDispatch, doGetState, threadData, msg.broadcast.team_id, msg.data.previous_unread_replies, msg.data.previous_unread_mentions);\n };\n}\n\nfunction handleThreadFollowChanged(msg) {\n return async (doDispatch, doGetState) => {\n const state = doGetState();\n const thread = getThread(state, msg.data.thread_id);\n if (!thread && msg.data.state && msg.data.reply_count) {\n await doDispatch(fetchThread(getCurrentUserId(state), msg.broadcast.team_id, msg.data.thread_id, true));\n }\n handleFollowChanged(doDispatch, msg.data.thread_id, msg.broadcast.team_id, msg.data.state);\n };\n}\n\nfunction handlePostAcknowledgementAdded(msg) {\n const data = JSON.parse(msg.data.acknowledgement);\n\n return {\n type: PostTypes.CREATE_ACK_POST_SUCCESS,\n data,\n };\n}\n\nfunction handlePostAcknowledgementRemoved(msg) {\n const data = JSON.parse(msg.data.acknowledgement);\n\n return {\n type: PostTypes.DELETE_ACK_POST_SUCCESS,\n data,\n };\n}\n\nfunction handleUpsertDraftEvent(msg) {\n return async (doDispatch) => {\n const draft = JSON.parse(msg.data.draft);\n const {key, value} = transformServerDraft(draft);\n value.show = true;\n\n doDispatch(setGlobalDraft(key, value, true));\n };\n}\n\nfunction handleCreateScheduledPostEvent(msg) {\n return async (doDispatch) => {\n const scheduledPost = JSON.parse(msg.data.scheduledPost);\n const state = getState();\n const teamId = getTeamIdByChannelId(state, scheduledPost.channel_id);\n\n doDispatch({\n type: ScheduledPostTypes.SINGLE_SCHEDULED_POST_RECEIVED,\n data: {\n scheduledPost,\n teamId,\n },\n });\n };\n}\n\nfunction handleUpdateScheduledPostEvent(msg) {\n return async (doDispatch) => {\n const scheduledPost = JSON.parse(msg.data.scheduledPost);\n\n doDispatch({\n type: ScheduledPostTypes.SCHEDULED_POST_UPDATED,\n data: {\n scheduledPost,\n },\n });\n };\n}\n\nfunction handleDeleteScheduledPostEvent(msg) {\n return async (doDispatch) => {\n const scheduledPost = JSON.parse(msg.data.scheduledPost);\n\n doDispatch({\n type: ScheduledPostTypes.SCHEDULED_POST_DELETED,\n data: {\n scheduledPost,\n },\n });\n };\n}\n\nfunction handleDeleteDraftEvent(msg) {\n return async (doDispatch) => {\n const draft = JSON.parse(msg.data.draft);\n const {key} = transformServerDraft(draft);\n\n doDispatch(setGlobalItem(key, {\n message: '',\n fileInfos: [],\n uploadsInProgress: [],\n }));\n };\n}\n\nfunction handlePersistentNotification(msg) {\n return async (doDispatch) => {\n const post = JSON.parse(msg.data.post);\n\n doDispatch(sendDesktopNotification(post, msg.data));\n };\n}\n\nfunction handleHostedCustomerSignupProgressUpdated(msg) {\n return {\n type: HostedCustomerTypes.RECEIVED_SELF_HOSTED_SIGNUP_PROGRESS,\n data: msg.data.progress,\n };\n}\n\nfunction handleChannelBookmarkCreated(msg) {\n const bookmark = JSON.parse(msg.data.bookmark);\n\n return {\n type: ChannelBookmarkTypes.RECEIVED_BOOKMARK,\n data: bookmark,\n };\n}\n\nfunction handleChannelBookmarkUpdated(msg) {\n return async (doDispatch) => {\n const {updated, deleted} = JSON.parse(msg.data.bookmarks);\n\n if (updated) {\n doDispatch({\n type: ChannelBookmarkTypes.RECEIVED_BOOKMARK,\n data: updated,\n });\n }\n\n if (deleted) {\n doDispatch({\n type: ChannelBookmarkTypes.BOOKMARK_DELETED,\n data: deleted,\n });\n }\n };\n}\n\nfunction handleChannelBookmarkDeleted(msg) {\n const bookmark = JSON.parse(msg.data.bookmark);\n\n return {\n type: ChannelBookmarkTypes.BOOKMARK_DELETED,\n data: bookmark,\n };\n}\n\nfunction handleChannelBookmarkSorted(msg) {\n const bookmarks = JSON.parse(msg.data.bookmarks);\n\n return {\n type: ChannelBookmarkTypes.RECEIVED_BOOKMARKS,\n data: {channelId: msg.broadcast.channel_id, bookmarks},\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function incrementWsErrorCount() {\n return async (dispatch) => {\n dispatch({\n type: ActionTypes.INCREMENT_WS_ERROR_COUNT,\n });\n };\n}\n\nexport function resetWsErrorCount() {\n return async (dispatch) => {\n dispatch({\n type: ActionTypes.RESET_WS_ERROR_COUNT,\n });\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport ExternalLink from 'components/external_link';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\n\nimport type {GlobalState} from 'types/store';\n\nimport './about_build_modal_cloud.scss';\n\ntype Props = {\n onExited: () => void;\n config: any;\n license: any;\n show: boolean;\n doHide: () => void;\n};\n\nexport default function AboutBuildModalCloud(props: Props) {\n const config = props.config;\n const license = props.license;\n\n let companyName = license.Company;\n const companyInfo = useSelector((state: GlobalState) => state.entities.cloud.customer);\n\n if (companyInfo) {\n companyName = companyInfo.name;\n }\n\n const title = (\n <FormattedMessage\n id='about.cloudEdition'\n defaultMessage='Cloud'\n />\n );\n\n const subTitle = (\n <FormattedMessage\n id='about.enterpriseEditionSst'\n defaultMessage='High trust messaging for the enterprise'\n />\n );\n\n const licensee = (\n <div className='form-group'>\n <FormattedMessage\n id='about.licensed'\n defaultMessage='Licensed to:'\n />\n {'\\u00a0' + companyName}\n </div>\n );\n\n return (\n <Modal\n dialogClassName={classNames('a11y__modal', 'about-modal', 'cloud')}\n show={props.show}\n onHide={props.doHide}\n onExited={props.onExited}\n role='none'\n aria-labelledby='aboutModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='aboutModalLabel'\n >\n <FormattedMessage\n id='about.title'\n values={{appTitle: config.SiteName || 'Mattermost'}}\n defaultMessage='About {appTitle}'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className='about-modal__content'>\n <div className='about-modal__logo'>\n <MattermostLogo/>\n </div>\n <div>\n <h3 className='about-modal__title'>\n <strong>{'Mattermost'} {title}</strong>\n </h3>\n <p className='subtitle'>{subTitle}</p>\n <div className='description'>\n <div data-testid='aboutModalVersion'>\n <FormattedMessage\n id='about.version'\n defaultMessage='Mattermost Version:'\n />\n <span id='versionString'>{'\\u00a0' + config.Version}</span>\n </div>\n </div>\n {licensee}\n <div className='about-footer'>\n <FormattedMessage\n id='about.notice'\n defaultMessage='Mattermost is made possible by the open source software used in our <linkServer>server</linkServer>, <linkDesktop>desktop</linkDesktop> and <linkMobile>mobile</linkMobile> apps.'\n values={{\n linkServer: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt'\n location='about_build_modal_cloud'\n >\n {msg}\n </ExternalLink>\n ),\n linkDesktop: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://github.com/mattermost/desktop/blob/master/NOTICE.txt'\n location='about_build_modal_cloud'\n >\n {msg}\n </ExternalLink>\n ),\n linkMobile: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt'\n location='about_build_modal_cloud'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n <div className='copy-right'>\n <FormattedMessage\n id='about.copyright'\n defaultMessage='Copyright 2015 - {currentYear} Mattermost, Inc. All rights reserved'\n values={{\n currentYear: new Date().getFullYear(),\n }}\n />\n </div>\n </div>\n </div>\n <div/>\n </div>\n <div className='about-modal__hash'>\n <p>\n <FormattedMessage\n id='about.hash'\n defaultMessage='Build Hash:'\n />\n {config.BuildHash}\n <br/>\n <FormattedMessage\n id='about.hashee'\n defaultMessage='EE Build Hash:'\n />\n {config.BuildHashEnterprise}\n </p>\n <p>\n <FormattedMessage\n id='about.date'\n defaultMessage='Build Date:'\n />\n {config.BuildDate}\n </p>\n </div>\n </Modal.Body>\n </Modal>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ClientConfig, ClientLicense} from '@mattermost/types/config';\n\nimport ExternalLink from 'components/external_link';\nimport Nbsp from 'components/html_entities/nbsp';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\n\nimport {AboutLinks} from 'utils/constants';\n\nimport AboutBuildModalCloud from './about_build_modal_cloud/about_build_modal_cloud';\n\ntype SocketStatus = {\n connected: boolean;\n serverHostname: string | undefined;\n}\n\ntype Props = {\n\n /**\n * Function called after the modal has been hidden\n */\n onExited: () => void;\n\n /**\n * Global config object\n */\n config: Partial<ClientConfig>;\n\n /**\n * Global license object\n */\n license: ClientLicense;\n\n socketStatus: SocketStatus;\n};\n\ntype State = {\n show: boolean;\n};\n\nexport default class AboutBuildModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n show: true,\n };\n }\n\n doHide = () => {\n this.setState({show: false});\n this.props.onExited();\n };\n\n render() {\n const config = this.props.config;\n const license = this.props.license;\n\n if (license.Cloud === 'true') {\n return (\n <AboutBuildModalCloud\n {...this.props}\n {...this.state}\n doHide={this.doHide}\n />\n );\n }\n\n let title = (\n <FormattedMessage\n id='about.teamEditiont0'\n defaultMessage='Team Edition'\n />\n );\n\n let subTitle = (\n <FormattedMessage\n id='about.teamEditionSt'\n defaultMessage='All your team communication in one place, instantly searchable and accessible anywhere.'\n />\n );\n\n let learnMore = (\n <div>\n <FormattedMessage\n id='about.teamEditionLearn'\n defaultMessage='Join the Mattermost community at '\n />\n <ExternalLink\n location='about_build_modal'\n href='https://mattermost.com/community/'\n >\n {'mattermost.com/community/'}\n </ExternalLink>\n </div>\n );\n\n let licensee;\n if (config.BuildEnterpriseReady === 'true') {\n title = (\n <FormattedMessage\n id='about.teamEditiont1'\n defaultMessage='Enterprise Edition'\n />\n );\n\n subTitle = (\n <FormattedMessage\n id='about.enterpriseEditionSt'\n defaultMessage='Modern communication from behind your firewall.'\n />\n );\n\n learnMore = (\n <div>\n <FormattedMessage\n id='about.enterpriseEditionLearn'\n defaultMessage='Learn more about Enterprise Edition at '\n />\n <ExternalLink\n location='about_build_modal'\n href='https://mattermost.com/'\n >\n {'mattermost.com'}\n </ExternalLink>\n </div>\n );\n\n if (license.IsLicensed === 'true') {\n title = (\n <FormattedMessage\n id='about.enterpriseEditione1'\n defaultMessage='Enterprise Edition'\n />\n );\n licensee = (\n <div className='form-group'>\n <FormattedMessage\n id='about.licensed'\n defaultMessage='Licensed to:'\n />\n <Nbsp/>{license.Company}\n </div>\n );\n }\n }\n\n const termsOfService = (\n <ExternalLink\n location='about_build_modal'\n id='tosLink'\n href={AboutLinks.TERMS_OF_SERVICE}\n >\n <FormattedMessage\n id='about.tos'\n defaultMessage='Terms of Use'\n />\n </ExternalLink>\n );\n\n const privacyPolicy = (\n <ExternalLink\n id='privacyLink'\n location='about_build_modal'\n href={AboutLinks.PRIVACY_POLICY}\n >\n <FormattedMessage\n id='about.privacy'\n defaultMessage='Privacy Policy'\n />\n </ExternalLink>\n );\n\n const buildnumber: JSX.Element | null = (\n <div data-testid='aboutModalBuildNumber'>\n <FormattedMessage\n id='about.buildnumber'\n defaultMessage='Build Number:'\n />\n <span id='buildnumberString'>{'\\u00a0' + (config.BuildNumber === 'dev' ? 'n/a' : config.BuildNumber)}</span>\n </div>\n );\n\n const mmversion: string | undefined = config.BuildNumber === 'dev' ? config.BuildNumber : config.Version;\n\n let serverHostname;\n if (!this.props.socketStatus.connected) {\n serverHostname = (\n <div>\n <FormattedMessage\n id='about.serverHostname'\n defaultMessage='Hostname:'\n />\n <Nbsp/>\n <FormattedMessage\n id='about.serverDisconnected'\n defaultMessage='disconnected'\n />\n </div>\n );\n } else if (this.props.socketStatus.serverHostname) {\n serverHostname = (\n <div>\n <FormattedMessage\n id='about.serverHostname'\n defaultMessage='Hostname:'\n />\n <Nbsp/>\n {this.props.socketStatus.serverHostname}\n </div>\n );\n } else {\n serverHostname = (\n <div>\n <FormattedMessage\n id='about.serverHostname'\n defaultMessage='Hostname:'\n />\n <Nbsp/>\n <FormattedMessage\n id='about.serverUnknown'\n defaultMessage='server did not provide hostname'\n />\n </div>\n );\n }\n\n return (\n <Modal\n dialogClassName='a11y__modal about-modal'\n show={this.state.show}\n onHide={this.doHide}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='aboutModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='aboutModalLabel'\n >\n <FormattedMessage\n id='about.title'\n values={{\n appTitle: config.SiteName || 'Mattermost',\n }}\n defaultMessage='About {appTitle}'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className='about-modal__content'>\n <div className='about-modal__logo'>\n <MattermostLogo/>\n </div>\n <div>\n <h3 className='about-modal__title'>\n <strong>\n {'Mattermost'} {title}\n </strong>\n </h3>\n <p className='about-modal__subtitle pb-2'>\n {subTitle}\n </p>\n <div className='form-group less'>\n <div data-testid='aboutModalVersion'>\n <FormattedMessage\n id='about.version'\n defaultMessage='Mattermost Version:'\n />\n <span id='versionString'>\n {'\\u00a0' + mmversion}\n </span>\n </div>\n <div data-testid='aboutModalDBVersionString'>\n <FormattedMessage\n id='about.dbversion'\n defaultMessage='Database Schema Version:'\n />\n <span id='dbversionString'>\n {'\\u00a0' + config.SchemaVersion}\n </span>\n </div>\n {buildnumber}\n <div>\n <FormattedMessage\n id='about.database'\n defaultMessage='Database:'\n />\n {'\\u00a0' + config.SQLDriverName}\n </div>\n {serverHostname}\n </div>\n {licensee}\n </div>\n </div>\n <div className='about-modal__footer'>\n {learnMore}\n <div className='form-group'>\n <div className='about-modal__copyright'>\n <FormattedMessage\n id='about.copyright'\n defaultMessage='Copyright 2015 - {currentYear} Mattermost, Inc. All rights reserved'\n values={{\n currentYear: new Date().getFullYear(),\n }}\n />\n </div>\n <div className='about-modal__links'>\n {termsOfService}\n {' - '}\n {privacyPolicy}\n </div>\n </div>\n </div>\n <div className='about-modal__notice form-group pt-3'>\n <p>\n <FormattedMessage\n id='about.notice'\n defaultMessage='Mattermost is made possible by the open source software used in our <linkServer>server</linkServer>, <linkDesktop>desktop</linkDesktop> and <linkMobile>mobile</linkMobile> apps.'\n values={{\n linkServer: (msg: React.ReactNode) => (\n <ExternalLink\n location='about_build_modal'\n href='https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt'\n >\n {msg}\n </ExternalLink>\n ),\n linkDesktop: (msg: React.ReactNode) => (\n <ExternalLink\n location='about_build_modal'\n href='https://github.com/mattermost/desktop/blob/master/NOTICE.txt'\n >\n {msg}\n </ExternalLink>\n ),\n linkMobile: (msg: React.ReactNode) => (\n <ExternalLink\n location='about_build_modal'\n href='https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>\n </div>\n <div className='about-modal__hash'>\n <p>\n <FormattedMessage\n id='about.hash'\n defaultMessage='Build Hash:'\n />\n <Nbsp/>\n {config.BuildHash}\n <br/>\n <FormattedMessage\n id='about.hashee'\n defaultMessage='EE Build Hash:'\n />\n <Nbsp/>\n {config.BuildHashEnterprise}\n </p>\n <p>\n <FormattedMessage\n id='about.date'\n defaultMessage='Build Date:'\n />\n <Nbsp/>\n {config.BuildDate}\n </p>\n </div>\n </Modal.Body>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {getSocketStatus} from 'selectors/views/websocket';\n\nimport type {GlobalState} from 'types/store';\n\nimport AboutBuildModal from './about_build_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n config: getConfig(state),\n license: getLicense(state),\n socketStatus: getSocketStatus(state),\n };\n}\n\nexport default connect(mapStateToProps)(AboutBuildModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {RefObject} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport type {IntlShape} from 'react-intl';\nimport {injectIntl, FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {Group, SyncablePatch} from '@mattermost/types/groups';\nimport {SyncableType} from '@mattermost/types/groups';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport Nbsp from 'components/html_entities/nbsp';\nimport MultiSelect from 'components/multiselect/multiselect';\nimport type {Value} from 'components/multiselect/multiselect';\n\nimport groupsAvatar from 'images/groups-avatar.png';\nimport Constants from 'utils/constants';\n\nconst GROUPS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = 10;\n\ntype GroupValue = Value & {member_count?: number};\n\ntype Props = {\n currentTeamName?: string;\n currentTeamId: string;\n intl: IntlShape;\n searchTerm: string;\n groups: Group[];\n\n // used in tandem with 'skipCommit' to allow using this component without performing actual linking\n excludeGroups?: Group[];\n includeGroups?: Group[];\n onExited: () => void;\n skipCommit?: boolean;\n onAddCallback?: (groupIDs: string[]) => void;\n actions: Actions;\n}\n\nexport type Actions = {\n getGroupsNotAssociatedToTeam: (teamID: string, q?: string, page?: number, perPage?: number) => Promise<ActionResult>;\n setModalSearchTerm: (term: string) => void;\n linkGroupSyncable: (groupID: string, syncableID: string, syncableType: SyncableType, patch: SyncablePatch) => Promise<ActionResult>;\n getAllGroupsAssociatedToTeam: (teamID: string, filterAllowReference: boolean, includeMemberCount: boolean) => Promise<ActionResult>;\n};\n\ntype State = {\n values: GroupValue[];\n show: boolean;\n search: boolean;\n saving: boolean;\n addError: null | string;\n loadingGroups: boolean;\n}\n\nexport class AddGroupsToTeamModal extends React.PureComponent<Props, State> {\n private searchTimeoutId: number;\n private readonly selectedItemRef: RefObject<HTMLDivElement>;\n\n constructor(props: Props) {\n super(props);\n\n this.searchTimeoutId = 0;\n\n this.state = {\n values: [],\n show: true,\n search: false,\n saving: false,\n addError: null,\n loadingGroups: true,\n };\n\n this.selectedItemRef = React.createRef();\n }\n\n public componentDidMount() {\n Promise.all([\n this.props.actions.getGroupsNotAssociatedToTeam(this.props.currentTeamId, '', 0, GROUPS_PER_PAGE + 1),\n this.props.actions.getAllGroupsAssociatedToTeam(this.props.currentTeamId, false, true),\n ]).then(() => {\n this.setGroupsLoadingState(false);\n });\n }\n\n public componentDidUpdate(prevProps: Props) {\n if (this.props.searchTerm !== prevProps.searchTerm) {\n clearTimeout(this.searchTimeoutId);\n\n const searchTerm = this.props.searchTerm;\n if (searchTerm === '') {\n return;\n }\n\n this.searchTimeoutId = window.setTimeout(\n async () => {\n this.setGroupsLoadingState(true);\n await this.props.actions.getGroupsNotAssociatedToTeam(this.props.currentTeamId, searchTerm);\n this.setGroupsLoadingState(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n }\n }\n\n // public for tests\n public handleHide = () => {\n this.props.actions.setModalSearchTerm('');\n this.setState({show: false});\n };\n\n // public for tests\n public handleExit = (): void => {\n this.props.onExited();\n };\n\n // public for tests\n public handleResponse = (err?: Error): void => {\n let addError = null;\n if (err && err.message) {\n addError = err.message;\n }\n\n this.setState({\n saving: false,\n addError,\n });\n };\n\n // public for tests\n public handleSubmit = async () => {\n const groupIDs = this.state.values.map((v) => v.id);\n if (groupIDs.length === 0) {\n return;\n }\n if (this.props.skipCommit) {\n if (this.props.onAddCallback) {\n this.props.onAddCallback(groupIDs);\n }\n this.handleHide();\n return;\n }\n\n this.setState({saving: true});\n\n await Promise.all(groupIDs.map(async (groupID) => {\n const {error} = await this.props.actions.linkGroupSyncable(groupID, this.props.currentTeamId, SyncableType.Team, {auto_add: true, scheme_admin: false});\n this.handleResponse(error);\n if (!error) {\n this.handleHide();\n }\n }));\n };\n\n // public for tests\n public addValue = (value: GroupValue): void => {\n const values = Object.assign<GroupValue[], GroupValue[]>([], this.state.values);\n const userIds = values.map((v) => v.id);\n if (value && value.id && userIds.indexOf(value.id) === -1) {\n values.push(value);\n }\n\n this.setState({values});\n };\n\n private setGroupsLoadingState = (loadingState: boolean) => {\n this.setState({\n loadingGroups: loadingState,\n });\n };\n\n // public for tests\n public handlePageChange = (page: number, prevPage: number): void => {\n if (page > prevPage) {\n this.setGroupsLoadingState(true);\n this.props.actions.getGroupsNotAssociatedToTeam(this.props.currentTeamId, this.props.searchTerm, page, GROUPS_PER_PAGE + 1).then(() => {\n this.setGroupsLoadingState(false);\n });\n }\n };\n\n // public for tests\n public handleDelete = (values: GroupValue[]): void => this.setState({values});\n\n // public for tests\n public search = (term: string): void => this.props.actions.setModalSearchTerm(term);\n\n // public for tests\n public renderOption = (option: GroupValue, isSelected: boolean, onAdd: (value: GroupValue) => void, onMouseMove: (value: GroupValue) => void): JSX.Element => {\n const rowSelected = isSelected ? 'more-modal__row--selected' : '';\n\n return (\n <div\n key={option.id}\n ref={isSelected ? this.selectedItemRef : option.id}\n className={'more-modal__row clickable ' + rowSelected}\n onClick={() => onAdd(option)}\n onMouseMove={() => onMouseMove(option)}\n >\n <img\n className='more-modal__image'\n src={groupsAvatar}\n alt='group picture'\n width='32'\n height='32'\n />\n <div\n className='more-modal__details'\n >\n <div className='more-modal__name'>\n {option.display_name}<Nbsp/>{'-'}<Nbsp/><span className='more-modal__name_sub'>\n <FormattedMessage\n id='numMembers'\n defaultMessage='{num, number} {num, plural, one {member} other {members}}'\n values={{\n num: option.member_count,\n }}\n />\n </span>\n </div>\n </div>\n <div className='more-modal__actions'>\n <div className='more-modal__actions--round'>\n <i className='icon icon-plus'/>\n </div>\n </div>\n </div>\n );\n };\n\n // public for tests\n public renderValue = (props: { data: Value }): string | undefined => props.data.display_name;\n\n public render(): JSX.Element {\n const numRemainingText = (\n <div id='numGroupsRemaining'>\n <FormattedMessage\n id='multiselect.numGroupsRemaining'\n defaultMessage='Use ↑↓ to browse, ↵ to select. You can add {num, number} more {num, plural, one {group} other {groups}}. '\n values={{\n num: MAX_SELECTABLE_VALUES - this.state.values.length,\n }}\n />\n </div>\n );\n\n const buttonSubmitText = defineMessage({id: 'multiselect.add', defaultMessage: 'Add'});\n const buttonSubmitLoadingText = defineMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'});\n\n let addError = null;\n if (this.state.addError) {\n addError = (\n <div className='has-error col-sm-12'>\n <label className='control-label font-weight--normal'>\n {this.state.addError}\n </label>\n </div>\n );\n }\n\n let groupsToShow = this.props.groups;\n if (this.props.excludeGroups) {\n const hasGroup = (og: Group) => !this.props.excludeGroups?.find((g) => g.id === og.id);\n groupsToShow = groupsToShow.filter(hasGroup);\n }\n if (this.props.includeGroups) {\n const hasGroup = (og: Group) => this.props.includeGroups?.find((g) => g.id === og.id);\n groupsToShow = [...groupsToShow, ...this.props.includeGroups.filter(hasGroup)];\n }\n\n const groupsOptionsToShow = groupsToShow.map((group) => {\n return {...group, label: group.display_name, value: group.id};\n });\n\n return (\n <Modal\n id='addGroupsToTeamModal'\n dialogClassName={'a11y__modal more-modal more-direct-channels'}\n show={this.state.show}\n onHide={this.handleHide}\n onExited={this.handleExit}\n >\n <Modal.Header closeButton={true}>\n <Modal.Title componentClass='h1'>\n <FormattedMessage\n id='add_groups_to_team.title'\n defaultMessage='Add New Groups to {teamName} Team'\n values={{\n teamName: (\n <strong>{this.props.currentTeamName ?? ''}</strong>\n ),\n }}\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {addError}\n <MultiSelect\n key='addGroupsToTeamKey'\n options={groupsOptionsToShow}\n optionRenderer={this.renderOption}\n intl={this.props.intl}\n selectedItemRef={this.selectedItemRef}\n values={this.state.values}\n valueRenderer={this.renderValue}\n perPage={GROUPS_PER_PAGE}\n handlePageChange={this.handlePageChange}\n handleInput={this.search}\n handleDelete={this.handleDelete}\n handleAdd={this.addValue}\n handleSubmit={this.handleSubmit}\n maxValues={MAX_SELECTABLE_VALUES}\n numRemainingText={numRemainingText}\n buttonSubmitText={buttonSubmitText}\n buttonSubmitLoadingText={buttonSubmitLoadingText}\n saving={this.state.saving}\n loading={this.state.loadingGroups}\n placeholderText={defineMessage({id: 'multiselect.addGroupsPlaceholder', defaultMessage: 'Search and add groups'})}\n />\n </Modal.Body>\n </Modal>\n );\n }\n}\n\nexport default injectIntl(AddGroupsToTeamModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Group} from '@mattermost/types/groups';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {getGroupsNotAssociatedToTeam, linkGroupSyncable, getAllGroupsAssociatedToTeam} from 'mattermost-redux/actions/groups';\nimport {getGroupsNotAssociatedToTeam as selectGroupsNotAssociatedToTeam} from 'mattermost-redux/selectors/entities/groups';\nimport {getCurrentTeam, getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddGroupsToTeamModal from './add_groups_to_team_modal';\n\ntype Props = {\n team?: Team;\n skipCommit?: boolean;\n onAddCallback?: (groupIDs: string[]) => void;\n excludeGroups?: Group[];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const searchTerm = state.views.search.modalSearch;\n\n const team = ownProps.team || getCurrentTeam(state);\n\n let groups = selectGroupsNotAssociatedToTeam(state, team?.id || '');\n if (searchTerm) {\n const regex = RegExp(searchTerm, 'i');\n groups = groups.filter((group) => regex.test(group.display_name) || regex.test(group.name));\n }\n\n return {\n currentTeamName: team?.display_name,\n currentTeamId: team?.id ?? getCurrentTeamId(state),\n skipCommit: ownProps.skipCommit,\n onAddCallback: ownProps.onAddCallback,\n excludeGroups: ownProps.excludeGroups,\n searchTerm,\n groups,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getGroupsNotAssociatedToTeam,\n setModalSearchTerm,\n linkGroupSyncable,\n getAllGroupsAssociatedToTeam,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddGroupsToTeamModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport type {Value} from 'components/multiselect/multiselect';\nimport ProfilePicture from 'components/profile_picture';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\n\nimport {displayEntireNameForUser} from 'utils/utils';\n\ntype UserProfileValue = Value & UserProfile;\n\ntype Props = {\n option: UserProfileValue;\n onAdd: (user: UserProfileValue) => void;\n onMouseMove: (user: UserProfileValue) => void;\n userStatuses: RelationOneToOne<UserProfile, string>;\n isSelected: boolean;\n}\n\nconst MultiSelectOption = React.forwardRef(({\n option,\n onAdd,\n onMouseMove,\n userStatuses,\n isSelected,\n}: Props, ref?: React.Ref<HTMLDivElement>) => {\n return (\n <div\n key={option.id}\n className={classNames('more-modal__row clickable', {'more-modal__row--selected': isSelected})}\n onClick={() => onAdd(option)}\n ref={ref}\n onMouseMove={() => onMouseMove(option)}\n >\n <ProfilePicture\n src={Client4.getProfilePictureUrl(option.id, option.last_picture_update)}\n status={userStatuses[option.id]}\n size='md'\n username={option.username}\n />\n <div className='more-modal__details'>\n <div className='more-modal__name'>\n {displayEntireNameForUser(option)}\n {option.is_bot && <BotTag/>}\n {isGuest(option.roles) && <GuestTag className='popoverlist'/>}\n </div>\n </div>\n <div className='more-modal__actions'>\n <div className='more-modal__actions--round'>\n <i\n className='icon icon-plus'\n />\n </div>\n </div>\n </div>\n );\n});\n\nexport default MultiSelectOption;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {IntlShape, MessageDescriptor} from 'react-intl';\nimport {defineMessage, injectIntl} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {filterProfilesStartingWithTerm} from 'mattermost-redux/utils/user_utils';\n\nimport MultiSelect from 'components/multiselect/multiselect';\nimport type {Value} from 'components/multiselect/multiselect';\n\nimport Constants from 'utils/constants';\n\nimport MultiSelectOption from './multiselect_option/multiselect_option';\n\nconst USERS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = 256;\n\ntype UserProfileValue = Value & UserProfile;\n\nexport type Props = {\n multilSelectKey: string;\n userStatuses: RelationOneToOne<UserProfile, string>;\n focusOnLoad?: boolean;\n\n intl: IntlShape;\n\n // Used if we are adding new members to an existing group\n groupId?: string;\n\n // onSubmitCallback takes an array of UserProfiles and should set usersToAdd in state of parent component\n onSubmitCallback: (userProfiles?: UserProfile[]) => Promise<void>;\n addUserCallback?: (userProfiles: UserProfile[]) => void;\n deleteUserCallback?: (userProfiles: UserProfile[]) => void;\n\n // These are the optinoal search parameters\n searchOptions?: any;\n\n // Dictionaries of userid mapped users to exclude or include from this list\n excludeUsers?: Record<string, UserProfileValue>;\n includeUsers?: Record<string, UserProfileValue>;\n\n profiles: UserProfileValue[];\n\n savingEnabled: boolean;\n saving: boolean;\n buttonSubmitText?: string | MessageDescriptor;\n buttonSubmitLoadingText?: string | MessageDescriptor;\n backButtonClick?: () => void;\n backButtonClass?: string;\n backButtonText?: string | MessageDescriptor;\n\n actions: {\n getProfiles: (page?: number, perPage?: number) => Promise<ActionResult>;\n getProfilesNotInGroup: (groupId: string, page?: number, perPage?: number) => Promise<ActionResult>;\n loadStatusesForProfilesList: (users: UserProfile[]) => void;\n searchProfiles: (term: string, options: any) => Promise<ActionResult>;\n };\n}\n\ntype State = {\n values: UserProfileValue[];\n term: string;\n loadingUsers: boolean;\n}\n\nexport class AddUserToGroupMultiSelect extends React.PureComponent<Props, State> {\n private searchTimeoutId = 0;\n selectedItemRef;\n\n public static defaultProps = {\n includeUsers: {},\n excludeUsers: {},\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n values: [],\n term: '',\n loadingUsers: true,\n } as State;\n\n this.selectedItemRef = React.createRef<HTMLDivElement>();\n }\n\n private addValue = (value: UserProfileValue): void => {\n const values: UserProfileValue[] = Object.assign([], this.state.values);\n if (values.indexOf(value) === -1) {\n values.push(value);\n }\n\n if (this.props.addUserCallback) {\n this.props.addUserCallback(values);\n }\n\n this.setState({values});\n };\n\n public componentDidMount(): void {\n if (this.props.groupId) {\n this.props.actions.getProfilesNotInGroup(this.props.groupId).then(() => {\n this.setUsersLoadingState(false);\n });\n } else {\n this.props.actions.getProfiles().then(() => {\n this.setUsersLoadingState(false);\n });\n }\n\n this.props.actions.loadStatusesForProfilesList(this.props.profiles);\n }\n\n private handleDelete = (values: UserProfileValue[]): void => {\n if (this.props.deleteUserCallback) {\n this.props.deleteUserCallback(values);\n }\n\n this.setState({values});\n };\n\n private setUsersLoadingState = (loadingState: boolean): void => {\n this.setState({\n loadingUsers: loadingState,\n });\n };\n\n private handlePageChange = (page: number, prevPage: number): void => {\n if (page > prevPage) {\n this.setUsersLoadingState(true);\n if (this.props.groupId) {\n this.props.actions.getProfilesNotInGroup(this.props.groupId, page + 1, USERS_PER_PAGE).then(() => {\n this.setUsersLoadingState(false);\n });\n } else {\n this.props.actions.getProfiles(page + 1, USERS_PER_PAGE).then(() => {\n this.setUsersLoadingState(false);\n });\n }\n }\n };\n\n public handleSubmit = (): void => {\n const userIds = this.state.values.map((v) => v.id);\n if (userIds.length === 0) {\n return;\n }\n this.props.onSubmitCallback(this.state.values);\n };\n\n public search = (searchTerm: string): void => {\n const term = searchTerm.trim();\n clearTimeout(this.searchTimeoutId);\n this.setState({\n term,\n });\n\n if (term) {\n this.setUsersLoadingState(true);\n this.searchTimeoutId = window.setTimeout(\n async () => {\n await this.props.actions.searchProfiles(term, this.props.searchOptions);\n this.setUsersLoadingState(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n }\n };\n\n private renderAriaLabel = (option: UserProfileValue): string => {\n if (!option) {\n return '';\n }\n return option.username;\n };\n\n renderOption = (option: UserProfileValue, isSelected: boolean, onAdd: (user: UserProfileValue) => void, onMouseMove: (user: UserProfileValue) => void) => {\n return (\n <MultiSelectOption\n option={option}\n onAdd={onAdd}\n isSelected={isSelected}\n onMouseMove={onMouseMove}\n userStatuses={this.props.userStatuses}\n ref={isSelected ? this.selectedItemRef : undefined}\n key={option.id}\n />\n );\n };\n\n public render = (): JSX.Element => {\n const buttonSubmitText = this.props.buttonSubmitText || defineMessage({id: 'multiselect.createGroup', defaultMessage: 'Create Group'});\n const buttonSubmitLoadingText = this.props.buttonSubmitLoadingText || defineMessage({id: 'multiselect.creating', defaultMessage: 'Creating...'});\n\n let users = filterProfilesStartingWithTerm(this.props.profiles, this.state.term).filter((user) => {\n return user.delete_at === 0 &&\n (this.props.excludeUsers !== undefined && !this.props.excludeUsers[user.id]);\n }).map((user) => user as UserProfileValue);\n\n if (this.props.includeUsers) {\n const includeUsers = Object.values(this.props.includeUsers);\n users = [...users, ...includeUsers];\n }\n\n let maxValues;\n let numRemainingText = null;\n\n if (this.state.values.length >= MAX_SELECTABLE_VALUES) {\n maxValues = MAX_SELECTABLE_VALUES;\n numRemainingText = defineMessage({id: 'multiselect.maxGroupMembers', defaultMessage: 'No more than 256 members can be added to a group at once.'});\n }\n\n return (\n <MultiSelect\n key={this.props.multilSelectKey}\n options={users}\n optionRenderer={this.renderOption}\n intl={this.props.intl}\n selectedItemRef={this.selectedItemRef}\n values={this.state.values}\n ariaLabelRenderer={this.renderAriaLabel}\n saveButtonPosition={'bottom'}\n perPage={USERS_PER_PAGE}\n handlePageChange={this.handlePageChange}\n handleInput={this.search}\n handleDelete={this.handleDelete}\n handleAdd={this.addValue}\n handleSubmit={this.handleSubmit}\n buttonSubmitText={buttonSubmitText}\n buttonSubmitLoadingText={buttonSubmitLoadingText}\n saving={this.props.saving}\n loading={this.state.loadingUsers}\n placeholderText={defineMessage({id: 'multiselect.placeholder', defaultMessage: 'Search for people'})}\n valueWithImage={true}\n focusOnLoad={this.props.focusOnLoad}\n savingEnabled={this.props.savingEnabled}\n backButtonClick={this.props.backButtonClick}\n backButtonClass={this.props.backButtonClass}\n backButtonText={this.props.backButtonText}\n maxValues={maxValues}\n numRemainingText={numRemainingText}\n />\n );\n };\n}\n\nexport default injectIntl(AddUserToGroupMultiSelect);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getProfilesNotInGroup, searchProfiles, getProfiles} from 'mattermost-redux/actions/users';\nimport {getProfilesNotInCurrentGroup, getUserStatuses, getProfiles as getUsers} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadStatusesForProfilesList} from 'actions/status_actions';\n\nimport type {Value} from 'components/multiselect/multiselect';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddUserToGroupMultiSelect from './add_user_to_group_multiselect';\n\ntype UserProfileValue = Value & UserProfile;\n\ntype OwnProps = {\n groupId?: string;\n}\n\nfunction mapStateToProps(state: GlobalState, props: OwnProps) {\n let profiles: UserProfileValue[];\n\n if (props.groupId) {\n profiles = getProfilesNotInCurrentGroup(state, props.groupId) as UserProfileValue[];\n } else {\n profiles = getUsers(state) as UserProfileValue[];\n }\n const userStatuses = getUserStatuses(state);\n\n return {\n groupId: props.groupId,\n profiles,\n userStatuses,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getProfiles,\n getProfilesNotInGroup,\n loadStatusesForProfilesList,\n searchProfiles,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddUserToGroupMultiSelect);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport type {MouseEvent} from 'react';\nimport {NavLink} from 'react-router-dom';\n\nimport {getHistory} from 'utils/browser_history';\n\ntype Props = {\n id?: string;\n activeClassName?: string;\n\n // Bool whether navigation is blocked\n blocked: boolean;\n\n // String Link destination\n to: string;\n actions: {\n\n // Function for deferring navigation while blocked\n deferNavigation: (func: () => void) => void;\n };\n children?: string | React.ReactNode;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nconst BlockableLink = ({blocked, actions, onClick, to, ...restProps}: Props) => {\n const handleClick = useCallback((e: MouseEvent) => {\n onClick?.(e);\n\n if (blocked) {\n e.preventDefault();\n actions.deferNavigation(() => {\n getHistory().push(to);\n });\n }\n }, [actions, blocked, onClick, to]);\n\n return (\n <NavLink\n {...restProps}\n to={to}\n onClick={handleClick}\n />\n );\n};\n\nexport default React.memo(BlockableLink);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {deferNavigation} from 'actions/admin_actions';\nimport {getNavigationBlocked} from 'selectors/views/admin';\n\nimport type {GlobalState} from 'types/store';\n\nimport BlockableLink from './blockable_link';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n blocked: getNavigationBlocked(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n deferNavigation,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(BlockableLink);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst SystemRolesSVG = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '196'}\n height={props.height ? props.height.toString() : '120'}\n viewBox='0 0 196 120'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <circle\n cx='20.5'\n cy='35'\n r='2'\n transform='rotate(-90 20.5 35)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='20.5'\n cy='29'\n r='2'\n transform='rotate(-90 20.5 29)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='20.5005'\n cy='23'\n r='2'\n transform='rotate(-90 20.5005 23)'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M20.5 39.5V79.5H43M45 79.5H49M51 79.5H53'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M29.5 79.5H177.5V108.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.24'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 175 112)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <path\n d='M62.1304 22H129.87L134 115H58L62.1304 22Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.24'\n />\n <rect\n width='92'\n height='5'\n transform='matrix(1 0 0 -1 50 120)'\n fill='var(--center-channel-color)'\n fillOpacity='0.4'\n />\n <rect\n x='30'\n y='16'\n width='131'\n height='86'\n rx='4'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n strokeWidth='4'\n />\n <rect\n x='34'\n y='20'\n width='46'\n height='78'\n fill='#1C58D9'\n fillOpacity='0.16'\n />\n <path\n d='M49.8109 27.0273L66.5002 27.0273'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M49.8109 29.6628L59.4732 29.6628'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M38.392 38.4453H51.5678'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='41.5092'\n cy='27.5105'\n r='4.34771'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <circle\n cx='39.4795'\n cy='43.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 43.1602H70.0137'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='50.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 50.1602H64.7434'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='58.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 58.1602H72.6489'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='65.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 65.1602H70.0137'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='72.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 72.1602H64.7434'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='39.4795'\n cy='79.1602'\n r='2'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M45.4189 79.1602H72.6489'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M150 108.5H122.5'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M119 108.5H113'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M110 108.5H104'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <ellipse\n cx='138.058'\n cy='43.6274'\n rx='14.1972'\n ry='13.767'\n fill='var(--center-channel-color)'\n fillOpacity='0.16'\n />\n <mask\n id='mask0_4441_155706'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='124'\n y='30'\n width='28'\n height='28'\n >\n <path\n d='M124.288 43.8848C124.288 51.5124 130.49 57.6952 138.139 57.6952C142.476 57.6952 146.348 55.7078 148.887 52.5958C150.827 50.2191 151.99 47.1876 151.99 43.8848C151.99 36.2573 145.788 30.0745 138.139 30.0745C130.49 30.0745 124.288 36.2573 124.288 43.8848Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask0_4441_155706)'>\n <path\n d='M129.452 51.4217C130.886 50.4043 135.904 49.4434 138.234 49.0901C140.384 49.514 145.295 50.6586 147.732 51.8456C150.169 53.0326 150.539 56.7208 150.42 58.4165H126.047C126.047 53.7533 127.66 52.6935 129.452 51.4217Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M129.452 51.4217C130.886 50.4043 135.904 49.4434 138.234 49.0901C140.384 49.514 145.295 50.6586 147.732 51.8456C150.169 53.0326 150.539 56.7208 150.42 58.4165H126.047C126.047 53.7533 127.66 52.6935 129.452 51.4217Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.8'\n />\n <path\n d='M141.472 49.8071L140.46 46.5787H136.016L135.195 49.8071C136.988 50.7038 139.678 50.7038 141.472 49.8071Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M141.472 49.8071L140.46 46.5787H136.016L135.195 49.8071C136.988 50.7038 139.678 50.7038 141.472 49.8071Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M144.176 40.5879C144.767 40.4301 144.794 41.2999 144.57 42.2022C144.365 43.0245 144.176 44.3681 143.56 44.042C142.819 45.9781 141.466 47.4502 139.831 48.0331C139.323 48.2524 138.783 48.3723 138.223 48.3723C137.503 48.3723 136.815 48.1735 136.186 47.8199C134.773 47.1323 133.617 45.7633 132.955 44.0211C132.348 44.1712 132.09 42.7509 131.953 42.2022C131.78 41.5052 131.559 40.5878 132.348 40.5878C132.364 36.3648 135.005 32.9478 138.262 32.9478C141.518 32.9478 144.16 36.3648 144.176 40.5879Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M144.176 40.5879C144.767 40.4301 144.794 41.2999 144.57 42.2022C144.365 43.0245 144.176 44.3681 143.56 44.042C142.819 45.9781 141.466 47.4502 139.831 48.0331C139.323 48.2524 138.783 48.3723 138.223 48.3723C137.503 48.3723 136.815 48.1735 136.186 47.8199C134.773 47.1323 133.617 45.7633 132.955 44.0211C132.348 44.1712 132.09 42.7509 131.953 42.2022C131.78 41.5052 131.559 40.5878 132.348 40.5878C132.364 36.3648 135.005 32.9478 138.262 32.9478C141.518 32.9478 144.16 36.3648 144.176 40.5879Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M133.213 34.161C133.989 33.0897 134.545 32.9069 134.817 32.8175C134.909 32.7873 134.968 32.7678 134.993 32.7283C136.062 31.0266 140.638 31.3426 141.868 32.2707C144.668 34.3823 143.978 35.8397 144.295 37.5774C144.459 38.4688 144.147 39.5627 144.075 40.4804C143.986 39.8716 143.483 37.996 143.445 37.7901C143.001 36.7139 141.057 38.0233 140.037 37.9694C137.746 37.8484 136.031 37.4462 134.817 35.9965C134.454 37.2821 133.339 38.8431 132.647 38.9895L132.5 40.2913C132.084 37.9813 131.754 36.1724 133.213 34.161Z'\n fill='var(--neutral-1200)'\n />\n </g>\n <ellipse\n cx='101.058'\n cy='80.6274'\n rx='14.1972'\n ry='13.767'\n fill='var(--center-channel-color)'\n fillOpacity='0.16'\n />\n <mask\n id='mask1_4441_155706'\n maskUnits='userSpaceOnUse'\n x='87'\n y='67'\n width='28'\n height='28'\n mask-type='luminance'\n >\n <path\n d='M87.2884 80.8848C87.2884 88.5124 93.4899 94.6952 101.139 94.6952C105.476 94.6952 109.348 92.7078 111.887 89.5958C113.827 87.2191 114.99 84.1876 114.99 80.8848C114.99 73.2573 108.788 67.0745 101.139 67.0745C93.4899 67.0745 87.2884 73.2573 87.2884 80.8848Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask1_4441_155706)'>\n <path\n d='M92.4524 88.4217C93.8861 87.4043 98.904 86.4434 101.234 86.0901C103.384 86.514 108.295 87.6586 110.732 88.8456C113.169 90.0326 113.539 93.7208 113.42 95.4165H89.0474C89.0474 90.7533 90.6603 89.6935 92.4524 88.4217Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M92.4524 88.4217C93.8861 87.4043 98.904 86.4434 101.234 86.0901C103.384 86.514 108.295 87.6586 110.732 88.8456C113.169 90.0326 113.539 93.7208 113.42 95.4165H89.0474C89.0474 90.7533 90.6603 89.6935 92.4524 88.4217Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.8'\n />\n <path\n d='M104.472 86.8071L103.46 83.5787H99.0163L98.1945 86.8071C99.9881 87.7038 102.678 87.7038 104.472 86.8071Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M104.472 86.8071L103.46 83.5787H99.0163L98.1945 86.8071C99.9881 87.7038 102.678 87.7038 104.472 86.8071Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M107.176 77.5879C107.767 77.4301 107.794 78.2999 107.57 79.2022C107.365 80.0245 107.176 81.3681 106.56 81.042C105.819 82.9781 104.466 84.4502 102.831 85.0331C102.323 85.2524 101.783 85.3723 101.223 85.3723C100.503 85.3723 99.8151 85.1735 99.186 84.8199C97.7734 84.1323 96.6173 82.7633 95.9551 81.0211C95.3476 81.1712 95.0899 79.7509 94.9532 79.2022C94.7796 78.5052 94.5589 77.5878 95.3476 77.5878C95.3638 73.3648 98.0055 69.9478 101.262 69.9478C104.518 69.9478 107.16 73.3648 107.176 77.5879Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M107.176 77.5879C107.767 77.4301 107.794 78.2999 107.57 79.2022C107.365 80.0245 107.176 81.3681 106.56 81.042C105.819 82.9781 104.466 84.4502 102.831 85.0331C102.323 85.2524 101.783 85.3723 101.223 85.3723C100.503 85.3723 99.8151 85.1735 99.186 84.8199C97.7734 84.1323 96.6173 82.7633 95.9551 81.0211C95.3476 81.1712 95.0899 79.7509 94.9532 79.2022C94.7796 78.5052 94.5589 77.5878 95.3476 77.5878C95.3638 73.3648 98.0055 69.9478 101.262 69.9478C104.518 69.9478 107.16 73.3648 107.176 77.5879Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M96.2126 71.161C96.9894 70.0897 97.5452 69.9069 97.8172 69.8175C97.909 69.7873 97.9685 69.7678 97.9932 69.7283C99.0616 68.0266 103.638 68.3426 104.868 69.2707C107.668 71.3823 106.978 72.8397 107.295 74.5774C107.459 75.4688 107.147 76.5627 107.075 77.4804C106.986 76.8716 106.483 74.996 106.445 74.7901C106.001 73.7139 104.057 75.0233 103.037 74.9694C100.746 74.8484 99.0307 74.4462 97.8172 72.9965C97.4539 74.2821 96.3393 75.8431 95.647 75.9895L95.5003 77.2913C95.0838 74.9813 94.7541 73.1724 96.2126 71.161Z'\n fill='var(--neutral-1200)'\n />\n </g>\n <path\n d='M115 43.942C115 51.6417 108.732 57.883 101 57.883C96.6159 57.883 92.7022 55.8768 90.1356 52.7353C88.1749 50.3362 87 47.276 87 43.942C87 36.2423 93.2684 30.001 101 30.001C108.732 30.001 115 36.2423 115 43.942Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M115 43.942C115 51.6417 108.732 57.883 101 57.883C96.6159 57.883 92.7022 55.8768 90.1356 52.7353C88.1749 50.3362 87 47.276 87 43.942C87 36.2423 93.2684 30.001 101 30.001C108.732 30.001 115 36.2423 115 43.942Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <mask\n id='mask2_4441_155706'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='87'\n y='30'\n width='28'\n height='28'\n >\n <path\n d='M115 43.941C115 51.6407 108.732 57.8819 101 57.8819C96.6159 57.8819 92.7022 55.8757 90.1356 52.7343C88.1749 50.3351 87 47.275 87 43.941C87 36.2413 93.2684 30 101 30C108.732 30 115 36.2413 115 43.941Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask2_4441_155706)'>\n <path\n d='M108.286 52.6015L107.739 41.6589C107.506 37.0108 104.56 33.3966 101.002 33.3966C97.4454 33.3966 94.4988 37.0108 94.2664 41.6589L93.7188 52.6015H108.286Z'\n fill='var(--neutral-1200)'\n />\n <path\n d='M111.559 52.9532C111.041 51.159 109.59 49.7866 107.77 49.3672L103.92 48.4804H98.083L94.233 49.3672C92.4123 49.7866 90.9622 51.159 90.4435 52.9532L88.9744 60.7126H113.028L111.559 52.9532Z'\n fill='var(--center-channel-bg)'\n />\n <path\n opacity='0.24'\n d='M111.559 52.9532C111.041 51.159 109.59 49.7866 107.77 49.3672L103.92 48.4804H98.083L94.233 49.3672C92.4123 49.7866 90.9622 51.159 90.4435 52.9532L88.9744 60.7126H113.028L111.559 52.9532Z'\n fill='#1C58D9'\n />\n <path\n d='M103.531 48.6403L102.741 45.9391H99.2756L98.6347 48.6403C100.034 49.3906 102.132 49.3906 103.531 48.6403Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M103.531 48.6403L102.741 45.9391H99.2756L98.6347 48.6403C100.034 49.3906 102.132 49.3906 103.531 48.6403Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M105.956 40.3675C106.442 40.2298 106.464 40.989 106.28 41.7766C106.111 42.4944 105.956 43.6672 105.45 43.3825C104.841 45.0725 103.73 46.3575 102.386 46.8663C101.969 47.0577 101.526 47.1624 101.066 47.1624C100.474 47.1624 99.9092 46.9888 99.3924 46.6802C98.232 46.08 97.2824 44.885 96.7384 43.3643C96.2394 43.4953 96.0277 42.2555 95.9154 41.7766C95.7727 41.1682 95.5915 40.3674 96.2394 40.3674C96.2527 36.6812 98.4227 33.6986 101.098 33.6986C103.772 33.6986 105.942 36.6812 105.956 40.3675Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M105.956 40.3675C106.442 40.2298 106.464 40.989 106.28 41.7766C106.111 42.4944 105.956 43.6672 105.45 43.3825C104.841 45.0725 103.73 46.3575 102.386 46.8663C101.969 47.0577 101.526 47.1624 101.066 47.1624C100.474 47.1624 99.9092 46.9888 99.3924 46.6802C98.232 46.08 97.2824 44.885 96.7384 43.3643C96.2394 43.4953 96.0277 42.2555 95.9154 41.7766C95.7727 41.1682 95.5915 40.3674 96.2394 40.3674C96.2527 36.6812 98.4227 33.6986 101.098 33.6986C103.772 33.6986 105.942 36.6812 105.956 40.3675Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M106.351 40.3897C106.344 40.4455 106.307 40.4948 106.25 40.5227C106.194 40.5506 106.125 40.5538 106.066 40.5307C104.576 39.9629 103.131 38.4316 102.675 36.9943C101.229 38.4937 98.8432 40.2472 96.4657 40.6326C96.4527 40.635 96.4407 40.6358 96.4278 40.6358L96.4287 40.6366C96.3862 40.6366 96.3436 40.6246 96.3085 40.6031C96.2632 40.5745 96.2336 40.5307 96.2262 40.4829C95.9871 38.7663 96.4912 35.5187 98.0222 34.5167C99.0348 33.8539 99.8141 33.4136 101.082 33.4967C102.37 33.5811 103.77 34.2791 104.768 34.986C106.247 36.0345 106.559 38.7152 106.351 40.3897Z'\n fill='var(--neutral-1200)'\n />\n </g>\n <path\n d='M152 80.9408C152 88.6405 145.731 94.8817 138 94.8817C133.616 94.8817 129.702 92.8755 127.136 89.7341C125.175 87.3349 124 84.2748 124 80.9408C124 73.2412 130.268 67 138 67C145.731 67 152 73.2412 152 80.9408Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M152 80.9408C152 88.6405 145.731 94.8817 138 94.8817C133.616 94.8817 129.702 92.8755 127.136 89.7341C125.175 87.3349 124 84.2748 124 80.9408C124 73.2412 130.268 67 138 67C145.731 67 152 73.2412 152 80.9408Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <mask\n id='mask3_4441_155706'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='124'\n y='67'\n width='29'\n height='28'\n >\n <path\n d='M152 80.9408C152 88.6405 145.732 94.8817 138 94.8817C133.616 94.8817 129.703 92.8755 127.136 89.7341C125.175 87.3349 124 84.2748 124 80.9408C124 73.2412 130.269 67 138 67C145.732 67 152 73.2412 152 80.9408Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask3_4441_155706)'>\n <path\n d='M150.352 92.3824C149.744 90.417 148.047 88.9139 145.918 88.4545L141.414 87.4836H134.586L130.081 88.4545C127.951 88.9139 126.255 90.417 125.648 92.3824L123.929 100.881H152.07L150.352 92.3824Z'\n fill='var(--center-channel-bg)'\n />\n <path\n opacity='0.24'\n d='M150.352 92.3824C149.744 90.417 148.048 88.9139 145.919 88.4545L141.415 87.4836H134.586L130.082 88.4545C127.952 88.9139 126.255 90.417 125.649 92.3824L123.93 100.881H152.071L150.352 92.3824Z'\n fill='#1C58D9'\n />\n <path\n d='M140.736 87.8616L139.814 85.1019H135.768L135.019 87.8616C136.653 88.6282 139.103 88.6282 140.736 87.8616Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M140.736 87.8616L139.814 85.1019H135.768L135.019 87.8616C136.653 88.6282 139.103 88.6282 140.736 87.8616Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M143.13 79.5591C143.654 79.4178 143.678 80.1968 143.479 81.0049C143.298 81.7414 143.13 82.9448 142.585 82.6527C141.929 84.3868 140.731 85.7053 139.283 86.2273C138.833 86.4237 138.355 86.5312 137.86 86.5312C137.222 86.5312 136.613 86.3531 136.056 86.0364C134.806 85.4206 133.782 84.1944 133.196 82.634C132.658 82.7685 132.43 81.4963 132.309 81.0049C132.155 80.3806 131.96 79.559 132.658 79.559C132.672 75.7767 135.011 72.7163 137.894 72.7163C140.777 72.7163 143.116 75.7767 143.13 79.5591Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M143.13 79.5591C143.654 79.4178 143.678 80.1968 143.479 81.0049C143.298 81.7414 143.13 82.9448 142.585 82.6527C141.929 84.3868 140.731 85.7053 139.283 86.2273C138.833 86.4237 138.355 86.5312 137.86 86.5312C137.222 86.5312 136.613 86.3531 136.056 86.0364C134.806 85.4206 133.782 84.1944 133.196 82.634C132.658 82.7685 132.43 81.4963 132.309 81.0049C132.155 80.3806 131.96 79.559 132.658 79.559C132.672 75.7767 135.011 72.7163 137.894 72.7163C140.777 72.7163 143.116 75.7767 143.13 79.5591Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M132.172 72.0366C130.832 73.675 130.803 76.3499 132.096 78.7459C132.538 79.277 132.978 79.8071 133.42 80.3382C133.406 76.4669 134.034 75.424 134.644 75.234C135.649 74.9186 136.841 76.8499 139.022 76.8017C139.354 76.7942 140.099 76.7673 140.554 76.2459C140.946 75.7963 140.887 75.2448 141.005 75.233C141.2 75.2137 141.552 76.2673 142.229 80.3371C142.664 79.8028 143.101 79.2674 143.536 78.733C143.774 77.8038 143.993 76.5849 144.008 75.1493C144.028 73.2083 143.077 71.9796 142.737 70.8884C141.457 74.1194 140.167 70.0895 136.056 70.0961C134.72 70.0983 133.05 70.9636 132.172 72.0366Z'\n fill='var(--neutral-1200)'\n />\n </g>\n <rect\n x='108'\n y='4'\n width='83'\n height='50'\n rx='4'\n fill='var(--neutral-1200)'\n fillOpacity='0.32'\n />\n <rect\n x='110.5'\n y='0.5'\n width='82'\n height='49'\n rx='3.5'\n fill='var(--center-channel-bg)'\n stroke='var(--center-channel-color)'\n />\n <path\n d='M152 10H166.481'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M152 16H175'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M152 22H182'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M152 28H182'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M168.891 10H178.525'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n d='M180.932 10H183.946'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n strokeLinecap='round'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M127.509 6.91797H130.5L130.879 9.3795C131.794 9.58757 132.651 9.94891 133.422 10.4351L135.435 8.95885L137.55 11.0739L136.056 13.1106C136.521 13.8733 136.865 14.7179 137.061 15.6177L139.592 16.007V18.9982L136.996 19.3976C136.779 20.2497 136.428 21.0485 135.968 21.7704L137.55 23.9276L135.435 26.0426L133.226 24.4233C132.521 24.8414 131.747 25.1567 130.926 25.3485L130.505 28.0859H127.514L127.089 25.3257C126.282 25.127 125.522 24.8087 124.829 24.3908L122.577 26.0425L120.462 23.9274L122.097 21.6981C121.661 20.9993 121.328 20.2302 121.118 19.4116L118.422 18.9969V16.0057L121.053 15.601C121.243 14.7356 121.57 13.9214 122.01 13.1824L120.464 11.0737L122.579 8.95866L124.637 10.4677C125.391 9.98385 126.23 9.62025 127.127 9.40401L127.509 6.91797ZM133.041 17.3689C133.041 19.5704 131.256 21.355 129.054 21.355C126.853 21.355 125.068 19.5704 125.068 17.3689C125.068 15.1675 126.853 13.3828 129.054 13.3828C131.256 13.3828 133.041 15.1675 133.041 17.3689Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M138.405 30.9492H140.038L140.244 32.2907C140.745 32.4044 141.213 32.602 141.635 32.8679L142.73 32.0643L143.885 33.2188L143.071 34.3279C143.325 34.744 143.513 35.2048 143.619 35.6957L145 35.9081V37.5407L143.584 37.7585C143.465 38.2245 143.274 38.6613 143.022 39.0558L143.885 40.2329L142.73 41.3874L141.525 40.5032C141.14 40.7307 140.719 40.9023 140.272 41.0069L140.042 42.5039H138.409L138.177 40.9948C137.737 40.8867 137.324 40.7135 136.946 40.4861L135.715 41.3888L134.561 40.2344L135.453 39.0171C135.215 38.6355 135.033 38.2155 134.918 37.7683L133.445 37.5418V35.9092L134.881 35.6882C134.985 35.2163 135.163 34.7723 135.403 34.3692L134.56 33.2202L135.715 32.0657L136.835 32.887C137.247 32.6218 137.706 32.4226 138.197 32.3043L138.405 30.9492ZM141.426 36.6523C141.426 37.8539 140.452 38.828 139.25 38.828C138.048 38.828 137.074 37.8539 137.074 36.6523C137.074 35.4507 138.048 34.4766 139.25 34.4766C140.452 34.4766 141.426 35.4507 141.426 36.6523Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n </svg>\n);\n\nexport default SystemRolesSVG;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n title?: string;\n className?: string;\n}\n\nexport default function Moon(props: Props) {\n return (\n <span\n title={props.title}\n className={props.className}\n >\n <svg\n width='24px'\n height='24px'\n viewBox='0 0 24 24'\n version='1.1'\n role='img'\n >\n <path d='M18.73,18C15.4,21.69 9.71,22 6,18.64C2.33,15.31 2.04,9.62 5.37,5.93C6.9,4.25 9,3.2 11.27,3C7.96,6.7 8.27,12.39 12,15.71C13.63,17.19 15.78,18 18,18C18.25,18 18.5,18 18.73,18Z'/>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport styled from 'styled-components';\n\nimport type {UserTimezone} from '@mattermost/types/users';\n\nimport Moon from 'components/common/svg_images_components/moon_svg';\nimport Timestamp from 'components/timestamp';\n\nconst Container = styled.div`\n display: flex;\n aling-items: center;\n padding: 8px 24px;\n font-size: 12px;\n color: rgba(var(--center-channel-color-rgb), 0.75);\n\n & + .AdvancedTextEditor {\n padding-top: 0;\n }\n\n time {\n font-weight: 600;\n }\n`;\n\nconst Icon = styled(Moon)`\n svg {\n width: 16px;\n height: 16px;\n }\n svg path {\n fill: rgba(var(--center-channel-color-rgb), 0.75);\n }\n margin: 0 2px;\n`;\n\ntype Props = {\n displayName: string;\n timestamp: number;\n teammateTimezone: UserTimezone;\n}\n\nconst RemoteUserHour = ({displayName, timestamp, teammateTimezone}: Props) => {\n return (\n <Container className='RemoteUserHour'>\n <Icon className='icon moonIcon'/>\n <FormattedMessage\n id='advanced_text_editor.remote_user_hour'\n defaultMessage='The time for {user} is {time}'\n values={{\n user: (\n <span className='userDisplayName'>\n {displayName}\n </span>\n ),\n time: (\n <Timestamp\n useRelative={false}\n value={timestamp}\n useDate={false}\n userTimezone={teammateTimezone}\n useTime={{\n hour: 'numeric',\n minute: 'numeric',\n }}\n />\n ),\n }}\n />\n </Container>\n );\n};\n\nexport default RemoteUserHour;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {ChannelScheduledPostIndicatorData} from 'mattermost-redux/selectors/entities/scheduled_posts';\n\ntype Props = {\n scheduledPostData: ChannelScheduledPostIndicatorData;\n scheduledPostLinkURL: string;\n}\n\nexport function ShortScheduledPostIndicator({scheduledPostData, scheduledPostLinkURL}: Props) {\n if (scheduledPostData.count === 0) {\n return null;\n }\n\n return (\n <div className='ScheduledPostIndicator'>\n <FormattedMessage\n id='scheduled_post.channel_indicator.with_other_user_late_time'\n defaultMessage='You have {count, plural, =1 {one} other {#}} <a>scheduled {count, plural, =1 {message} other {messages}}</a>.'\n values={{\n count: scheduledPostData.count,\n a: (chunks) => (\n <Link to={scheduledPostLinkURL}>\n {chunks}\n </Link>\n ),\n }}\n />\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport {Link} from 'react-router-dom';\n\nimport {showChannelOrThreadScheduledPostIndicator} from 'mattermost-redux/selectors/entities/scheduled_posts';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {\n ShortScheduledPostIndicator,\n} from 'components/advanced_text_editor/scheduled_post_indicator/short_scheduled_post_indicator';\nimport {SCHEDULED_POST_TIME_RANGES, scheduledPostTimeFormat} from 'components/drafts/panel/panel_header';\nimport Timestamp from 'components/timestamp';\n\nimport {Locations} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport './scheduled_post_indicator.scss';\n\ntype Props = {\n location: string;\n channelId: string;\n postId: string;\n remoteUserHourDisplayed?: boolean;\n}\n\nexport default function ScheduledPostIndicator({location, channelId, postId, remoteUserHourDisplayed}: Props) {\n // we use RHS_COMMENT for RHS and threads view, and CENTER for center channel.\n // get scheduled posts of a thread if in RHS or threads view,\n // else, get those for the channel.\n // Fetch scheduled posts for the thread when opening a thread, and fetch for channel\n // when opening from center channel.\n const isThread = location === Locations.RHS_COMMENT;\n const id = isThread ? postId : channelId;\n const scheduledPostData = useSelector((state: GlobalState) => showChannelOrThreadScheduledPostIndicator(state, id));\n\n const currentTeamName = useSelector((state: GlobalState) => getCurrentTeam(state)?.name);\n const scheduledPostLinkURL = `/${currentTeamName}/scheduled_posts?target_id=${id}`;\n\n if (!scheduledPostData?.count) {\n return null;\n }\n\n if (remoteUserHourDisplayed) {\n return (\n <ShortScheduledPostIndicator\n scheduledPostData={scheduledPostData}\n scheduledPostLinkURL={scheduledPostLinkURL}\n />\n );\n }\n\n let scheduledPostText: React.ReactNode;\n\n // display scheduled post's details of there is only one scheduled post\n if (scheduledPostData.count === 1 && scheduledPostData.scheduledPost) {\n scheduledPostText = (\n <FormattedMessage\n id='scheduled_post.channel_indicator.single'\n defaultMessage='Message scheduled for {dateTime}.'\n values={{\n dateTime: (\n <Timestamp\n value={scheduledPostData.scheduledPost.scheduled_at}\n ranges={SCHEDULED_POST_TIME_RANGES}\n useSemanticOutput={false}\n useTime={scheduledPostTimeFormat}\n />\n ),\n }}\n />\n );\n }\n\n // display scheduled post count if there are more than one scheduled post\n if (scheduledPostData.count > 1) {\n scheduledPostText = isThread ? (\n <FormattedMessage\n id='scheduled_post.channel_indicator.multiple_in_thread'\n defaultMessage='{count} scheduled messages in thread.'\n values={{\n count: scheduledPostData.count,\n }}\n />\n ) : (\n <FormattedMessage\n id='scheduled_post.channel_indicator.multiple_in_channel'\n defaultMessage='{count} scheduled messages in channel.'\n values={{\n count: scheduledPostData.count,\n }}\n />\n );\n }\n\n return (\n <div className='ScheduledPostIndicator'>\n <i\n data-testid='scheduledPostIcon'\n className='icon icon-draft-indicator icon-clock-send-outline'\n />\n {scheduledPostText}\n <Link to={scheduledPostLinkURL}>\n <FormattedMessage\n id='scheduled_post.channel_indicator.link_to_scheduled_posts.text'\n defaultMessage='See all.'\n />\n </Link>\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {DateTime} from 'luxon';\nimport {useState, useEffect, useMemo} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getDirectChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {isScheduledPostsEnabled} from 'mattermost-redux/selectors/entities/scheduled_posts';\nimport {getTimezoneForUserProfile, getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\nimport {\n getCurrentUserId,\n getStatusForUserId,\n getUser,\n makeGetDisplayName,\n} from 'mattermost-redux/selectors/entities/users';\n\nimport Constants, {UserStatuses} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nconst DEFAULT_TIMEZONE = {\n useAutomaticTimezone: true,\n automaticTimezone: 'UTC',\n manualTimezone: '',\n};\n\nconst MINUTE = 1000 * 60;\n\nfunction useTimePostBoxIndicator(channelId: string) {\n const getDisplayName = useMemo(makeGetDisplayName, []);\n\n const teammateId = useSelector((state: GlobalState) => getDirectChannel(state, channelId)?.teammate_id || '');\n const teammateDisplayName = useSelector((state: GlobalState) => (teammateId ? getDisplayName(state, teammateId) : ''));\n\n const isDM = useSelector(\n (state: GlobalState) => Boolean(getDirectChannel(state, channelId)?.teammate_id),\n );\n\n // Check if the teammate is in DND status\n const isTeammateDND = useSelector((state: GlobalState) =>\n (teammateId ? getStatusForUserId(state, teammateId) === UserStatuses.DND : false),\n );\n\n // Determine if the DND warning should be shown\n const showDndWarning = isTeammateDND && isDM;\n\n const [timestamp, setTimestamp] = useState(0);\n const [showIt, setShowIt] = useState(false);\n\n const teammate: UserProfile | undefined = useSelector((state: GlobalState) => getUser(state, teammateId));\n const teammateTimezone = useMemo(() => {\n if (!teammate) {\n return DEFAULT_TIMEZONE;\n }\n\n return getTimezoneForUserProfile(teammate);\n }, [teammate]);\n\n // current user timezone\n const userCurrentTimezone = useSelector((state: GlobalState) => getCurrentTimezone(state));\n\n // UseEffect to update the timestamp and the visibility for the time indicator\n useEffect(() => {\n if (isDM && teammate?.is_bot) {\n // returning an empty cleanup function as we need to return a genuine cleanup\n // function at if teammate is not a bot and useEffect functions need to\n // have consistent return types. So, we have to return a () => void function everywhere.\n return () => {};\n }\n\n function updateTime() {\n const timezone =\n teammateTimezone.useAutomaticTimezone ? teammateTimezone.automaticTimezone : teammateTimezone.manualTimezone || 'UTC';\n\n const teammateUserDate = DateTime.local().setZone(timezone);\n\n setTimestamp(teammateUserDate.toMillis());\n\n const currentHour = teammateUserDate.hour;\n const showIndicator =\n currentHour >= Constants.REMOTE_USERS_HOUR_LIMIT_END_OF_THE_DAY ||\n currentHour < Constants.REMOTE_USERS_HOUR_LIMIT_BEGINNING_OF_THE_DAY;\n\n setShowIt(showIndicator);\n }\n\n updateTime();\n\n const interval = setInterval(updateTime, MINUTE);\n\n return () => clearInterval(interval);\n }, [teammate, teammateTimezone.useAutomaticTimezone, teammateTimezone.automaticTimezone, teammateTimezone.manualTimezone, isDM]);\n\n const isScheduledPostEnabledValue = useSelector(isScheduledPostsEnabled);\n\n const showRemoteUserHour = isDM && showIt && timestamp !== 0;\n\n const currentUserId = useSelector(getCurrentUserId);\n const isSelfDM = isDM && teammateId === currentUserId;\n const isBot = Boolean(isDM && teammate?.is_bot);\n\n return {\n showRemoteUserHour,\n isDM,\n currentUserTimesStamp: timestamp,\n teammateTimezone,\n userCurrentTimezone,\n isScheduledPostEnabled: isScheduledPostEnabledValue,\n showDndWarning,\n teammateId,\n teammateDisplayName,\n isSelfDM,\n isBot,\n };\n}\n\nexport default useTimePostBoxIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport RemoteUserHour from 'components/advanced_text_editor/remote_user_hour';\nimport ScheduledPostIndicator from 'components/advanced_text_editor/scheduled_post_indicator/scheduled_post_indicator';\n\nimport useTimePostBoxIndicator from '../use_post_box_indicator';\n\nimport './style.scss';\n\ntype Props = {\n channelId: string;\n teammateDisplayName: string;\n location: string;\n postId: string;\n}\n\nexport default function PostBoxIndicator({channelId, teammateDisplayName, location, postId}: Props) {\n const {\n showRemoteUserHour,\n isScheduledPostEnabled,\n currentUserTimesStamp,\n teammateTimezone,\n } = useTimePostBoxIndicator(channelId);\n\n return (\n <div className='postBoxIndicator'>\n {\n showRemoteUserHour &&\n <RemoteUserHour\n displayName={teammateDisplayName}\n timestamp={currentUserTimesStamp}\n teammateTimezone={teammateTimezone}\n />\n }\n\n {\n\n isScheduledPostEnabled &&\n <ScheduledPostIndicator\n location={location}\n channelId={channelId}\n postId={postId}\n remoteUserHourDisplayed={showRemoteUserHour}\n />\n }\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport Constants from 'utils/constants';\n\nimport SuggestionList from './suggestion_list';\n\ntype Props = React.ComponentProps<typeof SuggestionList> & {\n inputRef: React.RefObject<HTMLTextAreaElement>;\n open: boolean;\n}\n\nexport default function RhsSuggestionList(props: Props): JSX.Element {\n const [position, setPosition] = useState<Props['position']>('top');\n const isMobile = useSelector(getIsMobileView);\n\n useEffect(() => {\n const input = props.inputRef.current;\n if (input && props.open) {\n const inputTop = input.getBoundingClientRect().top ?? 0;\n const requiredSpace = isMobile ? Constants.MOBILE_SUGGESTION_LIST_SPACE_RHS : Constants.SUGGESTION_LIST_SPACE_RHS;\n const newPosition = (inputTop < requiredSpace) ? 'bottom' : 'top';\n\n if (newPosition !== position) {\n // This potentially causes a second render when the list position changes, but that's better\n // than checking the bounding rectangle while rendering.\n setPosition(newPosition);\n }\n }\n }, [position, props.inputRef, props.open, isMobile]);\n\n return (\n <SuggestionList\n {...props}\n position={position}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n padding: 8px 24px;\n font-size: 12px;\n color: rgba(var(--center-channel-color-rgb), 0.75);\n\n & + .AdvancedTextEditor {\n padding-top: 0;\n }\n`;\n\nconst Icon = styled.i`\n color: #d24b4e;\n font-size: 14px;\n margin-right: 2px;\n`;\n\ntype Props = {\n displayName: string;\n}\n\nconst DoNotDisturbWarning = ({displayName}: Props) => {\n return (\n <Container className='DoNotDisturbWarning'>\n <Icon className='icon-minus-circle'/>\n <FormattedMessage\n id='advanced_create_post.doNotDisturbWarning'\n defaultMessage='{displayName} is set to <b>Do Not Disturb</b>'\n values={{displayName, b: (chunks: React.ReactNode) => <b>{chunks}</b>}}\n />\n </Container>\n );\n};\n\nexport default DoNotDisturbWarning;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {unsetEditingPost} from 'actions/post_actions';\nimport {isSendOnCtrlEnter} from 'selectors/preferences';\n\nimport {isMac} from 'utils/user_agent';\n\ntype Props = {\n onSave: () => void;\n onCancel?: () => void;\n}\n\nexport default function EditPostFooter(props: Props) {\n const dispatch = useDispatch();\n\n const sendOnCtrlEnter = useSelector(isSendOnCtrlEnter);\n const ctrlSendKey = isMac() ? '⌘+' : 'CTRL+';\n\n function handleCancel() {\n props.onCancel?.();\n dispatch(unsetEditingPost());\n }\n\n return (\n <div className='post-body__footer'>\n <button\n onClick={props.onSave}\n className='save'\n >\n <FormattedMessage\n id='edit_post.action_buttons.save'\n defaultMessage='Save'\n />\n </button>\n <button\n onClick={handleCancel}\n className='cancel'\n >\n <FormattedMessage\n id='edit_post.action_buttons.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <FormattedMessage\n id='edit_post.helper_text'\n defaultMessage='<strong>{key}ENTER</strong> to Save, <strong>ESC</strong> to Cancel'\n values={{\n key: sendOnCtrlEnter ? ctrlSendKey : '',\n strong: (x: string) => <strong>{x}</strong>,\n }}\n />\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MouseEventHandler} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport {isErrorInvalidSlashCommand} from 'utils/post_utils';\n\ninterface Props {\n error: ServerError;\n handleSubmit: MouseEventHandler<HTMLAnchorElement>;\n submittedMessage?: string;\n}\n\nfunction MessageSubmitError(props: Props) {\n if (isErrorInvalidSlashCommand(props.error)) {\n const slashCommand = props.submittedMessage?.split(' ')[0];\n\n return (\n <div className='has-error'>\n <div className='control-label'>\n <FormattedMessage\n id='message_submit_error.invalidCommand'\n defaultMessage=\"Command with a trigger of ''{slashCommand}'' not found. \"\n values={{\n slashCommand,\n }}\n />\n <a\n href='#'\n role='button'\n onClick={props.handleSubmit}\n >\n <FormattedMessage\n id='message_submit_error.sendAsMessageLink'\n defaultMessage='Click here to send as a message.'\n />\n </a>\n </div>\n </div>\n );\n }\n\n if (props.error?.message?.trim()?.length === 0) {\n return null;\n }\n\n return (\n <div className='has-error'>\n <label className='control-label'>{props.error.message.trim()}</label>\n </div>\n );\n}\n\nexport default MessageSubmitError;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {Typing} from '@mattermost/types/typing';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getUsers} from 'mattermost-redux/selectors/entities/common';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nconst getUsersTypingImpl = (profiles: IDMappedObjects<UserProfile>, teammateNameDisplay: string, channelId: string, parentPostId: string, typing: Typing): string[] => {\n const id = channelId + parentPostId;\n\n if (typing[id]) {\n const users = Object.keys(typing[id]);\n\n if (users.length) {\n return users.map((userId) => {\n return displayUsername(profiles[userId], teammateNameDisplay);\n });\n }\n }\n\n return [];\n};\n\nexport function makeGetUsersTypingByChannelAndPost(): (state: GlobalState, props: {channelId: string; postId: string}) => string[] {\n return createSelector(\n 'makeGetUsersTypingByChannelAndPost',\n getUsers,\n getTeammateNameDisplaySetting,\n (state: GlobalState, options: {channelId: string; postId: string}) => options.channelId,\n (state: GlobalState, options: {channelId: string; postId: string}) => options.postId,\n (state: GlobalState) => state.entities.typing,\n getUsersTypingImpl,\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getMissingProfilesByIds, getStatusesByIds} from 'mattermost-redux/actions/users';\nimport {General, Preferences, WebsocketEvents} from 'mattermost-redux/constants';\nimport {getIsUserStatusesConfigEnabled} from 'mattermost-redux/selectors/entities/common';\nimport {getConfig, isPerformanceDebuggingEnabled} from 'mattermost-redux/selectors/entities/general';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId, getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport type {ActionFuncAsync, ThunkActionFunc} from 'types/store';\n\nfunction getTimeBetweenTypingEvents(state: GlobalState) {\n const config = getConfig(state);\n\n return config.TimeBetweenUserTypingUpdatesMilliseconds === undefined ? 0 : parseInt(config.TimeBetweenUserTypingUpdatesMilliseconds, 10);\n}\n\nexport function userStartedTyping(userId: string, channelId: string, rootId: string, now: number): ThunkActionFunc<void> {\n return (dispatch, getState) => {\n const state = getState();\n\n if (\n isPerformanceDebuggingEnabled(state) &&\n getBool(state, Preferences.CATEGORY_PERFORMANCE_DEBUGGING, Preferences.NAME_DISABLE_TYPING_MESSAGES)\n ) {\n return;\n }\n\n dispatch({\n type: WebsocketEvents.TYPING,\n data: {\n id: channelId + rootId,\n userId,\n now,\n },\n });\n\n // Ideally this followup loading would be done by someone else\n dispatch(fillInMissingInfo(userId));\n\n setTimeout(() => {\n dispatch(userStoppedTyping(userId, channelId, rootId, now));\n }, getTimeBetweenTypingEvents(state));\n };\n}\n\nfunction fillInMissingInfo(userId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n const enabledUserStatuses = getIsUserStatusesConfigEnabled(state);\n\n if (userId !== currentUserId) {\n const result = await dispatch(getMissingProfilesByIds([userId]));\n if (result.data && result.data.length > 0) {\n // Already loaded the user status\n return {data: false};\n }\n }\n\n const status = getStatusForUserId(state, userId);\n if (status !== General.ONLINE && enabledUserStatuses) {\n dispatch(getStatusesByIds([userId]));\n }\n\n return {data: true};\n };\n}\n\nexport function userStoppedTyping(userId: string, channelId: string, rootId: string, now: number) {\n return {\n type: WebsocketEvents.STOP_TYPING,\n data: {\n id: channelId + rootId,\n userId,\n now,\n },\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {WebSocketMessage} from '@mattermost/client';\n\nimport {SocketEvents} from 'utils/constants';\nimport {useWebSocket} from 'utils/use_websocket';\n\ntype Props = {\n channelId: string;\n postId: string;\n typingUsers: string[];\n userStartedTyping: (userId: string, channelId: string, rootId: string, now: number) => void;\n userStoppedTyping: (userId: string, channelId: string, rootId: string, now: number) => void;\n}\n\nexport default function MsgTyping(props: Props) {\n const {userStartedTyping, userStoppedTyping} = props;\n useWebSocket({\n handler: useCallback((msg: WebSocketMessage) => {\n if (msg.event === SocketEvents.TYPING) {\n const channelId = msg.broadcast.channel_id;\n const rootId = msg.data.parent_id;\n const userId = msg.data.user_id;\n\n if (props.channelId === channelId && props.postId === rootId) {\n userStartedTyping(userId, channelId, rootId, Date.now());\n }\n } else if (msg.event === SocketEvents.POSTED) {\n const post = JSON.parse(msg.data.post);\n\n const channelId = post.channel_id;\n const rootId = post.root_id;\n const userId = post.user_id;\n\n if (props.channelId === channelId && props.postId === rootId) {\n userStoppedTyping(userId, channelId, rootId, Date.now());\n }\n }\n }, [props.channelId, props.postId, userStartedTyping, userStoppedTyping]),\n });\n\n const getTypingText = () => {\n let users: string[] = [];\n let numUsers = 0;\n if (props.typingUsers) {\n users = [...props.typingUsers];\n numUsers = users.length;\n }\n\n if (numUsers === 0) {\n return '';\n }\n if (numUsers === 1) {\n return (\n <FormattedMessage\n id='msg_typing.isTyping'\n defaultMessage='{user} is typing...'\n values={{\n user: users[0],\n }}\n />\n );\n }\n const last = users.pop();\n return (\n <FormattedMessage\n id='msg_typing.areTyping'\n defaultMessage='{users} and {last} are typing...'\n values={{\n users: (users.join(', ')),\n last,\n }}\n />\n );\n };\n\n return (\n <span className='msg-typing'>{getTypingText()}</span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {makeGetUsersTypingByChannelAndPost} from 'mattermost-redux/selectors/entities/typing';\n\nimport type {GlobalState} from 'types/store';\n\nimport {userStartedTyping, userStoppedTyping} from './actions';\nimport MsgTyping from './msg_typing';\n\ntype OwnProps = {\n channelId: string;\n postId: string;\n};\n\nfunction makeMapStateToProps() {\n const getUsersTypingByChannelAndPost = makeGetUsersTypingByChannelAndPost();\n\n return function mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const typingUsers = getUsersTypingByChannelAndPost(state, {channelId: ownProps.channelId, postId: ownProps.postId});\n\n return {\n typingUsers,\n };\n };\n}\n\nconst mapDispatchToProps = {\n userStartedTyping,\n userStoppedTyping,\n};\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(MsgTyping);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {ReactNode} from 'react';\nimport React from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {Post} from '@mattermost/types/posts';\n\nimport MessageSubmitError from 'components/message_submit_error';\nimport MsgTyping from 'components/msg_typing';\n\ninterface Props {\n postError?: ReactNode;\n errorClass: string | null;\n serverError: ServerError & {submittedMessage?: string} | null;\n channelId: Channel['id'];\n postId: Post['id'];\n noArgumentHandleSubmit: () => void;\n isInEditMode: boolean;\n}\n\nexport default function Footer({\n postError,\n errorClass,\n serverError,\n channelId,\n postId,\n noArgumentHandleSubmit,\n isInEditMode,\n}: Props) {\n return (\n <div\n id='postCreateFooter'\n role='form'\n className='AdvancedTextEditor__footer'\n >\n {postError && (\n <div className={classNames('post-error', {errorClass})}>\n {postError}\n </div>\n )}\n {serverError && (\n <MessageSubmitError\n error={serverError}\n submittedMessage={serverError.submittedMessage}\n handleSubmit={noArgumentHandleSubmit}\n />\n )}\n {!isInEditMode && (\n <MsgTyping\n channelId={channelId}\n postId={postId}\n />\n )}\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Instance} from '@popperjs/core';\nimport debounce from 'lodash/debounce';\nimport type React from 'react';\nimport {useCallback, useEffect, useLayoutEffect, useState} from 'react';\n\nimport type {MarkdownMode} from 'utils/markdown/apply_markdown';\n\ntype WideMode = 'wide' | 'normal' | 'narrow' | 'min';\n\nconst useResponsiveFormattingBar = (ref: React.RefObject<HTMLDivElement>): WideMode => {\n const [wideMode, setWideMode] = useState<WideMode>('wide');\n const handleResize = useCallback(debounce(() => {\n if (ref.current?.clientWidth === undefined) {\n return;\n }\n if (ref.current.clientWidth > 640) {\n setWideMode('wide');\n }\n if (ref.current.clientWidth >= 424 && ref.current.clientWidth <= 640) {\n setWideMode('normal');\n }\n if (ref.current.clientWidth < 424) {\n setWideMode('narrow');\n }\n\n if (ref.current.clientWidth < 310) {\n setWideMode('min');\n }\n }, 10), []);\n\n useLayoutEffect(() => {\n if (!ref.current) {\n return () => {};\n }\n\n let sizeObserver: ResizeObserver | null = new ResizeObserver(handleResize);\n\n sizeObserver.observe(ref.current);\n\n return () => {\n sizeObserver!.disconnect();\n sizeObserver = null;\n };\n }, [handleResize, ref]);\n\n return wideMode;\n};\n\nconst MAP_WIDE_MODE_TO_CONTROLS_QUANTITY: {[key in WideMode]: number} = {\n wide: 9,\n normal: 5,\n narrow: 3,\n min: 1,\n};\n\nexport function splitFormattingBarControls(wideMode: WideMode) {\n const allControls: MarkdownMode[] = ['bold', 'italic', 'strike', 'heading', 'link', 'code', 'quote', 'ul', 'ol'];\n\n const controlsLength = MAP_WIDE_MODE_TO_CONTROLS_QUANTITY[wideMode];\n\n const controls = allControls.slice(0, controlsLength);\n const hiddenControls = allControls.slice(controlsLength);\n\n return {\n controls,\n hiddenControls,\n };\n}\n\nexport const useFormattingBarControls = (\n formattingBarRef: React.RefObject<HTMLDivElement>,\n): {\n controls: MarkdownMode[];\n hiddenControls: MarkdownMode[];\n wideMode: WideMode;\n} => {\n const wideMode = useResponsiveFormattingBar(formattingBarRef);\n\n const {controls, hiddenControls} = splitFormattingBarControls(wideMode);\n\n return {\n controls,\n hiddenControls,\n wideMode,\n };\n};\n\nexport const useUpdateOnVisibilityChange = (update: Instance['update'] | null, isVisible: boolean) => {\n const updateComponent = async () => {\n if (!update) {\n return;\n }\n await update();\n };\n\n useEffect(() => {\n if (!isVisible) {\n return;\n }\n updateComponent();\n }, [isVisible]);\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useFloating, offset, useClick, useDismiss, useInteractions} from '@floating-ui/react';\nimport classNames from 'classnames';\nimport React, {memo, useCallback, useEffect, useRef, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {CSSTransition} from 'react-transition-group';\nimport styled from 'styled-components';\n\nimport {DotsHorizontalIcon} from '@mattermost/compass-icons/components';\n\nimport type {ApplyMarkdownOptions} from 'utils/markdown/apply_markdown';\n\nimport FormattingIcon, {IconContainer} from './formatting_icon';\nimport {useFormattingBarControls} from './hooks';\n\nexport const Separator = styled.div`\n display: block;\n position: relative;\n width: 1px;\n height: 24px;\n background: rgba(var(--center-channel-color-rgb), 0.16);\n`;\n\nexport const FormattingBarSpacer = styled.div`\n display: flex;\n height: 48px;\n transition: height 0.25s ease;\n align-items: end;\n background: var(--center-channel-bg);\n`;\n\nconst FormattingBarContainer = styled.div`\n display: flex;\n height: 48px;\n padding-left: 7px;\n background: transparent;\n align-items: center;\n gap: 2px;\n transform-origin: top;\n transition: height 0.25s ease;\n`;\n\nconst HiddenControlsContainer = styled.div`\n padding: 5px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\n border-radius: 4px;\n border: 1px solid rgba(var(--center-channel-color-rgb), 0.16);\n background: var(--center-channel-bg);\n z-index: -1;\n\n transition: transform 250ms ease, opacity 250ms ease;\n transform: scale(0);\n opacity: 0;\n display: flex;\n\n &.scale-enter {\n transform: scale(0);\n opacity: 0;\n z-index: 20;\n }\n\n &.scale-enter-active {\n transform: scale(1);\n opacity: 1;\n z-index: 20;\n }\n\n &.scale-enter-done {\n transform: scale(1);\n opacity: 1;\n z-index: 20;\n }\n\n &.scale-exit {\n transform: scale(1);\n opacity: 1;\n z-index: 20;\n }\n\n &.scale-exit-active {\n transform: scale(0);\n opacity: 0;\n z-index: 20;\n }\n\n &.scale-exit-done {\n transform: scale(0);\n opacity: 0;\n z-index: -1;\n }\n`;\n\ninterface FormattingBarProps {\n\n /**\n * the current inputValue\n * This is needed to apply the markdown to the correct place\n */\n getCurrentMessage: () => string;\n\n /**\n * The textbox element tied to the advanced texteditor\n * NOTE: Since the only thing we need from that is the current selection\n * range we should probably refactor this and only pass down the\n * selectionStart and selectionEnd values\n */\n getCurrentSelection: () => {start: number; end: number};\n\n /**\n * the handler function that applies the markdown to the value\n */\n applyMarkdown: (options: ApplyMarkdownOptions) => void;\n\n /**\n * disable formatting controls when the texteditor is in preview state\n */\n disableControls: boolean;\n\n /**\n * location of the advanced text editor in the UI (center channel / RHS)\n */\n location: string;\n\n /**\n * controls that enhance the message,\n * e.g: message priority picker\n */\n additionalControls?: React.ReactNodeArray;\n}\n\nconst DEFAULT_MIN_MODE_X_COORD = 55;\n\nconst FormattingBar = (props: FormattingBarProps): JSX.Element => {\n const {\n applyMarkdown,\n getCurrentSelection,\n getCurrentMessage,\n disableControls,\n location,\n additionalControls,\n } = props;\n const [showHiddenControls, setShowHiddenControls] = useState(false);\n const formattingBarRef = useRef<HTMLDivElement>(null);\n const {controls, hiddenControls, wideMode} = useFormattingBarControls(formattingBarRef);\n\n const {formatMessage} = useIntl();\n const HiddenControlsButtonAriaLabel = formatMessage({id: 'accessibility.button.hidden_controls_button', defaultMessage: 'show hidden formatting options'});\n\n const {x, y, strategy, update, context, refs: {setReference, setFloating}} = useFloating<HTMLButtonElement>({\n open: showHiddenControls,\n onOpenChange: setShowHiddenControls,\n placement: 'top',\n middleware: [offset({mainAxis: 4})],\n });\n\n const click = useClick(context);\n const {getReferenceProps: getClickReferenceProps, getFloatingProps: getClickFloatingProps} = useInteractions([\n click,\n ]);\n\n const dismiss = useDismiss(context);\n const {getReferenceProps: getDismissReferenceProps, getFloatingProps: getDismissFloatingProps} = useInteractions([\n dismiss,\n ]);\n\n useEffect(() => {\n update?.();\n }, [wideMode, update, showHiddenControls]);\n\n const hasHiddenControls = wideMode !== 'wide';\n\n /**\n * wrapping this factory in useCallback prevents it from constantly getting a new\n * function signature as if we would define it directly in the props of\n * the FormattingIcon component. This should improve render-performance\n */\n const makeFormattingHandler = useCallback((mode) => () => {\n // if the formatting is disabled just return without doing anything\n if (disableControls) {\n return;\n }\n\n // get the current selection values and return early (doing nothing) when we don't get valid values\n const {start, end} = getCurrentSelection();\n\n if (start === null || end === null) {\n return;\n }\n\n const value = getCurrentMessage();\n\n applyMarkdown({\n markdownMode: mode,\n selectionStart: start,\n selectionEnd: end,\n message: value,\n });\n\n // if hidden controls are currently open close them\n if (showHiddenControls) {\n setShowHiddenControls(true);\n }\n }, [getCurrentSelection, getCurrentMessage, applyMarkdown, showHiddenControls, disableControls]);\n\n const leftPosition = wideMode === 'min' ? (x ?? 0) + DEFAULT_MIN_MODE_X_COORD : x ?? 0;\n\n const hiddenControlsContainerStyles: React.CSSProperties = {\n position: strategy,\n top: y ?? 0,\n left: leftPosition,\n };\n\n const showSeparators = wideMode === 'wide';\n\n return (\n <FormattingBarContainer\n ref={formattingBarRef}\n data-testid='formattingBarContainer'\n >\n {controls.map((mode) => {\n return (\n <React.Fragment key={mode}>\n <FormattingIcon\n mode={mode}\n className='control'\n onClick={makeFormattingHandler(mode)}\n disabled={disableControls}\n />\n {mode === 'heading' && showSeparators && <Separator/>}\n </React.Fragment>\n );\n })}\n\n {Array.isArray(additionalControls) && additionalControls.length > 0 && (\n <>\n {showSeparators && <Separator/>}\n {additionalControls}\n </>\n )}\n\n {hasHiddenControls && (\n <>\n <IconContainer\n id={'HiddenControlsButton' + location}\n ref={setReference}\n className={classNames({active: showHiddenControls})}\n aria-label={HiddenControlsButtonAriaLabel}\n type='button'\n {...getClickReferenceProps()}\n {...getDismissReferenceProps()}\n >\n <DotsHorizontalIcon\n color={'currentColor'}\n size={18}\n />\n </IconContainer>\n </>\n )}\n\n <CSSTransition\n timeout={250}\n classNames='scale'\n in={showHiddenControls}\n >\n <HiddenControlsContainer\n ref={setFloating}\n style={hiddenControlsContainerStyles}\n {...getClickFloatingProps()}\n {...getDismissFloatingProps()}\n >\n {hiddenControls.map((mode) => {\n return (\n <FormattingIcon\n key={mode}\n mode={mode}\n className='control'\n onClick={makeFormattingHandler(mode)}\n disabled={disableControls}\n />\n );\n })}\n </HiddenControlsContainer>\n </CSSTransition>\n </FormattingBarContainer>\n );\n};\n\nexport default memo(FormattingBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {InformationOutlineIcon} from '@mattermost/compass-icons/components';\n\nexport default function MessageWithMentionsFooter() {\n const {formatMessage} = useIntl();\n\n return (\n <div className='post-body__info'>\n <span className='post-body__info__icon'>\n <InformationOutlineIcon\n size={14}\n color='currentColor'\n />\n </span>\n <span>\n {formatMessage({\n id: 'edit_post.no_notification_trigger_on_mention',\n defaultMessage: \"Editing this message with an '@mention' will not notify the recipient.\",\n })}\n </span>\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Zone} from 'luxon';\nimport {DateTime} from 'luxon';\nimport React, {memo, useCallback, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {get as getPreference} from 'mattermost-redux/selectors/entities/preferences';\n\nimport * as Menu from 'components/menu';\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\n\nimport {scheduledPosts} from 'utils/constants';\n\ntype Props = {\n handleOnSelect: (e: React.FormEvent, scheduledAt: number) => void;\n userCurrentTimezone: string;\n tomorrow9amTime: number;\n nextMonday: number;\n}\n\nconst DATE_RANGES = [\n RelativeRanges.TODAY_TITLE_CASE,\n RelativeRanges.TOMORROW_TITLE_CASE,\n];\n\ninterface RecentlyUsedCustomDate {\n update_at?: number;\n timestamp?: number;\n}\n\nfunction isTimestampWithinLast30Days(timestamp: number, timeZone = 'UTC') {\n if (!timestamp || isNaN(timestamp)) {\n return false;\n }\n const usedDate = DateTime.fromMillis(timestamp).setZone(timeZone);\n const now = DateTime.now().setZone(timeZone);\n const thirtyDaysAgo = now.minus({days: 30});\n\n return usedDate >= thirtyDaysAgo && usedDate <= now;\n}\n\nfunction shouldShowRecentlyUsedCustomTime(\n nowMillis: number,\n recentlyUsedCustomDateVal: RecentlyUsedCustomDate,\n userCurrentTimezone: string,\n tomorrow9amTime: number,\n nextMonday: number,\n) {\n return recentlyUsedCustomDateVal &&\n typeof recentlyUsedCustomDateVal.update_at === 'number' &&\n typeof recentlyUsedCustomDateVal.timestamp === 'number' &&\n recentlyUsedCustomDateVal.timestamp > nowMillis && // is in the future\n recentlyUsedCustomDateVal.timestamp !== tomorrow9amTime && // is not the existing option tomorrow 9a.m\n recentlyUsedCustomDateVal.timestamp !== nextMonday && // is not the existing option tomorrow 9a.m\n isTimestampWithinLast30Days(recentlyUsedCustomDateVal.update_at, userCurrentTimezone);\n}\n\nconst USE_DATE_WEEKDAY_LONG = {weekday: 'long'} as const;\nconst USE_TIME_HOUR_MINUTE_NUMERIC = {hour: 'numeric', minute: 'numeric'} as const;\nconst USE_DATE_MONTH_DAY = {month: 'long', day: 'numeric'} as const;\n\nfunction getDateOption(now: DateTime, timestamp: number | undefined, userCurrentTimezone: string | Zone | undefined) {\n if (!now || !timestamp || !userCurrentTimezone) {\n return USE_DATE_WEEKDAY_LONG;\n }\n const scheduledDate = DateTime.fromMillis(timestamp).setZone(userCurrentTimezone);\n const isInCurrentWeek = scheduledDate.weekNumber === now.weekNumber && scheduledDate.weekYear === now.weekYear;\n return isInCurrentWeek ? USE_DATE_WEEKDAY_LONG : USE_DATE_MONTH_DAY;\n}\n\nfunction RecentUsedCustomDate({handleOnSelect, userCurrentTimezone, nextMonday, tomorrow9amTime}: Props) {\n const now = DateTime.now().setZone(userCurrentTimezone);\n const recentlyUsedCustomDate = useSelector((state: GlobalState) => getPreference(state, scheduledPosts.SCHEDULED_POSTS, scheduledPosts.RECENTLY_USED_CUSTOM_TIME));\n const recentlyUsedCustomDateVal: RecentlyUsedCustomDate = useMemo(() => {\n if (recentlyUsedCustomDate) {\n try {\n return JSON.parse(recentlyUsedCustomDate) as RecentlyUsedCustomDate;\n } catch (e) {\n return {};\n }\n }\n return {};\n }, [recentlyUsedCustomDate]);\n const handleRecentlyUsedCustomTime = useCallback((e) => handleOnSelect(e, recentlyUsedCustomDateVal.timestamp!), [handleOnSelect, recentlyUsedCustomDateVal.timestamp]);\n\n if (\n !shouldShowRecentlyUsedCustomTime(now.toMillis(), recentlyUsedCustomDateVal, userCurrentTimezone, tomorrow9amTime, nextMonday)\n ) {\n return null;\n }\n\n const dateOption = getDateOption(now, recentlyUsedCustomDateVal.timestamp, userCurrentTimezone);\n\n const timestamp = (\n <Timestamp\n ranges={DATE_RANGES}\n value={recentlyUsedCustomDateVal.timestamp}\n timeZone={userCurrentTimezone}\n useDate={dateOption}\n useTime={USE_TIME_HOUR_MINUTE_NUMERIC}\n />\n );\n\n const trailingElement = (\n <FormattedMessage\n id='create_post_button.option.schedule_message.options.recently_used_custom_time'\n defaultMessage='Recently used custom time'\n />\n );\n\n return (\n <>\n <Menu.Separator key='recent_custom_separator'/>\n <Menu.Item\n key='recently_used_custom_time'\n onClick={handleRecentlyUsedCustomTime}\n labels={timestamp}\n className='core-menu-options'\n trailingElements={trailingElement}\n />\n </>\n );\n}\n\nexport default memo(RecentUsedCustomDate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {DateTime} from 'luxon';\nimport React, {memo, useCallback, useEffect} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {\n TrackPropertyUser, TrackPropertyUserAgent,\n TrackScheduledPostsFeature,\n} from 'mattermost-redux/constants/telemetry';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackFeatureEvent} from 'actions/telemetry_actions';\n\nimport useTimePostBoxIndicator from 'components/advanced_text_editor/use_post_box_indicator';\nimport * as Menu from 'components/menu';\nimport type {Props as MenuItemProps} from 'components/menu/menu_item';\nimport Timestamp from 'components/timestamp';\n\nimport RecentUsedCustomDate from './recent_used_custom_date';\n\ntype Props = {\n handleOnSelect: (e: React.FormEvent, scheduledAt: number) => void;\n channelId: string;\n}\n\nfunction getScheduledTimeInTeammateTimezone(userCurrentTimestamp: number, teammateTimezoneString: string): string {\n const scheduledTimeUTC = DateTime.fromMillis(userCurrentTimestamp, {zone: 'utc'});\n const teammateScheduledTime = scheduledTimeUTC.setZone(teammateTimezoneString);\n const formattedTime = teammateScheduledTime.toFormat('h:mm a');\n return formattedTime;\n}\n\nfunction getNextWeekday(dateTime: DateTime, targetWeekday: number) {\n const daysDifference = targetWeekday - dateTime.weekday;\n const adjustedDays = (daysDifference + 7) % 7;\n const deltaDays = adjustedDays === 0 ? 7 : adjustedDays;\n return dateTime.plus({days: deltaDays});\n}\n\nfunction CoreMenuOptions({handleOnSelect, channelId}: Props) {\n const {\n userCurrentTimezone,\n teammateTimezone,\n teammateDisplayName,\n isDM,\n isSelfDM,\n isBot,\n } = useTimePostBoxIndicator(channelId);\n\n const currentUserId = useSelector(getCurrentUserId);\n\n useEffect(() => {\n // tracking opening of scheduled posts option menu.\n // Since MUI menu has no `onOpen` event, we are tracking it here.\n // useEffect ensures that it is tracked only once.\n trackFeatureEvent(\n TrackScheduledPostsFeature,\n 'scheduled_posts_menu_opened',\n {\n [TrackPropertyUser]: currentUserId,\n [TrackPropertyUserAgent]: 'webapp',\n },\n );\n }, [currentUserId]);\n\n const now = DateTime.now().setZone(userCurrentTimezone);\n const tomorrow9amTime = DateTime.now().\n setZone(userCurrentTimezone).\n plus({days: 1}).\n set({hour: 9, minute: 0, second: 0, millisecond: 0}).\n toMillis();\n\n const nextMonday = getNextWeekday(now, 1).set({\n hour: 9,\n minute: 0,\n second: 0,\n millisecond: 0,\n }).toMillis();\n\n const timeComponent = (\n <Timestamp\n value={tomorrow9amTime.valueOf()}\n useDate={false}\n />\n );\n\n const extraProps: Partial<MenuItemProps> = {};\n\n if (isDM && !isBot && !isSelfDM) {\n const teammateTimezoneString = teammateTimezone.useAutomaticTimezone ? teammateTimezone.automaticTimezone : teammateTimezone.manualTimezone || 'UTC';\n const scheduledTimeInTeammateTimezone = getScheduledTimeInTeammateTimezone(tomorrow9amTime, teammateTimezoneString);\n const teammateTimeDisplay = (\n <FormattedMessage\n id='create_post_button.option.schedule_message.options.teammate_user_hour'\n defaultMessage=\"{time} {user}'s time\"\n values={{\n user: (\n <span className='userDisplayName'>\n {teammateDisplayName}\n </span>\n ),\n time: scheduledTimeInTeammateTimezone,\n }}\n />\n );\n\n extraProps.trailingElements = teammateTimeDisplay;\n }\n\n const tomorrowClickHandler = useCallback((e) => handleOnSelect(e, tomorrow9amTime), [handleOnSelect, tomorrow9amTime]);\n\n const optionTomorrow = (\n <Menu.Item\n key={'scheduling_time_tomorrow_9_am'}\n onClick={tomorrowClickHandler}\n labels={\n <FormattedMessage\n id='create_post_button.option.schedule_message.options.tomorrow'\n defaultMessage='Tomorrow at {9amTime}'\n values={{'9amTime': timeComponent}}\n />\n }\n className='core-menu-options'\n autoFocus={true}\n {...extraProps}\n />\n );\n\n const nextMondayClickHandler = useCallback((e) => handleOnSelect(e, nextMonday), [handleOnSelect, nextMonday]);\n\n const optionNextMonday = (\n <Menu.Item\n key={'scheduling_time_next_monday_9_am'}\n onClick={nextMondayClickHandler}\n labels={\n <FormattedMessage\n id='create_post_button.option.schedule_message.options.next_monday'\n defaultMessage='Next Monday at {9amTime}'\n values={{'9amTime': timeComponent}}\n />\n }\n className='core-menu-options'\n {...extraProps}\n />\n );\n\n const optionMonday = (\n <Menu.Item\n key={'scheduling_time_monday_9_am'}\n onClick={nextMondayClickHandler}\n labels={\n <FormattedMessage\n id='create_post_button.option.schedule_message.options.monday'\n defaultMessage='Monday at {9amTime}'\n values={{\n '9amTime': timeComponent,\n }}\n />\n }\n className='core-menu-options'\n autoFocus={now.weekday === 5 || now.weekday === 6}\n {...extraProps}\n />\n );\n\n let options: React.ReactElement[] = [];\n\n switch (now.weekday) {\n // Sunday\n case 7:\n options = [optionTomorrow];\n break;\n\n // Monday\n case 1:\n options = [optionTomorrow, optionNextMonday];\n break;\n\n // Friday and Saturday\n case 5:\n case 6:\n options = [optionMonday];\n break;\n\n // Tuesday to Thursday\n default:\n options = [optionTomorrow, optionMonday];\n }\n\n return (\n <>\n {options}\n <RecentUsedCustomDate\n handleOnSelect={handleOnSelect}\n userCurrentTimezone={userCurrentTimezone}\n tomorrow9amTime={tomorrow9amTime}\n nextMonday={nextMonday}\n />\n </>\n );\n}\n\nexport default memo(CoreMenuOptions);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport ChevronDownIcon from '@mattermost/compass-icons/components/chevron-down';\nimport type {SchedulingInfo} from '@mattermost/types/schedule_post';\n\nimport {openModal} from 'actions/views/modals';\n\nimport CoreMenuOptions from 'components/advanced_text_editor/send_button/send_post_options/core_menu_options';\nimport * as Menu from 'components/menu';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport ScheduledPostCustomTimeModal from '../scheduled_post_custom_time_modal/scheduled_post_custom_time_modal';\n\nimport './style.scss';\n\ntype Props = {\n channelId: string;\n disabled?: boolean;\n onSelect: (schedulingInfo: SchedulingInfo) => void;\n}\n\nexport function SendPostOptions({disabled, onSelect, channelId}: Props) {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n\n const handleOnSelect = useCallback((e: React.FormEvent, scheduledAt: number) => {\n e.preventDefault();\n e.stopPropagation();\n\n const schedulingInfo: SchedulingInfo = {\n scheduled_at: scheduledAt,\n };\n\n onSelect(schedulingInfo);\n }, [onSelect]);\n\n const handleSelectCustomTime = useCallback((scheduledAt: number) => {\n const schedulingInfo: SchedulingInfo = {\n scheduled_at: scheduledAt,\n };\n\n onSelect(schedulingInfo);\n return Promise.resolve({});\n }, [onSelect]);\n\n const handleChooseCustomTime = useCallback(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.SCHEDULED_POST_CUSTOM_TIME_MODAL,\n dialogType: ScheduledPostCustomTimeModal,\n dialogProps: {\n channelId,\n onConfirm: handleSelectCustomTime,\n },\n }));\n }, [channelId, dispatch, handleSelectCustomTime]);\n\n return (\n <Menu.Container\n menuButtonTooltip={{\n text: formatMessage({\n id: 'create_post_button.option.schedule_message',\n defaultMessage: 'Schedule message',\n }),\n disabled,\n }}\n menuButton={{\n id: 'button_send_post_options',\n class: classNames('button_send_post_options', {disabled}),\n children: <ChevronDownIcon size={16}/>,\n disabled,\n 'aria-label': formatMessage({\n id: 'create_post_button.option.schedule_message',\n defaultMessage: 'Schedule message',\n }),\n }}\n menu={{\n id: 'dropdown_send_post_options',\n }}\n transformOrigin={{\n horizontal: 'right',\n vertical: 'bottom',\n }}\n anchorOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n <Menu.Item\n disabled={true}\n labels={\n <FormattedMessage\n id='create_post_button.option.schedule_message.options.header'\n defaultMessage='Scheduled message'\n />\n }\n />\n\n <CoreMenuOptions\n handleOnSelect={handleOnSelect}\n channelId={channelId}\n />\n\n <Menu.Separator/>\n\n <Menu.Item\n onClick={handleChooseCustomTime}\n key={'choose_custom_time'}\n labels={\n <FormattedMessage\n id='create_post_button.option.schedule_message.options.choose_custom_time'\n defaultMessage='Choose a custom time'\n />\n }\n />\n\n </Menu.Container>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo, useCallback, useMemo} from 'react';\nimport {defineMessage, useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {SendIcon} from '@mattermost/compass-icons/components';\nimport type {SchedulingInfo} from '@mattermost/types/schedule_post';\n\nimport {isScheduledPostsEnabled} from 'mattermost-redux/selectors/entities/scheduled_posts';\n\nimport {isSendOnCtrlEnter} from 'selectors/preferences';\n\nimport {SendPostOptions} from 'components/advanced_text_editor/send_button/send_post_options';\nimport WithTooltip from 'components/with_tooltip';\nimport type {ShortcutDefinition} from 'components/with_tooltip/tooltip_shortcut';\nimport {ShortcutKeys} from 'components/with_tooltip/tooltip_shortcut';\n\nimport './send_button.scss';\n\ntype SendButtonProps = {\n handleSubmit: (schedulingInfo?: SchedulingInfo) => void;\n disabled: boolean;\n channelId: string;\n}\n\nconst SendButton = ({disabled, handleSubmit, channelId}: SendButtonProps) => {\n const {formatMessage} = useIntl();\n const isScheduledPostEnabled = useSelector(isScheduledPostsEnabled);\n\n const sendMessage = useCallback((e: React.FormEvent, schedulingInfo?: SchedulingInfo) => {\n e?.stopPropagation();\n e?.preventDefault();\n handleSubmit(schedulingInfo);\n }, [handleSubmit]);\n\n const sendOnCtrlEnter = useSelector(isSendOnCtrlEnter);\n\n const sendNowKeyboardShortcutDescriptor = useMemo<ShortcutDefinition>(() => {\n const shortcutDefinition: ShortcutDefinition = {\n default: [\n defineMessage({\n id: 'shortcuts.generic.enter',\n defaultMessage: 'Enter',\n }),\n ],\n mac: [\n defineMessage({\n id: 'shortcuts.generic.enter',\n defaultMessage: 'Enter',\n }),\n ],\n };\n\n if (sendOnCtrlEnter) {\n shortcutDefinition.default.unshift(ShortcutKeys.ctrl);\n shortcutDefinition.mac?.unshift(ShortcutKeys.cmd);\n }\n\n return shortcutDefinition;\n }, [sendOnCtrlEnter]);\n\n return (\n <div className={classNames('splitSendButton', {disabled, scheduledPost: isScheduledPostEnabled})}>\n <WithTooltip\n title={formatMessage({id: 'create_post_button.option.send_now', defaultMessage: 'Send Now'})}\n shortcut={sendNowKeyboardShortcutDescriptor}\n disabled={disabled}\n >\n <button\n className={classNames('SendMessageButton', {disabled}, {singleAction: !isScheduledPostEnabled})}\n data-testid='SendMessageButton'\n tabIndex={0}\n aria-label={formatMessage({\n id: 'create_post_button.option.send_now',\n defaultMessage: 'Send Now',\n })}\n disabled={disabled}\n onClick={sendMessage}\n >\n <SendIcon\n size={18}\n color='currentColor'\n />\n </button>\n </WithTooltip>\n\n {\n isScheduledPostEnabled &&\n <SendPostOptions\n disabled={disabled}\n onSelect={handleSubmit}\n channelId={channelId}\n />\n }\n </div>\n );\n};\n\nexport default memo(SendButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {EyeOutlineIcon} from '@mattermost/compass-icons/components';\n\nimport KeyboardShortcutSequence, {KEYBOARD_SHORTCUTS} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {IconContainer} from '../formatting_bar/formatting_icon';\n\ninterface ShowFormatProps {\n onClick: (event: React.MouseEvent) => void;\n active: boolean;\n}\n\nconst ShowFormatting = (props: ShowFormatProps): JSX.Element => {\n const {formatMessage} = useIntl();\n const {onClick, active} = props;\n const buttonAriaLabel = formatMessage({id: 'accessibility.button.preview', defaultMessage: 'preview'});\n const iconAriaLabel = formatMessage({id: 'generic_icons.preview', defaultMessage: 'Eye Icon'});\n\n return (\n <WithTooltip\n title={\n <KeyboardShortcutSequence\n shortcut={KEYBOARD_SHORTCUTS.msgMarkdownPreview}\n hoistDescription={true}\n isInsideTooltip={true}\n />\n }\n >\n <IconContainer\n type='button'\n id='PreviewInputTextButton'\n onClick={onClick}\n aria-label={buttonAriaLabel}\n className={classNames({active})}\n >\n <EyeOutlineIcon\n size={18}\n color={'currentColor'}\n aria-label={iconAriaLabel}\n />\n </IconContainer>\n </WithTooltip>\n );\n};\n\nexport default memo(ShowFormatting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {memo} from 'react';\nimport styled, {css} from 'styled-components';\n\ntype TexteditorActionsProps = {\n placement: 'top' | 'bottom';\n show?: boolean;\n isScrollbarRendered?: boolean;\n}\n\nconst TexteditorActions = styled.span<TexteditorActionsProps>`\n position: absolute;\n z-index: 2;\n display: flex;\n place-items: center;\n gap: 2px;\n\n /* define the position based on the placement prop */\n ${({placement, isScrollbarRendered}) => (placement === 'top' ? css`\n top: 7px;\n right: ${isScrollbarRendered ? 15 : 7}px;\n ` : css`\n right: 7px;\n bottom: 7px;\n `)}\n\n opacity: ${({show = true}) => (show ? 1 : 0)};\n transition: opacity 0.3s linear;\n visibility: ${({show = true}) => (show ? 'visible' : 'hidden')};\n\n .btn-file__disabled {\n opacity: 0.1;\n\n &:hover,\n &:active {\n opacity: 0.1;\n }\n }\n`;\n\nexport default memo(TexteditorActions);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {ChevronDownIcon, ChevronUpIcon, FormatLetterCaseIcon} from '@mattermost/compass-icons/components';\n\nimport KeyboardShortcutSequence, {KEYBOARD_SHORTCUTS} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {IconContainer} from './formatting_bar/formatting_icon';\n\ninterface ToggleFormattingBarProps {\n onClick: React.MouseEventHandler;\n active: boolean;\n disabled: boolean;\n}\n\nconst ToggleFormattingBar = (props: ToggleFormattingBarProps): JSX.Element => {\n const {onClick, active, disabled} = props;\n const {formatMessage} = useIntl();\n const buttonAriaLabel = formatMessage({id: 'accessibility.button.formatting', defaultMessage: 'formatting'});\n const iconAriaLabel = formatMessage({id: 'generic_icons.format_letter_case', defaultMessage: 'Format letter Case Icon'});\n\n const title = active ? (\n <KeyboardShortcutSequence\n shortcut={KEYBOARD_SHORTCUTS.msgHideFormatting}\n hoistDescription={true}\n isInsideTooltip={true}\n />\n ) : (\n <KeyboardShortcutSequence\n shortcut={KEYBOARD_SHORTCUTS.msgShowFormatting}\n hoistDescription={true}\n isInsideTooltip={true}\n />\n );\n\n const ChevronIcon = active ? ChevronUpIcon : ChevronDownIcon;\n\n return (\n <WithTooltip\n title={title}\n >\n <IconContainer\n type='button'\n id='toggleFormattingBarButton'\n onClick={onClick}\n disabled={disabled}\n aria-label={buttonAriaLabel}\n >\n <FormatLetterCaseIcon\n size={18}\n color={'currentColor'}\n aria-label={iconAriaLabel}\n />\n <ChevronIcon\n size={12}\n color={'currentColor'}\n aria-label={iconAriaLabel}\n />\n </IconContainer>\n </WithTooltip>\n );\n};\n\nexport default memo(ToggleFormattingBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type React from 'react';\nimport {useCallback, useEffect, useRef} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {SchedulingInfo} from '@mattermost/types/schedule_post';\n\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {emitShortcutReactToLastPostFrom, unsetEditingPost} from 'actions/post_actions';\nimport {editLatestPost} from 'actions/views/create_comment';\nimport {replyToLatestPostInChannel} from 'actions/views/rhs';\nimport {getIsRhsExpanded} from 'selectors/rhs';\n\nimport type {TextboxElement} from 'components/textbox';\nimport type TextboxClass from 'components/textbox/textbox';\n\nimport Constants, {A11yClassNames, Locations, Preferences} from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport {type ApplyMarkdownOptions} from 'utils/markdown/apply_markdown';\nimport {pasteHandler} from 'utils/paste';\nimport {isWithinCodeBlock, postMessageOnKeyPress} from 'utils/post_utils';\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\nimport type {PostDraft} from 'types/store/draft';\n\nconst KeyCodes = Constants.KeyCodes;\n\nconst useKeyHandler = (\n draft: PostDraft,\n channelId: string,\n postId: string,\n caretPosition: number,\n isValidPersistentNotifications: boolean,\n location: string,\n textboxRef: React.RefObject<TextboxClass>,\n showFormattingBar: boolean,\n focusTextbox: (forceFocus?: boolean) => void,\n applyMarkdown: (params: ApplyMarkdownOptions) => void,\n handleDraftChange: (draft: PostDraft, options?: {instant?: boolean; show?: boolean}) => void,\n handleSubmit: (submittingDraft?: PostDraft, schedulingInfo?: SchedulingInfo) => void,\n emitTypingEvent: () => void,\n toggleShowPreview: () => void,\n toggleAdvanceTextEditor: () => void,\n toggleEmojiPicker: () => void,\n isInEditMode?: boolean,\n onCancel?: () => void,\n): [\n (e: React.KeyboardEvent<TextboxElement>) => void,\n (e: React.KeyboardEvent<TextboxElement>) => void,\n ] => {\n const dispatch = useDispatch();\n\n const ctrlSend = useSelector((state: GlobalState) => getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'));\n const codeBlockOnCtrlEnter = useSelector((state: GlobalState) => getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'code_block_ctrl_enter', true));\n const messageHistory = useSelector((state: GlobalState) => state.entities.posts.messagesHistory.messages);\n const rhsExpanded = useSelector(getIsRhsExpanded);\n\n const timeoutId = useRef<number>();\n const messageHistoryIndex = useRef(messageHistory.length);\n const lastChannelSwitchAt = useRef(0);\n const isNonFormattedPaste = useRef(false);\n\n const replyToLastPost = useCallback((e: React.KeyboardEvent) => {\n if (postId) {\n return;\n }\n\n e.preventDefault();\n const replyBox = document.getElementById('reply_textbox');\n if (replyBox) {\n replyBox.focus();\n }\n\n dispatch(replyToLatestPostInChannel(channelId));\n }, [dispatch, postId, channelId]);\n\n const onEditLatestPost = useCallback((e: React.KeyboardEvent) => {\n e.preventDefault();\n const {data: canEditNow} = dispatch(editLatestPost(channelId, postId));\n if (!canEditNow) {\n focusTextbox(true);\n }\n }, [focusTextbox, channelId, postId, dispatch]);\n\n const loadPrevMessage = useCallback((e: React.KeyboardEvent) => {\n e.preventDefault();\n if (messageHistoryIndex.current === 0) {\n return;\n }\n messageHistoryIndex.current -= 1;\n handleDraftChange({\n ...draft,\n message: messageHistory[messageHistoryIndex.current] || '',\n });\n }, [draft, handleDraftChange, messageHistory]);\n\n const loadNextMessage = useCallback((e: React.KeyboardEvent) => {\n e.preventDefault();\n if (messageHistoryIndex.current >= messageHistory.length) {\n return;\n }\n messageHistoryIndex.current += 1;\n handleDraftChange({\n ...draft,\n message: messageHistory[messageHistoryIndex.current] || '',\n });\n }, [draft, handleDraftChange, messageHistory]);\n\n const postMsgKeyPress = useCallback((e: React.KeyboardEvent<TextboxElement>) => {\n const {allowSending, withClosedCodeBlock, ignoreKeyPress, message} = postMessageOnKeyPress(\n e,\n draft.message,\n ctrlSend,\n codeBlockOnCtrlEnter,\n postId ? 0 : Date.now(),\n postId ? 0 : lastChannelSwitchAt.current,\n caretPosition,\n );\n\n if (ignoreKeyPress) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n if (allowSending && isValidPersistentNotifications) {\n e.preventDefault();\n const updatedDraft = (withClosedCodeBlock && message) ? {...draft, message} : undefined;\n handleSubmit(updatedDraft);\n }\n\n emitTypingEvent();\n }, [draft, ctrlSend, codeBlockOnCtrlEnter, caretPosition, postId, emitTypingEvent, handleSubmit, isValidPersistentNotifications]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<TextboxElement>) => {\n const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey;\n const ctrlEnterKeyCombo = (ctrlSend || codeBlockOnCtrlEnter) &&\n Keyboard.isKeyPressed(e, KeyCodes.ENTER) &&\n ctrlOrMetaKeyPressed;\n\n const ctrlKeyCombo = Keyboard.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey;\n const ctrlAltCombo = Keyboard.cmdOrCtrlPressed(e, true) && e.altKey;\n const shiftAltCombo = !Keyboard.cmdOrCtrlPressed(e) && e.shiftKey && e.altKey;\n const ctrlShiftCombo = Keyboard.cmdOrCtrlPressed(e, true) && e.shiftKey;\n\n // fix for FF not capturing the paste without formatting event when using ctrl|cmd + shift + v\n if (e.key === KeyCodes.V[0] && ctrlOrMetaKeyPressed) {\n if (e.shiftKey) {\n isNonFormattedPaste.current = true;\n timeoutId.current = window.setTimeout(() => {\n isNonFormattedPaste.current = false;\n }, 250);\n }\n }\n\n // listen for line break key combo and insert new line character\n if (Utils.isUnhandledLineBreakKeyCombo(e)) {\n handleDraftChange({\n ...draft,\n message: Utils.insertLineBreakFromKeyEvent(e.nativeEvent),\n });\n return;\n }\n\n if (ctrlEnterKeyCombo) {\n postMsgKeyPress(e);\n return;\n }\n\n if (Keyboard.isKeyPressed(e, KeyCodes.ESCAPE)) {\n onCancel?.();\n textboxRef.current?.blur();\n if (isInEditMode) {\n dispatch(unsetEditingPost());\n }\n }\n\n const upKeyOnly = !ctrlOrMetaKeyPressed && !e.altKey && !e.shiftKey && Keyboard.isKeyPressed(e, KeyCodes.UP);\n const messageIsEmpty = draft.message.length === 0;\n const allowHistoryNavigation = draft.message.length === 0 || draft.message === messageHistory[messageHistoryIndex.current];\n const caretIsWithinCodeBlock = caretPosition && isWithinCodeBlock(draft.message, caretPosition); // REVIEW\n\n if (upKeyOnly && messageIsEmpty) {\n e.preventDefault();\n if (textboxRef.current) {\n textboxRef.current.blur();\n }\n\n onEditLatestPost(e);\n }\n\n const {\n selectionStart,\n selectionEnd,\n value,\n } = e.target as TextboxElement;\n\n if (ctrlKeyCombo && !caretIsWithinCodeBlock) {\n if (allowHistoryNavigation && Keyboard.isKeyPressed(e, KeyCodes.UP)) {\n e.stopPropagation();\n e.preventDefault();\n loadPrevMessage(e);\n } else if (allowHistoryNavigation && Keyboard.isKeyPressed(e, KeyCodes.DOWN)) {\n e.stopPropagation();\n e.preventDefault();\n loadNextMessage(e);\n } else if (Keyboard.isKeyPressed(e, KeyCodes.B)) {\n e.stopPropagation();\n e.preventDefault();\n applyMarkdown({\n markdownMode: 'bold',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (Keyboard.isKeyPressed(e, KeyCodes.I)) {\n e.stopPropagation();\n e.preventDefault();\n applyMarkdown({\n markdownMode: 'italic',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (Utils.isTextSelectedInPostOrReply(e) && Keyboard.isKeyPressed(e, KeyCodes.K)) {\n e.stopPropagation();\n e.preventDefault();\n applyMarkdown({\n markdownMode: 'link',\n selectionStart,\n selectionEnd,\n message: value,\n });\n }\n } else if (ctrlAltCombo && !caretIsWithinCodeBlock) {\n if (Keyboard.isKeyPressed(e, KeyCodes.K)) {\n e.stopPropagation();\n e.preventDefault();\n applyMarkdown({\n markdownMode: 'link',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (Keyboard.isKeyPressed(e, KeyCodes.C)) {\n e.stopPropagation();\n e.preventDefault();\n applyMarkdown({\n markdownMode: 'code',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (Keyboard.isKeyPressed(e, KeyCodes.E)) {\n e.stopPropagation();\n e.preventDefault();\n toggleEmojiPicker();\n } else if (Keyboard.isKeyPressed(e, KeyCodes.T)) {\n e.stopPropagation();\n e.preventDefault();\n toggleAdvanceTextEditor();\n } else if (Keyboard.isKeyPressed(e, KeyCodes.P) && draft.message.length && !UserAgent.isMac() && showFormattingBar) {\n e.stopPropagation();\n e.preventDefault();\n toggleShowPreview();\n }\n } else if (shiftAltCombo && !caretIsWithinCodeBlock) {\n if (Keyboard.isKeyPressed(e, KeyCodes.X)) {\n e.stopPropagation();\n e.preventDefault();\n applyMarkdown({\n markdownMode: 'strike',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (Keyboard.isKeyPressed(e, KeyCodes.SEVEN)) {\n e.preventDefault();\n applyMarkdown({\n markdownMode: 'ol',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (Keyboard.isKeyPressed(e, KeyCodes.EIGHT)) {\n e.preventDefault();\n applyMarkdown({\n markdownMode: 'ul',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (Keyboard.isKeyPressed(e, KeyCodes.NINE)) {\n e.preventDefault();\n applyMarkdown({\n markdownMode: 'quote',\n selectionStart,\n selectionEnd,\n message: value,\n });\n }\n } else if (ctrlShiftCombo && !caretIsWithinCodeBlock) {\n if (Keyboard.isKeyPressed(e, KeyCodes.P) && draft.message.length && UserAgent.isMac()) { // REVIEW\n e.stopPropagation();\n e.preventDefault();\n toggleShowPreview();\n } else if (Keyboard.isKeyPressed(e, KeyCodes.E)) {\n e.stopPropagation();\n e.preventDefault();\n toggleEmojiPicker();\n }\n }\n\n const lastMessageReactionKeyCombo = ctrlShiftCombo && Keyboard.isKeyPressed(e, KeyCodes.BACK_SLASH);\n if (lastMessageReactionKeyCombo) {\n // we need to stop propagating and prevent default even if a\n // post is being edited so the document level event handler doesn't trigger\n e.stopPropagation();\n e.preventDefault();\n\n if (!isInEditMode) {\n // don't show the reaction dialog if a post is being edited\n dispatch(emitShortcutReactToLastPostFrom(postId ? Locations.RHS_ROOT : Locations.CENTER));\n }\n }\n\n if (!postId) {\n const shiftUpKeyCombo = !ctrlOrMetaKeyPressed && !e.altKey && e.shiftKey && Keyboard.isKeyPressed(e, KeyCodes.UP);\n if (shiftUpKeyCombo && messageIsEmpty) {\n replyToLastPost?.(e);\n }\n }\n }, [\n applyMarkdown,\n caretPosition,\n codeBlockOnCtrlEnter,\n ctrlSend,\n dispatch,\n draft,\n handleDraftChange,\n loadNextMessage,\n loadPrevMessage,\n messageHistory,\n onEditLatestPost,\n postId,\n postMsgKeyPress,\n replyToLastPost,\n textboxRef,\n toggleAdvanceTextEditor,\n toggleEmojiPicker,\n toggleShowPreview,\n ]);\n\n // Register paste events\n useEffect(() => {\n function onPaste(event: ClipboardEvent) {\n pasteHandler(event, location, draft.message, isNonFormattedPaste.current, caretPosition);\n }\n\n document.addEventListener('paste', onPaste);\n return () => {\n document.removeEventListener('paste', onPaste);\n };\n }, [location, draft.message, caretPosition]);\n\n const reactToLastMessage = useCallback((e: KeyboardEvent) => {\n e.preventDefault();\n\n const noModalsAreOpen = document.getElementsByClassName(A11yClassNames.MODAL).length === 0;\n const noPopupsDropdownsAreOpen = document.getElementsByClassName(A11yClassNames.POPUP).length === 0;\n\n // Block keyboard shortcut react to last message when :\n // - RHS is completely expanded\n // - Any dropdown/popups are open\n // - Any modals are open\n if (!rhsExpanded && noModalsAreOpen && noPopupsDropdownsAreOpen) {\n dispatch(emitShortcutReactToLastPostFrom(Locations.CENTER));\n }\n }, [dispatch, rhsExpanded]);\n\n useEffect(() => {\n const documentKeyHandler = (e: KeyboardEvent) => {\n const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey;\n const lastMessageReactionKeyCombo = ctrlOrMetaKeyPressed && e.shiftKey && Keyboard.isKeyPressed(e, KeyCodes.BACK_SLASH);\n if (lastMessageReactionKeyCombo) {\n reactToLastMessage(e);\n }\n };\n\n if (!postId) {\n document.addEventListener('keydown', documentKeyHandler);\n }\n\n return () => {\n if (!postId) {\n document.removeEventListener('keydown', documentKeyHandler);\n }\n };\n }, [postId, reactToLastMessage]);\n\n // Reset history index\n useEffect(() => {\n if (messageHistoryIndex.current === messageHistory.length) {\n return;\n }\n if (draft.message !== messageHistory[messageHistoryIndex.current]) {\n messageHistoryIndex.current = messageHistory.length;\n }\n }, [draft.message]);\n\n useEffect(() => {\n messageHistoryIndex.current = messageHistory.length;\n }, [messageHistory]);\n\n // Update last channel switch at\n useEffect(() => {\n lastChannelSwitchAt.current = Date.now();\n }, [channelId]);\n\n return [handleKeyDown, postMsgKeyPress];\n};\n\nexport default useKeyHandler;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function getShouldFocusRHS(state: GlobalState): boolean {\n return state.views.rhs.shouldFocusRHS;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {PureComponent} from 'react';\nimport type {ChangeEvent, DragEvent, MouseEvent, TouchEvent, RefObject} from 'react';\nimport {defineMessages, FormattedMessage, injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport {PaperclipIcon} from '@mattermost/compass-icons/components';\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {FileInfo, FileUploadResponse} from '@mattermost/types/files';\n\nimport type {UploadFile} from 'actions/file_actions';\n\nimport type {FilePreviewInfo} from 'components/file_preview/file_preview';\nimport {\n DropOverlayIdCreateComment,\n DropOverlayIdEditPost,\n DropOverlayIdRHS,\n} from 'components/file_upload_overlay/file_upload_overlay';\nimport KeyboardShortcutSequence, {KEYBOARD_SHORTCUTS} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\nimport Constants from 'utils/constants';\nimport DelayedAction from 'utils/delayed_action';\nimport dragster from 'utils/dragster';\nimport {cmdOrCtrlPressed, isKeyPressed} from 'utils/keyboard';\nimport {hasPlainText, createFileFromClipboardDataItem} from 'utils/paste';\nimport {\n isIosChrome,\n isMobileApp,\n} from 'utils/user_agent';\nimport {\n clearFileInput,\n generateId,\n isFileTransfer,\n isUriDrop,\n localizeMessage,\n isTextDroppableEvent,\n} from 'utils/utils';\n\nimport type {FilesWillUploadHook, PluginComponent} from 'types/store/plugins';\n\nconst holders = defineMessages({\n limited: {\n id: 'file_upload.limited',\n defaultMessage: 'Uploads limited to {count, number} files maximum. Please use additional posts for more files.',\n },\n filesAbove: {\n id: 'file_upload.filesAbove',\n defaultMessage: 'Files above {max}MB could not be uploaded: {filenames}',\n },\n fileAbove: {\n id: 'file_upload.fileAbove',\n defaultMessage: 'File above {max}MB could not be uploaded: {filename}',\n },\n zeroBytesFiles: {\n id: 'file_upload.zeroBytesFiles',\n defaultMessage: 'You are uploading empty files: {filenames}',\n },\n zeroBytesFile: {\n id: 'file_upload.zeroBytesFile',\n defaultMessage: 'You are uploading an empty file: {filename}',\n },\n uploadFile: {\n id: 'file_upload.upload_files',\n defaultMessage: 'Upload files',\n },\n});\n\nconst OVERLAY_TIMEOUT = 500;\n\nconst customStyles = {\n left: 'inherit',\n right: 0,\n bottom: '100%',\n top: 'auto',\n};\n\nexport type TextEditorLocationType = 'post' | 'comment' | 'thread' | 'edit_post';\n\nexport type Props = {\n channelId: string;\n\n /**\n * Current root post's ID\n */\n rootId?: string;\n\n /**\n * Number of files to attach\n */\n fileCount: number;\n\n /**\n * Function to get file upload targeted input\n */\n getTarget: () => HTMLInputElement | null;\n\n intl: IntlShape;\n\n locale: string;\n\n /**\n * Function to be called when file upload input is clicked\n */\n onClick?: () => void;\n\n /**\n * Function to be called when file upload is complete\n */\n onFileUpload: (fileInfos: FileInfo[], clientIds: string[], channelId: string, currentRootId: string) => void;\n\n /**\n * Function to be called when file upload input's change event is fired\n */\n onFileUploadChange: () => void;\n\n /**\n * Function to be called when upload fails\n */\n onUploadError: (err: string | ServerError | null, clientId?: string, channelId?: string, currentRootId?: string) => void;\n\n /**\n * Function to be called when file upload starts\n */\n onUploadStart: (clientIds: string[], channelId: string) => void;\n\n /**\n * Type of the object which the uploaded file is attached to\n */\n postType: TextEditorLocationType;\n\n /**\n * The maximum uploaded file size.\n */\n maxFileSize: number;\n\n /**\n * Whether or not file upload is allowed.\n */\n canUploadFiles: boolean;\n\n /**\n * Plugin file upload methods to be added\n */\n pluginFileUploadMethods: PluginComponent[];\n pluginFilesWillUploadHooks: FilesWillUploadHook[];\n\n /**\n * Function called when xhr fires progress event.\n */\n onUploadProgress: (filePreviewInfo: FilePreviewInfo) => void;\n\n centerChannelPostBeingEdited: boolean;\n rhsPostBeingEdited: boolean;\n\n actions: {\n\n /**\n * Function to be called to upload file\n */\n uploadFile: ({file, name, type, rootId, channelId, clientId, onProgress, onSuccess, onError}: UploadFile) => XMLHttpRequest;\n };\n};\n\ntype State = {\n requests: Record<string, XMLHttpRequest>;\n menuOpen: boolean;\n};\n\nexport class FileUpload extends PureComponent<Props, State> {\n fileInput: RefObject<HTMLInputElement>;\n unbindDragsterEvents?: () => void;\n\n static defaultProps = {\n pluginFileUploadMethods: [],\n pluginFilesWillUploadHooks: [],\n };\n\n constructor(props: Props) {\n super(props);\n this.state = {\n requests: {},\n menuOpen: false,\n };\n this.fileInput = React.createRef();\n }\n\n getDragEventDefinition = () => {\n let containerSelector: string;\n let overlaySelector: string;\n\n switch (this.props.postType) {\n case 'post': {\n containerSelector = this.props.centerChannelPostBeingEdited ? 'form#create_post .AdvancedTextEditor__body' : '.row.main';\n overlaySelector = this.props.centerChannelPostBeingEdited ? '#createPostFileDropOverlay' : '.center-file-overlay';\n break;\n }\n case 'comment': {\n containerSelector = this.props.rhsPostBeingEdited ? '#sidebar-right .post-create__container .AdvancedTextEditor__body' : '.post-right__container';\n overlaySelector = this.props.rhsPostBeingEdited ? '#' + DropOverlayIdCreateComment : '#' + DropOverlayIdRHS;\n break;\n }\n case 'thread': {\n containerSelector = this.props.rhsPostBeingEdited ? '.post-create__container .AdvancedTextEditor__body' : '.ThreadPane';\n overlaySelector = this.props.rhsPostBeingEdited ? '#createPostFileDropOverlay' : '.right-file-overlay';\n break;\n }\n case 'edit_post': {\n containerSelector = '.post--editing';\n overlaySelector = '#' + DropOverlayIdEditPost;\n break;\n }\n }\n\n return {\n containerSelector,\n overlaySelector,\n };\n };\n\n componentDidMount() {\n const {containerSelector, overlaySelector} = this.getDragEventDefinition();\n this.registerDragEvents(containerSelector, overlaySelector);\n\n document.addEventListener('paste', this.pasteUpload);\n document.addEventListener('keydown', this.keyUpload);\n }\n\n componentDidUpdate(prevProps: Readonly<Props>) {\n // when a post starts or finishes being edited, we need to\n // clear existing drag handlers and register fresh ones in the right place.\n if (\n prevProps.centerChannelPostBeingEdited !== this.props.centerChannelPostBeingEdited ||\n prevProps.rhsPostBeingEdited !== this.props.rhsPostBeingEdited\n ) {\n this.unbindDragsterEvents?.();\n const {containerSelector, overlaySelector} = this.getDragEventDefinition();\n this.registerDragEvents(containerSelector, overlaySelector);\n }\n }\n\n componentWillUnmount() {\n document.removeEventListener('paste', this.pasteUpload);\n document.removeEventListener('keydown', this.keyUpload);\n\n this.unbindDragsterEvents?.();\n }\n\n fileUploadSuccess = (data: FileUploadResponse, channelId: string, currentRootId: string) => {\n if (data) {\n this.props.onFileUpload(data.file_infos, data.client_ids, channelId, currentRootId);\n\n const requests = Object.assign({}, this.state.requests);\n for (let j = 0; j < data.client_ids.length; j++) {\n Reflect.deleteProperty(requests, data.client_ids[j]);\n }\n this.setState({requests});\n }\n };\n\n fileUploadFail = (err: string | ServerError, clientId: string, channelId: string, currentRootId: string) => {\n this.props.onUploadError(err, clientId, channelId, currentRootId);\n };\n\n pluginUploadFiles = (files: File[]) => {\n // clear any existing errors\n this.props.onUploadError(null);\n this.uploadFiles(files);\n };\n\n checkPluginHooksAndUploadFiles = (files: FileList | File[]) => {\n // clear any existing errors\n this.props.onUploadError(null);\n\n let sortedFiles = Array.from(files).sort((a, b) => a.name.localeCompare(b.name, this.props.locale, {numeric: true}));\n\n const willUploadHooks = this.props.pluginFilesWillUploadHooks;\n for (const h of willUploadHooks) {\n const result = h.hook?.(sortedFiles, this.pluginUploadFiles);\n\n // Display an error message if there is one but don't reject the upload\n if (result?.message) {\n this.props.onUploadError(result.message);\n }\n\n sortedFiles = result?.files || [];\n }\n\n if (sortedFiles && sortedFiles.length) {\n this.uploadFiles(sortedFiles);\n }\n };\n\n uploadFiles = (sortedFiles: File[]) => {\n const {channelId, rootId} = this.props;\n\n const uploadsRemaining = Constants.MAX_UPLOAD_FILES - this.props.fileCount;\n let numUploads = 0;\n\n // keep track of how many files have been too large\n const tooLargeFiles: File[] = [];\n const zeroFiles: File[] = [];\n const clientIds: string[] = [];\n\n for (let i = 0; i < sortedFiles.length && numUploads < uploadsRemaining; i++) {\n if (sortedFiles[i].size > this.props.maxFileSize) {\n tooLargeFiles.push(sortedFiles[i]);\n continue;\n }\n if (sortedFiles[i].size === 0) {\n zeroFiles.push(sortedFiles[i]);\n }\n\n // generate a unique id that can be used by other components to refer back to this upload\n const clientId = generateId();\n\n const request = this.props.actions.uploadFile({\n file: sortedFiles[i],\n name: sortedFiles[i].name,\n type: sortedFiles[i].type,\n rootId: rootId || '',\n channelId,\n clientId,\n onProgress: this.props.onUploadProgress,\n onSuccess: this.fileUploadSuccess,\n onError: this.fileUploadFail,\n });\n\n this.setState({requests: {...this.state.requests, [clientId]: request}});\n clientIds.push(clientId);\n\n numUploads += 1;\n }\n\n this.props.onUploadStart(clientIds, channelId);\n\n const {formatMessage} = this.props.intl;\n const errors = [];\n if (sortedFiles.length > uploadsRemaining) {\n errors.push(formatMessage(holders.limited, {count: Constants.MAX_UPLOAD_FILES}));\n }\n\n if (tooLargeFiles.length > 1) {\n const tooLargeFilenames = tooLargeFiles.map((file) => file.name).join(', ');\n\n errors.push(formatMessage(holders.filesAbove, {max: (this.props.maxFileSize / 1048576), filenames: tooLargeFilenames}));\n } else if (tooLargeFiles.length > 0) {\n errors.push(formatMessage(holders.fileAbove, {max: (this.props.maxFileSize / 1048576), filename: tooLargeFiles[0].name}));\n }\n\n if (zeroFiles.length > 1) {\n const zeroFilenames = zeroFiles.map((file) => file.name).join(', ');\n\n errors.push(formatMessage(holders.zeroBytesFiles, {filenames: zeroFilenames}));\n } else if (zeroFiles.length > 0) {\n errors.push(formatMessage(holders.zeroBytesFile, {filename: zeroFiles[0].name}));\n }\n\n if (errors.length > 0) {\n this.props.onUploadError(errors.join(', '));\n }\n };\n\n handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n this.checkPluginHooksAndUploadFiles(e.target.files);\n\n clearFileInput(e.target);\n }\n\n this.props.onFileUploadChange();\n };\n\n handleDrop = (e: DragEvent<HTMLInputElement>) => {\n if (!this.props.canUploadFiles) {\n this.props.onUploadError(localizeMessage({id: 'file_upload.disabled', defaultMessage: 'File attachments are disabled.'}));\n return;\n }\n\n this.props.onUploadError(null);\n\n const items = e.dataTransfer.items || [];\n const droppedFiles = e.dataTransfer.files;\n const files: File[] = [];\n Array.from(droppedFiles).forEach((file, index) => {\n const item = items[index];\n if (item && item.webkitGetAsEntry && (item.webkitGetAsEntry() === null || (item.webkitGetAsEntry() as FileSystemEntry).isDirectory)) {\n return;\n }\n files.push(file);\n });\n\n const types = e.dataTransfer.types;\n if (types) {\n if (isUriDrop(e.dataTransfer)) {\n return;\n }\n\n // For non-IE browsers\n if (types.includes && !types.includes('Files')) {\n return;\n }\n }\n\n if (files.length === 0) {\n this.props.onUploadError(localizeMessage({id: 'file_upload.drag_folder', defaultMessage: 'This attachment cannot be uploaded.'}));\n return;\n }\n\n if (files.length) {\n this.checkPluginHooksAndUploadFiles(files);\n }\n\n this.props.onFileUploadChange();\n };\n\n registerDragEvents = (containerSelector: string, overlaySelector: string) => {\n let overlay = document.querySelector(overlaySelector);\n\n const dragTimeout = new DelayedAction(() => {\n overlay?.classList.add('hidden');\n });\n\n const enter = (e: CustomEvent) => {\n // this null check is to deal with the race condition between rendering the post edit advanced text editor\n // and this hook querying the same in DOM to register event handler on it.\n if (!overlay) {\n overlay = document.querySelector(overlaySelector);\n }\n\n const files = e.detail.dataTransfer;\n if (!isUriDrop(files) && isFileTransfer(files)) {\n overlay?.classList.remove('hidden');\n }\n e.detail.preventDefault();\n };\n\n const leave = (e: CustomEvent) => {\n const files = e.detail.dataTransfer;\n\n if (!isUriDrop(files) && isFileTransfer(files)) {\n overlay?.classList.add('hidden');\n }\n\n dragTimeout.cancel();\n\n e.detail.preventDefault();\n };\n\n const over = (e: CustomEvent) => {\n dragTimeout.fireAfter(OVERLAY_TIMEOUT);\n if (!isTextDroppableEvent(e.detail)) {\n e.detail.preventDefault();\n }\n };\n const dropWithHiddenClass = (e: CustomEvent) => {\n overlay?.classList.add('hidden');\n dragTimeout.cancel();\n\n this.handleDrop(e.detail);\n\n if (!isTextDroppableEvent(e.detail)) {\n e.detail.preventDefault();\n }\n };\n\n const drop = (e: CustomEvent) => {\n this.handleDrop(e.detail);\n\n if (!isTextDroppableEvent(e.detail)) {\n e.detail.preventDefault();\n }\n };\n\n const noop = () => {};\n\n let dragsterActions = {};\n if (this.props.canUploadFiles) {\n dragsterActions = {\n enter,\n leave,\n over,\n drop: dropWithHiddenClass,\n };\n } else {\n dragsterActions = {\n enter: noop,\n leave: noop,\n over: noop,\n drop,\n };\n }\n\n this.unbindDragsterEvents = dragster(containerSelector, dragsterActions);\n };\n\n containsEventTarget = (targetElement: HTMLInputElement | null, eventTarget: EventTarget | null) => targetElement && targetElement.contains(eventTarget as Node);\n\n /**\n * This paste handler sole responsibility is to detect if the clipboard data contains \"files\" and pass them to the upload file handler.\n */\n pasteUpload = (e: ClipboardEvent) => {\n // If the clipboard data doesn't contain anything or it contains plain text, do nothing and let the browser and other handlers do their thing.\n if (!e.clipboardData || !e.clipboardData.items || hasPlainText(e.clipboardData)) {\n return;\n }\n\n const textarea = this.props.getTarget();\n if (!this.containsEventTarget(textarea, e.target)) {\n return;\n }\n\n this.props.onUploadError(null);\n\n const fileClipboardItems = Array.\n from(e.clipboardData.items).\n filter((item) => item.kind === 'file');\n\n if (fileClipboardItems.length > 0) {\n if (!this.props.canUploadFiles) {\n this.props.onUploadError(this.props.intl.formatMessage({id: 'file_upload.disabled', defaultMessage: 'File attachments are disabled.'}));\n return;\n }\n\n const fileNamePrefixIfNoName = this.props.intl.formatMessage({id: 'file_upload.pasted', defaultMessage: 'Image Pasted at '});\n\n const fileList = fileClipboardItems.\n map((fileClipboardItem) => createFileFromClipboardDataItem(fileClipboardItem, fileNamePrefixIfNoName)).\n filter((file): file is NonNullable<typeof file> => file !== null);\n\n if (fileList.length > 0) {\n // Prevent default will stop event propagation to other handlers such as those in advanced text editor\n // so we do that here because we want to only paste the files from the clipboard and not other content.\n e.preventDefault();\n\n this.checkPluginHooksAndUploadFiles(fileList);\n this.props.onFileUploadChange();\n }\n }\n };\n\n keyUpload = (e: KeyboardEvent) => {\n if (cmdOrCtrlPressed(e) && !e.shiftKey && isKeyPressed(e, Constants.KeyCodes.U)) {\n e.preventDefault();\n\n if (!this.props.canUploadFiles) {\n this.props.onUploadError(localizeMessage({id: 'file_upload.disabled', defaultMessage: 'File attachments are disabled.'}));\n return;\n }\n const postTextbox = this.props.postType === 'post' && document.activeElement?.id === 'post_textbox';\n const commentTextbox = this.props.postType === 'comment' && document.activeElement?.id === 'reply_textbox';\n const threadTextbox = this.props.postType === 'thread' && document.activeElement?.id === 'reply_textbox';\n if (postTextbox || commentTextbox || threadTextbox) {\n this.fileInput.current?.focus();\n this.fileInput.current?.click();\n }\n }\n };\n\n cancelUpload = (clientId: string) => {\n const requests = Object.assign({}, this.state.requests);\n const request = requests[clientId];\n\n if (request) {\n request.abort();\n\n Reflect.deleteProperty(requests, clientId);\n this.setState({requests});\n }\n };\n\n handleMaxUploadReached = (e: MouseEvent<HTMLInputElement>) => {\n if (e) {\n e.preventDefault();\n }\n\n const {onUploadError} = this.props;\n const {formatMessage} = this.props.intl;\n\n onUploadError(formatMessage(holders.limited, {count: Constants.MAX_UPLOAD_FILES}));\n };\n\n handleLocalFileUploaded = (e: MouseEvent<HTMLInputElement>) => {\n const uploadsRemaining = Constants.MAX_UPLOAD_FILES - this.props.fileCount;\n if (uploadsRemaining > 0) {\n if (this.props.onClick) {\n this.props.onClick();\n }\n } else {\n this.handleMaxUploadReached(e);\n }\n this.setState({menuOpen: false});\n };\n\n simulateInputClick = (e: MouseEvent<HTMLButtonElement | HTMLAnchorElement> | TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n this.fileInput.current?.click();\n };\n\n render() {\n const {formatMessage} = this.props.intl;\n let multiple = true;\n if (isMobileApp()) {\n // iOS WebViews don't upload videos properly in multiple mode\n multiple = false;\n }\n\n let accept = '';\n if (isIosChrome()) {\n // iOS Chrome can't upload videos at all\n accept = 'image/*';\n }\n\n const uploadsRemaining = Constants.MAX_UPLOAD_FILES - this.props.fileCount;\n\n let bodyAction;\n const buttonAriaLabel = formatMessage({id: 'accessibility.button.attachment', defaultMessage: 'attachment'});\n const iconAriaLabel = formatMessage({id: 'generic_icons.attach', defaultMessage: 'Attachment Icon'});\n\n if (this.props.pluginFileUploadMethods.length === 0) {\n bodyAction = (\n <div>\n <WithTooltip\n title={\n <KeyboardShortcutSequence\n shortcut={KEYBOARD_SHORTCUTS.filesUpload}\n hoistDescription={true}\n isInsideTooltip={true}\n />\n }\n >\n <button\n type='button'\n id='fileUploadButton'\n aria-label={buttonAriaLabel}\n className={classNames('style--none AdvancedTextEditor__action-button', {\n disabled: uploadsRemaining <= 0,\n })}\n onClick={this.simulateInputClick}\n onTouchEnd={this.simulateInputClick}\n >\n <PaperclipIcon\n size={18}\n color={'currentColor'}\n aria-label={iconAriaLabel}\n />\n </button>\n </WithTooltip>\n <input\n id='fileUploadInput'\n tabIndex={-1}\n aria-label={formatMessage(holders.uploadFile)}\n ref={this.fileInput}\n type='file'\n onChange={this.handleChange}\n onClick={this.handleLocalFileUploaded}\n multiple={multiple}\n accept={accept}\n />\n </div>\n );\n } else {\n const pluginFileUploadMethods = this.props.pluginFileUploadMethods.map((item) => {\n return (\n <li\n key={item.pluginId + '_fileuploadpluginmenuitem'}\n onClick={() => {\n if (item.action) {\n item.action(this.checkPluginHooksAndUploadFiles);\n }\n this.setState({menuOpen: false});\n }}\n >\n <a href='#'>\n <span className='mr-2'>\n {item.icon}\n </span>\n {item.text}\n </a>\n </li>\n );\n });\n bodyAction = (\n <div>\n <input\n tabIndex={-1}\n aria-label={formatMessage(holders.uploadFile)}\n ref={this.fileInput}\n type='file'\n className='file-attachment-menu-item-input'\n onChange={this.handleChange}\n onClick={this.handleLocalFileUploaded}\n multiple={multiple}\n accept={accept}\n />\n <MenuWrapper>\n <WithTooltip\n title={\n <KeyboardShortcutSequence\n shortcut={KEYBOARD_SHORTCUTS.filesUpload}\n hoistDescription={true}\n isInsideTooltip={true}\n />\n }\n >\n <button\n type='button'\n id='fileUploadButton'\n aria-label={buttonAriaLabel}\n className='style--none AdvancedTextEditor__action-button'\n >\n <PaperclipIcon\n size={18}\n color={'currentColor'}\n aria-label={iconAriaLabel}\n />\n </button>\n </WithTooltip>\n <Menu\n id='fileUploadOptions'\n openLeft={true}\n openUp={true}\n ariaLabel={formatMessage({id: 'file_upload.menuAriaLabel', defaultMessage: 'Upload type selector'})}\n customStyles={customStyles}\n >\n <li>\n <a\n href='#'\n onClick={this.simulateInputClick}\n onTouchEnd={this.simulateInputClick}\n >\n <span className='mr-2'>\n <i className='fa fa-laptop'/>\n </span>\n <FormattedMessage\n id='yourcomputer'\n defaultMessage='Your computer'\n />\n </a>\n </li>\n {pluginFileUploadMethods}\n </Menu>\n </MenuWrapper>\n </div>\n );\n }\n\n if (!this.props.canUploadFiles) {\n return null;\n }\n\n return (\n <div className={uploadsRemaining <= 0 ? ' style--none btn-file__disabled' : 'style--none'}>\n {bodyAction}\n </div>\n );\n }\n}\n\nconst wrappedComponent = injectIntl(FileUpload, {forwardRef: true});\nwrappedComponent.displayName = 'injectIntl(FileUpload)';\nexport default wrappedComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\ntype Options = {\n enter?: (event: CustomEvent) => void;\n leave?: (event: CustomEvent) => void;\n over?: (event: CustomEvent) => void;\n drop?: (event: CustomEvent) => void;\n}\n\nexport default function dragster(query: string, options: Options) {\n const preventDefault = (e: Event) => {\n e.preventDefault();\n };\n\n const defaults = {\n enter: preventDefault,\n leave: preventDefault,\n over: preventDefault,\n drop: preventDefault,\n };\n\n const settings = Object.assign(defaults, options);\n const node = document.querySelector(query);\n\n if (!node) {\n return () => {};\n }\n\n let first = false;\n let second = false;\n\n const dragenter = (event: Event) => {\n if (first) {\n second = true;\n return;\n }\n\n first = true;\n const enterEvent = new CustomEvent('dragster:enter', {detail: event});\n node.dispatchEvent(enterEvent);\n };\n\n const dragleave = (event: Event) => {\n if (second) {\n second = false;\n } else if (first) {\n first = false;\n }\n if (!first && !second) {\n const leaveEvent = new CustomEvent('dragster:leave', {detail: event});\n node.dispatchEvent(leaveEvent);\n }\n };\n\n const dragover = (event: Event) => {\n const overEvent = new CustomEvent('dragster:over', {detail: event});\n node.dispatchEvent(overEvent);\n };\n\n const drop = (event: Event) => {\n if (second) {\n second = false;\n } else if (first) {\n first = false;\n }\n if (!first && !second) {\n const dropEvent = new CustomEvent('dragster:drop', {detail: event});\n node.dispatchEvent(dropEvent);\n }\n };\n\n node.addEventListener('dragenter', dragenter);\n node.addEventListener('dragleave', dragleave);\n node.addEventListener('dragover', dragover);\n node.addEventListener('drop', drop);\n\n node.addEventListener('dragster:enter', settings.enter);\n node.addEventListener('dragster:leave', settings.leave);\n node.addEventListener('dragster:over', settings.over);\n node.addEventListener('dragster:drop', settings.drop);\n\n const unbindEvents = () => {\n node.removeEventListener('dragenter', dragenter);\n node.removeEventListener('dragleave', dragleave);\n node.removeEventListener('dragover', dragover);\n node.removeEventListener('drop', drop);\n\n node.removeEventListener('dragster:enter', settings.enter);\n node.removeEventListener('dragster:leave', settings.leave);\n node.removeEventListener('dragster:over', settings.over);\n node.removeEventListener('dragster:drop', settings.drop);\n };\n\n return unbindEvents;\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {uploadFile} from 'actions/file_actions';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {getEditingPostDetailsAndPost} from 'selectors/posts';\n\nimport {canUploadFiles} from 'utils/file_utils';\n\nimport type {GlobalState} from 'types/store';\nimport type {FilesWillUploadHook} from 'types/store/plugins';\n\nimport FileUpload from './file_upload';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const maxFileSize = parseInt(config.MaxFileSize || '', 10);\n\n const editingPost = getEditingPostDetailsAndPost(state);\n const centerChannelPostBeingEdited = editingPost.show && !editingPost.isRHS;\n const rhsPostBeingEdited = editingPost.show && editingPost.isRHS;\n\n return {\n maxFileSize,\n canUploadFiles: canUploadFiles(config),\n locale: getCurrentLocale(state),\n pluginFileUploadMethods: state.plugins.components.FileUploadMethod,\n pluginFilesWillUploadHooks: state.plugins.components.FilesWillUploadHook as unknown as FilesWillUploadHook[],\n centerChannelPostBeingEdited,\n rhsPostBeingEdited,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n uploadFile,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps, null, {forwardRef: true})(FileUpload);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useRef, useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {sortFileInfos} from 'mattermost-redux/utils/file_utils';\n\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport FilePreview from 'components/file_preview';\nimport type {FilePreviewInfo} from 'components/file_preview/file_preview';\nimport FileUpload from 'components/file_upload';\nimport type {FileUpload as FileUploadClass, TextEditorLocationType} from 'components/file_upload/file_upload';\nimport type TextboxClass from 'components/textbox/textbox';\n\nimport type {PostDraft} from 'types/store/draft';\n\nconst getFileCount = (draft: PostDraft) => {\n return draft.fileInfos.length + draft.uploadsInProgress.length;\n};\n\nconst useUploadFiles = (\n draft: PostDraft,\n postId: string,\n channelId: string,\n isThreadView: boolean,\n storedDrafts: React.MutableRefObject<Record<string, PostDraft | undefined>>,\n isDisabled: boolean,\n textboxRef: React.RefObject<TextboxClass>,\n handleDraftChange: (draft: PostDraft, options?: {instant?: boolean; show?: boolean}) => void,\n focusTextbox: (forceFocust?: boolean) => void,\n setServerError: (err: (ServerError & { submittedMessage?: string }) | null) => void,\n isPostBeingEdited?: boolean,\n): [React.ReactNode, React.ReactNode] => {\n const locale = useSelector(getCurrentLocale);\n\n const [uploadsProgressPercent, setUploadsProgressPercent] = useState<{ [clientID: string]: FilePreviewInfo }>({});\n\n const fileUploadRef = useRef<FileUploadClass>(null);\n\n const handleFileUploadChange = useCallback(() => {\n focusTextbox();\n }, [focusTextbox]);\n\n const getFileUploadTarget = useCallback(() => {\n return textboxRef.current?.getInputBox();\n }, [textboxRef]);\n\n const handleUploadProgress = useCallback((filePreviewInfo: FilePreviewInfo) => {\n setUploadsProgressPercent((prev) => ({\n ...prev,\n [filePreviewInfo.clientId]: filePreviewInfo,\n }));\n }, []);\n\n const handleFileUploadComplete = useCallback((fileInfos: FileInfo[], clientIds: string[], channelId: string, rootId?: string) => {\n const key = rootId || channelId;\n const draftToUpdate = storedDrafts.current[key];\n if (!draftToUpdate) {\n return;\n }\n\n const newFileInfos = sortFileInfos([...draftToUpdate.fileInfos || [], ...fileInfos], locale);\n\n const clientIdsSet = new Set(clientIds);\n const uploadsInProgress = (draftToUpdate.uploadsInProgress || []).filter((v) => !clientIdsSet.has(v));\n\n const modifiedDraft = {\n ...draftToUpdate,\n fileInfos: newFileInfos,\n uploadsInProgress,\n };\n\n handleDraftChange(modifiedDraft, {instant: true});\n }, [locale, handleDraftChange, storedDrafts]);\n\n const handleUploadStart = useCallback((clientIds: string[]) => {\n const uploadsInProgress = [...draft.uploadsInProgress, ...clientIds];\n\n const updatedDraft = {\n ...draft,\n uploadsInProgress,\n };\n\n handleDraftChange(updatedDraft, {instant: true});\n\n focusTextbox();\n }, [draft, handleDraftChange, focusTextbox]);\n\n const handleUploadError = useCallback((uploadError: string | ServerError | null, clientId?: string, channelId = '', rootId = '') => {\n if (clientId) {\n const id = rootId || channelId;\n const storedDraft = storedDrafts.current[id];\n if (storedDraft) {\n const modifiedDraft = {...storedDraft};\n const index = modifiedDraft.uploadsInProgress.indexOf(clientId) ?? -1;\n if (index !== -1) {\n modifiedDraft.uploadsInProgress = [...modifiedDraft.uploadsInProgress];\n modifiedDraft.uploadsInProgress.splice(index, 1);\n handleDraftChange(modifiedDraft, {instant: true});\n }\n }\n }\n\n if (typeof uploadError === 'string') {\n if (uploadError) {\n setServerError(new Error(uploadError));\n }\n } else {\n setServerError(uploadError);\n }\n }, [handleDraftChange, setServerError, storedDrafts]);\n\n const removePreview = useCallback((clientId: string) => {\n handleUploadError(null, clientId, draft.channelId, draft.rootId);\n\n const modifiedDraft = {...draft};\n let index = draft.fileInfos.findIndex((info) => info.id === clientId);\n if (index === -1) {\n index = draft.uploadsInProgress.indexOf(clientId);\n\n if (index >= 0) {\n modifiedDraft.uploadsInProgress = [...draft.uploadsInProgress];\n modifiedDraft.uploadsInProgress.splice(index, 1);\n\n fileUploadRef.current?.cancelUpload(clientId);\n } else {\n // No modification\n return;\n }\n } else {\n modifiedDraft.fileInfos = [...draft.fileInfos];\n modifiedDraft.fileInfos.splice(index, 1);\n }\n\n handleDraftChange(modifiedDraft, {instant: true});\n handleFileUploadChange();\n }, [draft, fileUploadRef, handleDraftChange, handleUploadError, handleFileUploadChange]);\n\n let attachmentPreview = null;\n if (!isDisabled && (draft.fileInfos.length > 0 || draft.uploadsInProgress.length > 0)) {\n attachmentPreview = (\n <FilePreview\n fileInfos={draft.fileInfos}\n onRemove={removePreview}\n uploadsInProgress={draft.uploadsInProgress}\n uploadsProgressPercent={uploadsProgressPercent}\n />\n );\n }\n\n let postType: TextEditorLocationType = 'post';\n if (isPostBeingEdited) {\n postType = 'edit_post';\n } else if (postId) {\n postType = isThreadView ? 'thread' : 'comment';\n }\n\n const fileUploadJSX = isDisabled ? null : (\n <FileUpload\n ref={fileUploadRef}\n fileCount={getFileCount(draft)}\n getTarget={getFileUploadTarget}\n onFileUploadChange={handleFileUploadChange}\n onUploadStart={handleUploadStart}\n onFileUpload={handleFileUploadComplete}\n onUploadError={handleUploadError}\n onUploadProgress={handleUploadProgress}\n rootId={postId}\n channelId={channelId}\n postType={postType}\n />\n );\n\n return [attachmentPreview, fileUploadJSX];\n};\n\nexport default useUploadFiles;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {lazy, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {SchedulingInfo} from '@mattermost/types/schedule_post';\n\nimport {FileTypes} from 'mattermost-redux/action_types';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getChannel, makeGetChannel, getDirectChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getFilesIdsForPost} from 'mattermost-redux/selectors/entities/files';\nimport {getConfig, getFeatureFlagValue} from 'mattermost-redux/selectors/entities/general';\nimport {get, getBool, getInt} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentUserId, isCurrentUserGuestUser, getStatusForUserId, makeGetDisplayName} from 'mattermost-redux/selectors/entities/users';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport {actionOnGlobalItemsWithPrefix} from 'actions/storage';\nimport type {SubmitPostReturnType} from 'actions/views/create_comment';\nimport {removeDraft, updateDraft} from 'actions/views/drafts';\nimport {openModal} from 'actions/views/modals';\nimport {makeGetDraft} from 'selectors/drafts';\nimport {getSelectedPostFocussedAt} from 'selectors/rhs';\nimport {connectionErrorCount} from 'selectors/views/system';\nimport LocalStorageStore from 'stores/local_storage_store';\n\nimport PostBoxIndicator from 'components/advanced_text_editor/post_box_indicator/post_box_indicator';\nimport {makeAsyncComponent} from 'components/async_load';\nimport AutoHeightSwitcher from 'components/common/auto_height_switcher';\nimport useDidUpdate from 'components/common/hooks/useDidUpdate';\nimport DeletePostModal from 'components/delete_post_modal';\nimport {\n DropOverlayIdCreateComment,\n DropOverlayIdCreatePost,\n DropOverlayIdEditPost, FileUploadOverlay,\n} from 'components/file_upload_overlay/file_upload_overlay';\nimport RhsSuggestionList from 'components/suggestion/rhs_suggestion_list';\nimport SuggestionList from 'components/suggestion/suggestion_list';\nimport Textbox from 'components/textbox';\nimport type {TextboxElement} from 'components/textbox';\nimport type TextboxClass from 'components/textbox/textbox';\nimport {OnboardingTourSteps, OnboardingTourStepsForGuestUsers, TutorialTourName} from 'components/tours/constant';\nimport {SendMessageTour} from 'components/tours/onboarding_tour';\n\nimport Constants, {\n Locations,\n StoragePrefixes,\n Preferences,\n AdvancedTextEditor as AdvancedTextEditorConst,\n UserStatuses,\n ModalIdentifiers,\n} from 'utils/constants';\nimport {canUploadFiles as canUploadFilesAccordingToConfig} from 'utils/file_utils';\nimport type {ApplyMarkdownOptions} from 'utils/markdown/apply_markdown';\nimport {applyMarkdown as applyMarkdownUtil} from 'utils/markdown/apply_markdown';\nimport {isErrorInvalidSlashCommand} from 'utils/post_utils';\nimport {allAtMentions} from 'utils/text_formatting';\nimport * as Utils from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\nimport type {PostDraft} from 'types/store/draft';\nimport {isPostDraftEmpty} from 'types/store/draft';\n\nimport DoNotDisturbWarning from './do_not_disturb_warning';\nimport EditPostFooter from './edit_post_footer';\nimport Footer from './footer';\nimport FormattingBar from './formatting_bar';\nimport {FormattingBarSpacer, Separator} from './formatting_bar/formatting_bar';\nimport MessageWithMentionsFooter from './message_with_mentions_footer';\nimport SendButton from './send_button';\nimport ShowFormat from './show_formatting';\nimport TexteditorActions from './texteditor_actions';\nimport ToggleFormattingBar from './toggle_formatting_bar';\nimport useEmojiPicker from './use_emoji_picker';\nimport useKeyHandler from './use_key_handler';\nimport useOrientationHandler from './use_orientation_handler';\nimport usePluginItems from './use_plugin_items';\nimport usePriority from './use_priority';\nimport useSubmit from './use_submit';\nimport useTextboxFocus from './use_textbox_focus';\nimport useUploadFiles from './use_upload_files';\n\nimport './advanced_text_editor.scss';\n\nconst FileLimitStickyBanner = makeAsyncComponent('FileLimitStickyBanner', lazy(() => import('components/file_limit_sticky_banner')));\n\nexport type Props = {\n\n /**\n * location of the advanced text editor in the UI (center channel / RHS)\n */\n location: string;\n channelId: string;\n postId: string;\n isThreadView?: boolean;\n placeholder?: string;\n isInEditMode?: boolean;\n\n /**\n * Key to store the draft in the storage\n * If not provided, draft key will be computed based on the post\n */\n storageKey?: string;\n\n /**\n * Used by plugins to act after the post is made\n */\n afterSubmit?: (response: SubmitPostReturnType) => void;\n}\n\nconst AdvancedTextEditor = ({\n location,\n channelId,\n postId,\n isThreadView = false,\n placeholder,\n isInEditMode = false,\n afterSubmit,\n storageKey,\n}: Props) => {\n const {formatMessage} = useIntl();\n\n const dispatch = useDispatch();\n\n const getChannelSelector = useMemo(makeGetChannel, []);\n const getDraftSelector = useMemo(makeGetDraft, []);\n const getDisplayName = useMemo(makeGetDisplayName, []);\n\n const isRHS = Boolean(postId && !isThreadView);\n\n const getFormattingBarPreferenceName = () => {\n let name: string;\n if (isRHS) {\n name = isInEditMode ? AdvancedTextEditorConst.EDIT : AdvancedTextEditorConst.COMMENT;\n } else {\n name = AdvancedTextEditorConst.POST;\n }\n\n return name;\n };\n\n const currentUserId = useSelector(getCurrentUserId);\n const channel = useSelector((state: GlobalState) => getChannelSelector(state, channelId));\n const channelDisplayName = channel?.display_name || '';\n const channelType = channel?.type || '';\n const isChannelShared = channel?.shared;\n const draftFromStore = useSelector((state: GlobalState) => getDraftSelector(state, channelId, postId, storageKey));\n const badConnection = useSelector((state: GlobalState) => connectionErrorCount(state) > 1);\n const maxPostSize = useSelector((state: GlobalState) => parseInt(getConfig(state).MaxPostSize || '', 10) || Constants.DEFAULT_CHARACTER_LIMIT);\n const canUploadFiles = useSelector((state: GlobalState) => canUploadFilesAccordingToConfig(getConfig(state)));\n const fullWidthTextBox = useSelector((state: GlobalState) => get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN);\n const isFormattingBarHidden = useSelector((state: GlobalState) => {\n const preferenceName = getFormattingBarPreferenceName();\n return getBool(state, Preferences.ADVANCED_TEXT_EDITOR, preferenceName);\n });\n const teammateId = useSelector((state: GlobalState) => getDirectChannel(state, channelId)?.teammate_id || '');\n const teammateDisplayName = useSelector((state: GlobalState) => (teammateId ? getDisplayName(state, teammateId) : ''));\n const showDndWarning = useSelector((state: GlobalState) => (teammateId ? getStatusForUserId(state, teammateId) === UserStatuses.DND : false));\n const selectedPostFocussedAt = useSelector((state: GlobalState) => getSelectedPostFocussedAt(state));\n\n const canPost = useSelector((state: GlobalState) => {\n const channel = getChannel(state, channelId);\n return channel ? haveIChannelPermission(state, channel.team_id, channel.id, Permissions.CREATE_POST) : false;\n });\n const useChannelMentions = useSelector((state: GlobalState) => {\n const channel = getChannel(state, channelId);\n return channel ? haveIChannelPermission(state, channel.team_id, channel.id, Permissions.USE_CHANNEL_MENTIONS) : false;\n });\n const showSendTutorialTip = useSelector((state: GlobalState) => {\n // We don't show the tutorial tip neither on RHS nor Thread view\n if (postId) {\n return false;\n }\n const config = getConfig(state);\n const enableTutorial = config.EnableTutorial === 'true';\n\n const tutorialStep = getInt(state, TutorialTourName.ONBOARDING_TUTORIAL_STEP, currentUserId, 0);\n\n // guest validation to see which point the messaging tour tip starts\n const isGuestUser = isCurrentUserGuestUser(state);\n const tourStep = isGuestUser ? OnboardingTourStepsForGuestUsers.SEND_MESSAGE : OnboardingTourSteps.SEND_MESSAGE;\n\n return enableTutorial && (tutorialStep === tourStep);\n });\n const postFileIds = useSelector((state: GlobalState) => getFilesIdsForPost(state, postId));\n\n const editorActionsRef = useRef<HTMLDivElement>(null);\n const editorBodyRef = useRef<HTMLDivElement>(null);\n const textboxRef = useRef<TextboxClass>(null);\n const loggedInAriaLabelTimeout = useRef<NodeJS.Timeout>();\n const saveDraftFrame = useRef<NodeJS.Timeout>();\n const draftRef = useRef(draftFromStore);\n const storedDrafts = useRef<Record<string, PostDraft | undefined>>({});\n const lastBlurAt = useRef(0);\n\n const [draft, setDraft] = useState(draftFromStore);\n const [caretPosition, setCaretPosition] = useState(draft.message.length);\n const [serverError, setServerError] = useState<(ServerError & { submittedMessage?: string }) | null>(null);\n const [postError, setPostError] = useState<React.ReactNode>(null);\n const [showPreview, setShowPreview] = useState(false);\n const [isMessageLong, setIsMessageLong] = useState(false);\n const [renderScrollbar, setRenderScrollbar] = useState(false);\n const [keepEditorInFocus, setKeepEditorInFocus] = useState(false);\n\n const readOnlyChannel = !canPost;\n const hasDraftMessage = Boolean(draft.message);\n const showFormattingBar = !isFormattingBarHidden && !readOnlyChannel;\n const enableSharedChannelsDMs = useSelector((state: GlobalState) => getFeatureFlagValue(state, 'EnableSharedChannelsDMs') === 'true');\n const isDMOrGMRemote = isChannelShared && (channelType === Constants.DM_CHANNEL || channelType === Constants.GM_CHANNEL);\n const isDisabled = Boolean(readOnlyChannel || (!enableSharedChannelsDMs && isDMOrGMRemote));\n\n const handleShowPreview = useCallback(() => {\n setShowPreview((prev) => !prev);\n }, []);\n\n const emitTypingEvent = useCallback(() => {\n GlobalActions.emitLocalUserTypingEvent(channelId, postId);\n }, [channelId, postId]);\n\n const handleDraftChange = useCallback((draftToChange: PostDraft, options: {instant?: boolean; show?: boolean} = {instant: false, show: false}) => {\n if (saveDraftFrame.current) {\n clearTimeout(saveDraftFrame.current);\n }\n\n setDraft(draftToChange);\n\n const saveDraft = () => {\n let prefix = StoragePrefixes.DRAFT;\n let suffix = draftToChange.channelId;\n if (draftToChange.rootId) {\n prefix = StoragePrefixes.COMMENT_DRAFT;\n suffix = draftToChange.rootId;\n }\n const key = storageKey || `${prefix}${suffix}`;\n\n if (isPostDraftEmpty(draftToChange)) {\n dispatch(removeDraft(key, draftToChange.channelId, draftToChange.rootId));\n return;\n }\n\n if (options.show) {\n dispatch(updateDraft(key, {...draftToChange, show: true}, draftToChange.rootId, true));\n return;\n }\n\n dispatch(updateDraft(key, draftToChange, draftToChange.rootId));\n };\n\n if (options.instant) {\n saveDraft();\n } else {\n saveDraftFrame.current = setTimeout(() => {\n saveDraft();\n }, Constants.SAVE_DRAFT_TIMEOUT);\n }\n\n storedDrafts.current[draftToChange.rootId || draftToChange.channelId] = draftToChange;\n }, [dispatch]);\n\n const applyMarkdown = useCallback((params: ApplyMarkdownOptions) => {\n if (showPreview) {\n return;\n }\n\n const res = applyMarkdownUtil(params);\n\n handleDraftChange({\n ...draft,\n message: res.message,\n });\n\n setTimeout(() => {\n const textbox = textboxRef.current?.getInputBox();\n Utils.setSelectionRange(textbox, res.selectionStart, res.selectionEnd);\n });\n }, [showPreview, handleDraftChange, draft]);\n\n const toggleAdvanceTextEditor = useCallback(() => {\n dispatch(savePreferences(currentUserId, [{\n category: Preferences.ADVANCED_TEXT_EDITOR,\n user_id: currentUserId,\n\n // name: isRHS ? AdvancedTextEditorConst.COMMENT : AdvancedTextEditorConst.POST,\n name: getFormattingBarPreferenceName(),\n value: String(!isFormattingBarHidden),\n }]));\n }, [dispatch, currentUserId, getFormattingBarPreferenceName, isFormattingBarHidden]);\n\n useOrientationHandler(textboxRef, postId);\n const pluginItems = usePluginItems(draft, textboxRef, handleDraftChange);\n const focusTextbox = useTextboxFocus(textboxRef, channelId, isRHS, canPost);\n const [attachmentPreview, fileUploadJSX] = useUploadFiles(\n draft,\n postId,\n channelId,\n isThreadView,\n storedDrafts,\n isDisabled,\n textboxRef,\n handleDraftChange,\n focusTextbox,\n setServerError,\n isInEditMode,\n );\n\n const emojiPickerOffset = isInEditMode ? {right: 40} : undefined;\n const {\n emojiPicker,\n enableEmojiPicker,\n toggleEmojiPicker,\n } = useEmojiPicker(isDisabled, draft, caretPosition, setCaretPosition, handleDraftChange, showPreview, focusTextbox, emojiPickerOffset);\n const {\n labels: priorityLabels,\n additionalControl: priorityAdditionalControl,\n isValidPersistentNotifications,\n onSubmitCheck: prioritySubmitCheck,\n } = usePriority(draft, handleDraftChange, focusTextbox, showPreview);\n const [handleSubmit, errorClass] = useSubmit(\n draft,\n postError,\n channelId,\n postId,\n serverError,\n lastBlurAt,\n focusTextbox,\n setServerError,\n setShowPreview,\n handleDraftChange,\n prioritySubmitCheck,\n undefined,\n afterSubmit,\n undefined,\n isInEditMode,\n );\n\n const handleCancel = useCallback(() => {\n handleDraftChange({\n message: '',\n fileInfos: [],\n uploadsInProgress: [],\n createAt: 0,\n updateAt: 0,\n channelId,\n rootId: postId,\n metadata: {},\n });\n }, [handleDraftChange, channelId, postId]);\n\n const handleFileChangesOnSave = useCallback((draft: PostDraft) => {\n // sets the updated data for file IDs by post ID part\n dispatch({\n type: FileTypes.RECEIVED_FILES_FOR_POST,\n data: draft.fileInfos,\n postId,\n });\n\n // removes the data for the deleted files from store\n const deletedFileIds = postFileIds.filter((id: string) => !draft.fileInfos.find((file) => file.id === id));\n if (deletedFileIds) {\n dispatch({\n type: FileTypes.REMOVED_FILE,\n data: {\n fileIds: deletedFileIds,\n },\n });\n }\n }, [dispatch, postFileIds, postId]);\n\n const handleSubmitWrapper = useCallback(() => {\n const isEmptyPost = isPostDraftEmpty(draft);\n\n if (isInEditMode && isEmptyPost) {\n const deletePostModalData = {\n modalId: ModalIdentifiers.DELETE_POST,\n dialogType: DeletePostModal,\n dialogProps: {\n post: draft,\n isRHS,\n },\n };\n\n dispatch(openModal(deletePostModalData));\n return;\n }\n\n if (isInEditMode) {\n handleFileChangesOnSave(draft);\n }\n\n handleSubmit();\n }, [dispatch, draft, handleFileChangesOnSave, handleSubmit, isInEditMode, isRHS]);\n\n const [handleKeyDown, postMsgKeyPress] = useKeyHandler(\n draft,\n channelId,\n postId,\n caretPosition,\n isValidPersistentNotifications,\n location,\n textboxRef,\n showFormattingBar,\n focusTextbox,\n applyMarkdown,\n handleDraftChange,\n handleSubmitWrapper,\n emitTypingEvent,\n handleShowPreview,\n toggleAdvanceTextEditor,\n toggleEmojiPicker,\n isInEditMode,\n handleCancel,\n );\n\n const handleSubmitWithEvent = useCallback((e: React.FormEvent) => {\n e.preventDefault();\n handleSubmit();\n }, [handleSubmit]);\n\n const handlePostError = useCallback((err: React.ReactNode) => {\n setPostError(err);\n }, []);\n\n const handleHeightChange = useCallback((height: number, maxHeight: number) => {\n setRenderScrollbar(height > maxHeight);\n }, []);\n\n const handleBlur = useCallback(() => {\n lastBlurAt.current = Date.now();\n setKeepEditorInFocus(false);\n }, []);\n\n const handleFocus = useCallback(() => {\n setKeepEditorInFocus(true);\n }, []);\n\n const handleChange = useCallback((e: React.ChangeEvent<TextboxElement>) => {\n const message = e.target.value;\n\n if (!isErrorInvalidSlashCommand(serverError)) {\n setServerError(null);\n }\n\n handleDraftChange({\n ...draft,\n message,\n });\n }, [draft, handleDraftChange, serverError]);\n\n /**\n * by getting the value directly from the textbox we eliminate all unnecessary\n * re-renders for the FormattingBar component. The previous method of always passing\n * down the current message value that came from the parents state was not optimal,\n * although still working as expected\n */\n const getCurrentValue = useCallback(() => textboxRef.current?.getInputBox().value, [textboxRef]);\n\n const getCurrentSelection = useCallback(() => {\n const input = textboxRef.current?.getInputBox();\n\n return {\n start: input.selectionStart,\n end: input.selectionEnd,\n };\n }, [textboxRef]);\n\n const handleWidthChange = useCallback((width: number) => {\n const input = textboxRef.current?.getInputBox();\n if (!editorBodyRef.current || !editorActionsRef.current || !input) {\n return;\n }\n\n const maxWidth = editorBodyRef.current.offsetWidth - editorActionsRef.current.offsetWidth;\n\n if (!hasDraftMessage) {\n // if we do not have a message we can just render the default state\n setIsMessageLong(false);\n return;\n }\n\n if (width >= maxWidth) {\n setIsMessageLong(true);\n } else {\n setIsMessageLong(false);\n }\n }, [hasDraftMessage]);\n\n const handleMouseUpKeyUp = useCallback((e: React.MouseEvent | React.KeyboardEvent) => {\n setCaretPosition((e.target as TextboxElement).selectionStart || 0);\n }, []);\n\n const prefillMessage = useCallback((message: string, shouldFocus?: boolean) => {\n handleDraftChange({\n ...draft,\n message,\n });\n setCaretPosition(message.length);\n\n if (shouldFocus) {\n const inputBox = textboxRef.current?.getInputBox();\n inputBox?.click();\n focusTextbox(true);\n }\n }, [handleDraftChange, focusTextbox, draft, textboxRef]);\n\n // Update the caret position in the input box when changed by a side effect\n useEffect(() => {\n const textbox: HTMLInputElement | HTMLTextAreaElement | undefined = textboxRef.current?.getInputBox();\n if (textbox && textbox.selectionStart !== caretPosition) {\n Utils.setCaretPosition(textbox, caretPosition);\n }\n }, [caretPosition]);\n\n // Handle width change when there is no message.\n useEffect(() => {\n if (!hasDraftMessage) {\n handleWidthChange(0);\n }\n }, [hasDraftMessage, handleWidthChange]);\n\n // Clear timeout on unmount\n useEffect(() => {\n return () => loggedInAriaLabelTimeout.current && clearTimeout(loggedInAriaLabelTimeout.current);\n }, []);\n\n // Focus textbox when we stop showing the preview\n useDidUpdate(() => {\n if (!showPreview) {\n focusTextbox();\n }\n }, [showPreview]);\n\n // Focus textbox when selectedPostFocussedAt changes\n useEffect(() => {\n if (selectedPostFocussedAt) {\n focusTextbox();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedPostFocussedAt]);\n\n // Remove show preview when we switch channels or posts\n useEffect(() => {\n setShowPreview(false);\n setServerError(null);\n }, [channelId, postId]);\n\n // Remove uploads in progress on mount\n useEffect(() => {\n dispatch(actionOnGlobalItemsWithPrefix(postId ? StoragePrefixes.COMMENT_DRAFT : StoragePrefixes.DRAFT, (_key: string, draft: PostDraft) => {\n if (!draft || !draft.uploadsInProgress || draft.uploadsInProgress.length === 0) {\n return draft;\n }\n\n return {...draft, uploadsInProgress: []};\n }));\n }, []);\n\n // Register listener to store the draft when the page unloads\n useEffect(() => {\n const callback = () => handleDraftChange(draft, {instant: true, show: true});\n window.addEventListener('beforeunload', callback);\n return () => {\n window.removeEventListener('beforeunload', callback);\n };\n }, [handleDraftChange, draft]);\n\n // Keep track of the draft as a ref so that we can save it when changing channels\n useEffect(() => {\n draftRef.current = draft;\n }, [draft]);\n\n const handleSubmitPostAndScheduledMessage = useCallback((schedulingInfo?: SchedulingInfo) => handleSubmit(undefined, schedulingInfo), [handleSubmit]);\n\n // Set the draft from store when changing post or channels, and store the previous one\n useEffect(() => {\n // Store the draft that existed when we opened the channel to know if it should be saved\n const draftOnOpen = draftFromStore;\n\n setDraft(draftOnOpen);\n\n return () => {\n if (draftOnOpen !== draftRef.current) {\n handleDraftChange(draftRef.current, {instant: true, show: true});\n }\n };\n }, [channelId, postId]);\n\n const disableSendButton = Boolean(isDisabled || (!draft.message.trim().length && !draft.fileInfos.length)) || !isValidPersistentNotifications;\n const sendButton = readOnlyChannel || isInEditMode ? null : (\n <SendButton\n disabled={disableSendButton}\n handleSubmit={handleSubmitPostAndScheduledMessage}\n channelId={channelId}\n />\n );\n\n const showFormatJSX = disableSendButton ? null : (\n <ShowFormat\n onClick={handleShowPreview}\n active={showPreview}\n />\n );\n\n let createMessage;\n if (placeholder) {\n createMessage = placeholder;\n } else if (!postId && !isDisabled) {\n createMessage = formatMessage(\n {\n id: 'create_post.write',\n defaultMessage: 'Write to {channelDisplayName}',\n },\n {channelDisplayName},\n );\n } else if (readOnlyChannel) {\n createMessage = formatMessage(\n {\n id: 'create_post.read_only',\n defaultMessage: 'This channel is read-only. Only members with permission can post here.',\n },\n );\n } else if (!enableSharedChannelsDMs && isDMOrGMRemote) {\n createMessage = formatMessage(\n {\n id: 'create_post.dm_or_gm_remote',\n defaultMessage: 'Direct Messages and Group Messages with remote users are not supported.',\n },\n );\n } else {\n createMessage = formatMessage({id: 'create_comment.addComment', defaultMessage: 'Reply to this thread...'});\n }\n\n const messageValue = isDisabled ? '' : draft.message_source || draft.message;\n\n let textboxId = 'textbox';\n\n switch (location) {\n case Locations.CENTER:\n textboxId = 'post_textbox';\n break;\n case Locations.RHS_COMMENT:\n textboxId = 'reply_textbox';\n break;\n case Locations.MODAL:\n textboxId = 'modal_textbox';\n break;\n }\n\n if (isInEditMode) {\n textboxId = 'edit_textbox';\n }\n\n const wasNotifiedOfLogIn = LocalStorageStore.getWasNotifiedOfLogIn();\n\n let loginSuccessfulLabel;\n if (!wasNotifiedOfLogIn) {\n loginSuccessfulLabel = formatMessage({\n id: 'channelView.login.successfull',\n defaultMessage: 'Login Successful',\n });\n\n // set timeout to make sure aria-label is read by a screen reader,\n // and then set the flag to \"true\" to make sure it's not read again until a user logs back in\n if (!loggedInAriaLabelTimeout.current) {\n loggedInAriaLabelTimeout.current = setTimeout(() => {\n LocalStorageStore.setWasNotifiedOfLogIn(true);\n }, 3000);\n }\n }\n\n const ariaLabelMessageInput = formatMessage({\n id: 'accessibility.sections.centerFooter',\n defaultMessage: 'message input complimentary region',\n });\n\n const ariaLabel = loginSuccessfulLabel ? `${loginSuccessfulLabel} ${ariaLabelMessageInput}` : ariaLabelMessageInput;\n\n const additionalControls = useMemo(() => [\n !isInEditMode && priorityAdditionalControl,\n ...(pluginItems || []),\n ].filter(Boolean), [pluginItems, priorityAdditionalControl, isInEditMode]);\n\n const formattingBar = (\n <AutoHeightSwitcher\n showSlot={showFormattingBar ? 1 : 2}\n slot1={(\n <FormattingBar\n applyMarkdown={applyMarkdown}\n getCurrentMessage={getCurrentValue}\n getCurrentSelection={getCurrentSelection}\n disableControls={showPreview}\n additionalControls={additionalControls}\n location={location}\n />\n )}\n slot2={null}\n shouldScrollIntoView={keepEditorInFocus}\n />\n );\n\n const fileUploadOverlay = useMemo(() => {\n const overlayType = isRHS ? 'right' : 'center';\n const direction = 'horizontal';\n\n return isInEditMode ? (\n <FileUploadOverlay\n overlayType={overlayType}\n isInEditMode={true}\n id={DropOverlayIdEditPost}\n direction={direction}\n />\n ) : (\n <FileUploadOverlay\n overlayType={overlayType}\n isInEditMode={false}\n id={isRHS ? DropOverlayIdCreateComment : DropOverlayIdCreatePost}\n direction={direction}\n />\n );\n }, [isInEditMode, isRHS]);\n\n const showFormattingSpacer = isMessageLong || showPreview || attachmentPreview || isRHS || isThreadView;\n\n const containsAtMentionsInMessage = allAtMentions(draft?.message)?.length > 0;\n\n return (\n <form\n id={postId ? undefined : 'create_post'}\n data-testid={postId ? undefined : 'create-post'}\n className={(!postId && !fullWidthTextBox) ? 'center' : undefined}\n onSubmit={handleSubmitWithEvent}\n >\n {canPost && (draft.fileInfos.length > 0 || draft.uploadsInProgress.length > 0) && (\n <FileLimitStickyBanner/>\n )}\n {showDndWarning && <DoNotDisturbWarning displayName={teammateDisplayName}/>}\n {!isInEditMode && (\n <PostBoxIndicator\n channelId={channelId}\n teammateDisplayName={teammateDisplayName}\n location={location}\n postId={postId}\n />\n )}\n <div\n className={classNames('AdvancedTextEditor', {\n 'AdvancedTextEditor__attachment-disabled': !canUploadFiles,\n scroll: renderScrollbar,\n 'formatting-bar': showFormattingBar,\n })}\n >\n {!wasNotifiedOfLogIn && (\n <div\n aria-live='assertive'\n className='sr-only'\n >\n <FormattedMessage\n id='channelView.login.successfull'\n defaultMessage='Login Successful'\n />\n </div>\n )}\n <div\n className={'AdvancedTextEditor__body'}\n disabled={isDisabled}\n >\n {fileUploadOverlay}\n <div\n ref={editorBodyRef}\n role='application'\n id='advancedTextEditorCell'\n data-a11y-sort-order='2'\n aria-label={ariaLabel}\n tabIndex={-1}\n className='AdvancedTextEditor__cell a11y__region'\n >\n {!isInEditMode && priorityLabels}\n <Textbox\n hasLabels={isInEditMode ? false : Boolean(priorityLabels)}\n suggestionList={location === Locations.RHS_COMMENT ? RhsSuggestionList : SuggestionList}\n onChange={handleChange}\n onKeyPress={postMsgKeyPress}\n onKeyDown={handleKeyDown}\n onMouseUp={handleMouseUpKeyUp}\n onKeyUp={handleMouseUpKeyUp}\n onComposition={emitTypingEvent}\n onHeightChange={handleHeightChange}\n handlePostError={handlePostError}\n value={messageValue}\n onBlur={handleBlur}\n onFocus={handleFocus}\n emojiEnabled={enableEmojiPicker}\n createMessage={createMessage}\n channelId={channelId}\n id={textboxId}\n ref={textboxRef!}\n disabled={isDisabled}\n characterLimit={maxPostSize}\n preview={showPreview}\n badConnection={badConnection}\n useChannelMentions={useChannelMentions}\n rootId={postId}\n onWidthChange={handleWidthChange}\n isInEditMode={isInEditMode}\n />\n {attachmentPreview}\n {!isDisabled && (showFormattingBar || showPreview) && (\n <TexteditorActions\n placement='top'\n isScrollbarRendered={renderScrollbar}\n >\n {showFormatJSX}\n </TexteditorActions>\n )}\n {showFormattingSpacer ? (\n <FormattingBarSpacer>\n {formattingBar}\n </FormattingBarSpacer>\n ) : formattingBar}\n {!isDisabled && (\n <TexteditorActions\n ref={editorActionsRef}\n placement='bottom'\n >\n <ToggleFormattingBar\n onClick={toggleAdvanceTextEditor}\n active={showFormattingBar}\n disabled={showPreview}\n />\n <Separator/>\n {fileUploadJSX}\n {emojiPicker}\n {sendButton}\n </TexteditorActions>\n )}\n </div>\n {showSendTutorialTip && (\n <SendMessageTour\n prefillMessage={prefillMessage}\n channelId={channelId}\n currentUserId={currentUserId}\n />\n )}\n </div>\n </div>\n {isInEditMode && containsAtMentionsInMessage && (\n <MessageWithMentionsFooter/>\n )}\n <Footer\n postError={postError}\n errorClass={errorClass}\n serverError={serverError}\n channelId={channelId}\n postId={postId}\n noArgumentHandleSubmit={handleSubmitWrapper}\n isInEditMode={isInEditMode}\n />\n {isInEditMode && (\n <EditPostFooter\n onSave={handleSubmitWrapper}\n onCancel={handleCancel}\n />\n )}\n </form>\n );\n};\n\nexport default AdvancedTextEditor;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function connectionErrorCount(state: GlobalState) {\n return state.views.system.websocketConnectionErrorCount;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback, useEffect, useRef} from 'react';\n\nimport type TextboxClass from 'components/textbox/textbox';\n\nimport * as UserAgent from 'utils/user_agent';\n\nconst useOrientationHandler = (\n textboxRef: React.RefObject<TextboxClass>,\n postId: string,\n) => {\n const lastOrientation = useRef('');\n\n const onOrientationChange = useCallback(() => {\n if (!UserAgent.isIosWeb()) {\n return;\n }\n\n const LANDSCAPE_ANGLE = 90;\n let orientation = 'portrait';\n if (window.orientation) {\n orientation = Math.abs(window.orientation as number) === LANDSCAPE_ANGLE ? 'landscape' : 'portrait';\n }\n\n if (window.screen.orientation) {\n orientation = window.screen.orientation.type.split('-')[0];\n }\n\n if (\n lastOrientation.current &&\n orientation !== lastOrientation.current &&\n (document.activeElement || {}).id === 'post_textbox'\n ) {\n textboxRef.current?.blur();\n }\n\n lastOrientation.current = orientation;\n }, [textboxRef]);\n\n useEffect(() => {\n if (!postId && UserAgent.isIosWeb()) {\n onOrientationChange();\n if (window.screen.orientation && 'onchange' in window.screen.orientation) {\n window.screen.orientation.addEventListener('change', onOrientationChange);\n } else if ('onorientationchange' in window) {\n window.addEventListener('orientationchange', onOrientationChange);\n }\n }\n return () => {\n if (!postId) {\n if (window.screen.orientation && 'onchange' in window.screen.orientation) {\n window.screen.orientation.removeEventListener('change', onOrientationChange);\n } else if ('onorientationchange' in window) {\n window.removeEventListener('orientationchange', onOrientationChange);\n }\n }\n };\n }, []);\n};\n\nexport default useOrientationHandler;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport type TextboxClass from 'components/textbox/textbox';\n\nimport type {GlobalState} from 'types/store';\nimport type {PostDraft} from 'types/store/draft';\n\nconst usePluginItems = (\n draft: PostDraft,\n textboxRef: React.RefObject<TextboxClass>,\n handleDraftChange: (draft: PostDraft) => void,\n) => {\n const postEditorActions = useSelector((state: GlobalState) => state.plugins.components.PostEditorAction);\n\n const getSelectedText = useCallback(() => {\n const input = textboxRef.current?.getInputBox();\n\n return {\n start: input?.selectionStart,\n end: input?.selectionEnd,\n };\n }, [textboxRef]);\n\n const updateText = useCallback((message: string) => {\n handleDraftChange({\n ...draft,\n message,\n });\n\n // Missing setting the state eventually?\n }, [handleDraftChange, draft]);\n\n const items = useMemo(() => postEditorActions?.map((item) => {\n if (!item.component) {\n return null;\n }\n\n const Component = item.component as any;\n return (\n <Component\n key={item.id}\n draft={draft}\n getSelectedText={getSelectedText}\n updateText={updateText}\n />\n );\n }), [postEditorActions, draft, getSelectedText, updateText]);\n\n return items;\n};\n\nexport default usePluginItems;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type React from 'react';\nimport {useCallback, useEffect} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {focusedRHS} from 'actions/views/rhs';\nimport {getIsRhsExpanded, getIsRhsOpen} from 'selectors/rhs';\nimport {getShouldFocusRHS} from 'selectors/views/rhs';\n\nimport useDidUpdate from 'components/common/hooks/useDidUpdate';\nimport type TextboxClass from 'components/textbox/textbox';\n\nimport {shouldFocusMainTextbox} from 'utils/post_utils';\nimport * as UserAgent from 'utils/user_agent';\n\nconst useTextboxFocus = (\n textboxRef: React.RefObject<TextboxClass>,\n channelId: string,\n isRHS: boolean,\n canPost: boolean,\n) => {\n const dispatch = useDispatch();\n\n const rhsExpanded = useSelector(getIsRhsExpanded);\n const rhsOpen = useSelector(getIsRhsOpen);\n\n // We force the selector to always think it is the same value to avoid re-renders\n // because we only use this value during mount.\n const shouldFocusRHS = useSelector(getShouldFocusRHS, () => true);\n\n const focusTextbox = useCallback((keepFocus = false) => {\n const postTextboxDisabled = !canPost;\n if (textboxRef.current && postTextboxDisabled) {\n textboxRef.current.blur(); // Fixes Firefox bug which causes keyboard shortcuts to be ignored (MM-22482)\n return;\n }\n if (textboxRef.current && (keepFocus || !UserAgent.isMobile())) {\n textboxRef.current.focus();\n }\n }, [canPost, textboxRef]);\n\n const focusTextboxIfNecessary = useCallback((e: KeyboardEvent) => {\n // Do not focus if the rhs is expanded and this is not the RHS\n if (!isRHS && rhsExpanded) {\n return;\n }\n\n // Do not focus if the rhs is not expanded and this is the RHS\n if (isRHS && !rhsExpanded) {\n return;\n }\n\n // Do not focus the main textbox when the RHS is open as a hacky fix to avoid cursor jumping textbox sometimes\n if (isRHS && rhsOpen && document.activeElement?.tagName === 'BODY') {\n return;\n }\n\n // Bit of a hack to not steal focus from the channel switch modal if it's open\n // This is a special case as the channel switch modal does not enforce focus like\n // most modals do\n if (document.getElementsByClassName('channel-switch-modal').length) {\n return;\n }\n\n if (shouldFocusMainTextbox(e, document.activeElement)) {\n focusTextbox();\n }\n }, [focusTextbox, rhsExpanded, rhsOpen, isRHS]);\n\n // Register events for onkeydown\n useEffect(() => {\n document.addEventListener('keydown', focusTextboxIfNecessary);\n return () => {\n document.removeEventListener('keydown', focusTextboxIfNecessary);\n };\n }, [focusTextboxIfNecessary]);\n\n // Focus on textbox on channel switch\n useDidUpdate(() => {\n focusTextbox();\n }, [channelId]);\n\n // Focus on mount\n useEffect(() => {\n if (isRHS && shouldFocusRHS) {\n focusTextbox();\n dispatch(focusedRHS());\n } else if (!isRHS && !shouldFocusRHS) {\n focusTextbox();\n }\n }, []);\n\n return focusTextbox;\n};\n\nexport default useTextboxFocus;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback, useRef, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {EmoticonHappyOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getEmojiName} from 'mattermost-redux/utils/emoji_utils';\n\nimport useDidUpdate from 'components/common/hooks/useDidUpdate';\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay';\nimport KeyboardShortcutSequence, {KEYBOARD_SHORTCUTS} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {splitMessageBasedOnCaretPosition} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\nimport type {PostDraft} from 'types/store/draft';\n\nimport {IconContainer} from './formatting_bar/formatting_icon';\n\nconst useEmojiPicker = (\n isDisabled: boolean,\n draft: PostDraft,\n caretPosition: number,\n setCaretPosition: (pos: number) => void,\n handleDraftChange: (draft: PostDraft) => void,\n shouldShowPreview: boolean,\n focusTextbox: () => void,\n emojiPickerOffset?: {right?: number},\n) => {\n const intl = useIntl();\n\n const enableEmojiPicker = useSelector((state: GlobalState) => getConfig(state).EnableEmojiPicker === 'true');\n const enableGifPicker = useSelector((state: GlobalState) => getConfig(state).EnableGifPicker === 'true');\n\n const emojiPickerRef = useRef<HTMLButtonElement>(null);\n\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n\n const toggleEmojiPicker = useCallback((e?: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {\n e?.stopPropagation();\n setShowEmojiPicker((prev) => !prev);\n }, []);\n\n const hideEmojiPicker = useCallback(() => {\n setShowEmojiPicker(false);\n }, []);\n\n const getEmojiPickerRef = useCallback(() => {\n return emojiPickerRef.current;\n }, []);\n\n const handleEmojiClick = useCallback((emoji: Emoji) => {\n const emojiAlias = getEmojiName(emoji);\n\n if (!emojiAlias) {\n //Oops.. There went something wrong\n return;\n }\n\n let newMessage;\n if (draft.message === '') {\n newMessage = `:${emojiAlias}: `;\n setCaretPosition(newMessage.length);\n } else {\n const {message} = draft;\n const {firstPiece, lastPiece} = splitMessageBasedOnCaretPosition(caretPosition, message);\n\n // check whether the first piece of the message is empty when cursor is placed at beginning of message and avoid adding an empty string at the beginning of the message\n newMessage =\n firstPiece === '' ? `:${emojiAlias}: ${lastPiece}` : `${firstPiece} :${emojiAlias}: ${lastPiece}`;\n\n const newCaretPosition =\n firstPiece === '' ? `:${emojiAlias}: `.length : `${firstPiece} :${emojiAlias}: `.length;\n setCaretPosition(newCaretPosition);\n }\n\n handleDraftChange({\n ...draft,\n message: newMessage,\n });\n\n setShowEmojiPicker(false);\n }, [draft, caretPosition, handleDraftChange, setCaretPosition]);\n\n const handleGifClick = useCallback((gif: string) => {\n let newMessage: string;\n if (draft.message === '') {\n newMessage = gif;\n } else if ((/\\s+$/).test(draft.message)) {\n // Check whether there is already a blank at the end of the current message\n newMessage = `${draft.message}${gif} `;\n } else {\n newMessage = `${draft.message} ${gif} `;\n }\n\n handleDraftChange({\n ...draft,\n message: newMessage,\n });\n\n setShowEmojiPicker(false);\n }, [draft, handleDraftChange]);\n\n // Focus textbox when the emoji picker closes\n useDidUpdate(() => {\n if (!showEmojiPicker) {\n focusTextbox();\n }\n }, [showEmojiPicker]);\n\n let emojiPicker = null;\n\n if (enableEmojiPicker && !isDisabled) {\n emojiPicker = (\n <>\n <EmojiPickerOverlay\n show={showEmojiPicker}\n target={getEmojiPickerRef}\n onHide={hideEmojiPicker}\n onEmojiClick={handleEmojiClick}\n onGifClick={handleGifClick}\n enableGifPicker={enableGifPicker}\n topOffset={-7}\n rightOffset={emojiPickerOffset?.right}\n />\n <WithTooltip\n title={\n <KeyboardShortcutSequence\n shortcut={KEYBOARD_SHORTCUTS.msgShowEmojiPicker}\n hoistDescription={true}\n isInsideTooltip={true}\n />\n }\n >\n <IconContainer\n id={'emojiPickerButton'}\n ref={emojiPickerRef}\n onClick={toggleEmojiPicker}\n type='button'\n aria-label={intl.formatMessage({id: 'emoji_picker.emojiPicker.button.ariaLabel', defaultMessage: 'select an emoji'})}\n disabled={shouldShowPreview}\n className={classNames({active: showEmojiPicker})}\n >\n <EmoticonHappyOutlineIcon\n color={'currentColor'}\n size={18}\n />\n </IconContainer>\n </WithTooltip>\n </>\n );\n }\n\n return {emojiPicker, enableEmojiPicker, toggleEmojiPicker};\n};\n\nexport default useEmojiPicker;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {defineMessages, useIntl} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport styled from 'styled-components';\n\nimport {\n FormatBoldIcon,\n FormatItalicIcon,\n LinkVariantIcon,\n FormatStrikethroughVariantIcon,\n CodeTagsIcon,\n FormatHeaderIcon,\n FormatQuoteOpenIcon,\n FormatListBulletedIcon,\n FormatListNumberedIcon,\n} from '@mattermost/compass-icons/components';\nimport type IconProps from '@mattermost/compass-icons/components/props';\n\nimport KeyboardShortcutSequence, {\n KEYBOARD_SHORTCUTS,\n} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport type {\n KeyboardShortcutDescriptor} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport WithTooltip from 'components/with_tooltip';\n\nimport type {MarkdownMode} from 'utils/markdown/apply_markdown';\n\nexport const IconContainer = styled.button`\n display: flex;\n min-width: 32px;\n height: 32px;\n place-items: center;\n place-content: center;\n border: none;\n background: transparent;\n padding: 0 7px;\n border-radius: 4px;\n color: rgba(var(--center-channel-color-rgb), var(--icon-opacity));\n\n &:hover {\n background: rgba(var(--center-channel-color-rgb), 0.08);\n color: rgba(var(--center-channel-color-rgb), var(--icon-opacity-hover));\n fill: currentColor;\n }\n\n &:active,\n &.active,\n &.active:hover {\n background: rgba(var(--button-bg-rgb), 0.08);\n color: var(--button-bg);\n fill: currentColor;\n }\n\n &[disabled] {\n pointer-events: none;\n cursor: not-allowed;\n color: rgba(var(--center-channel-color-rgb), 0.32);\n\n &:hover,\n &:active,\n &.active,\n &.active:hover {\n background: inherit;\n color: inherit;\n fill: inherit;\n }\n }\n`;\n\ninterface FormattingIconProps {\n id?: string;\n mode: MarkdownMode;\n onClick?: () => void;\n className?: string;\n disabled?: boolean;\n}\n\nconst MAP_MARKDOWN_MODE_TO_ICON: Record<FormattingIconProps['mode'], React.FC<IconProps>> = {\n bold: FormatBoldIcon,\n italic: FormatItalicIcon,\n link: LinkVariantIcon,\n strike: FormatStrikethroughVariantIcon,\n code: CodeTagsIcon,\n heading: FormatHeaderIcon,\n quote: FormatQuoteOpenIcon,\n ul: FormatListBulletedIcon,\n ol: FormatListNumberedIcon,\n};\n\nconst MAP_MARKDOWN_MODE_TO_ARIA_LABEL: Record<FormattingIconProps['mode'], MessageDescriptor> = defineMessages({\n bold: {id: 'accessibility.button.bold', defaultMessage: 'bold'},\n italic: {id: 'accessibility.button.italic', defaultMessage: 'italic'},\n link: {id: 'accessibility.button.link', defaultMessage: 'link'},\n strike: {id: 'accessibility.button.strike', defaultMessage: 'strike through'},\n code: {id: 'accessibility.button.code', defaultMessage: 'code'},\n heading: {id: 'accessibility.button.heading', defaultMessage: 'heading'},\n quote: {id: 'accessibility.button.quote', defaultMessage: 'quote'},\n ul: {id: 'accessibility.button.bulleted_list', defaultMessage: 'bulleted list'},\n ol: {id: 'accessibility.button.numbered_list', defaultMessage: 'numbered list'},\n});\n\nconst MAP_MARKDOWN_MODE_TO_KEYBOARD_SHORTCUTS: Record<FormattingIconProps['mode'], KeyboardShortcutDescriptor> = {\n bold: KEYBOARD_SHORTCUTS.msgMarkdownBold,\n italic: KEYBOARD_SHORTCUTS.msgMarkdownItalic,\n link: KEYBOARD_SHORTCUTS.msgMarkdownLink,\n strike: KEYBOARD_SHORTCUTS.msgMarkdownStrike,\n code: KEYBOARD_SHORTCUTS.msgMarkdownCode,\n heading: KEYBOARD_SHORTCUTS.msgMarkdownH3,\n quote: KEYBOARD_SHORTCUTS.msgMarkdownQuote,\n ul: KEYBOARD_SHORTCUTS.msgMarkdownUl,\n ol: KEYBOARD_SHORTCUTS.msgMarkdownOl,\n};\n\nconst FormattingIcon = (props: FormattingIconProps): JSX.Element => {\n /**\n * by passing in the otherProps spread we guarantee that accessibility\n * properties like aria-label, etc. get added to the DOM\n */\n const {mode, onClick, ...otherProps} = props;\n\n /* get the correct Icon from the IconMap */\n const Icon = MAP_MARKDOWN_MODE_TO_ICON[mode];\n const {formatMessage} = useIntl();\n const ariaLabelDefinition = MAP_MARKDOWN_MODE_TO_ARIA_LABEL[mode];\n const buttonAriaLabel = formatMessage(ariaLabelDefinition);\n\n const bodyAction = (\n <IconContainer\n type='button'\n id={props.id || `FormattingControl_${mode}`}\n onClick={onClick}\n aria-label={buttonAriaLabel}\n {...otherProps}\n >\n <Icon\n color={'currentColor'}\n size={18}\n />\n </IconContainer>\n );\n\n /* get the correct tooltip from the ShortcutsMap */\n const shortcut = MAP_MARKDOWN_MODE_TO_KEYBOARD_SHORTCUTS[mode];\n\n return (\n <WithTooltip\n title={\n <KeyboardShortcutSequence\n shortcut={shortcut}\n hoistDescription={true}\n isInsideTooltip={true}\n />\n }\n >\n {bodyAction}\n </WithTooltip>\n );\n};\n\nexport default memo(FormattingIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {PostPriorityMetadata} from '@mattermost/types/posts';\n\nimport {HasNoMentions, HasSpecialMentions} from 'components/post_priority/error_messages';\nimport PriorityLabel from 'components/post_priority/post_priority_label';\nimport WithTooltip from 'components/with_tooltip';\n\nimport './priority_labels.scss';\n\ntype Props = {\n canRemove: boolean;\n hasError: boolean;\n specialMentions?: {[key: string]: boolean};\n onRemove?: () => void;\n persistentNotifications?: PostPriorityMetadata['persistent_notifications'];\n priority?: PostPriorityMetadata['priority'];\n requestedAck?: PostPriorityMetadata['requested_ack'];\n};\n\nfunction PriorityLabels({\n canRemove,\n hasError,\n specialMentions,\n onRemove,\n persistentNotifications,\n priority,\n requestedAck,\n}: Props) {\n const intl = useIntl();\n\n return (\n <div className='priorityLabelsContainer'>\n {priority && (\n <PriorityLabel\n size='xs'\n priority={priority}\n />\n )}\n {persistentNotifications && (\n <WithTooltip\n title={intl.formatMessage({\n id: 'post_priority.persistent_notifications.tooltip',\n defaultMessage: 'Persistent notifications will be sent',\n })}\n >\n <span className='icon icon-bell-ring-outline'/>\n </WithTooltip>\n )}\n {requestedAck && (\n <div className={classNames('priorityLabelsAcknowledgements', {hasError})}>\n <WithTooltip\n title={intl.formatMessage({\n id: 'post_priority.request_acknowledgement.tooltip',\n defaultMessage: 'Acknowledgement will be requested',\n })}\n >\n <span className='icon icon-check-circle-outline'/>\n </WithTooltip>\n {!(priority) && (\n <FormattedMessage\n id={'post_priority.request_acknowledgement'}\n defaultMessage={'Request acknowledgement'}\n />\n )}\n </div>\n )}\n {hasError && (\n <div className='priorityLabelsError'>\n {(specialMentions && Object.values(specialMentions).includes(true)) ? <HasSpecialMentions specialMentions={specialMentions}/> : <HasNoMentions/>}\n </div>\n )}\n {canRemove && (\n <WithTooltip\n title={intl.formatMessage({\n id: 'post_priority.remove',\n defaultMessage: 'Remove {priority}',\n }, {priority})}\n >\n <button\n className='priorityLabelsClose close'\n onClick={onRemove}\n >\n <span aria-hidden='true'>{'×'}</span>\n <span className='sr-only'>\n <FormattedMessage\n id={'post_priority.remove'}\n defaultMessage={'Remove {priority}'}\n values={{priority}}\n />\n </span>\n </button>\n </WithTooltip>\n )}\n </div>\n );\n}\n\nexport default memo(PriorityLabels);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {General} from 'mattermost-redux/constants';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\n\nimport {getDisplayNameByUser, getUserIdFromChannelName} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport './dm_user_timezone.scss';\n\ntype Props = {\n channelId: string;\n selectedTime?: Date;\n}\n\nconst DATE_RANGES = [\n RelativeRanges.TODAY_TITLE_CASE,\n RelativeRanges.TOMORROW_TITLE_CASE,\n];\n\nexport function DMUserTimezone({channelId, selectedTime}: Props) {\n const channel = useSelector((state: GlobalState) => getChannel(state, channelId));\n const dmUserId = channel && channel.type === General.DM_CHANNEL ? getUserIdFromChannelName(channel) : '';\n const dmUser = useSelector((state: GlobalState) => getUser(state, dmUserId));\n const dmUserName = useSelector((state: GlobalState) => getDisplayNameByUser(state, dmUser));\n\n const dmUserTime = useMemo(() => {\n if (!dmUser) {\n return null;\n }\n\n return (\n <Timestamp\n ranges={DATE_RANGES}\n userTimezone={dmUser.timezone}\n useTime={{\n hour: 'numeric',\n minute: 'numeric',\n }}\n value={selectedTime}\n />\n );\n }, [dmUser, selectedTime]);\n\n if (!channel || channel.type !== 'D') {\n return null;\n }\n\n return (\n <div className='DMUserTimezone'>\n <FormattedMessage\n id='schedule_post.custom_time_modal.dm_user_time'\n defaultMessage='{dmUserTime} for {dmUserName}'\n values={{\n dmUserTime,\n dmUserName,\n }}\n />\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport type {Moment} from 'moment-timezone';\nimport React, {useCallback, useMemo, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {testingEnabled} from 'mattermost-redux/selectors/entities/general';\nimport {generateCurrentTimezoneLabel, getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {\n DMUserTimezone,\n} from 'components/advanced_text_editor/send_button/scheduled_post_custom_time_modal/dm_user_timezone';\nimport DateTimePickerModal from 'components/date_time_picker_modal/date_time_picker_modal';\n\nimport {scheduledPosts} from 'utils/constants';\n\ntype Props = {\n channelId: string;\n onExited: () => void;\n onConfirm: (timestamp: number) => Promise<{error?: string}>;\n initialTime?: Moment;\n}\n\nexport default function ScheduledPostCustomTimeModal({channelId, onExited, onConfirm, initialTime}: Props) {\n const {formatMessage} = useIntl();\n const [errorMessage, setErrorMessage] = useState<string>();\n const userTimezone = useSelector(getCurrentTimezone);\n const now = moment().tz(userTimezone);\n const currentUserId = useSelector(getCurrentUserId);\n const dispatch = useDispatch();\n const [selectedDateTime, setSelectedDateTime] = useState<Moment>(() => {\n if (initialTime) {\n return initialTime;\n }\n\n return now.add(1, 'days').set({hour: 9, minute: 0, second: 0, millisecond: 0});\n });\n\n const userTimezoneLabel = useMemo(() => generateCurrentTimezoneLabel(userTimezone), [userTimezone]);\n\n const handleOnConfirm = useCallback(async (dateTime: Moment) => {\n const selectedTime = dateTime.valueOf();\n const response = await onConfirm(selectedTime);\n\n dispatch(\n savePreferences(\n currentUserId,\n [{\n user_id: currentUserId,\n category: scheduledPosts.SCHEDULED_POSTS,\n name: scheduledPosts.RECENTLY_USED_CUSTOM_TIME,\n value: JSON.stringify({update_at: moment().tz(userTimezone).valueOf(), timestamp: selectedTime}),\n }],\n ),\n );\n\n if (response.error) {\n setErrorMessage(response.error);\n } else {\n onExited();\n }\n }, [onConfirm, onExited]);\n\n const bodySuffix = useMemo(() => {\n return (\n <DMUserTimezone\n channelId={channelId}\n selectedTime={selectedDateTime?.toDate()}\n />\n );\n }, [channelId, selectedDateTime]);\n\n const label = formatMessage({id: 'schedule_post.custom_time_modal.title', defaultMessage: 'Schedule message'});\n\n const timePickerInterval = useSelector(testingEnabled) ? 1 : undefined;\n\n return (\n <DateTimePickerModal\n className='scheduled_post_custom_time_modal'\n initialTime={selectedDateTime}\n header={\n <FormattedMessage\n id='schedule_post.custom_time_modal.title'\n defaultMessage='Schedule message'\n />\n }\n subheading={userTimezoneLabel}\n confirmButtonText={\n <FormattedMessage\n id='schedule_post.custom_time_modal.confirm_button_text'\n defaultMessage='Confirm'\n />\n }\n cancelButtonText={\n <FormattedMessage\n id='schedule_post.custom_time_modal.cancel_button_text'\n defaultMessage='Cancel'\n />\n }\n ariaLabel={label}\n onExited={onExited}\n onConfirm={handleOnConfirm}\n onChange={setSelectedDateTime}\n bodySuffix={bodySuffix}\n relativeDate={true}\n onCancel={onExited}\n errorText={errorMessage}\n timePickerInterval={timePickerInterval}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {Channel} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getPersistentNotificationIntervalMinutes, getPersistentNotificationMaxRecipients} from 'mattermost-redux/selectors/entities/posts';\n\nimport Constants from 'utils/constants';\nimport {makeGetUserOrGroupMentionCountFromMessage} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport {HasNoMentions, HasSpecialMentions} from './post_priority/error_messages';\n\ntype Props = {\n currentChannelTeammateUsername?: UserProfile['username'];\n specialMentions: {[key: string]: boolean};\n channelType: Channel['type'];\n message: string;\n onConfirm: () => void;\n onExited: () => void;\n};\n\nfunction PersistNotificationConfirmModal({\n channelType,\n currentChannelTeammateUsername,\n specialMentions,\n message,\n onConfirm,\n onExited,\n}: Props) {\n let body: React.ReactNode = '';\n let title: React.ReactNode = '';\n let confirmBtn: React.ReactNode = '';\n let handleConfirm = () => {};\n\n const getMentionCount = useMemo(makeGetUserOrGroupMentionCountFromMessage, []);\n const maxRecipients = useSelector(getPersistentNotificationMaxRecipients);\n const interval = useSelector(getPersistentNotificationIntervalMinutes);\n const count = useSelector((state: GlobalState) => getMentionCount(state, message));\n\n if (channelType === Constants.DM_CHANNEL) {\n handleConfirm = onConfirm;\n title = (\n <FormattedMessage\n id='persist_notification.dm_or_gm.title'\n defaultMessage='Send persistent notifications?'\n />\n );\n body = (\n <FormattedMessage\n id='persist_notification.dm_or_gm.description'\n defaultMessage='<b>{username}</b> will be notified every {interval, plural, one {1 minute} other {{interval} minutes}} until they’ve acknowledged the message.'\n values={{\n interval,\n username: currentChannelTeammateUsername,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n );\n confirmBtn = (\n <FormattedMessage\n id='persist_notification.dm_or_gm'\n defaultMessage='Send'\n />\n );\n } else if (Object.values(specialMentions).includes(true)) {\n body = (\n <HasSpecialMentions specialMentions={specialMentions}/>\n );\n confirmBtn = (\n <FormattedMessage\n id='persist_notification.special_mentions.confirm'\n defaultMessage='Got it'\n />\n );\n } else if (count === 0) {\n title = <HasNoMentions/>;\n body = (\n <FormattedMessage\n id='persist_notification.too_few.description'\n defaultMessage='There are no recipients mentioned in your message. You’ll need add mentions to be able to send persistent notifications.'\n />\n );\n confirmBtn = (\n <FormattedMessage\n id='persist_notification.too_few.confirm'\n defaultMessage='Got it'\n />\n );\n } else if (count > Number(maxRecipients)) {\n title = (\n <FormattedMessage\n id='persist_notification.too_many.title'\n defaultMessage='Too many recipients'\n />\n );\n body = (\n <FormattedMessage\n id='persist_notification.too_many.description'\n defaultMessage='You can send persistent notifications to a maximum of <b>{max}</b> recipients. There are <b>{count}</b> recipients mentioned in your message. You’ll need to change who you’ve mentioned before you can send.'\n values={{\n max: maxRecipients,\n count,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n );\n confirmBtn = (\n <FormattedMessage\n id='persist_notification.too_many.confirm'\n defaultMessage='Got it'\n />\n );\n } else {\n handleConfirm = onConfirm;\n title = (\n <FormattedMessage\n id='persist_notification.confirm.title'\n defaultMessage='Send persistent notifications?'\n />\n );\n body = (\n <FormattedMessage\n id='persist_notification.confirm.description'\n defaultMessage='Mentioned recipients will be notified every {interval, plural, one {1 minute} other {{interval} minutes}} until they’ve acknowledged the message.'\n values={{\n interval,\n }}\n />\n );\n confirmBtn = (\n <FormattedMessage\n id='persist_notification.confirm'\n defaultMessage='Send'\n />\n );\n }\n\n return (\n <GenericModal\n autoFocusConfirmButton={true}\n id='persist_notification_confirm_modal'\n autoCloseOnConfirmButton={true}\n compassDesign={true}\n confirmButtonText={confirmBtn}\n enforceFocus={true}\n handleCancel={() => {}}\n handleConfirm={handleConfirm}\n handleEnterKeyPress={handleConfirm}\n isDeleteModal={false}\n modalHeaderText={title}\n onExited={onExited}\n >\n {body}\n </GenericModal>\n );\n}\n\nexport default memo(PersistNotificationConfirmModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\n\nimport {CheckIcon} from '@mattermost/compass-icons/components';\n\nimport Toggle from 'components/toggle';\nimport MenuGroup from 'components/widgets/menu/menu_group';\nimport menuItem from 'components/widgets/menu/menu_items/menu_item';\n\ntype ItemProps = {\n ariaLabel: string;\n isSelected: boolean;\n onClick: () => void;\n text: React.ReactNode;\n}\n\ntype ToggleProps = {\n ariaLabel?: string;\n description: React.ReactNode;\n disabled: boolean;\n icon: React.ReactNode;\n onClick: () => void;\n text: React.ReactNode;\n toggled: boolean;\n}\n\nconst ItemButton = styled.button`\n display: flex !important;\n align-items: center !important;\n`;\n\nconst Wrapper = styled.div`\n cursor: ${(props) => (props.disabled ? 'default' : 'pointer')};\n\n &:hover {\n background-color: rgba(var(--center-channel-color-rgb), 0.1);\n }\n`;\n\nconst ToggleMain = styled.div`\n display: flex !important;\n align-items: center !important;\n padding: 8px 16px 4px;\n`;\n\nconst Text = styled.div`\n padding-left: 10px;\n`;\n\nconst Description = styled.div`\n padding: 0 44px 6px;\n font-size: 12px;\n color: rgba(var(--center-channel-color-rgb), 0.75);\n`;\n\nconst ToggleWrapper = styled.div`\n flex-shrink: 0;\n width: 32px;\n margin-left: auto;\n`;\n\nconst StyledCheckIcon = styled(CheckIcon)`\n display: flex;\n margin-left: 24px;\n fill: var(--button-bg);\n`;\n\nconst Menu = styled.ul`\n &&& {\n display: block;\n position: relative;\n box-shadow: none;\n border-radius: 0;\n border: 0;\n padding: 0 0 8px;\n margin: 0;\n color: var(--center-channel-color-rgb);\n list-style: none;\n max-width:320px;\n }\n`;\n\nfunction Item({\n onClick,\n ariaLabel,\n text,\n isSelected,\n}: ItemProps) {\n return (\n <ItemButton\n aria-label={ariaLabel}\n className='style--none'\n onClick={onClick}\n >\n {text && <span className='MenuItem__primary-text'>{text}</span>}\n {isSelected && (\n <StyledCheckIcon size={18}/>\n )}\n </ItemButton>\n );\n}\n\nfunction ToggleItem({\n ariaLabel,\n description,\n disabled,\n icon,\n onClick,\n text,\n toggled,\n}: ToggleProps) {\n return (\n <Wrapper\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n role='button'\n >\n <ToggleMain>\n {icon}\n <Text>\n {text}\n </Text>\n <ToggleWrapper>\n <Toggle\n aria-label={ariaLabel}\n size='btn-sm'\n disabled={disabled}\n onToggle={onClick}\n toggled={toggled}\n toggleClassName='btn-toggle-primary'\n />\n </ToggleWrapper>\n </ToggleMain>\n <Description>\n {description}\n </Description>\n </Wrapper>\n );\n}\n\nconst MenuItem = menuItem(Item);\n\nexport {MenuItem, ToggleItem, MenuGroup};\n\nexport default Menu;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState, memo} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {AlertOutlineIcon, AlertCircleOutlineIcon, MessageTextOutlineIcon, CheckCircleOutlineIcon, BellRingOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {PostPriorityMetadata} from '@mattermost/types/posts';\nimport {PostPriority} from '@mattermost/types/posts';\n\nimport {getPersistentNotificationIntervalMinutes, isPersistentNotificationsEnabled, isPostAcknowledgementsEnabled} from 'mattermost-redux/selectors/entities/posts';\n\nimport Menu, {MenuGroup, MenuItem, ToggleItem} from './post_priority_picker_item';\n\nimport './post_priority_picker.scss';\n\ntype Props = {\n settings?: PostPriorityMetadata;\n onClose: () => void;\n onApply: (props: PostPriorityMetadata) => void;\n}\n\nconst UrgentIcon = styled(AlertOutlineIcon)`\n fill: rgb(var(--semantic-color-danger));\n`;\n\nconst ImportantIcon = styled(AlertCircleOutlineIcon)`\n fill: rgb(var(--semantic-color-info));\n`;\n\nconst StandardIcon = styled(MessageTextOutlineIcon)`\n fill: rgba(var(--center-channel-color-rgb), 0.75);\n`;\n\nconst AcknowledgementIcon = styled(CheckCircleOutlineIcon)`\n fill: rgba(var(--center-channel-color-rgb), 0.75);\n`;\n\nconst PersistentNotificationsIcon = styled(BellRingOutlineIcon)`\n fill: rgba(var(--center-channel-color-rgb), 0.75);\n`;\n\nconst Header = styled.h4`\n align-items: center;\n display: flex;\n gap: 8px;\n font-family: 'Open Sans', sans-serif;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0;\n line-height: 20px;\n padding: 14px 16px 6px;\n text-align: left;\n`;\n\nconst Footer = styled.div`\n align-items: center;\n border-top: 1px solid rgba(var(--center-channel-color-rgb), 0.08);\n display: flex;\n font-family: Open Sans;\n justify-content: flex-end;\n padding: 16px;\n gap: 8px;\n`;\n\nconst Picker = styled.div`\n *zoom: 1;\n background: var(--center-channel-bg);\n border-radius: 4px;\n border: solid 1px rgba(var(--center-channel-color-rgb), 0.16);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\n display: flex;\n flex-direction: column;\n left: 0;\n margin-right: 3px;\n min-width: 0;\n overflow: hidden;\n user-select: none;\n width: max-content;\n`;\n\nfunction PostPriorityPicker({\n onApply,\n onClose,\n settings,\n}: Props) {\n const {formatMessage} = useIntl();\n const [priority, setPriority] = useState<PostPriority|''>(settings?.priority || '');\n const [requestedAck, setRequestedAck] = useState<boolean>(settings?.requested_ack || false);\n const [persistentNotifications, setPersistentNotifications] = useState<boolean>(settings?.persistent_notifications || false);\n\n const postAcknowledgementsEnabled = useSelector(isPostAcknowledgementsEnabled);\n const persistentNotificationsEnabled = useSelector(isPersistentNotificationsEnabled) && postAcknowledgementsEnabled;\n const interval = useSelector(getPersistentNotificationIntervalMinutes);\n\n const makeOnSelectPriority = useCallback((type?: PostPriority) => (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n e.preventDefault();\n\n setPriority(type || '');\n\n if (!postAcknowledgementsEnabled) {\n onApply({\n priority: type || '',\n requested_ack: false,\n persistent_notifications: false,\n });\n onClose();\n } else if (type !== PostPriority.URGENT) {\n setPersistentNotifications(false);\n }\n }, [onApply, onClose, postAcknowledgementsEnabled]);\n\n const handleAck = useCallback(() => {\n setRequestedAck(!requestedAck);\n }, [requestedAck]);\n\n const handlePersistentNotifications = useCallback(() => {\n setPersistentNotifications(!persistentNotifications);\n }, [persistentNotifications]);\n\n const handleApply = () => {\n onApply({\n priority,\n requested_ack: requestedAck,\n persistent_notifications: persistentNotifications,\n });\n onClose();\n };\n\n return (\n <Picker className='PostPriorityPicker'>\n <Header className='modal-title'>\n {formatMessage({\n id: 'post_priority.picker.header',\n defaultMessage: 'Message priority',\n })}\n </Header>\n <div role='application'>\n <Menu className='Menu'>\n <MenuGroup>\n <MenuItem\n id='menu-item-priority-standard'\n onClick={makeOnSelectPriority()}\n isSelected={!priority}\n icon={<StandardIcon size={18}/>}\n text={formatMessage({\n id: 'post_priority.priority.standard',\n defaultMessage: 'Standard',\n })}\n />\n <MenuItem\n id='menu-item-priority-important'\n onClick={makeOnSelectPriority(PostPriority.IMPORTANT)}\n isSelected={priority === PostPriority.IMPORTANT}\n icon={<ImportantIcon size={18}/>}\n text={formatMessage({\n id: 'post_priority.priority.important',\n defaultMessage: 'Important',\n })}\n />\n <MenuItem\n id='menu-item-priority-urgent'\n onClick={makeOnSelectPriority(PostPriority.URGENT)}\n isSelected={priority === PostPriority.URGENT}\n icon={<UrgentIcon size={18}/>}\n text={formatMessage({\n id: 'post_priority.priority.urgent',\n defaultMessage: 'Urgent',\n })}\n />\n </MenuGroup>\n {(postAcknowledgementsEnabled || persistentNotificationsEnabled) && (\n <MenuGroup>\n {postAcknowledgementsEnabled && (\n <ToggleItem\n disabled={false}\n onClick={handleAck}\n toggled={requestedAck}\n icon={<AcknowledgementIcon size={18}/>}\n text={formatMessage({\n id: 'post_priority.requested_ack.text',\n defaultMessage: 'Request acknowledgement',\n })}\n description={formatMessage({\n id: 'post_priority.requested_ack.description',\n defaultMessage: 'An acknowledgement button will appear with your message',\n })}\n />\n )}\n {priority === PostPriority.URGENT && persistentNotificationsEnabled && (\n <ToggleItem\n disabled={priority !== PostPriority.URGENT}\n onClick={handlePersistentNotifications}\n toggled={persistentNotifications}\n icon={<PersistentNotificationsIcon size={18}/>}\n text={formatMessage({\n id: 'post_priority.persistent_notifications.text',\n defaultMessage: 'Send persistent notifications',\n })}\n description={formatMessage(\n {\n id: 'post_priority.persistent_notifications.description',\n defaultMessage: 'Recipients will be notified every {interval, plural, one {1 minute} other {{interval} minutes}} until they acknowledge or reply',\n }, {\n interval,\n },\n )}\n />\n )}\n </MenuGroup>\n )}\n </Menu>\n </div>\n {postAcknowledgementsEnabled && (\n <Footer>\n <button\n type='button'\n className='PostPriorityPicker__cancel'\n onClick={onClose}\n >\n <FormattedMessage\n id={'post_priority.picker.cancel'}\n defaultMessage={'Cancel'}\n />\n </button>\n <button\n type='button'\n className='PostPriorityPicker__apply'\n onClick={handleApply}\n >\n <FormattedMessage\n id={'post_priority.picker.apply'}\n defaultMessage={'Apply'}\n />\n </button>\n </Footer>\n )}\n </Picker>\n );\n}\n\nexport default memo(PostPriorityPicker);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {\n FloatingFocusManager,\n FloatingPortal,\n autoUpdate,\n offset,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useRole,\n flip,\n shift,\n} from '@floating-ui/react';\nimport classNames from 'classnames';\nimport React, {memo, useCallback, useState} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {AlertCircleOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {PostPriorityMetadata} from '@mattermost/types/posts';\n\nimport {IconContainer} from 'components/advanced_text_editor/formatting_bar/formatting_icon';\nimport WithTooltip from 'components/with_tooltip';\n\nimport PostPriorityPicker from './post_priority_picker';\n\ntype Props = {\n disabled: boolean;\n settings?: PostPriorityMetadata;\n onApply: (props: PostPriorityMetadata) => void;\n onClose: () => void;\n};\n\nfunction PostPriorityPickerOverlay({\n disabled,\n settings,\n onApply,\n onClose,\n}: Props) {\n const [pickerOpen, setPickerOpen] = useState(false);\n const {formatMessage} = useIntl();\n\n const handleClose = useCallback(() => {\n setPickerOpen(false);\n onClose();\n }, [onClose]);\n\n const {\n x: pickerX,\n y: pickerY,\n strategy: pickerStrategy,\n context: pickerContext,\n refs: {\n setReference: setPickerReference,\n setFloating: setPickerFloating,\n },\n } = useFloating({\n open: pickerOpen,\n onOpenChange: setPickerOpen,\n placement: 'top-start',\n whileElementsMounted: autoUpdate,\n middleware: [\n offset({mainAxis: 4}),\n flip({\n fallbackPlacements: ['top'],\n }),\n shift({\n padding: 16,\n }),\n ],\n });\n\n const {\n getFloatingProps: getPickerFloatingProps,\n getReferenceProps: getPickerReferenceProps,\n } = useInteractions([\n useClick(pickerContext),\n useDismiss(pickerContext),\n useRole(pickerContext),\n ]);\n\n const messagePriority = formatMessage({id: 'shortcuts.msgs.formatting_bar.post_priority', defaultMessage: 'Message priority'});\n\n return (\n <>\n <WithTooltip\n title={messagePriority}\n >\n <IconContainer\n id='messagePriority'\n ref={setPickerReference}\n className={classNames({control: true, active: pickerOpen})}\n disabled={disabled}\n type='button'\n aria-label={messagePriority}\n {...getPickerReferenceProps()}\n >\n <AlertCircleOutlineIcon\n size={18}\n color='currentColor'\n />\n </IconContainer>\n </WithTooltip>\n <FloatingPortal id='root-portal'>\n {pickerOpen && (\n <FloatingFocusManager\n context={pickerContext}\n modal={true}\n returnFocus={false}\n initialFocus={-1}\n >\n <div\n ref={setPickerFloating}\n style={{\n width: 'max-content',\n position: pickerStrategy,\n top: pickerY ?? 0,\n left: pickerX ?? 0,\n zIndex: 3,\n }}\n {...getPickerFloatingProps()}\n >\n <PostPriorityPicker\n settings={settings}\n onApply={onApply}\n onClose={handleClose}\n />\n </div>\n </FloatingFocusManager>\n )}\n </FloatingPortal>\n </>\n );\n}\n\nexport default memo(PostPriorityPickerOverlay);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {PostPriorityMetadata} from '@mattermost/types/posts';\nimport {PostPriority} from '@mattermost/types/posts';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {isPostPriorityEnabled as isPostPriorityEnabledSelector} from 'mattermost-redux/selectors/entities/posts';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\n\nimport PersistNotificationConfirmModal from 'components/persist_notification_confirm_modal';\nimport PostPriorityPickerOverlay from 'components/post_priority/post_priority_picker_overlay';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport {hasRequestedPersistentNotifications, mentionsMinusSpecialMentionsInText, specialMentionsInText} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\nimport type {PostDraft} from 'types/store/draft';\n\nimport PriorityLabels from './priority_labels';\n\nconst usePriority = (\n draft: PostDraft,\n handleDraftChange: ((draft: PostDraft, options: {instant?: boolean; show?: boolean}) => void),\n focusTextbox: (keepFocus?: boolean) => void,\n shouldShowPreview: boolean,\n) => {\n const dispatch = useDispatch();\n const rootId = draft.rootId;\n const channelId = draft.channelId;\n\n const isPostPriorityEnabled = useSelector(isPostPriorityEnabledSelector);\n const channelType = useSelector((state: GlobalState) => getChannel(state, channelId)?.type || 'O');\n const channelTeammateUsername = useSelector((state: GlobalState) => {\n const channel = getChannel(state, channelId);\n return getUser(state, channel?.teammate_id || '')?.username || '';\n });\n\n const hasPrioritySet = isPostPriorityEnabled &&\n draft.metadata?.priority &&\n (\n draft.metadata.priority.priority ||\n draft.metadata.priority.requested_ack\n );\n\n const specialMentions = useMemo(() => {\n return specialMentionsInText(draft.message);\n }, [draft.message]);\n\n const hasSpecialMentions = useMemo(() => {\n return Object.values(specialMentions).includes(true);\n }, [specialMentions]);\n\n const isValidPersistentNotifications = useMemo(() => {\n if (!hasPrioritySet) {\n return true;\n }\n\n const {priority, persistent_notifications: persistentNotifications} = draft.metadata!.priority!;\n if (priority !== PostPriority.URGENT || !persistentNotifications) {\n return true;\n }\n\n if (channelType === Constants.DM_CHANNEL) {\n return true;\n }\n\n if (hasSpecialMentions) {\n return false;\n }\n\n const mentions = mentionsMinusSpecialMentionsInText(draft.message);\n\n return mentions.length > 0;\n }, [hasPrioritySet, draft, channelType, hasSpecialMentions]);\n\n const handlePostPriorityApply = useCallback((settings?: PostPriorityMetadata) => {\n const updatedDraft = {\n ...draft,\n };\n\n if (settings?.priority || settings?.requested_ack) {\n updatedDraft.metadata = {\n priority: {\n ...settings,\n priority: settings!.priority || '',\n requested_ack: settings!.requested_ack,\n },\n };\n } else {\n updatedDraft.metadata = {};\n }\n\n handleDraftChange(updatedDraft, {instant: true});\n focusTextbox();\n }, [focusTextbox, draft, handleDraftChange]);\n\n const handlePostPriorityHide = useCallback(() => {\n focusTextbox(true);\n }, [focusTextbox]);\n\n const handleRemovePriority = useCallback(() => {\n handlePostPriorityApply();\n }, [handlePostPriorityApply]);\n\n const showPersistNotificationModal = useCallback((message: string, specialMentions: {[key: string]: boolean}, channelType: Channel['type'], onConfirm: () => void) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.PERSIST_NOTIFICATION_CONFIRM_MODAL,\n dialogType: PersistNotificationConfirmModal,\n dialogProps: {\n currentChannelTeammateUsername: channelTeammateUsername,\n specialMentions,\n channelType,\n message,\n onConfirm,\n },\n }));\n }, [channelTeammateUsername, dispatch]);\n\n const onSubmitCheck = useCallback((onConfirm: () => void) => {\n if (\n isPostPriorityEnabled &&\n hasRequestedPersistentNotifications(draft?.metadata?.priority)\n ) {\n showPersistNotificationModal(draft.message, specialMentions, channelType, onConfirm);\n return true;\n }\n return false;\n }, [isPostPriorityEnabled, showPersistNotificationModal, draft, channelType, specialMentions]);\n\n const labels = useMemo(() => (\n (hasPrioritySet && !rootId) ? (\n <PriorityLabels\n canRemove={!shouldShowPreview}\n hasError={!isValidPersistentNotifications}\n specialMentions={specialMentions}\n onRemove={handleRemovePriority}\n persistentNotifications={draft!.metadata!.priority?.persistent_notifications}\n priority={draft!.metadata!.priority?.priority}\n requestedAck={draft!.metadata!.priority?.requested_ack}\n />\n ) : undefined\n ), [hasPrioritySet, rootId, shouldShowPreview, isValidPersistentNotifications, specialMentions, handleRemovePriority, draft]);\n\n const additionalControl = useMemo(() =>\n !rootId && isPostPriorityEnabled && (\n <PostPriorityPickerOverlay\n key='post-priority-picker-key'\n settings={draft.metadata?.priority}\n onApply={handlePostPriorityApply}\n onClose={handlePostPriorityHide}\n disabled={shouldShowPreview}\n />\n ), [rootId, isPostPriorityEnabled, draft.metadata?.priority, handlePostPriorityApply, handlePostPriorityHide, shouldShowPreview]);\n\n return {\n labels,\n additionalControl,\n isValidPersistentNotifications,\n onSubmitCheck,\n };\n};\n\nexport default usePriority;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\n\ntype Props = {\n mentions: string[];\n memberNotifyCount: number;\n channelTimezoneCount: number;\n onConfirm: (checked: boolean) => void;\n onExited: () => void;\n};\n\nexport default class NotifyConfirmModal extends React.PureComponent<Props> {\n render() {\n const {mentions, channelTimezoneCount, memberNotifyCount} = this.props;\n\n let notifyAllMessage: React.ReactNode = '';\n let notifyAllTitle: React.ReactNode = '';\n if (mentions.includes('@all') || mentions.includes('@channel') || mentions.includes('@here')) {\n notifyAllTitle = (\n <FormattedMessage\n id='notify_all.title.confirm'\n defaultMessage='Confirm sending notifications to entire channel'\n />\n );\n if (channelTimezoneCount > 0) {\n const message = mentions.length === 1 && mentions[0] === '@here' ? messages.atHereTimezones : messages.atAllTimezones;\n notifyAllMessage = (\n <FormattedMessage\n {...message}\n values={{\n totalMembers: memberNotifyCount,\n timezones: channelTimezoneCount,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n );\n } else {\n const message = mentions.length === 1 && mentions[0] === '@here' ? messages.atHere : messages.atAll;\n notifyAllMessage = (\n <FormattedMessage\n {...message}\n values={{\n totalMembers: memberNotifyCount,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n );\n }\n } else if (mentions.length > 0) {\n notifyAllTitle = (\n <FormattedMessage\n id='notify_all.title.confirm_groups'\n defaultMessage='Confirm sending notifications to groups'\n />\n );\n\n if (mentions.length === 1) {\n if (channelTimezoneCount > 0) {\n notifyAllMessage = (\n <FormattedMessage\n id='notifyAll.question_timezone_oneGroup'\n defaultMessage='By using <b>{mention}</b> you are about to send notifications to at least <b>{totalMembers} people</b> in <b>{timezones, number} {timezones, plural, one {timezone} other {timezones}}</b>. Are you sure you want to do this?'\n values={{\n mention: mentions[0],\n totalMembers: memberNotifyCount,\n timezones: channelTimezoneCount,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n );\n } else {\n notifyAllMessage = (\n <FormattedMessage\n id='notifyAll.question_oneGroup'\n defaultMessage='By using <b>{mention}</b> you are about to send notifications to at least <b>{totalMembers} people</b>. Are you sure you want to do this?'\n values={{\n mention: mentions[0],\n totalMembers: memberNotifyCount,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n );\n }\n } else if (channelTimezoneCount > 0) {\n notifyAllMessage = (\n <FormattedMessage\n id='notifyAll.question_timezoneGroups'\n defaultMessage='By using <b>{mentions}</b> and <b>{finalMention}</b> you are about to send notifications to at least <b>{totalMembers} people</b> in <b>{timezones, number} {timezones, plural, one {timezone} other {timezones}}</b>. Are you sure you want to do this?'\n values={{\n mentions: mentions.slice(0, -1).join(', '),\n finalMention: mentions[mentions.length - 1],\n totalMembers: memberNotifyCount,\n timezones: channelTimezoneCount,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n );\n } else {\n notifyAllMessage = (\n <FormattedMessage\n id='notifyAll.question_groups'\n defaultMessage='By using <b>{mentions}</b> and <b>{finalMention}</b> you are about to send notifications to at least <b>{totalMembers} people</b>. Are you sure you want to do this?'\n values={{\n mentions: mentions.slice(0, -1).join(', '),\n finalMention: mentions[mentions.length - 1],\n totalMembers: memberNotifyCount,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n );\n }\n }\n\n const notifyAllConfirm = (\n <FormattedMessage\n id='notify_all.confirm'\n defaultMessage='Confirm'\n />\n );\n\n return (\n <ConfirmModalRedux\n title={notifyAllTitle}\n message={notifyAllMessage}\n confirmButtonText={notifyAllConfirm}\n onConfirm={this.props.onConfirm}\n onExited={this.props.onExited}\n />\n );\n }\n}\n\nconst messages = defineMessages({\n atAll: {\n id: 'notifyAll.question',\n defaultMessage: 'By using <b>@all</b> or <b>@channel</b> you are about to send notifications to <b>{totalMembers} people</b>. Are you sure you want to do this?',\n },\n atAllTimezones: {\n id: 'notifyAll.questionTimezone',\n defaultMessage: 'By using <b>@all</b> or <b>@channel</b> you are about to send notifications to <b>{totalMembers} people</b> in <b>{timezones, number} {timezones, plural, one {timezone} other {timezones}}</b>. Are you sure you want to do this?',\n },\n atHere: {\n id: 'notify_here.question',\n defaultMessage: 'By using <b>@here</b> you are about to send notifications to at least <b>{totalMembers} other people</b>. Are you sure you want to do this?',\n },\n atHereTimezones: {\n id: 'notifyHere.question_timezone',\n defaultMessage: 'By using <b>@here</b> you are about to send notifications to at least <b>{totalMembers} other people</b> in <b>{timezones, number} {timezones, plural, one {timezone} other {timezones}}</b>. Are you sure you want to do this?',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, memo, useCallback} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n onExited: () => void;\n}\n\nconst PostDeletedModal = ({\n onExited,\n}: Props) => {\n const [show, setShow] = useState(true);\n\n const handleHide = useCallback(() => setShow(false), []);\n\n return (\n <Modal\n dialogClassName='a11y__modal'\n show={show}\n onHide={handleHide}\n onExited={onExited}\n role='none'\n aria-labelledby='postDeletedModalLabel'\n data-testid='postDeletedModal'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='postDeletedModalLabel'\n >\n <FormattedMessage\n id='post_delete.notPosted'\n defaultMessage='Comment could not be posted'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <p>\n <FormattedMessage\n id='post_delete.someone'\n defaultMessage='Someone deleted the message on which you tried to post a comment.'\n />\n </p>\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-primary'\n autoFocus={true}\n onClick={handleHide}\n data-testid='postDeletedModalOkButton'\n >\n <FormattedMessage\n id='post_delete.okay'\n defaultMessage='Okay'\n />\n </button>\n </Modal.Footer>\n </Modal>\n );\n};\n\nexport default memo(PostDeletedModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type React from 'react';\nimport {useCallback, useRef, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {SchedulingInfo} from '@mattermost/types/schedule_post';\n\nimport {FileTypes} from 'mattermost-redux/action_types';\nimport {getChannelTimezones} from 'mattermost-redux/actions/channels';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getChannel, getAllChannelStats} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentUserId, getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {unsetEditingPost, type CreatePostOptions} from 'actions/post_actions';\nimport {scrollPostListToBottom} from 'actions/views/channel';\nimport type {OnSubmitOptions, SubmitPostReturnType} from 'actions/views/create_comment';\nimport {onSubmit} from 'actions/views/create_comment';\nimport {openModal} from 'actions/views/modals';\nimport {editPost} from 'actions/views/posts';\n\nimport EditChannelHeaderModal from 'components/edit_channel_header_modal';\nimport EditChannelPurposeModal from 'components/edit_channel_purpose_modal';\nimport NotifyConfirmModal from 'components/notify_confirm_modal';\nimport PostDeletedModal from 'components/post_deleted_modal';\nimport ResetStatusModal from 'components/reset_status_modal';\n\nimport Constants, {ModalIdentifiers, UserStatuses} from 'utils/constants';\nimport {isErrorInvalidSlashCommand, isServerError, specialMentionsInText} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\nimport type {PostDraft} from 'types/store/draft';\nimport {isPostDraftEmpty} from 'types/store/draft';\n\nimport useGroups from './use_groups';\n\nfunction getStatusFromSlashCommand(message: string) {\n const tokens = message.split(' ');\n const command = tokens[0] || '';\n if (command[0] !== '/') {\n return '';\n }\n const status = command.substring(1);\n if (status === 'online' || status === 'away' || status === 'dnd' || status === 'offline') {\n return status;\n }\n\n return '';\n}\n\nconst useSubmit = (\n draft: PostDraft,\n postError: React.ReactNode,\n channelId: string,\n postId: string,\n serverError: (ServerError & { submittedMessage?: string }) | null,\n lastBlurAt: React.MutableRefObject<number>,\n focusTextbox: (forceFocust?: boolean) => void,\n setServerError: (err: (ServerError & { submittedMessage?: string }) | null) => void,\n setShowPreview: (showPreview: boolean) => void,\n handleDraftChange: (draft: PostDraft, options?: {instant?: boolean; show?: boolean}) => void,\n prioritySubmitCheck: (onConfirm: () => void) => boolean,\n afterOptimisticSubmit?: () => void,\n afterSubmit?: (response: SubmitPostReturnType) => void,\n skipCommands?: boolean,\n isInEditMode?: boolean,\n): [\n (submittingDraft?: PostDraft, schedulingInfo?: SchedulingInfo, options?: CreatePostOptions) => void,\n string | null,\n ] => {\n const getGroupMentions = useGroups(channelId, draft.message);\n\n const dispatch = useDispatch();\n\n const isDraftSubmitting = useRef(false);\n const [errorClass, setErrorClass] = useState<string | null>(null);\n const isDirectOrGroup = useSelector((state: GlobalState) => {\n const channel = getChannel(state, channelId);\n if (!channel) {\n return false;\n }\n return channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL;\n });\n\n const channel = useSelector((state: GlobalState) => {\n return getChannel(state, channelId);\n });\n\n const isRootDeleted = useSelector((state: GlobalState) => {\n if (!postId) {\n return false;\n }\n const post = getPost(state, postId);\n if (!post || post.delete_at || post.state === 'DELETED') {\n return true;\n }\n\n return false;\n });\n\n const enableConfirmNotificationsToChannel = useSelector((state: GlobalState) => getConfig(state).EnableConfirmNotificationsToChannel === 'true');\n const channelMembersCount = useSelector((state: GlobalState) => getAllChannelStats(state)[channelId]?.member_count ?? 1);\n const userIsOutOfOffice = useSelector((state: GlobalState) => {\n const currentUserId = getCurrentUserId(state);\n return getStatusForUserId(state, currentUserId) === UserStatuses.OUT_OF_OFFICE;\n });\n const useChannelMentions = useSelector((state: GlobalState) => {\n const channel = getChannel(state, channelId);\n if (!channel) {\n return false;\n }\n return haveIChannelPermission(state, channel.team_id, channel.id, Permissions.USE_CHANNEL_MENTIONS);\n });\n\n const showPostDeletedModal = useCallback(() => {\n dispatch(openModal({\n modalId: ModalIdentifiers.POST_DELETED_MODAL,\n dialogType: PostDeletedModal,\n }));\n }, [dispatch]);\n\n const doSubmit = useCallback(async (submittingDraft: PostDraft = draft, schedulingInfo?: SchedulingInfo, createPostOptions?: CreatePostOptions) => {\n if (submittingDraft.uploadsInProgress.length > 0) {\n isDraftSubmitting.current = false;\n return;\n }\n\n if (postError && !createPostOptions?.ignorePostError) {\n setErrorClass('animation--highlight');\n setTimeout(() => {\n setErrorClass(null);\n }, Constants.ANIMATION_TIMEOUT);\n isDraftSubmitting.current = false;\n return;\n }\n\n if (isPostDraftEmpty(draft)) {\n isDraftSubmitting.current = false;\n return;\n }\n\n if (!schedulingInfo) {\n if (isRootDeleted) {\n showPostDeletedModal();\n isDraftSubmitting.current = false;\n return;\n }\n }\n\n if (serverError && !isErrorInvalidSlashCommand(serverError)) {\n isDraftSubmitting.current = false;\n return;\n }\n\n const fasterThanHumanWillClick = 150;\n const forceFocus = Date.now() - lastBlurAt.current < fasterThanHumanWillClick;\n focusTextbox(forceFocus);\n\n setServerError(null);\n\n const ignoreSlash = skipCommands || (isErrorInvalidSlashCommand(serverError) && serverError?.submittedMessage === submittingDraft.message);\n const options: OnSubmitOptions = {\n ignoreSlash,\n afterSubmit,\n afterOptimisticSubmit,\n keepDraft: createPostOptions?.keepDraft,\n };\n\n try {\n let response;\n if (isInEditMode) {\n response = await dispatch(editPost(submittingDraft));\n handleFileChange(submittingDraft);\n } else {\n response = await dispatch(onSubmit(submittingDraft, options, schedulingInfo));\n }\n if (response?.error) {\n throw response.error;\n }\n\n setServerError(null);\n handleDraftChange({\n message: '',\n fileInfos: [],\n uploadsInProgress: [],\n createAt: 0,\n updateAt: 0,\n channelId,\n rootId: postId,\n }, {instant: true});\n } catch (err: unknown) {\n if (isServerError(err)) {\n if (isErrorInvalidSlashCommand(err)) {\n handleDraftChange(submittingDraft, {instant: true});\n }\n setServerError({\n ...err,\n submittedMessage: submittingDraft.message,\n });\n } else {\n setServerError(err as any);\n }\n isDraftSubmitting.current = false;\n return;\n }\n\n if (!postId && !schedulingInfo) {\n dispatch(scrollPostListToBottom());\n }\n\n if (isInEditMode) {\n dispatch(unsetEditingPost());\n }\n\n isDraftSubmitting.current = false;\n }, [\n dispatch,\n draft,\n postError,\n isRootDeleted,\n serverError,\n lastBlurAt,\n focusTextbox,\n setServerError,\n skipCommands,\n afterSubmit,\n afterOptimisticSubmit,\n postId,\n showPostDeletedModal,\n handleDraftChange,\n channelId,\n isInEditMode,\n ]);\n\n const handleFileChange = useCallback((submittingDraft: PostDraft) => {\n dispatch({\n type: FileTypes.RECEIVED_FILES_FOR_POST,\n data: submittingDraft.fileInfos,\n postId,\n });\n }, [dispatch, postId]);\n\n const setUpdatedFileIds = useCallback((draft: PostDraft) => {\n // new object creation is needed here to support sending a draft with files.\n // In case of draft, the PostDraft object is fetched from the redux store, which is immutable.\n // When user clicks 'Send Now' in drafts list, it will otherwise try to set a field on an immutable object.\n // Hence, creating a new object here.\n return {\n ...draft,\n file_ids: draft.fileInfos.map((fileInfo) => fileInfo.id),\n };\n }, []);\n\n const showNotifyAllModal = useCallback((mentions: string[], channelTimezoneCount: number, memberNotifyCount: number, onConfirm: () => void) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.NOTIFY_CONFIRM_MODAL,\n dialogType: NotifyConfirmModal,\n dialogProps: {\n mentions,\n channelTimezoneCount,\n memberNotifyCount,\n onConfirm,\n },\n }));\n }, [dispatch]);\n\n const handleSubmit = useCallback(async (submittingDraftParam = draft, schedulingInfo?: SchedulingInfo, options?: CreatePostOptions) => {\n if (!channel) {\n return;\n }\n\n if (isDraftSubmitting.current) {\n return;\n }\n\n const submittingDraft = setUpdatedFileIds(submittingDraftParam);\n setShowPreview(false);\n isDraftSubmitting.current = true;\n\n const notificationsToChannel = enableConfirmNotificationsToChannel && useChannelMentions;\n let memberNotifyCount = 0;\n let channelTimezoneCount = 0;\n let mentions: string[] = [];\n\n const specialMentions = specialMentionsInText(submittingDraft.message);\n const hasSpecialMentions = Object.values(specialMentions).includes(true);\n\n if (enableConfirmNotificationsToChannel && !hasSpecialMentions) {\n ({memberNotifyCount, channelTimezoneCount, mentions} = getGroupMentions(submittingDraft.message));\n }\n\n if (notificationsToChannel && channelMembersCount > Constants.NOTIFY_ALL_MEMBERS && hasSpecialMentions) {\n memberNotifyCount = channelMembersCount - 1;\n\n for (const k in specialMentions) {\n if (specialMentions[k]) {\n mentions.push('@' + k);\n }\n }\n\n const {data} = await dispatch(getChannelTimezones(channelId));\n channelTimezoneCount = data ? data.length : 0;\n }\n\n const onConfirm = () => doSubmit(submittingDraft, schedulingInfo);\n if (prioritySubmitCheck(onConfirm)) {\n isDraftSubmitting.current = false;\n return;\n }\n\n if (memberNotifyCount > 0) {\n showNotifyAllModal(mentions, channelTimezoneCount, memberNotifyCount, onConfirm);\n isDraftSubmitting.current = false;\n return;\n }\n\n if (!skipCommands && !schedulingInfo) {\n const status = getStatusFromSlashCommand(submittingDraft.message);\n if (userIsOutOfOffice && status) {\n const resetStatusModalData = {\n modalId: ModalIdentifiers.RESET_STATUS,\n dialogType: ResetStatusModal,\n dialogProps: {newStatus: status},\n };\n\n dispatch(openModal(resetStatusModalData));\n\n handleDraftChange({\n ...submittingDraft,\n message: '',\n });\n isDraftSubmitting.current = false;\n return;\n }\n\n if (submittingDraft.message.trimEnd() === '/header') {\n const editChannelHeaderModalData = {\n modalId: ModalIdentifiers.EDIT_CHANNEL_HEADER,\n dialogType: EditChannelHeaderModal,\n dialogProps: {channel},\n };\n\n dispatch(openModal(editChannelHeaderModalData));\n\n handleDraftChange({\n ...submittingDraft,\n message: '',\n });\n isDraftSubmitting.current = false;\n return;\n }\n\n if (!isDirectOrGroup && submittingDraft.message.trimEnd() === '/purpose') {\n const editChannelPurposeModalData = {\n modalId: ModalIdentifiers.EDIT_CHANNEL_PURPOSE,\n dialogType: EditChannelPurposeModal,\n dialogProps: {channel},\n };\n\n dispatch(openModal(editChannelPurposeModalData));\n\n handleDraftChange({\n ...submittingDraft,\n message: '',\n });\n isDraftSubmitting.current = false;\n return;\n }\n }\n\n await doSubmit(submittingDraft, schedulingInfo, options);\n }, [\n doSubmit,\n draft,\n isDirectOrGroup,\n channel,\n channelId,\n channelMembersCount,\n dispatch,\n enableConfirmNotificationsToChannel,\n skipCommands,\n handleDraftChange,\n showNotifyAllModal,\n useChannelMentions,\n userIsOutOfOffice,\n getGroupMentions,\n setShowPreview,\n prioritySubmitCheck,\n ]);\n\n return [handleSubmit, errorClass];\n};\n\nexport default useSubmit;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback, useEffect} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {GroupSource} from '@mattermost/types/groups';\n\nimport {getChannelMemberCountsByGroup} from 'mattermost-redux/actions/channels';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getChannel, getChannelMemberCountsByGroup as selectChannelMemberCountsByGroup} from 'mattermost-redux/selectors/entities/channels';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getAssociatedGroupsForReferenceByMention} from 'mattermost-redux/selectors/entities/groups';\nimport {isCustomGroupsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {searchAssociatedGroupsForReference} from 'actions/views/group';\n\nimport Constants from 'utils/constants';\nimport {groupsMentionedInText, mentionsMinusSpecialMentionsInText} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\nconst useGroups = (\n channelId: string,\n message: string,\n) => {\n const dispatch = useDispatch();\n\n const teamId = useSelector((state: GlobalState) => {\n const channel = getChannel(state, channelId);\n return channel?.team_id || getCurrentTeamId(state);\n });\n\n const canUseLDAPGroupMentions = useSelector((state: GlobalState) => {\n const channel = getChannel(state, channelId);\n if (!channel) {\n return false;\n }\n const license = getLicense(state);\n const isLDAPEnabled = license?.IsLicensed === 'true' && license?.LDAPGroups === 'true';\n return isLDAPEnabled && haveIChannelPermission(state, channel.team_id, channel.id, Permissions.USE_GROUP_MENTIONS);\n });\n\n const canUseCustomGroupMentions = useSelector((state: GlobalState) => {\n const channel = getChannel(state, channelId);\n if (!channel) {\n return false;\n }\n return isCustomGroupsEnabled(state) && haveIChannelPermission(state, channel.team_id, channel.id, Permissions.USE_GROUP_MENTIONS);\n });\n\n const groupsWithAllowReference = useSelector((state: GlobalState) => {\n const channel = getChannel(state, channelId);\n if (!channel) {\n return null;\n }\n return canUseLDAPGroupMentions || canUseCustomGroupMentions ? getAssociatedGroupsForReferenceByMention(state, channel.team_id, channel.id) : null;\n });\n\n const channelMemberCountsByGroup = useSelector((state: GlobalState) => selectChannelMemberCountsByGroup(state, channelId));\n\n const getGroupMentions = useCallback((message: string) => {\n let memberNotifyCount = 0;\n let channelTimezoneCount = 0;\n let mentions: string[] = [];\n if (canUseLDAPGroupMentions || canUseCustomGroupMentions) {\n const mentionGroups = groupsMentionedInText(message, groupsWithAllowReference);\n if (mentionGroups.length > 0) {\n mentionGroups.\n forEach((group) => {\n if (group.source === GroupSource.Ldap && !canUseLDAPGroupMentions) {\n return;\n }\n if (group.source === GroupSource.Custom && !canUseCustomGroupMentions) {\n return;\n }\n const mappedValue = channelMemberCountsByGroup[group.id];\n if (mappedValue && mappedValue.channel_member_count > Constants.NOTIFY_ALL_MEMBERS && mappedValue.channel_member_count > memberNotifyCount) {\n memberNotifyCount = mappedValue.channel_member_count;\n channelTimezoneCount = mappedValue.channel_member_timezones_count;\n }\n mentions.push(`@${group.name}`);\n });\n mentions = [...new Set(mentions)];\n }\n }\n return {mentions, memberNotifyCount, channelTimezoneCount};\n }, [channelMemberCountsByGroup, groupsWithAllowReference, canUseCustomGroupMentions, canUseLDAPGroupMentions]);\n\n // Get channel member counts by group on channel switch\n useEffect(() => {\n if (canUseLDAPGroupMentions || canUseCustomGroupMentions) {\n const mentions = mentionsMinusSpecialMentionsInText(message);\n\n if (mentions.length === 1) {\n dispatch(searchAssociatedGroupsForReference(mentions[0], teamId, channelId));\n } else if (mentions.length > 1) {\n dispatch(getChannelMemberCountsByGroup(channelId));\n }\n }\n }, [channelId]);\n\n return getGroupMentions;\n};\n\nexport default useGroups;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {ReactNode} from 'react';\nimport React, {useMemo} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {\n AlertOutlineIcon,\n CheckIcon,\n CloseIcon,\n InformationOutlineIcon,\n} from '@mattermost/compass-icons/components';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport './alert_banner.scss';\n\nexport type ModeType = 'danger' | 'warning' | 'info' | 'success';\n\nexport type AlertBannerProps = {\n id?: string;\n mode: ModeType;\n title?: ReactNode;\n customIcon?: ReactNode;\n message?: ReactNode;\n children?: ReactNode;\n className?: string;\n hideIcon?: boolean;\n actionButtonLeft?: ReactNode;\n actionButtonRight?: ReactNode;\n footerMessage?: ReactNode;\n closeBtnTooltip?: string;\n onDismiss?: () => void;\n variant?: 'sys' | 'app';\n}\n\nconst AlertBanner = ({\n id,\n mode,\n title,\n customIcon,\n message,\n className,\n variant = 'sys',\n onDismiss,\n actionButtonLeft,\n actionButtonRight,\n closeBtnTooltip,\n footerMessage,\n hideIcon,\n children,\n}: AlertBannerProps) => {\n const {formatMessage} = useIntl();\n\n const bannerIcon = useMemo(() => {\n if (customIcon) {\n return customIcon;\n }\n\n if (mode === 'danger' || mode === 'warning') {\n return <AlertOutlineIcon size={24}/>;\n } else if (mode === 'success') {\n return <CheckIcon size={24}/>;\n }\n return <InformationOutlineIcon size={24}/>;\n }, [mode, customIcon]);\n\n const dismissButton = useMemo(() => {\n return (\n <button\n className='AlertBanner__closeButton'\n aria-label={formatMessage({id: 'alert_banner.tooltipCloseBtn', defaultMessage: 'Close'})}\n onClick={onDismiss}\n >\n <CloseIcon size={18}/>\n </button>\n );\n }, [onDismiss]);\n\n return (\n <div\n data-testid={id}\n className={classNames(\n 'AlertBanner',\n mode,\n className,\n `AlertBanner--${variant}`,\n )}\n >\n {!hideIcon && (\n <div className='AlertBanner__icon'>\n {bannerIcon}\n </div>\n )}\n <div className='AlertBanner__body'>\n {title &&\n <div className='AlertBanner__title'>\n {title}\n </div>\n }\n {message && (\n <div\n className={classNames({AlertBanner__message: Boolean(title)})}\n >\n {message}\n </div>\n )}\n {children}\n {(actionButtonLeft || actionButtonRight) && (\n <div className='AlertBanner__actionButtons'>\n {actionButtonLeft}\n {actionButtonRight}\n </div>\n )}\n {footerMessage && (\n <div className='AlertBanner__footerMessage'>\n {footerMessage}\n </div>\n )}\n </div>\n {onDismiss && closeBtnTooltip && (\n <WithTooltip\n title={closeBtnTooltip}\n isVertical={false}\n >\n {dismissButton}\n </WithTooltip>\n )}\n {onDismiss && !closeBtnTooltip && (\n dismissButton\n )}\n </div>\n );\n};\n\nexport default AlertBanner;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function incrementAnnouncementBarCount() {\n return {\n type: ActionTypes.TRACK_ANNOUNCEMENT_BAR,\n };\n}\n\nexport function decrementAnnouncementBarCount() {\n return {\n type: ActionTypes.DISMISS_ANNOUNCEMENT_BAR,\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function getAnnouncementBarCount(state: GlobalState) {\n return state.views.announcementBar.announcementBarState.announcementBarCount;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ReactNode} from 'react';\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\n\nimport FormattedMarkdownMessage from 'components/formatted_markdown_message';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {AnnouncementBarTypes} from 'utils/constants';\nimport {isStringContainingUrl} from 'utils/url';\n\nimport './default_announcement_bar.scss';\n\ntype Props = {\n id?: string;\n showCloseButton: boolean;\n className?: string;\n color: string;\n textColor: string;\n type: string;\n message: ReactNode;\n tooltipMsg?: ReactNode;\n handleClose?: (e?: any) => void;\n showModal?: boolean;\n announcementBarCount?: number;\n onButtonClick?: (e?: any) => void;\n modalButtonText?: MessageDescriptor;\n showLinkAsButton: boolean;\n icon?: ReactNode;\n actions: {\n incrementAnnouncementBarCount: () => void;\n decrementAnnouncementBarCount: () => void;\n };\n showCTA?: boolean;\n ctaText?: ReactNode;\n ctaDisabled?: boolean;\n}\n\ntype State = {\n showTooltip: boolean;\n isStringContainingUrl: boolean;\n}\n\nexport default class AnnouncementBar extends React.PureComponent<Props, State> {\n messageRef: React.RefObject<HTMLDivElement>;\n constructor(props: Props) {\n super(props);\n\n this.messageRef = React.createRef();\n\n this.state = {\n showTooltip: false,\n isStringContainingUrl: false,\n };\n }\n\n static defaultProps = {\n showCloseButton: false,\n color: '',\n textColor: '',\n type: AnnouncementBarTypes.CRITICAL,\n showLinkAsButton: false,\n isTallBanner: false,\n showCTA: true,\n };\n\n enableToolTipIfNeeded = () => {\n const elm = this.messageRef.current;\n if (elm) {\n const enable = elm.offsetWidth < elm.scrollWidth;\n this.setState({showTooltip: enable});\n if (typeof this.props.message == 'string') {\n this.setState({isStringContainingUrl: isStringContainingUrl(this.props.message)});\n }\n return;\n }\n this.setState({showTooltip: false});\n };\n\n componentDidMount() {\n this.props.actions.incrementAnnouncementBarCount();\n document.body.classList.add('announcement-bar--fixed');\n }\n\n componentDidUpdate() {\n if (this.props.announcementBarCount === 1) {\n document.body.classList.add('announcement-bar--fixed');\n }\n }\n\n componentWillUnmount() {\n if (this.props.announcementBarCount === 1) {\n document.body.classList.remove('announcement-bar--fixed');\n }\n this.props.actions.decrementAnnouncementBarCount();\n }\n\n handleClose = (e: any) => {\n e.preventDefault();\n if (this.props.handleClose) {\n this.props.handleClose();\n }\n };\n\n render() {\n if (!this.props.message) {\n return null;\n }\n\n let barClass = 'announcement-bar';\n const barStyle = {backgroundColor: '', color: ''};\n const linkStyle = {color: ''};\n if (this.props.color && this.props.textColor) {\n barStyle.backgroundColor = this.props.color;\n barStyle.color = this.props.textColor;\n linkStyle.color = this.props.textColor;\n } else if (this.props.type === AnnouncementBarTypes.DEVELOPER) {\n barClass = 'announcement-bar announcement-bar-critical';\n } else if (this.props.type === AnnouncementBarTypes.CRITICAL) {\n barClass = 'announcement-bar announcement-bar-critical';\n } else if (this.props.type === AnnouncementBarTypes.SUCCESS) {\n barClass = 'announcement-bar announcement-bar-success';\n } else if (this.props.type === AnnouncementBarTypes.ADVISOR) {\n barClass = 'announcement-bar announcement-bar-advisor';\n } else if (this.props.type === AnnouncementBarTypes.ADVISOR_ACK) {\n barClass = 'announcement-bar announcement-bar-advisor-ack';\n } else if (this.props.type === AnnouncementBarTypes.GENERAL) {\n barClass = 'announcement-bar announcement-bar-general';\n }\n\n if (this.props.className) {\n barClass += ` ${this.props.className}`;\n }\n\n let closeButton;\n if (this.props.showCloseButton) {\n closeButton = (\n <a\n href='#'\n className='announcement-bar__close'\n style={linkStyle}\n onClick={this.handleClose}\n >\n {'×'}\n </a>\n );\n }\n\n let message = this.props.message;\n if (typeof message == 'string') {\n message = (\n <FormattedMarkdownMessage id={this.props.message as string}/>\n );\n }\n\n const announcementIcon = () => {\n return this.props.showLinkAsButton &&\n (this.props.showCloseButton ? <i className='icon icon-alert-circle-outline'/> : <i className='icon icon-alert-outline'/>);\n };\n\n let barContent = (<div className='announcement-bar__text'>\n {this.props.icon ? this.props.icon : announcementIcon()}\n <span\n ref={this.messageRef}\n onMouseEnter={this.enableToolTipIfNeeded}\n >\n {message}\n </span>\n {\n this.props.showLinkAsButton && this.props.showCTA && this.props.modalButtonText &&\n <button\n onClick={this.props.onButtonClick}\n disabled={this.props.ctaDisabled}\n >\n <FormattedMessage\n {...this.props.modalButtonText}\n />\n </button>\n }\n {\n this.props.showLinkAsButton && this.props.showCTA && this.props.ctaText &&\n <button\n onClick={this.props.onButtonClick}\n disabled={this.props.ctaDisabled}\n >\n {this.props.ctaText}\n </button>\n }\n </div>);\n\n if (this.state.showTooltip) {\n barContent = (\n <WithTooltip\n title={this.props.tooltipMsg ? this.props.tooltipMsg : message}\n className='announcementBarTooltip'\n delayClose={true}\n >\n {barContent}\n\n </WithTooltip>);\n }\n\n return (\n <div\n className={barClass}\n style={barStyle}\n // eslint-disable-next-line react/no-unknown-property\n css={{gridArea: 'announcement'}}\n data-testid={this.props.id}\n >\n {barContent}\n {closeButton}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {incrementAnnouncementBarCount, decrementAnnouncementBarCount} from 'actions/views/announcement_bar';\nimport {getAnnouncementBarCount} from 'selectors/views/announcement_bar';\n\nimport type {GlobalState} from 'types/store';\n\nimport AnnouncementBar from './announcement_bar';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n announcementBarCount: getAnnouncementBarCount(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n incrementAnnouncementBarCount,\n decrementAnnouncementBarCount,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport React, {useEffect} from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getSubscriptionProduct as selectSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud';\nimport {get as getPreference} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport AnnouncementBar from 'components/announcement_bar/default_announcement_bar';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\n\nimport {AnnouncementBarTypes, CloudBanners, CloudProducts, Preferences} from 'utils/constants';\n\nimport './to_paid_plan_nudge_banner.scss';\n\nenum DismissShowRange {\n GreaterThanEqual90 = '>=90',\n BetweenNinetyAnd60 = '89-61',\n SixtyTo31 = '60-31',\n ThirtyTo11 = '30-11',\n TenTo1 = '10-1',\n Zero = '0'\n}\n\nconst cloudFreeCloseMoment = '20230727';\n\ninterface ToPaidPlanDismissPreference {\n\n // range represents the range for the days to the deprecation of cloud free e.g. in 30 to 10 days to deprecate cloud free\n // Incase of dismissing the banner, range represents the time (days) period when this banner was dismissed.\n // This is important because in case the banner was dismissed for a certain period, it helps us know that we should not show it again for that period.\n range: DismissShowRange;\n show: boolean;\n}\n\nexport const ToPaidPlanBannerDismissable = () => {\n const dispatch = useDispatch();\n\n const openPricingModal = useOpenPricingModal();\n\n const currentUser = useSelector(getCurrentUser);\n const isAdmin = useSelector(isCurrentUserSystemAdmin);\n const product = useSelector(selectSubscriptionProduct);\n const currentProductStarter = product?.sku === CloudProducts.STARTER;\n\n const now = moment(Date.now());\n const cloudFreeEndDate = moment(cloudFreeCloseMoment, 'YYYYMMDD');\n const daysToCloudFreeEnd = cloudFreeEndDate.diff(now, 'days');\n\n const snoozePreferenceVal = useSelector((state: GlobalState) => getPreference(state, Preferences.TO_PAID_PLAN_NUDGE, CloudBanners.NUDGE_TO_PAID_PLAN_SNOOZED, '{\"range\": 0, \"show\": true}'));\n const snoozeInfo = JSON.parse(snoozePreferenceVal) as ToPaidPlanDismissPreference;\n const show = snoozeInfo.show;\n\n const snoozedForRange = (range: DismissShowRange) => {\n return snoozeInfo.range === range;\n };\n\n useEffect(() => {\n if (!snoozeInfo.show) {\n if (daysToCloudFreeEnd >= 90 && !snoozedForRange(DismissShowRange.GreaterThanEqual90)) {\n showBanner(true);\n }\n\n if (daysToCloudFreeEnd < 90 && daysToCloudFreeEnd > 60 && !snoozedForRange(DismissShowRange.BetweenNinetyAnd60)) {\n showBanner(true);\n }\n\n if (daysToCloudFreeEnd <= 60 && daysToCloudFreeEnd > 30 && !snoozedForRange(DismissShowRange.SixtyTo31)) {\n showBanner(true);\n }\n\n if (daysToCloudFreeEnd <= 30 && daysToCloudFreeEnd > 10 && !snoozedForRange(DismissShowRange.ThirtyTo11)) {\n showBanner(true);\n }\n\n if (daysToCloudFreeEnd <= 10) {\n showBanner(true);\n }\n }\n }, []);\n\n const showBanner = (show = false) => {\n let dRange = DismissShowRange.Zero;\n if (daysToCloudFreeEnd >= 90) {\n dRange = DismissShowRange.GreaterThanEqual90;\n }\n\n if (daysToCloudFreeEnd < 90 && daysToCloudFreeEnd > 60) {\n dRange = DismissShowRange.BetweenNinetyAnd60;\n }\n\n if (daysToCloudFreeEnd <= 60 && daysToCloudFreeEnd > 30) {\n dRange = DismissShowRange.SixtyTo31;\n }\n\n if (daysToCloudFreeEnd <= 30 && daysToCloudFreeEnd > 10) {\n dRange = DismissShowRange.ThirtyTo11;\n }\n\n // ideally this case should not happen because snooze button is not shown when TenTo1 days are remaining\n if (daysToCloudFreeEnd <= 10 && daysToCloudFreeEnd > 0) {\n dRange = DismissShowRange.TenTo1;\n }\n\n const snoozeInfo: ToPaidPlanDismissPreference = {\n range: dRange,\n show,\n };\n\n dispatch(savePreferences(currentUser.id, [{\n category: Preferences.TO_PAID_PLAN_NUDGE,\n name: CloudBanners.NUDGE_TO_PAID_PLAN_SNOOZED,\n user_id: currentUser.id,\n value: JSON.stringify(snoozeInfo),\n }]));\n };\n\n if (!show) {\n return null;\n }\n\n if (!isAdmin) {\n return null;\n }\n\n if (!currentProductStarter) {\n return null;\n }\n\n let message = {\n id: 'cloud_billing.nudge_to_paid.announcement_bar',\n defaultMessage: 'Cloud Free will be deprecated on {date}. To keep your workspace, upgrade to a paid plan',\n values: {\n date: moment(cloudFreeCloseMoment, 'YYYYMMDD').format('MMMM DD, YYYY'),\n },\n };\n\n if (daysToCloudFreeEnd < 0) {\n message = {\n id: 'cloud_billing.nudge_to_paid.announcement_bar_deprecated',\n defaultMessage: 'Cloud Free was deprecated. To keep your workspace, upgrade to a paid plan',\n } as any;\n }\n\n const announcementType = (daysToCloudFreeEnd <= 10) ? AnnouncementBarTypes.CRITICAL : AnnouncementBarTypes.ANNOUNCEMENT;\n\n return (\n <AnnouncementBar\n id='cloud-free-deprecation-announcement-bar'\n type={announcementType}\n showCloseButton={daysToCloudFreeEnd > 10}\n onButtonClick={openPricingModal}\n modalButtonText={messages.viewPlans}\n message={<FormattedMessage {...message}/>}\n showLinkAsButton={true}\n handleClose={showBanner}\n />\n );\n};\n\nconst messages = defineMessages({\n viewPlans: {\n id: 'cloud_billing.nudge_to_paid.view_plans',\n defaultMessage: 'View plans',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport isEmpty from 'lodash/isEmpty';\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport {AlertCircleOutlineIcon, AlertOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {Subscription} from '@mattermost/types/cloud';\nimport type {PreferenceType} from '@mattermost/types/preferences';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport PricingModal from 'components/pricing_modal';\n\nimport {\n Preferences,\n CloudBanners,\n AnnouncementBarTypes,\n ModalIdentifiers,\n TELEMETRY_CATEGORIES,\n TrialPeriodDays,\n} from 'utils/constants';\nimport {getLocaleDateFromUTC} from 'utils/utils';\n\nimport type {ModalData} from 'types/actions';\n\nimport AnnouncementBar from '../default_announcement_bar';\n\ntype Props = {\n userIsAdmin: boolean;\n isFreeTrial: boolean;\n currentUser: UserProfile;\n preferences: PreferenceType[];\n daysLeftOnTrial: number;\n isCloud: boolean;\n subscription?: Subscription;\n actions: {\n savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n getCloudSubscription: () => void;\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n};\n\nconst MAX_DAYS_BANNER = 'max_days_banner';\nconst THREE_DAYS_BANNER = '3_days_banner';\nclass CloudTrialAnnouncementBar extends React.PureComponent<Props> {\n async componentDidMount() {\n if (!isEmpty(this.props.subscription) && this.shouldShowBanner()) {\n const {daysLeftOnTrial} = this.props;\n if (this.isDismissable()) {\n trackEvent(\n TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n `bannerview_trial_${daysLeftOnTrial}_days`,\n );\n } else {\n trackEvent(\n TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n 'bannerview_trial_limit_ended',\n );\n }\n }\n }\n\n handleClose = async () => {\n const {daysLeftOnTrial} = this.props;\n let dismissValue = '';\n if (daysLeftOnTrial > TrialPeriodDays.TRIAL_WARNING_THRESHOLD) {\n dismissValue = MAX_DAYS_BANNER;\n } else if (daysLeftOnTrial <= TrialPeriodDays.TRIAL_WARNING_THRESHOLD && daysLeftOnTrial >= TrialPeriodDays.TRIAL_1_DAY) {\n dismissValue = THREE_DAYS_BANNER;\n }\n trackEvent(\n TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n `dismissed_banner_trial_${daysLeftOnTrial}_days`,\n );\n await this.props.actions.savePreferences(this.props.currentUser.id, [{\n category: Preferences.CLOUD_TRIAL_BANNER,\n user_id: this.props.currentUser.id,\n name: CloudBanners.TRIAL,\n value: `${dismissValue}`,\n }]);\n };\n\n shouldShowBanner = () => {\n const {isFreeTrial, userIsAdmin, isCloud} = this.props;\n return isFreeTrial && userIsAdmin && isCloud;\n };\n\n isDismissable = () => {\n const {daysLeftOnTrial} = this.props;\n let dismissable = true;\n\n if (daysLeftOnTrial <= TrialPeriodDays.TRIAL_1_DAY) {\n dismissable = false;\n }\n return dismissable;\n };\n\n showModal = () => {\n const {daysLeftOnTrial} = this.props;\n if (this.isDismissable()) {\n trackEvent(\n TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n `click_subscribe_from_trial_banner_${daysLeftOnTrial}_days`,\n );\n } else {\n trackEvent(\n TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n 'click_subscribe_from_banner_trial_ended',\n );\n }\n this.props.actions.openModal({\n modalId: ModalIdentifiers.PRICING_MODAL,\n dialogType: PricingModal,\n });\n };\n\n render() {\n const {daysLeftOnTrial, preferences} = this.props;\n\n if (!this.shouldShowBanner()) {\n return null;\n }\n\n if ((preferences.some((pref) => pref.name === CloudBanners.TRIAL && pref.value === MAX_DAYS_BANNER) && daysLeftOnTrial > TrialPeriodDays.TRIAL_WARNING_THRESHOLD) ||\n ((daysLeftOnTrial <= TrialPeriodDays.TRIAL_WARNING_THRESHOLD && daysLeftOnTrial >= TrialPeriodDays.TRIAL_1_DAY) &&\n preferences.some((pref) => pref.name === CloudBanners.TRIAL && pref.value === THREE_DAYS_BANNER))) {\n return null;\n }\n\n const trialMoreThan7DaysMsg = (\n <FormattedMessage\n id='admin.billing.subscription.cloudTrial.daysLeft'\n defaultMessage='Your trial has started! There are {daysLeftOnTrial} days left'\n values={{daysLeftOnTrial}}\n />\n );\n\n const modalButtonText = messages.trialButton;\n\n const trialLessThan7DaysMsg = (\n <FormattedMessage\n id='admin.billing.subscription.cloudReverseTrial.daysLeftOnTrial'\n defaultMessage='{daysLeftOnTrial} days left on your trial. Purchase a plan or contact sales to keep your workspace.'\n values={{daysLeftOnTrial}}\n />\n );\n\n const userEndTrialHour = getLocaleDateFromUTC((this.props.subscription?.trial_end_at as number / 1000), 'HH:mm', this.props.currentUser.timezone?.automaticTimezone as string);\n\n const trialLastDaysMsg = (\n <FormattedMessage\n id='admin.billing.subscription.cloudReverseTrial.lastDay'\n defaultMessage='This is the last day of your trial. Purchase a plan before {userEndTrialHour} or contact sales'\n values={{userEndTrialHour}}\n />\n );\n\n let bannerMessage;\n let icon;\n\n if (daysLeftOnTrial >= TrialPeriodDays.TRIAL_2_DAYS && daysLeftOnTrial <= TrialPeriodDays.TRIAL_WARNING_THRESHOLD) {\n bannerMessage = trialLessThan7DaysMsg;\n icon = <AlertCircleOutlineIcon size={18}/>;\n } else if (daysLeftOnTrial <= TrialPeriodDays.TRIAL_1_DAY && daysLeftOnTrial >= TrialPeriodDays.TRIAL_0_DAYS) {\n bannerMessage = trialLastDaysMsg;\n icon = <AlertOutlineIcon size={18}/>;\n } else {\n bannerMessage = trialMoreThan7DaysMsg;\n icon = <AlertCircleOutlineIcon size={18}/>;\n }\n\n const dismissable = this.isDismissable();\n\n return (\n <AnnouncementBar\n type={dismissable ? AnnouncementBarTypes.ADVISOR : AnnouncementBarTypes.CRITICAL}\n showCloseButton={dismissable}\n handleClose={this.handleClose}\n onButtonClick={this.showModal}\n modalButtonText={modalButtonText}\n message={bannerMessage}\n showLinkAsButton={true}\n icon={icon}\n />\n );\n }\n}\n\nconst messages = defineMessages({\n reverseTrialButton: {\n id: 'admin.billing.subscription.cloudReverseTrial.subscribeButton',\n defaultMessage: 'Review your options',\n },\n trialButton: {\n id: 'admin.billing.subscription.cloudTrial.subscribeButton',\n defaultMessage: 'Upgrade Now',\n },\n});\n\nexport default CloudTrialAnnouncementBar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getCloudSubscription} from 'mattermost-redux/actions/cloud';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {Preferences, TrialPeriodDays} from 'utils/constants';\nimport {getRemainingDaysFromFutureTimestamp} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport CloudTrialAnnouncementBar from './cloud_trial_announcement_bar';\n\nconst getCloudTrialBannerPreferences = makeGetCategory('getCloudTrialBannerPreferences', Preferences.CLOUD_TRIAL_BANNER);\n\nfunction mapStateToProps(state: GlobalState) {\n const subscription = state.entities.cloud.subscription;\n const isCloud = getLicense(state).Cloud === 'true';\n let isFreeTrial = false;\n let daysLeftOnTrial = 0;\n\n if (isCloud && subscription?.is_free_trial === 'true') {\n isFreeTrial = true;\n daysLeftOnTrial = Math.min(\n getRemainingDaysFromFutureTimestamp(subscription.trial_end_at),\n TrialPeriodDays.TRIAL_30_DAYS,\n );\n }\n\n return {\n isFreeTrial,\n daysLeftOnTrial,\n userIsAdmin: isCurrentUserSystemAdmin(state),\n currentUser: getCurrentUser(state),\n isCloud,\n subscription,\n preferences: getCloudTrialBannerPreferences(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators(\n {\n savePreferences,\n openModal,\n getCloudSubscription,\n },\n dispatch,\n ),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CloudTrialAnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {\n getSubscriptionProduct,\n} from 'mattermost-redux/selectors/entities/cloud';\nimport {makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {\n getCurrentUser,\n} from 'mattermost-redux/selectors/entities/users';\nimport {isSystemAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport useGetLimits from 'components/common/hooks/useGetLimits';\nimport useGetSubscription from 'components/common/hooks/useGetSubscription';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\n\nimport {\n AnnouncementBarTypes,\n Preferences,\n CloudBanners,\n CloudProducts,\n} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport AnnouncementBar from '../default_announcement_bar';\n\nconst getCloudTrialEndBannerPreferences = makeGetCategory('getCloudTrialEndBannerPreferences', Preferences.CLOUD_TRIAL_END_BANNER);\n\nconst CloudTrialEndAnnouncementBar: React.FC = () => {\n const limits = useGetLimits();\n const subscription = useGetSubscription();\n const dispatch = useDispatch();\n const preferences = useSelector(getCloudTrialEndBannerPreferences);\n const currentUser = useSelector((state: GlobalState) =>\n getCurrentUser(state),\n );\n const subscriptionProduct = useSelector((state: GlobalState) => getSubscriptionProduct(state));\n\n const openPricingModal = useOpenPricingModal();\n\n const shouldShowBanner = () => {\n if (!subscription || !subscriptionProduct) {\n return false;\n }\n\n // Make sure limits are loaded before showing banner\n if (!limits || !limits[1]) {\n return false;\n }\n\n if (!preferences) {\n return false;\n }\n if (preferences.some((pref) => pref.name === CloudBanners.HIDE && pref.value === 'true')) {\n return false;\n }\n\n // Don't show this banner for professional or enterprise installations\n if (subscriptionProduct?.sku !== CloudProducts.STARTER) {\n return false;\n }\n\n const isFreeTrial = subscription.is_free_trial === 'true';\n if (isFreeTrial) {\n return false;\n }\n\n const trialEnd = new Date(subscription.trial_end_at);\n const now = new Date();\n\n // trial_end_at values will be 0 for all freemium subscriptions after June 15\n // Subscriptions created prior to that will almost always have a trial_end_at value, guaranteed.\n if (subscription.trial_end_at === 0 || trialEnd > now || trialEnd < new Date('2022-06-15')) {\n return false;\n }\n if (!isSystemAdmin(currentUser.roles)) {\n return false;\n }\n return true;\n };\n\n if (!shouldShowBanner()) {\n return null;\n }\n\n const handleClose = () => {\n dispatch(\n savePreferences(currentUser.id, [\n {\n category: Preferences.CLOUD_TRIAL_END_BANNER,\n user_id: currentUser.id,\n name: CloudBanners.HIDE,\n value: 'true',\n },\n ]),\n );\n };\n\n return (\n <AnnouncementBar\n type={AnnouncementBarTypes.CRITICAL}\n showCloseButton={true}\n onButtonClick={() => openPricingModal({trackingLocation: 'cloud_trial_ended_announcement_bar'})}\n modalButtonText={messages.moreDetails}\n message={<FormattedMessage {...messages.downgraded}/>}\n showLinkAsButton={true}\n isTallBanner={true}\n icon={<i className='icon icon-alert-outline'/>}\n handleClose={handleClose}\n />\n );\n};\n\nconst messages = defineMessages({\n downgraded: {\n id: 'free.banner.downgraded',\n defaultMessage: 'Your workspace now has restrictions and some data has been archived',\n },\n moreDetails: {\n id: 'more.details',\n defaultMessage: 'More details',\n },\n});\n\nexport default CloudTrialEndAnnouncementBar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {Subscription} from '@mattermost/types/cloud';\n\nimport {\n getCloudSubscription as getCloudSubscriptionAction,\n} from 'mattermost-redux/actions/cloud';\nimport {getCloudSubscription} from 'mattermost-redux/selectors/entities/cloud';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nexport default function useGetSubscription(): Subscription | undefined {\n const cloudSubscription = useSelector(getCloudSubscription);\n const license = useSelector(getLicense);\n const retrievedCloudSub = Boolean(cloudSubscription);\n const dispatch = useDispatch();\n const [requestedSubscription, setRequestedSubscription] = useState(false);\n\n useEffect(() => {\n if (license.Cloud === 'true' && !retrievedCloudSub && !requestedSubscription) {\n dispatch(getCloudSubscriptionAction());\n setRequestedSubscription(true);\n }\n }, [requestedSubscription, retrievedCloudSub, license]);\n\n return cloudSubscription;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\n\nimport type {ModalData} from 'types/actions';\n\nimport './renew_link.scss';\n\nexport interface RenewalLinkProps {\n telemetryInfo?: { success: string; error: string };\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n isDisabled?: boolean;\n customBtnText?: JSX.Element;\n}\n\nconst RenewalLink = (props: RenewalLinkProps) => {\n const [openContactSales] = useOpenSalesLink();\n\n const handleLinkClick = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n openContactSales();\n };\n\n const btnText = (\n <FormattedMessage\n id='announcement_bar.warn.renew_license_contact_sales'\n defaultMessage='Contact sales'\n />\n );\n\n return (\n <button\n className='btn btn-primary annnouncementBar__renewLicense'\n disabled={props.isDisabled}\n onClick={(e) => handleLinkClick(e)}\n >\n {btnText}\n </button>\n );\n};\n\nexport default RenewalLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {openModal} from 'actions/views/modals';\n\nimport RenewalLink from './renewal_link';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators(\n {\n openModal,\n },\n dispatch,\n ),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(RenewalLink);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect, useState} from 'react';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport Markdown from 'components/markdown';\n\nimport AnnouncementBar from './default_announcement_bar';\n\nconst localStoragePrefix = '__announcement__';\n\ntype AnnouncementBarProps = React.ComponentProps<typeof AnnouncementBar>;\n\ninterface Props extends Partial<AnnouncementBarProps> {\n allowDismissal: boolean;\n text: React.ReactNode;\n onDismissal?: () => void;\n className?: string;\n}\n\nconst options = {\n singleline: true,\n mentionHighlight: false,\n};\n\nconst getDismissed = (text?: React.ReactNode) => localStorage.getItem(localStoragePrefix + text?.toString()) === 'true';\n\nconst TextDismissableBar = ({\n allowDismissal,\n text,\n onDismissal,\n ...extraProps\n}: Props) => {\n const [dismissed, setDismissed] = useState<boolean>(() => getDismissed(text));\n\n useEffect(() => {\n setDismissed(getDismissed(text));\n }, [text]);\n\n const handleDismiss = useCallback(() => {\n if (!allowDismissal) {\n return;\n }\n trackEvent('signup', 'click_dismiss_bar');\n\n localStorage.setItem(localStoragePrefix + text?.toString(), 'true');\n setDismissed(true);\n onDismissal?.();\n }, [allowDismissal, onDismissal, text]);\n\n if (dismissed) {\n return null;\n }\n\n return (\n <AnnouncementBar\n {...extraProps}\n showCloseButton={allowDismissal}\n handleClose={handleDismiss}\n message={\n <>\n <i className='icon icon-information-outline'/>\n {typeof text === 'string' ? (\n <Markdown\n message={text}\n options={options}\n />\n ) : text}\n </>\n }\n />\n );\n};\n\nexport default TextDismissableBar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {ClientConfig, WarnMetricStatus} from '@mattermost/types/config';\nimport type {PreferenceType} from '@mattermost/types/preferences';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport PurchaseLink from 'components/announcement_bar/purchase_link/purchase_link';\nimport ExternalLink from 'components/external_link';\n\nimport alertIcon from 'images/icons/round-white-info-icon.svg';\nimport warningIcon from 'images/icons/warning-icon.svg';\nimport {AnnouncementBarTypes, AnnouncementBarMessages, Preferences, ConfigurationBanners, Constants, TELEMETRY_CATEGORIES} from 'utils/constants';\nimport {daysToLicenseExpire, isLicenseExpired, isLicenseExpiring, isLicensePastGracePeriod, isTrialLicense} from 'utils/license_utils';\nimport {getSkuDisplayName} from 'utils/subscription';\nimport {getViewportSize} from 'utils/utils';\n\nimport AnnouncementBar from '../default_announcement_bar';\nimport RenewalLink from '../renewal_link/';\nimport TextDismissableBar from '../text_dismissable_bar';\n\ntype Props = {\n config?: Partial<ClientConfig>;\n intl: IntlShape;\n license?: any;\n canViewSystemErrors: boolean;\n dismissedExpiringTrialLicense?: boolean;\n dismissedExpiringLicense?: boolean;\n dismissedExpiredLicense?: boolean;\n dismissedNumberOfActiveUsersWarnMetricStatus?: boolean;\n dismissedNumberOfActiveUsersWarnMetricStatusAck?: boolean;\n dismissedNumberOfPostsWarnMetricStatus?: boolean;\n dismissedNumberOfPostsWarnMetricStatusAck?: boolean;\n siteURL: string;\n currentUserId: string;\n warnMetricsStatus?: Record<string, WarnMetricStatus>;\n actions: {\n dismissNotice: (notice: string) => void;\n savePreferences: (userId: string, preferences: PreferenceType[]) => Promise<ActionResult>;\n };\n};\n\nconst ConfigurationAnnouncementBar = (props: Props) => {\n const {formatMessage} = props.intl;\n\n const dismissExpiringLicense = () => {\n props.actions.dismissNotice(AnnouncementBarMessages.LICENSE_EXPIRING);\n };\n\n const dismissExpiredLicense = () => {\n trackEvent(\n TELEMETRY_CATEGORIES.SELF_HOSTED_LICENSE_EXPIRED,\n 'dismissed_license_expired_banner',\n );\n\n props.actions.savePreferences(props.currentUserId, [{\n category: Preferences.CONFIGURATION_BANNERS,\n user_id: props.currentUserId,\n name: ConfigurationBanners.LICENSE_EXPIRED,\n value: 'true',\n }]);\n };\n\n const dismissExpiringTrialLicense = () => {\n props.actions.dismissNotice(AnnouncementBarMessages.TRIAL_LICENSE_EXPIRING);\n };\n\n const renewLinkTelemetry = {success: 'renew_license_banner_success', error: 'renew_license_banner_fail'};\n\n // System administrators\n if (props.canViewSystemErrors) {\n if ((isLicensePastGracePeriod(props.license) || isLicenseExpired(props.license)) && !props.dismissedExpiredLicense) {\n const message = (<>\n <img\n className='advisor-icon'\n src={warningIcon}\n />\n <FormattedMessage\n id='announcement_bar.error.license_expired'\n defaultMessage='{licenseSku} license is expired and some features may be disabled.'\n values={{\n licenseSku: getSkuDisplayName(props.license.SkuShortName, props.license.IsGovSku === 'true'),\n }}\n />\n </>);\n return (\n <AnnouncementBar\n type={AnnouncementBarTypes.CRITICAL}\n message={\n <div className='announcement-bar__configuration'>\n {message}\n <RenewalLink telemetryInfo={renewLinkTelemetry}/>\n </div>\n }\n tooltipMsg={message}\n handleClose={dismissExpiredLicense}\n showCloseButton={true}\n />\n );\n }\n\n const daysUntilLicenseExpires = daysToLicenseExpire(props.license);\n if (isTrialLicense(props.license) && typeof daysUntilLicenseExpires !== 'undefined' && daysUntilLicenseExpires <= 14 && !props.dismissedExpiringTrialLicense) {\n const purchaseLicense = (\n <PurchaseLink\n buttonTextElement={\n <FormattedMessage\n id='announcement_bar.error.purchase_a_license_now'\n defaultMessage='Purchase a License Now'\n />\n }\n />\n );\n\n let message = (\n <>\n <img\n className='advisor-icon'\n src={alertIcon}\n />\n <FormattedMessage\n id='announcement_bar.error.trial_license_expiring'\n defaultMessage='There are {days} days left on your free trial.'\n tagName='strong'\n values={{\n days: daysUntilLicenseExpires,\n }}\n />\n </>\n );\n\n let announcementBarType = AnnouncementBarTypes.ANNOUNCEMENT;\n\n const {w: width} = getViewportSize();\n if (daysUntilLicenseExpires < 1) {\n const viewportBasedMessage = width < Constants.MOBILE_SCREEN_WIDTH ? formatMessage({\n id: 'announcement_bar.error.trial_license_expiring_last_day.short',\n defaultMessage: 'This is the last day of your free trial.'},\n ) : formatMessage({\n id: 'announcement_bar.error.trial_license_expiring_last_day',\n defaultMessage: 'This is the last day of your free trial. Purchase a license now to continue using Mattermost Professional and Enterprise features.',\n });\n message = (\n <>\n <img\n className='advisor-icon'\n src={warningIcon}\n />\n {viewportBasedMessage}\n </>\n );\n announcementBarType = AnnouncementBarTypes.CRITICAL;\n }\n\n return (\n <AnnouncementBar\n showCloseButton={true}\n handleClose={dismissExpiringTrialLicense}\n type={announcementBarType}\n message={\n <div className='announcement-bar__configuration'>\n {message}\n {purchaseLicense}\n </div>\n }\n tooltipMsg={message}\n />\n );\n }\n\n if (!isTrialLicense(props.license) && isLicenseExpiring(props.license) && !props.dismissedExpiringLicense) {\n const message = (<>\n <img\n className='advisor-icon'\n src={alertIcon}\n />\n <FormattedMessage\n id='announcement_bar.error.license_expiring'\n defaultMessage='{licenseSku} license expires on {date, date, long}.'\n values={{\n date: new Date(parseInt(props.license?.ExpiresAt, 10)),\n licenseSku: getSkuDisplayName(props.license.SkuShortName, props.license.IsGovSku === 'true'),\n }}\n />\n </>);\n return (\n <AnnouncementBar\n showCloseButton={true}\n handleClose={dismissExpiringLicense}\n type={AnnouncementBarTypes.ANNOUNCEMENT}\n message={\n <div className='announcement-bar__configuration'>\n {message}\n <RenewalLink telemetryInfo={renewLinkTelemetry}/>\n </div>\n }\n tooltipMsg={message}\n />\n );\n }\n } else {\n // Regular users\n if (isLicensePastGracePeriod(props.license)) { //eslint-disable-line no-lonely-if\n return (\n <AnnouncementBar\n type={AnnouncementBarTypes.CRITICAL}\n message={\n <>\n <img\n className='advisor-icon'\n src={warningIcon}\n />\n <FormattedMessage\n id={AnnouncementBarMessages.LICENSE_PAST_GRACE}\n defaultMessage='{licenseSku} license is expired and some features may be disabled. Please contact your System Administrator for details.'\n values={{\n licenseSku: getSkuDisplayName(props.license.SkuShortName, props.license.IsGovSku === 'true'),\n }}\n />\n </>\n }\n />\n );\n }\n }\n\n if (props.config?.SendEmailNotifications !== 'true' &&\n props.config?.EnablePreviewModeBanner === 'true'\n ) {\n const emailMessage = formatMessage({\n id: AnnouncementBarMessages.PREVIEW_MODE,\n defaultMessage: 'Preview Mode: Email notifications have not been configured',\n });\n\n return (\n <TextDismissableBar\n allowDismissal={true}\n text={emailMessage}\n type={AnnouncementBarTypes.SUCCESS}\n />\n );\n }\n\n if (props.canViewSystemErrors && props.config?.SiteURL === '') {\n const values: Record<string, ReactNode> = {\n linkSite: (msg: string) => (\n <ExternalLink\n href={props.siteURL}\n location='configuration_announcement_bar'\n >\n {msg}\n </ExternalLink>\n ),\n linkConsole: (msg: string) => (\n <Link to='/admin_console/environment/web_server'>\n {msg}\n </Link>\n ),\n };\n\n let siteURLMessage;\n if (props.config?.EnableSignUpWithGitLab === 'true') {\n siteURLMessage = formatMessage({\n id: 'announcement_bar.error.site_url_gitlab.full',\n defaultMessage: 'Please configure your <linkSite>site URL</linkSite> either on the <linkConsole>System Console</linkConsole> or, if you\\'re using GitLab Mattermost, in gitlab.rb.',\n }, values);\n } else {\n siteURLMessage = formatMessage({\n id: 'announcement_bar.error.site_url.full',\n defaultMessage: 'Please configure your <linkSite>site URL</linkSite> on the <linkConsole>System Console</linkConsole>.',\n }, values);\n }\n\n return (\n <TextDismissableBar\n allowDismissal={true}\n text={siteURLMessage}\n type={AnnouncementBarTypes.ANNOUNCEMENT}\n />\n );\n }\n\n return null;\n};\n\nexport default injectIntl(ConfigurationAnnouncementBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {get as getPreference} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {dismissNotice} from 'actions/views/notice';\n\nimport {AnnouncementBarMessages, ConfigurationBanners, Preferences} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\n\nimport type {GlobalState} from 'types/store';\n\nimport ConfigurationBar from './configuration_bar';\n\nfunction mapStateToProps(state: GlobalState) {\n const currentUserId = getCurrentUserId(state);\n return {\n siteURL: getSiteURL(),\n dismissedExpiringTrialLicense: Boolean(state.views.notice.hasBeenDismissed[AnnouncementBarMessages.TRIAL_LICENSE_EXPIRING]),\n dismissedExpiredLicense: Boolean(getPreference(state, Preferences.CONFIGURATION_BANNERS, ConfigurationBanners.LICENSE_EXPIRED) === 'true'),\n dismissedExpiringLicense: Boolean(state.views.notice.hasBeenDismissed[AnnouncementBarMessages.LICENSE_EXPIRING]),\n currentUserId,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n dismissNotice,\n savePreferences,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ConfigurationBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport BrowserStore from 'stores/browser_store';\n\nimport AnnouncementBar from 'components/announcement_bar/default_announcement_bar';\n\nimport {AnnouncementBarTypes} from 'utils/constants';\nimport {requestNotificationPermission} from 'utils/notifications';\n\nexport default function NotificationPermissionNeverGrantedBar() {\n const [show, setShow] = useState(!BrowserStore.getHideNotificationPermissionRequestBanner());\n\n const handleClick = useCallback(async () => {\n try {\n await requestNotificationPermission();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error requesting notification permission', error);\n } finally {\n // Dismiss the bar after user makes a choice\n setShow(false);\n }\n }, []);\n\n const handleClose = useCallback(() => {\n setShow(false);\n\n // Close the bar and don't show it again for the rest of the session.\n BrowserStore.setHideNotificationPermissionRequestBanner();\n }, []);\n\n if (!show) {\n return null;\n }\n\n return (\n <AnnouncementBar\n type={AnnouncementBarTypes.ANNOUNCEMENT}\n message={\n <FormattedMessage\n id='announcementBar.notification.permissionNeverGrantedBar.message'\n defaultMessage='We need your permission to show notifications in the browser.'\n />\n }\n ctaText={\n <FormattedMessage\n id='announcementBar.notification.permissionNeverGrantedBar.cta'\n defaultMessage='Manage notification preferences'\n />\n }\n showCTA={true}\n showLinkAsButton={true}\n onButtonClick={handleClick}\n showCloseButton={true}\n handleClose={handleClose}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport BrowserStore from 'stores/browser_store';\n\nimport AnnouncementBar from 'components/announcement_bar/default_announcement_bar';\n\nimport {AnnouncementBarTypes} from 'utils/constants';\n\nexport default function UnsupportedNotificationAnnouncementBar() {\n const [show, setShow] = useState(!BrowserStore.getHideNotificationPermissionRequestBanner());\n\n const handleClick = useCallback(async () => {\n window.open('https://mattermost.com/pl/pc-web-requirements', '_blank', 'noopener,noreferrer');\n }, []);\n\n const handleClose = useCallback(() => {\n setShow(false);\n\n // Close the bar and don't show it again for the rest of the session.\n BrowserStore.setHideNotificationPermissionRequestBanner();\n }, []);\n\n if (!show) {\n return null;\n }\n\n return (\n <AnnouncementBar\n showCloseButton={true}\n type={AnnouncementBarTypes.ANNOUNCEMENT}\n handleClose={handleClose}\n message={\n <FormattedMessage\n id='announcementBar.notification.unsupportedBar.message'\n defaultMessage='Your browser does not support browser notifications.'\n />\n }\n ctaText={\n <FormattedMessage\n id='announcementBar.notification.unsupportedBar.cta'\n defaultMessage='Update your browser'\n />\n }\n showCTA={true}\n showLinkAsButton={true}\n onButtonClick={handleClick}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport NotificationPermissionNeverGrantedBar from 'components/announcement_bar/notification_permission_bar/notification_permission_never_granted_bar';\nimport NotificationPermissionUnsupportedBar from 'components/announcement_bar/notification_permission_bar/notification_permission_unsupported_bar';\nimport {useDesktopAppNotificationPermission} from 'components/common/hooks/use_desktop_notification_permission';\n\nimport {\n isNotificationAPISupported,\n NotificationPermissionDenied,\n NotificationPermissionNeverGranted,\n getNotificationPermission,\n} from 'utils/notifications';\n\nexport default function NotificationPermissionBar() {\n const isLoggedIn = Boolean(useSelector(getCurrentUserId));\n\n useDesktopAppNotificationPermission();\n\n if (!isLoggedIn) {\n return null;\n }\n\n // When browser does not support notification API, we show the notification bar to update browser\n if (!isNotificationAPISupported()) {\n return <NotificationPermissionUnsupportedBar/>;\n }\n\n // When user has not granted permission, we show the notification bar to request permission\n if (getNotificationPermission() === NotificationPermissionNeverGranted) {\n return <NotificationPermissionNeverGrantedBar/>;\n }\n\n // When user has denied permission, we don't show since user explicitly denied permission\n if (getNotificationPermission() === NotificationPermissionDenied) {\n return null;\n }\n\n return null;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {PreferenceType} from '@mattermost/types/preferences';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getOverageBannerPreferences} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport AnnouncementBar from 'components/announcement_bar/default_announcement_bar';\nimport {useExpandOverageUsersCheck} from 'components/common/hooks/useExpandOverageUsersCheck';\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\n\nimport {StatTypes, Preferences, AnnouncementBarTypes} from 'utils/constants';\nimport {calculateOverageUserActivated} from 'utils/overage_team';\n\nimport type {GlobalState} from 'types/store';\n\nimport './overage_users_banner.scss';\n\ntype AdminHasDismissedItArgs = {\n preferenceName: string;\n overagePreferences: PreferenceType[];\n isWarningBanner: boolean;\n}\n\nconst adminHasDismissed = ({preferenceName, overagePreferences, isWarningBanner}: AdminHasDismissedItArgs): boolean => {\n if (isWarningBanner) {\n return overagePreferences.find((value) => value.name === preferenceName) !== undefined;\n }\n\n return false;\n};\n\nconst OverageUsersBanner = () => {\n const [openContactSales] = useOpenSalesLink();\n const dispatch = useDispatch();\n const stats = useSelector((state: GlobalState) => state.entities.admin.analytics) || {};\n const isAdmin = useSelector(isCurrentUserSystemAdmin);\n const license = useSelector(getLicense);\n const seatsPurchased = parseInt(license.Users, 10);\n const isCloud = useSelector(isCurrentLicenseCloud);\n const currentUser = useSelector((state: GlobalState) => getCurrentUser(state));\n const overagePreferences = useSelector(getOverageBannerPreferences);\n const activeUsers = ((stats || {})[StatTypes.TOTAL_USERS]) as number || 0;\n const {\n isBetween5PercerntAnd10PercentPurchasedSeats,\n isOver10PercerntPurchasedSeats,\n } = calculateOverageUserActivated({\n activeUsers,\n seatsPurchased,\n });\n const prefixPreferences = isOver10PercerntPurchasedSeats ? 'error' : 'warn';\n const prefixLicenseId = (license.Id || '').substring(0, 8);\n const preferenceName = `${prefixPreferences}_overage_seats_${prefixLicenseId}`;\n\n const overageByUsers = activeUsers - seatsPurchased;\n\n const isOverageState = isBetween5PercerntAnd10PercentPurchasedSeats || isOver10PercerntPurchasedSeats;\n const hasPermission = isAdmin && isOverageState && !isCloud;\n const {\n cta,\n trackEventFn,\n } = useExpandOverageUsersCheck({\n isWarningState: isBetween5PercerntAnd10PercentPurchasedSeats,\n banner: 'global banner',\n });\n\n const handleClose = () => {\n dispatch(savePreferences(currentUser.id, [{\n category: Preferences.OVERAGE_USERS_BANNER,\n name: preferenceName,\n user_id: currentUser.id,\n value: 'Overage users banner watched',\n }]));\n };\n\n const handleContactSalesClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n trackEventFn('Contact Sales');\n openContactSales();\n };\n\n const handleClick = handleContactSalesClick;\n\n if (!hasPermission || adminHasDismissed({isWarningBanner: isBetween5PercerntAnd10PercentPurchasedSeats, overagePreferences, preferenceName})) {\n return null;\n }\n\n const message = (\n <FormattedMessage\n id='licensingPage.overageUsersBanner.text'\n defaultMessage='(Only visible to admins) Your workspace user count has exceeded your paid license seat count by {seats, number} {seats, plural, one {seat} other {seats}}. Purchase additional seats to remain compliant.'\n values={{\n seats: overageByUsers,\n }}\n />);\n\n return (\n <AnnouncementBar\n type={isBetween5PercerntAnd10PercentPurchasedSeats ? AnnouncementBarTypes.ADVISOR : AnnouncementBarTypes.CRITICAL}\n showCloseButton={isBetween5PercerntAnd10PercentPurchasedSeats}\n onButtonClick={handleClick}\n modalButtonText={cta}\n message={message}\n showLinkAsButton={true}\n isTallBanner={true}\n icon={<i className='icon icon-alert-outline'/>}\n handleClose={handleClose}\n />\n );\n};\n\nexport default OverageUsersBanner;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport isEmpty from 'lodash/isEmpty';\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {getCloudCustomer} from 'mattermost-redux/actions/cloud';\nimport {\n getCloudSubscription as selectCloudSubscription,\n getCloudCustomer as selectCloudCustomer,\n getSubscriptionProduct,\n} from 'mattermost-redux/selectors/entities/cloud';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {getHistory} from 'utils/browser_history';\nimport {isCustomerCardExpired} from 'utils/cloud_utils';\nimport {AnnouncementBarTypes, CloudProducts, ConsolePages} from 'utils/constants';\n\nimport AnnouncementBar from '../default_announcement_bar';\n\nexport default function PaymentAnnouncementBar() {\n const [requestedCustomer, setRequestedCustomer] = useState(false);\n const dispatch = useDispatch();\n const subscription = useSelector(selectCloudSubscription);\n const customer = useSelector(selectCloudCustomer);\n const isStarterFree = useSelector(getSubscriptionProduct)?.sku === CloudProducts.STARTER;\n const userIsAdmin = useSelector(isCurrentUserSystemAdmin);\n const isCloud = useSelector(getLicense).Cloud === 'true';\n\n useEffect(() => {\n if (isCloud && !isStarterFree && isEmpty(customer) && userIsAdmin && !requestedCustomer) {\n setRequestedCustomer(true);\n dispatch(getCloudCustomer());\n }\n },\n [isCloud, isStarterFree, customer, userIsAdmin, requestedCustomer]);\n\n const mostRecentPaymentFailed = subscription?.last_invoice?.status === 'failed';\n\n if (\n // Prevents banner flashes if the subscription hasn't been loaded yet\n isEmpty(subscription) ||\n isStarterFree ||\n !isCloud ||\n !userIsAdmin ||\n isEmpty(customer) ||\n (!isCustomerCardExpired(customer) && !mostRecentPaymentFailed)\n ) {\n return null;\n }\n\n const updatePaymentInfo = () => {\n getHistory().push(ConsolePages.PAYMENT_INFO);\n };\n\n let message = (\n <FormattedMessage\n id='admin.billing.subscription.creditCardExpired'\n defaultMessage='Your credit card has expired. Update your payment information to avoid disruption.'\n />\n );\n\n if (mostRecentPaymentFailed) {\n message = (\n <FormattedMessage\n id='admin.billing.subscription.mostRecentPaymentFailed'\n defaultMessage='Your most recent payment failed'\n />\n );\n }\n\n return (\n <AnnouncementBar\n type={AnnouncementBarTypes.CRITICAL}\n showCloseButton={false}\n onButtonClick={updatePaymentInfo}\n modalButtonText={messages.updatePaymentInfo}\n message={message}\n showLinkAsButton={true}\n isTallBanner={true}\n />\n );\n}\n\nconst messages = defineMessages({\n updatePaymentInfo: {\n id: 'admin.billing.subscription.updatePaymentInfo',\n defaultMessage: 'Update payment info',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect} from 'react';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport useGetTotalUsersNoBots from 'components/common/hooks/useGetTotalUsersNoBots';\nimport useOpenStartTrialFormModal from 'components/common/hooks/useOpenStartTrialFormModal';\n\nimport {\n Preferences,\n Constants,\n TELEMETRY_CATEGORIES,\n ModalIdentifiers,\n} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nconst ShowStartTrialModal = () => {\n const isUserAdmin = useSelector((state: GlobalState) => isCurrentUserSystemAdmin(state));\n const openStartTrialFormModal = useOpenStartTrialFormModal();\n\n const dispatch = useDispatch();\n\n const userThreshold = 10;\n const TRUE = 'true';\n\n const isBenefitsModalOpened = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.TRIAL_BENEFITS_MODAL));\n\n const installationDate = useSelector((state: GlobalState) => getConfig(state).InstallationDate);\n const currentUser = useSelector((state: GlobalState) => getCurrentUser(state));\n const hadAdminDismissedModal = useSelector((state: GlobalState) => getBool(state, Preferences.START_TRIAL_MODAL, Constants.TRIAL_MODAL_AUTO_SHOWN));\n\n const prevTrialLicense = useSelector((state: GlobalState) => state.entities.admin.prevTrialLicense);\n const currentLicense = useSelector(getLicense);\n const isLicensed = (license: any) => {\n if (!license?.IsLicensed) {\n return false;\n }\n return license.IsLicensed === TRUE;\n };\n const isPrevLicensed = isLicensed(prevTrialLicense);\n const isCurrentLicensed = isLicensed(currentLicense);\n const totalUsers = useGetTotalUsersNoBots(true);\n\n // Show this modal if the instance is currently not licensed and has never had a trial license loaded before\n const isLicensedOrPreviousLicensed = (isCurrentLicensed || isPrevLicensed);\n\n const handleOnClose = () => {\n trackEvent(\n TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_AUTO_MODAL,\n 'close_start_trial_auto_modal',\n );\n dispatch(savePreferences(currentUser.id, [\n {\n category: Preferences.START_TRIAL_MODAL,\n user_id: currentUser.id,\n name: Constants.TRIAL_MODAL_AUTO_SHOWN,\n value: TRUE,\n },\n ]));\n };\n\n useEffect(() => {\n const installationDatePlus6Hours = (6 * 60 * 60 * 1000) + Number(installationDate);\n const now = new Date().getTime();\n const hasEnvMoreThan6Hours = now > installationDatePlus6Hours;\n const hasEnvMoreThan10Users = Number(totalUsers) > userThreshold;\n if (isUserAdmin && !isBenefitsModalOpened && hasEnvMoreThan10Users && hasEnvMoreThan6Hours && !hadAdminDismissedModal && !isLicensedOrPreviousLicensed) {\n openStartTrialFormModal({trackingLocation: 'show_start_trial_modal'}, handleOnClose);\n trackEvent(\n TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_AUTO_MODAL,\n 'trigger_start_trial_auto_modal',\n );\n }\n }, [totalUsers]);\n\n return null;\n};\nexport default ShowStartTrialModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport './three_days_left_trial_modal.scss';\n\nexport type LearnMoreActionButtonProps = {\n id: string;\n route: string;\n message: string;\n telemetryCategory: string;\n telemetryId: string;\n onClick?: () => void;\n styleLink?: boolean; // show as a anchor link\n}\n\nconst LearnMoreActionButton = (\n {\n id,\n route,\n message,\n onClick,\n styleLink = false,\n telemetryId,\n telemetryCategory,\n }: LearnMoreActionButtonProps) => {\n const history = useHistory();\n\n const redirect = useCallback(() => {\n if (route.indexOf('http://') === 0 || route.indexOf('https://') === 0) {\n window.open(route);\n } else {\n history.push(route);\n }\n\n if (onClick) {\n onClick();\n }\n\n trackEvent(\n telemetryCategory,\n telemetryId + '_section_opened_' + id,\n );\n }, [route, onClick]);\n\n return (\n <a\n className={`LearnMoreActionButton ${styleLink ? '' : 'learn-more-button'}`}\n onClick={redirect}\n >\n {message}\n </a>\n );\n};\n\nexport default LearnMoreActionButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {TELEMETRY_CATEGORIES} from 'utils/constants';\n\nimport LearnMoreActionButton from './learn_more_action_button';\n\nimport './three_days_left_trial_modal.scss';\n\nexport type ThreeDaysLeftTrialCardProps = {\n id: string;\n title: string;\n description: string | JSX.Element;\n svgWrapperClassName: string;\n svgElement: React.ReactNode;\n buttonLabel?: string;\n pageURL?: string;\n isCloud?: boolean;\n onClose?: () => void;\n}\n\nconst ThreeDaysLeftTrialCard = (\n {\n id,\n title,\n description,\n svgWrapperClassName,\n svgElement,\n buttonLabel,\n pageURL,\n onClose,\n }: ThreeDaysLeftTrialCardProps) => {\n return (\n <div\n id={`threeDaysLeftTrialCard-${id}`}\n className='three-days-left-card slide-container'\n >\n <div className={`${svgWrapperClassName} svg-wrapper`}>\n {svgElement}\n </div>\n <div className='content-wrapper'>\n <div className='title'>\n {title}\n </div>\n <div className='description'>\n {description}\n {(pageURL && buttonLabel) && (\n <LearnMoreActionButton\n id={id}\n route={pageURL}\n message={buttonLabel}\n onClick={onClose}\n telemetryCategory={TELEMETRY_CATEGORIES.CLOUD_THREE_DAYS_LEFT_MODAL}\n telemetryId={'three_days_left_trial'}\n />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default ThreeDaysLeftTrialCard;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport SystemRolesSVG from 'components/admin_console/feature_discovery/features/images/system_roles_svg';\nimport WorkspaceLimitsPanel from 'components/cloud_usage_modal/workspace_limits_panel';\nimport useGetLimits from 'components/common/hooks/useGetLimits';\nimport useGetUsage from 'components/common/hooks/useGetUsage';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport GuestAccessSvg from 'components/common/svg_images_components/guest_access_svg';\nimport MonitorImacLikeSVG from 'components/common/svg_images_components/monitor_imaclike_svg';\n\nimport {ConsolePages, DocLinks, ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport ThreeDaysLeftTrialCard from './three_days_left_trial_modal_card';\nimport type {ThreeDaysLeftTrialCardProps} from './three_days_left_trial_modal_card';\n\nimport './three_days_left_trial_modal.scss';\n\ntype Props = {\n onExited?: () => void;\n limitsOverpassed: boolean;\n}\n\nfunction ThreeDaysLeftTrialModal(props: Props): JSX.Element | null {\n const dispatch = useDispatch();\n const {formatMessage} = useIntl();\n const openPricingModal = useOpenPricingModal();\n const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.THREE_DAYS_LEFT_TRIAL_MODAL));\n const usage = useGetUsage();\n const [limits] = useGetLimits();\n\n // move this to the show three days left so it is easier to test\n const handleOnClose = async () => {\n if (props.onExited) {\n props.onExited();\n }\n await dispatch(closeModal(ModalIdentifiers.THREE_DAYS_LEFT_TRIAL_MODAL));\n };\n\n const handleOpenPricingModal = async () => {\n await dispatch(closeModal(ModalIdentifiers.THREE_DAYS_LEFT_TRIAL_MODAL));\n openPricingModal({trackingLocation: 'three_days_left_trial_modal'});\n };\n\n const buttonLabel = formatMessage({id: 'three_days_left_trial_modal.learnMore', defaultMessage: 'Learn more'});\n\n const steps: ThreeDaysLeftTrialCardProps[] = useMemo(() => [\n {\n id: 'useSso',\n title: formatMessage({id: 'three_days_left_trial.modal.useSsoTitle', defaultMessage: 'Single Sign on (with OpenID, SAML, Google, 0365)'}),\n description: formatMessage({id: 'three_days_left_trial.modal.useSsoDescription', defaultMessage: 'Collaborate with users outside of your organization while tightly controlling their access to channels and team members.'}),\n svgWrapperClassName: 'guestAccessSvg',\n svgElement: (\n <GuestAccessSvg\n width={130}\n height={90}\n />\n ),\n pageURL: DocLinks.SETUP_SAML,\n buttonLabel,\n },\n {\n id: 'ldap',\n title: formatMessage({id: 'three_days_left_trial.modal.ldapTitle', defaultMessage: 'Synchronize your Active Directory/LDAP groups'}),\n description: formatMessage({id: 'three_days_left_trial.modal.ldapDescription', defaultMessage: 'Use AD/LDAP groups to organize and apply actions to multiple users at once. Manage team and channel memberships, permissions and more.'}),\n svgWrapperClassName: 'personMacSvg',\n svgElement: (\n <MonitorImacLikeSVG\n width={130}\n height={90}\n />\n ),\n pageURL: DocLinks.ONBOARD_LDAP,\n buttonLabel,\n },\n {\n id: 'systemConsole',\n title: formatMessage({id: 'three_days_left_trial.modal.systemConsoleTitle', defaultMessage: 'Provide controlled access to the System Console'}),\n description: formatMessage({id: 'three_days_left_trial.modal.systemConsoleDescription', defaultMessage: 'Assign customizable admin roles to give designated users read and/or write access to select sections of System Console.'}),\n svgWrapperClassName: 'personBoxSvg',\n svgElement: (\n <SystemRolesSVG\n width={130}\n height={90}\n />\n ),\n pageURL: ConsolePages.LICENSE,\n buttonLabel,\n },\n ], []);\n\n let headerText = formatMessage({id: 'three_days_left_trial.modal.title', defaultMessage: 'Your trial ends soon'});\n let headerSubtitleText = formatMessage({id: 'three_days_left_trial.modal.subtitle', defaultMessage: 'There is still time to explore what our paid plans can help you accomplish.'});\n\n let content: React.ReactNode = useMemo(\n () =>\n steps.map(({id, ...rest}) => (\n <ThreeDaysLeftTrialCard\n {...rest}\n id={id}\n key={id}\n />\n )),\n [],\n );\n\n if (props.limitsOverpassed) {\n headerText = formatMessage({id: 'three_days_left_trial.modal.titleLimitsOverpassed', defaultMessage: 'Upgrade before the trial ends'});\n headerSubtitleText = formatMessage({id: 'three_days_left_trial.modal.subtitleLimitsOverpassed', defaultMessage: 'There are 3 days left on your trial. Upgrade to our Professional or Enterprise plan to avoid exceeding your data limits on the Free plan.'});\n content = (\n <div className='workspace-limits-panel'>\n <p className='limits-title'>\n {formatMessage({id: 'three_days_left_trial.modal.limitsTitle', defaultMessage: 'Limits'})}\n </p>\n <WorkspaceLimitsPanel\n showIcons={true}\n limits={limits}\n usage={usage}\n />\n </div>\n );\n }\n\n if (!show) {\n return null;\n }\n\n return (\n <GenericModal\n className='ThreeDaysLeftTrialModal'\n id='threeDaysLeftTrialModal'\n onExited={handleOnClose}\n modalHeaderText={headerText}\n compassDesign={true}\n >\n <div className='header-subtitle-text'>\n {headerSubtitleText}\n </div>\n <div className='content-container'>\n {content}\n </div>\n <div className='divisory-line'/>\n <div className='footer-content'>\n <button\n onClick={handleOpenPricingModal}\n className='open-view-plans-modal-btn'\n >\n {formatMessage({id: 'three_days_left_trial.modal.viewPlans', defaultMessage: 'View plan options'})}\n </button>\n </div>\n </GenericModal>\n );\n}\n\nexport default ThreeDaysLeftTrialModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport {useEffect} from 'react';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCloudSubscription} from 'mattermost-redux/selectors/entities/cloud';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {get as getPreference} from 'mattermost-redux/selectors/entities/preferences';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {openModal, closeModal} from 'actions/views/modals';\n\nimport useGetHighestThresholdCloudLimit from 'components/common/hooks/useGetHighestThresholdCloudLimit';\nimport useGetLimits from 'components/common/hooks/useGetLimits';\nimport useGetUsage from 'components/common/hooks/useGetUsage';\nimport ThreeDaysLeftTrialModal from 'components/three_days_left_trial_modal/three_days_left_trial_modal';\n\nimport {\n Preferences,\n TELEMETRY_CATEGORIES,\n ModalIdentifiers,\n CloudBanners,\n} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nconst ShowThreeDaysLeftTrialModal = () => {\n const license = useSelector(getLicense);\n const isCloud = license?.Cloud === 'true';\n const isUserAdmin = useSelector((state: GlobalState) => isCurrentUserSystemAdmin(state));\n const subscription = useSelector(getCloudSubscription);\n const isFreeTrial = subscription?.is_free_trial === 'true';\n\n const dispatch = useDispatch();\n const hadAdminDismissedModal = useSelector((state: GlobalState) => getPreference(state, Preferences.CLOUD_TRIAL_BANNER, CloudBanners.THREE_DAYS_LEFT_TRIAL_MODAL_DISMISSED)) === 'true';\n\n const trialEndDate = new Date(subscription?.trial_end_at || 0);\n\n const today = moment();\n const formattedEndDate = moment(Number(trialEndDate || 0));\n const diffDays = formattedEndDate.diff(today, 'days');\n\n // the trial will end in three days or left\n const trialEndInThreeDaysOrLess = diffDays <= 3;\n\n // validate the logic for the limits and pass that to the modal as a property\n const someLimitNeedsAttention = Boolean(useGetHighestThresholdCloudLimit(useGetUsage(), useGetLimits()[0]));\n\n const currentUserId = useSelector(getCurrentUserId);\n\n const handleOnClose = async () => {\n trackEvent(\n TELEMETRY_CATEGORIES.CLOUD_ADMIN,\n 'dismissed_three_days_left_trial_modal',\n );\n\n await dispatch(savePreferences(currentUserId, [{\n category: Preferences.CLOUD_TRIAL_BANNER,\n user_id: currentUserId,\n name: CloudBanners.THREE_DAYS_LEFT_TRIAL_MODAL_DISMISSED,\n value: 'true',\n }]));\n dispatch(closeModal(ModalIdentifiers.THREE_DAYS_LEFT_TRIAL_MODAL));\n };\n\n useEffect(() => {\n if (subscription?.trial_end_at === undefined || subscription.trial_end_at === 0) {\n return;\n }\n\n if (isCloud && isFreeTrial && isUserAdmin && !hadAdminDismissedModal && trialEndInThreeDaysOrLess) {\n dispatch(openModal({\n modalId: ModalIdentifiers.THREE_DAYS_LEFT_TRIAL_MODAL,\n dialogType: ThreeDaysLeftTrialModal,\n dialogProps: {\n limitsOverpassed: someLimitNeedsAttention,\n onExited: handleOnClose,\n },\n }));\n trackEvent(\n TELEMETRY_CATEGORIES.CLOUD_THREE_DAYS_LEFT_MODAL,\n 'trigger_cloud_three_days_left_modal',\n );\n }\n }, [subscription?.trial_end_at]);\n\n return null;\n};\nexport default ShowThreeDaysLeftTrialModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ServerLimits} from '@mattermost/types/limits';\nimport type {GlobalState} from '@mattermost/types/store';\n\nexport function getServerLimits(state: GlobalState): ServerLimits {\n return state.entities.limits.serverLimits;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {AlertOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {ClientLicense} from '@mattermost/types/config';\n\nimport {getServerLimits} from 'mattermost-redux/selectors/entities/limits';\n\nimport AnnouncementBar from 'components/announcement_bar/default_announcement_bar';\n\nimport {AnnouncementBarTypes} from 'utils/constants';\n\ntype Props = {\n license?: ClientLicense;\n userIsAdmin: boolean;\n};\n\nconst learnMoreExternalLink = 'https://mattermost.com/pl/error-code-error-safety-limits-exceeded';\n\nfunction UsersLimitsAnnouncementBar(props: Props) {\n const serverLimits = useSelector(getServerLimits);\n\n const handleCTAClick = useCallback(() => {\n window.open(learnMoreExternalLink, '_blank');\n }, []);\n\n const isLicensed = props?.license?.IsLicensed === 'true';\n const maxUsersLimit = serverLimits?.maxUsersLimit ?? 0;\n const activeUserCount = serverLimits?.activeUserCount ?? 0;\n\n if (!shouldShowUserLimitsAnnouncementBar({userIsAdmin: props.userIsAdmin, isLicensed, maxUsersLimit, activeUserCount})) {\n return null;\n }\n\n return (\n <AnnouncementBar\n id='users_limits_announcement_bar'\n showCloseButton={false}\n message={\n <FormattedMessage\n id='users_limits_announcement_bar.copyText'\n defaultMessage='User limits exceeded. Contact administrator with: {ErrorCode}'\n values={{\n ErrorCode: 'ERROR_SAFETY_LIMITS_EXCEEDED',\n }}\n />\n }\n type={AnnouncementBarTypes.CRITICAL}\n icon={<AlertOutlineIcon size={16}/>}\n showCTA={true}\n showLinkAsButton={true}\n ctaText={\n <FormattedMessage\n id='users_limits_announcement_bar.ctaText'\n defaultMessage='Learn More'\n />\n }\n onButtonClick={handleCTAClick}\n />\n );\n}\n\nexport type ShouldShowingUserLimitsAnnouncementBarProps = {\n userIsAdmin: boolean;\n isLicensed: boolean;\n maxUsersLimit: number;\n activeUserCount: number;\n};\n\nexport function shouldShowUserLimitsAnnouncementBar({userIsAdmin, isLicensed, maxUsersLimit, activeUserCount}: ShouldShowingUserLimitsAnnouncementBarProps) {\n if (!userIsAdmin) {\n return false;\n }\n\n if (maxUsersLimit === 0 || activeUserCount === 0) {\n return false;\n }\n\n return !isLicensed && activeUserCount >= maxUsersLimit;\n}\n\nexport default UsersLimitsAnnouncementBar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {AnnouncementBarTypes} from 'utils/constants';\n\nimport AnnouncementBar from '../default_announcement_bar';\n\ntype Props = {\n buildHash?: string;\n}\n\nconst reloadPage = () => {\n window.location.reload();\n};\n\nconst VersionBar = ({\n buildHash,\n}: Props) => {\n const [buildHashOnAppLoad, setBuildHashOnAppLoad] = useState<string|undefined>(buildHash);\n\n useEffect(() => {\n if (!buildHashOnAppLoad && buildHash) {\n setBuildHashOnAppLoad(buildHash);\n }\n }, [buildHash, buildHashOnAppLoad]);\n\n if (!buildHashOnAppLoad || buildHashOnAppLoad === buildHash) {\n return null;\n }\n\n if (buildHashOnAppLoad !== buildHash) {\n return (\n <AnnouncementBar\n type={AnnouncementBarTypes.ANNOUNCEMENT}\n message={\n <>\n <FormattedMessage\n id='version_bar.new'\n defaultMessage='A new version of Mattermost is available.'\n />\n <a\n onClick={reloadPage}\n style={{marginLeft: '.5rem'}}\n >\n <FormattedMessage\n id='version_bar.refresh'\n defaultMessage='Refresh the app now'\n />\n </a>\n {'.'}\n </>\n }\n />\n );\n }\n\n return null;\n};\n\nexport default React.memo(VersionBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport VersionBar from './version_bar';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n buildHash: state.entities.general.config.BuildHash,\n };\n}\n\nexport default connect(mapStateToProps)(VersionBar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {ClientLicense, ClientConfig, WarnMetricStatus} from '@mattermost/types/config';\n\nimport {ToPaidPlanBannerDismissable} from 'components/admin_console/billing/billing_subscriptions/to_paid_plan_nudge_banner';\nimport withGetCloudSubscription from 'components/common/hocs/cloud/with_get_cloud_subscription';\n\nimport CloudTrialAnnouncementBar from './cloud_trial_announcement_bar';\nimport CloudTrialEndAnnouncementBar from './cloud_trial_ended_announcement_bar';\nimport ConfigurationAnnouncementBar from './configuration_bar';\nimport AnnouncementBar from './default_announcement_bar';\nimport NotificationPermissionBar from './notification_permission_bar';\nimport OverageUsersBanner from './overage_users_banner';\nimport PaymentAnnouncementBar from './payment_announcement_bar';\nimport AutoStartTrialModal from './show_start_trial_modal/show_start_trial_modal';\nimport ShowThreeDaysLeftTrialModal from './show_tree_days_left_trial_modal/show_three_days_left_trial_modal';\nimport TextDismissableBar from './text_dismissable_bar';\nimport UsersLimitsAnnouncementBar from './users_limits_announcement_bar';\nimport VersionBar from './version_bar';\n\ntype Props = {\n license?: ClientLicense;\n config?: Partial<ClientConfig>;\n canViewSystemErrors: boolean;\n userIsAdmin: boolean;\n latestError?: {\n error: any;\n };\n warnMetricsStatus?: Record<string, WarnMetricStatus>;\n actions: {\n dismissError: (index: number) => void;\n getCloudSubscription: () => void;\n getCloudCustomer: () => void;\n };\n};\n\nclass AnnouncementBarController extends React.PureComponent<Props> {\n render() {\n let adminConfiguredAnnouncementBar = null;\n if (this.props.config?.EnableBanner === 'true' && this.props.config.BannerText?.trim()) {\n adminConfiguredAnnouncementBar = (\n <TextDismissableBar\n className='admin-announcement'\n color={this.props.config.BannerColor}\n textColor={this.props.config.BannerTextColor}\n allowDismissal={this.props.config.AllowBannerDismissal === 'true'}\n text={this.props.config.BannerText}\n />\n );\n }\n\n let errorBar = null;\n if (this.props.latestError) {\n errorBar = (\n <AnnouncementBar\n type={this.props.latestError.error.type}\n message={this.props.latestError.error.message}\n showCloseButton={true}\n handleClose={this.props.actions.dismissError}\n />\n );\n }\n\n let paymentAnnouncementBar = null;\n let cloudTrialAnnouncementBar = null;\n let cloudTrialEndAnnouncementBar = null;\n const notifyAdminDowngradeDelinquencyBar = null;\n const toYearlyNudgeBannerDismissable = null;\n let toPaidPlanNudgeBannerDismissable = null;\n if (this.props.license?.Cloud === 'true') {\n paymentAnnouncementBar = (\n <PaymentAnnouncementBar/>\n );\n cloudTrialAnnouncementBar = (\n <CloudTrialAnnouncementBar/>\n );\n cloudTrialEndAnnouncementBar = (\n <CloudTrialEndAnnouncementBar/>\n );\n\n toPaidPlanNudgeBannerDismissable = (<ToPaidPlanBannerDismissable/>);\n }\n\n let autoStartTrialModal = null;\n if (this.props.userIsAdmin) {\n autoStartTrialModal = (\n <AutoStartTrialModal/>\n );\n }\n\n // The component specified further down takes priority over the component above it.\n // For example, consider this-\n // {\n // Foo\n // Bar\n // Baz\n // }\n // Even if all Foo, Bar and Baz render, only Baz is visible as it's further down.\n // One exception to this rule is for admin configured announcement banners\n // If set with class 'admin-announcement', they will always be visible, stacked vertically.\n return (\n <>\n <NotificationPermissionBar/>\n {adminConfiguredAnnouncementBar}\n {errorBar}\n <UsersLimitsAnnouncementBar\n license={this.props.license}\n userIsAdmin={this.props.userIsAdmin}\n />\n {paymentAnnouncementBar}\n {cloudTrialAnnouncementBar}\n {cloudTrialEndAnnouncementBar}\n {notifyAdminDowngradeDelinquencyBar}\n {toYearlyNudgeBannerDismissable}\n {toPaidPlanNudgeBannerDismissable}\n {this.props.license?.Cloud !== 'true' && <OverageUsersBanner/>}\n {autoStartTrialModal}\n <ShowThreeDaysLeftTrialModal/>\n <VersionBar/>\n <ConfigurationAnnouncementBar\n config={this.props.config}\n license={this.props.license}\n canViewSystemErrors={this.props.canViewSystemErrors}\n warnMetricsStatus={this.props.warnMetricsStatus}\n />\n </>\n );\n }\n}\n\nexport default withGetCloudSubscription(AnnouncementBarController);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getStandardAnalytics} from 'mattermost-redux/actions/admin';\nimport {getCloudSubscription, getCloudCustomer} from 'mattermost-redux/actions/cloud';\nimport {dismissError} from 'mattermost-redux/actions/errors';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\nimport {getDisplayableErrors} from 'mattermost-redux/selectors/errors';\n\nimport {dismissNotice} from 'actions/views/notice';\n\nimport type {GlobalState} from 'types/store';\n\nimport AnnouncementBarController from './announcement_bar_controller';\n\nfunction mapStateToProps(state: GlobalState) {\n const canViewSystemErrors = haveISystemPermission(state, {permission: Permissions.MANAGE_SYSTEM});\n const license = getLicense(state);\n const config = getConfig(state);\n const errors = getDisplayableErrors(state);\n const isCloud = license.Cloud === 'true';\n const subscription = state.entities.cloud?.subscription;\n const userIsAdmin = isCurrentUserSystemAdmin(state);\n\n let latestError = null;\n if (errors && errors.length >= 1) {\n latestError = errors[0];\n }\n\n return {\n license,\n config,\n canViewSystemErrors,\n latestError,\n isCloud,\n subscription,\n userIsAdmin,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n const dismissFirstError = dismissError.bind(null, 0);\n return {\n actions: bindActionCreators({\n getStandardAnalytics,\n dismissError: dismissFirstError,\n dismissNotice,\n getCloudSubscription,\n getCloudCustomer,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AnnouncementBarController);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nexport function getDisplayableErrors(state: GlobalState) {\n return state.errors.filter((error) => error.displayable);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\n\nimport './purchase_link.scss';\n\nexport interface Props {\n buttonTextElement: JSX.Element;\n eventID?: string;\n}\n\nconst PurchaseLink: React.FC<Props> = (props: Props) => {\n const [openSalesLink] = useOpenSalesLink();\n\n const handlePurchaseLinkClick = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n trackEvent('admin', props.eventID || 'in_trial_purchase_license');\n\n openSalesLink();\n };\n\n return (\n <button\n id={props.eventID}\n className={'annnouncementBar__purchaseNow'}\n onClick={handlePurchaseLinkClick}\n >\n {props.buttonTextElement}\n </button>\n );\n};\n\nexport default PurchaseLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport enum Load {\n DONE,\n LOADING,\n FAILED,\n}\n\nexport const USER_GROUP_POPOVER_OPENING_DELAY = 300;\nexport const USER_GROUP_POPOVER_CLOSING_DELAY = 500;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState, useRef} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport {useHistory} from 'react-router-dom';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport {VariableSizeList} from 'react-window';\nimport type {ListChildComponentProps} from 'react-window';\nimport InfiniteLoader from 'react-window-infinite-loader';\nimport styled, {css} from 'styled-components';\n\nimport type {Group} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport NoResultsIndicator from 'components/no_results_indicator';\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\nimport ProfilePopover from 'components/profile_popover';\nimport StatusIcon from 'components/status_icon';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\nimport Avatar from 'components/widgets/users/avatar';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {UserStatuses} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport {Load} from '../constants';\n\nconst USERS_PER_PAGE = 100;\n\n// These constants must be changed if user list style is modified\nexport const VIEWPORT_SCALE_FACTOR = 0.4;\nconst ITEM_HEIGHT = 40;\nconst MARGIN = 8;\nconst getItemHeight = (isCap: boolean) => (isCap ? ITEM_HEIGHT + MARGIN : ITEM_HEIGHT);\nexport const getListHeight = (num: number) => (num * ITEM_HEIGHT) + (2 * MARGIN);\n\n// Reasonable extrema for the user list\nconst MIN_LIST_HEIGHT = 120;\nexport const MAX_LIST_HEIGHT = 800;\n\nexport type GroupMember = {\n user: UserProfile;\n displayName: string;\n}\n\nexport type Props = {\n\n /**\n * The group corresponding to the parent popover\n */\n group: Group;\n\n /**\n * Function to call if parent popover should be hidden\n */\n hide: () => void;\n\n /**\n * State of current search\n */\n searchState: Load;\n\n /**\n * @internal\n */\n members: GroupMember[];\n teamUrl: string;\n searchTerm: string;\n\n actions: {\n getUsersInGroup: (groupId: string, page: number, perPage: number, sort: string) => Promise<ActionResult<UserProfile[]>>;\n openDirectChannelToUserId: (userId: string) => Promise<ActionResult>;\n closeRightHandSide: () => void;\n };\n}\n\nconst GroupMemberList = (props: Props) => {\n const {\n group,\n actions,\n members,\n hide,\n teamUrl,\n searchTerm,\n searchState,\n } = props;\n\n const history = useHistory();\n\n const {formatMessage} = useIntl();\n\n const [nextPage, setNextPage] = useState(Math.floor(members.length / USERS_PER_PAGE));\n const [nextPageLoadState, setNextPageLoadState] = useState(Load.DONE);\n const [currentDMLoading, setCurrentDMLoading] = useState<string | undefined>(undefined);\n\n const infiniteLoaderRef = useRef<InfiniteLoader | null>(null);\n const variableSizeListRef = useRef<VariableSizeList | null>(null);\n const [hasMounted, setHasMounted] = useState(false);\n\n useEffect(() => {\n if (hasMounted) {\n if (infiniteLoaderRef.current) {\n infiniteLoaderRef.current.resetloadMoreItemsCache();\n }\n if (variableSizeListRef.current) {\n variableSizeListRef.current.resetAfterIndex(0);\n }\n }\n setHasMounted(true);\n }, [members.length, hasMounted]);\n\n const loadNextPage = async () => {\n setNextPageLoadState(Load.LOADING);\n const res = await actions.getUsersInGroup(group.id, nextPage, USERS_PER_PAGE, 'display_name');\n if (res.data) {\n setNextPage(nextPage + 1);\n setNextPageLoadState(Load.DONE);\n } else {\n setNextPageLoadState(Load.FAILED);\n }\n };\n\n const showDirectChannel = (user: UserProfile) => {\n if (currentDMLoading !== undefined) {\n return;\n }\n setCurrentDMLoading(user.id);\n actions.openDirectChannelToUserId(user.id).then((result: ActionResult) => {\n if (!result.error) {\n actions.closeRightHandSide();\n setCurrentDMLoading(undefined);\n hide?.();\n history.push(`${teamUrl}/messages/@${user.username}`);\n }\n });\n };\n\n const isSearching = searchTerm !== '';\n const hasNextPage = !isSearching && members.length < group.member_count;\n const itemCount = !isSearching && hasNextPage ? members.length + 1 : members.length;\n\n const loadMoreItems = isSearching || nextPageLoadState === Load.LOADING ? () => {} : loadNextPage;\n\n const maxListHeight = Math.min(MAX_LIST_HEIGHT, Math.max(MIN_LIST_HEIGHT, Utils.getViewportSize().h * VIEWPORT_SCALE_FACTOR));\n\n const isUserLoaded = (index: number) => {\n return isSearching || !hasNextPage || index < members.length;\n };\n\n const Item = ({index, style}: ListChildComponentProps) => {\n const status = useSelector((state: GlobalState) => getStatusForUserId(state, members[index]?.user?.id) || UserStatuses.OFFLINE);\n\n // Remove explicit height provided by VariableSizeList\n style.height = undefined;\n\n if (isUserLoaded(index)) {\n const user = members[index].user;\n const name = members[index].displayName;\n\n return (\n <UserListItem\n className='group-member-list_item'\n first={index === 0}\n last={index === group.member_count - 1}\n style={style}\n key={user.id}\n role='listitem'\n >\n <ProfilePopover\n userId={user.id}\n src={Utils.imageURLForUser(user?.id ?? '')}\n hideStatus={user.is_bot}\n >\n <UserButton>\n <span className='status-wrapper'>\n <Avatar\n username={user.username}\n size={'sm'}\n url={Utils.imageURLForUser(user?.id ?? '')}\n className={'avatar-post-preview'}\n tabIndex={-1}\n />\n <StatusIcon\n status={status}\n />\n </span>\n <Username className='overflow--ellipsis text-nowrap'>{name}</Username>\n <Gap className='group-member-list_gap'/>\n </UserButton>\n </ProfilePopover>\n <DMContainer className='group-member-list_dm-button'>\n <WithTooltip\n title={formatMessage({id: 'group_member_list.sendMessageTooltip', defaultMessage: 'Send message'})}\n >\n <DMButton\n className='btn btn-icon btn-xs'\n aria-label={formatMessage(\n {id: 'group_member_list.sendMessageButton', defaultMessage: 'Send message to {user}'},\n {user: name})}\n onClick={() => showDirectChannel(user)}\n >\n <i\n className='icon icon-send'\n />\n </DMButton>\n </WithTooltip>\n </DMContainer>\n </UserListItem>\n );\n }\n\n return (\n <LoadingItem\n style={style}\n first={index === 0}\n last={index === members.length}\n >\n <LoadingSpinner/>\n </LoadingItem>\n );\n };\n\n const renderContent = () => {\n if (searchState === Load.LOADING) {\n return (\n <LargeLoadingItem>\n <LoadingSpinner/>\n </LargeLoadingItem>\n );\n } else if (searchState === Load.FAILED) {\n return (\n <LoadFailedItem>\n <span>\n <FormattedMessage\n id='group_member_list.searchError'\n defaultMessage='There was a problem getting results. Clear your search term and try again.'\n />\n </span>\n </LoadFailedItem>\n );\n } else if (isSearching && members.length === 0) {\n return (\n <NoResultsItem>\n <NoResultsIndicator\n variant={NoResultsVariant.ChannelSearch}\n titleValues={{channelName: `\"${searchTerm}\"`}}\n />\n </NoResultsItem>\n );\n } else if (nextPageLoadState === Load.FAILED) {\n return (\n <LoadFailedItem>\n <span>\n <FormattedMessage\n id='group_member_list.loadError'\n defaultMessage='Oops! Something went wrong while loading this group.'\n />\n {' '}\n <RetryButton\n onClick={loadMoreItems}\n >\n <FormattedMessage\n id='group_member_list.retryLoadButton'\n defaultMessage='Retry'\n />\n </RetryButton>\n </span>\n </LoadFailedItem>\n );\n }\n return (<AutoSizer>\n {({height, width}) => (\n <InfiniteLoader\n ref={infiniteLoaderRef}\n isItemLoaded={isUserLoaded}\n itemCount={itemCount}\n loadMoreItems={loadMoreItems}\n threshold={5}\n >\n {({onItemsRendered, ref}) => (\n <VariableSizeList\n itemCount={itemCount}\n onItemsRendered={onItemsRendered}\n ref={ref}\n itemSize={(index) => getItemHeight(index === 0 || index === group.member_count - 1 || index === members.length + 1)}\n height={height}\n width={width}\n >\n {Item}\n </VariableSizeList>)}\n </InfiniteLoader>\n )}\n </AutoSizer>);\n };\n\n return (\n <UserList\n style={{height: Math.min(maxListHeight, getListHeight(group.member_count))}}\n role='list'\n >\n {renderContent()}\n </UserList>\n );\n};\n\nconst UserList = styled.div`\n display: flex;\n padding: 0;\n margin: 0;\n border-top: 1px solid rgba(var(--center-channel-color-rgb), 0.08);\n box-sizing: content-box;\n position: relative;\n`;\n\nconst UserListItem = styled.div<{first?: boolean; last?: boolean}>`\n ${(props) => props.first && css `\n margin-top: ${MARGIN}px;\n `}\n\n ${(props) => props.last && css `\n margin-bottom: ${MARGIN}px;\n `}\n\n &:hover {\n background: rgba(var(--center-channel-color-rgb), 0.08);\n }\n\n .group-member-list_gap {\n display: none;\n }\n\n .group-member-list_dm-button {\n opacity: 0;\n }\n\n &:hover .group-member-list_gap,\n &:focus-within .group-member-list_gap {\n display: initial;\n }\n\n &:hover .group-member-list_dm-button,\n &:focus-within .group-member-list_dm-button {\n opacity: 1;\n }\n`;\n\nconst UserButton = styled.button`\n display: flex;\n width: 100%;\n padding: 5px 20px;\n border: none;\n background: unset;\n text-align: unset;\n align-items: center;\n`;\n\n// A gap to make space for the DM button to be positioned on\nconst Gap = styled.span`\n width: 24px;\n flex: 0 0 auto;\n margin-left: 4px;\n`;\n\nconst Username = styled.span`\n padding-left: 12px;\n flex: 1 1 auto;\n`;\n\nconst DMContainer = styled.div`\n height: 100%;\n position: absolute;\n right: 20px;\n top: 0;\n display: flex;\n align-items: center;\n`;\n\nconst DMButton = styled.button`\n width: 24px;\n height: 24px;\n\n svg {\n width: 16px;\n }\n`;\n\nconst LoadingItem = styled.div<{first?: boolean; last?: boolean}>`\n ${(props) => props.first && css `\n padding-top: ${MARGIN}px;\n `}\n\n ${(props) => props.last && css `\n padding-bottom: ${MARGIN}px;\n `}\n\n display: flex;\n justify-content: center;\n align-items: center;\n height: ${ITEM_HEIGHT}px;\n box-sizing: content-box;\n`;\n\nconst LargeLoadingItem = styled.div`\n display: flex;\n align-self: stretch;\n justify-content: center;\n align-items: center;\n width: 100%;\n`;\n\nconst LoadFailedItem = styled(LargeLoadingItem)`\n padding: 16px;\n color: rgba(var(--center-channel-color-rgb), 0.75);\n text-align: center;\n font-size: 12px;\n`;\n\nconst NoResultsItem = styled.div`\n align-self: stretch;\n overflow-y: scroll;\n overflow-y: overlay;\n`;\n\nconst RetryButton = styled.button`\n background: none;\n padding: 0;\n border: none;\n font-weight: 600;\n color: var(--link-color);\n`;\n\nexport default React.memo(GroupMemberList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Group} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getProfilesInGroup as getUsersInGroup} from 'mattermost-redux/actions/users';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {getProfilesInGroupWithoutSorting, searchProfilesInGroupWithoutSorting} from 'mattermost-redux/selectors/entities/users';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions';\nimport {closeRightHandSide} from 'actions/views/rhs';\n\nimport type {GlobalState} from 'types/store';\n\nimport GroupMemberList from './group_member_list';\nimport type {GroupMember} from './group_member_list';\n\ntype OwnProps = {\n group: Group;\n};\n\nconst sortProfileList = (\n profiles: UserProfile[],\n teammateNameDisplaySetting: string,\n) => {\n const groupMembers: GroupMember[] = [];\n profiles.forEach((profile) => {\n groupMembers.push({\n user: profile,\n displayName: displayUsername(profile, teammateNameDisplaySetting),\n });\n });\n\n groupMembers.sort((a, b) => {\n return a.displayName.localeCompare(b.displayName);\n });\n\n return groupMembers;\n};\n\nconst getProfilesSortedByDisplayName = createSelector(\n 'getProfilesSortedByDisplayName',\n getProfilesInGroupWithoutSorting,\n getTeammateNameDisplaySetting,\n sortProfileList,\n);\n\nconst searchProfilesSortedByDisplayName = createSelector(\n 'searchProfilesSortedByDisplayName',\n searchProfilesInGroupWithoutSorting,\n getTeammateNameDisplaySetting,\n sortProfileList,\n);\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const searchTerm = state.views.search.popoverSearch;\n\n let members: GroupMember[] = [];\n if (searchTerm) {\n members = searchProfilesSortedByDisplayName(state, ownProps.group.id, searchTerm);\n } else {\n members = getProfilesSortedByDisplayName(state, ownProps.group.id);\n }\n\n return {\n members,\n searchTerm,\n teamUrl: getCurrentRelativeTeamUrl(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getUsersInGroup,\n openDirectChannelToUserId,\n closeRightHandSide,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(GroupMemberList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport debounce from 'lodash/debounce';\nimport type {ChangeEvent} from 'react';\nimport React, {useEffect, useCallback, useState, useRef} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {MagnifyIcon} from '@mattermost/compass-icons/components';\nimport type {Group} from '@mattermost/types/groups';\n\nimport {searchProfiles} from 'mattermost-redux/actions/users';\n\nimport {openModal} from 'actions/views/modals';\nimport {setPopoverSearchTerm} from 'actions/views/search';\n\nimport {QuickInput} from 'components/quick_input/quick_input';\nimport GroupMemberList from 'components/user_group_popover/group_member_list';\nimport UserGroupsModal from 'components/user_groups_modal';\nimport ViewUserGroupModal from 'components/view_user_group_modal';\n\nimport Constants, {A11yCustomEventTypes, ModalIdentifiers} from 'utils/constants';\nimport type {A11yFocusEventDetail} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport {Load} from './constants';\n\nimport './user_group_popover.scss';\n\nexport type Props = {\n group: Group;\n hide: () => void;\n returnFocus: () => void;\n}\n\nconst UserGroupPopover = ({\n group,\n hide,\n returnFocus,\n}: Props) => {\n const {formatMessage} = useIntl();\n const closeRef = useRef<HTMLButtonElement>(null);\n\n const dispatch = useDispatch();\n\n const searchTerm = useSelector((state: GlobalState) => state.views.search.popoverSearch);\n\n const [searchState, setSearchState] = useState(Load.DONE);\n\n const doSearch = useCallback(debounce(async (term) => {\n const res = await dispatch(searchProfiles(term, {in_group_id: group.id}));\n if (res.data) {\n setSearchState(Load.DONE);\n } else {\n setSearchState(Load.FAILED);\n }\n }, Constants.SEARCH_TIMEOUT_MILLISECONDS), []);\n\n useEffect(() => {\n // Focus the close button when the popover first opens\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: closeRef.current,\n keyboardOnly: true,\n },\n },\n ));\n\n // Unset the popover search term on mount and unmount\n // This is to prevent some odd rendering issues when quickly opening and closing popovers\n dispatch(setPopoverSearchTerm(''));\n return () => {\n dispatch(setPopoverSearchTerm(''));\n };\n }, []);\n\n useEffect(() => {\n if (searchTerm) {\n setSearchState(Load.LOADING);\n doSearch(searchTerm);\n } else {\n setSearchState(Load.DONE);\n doSearch.cancel();\n }\n }, [searchTerm, doSearch]);\n\n const openGroupsModal = () => {\n dispatch(openModal({\n modalId: ModalIdentifiers.USER_GROUPS,\n dialogType: UserGroupsModal,\n dialogProps: {\n backButtonAction: openGroupsModal,\n onExited: returnFocus,\n },\n }));\n };\n\n const openViewGroupModal = () => {\n hide();\n dispatch(openModal({\n modalId: ModalIdentifiers.VIEW_USER_GROUP,\n dialogType: ViewUserGroupModal,\n dialogProps: {\n groupId: group.id,\n backButtonCallback: openGroupsModal,\n backButtonAction: openViewGroupModal,\n onExited: returnFocus,\n },\n }));\n };\n\n const handleClose = () => {\n hide();\n returnFocus();\n };\n\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) => {\n dispatch(setPopoverSearchTerm(event.target.value));\n };\n\n const handleClear = () => {\n dispatch(setPopoverSearchTerm(''));\n };\n\n return (\n <Body>\n <Header>\n <Heading>\n <Title\n className='overflow--ellipsis text-nowrap'\n >\n {group.display_name}\n </Title>\n <CloseButton\n className='btn btn-sm btn-compact btn-icon'\n aria-label={formatMessage({id: 'user_group_popover.close', defaultMessage: 'Close user group popover'})}\n onClick={handleClose}\n ref={closeRef}\n >\n <i\n className='icon icon-close'\n />\n </CloseButton>\n </Heading>\n <Subtitle>\n <span className='overflow--ellipsis text-nowrap'>{'@'}{group.name}</span>\n <Dot>{'•'}</Dot>\n <FormattedMessage\n id='user_group_popover.memberCount'\n defaultMessage='{member_count} {member_count, plural, one {Member} other {Members}}'\n values={{\n member_count: group.member_count,\n }}\n tagName={NoShrink}\n />\n </Subtitle>\n <HeaderButton\n aria-label={`${group.display_name} @${group.name} ${formatMessage({id: 'user_group_popover.memberCount', defaultMessage: '{member_count} {member_count, plural, one {Member} other {Members}}'}, {member_count: group.member_count})} ${formatMessage({id: 'user_group_popover.openGroupModal', defaultMessage: 'View full group info'})}`}\n onClick={openViewGroupModal}\n className='user-group-popover_header-button'\n />\n </Header>\n {group.member_count > 10 ? (\n <SearchBar>\n <MagnifyIcon/>\n <QuickInput\n type='text'\n className='user-group-popover_search-bar'\n placeholder={formatMessage({id: 'user_group_popover.searchGroupMembers', defaultMessage: 'Search members'})}\n value={searchTerm}\n onChange={handleSearch}\n clearable={true}\n onClear={handleClear}\n />\n </SearchBar>\n ) : null}\n <GroupMemberList\n group={group}\n hide={hide}\n searchState={searchState}\n />\n </Body>\n );\n};\n\nconst Body = styled.div`\n width: 264px;\n border: 1px solid rgba(var(--center-channel-color-rgb), 0.16);\n border-radius: 4px;\n background: var(--center-channel-bg);\n box-shadow: var(--elevation-4);\n`;\n\nconst Header = styled.div`\n padding: 16px 20px;\n position: relative;\n\n &:hover {\n background: rgba(var(--center-channel-color-rgb), 0.08);\n }\n`;\n\nconst HeaderButton = styled.button`\n padding: 0;\n background: none;\n border: none;\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n width: 100%;\n height: 100%;\n`;\n\nconst Title = styled.span`\n flex: 1 1 auto;\n`;\n\nconst CloseButton = styled.button`\n width: 28px;\n height: 28px;\n flex: 0 0 auto;\n margin-left: 4px;\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n right: -4px;\n top: -2px;\n\n /* Place this button above the main header button */\n z-index: 9;\n\n svg {\n width: 18px;\n }\n`;\n\nconst Heading = styled.div`\n font-weight: 600;\n font-size: 16px;\n display: flex;\n align-items: center;\n font-family: 'Metropolis', sans-serif;\n`;\n\nconst Subtitle = styled.div`\n font-size: 12px;\n color: rgba(var(--center-channel-color-rgb), 0.75);\n display: flex;\n`;\n\nconst NoShrink = styled.span`\n flex: 0 0 auto;\n`;\n\nconst Dot = styled(NoShrink)`\n padding: 0 6px;\n`;\n\nconst SearchBar = styled.div`\n margin: 4px 12px 12px 12px;\n padding: 0 1px;\n height: 32px;\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid rgba(var(--center-channel-color-rgb), 0.16);\n border-radius: 4px;\n overflow: hidden;\n\n &:hover {\n border-color: rgba(var(--center-channel-color-rgb), 0.48);\n }\n\n &:focus-within {\n border-color: var(--button-bg);\n box-shadow: inset 0 0 0 1px var(--button-bg);\n }\n\n & > div {\n display: flex;\n align-items: center;\n flex: 1;\n }\n\n input {\n width: 100%;\n font-size: 12px;\n border: none;\n padding: 0;\n color: var(--center-channel-color);\n background: var(--center-channel-bg);\n flex: 1;\n }\n\n input.a11y--focused {\n box-shadow: none;\n }\n\n svg {\n width: 18px;\n height: 100%;\n margin: 0 6px;\n color: rgba(var(--center-channel-color-rgb), 0.64);\n }\n\n .input-clear {\n width: 36px;\n position: relative;\n right: 0;\n }\n\n .icon {\n display: flex;\n font-size: 14px;\n }\n`;\n\nexport default React.memo(UserGroupPopover);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {\n useFloating,\n autoUpdate,\n autoPlacement,\n useTransitionStyles,\n useClick,\n useDismiss,\n useInteractions,\n useRole,\n FloatingFocusManager,\n FloatingOverlay,\n FloatingPortal,\n} from '@floating-ui/react';\nimport type {ReactNode} from 'react';\nimport React, {useCallback, useState} from 'react';\n\nimport type {Group} from '@mattermost/types/groups';\n\nimport {A11yClassNames} from 'utils/constants';\n\nimport {USER_GROUP_POPOVER_CLOSING_DELAY, USER_GROUP_POPOVER_OPENING_DELAY} from './constants';\nimport UserGroupPopover from './user_group_popover';\n\ninterface Props {\n children: ReactNode;\n\n /**\n * The group corresponding to the parent popover\n */\n group: Group;\n\n /**\n * Function to call if focus should be returned to triggering element\n */\n returnFocus: () => void;\n}\n\nexport function UserGroupPopoverController(props: Props) {\n const [isOpen, setOpen] = useState(false);\n\n const {refs, floatingStyles, context: floatingContext} = useFloating({\n open: isOpen,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [autoPlacement()],\n });\n\n const {isMounted, styles: transitionStyles} = useTransitionStyles(floatingContext, {\n duration: {\n open: USER_GROUP_POPOVER_OPENING_DELAY,\n close: USER_GROUP_POPOVER_CLOSING_DELAY,\n },\n });\n\n const combinedFloatingStyles = Object.assign({}, floatingStyles, transitionStyles);\n\n const clickInteractions = useClick(floatingContext);\n\n const dismissInteraction = useDismiss(floatingContext);\n\n const role = useRole(floatingContext);\n\n const {getReferenceProps, getFloatingProps} = useInteractions([\n clickInteractions,\n dismissInteraction,\n role,\n ]);\n\n const handleHide = useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <>\n <span\n ref={refs.setReference}\n {...getReferenceProps()}\n >\n {props.children}\n </span>\n\n {isMounted && (\n <FloatingPortal id='root-portal'>\n <FloatingOverlay\n id='user-group-popover-floating-overlay'\n className='user-group-popover-floating-overlay'\n lockScroll={true}\n >\n <FloatingFocusManager context={floatingContext}>\n <div\n ref={refs.setFloating}\n style={combinedFloatingStyles}\n className={A11yClassNames.POPUP}\n {...getFloatingProps()}\n >\n <UserGroupPopover\n group={props.group}\n returnFocus={props.returnFocus}\n hide={handleHide}\n />\n </div>\n </FloatingFocusManager>\n </FloatingOverlay>\n </FloatingPortal>\n )}\n </>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {UserGroupPopoverController} from './user_group_popover_controller';\n\nexport default UserGroupPopoverController;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useRef, useMemo, memo, useEffect} from 'react';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nimport ProfilePopover from 'components/profile_popover';\nimport UserGroupPopover from 'components/user_group_popover';\n\nimport type {A11yFocusEventDetail} from 'utils/constants';\nimport {A11yCustomEventTypes} from 'utils/constants';\nimport {getUserOrGroupFromMentionName} from 'utils/post_utils';\n\nimport type {PropsFromRedux} from './index';\n\ntype OwnProps = {\n mentionName: string;\n children?: React.ReactNode;\n channelId?: string;\n disableHighlight?: boolean;\n disableGroupHighlight?: boolean;\n fetchMissingUsers?: boolean;\n}\n\ntype Props = OwnProps & PropsFromRedux;\n\nconst AtMention = (props: Props) => {\n const ref = useRef<HTMLAnchorElement>(null);\n\n const [user, group] = useMemo(\n () => getUserOrGroupFromMentionName(props.mentionName, props.usersByUsername, props.groupsByName, props.disableGroupHighlight),\n [props.mentionName, props.usersByUsername, props.groupsByName, props.disableGroupHighlight],\n );\n\n useEffect(() => {\n if (!user && !group && props.fetchMissingUsers) {\n props.getMissingMentionedUsers(props.mentionName);\n }\n }, [props.mentionName]);\n\n const returnFocus = () => {\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: ref.current,\n keyboardOnly: true,\n },\n },\n ));\n };\n\n if (user) {\n const userMentionNameSuffix = props.mentionName.substring(user.username.length);\n const userDisplayName = displayUsername(user, props.teammateNameDisplay);\n const highlightMention = !props.disableHighlight && user.id === props.currentUserId;\n\n return (\n <>\n <ProfilePopover\n triggerComponentClass={classNames({'mention--highlight': highlightMention})}\n userId={user.id}\n src={Client4.getProfilePictureUrl(user.id, user.last_picture_update)}\n channelId={props.channelId}\n returnFocus={returnFocus}\n >\n <a\n ref={ref}\n className='mention-link'\n role='button'\n tabIndex={0}\n >\n {'@' + userDisplayName}\n </a>\n </ProfilePopover>\n {userMentionNameSuffix}\n </>\n );\n } else if (group) {\n const groupMentionNameSuffix = props.mentionName.substring(group.name.length);\n const groupDisplayName = group.name;\n\n return (\n <>\n <UserGroupPopover\n group={group}\n returnFocus={returnFocus}\n >\n <a\n ref={ref}\n className='group-mention-link'\n role='button'\n tabIndex={0}\n >\n {'@' + groupDisplayName}\n </a>\n </UserGroupPopover>\n {groupMentionNameSuffix}\n </>\n );\n }\n\n return <>{props.children}</>;\n};\n\nexport default memo(AtMention);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ConnectedProps} from 'react-redux';\nimport {connect} from 'react-redux';\n\nimport {getAllGroupsForReferenceByName} from 'mattermost-redux/selectors/entities/groups';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId, getUsersByUsername} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport {getMissingMentionedUsers} from './actions';\nimport AtMention from './at_mention';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n currentUserId: getCurrentUserId(state),\n teammateNameDisplay: getTeammateNameDisplaySetting(state),\n usersByUsername: getUsersByUsername(state),\n groupsByName: getAllGroupsForReferenceByName(state),\n };\n}\n\nconst mapDispatchToProps = {\n getMissingMentionedUsers,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(AtMention);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getMissingProfilesByUsernames} from 'mattermost-redux/actions/users';\n\nimport {getPotentialMentionsForName} from 'utils/post_utils';\n\nimport type {ActionFuncAsync} from 'types/store';\n\nexport function getMissingMentionedUsers(text: string): ActionFuncAsync<Array<UserProfile['username']>> {\n return getMissingProfilesByUsernames(getPotentialMentionsForName(text));\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport SuggestionBox from 'components/suggestion/suggestion_box';\nimport SuggestionList from 'components/suggestion/suggestion_list';\n\nimport type ModalSuggestionList from './suggestion/modal_suggestion_list';\nimport type Provider from './suggestion/provider';\n\nexport type Option = {\n text: string;\n value: string;\n};\nexport type Selected = Option | UserProfile | Channel\n\ntype Props = {\n id: string;\n providers: Provider[];\n value: string;\n onSelected?: (selected: Selected) => void;\n label?: React.ReactNode | string;\n labelClassName: string;\n inputClassName: string;\n helpText?: React.ReactNode | string;\n placeholder?: string;\n footer?: Node;\n disabled?: boolean;\n toggleFocus?: ((focus: boolean) => void) | null;\n listComponent: typeof SuggestionList | typeof ModalSuggestionList;\n listPosition: string;\n};\n\ntype State = {\n input: string;\n focused?: boolean;\n};\n\ntype ChangeEvent = {\n target: HTMLInputElement;\n}\n\nexport default class AutocompleteSelector extends React.PureComponent<Props, State> {\n static defaultProps = {\n id: '',\n value: '',\n labelClassName: '',\n inputClassName: '',\n listComponent: SuggestionList,\n listPosition: 'top',\n };\n\n suggestionRef?: HTMLElement;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n input: '',\n };\n }\n\n onChange = (e: ChangeEvent) => {\n if (!e || !e.target) {\n return;\n }\n\n this.setState({input: e.target.value});\n };\n\n handleSelected = (selected: Selected) => {\n this.setState({input: ''});\n\n if (this.props.onSelected) {\n this.props.onSelected(selected);\n }\n\n requestAnimationFrame(() => {\n if (this.suggestionRef) {\n this.suggestionRef.blur();\n }\n });\n };\n\n setSuggestionRef = (ref: HTMLElement) => {\n this.suggestionRef = ref;\n };\n\n onFocus = () => {\n this.setState({focused: true});\n\n if (this.props.toggleFocus) {\n this.props.toggleFocus(true);\n }\n };\n\n onBlur = () => {\n this.setState({focused: false});\n\n if (this.props.toggleFocus) {\n this.props.toggleFocus(false);\n }\n };\n\n render() {\n const {\n providers,\n placeholder,\n footer,\n label,\n labelClassName,\n helpText,\n inputClassName,\n value,\n disabled,\n listComponent,\n listPosition,\n } = this.props;\n\n const {focused} = this.state;\n let {input} = this.state;\n\n if (!focused) {\n input = value;\n }\n\n let labelContent;\n if (label) {\n labelContent = (\n <label\n className={'control-label ' + labelClassName}\n >\n {label}\n </label>\n );\n }\n\n let helpTextContent;\n if (helpText) {\n helpTextContent = (\n <div className='help-text'>\n {helpText}\n </div>\n );\n }\n\n return (\n <div\n data-testid='autoCompleteSelector'\n className='form-group'\n >\n {labelContent}\n <div className={inputClassName}>\n <SuggestionBox\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n ref={this.setSuggestionRef}\n placeholder={placeholder}\n listComponent={listComponent}\n className='form-control'\n containerClass='select-suggestion-container'\n value={input}\n onChange={this.onChange}\n onItemSelected={this.handleSelected}\n onFocus={this.onFocus}\n onBlur={this.onBlur}\n providers={providers}\n completeOnTab={true}\n renderNoResults={true}\n openOnFocus={true}\n openWhenEmpty={true}\n replaceAllInputOnSelect={true}\n disabled={disabled}\n listPosition={listPosition}\n />\n {helpTextContent}\n {footer}\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChangeEvent, FormEvent, HTMLProps} from 'react';\nimport React, {useRef, useEffect, useCallback} from 'react';\n\nimport type {Intersection} from '@mattermost/types/utilities';\n\ntype Props = {\n id?: string;\n className?: string;\n disabled?: boolean;\n value?: string;\n defaultValue?: string;\n onChange?: (e: ChangeEvent<HTMLTextAreaElement>) => void;\n onHeightChange?: (height: number, maxHeight: number) => void;\n onWidthChange?: (width: number) => void;\n onInput?: (e: FormEvent<HTMLTextAreaElement>) => void;\n placeholder?: string;\n} & Intersection<HTMLProps<HTMLTextAreaElement>, HTMLProps<HTMLDivElement>>;\n\nconst styles = {\n container: {\n height: 0,\n overflow: 'hidden',\n },\n reference: {\n height: 'auto',\n width: 'auto',\n display: 'inline-block',\n position: 'relative' as const,\n transform: 'translateY(-100%)',\n wordBreak: 'break-word' as const,\n },\n placeholder: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n opacity: 0.75,\n pointerEvents: 'none' as const,\n position: 'absolute' as const,\n whiteSpace: 'nowrap' as const,\n background: 'none',\n borderColor: 'transparent',\n },\n textArea: {\n overflowY: 'auto' as const,\n },\n};\n\nconst AutosizeTextarea = React.forwardRef<HTMLTextAreaElement, Props>(({\n\n // TODO: The provided `id` is sometimes hard-coded and used to interface with the\n // component, e.g. `post_textbox`, so it can't be changed. This would ideally be\n // abstracted to avoid passing in an `id` prop at all, but we intentionally maintain\n // the old behaviour to address ABC-213.\n id = 'autosize_textarea',\n disabled,\n value,\n defaultValue,\n onChange,\n onHeightChange,\n onWidthChange,\n onInput,\n placeholder,\n ...otherProps\n}: Props, ref) => {\n const height = useRef(0);\n const textarea = useRef<HTMLTextAreaElement>();\n const referenceRef = useRef<HTMLDivElement>(null);\n\n const recalculateHeight = () => {\n if (!referenceRef.current || !textarea.current) {\n return;\n }\n\n const scrollHeight = referenceRef.current.scrollHeight;\n const currentTextarea = textarea.current;\n\n if (scrollHeight > 0 && scrollHeight !== height.current) {\n const style = getComputedStyle(currentTextarea);\n\n // Directly change the height to avoid circular rerenders\n currentTextarea.style.height = `${scrollHeight}px`;\n\n height.current = scrollHeight;\n\n onHeightChange?.(scrollHeight, parseInt(style.maxHeight || '0', 10));\n }\n };\n\n const recalculateWidth = () => {\n if (!referenceRef.current) {\n return;\n }\n\n const width = referenceRef.current?.offsetWidth || -1;\n if (width >= 0) {\n window.requestAnimationFrame(() => {\n onWidthChange?.(width);\n });\n }\n };\n\n const setTextareaRef = useCallback((textareaRef: HTMLTextAreaElement) => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(textareaRef);\n } else {\n ref.current = textareaRef;\n }\n }\n\n textarea.current = textareaRef;\n }, [ref]);\n\n useEffect(() => {\n recalculateHeight();\n recalculateWidth();\n });\n\n const heightProps = {\n rows: 0,\n height: 0,\n };\n\n if (height.current <= 0) {\n // Set an initial number of rows so that the textarea doesn't appear too large when its first rendered\n heightProps.rows = 1;\n } else {\n heightProps.height = height.current;\n }\n\n let referenceValue = value || defaultValue;\n if (referenceValue?.endsWith('\\n')) {\n // In a div, the browser doesn't always count characters at the end of a line when measuring the dimensions\n // of text. In the spec, they refer to those characters as \"hanging\". No matter what value we set for the\n // `white-space` of a div, a single newline at the end of the div will always hang.\n //\n // The textarea doesn't have that behaviour, so we need to trick the reference div into measuring that\n // newline, and it seems like the best way to do that is by adding a second newline because only the final\n // one hangs.\n referenceValue += '\\n';\n }\n\n return (\n <div >\n <textarea\n ref={setTextareaRef}\n data-testid={id}\n id={id}\n {...heightProps}\n {...otherProps}\n placeholder={placeholder}\n role='textbox'\n dir='auto'\n disabled={disabled}\n onChange={onChange}\n onInput={onInput}\n value={value}\n defaultValue={defaultValue}\n style={styles.textArea}\n />\n <div style={styles.container}>\n <div\n ref={referenceRef}\n id={id + '-reference'}\n className={otherProps.className}\n style={styles.reference}\n dir='auto'\n disabled={true}\n aria-hidden={true}\n >\n {referenceValue}\n </div>\n </div>\n </div>\n );\n});\n\nexport default React.memo(AutosizeTextarea);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {AccountMultipleOutlineIcon, ChevronRightIcon} from '@mattermost/compass-icons/components';\nimport type {Group} from '@mattermost/types/groups';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {TrackGroupsFeature, TrackInviteGroupEvent} from 'mattermost-redux/constants/telemetry';\nimport {getUser, makeDisplayNameGetter, makeGetProfilesByIdsAndUsernames} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackFeatureEvent} from 'actions/telemetry_actions';\n\nimport type {Value} from 'components/multiselect/multiselect';\nimport WithTooltip from 'components/with_tooltip';\n\nimport Constants from 'utils/constants';\n\ntype UserProfileValue = Value & UserProfile;\ntype GroupValue = Value & Group;\n\nexport type Props = {\n group: GroupValue;\n isSelected: boolean;\n rowSelected: string;\n selectedItemRef: React.RefObject<HTMLDivElement>;\n onMouseMove: (group: GroupValue) => void;\n addUserProfile: (profile: UserProfileValue) => void;\n}\n\nconst displayNameGetter = makeDisplayNameGetter();\n\nconst GroupOption = (props: Props) => {\n const {\n group,\n isSelected,\n rowSelected,\n selectedItemRef,\n onMouseMove,\n addUserProfile,\n } = props;\n\n const getProfilesByIdsAndUsernames = makeGetProfilesByIdsAndUsernames();\n\n const profiles = useSelector((state: GlobalState) => getProfilesByIdsAndUsernames(state, {allUserIds: group.member_ids || [], allUsernames: []}) as UserProfileValue[]);\n const overflowNames = useSelector((state: GlobalState) => {\n if (group?.member_ids) {\n return group?.member_ids.map((userId) => displayNameGetter(state, true)(getUser(state, userId))).join(', ');\n }\n return '';\n });\n\n const onAdd = useCallback(() => {\n for (const profile of profiles) {\n addUserProfile(profile);\n }\n trackFeatureEvent(TrackGroupsFeature, TrackInviteGroupEvent);\n }, [addUserProfile, profiles]);\n\n const onKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key === Constants.KeyCodes.ENTER[0] && isSelected) {\n e.stopPropagation();\n onAdd();\n }\n }, [isSelected, onAdd]);\n\n useEffect(() => {\n // Bind the event listener\n document.addEventListener('keydown', onKeyDown, true);\n return () => {\n // Unbind the event listener on clean up\n document.removeEventListener('keydown', onKeyDown, true);\n };\n }, [onKeyDown]);\n\n return (\n <div\n key={group.id}\n ref={isSelected ? selectedItemRef : undefined}\n className={'more-modal__row clickable ' + rowSelected}\n onClick={onAdd}\n onMouseMove={() => onMouseMove(group)}\n >\n <span\n className='more-modal__group-image'\n >\n <AccountMultipleOutlineIcon\n size={16}\n color={'rgba(var(--center-channel-color-rgb), 0.56)'}\n />\n </span>\n <div className='more-modal__details'>\n <div className='more-modal__name'>\n <span className='group-display-name'>\n {group.display_name}\n </span>\n <span\n className='ml-2 light group-name'\n >\n {'@'}{group.name}\n </span>\n <WithTooltip\n title={overflowNames}\n >\n <span\n className='add-group-members'\n >\n <FormattedMessage\n id='multiselect.addGroupMembers'\n defaultMessage='Add {number} people'\n values={{\n number: group.member_count,\n }}\n />\n <ChevronRightIcon\n size={20}\n color={'var(--link-color)'}\n />\n </span>\n </WithTooltip>\n </div>\n </div>\n </div>\n );\n};\n\nexport default React.memo(GroupOption);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage, FormattedList, useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport AlertBanner from 'components/alert_banner';\nimport AtMention from 'components/at_mention';\nimport type {Value} from 'components/multiselect/multiselect';\nimport WithTooltip from 'components/with_tooltip';\n\ntype UserProfileValue = Value & UserProfile;\n\nexport type Props = {\n teamId: string;\n users: UserProfileValue[];\n guests: UserProfileValue[];\n}\n\nconst TeamWarningBanner = (props: Props) => {\n const {\n teamId,\n users,\n guests,\n } = props;\n\n const {formatMessage} = useIntl();\n\n const team = useSelector((state: GlobalState) => getTeam(state, teamId));\n\n const getCommaSeparatedUsernames = useCallback((users: Array<UserProfileValue | UserProfile>) => {\n return users.map((user) => {\n return `@${user.username}`;\n }).join(', ');\n }, []);\n\n const getGuestMessage = useCallback(() => {\n if (guests.length === 0) {\n return null;\n }\n\n const commaSeparatedUsernames = getCommaSeparatedUsernames(guests);\n const firstName = guests[0].username;\n if (guests.length > 10) {\n return (\n formatMessage(\n {\n id: 'channel_invite.invite_team_members.guests.messageOverflow',\n defaultMessage: '{firstUser} and {others} are guest users and need to first be invited to the team before you can add them to the channel. Once they\\'ve joined the team, you can add them to this channel.',\n },\n {\n firstUser: (\n <AtMention\n key={firstName}\n mentionName={firstName}\n />\n ),\n others: (\n <WithTooltip\n title={commaSeparatedUsernames.replace(`@${firstName}, `, '')}\n >\n <span\n className='add-others-link'\n >\n <FormattedMessage\n id='channel_invite.invite_team_members.messageOthers'\n defaultMessage='{count} others'\n values={{\n count: guests.length - 1,\n }}\n />\n </span>\n </WithTooltip>\n ),\n },\n )\n );\n }\n\n const guestsList = guests.map((user) => {\n return (\n <AtMention\n key={user.username}\n mentionName={user.username}\n />\n );\n });\n\n return (\n formatMessage(\n {\n id: 'channel_invite.invite_team_members.guests.message',\n defaultMessage: '{count, plural, =1 {{firstUser} is a guest user and needs} other {{users} are guest users and need}} to first be invited to the team before you can add them to the channel. Once they\\'ve joined the team, you can add them to this channel.',\n },\n {\n count: guests.length,\n users: (<FormattedList value={guestsList}/>),\n firstUser: (\n <AtMention\n key={firstName}\n mentionName={firstName}\n />\n ),\n team: (<strong>{team?.display_name}</strong>),\n },\n )\n );\n }, [guests, formatMessage, getCommaSeparatedUsernames, team?.display_name]);\n\n const getMessage = useCallback(() => {\n const commaSeparatedUsernames = getCommaSeparatedUsernames(users);\n const firstName = users[0].username;\n\n if (users.length > 10) {\n return formatMessage(\n {\n id: 'channel_invite.invite_team_members.messageOverflow',\n defaultMessage: 'You can add {firstUser} and {others} to this channel once they are members of the {team} team.',\n },\n {\n firstUser: (\n <AtMention\n key={firstName}\n mentionName={firstName}\n />\n ),\n others: (\n <WithTooltip\n title={commaSeparatedUsernames.replace(`@${firstName}, `, '')}\n >\n <span\n className='add-others-link'\n >\n <FormattedMessage\n id='channel_invite.invite_team_members.messageOthers'\n defaultMessage='{count} others'\n values={{\n count: users.length - 1,\n }}\n />\n </span>\n </WithTooltip>\n ),\n team: (<strong>{team?.display_name}</strong>),\n },\n );\n }\n\n const usersList = users.map((user) => {\n return (\n <AtMention\n key={user.username}\n mentionName={user.username}\n />\n );\n });\n\n return (\n formatMessage(\n {\n id: 'channel_invite.invite_team_members.message',\n defaultMessage: 'You can add {count, plural, =1 {{firstUser}} other {{users}}} to this channel once they are members of the {team} team.',\n },\n {\n count: users.length,\n users: (<FormattedList value={usersList}/>),\n firstUser: (\n <AtMention\n key={firstName}\n mentionName={firstName}\n />\n ),\n team: (<strong>{team?.display_name}</strong>),\n },\n )\n );\n }, [users, getCommaSeparatedUsernames, team, formatMessage]);\n\n return (\n <>\n {\n (users.length > 0 || guests.length > 0) &&\n <AlertBanner\n id='teamWarningBanner'\n mode='warning'\n variant='app'\n title={\n <FormattedMessage\n id='channel_invite.invite_team_members.title'\n defaultMessage='{count, plural, =1 {1 user was} other {# users were}} not selected because they are not a part of this team'\n values={{\n count: users.length + guests.length,\n }}\n />\n }\n message={\n users.length > 0 &&\n getMessage()\n }\n footerMessage={\n guests.length > 0 &&\n getGuestMessage()\n }\n />\n }\n </>\n );\n};\n\nexport default React.memo(TeamWarningBanner);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport isEqual from 'lodash/isEqual';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport type {IntlShape} from 'react-intl';\nimport {injectIntl, FormattedMessage, defineMessage} from 'react-intl';\nimport styled from 'styled-components';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Group, GroupSearchParams} from '@mattermost/types/groups';\nimport type {TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport {Client4} from 'mattermost-redux/client';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {filterGroupsMatchingTerm} from 'mattermost-redux/utils/group_utils';\nimport {displayUsername, filterProfilesStartingWithTerm, isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport InvitationModal from 'components/invitation_modal';\nimport MultiSelect from 'components/multiselect/multiselect';\nimport type {Value} from 'components/multiselect/multiselect';\nimport ProfilePicture from 'components/profile_picture';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport {sortUsersAndGroups} from 'utils/utils';\n\nimport GroupOption from './group_option';\nimport TeamWarningBanner from './team_warning_banner';\n\nconst USERS_PER_PAGE = 50;\nconst USERS_FROM_DMS = 10;\nconst MAX_USERS = 25;\n\ntype UserProfileValue = Value & UserProfile;\n\ntype GroupValue = Value & Group;\n\nexport type Props = {\n profilesNotInCurrentChannel: UserProfile[];\n profilesInCurrentChannel: UserProfile[];\n profilesNotInCurrentTeam: UserProfile[];\n profilesFromRecentDMs: UserProfile[];\n intl: IntlShape;\n membersInTeam?: RelationOneToOne<UserProfile, TeamMembership>;\n userStatuses: RelationOneToOne<UserProfile, string>;\n onExited: () => void;\n channel: Channel;\n teammateNameDisplaySetting: string;\n\n // skipCommit = true used with onAddCallback will result in users not being committed immediately\n skipCommit?: boolean;\n\n // onAddCallback takes an array of UserProfiles and should set usersToAdd in state of parent component\n onAddCallback?: (userProfiles?: UserProfileValue[]) => void;\n\n // Dictionaries of userid mapped users to exclude or include from this list\n excludeUsers?: Record<string, UserProfileValue>;\n includeUsers?: Record<string, UserProfileValue>;\n canInviteGuests?: boolean;\n emailInvitationsEnabled?: boolean;\n groups: Group[];\n isGroupsEnabled: boolean;\n actions: {\n addUsersToChannel: (channelId: string, userIds: string[]) => Promise<ActionResult>;\n getProfilesNotInChannel: (teamId: string, channelId: string, groupConstrained: boolean, page: number, perPage?: number) => Promise<ActionResult>;\n getProfilesInChannel: (channelId: string, page: number, perPage: number, sort: string, options: {active?: boolean}) => Promise<ActionResult>;\n getTeamStats: (teamId: string) => void;\n loadStatusesForProfilesList: (users: UserProfile[]) => void;\n searchProfiles: (term: string, options: any) => Promise<ActionResult>;\n closeModal: (modalId: string) => void;\n searchAssociatedGroupsForReference: (prefix: string, teamId: string, channelId: string | undefined, opts: GroupSearchParams) => Promise<ActionResult>;\n getTeamMembersByIds: (teamId: string, userIds: string[]) => Promise<ActionResult>;\n };\n}\n\ntype State = {\n selectedUsers: UserProfileValue[];\n groupAndUserOptions: Array<UserProfileValue | GroupValue>;\n usersNotInTeam: UserProfileValue[];\n guestsNotInTeam: UserProfileValue[];\n term: string;\n show: boolean;\n saving: boolean;\n loadingUsers: boolean;\n inviteError?: string;\n}\n\nconst UsernameSpan = styled.span`\n fontSize: 12px;\n`;\n\nconst UserMappingSpan = styled.span`\n position: absolute;\n right: 20px;\n`;\n\nexport class ChannelInviteModal extends React.PureComponent<Props, State> {\n private searchTimeoutId = 0;\n private selectedItemRef = React.createRef<HTMLDivElement>();\n\n public static defaultProps = {\n includeUsers: {},\n excludeUsers: {},\n skipCommit: false,\n };\n\n constructor(props: Props) {\n super(props);\n this.state = {\n selectedUsers: [],\n usersNotInTeam: [],\n guestsNotInTeam: [],\n term: '',\n show: true,\n saving: false,\n loadingUsers: true,\n groupAndUserOptions: [],\n } as State;\n }\n\n isUser = (option: UserProfileValue | GroupValue): option is UserProfileValue => {\n return (option as UserProfile).username !== undefined;\n };\n\n private addValue = (value: UserProfileValue | GroupValue): void => {\n if (this.isUser(value)) {\n const profile = value;\n if (!this.props.membersInTeam || !this.props.membersInTeam[profile.id]) {\n if (isGuest(profile.roles)) {\n if (this.state.guestsNotInTeam.indexOf(profile) === -1) {\n this.setState((prevState) => {\n return {guestsNotInTeam: [...prevState.guestsNotInTeam, profile]};\n });\n }\n return;\n }\n if (this.state.usersNotInTeam.indexOf(profile) === -1) {\n this.setState((prevState) => {\n return {usersNotInTeam: [...prevState.usersNotInTeam, profile]};\n });\n }\n return;\n }\n\n if (this.state.selectedUsers.indexOf(profile) === -1) {\n this.setState((prevState) => {\n return {selectedUsers: [...prevState.selectedUsers, profile]};\n });\n }\n }\n };\n\n private removeInvitedUsers = (profiles: UserProfile[]): void => {\n const usersNotInTeam = this.state.usersNotInTeam.filter((profile) => {\n const user = profile as UserProfileValue;\n\n const index = profiles.indexOf(user);\n if (index === -1) {\n return true;\n }\n this.addValue(user);\n return false;\n });\n\n this.setState({usersNotInTeam: [...usersNotInTeam], guestsNotInTeam: []});\n };\n\n private removeUsersFromValuesNotInTeam = (profiles: UserProfile[]): void => {\n const usersNotInTeam = this.state.usersNotInTeam.filter((profile) => {\n const index = profiles.indexOf(profile);\n return index === -1;\n });\n this.setState({usersNotInTeam: [...usersNotInTeam], guestsNotInTeam: []});\n };\n\n public componentDidMount(): void {\n this.props.actions.getProfilesNotInChannel(this.props.channel.team_id, this.props.channel.id, this.props.channel.group_constrained, 0).then(() => {\n this.setUsersLoadingState(false);\n });\n this.props.actions.getProfilesInChannel(this.props.channel.id, 0, USERS_PER_PAGE, '', {active: true});\n this.props.actions.getTeamStats(this.props.channel.team_id);\n this.props.actions.loadStatusesForProfilesList(this.props.profilesNotInCurrentChannel);\n this.props.actions.loadStatusesForProfilesList(this.props.profilesInCurrentChannel);\n }\n\n public async componentDidUpdate(prevProps: Props, prevState: State) {\n if (prevState.term !== this.state.term) {\n const values = this.getOptions();\n const userIds: string[] = [];\n\n for (let index = 0; index < values.length; index++) {\n const newValue = values[index];\n if (this.isUser(newValue)) {\n userIds.push(newValue.id);\n } else if (newValue.member_ids) {\n userIds.push(...newValue.member_ids);\n }\n }\n\n if (!isEqual(values, this.state.groupAndUserOptions)) {\n if (userIds.length > 0) {\n this.props.actions.getTeamMembersByIds(this.props.channel.team_id, userIds);\n }\n this.setState({groupAndUserOptions: values});\n }\n }\n }\n\n getExcludedUsers = (): Set<string> => {\n if (this.props.excludeUsers) {\n return new Set(...this.props.profilesNotInCurrentTeam.map((user) => user.id), Object.values(this.props.excludeUsers).map((user) => user.id));\n }\n return new Set(this.props.profilesNotInCurrentTeam.map((user) => user.id));\n };\n\n // Options list prioritizes recent dms for the first 10 users and then the next 15 are a mix of users and groups\n public getOptions = () => {\n const excludedAndNotInTeamUserIds = this.getExcludedUsers();\n\n const filteredDmUsers = filterProfilesStartingWithTerm(this.props.profilesFromRecentDMs, this.state.term);\n const dmUsers = this.filterOutDeletedAndExcludedAndNotInTeamUsers(filteredDmUsers, excludedAndNotInTeamUserIds).slice(0, USERS_FROM_DMS) as UserProfileValue[];\n\n let users: UserProfileValue[];\n const filteredUsers: UserProfile[] = filterProfilesStartingWithTerm(this.props.profilesNotInCurrentChannel.concat(this.props.profilesInCurrentChannel), this.state.term);\n users = this.filterOutDeletedAndExcludedAndNotInTeamUsers(filteredUsers, excludedAndNotInTeamUserIds);\n if (this.props.includeUsers) {\n users = [...users, ...Object.values(this.props.includeUsers)];\n }\n const groupsAndUsers = [\n ...filterGroupsMatchingTerm(this.props.groups, this.state.term) as GroupValue[],\n ...users,\n ].sort(sortUsersAndGroups);\n\n const optionValues = [\n ...dmUsers,\n ...groupsAndUsers,\n ].slice(0, MAX_USERS);\n\n return Array.from(new Set(optionValues));\n };\n\n public onHide = (): void => {\n this.setState({show: false});\n this.props.actions.loadStatusesForProfilesList(this.props.profilesNotInCurrentChannel);\n this.props.actions.loadStatusesForProfilesList(this.props.profilesInCurrentChannel);\n };\n\n public handleInviteError = (err: any): void => {\n if (err) {\n this.setState({\n saving: false,\n inviteError: err.message,\n });\n }\n };\n\n private handleDelete = (values: Array<UserProfileValue | GroupValue>): void => {\n // Our values for this component are always UserProfileValue\n const profiles = values as UserProfileValue[];\n this.setState({selectedUsers: profiles});\n };\n\n private setUsersLoadingState = (loadingState: boolean): void => {\n this.setState({\n loadingUsers: loadingState,\n });\n };\n\n private handlePageChange = (page: number, prevPage: number): void => {\n if (page > prevPage) {\n this.setUsersLoadingState(true);\n this.props.actions.getProfilesNotInChannel(\n this.props.channel.team_id,\n this.props.channel.id,\n this.props.channel.group_constrained,\n page + 1, USERS_PER_PAGE).then(() => this.setUsersLoadingState(false));\n\n this.props.actions.getProfilesInChannel(this.props.channel.id, page + 1, USERS_PER_PAGE, '', {active: true});\n }\n };\n\n public handleSubmit = (): void => {\n const {actions, channel} = this.props;\n\n const userIds = this.state.selectedUsers.map((u) => u.id);\n if (userIds.length === 0) {\n return;\n }\n\n if (this.props.skipCommit && this.props.onAddCallback) {\n this.props.onAddCallback(this.state.selectedUsers);\n this.setState({\n saving: false,\n inviteError: undefined,\n });\n this.onHide();\n return;\n }\n\n this.setState({saving: true});\n\n actions.addUsersToChannel(channel.id, userIds).then((result) => {\n if (result.error) {\n this.handleInviteError(result.error);\n } else {\n this.setState({\n saving: false,\n inviteError: undefined,\n });\n this.onHide();\n }\n });\n };\n\n public search = (searchTerm: string): void => {\n const term = searchTerm.trim();\n clearTimeout(this.searchTimeoutId);\n this.setState({\n term,\n });\n\n this.searchTimeoutId = window.setTimeout(\n async () => {\n if (!term) {\n return;\n }\n\n const options = {\n team_id: this.props.channel.team_id,\n not_in_channel_id: this.props.channel.id,\n group_constrained: this.props.channel.group_constrained,\n };\n\n const opts = {\n q: term,\n filter_allow_reference: true,\n page: 0,\n per_page: 100,\n include_member_count: true,\n include_member_ids: true,\n };\n const promises = [\n this.props.actions.searchProfiles(term, options),\n ];\n if (this.props.isGroupsEnabled) {\n promises.push(this.props.actions.searchAssociatedGroupsForReference(term, this.props.channel.team_id, this.props.channel.id, opts));\n }\n await Promise.all(promises);\n this.setUsersLoadingState(false);\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n };\n\n private renderAriaLabel = (option: UserProfileValue | GroupValue): string => {\n if (!option) {\n return '';\n }\n if (this.isUser(option)) {\n return option.username;\n }\n return option.name;\n };\n\n private filterOutDeletedAndExcludedAndNotInTeamUsers = (users: UserProfile[], excludeUserIds: Set<string>): UserProfileValue[] => {\n return users.filter((user) => {\n return user.delete_at === 0 && !excludeUserIds.has(user.id);\n }) as UserProfileValue[];\n };\n\n renderOption = (option: UserProfileValue | GroupValue, isSelected: boolean, onAdd: (option: UserProfileValue | GroupValue) => void, onMouseMove: (option: UserProfileValue | GroupValue) => void) => {\n let rowSelected = '';\n if (isSelected) {\n rowSelected = 'more-modal__row--selected';\n }\n\n if (this.isUser(option)) {\n const ProfilesInGroup = this.props.profilesInCurrentChannel.map((user) => user.id);\n\n const userMapping: Record<string, string> = {};\n for (let i = 0; i < ProfilesInGroup.length; i++) {\n userMapping[ProfilesInGroup[i]] = 'Already in channel';\n }\n const displayName = displayUsername(option, this.props.teammateNameDisplaySetting);\n return (\n <div\n key={option.id}\n ref={isSelected ? this.selectedItemRef : option.id}\n className={'more-modal__row clickable ' + rowSelected}\n onClick={() => onAdd(option)}\n onMouseMove={() => onMouseMove(option)}\n >\n <ProfilePicture\n src={Client4.getProfilePictureUrl(option.id, option.last_picture_update)}\n status={this.props.userStatuses[option.id]}\n size='md'\n username={option.username}\n />\n <div className='more-modal__details'>\n <div className='more-modal__name'>\n <span>\n {displayName}\n {option.is_bot && <BotTag/>}\n {isGuest(option.roles) && <GuestTag className='popoverlist'/>}\n {displayName === option.username ?\n null :\n <UsernameSpan\n className='ml-2 light'\n >\n {'@'}{option.username}\n </UsernameSpan>\n }\n <UserMappingSpan\n className='light'\n >\n {userMapping[option.id]}\n </UserMappingSpan>\n </span>\n </div>\n </div>\n <div className='more-modal__actions'>\n <div className='more-modal__actions--round'>\n <i\n className='icon icon-plus'\n />\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <GroupOption\n group={option}\n key={option.id}\n addUserProfile={onAdd}\n isSelected={isSelected}\n rowSelected={rowSelected}\n onMouseMove={onMouseMove}\n selectedItemRef={this.selectedItemRef}\n />\n );\n };\n\n public render = (): JSX.Element => {\n let inviteError = null;\n if (this.state.inviteError) {\n inviteError = (<label className='has-error control-label'>{this.state.inviteError}</label>);\n }\n\n const buttonSubmitText = defineMessage({id: 'multiselect.add', defaultMessage: 'Add'});\n const buttonSubmitLoadingText = defineMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'});\n\n const closeMembersInviteModal = () => {\n this.props.actions.closeModal(ModalIdentifiers.CHANNEL_INVITE);\n };\n\n const InviteModalLink = (props: {inviteAsGuest?: boolean; children: React.ReactNode}) => {\n return (\n <ToggleModalButton\n id='inviteGuest'\n className={`${props.inviteAsGuest ? 'invite-as-guest' : ''} btn btn-link`}\n modalId={ModalIdentifiers.INVITATION}\n dialogType={InvitationModal}\n dialogProps={{\n channelToInvite: this.props.channel,\n initialValue: this.state.term,\n inviteAsGuest: props.inviteAsGuest,\n }}\n onClick={closeMembersInviteModal}\n >\n {props.children}\n </ToggleModalButton>\n );\n };\n\n const customNoOptionsMessage = (\n <div className='custom-no-options-message'>\n <FormattedMessage\n id='channel_invite.no_options_message'\n defaultMessage='No matches found - <InvitationModalLink>Invite them to the team</InvitationModalLink>'\n values={{\n InvitationModalLink: (chunks: string) => (\n <InviteModalLink>\n {chunks}\n </InviteModalLink>\n ),\n }}\n />\n </div>\n );\n\n const content = (\n <MultiSelect\n key='addUsersToChannelKey'\n options={this.state.groupAndUserOptions}\n optionRenderer={this.renderOption}\n intl={this.props.intl}\n selectedItemRef={this.selectedItemRef}\n values={this.state.selectedUsers}\n ariaLabelRenderer={this.renderAriaLabel}\n saveButtonPosition={'bottom'}\n perPage={USERS_PER_PAGE}\n handlePageChange={this.handlePageChange}\n handleInput={this.search}\n handleDelete={this.handleDelete}\n handleAdd={this.addValue}\n handleSubmit={this.handleSubmit}\n handleCancel={closeMembersInviteModal}\n buttonSubmitText={buttonSubmitText}\n buttonSubmitLoadingText={buttonSubmitLoadingText}\n saving={this.state.saving}\n loading={this.state.loadingUsers}\n placeholderText={this.props.isGroupsEnabled ? defineMessage({id: 'multiselect.placeholder.peopleOrGroups', defaultMessage: 'Search for people or groups'}) : defineMessage({id: 'multiselect.placeholder', defaultMessage: 'Search for people'})}\n valueWithImage={true}\n backButtonText={defineMessage({id: 'multiselect.cancel', defaultMessage: 'Cancel'})}\n backButtonClick={closeMembersInviteModal}\n backButtonClass={'btn-tertiary tertiary-button'}\n customNoOptionsMessage={this.props.emailInvitationsEnabled ? customNoOptionsMessage : null}\n />\n );\n\n const inviteGuestLink = (\n <InviteModalLink inviteAsGuest={true}>\n <FormattedMessage\n id='channel_invite.invite_guest'\n defaultMessage='Invite as a Guest'\n />\n </InviteModalLink>\n );\n\n return (\n <Modal\n id='addUsersToChannelModal'\n dialogClassName='a11y__modal channel-invite'\n show={this.state.show}\n onHide={this.onHide}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='channelInviteModalLabel'\n >\n <Modal.Header\n id='channelInviteModalLabel'\n closeButton={true}\n >\n <Modal.Title\n componentClass='h1'\n id='deletePostModalLabel'\n >\n <FormattedMessage\n id='channel_invite.addNewMembers'\n defaultMessage='Add people to {channel}'\n values={{\n channel: this.props.channel.display_name,\n }}\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body\n role='application'\n className='overflow--visible'\n >\n {inviteError}\n <div className='channel-invite__content'>\n {content}\n <TeamWarningBanner\n guests={this.state.guestsNotInTeam}\n teamId={this.props.channel.team_id}\n users={this.state.usersNotInTeam}\n />\n {(this.props.emailInvitationsEnabled && this.props.canInviteGuests) && inviteGuestLink}\n </div>\n </Modal.Body>\n </Modal>\n );\n };\n}\n\nexport default injectIntl(ChannelInviteModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getTeamStats, getTeamMembersByIds} from 'mattermost-redux/actions/teams';\nimport {getProfilesNotInChannel, getProfilesInChannel, searchProfiles} from 'mattermost-redux/actions/users';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getRecentProfilesFromDMs} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {makeGetAllAssociatedGroupsForReference} from 'mattermost-redux/selectors/entities/groups';\nimport {getTeammateNameDisplaySetting, isCustomGroupsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveICurrentTeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam, getMembersInCurrentTeam, getMembersInTeam, getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getProfilesNotInCurrentChannel, getProfilesInCurrentChannel, getProfilesNotInCurrentTeam, getProfilesNotInTeam, getUserStatuses, makeGetProfilesNotInChannel, makeGetProfilesInChannel} from 'mattermost-redux/selectors/entities/users';\n\nimport {addUsersToChannel} from 'actions/channel_actions';\nimport {loadStatusesForProfilesList} from 'actions/status_actions';\nimport {searchAssociatedGroupsForReference} from 'actions/views/group';\nimport {closeModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelInviteModal from './channel_invite_modal';\n\ntype OwnProps = {\n channelId?: string;\n teamId?: string;\n}\n\nfunction makeMapStateToProps(initialState: GlobalState, initialProps: OwnProps) {\n const getAllAssociatedGroupsForReference = makeGetAllAssociatedGroupsForReference();\n let doGetProfilesNotInChannel: (state: GlobalState, channelId: string, filters?: any) => UserProfile[];\n if (initialProps.channelId && initialProps.teamId) {\n doGetProfilesNotInChannel = makeGetProfilesNotInChannel();\n }\n\n let doGetProfilesInChannel: (state: GlobalState, channelId: string, filters?: any) => UserProfile[];\n if (initialProps.channelId && initialProps.teamId) {\n doGetProfilesInChannel = makeGetProfilesInChannel();\n }\n\n return (state: GlobalState, props: OwnProps) => {\n let profilesNotInCurrentChannel: UserProfile[];\n let profilesInCurrentChannel: UserProfile[];\n let profilesNotInCurrentTeam: UserProfile[];\n let membersInTeam;\n\n if (props.channelId && props.teamId) {\n profilesNotInCurrentChannel = doGetProfilesNotInChannel(state, props.channelId);\n profilesInCurrentChannel = doGetProfilesInChannel(state, props.channelId);\n profilesNotInCurrentTeam = getProfilesNotInTeam(state, props.teamId);\n membersInTeam = getMembersInTeam(state, props.teamId);\n } else {\n profilesNotInCurrentChannel = getProfilesNotInCurrentChannel(state);\n profilesInCurrentChannel = getProfilesInCurrentChannel(state);\n profilesNotInCurrentTeam = getProfilesNotInCurrentTeam(state);\n membersInTeam = getMembersInCurrentTeam(state);\n }\n const profilesFromRecentDMs = getRecentProfilesFromDMs(state);\n const config = getConfig(state);\n const license = getLicense(state);\n\n const currentTeam = props.teamId ? getTeam(state, props.teamId) : getCurrentTeam(state);\n\n const guestAccountsEnabled = config.EnableGuestAccounts === 'true';\n const emailInvitationsEnabled = config.EnableEmailInvitations === 'true';\n const isLicensed = license && license.IsLicensed === 'true';\n const isGroupConstrained = Boolean(currentTeam?.group_constrained);\n const canInviteGuests = !isGroupConstrained && isLicensed && guestAccountsEnabled && haveICurrentTeamPermission(state, Permissions.INVITE_GUEST);\n const enableCustomUserGroups = isCustomGroupsEnabled(state);\n\n const isGroupsEnabled = enableCustomUserGroups || (license?.IsLicensed === 'true' && license?.LDAPGroups === 'true');\n\n const userStatuses = getUserStatuses(state);\n\n const teammateNameDisplaySetting = getTeammateNameDisplaySetting(state);\n const groups = getAllAssociatedGroupsForReference(state, true);\n\n return {\n profilesNotInCurrentChannel,\n profilesInCurrentChannel,\n profilesNotInCurrentTeam,\n membersInTeam,\n teammateNameDisplaySetting,\n profilesFromRecentDMs,\n userStatuses,\n canInviteGuests,\n emailInvitationsEnabled,\n groups,\n isGroupsEnabled,\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n addUsersToChannel,\n getProfilesNotInChannel,\n getProfilesInChannel,\n getTeamStats,\n loadStatusesForProfilesList,\n searchProfiles,\n closeModal,\n searchAssociatedGroupsForReference,\n getTeamMembersByIds,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ChannelInviteModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport * as UserUtils from 'mattermost-redux/utils/user_utils';\n\nimport LeaveChannelModal from 'components/leave_channel_modal';\nimport DropdownIcon from 'components/widgets/icons/fa_dropdown_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\nconst ROWS_FROM_BOTTOM_TO_OPEN_UP = 2;\n\nexport interface Props {\n channel: Channel;\n user: UserProfile;\n currentUserId: string;\n channelMember: ChannelMembership;\n canChangeMemberRoles: boolean;\n canRemoveMember: boolean;\n index: number;\n totalUsers: number;\n channelAdminLabel?: JSX.Element;\n channelMemberLabel?: JSX.Element;\n guestLabel?: JSX.Element;\n actions: {\n getChannelStats: (channelId: string) => void;\n updateChannelMemberSchemeRoles: (channelId: string, userId: string, isSchemeUser: boolean, isSchemeAdmin: boolean) => Promise<ActionResult>;\n removeChannelMember: (channelId: string, userId: string) => Promise<ActionResult>;\n getChannelMember: (channelId: string, userId: string) => void;\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n}\n\nexport default function ChannelMembersDropdown({\n channel,\n user,\n currentUserId,\n channelMember,\n canChangeMemberRoles,\n canRemoveMember,\n index,\n totalUsers,\n channelAdminLabel,\n channelMemberLabel,\n guestLabel,\n actions,\n}: Props) {\n const intl = useIntl();\n\n const [removing, setRemoving] = useState(false);\n const [serverError, setServerError] = useState<string | null>(null);\n const dispatch = useDispatch();\n\n const handleRemoveFromChannel = async () => {\n if (removing) {\n return;\n }\n\n if (user.id === currentUserId) {\n setRemoving(true);\n dispatch(actions.openModal({\n modalId: ModalIdentifiers.LEAVE_PRIVATE_CHANNEL_MODAL,\n dialogType: LeaveChannelModal,\n dialogProps: {\n channel,\n callback: () => {\n actions.getChannelStats(channel.id);\n setRemoving(false);\n },\n },\n }));\n } else {\n setRemoving(true);\n const {error} = await actions.removeChannelMember(channel.id, user.id);\n setRemoving(false);\n if (error) {\n setServerError(error.message);\n return;\n }\n\n actions.getChannelStats(channel.id);\n }\n };\n\n const handleMakeChannelAdmin = () => {\n updateChannelMemberSchemeRole(true);\n };\n\n const handleMakeChannelMember = () => {\n updateChannelMemberSchemeRole(false);\n };\n\n const updateChannelMemberSchemeRole = async (schemeAdmin: boolean) => {\n const {error} = await actions.updateChannelMemberSchemeRoles(channel.id, user.id, true, schemeAdmin);\n if (error) {\n setServerError(error.message);\n return;\n }\n\n actions.getChannelStats(channel.id);\n actions.getChannelMember(channel.id, user.id);\n };\n\n const renderRole = (isChannelAdmin: boolean, isGuest: boolean) => {\n if (isChannelAdmin) {\n if (channelAdminLabel) {\n return channelAdminLabel;\n }\n return (\n <FormattedMessage\n id='channel_members_dropdown.channel_admin'\n defaultMessage='Channel Admin'\n />\n );\n } else if (isGuest) {\n if (guestLabel) {\n return guestLabel;\n }\n return (\n <FormattedMessage\n id='channel_members_dropdown.channel_guest'\n defaultMessage='Channel Guest'\n />\n );\n }\n\n if (channelMemberLabel) {\n return channelMemberLabel;\n }\n return (\n <FormattedMessage\n id='channel_members_dropdown.channel_member'\n defaultMessage='Channel Member'\n />\n );\n };\n\n const isChannelAdmin = UserUtils.isChannelAdmin(channelMember.roles) || channelMember.scheme_admin;\n const isGuest = UserUtils.isGuest(user.roles);\n const isMember = !isChannelAdmin && !isGuest;\n const isDefaultChannel = channel.name === Constants.DEFAULT_CHANNEL;\n const currentRole = renderRole(isChannelAdmin, isGuest);\n\n if (user.remote_id) {\n return (<></>);\n }\n\n const canMakeUserChannelMember = canChangeMemberRoles && isChannelAdmin;\n const canMakeUserChannelAdmin = canChangeMemberRoles && isMember;\n const canRemoveUserFromChannel = canRemoveMember && (!channel.group_constrained || user.is_bot) && (!isDefaultChannel || isGuest);\n const removeFromChannelText = user.id === currentUserId ? intl.formatMessage({id: 'channel_header.leave', defaultMessage: 'Leave Channel'}) : intl.formatMessage({id: 'channel_members_dropdown.remove_from_channel', defaultMessage: 'Remove from Channel'});\n const removeFromChannelTestId = user.id === currentUserId ? 'leaveChannel' : 'removeFromChannel';\n\n if (canMakeUserChannelMember || canMakeUserChannelAdmin || canRemoveUserFromChannel) {\n const removeMenu = (\n <Menu.ItemAction\n data-testid={removeFromChannelTestId}\n show={canRemoveUserFromChannel}\n onClick={handleRemoveFromChannel}\n text={removeFromChannelText}\n isDangerous={true}\n />\n );\n const makeAdminMenu = (\n <Menu.ItemAction\n id={`${user.username}-make-channel-admin`}\n show={canMakeUserChannelAdmin}\n onClick={handleMakeChannelAdmin}\n text={intl.formatMessage({id: 'channel_members_dropdown.make_channel_admin', defaultMessage: 'Make Channel Admin'})}\n />\n );\n const makeMemberMenu = (\n <Menu.ItemAction\n id={`${user.username}-make-channel-member`}\n show={canMakeUserChannelMember}\n onClick={handleMakeChannelMember}\n text={intl.formatMessage({id: 'channel_members_dropdown.make_channel_member', defaultMessage: 'Make Channel Member'})}\n />\n );\n return (\n <MenuWrapper>\n <button\n className='dropdown-toggle theme color--link style--none'\n type='button'\n >\n <span className='sr-only'>{user.username}</span>\n <span>{currentRole} </span>\n <DropdownIcon/>\n </button>\n <Menu\n openLeft={true}\n openUp={totalUsers > ROWS_FROM_BOTTOM_TO_OPEN_UP && totalUsers - index <= ROWS_FROM_BOTTOM_TO_OPEN_UP}\n ariaLabel={intl.formatMessage({id: 'channel_members_dropdown.menuAriaLabel', defaultMessage: 'Change the role of channel member'})}\n >\n {canMakeUserChannelMember ? makeMemberMenu : null}\n {canMakeUserChannelAdmin ? makeAdminMenu : null}\n {canRemoveUserFromChannel ? removeMenu : null}\n {serverError && (\n <div className='has-error'>\n <label className='has-error control-label'>{serverError}</label>\n </div>\n )}\n </Menu>\n </MenuWrapper>\n );\n }\n\n if (isDefaultChannel) {\n return (\n <div/>\n );\n }\n\n return (\n <div>\n {currentRole}\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {getChannelStats, updateChannelMemberSchemeRoles, removeChannelMember, getChannelMember} from 'mattermost-redux/actions/channels';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {canManageMembers} from 'utils/channel_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelMembersDropdown from './channel_members_dropdown';\n\ninterface OwnProps {\n channel: Channel;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const {channel} = ownProps;\n const canChangeMemberRoles = haveIChannelPermission(\n state,\n channel.team_id,\n channel.id,\n Permissions.MANAGE_CHANNEL_ROLES,\n ) && canManageMembers(state, channel);\n const canRemoveMember = canManageMembers(state, channel);\n\n return {\n currentUserId: getCurrentUserId(state),\n canChangeMemberRoles,\n canRemoveMember,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getChannelMember,\n getChannelStats,\n updateChannelMemberSchemeRoles,\n removeChannelMember,\n openModal,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelMembersDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport ChannelMembersDropdown from 'components/channel_members_dropdown';\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport ProfilePicture from 'components/profile_picture';\nimport ProfilePopover from 'components/profile_popover';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport GuestTag from 'components/widgets/tag/guest_tag';\nimport WithTooltip from 'components/with_tooltip';\n\nimport type {ChannelMember} from './channel_members_rhs';\n\nconst Avatar = styled.div`\n flex-basis: fit-content;\n flex-shrink: 0;\n`;\n\nconst DisplayName = styled.span`\n display: inline;\n overflow: hidden;\n margin-left: 8px;\n color: var(--center-channel-color);\n font-size: 14px;\n gap: 8px;\n line-height: 20px;\n text-overflow: ellipsis;\n`;\n\nconst Username = styled.span`\n margin-left: 4px;\n color: rgba(var(--center-channel-color-rgb), 0.75);\n font-size: 12px;\n line-height: 18px;\n`;\n\nconst SendMessage = styled.button`\n display: none;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n margin-left: 8px;\n background-color: transparent;\n border-radius: 4px;\n\n &:hover {\n background-color: rgba(var(--center-channel-color-rgb), 0.12);\n }\n\n .icon {\n color: rgba(var(--center-channel-color-rgb), 0.64);\n font-size: 14.4px;\n };\n`;\n\nconst RoleChooser = styled.div`\n display: none;\n flex-basis: fit-content;\n flex-shrink: 0;\n\n &.editing {\n display: block;\n }\n\n .MenuWrapper {\n padding: 6px 10px;\n border-radius: 4px;\n &.MenuWrapper--open {\n background: rgba(var(--button-bg-rgb), 0.16);\n }\n &:not(.MenuWrapper--open):hover {\n background: rgba(var(--center-channel-color-rgb), 0.08);\n }\n }\n`;\n\nconst SharedIcon = styled.span`\n margin: 0 0 0 4px;\n font-size: 16px;\n line-height: 20px;\n`;\n\ninterface Props {\n className?: string;\n channel: Channel;\n member: ChannelMember;\n index: number;\n totalUsers: number;\n editing: boolean;\n actions: {\n openDirectMessage: (user: UserProfile) => void;\n };\n}\n\nconst Member = ({className, channel, member, index, totalUsers, editing, actions}: Props) => {\n const {formatMessage} = useIntl();\n\n const userProfileSrc = Client4.getProfilePictureUrl(member.user.id, member.user.last_picture_update);\n\n return (\n <div\n className={className}\n style={{height: '48px'}}\n data-testid={`memberline-${member.user.id}`}\n >\n <span className='ProfileSpan'>\n <Avatar>\n <ProfilePicture\n size='sm'\n status={member.status}\n isBot={member.user.is_bot}\n userId={member.user.id}\n username={member.displayName}\n src={userProfileSrc}\n />\n </Avatar>\n <ProfilePopover\n triggerComponentClass='profileSpan_userInfo'\n userId={member.user.id}\n src={userProfileSrc}\n hideStatus={member.user.is_bot}\n >\n <DisplayName>\n {member.displayName}\n {isGuest(member.user.roles) && <GuestTag/>}\n {member.user.remote_id &&\n (\n <SharedIcon>\n <SharedChannelIndicator\n withTooltip={true}\n />\n </SharedIcon>\n )}\n </DisplayName>\n {\n member.displayName === member.user.username ? null : <Username>{'@'}{member.user.username}</Username>\n }\n <CustomStatusEmoji\n userID={member.user.id}\n showTooltip={true}\n emojiSize={16}\n spanStyle={{\n display: 'flex',\n flex: '0 0 auto',\n alignItems: 'center',\n }}\n emojiStyle={{\n marginLeft: '8px',\n alignItems: 'center',\n }}\n />\n </ProfilePopover>\n </span>\n\n <RoleChooser\n className={classNames({editing}, 'member-role-chooser')}\n data-testid='rolechooser'\n >\n {member.membership && (\n <ChannelMembersDropdown\n channel={channel}\n user={member.user}\n channelMember={member.membership}\n index={index}\n totalUsers={totalUsers}\n channelAdminLabel={\n <FormattedMessage\n id='channel_members_rhs.member.select_role_channel_admin'\n defaultMessage='Admin'\n />\n }\n channelMemberLabel={\n <FormattedMessage\n id='channel_members_rhs.member.select_role_channel_member'\n defaultMessage='Member'\n />\n }\n guestLabel={\n <FormattedMessage\n id='channel_members_rhs.member.select_role_guest'\n defaultMessage='Guest'\n />\n }\n />\n )}\n </RoleChooser>\n {!editing && (\n <WithTooltip\n title={formatMessage({\n id: 'channel_members_rhs.member.send_message',\n defaultMessage: 'Send message',\n })}\n >\n <SendMessage onClick={() => actions.openDirectMessage(member.user)}>\n <i className='icon icon-send'/>\n </SendMessage>\n </WithTooltip>\n )}\n </div>\n );\n};\n\nexport default styled(Member)`\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 8px 16px;\n border-radius: 4px;\n\n &:hover {\n background: rgba(var(--center-channel-color-rgb), 0.08);\n color: rgba(var(--center-channel-color-rgb), 0.75);\n\n ${SendMessage} {\n display: block;\n flex: 0 0 auto;\n }\n }\n\n .ProfileSpan {\n width: 100%;\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 4px 0; // This padding is to make sure the status icon doesn't get clipped off because of the overflow\n\n .profileSpan_userInfo {\n display: flex;\n flex-grow: 1;\n cursor: pointer;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n }\n\n .MenuWrapper {\n font-size: 11px;\n font-weight: 600;\n }\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useEffect, useRef, useState} from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport {VariableSizeList} from 'react-window';\nimport type {ListChildComponentProps} from 'react-window';\nimport InfiniteLoader from 'react-window-infinite-loader';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport Member from './member';\n\ninterface ChannelMember {\n user: UserProfile;\n membership?: ChannelMembership;\n status?: string;\n displayName: string;\n}\n\nenum ListItemType {\n Member = 'member',\n FirstSeparator = 'first-separator',\n Separator = 'separator',\n}\n\ninterface ListItem {\n type: ListItemType;\n data: ChannelMember | JSX.Element;\n}\nexport interface Props {\n channel: Channel;\n members: ListItem[];\n editing: boolean;\n hasNextPage: boolean;\n isNextPageLoading: boolean;\n searchTerms: string;\n openDirectMessage: (user: UserProfile) => void;\n loadMore: () => void;\n}\n\nconst MemberList = ({\n hasNextPage,\n isNextPageLoading,\n channel,\n members,\n searchTerms,\n editing,\n openDirectMessage,\n loadMore,\n}: Props) => {\n const infiniteLoaderRef = useRef<InfiniteLoader | null>(null);\n const variableSizeListRef = useRef<VariableSizeList | null>(null);\n const [hasMounted, setHasMounted] = useState(false);\n\n useEffect(() => {\n if (hasMounted) {\n if (infiniteLoaderRef.current) {\n infiniteLoaderRef.current.resetloadMoreItemsCache();\n }\n if (variableSizeListRef.current) {\n variableSizeListRef.current.resetAfterIndex(0);\n }\n }\n setHasMounted(true);\n }, [searchTerms, members.length, hasMounted]);\n\n const itemCount = hasNextPage ? members.length + 1 : members.length;\n\n const loadMoreItems = isNextPageLoading ? () => {} : loadMore;\n\n const isItemLoaded = (index: number) => {\n return !hasNextPage || index < members.length;\n };\n\n const getItemSize = (index: number) => {\n if (!(index in members)) {\n return 0;\n }\n\n switch (members[index].type) {\n case ListItemType.FirstSeparator:\n return 28;\n case ListItemType.Separator:\n return 16 + 28;\n }\n\n return 48;\n };\n\n const Item = ({index, style}: ListChildComponentProps) => {\n if (isItemLoaded(index)) {\n switch (members[index].type) {\n case ListItemType.Member:\n // eslint-disable-next-line no-case-declarations\n const member = members[index].data as ChannelMember;\n return (\n <div\n style={style}\n key={member.user.id}\n >\n <Member\n channel={channel}\n index={index}\n totalUsers={members.length}\n member={member}\n editing={editing}\n actions={{openDirectMessage}}\n />\n </div>\n );\n case ListItemType.Separator:\n case ListItemType.FirstSeparator:\n return (\n <div\n key={index}\n style={style}\n >\n {members[index].data}\n </div>\n );\n default:\n return null;\n }\n }\n\n return null;\n };\n\n if (members.length === 0) {\n return null;\n }\n\n return (\n <AutoSizer>\n {({height, width}) => (\n <InfiniteLoader\n ref={infiniteLoaderRef}\n isItemLoaded={isItemLoaded}\n itemCount={itemCount}\n loadMoreItems={loadMoreItems}\n >\n {({onItemsRendered, ref}) => (\n\n <VariableSizeList\n itemCount={itemCount}\n onItemsRendered={onItemsRendered}\n ref={(list) => {\n ref(list);\n variableSizeListRef.current = list;\n }}\n\n itemSize={getItemSize}\n height={height}\n width={width}\n >\n {Item}\n </VariableSizeList>\n )}\n </InfiniteLoader>\n )}\n </AutoSizer>\n );\n};\n\nexport default memo(MemberList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {Limits} from '@mattermost/types/cloud';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport useGetLimits from 'components/common/hooks/useGetLimits';\nimport useGetUsage from 'components/common/hooks/useGetUsage';\nimport CompassThemeProvider from 'components/compass_theme_provider/compass_theme_provider';\n\nimport type {Message} from 'utils/i18n';\n\nimport WorkspaceLimitsPanel, {messageToElement} from './workspace_limits_panel';\n\nimport './index.scss';\n\ninterface ModalAction {\n message: Message | React.ReactNode;\n onClick?: () => void;\n}\nexport interface Props {\n title: Message | React.ReactNode;\n description?: Message | React.ReactNode;\n primaryAction?: ModalAction;\n secondaryAction?: ModalAction;\n onClose: () => void;\n ownLimits?: Limits;\n backdrop?: boolean;\n backdropClassName?: string;\n className?: string;\n\n // e.g. in contexts where the CompassThemeProvider isn't already applied, like the system console\n needsTheme?: boolean;\n}\n\nexport default function CloudUsageModal(props: Props) {\n const [limits] = useGetLimits();\n const usage = useGetUsage();\n const theme = useSelector(getTheme);\n\n const modal = (\n <GenericModal\n handleCancel={props.onClose}\n compassDesign={true}\n onExited={props.onClose}\n modalHeaderText={messageToElement(props.title)}\n cancelButtonText={props.secondaryAction && messageToElement(props.secondaryAction.message)}\n handleConfirm={props.primaryAction?.onClick}\n confirmButtonText={props.primaryAction && messageToElement(props.primaryAction.message)}\n className='CloudUsageModal'\n backdrop={props.backdrop}\n backdropClassName={props.backdropClassName}\n >\n <>\n {React.isValidElement(props.description) ? props.description : <p className='CloudUsageModal__description'>\n {props.description && messageToElement(props.description)}\n </p>}\n <WorkspaceLimitsPanel\n showIcons={true}\n limits={props.ownLimits || limits}\n usage={usage}\n />\n </>\n </GenericModal>\n );\n\n if (!props.needsTheme) {\n return modal;\n }\n\n return (\n <CompassThemeProvider theme={theme}>\n {modal}\n </CompassThemeProvider>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport UsagePercentBar from 'components/common/usage_percent_bar';\n\nimport './limit_line.scss';\n\ninterface Props {\n icon: string;\n limitName: React.ReactNode;\n limitStatus: React.ReactNode;\n percent: number;\n showIcons?: boolean;\n}\n\nexport default function LimitLine(props: Props) {\n return (\n <div className='WorkspaceLimitLine'>\n {props.showIcons && <i className={`WorkspaceLimitLine__icon ${props.icon}`}/>}\n <div className='WorkspaceLimitLine__bar'>\n <div className='WorkspaceLimitLine__bar-label'>{props.limitName}</div>\n <UsagePercentBar\n barWidth='auto'\n percent={Math.floor(props.percent * 100)}\n />\n </div>\n <div className='WorkspaceLimitLine__text-status'>\n {props.limitStatus}\n </div>\n </div>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {CloudUsage, Limits} from '@mattermost/types/cloud';\n\nimport type {Message} from 'utils/i18n';\nimport {asGBString, inK} from 'utils/limits';\n\nimport LimitLine from './limit_line';\n\nexport function messageToElement(x: Message | React.ReactNode): React.ReactNode {\n if (x && typeof x === 'object' && Object.hasOwn(x, 'defaultMessage')) {\n return (\n <FormattedMessage\n id={(x as Message).id}\n defaultMessage={(x as Message).defaultMessage}\n values={(x as Message).values}\n />\n );\n }\n\n return x;\n}\n\ninterface Props {\n limits: Limits;\n usage: CloudUsage;\n showIcons?: boolean;\n}\n\nexport default function WorkspaceLimitsPanel(props: Props) {\n const intl = useIntl();\n return (\n <div>\n <LimitLine\n icon='icon-message-text-outline'\n showIcons={props.showIcons}\n percent={props.usage.messages.history / (props.limits?.messages?.history || Number.MAX_VALUE)}\n limitName={(\n <FormattedMessage\n id='workspace_limits.message_history.short'\n defaultMessage='Messages'\n />\n )}\n limitStatus={(\n <FormattedMessage\n id='workspace_limits.message_history.short.usage'\n defaultMessage='{actual} / {limit}'\n values={{\n actual: inK(props.usage.messages.history),\n limit: inK(props.limits?.messages?.history || 0),\n }}\n />\n )}\n />\n <LimitLine\n icon='icon-folder-outline'\n showIcons={props.showIcons}\n percent={props.usage.files.totalStorage / (props.limits?.files?.total_storage || Number.MAX_VALUE)}\n limitName={(\n <FormattedMessage\n id='workspace_limits.file_storage.short'\n defaultMessage='Files'\n />\n )}\n limitStatus={(\n <FormattedMessage\n id='workspace_limits.file_storage.short.usage'\n defaultMessage='{actual} / {limit}'\n values={{\n actual: asGBString(props.usage.files.totalStorage, intl.formatNumber),\n limit: asGBString(props.limits?.files?.total_storage || 0, intl.formatNumber),\n }}\n />\n )}\n />\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState, useRef} from 'react';\nimport type {CSSProperties} from 'react';\nimport {Transition} from 'react-transition-group';\nimport scrollIntoView from 'smooth-scroll-into-view-if-needed';\n\nimport './auto_height_switcher.scss';\n\nexport enum AutoHeightSlots {\n SLOT1 = 1,\n SLOT2 = 2,\n}\n\ntype AutoHeightProps = {\n showSlot: AutoHeightSlots;\n duration?: number;\n shouldScrollIntoView?: boolean;\n slot1?: React.ReactNode | React.ReactNode[];\n slot2?: React.ReactNode | React.ReactNode[];\n onTransitionEnd?: (node?: HTMLElement) => void;\n};\n\nconst AutoHeightSwitcher = ({showSlot, onTransitionEnd, slot1 = null, slot2 = null, duration = 250, shouldScrollIntoView = false}: AutoHeightProps) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const childRef = useRef<HTMLDivElement>(null);\n const prevSlot = useRef<AutoHeightProps['showSlot']>(showSlot);\n const prevHeight = useRef<number|null>(null);\n const [animate, setAnimate] = useState<boolean>(false);\n const [height, setHeight] = useState<string | number>('auto');\n const [overflow, setOverflow] = useState<string>('visible');\n const [child, setChild] = useState(showSlot === AutoHeightSlots.SLOT1 ? slot1 : slot2);\n\n useEffect(() => {\n if (prevSlot.current === showSlot) {\n // slot that is currently in view gets updated\n setChild(showSlot === AutoHeightSlots.SLOT1 ? slot1 : slot2);\n } else {\n // switch slots using height animation\n prevSlot.current = showSlot;\n setAnimate(true);\n }\n }, [showSlot, slot1, slot2]);\n\n useEffect(() => {\n if (shouldScrollIntoView) {\n const timeout = setTimeout(() => scrollIntoView(wrapperRef.current!, {\n behavior: 'smooth',\n scrollMode: 'if-needed',\n block: 'center',\n }), 200);\n return () => clearTimeout(timeout);\n }\n return () => {};\n }, [shouldScrollIntoView, showSlot]);\n\n // necessary to override this on element-level since a rule from _post.scss has a higher specificity\n // and would override the display property\n const fixedStyles: CSSProperties = {\n transitionProperty: 'height',\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: 'ease',\n width: '100%',\n };\n\n /**\n * the lifecycle of this transition-component is divided in 3 different stages:\n * 1. onEnter:\n * we calculate the current height from the wrapperRef and set a fixed height\n * for it to make the overflowing possible. Last action taken is to replace\n * the current children with the new ones.\n * 2. onEntering:\n * when the new children are rendered we can get the new offsetHeight from\n * the childRef and set it as the height for the wrapper. A change in height\n * will then trigger a transition via CSS.\n * 3. onEntered:\n * when transitions are finished (this is checked within the addEndListener prop)\n * we reset our component so that it behaves like before the switch-transition\n */\n return (\n <Transition\n in={animate}\n timeout={duration}\n onEnter={() => {\n setHeight(prevHeight.current ?? childRef.current!.offsetHeight);\n setOverflow('hidden');\n setChild(showSlot === AutoHeightSlots.SLOT1 ? slot1 : slot2);\n }}\n onEntering={() => {\n setHeight(childRef.current!.offsetHeight);\n }}\n onEntered={(node: HTMLElement) => {\n prevHeight.current = childRef.current!.offsetHeight;\n setHeight('auto');\n setOverflow('visible');\n setAnimate(false);\n onTransitionEnd?.(node);\n }}\n >\n <div\n className='AutoHeight'\n ref={wrapperRef}\n style={{...fixedStyles, height, overflow}}\n >\n <div ref={childRef}>\n {child}\n </div>\n </div>\n </Transition>\n );\n};\n\nexport default AutoHeightSwitcher;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\n\nimport CarouselButton, {BtnStyle} from './carousel_button';\nimport './carousel.scss';\n\ntype Props = {\n dataSlides: React.ReactNode[];\n id: string;\n infiniteSlide: boolean;\n onNextSlideClick?: (slideIndex: number) => void;\n onPrevSlideClick?: (slideIndex: number) => void;\n disableNextButton?: boolean;\n btnsStyle?: BtnStyle; // chevron or bottom buttons\n actionButton?: JSX.Element;\n}\nconst Carousel = ({\n dataSlides,\n id,\n infiniteSlide,\n onNextSlideClick,\n onPrevSlideClick,\n disableNextButton,\n btnsStyle = BtnStyle.BUTTON,\n actionButton,\n}: Props): JSX.Element | null => {\n const [slideIndex, setSlideIndex] = useState(1);\n const [prevButtonDisabled, setPrevButtonDisabled] = useState(!infiniteSlide);\n const [nextButtonDisabled, setNextButtonDisabled] = useState(false);\n\n const nextSlide = () => {\n setPrevButtonDisabled(false);\n\n const isLastIndex = slideIndex === dataSlides.length;\n const newSlideIndex = isLastIndex && infiniteSlide ? 1 : (!isLastIndex && slideIndex + 1) || undefined;\n\n if (newSlideIndex) {\n setSlideIndex(newSlideIndex);\n\n if (onNextSlideClick) {\n onNextSlideClick(newSlideIndex);\n }\n }\n };\n\n const prevSlide = () => {\n setNextButtonDisabled(false);\n\n const isFirstSlide = slideIndex === 1;\n const newSlideIndex = isFirstSlide && infiniteSlide ? dataSlides.length : (!isFirstSlide && slideIndex - 1) || undefined;\n\n if (newSlideIndex) {\n setSlideIndex(newSlideIndex);\n\n if (onPrevSlideClick) {\n onPrevSlideClick(newSlideIndex);\n }\n }\n };\n\n useEffect(() => {\n if (slideIndex === dataSlides.length) {\n if (!infiniteSlide) {\n setNextButtonDisabled(true);\n }\n } else if (slideIndex === 1) {\n if (!infiniteSlide) {\n setPrevButtonDisabled(true);\n }\n }\n }, [slideIndex]);\n\n const moveDot = (index: number) => {\n setSlideIndex(index);\n };\n\n return (\n <div\n className='container-slider'\n id={id}\n >\n {btnsStyle === BtnStyle.CHEVRON && <>\n <CarouselButton\n moveSlide={prevSlide}\n direction={'prev'}\n disabled={prevButtonDisabled}\n btnsStyle={BtnStyle.CHEVRON}\n />\n <CarouselButton\n moveSlide={nextSlide}\n direction={'next'}\n disabled={nextButtonDisabled || disableNextButton}\n btnsStyle={BtnStyle.CHEVRON}\n />\n </>}\n {dataSlides.map((obj: any, index: number) => {\n return (\n <div\n key={`${index.toString()}`}\n className={slideIndex === index + 1 ? 'slide active-anim' : 'slide'}\n >\n {obj}\n </div>\n );\n })}\n\n <div className='container-footer'>\n <div className='container-dots'>\n {dataSlides.map((item, index) => (\n <div\n key={index.toString()}\n onClick={() => moveDot(index + 1)}\n className={slideIndex === index + 1 ? 'dot active' : 'dot'}\n />\n ))}\n </div>\n {btnsStyle === BtnStyle.BUTTON && <div className=' buttons container-buttons'>\n <CarouselButton\n moveSlide={prevSlide}\n direction={'prev'}\n disabled={prevButtonDisabled}\n />\n <CarouselButton\n moveSlide={nextSlide}\n direction={'next'}\n disabled={nextButtonDisabled || disableNextButton}\n />\n </div>}\n {actionButton && <div className=' buttons container-buttons'>\n {actionButton}\n </div>}\n </div>\n </div>\n );\n};\n\nexport default Carousel;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport './carousel.scss';\n\nexport enum BtnStyle {\n BUTTON = 'button',\n CHEVRON = 'chevron',\n}\n\ntype Props = {\n direction: string;\n moveSlide: () => void;\n btnsStyle?: BtnStyle;\n disabled?: boolean;\n}\n\nenum Destination {\n NEXT = 'next',\n PREV = 'prev',\n}\n\nconst CarouselButton = ({direction, moveSlide, disabled, btnsStyle = BtnStyle.BUTTON}: Props): JSX.Element => {\n const {formatMessage} = useIntl();\n\n const handleMoveSlide = () => {\n if (disabled) {\n return;\n }\n moveSlide();\n };\n\n const text = direction === Destination.NEXT ? formatMessage({id: 'carousel.nextButton', defaultMessage: 'Next'}) : formatMessage({id: 'carousel.PreviousButton', defaultMessage: 'Previous'});\n\n const disabledClass = disabled ? ' disabled' : '';\n const orientation = direction === Destination.NEXT ? 'right' : 'left';\n\n if (btnsStyle === BtnStyle.CHEVRON) {\n return (\n <div\n className={`chevron-button chevron-${orientation} ${direction}-btn` + disabledClass}\n onClick={handleMoveSlide}\n >\n <i className={`icon-chevron-${orientation}`}/>\n </div>\n );\n }\n return (\n <a\n onClick={handleMoveSlide}\n className={`${direction === Destination.NEXT ? ' next next-btn' : ' prev previous-btn'}` + disabledClass}\n >\n {direction === Destination.PREV ? <i className='icon-arrow-back-ios'/> : null}\n {text}\n {direction === Destination.NEXT ? <i className='icon-arrow-forward-ios'/> : null}\n </a>\n );\n};\n\nexport default CarouselButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\nimport styled from 'styled-components';\n\nimport RenderEmoji from 'components/emoji/render_emoji';\n\n// This component is a temporary placeholder for use until the authoritative `compass-components` Chip is implemented.\n\ntype Props = {\n onClick?: () => void;\n display?: MessageDescriptor;\n values?: Record<string, any>;\n className?: string;\n\n // for the \"other\" option unlike the others, e.g. free-form response\n otherOption?: boolean;\n leadingIcon?: string;\n additionalMarkup?: React.ReactNode | React.ReactNodeArray;\n}\n\nconst StyledChip = styled.button<{ otherOption?: boolean }>`\n display: flex;\n flex-shrink: 0;\n align-items: center;\n box-shadow: var(--elevation-1);\n font-weight: bold;\n\n padding: 6px 12px;\n margin-right: 12px;\n margin-bottom: 12px;\n\n &:last-child {\n margin-right: 0;\n }\n\n border: 1px solid rgba(var(--center-channel-color-rgb), 0.08);\n border-radius: 16px;\n\n background-color: var(--center-channel-bg);\n ${(p) => (p.otherOption ? 'color: rgba(var(--center-channel-color-rgb), 0.75);' : '')}\n\n &:hover {\n background-color: rgba(var(--center-channel-color-rgb), 0.08);\n }\n\n &:active {\n background-color: rgba(var(--mention-highlight-link-rgb), 0.08);\n }\n`;\n\nconst emojiStyles = {marginRight: '11px'};\n\nconst Chip = ({\n onClick,\n otherOption,\n className,\n leadingIcon,\n display,\n values,\n additionalMarkup,\n}: Props) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n onClick?.();\n }, [onClick]);\n\n return (\n <StyledChip\n onClick={handleClick}\n otherOption={otherOption}\n className={className || ''}\n >\n {leadingIcon && (\n <RenderEmoji\n emojiName={leadingIcon}\n emojiStyle={emojiStyles}\n />\n )}\n {(display && values) && (\n <FormattedMessage\n {...display}\n values={values}\n />\n )}\n {additionalMarkup}\n </StyledChip>\n );\n};\n\nexport default Chip;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport isEmpty from 'lodash/isEmpty';\nimport React from 'react';\nimport type {ComponentType} from 'react';\n\nimport type {Subscription} from '@mattermost/types/cloud';\n\ninterface Actions {\n getCloudSubscription?: () => void;\n}\n\ninterface UsedHocProps {\n subscription?: Subscription;\n isCloud: boolean;\n actions: Actions;\n userIsAdmin?: boolean;\n}\n\nfunction withGetCloudSubscription<P>(WrappedComponent: ComponentType<P>): ComponentType<any> {\n return class extends React.Component<P & UsedHocProps> {\n async componentDidMount() {\n // if not is cloud, not even try to destructure values from props, just return\n if (!this.props.isCloud) {\n return;\n }\n const {subscription, actions, userIsAdmin} = this.props;\n\n if (isEmpty(subscription) && userIsAdmin && actions?.getCloudSubscription) {\n await actions.getCloudSubscription();\n }\n }\n\n render(): JSX.Element {\n return <WrappedComponent {...this.props}/>;\n }\n };\n}\n\nexport default withGetCloudSubscription;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nexport enum CSWAvailabilityCheckTypes {\n Available = 'available',\n Unavailable = 'unavailable',\n Pending = 'pending',\n NotApplicable = 'notApplicable',\n}\n\nexport default function useCWSAvailabilityCheck(): CSWAvailabilityCheckTypes {\n const [cswAvailability, setCSWAvailability] = useState<CSWAvailabilityCheckTypes>(CSWAvailabilityCheckTypes.Pending);\n\n const config = useSelector(getConfig);\n const isEnterpriseReady = config.BuildEnterpriseReady === 'true';\n\n useEffect(() => {\n async function cwsAvailabilityCheck() {\n try {\n await Client4.cwsAvailabilityCheck();\n setCSWAvailability(CSWAvailabilityCheckTypes.Available);\n } catch (error) {\n setCSWAvailability(CSWAvailabilityCheckTypes.Unavailable);\n }\n }\n\n if (isEnterpriseReady) {\n cwsAvailabilityCheck();\n } else {\n setCSWAvailability(CSWAvailabilityCheckTypes.NotApplicable);\n }\n }, [isEnterpriseReady]);\n\n return cswAvailability;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// Disable consistent return since the effectCallback allows for non consistent returns.\n/* eslint-disable consistent-return */\n\nimport {useEffect, useRef} from 'react';\n\nconst useDidUpdate: typeof useEffect = (effect, deps) => {\n const mounted = useRef(false);\n useEffect(() => {\n if (mounted.current) {\n return effect();\n }\n\n mounted.current = true;\n }, deps);\n};\n\nexport default useDidUpdate;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Invoice, Subscription} from '@mattermost/types/cloud';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nexport const getExpandSeatsLink: (state: GlobalState) => (licenseId: string) => string = createSelector(\n 'getExpandSeatsLink',\n getConfig,\n (config) => {\n const cwsUrl = config.CWSURL;\n return (licenseId: string) => {\n return `${cwsUrl}/subscribe/expand?licenseId=${licenseId}`;\n };\n },\n);\n\nexport const getCloudDelinquentInvoices = createSelector(\n 'getCloudDelinquentInvoices',\n (state: GlobalState) => state.entities.cloud.invoices as Record<string, Invoice>,\n (invoices: Record<string, Invoice>) => {\n if (!invoices) {\n return [];\n }\n\n return Object.values(invoices || []).filter((invoice) => invoice.status !== 'paid' && invoice.total > 0);\n },\n);\n\nexport const isCloudDelinquencyGreaterThan90Days = createSelector(\n 'isCloudDelinquencyGreaterThan90Days',\n (state: GlobalState) => state.entities.cloud.subscription as Subscription,\n (subscription: Subscription) => {\n if (!subscription || !subscription.delinquent_since) {\n return false;\n }\n const now = new Date();\n const delinquentDate = new Date(subscription.delinquent_since * 1000);\n return (Math.floor((now.getTime() - delinquentDate.getTime()) / (1000 * 60 * 60 * 24)) >= 90);\n },\n);\n\nexport const isCwsMockMode = (state: GlobalState) => getConfig(state)?.CWSMock === 'true';\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback} from 'react';\nimport {defineMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport {getExpandSeatsLink} from 'selectors/cloud';\n\ntype UseExpandOverageUsersCheckArgs = {\n isWarningState: boolean;\n banner: 'global banner' | 'invite modal';\n}\n\nconst cta = defineMessage({\n id: 'licensingPage.overageUsersBanner.cta',\n defaultMessage: 'Contact Sales',\n});\n\nexport const useExpandOverageUsersCheck = ({\n isWarningState,\n banner,\n}: UseExpandOverageUsersCheckArgs) => {\n const expandableLink = useSelector(getExpandSeatsLink);\n\n const trackEventFn = useCallback((cta: 'Contact Sales' | 'Self Serve') => {\n trackEvent('insights', isWarningState ? 'click_true_up_warning' : 'click_true_up_error', {\n cta,\n banner,\n });\n }, [banner, isWarningState]);\n\n return {\n cta,\n expandableLink,\n trackEventFn,\n };\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useMemo} from 'react';\n\nimport type {CloudUsage, Limits} from '@mattermost/types/cloud';\n\nimport {limitThresholds, LimitTypes} from 'utils/limits';\n\ninterface MaybeLimitSummary {\n id: typeof LimitTypes[keyof typeof LimitTypes];\n limit: number | undefined;\n usage: number;\n}\nexport interface LimitSummary {\n id: typeof LimitTypes[keyof typeof LimitTypes];\n limit: number;\n usage: number;\n}\n\nfunction refineToDefined(...args: MaybeLimitSummary[]): LimitSummary[] {\n return args.reduce((acc: LimitSummary[], maybeLimitType: MaybeLimitSummary) => {\n if (maybeLimitType.limit !== undefined) {\n acc.push(maybeLimitType as LimitSummary);\n }\n return acc;\n }, []);\n}\n\n// Hook used to tell if some limit status should be surfaced to the user\n// for further attention, for example for prompting the user to upgrade\n// from a free cloud instance to a paid cloud instance.\nexport default function useGetHighestThresholdCloudLimit(usage: CloudUsage, limits: Limits): LimitSummary | false {\n return useMemo(() => {\n if (Object.keys(limits).length === 0) {\n return false;\n }\n const maybeMessageHistoryLimit = limits.messages?.history;\n const messageHistoryUsage = usage.messages.history;\n\n const maybeFileStorageLimit = limits.files?.total_storage;\n const fileStorageUsage = usage.files.totalStorage;\n\n // Order matters for this array. The designs specify:\n // > Show the plan limit that is the highest.\n // > Otherwise if there is a tie,\n // > default to showing Message History first,\n // > File storage second,\n // > and App limit third.\n const highestLimit = refineToDefined(\n {\n id: LimitTypes.messageHistory,\n limit: maybeMessageHistoryLimit,\n usage: messageHistoryUsage,\n },\n {\n id: LimitTypes.fileStorage,\n limit: maybeFileStorageLimit,\n usage: fileStorageUsage,\n },\n ).\n reduce((acc: LimitSummary | false, curr: LimitSummary) => {\n if (!acc) {\n if (curr.limit && curr.limit > 0) {\n return curr;\n }\n return acc;\n }\n if ((curr.usage / curr.limit) > (acc.usage / acc.limit)) {\n return curr;\n }\n return acc;\n }, false);\n\n // Either no limit category was defined (!highestLimit)\n // or no limit meets the minimum threshold for needing attention\n const noLimitNeedsAttention = !highestLimit || (highestLimit.usage / highestLimit.limit) < (limitThresholds.warn / 100);\n if (noLimitNeedsAttention) {\n return false;\n }\n return highestLimit;\n }, [usage, limits]);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useState, useEffect, useMemo} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {Limits} from '@mattermost/types/cloud';\n\nimport {getSubscriptionProduct, getCloudLimits, getCloudLimitsLoaded, isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {getCloudLimits as getCloudLimitsAction} from 'actions/cloud';\n\nimport {useIsLoggedIn} from 'components/global_header/hooks';\n\nexport default function useGetLimits(): [Limits, boolean] {\n const isCloud = useSelector(isCurrentLicenseCloud);\n const isLoggedIn = useIsLoggedIn();\n const cloudLimits = useSelector(getCloudLimits);\n const cloudLimitsReceived = useSelector(getCloudLimitsLoaded);\n const dispatch = useDispatch();\n const subscriptionProduct = useSelector(getSubscriptionProduct);\n const [requestedLimits, setRequestedLimits] = useState(false);\n\n useEffect(() => {\n if (isLoggedIn && isCloud && !requestedLimits && !cloudLimitsReceived) {\n dispatch(getCloudLimitsAction());\n setRequestedLimits(true);\n }\n }, [isLoggedIn, isCloud, requestedLimits, cloudLimitsReceived]);\n\n useEffect(() => {\n if (subscriptionProduct && requestedLimits) {\n setRequestedLimits(false);\n }\n }, [subscriptionProduct]);\n\n const result: [Limits, boolean] = useMemo(() => {\n return [cloudLimits, cloudLimitsReceived];\n }, [cloudLimits, cloudLimitsReceived]);\n return result;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback, useState} from 'react';\nimport {defineMessages} from 'react-intl';\n\nimport type {NotifyAdminRequest} from '@mattermost/types/cloud';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nexport const NotifyStatus = {\n NotStarted: 'NOT_STARTED',\n Started: 'STARTED',\n Success: 'SUCCESS',\n Failed: 'FAILED',\n AlreadyComplete: 'COMPLETE',\n} as const;\n\nexport type NotifyStatusValues = ValueOf<typeof NotifyStatus>;\n\ntype ValueOf<T> = T[keyof T];\n\ntype UseNotifyAdminArgs = {\n ctaText?: {\n id: string;\n defaultMessage: string;\n };\n}\n\ntype NotifyAdminArgs = {\n requestData: NotifyAdminRequest;\n trackingArgs: {\n category: any;\n event: any;\n props?: any;\n };\n}\n\nconst messages = defineMessages({\n [NotifyStatus.Started]: {\n id: 'notify_admin_to_upgrade_cta.notify-admin.notifying',\n defaultMessage: 'Notifying...',\n },\n [NotifyStatus.Success]: {\n id: 'notify_admin_to_upgrade_cta.notify-admin.notified',\n defaultMessage: 'Admin notified!',\n },\n [NotifyStatus.AlreadyComplete]: {\n id: 'notify_admin_to_upgrade_cta.notify-admin.already_notified',\n defaultMessage: 'Already notified!',\n },\n [NotifyStatus.Failed]: {\n id: 'notify_admin_to_upgrade_cta.notify-admin.failed',\n defaultMessage: 'Try again later!',\n },\n [NotifyStatus.NotStarted]: {\n id: 'notify_admin_to_upgrade_cta.notify-admin.notify',\n defaultMessage: 'Notify your admin',\n },\n});\n\nexport const useGetNotifyAdmin = (args: UseNotifyAdminArgs) => {\n const [notifyStatus, setStatus] = useState<ValueOf<typeof NotifyStatus>>(NotifyStatus.NotStarted);\n\n const btnText = useCallback((status: ValueOf<typeof NotifyStatus>): {id: string; defaultMessage: string} => {\n if (args.ctaText && status === NotifyStatus.NotStarted) {\n return args.ctaText;\n }\n return messages[status];\n }, [args.ctaText]);\n\n const notifyAdmin = useCallback(async ({requestData, trackingArgs}: NotifyAdminArgs) => {\n try {\n setStatus(NotifyStatus.Started);\n await Client4.notifyAdmin(requestData);\n trackEvent(trackingArgs.category, trackingArgs.event, trackingArgs.props);\n setStatus(NotifyStatus.Success);\n } catch (error) {\n if (error && error.status_code === 403) {\n setStatus(NotifyStatus.AlreadyComplete);\n } else {\n setStatus(NotifyStatus.Failed);\n }\n }\n }, []);\n\n return {\n notifyStatus,\n btnText,\n notifyAdmin,\n };\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect, useState} from 'react';\nimport {useDispatch} from 'react-redux';\n\nimport {getFilteredUsersStats} from 'mattermost-redux/actions/users';\n\nconst useGetTotalUsersNoBots = (includeInactive = false): number => {\n const dispatch = useDispatch();\n const [userCount, setUserCount] = useState<number>(0);\n\n useEffect(() => {\n const getTotalUsers = async () => {\n const {data} = await dispatch(getFilteredUsersStats({include_bots: false, include_deleted: includeInactive}, false));\n setUserCount(data?.total_users_count ?? 0);\n };\n\n getTotalUsers();\n }, []);\n\n return userCount;\n};\n\nexport default useGetTotalUsersNoBots;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {CloudUsage} from '@mattermost/types/cloud';\n\nimport {isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\nimport {getUsage} from 'mattermost-redux/selectors/entities/usage';\n\nimport {\n getMessagesUsage,\n getFilesUsage,\n getTeamsUsage,\n} from 'actions/cloud';\n\nimport {useIsLoggedIn} from 'components/global_header/hooks';\n\nexport default function useGetUsage(): CloudUsage {\n const usage = useSelector(getUsage);\n const isCloud = useSelector(isCurrentLicenseCloud);\n const isLoggedIn = useIsLoggedIn();\n\n const dispatch = useDispatch();\n\n const [requestedMessages, setRequestedMessages] = useState(false);\n useEffect(() => {\n if (isLoggedIn && isCloud && !requestedMessages && !usage.messages.historyLoaded) {\n dispatch(getMessagesUsage());\n setRequestedMessages(true);\n }\n }, [isLoggedIn, isCloud, requestedMessages, usage.messages.historyLoaded]);\n\n const [requestedStorage, setRequestedStorage] = useState(false);\n useEffect(() => {\n if (isLoggedIn && isCloud && !requestedStorage && !usage.files.totalStorageLoaded) {\n dispatch(getFilesUsage());\n setRequestedStorage(true);\n }\n }, [isLoggedIn, isCloud, requestedStorage, usage.files.totalStorageLoaded]);\n\n const [requestedTeamsUsage, setRequestedTeamsUsage] = useState(false);\n useEffect(() => {\n if (isLoggedIn && isCloud && !requestedTeamsUsage && !usage.teams.teamsLoaded) {\n dispatch(getTeamsUsage());\n setRequestedTeamsUsage(true);\n }\n }, [isLoggedIn, isCloud, requestedTeamsUsage, usage.teams.teamsLoaded]);\n\n return usage;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {openModal} from 'actions/views/modals';\n\nimport PricingModal from 'components/pricing_modal';\n\nimport {ModalIdentifiers, TELEMETRY_CATEGORIES} from 'utils/constants';\n\nexport type TelemetryProps = {\n trackingLocation: string;\n}\n\nexport default function useOpenPricingModal() {\n const dispatch = useDispatch();\n const isCloud = useSelector(isCurrentLicenseCloud);\n const openPricingModal = useCallback((telemetryProps?: TelemetryProps) => {\n let category;\n\n if (isCloud) {\n category = TELEMETRY_CATEGORIES.CLOUD_PRICING;\n } else {\n category = 'self_hosted_pricing';\n }\n trackEvent(category, 'click_open_pricing_modal', {\n callerInfo: telemetryProps?.trackingLocation,\n });\n dispatch(openModal({\n modalId: ModalIdentifiers.PRICING_MODAL,\n dialogType: PricingModal,\n dialogProps: {\n callerCTA: telemetryProps?.trackingLocation,\n },\n }));\n }, [dispatch, isCloud]);\n\n return openPricingModal;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getCloudCustomer, isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {LicenseLinks} from 'utils/constants';\nimport {buildMMURL, goToMattermostContactSalesForm} from 'utils/contact_support_sales';\n\nconst utmSource = 'mattermost';\n\nexport default function useOpenSalesLink(): [() => void, string] {\n const isCloud = useSelector(isCurrentLicenseCloud);\n const customer = useSelector(getCloudCustomer);\n const currentUser = useSelector(getCurrentUser);\n let customerEmail = '';\n let firstName = '';\n let lastName = '';\n let companyName = '';\n let utmMedium = 'in-product';\n\n if (isCloud && customer) {\n customerEmail = customer.email || '';\n firstName = customer.contact_first_name || '';\n lastName = customer.contact_last_name || '';\n companyName = customer.name || '';\n utmMedium = 'in-product-cloud';\n } else {\n customerEmail = currentUser?.email || '';\n }\n\n const contactSalesLink = buildMMURL(LicenseLinks.CONTACT_SALES, firstName, lastName, companyName, customerEmail, utmSource, utmMedium);\n const goToSalesLinkFunc = useCallback(() => {\n goToMattermostContactSalesForm(firstName, lastName, companyName, customerEmail, utmSource, utmMedium);\n }, [firstName, lastName, companyName, customerEmail, utmMedium]);\n\n return [goToSalesLinkFunc, contactSalesLink];\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback} from 'react';\nimport {useDispatch} from 'react-redux';\n\nimport {openModal} from 'actions/views/modals';\n\nimport StartTrialFormModal from 'components/start_trial_form_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {TelemetryProps} from './useOpenPricingModal';\n\nexport default function useOpenStartTrialFormModal() {\n const dispatch = useDispatch();\n return useCallback((telemetryProps?: TelemetryProps, onClose?: () => void) => {\n dispatch(openModal({\n modalId: ModalIdentifiers.START_TRIAL_FORM_MODAL,\n dialogType: StartTrialFormModal,\n dialogProps: {\n page: telemetryProps?.trackingLocation,\n onClose,\n },\n }));\n }, [dispatch]);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback, useEffect, useState} from 'react';\n\nimport type {NotificationPermissionNeverGranted} from 'utils/notifications';\nimport {isNotificationAPISupported} from 'utils/notifications';\nimport {isDesktopApp} from 'utils/user_agent';\n\nexport type DesktopNotificationPermission = Exclude<NotificationPermission, typeof NotificationPermissionNeverGranted> | undefined;\n\n// We store the permission state globally here to avoid calling requestPermission() multiple times\nlet desktopNotificationPermissionGlobalState: DesktopNotificationPermission | undefined;\n\n// This is used to request notification permission for desktop app\n// it also returns the permission state. We use this as a workaround for bug with Electron - https://github.com/electron/electron/issues/11221\n// tl;dr Electron always show 'granted' when queries for Notification.permission, hence this workaround\nexport function useDesktopAppNotificationPermission(): [DesktopNotificationPermission, () => Promise<NotificationPermission>] {\n const [desktopNotificationPermission, setDesktopNotificationPermission] = useState<DesktopNotificationPermission>(undefined);\n\n const isDesktop = isDesktopApp();\n const isSupported = isNotificationAPISupported();\n\n const requestDesktopNotificationPermission = useCallback(async () => {\n // Based on Electron's notification permission it will have following states\n // - allowed - No further action needed\n // - denied permanently - No further action needed\n // - denied (temporary) - In this case, electron notification permission dialog is shown with requestPermission()\n const permission = await Notification.requestPermission();\n\n // Update the global state\n desktopNotificationPermissionGlobalState = permission as DesktopNotificationPermission;\n\n // Update the local state\n setDesktopNotificationPermission(permission as DesktopNotificationPermission);\n\n return permission;\n }, []);\n\n useEffect(() => {\n if (!isDesktop || !isSupported) {\n setDesktopNotificationPermission(undefined);\n } else if (desktopNotificationPermissionGlobalState === undefined) {\n // We are in initial state, we need to request permission now\n requestDesktopNotificationPermission();\n } else if (desktopNotificationPermissionGlobalState !== undefined) {\n setDesktopNotificationPermission(desktopNotificationPermissionGlobalState);\n }\n }, [isDesktop, isSupported, requestDesktopNotificationPermission]);\n\n return [desktopNotificationPermission, requestDesktopNotificationPermission];\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst GuestAccessSVG = (props: SvgProps) => (\n <svg\n width={props.width?.toString() || '308'}\n height={props.height?.toString() || '220'}\n viewBox='0 0 308 220'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <g clipPath='url(#clip0_521_245590)'>\n <rect\n width='308'\n height='220'\n rx='100'\n fill='#1C58D9'\n fillOpacity='0.04'\n />\n <path\n d='M161.608 191.655C212.53 191.655 253.81 157.715 253.81 115.848C253.81 73.9817 212.53 40.042 161.608 40.042C110.687 40.042 69.4072 73.9817 69.4072 115.848C69.4072 157.715 110.687 191.655 161.608 191.655Z'\n stroke='#1E325C'\n strokeWidth='0.91'\n strokeMiterlimit='10'\n />\n <g clipPath='url(#clip1_521_245590)'>\n <path\n d='M178.737 178.633L177.919 174.468C177.796 173.852 177.438 173.309 176.921 172.953C173.082 170.302 167.993 168.922 161.322 168.922C154.651 168.922 149.557 170.302 145.732 172.963C145.217 173.319 144.86 173.862 144.735 174.477L143.898 178.633C143.846 178.894 143.867 179.165 143.958 179.415C144.05 179.665 144.209 179.885 144.418 180.05C145.521 180.911 146.022 182.048 146.257 183.484C146.52 184.994 146.457 186.543 146.073 188.027C142.657 201.452 148.408 207.56 161.299 211.775C174.172 207.56 179.937 201.452 176.521 188.027C176.139 186.542 176.076 184.994 176.337 183.484C176.59 182.048 177.091 180.911 178.176 180.05C178.393 179.891 178.561 179.673 178.66 179.422C178.759 179.172 178.786 178.898 178.737 178.633Z'\n fill='#CC8F00'\n />\n <path\n d='M161.322 208.379C149.608 204.338 146.551 199.303 149.217 188.818C149.717 186.891 149.797 184.879 149.452 182.918C149.201 181.187 148.435 179.572 147.254 178.283L147.824 175.429C151.171 173.211 155.59 172.134 161.322 172.134C167.055 172.134 171.469 173.211 174.816 175.429L175.386 178.283C174.206 179.572 173.442 181.187 173.193 182.918C172.848 184.879 172.928 186.891 173.427 188.818C176.08 199.298 173.037 204.361 161.322 208.379Z'\n fill='var(--away-indicator)'\n />\n <path\n d='M161.322 208.379C149.608 204.338 146.551 199.303 149.217 188.818C149.717 186.891 149.797 184.879 149.452 182.918C149.201 181.187 148.435 179.572 147.254 178.283L147.824 175.429C151.171 173.211 155.59 172.134 161.322 172.134C167.055 172.134 171.469 173.211 174.816 175.429L175.386 178.283C174.206 179.572 173.442 181.187 173.193 182.918C172.848 184.879 172.928 186.891 173.427 188.818C176.08 199.298 173.037 204.361 161.322 208.379Z'\n fill='var(--away-indicator)'\n />\n <path\n d='M161.322 187.184V172.143C155.59 172.143 151.171 173.22 147.824 175.438L147.254 178.292C148.435 179.581 149.201 181.196 149.452 182.927C149.699 184.336 149.725 185.776 149.53 187.193L161.322 187.184Z'\n fill='var(--away-indicator)'\n />\n <path\n d='M161.323 208.379C173.037 204.361 176.08 199.298 173.427 188.818C173.291 188.28 173.185 187.734 173.11 187.184H161.323V208.379Z'\n fill='var(--away-indicator)'\n />\n <path\n d='M149.218 188.818C146.551 199.302 149.608 204.338 161.323 208.379V187.184H149.53C149.457 187.734 149.353 188.28 149.218 188.818V188.818Z'\n fill='#FFD791'\n />\n <path\n d='M161.323 172.143V187.193H173.11C172.915 185.776 172.942 184.336 173.193 182.927C173.442 181.196 174.206 179.581 175.386 178.292L174.816 175.438C171.483 173.211 167.051 172.143 161.323 172.143Z'\n fill='#FFD791'\n />\n <path\n d='M168.214 182.457L158.725 192.905L155.971 190.815H154.44L158.725 197.779L169.745 182.457H168.214Z'\n fill='#66320A'\n />\n </g>\n <mask\n id='mask0_521_245590'\n style={{\n maskType: 'alpha',\n }}\n maskUnits='userSpaceOnUse'\n x='199'\n y='75'\n width='114'\n height='112'\n >\n <path\n d='M255.673 186.88C224.419 186.88 199.083 161.839 199.083 130.95C199.083 100.061 224.419 75.021 255.673 75.021C286.927 75.021 312.264 100.061 312.264 130.95C312.264 161.839 286.927 186.88 255.673 186.88Z'\n fill='#E8E9ED'\n />\n </mask>\n <g mask='url(#mask0_521_245590)'>\n <path\n d='M306.204 151.443C305.706 148.822 304.712 146.324 303.722 143.842C302.661 141.182 301.59 138.499 300.084 136.052C296.574 130.352 290.856 126.238 284.704 123.489C278.552 120.739 272.665 119.185 266.082 117.695C268.24 119.991 268.897 122.913 270.187 125.774C273.198 132.451 275.786 139.305 278.371 146.153C282.254 156.427 286.134 166.7 290.012 176.972C298.431 172.072 304.479 163.371 306.087 153.846L306.204 151.443Z'\n fill='#FFE099'\n />\n <path\n d='M241.639 117.937C237.888 119.164 232.027 121.326 232.027 121.326C232.027 121.326 218.569 159.666 215.587 178.139C215.499 178.682 215.42 179.279 215.674 179.761C216.045 180.472 216.942 180.689 217.675 181.029C219.353 181.804 220.414 183.461 221.868 184.595C223.121 185.57 224.644 186.138 226.142 186.685C239.473 191.515 253.951 195.555 267.717 192.11C268.587 191.891 269.487 191.625 270.15 191.025C270.727 190.495 271.079 189.758 271.396 189.038C275.589 179.537 283.824 159.909 283.743 146.024C283.649 129.979 274.851 120.2 274.707 119.993C274.363 119.5 261.488 116.175 253.559 116.002C253.551 116.006 244.792 116.903 241.639 117.937Z'\n fill='#FFE099'\n />\n <mask\n id='mask1_521_245590'\n style={{\n maskType: 'alpha',\n }}\n maskUnits='userSpaceOnUse'\n x='215'\n y='116'\n width='69'\n height='78'\n >\n <path\n d='M241.639 117.937C237.888 119.164 232.027 121.326 232.027 121.326C232.027 121.326 218.569 159.666 215.587 178.139C215.499 178.682 215.42 179.279 215.674 179.761C216.045 180.472 216.942 180.689 217.675 181.029C219.353 181.804 220.414 183.461 221.868 184.595C223.121 185.57 224.644 186.138 226.142 186.685C239.473 191.515 253.951 195.555 267.717 192.11C268.587 191.891 269.487 191.625 270.15 191.025C270.727 190.495 271.079 189.758 271.396 189.038C275.589 179.537 283.824 159.909 283.743 146.024C283.649 129.979 274.851 120.2 274.707 119.993C274.363 119.5 261.488 116.175 253.559 116.002C253.551 116.006 244.792 116.903 241.639 117.937Z'\n fill='var(--center-channel-bg)'\n />\n </mask>\n <g mask='url(#mask1_521_245590)'>\n <rect\n width='68.4423'\n height='67.0726'\n transform='matrix(-1 0 0 1 283.906 115.984)'\n fill='url(#pattern0)'\n />\n <rect\n width='59.9831'\n height='77.5231'\n transform='matrix(-1 0 0 1 283.906 115.984)'\n fill='url(#pattern1)'\n />\n </g>\n <path\n d='M282.345 156.507C282.84 154.698 283.335 152.889 283.832 151.08C283.855 151.011 283.904 150.953 283.969 150.918C284.034 150.884 284.11 150.875 284.181 150.894C284.253 150.914 284.314 150.959 284.352 151.022C284.39 151.084 284.403 151.159 284.387 151.23C283.891 153.039 283.396 154.849 282.901 156.659C282.879 156.73 282.83 156.789 282.764 156.825C282.698 156.86 282.621 156.869 282.549 156.849C282.476 156.83 282.415 156.783 282.377 156.719C282.339 156.655 282.328 156.579 282.345 156.507V156.507Z'\n fill='#1D1400'\n />\n <path\n d='M284.618 149.563L284.756 148.932C284.779 148.863 284.828 148.805 284.894 148.77C284.959 148.736 285.035 148.727 285.106 148.747C285.177 148.766 285.238 148.811 285.277 148.874C285.315 148.936 285.327 149.011 285.312 149.082L285.173 149.715C285.152 149.787 285.103 149.849 285.037 149.886C284.971 149.923 284.893 149.933 284.82 149.915C284.748 149.891 284.689 149.842 284.653 149.776C284.618 149.711 284.608 149.635 284.627 149.563H284.618Z'\n fill='#1D1400'\n />\n </g>\n <path\n d='M233.12 120.964C228.891 122.294 215.075 126.915 211.861 130.289C200.489 142.227 195.85 174.384 195.491 177.379C194.971 181.584 196.148 191.059 200.489 193.719C202.867 195.177 209.91 190.489 213.562 186.689C218.651 181.394 221.126 167.833 222.147 160.599C224.019 147.333 233.12 120.964 233.12 120.964Z'\n fill='#FFE099'\n />\n <path\n d='M252.007 116.212L228.533 114.812C228.533 114.812 227.764 111.599 230.004 107.871C231.298 105.716 233.612 104.544 235.131 101.572C236.589 98.7219 236.402 95.4253 236.987 92.5049C238.234 86.265 242.816 81.2754 245.115 80.2114C250.627 77.6596 252.007 116.212 252.007 116.212Z'\n fill='#1D1400'\n />\n <path\n d='M259.548 114.843C262.539 117.325 260.776 130.261 254.046 130.261C246.673 130.261 247.176 112.21 246.644 112.102C244.198 111.629 241.688 110.333 240.128 104.575C239.905 103.755 239.901 103.245 239.757 102.468C239.682 102.071 239.109 96.6673 239.269 90.7505C239.34 88.06 242.047 79.7966 251.827 81.898C264.054 84.5239 261.949 96.2436 260.759 98.7574C260.061 100.23 259.073 103.865 258.908 105.812C258.706 108.159 259.213 114.564 259.548 114.843Z'\n fill='#674600'\n />\n <path\n opacity='0.3'\n d='M246.665 112.084C247.201 112.183 247.745 112.234 248.29 112.236C249.665 112.234 251.023 111.925 252.262 111.333H252.277C252.306 111.32 252.335 111.309 252.365 111.299C252.9 111.136 253.177 111.924 252.671 112.16C251.672 112.636 250.75 113.257 249.937 114.003C249.103 114.778 248.447 115.722 248.015 116.769C247.741 117.291 247.517 117.837 247.346 118.4C246.913 114.995 246.861 112.169 246.654 112.11L246.665 112.084Z'\n fill='black'\n />\n <path\n d='M260.39 80.8152C255.745 76.7129 249.206 78.2976 246.355 79.544C241.459 81.6873 239.972 86.6655 239.972 86.6655C241.107 88.0544 240.617 89.3028 241.878 91.0072C243.35 93.0003 245.159 91.334 248.17 93.7452C249.402 94.7452 250.403 95.9943 251.106 97.4085C251.106 97.4085 252.119 95.4039 253.349 95.421C254.759 95.4419 255.608 96.7511 255.218 98.0811C254.936 99.0407 253.824 101.256 253.824 101.256L258.233 112.41C258.688 113.561 259.546 114.512 260.651 115.091C261.756 115.67 263.035 115.838 264.254 115.564L290.412 107.266C287.945 101.684 283.833 100.983 280.69 98.3149C277.614 95.6966 276.829 93.0193 274.259 91.0205C271.227 88.6606 266.494 87.2887 265.163 85.9777C261.382 82.2497 263.331 83.4126 260.39 80.8152Z'\n fill='#1D1400'\n />\n <mask\n id='mask2_521_245590'\n style={{\n maskType: 'alpha',\n }}\n maskUnits='userSpaceOnUse'\n x='239'\n y='78'\n width='52'\n height='38'\n >\n <path\n d='M260.39 80.8152C255.745 76.7129 249.206 78.2976 246.355 79.544C241.459 81.6873 239.972 86.6655 239.972 86.6655C241.107 88.0544 240.617 89.3028 241.878 91.0072C243.35 93.0003 245.159 91.334 248.17 93.7452C249.402 94.7452 250.403 95.9943 251.106 97.4085C251.106 97.4085 252.119 95.4039 253.349 95.421C254.759 95.4419 255.608 96.7511 255.218 98.0811C254.936 99.0407 253.824 101.256 253.824 101.256L258.233 112.41C258.688 113.561 259.546 114.512 260.651 115.091C261.756 115.67 263.035 115.838 264.254 115.564L290.412 107.266C287.945 101.684 283.833 100.983 280.69 98.3149C277.614 95.6966 276.829 93.0193 274.259 91.0205C271.227 88.6606 266.494 87.2887 265.163 85.9777C261.382 82.2497 263.331 83.4126 260.39 80.8152Z'\n fill='#1D1400'\n />\n </mask>\n <g mask='url(#mask2_521_245590)'>\n <rect\n width='42.8726'\n height='37.6215'\n transform='matrix(-1 0 0 1 290.443 78.1716)'\n fill='url(#pattern2)'\n />\n </g>\n <path\n d='M243.958 129.536C245.006 126.675 245.688 123.758 244.785 120.845C243.593 116.967 242.156 116.789 238.502 114.955C234.847 113.122 234.232 112.082 232.002 108.168C231.477 107.245 230.929 107.44 230.819 108.14C230.723 108.755 230.819 110.04 230.819 110.04C230.819 110.04 229.281 105.29 228.704 105.1C227.595 104.733 227.316 107.053 227.166 107.57C226.505 109.859 226.974 110.99 228.512 115.17C229.514 117.889 231.704 121.159 234.193 122.717C235.155 123.317 236.308 124.03 236.375 125.567C236.4 126.156 235.97 126.667 235.626 127.148C233.62 129.939 217.498 148.735 215.147 150.964C207.487 158.226 200.882 163.664 197.752 173.688C196.377 178.095 197.559 189.459 198.713 191.929C201.404 197.686 211.209 190.029 215.247 184.899C224.219 173.495 240.39 139.293 243.958 129.536Z'\n fill='#674600'\n />\n <mask\n id='mask3_521_245590'\n style={{\n maskType: 'alpha',\n }}\n x='197'\n y='105'\n width='49'\n height='89'\n >\n <path\n d='M243.958 129.536C245.006 126.675 245.688 123.758 244.785 120.845C243.593 116.967 242.156 116.789 238.502 114.955C234.847 113.122 234.232 112.082 232.002 108.168C231.477 107.245 230.929 107.44 230.819 108.14C230.723 108.755 230.819 110.04 230.819 110.04C230.819 110.04 229.281 105.29 228.704 105.1C227.595 104.733 227.316 107.053 227.166 107.57C226.505 109.859 226.974 110.99 228.512 115.17C229.514 117.889 231.704 121.159 234.193 122.717C235.155 123.317 236.308 124.03 236.375 125.567C236.4 126.156 235.97 126.667 235.626 127.148C233.62 129.939 217.498 148.735 215.147 150.964C207.487 158.226 200.882 163.664 197.752 173.688C196.377 178.095 197.559 189.459 198.713 191.929C201.404 197.686 211.209 190.029 215.247 184.899C224.219 173.495 240.39 139.293 243.958 129.536Z'\n fill='#674600'\n />\n </mask>\n <g mask='url(#mask3_521_245590)'>\n <rect\n width='30.1838'\n height='61.7524'\n transform='matrix(-1 0 0 1 245.263 104.962)'\n fill='url(#pattern3)'\n />\n </g>\n <path\n d='M197.367 173.687C200.497 163.663 207.487 158.225 215.147 150.962C215.612 150.522 216.612 149.442 217.934 147.957C218.015 148.046 218.094 148.147 218.175 148.224C220.897 151.211 224.257 153.355 228.037 154.774C229.346 155.266 231.765 155.749 233.12 155.931C227.407 167.389 220.676 179.739 216.079 185.572C212.042 190.703 201.018 197.678 198.328 191.92C197.175 189.458 195.992 178.094 197.367 173.687Z'\n fill='#FFE099'\n />\n <path\n d='M273.738 183.894C271.812 184.859 269.942 185.93 268.138 187.102C265.494 188.855 257.827 188.399 257.827 188.399C257.827 188.399 253.915 196.556 253.511 193.788C253.301 192.346 253.926 191.493 254.113 190.054C253.317 191.09 252.834 191.645 252.44 192.886C252.046 194.126 252.188 195.244 252.365 196.496C252.5 197.436 252.023 197.86 251.525 197.904C250.564 197.985 250.372 196.902 249.891 196.748C245.788 195.418 246.634 193.913 246.271 190.203C246.302 194.721 246.557 194.341 248.416 196.938C248.789 197.459 248.095 198.078 246.302 197.064C244.892 196.241 243.939 195.354 243.289 193.264C242.585 191.096 242.75 188.744 243.75 186.693C245.975 182.196 247.745 180.698 252.775 180.09C257.804 179.482 263.61 179.036 267.194 180.28C268.586 180.765 273.738 183.894 273.738 183.894Z'\n fill='#674600'\n />\n <path\n d='M203.618 161.988C207.957 157.006 212.413 152.129 216.983 147.357C217.037 147.309 217.107 147.282 217.18 147.283C217.253 147.283 217.323 147.311 217.376 147.361C217.429 147.411 217.46 147.478 217.465 147.55C217.47 147.622 217.446 147.693 217.4 147.748C212.831 152.525 208.376 157.402 204.035 162.379C203.793 162.658 203.375 162.265 203.618 161.988Z'\n fill='#1D1400'\n />\n <path\n d='M221.264 177.072L221.136 177.2C221.081 177.252 221.008 177.281 220.932 177.281C220.856 177.281 220.783 177.252 220.728 177.2C220.674 177.146 220.644 177.074 220.644 176.998C220.644 176.923 220.674 176.85 220.728 176.797L220.857 176.669C220.883 176.641 220.915 176.619 220.95 176.603C220.986 176.588 221.024 176.579 221.063 176.579C221.101 176.578 221.14 176.585 221.176 176.599C221.212 176.614 221.244 176.635 221.272 176.662C221.299 176.689 221.321 176.722 221.335 176.757C221.35 176.792 221.357 176.83 221.356 176.869C221.355 176.907 221.347 176.945 221.331 176.98C221.315 177.015 221.293 177.046 221.264 177.072V177.072Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M221.209 177.491C225.359 170.616 229.246 163.596 232.871 156.43C233.036 156.103 233.534 156.39 233.369 156.719C229.747 163.878 225.859 170.899 221.707 177.779C221.668 177.845 221.604 177.892 221.53 177.911C221.456 177.93 221.378 177.919 221.311 177.881C221.245 177.843 221.198 177.78 221.178 177.707C221.159 177.634 221.17 177.556 221.209 177.491V177.491Z'\n fill='#1D1400'\n />\n <path\n d='M231.064 110.225C231.417 111.176 231.886 112.08 232.46 112.919C232.667 113.223 232.167 113.51 231.962 113.206C231.364 112.324 230.875 111.374 230.506 110.377C230.379 110.031 230.935 109.883 231.064 110.225V110.225Z'\n fill='black'\n />\n <path\n d='M232.789 114.201H232.692C232.616 114.201 232.543 114.171 232.488 114.118C232.434 114.064 232.404 113.992 232.404 113.916C232.404 113.84 232.434 113.768 232.488 113.714C232.543 113.661 232.616 113.631 232.692 113.631H232.789C232.865 113.631 232.938 113.661 232.992 113.714C233.047 113.768 233.077 113.84 233.077 113.916C233.077 113.992 233.047 114.064 232.992 114.118C232.938 114.171 232.865 114.201 232.789 114.201Z'\n fill='black'\n />\n <path\n d='M228.324 108.888C228.658 110.59 229.302 112.218 230.223 113.694C230.415 114.007 229.919 114.292 229.725 113.98C228.777 112.463 228.114 110.79 227.768 109.04C227.695 108.681 228.253 108.527 228.324 108.888V108.888Z'\n fill='black'\n />\n <path\n d='M230.385 114.772C230.308 114.772 230.235 114.742 230.181 114.688C230.127 114.635 230.097 114.562 230.097 114.487C230.097 114.411 230.127 114.339 230.181 114.285C230.235 114.232 230.308 114.202 230.385 114.202C230.461 114.202 230.535 114.232 230.589 114.285C230.643 114.339 230.673 114.411 230.673 114.487C230.673 114.562 230.643 114.635 230.589 114.688C230.535 114.742 230.461 114.772 230.385 114.772Z'\n fill='black'\n />\n <path\n d='M253.901 187.885L254.44 186.728C254.595 186.396 255.093 186.684 254.937 187.015C254.759 187.395 254.58 187.781 254.399 188.172C254.243 188.505 253.747 188.216 253.901 187.885Z'\n fill='#1D1400'\n />\n <path\n d='M247.682 185.135C247.007 186.646 246.747 188.264 246.705 189.906C246.676 190.557 246.687 191.209 246.738 191.859C246.832 192.821 247.418 193.429 248.083 194.073C248.351 194.329 247.941 194.732 247.676 194.476C247.145 193.968 246.586 193.425 246.33 192.724C246.046 191.964 246.113 191.044 246.121 190.254C246.14 188.392 246.417 186.57 247.182 184.856C247.332 184.521 247.828 184.81 247.68 185.143L247.682 185.135Z'\n fill='#1D1400'\n />\n <path\n d='M249.824 190.192C249.591 191.226 249.536 192.292 249.662 193.344C249.705 193.707 249.128 193.705 249.085 193.344C248.957 192.241 249.018 191.123 249.268 190.04C249.349 189.683 249.906 189.835 249.824 190.192V190.192Z'\n fill='#1D1400'\n />\n <path\n d='M249.978 187.558C250.132 186.867 250.204 186.161 250.191 185.454C250.191 185.088 250.768 185.088 250.768 185.454C250.78 186.213 250.701 186.97 250.533 187.71C250.452 188.067 249.897 187.915 249.978 187.558V187.558Z'\n fill='#1D1400'\n />\n <path\n d='M246.619 97.2094H246.673C246.879 97.2094 247.077 97.2904 247.223 97.4347C247.369 97.5791 247.451 97.7748 247.451 97.9789C247.451 98.183 247.369 98.3787 247.223 98.523C247.077 98.6673 246.879 98.7484 246.673 98.7484H246.619C246.412 98.7484 246.214 98.6673 246.068 98.523C245.922 98.3787 245.84 98.183 245.84 97.9789C245.84 97.7748 245.922 97.5791 246.068 97.4347C246.214 97.2904 246.412 97.2094 246.619 97.2094V97.2094Z'\n fill='black'\n />\n <path\n d='M241.14 98.5249H241.195C241.402 98.5249 241.6 98.6059 241.745 98.75C241.891 98.8941 241.973 99.0896 241.973 99.2935C241.973 99.4973 241.891 99.6928 241.745 99.8369C241.6 99.9811 241.402 100.062 241.195 100.062H241.14C240.933 100.062 240.736 99.9811 240.59 99.8369C240.444 99.6928 240.362 99.4973 240.362 99.2935C240.362 99.0896 240.444 98.8941 240.59 98.75C240.736 98.6059 240.933 98.5249 241.14 98.5249V98.5249Z'\n fill='black'\n />\n <path\n d='M248.514 104.964C247.734 105.812 246.831 106.543 245.836 107.134C246.338 107.802 247.436 107.84 248.086 107.312C248.735 106.784 248.943 105.841 248.732 105.032'\n fill='black'\n />\n <path\n d='M244.173 104.496C243.597 104.369 242.291 104.35 242.199 103.561C242.135 103.014 242.71 102.287 242.887 101.798C243.212 100.95 243.396 100.056 243.433 99.1495C243.433 98.7277 244.106 98.7258 244.098 99.1495C244.051 100.329 243.778 101.49 243.295 102.57C243.22 102.743 242.985 103.056 242.976 103.246C242.951 103.732 243.022 103.485 243.36 103.637C243.65 103.769 244.041 103.788 244.354 103.856C244.773 103.947 244.594 104.584 244.177 104.491L244.173 104.496Z'\n fill='black'\n />\n <path\n opacity='0.3'\n d='M235.626 127.147C238.241 125.353 238.702 122.587 235.626 120.964C232.55 119.341 229.014 116.362 229.014 116.362C229.014 116.362 230.704 120.922 234.194 122.712C237.683 124.502 235.626 127.147 235.626 127.147Z'\n fill='black'\n />\n <path\n d='M180.272 22.0923H142.145C140.736 22.0922 139.383 22.6505 138.383 23.6454C137.383 24.6403 136.815 25.9911 136.805 27.4033V51.6844C136.815 53.0967 137.383 54.4475 138.383 55.4423C139.383 56.4372 140.736 56.9955 142.145 56.9955H147.773V66.0992L156.225 56.9955H180.258C181.668 56.9955 183.02 56.4372 184.021 55.4423C185.021 54.4475 185.589 53.0967 185.599 51.6844V27.4033C185.589 25.9934 185.023 24.6446 184.025 23.6501C183.028 22.6556 181.679 22.0958 180.272 22.0923V22.0923Z'\n fill='#1C58D9'\n />\n <path\n d='M140.764 32.2531C141.153 30.8753 141.811 29.5888 142.7 28.4681C143.589 27.3473 144.692 26.4148 145.944 25.7246C146.018 25.6873 146.078 25.6264 146.114 25.5514C146.149 25.4764 146.159 25.3917 146.142 25.3105C146.124 25.2293 146.08 25.1562 146.016 25.1028C145.953 25.0494 145.873 25.0188 145.791 25.0156C143.387 24.8684 138.534 25.3835 140.056 32.2062C140.079 32.2795 140.124 32.344 140.184 32.3915C140.244 32.4389 140.317 32.467 140.394 32.4721C140.47 32.4771 140.546 32.4589 140.612 32.4199C140.678 32.3808 140.731 32.3226 140.764 32.2531V32.2531Z'\n fill='var(--center-channel-bg)'\n fillOpacity='0.16'\n />\n <path\n d='M174.236 36.0725C174.915 36.0725 175.578 36.2742 176.143 36.652C176.707 37.0297 177.147 37.5667 177.407 38.195C177.666 38.8232 177.734 39.5145 177.602 40.1814C177.469 40.8484 177.143 41.461 176.663 41.9418C176.183 42.4226 175.571 42.7501 174.906 42.8828C174.24 43.0154 173.55 42.9473 172.923 42.6871C172.296 42.4269 171.76 41.9862 171.383 41.4208C171.006 40.8554 170.805 40.1907 170.805 39.5107C170.805 38.5988 171.166 37.7243 171.81 37.0795C172.454 36.4348 173.326 36.0725 174.236 36.0725V36.0725Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M161.212 36.0725C161.891 36.0725 162.554 36.2742 163.119 36.652C163.683 37.0297 164.123 37.5667 164.382 38.195C164.642 38.8232 164.71 39.5145 164.578 40.1814C164.445 40.8484 164.118 41.461 163.639 41.9418C163.159 42.4226 162.547 42.7501 161.882 42.8828C161.216 43.0154 160.526 42.9473 159.899 42.6871C159.272 42.4269 158.736 41.9862 158.359 41.4208C157.982 40.8554 157.781 40.1907 157.781 39.5107C157.781 38.5988 158.142 37.7243 158.786 37.0795C159.429 36.4348 160.302 36.0725 161.212 36.0725Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M148.187 36.0725C148.865 36.0725 149.529 36.2742 150.093 36.652C150.658 37.0297 151.097 37.5667 151.357 38.195C151.617 38.8232 151.685 39.5145 151.552 40.1814C151.42 40.8484 151.093 41.461 150.613 41.9418C150.133 42.4226 149.522 42.7501 148.856 42.8828C148.191 43.0154 147.501 42.9473 146.874 42.6871C146.247 42.4269 145.711 41.9862 145.334 41.4208C144.957 40.8554 144.755 40.1907 144.755 39.5107C144.755 38.5988 145.117 37.7243 145.76 37.0795C146.404 36.4348 147.277 36.0725 148.187 36.0725V36.0725Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M31.2452 105.929C31.2452 105.929 29.9937 93.2228 32.5488 82.359C34.5041 73.9124 39.8814 66.7199 42.7167 66.5958C49.1825 66.3083 53.6473 62.9702 56.4761 66.23C58.8161 69.2088 61.1821 85.8867 57.5125 88.8198C56.0997 89.7711 54.5845 90.56 52.9956 91.1715L52.5132 105.909L31.2452 105.929Z'\n fill='#CB8E00'\n />\n <path\n d='M57.5843 71.9193C60.3545 76.0675 62.1469 79.1052 62.1469 79.1052C62.199 80.7253 56.75 81.0062 56.75 81.0062L57.5843 71.9193Z'\n fill='#CB8E00'\n />\n <path\n d='M48.6544 90.7274C50.8977 91.0195 53.1782 90.7755 55.3093 90.0154C56.1176 89.7214 53.7515 91.1129 52.9368 91.4068C50.5577 92.2561 51.0531 92.3802 48.5372 92.0601C47.6964 91.9686 47.7941 90.6229 48.6544 90.7274Z'\n fill='#332660'\n />\n <path\n d='M31.6038 60.0555C29.8765 60.5651 28.7033 62.1786 27.9863 63.8248C27.2693 65.4711 26.8456 67.261 25.9331 68.8158C24.8968 70.5796 23.2542 71.9645 22.4395 73.8394C21.6248 75.7142 22.1396 78.471 24.1276 78.9413C25.4834 79.2549 26.9238 78.3599 28.2665 78.7388C30.2219 79.3072 30.5022 82.0051 30.0068 84.0302C29.5115 86.0553 28.7032 88.3026 29.9025 89.9945C31.2061 91.9151 34.426 91.5624 35.9642 89.7986C37.5025 88.0348 37.7046 85.487 37.4569 83.168C37.2092 80.8489 36.5704 78.5429 36.7138 76.2107C36.7855 74.9042 37.3656 73.3886 38.6301 73.1796C39.8945 72.9705 40.8983 74.2248 41.1004 75.4529C41.3024 76.681 40.9505 77.9222 40.8919 79.17C40.8332 80.4177 41.1721 81.8353 42.2737 82.4363C44.0009 83.3443 46.028 81.3192 46.1062 79.3594C46.1844 77.3996 45.135 75.6097 44.5744 73.7348C44.0139 71.86 44.1508 69.4233 45.878 68.4695C46.9535 67.862 48.2897 68.0711 49.4955 68.3258C50.7013 68.5806 52.0114 68.9072 53.1455 68.4108C63.3787 63.9228 67.1918 59.5198 61.091 54.5224C57.1281 51.2561 44.1442 48.2315 40.5007 53.0264C39.0016 54.9862 40.2204 58.2003 37.8023 59.5591C35.9642 60.5651 33.5461 59.4872 31.6038 60.0555Z'\n fill='#1A0C00'\n />\n <path\n d='M60.4653 103.969C83.1412 107.765 96.0598 107.484 109.35 99.279C122.64 91.074 128.363 66.9883 130.657 54.4391C132.951 41.8899 149.136 39.8714 143.693 44.8558C138.251 49.8402 140.258 48.3572 138.075 57.5356C135.891 66.7139 140.942 107.569 119.883 124.116C98.5041 140.911 69.9881 147.104 51.0599 144.642C32.1318 142.179 60.4653 103.969 60.4653 103.969Z'\n fill='#CB8E00'\n />\n <path\n d='M94.8801 140.656C92.84 141.453 90.8129 142.126 88.7663 142.707C87.554 143.06 86.3395 143.376 85.1228 143.654C76.3298 145.586 67.2966 146.178 58.3275 145.411C55.792 145.235 53.3673 144.974 51.0665 144.667C37.1832 142.857 48.7461 121.803 55.8833 110.697C58.4904 106.673 60.4458 103.975 60.4458 103.975C61.241 104.112 62.0427 104.243 62.8379 104.361C63.809 104.517 64.7933 104.668 65.7188 104.798C71.7256 105.774 77.7992 106.279 83.8844 106.307C85.1162 106.307 86.322 106.262 87.5018 106.183C88.3752 106.118 89.2486 106.046 90.109 105.948C92.0513 116.479 94.8345 140.499 94.8801 140.656Z'\n fill='#1E325C'\n />\n <mask\n id='mask4_521_245590'\n style={{\n maskType: 'alpha',\n }}\n maskUnits='userSpaceOnUse'\n x='0'\n y='38'\n width='96'\n height='174'\n >\n <path\n d='M96 38H0V212H96V38Z'\n fill='#E8E9ED'\n />\n </mask>\n <g mask='url(#mask4_521_245590)'>\n <path\n d='M63.822 211.188C49.4825 216.891 5.6297 207.334 -18.3042 201.389C-21.1265 200.677 -23.6685 200.037 -25.8585 199.469C-31.1576 198.103 -34.384 197.195 -34.384 197.195C-34.384 197.195 -30.4733 190.976 -18.7409 160.521C-16.6943 155.21 -14.4195 149.167 -11.884 142.289C-9.34857 135.41 -7.21063 129.4 -5.3139 124.291C-4.66211 122.534 -4.0103 120.868 -3.43021 119.307C4.33268 99.2908 8.95387 95.332 28.071 98.0561L28.5142 98.1215C32.0665 98.6572 36.1207 99.3888 40.7876 100.31C46.4582 101.401 51.503 102.133 55.8896 102.851C56.6196 102.956 57.3171 103.08 58.0015 103.197C58.7967 103.328 59.5527 103.465 60.3088 103.609C60.9606 103.739 61.6124 103.864 62.2642 104.007C76.5189 107.006 81.1206 112.5 75.1958 140.806C75.085 141.269 74.9937 141.759 74.9025 142.217C66.7681 181.053 63.822 211.188 63.822 211.188Z'\n fill='#1E325C'\n />\n <path\n d='M57.9428 103.205C57.2218 104.3 56.2832 105.234 55.1857 105.949C51.1576 108.562 46.8362 110.286 41.9803 109.555C37.2352 108.836 33.2333 106.138 30.046 102.623C28.8622 101.379 28.1418 99.7645 28.0059 98.0507C28.977 98.1878 29.9613 98.3447 31.0302 98.5145C33.1876 97.4824 38.7278 98.018 42.2997 98.717C46.6015 99.5532 50.7731 99.2984 52.5264 102.31C54.4362 102.663 56.2416 102.911 57.9428 103.205Z'\n fill='#CB8E00'\n />\n </g>\n </g>\n <defs>\n <pattern\n id='pattern0'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image0_521_245590'\n transform='scale(0.00280899)'\n />\n </pattern>\n <pattern\n id='pattern1'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image1_521_245590'\n transform='scale(0.00320513 0.00245098)'\n />\n </pattern>\n <pattern\n id='pattern2'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image2_521_245590'\n transform='scale(0.0044843 0.00505051)'\n />\n </pattern>\n <pattern\n id='pattern3'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image3_521_245590'\n transform='scale(0.00636943 0.00307692)'\n />\n </pattern>\n <clipPath id='clip0_521_245590'>\n <rect\n width='308'\n height='220'\n rx='100'\n fill='var(--center-channel-bg)'\n />\n </clipPath>\n <clipPath id='clip1_521_245590'>\n <rect\n width='34.8897'\n height='42.8632'\n fill='var(--center-channel-bg)'\n transform='translate(143.875 168.912)'\n />\n </clipPath>\n <image\n id='image0_521_245590'\n width='356'\n height='353'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image1_521_245590'\n width='312'\n height='408'\n xlinkHref='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATgAAAGYCAYAAADWY/6EAAAgAElEQVR4Xu2debNtsVHdtyEBkjAFMpjJAWwDJqmi+P5fgH9IVRIIYIxxwJiYMYHMiQP1s89ytfU0tLT3mXTXqbp137tnD+olaakntT5z+GMEjIAR2BSBz2wql8UyAkbACBwmOA8CI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgiY4LbtWgtmBIyACc5jwAgYgW0RMMFt27UWzAgYAROcx4ARMALbImCC27ZrLZgRMAImOI8BI2AEtkXABLdt11owI2AETHAeA0bACGyLgAlu2661YEbACJjgPAaMgBHYFgET3LZda8GMgBEwwXkMGAEjsC0CJrhtu9aCGQEjYILzGDACRmBbBExw23atBTMCRsAE5zFgBIzAtgicIbh/eBzH3x3H8f+2RceCGQEj8NYIrBLcPzmO458dx/H/j+P45nEc/+etUXDjjYAR2BKBVYL7p8dx/OgNkf9yHMd/3RIdC2UEjMBbI7BKcP/gOI5/ftPg/tJm6luPATfeCGyLwCrBbQuIBTMCRmAfBExw+/SlJTECRqBAwATnIWEEjMC2CLwCwSlg8VfHcfzttkhbMCNgBB6OwCsQ3L+6Sf2/bikn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'\n />\n <image\n id='image2_521_245590'\n width='223'\n height='198'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image3_521_245590'\n width='157'\n height='325'\n xlinkHref='data:image/png;base64,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'\n />\n </defs>\n </svg>\n\n);\n\nexport default GuestAccessSVG;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\n\ntype Props = {\n width?: number;\n height?: number;\n className?: string;\n}\n\nconst Svg = styled.svg.attrs({\n version: '1.1',\n xmlns: 'http://www.w3.org/2000/svg',\n xmlnsXlink: 'http://www.w3.org/1999/xlink',\n})``;\n\nexport default (props: Props) => (\n <Svg\n className={props.className}\n width={props.width ? props.width.toString() : '182'}\n height={props.height ? props.height.toString() : '30'}\n viewBox='0 0 182 30'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M69.6495 14.9024C69.6495 14.448 69.5734 14.0782 69.4213 13.7937C69.2695 13.5099 69.0604 13.2868 68.7944 13.1262C68.5284 12.9649 68.2005 12.8557 67.8111 12.7992C67.4215 12.7423 66.9891 12.7139 66.514 12.7139C65.488 12.7139 64.3956 12.9127 63.2364 13.3106C62.9702 12.8179 62.7709 12.3535 62.6381 11.9178C62.5051 11.4821 62.4383 10.961 62.4383 10.3544C63.2745 10.0702 64.1103 9.86184 64.9465 9.72921C65.7824 9.59657 66.5619 9.53008 67.2836 9.53008C69.2598 9.53008 70.8036 10.0037 71.9153 10.9516C73.0268 11.8991 73.5826 13.4147 73.5826 15.4992V24.0265C72.9175 24.2348 72.1099 24.434 71.1598 24.6235C70.2101 24.813 69.1363 24.9078 67.9392 24.9078C66.9702 24.9078 66.0817 24.8224 65.2741 24.6518C64.4667 24.4814 63.7729 24.1969 63.194 23.799C62.6141 23.4015 62.1677 22.8896 61.8538 22.2643C61.5407 21.6387 61.3838 20.8715 61.3838 19.9618C61.3838 19.0524 61.5786 18.2897 61.9681 17.6738C62.3576 17.0581 62.8613 16.5651 63.4785 16.1958C64.0963 15.8262 64.7849 15.561 65.5452 15.3998C66.3052 15.2387 67.0651 15.1582 67.8252 15.1582C68.3763 15.1582 68.9842 15.1869 69.6495 15.2434V14.9024ZM69.6495 17.8302C69.4213 17.7923 69.1744 17.7588 68.9081 17.7307C68.6421 17.7023 68.4051 17.6882 68.1957 17.6882C67.2646 17.6882 66.5282 17.8537 65.9866 18.1854C65.4452 18.517 65.1744 19.0524 65.1744 19.7914C65.1744 20.2843 65.279 20.6629 65.488 20.9285C65.6969 21.1936 65.9489 21.3878 66.2433 21.5108C66.5379 21.6342 66.8511 21.71 67.1837 21.7385C67.5166 21.7666 67.8062 21.7814 68.0529 21.7814C68.3382 21.7814 68.6233 21.7574 68.9081 21.71C69.1934 21.6625 69.4402 21.6202 69.6495 21.582V17.8302ZM76.2809 12.9411H74.4281L74.2853 12.3726L79.6155 5.57913H80.271V9.8711H83.7197C83.7764 10.1556 83.8146 10.4113 83.8339 10.6385C83.8525 10.8662 83.862 11.1029 83.862 11.3495C83.862 11.6146 83.8525 11.8704 83.8339 12.1167C83.8146 12.3633 83.7764 12.638 83.7197 12.9411H80.271V18.7114C80.271 19.2986 80.3188 19.7723 80.4139 20.1326C80.5084 20.4921 80.6463 20.7766 80.8267 20.9852C81.0076 21.1936 81.2306 21.3357 81.4966 21.4114C81.7625 21.4876 82.0764 21.5254 82.437 21.5254C82.7223 21.5254 83.0023 21.5016 83.2781 21.4541C83.5534 21.4069 83.7957 21.3642 84.0046 21.3264C84.138 21.686 84.2325 22.0604 84.2898 22.4491C84.347 22.8375 84.3752 23.1836 84.3752 23.4867C84.3752 23.6951 84.3706 23.8702 84.361 24.0125C84.3515 24.1544 84.3375 24.2923 84.3182 24.4245C83.4443 24.6333 82.5419 24.737 81.6108 24.737C79.8815 24.737 78.5607 24.3346 77.6489 23.5295C76.7369 22.7239 76.2809 21.4114 76.2809 19.5924V12.9411ZM86.9742 12.9411H85.1218L84.9789 12.3726L90.309 5.57913H90.9645V9.8711H94.4132C94.47 10.1556 94.5083 10.4113 94.5274 10.6385C94.546 10.8662 94.5556 11.1029 94.5556 11.3495C94.5556 11.6146 94.546 11.8704 94.5274 12.1167C94.5083 12.3633 94.47 12.638 94.4132 12.9411H90.9645V18.7114C90.9645 19.2986 91.0124 19.7723 91.1071 20.1326C91.2022 20.4921 91.34 20.7766 91.5203 20.9852C91.701 21.1936 91.9239 21.3357 92.1902 21.4114C92.456 21.4876 92.7699 21.5254 93.1304 21.5254C93.4156 21.5254 93.6957 21.5016 93.9716 21.4541C94.247 21.4069 94.4893 21.3642 94.6983 21.3264C94.8313 21.686 94.9262 22.0604 94.983 22.4491C95.0404 22.8375 95.0688 23.1836 95.0688 23.4867C95.0688 23.6951 95.0641 23.8702 95.0545 24.0125C95.0452 24.1544 95.0309 24.2923 95.0118 24.4245C94.1377 24.6333 93.2356 24.737 92.3041 24.737C90.5752 24.737 89.2544 24.3346 88.3424 23.5295C87.4304 22.7239 86.9742 21.4114 86.9742 19.5924V12.9411ZM105.696 15.6418C105.658 14.7318 105.407 13.9977 104.941 13.4387C104.476 12.8796 103.825 12.5998 102.989 12.5998C102.039 12.5998 101.317 12.8653 100.822 13.3958C100.329 13.9265 100.034 14.6751 99.9393 15.6418H105.696ZM99.9105 18.4554C99.9866 19.5924 100.386 20.4167 101.108 20.9285C101.83 21.4402 102.78 21.696 103.958 21.696C104.604 21.696 105.264 21.6342 105.939 21.5108C106.613 21.3878 107.254 21.2125 107.863 20.9852C108.072 21.3642 108.252 21.819 108.404 22.3497C108.556 22.8798 108.641 23.4487 108.661 24.055C107.178 24.6235 105.506 24.9078 103.644 24.9078C102.276 24.9078 101.103 24.7183 100.124 24.3391C99.1457 23.9603 98.3475 23.4342 97.7301 22.7619C97.1125 22.0891 96.6564 21.2884 96.362 20.3597C96.0676 19.4312 95.9205 18.4176 95.9205 17.3188C95.9205 16.2385 96.0723 15.2247 96.3764 14.2772C96.68 13.3293 97.1315 12.5054 97.7301 11.8044C98.3286 11.1029 99.0695 10.5488 99.9533 10.1413C100.837 9.73393 101.868 9.53008 103.046 9.53008C104.072 9.53008 104.984 9.71013 105.782 10.0702C106.58 10.4302 107.259 10.9231 107.82 11.5486C108.38 12.1734 108.803 12.9176 109.088 13.7797C109.373 14.6418 109.516 15.5659 109.516 16.551C109.516 16.9111 109.502 17.2666 109.473 17.6169C109.445 17.9672 109.411 18.247 109.373 18.4554H99.9105ZM111.061 9.8711C111.346 9.8146 111.617 9.77172 111.874 9.74356C112.13 9.71467 112.41 9.70068 112.715 9.70068C113 9.70068 113.28 9.71994 113.555 9.75737C113.831 9.79534 114.102 9.84294 114.367 9.89981C114.425 9.99465 114.477 10.1318 114.524 10.3119C114.572 10.4919 114.614 10.6814 114.653 10.8806C114.691 11.0795 114.724 11.2781 114.752 11.4774C114.781 11.6765 114.804 11.8417 114.824 11.975C115.242 11.3873 115.755 10.8613 116.363 10.3973C116.971 9.93288 117.731 9.70068 118.643 9.70068C118.833 9.70068 119.051 9.71013 119.298 9.72921C119.545 9.7481 119.726 9.77644 119.84 9.8146C119.878 10.0037 119.906 10.2218 119.925 10.4681C119.945 10.7145 119.954 10.9703 119.954 11.2357C119.954 11.5579 119.939 11.9084 119.911 12.2873C119.883 12.6663 119.83 13.0263 119.754 13.3675C119.545 13.3293 119.313 13.3106 119.056 13.3106C118.8 13.3106 118.643 13.3106 118.586 13.3106C118.263 13.3106 117.902 13.3439 117.503 13.41C117.104 13.4765 116.724 13.6516 116.363 13.9361C116.001 14.2203 115.702 14.6467 115.465 15.2154C115.227 15.7835 115.108 16.5795 115.108 17.6029V24.5953C114.767 24.6518 114.425 24.6898 114.082 24.7087C113.741 24.7278 113.408 24.737 113.085 24.737C112.762 24.737 112.434 24.7278 112.101 24.7087C111.769 24.6898 111.422 24.6518 111.061 24.5953V9.8711ZM121.851 9.8711C122.117 9.8146 122.383 9.77172 122.649 9.74356C122.915 9.71467 123.21 9.70068 123.533 9.70068C123.856 9.70068 124.141 9.71467 124.388 9.74356C124.635 9.77172 124.891 9.8146 125.157 9.8711C125.214 9.96594 125.267 10.1035 125.314 10.2835C125.361 10.4634 125.404 10.6533 125.442 10.8518C125.48 11.051 125.513 11.245 125.542 11.4345C125.571 11.624 125.594 11.7852 125.613 11.9178C125.765 11.6338 125.965 11.3495 126.212 11.065C126.459 10.7812 126.753 10.5255 127.095 10.2977C127.437 10.0702 127.822 9.88546 128.25 9.74356C128.677 9.60112 129.157 9.53008 129.689 9.53008C131.988 9.53008 133.461 10.402 134.107 12.1455C134.487 11.4441 135.024 10.8333 135.717 10.3119C136.411 9.79062 137.29 9.53008 138.354 9.53008C140.026 9.53008 141.256 9.99011 142.044 10.9091C142.833 11.8279 143.228 13.2634 143.228 15.2154V24.5668C142.544 24.6805 141.869 24.737 141.204 24.737C140.539 24.737 139.864 24.6805 139.18 24.5668V16.2666C139.18 15.2434 139.052 14.4572 138.795 13.9078C138.539 13.3582 138.021 13.0833 137.242 13.0833C136.919 13.0833 136.601 13.1309 136.288 13.2254C135.974 13.3199 135.689 13.4952 135.432 13.7512C135.176 14.007 134.967 14.3673 134.805 14.8315C134.644 15.2953 134.563 15.8975 134.563 16.6364V24.5668C133.879 24.6805 133.204 24.737 132.539 24.737C131.874 24.737 131.199 24.6805 130.515 24.5668V16.2666C130.515 15.2434 130.387 14.4572 130.131 13.9078C129.874 13.3582 129.357 13.0833 128.578 13.0833C128.255 13.0833 127.932 13.1309 127.608 13.2254C127.286 13.3199 126.996 13.5048 126.739 13.7797C126.482 14.0542 126.278 14.438 126.126 14.9309C125.974 15.4234 125.898 16.0679 125.898 16.8637V24.5668C125.214 24.6805 124.54 24.737 123.875 24.737C123.21 24.737 122.535 24.6805 121.851 24.5668V9.8711ZM151.47 21.8379C152.534 21.8379 153.299 21.4449 153.764 20.6582C154.23 19.872 154.463 18.7396 154.463 17.2617C154.463 15.7835 154.23 14.6514 153.764 13.8649C153.299 13.0782 152.534 12.6852 151.47 12.6852C150.425 12.6852 149.67 13.0782 149.204 13.8649C148.739 14.6514 148.506 15.7835 148.506 17.2617C148.506 18.7396 148.739 19.872 149.204 20.6582C149.67 21.4449 150.425 21.8379 151.47 21.8379ZM151.47 24.9078C150.273 24.9078 149.233 24.7134 148.349 24.325C147.466 23.9367 146.734 23.3965 146.154 22.7047C145.575 22.013 145.138 21.2031 144.844 20.2745C144.549 19.3459 144.402 18.3419 144.402 17.2617C144.402 16.1816 144.549 15.1676 144.844 14.2203C145.138 13.2728 145.575 12.4532 146.154 11.7615C146.734 11.0697 147.466 10.5255 148.349 10.1271C149.233 9.72921 150.273 9.53008 151.47 9.53008C152.667 9.53008 153.712 9.72921 154.605 10.1271C155.498 10.5255 156.239 11.0697 156.829 11.7615C157.418 12.4532 157.854 13.2728 158.14 14.2203C158.425 15.1676 158.567 16.1816 158.567 17.2617C158.567 18.3419 158.425 19.3459 158.14 20.2745C157.854 21.2031 157.418 22.013 156.829 22.7047C156.239 23.3965 155.498 23.9367 154.605 24.325C153.712 24.7134 152.667 24.9078 151.47 24.9078ZM162.963 18.1713C161.899 17.8678 161.068 17.418 160.469 16.821C159.871 16.2243 159.571 15.3288 159.571 14.1347C159.571 12.6945 160.089 11.5675 161.125 10.7526C162.16 9.9376 163.571 9.53008 165.357 9.53008C166.098 9.53008 166.83 9.59657 167.552 9.72921C168.274 9.86184 169.006 10.0606 169.746 10.3262C169.708 10.8186 169.613 11.3302 169.461 11.8611C169.31 12.3915 169.129 12.8557 168.92 13.2541C168.464 13.0644 167.961 12.8985 167.409 12.7563C166.859 12.6144 166.279 12.5433 165.671 12.5433C165.025 12.5433 164.522 12.6427 164.16 12.8417C163.799 13.0408 163.619 13.3582 163.619 13.7937C163.619 14.2107 163.747 14.5045 164.003 14.6751C164.26 14.8455 164.626 15.007 165.101 15.1582L166.725 15.6418C167.258 15.7932 167.737 15.9778 168.165 16.1958C168.592 16.4138 168.958 16.6838 169.262 17.0057C169.566 17.3279 169.804 17.7259 169.974 18.1996C170.146 18.6734 170.231 19.2512 170.231 19.9332C170.231 20.6347 170.084 21.2884 169.789 21.8947C169.495 22.5012 169.067 23.027 168.507 23.4721C167.946 23.9178 167.267 24.2683 166.469 24.5239C165.671 24.7799 164.768 24.9078 163.761 24.9078C163.305 24.9078 162.887 24.8935 162.507 24.8651C162.127 24.8364 161.762 24.7892 161.41 24.723C161.058 24.6565 160.712 24.5762 160.37 24.4814C160.028 24.3867 159.657 24.2636 159.258 24.1118C159.296 23.6 159.386 23.0837 159.529 22.5628C159.671 22.0419 159.857 21.5346 160.085 21.0419C160.712 21.2884 161.306 21.473 161.866 21.5962C162.427 21.7196 163.011 21.7814 163.619 21.7814C163.885 21.7814 164.175 21.7574 164.488 21.71C164.802 21.6625 165.091 21.5773 165.357 21.4541C165.624 21.331 165.847 21.1698 166.027 20.971C166.208 20.7721 166.298 20.5116 166.298 20.1891C166.298 19.7347 166.16 19.4076 165.885 19.2087C165.609 19.0099 165.224 18.834 164.731 18.6827L162.963 18.1713ZM172.821 12.9411H170.969L170.826 12.3726L176.156 5.57913H176.811V9.8711H180.26C180.317 10.1556 180.355 10.4113 180.375 10.6385C180.393 10.8662 180.403 11.1029 180.403 11.3495C180.403 11.6146 180.393 11.8704 180.375 12.1167C180.355 12.3633 180.317 12.638 180.26 12.9411H176.811V18.7114C176.811 19.2986 176.859 19.7723 176.954 20.1326C177.049 20.4921 177.187 20.7766 177.367 20.9852C177.548 21.1936 177.771 21.3357 178.037 21.4114C178.303 21.4876 178.617 21.5254 178.978 21.5254C179.263 21.5254 179.543 21.5016 179.819 21.4541C180.094 21.4069 180.336 21.3642 180.545 21.3264C180.678 21.686 180.774 22.0604 180.83 22.4491C180.888 22.8375 180.916 23.1836 180.916 23.4867C180.916 23.6951 180.911 23.8702 180.902 24.0125C180.892 24.1544 180.878 24.2923 180.859 24.4245C179.985 24.6333 179.083 24.737 178.151 24.737C176.422 24.737 175.102 24.3346 174.189 23.5295C173.278 22.7239 172.821 21.4114 172.821 19.5924V12.9411ZM39.2629 5.37164C40.0865 5.25736 40.8788 5.19995 41.6403 5.19995C42.4432 5.19995 43.2359 5.25736 44.018 5.37164L49.1127 15.9173L54.3617 5.37164C54.9998 5.25736 55.7096 5.19995 56.4921 5.19995C57.2744 5.19995 58.0253 5.25736 58.746 5.37164L59.7957 24.7363C59.0138 24.8508 58.2727 24.9078 57.573 24.9078C56.8727 24.9078 56.1835 24.8508 55.5043 24.7363L54.9483 10.7354L50.4402 20.4122C50.1518 20.4503 49.8536 20.4841 49.5446 20.5123C49.2358 20.541 48.9274 20.5552 48.6184 20.5552C48.3506 20.5552 48.0833 20.5457 47.8159 20.5266C47.5483 20.5076 47.2705 20.4692 46.9821 20.4122L42.783 10.5348L42.3507 24.7363C41.6921 24.8508 41.0539 24.9078 40.4361 24.9078C39.7774 24.9078 39.0978 24.8508 38.3984 24.7363L39.2629 5.37164Z'\n fill='#1E325C'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M20.1373 12.2575C20.1373 12.2575 20.1838 14.3044 18.7644 15.695C17.3448 17.0856 15.6012 16.9585 14.467 16.5745C13.3326 16.1905 11.8704 15.2323 11.5873 13.2655C11.3045 11.2986 12.5848 9.70069 12.5848 9.70069L15.3747 6.23118L16.9996 4.24963L18.3944 2.52282C18.3944 2.52282 19.0345 1.66544 19.2169 1.48849C19.2531 1.45342 19.2901 1.43042 19.3265 1.4127L19.3529 1.39919L19.3577 1.39736C19.4344 1.36431 19.5228 1.35719 19.6081 1.38604C19.6915 1.41435 19.7562 1.47169 19.7971 1.54236L19.8056 1.55605L19.8131 1.57176C19.833 1.60938 19.8496 1.65229 19.8575 1.70525C19.8948 1.95671 19.8825 3.02665 19.8825 3.02665L19.9415 5.24543L20.0286 7.8066L20.1373 12.2575ZM23.7488 2.86301C28.9088 6.61849 31.2753 13.4339 29.1235 19.8082C26.4751 27.653 17.9863 31.8597 10.1633 29.2041C2.34031 26.5484 -1.85455 18.0361 0.79367 10.1914C2.9491 3.80658 8.97324 -0.167855 15.3585 0.00544665L13.3118 2.43039C9.52375 3.11721 6.25309 5.71126 4.96759 9.51933C3.05491 15.185 6.26074 21.3926 12.1281 23.3842C17.9952 25.376 24.3022 22.3977 26.2149 16.7321C27.4962 12.9366 26.4802 8.89825 23.9063 6.04672L23.7488 2.86301Z'\n fill='#1E325C'\n />\n </Svg>\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n};\n\nconst MonitorImacLikeSVG = (props: SvgProps) => (\n <svg\n width={props.width?.toString() || '150'}\n height={props.height?.toString() || '160'}\n viewBox='0 0 150 160'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <path\n d='M144.783 17.2976C144.783 12.6825 140.156 8.06738 135.529 8.06738H15.2276C10.6006 8.06738 5.97363 12.6825 5.97363 17.2976V105.037H144.783V17.2976Z'\n fill='#2D3039'\n />\n <path\n d='M5.97363 105.036V114.266C5.97363 118.881 10.6006 123.496 15.2276 123.496H135.529C140.156 123.496 144.783 118.881 144.783 114.266V105.036H5.97363Z'\n fill='#DDDFE4'\n />\n <path\n d='M56.8702 128.095C56.8702 137.325 47.6162 137.325 38.3975 137.325H112.429C103.175 137.325 93.9563 137.325 93.9563 128.095V123.462H56.9406L56.8702 128.095Z'\n fill='#C6C9D2'\n />\n <path\n d='M135.529 17.333H15.2278V95.7893H135.529V17.333Z'\n fill='white'\n />\n <path\n d='M75.3781 111.801C75.8357 111.801 76.283 111.936 76.6635 112.19C77.0439 112.443 77.3404 112.804 77.5155 113.225C77.6906 113.647 77.7364 114.111 77.6471 114.558C77.5579 115.006 77.3376 115.417 77.014 115.74C76.6905 116.063 76.2782 116.283 75.8295 116.372C75.3807 116.461 74.9155 116.415 74.4928 116.24C74.0701 116.066 73.7088 115.77 73.4546 115.39C73.2004 115.011 73.0647 114.565 73.0647 114.108C73.0647 113.496 73.3084 112.909 73.7423 112.477C74.1761 112.044 74.7646 111.801 75.3781 111.801Z'\n fill='#BABEC9'\n />\n <path\n d='M112.394 137.325H38.3623V146.555H112.394V137.325Z'\n fill='#A4A9B7'\n />\n <path\n d='M52.9387 24.4707H28.9387C26.7296 24.4707 24.9387 26.2616 24.9387 28.4707V44.4707C24.9387 46.6798 26.7296 48.4707 28.9387 48.4707H52.9387C55.1479 48.4707 56.9387 46.6798 56.9387 44.4707V28.4707C56.9387 26.2616 55.1479 24.4707 52.9387 24.4707Z'\n fill='#3D3C40'\n fillOpacity='0.24'\n />\n <path\n d='M40.9387 28.4707C39.3565 28.4707 37.8098 28.9399 36.4942 29.8189C35.1786 30.698 34.1532 31.9474 33.5477 33.4092C32.9422 34.871 32.7838 36.4796 33.0924 38.0314C33.4011 39.5833 34.163 41.0087 35.2819 42.1275C36.4007 43.2464 37.8261 44.0083 39.378 44.317C40.9298 44.6257 42.5384 44.4672 44.0002 43.8617C45.462 43.2562 46.7114 42.2309 47.5905 40.9153C48.4695 39.5997 48.9387 38.0529 48.9387 36.4707C48.9325 34.3509 48.0877 32.3196 46.5887 30.8207C45.0898 29.3218 43.0585 28.4769 40.9387 28.4707ZM40.9387 30.8707C41.4134 30.8707 41.8774 31.0115 42.2721 31.2752C42.6668 31.5389 42.9744 31.9137 43.156 32.3523C43.3377 32.7908 43.3852 33.2734 43.2926 33.7389C43.2 34.2045 42.9714 34.6321 42.6358 34.9678C42.3001 35.3034 41.8725 35.532 41.4069 35.6246C40.9414 35.7172 40.4588 35.6697 40.0203 35.488C39.5817 35.3064 39.2069 34.9987 38.9432 34.6041C38.6795 34.2094 38.5387 33.7454 38.5387 33.2707C38.5408 32.6348 38.7944 32.0256 39.244 31.576C39.6936 31.1264 40.3029 30.8728 40.9387 30.8707V30.8707ZM40.9387 42.4245C39.9906 42.4202 39.0579 42.1847 38.2215 41.7383C37.385 41.2919 36.6701 40.6482 36.1387 39.863C36.1772 38.263 39.3387 37.3822 40.9387 37.3822C42.5387 37.3822 45.7003 38.263 45.7387 39.863C45.2067 40.6476 44.4917 41.2909 43.6554 41.7372C42.8191 42.1835 41.8867 42.4194 40.9387 42.4245Z'\n fill='white'\n />\n <path\n d='M87.9387 24.4707H63.9387C61.7296 24.4707 59.9387 26.2616 59.9387 28.4707V44.4707C59.9387 46.6798 61.7296 48.4707 63.9387 48.4707H87.9387C90.1479 48.4707 91.9387 46.6798 91.9387 44.4707V28.4707C91.9387 26.2616 90.1479 24.4707 87.9387 24.4707Z'\n fill='#3D3C40'\n fillOpacity='0.24'\n />\n <path\n d='M75.9387 28.4707C74.3565 28.4707 72.8098 28.9399 71.4942 29.8189C70.1786 30.698 69.1532 31.9474 68.5477 33.4092C67.9422 34.871 67.7838 36.4796 68.0924 38.0314C68.4011 39.5833 69.163 41.0087 70.2819 42.1275C71.4007 43.2464 72.8261 44.0083 74.378 44.317C75.9298 44.6257 77.5384 44.4672 79.0002 43.8617C80.462 43.2562 81.7114 42.2309 82.5905 40.9153C83.4695 39.5997 83.9387 38.0529 83.9387 36.4707C83.9325 34.3509 83.0877 32.3196 81.5887 30.8207C80.0898 29.3218 78.0585 28.4769 75.9387 28.4707ZM75.9387 30.8707C76.4134 30.8707 76.8774 31.0115 77.2721 31.2752C77.6668 31.5389 77.9744 31.9137 78.156 32.3523C78.3377 32.7908 78.3852 33.2734 78.2926 33.7389C78.2 34.2045 77.9714 34.6321 77.6358 34.9678C77.3001 35.3034 76.8725 35.532 76.4069 35.6246C75.9414 35.7172 75.4588 35.6697 75.0203 35.488C74.5817 35.3064 74.2069 34.9987 73.9432 34.6041C73.6795 34.2094 73.5387 33.7454 73.5387 33.2707C73.5408 32.6348 73.7944 32.0256 74.244 31.576C74.6936 31.1264 75.3029 30.8728 75.9387 30.8707V30.8707ZM75.9387 42.4245C74.9906 42.4202 74.0579 42.1847 73.2215 41.7383C72.385 41.2919 71.6701 40.6482 71.1387 39.863C71.1772 38.263 74.3387 37.3822 75.9387 37.3822C77.5387 37.3822 80.7003 38.263 80.7387 39.863C80.2067 40.6476 79.4917 41.2909 78.6554 41.7372C77.8191 42.1835 76.8867 42.4194 75.9387 42.4245Z'\n fill='white'\n />\n <path\n d='M122.939 24.4707H98.9387C96.7296 24.4707 94.9387 26.2616 94.9387 28.4707V44.4707C94.9387 46.6798 96.7296 48.4707 98.9387 48.4707H122.939C125.148 48.4707 126.939 46.6798 126.939 44.4707V28.4707C126.939 26.2616 125.148 24.4707 122.939 24.4707Z'\n fill='#166DE0'\n />\n <path\n d='M110.939 28.4707C109.356 28.4707 107.81 28.9399 106.494 29.8189C105.179 30.698 104.153 31.9474 103.548 33.4092C102.942 34.871 102.784 36.4796 103.092 38.0314C103.401 39.5833 104.163 41.0087 105.282 42.1275C106.401 43.2464 107.826 44.0083 109.378 44.317C110.93 44.6257 112.538 44.4672 114 43.8617C115.462 43.2562 116.711 42.2309 117.59 40.9153C118.47 39.5997 118.939 38.0529 118.939 36.4707C118.933 34.3509 118.088 32.3196 116.589 30.8207C115.09 29.3218 113.059 28.4769 110.939 28.4707ZM110.939 30.8707C111.413 30.8707 111.877 31.0115 112.272 31.2752C112.667 31.5389 112.974 31.9137 113.156 32.3523C113.338 32.7908 113.385 33.2734 113.293 33.7389C113.2 34.2045 112.971 34.6321 112.636 34.9678C112.3 35.3034 111.873 35.532 111.407 35.6246C110.941 35.7172 110.459 35.6697 110.02 35.488C109.582 35.3064 109.207 34.9987 108.943 34.6041C108.679 34.2094 108.539 33.7454 108.539 33.2707C108.541 32.6348 108.794 32.0256 109.244 31.576C109.694 31.1264 110.303 30.8728 110.939 30.8707V30.8707ZM110.939 42.4245C109.991 42.4202 109.058 42.1847 108.221 41.7383C107.385 41.2919 106.67 40.6482 106.139 39.863C106.177 38.263 109.339 37.3822 110.939 37.3822C112.539 37.3822 115.7 38.263 115.739 39.863C115.207 40.6476 114.492 41.2909 113.655 41.7372C112.819 42.1835 111.887 42.4194 110.939 42.4245Z'\n fill='white'\n />\n <path\n d='M52.9387 64.4707H28.9387C26.7296 64.4707 24.9387 66.2616 24.9387 68.4707V84.4707C24.9387 86.6798 26.7296 88.4707 28.9387 88.4707H52.9387C55.1479 88.4707 56.9387 86.6798 56.9387 84.4707V68.4707C56.9387 66.2616 55.1479 64.4707 52.9387 64.4707Z'\n fill='#166DE0'\n />\n <path\n d='M40.9387 68.4707C39.3565 68.4707 37.8098 68.9399 36.4942 69.8189C35.1786 70.698 34.1532 71.9474 33.5477 73.4092C32.9422 74.871 32.7838 76.4796 33.0924 78.0314C33.4011 79.5833 34.163 81.0087 35.2819 82.1275C36.4007 83.2464 37.8261 84.0083 39.378 84.317C40.9298 84.6257 42.5384 84.4672 44.0002 83.8617C45.462 83.2562 46.7114 82.2309 47.5905 80.9153C48.4695 79.5997 48.9387 78.0529 48.9387 76.4707C48.9325 74.3509 48.0877 72.3196 46.5887 70.8207C45.0898 69.3218 43.0585 68.4769 40.9387 68.4707ZM40.9387 70.8707C41.4134 70.8707 41.8774 71.0115 42.2721 71.2752C42.6668 71.5389 42.9744 71.9137 43.156 72.3523C43.3377 72.7908 43.3852 73.2734 43.2926 73.7389C43.2 74.2045 42.9714 74.6321 42.6358 74.9678C42.3001 75.3034 41.8725 75.532 41.4069 75.6246C40.9414 75.7172 40.4588 75.6697 40.0203 75.488C39.5817 75.3064 39.2069 74.9987 38.9432 74.6041C38.6795 74.2094 38.5387 73.7454 38.5387 73.2707C38.5408 72.6348 38.7944 72.0256 39.244 71.576C39.6936 71.1264 40.3029 70.8728 40.9387 70.8707V70.8707ZM40.9387 82.4245C39.9906 82.4202 39.0579 82.1847 38.2215 81.7383C37.385 81.2919 36.6701 80.6482 36.1387 79.863C36.1772 78.263 39.3387 77.3822 40.9387 77.3822C42.5387 77.3822 45.7003 78.263 45.7387 79.863C45.2067 80.6476 44.4917 81.2909 43.6554 81.7372C42.8191 82.1835 41.8867 82.4194 40.9387 82.4245Z'\n fill='white'\n />\n <path\n d='M86.9387 64.4707H62.9387C60.7296 64.4707 58.9387 66.2616 58.9387 68.4707V84.4707C58.9387 86.6798 60.7296 88.4707 62.9387 88.4707H86.9387C89.1479 88.4707 90.9387 86.6798 90.9387 84.4707V68.4707C90.9387 66.2616 89.1479 64.4707 86.9387 64.4707Z'\n fill='#166DE0'\n />\n <path\n d='M74.9387 68.4707C73.3565 68.4707 71.8098 68.9399 70.4942 69.8189C69.1786 70.698 68.1532 71.9474 67.5477 73.4092C66.9422 74.871 66.7838 76.4796 67.0924 78.0314C67.4011 79.5833 68.163 81.0087 69.2819 82.1275C70.4007 83.2464 71.8261 84.0083 73.378 84.317C74.9298 84.6257 76.5384 84.4672 78.0002 83.8617C79.462 83.2562 80.7114 82.2309 81.5905 80.9153C82.4695 79.5997 82.9387 78.0529 82.9387 76.4707C82.9325 74.3509 82.0877 72.3196 80.5887 70.8207C79.0898 69.3218 77.0585 68.4769 74.9387 68.4707ZM74.9387 70.8707C75.4134 70.8707 75.8774 71.0115 76.2721 71.2752C76.6668 71.5389 76.9744 71.9137 77.156 72.3523C77.3377 72.7908 77.3852 73.2734 77.2926 73.7389C77.2 74.2045 76.9714 74.6321 76.6358 74.9678C76.3001 75.3034 75.8725 75.532 75.4069 75.6246C74.9414 75.7172 74.4588 75.6697 74.0203 75.488C73.5817 75.3064 73.2069 74.9987 72.9432 74.6041C72.6795 74.2094 72.5387 73.7454 72.5387 73.2707C72.5408 72.6348 72.7944 72.0256 73.244 71.576C73.6936 71.1264 74.3029 70.8728 74.9387 70.8707V70.8707ZM74.9387 82.4245C73.9906 82.4202 73.0579 82.1847 72.2215 81.7383C71.385 81.2919 70.6701 80.6482 70.1387 79.863C70.1772 78.263 73.3387 77.3822 74.9387 77.3822C76.5387 77.3822 79.7003 78.263 79.7387 79.863C79.2067 80.6476 78.4917 81.2909 77.6554 81.7372C76.8191 82.1835 75.8867 82.4194 74.9387 82.4245Z'\n fill='white'\n />\n <path\n d='M120.939 64.4707H96.9387C94.7296 64.4707 92.9387 66.2616 92.9387 68.4707V84.4707C92.9387 86.6798 94.7296 88.4707 96.9387 88.4707H120.939C123.148 88.4707 124.939 86.6798 124.939 84.4707V68.4707C124.939 66.2616 123.148 64.4707 120.939 64.4707Z'\n fill='#3D3C40'\n fillOpacity='0.24'\n />\n <path\n d='M108.939 68.4707C107.356 68.4707 105.81 68.9399 104.494 69.8189C103.179 70.698 102.153 71.9474 101.548 73.4092C100.942 74.871 100.784 76.4796 101.092 78.0314C101.401 79.5833 102.163 81.0087 103.282 82.1275C104.401 83.2464 105.826 84.0083 107.378 84.317C108.93 84.6257 110.538 84.4672 112 83.8617C113.462 83.2562 114.711 82.2309 115.59 80.9153C116.47 79.5997 116.939 78.0529 116.939 76.4707C116.933 74.3509 116.088 72.3196 114.589 70.8207C113.09 69.3218 111.059 68.4769 108.939 68.4707ZM108.939 70.8707C109.413 70.8707 109.877 71.0115 110.272 71.2752C110.667 71.5389 110.974 71.9137 111.156 72.3523C111.338 72.7908 111.385 73.2734 111.293 73.7389C111.2 74.2045 110.971 74.6321 110.636 74.9678C110.3 75.3034 109.873 75.532 109.407 75.6246C108.941 75.7172 108.459 75.6697 108.02 75.488C107.582 75.3064 107.207 74.9987 106.943 74.6041C106.679 74.2094 106.539 73.7454 106.539 73.2707C106.541 72.6348 106.794 72.0256 107.244 71.576C107.694 71.1264 108.303 70.8728 108.939 70.8707V70.8707ZM108.939 82.4245C107.991 82.4202 107.058 82.1847 106.221 81.7383C105.385 81.2919 104.67 80.6482 104.139 79.863C104.177 78.263 107.339 77.3822 108.939 77.3822C110.539 77.3822 113.7 78.263 113.739 79.863C113.207 80.6476 112.492 81.2909 111.655 81.7372C110.819 82.1835 109.887 82.4194 108.939 82.4245Z'\n fill='white'\n />\n </svg>\n);\n\nexport default MonitorImacLikeSVG;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n}\n\nconst SuccessSvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '108'}\n height={props.height ? props.height.toString() : '70'}\n viewBox='0 0 108 70'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <rect\n x='0.000976562'\n y='9'\n width='96'\n height='24'\n rx='3.75'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <rect\n x='9.00098'\n y='36'\n width='99'\n height='25'\n rx='3.75'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <path\n d='M48.224 25.065L50.3246 38.5554C50.3448 38.8231 50.4704 39.0736 50.676 39.2564C50.8816 39.4392 51.152 39.5408 51.4327 39.5408C51.7135 39.5408 51.9839 39.4392 52.1895 39.2564C52.3951 39.0736 52.5207 38.8231 52.5409 38.5554L54.6415 25.065C55.0234 19.8048 47.8363 19.8048 48.224 25.065Z'\n fill='var(--center-channel-color)'\n />\n <path\n d='M52.0528 63.8058C68.4184 63.8058 81.6852 50.5389 81.6852 34.1734C81.6852 17.8079 68.4184 4.54102 52.0528 4.54102C35.6873 4.54102 22.4205 17.8079 22.4205 34.1734C22.4205 50.5389 35.6873 63.8058 52.0528 63.8058Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M53.8949 65.6478C70.2604 65.6478 83.5273 52.3809 83.5273 36.0154C83.5273 19.6499 70.2604 6.38306 53.8949 6.38306C37.5294 6.38306 24.2625 19.6499 24.2625 36.0154C24.2625 52.3809 37.5294 65.6478 53.8949 65.6478Z'\n fill='#3DB887'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M67.8552 23.3044C68.5474 23.9735 68.5661 25.077 67.897 25.7691L49.6318 44.6647C48.9786 45.3404 47.9074 45.3767 47.21 44.7466L37.6445 36.1045C36.9302 35.4591 36.8743 34.3569 37.5197 33.6425C38.165 32.9282 39.2673 32.8723 39.9816 33.5177L48.2966 41.0301L65.3905 23.3462C66.0595 22.654 67.163 22.6353 67.8552 23.3044Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M81.1852 34.1734C81.1852 50.2627 68.1422 63.3058 52.0528 63.3058C35.9635 63.3058 22.9205 50.2627 22.9205 34.1734C22.9205 18.084 35.9635 5.04102 52.0528 5.04102C68.1422 5.04102 81.1852 18.084 81.1852 34.1734Z'\n stroke='var(--center-channel-color)'\n />\n <path\n d='M46.0425 1.87629C52.3425 0.656536 58.4467 1.20528 64.3471 3.52402C66.7696 4.47599 69.1577 5.72629 71.5109 7.27504C74.4539 9.3726 76.96 11.7187 79.0281 14.3147M58.5236 68.5982C51.1481 69.9201 44.0711 68.9661 37.3079 65.7136C35.8908 65.032 34.4874 64.2496 33.098 63.366C29.4103 60.6456 26.4115 57.58 24.0987 54.1672M18.9221 41.4778C18.1041 37.074 18.1312 32.754 19.0033 28.5178C19.8847 24.237 21.6291 20.0417 24.2365 15.932M83.0409 20.7886C84.2298 23.3406 85.0977 26.0763 85.6439 28.9967C86.3002 32.5293 86.423 35.9828 86.0117 39.3566M81.1549 17.3166C81.4873 17.8476 81.8038 18.3877 82.1043 18.9369'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.56'\n />\n </svg>\n);\n\nexport default SuccessSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\n\nimport {limitThresholds} from 'utils/limits';\n\ntype Thresholds = {\n ok: number;\n warn: number;\n danger: number;\n exceeded: number;\n}\n\ntype Props = {\n\n // 0-100, i.e. not a 0-1 decimal\n percent: number;\n thresholds?: Thresholds;\n barWidth?: number | string;\n}\n\nconst defaultThresholds = limitThresholds;\n\ntype BarBackgroundProps = {\n width: number | string;\n thresholds: Thresholds;\n percent: number;\n}\n\nconst BarBackground = styled.div<BarBackgroundProps>`\n height: ${(props) => (typeof props.width === 'number' ? Math.ceil(props.width / 20).toString() + 'px' : '8px')};\n width: ${(props) => (typeof props.width === 'number' ? props.width.toString() + 'px' : props.width)};\n background: ${(props) => (\n isExceeded(props.percent, props.thresholds) ? 'var(--dnd-indicator)' : 'rgba(var(--center-channel-color-rgb), 0.11)'\n )};\n border-radius: 8px;\n position: relative;\n`;\n\ntype BarForegroundProps = {\n width: number | string;\n percent: number;\n thresholds: Thresholds;\n}\n\nfunction getColor(percent: number, thresholds: Thresholds): string {\n switch (true) {\n case percent < thresholds.ok:\n return '';\n case percent < thresholds.warn:\n return 'var(--online-indicator)';\n case percent < thresholds.danger || percent > thresholds.exceeded:\n // exceeded case also has a red background, applied elsewhere\n return 'var(--away-indicator)';\n case percent < thresholds.exceeded:\n return 'var(--dnd-indicator)';\n default:\n return '';\n }\n}\n\nfunction isExceeded(percent: number, thresholds: Thresholds): boolean {\n return percent >= thresholds.exceeded;\n}\n\nconst BarForeground = styled.div<BarForegroundProps>`\n height: 100%;\n width: ${(props) => (isExceeded(props.percent, props.thresholds) ? 91 : props.percent)}%;\n border-radius: 8px;\n background-color: ${(props) => getColor(props.percent, props.thresholds)};\n transition: background-color 0.4s ease, width 0.4s ease;\n position: absolute;\n`;\n\nconst UsagePercentBar = (props: Props) => {\n const thresholds = props.thresholds || defaultThresholds;\n const percent = Math.max(0, props.percent);\n const barWidth = props.barWidth || 155;\n return (\n <BarBackground\n width={barWidth}\n thresholds={thresholds}\n percent={percent}\n >\n <BarForeground\n width={barWidth}\n thresholds={thresholds}\n percent={percent}\n />\n </BarBackground>\n );\n};\n\nexport default UsagePercentBar;\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo} from 'react';\n\nimport ThemeProvider, {lightTheme} from '@mattermost/compass-components/utilities/theme'; // eslint-disable-line no-restricted-imports\n\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\n\ntype Props = {\n theme: Theme;\n children?: React.ReactNode;\n}\n\nconst CompassThemeProvider = ({\n theme,\n children,\n}: Props) => {\n const compassTheme = useMemo(() => {\n const base = {\n ...lightTheme,\n noStyleReset: true,\n noDefaultStyle: true,\n noFontFaces: true,\n };\n\n return {\n ...base,\n palette: {\n ...base.palette,\n primary: {\n ...base.palette.primary,\n main: theme.sidebarHeaderBg,\n contrast: theme.sidebarHeaderTextColor,\n },\n alert: {\n ...base.palette.alert,\n main: theme.dndIndicator,\n },\n },\n action: {\n ...base.action,\n hover: theme.sidebarHeaderTextColor,\n disabled: theme.sidebarHeaderTextColor,\n },\n badges: {\n ...base.badges,\n online: theme.onlineIndicator,\n away: theme.awayIndicator,\n dnd: theme.dndIndicator,\n },\n text: {\n ...base.text,\n primary: theme.sidebarHeaderTextColor,\n },\n };\n }, [theme]);\n\n return (\n <ThemeProvider theme={compassTheme}>\n {children}\n </ThemeProvider>\n );\n};\n\nexport default CompassThemeProvider;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState} from 'react';\n\nimport ConfirmModal from 'components/confirm_modal';\n\ntype Props = Omit<React.ComponentProps<typeof ConfirmModal>, 'show'> & {\n onExited: () => void;\n};\n\nexport default function ConfirmModalRedux(props: Props) {\n const {\n onCancel,\n onConfirm,\n onExited,\n ...otherProps\n } = props;\n\n const [show, setShow] = useState(true);\n\n const wrappedOnCancel = useCallback((checked) => {\n onCancel?.(checked);\n\n setShow(false);\n }, [onCancel]);\n const wrappedOnConfirm = useCallback((checked) => {\n onConfirm?.(checked);\n\n setShow(false);\n }, [onConfirm]);\n\n return (\n <ConfirmModal\n {...otherProps}\n onCancel={wrappedOnCancel}\n onConfirm={wrappedOnConfirm}\n onExited={onExited}\n show={show}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport ConfirmModalRedux from './confirm_modal_redux';\n\nexport default ConfirmModalRedux;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useRef, useState} from 'react';\nimport {FormattedMessage, defineMessages, useIntl} from 'react-intl';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport {copyToClipboard} from 'utils/utils';\n\ntype Props = {\n content: string;\n isForText?: boolean;\n className?: string;\n};\n\nconst CopyButton: React.FC<Props> = (props: Props) => {\n const intl = useIntl();\n\n const [isCopied, setIsCopied] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n const copyText = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {\n e.preventDefault();\n setIsCopied(true);\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n\n copyToClipboard(props.content);\n };\n\n let tooltipMessage;\n if (isCopied) {\n tooltipMessage = messages.copied;\n } else if (props.isForText) {\n tooltipMessage = messages.copyText;\n } else {\n tooltipMessage = messages.copyCode;\n }\n\n const tooltipText = (\n <FormattedMessage {...tooltipMessage}/>\n );\n\n const spanClassName = classNames('post-code__clipboard', props.className);\n\n return (\n <WithTooltip\n title={tooltipText}\n >\n <span\n className={spanClassName}\n onClick={copyText}\n aria-label={intl.formatMessage(tooltipMessage)}\n role='button'\n >\n {!isCopied &&\n <i\n className='icon icon-content-copy'\n />\n }\n {isCopied &&\n <i\n className='icon icon-check'\n />\n }\n </span>\n </WithTooltip>\n );\n};\n\nconst messages = defineMessages({\n copied: {\n id: 'copied.message',\n defaultMessage: 'Copied',\n },\n copyCode: {\n id: 'copy.code.message',\n defaultMessage: 'Copy code',\n },\n copyText: {\n id: 'copy.text.message',\n defaultMessage: 'Copy text',\n },\n});\n\nexport default CopyButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, type IntlShape, defineMessage, injectIntl} from 'react-intl';\n\nimport type {GroupCreateWithUserIds} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AddUserToGroupMultiSelect from 'components/add_user_to_group_multiselect';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport Constants, {ItemStatus} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\nimport 'components/user_groups_modal/user_groups_modal.scss';\nimport './create_user_groups_modal.scss';\n\nexport type Props = {\n onExited: () => void;\n backButtonCallback?: () => void;\n actions: {\n createGroupWithUserIds: (group: GroupCreateWithUserIds) => Promise<ActionResult>;\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n intl: IntlShape;\n}\n\ntype State = {\n show: boolean;\n name: string;\n mention: string;\n savingEnabled: boolean;\n usersToAdd: UserProfile[];\n mentionUpdatedManually: boolean;\n mentionInputErrorText: React.ReactNode;\n nameInputErrorText: React.ReactNode;\n showUnknownError: boolean;\n saving: boolean;\n}\n\nexport class CreateUserGroupsModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n show: true,\n name: '',\n mention: '',\n savingEnabled: false,\n usersToAdd: [],\n mentionUpdatedManually: false,\n mentionInputErrorText: '',\n nameInputErrorText: '',\n showUnknownError: false,\n saving: false,\n };\n }\n\n doHide = () => {\n this.setState({show: false});\n };\n isSaveEnabled = () => {\n return this.state.name.length > 0 && this.state.mention.length > 0 && this.state.usersToAdd.length > 0;\n };\n updateNameState = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n let mention = this.state.mention;\n if (!this.state.mentionUpdatedManually) {\n mention = value.replace(/[^A-Za-z0-9.\\-_@]/g, '').toLowerCase();\n if (mention.substring(0, 1) !== '@') {\n mention = `@${mention}`;\n }\n }\n this.setState({name: value, mention});\n };\n\n updateMentionState = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n this.setState({mention: value, mentionUpdatedManually: true});\n };\n\n private addUserCallback = (usersToAdd: UserProfile[]): void => {\n this.setState({usersToAdd});\n };\n\n private deleteUserCallback = (usersToAdd: UserProfile[]): void => {\n this.setState({usersToAdd});\n };\n\n goBack = () => {\n if (typeof this.props.backButtonCallback === 'function') {\n this.props.backButtonCallback();\n this.props.onExited();\n }\n };\n\n createGroup = async (users?: UserProfile[]) => {\n this.setState({showUnknownError: false, mentionInputErrorText: '', nameInputErrorText: '', saving: true});\n let mention = this.state.mention;\n const displayName = this.state.name;\n\n if (!displayName || !displayName.trim()) {\n this.setState({\n nameInputErrorText: (\n <FormattedMessage\n id='user_groups_modal.nameIsEmpty'\n defaultMessage='Name is a required field.'\n />\n ),\n saving: false,\n });\n return;\n }\n\n if (!users || users.length === 0) {\n this.setState({saving: false});\n return;\n }\n if (mention.substring(0, 1) === '@') {\n mention = mention.substring(1, mention.length);\n }\n\n if (mention.length < 1) {\n this.setState({\n mentionInputErrorText: (\n <FormattedMessage\n id='user_groups_modal.mentionIsEmpty'\n defaultMessage='Mention is a required field.'\n />\n ),\n saving: false,\n });\n return;\n }\n\n if (Constants.SPECIAL_MENTIONS.includes(mention.toLowerCase())) {\n this.setState({\n mentionInputErrorText: (\n <FormattedMessage\n id='user_groups_modal.mentionReservedWord'\n defaultMessage='Mention contains a reserved word.'\n />\n ),\n saving: false,\n });\n return;\n }\n\n const mentionRegEx = new RegExp(/^[a-z0-9.\\-_]+$/);\n if (!mentionRegEx.test(mention)) {\n this.setState({\n mentionInputErrorText: (\n <FormattedMessage\n id='user_groups_modal.mentionInvalidError'\n defaultMessage='Invalid character in mention.'\n />\n ),\n saving: false,\n });\n return;\n }\n\n const group = {\n name: mention,\n display_name: this.state.name,\n allow_reference: true,\n source: 'custom',\n user_ids: users.map((user) => {\n return user.id;\n }),\n };\n\n const data = await this.props.actions.createGroupWithUserIds(group);\n\n if (data?.error) {\n if (data.error?.server_error_id === 'app.custom_group.unique_name') {\n this.setState({\n mentionInputErrorText: (\n <FormattedMessage\n id='user_groups_modal.mentionNotUnique'\n defaultMessage='Mention needs to be unique.'\n />\n ),\n });\n } else if (data.error?.server_error_id === 'app.group.username_conflict') {\n this.setState({\n mentionInputErrorText: (\n <FormattedMessage\n id='user_groups_modal.mentionUsernameConflict'\n defaultMessage='A username already exists with this name. Mention must be unique.'\n />\n ),\n });\n } else {\n this.setState({showUnknownError: true});\n }\n this.setState({saving: false});\n } else if (typeof this.props.backButtonCallback === 'function') {\n this.goBack();\n } else {\n this.doHide();\n }\n };\n\n render() {\n return (\n <Modal\n dialogClassName='a11y__modal user-groups-modal-create'\n show={this.state.show}\n onHide={this.doHide}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='createUserGroupsModalLabel'\n id='createUserGroupsModal'\n >\n <Modal.Header closeButton={true}>\n {\n typeof this.props.backButtonCallback === 'function' ? (\n <div className='d-flex align-items-center'>\n <button\n type='button'\n className='modal-header-back-button btn btn-icon'\n aria-label={this.props.intl.formatMessage({id: 'user_groups_modal.goBackLabel', defaultMessage: 'Back'})}\n onClick={() => {\n this.goBack();\n }}\n >\n <i className='icon icon-arrow-left'/>\n </button>\n <Modal.Title\n componentClass='h1'\n id='createGroupsModalTitleWithBack'\n >\n <FormattedMessage\n id='user_groups_modal.createTitle'\n defaultMessage='Create Group'\n />\n </Modal.Title>\n </div>\n ) : (\n <Modal.Title\n componentClass='h1'\n id='createGroupsModalTitle'\n >\n <FormattedMessage\n id='user_groups_modal.createTitle'\n defaultMessage='Create Group'\n />\n </Modal.Title>\n )\n }\n\n </Modal.Header>\n <Modal.Body>\n <div className='user-groups-modal__content'>\n <div className='group-name-input-wrapper'>\n <Input\n type='text'\n placeholder={defineMessage({id: 'user_groups_modal.name', defaultMessage: 'Name'})}\n onChange={this.updateNameState}\n value={this.state.name}\n data-testid='nameInput'\n maxLength={64}\n autoFocus={true}\n customMessage={{type: ItemStatus.ERROR, value: this.state.nameInputErrorText}}\n />\n </div>\n <div className='group-mention-input-wrapper'>\n <Input\n type='text'\n placeholder={defineMessage({id: 'user_groups_modal.mention', defaultMessage: 'Mention'})}\n onChange={this.updateMentionState}\n value={this.state.mention}\n maxLength={64}\n data-testid='mentionInput'\n customMessage={{type: ItemStatus.ERROR, value: this.state.mentionInputErrorText}}\n />\n </div>\n <h2>\n <FormattedMessage\n id='user_groups_modal.addPeople'\n defaultMessage='Add People'\n />\n </h2>\n <div className='group-add-user'>\n <AddUserToGroupMultiSelect\n multilSelectKey={'addUsersToGroupKey'}\n onSubmitCallback={this.createGroup}\n focusOnLoad={false}\n savingEnabled={this.isSaveEnabled()}\n addUserCallback={this.addUserCallback}\n deleteUserCallback={this.deleteUserCallback}\n backButtonText={defineMessage({id: 'multiselect.cancelButton', defaultMessage: 'Cancel'})}\n backButtonClick={\n typeof this.props.backButtonCallback === 'function' ? this.goBack : this.doHide\n }\n backButtonClass={'multiselect-back'}\n saving={this.state.saving}\n />\n </div>\n {\n this.state.showUnknownError &&\n <div className='Input___error group-error'>\n <i className='icon icon-alert-outline'/>\n <FormattedMessage\n id='user_groups_modal.unknownError'\n defaultMessage='An unknown error has occurred.'\n />\n </div>\n }\n </div>\n </Modal.Body>\n </Modal>\n );\n }\n}\n\nexport default injectIntl(CreateUserGroupsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {createGroupWithUserIds} from 'mattermost-redux/actions/groups';\n\nimport {openModal} from 'actions/views/modals';\n\nimport CreateUserGroupsModal from './create_user_groups_modal';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n createGroupWithUserIds,\n openModal,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(CreateUserGroupsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useMemo, useRef} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {CustomStatusDuration} from '@mattermost/types/users';\n\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\n\nimport {isCustomStatusEnabled, isCustomStatusExpired, makeGetCustomStatus} from 'selectors/views/custom_status';\n\nimport RenderEmoji from 'components/emoji/render_emoji';\nimport WithTooltip from 'components/with_tooltip';\n\nimport type {GlobalState} from 'types/store';\n\nimport ExpiryTime from './expiry_time';\n\ninterface Props {\n emojiSize?: number;\n showTooltip?: boolean;\n spanStyle?: React.CSSProperties;\n emojiStyle?: React.CSSProperties;\n userID?: string;\n onClick?: () => void;\n}\n\nfunction CustomStatusEmoji({\n emojiSize = 16,\n showTooltip = false,\n spanStyle = {},\n emojiStyle = {\n marginLeft: 4,\n marginTop: -1,\n },\n userID = '',\n onClick,\n}: Props) {\n const getCustomStatus = useMemo(makeGetCustomStatus, []);\n const customStatus = useSelector((state: GlobalState) => getCustomStatus(state, userID));\n\n const timezone = useSelector(getCurrentTimezone);\n\n const customStatusExpired = useSelector((state: GlobalState) => isCustomStatusExpired(state, customStatus));\n const customStatusEnabled = useSelector(isCustomStatusEnabled);\n\n const emojiRef = useRef<HTMLSpanElement>(null);\n\n if (!customStatusEnabled || !customStatus?.emoji || customStatusExpired) {\n return null;\n }\n\n const statusEmoji = (\n <RenderEmoji\n emojiName={customStatus.emoji}\n size={emojiSize}\n emojiStyle={emojiStyle}\n onClick={onClick}\n />\n );\n\n if (!showTooltip) {\n return statusEmoji;\n }\n\n return (\n <WithTooltip\n title={\n <>\n <div className='custom-status'>\n {customStatus.text && (\n <span\n className='custom-status-text'\n style={{marginLeft: 5}}\n >\n {customStatus.text}\n </span>\n )}\n </div>\n {customStatus.expires_at && customStatus.duration !== CustomStatusDuration.DONT_CLEAR && (\n <div>\n <ExpiryTime\n time={customStatus.expires_at}\n timezone={timezone}\n className='custom-status-expiry'\n />\n </div>\n )}\n </>\n }\n emoji={customStatus.emoji}\n isEmojiLarge={true}\n >\n <span\n ref={emojiRef}\n style={spanStyle}\n >\n {statusEmoji}\n </span>\n </WithTooltip>\n );\n}\n\nfunction arePropsEqual(prevProps: Props, nextProps: Props) {\n return prevProps.userID === nextProps.userID;\n}\n\nexport default memo(CustomStatusEmoji, arePropsEqual);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserCustomStatus} from '@mattermost/types/users';\nimport {CustomStatusDuration} from '@mattermost/types/users';\n\nimport RenderEmoji from 'components/emoji/render_emoji';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {durationValues} from 'utils/constants';\n\nimport CustomStatusText from './custom_status_text';\n\nimport './custom_status.scss';\n\ntype Props = {\n handleSuggestionClick: (status: UserCustomStatus) => void;\n handleClear?: (status: UserCustomStatus) => void;\n status: UserCustomStatus;\n};\n\nconst CustomStatusSuggestion: React.FC<Props> = (props: Props) => {\n const {handleSuggestionClick, handleClear, status} = props;\n const {emoji, text, duration} = status;\n const [show, setShow] = useState(false);\n\n const showClearButton = () => setShow(true);\n\n const hideClearButton = () => setShow(false);\n\n const handleRecentCustomStatusClear = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n event.preventDefault();\n if (handleClear) {\n handleClear(status);\n }\n };\n\n const clearButton = handleClear ? (\n <div className='suggestion-clear'>\n <WithTooltip\n title={\n <FormattedMessage\n id='custom_status.suggestions.clear'\n defaultMessage='Clear'\n />\n }\n >\n <button\n className='style--none input-clear-x'\n onClick={handleRecentCustomStatusClear}\n >\n <i className='icon icon-close-circle'/>\n </button>\n </WithTooltip>\n </div>\n ) : null;\n\n return (\n <button\n className='statusSuggestion__row cursor--pointer'\n onMouseEnter={showClearButton}\n onMouseLeave={hideClearButton}\n onClick={() => handleSuggestionClick(status)}\n tabIndex={0}\n >\n <div className='statusSuggestion__icon'>\n <RenderEmoji\n emojiName={emoji}\n size={20}\n />\n </div>\n <CustomStatusText\n text={text}\n className={classNames('statusSuggestion__text', {\n with_duration: duration,\n })}\n />\n {duration &&\n duration !== CustomStatusDuration.CUSTOM_DATE_TIME &&\n duration !== CustomStatusDuration.DATE_AND_TIME && (\n <span className='statusSuggestion__duration'>\n <FormattedMessage\n id={durationValues[duration].id}\n defaultMessage={durationValues[duration].defaultMessage}\n />\n </span>\n )}\n {show && clearButton}\n </button>\n );\n};\n\nexport default CustomStatusSuggestion;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useEffect} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport {CustomStatusDuration} from '@mattermost/types/users';\n\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {durationValues} from 'utils/constants';\n\nimport ExpiryTime from './expiry_time';\n\ntype ExpiryMenuItem = {\n text: string;\n value: string;\n}\n\ntype Props = {\n duration: CustomStatusDuration;\n expiryTime?: string;\n handleDurationChange: (expiryValue: CustomStatusDuration) => void;\n}\n\nconst {\n DONT_CLEAR,\n THIRTY_MINUTES,\n ONE_HOUR,\n FOUR_HOURS,\n TODAY,\n THIS_WEEK,\n DATE_AND_TIME,\n CUSTOM_DATE_TIME,\n} = CustomStatusDuration;\n\nconst ExpiryMenu: React.FC<Props> = (props: Props) => {\n const {duration, handleDurationChange, expiryTime} = props;\n const {formatMessage} = useIntl();\n const [menuItems, setMenuItems] = useState<JSX.Element[]>([]);\n\n const expiryMenuItems: { [key in CustomStatusDuration]?: ExpiryMenuItem } = {\n [DONT_CLEAR]: {\n text: formatMessage(durationValues[DONT_CLEAR]),\n value: formatMessage(durationValues[DONT_CLEAR]),\n },\n [THIRTY_MINUTES]: {\n text: formatMessage(durationValues[THIRTY_MINUTES]),\n value: formatMessage(durationValues[THIRTY_MINUTES]),\n },\n [ONE_HOUR]: {\n text: formatMessage(durationValues[ONE_HOUR]),\n value: formatMessage(durationValues[ONE_HOUR]),\n },\n [FOUR_HOURS]: {\n text: formatMessage(durationValues[FOUR_HOURS]),\n value: formatMessage(durationValues[FOUR_HOURS]),\n },\n [TODAY]: {\n text: formatMessage(durationValues[TODAY]),\n value: formatMessage(durationValues[TODAY]),\n },\n [THIS_WEEK]: {\n text: formatMessage(durationValues[THIS_WEEK]),\n value: formatMessage(durationValues[THIS_WEEK]),\n },\n [CUSTOM_DATE_TIME]: {\n text: formatMessage({id: 'custom_status.expiry_dropdown.choose_date_and_time', defaultMessage: 'Choose date and time'}),\n value: formatMessage(durationValues[CUSTOM_DATE_TIME]),\n },\n };\n\n useEffect(() => {\n const menuItemArray = Object.keys(expiryMenuItems).map((item, index) => (\n <Menu.ItemAction\n key={item.toString()}\n onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event.preventDefault();\n handleDurationChange(item as CustomStatusDuration);\n }}\n ariaLabel={expiryMenuItems[item as CustomStatusDuration]?.text.toLowerCase()}\n text={expiryMenuItems[item as CustomStatusDuration]?.text}\n id={`expiry_menu_item_${index}`}\n />\n ));\n\n setMenuItems(menuItemArray);\n }, []);\n\n return (\n <div className='statusExpiry'>\n <div className='statusExpiry__content'>\n <MenuWrapper\n className={'statusExpiry__menu'}\n >\n <button className='style--none expiry-wrapper expiry-selector'>\n <FormattedMessage\n id='custom_status.expiry_dropdown.clear_after'\n defaultMessage='Clear after'\n />{': '}\n {expiryTime && duration !== DONT_CLEAR ? (\n <ExpiryTime\n time={expiryTime}\n className='expiry-value'\n showPrefix={false}\n />\n ) : (\n <span className='expiry-value'>\n {expiryMenuItems[duration === DATE_AND_TIME ? CUSTOM_DATE_TIME : duration]?.value}\n </span>\n )}\n <span>\n <i\n className='fa fa-angle-down'\n aria-hidden='true'\n />\n </span>\n </button>\n <Menu\n ariaLabel={formatMessage({id: 'custom_status.expiry_dropdown.clear_after', defaultMessage: 'Clear after'})}\n id='statusExpiryMenu'\n >\n <Menu.Group>\n {menuItems}\n </Menu.Group>\n </Menu>\n </MenuWrapper>\n </div>\n </div>\n );\n};\n\nexport default ExpiryMenu;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {Moment} from 'moment-timezone';\nimport moment from 'moment-timezone';\nimport React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage, defineMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {useRouteMatch} from 'react-router-dom';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {Emoji} from '@mattermost/types/emojis';\nimport type {UserCustomStatus} from '@mattermost/types/users';\nimport {CustomStatusDuration} from '@mattermost/types/users';\n\nimport {setCustomStatusInitialisationState} from 'mattermost-redux/actions/preferences';\nimport {setCustomStatus, unsetCustomStatus, removeRecentCustomStatus} from 'mattermost-redux/actions/users';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\n\nimport {loadCustomEmojisForRecentCustomStatuses} from 'actions/emoji_actions';\nimport {closeModal} from 'actions/views/modals';\nimport {makeGetCustomStatus, getRecentCustomStatuses, showStatusDropdownPulsatingDot, isCustomStatusExpired} from 'selectors/views/custom_status';\n\nimport CustomStatusSuggestion from 'components/custom_status/custom_status_suggestion';\nimport DateTimeInput, {getRoundedTime} from 'components/custom_status/date_time_input';\nimport ExpiryMenu from 'components/custom_status/expiry_menu';\nimport RenderEmoji from 'components/emoji/render_emoji';\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay';\nimport QuickInput, {MaxLengthInput} from 'components/quick_input';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\n\nimport {A11yCustomEventTypes, Constants, ModalIdentifiers} from 'utils/constants';\nimport type {A11yFocusEventDetail} from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\nimport {getCurrentMomentForTimezone} from 'utils/timezone';\n\nimport type {GlobalState} from 'types/store';\n\nimport 'components/category_modal.scss';\nimport './custom_status.scss';\n\ntype Props = {\n onExited: () => void;\n};\n\n// This is the same limit set\n// https://github.com/mattermost/mattermost-server/pull/16835/files#diff-73c61af5954b16f5e3cb5ee786af9eb698f660eff0d65db5556949be5fb6e60bR15\nconst CUSTOM_STATUS_TEXT_CHARACTER_LIMIT = 100;\nconst EMOJI_PICKER_WIDTH_OFFSET = 308;\n\ntype DefaultUserCustomStatus = {\n emoji: string;\n message: MessageDescriptor;\n duration: CustomStatusDuration;\n};\n\nconst {\n DONT_CLEAR,\n THIRTY_MINUTES,\n ONE_HOUR,\n FOUR_HOURS,\n TODAY,\n THIS_WEEK,\n DATE_AND_TIME,\n CUSTOM_DATE_TIME,\n} = CustomStatusDuration;\n\nconst defaultCustomStatusSuggestions: DefaultUserCustomStatus[] = [\n {\n emoji: 'calendar',\n message: defineMessage({\n id: 'custom_status.suggestions.in_a_meeting',\n defaultMessage: 'In a meeting',\n }),\n duration: ONE_HOUR,\n },\n {\n emoji: 'hamburger',\n message: defineMessage({\n id: 'custom_status.suggestions.out_for_lunch',\n defaultMessage: 'Out for lunch',\n }),\n duration: THIRTY_MINUTES,\n },\n {\n emoji: 'sneezing_face',\n message: defineMessage({\n id: 'custom_status.suggestions.out_sick',\n defaultMessage: 'Out sick',\n }),\n duration: TODAY,\n },\n {\n emoji: 'house',\n message: defineMessage({\n id: 'custom_status.suggestions.working_from_home',\n defaultMessage: 'Working from home',\n }),\n duration: TODAY,\n },\n {\n emoji: 'palm_tree',\n message: defineMessage({\n id: 'custom_status.suggestions.on_a_vacation',\n defaultMessage: 'On a vacation',\n }),\n duration: THIS_WEEK,\n },\n];\n\nconst defaultDuration = TODAY;\nconst CustomStatusModal: React.FC<Props> = (props: Props) => {\n const getCustomStatus = useMemo(makeGetCustomStatus, []);\n const dispatch = useDispatch();\n const currentCustomStatus = useSelector(getCustomStatus);\n const customStatusExpired = useSelector((state: GlobalState) => isCustomStatusExpired(state, currentCustomStatus));\n const recentCustomStatuses = useSelector(getRecentCustomStatuses);\n const customStatusControlRef = useRef<HTMLDivElement>(null);\n const emojiButtonRef = useRef<HTMLButtonElement>(null);\n const {formatMessage} = useIntl();\n const isCurrentCustomStatusSet = !customStatusExpired && (currentCustomStatus?.text || currentCustomStatus?.emoji);\n const [showEmojiPicker, setShowEmojiPicker] = useState<boolean>(false);\n const [text, setText] = useState<string>(isCurrentCustomStatusSet ? currentCustomStatus?.text : '');\n const [emoji, setEmoji] = useState<string>(isCurrentCustomStatusSet ? currentCustomStatus?.emoji : '');\n const initialDuration = isCurrentCustomStatusSet ? currentCustomStatus?.duration : defaultDuration;\n const [duration, setDuration] = useState<CustomStatusDuration>(initialDuration === undefined ? defaultDuration : initialDuration);\n const isStatusSet = Boolean(emoji || text);\n const firstTimeModalOpened = useSelector(showStatusDropdownPulsatingDot);\n const timezone = useSelector(getCurrentTimezone);\n const inCustomEmojiPath = useRouteMatch('/:team/emoji');\n\n const currentTime = getCurrentMomentForTimezone(timezone);\n let initialCustomExpiryTime: Moment = getRoundedTime(currentTime);\n if (isCurrentCustomStatusSet && currentCustomStatus?.duration === DATE_AND_TIME && currentCustomStatus?.expires_at) {\n initialCustomExpiryTime = moment(currentCustomStatus.expires_at);\n }\n const [customExpiryTime, setCustomExpiryTime] = useState<Moment>(initialCustomExpiryTime);\n const [isInteracting, setIsInteracting] = useState<boolean>(false);\n\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n if (isKeyPressed(event, Constants.KeyCodes.ESCAPE) && !isInteracting) {\n props.onExited();\n }\n }, [isInteracting, props.onExited]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n const handleCustomStatusInitializationState = () => {\n if (firstTimeModalOpened) {\n dispatch(setCustomStatusInitialisationState({[Preferences.CUSTOM_STATUS_MODAL_VIEWED]: true}));\n }\n };\n\n const loadCustomEmojisForRecentStatuses = () => {\n dispatch(loadCustomEmojisForRecentCustomStatuses());\n };\n\n const handleStatusExpired = () => {\n if (customStatusExpired && currentCustomStatus) {\n dispatch(unsetCustomStatus());\n }\n };\n\n useEffect(() => {\n handleCustomStatusInitializationState();\n loadCustomEmojisForRecentStatuses();\n handleStatusExpired();\n }, []);\n\n useEffect(() => {\n if (inCustomEmojiPath) {\n dispatch(closeModal(ModalIdentifiers.CUSTOM_STATUS));\n }\n }, [dispatch, inCustomEmojiPath]);\n\n const handleSetStatus = () => {\n if (isInteracting) {\n return;\n }\n\n const expiresAt = calculateExpiryTime();\n const customStatus: UserCustomStatus = {\n emoji: emoji || 'speech_balloon',\n text: text.trim(),\n duration: duration === CUSTOM_DATE_TIME ? DATE_AND_TIME : duration,\n };\n if (expiresAt) {\n customStatus.expires_at = expiresAt;\n }\n dispatch(setCustomStatus(customStatus));\n dispatch(closeModal(ModalIdentifiers.CUSTOM_STATUS));\n };\n\n const handleEnterKeyPressed = useCallback(() => {\n if (!isInteracting) {\n handleSetStatus();\n }\n }, [isInteracting, handleSetStatus]);\n\n const calculateExpiryTime = (): string => {\n switch (duration) {\n case DONT_CLEAR:\n return '';\n case THIRTY_MINUTES:\n return moment().add(30, 'minutes').seconds(0).milliseconds(0).toISOString();\n case ONE_HOUR:\n return moment().add(1, 'hour').seconds(0).milliseconds(0).toISOString();\n case FOUR_HOURS:\n return moment().add(4, 'hours').seconds(0).milliseconds(0).toISOString();\n case TODAY:\n return moment().endOf('day').add(1, 'minute').seconds(0).milliseconds(0).toISOString();\n case THIS_WEEK:\n return moment().endOf('week').toISOString();\n case DATE_AND_TIME:\n case CUSTOM_DATE_TIME:\n return customExpiryTime.toISOString();\n default:\n return '';\n }\n };\n\n const handleClearStatus = isCurrentCustomStatusSet ? () => dispatch(unsetCustomStatus()) : undefined;\n\n const getCustomStatusControlRef = () => customStatusControlRef.current;\n\n const handleEmojiClose = () => {\n setShowEmojiPicker(false);\n if (emojiButtonRef.current) {\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: emojiButtonRef.current as HTMLElement,\n keyboardOnly: true,\n },\n },\n ));\n }\n };\n\n const handleEmojiExited = () => {\n if (emojiButtonRef.current) {\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: emojiButtonRef.current as HTMLElement,\n keyboardOnly: true,\n },\n },\n ));\n }\n };\n\n const handleEmojiClick = (selectedEmoji: Emoji) => {\n setShowEmojiPicker(false);\n const emojiName = ('short_name' in selectedEmoji) ? selectedEmoji.short_name : selectedEmoji.name;\n setEmoji(emojiName);\n if (emojiButtonRef.current) {\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: emojiButtonRef.current as HTMLElement,\n keyboardOnly: true,\n },\n },\n ));\n }\n };\n\n const toggleEmojiPicker = (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {\n e?.stopPropagation();\n setShowEmojiPicker((prevShow) => !prevShow);\n };\n\n const handleTextChange = (event: React.ChangeEvent<HTMLInputElement>) => setText(event.target.value);\n\n const handleRecentCustomStatusClear = (status: UserCustomStatus) => dispatch(removeRecentCustomStatus(status));\n\n const customStatusEmoji = emoji || text ? (\n <RenderEmoji\n emojiName={emoji || 'speech_balloon'}\n size={20}\n />\n ) : <EmojiIcon className={'icon icon--emoji'}/>;\n\n const clearHandle = () => {\n setEmoji('');\n setText('');\n setDuration(defaultDuration);\n };\n\n const handleSuggestionClick = (status: UserCustomStatus) => {\n setEmoji(status.emoji);\n setText(status.text);\n setDuration(status.duration || DONT_CLEAR);\n };\n\n const calculateRightOffSet = () => {\n let rightOffset = Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n const target = getCustomStatusControlRef();\n if (target) {\n rightOffset = window.innerWidth - target.getBoundingClientRect().left - EMOJI_PICKER_WIDTH_OFFSET;\n if (rightOffset < 0) {\n rightOffset = Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n }\n }\n\n return rightOffset;\n };\n\n const recentStatuses = (\n <div id='statusSuggestion__recents'>\n <div className='statusSuggestion__title'>\n {formatMessage({id: 'custom_status.suggestions.recent_title', defaultMessage: 'RECENT'})}\n </div>\n {\n recentCustomStatuses.map((status: UserCustomStatus) => (\n <CustomStatusSuggestion\n key={status.text}\n handleSuggestionClick={handleSuggestionClick}\n handleClear={handleRecentCustomStatusClear}\n status={status}\n />\n ))\n }\n </div>\n );\n\n const renderCustomStatusSuggestions = () => {\n const recentCustomStatusTexts = recentCustomStatuses.map((status: UserCustomStatus) => status.text);\n const customStatusSuggestions = defaultCustomStatusSuggestions.\n map((status) => ({\n emoji: status.emoji,\n text: formatMessage(status.message),\n duration: status.duration,\n })).\n filter((status: UserCustomStatus) => !recentCustomStatusTexts.includes(status.text)).\n map((status: UserCustomStatus, index: number) => (\n <CustomStatusSuggestion\n key={index}\n handleSuggestionClick={handleSuggestionClick}\n status={status}\n />\n ));\n\n if (customStatusSuggestions.length <= 0) {\n return null;\n }\n\n return (\n <>\n <div className='statusSuggestion__title'>\n {formatMessage({id: 'custom_status.suggestions.title', defaultMessage: 'SUGGESTIONS'})}\n </div>\n {customStatusSuggestions}\n </>\n );\n };\n\n const areEmojiAndTextSame = currentCustomStatus?.emoji === emoji && currentCustomStatus?.text === text;\n const areSelectedAndSetStatusSame = areEmojiAndTextSame && duration === currentCustomStatus?.duration;\n\n const showSuggestions = !isStatusSet || areSelectedAndSetStatusSame;\n\n const disableSetStatus = !isStatusSet || text.length > CUSTOM_STATUS_TEXT_CHARACTER_LIMIT;\n\n const showDateAndTimeField = !showSuggestions && (duration === CUSTOM_DATE_TIME || duration === DATE_AND_TIME);\n\n const suggestion = (\n <div\n className='statusSuggestion'\n style={{marginTop: isStatusSet ? 44 : 8}}\n >\n <div className='statusSuggestion__content'>\n {recentCustomStatuses.length > 0 && recentStatuses}\n <div id='statusSuggestion__suggestions'>\n {renderCustomStatusSuggestions()}\n </div>\n </div>\n </div>\n );\n\n return (\n <GenericModal\n enforceFocus={false}\n onExited={props.onExited}\n compassDesign={true}\n modalHeaderText={\n <FormattedMessage\n id='custom_status.set_status'\n defaultMessage='Set a status'\n />\n }\n confirmButtonText={\n <FormattedMessage\n id='custom_status.modal_confirm'\n defaultMessage='Set Status'\n />\n }\n cancelButtonText={\n <FormattedMessage\n id='custom_status.modal_cancel'\n defaultMessage='Clear Status'\n />\n }\n isConfirmDisabled={disableSetStatus}\n id='custom_status_modal'\n className={'StatusModal'}\n handleConfirm={handleSetStatus}\n handleEnterKeyPress={handleEnterKeyPressed}\n handleCancel={handleClearStatus}\n confirmButtonClassName='btn btn-primary'\n ariaLabel={formatMessage({id: 'custom_status.set_status', defaultMessage: 'Set a status'})}\n keyboardEscape={false}\n tabIndex={-1}\n autoCloseOnConfirmButton={false}\n >\n <div className='StatusModal__body'>\n <div className='StatusModal__input'>\n <div\n ref={customStatusControlRef}\n className='StatusModal__emoji-container'\n >\n {showEmojiPicker && (\n <EmojiPickerOverlay\n target={getCustomStatusControlRef}\n show={showEmojiPicker}\n onHide={handleEmojiClose}\n onEmojiClick={handleEmojiClick}\n rightOffset={calculateRightOffSet()}\n leftOffset={3}\n topOffset={3}\n defaultHorizontalPosition='right'\n onExited={handleEmojiExited}\n />\n )}\n <button\n type='button'\n onClick={toggleEmojiPicker}\n ref={emojiButtonRef}\n aria-label={formatMessage({id: 'emoji_picker.emojiPicker.button.ariaLabel', defaultMessage: 'select an emoji'})}\n className={classNames('emoji-picker__container', 'StatusModal__emoji-button', {\n 'StatusModal__emoji-button--active': showEmojiPicker,\n })}\n >\n {customStatusEmoji}\n </button>\n </div>\n <QuickInput\n inputComponent={MaxLengthInput}\n value={text}\n maxLength={CUSTOM_STATUS_TEXT_CHARACTER_LIMIT}\n clearableWithoutValue={Boolean(isStatusSet)}\n onClear={clearHandle}\n className='emoji-quick-input form-control'\n clearClassName='StatusModal__clear-container'\n onChange={handleTextChange}\n placeholder={formatMessage({id: 'custom_status.set_status', defaultMessage: 'Set a status'})}\n autoFocus={true}\n />\n </div>\n {isStatusSet && (\n <ExpiryMenu\n duration={duration}\n expiryTime={showSuggestions ? currentCustomStatus?.expires_at : undefined}\n handleDurationChange={setDuration}\n />\n )}\n {showSuggestions && suggestion}\n {showDateAndTimeField && (\n <DateTimeInput\n time={customExpiryTime}\n handleChange={setCustomExpiryTime}\n timezone={timezone}\n setIsInteracting={setIsInteracting}\n />\n )}\n </div>\n </GenericModal >\n );\n};\n\nexport default CustomStatusModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {isCustomStatusEnabled} from 'selectors/views/custom_status';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport type {GlobalState} from 'types/store';\n\ninterface ComponentProps {\n text: string;\n className?: string;\n}\n\nconst CustomStatusText = (props: ComponentProps) => {\n const {text, className} = props;\n const customStatusEnabled = useSelector((state: GlobalState) => {\n return isCustomStatusEnabled(state);\n });\n const [show, setShow] = useState<boolean>(false);\n let spanElement: HTMLSpanElement | null = null;\n if (!customStatusEnabled) {\n return null;\n }\n\n const showTooltip = () => {\n setShow(Boolean(spanElement && spanElement.offsetWidth < spanElement.scrollWidth));\n };\n\n const customStatusTextComponent = (\n <span\n className={`overflow--ellipsis text-nowrap ${className}`}\n ref={(element) => {\n spanElement = element;\n showTooltip();\n }}\n >\n {text}\n </span>\n );\n\n if (!show) {\n return customStatusTextComponent;\n }\n\n return (\n <WithTooltip\n title={text}\n >\n {customStatusTextComponent}\n </WithTooltip>\n );\n};\n\nCustomStatusText.defaultProps = {\n text: '',\n className: '',\n};\n\nexport default CustomStatusText;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport {DateTime} from 'luxon';\nimport type {Moment} from 'moment-timezone';\nimport moment from 'moment-timezone';\nimport React, {useEffect, useState, useCallback, useRef} from 'react';\nimport type {DayModifiers, DayPickerProps} from 'react-day-picker';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button'; // eslint-disable-line no-restricted-imports\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport CompassThemeProvider from 'components/compass_theme_provider/compass_theme_provider';\nimport DatePicker from 'components/date_picker';\nimport Timestamp from 'components/timestamp';\nimport Input from 'components/widgets/inputs/input/input';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport type {A11yFocusEventDetail} from 'utils/constants';\nimport Constants, {A11yCustomEventTypes} from 'utils/constants';\nimport {relativeFormatDate} from 'utils/datetime';\nimport {isKeyPressed} from 'utils/keyboard';\nimport {getCurrentMomentForTimezone, isBeforeTime} from 'utils/timezone';\n\nconst CUSTOM_STATUS_TIME_PICKER_INTERVALS_IN_MINUTES = 30;\n\nexport function getRoundedTime(value: Moment, roundedTo = CUSTOM_STATUS_TIME_PICKER_INTERVALS_IN_MINUTES) {\n const start = moment(value);\n const diff = start.minute() % roundedTo;\n if (diff === 0) {\n return value;\n }\n const remainder = roundedTo - diff;\n return start.add(remainder, 'm').seconds(0).milliseconds(0);\n}\n\nexport const getTimeInIntervals = (startTime: Moment, interval = CUSTOM_STATUS_TIME_PICKER_INTERVALS_IN_MINUTES): Date[] => {\n let time = moment(startTime);\n const nextDay = moment(startTime).add(1, 'days').startOf('day');\n\n const intervals: Date[] = [];\n while (time.isBefore(nextDay)) {\n intervals.push(time.toDate());\n const utcOffset = time.utcOffset();\n time = time.add(interval, 'minutes').seconds(0).milliseconds(0);\n\n // Account for DST end if needed to avoid displaying duplicates\n if (utcOffset > time.utcOffset()) {\n time = time.add(utcOffset - time.utcOffset(), 'minutes').seconds(0).milliseconds(0);\n }\n }\n\n return intervals;\n};\n\ntype Props = {\n time: Moment;\n handleChange: (date: Moment) => void;\n timezone?: string;\n setIsInteracting?: (interacting: boolean) => void;\n relativeDate?: boolean;\n timePickerInterval?: number;\n}\n\nconst DateTimeInputContainer: React.FC<Props> = ({\n time,\n handleChange,\n timezone,\n setIsInteracting,\n relativeDate,\n timePickerInterval,\n}: Props) => {\n const locale = useSelector(getCurrentLocale);\n const [timeOptions, setTimeOptions] = useState<Date[]>([]);\n const [isPopperOpen, setIsPopperOpen] = useState(false);\n const {formatMessage} = useIntl();\n const timeButtonRef = useRef<HTMLButtonElement>(null);\n const theme = useSelector(getTheme);\n\n const handlePopperOpenState = useCallback((isOpen: boolean) => {\n setIsPopperOpen(isOpen);\n setIsInteracting?.(isOpen);\n }, [setIsInteracting]);\n\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n if (isKeyPressed(event, Constants.KeyCodes.ESCAPE) && isPopperOpen) {\n handlePopperOpenState(false);\n }\n }, [isPopperOpen, handlePopperOpenState]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n const setTimeAndOptions = () => {\n const currentTime = getCurrentMomentForTimezone(timezone);\n let startTime = moment(time).startOf('day');\n if (currentTime.isSame(time, 'date')) {\n startTime = getRoundedTime(currentTime, timePickerInterval);\n }\n setTimeOptions(getTimeInIntervals(startTime, timePickerInterval));\n };\n\n useEffect(setTimeAndOptions, [time]);\n\n const handleDayChange = (day: Date, modifiers: DayModifiers) => {\n if (modifiers.today) {\n const baseTime = getCurrentMomentForTimezone(timezone);\n if (isBeforeTime(baseTime, time)) {\n baseTime.hour(time.hours());\n baseTime.minute(time.minutes());\n }\n const roundedTime = getRoundedTime(baseTime, timePickerInterval);\n handleChange(roundedTime);\n } else {\n day.setHours(time.hour(), time.minute());\n const dayWithTimezone = timezone ? moment(day).tz(timezone, true) : moment(day);\n handleChange(dayWithTimezone);\n }\n handlePopperOpenState(false);\n };\n\n const handleTimeChange = useCallback((time: Date, e: React.MouseEvent) => {\n e.preventDefault();\n handleChange(timezone ? moment.tz(time, timezone) : moment(time));\n focusTimeButton();\n }, [handleChange]);\n\n const currentTime = getCurrentMomentForTimezone(timezone).toDate();\n\n const focusTimeButton = useCallback(() => {\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: timeButtonRef.current,\n keyboardOnly: true,\n },\n },\n ));\n }, []);\n\n const formatDate = (date: Moment): string => {\n return relativeDate ? relativeFormatDate(date, formatMessage) : DateTime.fromJSDate(date.toDate()).toLocaleString();\n };\n\n const inputIcon = (\n <IconButton\n onClick={() => handlePopperOpenState(true)}\n icon={'calendar-outline'}\n className='dateTime__calendar-icon'\n size={'sm'}\n aria-haspopup='grid'\n />\n );\n\n const datePickerProps: DayPickerProps = {\n initialFocus: isPopperOpen,\n mode: 'single',\n selected: time.toDate(),\n defaultMonth: time.toDate(),\n onDayClick: handleDayChange,\n disabled: [{\n before: currentTime,\n }],\n showOutsideDays: true,\n };\n\n return (\n <CompassThemeProvider theme={theme}>\n <div className='dateTime'>\n <div className='dateTime__date'>\n <DatePicker\n isPopperOpen={isPopperOpen}\n handlePopperOpenState={handlePopperOpenState}\n locale={locale}\n datePickerProps={datePickerProps}\n >\n <Input\n value={formatDate(time)}\n id='customStatus__calendar-input'\n readOnly={true}\n className={classNames('dateTime__calendar-input', {isOpen: isPopperOpen})}\n label={formatMessage({id: 'dnd_custom_time_picker_modal.date', defaultMessage: 'Date'})}\n onClick={() => handlePopperOpenState(true)}\n tabIndex={-1}\n inputPrefix={inputIcon}\n />\n </DatePicker>\n </div>\n <div className='dateTime__time'>\n <MenuWrapper\n className='dateTime__time-menu'\n onToggle={setIsInteracting}\n >\n <button\n className='style--none'\n ref={timeButtonRef}\n >\n <span className='dateTime__input-title'>{formatMessage({id: 'custom_status.expiry.time_picker.title', defaultMessage: 'Time'})}</span>\n <span className='dateTime__time-icon'>\n <i className='icon-clock-outline'/>\n </span>\n <div\n className='dateTime__input'\n >\n <Timestamp\n useRelative={false}\n useDate={false}\n value={time.toString()}\n />\n </div>\n </button>\n <Menu\n ariaLabel={formatMessage({id: 'time_dropdown.choose_time', defaultMessage: 'Choose a time'})}\n id='expiryTimeMenu'\n >\n <Menu.Group>\n {Array.isArray(timeOptions) && timeOptions.map((option, index) => (\n <Menu.ItemAction\n onClick={handleTimeChange.bind(this, option)}\n key={index}\n text={\n <Timestamp\n useRelative={false}\n useDate={false}\n value={option}\n />\n }\n />\n ))}\n </Menu.Group>\n </Menu>\n </MenuWrapper>\n </div>\n </div>\n </CompassThemeProvider>\n );\n};\n\nexport default DateTimeInputContainer;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment-timezone';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport type {Props as TimestampProps} from 'components/timestamp/timestamp';\n\nimport {getCurrentMomentForTimezone} from 'utils/timezone';\n\nconst CUSTOM_STATUS_EXPIRY_RANGES = [\n RelativeRanges.TODAY_TITLE_CASE,\n RelativeRanges.TOMORROW_TITLE_CASE,\n];\n\ninterface Props {\n time: string;\n timezone?: string;\n className?: string;\n showPrefix?: boolean;\n withinBrackets?: boolean;\n}\n\nconst ExpiryTime = ({time, timezone, className, showPrefix, withinBrackets}: Props) => {\n const currentMomentTime = getCurrentMomentForTimezone(timezone);\n const timestampProps: Partial<TimestampProps> = {\n value: time,\n ranges: CUSTOM_STATUS_EXPIRY_RANGES,\n };\n\n if (moment(time).isSame(currentMomentTime.clone().endOf('day')) || moment(time).isAfter(currentMomentTime.clone().add(1, 'day').endOf('day'))) {\n timestampProps.useTime = false;\n }\n\n if (moment(time).isBefore(currentMomentTime.clone().endOf('day'))) {\n timestampProps.useDate = false;\n delete timestampProps.ranges;\n }\n\n if (moment(time).isAfter(currentMomentTime.clone().add(1, 'day').endOf('day')) && moment(time).isBefore(currentMomentTime.clone().add(6, 'days'))) {\n timestampProps.useDate = {weekday: 'long'};\n }\n\n if (moment(time).isAfter(currentMomentTime.clone().add(6, 'days'))) {\n timestampProps.month = 'short';\n }\n\n if (moment(time).isAfter(currentMomentTime.clone().endOf('year'))) {\n timestampProps.year = 'numeric';\n }\n\n const prefix = showPrefix && (\n <>\n <FormattedMessage\n id='custom_status.expiry.until'\n defaultMessage='Until {time}'\n values={{time: ''}}\n />{' '}\n </>\n );\n\n return (\n <span className={className}>\n {withinBrackets && '('}\n {prefix}\n <Timestamp\n {...timestampProps}\n />\n {withinBrackets && ')'}\n </span>\n );\n};\n\nExpiryTime.defaultProps = {\n showPrefix: true,\n withinBrackets: false,\n};\n\nexport default React.memo(ExpiryTime);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n useInteractions,\n FloatingFocusManager,\n useDismiss,\n} from '@floating-ui/react';\nimport type {Locale} from 'date-fns';\nimport React, {useCallback, useEffect, useState} from 'react';\nimport {DayPicker} from 'react-day-picker';\nimport type {DayPickerProps} from 'react-day-picker';\n\nimport {getDatePickerLocalesForDateFns} from 'utils/utils';\n\nimport 'react-day-picker/dist/style.css';\nimport './date_picker.scss';\n\ntype Props = {\n children: React.ReactNode;\n datePickerProps: DayPickerProps;\n isPopperOpen: boolean;\n locale: string;\n handlePopperOpenState: (isOpen: boolean) => void;\n}\n\nconst DatePicker = ({children, datePickerProps, isPopperOpen, handlePopperOpenState, locale}: Props) => {\n const [loadedLocales, setLoadedLocales] = useState<Record<string, Locale>>({});\n const {x, y, strategy, context, refs: {setReference, setFloating}} = useFloating({\n open: isPopperOpen,\n onOpenChange: () => handlePopperOpenState(false),\n placement: 'bottom-start',\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(5),\n flip({fallbackPlacements: ['bottom-end', 'top-start', 'top-end', 'right-start', 'left-start'], padding: 5}),\n shift(),\n ],\n });\n\n const {getReferenceProps, getFloatingProps} = useInteractions([\n useDismiss(context, {\n enabled: true,\n outsidePress: true,\n }),\n ]);\n\n useEffect(() => {\n setLoadedLocales(getDatePickerLocalesForDateFns(locale, loadedLocales));\n }, [loadedLocales, locale]);\n\n const iconLeft = useCallback(() => {\n return (\n <i className='icon icon-chevron-left'/>\n );\n }, []);\n\n const iconRight = useCallback(() => {\n return (\n <i className='icon icon-chevron-right'/>\n );\n }, []);\n\n return (\n <div>\n <div\n ref={setReference}\n {...getReferenceProps()}\n >\n {children}\n </div>\n {isPopperOpen && (\n <FloatingFocusManager\n context={context}\n modal={true}\n initialFocus={-1}\n >\n <div\n ref={setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n width: 'auto',\n zIndex: 999,\n }}\n {...getFloatingProps()}\n >\n <DayPicker\n {...datePickerProps}\n className='date-picker__popper'\n locale={loadedLocales[locale]}\n components={{\n IconRight: iconRight,\n IconLeft: iconLeft,\n }}\n />\n </div>\n\n </FloatingFocusManager>\n )}\n </div>\n );\n};\n\nexport default DatePicker;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classnames from 'classnames';\nimport type {Moment} from 'moment-timezone';\nimport React, {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\n\nimport DateTimeInput, {getRoundedTime} from 'components/custom_status/date_time_input';\n\nimport Constants from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\nimport {getCurrentMomentForTimezone} from 'utils/timezone';\n\nimport './style.scss';\n\ntype Props = {\n onExited?: () => void;\n ariaLabel: string;\n header: React.ReactNode;\n subheading?: React.ReactNode;\n onChange?: (dateTime: Moment) => void;\n onCancel?: () => void;\n onConfirm?: (dateTime: Moment) => void;\n initialTime?: Moment;\n confirmButtonText?: React.ReactNode;\n cancelButtonText?: React.ReactNode;\n bodyPrefix?: React.ReactNode;\n bodySuffix?: React.ReactNode;\n relativeDate?: boolean;\n className?: string;\n errorText?: string | React.ReactNode;\n timePickerInterval?: number;\n};\n\nexport default function DateTimePickerModal({\n onExited,\n ariaLabel,\n header,\n onConfirm,\n onCancel,\n initialTime,\n confirmButtonText,\n onChange,\n cancelButtonText,\n subheading,\n bodyPrefix,\n bodySuffix,\n relativeDate,\n className,\n errorText,\n timePickerInterval,\n}: Props) {\n const userTimezone = useSelector(getCurrentTimezone);\n const currentTime = getCurrentMomentForTimezone(userTimezone);\n const initialRoundedTime = getRoundedTime(currentTime);\n\n const [dateTime, setDateTime] = useState(initialTime || initialRoundedTime);\n\n const [isInteracting, setIsInteracting] = useState(false);\n\n useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if (isKeyPressed(event, Constants.KeyCodes.ESCAPE) && !isInteracting) {\n event.preventDefault();\n event.stopPropagation();\n onExited?.();\n }\n }\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isInteracting, onExited]);\n\n const handleChange = useCallback((dateTime: Moment) => {\n setDateTime(dateTime);\n onChange?.(dateTime);\n }, [onChange]);\n\n const handleConfirm = useCallback(() => {\n onConfirm?.(dateTime);\n }, [dateTime, onConfirm]);\n\n const handleEnterKeyPress = useCallback(() => {\n if (!isInteracting) {\n handleConfirm();\n }\n }, [handleConfirm, isInteracting]);\n\n return (\n <GenericModal\n id='DateTimePickerModal'\n ariaLabel={ariaLabel}\n onExited={onExited}\n modalHeaderText={header}\n modalSubheaderText={subheading}\n confirmButtonText={confirmButtonText}\n handleConfirm={handleConfirm}\n handleCancel={onCancel}\n handleEnterKeyPress={handleEnterKeyPress}\n className={classnames('date-time-picker-modal', className)}\n compassDesign={true}\n keyboardEscape={false}\n cancelButtonText={cancelButtonText}\n autoCloseOnConfirmButton={false}\n errorText={errorText}\n >\n {bodyPrefix}\n\n <DateTimeInput\n time={dateTime}\n handleChange={handleChange}\n timezone={userTimezone}\n setIsInteracting={setIsInteracting}\n relativeDate={relativeDate}\n timePickerInterval={timePickerInterval}\n />\n\n {bodySuffix}\n </GenericModal>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport hoistStatics from 'hoist-non-react-statics';\nimport React from 'react';\n\ntype DeferredRenderWrapperState = {\n shouldRender: boolean;\n}\n\n/**\n * Allows two animation frames to complete to allow other components to update\n * and re-render before mounting and rendering an expensive `WrappedComponent`.\n * If provided, `PreRenderComponent` will be rendered instead of null when not\n * rendering the `Wrapped Component`.\n *\n * Based on this Twitter built component\n * https://gist.github.com/paularmstrong/cc2ead7e2a0dec37d8b2096fc8d85759#file-defercomponentrender-js\n */\nexport default function deferComponentRender<ComponentProps>(WrappedComponent: React.ComponentType<ComponentProps>, PreRenderComponent: React.ReactNode = null) {\n class DeferredRenderWrapper extends React.PureComponent<ComponentProps, DeferredRenderWrapperState> {\n mounted = false;\n constructor(props: ComponentProps) {\n super(props);\n\n this.state = {\n shouldRender: false,\n };\n }\n\n componentDidMount() {\n this.mounted = true;\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n if (this.mounted) {\n this.setState({shouldRender: true});\n }\n });\n });\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n render() {\n return this.state.shouldRender ? <WrappedComponent {...this.props}/> : PreRenderComponent;\n }\n }\n\n return hoistStatics(DeferredRenderWrapper, WrappedComponent);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {matchPath} from 'react-router-dom';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport SectionNotice from 'components/section_notice';\n\nimport {getHistory} from 'utils/browser_history';\nimport * as UserAgent from 'utils/user_agent';\n\nconst urlFormatForDMGMPermalink = '/:teamName/messages/:username/:postid';\nconst urlFormatForChannelPermalink = '/:teamName/channels/:channelname/:postid';\n\ntype Props = {\n channelName?: string;\n teamName?: string;\n post: Post;\n commentCount: number;\n isRHS: boolean;\n onExited: () => void;\n actions: {\n deleteAndRemovePost: (post: Post) => Promise<ActionResult<boolean>>;\n };\n location: {\n pathname: string;\n };\n}\n\ntype State = {\n show: boolean;\n}\n\nexport default class DeletePostModal extends React.PureComponent<Props, State> {\n deletePostBtn: React.RefObject<HTMLButtonElement>;\n\n constructor(props: Props) {\n super(props);\n this.deletePostBtn = React.createRef();\n\n this.state = {\n show: true,\n };\n }\n\n handleDelete = async () => {\n const {\n actions,\n post,\n } = this.props;\n\n let permalinkPostId = '';\n\n const result = await actions.deleteAndRemovePost(post);\n\n const matchUrlForDMGM = matchPath<{postid: string}>(this.props.location.pathname, {\n path: urlFormatForDMGMPermalink,\n });\n\n const matchUrlForChannel = matchPath<{postid: string}>(this.props.location.pathname, {\n path: urlFormatForChannelPermalink,\n });\n\n if (matchUrlForDMGM) {\n permalinkPostId = matchUrlForDMGM.params.postid;\n } else if (matchUrlForChannel) {\n permalinkPostId = matchUrlForChannel.params.postid;\n }\n\n if (permalinkPostId === post.id) {\n const channelUrl = this.props.location.pathname.split('/').slice(0, -1).join('/');\n getHistory().replace(channelUrl);\n }\n\n if (result.data) {\n this.onHide();\n }\n };\n\n handleEntered = () => {\n this.deletePostBtn?.current?.focus();\n };\n\n onHide = () => {\n this.setState({show: false});\n\n if (!UserAgent.isMobile()) {\n let element;\n if (this.props.isRHS) {\n element = document.getElementById('reply_textbox');\n } else {\n element = document.getElementById('post_textbox');\n }\n if (element) {\n element.focus();\n }\n }\n };\n\n getTitle = () => {\n return this.props.post.root_id ? (\n <FormattedMessage\n id='delete_post.confirm_comment'\n defaultMessage='Confirm Comment Delete'\n />\n ) : (\n <FormattedMessage\n id='delete_post.confirm_post'\n defaultMessage='Confirm Post Delete'\n />\n );\n };\n\n getPrompt = () => {\n return this.props.post.root_id ? (\n <FormattedMessage\n id='delete_post.question_comment'\n defaultMessage='Are you sure you want to delete this comment?'\n tagName='p'\n />\n ) : (\n <FormattedMessage\n id='delete_post.question_post'\n defaultMessage='Are you sure you want to delete this message?'\n tagName='p'\n />\n );\n };\n\n render() {\n let commentWarning: React.ReactNode = '';\n let remoteWarning: React.ReactNode = '';\n\n if (this.props.commentCount > 0 && this.props.post.root_id === '') {\n commentWarning = (\n <FormattedMessage\n id='delete_post.warning'\n defaultMessage='This message has {count, number} {count, plural, one {comment} other {comments}} on it.'\n values={{\n count: this.props.commentCount,\n }}\n tagName='p'\n />\n );\n }\n\n if (this.props.post.remote_id) {\n remoteWarning = <SharedChannelPostDeleteWarning post={this.props.post}/>;\n }\n\n return (\n <Modal\n dialogClassName='a11y__modal'\n show={this.state.show}\n onEntered={this.handleEntered}\n onHide={this.onHide}\n onExited={this.props.onExited}\n id='deletePostModal'\n role='none'\n aria-labelledby='deletePostModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='deletePostModalLabel'\n >\n {this.getTitle()}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {this.getPrompt()}\n {commentWarning}\n {remoteWarning}\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.onHide}\n >\n <FormattedMessage\n id='delete_post.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <button\n ref={this.deletePostBtn}\n type='button'\n autoFocus={true}\n className='btn btn-danger'\n onClick={this.handleDelete}\n id='deletePostModalButton'\n >\n <FormattedMessage\n id='delete_post.del'\n defaultMessage='Delete'\n />\n </button>\n </Modal.Footer>\n </Modal>\n );\n }\n}\n\nconst SharedChannelPostDeleteWarning = ({post}: {post: Post}) => {\n const {formatMessage} = useIntl();\n\n const text = post.root_id ? (\n formatMessage({\n id: 'delete_post.shared_channel_warning.message_comment',\n defaultMessage: 'This comment originated from a shared channel in another workspace. Deleting it here won\\'t remove it from the channel in the other workspace.',\n })\n ) : (\n formatMessage({\n id: 'delete_post.shared_channel_warning.message_post',\n defaultMessage: 'This message originated from a shared channel in another workspace. Deleting it here won\\'t remove it from the channel in the other workspace.',\n })\n );\n\n return (\n <SectionNotice\n type='warning'\n title={formatMessage({\n id: 'delete_post.shared_channel_warning.title',\n defaultMessage: 'Shared Channel',\n })}\n text={text}\n />\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {makeGetCommentCountForPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport {deleteAndRemovePost} from 'actions/post_actions';\n\nimport type {GlobalState} from 'types/store';\n\nimport DeletePostModal from './delete_post_modal';\n\ntype Props = {\n channelName?: string;\n teamName?: string;\n post: Post;\n commentCount: number;\n isRHS: boolean;\n onHide: () => void;\n actions: {\n deleteAndRemovePost: (post: Post) => Promise<{data: boolean}>;\n };\n location: {\n pathname: string;\n };\n}\n\nfunction makeMapStateToProps() {\n const getReplyCount = makeGetCommentCountForPost();\n\n return (state: GlobalState, ownProps: Props) => {\n const post = ownProps.post;\n\n return {\n commentCount: getReplyCount(state, post),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n deleteAndRemovePost,\n }, dispatch),\n };\n}\n\nexport default withRouter(connect<any, any, any>(makeMapStateToProps, mapDispatchToProps)(DeletePostModal));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport cn from 'classnames';\nimport React, {useMemo} from 'react';\nimport type {ComponentProps} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {SyncIcon} from '@mattermost/compass-icons/components';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport Tag from 'components/widgets/tag/tag';\nimport WithTooltip from 'components/with_tooltip';\n\nimport './panel_header.scss';\nimport {isToday} from 'utils/datetime';\n\nconst TIMESTAMP_PROPS: Partial<ComponentProps<typeof Timestamp>> = {\n day: 'numeric',\n useSemanticOutput: false,\n useTime: false,\n units: ['now', 'minute', 'hour', 'day', 'week', 'month', 'year'],\n};\n\nexport const SCHEDULED_POST_TIME_RANGES = [\n RelativeRanges.TODAY_TITLE_CASE,\n RelativeRanges.YESTERDAY_TITLE_CASE,\n RelativeRanges.TOMORROW_TITLE_CASE,\n];\n\nexport const scheduledPostTimeFormat: ComponentProps<typeof Timestamp>['useTime'] = (_, {hour, minute}) => ({hour, minute});\n\ntype Props = {\n kind: 'draft' | 'scheduledPost';\n actions: React.ReactNode;\n hover: boolean;\n timestamp: number;\n remote: boolean;\n title: React.ReactNode;\n error?: string;\n};\n\nfunction PanelHeader({\n kind,\n actions,\n hover,\n timestamp,\n remote,\n title,\n error,\n}: Props) {\n const timestampDateObject = useMemo(() => new Date(timestamp), [timestamp]);\n\n return (\n <header className='PanelHeader'>\n <div className='PanelHeader__left'>{title}</div>\n <div className='PanelHeader__right'>\n <div className={cn('PanelHeader__actions', {show: hover})}>\n {actions}\n </div>\n <div className={cn('PanelHeader__info', {hide: hover})}>\n {remote && (\n <div className='PanelHeader__sync-icon'>\n <WithTooltip\n title={\n <FormattedMessage\n id='drafts.info.sync'\n defaultMessage='Updated from another device'\n />\n }\n >\n <SyncIcon size={18}/>\n </WithTooltip>\n </div>\n )}\n <div className='PanelHeader__timestamp'>\n {\n Boolean(timestamp) && kind === 'draft' && (\n <Timestamp\n value={new Date(timestamp)}\n {...TIMESTAMP_PROPS}\n />\n )\n }\n\n {\n Boolean(timestamp) && kind === 'scheduledPost' && (\n <FormattedMessage\n id='scheduled_post.panel.header.time'\n defaultMessage='Send {isTodayOrTomorrow, select, true {} other {on}} {scheduledDateTime}'\n values={{\n scheduledDateTime: (\n <Timestamp\n value={timestamp}\n ranges={SCHEDULED_POST_TIME_RANGES}\n useSemanticOutput={false}\n useTime={scheduledPostTimeFormat}\n />\n ),\n isTodayOrTomorrow: isToday(timestampDateObject),\n }}\n />\n )\n }\n </div>\n\n {kind === 'draft' && !error && (\n <Tag\n variant={'danger'}\n uppercase={true}\n text={'draft'}\n />\n )}\n {error && (\n <Tag\n text={error}\n variant={'danger'}\n uppercase={true}\n icon={'alert-outline'}\n />\n )}\n </div>\n </div>\n </header>\n );\n}\n\nexport default PanelHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback, useRef, useState} from 'react';\nimport type {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\nimport ReactSelect, {components} from 'react-select';\nimport type {Props as SelectProps, ActionMeta} from 'react-select';\n\nimport InputError from 'components/input_error';\nimport type {CustomMessageInputType} from 'components/widgets/inputs/input/input';\n\nimport {ItemStatus} from 'utils/constants';\n\nimport './dropdown_input.scss';\n\n// TODO: This component needs work, should not be used outside of AddressInfo until this comment is removed.\n\nexport type ValueType = {\n label: string;\n value: string;\n}\n\ntype Props<T extends ValueType> = Omit<SelectProps<T>, 'onChange'> & {\n value?: T;\n legend?: string;\n error?: string;\n onChange: (value: T, action: ActionMeta<T>) => void;\n testId?: string;\n required?: boolean;\n};\n\nconst baseStyles = {\n input: (provided: CSSProperties) => ({\n ...provided,\n color: 'var(--center-channel-color)',\n }),\n control: (provided: CSSProperties) => ({\n ...provided,\n border: 'none',\n boxShadow: 'none',\n padding: '0 2px',\n cursor: 'pointer',\n }),\n indicatorSeparator: (provided: CSSProperties) => ({\n ...provided,\n display: 'none',\n }),\n menu: (provided: CSSProperties) => ({\n ...provided,\n zIndex: 100,\n }),\n menuPortal: (provided: CSSProperties) => ({\n ...provided,\n zIndex: 100,\n }),\n};\n\nconst IndicatorsContainer = (props: any) => {\n return (\n <div className='DropdownInput__indicatorsContainer'>\n <components.IndicatorsContainer {...props}>\n <i className='icon icon-chevron-down'/>\n </components.IndicatorsContainer>\n </div>\n );\n};\n\nconst Control = (props: any) => {\n return (\n <div className='DropdownInput__controlContainer'>\n <components.Control {...props}/>\n </div>\n );\n};\n\nconst Option = (props: any) => {\n return (\n <div\n className={classNames('DropdownInput__option', {\n selected: props.isSelected,\n focused: props.isFocused,\n })}\n >\n <components.Option {...props}/>\n </div>\n );\n};\n\nconst DropdownInput = <T extends ValueType>(props: Props<T>) => {\n const {value, placeholder, className, addon, name, textPrefix, legend, onChange, styles, options, error, testId, required, ...otherProps} = props;\n\n const [focused, setFocused] = useState(false);\n\n const onInputFocus = (event: React.FocusEvent<HTMLElement>) => {\n const {onFocus} = props;\n\n setFocused(true);\n\n if (onFocus) {\n onFocus(event);\n }\n };\n\n const {formatMessage} = useIntl();\n const [customInputLabel, setCustomInputLabel] = useState<CustomMessageInputType>(null);\n const ownValue = useRef<T>();\n\n const ownOnChange = useCallback((value: T, action: ActionMeta<T>) => {\n ownValue.current = value;\n onChange(value, action);\n }, [onChange]);\n\n const validateInput = useCallback(() => {\n if (!required || (ownValue.current !== null && ownValue.current)) {\n setCustomInputLabel(null);\n return;\n }\n\n const validationErrorMsg = formatMessage({id: 'widget.input.required', defaultMessage: 'This field is required'});\n setCustomInputLabel({type: ItemStatus.ERROR, value: validationErrorMsg});\n }, [required, formatMessage]);\n\n const onInputBlur = useCallback((event: React.FocusEvent<HTMLElement>) => {\n setFocused(false);\n validateInput();\n\n if (otherProps.onBlur) {\n otherProps.onBlur(event);\n }\n }, [otherProps.onBlur, validateInput]);\n\n const showLegend = Boolean(focused || value);\n const isError = error || customInputLabel?.type === 'error';\n\n return (\n <div\n className='DropdownInput Input_container'\n data-testid={testId || ''}\n >\n <fieldset\n className={classNames('Input_fieldset', className, {\n Input_fieldset___error: isError,\n Input_fieldset___legend: showLegend,\n })}\n >\n <legend className={classNames('Input_legend', {Input_legend___focus: showLegend})}>\n {showLegend ? (legend || placeholder) : null}\n </legend>\n <div\n className='Input_wrapper'\n onFocus={onInputFocus}\n onBlur={onInputBlur}\n >\n {textPrefix && <span>{textPrefix}</span>}\n <ReactSelect\n id={`DropdownInput_${name}`}\n options={options}\n placeholder={focused ? '' : placeholder}\n components={{\n IndicatorsContainer,\n Option,\n Control,\n }}\n className={classNames('Input', className, {Input__focus: showLegend})}\n classNamePrefix={'DropDown'}\n value={value}\n onChange={ownOnChange as any} // types are not working correctly for multiselect\n styles={{...baseStyles, ...styles}}\n {...otherProps}\n />\n </div>\n {addon}\n </fieldset>\n <InputError\n message={error}\n custom={customInputLabel}\n />\n </div>\n );\n};\n\nexport default DropdownInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ActionTypes} from 'utils/constants';\n\nexport function setShowPreviewOnCreateComment(showPreview) {\n return {\n type: ActionTypes.SET_SHOW_PREVIEW_ON_CREATE_COMMENT,\n showPreview,\n };\n}\n\nexport function setShowPreviewOnCreatePost(showPreview) {\n return {\n type: ActionTypes.SET_SHOW_PREVIEW_ON_CREATE_POST,\n showPreview,\n };\n}\n\nexport function setShowPreviewOnEditChannelHeaderModal(showPreview) {\n return {\n type: ActionTypes.SET_SHOW_PREVIEW_ON_EDIT_CHANNEL_HEADER_MODAL,\n showPreview,\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function showPreviewOnCreateComment(state: GlobalState) {\n return state.views.textbox.shouldShowPreviewOnCreateComment;\n}\n\nexport function showPreviewOnCreatePost(state: GlobalState) {\n return state.views.textbox.shouldShowPreviewOnCreatePost;\n}\n\nexport function showPreviewOnEditChannelHeaderModal(state: GlobalState) {\n return state.views.textbox.shouldShowPreviewOnEditChannelHeaderModal;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport type {WrappedComponentProps} from 'react-intl';\nimport {FormattedMessage, injectIntl} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport Textbox, {TextboxLinks} from 'components/textbox';\nimport type {TextboxElement} from 'components/textbox';\nimport type TextboxClass from 'components/textbox/textbox';\n\nimport Constants from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\nimport {isMobile} from 'utils/user_agent';\nimport {insertLineBreakFromKeyEvent, isUnhandledLineBreakKeyCombo} from 'utils/utils';\n\nimport type {PropsFromRedux} from './index';\n\nconst KeyCodes = Constants.KeyCodes;\n\nconst headerMaxLength = 1024;\n\ntype OwnProps = {\n\n /**\n * Called when the modal has been hidden and should be removed.\n */\n onExited: () => void;\n\n /*\n * Object with info about current channel ,\n */\n channel: Channel;\n};\n\ntype Props = OwnProps & PropsFromRedux & WrappedComponentProps;\n\ntype State = {\n header?: string;\n saving: boolean;\n show: boolean;\n serverError?: ServerError | null;\n postError?: React.ReactNode;\n}\n\nexport class EditChannelHeaderModal extends React.PureComponent<Props, State> {\n private editChannelHeaderTextboxRef: React.RefObject<TextboxClass>;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n header: props.channel.header,\n saving: false,\n show: true,\n };\n this.editChannelHeaderTextboxRef = React.createRef<TextboxClass>();\n }\n\n private handleModalKeyDown = (e: React.KeyboardEvent<Modal>): void => {\n if (isKeyPressed(e as unknown as React.KeyboardEvent, KeyCodes.ESCAPE)) {\n this.hideModal();\n }\n };\n\n private setShowPreview = (newState: boolean): void => {\n this.props.actions.setShowPreview(newState);\n };\n\n private handleChange = (e: React.ChangeEvent<TextboxElement>): void => {\n const isInvalidLength = e.target.value.length > headerMaxLength;\n if (isInvalidLength) {\n this.setState({\n header: e.target.value,\n serverError: {\n server_error_id: 'model.channel.is_valid.header.app_error',\n message: 'Invalid header length',\n },\n });\n } else {\n this.setState({\n header: e.target.value,\n serverError: null,\n });\n }\n };\n\n public handleSave = async (): Promise<void> => {\n const header = this.state.header?.trim() ?? '';\n if (header === this.props.channel.header) {\n this.hideModal();\n } else {\n this.setState({saving: true});\n const {channel, actions} = this.props;\n const {error} = await actions.patchChannel(channel.id!, {header});\n if (error) {\n this.setState({serverError: error, saving: false});\n } else {\n this.hideModal();\n }\n }\n };\n\n private hideModal = (): void => {\n this.setState({\n show: false,\n });\n };\n\n private focusTextbox = (): void => {\n if (this.editChannelHeaderTextboxRef.current) {\n this.editChannelHeaderTextboxRef.current.focus();\n }\n };\n\n private blurTextbox = (): void => {\n if (this.editChannelHeaderTextboxRef.current) {\n this.editChannelHeaderTextboxRef.current.blur();\n }\n };\n\n private handleEntering = (): void => {\n this.focusTextbox();\n };\n\n private handleKeyDown = (e: React.KeyboardEvent<Element>): void => {\n const {ctrlSend} = this.props;\n\n // listen for line break key combo and insert new line character\n if (isUnhandledLineBreakKeyCombo(e)) {\n this.setState({header: insertLineBreakFromKeyEvent(e.nativeEvent)});\n } else if (ctrlSend && isKeyPressed(e, KeyCodes.ENTER) && e.ctrlKey === true) {\n this.handleKeyPress(e);\n }\n };\n\n private handleKeyPress = (e: React.KeyboardEvent<Element>): void => {\n const {ctrlSend} = this.props;\n if (!isMobile() && ((ctrlSend && e.ctrlKey) || !ctrlSend)) {\n if (isKeyPressed(e, KeyCodes.ENTER) && !e.shiftKey && !e.altKey) {\n e.preventDefault();\n this.blurTextbox();\n this.handleSave();\n }\n }\n };\n\n private handlePostError = (postError: React.ReactNode) => {\n this.setState({postError});\n };\n\n private renderError = (): (JSX.Element | null) => {\n const {serverError} = this.state;\n if (!serverError) {\n return null;\n }\n\n let errorMsg;\n if (serverError.server_error_id === 'model.channel.is_valid.header.app_error') {\n errorMsg = (\n <FormattedMessage\n id='edit_channel_header_modal.error'\n defaultMessage='The text entered exceeds the character limit. The channel header is limited to {maxLength} characters.'\n values={{\n maxLength: headerMaxLength,\n }}\n />\n );\n } else {\n errorMsg = serverError.message;\n }\n\n return (\n <div className='form-group has-error'>\n <br/>\n <label className='control-label'>\n {errorMsg}\n </label>\n </div>\n );\n };\n\n public render(): JSX.Element {\n let headerTitle = null;\n if (this.props.channel.type === Constants.DM_CHANNEL) {\n headerTitle = (\n <FormattedMessage\n id='edit_channel_header_modal.title_dm'\n defaultMessage='Edit Header'\n />\n );\n } else {\n headerTitle = (\n <FormattedMessage\n id='edit_channel_header_modal.title'\n defaultMessage='Edit Header for {channel}'\n values={{\n channel: this.props.channel.display_name,\n }}\n />\n );\n }\n\n return (\n <Modal\n dialogClassName='a11y__modal'\n show={this.state.show}\n keyboard={false}\n onKeyDown={this.handleModalKeyDown}\n onHide={this.hideModal}\n onEntering={this.handleEntering}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='editChannelHeaderModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='editChannelHeaderModalLabel'\n >\n {headerTitle}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body bsClass='modal-body edit-modal-body'>\n <div>\n <label\n htmlFor='edit_textbox'\n className='textarea-label'\n >\n <FormattedMessage\n id='edit_channel_header_modal.description'\n defaultMessage='Edit the text appearing next to the channel name in the header.'\n />\n </label>\n <div className='textarea-wrapper'>\n <Textbox\n value={this.state.header!}\n onChange={this.handleChange}\n onKeyPress={this.handleKeyPress}\n onKeyDown={this.handleKeyDown}\n supportsCommands={false}\n suggestionListPosition='bottom'\n createMessage={this.props.intl.formatMessage({id: 'edit_channel_header_modal.placeholder', defaultMessage: 'Enter the Channel Header'})}\n handlePostError={this.handlePostError}\n channelId={this.props.channel.id!}\n id='edit_textbox'\n ref={this.editChannelHeaderTextboxRef}\n characterLimit={headerMaxLength}\n preview={this.props.shouldShowPreview}\n useChannelMentions={false}\n />\n </div>\n <div className='post-create-footer'>\n <TextboxLinks\n showPreview={this.props.shouldShowPreview}\n updatePreview={this.setShowPreview}\n hasText={this.state.header ? this.state.header.length > 0 : false}\n hasExceededCharacterLimit={this.state.header ? this.state.header.length > headerMaxLength : false}\n previewMessageLink={\n <FormattedMessage\n id='edit_channel_header_modal.previewHeader'\n defaultMessage='Edit'\n />\n }\n />\n </div>\n {this.renderError()}\n </div>\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary cancel-button'\n onClick={this.hideModal}\n >\n <FormattedMessage\n id='edit_channel_header_modal.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <button\n disabled={this.state.saving}\n type='button'\n className='btn btn-primary save-button'\n onClick={this.handleSave}\n >\n <FormattedMessage\n id='edit_channel_header_modal.save'\n defaultMessage='Save'\n />\n </button>\n </Modal.Footer>\n </Modal>\n );\n }\n}\n\nexport default injectIntl(EditChannelHeaderModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ConnectedProps} from 'react-redux';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {patchChannel} from 'mattermost-redux/actions/channels';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {setShowPreviewOnEditChannelHeaderModal} from 'actions/views/textbox';\nimport {showPreviewOnEditChannelHeaderModal} from 'selectors/views/textbox';\n\nimport type {GlobalState} from 'types/store';\n\nimport EditChannelHeaderModal from './edit_channel_header_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n shouldShowPreview: showPreviewOnEditChannelHeaderModal(state),\n ctrlSend: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n patchChannel,\n setShowPreview: setShowPreviewOnEditChannelHeaderModal,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditChannelHeaderModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport Constants from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport * as Utils from 'utils/utils';\n\ntype Actions = {\n patchChannel: (channelId: string, patch: Partial<Channel>) => Promise<ActionResult>;\n}\ntype ServerError = {\n message: string;\n}\nconst purposeMaxLength = 250;\n\ntype Props = {\n onExited: () => void;\n channel?: Channel;\n ctrlSend: boolean;\n actions: Actions;\n intl: IntlShape;\n}\n\ntype State = {\n purpose: string;\n serverError: ServerError | null;\n show: boolean;\n submitted: boolean;\n requestStarted: boolean;\n}\n\nexport class EditChannelPurposeModal extends React.PureComponent<Props, State> {\n private purpose: React.RefObject<HTMLTextAreaElement>;\n\n constructor(props: Props) {\n super(props);\n this.purpose = React.createRef();\n\n this.state = {\n purpose: props.channel?.purpose || '',\n serverError: null,\n show: true,\n submitted: false,\n requestStarted: false,\n };\n }\n\n handleEntering = () => {\n if (this.purpose.current) {\n Utils.placeCaretAtEnd(this.purpose.current);\n }\n };\n\n onHide = () => {\n this.setState({show: false});\n };\n\n handleKeyDown = (e: React.KeyboardEvent) => {\n const {ctrlSend} = this.props;\n\n // listen for line break key combo and insert new line character\n if (Utils.isUnhandledLineBreakKeyCombo(e)) {\n e.preventDefault();\n this.setState({purpose: Utils.insertLineBreakFromKeyEvent(e.nativeEvent)});\n } else if (ctrlSend && Keyboard.isKeyPressed(e, Constants.KeyCodes.ENTER) && e.ctrlKey) {\n e.preventDefault();\n this.handleSave();\n } else if (!ctrlSend && Keyboard.isKeyPressed(e, Constants.KeyCodes.ENTER) && !e.shiftKey && !e.altKey) {\n e.preventDefault();\n this.handleSave();\n }\n };\n\n handleSave = async () => {\n const {channel, actions: {patchChannel}} = this.props;\n const {purpose} = this.state;\n if (!channel) {\n return;\n }\n\n this.setState({requestStarted: true});\n\n const {data, error} = await patchChannel(channel.id, {purpose});\n\n this.setState({\n serverError: error,\n requestStarted: false,\n });\n\n if (data) {\n this.onHide();\n }\n };\n\n handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n e.preventDefault();\n this.setState({purpose: e.target.value});\n };\n\n render() {\n let serverError = null;\n const {formatMessage} = this.props.intl;\n\n if (this.state.serverError) {\n serverError = (\n <div className='form-group has-error'>\n <br/>\n <label className='control-label'>{this.state.serverError.message}</label>\n </div>\n );\n }\n\n let title = (\n <span>\n <FormattedMessage\n id='edit_channel_purpose_modal.title1'\n defaultMessage='Edit Purpose'\n />\n </span>\n );\n if (this.props.channel?.display_name) {\n title = (\n <span>\n <FormattedMessage\n id='edit_channel_purpose_modal.title2'\n defaultMessage='Edit Purpose for '\n />\n <span className='name'>{this.props.channel.display_name}</span>\n </span>\n );\n }\n\n let channelPurposeModal = (\n <FormattedMessage\n id='edit_channel_purpose_modal.body'\n defaultMessage='Describe how this channel should be used. This text appears in the channel list in the \"More...\" menu and helps others decide whether to join.'\n />\n );\n if (this.props.channel?.type === 'P') {\n channelPurposeModal = (\n <FormattedMessage\n id='edit_channel_private_purpose_modal.body'\n defaultMessage='This text appears in the \\\"View Info\\\" modal of the private channel.'\n />\n );\n }\n\n const ariaLabelForTitle = formatMessage({id: 'edit_channel_purpose_modal.title1', defaultMessage: 'Edit Purpose'}).toLowerCase();\n return (\n <Modal\n dialogClassName='a11y__modal'\n show={this.state.show}\n onHide={this.onHide}\n onEntering={this.handleEntering}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='editChannelPurposeModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='editChannelPurposeModalLabel'\n >\n {title}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <p>\n {channelPurposeModal}\n </p>\n <textarea\n ref={this.purpose}\n className='form-control no-resize'\n rows={6}\n maxLength={purposeMaxLength}\n value={this.state.purpose}\n onKeyDown={this.handleKeyDown}\n onChange={this.handleChange}\n aria-label={ariaLabelForTitle}\n />\n {serverError}\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary cancel-button'\n onClick={this.onHide}\n >\n <FormattedMessage\n id='edit_channel_purpose_modal.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <button\n type='button'\n className='btn btn-primary'\n disabled={this.state.requestStarted}\n onClick={this.handleSave}\n >\n <FormattedMessage\n id='edit_channel_purpose_modal.save'\n defaultMessage='Save'\n />\n </button>\n </Modal.Footer>\n </Modal>\n );\n }\n}\n\nexport default injectIntl(EditChannelPurposeModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {patchChannel} from 'mattermost-redux/actions/channels';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\n\nimport Constants from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport EditChannelPurposeModal from './edit_channel_purpose_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n ctrlSend: getBool(state, Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n patchChannel,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditChannelPurposeModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils';\n\nimport {getEmojiMap} from 'selectors/emojis';\n\nimport type {GlobalState} from 'types/store';\n\ninterface ComponentProps {\n emojiName: string;\n size?: number;\n emojiStyle?: React.CSSProperties;\n onClick?: () => void;\n}\n\nconst RenderEmoji = ({emojiName, emojiStyle, size, onClick}: ComponentProps) => {\n const emojiMap = useSelector((state: GlobalState) => getEmojiMap(state));\n\n if (!emojiName) {\n return null;\n }\n\n const emojiFromMap = emojiMap.get(emojiName);\n if (!emojiFromMap) {\n return null;\n }\n const emojiImageUrl = getEmojiImageUrl(emojiFromMap);\n\n return (\n <span\n onClick={onClick}\n className='emoticon'\n aria-label={`:${emojiName}:`}\n data-emoticon={emojiName}\n style={{\n backgroundImage: `url(${emojiImageUrl})`,\n backgroundSize: 'contain',\n height: size,\n width: size,\n maxHeight: size,\n maxWidth: size,\n minHeight: size,\n minWidth: size,\n overflow: 'hidden',\n ...emojiStyle,\n }}\n />\n );\n};\n\nRenderEmoji.defaultProps = {\n emoji: '',\n emojiStyle: {},\n size: 16,\n};\n\nexport default React.memo(RenderEmoji);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {EmojiCategory} from '@mattermost/types/emojis';\n\nimport type {Category, CategoryOrEmojiRow} from 'components/emoji_picker/types';\nimport WithTooltip from 'components/with_tooltip';\n\nexport interface Props {\n category: Category;\n categoryRowIndex: CategoryOrEmojiRow['index'];\n selected: boolean;\n enable: boolean;\n onClick: (categoryRowIndex: CategoryOrEmojiRow['index'], categoryName: EmojiCategory, firstEmojiId: string) => void;\n}\n\nfunction EmojiPickerCategory({category, categoryRowIndex, selected, enable, onClick}: Props) {\n const intl = useIntl();\n\n const handleClick = (event: React.MouseEvent) => {\n event.preventDefault();\n\n if (enable) {\n const firstEmojiId = category?.emojiIds?.[0] ?? '';\n\n onClick(categoryRowIndex, category.name, firstEmojiId);\n }\n };\n\n const className = classNames('emoji-picker__category', {\n 'emoji-picker__category--selected': selected,\n disable: !enable,\n });\n\n return (\n <WithTooltip\n title={\n <FormattedMessage {...category.label}/>\n }\n >\n <a\n className={className}\n href='#'\n onClick={handleClick}\n aria-label={intl.formatMessage(category.label)}\n >\n <i className={category.iconClassName}/>\n </a>\n </WithTooltip>\n );\n}\n\nexport default memo(EmojiPickerCategory);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {MessageDescriptor} from 'react-intl';\n\nimport type {EmojiCategory, Emoji, SystemEmoji, CustomEmoji} from '@mattermost/types/emojis';\n\nimport type {\n CATEGORY_HEADER_ROW,\n EMOJIS_ROW,\n} from 'components/emoji_picker/constants';\n\nexport type Category = {\n name: EmojiCategory;\n emojiIds?: string[];\n label: MessageDescriptor;\n iconClassName: string;\n};\n\nexport type Categories = Record<EmojiCategory, Category>;\n\nexport type CategoryOrEmojiRow = CategoryHeaderRow | EmojiRow;\n\nexport type CategoryHeaderRow = {\n index: number;\n type: typeof CATEGORY_HEADER_ROW;\n items: Array<{\n categoryIndex: number;\n categoryName: EmojiCategory;\n emojiIndex: -1;\n emojiId: '';\n item: undefined;\n }>;\n}\n\nexport type EmojiRow = {\n index: number;\n type: typeof EMOJIS_ROW;\n items: Array<{\n categoryIndex: number;\n categoryName: EmojiCategory;\n emojiIndex: number;\n emojiId: CustomEmoji['id'] | SystemEmoji['unified'];\n item: Emoji;\n }>;\n}\n\nexport type EmojiCursor = {\n rowIndex: number;\n emojiId: CustomEmoji['id'] | SystemEmoji['unified'];\n emoji: Emoji | undefined;\n};\n\nexport type EmojiPosition = {\n rowIndex: number;\n emojiId: CustomEmoji['id'] | SystemEmoji['unified'];\n categoryName: EmojiCategory;\n}\n\nexport enum NavigationDirection {\n NextEmoji = 'next',\n PreviousEmoji = 'previous',\n NextEmojiRow = 'nextRow',\n PreviousEmojiRow = 'previousRow',\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {defineMessage} from 'react-intl';\n\nimport type {EmojiCategory} from '@mattermost/types/emojis';\n\nimport * as Emoji from 'utils/emoji';\n\nimport type {Category, Categories} from '../types';\n\nexport const RECENT = 'recent';\nexport const SEARCH_RESULTS = 'searchResults';\nexport const SMILEY_EMOTION = 'smileys-emotion';\nexport const CUSTOM = 'custom';\n\nconst emojiCategories = {\n recent: {\n name: 'recent',\n label: defineMessage({\n id: 'emoji_picker.recent',\n defaultMessage: 'Recent',\n }),\n iconClassName: 'icon-clock-outline',\n },\n searchResults: {\n name: 'searchResults',\n label: defineMessage({\n id: 'emoji_picker.searchResults',\n defaultMessage: 'Search Results',\n }),\n iconClassName: '',\n },\n 'smileys-emotion': {\n name: 'smileys-emotion',\n label: defineMessage({\n id: 'emoji_picker.smileys-emotion',\n defaultMessage: 'Smileys & Emotion',\n }),\n iconClassName: 'icon-emoticon-happy-outline',\n },\n 'people-body': {\n name: 'people-body',\n label: defineMessage({\n id: 'emoji_picker.people-body',\n defaultMessage: 'People & Body',\n }),\n iconClassName: 'icon-account-outline',\n },\n 'animals-nature': {\n name: 'animals-nature',\n label: defineMessage({\n id: 'emoji_picker.animals-nature',\n defaultMessage: 'Animals & Nature',\n }),\n iconClassName: 'icon-leaf-outline',\n },\n 'food-drink': {\n name: 'food-drink',\n label: defineMessage({\n id: 'emoji_picker.food-drink',\n defaultMessage: 'Food & Drink',\n }),\n iconClassName: 'icon-food-apple',\n },\n 'travel-places': {\n name: 'travel-places',\n label: defineMessage({\n id: 'emoji_picker.travel-places',\n defaultMessage: 'Travel & Places',\n }),\n iconClassName: 'icon-airplane-variant',\n },\n activities: {\n name: 'activities',\n label: defineMessage({\n id: 'emoji_picker.activities',\n defaultMessage: 'Activities',\n }),\n iconClassName: 'icon-basketball',\n },\n objects: {\n name: 'objects',\n label: defineMessage({\n id: 'emoji_picker.objects',\n defaultMessage: 'Objects',\n }),\n iconClassName: 'icon-lightbulb-outline',\n },\n symbols: {\n name: 'symbols',\n label: defineMessage({\n id: 'emoji_picker.symbols',\n defaultMessage: 'Symbols',\n }),\n iconClassName: 'icon-heart-outline',\n },\n flags: {\n name: 'flags',\n label: defineMessage({\n id: 'emoji_picker.flags',\n defaultMessage: 'Flags',\n }),\n iconClassName: 'icon-flag-outline',\n },\n custom: {\n name: 'custom',\n label: defineMessage({\n id: 'emoji_picker.custom',\n defaultMessage: 'Custom',\n }),\n iconClassName: 'icon-emoticon-custom-outline',\n },\n} satisfies Record<EmojiCategory, Category>;\n\nexport const RECENT_EMOJI_CATEGORY: Pick<Categories, 'recent'> = {recent: emojiCategories.recent};\nexport const SEARCH_EMOJI_CATEGORY: Pick<Categories, typeof SEARCH_RESULTS> = {searchResults: emojiCategories.searchResults};\n\nexport const CATEGORIES: Categories = Emoji.CategoryNames.\n filter((category) => !(category === 'recent' || category === 'searchResults')).\n reduce((previousCategory, currentCategory) => {\n return {\n ...previousCategory,\n [currentCategory]: emojiCategories[currentCategory as EmojiCategory],\n };\n }, {} as Categories);\n\nexport const EMOJI_PER_ROW = 9; // needs to match variable `$emoji-per-row` in _variables.scss\nexport const ITEM_HEIGHT = 36; //as per .emoji-picker__item height in _emoticons.scss\nexport const EMOJI_CONTAINER_HEIGHT = 290; // If this changes, the spaceRequiredAbove and spaceRequiredBelow props passed to the EmojiPickerOverlay must be updated\n\nexport const CATEGORY_HEADER_ROW = 'categoryHeaderRow';\nexport const EMOJIS_ROW = 'emojisRow';\n\nexport const EMOJI_SCROLL_THROTTLE_DELAY = 150;\nexport const EMOJI_ROWS_OVERSCAN_COUNT = 1;\n\nexport const CUSTOM_EMOJIS_PER_PAGE = 200;\nexport const CUSTOM_EMOJI_SEARCH_THROTTLE_TIME_MS = 1000;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport isEmpty from 'lodash/isEmpty';\n\nimport type {Emoji, EmojiCategory, SystemEmoji} from '@mattermost/types/emojis';\n\nimport {isSystemEmoji} from 'mattermost-redux/utils/emoji_utils';\n\nimport {\n EMOJI_PER_ROW,\n CATEGORY_HEADER_ROW,\n EMOJIS_ROW,\n SEARCH_RESULTS,\n RECENT,\n RECENT_EMOJI_CATEGORY,\n CATEGORIES,\n} from 'components/emoji_picker/constants';\nimport type {\n Categories,\n Category,\n CategoryOrEmojiRow,\n CategoryHeaderRow,\n EmojiRow,\n EmojiPosition,\n EmojiCursor,\n} from 'components/emoji_picker/types';\n\nimport {EmojiIndicesByCategory, Emojis as EmojisJson} from 'utils/emoji';\nimport type EmojiMap from 'utils/emoji_map';\nimport {compareEmojis, convertEmojiSkinTone, emojiMatchesSkin, getSkin} from 'utils/emoji_utils';\n\nexport function isCategoryHeaderRow(row: CategoryOrEmojiRow): row is CategoryHeaderRow {\n return row.type === CATEGORY_HEADER_ROW;\n}\n\nfunction updateSkinTone(initialEmoji: SystemEmoji, skinTone: string): Emoji {\n const initialEmojiSkin = getSkin(initialEmoji);\n if (initialEmojiSkin && initialEmojiSkin !== skinTone) {\n const emojiWithUpdatedSkinTone = convertEmojiSkinTone(initialEmoji, skinTone);\n if (emojiWithUpdatedSkinTone && emojiWithUpdatedSkinTone.unified) {\n return emojiWithUpdatedSkinTone;\n }\n }\n return initialEmoji;\n}\n\nfunction convertEmojisToUserSkinTone(emojiIds: string[], allEmojis: Record<string, Emoji>, userSkinTone: string): Emoji[] {\n return emojiIds.map((emojiId) => {\n const emoji = allEmojis[emojiId];\n return isSystemEmoji(emoji) ? updateSkinTone(emoji, userSkinTone) : emoji;\n });\n}\n\nfunction isEmojiIdEqual(firstEmoji: Emoji, secondEmoji: Emoji): boolean {\n const firstEmojiId = isSystemEmoji(firstEmoji) ? firstEmoji.unified : firstEmoji.id;\n const secondEmojId = isSystemEmoji(secondEmoji) ? secondEmoji.unified : secondEmoji.id;\n return firstEmojiId === secondEmojId;\n}\n\nexport function getFilteredEmojis(allEmojis: Record<string, Emoji>, filter: string, recentEmojisString: string[], userSkinTone: string): Emoji[] {\n const filteredEmojisWithRecent = Object.values(allEmojis).filter((emoji) => {\n const aliases = isSystemEmoji(emoji) ? emoji.short_names : [emoji.name];\n\n for (let i = 0; i < aliases.length; i++) {\n if (aliases[i].toLowerCase().includes(filter.toLowerCase())) {\n return true;\n }\n }\n\n return false;\n });\n\n // Form a separate array of recent emojis\n const recentEmojis = convertEmojisToUserSkinTone(recentEmojisString, allEmojis, userSkinTone);\n\n const filteredRecentEmojis = filteredEmojisWithRecent.filter((emoji) => {\n return recentEmojis.some((recentEmojis) => isEmojiIdEqual(recentEmojis, emoji));\n });\n\n const sortedRecentEmojis = filteredRecentEmojis.sort((firstEmoji, secondEmoji) =>\n compareEmojis(firstEmoji, secondEmoji, filter),\n );\n\n // Seprate out recent emojis from the rest of the emoji result\n const filtertedEmojisMinusRecent = filteredEmojisWithRecent.filter((emoji) => {\n return !recentEmojis.some((recentEmojis) => isEmojiIdEqual(recentEmojis, emoji));\n });\n\n const sortedFiltertedEmojisMinusRecent = filtertedEmojisMinusRecent.sort((firstEmoji, secondEmoji) =>\n compareEmojis(firstEmoji, secondEmoji, filter),\n );\n\n const filteredEmojis = [...sortedRecentEmojis, ...sortedFiltertedEmojisMinusRecent];\n\n const filteredEmojisUserSkinTone = filteredEmojis.filter((emoji) => {\n return emojiMatchesSkin(emoji, userSkinTone);\n });\n\n return filteredEmojisUserSkinTone;\n}\n\nfunction getEmojisByCategory(\n allEmojis: Record<string, Emoji>,\n category: Category,\n): Emoji[] {\n const emojiIds = category?.emojiIds ?? [];\n\n if (emojiIds.length === 0) {\n return [];\n }\n\n // For all other categories, return emojis of the categoryies from allEmojis\n return emojiIds.map((emojiId) => allEmojis[emojiId]);\n}\n\nexport function getUpdatedCategoriesAndAllEmojis(\n emojiMap: EmojiMap,\n recentEmojis: string[],\n userSkinTone: string,\n allEmojis: Record<string, Emoji>,\n): [Categories, Record<string, Emoji>] {\n const customEmojiMap = emojiMap.customEmojis;\n const categories: Categories = recentEmojis.length ? {...RECENT_EMOJI_CATEGORY, ...CATEGORIES} : CATEGORIES;\n\n Object.keys(categories).forEach((categoryName) => {\n let categoryEmojis: Emoji[] = [];\n\n if (categoryName === 'recent' && recentEmojis.length) {\n categoryEmojis = [...recentEmojis].\n reverse().\n filter((name) => {\n return emojiMap.has(name);\n }).\n map((name) => {\n return emojiMap.get(name)!;\n });\n } else {\n const indices = (EmojiIndicesByCategory.get(userSkinTone) as Map<string, number[]>).get(categoryName) || [];\n categoryEmojis = indices.map((index) => EmojisJson[index]);\n\n if (categoryName === 'custom') {\n categoryEmojis = categoryEmojis.concat([...customEmojiMap.values()]);\n }\n }\n\n // populate each category with emojiIds\n categories[categoryName as EmojiCategory].emojiIds = categoryEmojis.\n map((emoji: Emoji) => (isSystemEmoji(emoji) ? emoji.unified.toLowerCase() : emoji.id));\n\n // populate allEmojis with emoji objects\n categoryEmojis.forEach((currentEmoji: Emoji) => {\n const currentEmojiId = isSystemEmoji(currentEmoji) ? currentEmoji.unified.toLowerCase() : currentEmoji.id;\n allEmojis[currentEmojiId] = {...allEmojis[currentEmojiId], ...currentEmoji};\n\n if (!isSystemEmoji(currentEmoji)) {\n allEmojis[currentEmojiId] = {...allEmojis[currentEmojiId], category: 'custom'};\n }\n });\n });\n\n const updatedAllEmojis = Object.assign({}, allEmojis);\n\n return [categories, updatedAllEmojis];\n}\n\nexport function calculateCategoryRowIndex(categories: Categories, categoryName: EmojiCategory) {\n const categoryIndex = Object.keys(categories).findIndex((category) => category === categoryName);\n\n const categoriesTillCurrentCategory = Object.values(categories).slice(0, categoryIndex);\n\n const rowIndex = categoriesTillCurrentCategory.reduce((previousIndexSum, currentCategory) => {\n const emojisInCurrentCategory = currentCategory?.emojiIds?.length ?? 0;\n\n const numberOfEmojiRowsInCurrentCategory = Math.ceil(emojisInCurrentCategory / EMOJI_PER_ROW);\n\n return previousIndexSum + numberOfEmojiRowsInCurrentCategory + 1;\n }, 0);\n\n return rowIndex;\n}\n\nexport function splitEmojisToRows(emojis: Emoji[], categoryIndex: number, categoryName: EmojiCategory, rowIndexCounter: number): [EmojiRow[], number] {\n if (emojis.length === 0) {\n return [[], rowIndexCounter - 1];\n }\n\n const emojiRows: EmojiRow[] = [];\n let emojisIndividualRow: EmojiRow['items'] = [];\n let emojiRowIndexCounter = rowIndexCounter;\n\n // create `EMOJI_PER_ROW` row lenght array of emojis\n emojis.forEach((emoji, emojiIndex) => {\n emojisIndividualRow.push({\n categoryIndex,\n categoryName,\n emojiIndex,\n emojiId: isSystemEmoji(emoji) ? emoji.unified : emoji.id,\n item: emoji,\n });\n\n if ((emojiIndex + 1) % EMOJI_PER_ROW === 0) {\n emojiRows.push({\n index: emojiRowIndexCounter,\n type: EMOJIS_ROW,\n items: emojisIndividualRow,\n });\n\n emojiRowIndexCounter++;\n emojisIndividualRow = [];\n }\n });\n\n // if there are emojis left over that is less than `EMOJI_PER_ROW`, add them in next row\n if (emojisIndividualRow.length) {\n emojiRows.push({\n index: emojiRowIndexCounter,\n type: EMOJIS_ROW,\n items: emojisIndividualRow,\n });\n\n emojiRowIndexCounter++;\n }\n\n return [emojiRows, emojiRowIndexCounter];\n}\n\nexport function createEmojisPositions(categoryOrEmojiRows: CategoryOrEmojiRow[]): EmojiPosition[] {\n const emojisPositions2DArray: EmojiPosition[][] = [];\n\n categoryOrEmojiRows.forEach((categoryOrEmojiRow) => {\n if (!isCategoryHeaderRow(categoryOrEmojiRow)) {\n const rowIndex = categoryOrEmojiRow.index;\n const emojisOfARow: EmojiPosition[] = categoryOrEmojiRow.items.map((emojiItem) => ({\n rowIndex,\n emojiId: emojiItem.emojiId,\n categoryName: emojiItem.categoryName,\n }));\n\n emojisPositions2DArray.push(emojisOfARow);\n }\n });\n\n const emojisPositions = emojisPositions2DArray.flat();\n return emojisPositions;\n}\n\nexport function createCategoryAndEmojiRows(\n allEmojis: Record<string, Emoji>,\n categories: Categories,\n filter: string,\n userSkinTone: string,\n): [CategoryOrEmojiRow[], EmojiPosition[]] {\n if (isEmpty(allEmojis) || isEmpty(categories)) {\n return [[], []];\n }\n\n // If search is active, return filtered emojis\n if (filter.length) {\n const searchCategoryRow: CategoryHeaderRow = {\n index: 0,\n type: CATEGORY_HEADER_ROW,\n items: [{\n categoryIndex: 0,\n categoryName: SEARCH_RESULTS,\n emojiIndex: -1,\n emojiId: '',\n item: undefined,\n }],\n };\n\n const recentEmojiIds = categories?.[RECENT]?.emojiIds ?? [];\n const filteredEmojis = getFilteredEmojis(allEmojis, filter, recentEmojiIds, userSkinTone);\n const [searchEmojisRows] = splitEmojisToRows(filteredEmojis, 0, SEARCH_RESULTS, 1);\n\n const searchEmojiRowsWithCategoryHeader: CategoryOrEmojiRow[] = [searchCategoryRow, ...searchEmojisRows];\n\n const emojisPositions = createEmojisPositions(searchEmojiRowsWithCategoryHeader);\n\n return [searchEmojiRowsWithCategoryHeader, emojisPositions];\n }\n\n let sortedEmojis: Emoji[] = [];\n\n let rowIndexCounter = 0;\n let categoryOrEmojisRows: CategoryOrEmojiRow[] = [];\n Object.keys(categories).forEach((categoryName, categoryIndex) => {\n const emojis = getEmojisByCategory(\n allEmojis,\n categories[categoryName as EmojiCategory],\n );\n\n sortedEmojis = [...sortedEmojis, ...emojis];\n\n // Add for the category header\n const categoryRow: CategoryHeaderRow = {\n index: rowIndexCounter,\n type: CATEGORY_HEADER_ROW,\n items: [{\n categoryIndex,\n categoryName: categoryName as EmojiCategory,\n emojiIndex: -1,\n emojiId: '',\n item: undefined,\n }],\n };\n\n categoryOrEmojisRows = [...categoryOrEmojisRows, categoryRow];\n rowIndexCounter += 1;\n\n const [emojiRows, increasedRowIndexCounter] = splitEmojisToRows(emojis, categoryIndex, categoryName as EmojiCategory, rowIndexCounter);\n\n rowIndexCounter = increasedRowIndexCounter;\n\n categoryOrEmojisRows = [...categoryOrEmojisRows, ...emojiRows];\n });\n\n const emojisPositions = createEmojisPositions(categoryOrEmojisRows);\n\n return [categoryOrEmojisRows, emojisPositions];\n}\n\nexport function getCursorProperties(cursorRowIndex: EmojiCursor['rowIndex'], cursorEmojiId: EmojiCursor['emojiId'], categoryOrEmojisRows: EmojiRow[]): [string, number, number] {\n if (cursorEmojiId.length === 0 || cursorRowIndex === -1) {\n return ['', -1, -1];\n }\n\n const emojisRowOfCursor = categoryOrEmojisRows?.[cursorRowIndex]?.items ?? [];\n\n // The row should atleast contain one emoji\n if (emojisRowOfCursor.length < 1) {\n return ['', -1, -1];\n }\n\n const cursorCategory = emojisRowOfCursor[0]?.categoryName ?? '';\n const cursorCategoryIndex = emojisRowOfCursor[0]?.categoryIndex ?? -1;\n\n const cursorEmojiIndex = emojisRowOfCursor.find((emojiItem) => {\n return emojiItem.emojiId === cursorEmojiId;\n })?.emojiIndex ?? -1;\n\n return [cursorCategory, cursorCategoryIndex, cursorEmojiIndex];\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport type {KeyboardEvent} from 'react';\n\nimport type {EmojiCategory} from '@mattermost/types/emojis';\n\nimport EmojiPickerCategory from 'components/emoji_picker/components/emoji_picker_category';\nimport {\n NavigationDirection,\n} from 'components/emoji_picker/types';\nimport type {\n Categories,\n CategoryOrEmojiRow} from 'components/emoji_picker/types';\nimport {calculateCategoryRowIndex} from 'components/emoji_picker/utils';\n\ninterface Props {\n isFiltering: boolean;\n active: EmojiCategory;\n categories: Categories;\n onClick: (categoryRowIndex: CategoryOrEmojiRow['index'], categoryName: EmojiCategory, firstEmojiId: string) => void;\n onKeyDown: (moveTo: NavigationDirection) => void;\n focusOnSearchInput: () => void;\n}\n\nfunction EmojiPickerCategories({\n categories,\n isFiltering,\n active,\n onClick,\n onKeyDown,\n focusOnSearchInput,\n}: Props) {\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowRight':\n event.stopPropagation();\n event.preventDefault();\n onKeyDown(NavigationDirection.NextEmoji);\n focusOnSearchInput();\n break;\n case 'ArrowLeft':\n event.stopPropagation();\n event.preventDefault();\n onKeyDown(NavigationDirection.PreviousEmoji);\n focusOnSearchInput();\n break;\n case 'ArrowUp':\n event.stopPropagation();\n event.preventDefault();\n onKeyDown(NavigationDirection.PreviousEmojiRow);\n focusOnSearchInput();\n break;\n case 'ArrowDown':\n event.stopPropagation();\n event.preventDefault();\n onKeyDown(NavigationDirection.NextEmojiRow);\n focusOnSearchInput();\n break;\n }\n };\n\n const categoryNames = Object.keys(categories) as EmojiCategory[];\n\n const activeCategory = isFiltering ? categoryNames[0] : active;\n\n return (\n <div\n id='emojiPickerCategories'\n className='emoji-picker__categories'\n onKeyDown={handleKeyDown}\n >\n {categoryNames.map((categoryName) => {\n const category = categories[categoryName];\n\n return (\n <EmojiPickerCategory\n key={category.name}\n category={category}\n categoryRowIndex={calculateCategoryRowIndex(categories, categoryName as EmojiCategory)}\n onClick={onClick}\n selected={activeCategory === category.name}\n enable={!isFiltering}\n />\n );\n },\n\n )}\n </div>\n );\n}\n\nexport default memo(EmojiPickerCategories);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport type {CSSProperties} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {EmojiCategory} from '@mattermost/types/emojis';\n\ninterface Props {\n categoryName: EmojiCategory;\n style: CSSProperties;\n}\n\nfunction EmojiPickerCategoryRow({categoryName, style}: Props) {\n return (\n <div\n className='emoji-picker-items__container'\n style={style}\n >\n <div\n className='emoji-picker__category-header'\n id={`emojipickercat-${categoryName}`}\n >\n <FormattedMessage id={`emoji_picker.${categoryName}`}/>\n </div>\n </div>\n );\n}\n\nexport default memo(EmojiPickerCategoryRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport throttle from 'lodash/throttle';\nimport React, {memo, useCallback} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport {getEmojiImageUrl, isSystemEmoji} from 'mattermost-redux/utils/emoji_utils';\n\nimport {EMOJI_SCROLL_THROTTLE_DELAY} from 'components/emoji_picker/constants';\nimport type {EmojiCursor} from 'components/emoji_picker/types';\n\nimport imgTrans from 'images/img_trans.gif';\n\ninterface Props {\n emoji: Emoji;\n rowIndex: number;\n isSelected?: boolean;\n onClick: (emoji: Emoji) => void;\n onMouseOver: (cursor: EmojiCursor) => void;\n}\n\nfunction EmojiPickerItem({emoji, rowIndex, isSelected, onClick, onMouseOver}: Props) {\n const {formatMessage} = useIntl();\n\n const handleMouseOver = () => {\n if (!isSelected) {\n let emojiId = '';\n if (isSystemEmoji(emoji)) {\n emojiId = emoji.unified;\n } else {\n emojiId = emoji.id;\n }\n onMouseOver({rowIndex, emojiId, emoji});\n }\n };\n\n const throttledMouseOver = useCallback(\n throttle(handleMouseOver, EMOJI_SCROLL_THROTTLE_DELAY, {\n leading: true,\n trailing: false,\n }), []);\n\n const handleClick = () => {\n onClick(emoji);\n };\n\n const itemClassName = classNames('emoji-picker__item', {\n selected: isSelected,\n });\n\n let content;\n\n if (isSystemEmoji(emoji)) {\n const emojiName = emoji.short_name ? emoji.short_name : emoji.name;\n const emojiUnified = emoji.unified ? emoji.unified.toLowerCase() : emoji.name.toLowerCase();\n\n content = (\n <img\n alt={'emoji image'}\n data-testid={emoji.short_names}\n src={imgTrans}\n className={`emojisprite emoji-category-${emoji.category} emoji-${emojiUnified}`}\n id={`emoji-${emojiUnified}`}\n aria-label={formatMessage(\n {\n id: 'emoji_picker_item.emoji_aria_label',\n defaultMessage: '{emojiName} emoji',\n },\n {\n emojiName: (emojiName).replace(/_/g, ' '),\n },\n )}\n role='button'\n />\n );\n } else {\n content = (\n <img\n alt={'custom emoji image'}\n data-testid={emoji.name}\n src={getEmojiImageUrl(emoji)}\n className={'emoji-category--custom'}\n />\n );\n }\n\n return (\n <div\n className={itemClassName}\n onClick={handleClick}\n onMouseOver={throttledMouseOver}\n >\n <div data-testid='emojiItem'>\n {content}\n </div>\n </div>\n );\n}\n\nfunction areEqual(prevProps: Props, nextProps: Props) {\n return (\n prevProps.isSelected === nextProps.isSelected\n );\n}\n\nexport default memo(EmojiPickerItem, areEqual);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {areEqual} from 'react-window';\nimport type {ListChildComponentProps} from 'react-window';\n\nimport type {CustomEmoji, Emoji, SystemEmoji} from '@mattermost/types/emojis';\n\nimport EmojiPickerCategorySection from 'components/emoji_picker/components/emoji_picker_category_row';\nimport EmojiPickerItem from 'components/emoji_picker/components/emoji_picker_item';\nimport type {CategoryOrEmojiRow, EmojiCursor} from 'components/emoji_picker/types';\nimport {isCategoryHeaderRow} from 'components/emoji_picker/utils';\n\ninterface Props extends ListChildComponentProps<CategoryOrEmojiRow[]> {\n cursorRowIndex: number;\n cursorEmojiId: SystemEmoji['unified'] | CustomEmoji['id'];\n onEmojiClick: (emoji: Emoji) => void;\n onEmojiMouseOver: (cursor: EmojiCursor) => void;\n}\n\nfunction EmojiPickerCategoryOrEmojiRow({index, style, data, cursorRowIndex, cursorEmojiId, onEmojiClick, onEmojiMouseOver}: Props) {\n const row = data[index];\n\n if (isCategoryHeaderRow(row)) {\n return (\n <EmojiPickerCategorySection\n categoryName={row.items[0].categoryName}\n style={style}\n />\n );\n }\n\n return (\n <div\n style={style}\n className='emoji-picker__row'\n >\n {row.items.map((emojiColumn) => {\n const emoji = emojiColumn.item;\n const isSelected = emojiColumn.emojiId.toLowerCase() === cursorEmojiId.toLowerCase() && cursorRowIndex === index;\n\n return (\n <EmojiPickerItem\n key={`${emojiColumn.categoryName}-${emojiColumn.emojiId}`}\n emoji={emoji}\n rowIndex={row.index}\n isSelected={isSelected}\n onClick={onEmojiClick}\n onMouseOver={onEmojiMouseOver}\n />\n );\n })}\n </div>\n );\n}\n\nexport default memo(EmojiPickerCategoryOrEmojiRow, areEqual);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport throttle from 'lodash/throttle';\nimport React, {forwardRef, memo, useCallback} from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport {FixedSizeList} from 'react-window';\nimport type {ListItemKeySelector, ListOnScrollProps} from 'react-window';\nimport InfiniteLoader from 'react-window-infinite-loader';\n\nimport type {Emoji, EmojiCategory, CustomEmoji, SystemEmoji} from '@mattermost/types/emojis';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport EmojiPickerCategoryOrEmojiRow from 'components/emoji_picker/components/emoji_picker_category_or_emoji_row';\nimport {ITEM_HEIGHT, EMOJI_ROWS_OVERSCAN_COUNT, EMOJI_CONTAINER_HEIGHT, CUSTOM_EMOJIS_PER_PAGE, EMOJI_SCROLL_THROTTLE_DELAY} from 'components/emoji_picker/constants';\nimport type {CategoryOrEmojiRow, EmojiCursor} from 'components/emoji_picker/types';\nimport {isCategoryHeaderRow} from 'components/emoji_picker/utils';\n\ninterface Props {\n categoryOrEmojisRows: CategoryOrEmojiRow[];\n isFiltering: boolean;\n activeCategory: EmojiCategory;\n cursorRowIndex: number;\n cursorEmojiId: SystemEmoji['unified'] | CustomEmoji['name'];\n customEmojisEnabled: boolean;\n customEmojiPage: number;\n setActiveCategory: (category: EmojiCategory) => void;\n onEmojiClick: (emoji: Emoji) => void;\n onEmojiMouseOver: (cursor: EmojiCursor) => void;\n incrementEmojiPickerPage: () => void;\n getCustomEmojis: (page?: number, perPage?: number, sort?: string, loadUsers?: boolean) => Promise<ActionResult<CustomEmoji[]>>;\n}\n\nconst EmojiPickerCurrentResults = forwardRef<InfiniteLoader, Props>(({categoryOrEmojisRows, isFiltering, activeCategory, cursorRowIndex, cursorEmojiId, customEmojisEnabled, customEmojiPage, setActiveCategory, onEmojiClick, onEmojiMouseOver, getCustomEmojis, incrementEmojiPickerPage}: Props, ref) => {\n // Function to create unique key for each row\n const getItemKey = (index: Parameters<ListItemKeySelector>[0], rowsData: Parameters<ListItemKeySelector<CategoryOrEmojiRow[]>>[1]) => {\n const data = rowsData[index];\n\n if (isCategoryHeaderRow(data)) {\n const categoryRow = data.items[0];\n return `${categoryRow.categoryIndex}-${categoryRow.categoryName}`;\n }\n\n const emojisRow = data.items;\n const emojiNamesArray = emojisRow.map((emoji) => `${emoji.categoryIndex}-${emoji.emojiId}`);\n return emojiNamesArray.join('--');\n };\n\n const handleScroll = (scrollOffset: ListOnScrollProps['scrollOffset'], activeCategory: EmojiCategory, isFiltering: boolean, categoryOrEmojisRows: CategoryOrEmojiRow[]) => {\n if (isFiltering) {\n return;\n }\n\n const approxRowsFromTop = Math.ceil(scrollOffset / ITEM_HEIGHT);\n const closestCategory = categoryOrEmojisRows?.[approxRowsFromTop]?.items[0]?.categoryName;\n\n if (closestCategory === activeCategory || !closestCategory) {\n return;\n }\n\n setActiveCategory(closestCategory);\n };\n\n const throttledScroll = useCallback(throttle(({scrollOffset}: ListOnScrollProps) => {\n handleScroll(scrollOffset, activeCategory, isFiltering, categoryOrEmojisRows);\n }, EMOJI_SCROLL_THROTTLE_DELAY, {leading: false, trailing: true},\n ), [activeCategory, isFiltering, categoryOrEmojisRows]);\n\n const handleIsItemLoaded = (index: number): boolean => {\n return index < categoryOrEmojisRows.length;\n };\n\n const handleLoadMoreItems = async () => {\n if (customEmojisEnabled === false) {\n return;\n }\n\n const {data} = await getCustomEmojis(customEmojiPage, CUSTOM_EMOJIS_PER_PAGE);\n\n // If data came back empty, or data is less than the perPage, then we know there are no more pages\n if (!data || data.length < CUSTOM_EMOJIS_PER_PAGE) {\n return;\n }\n\n incrementEmojiPickerPage();\n };\n\n return (\n <div\n className='emoji-picker__items'\n style={{height: EMOJI_CONTAINER_HEIGHT}}\n >\n <div className='emoji-picker__container'>\n <AutoSizer>\n {({height, width}) => (\n <InfiniteLoader\n ref={ref}\n itemCount={categoryOrEmojisRows.length + 1} // +1 for the loading row\n isItemLoaded={handleIsItemLoaded}\n loadMoreItems={handleLoadMoreItems}\n >\n {({onItemsRendered, ref}) => (\n <FixedSizeList\n ref={ref}\n onItemsRendered={onItemsRendered}\n height={height}\n width={width}\n layout='vertical'\n overscanCount={EMOJI_ROWS_OVERSCAN_COUNT}\n itemCount={categoryOrEmojisRows.length}\n itemData={categoryOrEmojisRows}\n itemKey={getItemKey}\n itemSize={ITEM_HEIGHT}\n onScroll={throttledScroll}\n >\n {({index, style, data}) => (\n <EmojiPickerCategoryOrEmojiRow\n index={index}\n style={style}\n data={data}\n cursorRowIndex={cursorRowIndex}\n cursorEmojiId={cursorEmojiId}\n onEmojiClick={onEmojiClick}\n onEmojiMouseOver={onEmojiMouseOver}\n />\n )}\n </FixedSizeList>\n )}\n </InfiniteLoader>\n )}\n </AutoSizer>\n </div>\n </div>\n );\n});\n\nEmojiPickerCurrentResults.displayName = 'EmojiPickerCurrentResults';\n\nexport default memo(EmojiPickerCurrentResults);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport AnyTeamPermissionGate from 'components/permissions_gates/any_team_permission_gate';\n\ninterface Props {\n customEmojisEnabled: boolean;\n currentTeamName: string;\n onClick: () => void;\n}\n\nfunction EmojiPickerCustomEmojiButton({customEmojisEnabled, currentTeamName, onClick}: Props) {\n if (!customEmojisEnabled) {\n return null;\n }\n\n if (currentTeamName.length === 0) {\n return null;\n }\n\n return (\n <AnyTeamPermissionGate permissions={[Permissions.CREATE_EMOJIS]}>\n <div className='emoji-picker__custom'>\n <Link\n className='btn btn-tertiary'\n to={`/${currentTeamName}/emoji`}\n onClick={onClick}\n >\n <FormattedMessage\n id='emoji_picker.custom_emoji'\n defaultMessage='Custom Emoji'\n />\n </Link>\n </div>\n </AnyTeamPermissionGate>\n );\n}\n\nexport default memo(EmojiPickerCustomEmojiButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport {getEmojiImageUrl, isSystemEmoji} from 'mattermost-redux/utils/emoji_utils';\n\nimport imgTrans from 'images/img_trans.gif';\n\ninterface Props {\n emoji?: Emoji;\n}\n\nfunction EmojiPickerPreview({emoji}: Props) {\n if (!emoji) {\n return (\n <div className='emoji-picker__preview emoji-picker__preview-placeholder'>\n <FormattedMessage\n id='emoji_picker.emojiPicker.previewPlaceholder'\n defaultMessage='Select an Emoji'\n />\n </div>\n );\n }\n\n let aliases;\n let previewImage;\n\n if (isSystemEmoji(emoji)) {\n aliases = emoji.short_names;\n previewImage = (\n <span className='sprite-preview'>\n <img\n id='emojiPickerSpritePreview'\n alt={'emoji category image'}\n src={imgTrans}\n className={'emojisprite-preview emoji-category-' + emoji.category + ' emoji-' + emoji.unified.toLowerCase()}\n />\n </span>\n );\n } else {\n aliases = [emoji.name];\n previewImage = (\n <img\n id='emojiPickerSpritePreview'\n alt={'emoji preview image'}\n className='emoji-picker__preview-image'\n src={getEmojiImageUrl(emoji)}\n />\n );\n }\n\n return (\n <div className='emoji-picker__preview'>\n <div className='emoji-picker__preview-image-box'>\n {previewImage}\n </div>\n <div className='emoji-picker__preview-image-label-box'>\n <span\n className='emoji-picker__preview-name'\n data-testid='emoji_picker_preview'\n >\n {':' + aliases.join(': :') + ':'}\n </span>\n </div>\n </div>\n );\n}\n\nexport default memo(EmojiPickerPreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {\n forwardRef,\n memo,\n} from 'react';\nimport type {\n ChangeEvent,\n KeyboardEvent} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {EMOJI_PER_ROW} from 'components/emoji_picker/constants';\nimport {NavigationDirection} from 'components/emoji_picker/types';\n\ninterface Props {\n value: string;\n cursorCategoryIndex: number;\n cursorEmojiIndex: number;\n focus: () => void;\n onEnter: () => void;\n onChange: (value: string) => void;\n onKeyDown: (moveTo: NavigationDirection) => void;\n resetCursorPosition: () => void;\n}\n\nconst EmojiPickerSearch = forwardRef<HTMLInputElement, Props>(({value, cursorCategoryIndex, cursorEmojiIndex, onChange, resetCursorPosition, onKeyDown, focus, onEnter}: Props, ref) => {\n const {formatMessage} = useIntl();\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n event.preventDefault();\n\n // remove trailing and leading colons\n const value = event.target.value.replace(/^:|:$/g, '');\n onChange(value);\n\n resetCursorPosition();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n case 'ArrowRight':\n // If the cursor is at the end of the textbox and an emoji is currently selected, move it to the next emoji\n if ((event.currentTarget?.selectionStart ?? 0) + 1 > value.length || (cursorCategoryIndex !== -1 || cursorEmojiIndex !== -1)) {\n event.stopPropagation();\n event.preventDefault();\n\n onKeyDown(NavigationDirection.NextEmoji);\n }\n break;\n case 'ArrowLeft':\n if (cursorCategoryIndex > 0 || cursorEmojiIndex > 0) {\n event.stopPropagation();\n event.preventDefault();\n\n onKeyDown(NavigationDirection.PreviousEmoji);\n } else if (cursorCategoryIndex === 0 && cursorEmojiIndex === 0) {\n resetCursorPosition();\n event.currentTarget.selectionStart = value.length;\n event.currentTarget.selectionEnd = value.length;\n\n event.stopPropagation();\n event.preventDefault();\n\n focus();\n }\n break;\n case 'ArrowUp':\n event.stopPropagation();\n event.preventDefault();\n\n if (event.shiftKey) {\n // If Shift + Ctrl/Cmd + Up is pressed at any time, select/highlight the string to the left of the cursor.\n event.currentTarget.selectionStart = 0;\n } else if (cursorCategoryIndex === -1) {\n // If cursor is on the textbox, set the cursor to the beginning of the string.\n event.currentTarget.selectionStart = 0;\n event.currentTarget.selectionEnd = 0;\n } else if (cursorCategoryIndex === 0 && cursorEmojiIndex < EMOJI_PER_ROW) {\n // If the cursor is highlighting an emoji in the top row,\n // move the cursor back into the text box to the end of the string.\n resetCursorPosition();\n event.currentTarget.selectionStart = value.length;\n event.currentTarget.selectionEnd = value.length;\n focus();\n } else {\n // Otherwise, move the emoji selector up a row.\n onKeyDown(NavigationDirection.PreviousEmojiRow);\n }\n break;\n case 'ArrowDown':\n event.stopPropagation();\n event.preventDefault();\n\n if (event.shiftKey) {\n // If Shift + Ctrl/Cmd + Down is pressed at any time, select/highlight the string to the right of the cursor.\n event.currentTarget.selectionEnd = value.length;\n } else if (value && event.currentTarget.selectionStart === 0) {\n // If the cursor is at the beginning of the string, move the cursor to the end of the string.\n event.currentTarget.selectionStart = value.length;\n event.currentTarget.selectionEnd = value.length;\n } else {\n // Otherwise, move the selection down in the emoji picker.\n onKeyDown(NavigationDirection.NextEmojiRow);\n }\n break;\n case 'Enter': {\n event.stopPropagation();\n event.preventDefault();\n\n onEnter();\n break;\n }\n }\n };\n\n return (\n <div className='emoji-picker__text-container'>\n <span className='icon-magnify icon emoji-picker__search-icon'/>\n <input\n ref={ref}\n id='emojiPickerSearch'\n aria-label={formatMessage({id: 'emoji_picker.search_emoji', defaultMessage: 'Search for an emoji'})}\n className='emoji-picker__search'\n data-testid='emojiInputSearch'\n type='text'\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n autoComplete='off'\n placeholder={formatMessage({id: 'emoji_picker.search', defaultMessage: 'Search Emoji'})}\n value={value}\n />\n </div>\n );\n},\n);\n\nEmojiPickerSearch.displayName = 'EmojiPickerSearch';\n\nexport default memo(EmojiPickerSearch);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage, defineMessage, injectIntl} from 'react-intl';\nimport type {IntlShape, MessageDescriptor} from 'react-intl';\nimport {CSSTransition} from 'react-transition-group';\n\nimport {CloseIcon} from '@mattermost/compass-icons/components';\nimport type {SystemEmoji} from '@mattermost/types/emojis';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport imgTrans from 'images/img_trans.gif';\nimport * as Emoji from 'utils/emoji';\n\ninterface SkinTone {\n emoji: SystemEmoji;\n label: MessageDescriptor;\n value: string;\n}\n\nconst skinTones = [\n {\n emoji: Emoji.Emojis[Emoji.EmojiIndicesByAlias.get('raised_hand_with_fingers_splayed_dark_skin_tone')!],\n label: defineMessage({\n id: 'emoji_skin.dark_skin_tone',\n defaultMessage: 'Dark skin tone',\n }),\n value: '1F3FF',\n },\n {\n emoji: Emoji.Emojis[Emoji.EmojiIndicesByAlias.get('raised_hand_with_fingers_splayed_medium_dark_skin_tone')!],\n label: defineMessage({\n id: 'emoji_skin.medium_dark_skin_tone',\n defaultMessage: 'Medium dark skin tone',\n }),\n value: '1F3FE',\n },\n {\n emoji: Emoji.Emojis[Emoji.EmojiIndicesByAlias.get('raised_hand_with_fingers_splayed_medium_skin_tone')!],\n label: defineMessage({\n id: 'emoji_skin.medium_skin_tone',\n defaultMessage: 'Medium skin tone',\n }),\n value: '1F3FD',\n },\n {\n emoji: Emoji.Emojis[Emoji.EmojiIndicesByAlias.get('raised_hand_with_fingers_splayed_medium_light_skin_tone')!],\n label: defineMessage({\n id: 'emoji_skin.medium_light_skin_tone',\n defaultMessage: 'Medium light skin tone',\n }),\n value: '1F3FC',\n },\n {\n emoji: Emoji.Emojis[Emoji.EmojiIndicesByAlias.get('raised_hand_with_fingers_splayed_light_skin_tone')!],\n label: defineMessage({\n id: 'emoji_skin.light_skin_tone',\n defaultMessage: 'Light skin tone',\n }),\n value: '1F3FB',\n },\n {\n emoji: Emoji.Emojis[Emoji.EmojiIndicesByAlias.get('raised_hand_with_fingers_splayed')!],\n label: defineMessage({\n id: 'emoji_skin.default',\n defaultMessage: 'Default skin tone',\n }),\n value: 'default',\n },\n] satisfies SkinTone[];\n\nexport type Props = {\n userSkinTone: string;\n onSkinSelected: (skin: string) => void;\n intl: IntlShape;\n};\n\ntype State = {\n pickerExtended: boolean;\n}\n\nexport class EmojiPickerSkin extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n pickerExtended: false,\n };\n }\n\n ariaLabel = (skinTone: SkinTone) => {\n return this.props.intl.formatMessage({\n id: 'emoji_skin_item.emoji_aria_label',\n defaultMessage: '{skinName} emoji',\n },\n {\n skinName: this.props.intl.formatMessage(skinTone.label),\n });\n };\n\n hideSkinTonePicker = (skin: string) => {\n this.setState({pickerExtended: false});\n if (skin !== this.props.userSkinTone) {\n this.props.onSkinSelected(skin);\n }\n };\n\n showSkinTonePicker = () => {\n this.setState({pickerExtended: true});\n };\n\n extended() {\n const closeButtonLabel = this.props.intl.formatMessage({\n id: 'emoji_skin.close',\n defaultMessage: 'Close skin tones',\n });\n const choices = skinTones.map((skinTone) => {\n const skin = skinTone.value;\n const emoji = skinTone.emoji;\n const spriteClassName = classNames('emojisprite', `emoji-category-${emoji.category}`, `emoji-${emoji.unified.toLowerCase()}`);\n\n return (\n <button\n className='style--none skin-tones__icon'\n data-testid={`skin-pick-${skin}`}\n aria-label={this.ariaLabel(skinTone)}\n key={skin}\n onClick={() => this.hideSkinTonePicker(skin)}\n >\n <img\n src={imgTrans}\n className={spriteClassName}\n />\n </button>\n );\n });\n return (\n <>\n <div className='skin-tones__close'>\n <button\n className='skin-tones__close-icon style--none'\n onClick={() => this.hideSkinTonePicker(this.props.userSkinTone)}\n aria-label={closeButtonLabel}\n >\n <CloseIcon\n size={16}\n color={'rgba(var(--center-channel-color-rgb), 0.75)'}\n />\n </button>\n <div className='skin-tones__close-text'>\n <FormattedMessage\n {...skinTones[skinTones.length - 1].label}\n />\n </div>\n </div>\n <div className='skin-tones__icons'>\n {choices}\n </div>\n </>\n );\n }\n\n collapsed() {\n const emoji = skinTones.find(({value}) => value === this.props.userSkinTone)!.emoji;\n const spriteClassName = classNames('emojisprite', `emoji-category-${emoji?.category}`, `emoji-${emoji?.unified.toLowerCase()}`);\n const expandButtonLabel = this.props.intl.formatMessage({\n id: 'emoji_picker.skin_tone',\n defaultMessage: 'Skin tone',\n });\n\n return (\n <WithTooltip\n title={expandButtonLabel}\n >\n <button\n data-testid={`skin-picked-${this.props.userSkinTone}`}\n className='style--none skin-tones__icon skin-tones__expand-icon'\n onClick={this.showSkinTonePicker}\n aria-label={expandButtonLabel}\n >\n <img\n alt={'emoji skin tone picker'}\n src={imgTrans}\n className={spriteClassName}\n />\n </button>\n </WithTooltip>\n );\n }\n\n render() {\n return (\n <CSSTransition\n in={this.state.pickerExtended}\n classNames='skin-tones-animation'\n timeout={200}\n >\n <div className={classNames('skin-tones', {'skin-tones--active': this.state.pickerExtended})}>\n <div className={classNames('skin-tones__content', {'skin-tones__content__single': !this.state.pickerExtended})}>\n {this.state.pickerExtended ? this.extended() : this.collapsed()}\n </div>\n </div>\n </CSSTransition>\n );\n }\n}\n\nexport default injectIntl(EmojiPickerSkin);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport throttle from 'lodash/throttle';\nimport React, {useRef, useState, useEffect, useCallback, memo, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {FixedSizeList} from 'react-window';\nimport type InfiniteLoader from 'react-window-infinite-loader';\n\nimport type {Emoji, EmojiCategory} from '@mattermost/types/emojis';\n\nimport {getEmojiName} from 'mattermost-redux/utils/emoji_utils';\n\nimport EmojiPickerCategories from 'components/emoji_picker/components/emoji_picker_categories';\nimport EmojiPickerCurrentResults from 'components/emoji_picker/components/emoji_picker_current_results';\nimport EmojiPickerCustomEmojiButton from 'components/emoji_picker/components/emoji_picker_custom_emoji_button';\nimport EmojiPickerPreview from 'components/emoji_picker/components/emoji_picker_preview';\nimport EmojiPickerSearch from 'components/emoji_picker/components/emoji_picker_search';\nimport EmojiPickerSkin from 'components/emoji_picker/components/emoji_picker_skin';\nimport {\n CATEGORIES,\n RECENT_EMOJI_CATEGORY,\n RECENT,\n SMILEY_EMOTION,\n SEARCH_RESULTS,\n EMOJI_PER_ROW,\n CUSTOM_EMOJI_SEARCH_THROTTLE_TIME_MS,\n} from 'components/emoji_picker/constants';\nimport {NavigationDirection} from 'components/emoji_picker/types';\nimport type {CategoryOrEmojiRow, Categories, EmojiCursor, EmojiPosition, EmojiRow} from 'components/emoji_picker/types';\nimport {createCategoryAndEmojiRows, getCursorProperties, getUpdatedCategoriesAndAllEmojis} from 'components/emoji_picker/utils';\nimport NoResultsIndicator from 'components/no_results_indicator';\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\n\nimport type {PropsFromRedux} from './index';\n\nexport interface Props extends PropsFromRedux {\n filter: string;\n onEmojiClick: (emoji: Emoji) => void;\n handleFilterChange: (filter: string) => void;\n handleEmojiPickerClose: () => void;\n onAddCustomEmojiClick?: () => void;\n}\n\nconst EmojiPicker = ({\n filter,\n onEmojiClick,\n handleFilterChange,\n handleEmojiPickerClose,\n onAddCustomEmojiClick,\n customEmojisEnabled = false,\n customEmojiPage = 0,\n emojiMap,\n recentEmojis,\n userSkinTone,\n currentTeamName,\n actions: {\n getCustomEmojis,\n searchCustomEmojis,\n incrementEmojiPickerPage,\n setUserSkinTone,\n },\n}: Props) => {\n const getInitialActiveCategory = () => (recentEmojis.length ? RECENT : SMILEY_EMOTION);\n const [activeCategory, setActiveCategory] = useState<EmojiCategory>(getInitialActiveCategory);\n\n const [cursor, setCursor] = useState<EmojiCursor>({\n rowIndex: -1,\n emojiId: '',\n emoji: undefined,\n });\n\n // On the first load, categories doesnt contain emojiIds until later when getUpdatedCategoriesAndAllEmojis is called\n const getInitialCategories = () => (recentEmojis.length ? {...RECENT_EMOJI_CATEGORY, ...CATEGORIES} : CATEGORIES);\n const [categories, setCategories] = useState<Categories>(getInitialCategories);\n\n const [allEmojis, setAllEmojis] = useState<Record<string, Emoji>>({});\n\n const [categoryOrEmojisRows, setCategoryOrEmojisRows] = useState<CategoryOrEmojiRow[]>([]);\n\n // contains all emojis visible on screen sorted by category\n const [emojiPositions, setEmojiPositionsArray] = useState<EmojiPosition[]>([]);\n\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const infiniteLoaderRef = React.useRef<InfiniteLoader & {_listRef: FixedSizeList<CategoryOrEmojiRow[]>}>(null);\n\n const shouldRunCreateCategoryAndEmojiRows = useRef<boolean>();\n\n const throttledSearchCustomEmoji = useRef(throttle((newFilter, customEmojisEnabled) => {\n if (customEmojisEnabled && newFilter && newFilter.trim().length) {\n searchCustomEmojis(newFilter);\n }\n }, CUSTOM_EMOJI_SEARCH_THROTTLE_TIME_MS));\n\n useEffect(() => {\n // Delay taking focus because this briefly renders offscreen when using an Overlay\n // so focusing it immediately on mount can cause weird scrolling\n const searchFocusAnimationFrame = window.requestAnimationFrame(() => {\n searchInputRef.current?.focus();\n });\n\n const rootComponent = document.getElementById('root');\n rootComponent?.classList.add('emoji-picker--active');\n\n return () => {\n rootComponent?.classList.remove('emoji-picker--active');\n window.cancelAnimationFrame(searchFocusAnimationFrame);\n };\n }, []);\n\n useEffect(() => {\n shouldRunCreateCategoryAndEmojiRows.current = true;\n\n const [updatedCategories, updatedAllEmojis] = getUpdatedCategoriesAndAllEmojis(emojiMap, recentEmojis, userSkinTone, allEmojis);\n setAllEmojis(updatedAllEmojis);\n setCategories(updatedCategories);\n }, [emojiMap, userSkinTone, recentEmojis]);\n\n useEffect(() => {\n shouldRunCreateCategoryAndEmojiRows.current = false;\n\n const [updatedCategoryOrEmojisRows, updatedEmojiPositions] = createCategoryAndEmojiRows(allEmojis, categories, filter, userSkinTone);\n\n if (activeCategory !== 'custom') {\n selectFirstEmoji(updatedEmojiPositions);\n }\n\n setCategoryOrEmojisRows(updatedCategoryOrEmojisRows);\n setEmojiPositionsArray(updatedEmojiPositions);\n throttledSearchCustomEmoji.current(filter, customEmojisEnabled);\n }, [filter, shouldRunCreateCategoryAndEmojiRows.current, customEmojisEnabled]);\n\n useEffect(() => {\n searchInputRef.current?.focus();\n }, []);\n\n // clear out the active category on search input\n useEffect(() => {\n if (activeCategory !== getInitialActiveCategory()) {\n setActiveCategory(getInitialActiveCategory());\n }\n\n // eslint-disable-next-line no-underscore-dangle\n infiniteLoaderRef?.current?._listRef?.scrollToItem(0, 'start');\n }, [filter]);\n\n // scroll as little as possible on cursor navigation\n useEffect(() => {\n if (cursor.emojiId) {\n // eslint-disable-next-line no-underscore-dangle\n infiniteLoaderRef?.current?._listRef?.scrollToItem(cursor.rowIndex, 'auto');\n }\n }, [cursor.rowIndex]);\n\n const focusOnSearchInput = useCallback(() => {\n searchInputRef.current?.focus();\n }, []);\n\n const getEmojiById = (emojiId: string) => {\n if (!emojiId) {\n return null;\n }\n const emoji = allEmojis[emojiId] || allEmojis[emojiId.toUpperCase()] || allEmojis[emojiId.toLowerCase()];\n return emoji;\n };\n\n const selectFirstEmoji = (emojiPositions: EmojiPosition[]) => {\n if (!emojiPositions[0]) {\n return;\n }\n\n const {rowIndex, emojiId} = emojiPositions[0];\n const cursorEmoji = getEmojiById(emojiId);\n if (cursorEmoji) {\n setCursor({\n rowIndex,\n emojiId,\n emoji: cursorEmoji,\n });\n }\n };\n\n const handleCategoryClick = useCallback((categoryRowIndex: CategoryOrEmojiRow['index'], categoryName: EmojiCategory, emojiId: string) => {\n if (!categoryName || categoryName === activeCategory || !emojiId) {\n return;\n }\n\n setActiveCategory(categoryName);\n\n // eslint-disable-next-line no-underscore-dangle\n infiniteLoaderRef?.current?._listRef?.scrollToItem(categoryRowIndex, 'start');\n\n const cursorEmoji = getEmojiById(emojiId);\n if (cursorEmoji) {\n setCursor({\n rowIndex: categoryRowIndex + 1, // +1 because next row is the emoji row\n emojiId,\n emoji: cursorEmoji,\n });\n }\n }, [activeCategory]);\n\n const resetCursor = useCallback(() => {\n setCursor({\n rowIndex: -1,\n emojiId: '',\n emoji: undefined,\n });\n }, []);\n\n const onAddCustomEmojiClickInner = useCallback(() => {\n handleEmojiPickerClose();\n onAddCustomEmojiClick?.();\n }, []);\n\n const [cursorCategory, cursorCategoryIndex, cursorEmojiIndex] = getCursorProperties(cursor.rowIndex, cursor.emojiId, categoryOrEmojisRows as EmojiRow[]);\n\n function calculateNewCursorForUpArrow(cursorCategory: string, emojiPositions: EmojiPosition[], currentCursorsPositionIndex: number, categories: Categories, focusOnSearchInput: () => void) {\n if ((currentCursorsPositionIndex - EMOJI_PER_ROW) >= 0) {\n // Emoji is present up a row in same x position\n const upTheRowCategoryName = emojiPositions[currentCursorsPositionIndex - EMOJI_PER_ROW].categoryName as EmojiCategory;\n\n if (upTheRowCategoryName !== cursorCategory) {\n // If up the row emoji is in different category, move to that category's last emoji\n const upTheRowCategorysEmojis = categories[upTheRowCategoryName].emojiIds || [];\n const lastEmojiIdUpTheRow = upTheRowCategorysEmojis[upTheRowCategorysEmojis.length - 1];\n const lastEmojiPositionUpTheRow = emojiPositions.find((emojiPosition) => {\n return emojiPosition.emojiId.toLowerCase() === lastEmojiIdUpTheRow.toLowerCase() && emojiPosition.categoryName === upTheRowCategoryName;\n });\n return lastEmojiPositionUpTheRow;\n }\n\n // If up the row emoji is in same category, move up in same category\n return emojiPositions[currentCursorsPositionIndex - EMOJI_PER_ROW];\n }\n\n // When emojis in the assumingly top row are less than EMOJI_PER_ROW,\n // Check if those are of different category\n const startingEmojisOfDifferentCategory = emojiPositions.slice(0, currentCursorsPositionIndex).reverse().find((emojiPosition) => {\n return emojiPosition.categoryName !== cursorCategory;\n });\n\n if (startingEmojisOfDifferentCategory) {\n return startingEmojisOfDifferentCategory;\n }\n\n // We are already at the first row, so focus on search\n focusOnSearchInput();\n return undefined;\n }\n\n function calculateNewCursorForRightOrLeftArrow(moveTo: NavigationDirection, emojiPositions: EmojiPosition[], currentCursorIndexInEmojis: number, focusOnSearchInput: () => void) {\n if (moveTo === NavigationDirection.NextEmoji && ((currentCursorIndexInEmojis + 1) < emojiPositions.length)) {\n // When next emoji is present, move to next emoji\n return emojiPositions[currentCursorIndexInEmojis + 1];\n }\n if (moveTo === NavigationDirection.PreviousEmoji && ((currentCursorIndexInEmojis - 1) >= 0)) {\n // When previous emoji is present, move to previous emoji\n return emojiPositions[currentCursorIndexInEmojis - 1];\n }\n if (moveTo === NavigationDirection.PreviousEmoji && ((currentCursorIndexInEmojis - 1) < 0)) {\n // If cursor was at first emoji then focus on search input\n focusOnSearchInput();\n return undefined;\n }\n\n return undefined;\n }\n\n function calculateNewCursorForDownArrow(cursorCategory: string, emojiPositions: EmojiPosition[], currentCursorsPositionIndex: number, categories: Categories) {\n if ((currentCursorsPositionIndex + EMOJI_PER_ROW) < emojiPositions.length) {\n // Emoji is present down a row in same x position\n const downTheRowCategoryName = emojiPositions[currentCursorsPositionIndex + EMOJI_PER_ROW].categoryName as EmojiCategory;\n\n if (downTheRowCategoryName !== cursorCategory) {\n // If down the row emoji is in different category, move to that category's first emoji\n const downTheRowCategorysEmojis = categories[downTheRowCategoryName].emojiIds || [];\n const firstEmojiIdDownTheRow = downTheRowCategorysEmojis[0];\n const firstEmojiPositionDownTheRow = emojiPositions.find((emojiPosition) => {\n return emojiPosition.emojiId.toLowerCase() === firstEmojiIdDownTheRow.toLowerCase() && emojiPosition.categoryName === downTheRowCategoryName;\n });\n return firstEmojiPositionDownTheRow;\n }\n\n // If down the row emoji is in same category, move to down in same category\n return emojiPositions[currentCursorsPositionIndex + EMOJI_PER_ROW];\n }\n\n // When emoji down the row is not present.\n // Check if the remaining emojis are of different category\n const endingEmojisOfDifferentCategory = emojiPositions.slice(currentCursorsPositionIndex + 1, emojiPositions.length).find((emojiPosition) => {\n return emojiPosition.categoryName !== cursorCategory;\n });\n\n if (endingEmojisOfDifferentCategory) {\n return endingEmojisOfDifferentCategory;\n }\n\n return undefined;\n }\n\n const handleKeyboardEmojiNavigation = (moveTo: NavigationDirection) => {\n // No navigateable emoji are present in the resutls\n if (emojiPositions.length === 0) {\n return;\n }\n\n let newCursor;\n if (cursor.emojiId.length !== 0 && cursor.rowIndex !== -1) {\n // If cursor is on an emoji\n const currentCursorsPositionIndex = emojiPositions.findIndex((emojiPosition) =>\n emojiPosition.rowIndex === cursor.rowIndex && emojiPosition.emojiId.toLowerCase() === cursor.emojiId.toLowerCase());\n\n if (currentCursorsPositionIndex === -1) {\n newCursor = undefined;\n } else if (moveTo === NavigationDirection.NextEmoji || moveTo === NavigationDirection.PreviousEmoji) {\n newCursor = calculateNewCursorForRightOrLeftArrow(moveTo, emojiPositions, currentCursorsPositionIndex, focusOnSearchInput);\n } else if (moveTo === NavigationDirection.NextEmojiRow) {\n newCursor = calculateNewCursorForDownArrow(cursorCategory, emojiPositions, currentCursorsPositionIndex, categories);\n } else if (moveTo === NavigationDirection.PreviousEmojiRow) {\n newCursor = calculateNewCursorForUpArrow(cursorCategory, emojiPositions, currentCursorsPositionIndex, categories, focusOnSearchInput);\n }\n } else if (cursor.emojiId.length === 0 && cursor.rowIndex === -1) {\n if (moveTo === NavigationDirection.NextEmoji || moveTo === NavigationDirection.NextEmojiRow) {\n // if no cursor is selected, set the first emoji on arrows right & down\n if (emojiPositions.length !== 0) {\n newCursor = emojiPositions[0];\n }\n }\n }\n\n // If newCursorIndex is less than 0, abort and do nothing\n if (newCursor === undefined) {\n return;\n }\n\n const newCursorEmoji = getEmojiById(newCursor.emojiId);\n if (!newCursorEmoji) {\n return;\n }\n\n setCursor({\n rowIndex: newCursor.rowIndex,\n emojiId: newCursor.emojiId,\n emoji: newCursorEmoji,\n });\n };\n\n const handleEnterOnEmoji = useCallback(() => {\n const clickedEmoji = cursor.emoji;\n\n if (clickedEmoji) {\n onEmojiClick(clickedEmoji);\n }\n }, [cursor.emojiId]);\n\n const handleEmojiOnMouseOver = (mouseOverCursor: EmojiCursor) => {\n if (mouseOverCursor.emojiId !== cursor.emojiId || cursor.emojiId === '') {\n setCursor(mouseOverCursor);\n }\n };\n\n const cursorEmojiName = useMemo(() => {\n const {emoji} = cursor;\n\n if (!emoji) {\n return '';\n }\n\n const name = getEmojiName(emoji);\n return name.replace(/_/g, ' ');\n }, [cursor.emojiId]);\n\n const areSearchResultsEmpty = filter.length !== 0 && categoryOrEmojisRows.length === 1 && categoryOrEmojisRows?.[0]?.items?.[0]?.categoryName === SEARCH_RESULTS;\n\n return (\n <div\n className='emoji-picker__inner'\n role='application'\n >\n <div\n aria-live='assertive'\n className='sr-only'\n >\n <FormattedMessage\n id='emoji_picker_item.emoji_aria_label'\n defaultMessage='{emojiName} emoji'\n values={{\n emojiName: cursorEmojiName,\n }}\n />\n </div>\n <div className='emoji-picker__search-container'>\n <EmojiPickerSearch\n ref={searchInputRef}\n value={filter}\n cursorCategoryIndex={cursorCategoryIndex}\n cursorEmojiIndex={cursorEmojiIndex}\n focus={focusOnSearchInput}\n onEnter={handleEnterOnEmoji}\n onChange={handleFilterChange}\n onKeyDown={handleKeyboardEmojiNavigation}\n resetCursorPosition={resetCursor}\n />\n <EmojiPickerSkin\n userSkinTone={userSkinTone}\n onSkinSelected={setUserSkinTone}\n />\n </div>\n <EmojiPickerCategories\n isFiltering={filter.length > 0}\n active={activeCategory}\n categories={categories}\n onClick={handleCategoryClick}\n onKeyDown={handleKeyboardEmojiNavigation}\n focusOnSearchInput={focusOnSearchInput}\n />\n {areSearchResultsEmpty ? (\n <NoResultsIndicator\n variant={NoResultsVariant.Search}\n titleValues={{channelName: `${filter}`}}\n />\n ) : (\n <EmojiPickerCurrentResults\n ref={infiniteLoaderRef}\n isFiltering={filter.length > 0}\n activeCategory={activeCategory}\n categoryOrEmojisRows={categoryOrEmojisRows}\n cursorEmojiId={cursor.emojiId}\n cursorRowIndex={cursor.rowIndex}\n setActiveCategory={setActiveCategory}\n onEmojiClick={onEmojiClick}\n onEmojiMouseOver={handleEmojiOnMouseOver}\n getCustomEmojis={getCustomEmojis}\n customEmojiPage={customEmojiPage}\n incrementEmojiPickerPage={incrementEmojiPickerPage}\n customEmojisEnabled={customEmojisEnabled}\n />\n )}\n <div className='emoji-picker__footer'>\n {areSearchResultsEmpty ? <div/> : <EmojiPickerPreview emoji={cursor.emoji}/>}\n <EmojiPickerCustomEmojiButton\n currentTeamName={currentTeamName}\n customEmojisEnabled={customEmojisEnabled}\n onClick={onAddCustomEmojiClickInner}\n />\n </div>\n </div>\n );\n};\n\nexport default memo(EmojiPicker);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getCustomEmojis, searchCustomEmojis} from 'mattermost-redux/actions/emojis';\nimport {getCustomEmojisEnabled} from 'mattermost-redux/selectors/entities/emojis';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {incrementEmojiPickerPage, setUserSkinTone} from 'actions/emoji_actions';\nimport {getEmojiMap, getRecentEmojisNames, getUserSkinTone} from 'selectors/emojis';\n\nimport type {GlobalState} from 'types/store';\n\nimport EmojiPicker from './emoji_picker';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n customEmojisEnabled: getCustomEmojisEnabled(state),\n customEmojiPage: state.views.emoji.emojiPickerCustomPage,\n emojiMap: getEmojiMap(state),\n recentEmojis: getRecentEmojisNames(state),\n userSkinTone: getUserSkinTone(state),\n currentTeamName: getCurrentTeam(state)?.name ?? '',\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getCustomEmojis,\n searchCustomEmojis,\n incrementEmojiPickerPage,\n setUserSkinTone,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(EmojiPicker);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MouseEventHandler} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Props = {\n handleEmojiPickerClose: MouseEventHandler;\n}\n\nconst EmojiPickerHeader = ({handleEmojiPickerClose}: Props) => {\n return (\n <div className='emoji-picker__header modal-header'>\n <button\n type='button'\n className='close emoji-picker__header-close-button'\n onClick={handleEmojiPickerClose}\n >\n <span aria-hidden='true'>{'×'}</span>\n <span className='sr-only'>\n <FormattedMessage\n id={'emoji_picker.close'}\n defaultMessage={'Close'}\n />\n </span>\n </button>\n <h4 className='modal-title emoji-picker__header-title'>\n <FormattedMessage\n id={'emoji_picker.header'}\n defaultMessage={'Emoji Picker'}\n />\n </h4>\n </div>\n );\n};\n\nexport default React.memo(EmojiPickerHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {HTMLAttributes} from 'react';\nimport React from 'react';\n\nfunction GiphyIcon(props: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span {...props}>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16px'\n height='16px'\n viewBox='0 0 20 20'\n >\n <path\n d='M16 10V18H4V2H7.73654L9.73654 0H2V20H18V8L16 10Z'\n fill='inherit'\n />\n <path\n d='M11 0H13.3333V2.33325H15.6667V4.66675H18V7.00008H11V0Z'\n fill='inherit'\n />\n </svg>\n </span>\n );\n}\n\nexport default GiphyIcon;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {CSSProperties, RefObject} from 'react';\nimport React, {PureComponent, createRef} from 'react';\nimport {Tab, Tabs} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport EmojiPicker from 'components/emoji_picker';\nimport EmojiPickerHeader from 'components/emoji_picker/components/emoji_picker_header';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport GifIcon from 'components/widgets/icons/giphy_icon';\n\nconst GifPicker = makeAsyncComponent('GifPicker', React.lazy(() => import('components/gif_picker/gif_picker')));\n\nexport interface Props {\n style?: CSSProperties;\n rightOffset?: number;\n topOffset?: number;\n leftOffset?: number;\n placement?: ('top' | 'bottom' | 'left' | 'right');\n onEmojiClose: () => void;\n onEmojiClick: (emoji: Emoji) => void;\n onGifClick?: (gif: string) => void;\n onAddCustomEmojiClick?: () => void;\n enableGifPicker?: boolean;\n}\n\ntype State = {\n emojiTabVisible: boolean;\n filter: string;\n}\n\nexport default class EmojiPickerTabs extends PureComponent<Props, State> {\n private rootPickerNodeRef: RefObject<HTMLDivElement>;\n\n static defaultProps = {\n rightOffset: 0,\n topOffset: 0,\n leftOffset: 0,\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n emojiTabVisible: true,\n filter: '',\n };\n\n this.rootPickerNodeRef = createRef();\n }\n\n handleEmojiPickerClose = () => {\n this.props.onEmojiClose();\n };\n\n handleFilterChange = (filter: string) => {\n this.setState({filter});\n };\n\n getRootPickerNode = () => {\n return this.rootPickerNodeRef.current;\n };\n\n render() {\n let pickerStyle;\n if (this.props.style && !(this.props.style.left === 0 && this.props.style.top === 0)) {\n if (this.props.placement === 'top' || this.props.placement === 'bottom') {\n // Only take the top/bottom position passed by React Bootstrap since we want to be right-aligned\n pickerStyle = {\n top: this.props.style.top,\n bottom: this.props.style.bottom,\n right: this.props?.rightOffset,\n };\n } else {\n pickerStyle = {...this.props.style};\n }\n\n if (pickerStyle.top) {\n pickerStyle.top = (this.props.topOffset || 0) + (pickerStyle.top as number);\n } else {\n pickerStyle.top = this.props.topOffset;\n }\n\n if (pickerStyle.left) {\n (pickerStyle.left as number) += (this.props.leftOffset || 0);\n }\n }\n\n if (this.props.enableGifPicker && typeof this.props.onGifClick != 'undefined') {\n return (\n <div\n id='emojiGifPicker'\n ref={this.rootPickerNodeRef}\n style={pickerStyle}\n className={classNames('a11y__popup', 'emoji-picker', {\n bottom: this.props.placement === 'bottom',\n })}\n >\n <Tabs\n id='emoji-picker-tabs'\n defaultActiveKey={1}\n justified={true}\n mountOnEnter={true}\n unmountOnExit={true}\n >\n <EmojiPickerHeader handleEmojiPickerClose={this.handleEmojiPickerClose}/>\n <Tab\n eventKey={1}\n title={\n <div className={'custom-emoji-tab__icon__text'}>\n <EmojiIcon\n className='custom-emoji-tab__icon'\n aria-hidden={true}\n />\n <FormattedMessage\n id='emoji_gif_picker.tabs.emojis'\n defaultMessage='Emojis'\n />\n </div>\n }\n unmountOnExit={true}\n tabClassName={'custom-emoji-tab'}\n >\n <EmojiPicker\n filter={this.state.filter}\n onEmojiClick={this.props.onEmojiClick}\n handleFilterChange={this.handleFilterChange}\n handleEmojiPickerClose={this.handleEmojiPickerClose}\n />\n </Tab>\n <Tab\n eventKey={2}\n title={\n <div className={'custom-emoji-tab__icon__text'}>\n <GifIcon\n className='custom-emoji-tab__icon'\n aria-hidden={true}\n />\n <FormattedMessage\n id='emoji_gif_picker.tabs.gifs'\n defaultMessage='GIFs'\n />\n </div>\n }\n unmountOnExit={true}\n tabClassName={'custom-emoji-tab'}\n >\n <GifPicker\n filter={this.state.filter}\n getRootPickerNode={this.getRootPickerNode}\n onGifClick={this.props.onGifClick}\n handleFilterChange={this.handleFilterChange}\n />\n </Tab>\n </Tabs>\n </div>\n );\n }\n\n return (\n <div\n id='emojiPicker'\n style={pickerStyle}\n className={classNames('a11y__popup', 'emoji-picker', 'emoji-picker--single', {\n bottom: this.props.placement === 'bottom',\n })}\n >\n <EmojiPickerHeader handleEmojiPickerClose={this.handleEmojiPickerClose}/>\n <EmojiPicker\n filter={this.state.filter}\n onEmojiClick={this.props.onEmojiClick}\n handleFilterChange={this.handleFilterChange}\n handleEmojiPickerClose={this.handleEmojiPickerClose}\n onAddCustomEmojiClick={this.props.onAddCustomEmojiClick}\n />\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport memoize from 'memoize-one';\nimport React from 'react';\nimport type {ComponentProps, ReactNode} from 'react';\nimport {Overlay} from 'react-bootstrap';\n\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport {Constants} from 'utils/constants';\nimport {popOverOverlayPosition} from 'utils/position_utils';\n\nimport EmojiPickerTabs from '../emoji_picker_tabs';\n\nimport type {PropsFromRedux} from './index';\n\nexport interface Props extends PropsFromRedux {\n target: () => ReactNode;\n onEmojiClick: (emoji: Emoji) => void;\n onGifClick?: (gif: string) => void;\n onAddCustomEmojiClick?: () => void;\n onHide: () => void;\n onExited?: () => void;\n show: boolean;\n placement?: ComponentProps<typeof Overlay>['placement'];\n topOffset?: number;\n rightOffset?: number;\n leftOffset?: number;\n spaceRequiredAbove?: number;\n spaceRequiredBelow?: number;\n enableGifPicker?: boolean;\n defaultHorizontalPosition?: 'left' | 'right';\n}\n\nexport default class EmojiPickerOverlay extends React.PureComponent<Props> {\n // An emoji picker in the center channel is contained within the post list, so it needs space\n // above for the channel header and below for the post textbox\n static CENTER_SPACE_REQUIRED_ABOVE = 476;\n static CENTER_SPACE_REQUIRED_BELOW = 497;\n\n // An emoji picker in the RHS isn't constrained by the RHS, so it just needs space to fit\n // the emoji picker itself\n static RHS_SPACE_REQUIRED_ABOVE = 420;\n static RHS_SPACE_REQUIRED_BELOW = 420;\n\n // Reasonable defaults calculated from the center channel\n static defaultProps = {\n spaceRequiredAbove: EmojiPickerOverlay.CENTER_SPACE_REQUIRED_ABOVE,\n spaceRequiredBelow: EmojiPickerOverlay.CENTER_SPACE_REQUIRED_BELOW,\n enableGifPicker: false,\n };\n\n emojiPickerPosition = memoize((emojiTrigger, show) => {\n let calculatedRightOffset = Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n\n if (!show) {\n return calculatedRightOffset;\n }\n\n if (emojiTrigger) {\n calculatedRightOffset = window.innerWidth - emojiTrigger.getBoundingClientRect().left - Constants.DEFAULT_EMOJI_PICKER_LEFT_OFFSET;\n\n if (calculatedRightOffset < Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET) {\n calculatedRightOffset = Constants.DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n }\n }\n\n return calculatedRightOffset;\n });\n\n getPlacement = memoize((target, spaceRequiredAbove, spaceRequiredBelow, defaultHorizontalPosition, show) => {\n if (!show) {\n return 'top' as const;\n }\n\n if (target) {\n const targetBounds = target.getBoundingClientRect();\n return popOverOverlayPosition(targetBounds, window.innerHeight, spaceRequiredAbove, spaceRequiredBelow, defaultHorizontalPosition);\n }\n\n return 'top' as const;\n });\n\n render() {\n const {target, rightOffset, spaceRequiredAbove, spaceRequiredBelow, defaultHorizontalPosition, show, isMobileView} = this.props;\n const calculatedRightOffset = typeof rightOffset === 'undefined' ? this.emojiPickerPosition(target(), show) : rightOffset;\n const placement = this.getPlacement(target(), spaceRequiredAbove, spaceRequiredBelow, defaultHorizontalPosition, show);\n\n return (\n <Overlay\n show={show}\n placement={this.props.placement ?? placement}\n rootClose={!isMobileView}\n onHide={this.props.onHide}\n target={target}\n animation={false}\n onExited={this.props?.onExited}\n >\n <EmojiPickerTabs\n enableGifPicker={this.props.enableGifPicker}\n onEmojiClose={this.props.onHide}\n onEmojiClick={this.props.onEmojiClick}\n onGifClick={this.props.onGifClick}\n rightOffset={calculatedRightOffset}\n topOffset={this.props.topOffset}\n leftOffset={this.props.leftOffset}\n onAddCustomEmojiClick={this.props.onAddCustomEmojiClick}\n />\n </Overlay>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps} from 'react';\nimport type {Overlay} from 'react-bootstrap';\n\nexport function popOverOverlayPosition(\n targetBounds: DOMRect,\n innerHeight: number,\n spaceRequiredAbove: number,\n spaceRequiredBelow?: number,\n horizontalPosition?: 'left' | 'right',\n) {\n let placement: ComponentProps<typeof Overlay>['placement'];\n\n if (targetBounds.top > spaceRequiredAbove) {\n placement = 'top';\n } else if (innerHeight - targetBounds.bottom > (spaceRequiredBelow || spaceRequiredAbove)) {\n placement = 'bottom';\n } else {\n placement = horizontalPosition || 'left';\n }\n return placement;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\n\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport type {GlobalState} from 'types/store';\n\nimport EmojiPickerOverlay from './emoji_picker_overlay';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n isMobileView: getIsMobileView(state),\n };\n}\n\nconst connector = connect(mapStateToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(EmojiPickerOverlay);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {PostImage} from '@mattermost/types/posts';\n\nexport const isSVGImage = (imageMetadata: PostImage | undefined, src: string) => {\n if (!imageMetadata) {\n // Just check if the string contains an svg extension instead of if it ends with one because it avoids\n // having to deal with query strings and proxied image URLs\n return src.indexOf('.svg') !== -1;\n }\n return imageMetadata.format === 'svg';\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport type {PostImage} from '@mattermost/types/posts';\n\nimport {getImageSrc} from 'utils/post_utils';\n\nimport {isSVGImage} from './is_svg_image';\n\ntype Props = {\n children: (src: string) => React.ReactNode;\n enableSVGs: boolean;\n hasImageProxy: boolean;\n imageMetadata?: PostImage;\n src: string;\n}\n\nconst ExternalImage = (props: Props) => {\n const shouldRenderImage = props.enableSVGs || !isSVGImage(props.imageMetadata, props.src);\n let src = getImageSrc(props.src, props.hasImageProxy);\n if (!shouldRenderImage) {\n src = '';\n }\n return (<>{props.children(src)}</>);\n};\n\nexport default memo(ExternalImage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport ExternalImage from './external_image';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n\n return {\n enableSVGs: config.EnableSVGs === 'true',\n hasImageProxy: config.HasImageProxy === 'true',\n };\n}\n\nexport default connect(mapStateToProps)(ExternalImage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFileThumbnailUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\n\nimport type {FilePreviewInfo} from 'components/file_preview/file_preview';\n\nimport Constants, {FileTypes} from 'utils/constants';\nimport {getFileTypeFromMime} from 'utils/file_utils';\nimport {\n getFileType,\n getIconClassName,\n isGIFImage,\n} from 'utils/utils';\n\ntype FilePreviewInfoLimited = Pick<FilePreviewInfo, 'clientId' | 'name' | 'percent' | 'type'>;\n\ntype Props = {\n enableSVGs: boolean;\n fileInfo: FileInfo | FilePreviewInfo | FilePreviewInfoLimited;\n disablePreview?: boolean;\n};\n\nconst FileThumbnail = ({\n fileInfo,\n enableSVGs,\n disablePreview,\n}: Props) => {\n const {id, extension, has_preview_image: hasPreviewImage, width = 0, height = 0} = (fileInfo as FileInfo);\n const mimeType = (fileInfo as FileInfo).mime_type || (fileInfo as FilePreviewInfo | FilePreviewInfoLimited).type;\n\n let type = FileTypes.OTHER;\n if (extension) {\n type = getFileType(extension);\n } else if (mimeType) {\n type = getFileTypeFromMime(mimeType);\n }\n\n if (id && !disablePreview) {\n if (type === FileTypes.IMAGE) {\n let className = 'post-image';\n\n if (width < Constants.THUMBNAIL_WIDTH && height < Constants.THUMBNAIL_HEIGHT) {\n className += ' small';\n } else {\n className += ' normal';\n }\n\n let thumbnailUrl = getFileThumbnailUrl(id);\n if (extension && isGIFImage(extension) && !hasPreviewImage) {\n thumbnailUrl = getFileUrl(id);\n }\n\n return (\n <div\n className={className}\n style={{\n backgroundImage: `url(${thumbnailUrl})`,\n backgroundSize: 'cover',\n }}\n />\n );\n } else if (extension === FileTypes.SVG && enableSVGs) {\n return (\n <img\n alt={'file thumbnail image'}\n className='post-image normal'\n src={getFileUrl(id)}\n />\n );\n }\n }\n\n return <div className={'file-icon ' + getIconClassName(type)}/>;\n};\n\nexport default memo(FileThumbnail);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport FileThumbnail from './file_thumbnail';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n enableSVGs: getConfig(state).EnableSVGs === 'true',\n };\n}\n\nexport default connect(mapStateToProps)(FileThumbnail);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function AttachmentIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='16px'\n height='16px'\n viewBox='0 0 16 16'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.attach', defaultMessage: 'Attachment Icon'})}\n >\n <g\n fill='inherit'\n fillRule='evenodd'\n >\n <g\n transform='translate(-1029.000000, -954.000000)'\n fillRule='nonzero'\n fill='inherit'\n >\n <g transform='translate(25.000000, 937.000000)'>\n <g transform='translate(1004.000000, 17.000000)'>\n <path d='M5.35,15.56 C3.98,15.56 2.61,15.039 1.567,13.997 C0.557,12.984 0,11.642 0,10.212 C0,8.783 0.557,7.44 1.566,6.429 L6.869,1.126 C8.371,-0.376 10.812,-0.375 12.314,1.125 C13.815,2.627 13.815,5.069 12.314,6.57 L7.011,11.873 C6.094,12.792 4.603,12.79 3.687,11.873 C2.771,10.958 2.771,9.467 3.687,8.551 L8.99,3.248 C9.323,2.916 9.861,2.916 10.193,3.248 C10.525,3.579 10.525,4.118 10.193,4.449 L4.89,9.752 C4.637,10.006 4.637,10.418 4.89,10.672 C5.143,10.923 5.555,10.925 5.809,10.672 L11.113,5.369 C11.952,4.53 11.952,3.166 11.113,2.327 C10.276,1.49 8.911,1.488 8.073,2.327 L2.769,7.631 C2.079,8.32 1.699,9.237 1.699,10.212 C1.699,11.188 2.079,12.104 2.768,12.794 C4.19,14.216 6.502,14.216 7.925,12.798 L7.929,12.794 C7.929,12.793 7.929,12.793 7.929,12.793 L15.355,5.369 C15.687,5.037 16.224,5.037 16.556,5.369 C16.888,5.7 16.888,6.239 16.556,6.57 L8.779,14.348 L8.761,14.332 C7.776,15.15 6.562,15.56 5.35,15.56 Z'/>\n </g>\n </g>\n </g>\n </g>\n </svg>\n </span>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage} from 'react-intl';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFileDownloadUrl} from 'mattermost-redux/utils/file_utils';\n\nimport ExternalLink from 'components/external_link';\nimport AttachmentIcon from 'components/widgets/icons/attachment_icon';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {trimFilename} from 'utils/file_utils';\nimport {localizeMessage} from 'utils/utils';\n\ntype Props = {\n\n /*\n * File detailed information\n */\n fileInfo: FileInfo;\n\n /*\n * Handler for when the thumbnail is clicked passed the index above\n */\n handleImageClick?: (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => void;\n\n /*\n * Display in compact format\n */\n compactDisplay?: boolean;\n\n /*\n * If it should display link to download on file name\n */\n canDownload?: boolean;\n\n /*\n * Optional children like download icon\n */\n children?: React.ReactNode;\n\n /*\n * Optional class like for icon\n */\n iconClass?: string;\n}\n\nexport default class FilenameOverlay extends React.PureComponent<Props> {\n render() {\n const {\n canDownload,\n children,\n compactDisplay,\n fileInfo,\n handleImageClick,\n iconClass,\n } = this.props;\n\n const fileName = fileInfo.name;\n const trimmedFilename = trimFilename(fileName);\n\n let filenameOverlay;\n if (compactDisplay) {\n filenameOverlay = (\n <WithTooltip\n title={fileName}\n >\n <a\n href='#'\n onClick={handleImageClick}\n className='post-image__name'\n rel='noopener noreferrer'\n >\n <AttachmentIcon className='icon'/>\n {trimmedFilename}\n </a>\n </WithTooltip>\n );\n } else if (canDownload) {\n filenameOverlay = (\n <div className={iconClass || 'post-image__name'}>\n <WithTooltip\n title={defineMessage({id: 'view_image_popover.download', defaultMessage: 'Download'})}\n >\n <ExternalLink\n href={getFileDownloadUrl(fileInfo.id)}\n aria-label={localizeMessage({id: 'view_image_popover.download', defaultMessage: 'Download'}).toLowerCase()}\n download={fileName}\n location='filename_overlay'\n >\n {children || trimmedFilename}\n </ExternalLink>\n </WithTooltip>\n </div>\n );\n } else {\n filenameOverlay = (\n <span className='post-image__name'>\n {trimmedFilename}\n </span>\n );\n }\n\n return (filenameOverlay);\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport useGetLimits from 'components/common/hooks/useGetLimits';\n\nimport {asGBString} from 'utils/limits';\n\nexport default function ArchivedTooltip() {\n const intl = useIntl();\n\n return (\n <>\n <div className='post-image__archived-tooltip-title'>\n {intl.formatMessage({\n id: 'workspace_limits.archived_file.tooltip_title',\n defaultMessage: 'Unarchive this file by upgrading',\n })}\n </div>\n <div className='post-image__archived-tooltip-description'>\n {intl.formatMessage(\n {\n id: 'workspace_limits.archived_file.tooltip_description',\n defaultMessage: 'Your workspace has hit the file storage limit of {storageLimit}. To view this again, upgrade to a paid plan',\n },\n {\n storageLimit: asGBString(useGetLimits()[0].files?.total_storage || 0, intl.formatNumber),\n },\n )}\n </div>\n </>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useRef, useState, useEffect} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport {ArchiveOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFileThumbnailUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\n\nimport GetPublicModal from 'components/get_public_link_modal';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {Constants, FileTypes, ModalIdentifiers} from 'utils/constants';\nimport {trimFilename} from 'utils/file_utils';\nimport {\n fileSizeToString,\n getFileType,\n loadImage,\n} from 'utils/utils';\n\nimport ArchivedTooltip from './archived_tooltip';\nimport FileThumbnail from './file_thumbnail';\nimport FilenameOverlay from './filename_overlay';\n\nimport type {PropsFromRedux} from './index';\n\ntype Props = PropsFromRedux & {\n\n /*\n * File detailed information\n */\n fileInfo: FileInfo;\n\n /*\n * The index of this attachment preview in the parent FileAttachmentList\n */\n index: number;\n\n /*\n * Handler for when the thumbnail is clicked passed the index above\n */\n handleImageClick?: (index: number) => void;\n\n /*\n * Display in compact format\n */\n compactDisplay?: boolean;\n disablePreview?: boolean;\n handleFileDropdownOpened?: (open: boolean) => void;\n disableThumbnail?: boolean;\n disableActions?: boolean;\n};\n\nexport default function FileAttachment(props: Props) {\n const mounted = useRef(true);\n\n const {formatMessage} = useIntl();\n\n const [loaded, setLoaded] = useState(getFileType(props.fileInfo.extension) !== FileTypes.IMAGE);\n const [loadFilesCalled, setLoadFilesCalled] = useState(false);\n const [keepOpen, setKeepOpen] = useState(false);\n const [openUp, setOpenUp] = useState(false);\n\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n\n const handleImageLoaded = () => {\n if (mounted.current) {\n setLoaded(true);\n }\n };\n\n const loadFiles = () => {\n const fileInfo = props.fileInfo;\n if (fileInfo.archived) {\n // if archived, file preview will not be accessible anyway.\n // So skip trying to load.\n return;\n }\n const fileType = getFileType(fileInfo.extension);\n\n if (!props.disableThumbnail) {\n if (fileType === FileTypes.IMAGE) {\n const thumbnailUrl = getFileThumbnailUrl(fileInfo.id);\n\n loadImage(thumbnailUrl, handleImageLoaded);\n } else if (fileInfo.extension === FileTypes.SVG && props.enableSVGs) {\n loadImage(getFileUrl(fileInfo.id), handleImageLoaded);\n }\n }\n };\n\n useEffect(() => {\n if (!loadFilesCalled) {\n setLoadFilesCalled(true);\n loadFiles();\n }\n }, [loadFilesCalled]);\n\n useEffect(() => {\n if (!loaded && props.fileInfo.id) {\n loadFiles();\n }\n }, [props.fileInfo.id, loaded]);\n\n useEffect(() => {\n return () => {\n mounted.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (props.fileInfo.id) {\n setLoaded(getFileType(props.fileInfo.extension) !== FileTypes.IMAGE && !(props.enableSVGs && props.fileInfo.extension === FileTypes.SVG));\n }\n }, [props.fileInfo.extension, props.fileInfo.id, props.enableSVGs]);\n\n const onAttachmentClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (props.fileInfo.archived || props.disablePreview) {\n return;\n }\n\n if ('blur' in e.target) {\n (e.target as HTMLElement).blur();\n }\n\n if (props.handleImageClick) {\n props.handleImageClick(props.index);\n }\n };\n\n const handleDropdownOpened = (open: boolean) => {\n props.handleFileDropdownOpened?.(open);\n setKeepOpen(open);\n\n if (open) {\n setMenuPosition();\n }\n };\n\n const setMenuPosition = () => {\n if (!buttonRef.current) {\n return;\n }\n\n const anchorRect = buttonRef.current?.getBoundingClientRect();\n let y;\n if (typeof anchorRect?.y === 'undefined') {\n y = typeof anchorRect?.top === 'undefined' ? 0 : anchorRect?.top;\n } else {\n y = anchorRect?.y;\n }\n const windowHeight = window.innerHeight;\n\n const totalSpace = windowHeight - 80;\n const spaceOnTop = y - Constants.CHANNEL_HEADER_HEIGHT;\n const spaceOnBottom = (totalSpace - (spaceOnTop + Constants.POST_AREA_HEIGHT));\n\n setOpenUp(spaceOnTop > spaceOnBottom);\n };\n\n const handleGetPublicLink = () => {\n props.actions.openModal({\n modalId: ModalIdentifiers.GET_PUBLIC_LINK_MODAL,\n dialogType: GetPublicModal,\n dialogProps: {\n fileId: props.fileInfo.id,\n },\n });\n };\n\n const renderFileMenuItems = () => {\n const {enablePublicLink, fileInfo, pluginMenuItems} = props;\n\n let divider;\n const defaultItems = [];\n if (enablePublicLink) {\n defaultItems.push(\n <Menu.ItemAction\n data-title='Public Image'\n key={fileInfo.id + '_publiclinkmenuitem'}\n onClick={handleGetPublicLink}\n ariaLabel={formatMessage({id: 'view_image_popover.publicLink', defaultMessage: 'Get a public link'})}\n text={formatMessage({id: 'view_image_popover.publicLink', defaultMessage: 'Get a public link'})}\n />,\n );\n }\n\n const pluginItems = pluginMenuItems?.filter((item) => item?.match(fileInfo)).map((item) => {\n return (\n <Menu.ItemAction\n id={item.id + '_pluginmenuitem'}\n key={item.id + '_pluginmenuitem'}\n onClick={() => item?.action(fileInfo)}\n text={item.text}\n />\n );\n });\n\n const isMenuVisible = defaultItems?.length || pluginItems?.length;\n if (!isMenuVisible) {\n return null;\n }\n\n const isDividerVisible = defaultItems?.length && pluginItems?.length;\n if (isDividerVisible) {\n divider = (\n <li\n id={`divider_file_${fileInfo.id}_plugins`}\n className='MenuItem__divider'\n role='menuitem'\n />\n );\n }\n\n return (\n <MenuWrapper\n onToggle={handleDropdownOpened}\n stopPropagationOnToggle={true}\n >\n <WithTooltip\n title={formatMessage({id: 'file_search_result_item.more_actions', defaultMessage: 'More Actions'})}\n >\n <button\n ref={buttonRef}\n id={`file_action_button_${props.fileInfo.id}`}\n aria-label={formatMessage({id: 'file_search_result_item.more_actions', defaultMessage: 'More Actions'}).toLowerCase()}\n className={classNames(\n 'file-dropdown-icon', 'dots-icon',\n {'a11y--active': keepOpen},\n )}\n aria-expanded={keepOpen}\n >\n <i className='icon icon-dots-vertical'/>\n </button>\n </WithTooltip>\n <Menu\n id={`file_dropdown_${props.fileInfo.id}`}\n ariaLabel={'file menu'}\n openLeft={true}\n openUp={openUp}\n >\n {defaultItems}\n {divider}\n {pluginItems}\n </Menu>\n </MenuWrapper>\n );\n };\n\n const {compactDisplay, fileInfo} = props;\n\n let fileThumbnail;\n let fileDetail;\n let fileActions;\n const ariaLabelImage = `${formatMessage({id: 'file_attachment.thumbnail', defaultMessage: 'file thumbnail'})} ${fileInfo.name}`.toLowerCase();\n\n if (!compactDisplay) {\n fileThumbnail = (\n <a\n aria-label={ariaLabelImage}\n className='post-image__thumbnail'\n href='#'\n onClick={onAttachmentClick}\n >\n {loaded && !props.disableThumbnail ? (\n <FileThumbnail\n fileInfo={fileInfo}\n disablePreview={props.disablePreview}\n />\n ) : (\n <FileThumbnail\n fileInfo={props.fileInfo}\n disablePreview={true}\n />\n )}\n </a>\n );\n\n if (fileInfo.archived) {\n fileThumbnail = (\n <ArchiveOutlineIcon\n size={48}\n color={'rgba(var(--center-channel-color-rgb), 0.48)'}\n data-testid='archived-file-icon'\n />\n );\n }\n\n fileDetail = (\n <div\n className='post-image__detail_wrapper'\n onClick={onAttachmentClick}\n >\n <div className='post-image__detail'>\n <span\n className={classNames('post-image__name', {\n 'post-image__name--archived': fileInfo.archived,\n })}\n >\n {fileInfo.name}\n </span>\n {fileInfo.archived ? <span className={'post-image__archived'}>\n\n <FormattedMessage\n id='workspace_limits.archived_file.archived'\n defaultMessage='This file is archived'\n />\n </span> : <>\n <span className='post-image__type'>{fileInfo.extension.toUpperCase()}</span>\n <span className='post-image__size'>{fileSizeToString(fileInfo.size)}</span>\n </>\n }\n </div>\n </div>\n );\n\n if (!fileInfo.archived && !props.disableActions) {\n fileActions = renderFileMenuItems();\n }\n }\n\n let filenameOverlay;\n if (props.canDownloadFiles && !fileInfo.archived) {\n filenameOverlay = (\n <FilenameOverlay\n fileInfo={fileInfo}\n compactDisplay={compactDisplay}\n canDownload={props.canDownloadFiles}\n handleImageClick={onAttachmentClick}\n iconClass={'post-image__download'}\n >\n <i className='icon icon-download-outline'/>\n </FilenameOverlay>\n );\n } else if (fileInfo.archived && compactDisplay) {\n const fileName = fileInfo.name;\n const trimmedFilename = trimFilename(fileName);\n fileThumbnail = (\n <ArchiveOutlineIcon\n size={16}\n color={'rgba(var(--center-channel-color-rgb), 0.48)'}\n data-testid='archived-file-icon'\n />\n );\n filenameOverlay =\n (<span className='post-image__archived-name'>\n <span className='post-image__archived-filename'>\n {trimmedFilename}\n </span>\n <span className='post-image__archived-label'>\n {formatMessage({\n id: 'workspace_limits.archived_file.archived_compact',\n defaultMessage: '(archived)',\n })}\n </span>\n </span>);\n }\n\n return (\n <WithTooltip\n title={<ArchivedTooltip/>}\n disabled={!fileInfo.archived}\n >\n <div\n className={classNames([\n 'post-image__column',\n {'keep-open': keepOpen},\n {'post-image__column--archived': fileInfo.archived},\n ])}\n >\n {fileThumbnail}\n <div className='post-image__details'>\n {fileDetail}\n {fileActions}\n {filenameOverlay}\n </div>\n </div>\n </WithTooltip>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {openModal} from 'actions/views/modals';\nimport {getFilesDropdownPluginMenuItems} from 'selectors/plugins';\n\nimport {canDownloadFiles} from 'utils/file_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport FileAttachment from './file_attachment';\n\nexport type OwnProps = {\n preventDownload?: boolean;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const config = getConfig(state);\n\n return {\n canDownloadFiles: !ownProps.preventDownload && canDownloadFiles(config),\n enableSVGs: config.EnableSVGs === 'true',\n enablePublicLink: config.EnablePublicLink === 'true',\n pluginMenuItems: getFilesDropdownPluginMenuItems(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(FileAttachment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {KeyboardEvent, MouseEvent} from 'react';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFilePreviewUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\n\nimport FilePreviewModal from 'components/file_preview_modal';\nimport SizeAwareImage from 'components/size_aware_image';\n\nimport {FileTypes, ModalIdentifiers} from 'utils/constants';\nimport {\n getFileType,\n} from 'utils/utils';\n\nimport type {PropsFromRedux} from './index';\n\nconst PREVIEW_IMAGE_MIN_DIMENSION = 50;\nconst DISPROPORTIONATE_HEIGHT_RATIO = 20;\n\nexport interface Props extends PropsFromRedux {\n postId: string;\n fileInfo: FileInfo;\n isRhsOpen: boolean;\n enablePublicLink: boolean;\n compactDisplay?: boolean;\n isEmbedVisible?: boolean;\n isInPermalink?: boolean;\n disableActions?: boolean;\n}\n\ntype State = {\n loaded: boolean;\n dimensions: {\n width: number;\n height: number;\n };\n}\n\nexport default class SingleImageView extends React.PureComponent<Props, State> {\n private mounted = false;\n static defaultProps = {\n compactDisplay: false,\n };\n\n constructor(props: Props) {\n super(props);\n this.state = {\n loaded: false,\n dimensions: {\n width: props.fileInfo?.width || 0,\n height: props.fileInfo?.height || 0,\n },\n };\n }\n\n componentDidMount() {\n this.mounted = true;\n }\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if ((props.fileInfo?.width !== state.dimensions.width) || props.fileInfo.height !== state.dimensions.height) {\n return {\n dimensions: {\n width: props.fileInfo?.width,\n height: props.fileInfo?.height,\n },\n };\n }\n return null;\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n imageLoaded = () => {\n if (this.mounted) {\n this.setState({loaded: true});\n }\n };\n\n handleImageClick = (e: (KeyboardEvent<HTMLImageElement> | MouseEvent<HTMLDivElement | HTMLImageElement>)) => {\n e.preventDefault();\n\n this.props.actions.openModal({\n modalId: ModalIdentifiers.FILE_PREVIEW_MODAL,\n dialogType: FilePreviewModal,\n dialogProps: {\n fileInfos: [this.props.fileInfo],\n postId: this.props.postId,\n startIndex: 0,\n },\n });\n };\n\n toggleEmbedVisibility = (e: React.MouseEvent) => {\n // stopping propagation to avoid accidentally closing edit history\n // section when clicking on image collapse/expand button.\n e.stopPropagation();\n this.props.actions.toggleEmbedVisibility(this.props.postId);\n };\n\n getFilePublicLink = () => {\n return this.props.actions.getFilePublicLink(this.props.fileInfo.id);\n };\n\n render() {\n const {fileInfo, compactDisplay, isInPermalink} = this.props;\n const {\n loaded,\n } = this.state;\n\n if (fileInfo === undefined) {\n return <></>;\n }\n\n const {has_preview_image: hasPreviewImage, id} = fileInfo;\n const fileURL = getFileUrl(id);\n const previewURL = hasPreviewImage ? getFilePreviewUrl(id) : fileURL;\n\n const previewHeight = fileInfo.height;\n const previewWidth = fileInfo.width;\n\n const hasDisproportionateHeight = previewHeight / previewWidth > DISPROPORTIONATE_HEIGHT_RATIO;\n let minPreviewClass = '';\n if (\n (previewWidth < PREVIEW_IMAGE_MIN_DIMENSION ||\n previewHeight < PREVIEW_IMAGE_MIN_DIMENSION) && !hasDisproportionateHeight\n ) {\n minPreviewClass = 'min-preview ';\n\n if (previewHeight > previewWidth) {\n minPreviewClass += 'min-preview--portrait ';\n }\n }\n\n // Add compact display class to image class if in compact mode\n if (compactDisplay) {\n minPreviewClass += ' compact-display';\n }\n\n const toggle = (\n <button\n key='toggle'\n className='style--none single-image-view__toggle'\n data-expanded={this.props.isEmbedVisible}\n aria-label='Toggle Embed Visibility'\n onClick={this.toggleEmbedVisibility}\n >\n <span\n className={classNames('icon', {\n 'icon-menu-down': this.props.isEmbedVisible,\n 'icon-menu-right': !this.props.isEmbedVisible,\n })}\n />\n </button>\n );\n\n const fileHeader = (\n <div\n className={classNames('image-header', {\n 'image-header--expanded': this.props.isEmbedVisible,\n })}\n >\n {toggle}\n {!this.props.isEmbedVisible && (\n <div\n data-testid='image-name'\n className={classNames('image-name', {\n 'compact-display': compactDisplay,\n })}\n >\n <div\n id='image-name-text'\n onClick={this.handleImageClick}\n >\n {fileInfo.name}\n </div>\n </div>\n )}\n </div>\n );\n\n let fadeInClass = '';\n let permalinkClass = '';\n\n const fileType = getFileType(fileInfo.extension);\n let styleIfSvgWithDimensions = {};\n let imageContainerStyle = {};\n let svgClass = '';\n if (fileType === FileTypes.SVG) {\n svgClass = 'svg';\n if (this.state.dimensions.height) {\n styleIfSvgWithDimensions = {\n width: '100%',\n };\n } else {\n imageContainerStyle = {\n height: 350,\n maxWidth: '100%',\n };\n }\n }\n\n if (loaded) {\n fadeInClass = 'image-fade-in';\n }\n\n if (isInPermalink) {\n permalinkClass = 'image-permalink';\n }\n\n return (\n <div\n className={classNames('file-view--single', permalinkClass)}\n >\n <div\n className='file__image'\n >\n {fileHeader}\n {this.props.isEmbedVisible &&\n <div\n className={classNames('image-container', permalinkClass)}\n style={imageContainerStyle}\n >\n <div\n className={classNames('image-loaded', fadeInClass, svgClass)}\n style={styleIfSvgWithDimensions}\n >\n <div className={classNames(permalinkClass)}>\n <SizeAwareImage\n onClick={this.handleImageClick}\n className={classNames(minPreviewClass, permalinkClass)}\n src={previewURL}\n dimensions={this.state.dimensions}\n fileInfo={this.props.fileInfo}\n fileURL={fileURL}\n onImageLoaded={this.imageLoaded}\n showLoader={this.props.isEmbedVisible}\n handleSmallImageContainer={true}\n enablePublicLink={this.props.enablePublicLink}\n getFilePublicLink={this.getFilePublicLink}\n hideUtilities={this.props.disableActions}\n />\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getFilePublicLink} from 'mattermost-redux/actions/files';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {toggleEmbedVisibility} from 'actions/post_actions';\nimport {openModal} from 'actions/views/modals';\nimport {getIsRhsOpen} from 'selectors/rhs';\n\nimport SingleImageView from 'components/single_image_view/single_image_view';\n\nimport type {GlobalState} from 'types/store';\n\nfunction mapStateToProps(state: GlobalState) {\n const isRhsOpen = getIsRhsOpen(state);\n const config = getConfig(state);\n\n return {\n isRhsOpen,\n enablePublicLink: config.EnablePublicLink === 'true',\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n toggleEmbedVisibility,\n openModal,\n getFilePublicLink,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(SingleImageView);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo} from 'react';\n\nimport {sortFileInfos} from 'mattermost-redux/utils/file_utils';\n\nimport FileAttachment from 'components/file_attachment';\nimport FilePreviewModal from 'components/file_preview_modal';\nimport SingleImageView from 'components/single_image_view';\n\nimport {FileTypes, ModalIdentifiers} from 'utils/constants';\nimport {getFileType} from 'utils/utils';\n\nimport type {OwnProps, PropsFromRedux} from './index';\n\ntype Props = OwnProps & PropsFromRedux;\n\nexport default function FileAttachmentList(props: Props) {\n const handleImageClick = (indexClicked: number) => {\n props.actions.openModal({\n modalId: ModalIdentifiers.FILE_PREVIEW_MODAL,\n dialogType: FilePreviewModal,\n dialogProps: {\n postId: props.post.id,\n fileInfos: props.fileInfos,\n startIndex: indexClicked,\n },\n });\n };\n\n const {\n compactDisplay,\n enableSVGs,\n fileInfos,\n fileCount,\n locale,\n isInPermalink,\n } = props;\n\n const sortedFileInfos = useMemo(() => sortFileInfos(fileInfos ? [...fileInfos] : [], locale), [fileInfos, locale]);\n\n if (fileInfos.length === 0) {\n return null;\n }\n\n if (fileInfos && fileInfos.length === 1 && !fileInfos[0].archived) {\n const fileType = getFileType(fileInfos[0].extension);\n\n if (fileType === FileTypes.IMAGE || (fileType === FileTypes.SVG && enableSVGs)) {\n return (\n <SingleImageView\n fileInfo={fileInfos[0]}\n isEmbedVisible={props.isEmbedVisible}\n postId={props.post.id}\n compactDisplay={compactDisplay}\n isInPermalink={isInPermalink}\n disableActions={props.disableActions}\n />\n );\n }\n } else if (fileCount === 1 && props.isEmbedVisible && !fileInfos?.[0]) {\n return (\n <div style={style.minHeightPlaceholder}/>\n );\n }\n\n const postFiles = [];\n if (sortedFileInfos && sortedFileInfos.length > 0) {\n for (let i = 0; i < sortedFileInfos.length; i++) {\n const fileInfo = sortedFileInfos[i];\n const isDeleted = fileInfo.delete_at > 0;\n postFiles.push(\n <FileAttachment\n key={fileInfo.id}\n fileInfo={sortedFileInfos[i]}\n index={i}\n handleImageClick={handleImageClick}\n compactDisplay={compactDisplay}\n handleFileDropdownOpened={props.handleFileDropdownOpened}\n preventDownload={props.disableDownload}\n disableActions={props.disableActions}\n disableThumbnail={isDeleted}\n disablePreview={isDeleted}\n />,\n );\n }\n } else if (fileCount > 0) {\n for (let i = 0; i < fileCount; i++) {\n // Add a placeholder to avoid pop-in once we get the file infos for this post\n postFiles.push(\n <div\n key={`fileCount-${i}`}\n className='post-image__column post-image__column--placeholder'\n />,\n );\n }\n }\n\n return (\n <div\n data-testid='fileAttachmentList'\n className='post-image__columns clearfix'\n >\n {postFiles}\n </div>\n );\n}\n\nconst style = {\n minHeightPlaceholder: {minHeight: '385px'},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {FileInfo} from '@mattermost/types/files';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {\n makeGetFilesForEditHistory,\n makeGetFilesForPost,\n} from 'mattermost-redux/selectors/entities/files';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {openModal} from 'actions/views/modals';\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {isEmbedVisible} from 'selectors/posts';\n\nimport type {GlobalState} from 'types/store';\n\nimport FileAttachmentList from './file_attachment_list';\n\nexport type OwnProps = {\n post: Post;\n compactDisplay?: boolean;\n isInPermalink?: boolean;\n handleFileDropdownOpened?: (open: boolean) => void;\n isEditHistory?: boolean;\n disableDownload?: boolean;\n disableActions?: boolean;\n}\n\nfunction makeMapStateToProps() {\n const selectFilesForPost = makeGetFilesForPost();\n const getFilesForEditHistory = makeGetFilesForEditHistory();\n\n return function mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const postId = ownProps.post ? ownProps.post.id : '';\n\n var fileInfos: FileInfo[];\n\n if (ownProps.isEditHistory) {\n fileInfos = getFilesForEditHistory(state, ownProps.post);\n } else {\n fileInfos = selectFilesForPost(state, postId);\n }\n\n let fileCount = 0;\n if (ownProps.post.metadata && ownProps.post.metadata.files) {\n fileCount = (ownProps.post.metadata.files || []).length;\n } else if (ownProps.post.file_ids) {\n fileCount = ownProps.post.file_ids.length;\n } else if (ownProps.post.filenames) {\n fileCount = ownProps.post.filenames.length;\n }\n\n return {\n enableSVGs: getConfig(state).EnableSVGs === 'true',\n fileInfos,\n fileCount,\n isEmbedVisible: isEmbedVisible(state, ownProps.post.id),\n locale: getCurrentLocale(state),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n }, dispatch),\n };\n}\n\nconst connector = connect(makeMapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(FileAttachmentList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {ProgressBar} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport FilenameOverlay from 'components/file_attachment/filename_overlay';\n\nimport {getFileTypeFromMime} from 'utils/file_utils';\nimport * as Utils from 'utils/utils';\n\nimport type {FilePreviewInfo} from './file_preview';\n\ntype Props = {\n handleRemove: (id: string) => void;\n clientId: string;\n fileInfo: FilePreviewInfo;\n}\n\nexport default class FileProgressPreview extends React.PureComponent<Props> {\n handleRemove = () => {\n this.props.handleRemove(this.props.clientId);\n };\n\n render() {\n let percent = 0;\n let fileNameComponent;\n let previewImage;\n let progressBar;\n const {fileInfo, clientId} = this.props;\n\n if (fileInfo) {\n percent = fileInfo.percent ? fileInfo.percent : 0;\n const percentTxt = ` (${percent.toFixed(0)}%)`;\n const fileType = getFileTypeFromMime(fileInfo.type || '');\n previewImage = <div className={'file-icon ' + Utils.getIconClassName(fileType)}/>;\n\n fileNameComponent = (\n <>\n <FilenameOverlay\n fileInfo={fileInfo}\n compactDisplay={false}\n canDownload={false}\n />\n <span className='post-image__uploadingTxt'>\n {percent === 100 ? (\n <FormattedMessage\n id='create_post.fileProcessing'\n defaultMessage='Processing...'\n />\n ) : (\n <>\n <FormattedMessage\n id='admin.plugin.uploading'\n defaultMessage='Uploading...'\n />\n <span>{percentTxt}</span>\n </>\n )}\n </span>\n </>\n );\n\n if (percent) {\n progressBar = (\n <ProgressBar\n className='post-image__progressBar'\n now={percent}\n active={percent === 100}\n />\n );\n }\n }\n\n return (\n <div\n ref={clientId}\n key={clientId}\n className='file-preview post-image__column'\n data-client-id={clientId}\n >\n <div className='post-image__thumbnail'>\n {previewImage}\n </div>\n <div className='post-image__details'>\n <div className='post-image__detail_wrapper'>\n <div className='post-image__detail'>\n {fileNameComponent}\n </div>\n </div>\n <div>\n <a\n className='file-preview__remove'\n onClick={this.handleRemove}\n >\n <i className='icon icon-close'/>\n </a>\n </div>\n {progressBar}\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFileThumbnailUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\n\nimport FilenameOverlay from 'components/file_attachment/filename_overlay';\n\nimport Constants, {FileTypes} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport FileProgressPreview from './file_progress_preview';\n\ntype UploadInfo = {\n name: string;\n percent?: number;\n type?: string;\n}\nexport type FilePreviewInfo = FileInfo & UploadInfo;\n\ntype Props = {\n enableSVGs: boolean;\n onRemove?: (id: string) => void;\n fileInfos: FilePreviewInfo[];\n uploadsInProgress?: string[];\n uploadsProgressPercent?: {[clientID: string]: FilePreviewInfo};\n}\n\nexport default class FilePreview extends React.PureComponent<Props> {\n static defaultProps = {\n fileInfos: [],\n uploadsInProgress: [],\n uploadsProgressPercent: {},\n };\n\n handleRemove = (id: string) => {\n this.props.onRemove?.(id);\n };\n\n render() {\n const previews: ReactNode[] = [];\n\n this.props.fileInfos.forEach((info) => {\n const type = Utils.getFileType(info.extension);\n\n let className = 'file-preview post-image__column';\n let previewImage;\n if (type === FileTypes.SVG && this.props.enableSVGs) {\n previewImage = (\n <img\n alt={'file preview'}\n className='post-image normal'\n src={getFileUrl(info.id)}\n />\n );\n } else if (type === FileTypes.IMAGE) {\n let imageClassName = 'post-image';\n\n if ((info.width && info.width < Constants.THUMBNAIL_WIDTH) && (info.height && info.height < Constants.THUMBNAIL_HEIGHT)) {\n imageClassName += ' small';\n } else {\n imageClassName += ' normal';\n }\n\n let thumbnailUrl = getFileThumbnailUrl(info.id);\n if (Utils.isGIFImage(info.extension) && !info.has_preview_image) {\n thumbnailUrl = getFileUrl(info.id);\n }\n\n previewImage = (\n <div\n className={imageClassName}\n style={{\n backgroundImage: `url(${thumbnailUrl})`,\n backgroundSize: 'cover',\n }}\n />\n );\n } else {\n className += ' custom-file';\n previewImage = <div className={'file-icon ' + Utils.getIconClassName(type)}/>;\n }\n\n previews.push(\n <div\n key={info.id}\n className={className}\n >\n <div className='post-image__thumbnail'>\n {previewImage}\n </div>\n <div className='post-image__details'>\n <div className='post-image__detail_wrapper'>\n <div className='post-image__detail'>\n <FilenameOverlay\n fileInfo={info}\n compactDisplay={false}\n canDownload={false}\n />\n {info.extension && <span className='post-image__type'>{info.extension.toUpperCase()}</span>}\n <span className='post-image__size'>{Utils.fileSizeToString(info.size)}</span>\n </div>\n </div>\n <div>\n {Boolean(this.props.onRemove) && (\n <a\n className='file-preview__remove'\n onClick={this.handleRemove.bind(this, info.id)}\n >\n <i className='icon icon-close'/>\n </a>\n )}\n </div>\n </div>\n </div>,\n );\n });\n\n if (this.props.uploadsInProgress && this.props.uploadsProgressPercent) {\n const uploadsProgressPercent = this.props.uploadsProgressPercent;\n this.props.uploadsInProgress.forEach((clientId) => {\n const fileInfo = uploadsProgressPercent[clientId];\n if (fileInfo) {\n previews.push(\n <FileProgressPreview\n key={clientId}\n clientId={clientId}\n fileInfo={fileInfo}\n handleRemove={this.handleRemove}\n />,\n );\n }\n });\n }\n\n return (\n <div className='file-preview__container'>\n {previews}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport FilePreview from './file_preview';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n\n return {\n enableSVGs: config.EnableSVGs === 'true',\n };\n}\n\nexport default connect(mapStateToProps)(FilePreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {connect} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {makeAsyncComponent} from 'components/async_load';\n\nimport {canDownloadFiles} from 'utils/file_utils';\n\nimport type {GlobalState} from 'types/store';\nimport type {FilePreviewComponent} from 'types/store/plugins';\n\nimport type {Props} from './file_preview_modal';\n\nconst FilePreviewModal = makeAsyncComponent('FilePreviewModal', React.lazy<React.ComponentType<Props>>(() => import('./file_preview_modal')));\n\ntype OwnProps = {\n post?: Post;\n postId?: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const config = getConfig(state);\n\n return {\n canDownloadFiles: canDownloadFiles(config),\n enablePublicLink: config.EnablePublicLink === 'true',\n isMobileView: getIsMobileView(state),\n pluginFilePreviewComponents: state.plugins.components.FilePreview as unknown as FilePreviewComponent[],\n post: ownProps.post || getPost(state, ownProps.postId || ''),\n };\n}\n\nexport default connect(mapStateToProps)(FilePreviewModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport fileOverlayImage from 'images/fileOverlay.svg';\n\nimport './file_upload_overlay.scss';\n\nexport const DropOverlayIdEditPost = 'editPostFileDropOverlay';\nexport const DropOverlayIdCreateComment = 'createCommentFileDropOverlay';\nexport const DropOverlayIdCreatePost = 'createPostFileDropOverlay';\nexport const DropOverlayIdThreads = 'threadView';\nexport const DropOverlayIdCenterChannel = 'centerChannelFileDropOverlay';\nexport const DropOverlayIdRHS = 'rhsFileDropOverlay';\n\ntype Props = {\n overlayType: string;\n id: string;\n isInEditMode?: boolean;\n direction?: 'horizontal' | 'vertical';\n}\n\nexport const FileUploadOverlay = (props: Props) => {\n let overlayClass = 'file-overlay hidden';\n if (props.overlayType === 'right') {\n overlayClass += ' right-file-overlay';\n } else if (props.overlayType === 'center') {\n overlayClass += ' center-file-overlay';\n }\n\n if (props.isInEditMode) {\n overlayClass += ' post_edit_mode';\n }\n\n const mode = props.direction || 'vertical';\n\n return (\n <div\n id={props.id}\n className={overlayClass}\n >\n <div className='overlay__indent'>\n <div className={classNames('overlay__circle', mode)}>\n <img\n className='overlay__files'\n src={fileOverlayImage}\n alt=''\n loading='lazy'\n />\n <FormattedMessage\n id='upload_overlay.info'\n defaultMessage='Drop a file to upload it.'\n />\n </div>\n </div>\n </div>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {FileUploadOverlay} from './file_upload_overlay';\n\nexport default FileUploadOverlay;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport marked from 'marked';\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl} from 'react-intl';\n\nimport {shouldOpenInNewTab, getSiteURL} from 'utils/url';\n\nconst TARGET_BLANK_URL_PREFIX = '!';\n\nexport class CustomRenderer extends marked.Renderer {\n private disableLinks: boolean;\n\n constructor(disableLinks = false) {\n super();\n this.disableLinks = disableLinks;\n }\n\n link(href: string, title: string, text: string) {\n const siteURL = getSiteURL();\n const openInNewTab = shouldOpenInNewTab(href, siteURL);\n\n if (this.disableLinks) {\n return text;\n }\n if (href[0] === TARGET_BLANK_URL_PREFIX) {\n return `<a href=\"${href.substring(1, href.length)}\" rel=\"noopener noreferrer\" target=\"_blank\">${text}</a>`;\n }\n if (openInNewTab) {\n return `<a href=\"${href}\" rel=\"noopener noreferrer\" target=\"_blank\">${text}</a>`;\n }\n return `<a href=\"${href}\">${text}</a>`;\n }\n\n paragraph(text: string) {\n return text;\n }\n}\n\ntype Props = {\n defaultMessage?: MessageDescriptor['defaultMessage'];\n disableLinks?: boolean;\n id?: string;\n values?: Record<string, any>;\n}\n\n/**\n *\n * Translations component with the same API as react-intl's <FormattedMessage> component except the message string\n * accepts Markdown.\n *\n * @deprecated Use FormattedMessage with {@link https://formatjs.io/docs/react-intl/components/#rich-text-formatting rich text formatting} instead\n * of including Markdown in translation strings.\n */\nexport default function FormattedMarkdownMessage({\n id,\n defaultMessage,\n values,\n disableLinks,\n}: Props) {\n const intl = useIntl();\n\n const origMsg = intl.formatMessage({id, defaultMessage}, values);\n\n const markedUpMessage = marked(origMsg, {\n breaks: true,\n sanitize: true,\n renderer: new CustomRenderer(disableLinks),\n });\n\n return (<span dangerouslySetInnerHTML={{__html: markedUpMessage}}/>);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport SuccessIcon from 'components/widgets/icons/fa_success_icon';\n\ntype Props = {\n show: boolean;\n onHide: () => void;\n onExited: () => void;\n title: string;\n helpText?: string;\n link: string;\n}\n\ntype State = {\n copiedLink: boolean;\n}\n\nexport default class GetLinkModal extends React.PureComponent<Props, State> {\n private textAreaRef = React.createRef<HTMLTextAreaElement>();\n public static defaultProps = {\n helpText: null,\n };\n\n public constructor(props: Props) {\n super(props);\n this.state = {\n copiedLink: false,\n };\n }\n\n public onHide = (): void => {\n this.setState({copiedLink: false});\n this.props.onHide();\n };\n\n public copyLink = (): void => {\n const textarea = this.textAreaRef.current;\n\n if (textarea) {\n textarea.focus();\n textarea.setSelectionRange(0, this.props.link.length);\n\n try {\n this.setState({copiedLink: document.execCommand('copy')});\n } catch (err) {\n this.setState({copiedLink: false});\n }\n }\n };\n\n public render(): JSX.Element {\n let helpText = null;\n if (this.props.helpText) {\n helpText = (\n <p>\n {this.props.helpText}\n <br/>\n <br/>\n </p>\n );\n }\n\n let copyLink = null;\n\n if (document.queryCommandSupported('copy')) {\n copyLink = (\n <button\n id='linkModalCopyLink'\n data-copy-btn='true'\n type='button'\n className='btn btn-primary pull-left'\n onClick={this.copyLink}\n >\n <FormattedMessage\n id='get_link.copy'\n defaultMessage='Copy Link'\n />\n </button>\n );\n }\n\n const linkText = (\n <textarea\n id='linkModalTextArea'\n className='form-control no-resize min-height'\n ref={this.textAreaRef}\n dir='auto'\n value={this.props.link}\n onClick={this.copyLink}\n readOnly={true}\n />\n );\n\n let copyLinkConfirm = null;\n if (this.state.copiedLink) {\n copyLinkConfirm = (\n <p className='alert alert-success alert--confirm'>\n <SuccessIcon/>\n <FormattedMessage\n id='get_link.clipboard'\n defaultMessage=' Link copied'\n />\n </p>\n );\n }\n\n return (\n <Modal\n dialogClassName='a11y__modal'\n show={this.props.show}\n onHide={this.onHide}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='getLinkModalLabel'\n >\n <Modal.Header\n id='getLinkModalLabel'\n closeButton={true}\n >\n <h4 className='modal-title'>{this.props.title}</h4>\n </Modal.Header>\n <Modal.Body>\n {helpText}\n {linkText}\n </Modal.Body>\n <Modal.Footer>\n <button\n id='linkModalCloseButton'\n type='button'\n className='btn btn-tertiary'\n onClick={this.onHide}\n >\n <FormattedMessage\n id='get_link.close'\n defaultMessage='Close'\n />\n </button>\n {copyLink}\n {copyLinkConfirm}\n </Modal.Footer>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback, useEffect, useState} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport GetLinkModal from 'components/get_link_modal';\n\nimport type {PropsFromRedux} from './index';\n\ntype Props = PropsFromRedux & {\n onExited: () => void;\n fileId: string;\n};\n\nconst GetPublicLinkModal = ({\n actions,\n fileId,\n onExited,\n link = '',\n}: Props) => {\n const intl = useIntl();\n const [show, setShow] = useState<boolean>(true);\n\n useEffect(() => {\n actions.getFilePublicLink(fileId);\n }, []);\n\n const onHide = useCallback(() => setShow(false), []);\n\n return (\n <GetLinkModal\n show={show}\n onHide={onHide}\n onExited={onExited}\n title={intl.formatMessage({id: 'get_public_link_modal.title', defaultMessage: 'Copy Public Link'})}\n helpText={intl.formatMessage({id: 'get_public_link_modal.help', defaultMessage: 'The link below allows anyone to see this file without being registered on this server.'})}\n link={link}\n />\n );\n};\n\nexport default memo(GetPublicLinkModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getFilePublicLink} from 'mattermost-redux/actions/files';\nimport * as Selectors from 'mattermost-redux/selectors/entities/files';\n\nimport GetPublicLinkModal from './get_public_link_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n const filePublicLink: unknown = Selectors.getFilePublicLink(state)?.link;\n return {\n link: filePublicLink as string,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getFilePublicLink,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(GetPublicLinkModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect, useRef} from 'react';\nimport type {MutableRefObject} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getCurrentUser, isFirstAdmin, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\n/**\n * Hook that alerts clicks outside of the passed ref.\n */\nexport function useClickOutsideRef(ref: MutableRefObject<HTMLElement | null>, handler: () => void): void {\n useEffect(() => {\n function onMouseDown(event: MouseEvent) {\n const target = event.target as any;\n if (ref.current && target instanceof Node && !ref.current.contains(target)) {\n handler();\n }\n }\n\n // Bind the event listener\n document.addEventListener('mousedown', onMouseDown);\n return () => {\n // Unbind the event listener on clean up\n document.removeEventListener('mousedown', onMouseDown);\n };\n }, [ref, handler]);\n}\n\nexport const useFirstAdminUser = (): boolean => {\n return useSelector(isFirstAdmin);\n};\n\nexport const useIsCurrentUserSystemAdmin = (): boolean => {\n return useSelector(isCurrentUserSystemAdmin);\n};\n\nexport const useIsLoggedIn = (): boolean => {\n return Boolean(useSelector<GlobalState, UserProfile>(getCurrentUser));\n};\n\n/**\n * Hook that returns the current open state of the specified modal\n * - returns both the direct boolean for regular use and a ref that contains the boolean for usage in a callback\n */\nexport const useIsModalOpen = (modalIdentifier: string): [boolean, React.RefObject<boolean>] => {\n const modalOpenState = useSelector((state: GlobalState) => isModalOpen(state, modalIdentifier));\n const modalOpenStateRef = useRef(modalOpenState);\n\n useEffect(() => {\n modalOpenStateRef.current = modalOpenState;\n }, [modalOpenState]);\n\n return [modalOpenState, modalOpenStateRef];\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// https://stackoverflow.com/a/54485712\nconst Nbsp: React.FC = () => '\\u00A0' as unknown as React.ReactElement;\nexport default Nbsp;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Measure, measureAndReport} from 'utils/performance_telemetry';\nimport {isDesktopApp} from 'utils/user_agent';\n\nconst ANIMATION_CLASS_FOR_MATTERMOST_LOGO_HIDE = 'LoadingAnimation__compass-shrink';\nconst ANIMATION_CLASS_FOR_COMPLETE_LOADER_HIDE = 'LoadingAnimation__shrink';\n\nconst LOADING_CLASS_FOR_SCREEN = 'LoadingScreen LoadingScreen--darkMode';\nconst LOADING_COMPLETE_CLASS_FOR_SCREEN = 'LoadingScreen LoadingScreen--darkMode LoadingScreen--loaded';\n\nconst STATIC_CLASS_FOR_ANIMATION = 'LoadingAnimation LoadingAnimation--darkMode';\nconst LOADING_CLASS_FOR_ANIMATION = STATIC_CLASS_FOR_ANIMATION + ' LoadingAnimation--spinning LoadingAnimation--loading';\nconst LOADING_COMPLETE_CLASS_FOR_ANIMATION = STATIC_CLASS_FOR_ANIMATION + ' LoadingAnimation--spinning LoadingAnimation--loaded';\n\nconst DESTROY_DELAY_AFTER_ANIMATION_END = 1000;\n\nexport class InitialLoadingScreenClass {\n private isLoading: boolean | null = true;\n\n private loadingScreenElement: HTMLElement | null;\n private loadingAnimationElement: HTMLElement | null;\n\n private initialLoadingScreenCSS: HTMLLinkElement | null;\n\n constructor() {\n this.loadingScreenElement = document.getElementById('initialPageLoadingScreen');\n this.loadingAnimationElement = document.getElementById('initialPageLoadingAnimation');\n this.initialLoadingScreenCSS = document.getElementById('initialLoadingScreenCSS') as HTMLLinkElement | null;\n\n this.handleAnimationEndEvent = this.handleAnimationEndEvent.bind(this);\n\n this.init();\n }\n\n private init() {\n if (isDesktopApp()) {\n // Let Mattermost desktop handle the loading screen\n this.destroy();\n return;\n }\n\n this.addAnimationEndListener();\n\n // Starting automatically in the constructor instead of waiting for call from the code base\n // as per the latest UX recommendation\n this.start();\n }\n\n private handleAnimationEndEvent(event: AnimationEvent) {\n if (!this.loadingAnimationElement) {\n return;\n }\n\n if (event.animationName === ANIMATION_CLASS_FOR_MATTERMOST_LOGO_HIDE || event.animationName === ANIMATION_CLASS_FOR_COMPLETE_LOADER_HIDE) {\n if (!this.isLoading) {\n this.loadingAnimationElement.className = STATIC_CLASS_FOR_ANIMATION;\n\n // Automatically destroy the loading screen after the animation has finished.\n // Should be changed if we want to loading animation to start again.\n setTimeout(() => {\n this.destroy();\n }, DESTROY_DELAY_AFTER_ANIMATION_END);\n }\n }\n }\n\n private addAnimationEndListener() {\n if (this.loadingAnimationElement) {\n this.loadingAnimationElement.addEventListener('animationend', this.handleAnimationEndEvent);\n }\n }\n\n private removeAnimationEndListener() {\n if (this.loadingAnimationElement) {\n this.loadingAnimationElement.removeEventListener('animationend', this.handleAnimationEndEvent);\n }\n }\n\n private destroy() {\n this.removeAnimationEndListener();\n\n if (this.loadingScreenElement) {\n this.loadingScreenElement.remove();\n this.loadingScreenElement = null;\n }\n\n if (this.initialLoadingScreenCSS) {\n this.initialLoadingScreenCSS.remove();\n this.initialLoadingScreenCSS = null;\n }\n\n if (this.loadingAnimationElement) {\n this.loadingAnimationElement = null;\n }\n\n this.isLoading = null;\n }\n\n /**\n * The loading animations are always started as soon as the loading indicator is shown in the screen for the first time.\n * But we still want to have this start method in case we need to start the loading animations manually any time.\n * If we do want to do that then we should remove the set timeout destroy call doing above.\n */\n public start() {\n if (!this.loadingScreenElement || !this.loadingAnimationElement) {\n // eslint-disable-next-line no-console\n console.error('InitialLoadingScreen: No loading screen or animation element found');\n return;\n }\n\n this.isLoading = true;\n\n this.loadingScreenElement.className = LOADING_CLASS_FOR_SCREEN;\n this.loadingAnimationElement.className = LOADING_CLASS_FOR_ANIMATION;\n }\n\n public stop(pageType: string) {\n if (!this.loadingScreenElement || !this.loadingAnimationElement) {\n return;\n }\n\n this.isLoading = false;\n\n this.loadingScreenElement.className = LOADING_COMPLETE_CLASS_FOR_SCREEN;\n this.loadingAnimationElement.className = LOADING_COMPLETE_CLASS_FOR_ANIMATION;\n\n measureAndReport({\n name: Measure.SplashScreen,\n startMark: 0,\n canFail: false,\n labels: {\n page_type: pageType,\n },\n });\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {InitialLoadingScreenClass} from './initial_loading_screen_class';\n\nconst InitialLoadingScreen = new InitialLoadingScreenClass();\n\nexport default InitialLoadingScreen;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport type {CustomMessageInputType} from 'components/widgets/inputs/input/input';\n\nimport {ItemStatus} from 'utils/constants';\n\ntype Props = {\n message?: string;\n custom?: CustomMessageInputType;\n}\n\nconst InputError = (props: Props) => {\n if (props.message) {\n return (\n <div className='Input___error'>\n <i className='icon icon-alert-outline'/>\n <span>{props.message}</span>\n </div>\n );\n } else if (props.custom) {\n return (\n <div className={`Input___customMessage Input___${props.custom.type}`}>\n <i\n className={classNames(`icon ${props.custom.type}`, {\n 'icon-alert-outline': props.custom.type === ItemStatus.WARNING,\n 'icon-alert-circle-outline': props.custom.type === ItemStatus.ERROR,\n 'icon-information-outline': props.custom.type === ItemStatus.INFO,\n 'icon-check': props.custom.type === ItemStatus.SUCCESS,\n })}\n />\n <span>{props.custom.value}</span>\n </div>\n );\n }\n return null;\n};\n\nexport default InputError;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback} from 'react';\nimport type {ChangeEventHandler} from 'react';\n\nimport Setting from './setting';\n\ntype Props = {\n id: string;\n options?: Array<{text: string; value: string}>;\n label: React.ReactNode;\n onChange(name: string, value: any): void;\n value?: string;\n labelClassName?: string;\n inputClassName?: string;\n helpText?: React.ReactNode;\n\n}\n\nconst RadioSetting = ({\n labelClassName = '',\n inputClassName = '',\n options = [],\n onChange,\n id,\n label,\n helpText,\n value,\n}: Props) => {\n const handleChange: ChangeEventHandler<HTMLInputElement> = useCallback((e) => {\n onChange(id, e.target.value);\n }, [onChange, id]);\n\n return (\n <Setting\n label={label}\n labelClassName={labelClassName}\n inputClassName={inputClassName}\n helpText={helpText}\n inputId={id}\n >\n {\n options.map(({value: option, text}) => {\n return (\n <div\n className='radio'\n key={option}\n >\n <label>\n <input\n type='radio'\n value={option}\n name={id}\n checked={option === value}\n onChange={handleChange}\n />\n {text}\n </label>\n </div>\n );\n })\n }\n </Setting>\n );\n};\n\nexport default memo(RadioSetting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserAutocomplete} from '@mattermost/types/autocomplete';\nimport type {Channel} from '@mattermost/types/channels';\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AutocompleteSelector from 'components/autocomplete_selector';\nimport type {Option, Selected} from 'components/autocomplete_selector';\nimport GenericChannelProvider from 'components/suggestion/generic_channel_provider';\nimport GenericUserProvider from 'components/suggestion/generic_user_provider';\nimport MenuActionProvider from 'components/suggestion/menu_action_provider';\nimport ModalSuggestionList from 'components/suggestion/modal_suggestion_list';\nimport type Provider from 'components/suggestion/provider';\nimport BoolSetting from 'components/widgets/settings/bool_setting';\nimport RadioSetting from 'components/widgets/settings/radio_setting';\nimport TextSetting from 'components/widgets/settings/text_setting';\nimport type {InputTypes} from 'components/widgets/settings/text_setting';\n\nconst TEXT_DEFAULT_MAX_LENGTH = 150;\nconst TEXTAREA_DEFAULT_MAX_LENGTH = 3000;\n\nexport type Props = {\n displayName: string;\n name: string;\n type: string;\n subtype?: string;\n placeholder?: string;\n helpText?: string;\n errorText?: React.ReactNode;\n maxLength?: number;\n dataSource?: string;\n optional?: boolean;\n options?: Array<{\n text: string;\n value: string;\n }>;\n value?: string | number | boolean;\n onChange: (name: string, selected: string) => void;\n autoFocus?: boolean;\n actions: {\n autocompleteActiveChannels: (term: string, success: (channels: Channel[]) => void, error?: (err: ServerError) => void) => (ActionResult | Promise<ActionResult | ActionResult[]>);\n autocompleteUsers: (search: string) => Promise<UserAutocomplete>;\n };\n}\n\ntype State = {\n value: string;\n}\n\nexport default class DialogElement extends React.PureComponent<Props, State> {\n private providers: Provider[];\n\n constructor(props: Props) {\n super(props);\n\n let defaultText = '';\n this.providers = [];\n if (props.type === 'select') {\n if (props.dataSource === 'users') {\n this.providers = [new GenericUserProvider(props.actions.autocompleteUsers)];\n } else if (props.dataSource === 'channels') {\n this.providers = [new GenericChannelProvider(props.actions.autocompleteActiveChannels)];\n } else if (props.options) {\n this.providers = [new MenuActionProvider(props.options)];\n }\n\n if (props.value && props.options) {\n const defaultOption = props.options.find(\n (option) => option.value === props.value,\n );\n defaultText = defaultOption ? defaultOption.text : '';\n }\n }\n\n this.state = {\n value: defaultText,\n };\n }\n\n private handleSelected = (selected: Selected) => {\n const {name, dataSource} = this.props;\n\n if (dataSource === 'users') {\n const user = selected as UserProfile;\n this.props.onChange(name, user.id);\n this.setState({value: user.username});\n } else if (dataSource === 'channels') {\n const channel = selected as Channel;\n this.props.onChange(name, channel.id);\n this.setState({value: channel.display_name});\n } else {\n const option = selected as Option;\n this.props.onChange(name, option.value);\n this.setState({value: option.text});\n }\n };\n\n public render(): JSX.Element | null {\n const {\n name,\n subtype,\n displayName,\n value,\n placeholder,\n onChange,\n helpText,\n errorText,\n optional,\n options,\n type,\n maxLength,\n } = this.props;\n\n let displayNameContent: React.ReactNode = displayName;\n if (optional) {\n displayNameContent = (\n <>\n {displayName + ' '}\n <span className='font-weight--normal light'>\n <FormattedMessage\n id='interactive_dialog.element.optional'\n defaultMessage='(optional)'\n />\n </span>\n </>\n );\n } else {\n displayNameContent = (\n <>\n {displayName}\n <span className='error-text'>{' *'}</span>\n </>\n );\n }\n\n let helpTextContent: React.ReactNode = helpText;\n if (errorText) {\n helpTextContent = (\n <>\n {helpText}\n <div className='error-text mt-3'>\n {errorText}\n </div>\n </>\n );\n }\n\n if (type === 'text' || type === 'textarea') {\n let textSettingMaxLength;\n if (type === 'text') {\n textSettingMaxLength = maxLength || TEXT_DEFAULT_MAX_LENGTH;\n } else {\n textSettingMaxLength = maxLength || TEXTAREA_DEFAULT_MAX_LENGTH;\n }\n\n let assertedValue;\n if (subtype === 'number' && typeof value === 'number') {\n assertedValue = value as number;\n } else {\n assertedValue = value as string || '';\n }\n\n return (\n <TextSetting\n autoFocus={this.props.autoFocus}\n id={name}\n type={(type === 'textarea' ? 'textarea' : subtype) as InputTypes || 'text'}\n label={displayNameContent}\n maxLength={textSettingMaxLength}\n value={assertedValue}\n placeholder={placeholder}\n helpText={helpTextContent}\n onChange={onChange}\n resizable={false}\n />\n );\n } else if (type === 'select') {\n return (\n <AutocompleteSelector\n id={name}\n providers={this.providers}\n onSelected={this.handleSelected}\n label={displayNameContent}\n helpText={helpTextContent}\n placeholder={placeholder}\n value={this.state.value}\n listComponent={ModalSuggestionList}\n listPosition='bottom'\n />\n );\n } else if (type === 'bool') {\n const boolValue = value as boolean;\n return (\n <BoolSetting\n autoFocus={this.props.autoFocus}\n id={name}\n label={displayNameContent}\n value={boolValue || false}\n helpText={helpTextContent}\n placeholder={placeholder || ''}\n onChange={onChange}\n />\n );\n } else if (type === 'radio') {\n const textValue = value as string;\n return (\n <RadioSetting\n id={name}\n label={displayNameContent}\n helpText={helpTextContent}\n options={options}\n value={textValue}\n onChange={onChange}\n />\n );\n }\n\n return null;\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {autocompleteActiveChannels} from 'actions/channel_actions';\nimport {autocompleteUsers} from 'actions/user_actions';\n\nimport DialogElement from './dialog_element';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n autocompleteActiveChannels,\n autocompleteUsers,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(DialogElement);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type EmojiMap from 'utils/emoji_map';\nimport * as Markdown from 'utils/markdown';\nimport {getSiteURL} from 'utils/url';\n\ntype Props = {\n id: string;\n value: string;\n emojiMap?: EmojiMap;\n}\n\nexport default function DialogIntroductionText({id, value, emojiMap}: Props) {\n const formattedMessage = Markdown.format(\n value,\n {\n breaks: true,\n sanitize: true,\n gfm: true,\n siteURL: getSiteURL(),\n },\n emojiMap,\n );\n\n return (\n <span\n id={id}\n dangerouslySetInnerHTML={{__html: formattedMessage}}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {DialogSubmission} from '@mattermost/types/integrations';\n\nimport {\n checkDialogElementForError,\n checkIfErrorsMatchElements,\n} from 'mattermost-redux/utils/integration_utils';\n\nimport SpinnerButton from 'components/spinner_button';\n\nimport DialogElement from './dialog_element';\nimport DialogIntroductionText from './dialog_introduction_text';\n\nimport type {PropsFromRedux} from './index';\n\n// We are using Partial as we are returning empty object with dialog redux state is empty in connect\ntype OptionalProsFromRedux = Partial<PropsFromRedux> & Pick<PropsFromRedux, 'actions'>;\n\nexport type Props = {\n onExited?: () => void;\n} & OptionalProsFromRedux;\n\ntype State = {\n show: boolean;\n values: Record<string, string | number | boolean>;\n error: string | null;\n errors: Record<string, React.ReactNode>;\n submitting: boolean;\n}\n\nexport default class InteractiveDialog extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n const values: Record<string, string | number | boolean> = {};\n if (props.elements != null) {\n props.elements.forEach((e) => {\n if (e.type === 'bool') {\n values[e.name] = String(e.default).toLowerCase() === 'true';\n } else {\n values[e.name] = e.default ?? null;\n }\n });\n }\n\n this.state = {\n show: true,\n values,\n error: null,\n errors: {},\n submitting: false,\n };\n }\n\n handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n const {elements} = this.props;\n const values = this.state.values;\n const errors: Record<string, JSX.Element> = {};\n\n if (elements) {\n elements.forEach((elem) => {\n const error = checkDialogElementForError(\n elem,\n values[elem.name],\n );\n if (error) {\n errors[elem.name] = (\n <FormattedMessage\n id={error.id}\n defaultMessage={error.defaultMessage}\n values={error.values}\n />\n );\n }\n });\n }\n\n this.setState({errors});\n\n if (Object.keys(errors).length !== 0) {\n return;\n }\n\n const {url, callbackId, state} = this.props;\n\n const dialog: DialogSubmission = {\n url,\n callback_id: callbackId ?? '',\n state: state ?? '',\n submission: values as { [x: string]: string },\n user_id: '',\n channel_id: '',\n team_id: '',\n cancelled: false,\n };\n\n this.setState({submitting: true});\n\n const {data} = await this.props.actions.submitInteractiveDialog(dialog) ?? {};\n\n this.setState({submitting: false});\n\n let hasErrors = false;\n\n if (data) {\n if (data.error) {\n hasErrors = true;\n this.setState({error: data.error});\n }\n\n if (\n data.errors &&\n Object.keys(data.errors).length >= 0 &&\n checkIfErrorsMatchElements(data.errors, elements)\n ) {\n hasErrors = true;\n this.setState({errors: data.errors});\n }\n }\n\n if (!hasErrors) {\n this.handleHide(true);\n }\n };\n\n onHide = () => {\n this.handleHide(false);\n };\n\n handleHide = (submitted = false) => {\n const {url, callbackId, state, notifyOnCancel} = this.props;\n\n if (!submitted && notifyOnCancel) {\n const dialog: DialogSubmission = {\n url,\n callback_id: callbackId ?? '',\n state: state ?? '',\n cancelled: true,\n user_id: '',\n channel_id: '',\n team_id: '',\n submission: {},\n };\n\n this.props.actions.submitInteractiveDialog(dialog);\n }\n\n this.setState({show: false});\n };\n\n onChange = (name: string, value: string) => {\n const values = {...this.state.values, [name]: value};\n this.setState({values});\n };\n\n render() {\n const {\n title,\n introductionText,\n iconUrl,\n submitLabel,\n elements,\n } = this.props;\n\n let submitText: JSX.Element | string = (\n <FormattedMessage\n id='interactive_dialog.submit'\n defaultMessage='Submit'\n />\n );\n\n if (submitLabel) {\n submitText = submitLabel;\n }\n\n let icon;\n if (iconUrl) {\n icon = (\n <img\n id='interactiveDialogIconUrl'\n alt={'modal title icon'}\n className='more-modal__image'\n width='36'\n height='36'\n src={iconUrl}\n />\n );\n }\n\n return (\n <Modal\n id='interactiveDialogModal'\n dialogClassName='a11y__modal about-modal'\n show={this.state.show}\n onHide={this.onHide}\n onExited={this.props.onExited}\n backdrop='static'\n role='none'\n aria-labelledby='interactiveDialogModalLabel'\n >\n <form\n onSubmit={this.handleSubmit}\n autoComplete={'off'}\n >\n <Modal.Header\n closeButton={true}\n style={{borderBottom: elements == null ? '0px' : undefined}}\n >\n <Modal.Title\n componentClass='h1'\n id='interactiveDialogModalLabel'\n >\n {icon}\n {title}\n </Modal.Title>\n </Modal.Header>\n {(elements || introductionText) && (\n <Modal.Body>\n {introductionText && (\n <DialogIntroductionText\n id='interactiveDialogModalIntroductionText'\n value={introductionText}\n emojiMap={this.props.emojiMap}\n />\n )}\n {elements &&\n elements.map((e, index) => {\n return (\n <DialogElement\n autoFocus={index === 0}\n key={'dialogelement' + e.name}\n displayName={e.display_name}\n name={e.name}\n type={e.type}\n subtype={e.subtype}\n helpText={e.help_text}\n errorText={this.state.errors[e.name]}\n placeholder={e.placeholder}\n maxLength={e.max_length}\n dataSource={e.data_source}\n optional={e.optional}\n options={e.options}\n value={this.state.values[e.name]}\n onChange={this.onChange}\n />\n );\n })}\n </Modal.Body>\n )}\n <Modal.Footer>\n {this.state.error && (\n <div className='error-text'>{this.state.error}</div>\n )}\n <button\n id='interactiveDialogCancel'\n type='button'\n className='btn btn-tertiary cancel-button'\n onClick={this.onHide}\n >\n <FormattedMessage\n id='interactive_dialog.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <SpinnerButton\n id='interactiveDialogSubmit'\n type='submit'\n autoFocus={!elements || elements.length === 0}\n className='btn btn-primary save-button'\n spinning={this.state.submitting}\n spinningText={\n <FormattedMessage\n id='interactive_dialog.submitting'\n defaultMessage='Submitting...'\n />\n }\n >\n {submitText}\n </SpinnerButton>\n </Modal.Footer>\n </form>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ConnectedProps} from 'react-redux';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {submitInteractiveDialog} from 'mattermost-redux/actions/integrations';\n\nimport {getEmojiMap} from 'selectors/emojis';\n\nimport type {GlobalState} from 'types/store';\n\nimport InteractiveDialog from './interactive_dialog';\n\nfunction mapStateToProps(state: GlobalState) {\n const data = state.entities.integrations.dialog;\n if (!data || !data.dialog) {\n return {};\n }\n\n return {\n url: data.url,\n callbackId: data.dialog.callback_id,\n elements: data.dialog.elements,\n title: data.dialog.title,\n introductionText: data.dialog.introduction_text,\n iconUrl: data.dialog.icon_url,\n submitLabel: data.dialog.submit_label,\n notifyOnCancel: data.dialog.notify_on_cancel,\n state: data.dialog.state,\n emojiMap: getEmojiMap(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n submitInteractiveDialog,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(InteractiveDialog);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {defineMessage} from 'react-intl';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {TeamMemberWithError, TeamInviteWithError} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport {joinChannel} from 'mattermost-redux/actions/channels';\nimport * as TeamActions from 'mattermost-redux/actions/teams';\nimport {getChannelMembersInChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getTeamMember} from 'mattermost-redux/selectors/entities/teams';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport {addUsersToTeam} from 'actions/team_actions';\n\nimport type {InviteResult} from 'components/invitation_modal/result_table';\nimport type {InviteResults} from 'components/invitation_modal/result_view';\n\nimport {ConsolePages} from 'utils/constants';\n\nimport type {DispatchFunc, ActionFuncAsync} from 'types/store';\n\nexport function sendMembersInvites(teamId: string, users: UserProfile[], emails: string[]): ActionFuncAsync<InviteResults> {\n return async (dispatch, getState) => {\n if (users.length > 0) {\n await dispatch(TeamActions.getTeamMembersByIds(teamId, users.map((u) => u.id)));\n }\n const state = getState();\n const sent = [];\n const notSent = [];\n const usersToAdd = [];\n for (const user of users) {\n const member = getTeamMember(state, teamId, user.id);\n if (isGuest(user.roles)) {\n notSent.push({\n user,\n reason: defineMessage({\n id: 'invite.members.user-is-guest',\n defaultMessage: 'Contact your admin to make this guest a full member.',\n }),\n });\n } else if (member) {\n notSent.push({\n user,\n reason: defineMessage({\n id: 'invite.members.already-member',\n defaultMessage: 'This person is already a team member.',\n }),\n });\n } else {\n usersToAdd.push(user);\n }\n }\n if (usersToAdd.length > 0) {\n const response = await dispatch(addUsersToTeam(teamId, usersToAdd.map((u) => u.id)));\n const members = response.data || [];\n if (response.error) {\n for (const userToAdd of usersToAdd) {\n notSent.push({user: userToAdd, reason: response.error.message});\n }\n } else {\n for (const userToAdd of usersToAdd) {\n const memberWithError = members.find((m: TeamMemberWithError) => m.user_id === userToAdd.id && m.error);\n if (memberWithError) {\n notSent.push({\n user: userToAdd,\n reason: memberWithError.error.message,\n });\n } else {\n sent.push({\n user: userToAdd,\n reason: defineMessage({\n id: 'invite.members.added-to-team',\n defaultMessage: 'This member has been added to the team.',\n }),\n });\n }\n }\n }\n }\n if (emails.length > 0) {\n let response;\n try {\n response = await dispatch(TeamActions.sendEmailInvitesToTeamGracefully(teamId, emails));\n } catch (e) {\n response = {\n data: emails.map((email) => ({\n email,\n error: {\n error: defineMessage({\n id: 'invite.members.unable-to-add-the-user-to-the-team',\n defaultMessage: 'Unable to add the user to the team.',\n }),\n },\n })) as unknown as TeamInviteWithError[],\n };\n }\n const invitesWithErrors = response.data || [];\n if (response.error) {\n if (response.error.server_error_id === 'app.email.rate_limit_exceeded.app_error') {\n response.error.message = defineMessage({\n id: 'invite.rate-limit-exceeded',\n defaultMessage: 'Invite emails rate limit exceeded.',\n });\n }\n for (const email of emails) {\n notSent.push({\n email,\n reason: response.error.message,\n });\n }\n } else {\n for (const email of emails) {\n const inviteWithError = invitesWithErrors.find((i: TeamInviteWithError) => email.toLowerCase() === i.email && i.error);\n if (inviteWithError && inviteWithError.error.id === 'api.team.invite_members.unable_to_send_email_with_defaults.app_error' && isCurrentUserSystemAdmin(state)) {\n notSent.push({\n email,\n reason: defineMessage({\n id: 'admin.environment.smtp.smtpFailure',\n defaultMessage: 'SMTP is not configured in System Console. Can be configured <a>here</a>.',\n }),\n path: ConsolePages.SMTP,\n });\n } else if (inviteWithError) {\n notSent.push({\n email,\n reason: inviteWithError.error.message,\n });\n } else {\n sent.push({\n email,\n reason: defineMessage({\n id: 'invite.members.invite-sent',\n defaultMessage: 'An invitation email has been sent.',\n }),\n });\n }\n }\n }\n }\n return {\n data: {\n sent,\n notSent,\n },\n };\n };\n}\n\nexport async function sendGuestInviteForUser(\n dispatch: DispatchFunc,\n user: UserProfile,\n teamId: string,\n channels: Channel[],\n members: RelationOneToOne<Channel, Record<string, ChannelMembership>>,\n): Promise<({sent: InviteResult} | {notSent: InviteResult})> {\n if (!isGuest(user.roles)) {\n return {\n notSent: {\n user,\n reason: defineMessage({\n id: 'invite.members.user-is-not-guest',\n defaultMessage: 'This person is already a member of the workspace. Invite them as a member instead of a guest.',\n }),\n },\n };\n }\n let memberOfAll = true;\n let memberOfAny = false;\n\n for (const channel of channels) {\n const member = members && members[channel.id] && members[channel.id][user.id];\n if (member) {\n memberOfAny = true;\n } else {\n memberOfAll = false;\n }\n }\n\n if (memberOfAll) {\n return {\n notSent: {\n user,\n reason: defineMessage({\n id: 'invite.guests.already-all-channels-member',\n defaultMessage: 'This person is already a member of all the channels.',\n }),\n },\n };\n }\n\n try {\n await dispatch(addUsersToTeam(teamId, [user.id]));\n for (const channel of channels) {\n const member = members && members[channel.id] && members[channel.id][user.id];\n if (!member) {\n await dispatch(joinChannel(user.id, teamId, channel.id, channel.name)); // eslint-disable-line no-await-in-loop\n }\n }\n } catch (e) {\n return {\n notSent: {\n user,\n reason: defineMessage({\n id: 'invite.guests.unable-to-add-the-user-to-the-channels',\n defaultMessage: 'Unable to add the guest to the channels.',\n }),\n },\n };\n }\n\n if (memberOfAny) {\n return {\n notSent: {\n user,\n reason: defineMessage({\n id: 'invite.guests.already-some-channels-member',\n defaultMessage: 'This person is already a member of some of the channels.',\n }),\n },\n };\n }\n return {\n sent: {\n user,\n reason: defineMessage({\n id: 'invite.guests.new-member',\n defaultMessage: 'This guest has been added to the team and {count, plural, one {channel} other {channels}}.',\n values: {\n count: channels.length,\n },\n }),\n },\n };\n}\n\nexport function sendGuestsInvites(\n teamId: string,\n channels: Channel[],\n users: UserProfile[],\n emails: string[],\n message: string,\n): ActionFuncAsync<InviteResults> {\n return async (dispatch, getState) => {\n const state = getState();\n const sent = [];\n const notSent = [];\n const members = getChannelMembersInChannels(state);\n const results = await Promise.all(users.map((user) => sendGuestInviteForUser(dispatch, user, teamId, channels, members)));\n\n for (const result of results) {\n if ('sent' in result && result.sent) {\n sent.push(result.sent);\n }\n if ('notSent' in result && result.notSent) {\n notSent.push(result.notSent);\n }\n }\n\n if (emails.length > 0) {\n let response;\n try {\n response = await dispatch(TeamActions.sendEmailGuestInvitesToChannelsGracefully(teamId, channels.map((x) => x.id), emails, message));\n } catch (e) {\n response = {\n data: emails.map((email) => ({\n email,\n error: {\n error: defineMessage({\n id: 'invite.guests.unable-to-add-the-user-to-the-channels',\n defaultMessage: 'Unable to add the guest to the channels.',\n }),\n },\n })) as unknown as TeamInviteWithError[],\n };\n }\n\n if (response.error) {\n if (response.error.server_error_id === 'app.email.rate_limit_exceeded.app_error') {\n response.error.message = defineMessage({\n id: 'invite.rate-limit-exceeded',\n defaultMessage: 'Invite emails rate limit exceeded.',\n });\n }\n for (const email of emails) {\n notSent.push({\n email,\n reason: response.error.message,\n });\n }\n } else {\n for (const res of (response.data || [])) {\n if (res.error) {\n if (res.error.id === 'api.team.invite_members.unable_to_send_email_with_defaults.app_error' && isCurrentUserSystemAdmin(state)) {\n notSent.push({\n email: res.email,\n reason: defineMessage({\n id: 'admin.environment.smtp.smtpFailure',\n defaultMessage: 'SMTP is not configured in System Console. Can be configured <a>here</a>.',\n }),\n path: ConsolePages.SMTP,\n });\n } else {\n notSent.push({\n email: res.email,\n reason: res.error.message,\n });\n }\n } else {\n sent.push({\n email: res.email,\n reason: defineMessage({\n id: 'invite.guests.added-to-channel',\n defaultMessage: 'An invitation email has been sent.',\n }),\n });\n }\n }\n }\n }\n return {\n data: {\n sent,\n notSent,\n },\n };\n };\n}\n\nexport function sendMembersInvitesToChannels(\n teamId: string,\n channels: Channel[],\n users: UserProfile[],\n emails: string[],\n message: string,\n): ActionFuncAsync<InviteResults> {\n return async (dispatch, getState) => {\n if (users.length > 0) {\n // used to preload in the global store the teammembers info, used later to validate\n // if one of the invites is already part of the team by getTeamMembers > getMembersInTeam.\n await dispatch(TeamActions.getTeamMembersByIds(teamId, users.map((u) => u.id)));\n }\n const state = getState();\n const sent = [];\n const notSent = [];\n const usersToAdd = [];\n for (const user of users) {\n const member = getTeamMember(state, teamId, user.id);\n if (isGuest(user.roles)) {\n notSent.push({\n user,\n reason: defineMessage({\n id: 'invite.members.user-is-guest',\n defaultMessage: 'Contact your admin to make this guest a full member.',\n }),\n });\n } else if (member) {\n notSent.push({\n user,\n reason: defineMessage({\n id: 'invite.members.already-member',\n defaultMessage: 'This person is already a team member.',\n }),\n });\n } else {\n usersToAdd.push(user);\n }\n }\n if (usersToAdd.length > 0) {\n const response = await dispatch(addUsersToTeam(teamId, usersToAdd.map((u) => u.id)));\n const members = response.data || [];\n if (response.error) {\n for (const userToAdd of usersToAdd) {\n notSent.push({\n user: userToAdd,\n reason: response.error.message,\n });\n }\n } else {\n for (const userToAdd of usersToAdd) {\n const memberWithError = members.find((m: TeamMemberWithError) => m.user_id === userToAdd.id && m.error);\n if (memberWithError) {\n notSent.push({\n user: userToAdd,\n reason: memberWithError.error.message,\n });\n } else {\n sent.push({\n user: userToAdd,\n reason: defineMessage({\n id: 'invite.members.added-to-team',\n defaultMessage: 'This member has been added to the team.',\n }),\n });\n }\n }\n }\n }\n if (emails.length > 0) {\n let response;\n try {\n response = await dispatch(\n TeamActions.sendEmailInvitesToTeamAndChannelsGracefully(\n teamId,\n channels.map((x) => x.id),\n emails,\n message,\n ),\n );\n } catch (e) {\n response = {\n data: emails.map((email) => ({\n email,\n error: {\n error: defineMessage({\n id: 'invite.members.unable-to-add-the-user-to-the-team',\n defaultMessage: 'Unable to add the user to the team.',\n }),\n },\n })) as unknown as TeamInviteWithError[],\n };\n }\n const invitesWithErrors = response.data || [];\n if (response.error) {\n if (response.error.server_error_id === 'app.email.rate_limit_exceeded.app_error') {\n response.error.message = defineMessage({id: 'invite.rate-limit-exceeded', defaultMessage: 'Invite emails rate limit exceeded.'});\n }\n for (const email of emails) {\n notSent.push({\n email,\n reason: response.error.message,\n });\n }\n } else {\n for (const email of emails) {\n const inviteWithError = invitesWithErrors.find((i: TeamInviteWithError) => email.toLowerCase() === i.email && i.error);\n if (inviteWithError) {\n if (inviteWithError.error.id === 'api.team.invite_members.unable_to_send_email_with_defaults.app_error' && isCurrentUserSystemAdmin(state)) {\n notSent.push({\n email,\n reason: defineMessage({\n id: 'admin.environment.smtp.smtpFailure',\n defaultMessage: 'SMTP is not configured in System Console. Can be configured <a>here</a>.',\n }),\n path: ConsolePages.SMTP,\n });\n } else {\n notSent.push({\n email,\n reason: inviteWithError.error.message,\n });\n }\n } else {\n sent.push({\n email,\n reason: defineMessage({\n id: 'invite.members.invite-sent',\n defaultMessage: 'An invitation email has been sent.',\n }),\n });\n }\n }\n }\n }\n return {\n data: {\n sent,\n notSent,\n },\n };\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {searchChannels as reduxSearchChannels} from 'mattermost-redux/actions/channels';\nimport {regenerateTeamInviteId} from 'mattermost-redux/actions/teams';\nimport {getProfiles, searchProfiles as reduxSearchProfiles} from 'mattermost-redux/actions/users';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getCurrentChannel, getChannelsInCurrentTeam, getChannelsNameMapInCurrentTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {haveIChannelPermission, haveICurrentTeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam, getCurrentTeamId, getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {isAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport {\n sendMembersInvites,\n sendGuestsInvites,\n sendMembersInvitesToChannels,\n} from 'actions/invite_actions';\n\nimport {makeAsyncComponent} from 'components/async_load';\n\nimport {Constants} from 'utils/constants';\nimport {getRoleForTrackFlow} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nconst InvitationModal = makeAsyncComponent('InvitationModal', React.lazy(() => import('./invitation_modal')));\n\nconst searchProfiles = (term: string, options = {}) => {\n if (!term) {\n return getProfiles(0, 20, options);\n }\n return reduxSearchProfiles(term, options);\n};\n\nconst searchChannels = (teamId: string, term: string) => {\n return reduxSearchChannels(teamId, term);\n};\n\ntype OwnProps = {\n channelToInvite?: Channel;\n}\n\nexport function mapStateToProps(state: GlobalState, props: OwnProps) {\n const config = getConfig(state);\n const license = getLicense(state);\n const channels = getChannelsInCurrentTeam(state);\n const channelsByName = getChannelsNameMapInCurrentTeam(state);\n const townSquareDisplayName = channelsByName[Constants.DEFAULT_CHANNEL]?.display_name || Constants.DEFAULT_CHANNEL_UI_NAME;\n\n const currentTeamId = getCurrentTeamId(state);\n const currentTeam = currentTeamId === '' && props.channelToInvite ? getTeam(state, props.channelToInvite.team_id) : getCurrentTeam(state);\n const currentChannel = getCurrentChannel(state);\n const invitableChannels = channels.filter((channel) => {\n if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n return false;\n }\n if (channel.type === Constants.PRIVATE_CHANNEL) {\n return haveIChannelPermission(state, currentTeam?.id, channel.id, Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS);\n }\n return haveIChannelPermission(state, currentTeam?.id, channel.id, Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS);\n });\n const guestAccountsEnabled = config.EnableGuestAccounts === 'true';\n const emailInvitationsEnabled = config.EnableEmailInvitations === 'true';\n const isEnterpriseReady = config.BuildEnterpriseReady === 'true';\n const isGroupConstrained = Boolean(currentTeam?.group_constrained);\n const canInviteGuests = !isGroupConstrained && isEnterpriseReady && guestAccountsEnabled && haveICurrentTeamPermission(state, Permissions.INVITE_GUEST);\n const isCloud = license.Cloud === 'true';\n\n const canAddUsers = haveICurrentTeamPermission(state, Permissions.ADD_USER_TO_TEAM);\n\n return {\n invitableChannels,\n currentTeam,\n canInviteGuests,\n canAddUsers,\n emailInvitationsEnabled,\n isCloud,\n isAdmin: isAdmin(getCurrentUser(state).roles),\n currentChannel,\n townSquareDisplayName,\n roleForTrackFlow: getRoleForTrackFlow(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n sendGuestsInvites,\n sendMembersInvites,\n sendMembersInvitesToChannels,\n regenerateTeamInviteId,\n searchProfiles,\n searchChannels,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InvitationModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect, useRef, useState} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {defineMessages, useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {isCallsEnabled} from 'selectors/calls';\n\nimport KeyboardShortcutSequence, {\n KEYBOARD_SHORTCUTS,\n} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport type {\n KeyboardShortcutDescriptor} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\n\nimport * as UserAgent from 'utils/user_agent';\n\nimport './keyboard_shortcuts_modal.scss';\n\nconst modalMessages = defineMessages({\n msgHeader: {\n id: 'shortcuts.msgs.header',\n defaultMessage: 'Messages',\n },\n msgInputHeader: {\n id: 'shortcuts.msgs.input.header',\n defaultMessage: 'Works inside an empty input field',\n },\n filesHeader: {\n id: 'shortcuts.files.header',\n defaultMessage: 'Files',\n },\n browserHeader: {\n id: 'shortcuts.browser.header',\n defaultMessage: 'Built-in Browser Commands',\n },\n msgCompHeader: {\n id: 'shortcuts.msgs.comp.header',\n defaultMessage: 'Autocomplete',\n },\n browserInputHeader: {\n id: 'shortcuts.browser.input.header',\n defaultMessage: 'Works inside an input field',\n },\n msgMarkdownHeader: {\n id: 'shortcuts.msgs.markdown.header',\n defaultMessage: 'Formatting',\n },\n info: {\n id: 'shortcuts.info',\n defaultMessage:\n 'Begin a message with / for a list of all the available slash commands.',\n },\n navHeader: {\n id: 'shortcuts.nav.header',\n defaultMessage: 'Navigation',\n },\n msgSearchHeader: {\n id: 'shortcuts.msgs.search.header',\n defaultMessage: 'Searching',\n },\n callsHeader: {\n id: 'shortcuts.calls.header',\n defaultMessage: 'Calls',\n },\n callsGlobalHeader: {\n id: 'shortcuts.calls.global.header',\n defaultMessage: 'Global',\n },\n callsWidgetHeader: {\n id: 'shortcuts.calls.widget.header',\n defaultMessage: 'Call widget',\n },\n callsExpandedHeader: {\n id: 'shortcuts.calls.expanded.header',\n defaultMessage: 'Expanded view (pop-out window)',\n },\n});\n\ninterface Props {\n onExited: () => void;\n}\n\nconst KeyboardShortcutsModal = ({onExited}: Props): JSX.Element => {\n const [show, setShow] = useState(true);\n const contentRef = useRef<HTMLDivElement>(null);\n\n const {formatMessage} = useIntl();\n\n const handleHide = useCallback(() => setShow(false), []);\n\n const isLinux = UserAgent.isLinux();\n\n const callsEnabled = useSelector(isCallsEnabled);\n\n const renderShortcutSequences = (shortcuts: {[key: string]: KeyboardShortcutDescriptor}) => {\n return Object.entries(shortcuts).map(([key, shortcut]) => {\n return (\n <KeyboardShortcutSequence\n key={key}\n shortcut={shortcut}\n />\n );\n });\n };\n\n useEffect(() => {\n contentRef.current?.focus();\n }, []);\n\n return (\n <Modal\n dialogClassName='a11y__modal shortcuts-modal'\n show={show}\n onHide={handleHide}\n onExited={onExited}\n role='none'\n aria-labelledby='shortcutsModalLabel'\n >\n <div className='shortcuts-content'>\n <Modal.Header\n closeButton={true}\n className='divider'\n >\n <Modal.Title\n componentClass='h1'\n id='shortcutsModalLabel'\n >\n <strong><KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.mainHeader}/></strong>\n </Modal.Title>\n </Modal.Header>\n <Modal.Body tabIndex={0}>\n <div\n tabIndex={-1}\n ref={contentRef}\n />\n <div className='row'>\n <div className='col-sm-4'>\n <div className='section'>\n <div>\n <h3 className='section-title'><strong>{formatMessage(modalMessages.navHeader)}</strong></h3>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navPrev}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navNext}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navUnreadPrev}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navUnreadNext}/>\n {!isLinux && <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.teamNavPrev}/>}\n {!isLinux && <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.teamNavNext}/>}\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.teamNavSwitcher}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navSwitcher}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navDMMenu}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navSettings}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navMentions}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navFocusCenter}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navOpenCloseSidebar}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navExpandSidebar}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navOpenChannelInfo}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.navToggleUnreads}/>\n </div>\n </div>\n </div>\n <div className='col-sm-4'>\n <div className='section'>\n <div>\n <h3 className='section-title'><strong>{formatMessage(modalMessages.msgHeader)}</strong></h3>\n <div className='subsection'>\n <h4 className='subsection-title'>{formatMessage(modalMessages.msgInputHeader)}</h4>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgEdit}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgReply}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgLastReaction}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgReprintPrev}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgReprintNext}/>\n </div>\n <div className='subsection'>\n <h4 className='subsection-title'>{formatMessage(modalMessages.msgCompHeader)}</h4>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgCompUsername}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgCompChannel}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgCompEmoji}/>\n </div>\n <div className='subsection'>\n <h4 className='subsection-title'>{formatMessage(modalMessages.msgMarkdownHeader)}</h4>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgMarkdownBold}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgMarkdownItalic}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgMarkdownLink}/>\n </div>\n <div className='subsection'>\n <h4 className='subsection-title'>{formatMessage(modalMessages.msgSearchHeader)}</h4>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.msgSearchChannel}/>\n </div>\n <div className='subsection'>\n <h4 className='subsection-title'>{formatMessage(modalMessages.filesHeader)}</h4>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.filesUpload}/>\n </div>\n </div>\n </div>\n </div>\n <div className='col-sm-4'>\n <div className='section'>\n <div className='section--lower'>\n <h3 className='section-title'><strong>{formatMessage(modalMessages.browserHeader)}</strong></h3>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.browserChannelPrev}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.browserChannelNext}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.browserFontIncrease}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.browserFontDecrease}/>\n <div className='subsection'>\n <h4 className='subsection-title'>{formatMessage(modalMessages.browserInputHeader)}</h4>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.browserHighlightPrev}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.browserHighlightNext}/>\n <KeyboardShortcutSequence shortcut={KEYBOARD_SHORTCUTS.browserNewline}/>\n </div>\n </div>\n </div>\n { callsEnabled &&\n <div className='section'>\n <div>\n <h3 className='section-title'><strong>{formatMessage(modalMessages.callsHeader)}</strong></h3>\n <div className='subsection'>\n <h4 className='subsection-title'>{formatMessage(modalMessages.callsGlobalHeader)}</h4>\n {renderShortcutSequences(KEYBOARD_SHORTCUTS.calls.global)}\n </div>\n\n <div className='subsection'>\n <h4 className='subsection-title'>{formatMessage(modalMessages.callsWidgetHeader)}</h4>\n {renderShortcutSequences(KEYBOARD_SHORTCUTS.calls.widget)}\n </div>\n <div className='subsection'>\n <h4 className='subsection-title'>{formatMessage(modalMessages.callsExpandedHeader)}</h4>\n {renderShortcutSequences(KEYBOARD_SHORTCUTS.calls.popout)}\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n <div className='info__label'>{formatMessage(modalMessages.info)}</div>\n </Modal.Body>\n </div>\n </Modal>\n );\n};\n\nexport default KeyboardShortcutsModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {ShortcutKeyVariant, ShortcutKey} from 'components/shortcut_key';\n\nimport {isMessageDescriptor} from 'utils/i18n';\nimport {isMac} from 'utils/user_agent';\n\nimport type {KeyboardShortcutDescriptor} from './keyboard_shortcuts';\n\nimport './keyboard_shortcuts_sequence.scss';\n\ntype Props = {\n shortcut: KeyboardShortcutDescriptor;\n hideDescription?: boolean;\n hoistDescription?: boolean;\n isInsideTooltip?: boolean;\n};\n\nfunction normalizeShortcutDescriptor(shortcut: KeyboardShortcutDescriptor) {\n if (isMessageDescriptor(shortcut)) {\n return shortcut;\n }\n const {default: standard, mac} = shortcut;\n return isMac() && mac ? mac : standard;\n}\n\nconst KEY_SEPARATOR = '|';\n\nfunction KeyboardShortcutSequence({shortcut, hideDescription, hoistDescription, isInsideTooltip}: Props) {\n const {formatMessage} = useIntl();\n const shortcutText = formatMessage(normalizeShortcutDescriptor(shortcut));\n const splitShortcut = shortcutText.split('\\t');\n\n let description = '';\n let keys = '';\n let altKeys = '';\n\n if (splitShortcut.length > 1) {\n description = splitShortcut[0];\n keys = splitShortcut[1];\n altKeys = splitShortcut[2];\n } else if (splitShortcut[0].includes(KEY_SEPARATOR)) {\n keys = splitShortcut[0];\n } else {\n description = splitShortcut[0];\n }\n\n const renderAltKeys = () => {\n const shortcutKeys = altKeys.split(KEY_SEPARATOR).map((key) => (\n <ShortcutKey\n key={key}\n variant={isInsideTooltip ? ShortcutKeyVariant.Tooltip : ShortcutKeyVariant.ShortcutModal}\n >\n {key}\n </ShortcutKey>\n ));\n\n return (\n <>\n <span>{'\\t|\\t'}</span>\n {shortcutKeys}\n </>\n );\n };\n\n return (\n <>\n {hoistDescription && !hideDescription && description?.replace(/:{1,2}$/, '')}\n <div className='shortcut-line'>\n {!hoistDescription && !hideDescription && description && <span>{description}</span>}\n {keys && keys.split(KEY_SEPARATOR).map((key) => (\n <ShortcutKey\n key={key}\n variant={isInsideTooltip ? ShortcutKeyVariant.Tooltip : ShortcutKeyVariant.ShortcutModal}\n >\n {key}\n </ShortcutKey>\n ))}\n\n {altKeys && renderAltKeys()}\n </div>\n </>\n );\n}\n\nexport default memo(KeyboardShortcutSequence);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {defineMessage, defineMessages, type MessageDescriptor} from 'react-intl';\n\nexport type KeyboardShortcutDescriptor =\n\t| MessageDescriptor\n\t| {default: MessageDescriptor; mac?: MessageDescriptor};\n\nconst callsKBShortcuts = {\n global: {\n callsJoinCall: defineMessages({\n default: {\n id: 'shortcuts.calls.join_call',\n defaultMessage: 'Join call in current channel:\\tCtrl|Alt|S',\n },\n mac: {\n id: 'shortcuts.calls.join_call.mac',\n defaultMessage: 'Join call in current channel:\\t⌘|⌥|S',\n },\n }),\n },\n widget: {\n callsMuteToggle: defineMessages({\n default: {\n id: 'shortcuts.calls.mute_toggle',\n defaultMessage: 'Mute or unmute:\\tCtrl|Shift|Space',\n },\n mac: {\n id: 'shortcuts.calls.mute_toggle.mac',\n defaultMessage: 'Mute or unmute:\\t⌘|Shift|Space',\n },\n }),\n callsRaiseHandToggle: defineMessages({\n default: {\n id: 'shortcuts.calls.raise_hand_toggle',\n defaultMessage: 'Raise or lower hand:\\tCtrl|Shift|Y',\n },\n mac: {\n id: 'shortcuts.calls.raise_hand_toggle.mac',\n defaultMessage: 'Raise or lower hand:\\t⌘|Shift|Y',\n },\n }),\n callsShareScreenToggle: defineMessages({\n default: {\n id: 'shortcuts.calls.share_screen_toggle',\n defaultMessage: 'Share or unshare the screen:\\tCtrl|Shift|E',\n },\n mac: {\n id: 'shortcuts.calls.share_screen_toggle.mac',\n defaultMessage: 'Share or unshare the screen:\\t⌘|Shift|E',\n },\n }),\n callsParticipantsListToggle: defineMessages({\n default: {\n id: 'shortcuts.calls.participants_list_toggle',\n defaultMessage: 'Show or hide participants list:\\tAlt|P\\tCtrl|Shift|P',\n },\n mac: {\n id: 'shortcuts.calls.participants_list_toggle.mac',\n defaultMessage: 'Show or hide participants list:\\t⌥|P\\t⌘|Shift|P',\n },\n }),\n callsLeaveCall: defineMessages({\n default: {\n id: 'shortcuts.calls.leave_call',\n defaultMessage: 'Leave current call:\\tCtrl|Shift|L',\n },\n mac: {\n id: 'shortcuts.calls.leave_call.mac',\n defaultMessage: 'Leave current call:\\t⌘|Shift|L',\n },\n }),\n },\n popout: {\n callsPushToTalk: defineMessages({\n default: {\n id: 'shortcuts.calls.push_to_talk',\n defaultMessage: 'Hold to unmute (push to talk):\\tSpace',\n },\n }),\n },\n};\n\nexport const KEYBOARD_SHORTCUTS = {\n mainHeader: defineMessages({\n default: {\n id: 'shortcuts.header',\n defaultMessage: 'Keyboard shortcuts\\tCtrl|/',\n },\n mac: {\n id: 'shortcuts.header.mac',\n defaultMessage: 'Keyboard shortcuts\\t⌘|/',\n },\n }),\n navPrev: defineMessages({\n default: {\n id: 'shortcuts.nav.prev',\n defaultMessage: 'Previous channel:\\tAlt|Up',\n },\n mac: {\n id: 'shortcuts.nav.prev.mac',\n defaultMessage: 'Previous channel:\\t⌥|Up',\n },\n }),\n navNext: defineMessages({\n default: {\n id: 'shortcuts.nav.next',\n defaultMessage: 'Next channel:\\tAlt|Down',\n },\n mac: {\n id: 'shortcuts.nav.next.mac',\n defaultMessage: 'Next channel:\\t⌥|Down',\n },\n }),\n navUnreadPrev: defineMessages({\n default: {\n id: 'shortcuts.nav.unread_prev',\n defaultMessage: 'Previous unread channel:\\tAlt|Shift|Up',\n },\n mac: {\n id: 'shortcuts.nav.unread_prev.mac',\n defaultMessage: 'Previous unread channel:\\t⌥|Shift|Up',\n },\n }),\n navUnreadNext: defineMessages({\n default: {\n id: 'shortcuts.nav.unread_next',\n defaultMessage: 'Next unread channel:\\tAlt|Shift|Down',\n },\n mac: {\n id: 'shortcuts.nav.unread_next.mac',\n defaultMessage: 'Next unread channel:\\t⌥|Shift|Down',\n },\n }),\n teamNavPrev: defineMessages({\n default: {\n id: 'shortcuts.team_nav.prev',\n defaultMessage: 'Previous team:\\tCtrl|Alt|Up',\n },\n mac: {\n id: 'shortcuts.team_nav.prev.mac',\n defaultMessage: 'Previous team:\\t⌘|⌥|Up',\n },\n }),\n teamNavNext: defineMessages({\n default: {\n id: 'shortcuts.team_nav.next',\n defaultMessage: 'Next team:\\tCtrl|Alt|Down',\n },\n mac: {\n id: 'shortcuts.team_nav.next.mac',\n defaultMessage: 'Next team:\\t⌘|⌥|Down',\n },\n }),\n teamNavSwitcher: defineMessages({\n default: {\n id: 'shortcuts.team_nav.switcher',\n defaultMessage: 'Navigate to a specific team:\\tCtrl|Alt|[1-9]',\n },\n mac: {\n id: 'shortcuts.team_nav.switcher.mac',\n defaultMessage: 'Navigate to a specific team:\\t⌘|⌥|[1-9]',\n },\n }),\n navSwitcher: defineMessages({\n default: {\n id: 'shortcuts.nav.switcher',\n defaultMessage: 'Quick channel navigation:\\tCtrl|K',\n },\n mac: {\n id: 'shortcuts.nav.switcher.mac',\n defaultMessage: 'Quick channel navigation:\\t⌘|K',\n },\n }),\n navDMMenu: defineMessages({\n default: {\n id: 'shortcuts.nav.direct_messages_menu',\n defaultMessage: 'Direct messages menu:\\tCtrl|Shift|K',\n },\n mac: {\n id: 'shortcuts.nav.direct_messages_menu.mac',\n defaultMessage: 'Direct messages menu:\\t⌘|Shift|K',\n },\n }),\n navSettings: defineMessages({\n default: {\n id: 'shortcuts.nav.settings',\n defaultMessage: 'Settings:\\tCtrl|Shift|A',\n },\n mac: {\n id: 'shortcuts.nav.settings.mac',\n defaultMessage: 'Settings:\\t⌘|Shift|A',\n },\n }),\n navMentions: defineMessages({\n default: {\n id: 'shortcuts.nav.recent_mentions',\n defaultMessage: 'Recent mentions:\\tCtrl|Shift|M',\n },\n mac: {\n id: 'shortcuts.nav.recent_mentions.mac',\n defaultMessage: 'Recent mentions:\\t⌘|Shift|M',\n },\n }),\n navFocusCenter: defineMessages({\n default: {\n id: 'shortcuts.nav.focus_center',\n defaultMessage: 'Set focus to input field:\\tCtrl|Shift|L',\n },\n mac: {\n id: 'shortcuts.nav.focus_center.mac',\n defaultMessage: 'Set focus to input field:\\t⌘|Shift|L',\n },\n }),\n navOpenCloseSidebar: defineMessages({\n default: {\n id: 'shortcuts.nav.open_close_sidebar',\n defaultMessage: 'Open or close the right sidebar:\\tCtrl|.',\n },\n mac: {\n id: 'shortcuts.nav.open_close_sidebar.mac',\n defaultMessage: 'Open or close the right sidebar:\\t⌘|.',\n },\n }),\n navExpandSidebar: defineMessages({\n default: {\n id: 'shortcuts.nav.expand_sidebar',\n defaultMessage: 'Expand the right sidebar:\\tCtrl|Shift|.',\n },\n mac: {\n id: 'shortcuts.nav.expand_sidebar.mac',\n defaultMessage: 'Expand the right sidebar:\\t⌘|Shift|.',\n },\n }),\n navOpenChannelInfo: defineMessages({\n default: {\n id: 'shortcuts.nav.open_channel_info',\n defaultMessage: 'View channel info:\\tCtrl|Alt|I',\n },\n mac: {\n id: 'shortcuts.nav.open_channel_info.mac',\n defaultMessage: 'View channel info:\\t⌘|Shift|I',\n },\n }),\n navToggleUnreads: defineMessages({\n default: {\n id: 'shortcuts.nav.toggle_unreads',\n defaultMessage: 'Toggle unread/all channels:\\tCtrl|Shift|U',\n },\n mac: {\n id: 'shortcuts.nav.toggle_unreads.mac',\n defaultMessage: 'Toggle unread/all channels:\\t⌘|Shift|U',\n },\n }),\n msgEdit: defineMessage({\n id: 'shortcuts.msgs.edit',\n defaultMessage: 'Edit last message in channel:\\tUp',\n }),\n msgReply: defineMessage({\n id: 'shortcuts.msgs.reply',\n defaultMessage: 'Reply to last message in channel:\\tShift|Up',\n }),\n msgReprintPrev: defineMessages({\n default: {\n id: 'shortcuts.msgs.reprint_prev',\n defaultMessage: 'Reprint previous message:\\tCtrl|Up',\n },\n mac: {\n id: 'shortcuts.msgs.reprint_prev.mac',\n defaultMessage: 'Reprint previous message:\\t⌘|Up',\n },\n }),\n msgReprintNext: defineMessages({\n default: {\n id: 'shortcuts.msgs.reprint_next',\n defaultMessage: 'Reprint next message:\\tCtrl|Down',\n },\n mac: {\n id: 'shortcuts.msgs.reprint_next.mac',\n defaultMessage: 'Reprint next message:\\t⌘|Down',\n },\n }),\n msgCompUsername: defineMessage({\n id: 'shortcuts.msgs.comp.username',\n defaultMessage: 'Username:\\t@|[a-z]|Tab',\n }),\n msgCompChannel: defineMessage({\n id: 'shortcuts.msgs.comp.channel',\n defaultMessage: 'Channel:\\t~|[a-z]|Tab',\n }),\n msgCompEmoji: defineMessage({\n id: 'shortcuts.msgs.comp.emoji',\n defaultMessage: 'Emoji:\\t:|[a-z]|Tab',\n }),\n msgLastReaction: defineMessages({\n default: {\n id: 'shortcuts.msgs.comp.last_reaction',\n defaultMessage: 'React to last message:\\tCtrl|Shift|\\u29F5',\n },\n mac: {\n id: 'shortcuts.msgs.comp.last_reaction.mac',\n defaultMessage: 'React to last message:\\t⌘|Shift|\\u29F5',\n },\n }),\n msgMarkdownBold: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.bold',\n defaultMessage: 'Bold:\\tCtrl|B',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.bold.mac',\n defaultMessage: 'Bold:\\t⌘|B',\n },\n }),\n msgMarkdownCode: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.code',\n defaultMessage: 'Code',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.code.mac',\n defaultMessage: 'Code',\n },\n }),\n msgMarkdownStrike: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.strike',\n defaultMessage: 'Strikethrough:\\tCtrl|Shift|X',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.strike.mac',\n defaultMessage: 'Strikethrough:\\t⌘|Shift|X',\n },\n }),\n msgMarkdownH3: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.h3',\n defaultMessage: 'Heading',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.h3.mac',\n defaultMessage: 'Heading',\n },\n }),\n msgMarkdownQuote: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.quote',\n defaultMessage: 'Quote',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.quote.mac',\n defaultMessage: 'Quote',\n },\n }),\n msgMarkdownOl: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.ordered',\n defaultMessage: 'Numbered List',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.ordered.mac',\n defaultMessage: 'Numbered List',\n },\n }),\n msgMarkdownUl: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.unordered',\n defaultMessage: 'Bulleted List',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.unordered.mac',\n defaultMessage: 'Bulleted List',\n },\n }),\n msgShowFormatting: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.formatting.show',\n defaultMessage: 'Show Formatting:\\tCtrl|Alt|T',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.formatting.show.mac',\n defaultMessage: 'Show Formatting:\\t⌘|⌥|T',\n },\n }),\n msgHideFormatting: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.formatting.hide',\n defaultMessage: 'Hide Formatting:\\tCtrl|Alt|T',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.formatting.hide.mac',\n defaultMessage: 'Hide Formatting:\\t⌘|⌥|T',\n },\n }),\n msgShowEmojiPicker: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.emoji',\n defaultMessage: 'Emoji / Gif picker:\\tCtrl|Shift|E',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.emoji.mac',\n defaultMessage: 'Emoji / Gif picker:\\t⌘|Shift|E',\n },\n }),\n msgMarkdownPreview: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.preview',\n defaultMessage: 'Show/Hide Preview:\\tCtrl|Alt|P',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.preview.mac',\n defaultMessage: 'Show/Hide Preview:\\t⌘|Shift|P',\n },\n }),\n msgMarkdownItalic: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.italic',\n defaultMessage: 'Italic:\\tCtrl|I',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.italic.mac',\n defaultMessage: 'Italic:\\t⌘|I',\n },\n }),\n msgMarkdownLink: defineMessages({\n default: {\n id: 'shortcuts.msgs.markdown.link',\n defaultMessage: 'Link:\\tCtrl|Alt|K',\n },\n mac: {\n id: 'shortcuts.msgs.markdown.link.mac',\n defaultMessage: 'Link:\\t⌘|⌥|K',\n },\n }),\n filesUpload: defineMessages({\n default: {\n id: 'shortcuts.files.upload',\n defaultMessage: 'Upload files:\\tCtrl|U',\n },\n mac: {\n id: 'shortcuts.files.upload.mac',\n defaultMessage: 'Upload files:\\t⌘|U',\n },\n }),\n browserChannelPrev: defineMessages({\n default: {\n id: 'shortcuts.browser.channel_prev',\n defaultMessage: 'Back in history:\\tAlt|Left',\n },\n mac: {\n id: 'shortcuts.browser.channel_prev.mac',\n defaultMessage: 'Back in history:\\t⌘|[',\n },\n }),\n browserChannelNext: defineMessages({\n default: {\n id: 'shortcuts.browser.channel_next',\n defaultMessage: 'Forward in history:\\tAlt|Right',\n },\n mac: {\n id: 'shortcuts.browser.channel_next.mac',\n defaultMessage: 'Forward in history:\\t⌘|]',\n },\n }),\n browserFontIncrease: defineMessages({\n default: {\n id: 'shortcuts.browser.font_increase',\n defaultMessage: 'Zoom in:\\tCtrl|+',\n },\n mac: {\n id: 'shortcuts.browser.font_increase.mac',\n defaultMessage: 'Zoom in:\\t⌘|+',\n },\n }),\n browserFontDecrease: defineMessages({\n default: {\n id: 'shortcuts.browser.font_decrease',\n defaultMessage: 'Zoom out:\\tCtrl|-',\n },\n mac: {\n id: 'shortcuts.browser.font_decrease.mac',\n defaultMessage: 'Zoom out:\\t⌘|-',\n },\n }),\n browserHighlightPrev: defineMessage({\n id: 'shortcuts.browser.highlight_prev',\n defaultMessage: 'Highlight text to the previous line:\\tShift|Up',\n }),\n browserHighlightNext: defineMessage({\n id: 'shortcuts.browser.highlight_next',\n defaultMessage: 'Highlight text to the next line:\\tShift|Down',\n }),\n browserNewline: defineMessage({\n id: 'shortcuts.browser.newline',\n defaultMessage: 'Create a new line:\\tShift|Enter',\n }),\n msgSearchChannel: defineMessages({\n default: {\n id: 'shortcuts.msgs.search_channel',\n defaultMessage: 'In channel:\\tCtrl|F',\n },\n mac: {\n id: 'shortcuts.msgs.search_channel.mac',\n defaultMessage: 'In channel:\\t⌘|F',\n },\n }),\n msgPostPriority: defineMessages({\n default: {\n id: 'shortcuts.msgs.formatting_bar.post_priority',\n defaultMessage: 'Message priority',\n },\n mac: {\n id: 'shortcuts.msgs.formatting_bar.post_priority',\n defaultMessage: 'Message priority',\n },\n }),\n calls: callsKBShortcuts,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport KeyboardShortcutSequence from './keyboard_shortcuts_sequence';\n\nexport * from './keyboard_shortcuts';\nexport default KeyboardShortcutSequence;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport useOpenStartTrialFormModal from 'components/common/hooks/useOpenStartTrialFormModal';\n\nimport './start_trial_btn.scss';\n\nexport type StartTrialBtnProps = {\n telemetryId: string;\n onClick?: () => void;\n handleEmbargoError?: () => void;\n btnClass?: string;\n renderAsButton?: boolean;\n disabled?: boolean;\n trackingPage?: string;\n};\n\nconst StartTrialBtn = ({\n btnClass,\n onClick,\n disabled = false,\n renderAsButton = false,\n}: StartTrialBtnProps) => {\n const {formatMessage} = useIntl();\n const openTrialForm = useOpenStartTrialFormModal();\n const startTrial = async () => {\n // reading status from here instead of normal flow because\n // by the time the function needs the updated value from requestLicense,\n // it will be too late to wait for the render cycle to happen again\n // to close over the updated value\n openTrialForm();\n\n // on click will execute whatever action is sent from the invoking place, if nothing is sent, open the trial benefits modal\n if (onClick) {\n onClick();\n }\n };\n\n const id = 'start_trial_btn';\n\n const btnText = formatMessage({id: 'admin.ldap_feature_discovery.call_to_action.primary', defaultMessage: 'Start trial'});\n\n return renderAsButton ? (\n <button\n id={id}\n className={btnClass}\n onClick={startTrial}\n disabled={disabled}\n >\n {btnText}\n </button>\n ) : (\n <a\n id={id}\n className='btn btn-secondary'\n onClick={startTrial}\n >\n {btnText}\n </a>\n );\n};\n\nexport default StartTrialBtn;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport ConfirmModal from 'components/confirm_modal';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n channel: Channel;\n onExited: () => void;\n callback?: () => any;\n actions: {\n leaveChannel: (channelId: string) => any;\n };\n}\n\nconst LeaveChannelModal = ({actions, channel, callback, onExited}: Props) => {\n const [show, setShow] = useState(true);\n\n const handleSubmit = () => {\n if (channel) {\n const channelId = channel.id;\n actions.leaveChannel(channelId).then((result: {data: boolean}) => {\n if (result.data) {\n callback?.();\n handleHide();\n }\n });\n }\n };\n\n const handleHide = () => setShow(false);\n\n let title;\n let message;\n if (channel && channel.display_name) {\n if (channel.type === Constants.PRIVATE_CHANNEL) {\n title = (\n <FormattedMessage\n id='leave_private_channel_modal.title'\n defaultMessage='Leave Private Channel {channel}'\n values={{\n channel: <b>{channel.display_name}</b>,\n }}\n />\n );\n } else {\n title = (\n <FormattedMessage\n id='leave_public_channel_modal.title'\n defaultMessage='Leave Channel {channel}'\n values={{\n channel: <b>{channel.display_name}</b>,\n }}\n />\n );\n }\n\n if (channel.type === Constants.PRIVATE_CHANNEL) {\n message = (\n <FormattedMessage\n id='leave_private_channel_modal.message'\n defaultMessage='Are you sure you wish to leave the private channel {channel}? You must be re-invited in order to re-join this channel in the future.'\n values={{\n channel: <b>{channel.display_name}</b>,\n }}\n />\n );\n } else {\n message = (\n <FormattedMessage\n id='leave_public_channel_modal.message'\n defaultMessage='Are you sure you wish to leave the channel {channel}? You can re-join this channel in the future if you change your mind.'\n values={{\n channel: <b>{channel.display_name}</b>,\n }}\n />\n );\n }\n }\n\n const buttonClass = 'btn btn-danger';\n const button = (\n <FormattedMessage\n id='leave_private_channel_modal.leave'\n defaultMessage='Yes, leave channel'\n />\n );\n\n return (\n <ConfirmModal\n show={show}\n title={title}\n message={message}\n confirmButtonClass={buttonClass}\n confirmButtonText={button}\n onConfirm={handleSubmit}\n onCancel={handleHide}\n onExited={onExited}\n />\n );\n};\n\nexport default LeaveChannelModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {leaveChannel} from 'actions/views/channel';\n\nimport LeaveChannelModal from './leave_channel_modal';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n leaveChannel,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(LeaveChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\n\nimport LoadingScreen from 'components/loading_screen';\n\nexport const DEFAULT_NUM_PER_PAGE = 50;\n\ntype Props = {\n\n /**\n * titleText (optional) a string to show at the top bar of the modal.\n */\n titleText?: string;\n\n /**\n * searchPlaceholderText (optional) a string to show as a placeholder in the search input.\n */\n searchPlaceholderText?: string;\n\n /**\n * titleBarButtonText (optional) a string representing a title bar button text.\n */\n titleBarButtonText?: string;\n\n /**\n * numPerPage (optional) a number setting how many items per page should be displayed. Defaults to\n * DEFAULT_NUM_PER_PAGE.\n */\n numPerPage?: number;\n\n /**\n * show (optional) a boolean setting to hide the modal via props rather then unmounting it.\n */\n show?: boolean;\n\n /**\n * titleBarButtonOnClick (optional) a func to handle title button bar clicks.\n */\n titleBarButtonOnClick?: () => void;\n\n /**\n * loadItems is a function that receives the params (pageNumber, searchTerm) and should return an object\n * with the shape {items: [], totalCount: 0}.\n * items: an array of objects that are passed to each renderRow function.\n * totalCount: an integer representing the total number of items as displayed in the pagination text.\n *\n * Example:\n * const loadItems = async (pageNumber, searchTerm) => {\n * const {data} = await loadFromServer(searchTerm, pageNumber, PER_PAGE);\n * return {\n * items: data.users,\n * totalCount: data.total,\n * };\n * };\n */\n loadItems: (page: number, searchTerm: string) => Promise<{\n items: Group[];\n totalCount: number;\n }>;\n\n /**\n * onHide (optional) a function to be invoked when the modal is closed.\n */\n onHide?: () => void;\n\n /**\n * renderRow is a function that receives the params (item, listModal) and should return JSX.\n * item: an object as returned by each entry in the loadItems function's 'items' array.\n * listModal: the instance of the ListModal component class.\n *\n * Example:\n * const renderRow = (item, listModal) => <div>{item.id}</div>;\n */\n renderRow: (item: Group, listModal: ListModal) => JSX.Element;\n}\n\ntype State = {\n show: boolean;\n page: number;\n items: Group[];\n totalCount: number;\n loading: boolean;\n searchTerm: string;\n}\n\nexport default class ListModal extends React.PureComponent<Props, State> {\n static defaultProps = {\n show: true,\n };\n numPerPage: number;\n\n constructor(props: Props) {\n super(props);\n\n this.numPerPage = props.numPerPage || DEFAULT_NUM_PER_PAGE;\n\n this.state = {\n show: true,\n page: 0,\n items: [],\n totalCount: 0,\n loading: true,\n searchTerm: '',\n };\n }\n\n async componentDidMount() {\n const {totalCount, items} = await this.props.loadItems(0, '');\n this.setState({totalCount, items, loading: false});\n }\n\n handleHide = () => {\n this.setState({show: false});\n };\n\n handleExit = () => {\n if (this.props.onHide) {\n this.props.onHide();\n }\n };\n\n renderRows() {\n if (this.state.loading) {\n return (\n <div>\n <LoadingScreen\n position='absolute'\n key='loading'\n />\n </div>\n );\n }\n return this.state.items.map((item) => (\n this.props.renderRow(item, this)\n ));\n }\n\n onNext = () => {\n const nextPage = this.state.page + 1;\n this.onPageChange(nextPage);\n };\n\n onPrev = () => {\n const prevPage = this.state.page - 1;\n this.onPageChange(prevPage);\n };\n\n onPageChange = async (page: number) => {\n this.setState({loading: true});\n const result = await this.props.loadItems(page, this.state.searchTerm);\n this.setState({page, items: result.items, loading: false});\n };\n\n onSearchInput = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const {target} = event;\n const searchTerm = target.value;\n this.setState({loading: true, searchTerm});\n const result = await this.props.loadItems(0, searchTerm);\n const {items, totalCount} = result;\n this.setState({loading: false, items, totalCount});\n };\n\n paginationRange() {\n let startCount = (this.state.page * this.numPerPage) + 1;\n const endCount = (startCount + this.state.items.length) - 1;\n if (endCount === 0) {\n startCount = 0;\n }\n return {startCount, endCount};\n }\n\n render() {\n if (!this.props.show) {\n return null;\n }\n const {endCount, startCount} = this.paginationRange();\n return (\n <div>\n <Modal\n dialogClassName='a11y__modal more-modal more-modal--action'\n show={this.state.show}\n onHide={this.handleHide}\n onExited={this.handleExit}\n >\n <Modal.Header closeButton={true}>\n <Modal.Title componentClass='h1'>\n <span className='name'>{this.props.titleText}</span>\n </Modal.Title>\n {this.props.titleBarButtonText && this.props.titleBarButtonOnClick &&\n <a\n className='btn btn-md btn-primary'\n href='#'\n onClick={this.props.titleBarButtonOnClick}\n >\n {this.props.titleBarButtonText}\n </a>}\n </Modal.Header>\n <Modal.Body>\n <div className='filtered-user-list'>\n <div className='filter-row'>\n <div className='col-xs-12'>\n <label\n className='hidden-label'\n htmlFor='searchUsersInput'\n >\n {this.props.searchPlaceholderText}\n </label>\n <input\n id='searchUsersInput'\n className='form-control filter-textbox'\n placeholder={this.props.searchPlaceholderText}\n onChange={this.onSearchInput}\n />\n </div>\n <div className='col-sm-12'>\n <span className='member-count pull-left'>\n <FormattedMessage\n id='list_modal.paginatorCount'\n defaultMessage='{startCount, number} - {endCount, number} of {total, number} total'\n values={{\n startCount,\n endCount,\n total: this.state.totalCount,\n }}\n />\n </span>\n </div>\n </div>\n <div className='more-modal__list'>\n <div>\n {this.renderRows()}\n </div>\n </div>\n <div className='filter-controls'>\n {this.state.page > 0 &&\n <button\n onClick={this.onPrev}\n className='btn btn-sm btn-tertiary filter-control filter-control__prev'\n >\n <FormattedMessage\n id='filtered_user_list.prev'\n defaultMessage='Previous'\n />\n </button>}\n {this.props.numPerPage && (this.state.items.length >= this.props.numPerPage) && endCount !== this.state.totalCount &&\n <button\n onClick={this.onNext}\n className='btn btn-sm btn-tertiary filter-control filter-control__next'\n >\n <FormattedMessage\n id='filtered_user_list.next'\n defaultMessage='Next'\n />\n </button>}\n </div>\n </div>\n </Modal.Body>\n </Modal>\n </div >\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\ntype Props = {\n loading?: React.ReactNode;\n progress?: number;\n containerClass?: string;\n}\n\nconst LoadingImagePreview: React.FC<Props> = ({loading, progress, containerClass}: Props) => {\n let progressView: JSX.Element = (\n <span className='loader-percent'/>\n );\n\n if (progress) {\n progressView = (\n <span className='loader-percent'>\n {loading}\n {` ${progress}%`}\n </span>\n );\n }\n\n return (\n <div className={containerClass}>\n <LoadingSpinner/>\n {progressView}\n </div>\n );\n};\n\nLoadingImagePreview.defaultProps = {\n containerClass: 'view-image__loading',\n};\n\nexport default LoadingImagePreview;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ReactNode, CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\ntype Props = {\n position?: 'absolute' | 'fixed' | 'relative' | 'static' | 'inherit';\n style?: CSSProperties;\n message?: ReactNode;\n className?: string;\n centered?: boolean;\n}\n\nfunction LoadingScreen({message, position = 'relative', style, className = '', centered = false}: Props) {\n const {formatMessage} = useIntl();\n\n return (\n <div\n className={classNames('loading-screen', className, {\n 'loading-screen--in-middle': centered,\n })}\n style={{position, ...style}}\n >\n <div className='loading__content'>\n <p>\n {message || formatMessage({id: 'loading_screen.loading', defaultMessage: 'Loading'})}\n </p>\n <div className='round round-1'/>\n <div className='round round-2'/>\n <div className='round round-3'/>\n </div>\n </div>\n );\n}\n\nexport default LoadingScreen;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Redirect} from 'react-router-dom';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport * as WebSocketActions from 'actions/websocket_actions.jsx';\nimport BrowserStore from 'stores/browser_store';\n\nimport LoadingScreen from 'components/loading_screen';\n\nimport WebSocketClient from 'client/web_websocket_client';\nimport Constants from 'utils/constants';\nimport DesktopApp from 'utils/desktop_api';\nimport {isKeyPressed} from 'utils/keyboard';\nimport {getBrowserTimezone} from 'utils/timezone';\nimport {isAndroid, isIos} from 'utils/user_agent';\nimport {doesCookieContainsMMUserId} from 'utils/utils';\n\ndeclare global {\n interface Window {\n desktop: {\n version?: string | null;\n };\n }\n}\n\nexport type Props = {\n currentUser?: UserProfile;\n currentChannelId?: string;\n isCurrentChannelManuallyUnread: boolean;\n children?: React.ReactNode;\n mfaRequired: boolean;\n actions: {\n autoUpdateTimezone: (deviceTimezone: string) => void;\n getChannelURLAction: (channelId: string, teamId: string, url: string) => void;\n updateApproximateViewTime: (channelId: string) => void;\n };\n showTermsOfService: boolean;\n location: {\n pathname: string;\n search: string;\n };\n}\n\nexport default class LoggedIn extends React.PureComponent<Props> {\n private cleanupDesktopListeners?: () => void;\n\n constructor(props: Props) {\n super(props);\n\n const root = document.getElementById('root');\n if (root) {\n root.className += ' channel-view';\n }\n }\n\n private isValidState(): boolean {\n return this.props.currentUser != null;\n }\n\n public componentDidMount(): void {\n // Initialize websocket\n WebSocketActions.initialize();\n\n this.updateTimeZone();\n\n // Make sure the websockets close and reset version\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n\n // listen for the app visibility state\n window.addEventListener('visibilitychange', this.handleVisibilityChange, false);\n\n // Listen for focused tab/window state\n window.addEventListener('focus', this.onFocusListener);\n window.addEventListener('blur', this.onBlurListener);\n if (!document.hasFocus()) {\n GlobalActions.emitBrowserFocus(false);\n }\n\n // Listen for user activity and notifications from the Desktop App (if applicable)\n const offUserActivity = DesktopApp.onUserActivityUpdate(this.updateActiveStatus);\n const offNotificationClicked = DesktopApp.onNotificationClicked(this.clickNotification);\n this.cleanupDesktopListeners = () => {\n offUserActivity();\n offNotificationClicked();\n };\n\n // Device tracking setup\n if (isIos()) {\n document.body.classList.add('ios');\n } else if (isAndroid()) {\n document.body.classList.add('android');\n }\n\n if (!this.props.currentUser) {\n const rootEl = document.getElementById('root');\n if (rootEl) {\n rootEl.setAttribute('class', '');\n }\n GlobalActions.emitUserLoggedOutEvent('/login?redirect_to=' + encodeURIComponent(`${this.props.location.pathname}${this.props.location.search}`), true, false);\n }\n\n // Prevent backspace from navigating back a page\n window.addEventListener('keydown', this.handleBackSpace);\n\n if (this.isValidState() && !this.props.mfaRequired) {\n BrowserStore.signalLogin();\n DesktopApp.signalLogin();\n }\n }\n\n public componentWillUnmount(): void {\n WebSocketActions.close();\n\n window.removeEventListener('keydown', this.handleBackSpace);\n\n window.removeEventListener('focus', this.onFocusListener);\n window.removeEventListener('blur', this.onBlurListener);\n\n this.cleanupDesktopListeners?.();\n }\n\n public render(): React.ReactNode {\n if (!this.isValidState()) {\n return <LoadingScreen/>;\n }\n\n if (this.props.mfaRequired) {\n if (this.props.location.pathname !== '/mfa/setup') {\n return <Redirect to={'/mfa/setup'}/>;\n }\n } else if (this.props.location.pathname === '/mfa/confirm') {\n // Nothing to do. Wait for MFA flow to complete before prompting TOS.\n } else if (this.props.showTermsOfService) {\n if (this.props.location.pathname !== '/terms_of_service') {\n return <Redirect to={'/terms_of_service?redirect_to=' + encodeURIComponent(this.props.location.pathname)}/>;\n }\n }\n\n return this.props.children;\n }\n\n private handleVisibilityChange = (): void => {\n if (!document.hidden) {\n this.updateTimeZone();\n }\n };\n\n private updateTimeZone(): void {\n this.props.actions.autoUpdateTimezone(getBrowserTimezone());\n }\n\n private onFocusListener(): void {\n GlobalActions.emitBrowserFocus(true);\n }\n\n private onBlurListener(): void {\n GlobalActions.emitBrowserFocus(false);\n }\n\n private updateActiveStatus = (userIsActive: boolean, idleTime: number, manual: boolean) => {\n if (!this.props.currentUser) {\n return;\n }\n\n // update the server with the users current away status\n if (userIsActive === true || userIsActive === false) {\n WebSocketClient.userUpdateActiveStatus(userIsActive, manual);\n }\n };\n\n private clickNotification = (channelId: string, teamId: string, url: string) => {\n window.focus();\n\n // navigate to the appropriate channel\n this.props.actions.getChannelURLAction(channelId, teamId, url);\n };\n\n private handleBackSpace = (e: KeyboardEvent): void => {\n const excludedElements = ['input', 'textarea'];\n const targetElement = e.target as HTMLElement;\n\n if (!targetElement) {\n return;\n }\n\n const targetsTagName = targetElement.tagName.toLowerCase();\n const isTargetNotContentEditable = targetElement.getAttribute?.('contenteditable') !== 'true';\n\n if (\n isKeyPressed(e, Constants.KeyCodes.BACKSPACE) &&\n !(excludedElements.includes(targetsTagName)) &&\n isTargetNotContentEditable\n ) {\n e.preventDefault();\n }\n };\n\n private handleBeforeUnload = (): void => {\n // remove the event listener to prevent getting stuck in a loop\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n if (doesCookieContainsMMUserId() && this.props.currentChannelId && !this.props.isCurrentChannelManuallyUnread) {\n this.props.actions.updateApproximateViewTime(this.props.currentChannelId);\n }\n WebSocketActions.close();\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {updateApproximateViewTime} from 'mattermost-redux/actions/channels';\nimport {autoUpdateTimezone} from 'mattermost-redux/actions/timezone';\nimport {getChannel, getCurrentChannelId, isManuallyUnread} from 'mattermost-redux/selectors/entities/channels';\nimport {getLicense, getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser, shouldShowTermsOfService} from 'mattermost-redux/selectors/entities/users';\n\nimport {getChannelURL} from 'selectors/urls';\n\nimport {getHistory} from 'utils/browser_history';\nimport {checkIfMFARequired} from 'utils/route';\nimport {isPermalinkURL} from 'utils/url';\n\nimport type {ThunkActionFunc, GlobalState} from 'types/store';\n\nimport LoggedIn from './logged_in';\n\ntype Props = {\n match: {\n url: string;\n };\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const license = getLicense(state);\n const config = getConfig(state);\n const showTermsOfService = shouldShowTermsOfService(state);\n const currentChannelId = getCurrentChannelId(state);\n\n return {\n currentUser: getCurrentUser(state),\n currentChannelId,\n isCurrentChannelManuallyUnread: isManuallyUnread(state, currentChannelId),\n mfaRequired: checkIfMFARequired(getCurrentUser(state), license, config, ownProps.match.url),\n showTermsOfService,\n };\n}\n\n// NOTE: suggestions where to keep this welcomed\nconst getChannelURLAction = (channelId: string, teamId: string, url: string): ThunkActionFunc<void> => (dispatch, getState) => {\n const state = getState();\n\n if (url && isPermalinkURL(url)) {\n getHistory().push(url);\n return;\n }\n\n const channel = getChannel(state, channelId);\n if (channel) {\n getHistory().push(getChannelURL(state, channel, teamId));\n }\n};\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n autoUpdateTimezone,\n getChannelURLAction,\n updateApproximateViewTime,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LoggedIn);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport * as UserUtils from 'mattermost-redux/utils/user_utils';\n\nimport Constants from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\n\ntype Props = {\n currentUser: UserProfile;\n currentUserId: string;\n currentTeamId: string;\n numOfPublicChannels: number;\n numOfPrivateChannels: number;\n onExited: () => void;\n actions: {\n leaveTeam: (teamId: string, userId: string) => void;\n toggleSideBarRightMenu: () => void;\n };\n};\n\ntype State = {\n show: boolean;\n};\n\nexport default class LeaveTeamModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n show: true,\n };\n }\n\n componentDidMount() {\n document.addEventListener('keypress', this.handleKeyPress);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keypress', this.handleKeyPress);\n }\n\n handleHide = () => {\n this.setState({\n show: false,\n });\n };\n\n handleKeyPress = (e: KeyboardEvent) => {\n if (isKeyPressed(e, Constants.KeyCodes.ENTER)) {\n this.handleSubmit();\n }\n };\n\n handleSubmit = () => {\n this.handleHide();\n\n this.props.actions.leaveTeam(\n this.props.currentTeamId,\n this.props.currentUserId,\n );\n this.props.actions.toggleSideBarRightMenu();\n };\n\n render() {\n const {\n currentUser,\n numOfPrivateChannels,\n numOfPublicChannels,\n } = this.props;\n\n const isGuest = UserUtils.isGuest(currentUser.roles);\n\n let modalMessage;\n if (isGuest) {\n if (numOfPublicChannels !== 0 && numOfPrivateChannels !== 0) {\n modalMessage = (\n <FormattedMessage\n id='leave_team_modal_guest.description'\n defaultMessage='<strong>You will be removed from {num_of_public_channels} public {num_of_public_channels,plural,one {channel} other {channels}} and {num_of_private_channels} private {num_of_private_channels,plural,one {channel} other {channels}} on this team.</strong> You won't be able to rejoin it without an invitation from another team member. Are you sure?'\n values={{\n num_of_public_channels: numOfPublicChannels,\n num_of_private_channels: numOfPrivateChannels,\n strong: (chunks: React.ReactNode) => <strong>{chunks}</strong>,\n }}\n />\n );\n } else if (numOfPublicChannels === 0) {\n modalMessage = (\n <FormattedMessage\n id='leave_team_modal_guest_only_private.description'\n defaultMessage='<strong>You will be removed from {num_of_private_channels} private {num_of_private_channels,plural,one {channel} other {channels}} on this team.</strong> You won't be able to rejoin it without an invitation from another team member. Are you sure?'\n values={{\n num_of_private_channels: numOfPrivateChannels,\n strong: (chunks: React.ReactNode) => <strong>{chunks}</strong>,\n }}\n />\n );\n } else {\n modalMessage = (\n <FormattedMessage\n id='leave_team_modal_guest_only_public.description'\n defaultMessage='<strong>You will be removed from {num_of_public_channels} public {num_of_public_channels,plural,one {channel} other {channels}} on this team.</strong> You won't be able to rejoin it without an invitation from another team member. Are you sure?'\n values={{\n num_of_public_channels: numOfPublicChannels,\n strong: (chunks: React.ReactNode) => <strong>{chunks}</strong>,\n }}\n />\n );\n }\n } else if (numOfPublicChannels !== 0 && numOfPrivateChannels !== 0) {\n modalMessage = (\n <FormattedMessage\n id='leave_team_modal.description'\n defaultMessage='<strong>You will be removed from {num_of_public_channels} public {num_of_public_channels,plural,one {channel} other {channels}} and {num_of_private_channels} private {num_of_private_channels,plural,one {channel} other {channels}} on this team.</strong> If the team is private you won't be able to rejoin it without an invitation from another team member. Are you sure?'\n values={{\n num_of_public_channels: numOfPublicChannels,\n num_of_private_channels: numOfPrivateChannels,\n strong: (chunks: React.ReactNode) => <strong>{chunks}</strong>,\n }}\n />\n );\n } else if (numOfPublicChannels === 0) {\n modalMessage = (\n <FormattedMessage\n id='leave_team_modal_private.description'\n defaultMessage='<strong>You will be removed from {num_of_private_channels} private {num_of_private_channels,plural,one {channel} other {channels}} on this team.</strong> If the team is private you won't be able to rejoin it without an invitation from another team member. Are you sure?'\n values={{\n num_of_private_channels: numOfPrivateChannels,\n strong: (chunks: React.ReactNode) => <strong>{chunks}</strong>,\n }}\n />\n );\n } else {\n modalMessage = (\n <FormattedMessage\n id='leave_team_modal_public.description'\n defaultMessage='<strong>You will be removed from {num_of_public_channels} public {num_of_public_channels,plural,one {channel} other {channels}} on this team.</strong> Are you sure?'\n values={{\n num_of_public_channels: numOfPublicChannels,\n strong: (chunks: React.ReactNode) => <strong>{chunks}</strong>,\n }}\n />\n );\n }\n\n return (\n <Modal\n dialogClassName='a11y__modal'\n className='modal-confirm'\n show={this.state.show}\n onExited={this.props.onExited}\n onHide={this.handleHide}\n id='leaveTeamModal'\n role='none'\n aria-labelledby='leaveTeamModalLabel'\n >\n <Modal.Header closeButton={false}>\n <Modal.Title\n componentClass='h1'\n id='leaveTeamModalLabel'\n >\n <FormattedMessage\n id='leave_team_modal.title'\n defaultMessage='Leave the team?'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {modalMessage}\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.handleHide}\n id='leaveTeamNo'\n >\n <FormattedMessage\n id='leave_team_modal.no'\n defaultMessage='No'\n />\n </button>\n <button\n type='button'\n className='btn btn-danger'\n onClick={this.handleSubmit}\n id='leaveTeamYes'\n >\n <FormattedMessage\n id='leave_team_modal.yes'\n defaultMessage='Yes'\n />\n </button>\n </Modal.Footer>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {removeUserFromTeam as leaveTeam} from 'mattermost-redux/actions/teams';\nimport {getMyChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId, getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {toggleSideBarRightMenuAction} from 'actions/global_actions';\n\nimport {Constants} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport LeaveTeamModal from './leave_team_modal';\n\nfunction getNumOfPrivateChannels(state: GlobalState) {\n const channels = getMyChannels(state);\n\n return channels.filter((channel) => channel.type === Constants.PRIVATE_CHANNEL).length;\n}\n\nfunction getNumOfPublicChannels(state: GlobalState) {\n const channels = getMyChannels(state);\n\n return channels.filter((channel) => channel.type === Constants.OPEN_CHANNEL).length;\n}\n\nfunction mapStateToProps(state: GlobalState) {\n const currentUserId = getCurrentUserId(state);\n const currentTeamId = getCurrentTeamId(state);\n const currentUser = getCurrentUser(state);\n\n return {\n currentUserId,\n currentTeamId,\n currentUser,\n numOfPrivateChannels: getNumOfPrivateChannels(state),\n numOfPublicChannels: getNumOfPublicChannels(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n leaveTeam,\n toggleSideBarRightMenu: toggleSideBarRightMenuAction,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(LeaveTeamModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport {SyncableType} from '@mattermost/types/groups';\nimport type {Group, SyncablePatch} from '@mattermost/types/groups';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AddGroupsToTeamModal from 'components/add_groups_to_team_modal';\nimport ConfirmModal from 'components/confirm_modal';\nimport Nbsp from 'components/html_entities/nbsp';\nimport ListModal, {DEFAULT_NUM_PER_PAGE} from 'components/list_modal';\nimport DropdownIcon from 'components/widgets/icons/fa_dropdown_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport groupsAvatar from 'images/groups-avatar.png';\nimport {ModalIdentifiers} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport type {ModalData} from 'types/actions';\n\ntype Props = {\n intl: IntlShape;\n team: Team;\n actions: {\n getGroupsAssociatedToTeam: (teamID: string, q: string, page: number, perPage: number, filterAllowReference: boolean) => Promise<ActionResult<{groups: Group[]; totalGroupCount: number}>>;\n closeModal: (modalId: string) => void;\n openModal: <P>(modalData: ModalData<P>) => void;\n unlinkGroupSyncable: (groupID: string, syncableID: string, syncableType: SyncableType) => Promise<ActionResult>;\n patchGroupSyncable: (groupID: string, syncableID: string, syncableType: SyncableType, patch: Partial<SyncablePatch>) => Promise<ActionResult>;\n getMyTeamMembers: () => void;\n };\n};\n\ntype State = {\n showConfirmModal: boolean;\n item: Group;\n listModal?: ListModal;\n}\n\nclass TeamGroupsManageModal extends React.PureComponent<Props, State> {\n state = {\n showConfirmModal: false,\n item: {\n member_count: 0,\n },\n } as State;\n\n loadItems = async (pageNumber: number, searchTerm: string) => {\n const {data} = await this.props.actions.getGroupsAssociatedToTeam(this.props.team.id, searchTerm, pageNumber, DEFAULT_NUM_PER_PAGE, true);\n\n return {\n items: data!.groups,\n totalCount: data!.totalGroupCount,\n };\n };\n\n handleDeleteCanceled = () => {\n this.setState({showConfirmModal: false});\n };\n\n handleDeleteConfirmed = () => {\n this.setState({showConfirmModal: false});\n const {item, listModal} = this.state;\n this.props.actions.unlinkGroupSyncable(item.id, this.props.team.id, SyncableType.Team).then(async () => {\n if (listModal) {\n listModal.setState({loading: true});\n const {items, totalCount} = await listModal.props.loadItems(listModal.state.page, listModal.state.searchTerm);\n\n listModal.setState({loading: false, items, totalCount});\n }\n });\n };\n\n onClickRemoveGroup = (item: Group, listModal: ListModal) => {\n this.setState({showConfirmModal: true, item, listModal});\n };\n\n onClickConfirmRemoveGroup = (item: Group, listModal: ListModal) => this.props.actions.unlinkGroupSyncable(item.id, this.props.team.id, SyncableType.Team).then(async () => {\n listModal.setState({loading: true});\n const {items, totalCount} = await listModal.props.loadItems(listModal.state.page, listModal.state.searchTerm);\n listModal.setState({loading: false, items, totalCount});\n });\n\n onHide = () => {\n this.props.actions.closeModal(ModalIdentifiers.MANAGE_TEAM_GROUPS);\n };\n\n titleButtonOnClick = () => {\n this.onHide();\n this.props.actions.openModal({modalId: ModalIdentifiers.ADD_GROUPS_TO_TEAM, dialogType: AddGroupsToTeamModal});\n };\n\n setTeamMemberStatus = async (item: Group, listModal: ListModal, isTeamAdmin: boolean) => {\n this.props.actions.patchGroupSyncable(item.id, this.props.team.id, SyncableType.Team, {scheme_admin: isTeamAdmin}).then(async () => {\n listModal.setState({loading: true});\n const {items, totalCount} = await listModal.props.loadItems(listModal.state.page, listModal.state.searchTerm);\n\n this.props.actions.getMyTeamMembers();\n\n listModal.setState({loading: false, items, totalCount});\n });\n };\n\n renderRow = (item: Group, listModal: ListModal) => {\n let title;\n if (item.scheme_admin) {\n title = (\n <FormattedMessage\n id='team_members_dropdown.teamAdmins'\n defaultMessage='Team Admins'\n />\n );\n } else {\n title = (\n <FormattedMessage\n id='team_members_dropdown.teamMembers'\n defaultMessage='Team Members'\n />\n );\n }\n\n return (\n <div\n key={item.id}\n className='more-modal__row'\n >\n <img\n className='more-modal__image'\n src={groupsAvatar}\n alt='group picture'\n width='32'\n height='32'\n />\n <div className='more-modal__details'>\n <div\n className='more-modal__name'\n data-testid='group-name'\n >{item.display_name} <Nbsp/> {'-'} <Nbsp/>\n <span className='more-modal__name_count'>\n <FormattedMessage\n id='numMembers'\n defaultMessage='{num, number} {num, plural, one {member} other {members}}'\n values={{\n num: item.member_count,\n }}\n />\n </span>\n </div>\n </div>\n <div className='more-modal__actions'>\n <MenuWrapper>\n <button\n id={`teamGroupsDropdown_${item.display_name}`}\n className='dropdown-toggle theme color--link style--none'\n type='button'\n aria-expanded='true'\n data-testid='menu-button'\n >\n <span>{title} </span>\n <DropdownIcon/>\n </button>\n <Menu\n openLeft={true}\n ariaLabel={Utils.localizeMessage({id: 'team_members_dropdown.menuAriaLabel', defaultMessage: 'Change the role of a team member'})}\n >\n <Menu.ItemAction\n show={!item.scheme_admin}\n onClick={() => this.setTeamMemberStatus(item, listModal, true)}\n text={Utils.localizeMessage({id: 'team_members_dropdown.makeTeamAdmins', defaultMessage: 'Make Team Admins'})}\n />\n <Menu.ItemAction\n show={Boolean(item.scheme_admin)}\n onClick={() => this.setTeamMemberStatus(item, listModal, false)}\n text={Utils.localizeMessage({id: 'team_members_dropdown.makeTeamMembers', defaultMessage: 'Make Team Members'})}\n />\n <Menu.ItemAction\n id='remove-group'\n onClick={() => this.onClickRemoveGroup(item, listModal)}\n text={Utils.localizeMessage({id: 'group_list_modal.removeGroupButton', defaultMessage: 'Remove Group'})}\n />\n </Menu>\n </MenuWrapper>\n </div>\n </div>\n );\n };\n\n render() {\n const {formatMessage} = this.props.intl;\n const memberCount = this.state.item.member_count;\n return (\n <>\n <ListModal\n show={!this.state.showConfirmModal}\n titleText={formatMessage({id: 'team_groups', defaultMessage: '{team} Groups'}, {team: this.props.team.display_name})}\n searchPlaceholderText={formatMessage({id: 'manage_team_groups_modal.search_placeholder', defaultMessage: 'Search groups'})}\n renderRow={this.renderRow}\n loadItems={this.loadItems}\n onHide={this.onHide}\n titleBarButtonText={formatMessage({id: 'group_list_modal.addGroupButton', defaultMessage: 'Add Groups'})}\n titleBarButtonOnClick={this.titleButtonOnClick}\n data-testid='list-modal'\n />\n <ConfirmModal\n show={this.state.showConfirmModal}\n title={formatMessage({id: 'remove_group_confirm_title', defaultMessage: 'Remove Group and {memberCount, number} {memberCount, plural, one {Member} other {Members}}'}, {memberCount})}\n message={formatMessage({id: 'remove_group_confirm_message', defaultMessage: '{memberCount, number} {memberCount, plural, one {member} other {members}} associated to this group will be removed from the team. Are you sure you wish to remove this group and {memberCount} {memberCount, plural, one {member} other {members}}?'}, {memberCount})}\n confirmButtonText={formatMessage({id: 'remove_group_confirm_button', defaultMessage: 'Yes, Remove Group and {memberCount, plural, one {Member} other {Members}}'}, {memberCount})}\n onConfirm={this.handleDeleteConfirmed}\n onCancel={this.handleDeleteCanceled}\n id='confirm-modal'\n />\n </>\n );\n }\n}\n\nexport default injectIntl(TeamGroupsManageModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getGroupsAssociatedToTeam, unlinkGroupSyncable, patchGroupSyncable} from 'mattermost-redux/actions/groups';\nimport {getMyTeamMembers} from 'mattermost-redux/actions/teams';\n\nimport {closeModal, openModal} from 'actions/views/modals';\n\nimport TeamGroupsManageModal from './team_groups_manage_modal';\n\ntype OwnProps = {\n teamID: string;\n};\n\nconst mapStateToProps = (state: GlobalState, ownProps: OwnProps) => {\n return {\n team: state.entities.teams.teams[ownProps.teamID],\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n actions: bindActionCreators({\n getGroupsAssociatedToTeam,\n closeModal,\n openModal,\n unlinkGroupSyncable,\n patchGroupSyncable,\n getMyTeamMembers,\n }, dispatch),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamGroupsManageModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {WrappedComponentProps} from 'react-intl';\n\nimport type {Team, TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {isGuest, isAdmin, isSystemAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport DropdownIcon from 'components/widgets/icons/fa_dropdown_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {getHistory} from 'utils/browser_history';\n\nconst ROWS_FROM_BOTTOM_TO_OPEN_UP = 3;\n\ntype Props = WrappedComponentProps & {\n user: UserProfile;\n currentUser: UserProfile;\n teamMember: TeamMembership;\n teamUrl: string;\n currentTeam?: Team;\n index: number;\n totalUsers: number;\n collapsedThreads: ReturnType<typeof isCollapsedThreadsEnabled>;\n actions: {\n getMyTeamMembers: () => void;\n getMyTeamUnreads: (collapsedThreads: boolean) => void;\n getUser: (id: string) => void;\n getTeamMember: (teamId: string, userId: string) => void;\n getTeamStats: (teamId: string) => void;\n getChannelStats: (channelId: string) => void;\n updateTeamMemberSchemeRoles: (teamId: string, userId: string, b1: boolean, b2: boolean) => Promise<ActionResult>;\n updateUserActive: (userId: string, active: boolean) => Promise<ActionResult>;\n removeUserFromTeamAndGetStats: (teamId: string, userId: string) => Promise<ActionResult>;\n };\n};\n\ntype State = {\n serverError: string|null;\n showDemoteModal: boolean;\n user: UserProfile|null;\n role: string|null;\n}\n\nclass TeamMembersDropdown extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n serverError: null,\n showDemoteModal: false,\n user: null,\n role: null,\n };\n }\n\n private handleMakeMember = async () => {\n const me = this.props.currentUser;\n if (this.props.user.id === me.id && me.roles.includes('system_admin')) {\n this.handleDemote(this.props.user, 'team_user');\n } else {\n const {error} = await this.props.actions.updateTeamMemberSchemeRoles(this.props.teamMember.team_id, this.props.user.id, true, false);\n if (error) {\n this.setState({serverError: error.message});\n } else {\n this.props.actions.getUser(this.props.user.id);\n this.props.actions.getTeamMember(this.props.teamMember.team_id, this.props.user.id);\n if (this.props.user.id === me.id) {\n await this.props.actions.getMyTeamMembers();\n this.props.actions.getMyTeamUnreads(this.props.collapsedThreads);\n }\n }\n }\n };\n\n private handleRemoveFromTeam = async () => {\n const {error} = await this.props.actions.removeUserFromTeamAndGetStats(this.props.teamMember.team_id, this.props.user.id);\n if (error) {\n this.setState({serverError: error.message});\n }\n };\n\n private handleMakeAdmin = async () => {\n const me = this.props.currentUser;\n if (this.props.user.id === me.id && me.roles.includes('system_admin')) {\n this.handleDemote(this.props.user, 'team_user team_admin');\n } else {\n const {error} = await this.props.actions.updateTeamMemberSchemeRoles(this.props.teamMember.team_id, this.props.user.id, true, true);\n if (error) {\n this.setState({serverError: error.message});\n } else {\n this.props.actions.getUser(this.props.user.id);\n this.props.actions.getTeamMember(this.props.teamMember.team_id, this.props.user.id);\n }\n }\n };\n\n private handleDemote = (user: UserProfile, role: string): void => {\n this.setState({\n serverError: this.state.serverError,\n showDemoteModal: true,\n user,\n role,\n });\n };\n\n private handleDemoteCancel = (): void => {\n this.setState({\n serverError: null,\n showDemoteModal: false,\n user: null,\n role: null,\n });\n };\n\n private handleDemoteSubmit = async () => {\n const {error} = await this.props.actions.updateTeamMemberSchemeRoles(this.props.teamMember.team_id, this.props.user.id, true, false);\n if (error) {\n this.setState({serverError: error.message});\n } else {\n this.props.actions.getUser(this.props.user.id);\n getHistory().push(this.props.teamUrl);\n }\n };\n\n render() {\n let serverError = null;\n if (this.state.serverError) {\n serverError = (\n <div className='has-error'>\n <label className='has-error control-label'>{this.state.serverError}</label>\n </div>\n );\n }\n\n const {currentTeam, teamMember, user, intl} = this.props;\n\n let currentRoles = null;\n\n if (isGuest(user.roles)) {\n currentRoles = (\n <FormattedMessage\n id='team_members_dropdown.guest'\n defaultMessage='Guest'\n />\n );\n } else if (user.roles.length > 0 && isSystemAdmin(user.roles)) {\n currentRoles = (\n <FormattedMessage\n id='team_members_dropdown.systemAdmin'\n defaultMessage='System Admin'\n />\n );\n } else if ((teamMember.roles.length > 0 && isAdmin(teamMember.roles)) || teamMember.scheme_admin) {\n currentRoles = (\n <FormattedMessage\n id='team_members_dropdown.teamAdmin'\n defaultMessage='Team Admin'\n />\n );\n } else {\n currentRoles = (\n <FormattedMessage\n id='team_members_dropdown.member'\n defaultMessage='Member'\n />\n );\n }\n\n const me = this.props.currentUser;\n let showMakeMember = !isGuest(user.roles) && (isAdmin(teamMember.roles) || teamMember.scheme_admin) && !isSystemAdmin(user.roles);\n let showMakeAdmin = !isGuest(user.roles) && !isAdmin(teamMember.roles) && !isSystemAdmin(user.roles) && !teamMember.scheme_admin;\n\n if (user.delete_at > 0) {\n currentRoles = (\n <FormattedMessage\n id='team_members_dropdown.inactive'\n defaultMessage='Inactive'\n />\n );\n showMakeMember = false;\n showMakeAdmin = false;\n }\n\n const canRemoveFromTeam = user.id !== me.id && (!currentTeam?.group_constrained || user.is_bot);\n\n let makeDemoteModal = null;\n if (user.id === me.id) {\n const title = (\n <FormattedMessage\n id='team_members_dropdown.confirmDemoteRoleTitle'\n defaultMessage='Confirm Demotion from System Admin Role'\n />\n );\n\n const message = (\n <div>\n <FormattedMessage\n id='team_members_dropdown.confirmDemoteDescription'\n defaultMessage=\"If you demote yourself from the System Admin role and there is not another user with System Admin privileges, you'll need to re-assign a System Admin by accessing the Mattermost server through a terminal and running the following command.\"\n />\n <br/>\n <br/>\n <FormattedMessage\n id='team_members_dropdown.confirmDemotionCmd'\n defaultMessage='platform roles system_admin {username}'\n values={{\n username: me.username,\n }}\n />\n {serverError}\n </div>\n );\n\n const confirmButton = (\n <FormattedMessage\n id='team_members_dropdown.confirmDemotion'\n defaultMessage='Confirm Demotion'\n />\n );\n\n makeDemoteModal = (\n <ConfirmModal\n show={this.state.showDemoteModal}\n title={title}\n message={message}\n confirmButtonText={confirmButton}\n onConfirm={this.handleDemoteSubmit}\n onCancel={this.handleDemoteCancel}\n />\n );\n }\n\n if (!canRemoveFromTeam && !showMakeAdmin && !showMakeMember) {\n return <div>{currentRoles}</div>;\n }\n\n const {index, totalUsers} = this.props;\n let openUp = false;\n if (totalUsers > ROWS_FROM_BOTTOM_TO_OPEN_UP && totalUsers - index <= ROWS_FROM_BOTTOM_TO_OPEN_UP) {\n openUp = true;\n }\n\n const menuRemove = (\n <Menu.ItemAction\n id='removeFromTeam'\n onClick={this.handleRemoveFromTeam}\n text={\n <FormattedMessage\n id='team_members_dropdown.leave_team'\n defaultMessage='Remove from Team'\n />\n }\n />\n );\n const menuMakeAdmin = (\n <Menu.ItemAction\n onClick={this.handleMakeAdmin}\n text={\n <FormattedMessage\n id='team_members_dropdown.makeAdmin'\n defaultMessage='Make Team Admin'\n />\n }\n />\n );\n const menuMakeMember = (\n <Menu.ItemAction\n onClick={this.handleMakeMember}\n text={\n <FormattedMessage\n id='team_members_dropdown.makeMember'\n defaultMessage='Make Team Member'\n />\n }\n />\n );\n return (\n <MenuWrapper>\n <button\n id={`teamMembersDropdown_${user.username}`}\n className='dropdown-toggle theme color--link style--none'\n type='button'\n aria-expanded='true'\n >\n <span>{currentRoles} </span>\n <DropdownIcon/>\n </button>\n <div>\n <Menu\n openLeft={true}\n openUp={openUp}\n ariaLabel={intl.formatMessage({id: 'team_members_dropdown.menuAriaLabel', defaultMessage: 'Change the role of a team member'})}\n >\n {canRemoveFromTeam ? menuRemove : null}\n {showMakeAdmin ? menuMakeAdmin : null}\n {showMakeMember ? menuMakeMember : null}\n </Menu>\n {makeDemoteModal}\n {serverError}\n </div>\n </MenuWrapper>\n );\n }\n}\n\nexport default injectIntl(TeamMembersDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getChannelStats} from 'mattermost-redux/actions/channels';\nimport {\n getMyTeamMembers,\n getMyTeamUnreads,\n getTeamStats,\n getTeamMember,\n updateTeamMemberSchemeRoles,\n} from 'mattermost-redux/actions/teams';\nimport {getUser, updateUserActive} from 'mattermost-redux/actions/users';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentRelativeTeamUrl, getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {removeUserFromTeamAndGetStats} from 'actions/team_actions';\n\nimport TeamMembersDropdown from './team_members_dropdown';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n currentUser: getCurrentUser(state),\n teamUrl: getCurrentRelativeTeamUrl(state),\n currentTeam: getCurrentTeam(state),\n collapsedThreads: isCollapsedThreadsEnabled(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getMyTeamMembers,\n getMyTeamUnreads,\n getUser,\n getTeamMember,\n getTeamStats,\n getChannelStats,\n updateUserActive,\n updateTeamMemberSchemeRoles,\n removeUserFromTeamAndGetStats,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamMembersDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {TeamMembership, TeamStats, GetTeamMembersOpts} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Teams} from 'mattermost-redux/constants';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport SearchableUserList from 'components/searchable_user_list/searchable_user_list_container';\nimport TeamMembersDropdown from 'components/team_members_dropdown';\n\nimport Constants from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\n\nconst USERS_PER_PAGE = 50;\n\ntype Props = {\n searchTerm: string;\n users: UserProfile[];\n teamMembers: {\n [userId: string]: TeamMembership;\n };\n currentTeamId: string;\n totalTeamMembers: number;\n canManageTeamMembers?: boolean;\n actions: {\n getTeamMembers: (teamId: string, page?: number, perPage?: number, options?: GetTeamMembersOpts) => Promise<ActionResult<TeamMembership[]>>;\n searchProfiles: (term: string, options?: {[key: string]: any}) => Promise<ActionResult<UserProfile[]>>;\n getTeamStats: (teamId: string) => Promise<ActionResult<TeamStats>>;\n loadProfilesAndTeamMembers: (page: number, perPage: number, teamId: string, options?: {[key: string]: any}) => Promise<ActionResult>;\n loadStatusesForProfilesList: (users: UserProfile[]) => void;\n loadTeamMembersForProfilesList: (profiles: any, teamId: string, reloadAllMembers: boolean) => Promise<ActionResult>;\n setModalSearchTerm: (term: string) => ActionResult;\n };\n}\n\ntype State = {\n loading: boolean;\n}\n\nexport default class MemberListTeam extends React.PureComponent<Props, State> {\n private searchTimeoutId: number;\n\n constructor(props: Props) {\n super(props);\n\n this.searchTimeoutId = 0;\n\n this.state = {\n loading: true,\n };\n }\n\n async componentDidMount() {\n await Promise.all([\n this.props.actions.loadProfilesAndTeamMembers(0, Constants.PROFILE_CHUNK_SIZE, this.props.currentTeamId, {active: true}),\n this.props.actions.getTeamMembers(this.props.currentTeamId, 0, Constants.DEFAULT_MAX_USERS_PER_TEAM,\n {\n sort: Teams.SORT_USERNAME_OPTION,\n exclude_deleted_users: true,\n },\n ),\n this.props.actions.getTeamStats(this.props.currentTeamId),\n ]);\n this.loadComplete();\n }\n\n componentWillUnmount() {\n this.props.actions.setModalSearchTerm('');\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.searchTerm !== this.props.searchTerm) {\n clearTimeout(this.searchTimeoutId);\n\n const searchTerm = this.props.searchTerm;\n if (searchTerm === '') {\n this.loadComplete();\n this.searchTimeoutId = 0;\n return;\n }\n\n const searchTimeoutId = window.setTimeout(\n async () => {\n const {\n loadStatusesForProfilesList,\n loadTeamMembersForProfilesList,\n searchProfiles,\n } = this.props.actions;\n const {data} = await searchProfiles(searchTerm, {team_id: this.props.currentTeamId});\n\n if (searchTimeoutId !== this.searchTimeoutId) {\n return;\n }\n\n this.setState({loading: true});\n\n loadStatusesForProfilesList(data!);\n loadTeamMembersForProfilesList(data, this.props.currentTeamId, true).then(({data: membersLoaded}) => {\n if (membersLoaded) {\n this.loadComplete();\n }\n });\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n\n this.searchTimeoutId = searchTimeoutId;\n }\n }\n\n loadComplete = () => {\n this.setState({loading: false});\n };\n\n nextPage = async (page: number) => {\n this.setState({loading: true});\n await Promise.all([\n this.props.actions.loadProfilesAndTeamMembers(page, USERS_PER_PAGE, this.props.currentTeamId, {active: true}),\n this.props.actions.getTeamMembers(this.props.currentTeamId, page, Constants.DEFAULT_MAX_USERS_PER_TEAM,\n {\n sort: Teams.SORT_USERNAME_OPTION,\n exclude_deleted_users: true,\n } as GetTeamMembersOpts,\n ),\n ]);\n this.loadComplete();\n };\n\n search = (term: string) => {\n this.props.actions.setModalSearchTerm(term);\n };\n\n render() {\n let teamMembersDropdown;\n if (this.props.canManageTeamMembers) {\n teamMembersDropdown = [TeamMembersDropdown];\n }\n\n const teamMembers = this.props.teamMembers;\n const users = this.props.users;\n const actionUserProps: {\n [userId: string]: {\n teamMember: TeamMembership;\n };\n } = {};\n\n let usersToDisplay;\n if (this.state.loading) {\n usersToDisplay = null;\n } else {\n usersToDisplay = [];\n\n for (let i = 0; i < users.length; i++) {\n const user = users[i];\n\n if (teamMembers[user.id] && user.delete_at === 0) {\n usersToDisplay.push(user);\n actionUserProps[user.id] = {\n teamMember: teamMembers[user.id],\n };\n }\n }\n }\n\n return (\n <SearchableUserList\n users={usersToDisplay}\n usersPerPage={USERS_PER_PAGE}\n total={this.props.totalTeamMembers}\n nextPage={this.nextPage}\n search={this.search}\n actions={teamMembersDropdown}\n actionUserProps={actionUserProps}\n focusOnMount={!UserAgent.isMobile()}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getTeamStats, getTeamMembers} from 'mattermost-redux/actions/teams';\nimport {searchProfiles} from 'mattermost-redux/actions/users';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getMembersInCurrentTeam, getCurrentTeamStats} from 'mattermost-redux/selectors/entities/teams';\nimport {getProfilesInCurrentTeam, searchProfilesInCurrentTeam} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadStatusesForProfilesList} from 'actions/status_actions';\nimport {loadProfilesAndTeamMembers, loadTeamMembersForProfilesList} from 'actions/user_actions';\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport MemberListTeam from './member_list_team';\n\ntype Props = {\n teamId?: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const canManageTeamMembers = haveITeamPermission(state, ownProps.teamId, Permissions.MANAGE_TEAM_ROLES);\n\n const searchTerm = state.views.search.modalSearch;\n\n let users;\n if (searchTerm) {\n users = searchProfilesInCurrentTeam(state, searchTerm);\n } else {\n users = getProfilesInCurrentTeam(state);\n }\n\n const stats = getCurrentTeamStats(state) || {active_member_count: 0};\n\n return {\n searchTerm,\n users,\n teamMembers: getMembersInCurrentTeam(state) || {},\n currentTeamId: state.entities.teams.currentTeamId,\n totalTeamMembers: stats.active_member_count,\n canManageTeamMembers,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n searchProfiles,\n getTeamStats,\n getTeamMembers,\n loadProfilesAndTeamMembers,\n loadStatusesForProfilesList,\n loadTeamMembersForProfilesList,\n setModalSearchTerm,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MemberListTeam);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport InvitationModal from 'components/invitation_modal';\nimport MemberListTeam from 'components/member_list_team';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\ntype Props = {\n currentTeam?: Team;\n onExited: () => void;\n onLoad?: () => void;\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n}\n\ntype State = {\n show: boolean;\n}\n\nexport default class TeamMembersModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n show: true,\n };\n }\n\n componentDidMount() {\n if (this.props.onLoad) {\n this.props.onLoad();\n }\n }\n\n handleHide = () => {\n this.setState({show: false});\n };\n\n handleInvitePeople = () => {\n const {actions} = this.props;\n\n actions.openModal({\n modalId: ModalIdentifiers.INVITATION,\n dialogType: InvitationModal,\n });\n\n this.handleHide();\n };\n\n render() {\n let teamDisplayName = '';\n if (this.props.currentTeam) {\n teamDisplayName = this.props.currentTeam.display_name;\n }\n\n return (\n <Modal\n dialogClassName='a11y__modal more-modal'\n show={this.state.show}\n onHide={this.handleHide}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='teamMemberModalLabel'\n id='teamMembersModal'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='teamMemberModalLabel'\n >\n <FormattedMessage\n id='team_member_modal.members'\n defaultMessage='{team} Members'\n values={{\n team: teamDisplayName,\n }}\n />\n </Modal.Title>\n <TeamPermissionGate\n teamId={this.props.currentTeam?.id}\n permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n >\n <button\n id='invitePeople'\n type='button'\n className='btn btn-primary btn-sm invite-people-btn'\n onClick={this.handleInvitePeople}\n >\n <FormattedMessage\n id='team_member_modal.invitePeople'\n defaultMessage='Invite People'\n />\n </button>\n </TeamPermissionGate>\n </Modal.Header>\n <Modal.Body>\n <MemberListTeam\n teamId={this.props.currentTeam?.id}\n />\n </Modal.Body>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {openModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamMembersModal from './team_members_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n const modalId = ModalIdentifiers.TEAM_MEMBERS;\n return {\n currentTeam: getCurrentTeam(state),\n show: isModalOpen(state, modalId),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TeamMembersModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {AlertCircleOutlineIcon} from '@mattermost/compass-icons/components';\n\nimport './save_changes_panel.scss';\n\nexport type SaveChangesPanelState = 'editing' | 'saved' | 'error' | undefined;\n\ntype Props = {\n handleSubmit: () => void;\n handleCancel: () => void;\n handleClose: () => void;\n tabChangeError?: boolean;\n state: SaveChangesPanelState;\n}\nfunction SaveChangesPanel({handleSubmit, handleCancel, handleClose, tabChangeError = false, state = 'editing'}: Props) {\n const panelClassName = classNames('mm-save-changes-panel', {error: tabChangeError || state === 'error'}, {saved: state === 'saved'});\n const messageClassName = classNames('mm-save-changes-panel__message', {error: tabChangeError || state === 'error'}, {saved: state === 'saved'});\n const cancelButtonClassName = classNames('mm-save-changes-panel__cancel-btn', {error: tabChangeError || state === 'error'}, {saved: state === 'saved'});\n const saveButtonClassName = classNames('mm-save-changes-panel__save-btn', {error: tabChangeError || state === 'error'}, {saved: state === 'saved'});\n\n useEffect(() => {\n let timeoutId: NodeJS.Timeout;\n if (state === 'saved') {\n timeoutId = setTimeout(() => {\n handleClose();\n }, 1200);\n }\n\n return () => clearTimeout(timeoutId);\n }, [handleClose, state]);\n\n const generateMessage = () => {\n if (tabChangeError || state === 'editing') {\n return (\n <FormattedMessage\n id='saveChangesPanel.message'\n defaultMessage='You have unsaved changes'\n />\n );\n }\n\n if (state === 'error') {\n return (\n <FormattedMessage\n id='saveChangesPanel.error'\n defaultMessage='There was an error saving your settings'\n />\n );\n }\n\n return (\n <FormattedMessage\n id='saveChangesPanel.saved'\n defaultMessage='Settings saved'\n />\n );\n };\n\n const generateControlButtons = () => {\n if (state === 'saved') {\n return (\n <div className='mm-save-changes-panel__btn-ctr'>\n <button\n id='panelCloseButton'\n data-testid='panelCloseButton'\n type='button'\n className='btn btn-icon btn-sm'\n onClick={handleClose}\n >\n <i\n className='icon icon-close'\n />\n </button>\n </div>\n );\n }\n\n return (\n <div className='mm-save-changes-panel__btn-ctr'>\n <button\n data-testid='mm-save-changes-panel__cancel-btn'\n className={cancelButtonClassName}\n onClick={handleCancel}\n >\n <FormattedMessage\n id='saveChangesPanel.cancel'\n defaultMessage='Undo'\n />\n </button>\n <button\n data-testid='mm-save-changes-panel__save-btn'\n className={saveButtonClassName}\n onClick={handleSubmit}\n >\n {state === 'error' ?\n <FormattedMessage\n id='saveChangesPanel.tryAgain'\n defaultMessage='Try again'\n /> :\n <FormattedMessage\n id='saveChangesPanel.save'\n defaultMessage='Save'\n />\n }\n </button>\n </div>\n );\n };\n\n return (\n <div className={panelClassName}>\n <p className={messageClassName}>\n <AlertCircleOutlineIcon\n size={18}\n color={'currentcolor'}\n />\n {generateMessage()}\n </p>\n {generateControlButtons()}\n </div>\n );\n}\nexport default SaveChangesPanel;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\nimport type {CSSProperties, KeyboardEventHandler} from 'react';\nimport CreatableSelect from 'react-select/creatable';\n\nimport './select_text_input.scss';\n\nconst components = {\n DropdownIndicator: null,\n};\n\nexport interface SelectTextInputOption {\n label: string;\n value: string;\n}\n\ntype Props = {\n placeholder: string;\n value: string[];\n handleNewSelection: (selection: string) => void;\n onChange: (option?: SelectTextInputOption[] | null) => void;\n id?: string;\n isClearable?: boolean;\n description?: string;\n}\n\nconst styles = {\n control: (baseStyles: CSSProperties) => ({\n ...baseStyles,\n background: 'var(--center-channel-color-rgb)',\n }),\n input: (baseStyles: CSSProperties) => ({\n ...baseStyles,\n color: 'rgba(var(--center-channel-color-rgb), 0.64)',\n }),\n multiValue: (baseStyles: CSSProperties) => ({\n ...baseStyles,\n borderRadius: '10px',\n background: 'rgba(var(--center-channel-color-rgb), 0.08)',\n display: 'flex',\n alignItems: 'center',\n }),\n multiValueLabel: (baseStyles: CSSProperties) => ({\n ...baseStyles,\n padding: '4px 6px 4px 10px',\n color: 'var(--center-channel-color)',\n fontFamily: 'Open Sans',\n fontSize: '10px',\n fontWeight: 600,\n lineHeight: '12px',\n letterSpacing: '0.2px',\n }),\n multiValueRemove: (baseStyles: CSSProperties) => ({\n ...baseStyles,\n borderRadius: '50%',\n background: 'rgba(var(--center-channel-color-rgb), 0.32)',\n fontFamily: 'compass-icons',\n fontSize: '12px',\n fontWeight: 400,\n color: 'white',\n width: '10px',\n height: '10px',\n padding: 0,\n marginRight: '4px',\n ':hover': {\n background: 'rgba(var(--center-channel-color-rgb), 0.32)',\n color: 'white',\n },\n }),\n};\n\nconst SelectTextInput = ({placeholder, value, handleNewSelection, onChange, id, isClearable, description}: Props) => {\n const [inputValue, setInputValue] = React.useState('');\n\n const handleTextEnter = useCallback(() => {\n // do not add the value if already exists\n if (value?.includes(inputValue.trim()) || inputValue.length === 0) {\n return;\n }\n handleNewSelection(inputValue);\n setInputValue('');\n }, [handleNewSelection, inputValue, value]);\n\n const handleKeyDown: KeyboardEventHandler = useCallback((event) => {\n if (!inputValue) {\n return;\n }\n switch (event.key) {\n case ' ':\n case ',':\n case 'Enter':\n handleTextEnter();\n event.preventDefault();\n }\n }, [inputValue, handleTextEnter]);\n\n const selectValues = useMemo(() => {\n return value.map((singleValue) => ({label: singleValue, value: singleValue}));\n }, [value]);\n\n return (\n <>\n <CreatableSelect\n id={id}\n className='select-text-input'\n styles={styles}\n components={components}\n isClearable={isClearable}\n onChange={useCallback((value) => onChange(value as SelectTextInputOption[]), [onChange])}\n inputValue={inputValue}\n isMulti={true}\n menuIsOpen={false}\n onInputChange={setInputValue}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n value={selectValues}\n onBlur={handleTextEnter}\n />\n {description ? <p className='select-text-description'>{description}</p> : undefined}\n </>\n );\n};\n\nexport default SelectTextInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport SelectTextInput, {type SelectTextInputOption} from 'components/common/select_text_input/select_text_input';\nimport CheckboxSettingItem from 'components/widgets/modals/components/checkbox_setting_item';\nimport {type SaveChangesPanelState} from 'components/widgets/modals/components/save_changes_panel';\n\ntype Props = {\n allowedDomains: string[];\n setAllowedDomains: (domains: string[]) => void;\n setHasChanges: (hasChanges: boolean) => void;\n setSaveChangesPanelState: (state: SaveChangesPanelState) => void;\n}\n\nconst AllowedDomainsSelect = ({allowedDomains, setAllowedDomains, setHasChanges, setSaveChangesPanelState}: Props) => {\n const [showAllowedDomains, setShowAllowedDomains] = useState<boolean>(allowedDomains.length > 0);\n const {formatMessage} = useIntl();\n\n const handleEnableAllowedDomains = useCallback((enabled: boolean) => {\n setShowAllowedDomains(enabled);\n if (!enabled) {\n setAllowedDomains([]);\n }\n }, [setAllowedDomains]);\n\n const updateAllowedDomains = useCallback((domain: string) => {\n setHasChanges(true);\n setSaveChangesPanelState('editing');\n setAllowedDomains([...allowedDomains, domain]);\n }, [allowedDomains, setAllowedDomains, setHasChanges, setSaveChangesPanelState]);\n\n const handleOnChangeDomains = useCallback((allowedDomainsOptions?: SelectTextInputOption[] | null) => {\n setHasChanges(true);\n setSaveChangesPanelState('editing');\n setAllowedDomains(allowedDomainsOptions?.map((domain) => domain.value) || []);\n }, [setAllowedDomains, setHasChanges, setSaveChangesPanelState]);\n\n return (\n <>\n <CheckboxSettingItem\n inputFieldTitle={\n <FormattedMessage\n id='general_tab.allowedDomains'\n defaultMessage='Allow only users with a specific email domain to join this team'\n />\n }\n data-testid='allowedDomainsCheckbox'\n className='access-allowed-domains-section'\n title={formatMessage({\n id: 'general_tab.AllowedDomainsTitle',\n defaultMessage: 'Users with a specific email domain',\n })}\n description={formatMessage({\n id: 'general_tab.AllowedDomainsInfo',\n defaultMessage: 'When enabled, users can only join the team if their email matches a specific domain (e.g. \"mattermost.org\")',\n })}\n descriptionAboveContent={true}\n inputFieldData={{name: 'name'}}\n inputFieldValue={showAllowedDomains}\n handleChange={handleEnableAllowedDomains}\n />\n {showAllowedDomains &&\n <SelectTextInput\n id='allowedDomains'\n placeholder={formatMessage({id: 'general_tab.AllowedDomainsExample', defaultMessage: 'corp.mattermost.com, mattermost.com'})}\n aria-label={formatMessage({id: 'general_tab.allowedDomains.ariaLabel', defaultMessage: 'Allowed Domains'})}\n value={allowedDomains}\n onChange={handleOnChangeDomains}\n handleNewSelection={updateAllowedDomains}\n isClearable={false}\n description={formatMessage({id: 'general_tab.AllowedDomainsTip', defaultMessage: 'Seperate multiple domains with a space, comma, tab or enter.'})}\n />\n }\n </>\n );\n};\n\nexport default AllowedDomainsSelect;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState, useEffect} from 'react';\nimport {defineMessages, useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {RefreshIcon} from '@mattermost/compass-icons/components';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport Input from 'components/widgets/inputs/input/input';\nimport type {BaseSettingItemProps} from 'components/widgets/modals/components/base_setting_item';\nimport BaseSettingItem from 'components/widgets/modals/components/base_setting_item';\n\nimport type {GlobalState} from 'types/store';\n\nconst translations = defineMessages({\n OpenInviteDescriptionError: {\n id: 'team_settings.openInviteDescription.error',\n defaultMessage: 'There was an error generating the invite code, please try again',\n },\n});\n\ntype Props = {\n regenerateTeamInviteId: (teamId: string) => Promise<ActionResult>;\n}\n\nconst InviteSectionInput = ({regenerateTeamInviteId}: Props) => {\n const team = useSelector((state: GlobalState) => getCurrentTeam(state));\n const canInviteTeamMembers = useSelector((state: GlobalState) => haveITeamPermission(state, team?.id || '', Permissions.INVITE_USER));\n const [inviteId, setInviteId] = useState<Team['invite_id']>(team?.invite_id ?? '');\n const [inviteIdError, setInviteIdError] = useState<BaseSettingItemProps['error'] | undefined>();\n const {formatMessage} = useIntl();\n\n useEffect(() => {\n setInviteId(team?.invite_id || '');\n }, [team?.invite_id]);\n\n const handleRegenerateInviteId = useCallback(async () => {\n const {data, error} = await regenerateTeamInviteId(team?.id || '');\n\n if (data?.invite_id) {\n setInviteId(data.invite_id);\n return;\n }\n\n if (error) {\n setInviteIdError(translations.OpenInviteDescriptionError);\n }\n }, [regenerateTeamInviteId, team?.id]);\n\n if (!canInviteTeamMembers) {\n return null;\n }\n const inviteSectionInput = (\n <div\n data-testid='teamInviteContainer'\n id='teamInviteContainer'\n >\n <Input\n id='teamInviteId'\n type='text'\n value={inviteId}\n maxLength={32}\n />\n <button\n data-testid='regenerateButton'\n id='regenerateButton'\n className='btn btn-tertiary'\n onClick={handleRegenerateInviteId}\n >\n <RefreshIcon/>\n {formatMessage({id: 'general_tab.regenerate', defaultMessage: 'Regenerate'})}\n </button>\n </div>\n );\n\n return (\n <BaseSettingItem\n className='access-invite-section'\n title={formatMessage({\n id: 'general_tab.codeTitle',\n defaultMessage: 'Invite Code',\n })}\n description={formatMessage({\n id: 'general_tab.codeLongDesc',\n defaultMessage: 'The Invite Code is part of the unique team invitation link which is sent to members you’re inviting to this team. Regenerating the code creates a new invitation link and invalidates the previous link.',\n\n })}\n content={inviteSectionInput}\n error={inviteIdError}\n descriptionAboveContent={true}\n />\n );\n};\n\nexport default InviteSectionInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport ExternalLink from 'components/external_link';\nimport BaseSettingItem from 'components/widgets/modals/components/base_setting_item';\nimport CheckboxSettingItem from 'components/widgets/modals/components/checkbox_setting_item';\n\ntype Props = {\n allowOpenInvite: boolean;\n isGroupConstrained?: boolean;\n setAllowOpenInvite: (value: boolean) => void;\n};\n\nconst OpenInvite = ({isGroupConstrained, allowOpenInvite, setAllowOpenInvite}: Props) => {\n const {formatMessage} = useIntl();\n if (isGroupConstrained) {\n const groupConstrainedContent = (\n <p id='groupConstrainedContent' >{\n formatMessage({\n id: 'team_settings.openInviteDescription.groupConstrained',\n defaultMessage: 'Members of this team are added and removed by linked groups. <link>Learn More</link>',\n }, {\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://mattermost.com/pl/default-ldap-group-constrained-team-channel.html'\n location='open_invite'\n >\n {msg}\n </ExternalLink>\n ),\n })}\n </p>\n );\n return (\n <BaseSettingItem\n className='access-invite-domains-section'\n title={formatMessage({\n id: 'general_tab.openInviteText',\n defaultMessage: 'Users on this server',\n })}\n description={formatMessage({\n id: 'general_tab.openInviteDesc',\n defaultMessage: 'When enabled, a link to this team will be included on the landing page allowing anyone with an account to join this team. Changing this setting will create a new invitation link and invalidate the previous link.',\n })}\n descriptionAboveContent={true}\n content={groupConstrainedContent}\n />\n );\n }\n\n return (\n <CheckboxSettingItem\n className='access-invite-domains-section'\n inputFieldTitle={\n <FormattedMessage\n id='general_tab.openInviteTitle'\n defaultMessage='Allow only users with a specific email domain to join this team'\n />\n }\n inputFieldData={{name: 'name'}}\n inputFieldValue={allowOpenInvite}\n handleChange={setAllowOpenInvite}\n title={formatMessage({\n id: 'general_tab.openInviteText',\n defaultMessage: 'Users on this server',\n })}\n description={formatMessage({\n id: 'general_tab.openInviteDesc',\n defaultMessage: 'When enabled, a link to this team will be included on the landing page allowing anyone with an account to join this team. Changing this setting will create a new invitation link and invalidate the previous link.',\n })}\n descriptionAboveContent={true}\n />\n );\n};\n\nexport default OpenInvite;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport ModalSection from 'components/widgets/modals/components/modal_section';\nimport SaveChangesPanel, {type SaveChangesPanelState} from 'components/widgets/modals/components/save_changes_panel';\n\nimport AllowedDomainsSelect from './allowed_domains_select';\nimport InviteSectionInput from './invite_section_input';\nimport OpenInvite from './open_invite';\n\nimport type {PropsFromRedux, OwnProps} from '.';\n\nimport './team_access_tab.scss';\n\nconst generateAllowedDomainOptions = (allowedDomains?: string) => {\n if (!allowedDomains || allowedDomains.length === 0) {\n return [];\n }\n const domainList = allowedDomains.includes(',') ? allowedDomains.split(',') : [allowedDomains];\n return domainList.map((domain) => domain.trim());\n};\n\ntype Props = PropsFromRedux & OwnProps;\n\nconst AccessTab = ({closeModal, collapseModal, hasChangeTabError, hasChanges, setHasChangeTabError, setHasChanges, team, actions}: Props) => {\n const [allowedDomains, setAllowedDomains] = useState<string[]>(() => generateAllowedDomainOptions(team.allowed_domains));\n const [allowOpenInvite, setAllowOpenInvite] = useState<boolean>(team.allow_open_invite ?? false);\n const [saveChangesPanelState, setSaveChangesPanelState] = useState<SaveChangesPanelState>();\n const {formatMessage} = useIntl();\n\n const handleAllowedDomainsSubmit = useCallback(async (): Promise<boolean> => {\n const {error} = await actions.patchTeam({\n id: team.id,\n allowed_domains: allowedDomains.length === 1 ? allowedDomains[0] : allowedDomains.join(', '),\n });\n if (error) {\n return false;\n }\n return true;\n }, [actions, allowedDomains, team]);\n\n const handleOpenInviteSubmit = useCallback(async (): Promise<boolean> => {\n if (allowOpenInvite === team.allow_open_invite) {\n return true;\n }\n const data = {\n id: team.id,\n allow_open_invite: allowOpenInvite,\n };\n\n const {error} = await actions.patchTeam(data);\n if (error) {\n return false;\n }\n return true;\n }, [actions, allowOpenInvite, team]);\n\n const updateOpenInvite = useCallback((value: boolean) => {\n setHasChanges(true);\n setSaveChangesPanelState('editing');\n setAllowOpenInvite(value);\n }, [setHasChanges]);\n\n const handleClose = useCallback(() => {\n setSaveChangesPanelState('editing');\n setHasChanges(false);\n setHasChangeTabError(false);\n }, [setHasChangeTabError, setHasChanges]);\n\n const handleCancel = useCallback(() => {\n setAllowedDomains(generateAllowedDomainOptions(team.allowed_domains));\n setAllowOpenInvite(team.allow_open_invite ?? false);\n handleClose();\n }, [handleClose, team.allow_open_invite, team.allowed_domains]);\n\n const collapseModalHandler = useCallback(() => {\n if (hasChanges) {\n setHasChangeTabError(true);\n return;\n }\n collapseModal();\n }, [collapseModal, hasChanges, setHasChangeTabError]);\n\n const handleSaveChanges = useCallback(async () => {\n const allowedDomainSuccess = await handleAllowedDomainsSubmit();\n const openInviteSuccess = await handleOpenInviteSubmit();\n if (!allowedDomainSuccess || !openInviteSuccess) {\n setSaveChangesPanelState('error');\n return;\n }\n setSaveChangesPanelState('saved');\n setHasChangeTabError(false);\n }, [handleAllowedDomainsSubmit, handleOpenInviteSubmit, setHasChangeTabError]);\n\n return (\n <ModalSection\n content={\n <>\n <div className='modal-header'>\n <button\n id='closeButton'\n type='button'\n className='close'\n data-dismiss='modal'\n onClick={closeModal}\n >\n <span aria-hidden='true'>{'×'}</span>\n </button>\n <h4 className='modal-title'>\n <div className='modal-back'>\n <i\n className='fa fa-angle-left'\n aria-label={formatMessage({\n id: 'generic_icons.collapse',\n defaultMessage: 'Collapes Icon',\n })}\n onClick={collapseModalHandler}\n />\n </div>\n <span>{formatMessage({id: 'team_settings_modal.title', defaultMessage: 'Team Settings'})}</span>\n </h4>\n </div>\n <div className='modal-access-tab-content user-settings'>\n {team.group_constrained ?\n undefined :\n <AllowedDomainsSelect\n allowedDomains={allowedDomains}\n setAllowedDomains={setAllowedDomains}\n setHasChanges={setHasChanges}\n setSaveChangesPanelState={setSaveChangesPanelState}\n />\n }\n <div className='divider-light'/>\n <OpenInvite\n isGroupConstrained={team.group_constrained}\n allowOpenInvite={allowOpenInvite}\n setAllowOpenInvite={updateOpenInvite}\n />\n <div className='divider-light'/>\n {team.group_constrained ?\n undefined :\n <InviteSectionInput regenerateTeamInviteId={actions.regenerateTeamInviteId}/>\n }\n {hasChanges ?\n <SaveChangesPanel\n handleCancel={handleCancel}\n handleSubmit={handleSaveChanges}\n handleClose={handleClose}\n tabChangeError={hasChangeTabError}\n state={saveChangesPanelState}\n /> : undefined}\n </div>\n </>\n }\n />\n );\n};\nexport default AccessTab;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport {patchTeam, regenerateTeamInviteId} from 'mattermost-redux/actions/teams';\n\nimport TeamAccessTab from './team_access_tab';\n\nexport type OwnProps = {\n team: Team;\n hasChanges: boolean;\n hasChangeTabError: boolean;\n setHasChanges: (hasChanges: boolean) => void;\n setHasChangeTabError: (hasChangesError: boolean) => void;\n closeModal: () => void;\n collapseModal: () => void;\n};\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n patchTeam,\n regenerateTeamInviteId,\n }, dispatch),\n };\n}\n\nconst connector = connect(null, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(TeamAccessTab);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport type {ChangeEvent} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport Input from 'components/widgets/inputs/input/input';\nimport BaseSettingItem, {type BaseSettingItemProps} from 'components/widgets/modals/components/base_setting_item';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n handleDescriptionChanges: (name: string) => void;\n description: Team['description'];\n clientError?: BaseSettingItemProps['error'];\n};\n\nconst TeamDescriptionSection = ({handleDescriptionChanges, clientError, description}: Props) => {\n const {formatMessage} = useIntl();\n\n const updateDescription = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n handleDescriptionChanges(e.target.value);\n }, [handleDescriptionChanges]);\n\n const descriptionSectionInput = (\n <Input\n id='teamDescription'\n data-testid='teamDescriptionInput'\n containerClassName='description-section-input'\n type='textarea'\n maxLength={Constants.MAX_TEAMDESCRIPTION_LENGTH}\n onChange={updateDescription}\n value={description}\n label={formatMessage({id: 'general_tab.teamDescription', defaultMessage: 'Description'})}\n />\n );\n\n return (\n <BaseSettingItem\n description={formatMessage({\n id: 'general_tab.teamDescriptionInfo',\n defaultMessage: 'Team description provides additional information to help users select the right team. Maximum of 50 characters.',\n })}\n content={descriptionSectionInput}\n className='description-setting-item'\n error={clientError}\n />\n );\n};\n\nexport default TeamDescriptionSection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport type {ChangeEvent} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport Input from 'components/widgets/inputs/input/input';\nimport BaseSettingItem, {type BaseSettingItemProps} from 'components/widgets/modals/components/base_setting_item';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n handleNameChanges: (name: string) => void;\n name: Team['display_name'];\n clientError: BaseSettingItemProps['error'];\n};\n\nconst TeamNameSection = ({clientError, handleNameChanges, name}: Props) => {\n const {formatMessage} = useIntl();\n\n const updateName = useCallback((e: ChangeEvent<HTMLInputElement>) => handleNameChanges(e.target.value), [handleNameChanges]);\n\n const nameSectionInput = (\n <Input\n id='teamName'\n data-testid='teamNameInput'\n type='text'\n maxLength={Constants.MAX_TEAMNAME_LENGTH}\n onChange={updateName}\n value={name}\n label={formatMessage({id: 'general_tab.teamName', defaultMessage: 'Team Name'})}\n />\n );\n\n return (\n <BaseSettingItem\n title={formatMessage({\n id: 'general_tab.teamInfo',\n defaultMessage: 'Team info',\n })}\n description={formatMessage({\n id: 'general_tab.teamNameInfo',\n defaultMessage: 'This name will appear on your sign-in screen and at the top of the left sidebar.',\n })}\n content={nameSectionInput}\n error={clientError}\n />\n );\n};\n\nexport default TeamNameSection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {type ChangeEvent, useRef, useState, useEffect, useCallback} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {TrashCanOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {Team} from '@mattermost/types/teams';\n\nimport EditIcon from 'components/widgets/icons/fa_edit_icon';\nimport BaseSettingItem from 'components/widgets/modals/components/base_setting_item';\nimport type {BaseSettingItemProps} from 'components/widgets/modals/components/base_setting_item';\n\nimport Constants from 'utils/constants';\nimport * as FileUtils from 'utils/file_utils';\nimport {imageURLForTeam} from 'utils/utils';\n\nimport './team_picture_section.scss';\n\ntype Props = {\n team: Team;\n file?: File | null;\n teamName: string;\n disabled: boolean;\n onFileChange: (e: ChangeEvent<HTMLInputElement>) => void;\n onRemove: () => void;\n clientError?: BaseSettingItemProps['error'];\n};\n\nconst TeamPictureSection = ({team, file, teamName, disabled, onFileChange, onRemove, clientError}: Props) => {\n const selectInput = useRef<HTMLInputElement>(null);\n const [image, setImage] = useState<string>('');\n const [orientationStyles, setOrientationStyles] = useState<{transform: string; transformOrigin: string}>();\n const {formatMessage} = useIntl();\n\n const teamImageSource = imageURLForTeam(team);\n\n const handleInputFile = useCallback(() => {\n if (selectInput.current) {\n selectInput.current.value = '';\n selectInput.current.click();\n }\n }, []);\n\n const editIcon = () => {\n return (\n <>\n <input\n data-testid='uploadPicture'\n ref={selectInput}\n className='hidden'\n accept={Constants.ACCEPT_STATIC_IMAGE}\n disabled={disabled}\n type='file'\n onChange={onFileChange}\n aria-hidden={true}\n tabIndex={-1}\n />\n <span\n disabled={disabled}\n onClick={handleInputFile}\n >\n <EditIcon/>\n </span>\n </>\n );\n };\n\n const teamImage = () => {\n if (file) {\n const imageStyles = {\n backgroundImage: 'url(' + image + ')',\n backgroundSize: 'cover',\n backgroundRepeat: 'round',\n ...orientationStyles,\n };\n\n return (\n <div\n id='teamIconImage'\n style={imageStyles}\n className='team-img-preview'\n onClick={handleInputFile}\n />\n );\n }\n if (teamImageSource) {\n return (\n <img\n id='teamIconImage'\n className='team-img-preview'\n src={teamImageSource}\n onClick={handleInputFile}\n />\n );\n }\n return (\n <div className='team-picture-section__team-icon' >\n <span\n id='teamIconInitial'\n onClick={handleInputFile}\n className='team-picture-section__team-name'\n >{teamName.charAt(0).toUpperCase() + teamName.charAt(1)}</span>\n </div>\n );\n };\n\n const setPicture = (file: File) => {\n if (file) {\n const previewBlob = URL.createObjectURL(file);\n\n const reader = new FileReader();\n reader.onload = (e) => {\n const orientation = FileUtils.getExifOrientation(e.target!.result! as ArrayBuffer);\n const orientationStyles = FileUtils.getOrientationStyles(orientation);\n\n setImage(previewBlob);\n setOrientationStyles(orientationStyles);\n };\n reader.readAsArrayBuffer(file);\n }\n };\n\n useEffect(() => {\n if (file) {\n setPicture(file);\n }\n }, [file]);\n\n const removeImageButton = () => {\n if (file || teamImageSource) {\n return (\n <button\n onClick={onRemove}\n data-testid='removeImageButton'\n className='style--none picture-setting-item__remove-button'\n >\n <TrashCanOutlineIcon/>\n {formatMessage({id: 'setting_picture.remove_image', defaultMessage: 'Remove image'})}\n </button>\n );\n }\n\n return null;\n };\n\n const teamPictureSection = (\n <>\n <div className='team-picture-section' >\n {teamImage()}\n {editIcon()}\n </div>\n {removeImageButton()}\n </>\n );\n\n return (\n <BaseSettingItem\n title={formatMessage({\n id: 'setting_picture.title',\n defaultMessage: 'Team Icon',\n })}\n description={teamImageSource ? undefined : formatMessage(\n {\n id: 'setting_picture.help.profile',\n defaultMessage: 'Upload a picture in BMP, JPG, JPEG, or PNG format. Maximum file size: {max}',\n },\n {\n max: '50MB',\n },\n )}\n content={teamPictureSection}\n className='picture-setting-item'\n error={clientError}\n />\n );\n};\n\nexport default TeamPictureSection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState} from 'react';\nimport type {ChangeEvent} from 'react';\nimport {defineMessages, useIntl} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {BaseSettingItemProps} from 'components/widgets/modals/components/base_setting_item';\nimport ModalSection from 'components/widgets/modals/components/modal_section';\nimport SaveChangesPanel, {type SaveChangesPanelState} from 'components/widgets/modals/components/save_changes_panel';\n\nimport Constants from 'utils/constants';\n\nimport TeamDescriptionSection from './team_description_section';\nimport TeamNameSection from './team_name_section';\nimport TeamPictureSection from './team_picture_section';\n\nimport type {PropsFromRedux, OwnProps} from '.';\n\nimport './team_info_tab.scss';\n\nconst ACCEPTED_TEAM_IMAGE_TYPES = ['image/jpeg', 'image/png', 'image/bmp'];\nconst translations = defineMessages({\n Required: {\n id: 'general_tab.required',\n defaultMessage: 'This field is required',\n },\n TeamNameRestrictions: {\n id: 'general_tab.teamNameRestrictions',\n defaultMessage: 'Team Name must be {min} or more characters up to a maximum of {max}. You can add a longer team description.',\n values: {min: Constants.MIN_TEAMNAME_LENGTH, max: Constants.MAX_TEAMNAME_LENGTH},\n },\n TeamIconInvalidFileType: {\n id: 'general_tab.teamIconInvalidFileType',\n defaultMessage: 'Only BMP, JPG or PNG images may be used for team icons',\n },\n TeamIconTooLarge: {\n id: 'general_tab.teamIconTooLarge',\n defaultMessage: 'Unable to upload team icon. File is too large.',\n },\n TeamIconError: {\n id: 'general_tab.teamIconError',\n defaultMessage: 'An error occurred while selecting the image.',\n },\n});\ntype Props = PropsFromRedux & OwnProps;\n\nconst InfoTab = ({team, hasChanges, maxFileSize, closeModal, collapseModal, hasChangeTabError, setHasChangeTabError, setHasChanges, actions}: Props) => {\n const [name, setName] = useState<Team['display_name']>(team.display_name);\n const [description, setDescription] = useState<Team['description']>(team.description);\n const [teamIconFile, setTeamIconFile] = useState<File | undefined>();\n const [loading, setLoading] = useState<boolean>(false);\n const [imageClientError, setImageClientError] = useState<BaseSettingItemProps['error'] | undefined>();\n const [nameClientError, setNameClientError] = useState<BaseSettingItemProps['error'] | undefined>();\n const [saveChangesPanelState, setSaveChangesPanelState] = useState<SaveChangesPanelState>();\n const {formatMessage} = useIntl();\n\n const handleNameDescriptionSubmit = useCallback(async (): Promise<boolean> => {\n if (name.trim() === team.display_name && description === team.description) {\n return true;\n }\n\n if (!name) {\n setNameClientError(translations.Required);\n return false;\n } else if (name.length < Constants.MIN_TEAMNAME_LENGTH) {\n setNameClientError(translations.TeamNameRestrictions);\n return false;\n }\n setNameClientError(undefined);\n const {error} = await actions.patchTeam({id: team.id, display_name: name, description});\n if (error) {\n return false;\n }\n return true;\n }, [actions, description, name, team.description, team.display_name, team.id]);\n\n const handleTeamIconSubmit = useCallback(async (): Promise<boolean> => {\n if (!teamIconFile) {\n return true;\n }\n setLoading(true);\n setImageClientError(undefined);\n const {error} = await actions.setTeamIcon(team.id, teamIconFile);\n setLoading(false);\n if (error) {\n return false;\n }\n return true;\n }, [actions, team, teamIconFile]);\n\n const handleSaveChanges = useCallback(async () => {\n const nameDescriptionSuccess = await handleNameDescriptionSubmit();\n const teamIconSuccess = await handleTeamIconSubmit();\n if (!teamIconSuccess || !nameDescriptionSuccess) {\n setSaveChangesPanelState('error');\n return;\n }\n setSaveChangesPanelState('saved');\n setHasChangeTabError(false);\n }, [handleNameDescriptionSubmit, handleTeamIconSubmit, setHasChangeTabError]);\n\n const handleClose = useCallback(() => {\n setSaveChangesPanelState('editing');\n setHasChanges(false);\n setHasChangeTabError(false);\n }, [setHasChangeTabError, setHasChanges]);\n\n const handleCancel = useCallback(() => {\n setName(team.display_name ?? team.name);\n setDescription(team.description);\n setTeamIconFile(undefined);\n setImageClientError(undefined);\n setNameClientError(undefined);\n handleClose();\n }, [handleClose, team.description, team.display_name, team.name]);\n\n const handleTeamIconRemove = useCallback(async () => {\n setLoading(true);\n setImageClientError(undefined);\n setTeamIconFile(undefined);\n handleClose();\n\n const {error} = await actions.removeTeamIcon(team.id);\n setLoading(false);\n if (error) {\n setSaveChangesPanelState('error');\n setHasChanges(true);\n setHasChangeTabError(true);\n }\n }, [actions, handleClose, setHasChangeTabError, setHasChanges, team.id]);\n\n const updateTeamIcon = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n if (e && e.target && e.target.files && e.target.files[0]) {\n const file = e.target.files[0];\n\n if (!ACCEPTED_TEAM_IMAGE_TYPES.includes(file.type)) {\n setImageClientError(translations.TeamIconInvalidFileType);\n } else if (file.size > maxFileSize) {\n setImageClientError(translations.TeamIconTooLarge);\n } else {\n setTeamIconFile(file);\n setImageClientError(undefined);\n setSaveChangesPanelState('editing');\n setHasChanges(true);\n }\n } else {\n setTeamIconFile(undefined);\n setImageClientError(translations.TeamIconError);\n }\n }, [maxFileSize, setHasChanges]);\n\n const handleNameChanges = useCallback((name: string) => {\n setHasChanges(true);\n setSaveChangesPanelState('editing');\n setName(name);\n }, [setHasChanges]);\n\n const handleDescriptionChanges = useCallback((description: string) => {\n setHasChanges(true);\n setSaveChangesPanelState('editing');\n setDescription(description);\n }, [setHasChanges]);\n\n const handleCollapseModal = useCallback(() => {\n if (hasChanges) {\n setHasChangeTabError(true);\n return;\n }\n collapseModal();\n }, [collapseModal, hasChanges, setHasChangeTabError]);\n\n const modalSectionContent = (\n <>\n <div className='modal-header'>\n <button\n id='closeButton'\n type='button'\n className='close'\n data-dismiss='modal'\n onClick={closeModal}\n >\n <span aria-hidden='true'>{'×'}</span>\n </button>\n <h4 className='modal-title'>\n <div className='modal-back'>\n <i\n className='fa fa-angle-left'\n aria-label={formatMessage({\n id: 'generic_icons.collapse',\n defaultMessage: 'Collapes Icon',\n })}\n onClick={handleCollapseModal}\n />\n </div>\n <span>{formatMessage({id: 'team_settings_modal.title', defaultMessage: 'Team Settings'})}</span>\n </h4>\n </div>\n <div className='modal-info-tab-content user-settings' >\n <div className='name-description-container' >\n <TeamNameSection\n name={name}\n clientError={nameClientError}\n handleNameChanges={handleNameChanges}\n />\n <TeamDescriptionSection\n description={description}\n handleDescriptionChanges={handleDescriptionChanges}\n />\n </div>\n <TeamPictureSection\n team={team}\n file={teamIconFile}\n disabled={loading}\n onFileChange={updateTeamIcon}\n onRemove={handleTeamIconRemove}\n teamName={team.display_name ?? team.name}\n clientError={imageClientError}\n />\n {hasChanges ?\n <SaveChangesPanel\n handleCancel={handleCancel}\n handleSubmit={handleSaveChanges}\n handleClose={handleClose}\n tabChangeError={hasChangeTabError}\n state={saveChangesPanelState}\n /> : undefined}\n </div>\n </>\n );\n\n return <ModalSection content={modalSectionContent}/>;\n};\nexport default InfoTab;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport {getTeam, patchTeam, removeTeamIcon, setTeamIcon} from 'mattermost-redux/actions/teams';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store/index';\n\nimport TeamInfoTab from './team_info_tab';\n\nexport type OwnProps = {\n team: Team;\n hasChanges: boolean;\n hasChangeTabError: boolean;\n setHasChanges: (hasChanges: boolean) => void;\n setHasChangeTabError: (hasChangesError: boolean) => void;\n closeModal: () => void;\n collapseModal: () => void;\n};\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const maxFileSize = parseInt(config.MaxFileSize ?? '', 10);\n\n return {\n maxFileSize,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getTeam,\n patchTeam,\n removeTeamIcon,\n setTeamIcon,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(TeamInfoTab);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport AccessTab from './team_access_tab';\nimport InfoTab from './team_info_tab';\n\ntype Props = {\n activeTab: string;\n hasChanges: boolean;\n hasChangeTabError: boolean;\n setHasChanges: (hasChanges: boolean) => void;\n setHasChangeTabError: (hasChangesError: boolean) => void;\n closeModal: () => void;\n collapseModal: () => void;\n team?: Team;\n};\n\nconst TeamSettings = ({\n activeTab = '',\n closeModal,\n collapseModal,\n team,\n hasChanges,\n hasChangeTabError,\n setHasChanges,\n setHasChangeTabError,\n}: Props) => {\n if (!team) {\n return null;\n }\n\n let result;\n switch (activeTab) {\n case 'info':\n result = (\n <InfoTab\n team={team}\n hasChanges={hasChanges}\n setHasChanges={setHasChanges}\n hasChangeTabError={hasChangeTabError}\n setHasChangeTabError={setHasChangeTabError}\n closeModal={closeModal}\n collapseModal={collapseModal}\n />\n );\n break;\n case 'access':\n result = (\n <AccessTab\n team={team}\n hasChanges={hasChanges}\n setHasChanges={setHasChanges}\n hasChangeTabError={hasChangeTabError}\n setHasChangeTabError={setHasChangeTabError}\n closeModal={closeModal}\n collapseModal={collapseModal}\n />\n );\n break;\n default:\n result = (\n <div/>\n );\n break;\n }\n\n return result;\n};\n\nexport default TeamSettings;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport TeamSettings from './team_settings';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n team: getCurrentTeam(state),\n };\n}\n\nexport default connect(mapStateToProps)(TeamSettings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useRef, useCallback} from 'react';\nimport {Modal, type ModalBody} from 'react-bootstrap';\nimport ReactDOM from 'react-dom';\nimport {useIntl} from 'react-intl';\n\nimport TeamSettings from 'components/team_settings';\n\nconst SettingsSidebar = React.lazy(() => import('components/settings_sidebar'));\n\ntype Props = {\n onExited: () => void;\n canInviteUsers: boolean;\n}\n\nconst TeamSettingsModal = ({onExited, canInviteUsers}: Props) => {\n const [activeTab, setActiveTab] = useState('info');\n const [show, setShow] = useState<boolean>(true);\n const [hasChanges, setHasChanges] = useState<boolean>(false);\n const [hasChangeTabError, setHasChangeTabError] = useState<boolean>(false);\n const modalBodyRef = useRef<ModalBody>(null);\n const {formatMessage} = useIntl();\n\n const updateTab = useCallback((tab: string) => {\n if (hasChanges) {\n setHasChangeTabError(true);\n return;\n }\n setActiveTab(tab);\n setHasChanges(false);\n setHasChangeTabError(false);\n }, [hasChanges]);\n\n const handleHide = useCallback(() => setShow(false), []);\n\n const handleClose = useCallback(() => {\n setActiveTab('info');\n setHasChanges(false);\n setHasChangeTabError(false);\n onExited();\n }, [onExited]);\n\n const handleCollapse = useCallback(() => {\n const el = ReactDOM.findDOMNode(modalBodyRef.current) as HTMLDivElement;\n el?.closest('.modal-dialog')!.classList.remove('display--content');\n setActiveTab('');\n }, []);\n\n const tabs = [\n {name: 'info', uiName: formatMessage({id: 'team_settings_modal.infoTab', defaultMessage: 'Info'}), icon: 'icon icon-information-outline', iconTitle: formatMessage({id: 'generic_icons.info', defaultMessage: 'Info Icon'})},\n ];\n if (canInviteUsers) {\n tabs.push({name: 'access', uiName: formatMessage({id: 'team_settings_modal.accessTab', defaultMessage: 'Access'}), icon: 'icon icon-account-multiple-outline', iconTitle: formatMessage({id: 'generic_icons.member', defaultMessage: 'Member Icon'})});\n }\n\n return (\n <Modal\n dialogClassName='a11y__modal settings-modal'\n show={show}\n onHide={handleHide}\n onExited={handleClose}\n role='none'\n aria-labelledby='teamSettingsModalLabel'\n id='teamSettingsModal'\n >\n <Modal.Header\n id='teamSettingsModalLabel'\n closeButton={true}\n >\n <Modal.Title componentClass='h1'>\n {formatMessage({id: 'team_settings_modal.title', defaultMessage: 'Team Settings'})}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body ref={modalBodyRef}>\n <div className='settings-table'>\n <div className='settings-links'>\n <React.Suspense fallback={null}>\n <SettingsSidebar\n tabs={tabs}\n activeTab={activeTab}\n updateTab={updateTab}\n />\n </React.Suspense>\n </div>\n <div className='settings-content minimize-settings'>\n <TeamSettings\n activeTab={activeTab}\n hasChanges={hasChanges}\n setHasChanges={setHasChanges}\n hasChangeTabError={hasChangeTabError}\n setHasChangeTabError={setHasChangeTabError}\n closeModal={handleHide}\n collapseModal={handleCollapse}\n />\n </div>\n </div>\n </Modal.Body>\n </Modal>\n );\n};\n\nexport default TeamSettingsModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamSettingsModal from './team_settings_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n const teamId = getCurrentTeamId(state);\n const canInviteUsers = haveITeamPermission(state, teamId, Permissions.INVITE_USER);\n const modalId = ModalIdentifiers.TEAM_SETTINGS;\n return {\n show: isModalOpen(state, modalId),\n canInviteUsers,\n };\n}\n\nexport default connect(mapStateToProps)(TeamSettingsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function LeaveTeamIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='100%'\n height='100%'\n viewBox='0 0 164 164'\n style={style}\n role='img'\n aria-label={formatMessage({id: 'navbar_dropdown.leave.icon', defaultMessage: 'Leave Team Icon'})}\n >\n <path d='M26.023,164L26.023,7.035L26.022,0.32L137.658,0.32L137.658,164L124.228,164L124.228, 13.749L39.452,13.749L39.452,164L26.023, 164ZM118.876,164L118.876,18.619L58.137,32.918L58.137,149.701L118.876,164Z'/>\n </svg>\n </span>\n );\n}\n\nconst style: CSSProperties = {\n fillRule: 'evenodd',\n clipRule: 'evenodd',\n strokeLinejoin: 'round',\n strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport AboutBuildModal from 'components/about_build_modal';\nimport AddGroupsToTeamModal from 'components/add_groups_to_team_modal';\nimport InvitationModal from 'components/invitation_modal';\nimport LeaveTeamModal from 'components/leave_team_modal';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport TeamGroupsManageModal from 'components/team_groups_manage_modal';\nimport TeamMembersModal from 'components/team_members_modal';\nimport TeamSettingsModal from 'components/team_settings_modal';\nimport UserSettingsModal from 'components/user_settings/modal';\nimport LeaveTeamIcon from 'components/widgets/icons/leave_team_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport RestrictedIndicator from 'components/widgets/menu/menu_items/restricted_indicator';\n\nimport {FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS} from 'utils/cloud_utils';\nimport {Constants, LicenseSkus, ModalIdentifiers, MattermostFeatures} from 'utils/constants';\nimport {cmdOrCtrlPressed, isKeyPressed} from 'utils/keyboard';\nimport {makeUrlSafe} from 'utils/url';\nimport * as UserAgent from 'utils/user_agent';\n\nimport type {ModalData} from 'types/actions';\nimport type {PluginComponent} from 'types/store/plugins';\n\nimport LearnAboutTeamsLink from './learn_about_teams_link';\nimport './main_menu.scss';\n\nexport type Props = {\n mobile: boolean;\n id?: string;\n teamId?: string;\n teamName?: string;\n siteName?: string;\n currentUser?: UserProfile;\n appDownloadLink?: string;\n enableCommands: boolean;\n enableIncomingWebhooks: boolean;\n enableOAuthServiceProvider: boolean;\n enableOutgoingWebhooks: boolean;\n canManageSystemBots: boolean;\n canManageIntegrations: boolean;\n experimentalPrimaryTeam?: string;\n helpLink?: string;\n reportAProblemLink?: string;\n moreTeamsToJoin: boolean;\n pluginMenuItems?: PluginComponent[];\n isMentionSearch?: boolean;\n teamIsGroupConstrained: boolean;\n isLicensedForLDAPGroups?: boolean;\n intl: IntlShape;\n isCloud: boolean;\n isStarterFree: boolean;\n isFreeTrial: boolean;\n usageDeltaTeams: number;\n guestAccessEnabled: boolean;\n canInviteTeamMember: boolean;\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n showMentions: () => void;\n showFlaggedPosts: () => void;\n closeRightHandSide: () => void;\n closeRhsMenu: () => void;\n };\n\n};\nexport class MainMenu extends React.PureComponent<Props> {\n static defaultProps = {\n teamType: '',\n mobile: false,\n pluginMenuItems: [],\n };\n\n async componentDidMount(): Promise<void> {\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount(): void {\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleKeyDown = (e: KeyboardEvent): void => {\n if (cmdOrCtrlPressed(e) && e.shiftKey && isKeyPressed(e, Constants.KeyCodes.A)) {\n e.preventDefault();\n this.props.actions.openModal({modalId: ModalIdentifiers.USER_SETTINGS, dialogType: UserSettingsModal, dialogProps: {isContentProductSettings: true}});\n }\n };\n\n handleEmitUserLoggedOutEvent = (): void => {\n GlobalActions.emitUserLoggedOutEvent();\n };\n\n getFlagged = (e: Event): void => {\n e.preventDefault();\n this.props.actions.showFlaggedPosts();\n this.props.actions.closeRhsMenu();\n };\n\n searchMentions = (e: Event): void => {\n e.preventDefault();\n\n if (this.props.isMentionSearch) {\n this.props.actions.closeRightHandSide();\n } else {\n this.props.actions.closeRhsMenu();\n this.props.actions.showMentions();\n }\n };\n\n render() {\n const {\n appDownloadLink,\n currentUser,\n teamIsGroupConstrained,\n isLicensedForLDAPGroups,\n teamId = '',\n guestAccessEnabled,\n canInviteTeamMember,\n } = this.props;\n\n const safeAppDownloadLink = makeUrlSafe(appDownloadLink || '');\n\n if (!currentUser) {\n return null;\n }\n\n const pluginItems = this.props.pluginMenuItems?.map((item) => (\n <Menu.ItemAction\n id={item.id + '_pluginmenuitem'}\n key={item.id + '_pluginmenuitem'}\n onClick={() => {\n if (item.action) {\n item.action();\n }\n }}\n text={item.text}\n icon={this.props.mobile && item.mobileIcon}\n />\n ));\n\n const someIntegrationEnabled = this.props.enableIncomingWebhooks || this.props.enableOutgoingWebhooks || this.props.enableCommands || this.props.enableOAuthServiceProvider || this.props.canManageSystemBots;\n const showIntegrations = !this.props.mobile && someIntegrationEnabled && this.props.canManageIntegrations;\n const teamsLimitReached = this.props.isStarterFree && !this.props.isFreeTrial && this.props.usageDeltaTeams >= 0;\n const createTeamRestricted = this.props.isCloud && (this.props.isFreeTrial || teamsLimitReached);\n\n const {formatMessage} = this.props.intl;\n\n let invitePeopleModal = null;\n if (guestAccessEnabled || canInviteTeamMember) {\n invitePeopleModal = (\n <Menu.ItemToggleModalRedux\n id='invitePeople'\n modalId={ModalIdentifiers.INVITATION}\n dialogType={InvitationModal}\n text={formatMessage({\n id: 'navbar_dropdown.invitePeople',\n defaultMessage: 'Invite People',\n })}\n extraText={formatMessage({\n id: 'navbar_dropdown.invitePeopleExtraText',\n defaultMessage: 'Add people to the team',\n })}\n icon={this.props.mobile && <i className='fa fa-user-plus'/>}\n onClick={() => trackEvent('ui', 'click_sidebar_team_dropdown_invite_people')}\n />\n );\n }\n\n return this.props.mobile ? (\n <Menu\n id={this.props.id}\n ariaLabel={formatMessage({id: 'navbar_dropdown.menuAriaLabel', defaultMessage: 'main menu'})}\n >\n <Menu.Group>\n <SystemPermissionGate\n permissions={[Permissions.SYSCONSOLE_WRITE_BILLING]}\n >\n <Menu.CloudTrial\n id='menuCloudTrial'\n />\n </SystemPermissionGate>\n </Menu.Group>\n <Menu.Group>\n <SystemPermissionGate\n permissions={[Permissions.SYSCONSOLE_WRITE_ABOUT_EDITION_AND_LICENSE]}\n >\n <Menu.StartTrial\n id='startTrial'\n />\n </SystemPermissionGate>\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemAction\n id='recentMentions'\n onClick={this.searchMentions}\n icon={<i className='mentions'>{'@'}</i>}\n text={formatMessage({id: 'sidebar_right_menu.recentMentions', defaultMessage: 'Recent Mentions'})}\n />\n <Menu.ItemAction\n id='flaggedPosts'\n onClick={this.getFlagged}\n icon={<i className='fa fa-bookmark'/>}\n text={formatMessage({id: 'sidebar_right_menu.flagged', defaultMessage: 'Saved messages'})}\n />\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemToggleModalRedux\n id='profileSettings'\n modalId={ModalIdentifiers.USER_SETTINGS}\n dialogType={UserSettingsModal}\n dialogProps={{isContentProductSettings: false}}\n text={formatMessage({id: 'navbar_dropdown.profileSettings', defaultMessage: 'Profile'})}\n icon={<i className='fa fa-user'/>}\n />\n <Menu.ItemToggleModalRedux\n id='accountSettings'\n modalId={ModalIdentifiers.USER_SETTINGS}\n dialogType={UserSettingsModal}\n dialogProps={{isContentProductSettings: true}}\n text={formatMessage({id: 'navbar_dropdown.accountSettings', defaultMessage: 'Settings'})}\n icon={<i className='fa fa-cog'/>}\n />\n </Menu.Group>\n <Menu.Group>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.MANAGE_TEAM]}\n >\n <Menu.ItemToggleModalRedux\n id='addGroupsToTeam'\n show={teamIsGroupConstrained && isLicensedForLDAPGroups}\n modalId={ModalIdentifiers.ADD_GROUPS_TO_TEAM}\n dialogType={AddGroupsToTeamModal}\n text={formatMessage({id: 'navbar_dropdown.addGroupsToTeam', defaultMessage: 'Add Groups to Team'})}\n icon={<i className='fa fa-user-plus'/>}\n />\n </TeamPermissionGate>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n >\n {invitePeopleModal}\n </TeamPermissionGate>\n </Menu.Group>\n <Menu.Group>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.MANAGE_TEAM]}\n >\n <Menu.ItemToggleModalRedux\n id='teamSettings'\n modalId={ModalIdentifiers.TEAM_SETTINGS}\n dialogType={TeamSettingsModal}\n text={formatMessage({id: 'navbar_dropdown.teamSettings', defaultMessage: 'Team Settings'})}\n icon={<i className='fa fa-globe'/>}\n />\n </TeamPermissionGate>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.MANAGE_TEAM]}\n >\n <Menu.ItemToggleModalRedux\n id='manageGroups'\n show={teamIsGroupConstrained && isLicensedForLDAPGroups}\n modalId={ModalIdentifiers.MANAGE_TEAM_GROUPS}\n dialogProps={{\n teamID: teamId,\n }}\n dialogType={TeamGroupsManageModal}\n text={formatMessage({id: 'navbar_dropdown.manageGroups', defaultMessage: 'Manage Groups'})}\n icon={<i className='fa fa-user-plus'/>}\n />\n </TeamPermissionGate>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.REMOVE_USER_FROM_TEAM, Permissions.MANAGE_TEAM_ROLES]}\n >\n <Menu.ItemToggleModalRedux\n id='manageMembers'\n modalId={ModalIdentifiers.TEAM_MEMBERS}\n dialogType={TeamMembersModal}\n text={formatMessage({id: 'navbar_dropdown.manageMembers', defaultMessage: 'Manage Members'})}\n icon={<i className='fa fa-users'/>}\n />\n </TeamPermissionGate>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.REMOVE_USER_FROM_TEAM, Permissions.MANAGE_TEAM_ROLES]}\n invert={true}\n >\n <Menu.ItemToggleModalRedux\n id='viewMembers'\n modalId={ModalIdentifiers.TEAM_MEMBERS}\n dialogType={TeamMembersModal}\n text={formatMessage({id: 'navbar_dropdown.viewMembers', defaultMessage: 'View Members'})}\n icon={<i className='fa fa-users'/>}\n />\n </TeamPermissionGate>\n </Menu.Group>\n <Menu.Group>\n <SystemPermissionGate permissions={[Permissions.CREATE_TEAM]}>\n <Menu.ItemLink\n id='createTeam'\n show={!teamsLimitReached}\n to='/create_team'\n text={formatMessage({id: 'navbar_dropdown.create', defaultMessage: 'Create a Team'})}\n icon={<i className='fa fa-plus-square'/>}\n />\n </SystemPermissionGate>\n <Menu.ItemLink\n id='joinTeam'\n show={!this.props.experimentalPrimaryTeam && this.props.moreTeamsToJoin}\n to='/select_team'\n text={formatMessage({id: 'navbar_dropdown.join', defaultMessage: 'Join Another Team'})}\n icon={<i className='fa fa-plus-square'/>}\n />\n <Menu.ItemToggleModalRedux\n id='leaveTeam'\n show={!teamIsGroupConstrained && this.props.experimentalPrimaryTeam !== this.props.teamName}\n modalId={ModalIdentifiers.LEAVE_TEAM}\n dialogType={LeaveTeamModal}\n text={formatMessage({id: 'navbar_dropdown.leave', defaultMessage: 'Leave Team'})}\n icon={<LeaveTeamIcon/>}\n />\n </Menu.Group>\n <Menu.Group>\n {pluginItems}\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemLink\n id='integrations'\n show={showIntegrations}\n to={'/' + this.props.teamName + '/integrations'}\n text={formatMessage({id: 'navbar_dropdown.integrations', defaultMessage: 'Integrations'})}\n />\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemExternalLink\n id='helpLink'\n show={Boolean(this.props.helpLink)}\n url={this.props.helpLink}\n text={formatMessage({id: 'navbar_dropdown.help', defaultMessage: 'Help'})}\n icon={<i className='fa fa-question'/>}\n />\n <Menu.ItemExternalLink\n id='reportLink'\n show={Boolean(this.props.reportAProblemLink)}\n url={this.props.reportAProblemLink}\n text={formatMessage({id: 'navbar_dropdown.report', defaultMessage: 'Report a Problem'})}\n icon={<i className='fa fa-phone'/>}\n />\n <Menu.ItemExternalLink\n id='nativeAppLink'\n show={this.props.appDownloadLink && !UserAgent.isMobileApp()}\n url={safeAppDownloadLink}\n text={formatMessage({id: 'navbar_dropdown.nativeApps', defaultMessage: 'Download Apps'})}\n icon={<i className='fa fa-mobile'/>}\n />\n <Menu.ItemToggleModalRedux\n id='about'\n modalId={ModalIdentifiers.ABOUT}\n dialogType={AboutBuildModal}\n text={formatMessage({id: 'navbar_dropdown.about', defaultMessage: 'About {appTitle}'}, {appTitle: this.props.siteName || 'Mattermost'})}\n icon={<i className='fa fa-info'/>}\n />\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemAction\n id='logout'\n onClick={this.handleEmitUserLoggedOutEvent}\n text={formatMessage({id: 'navbar_dropdown.logout', defaultMessage: 'Log Out'})}\n icon={<i className='fa fa-sign-out'/>}\n />\n </Menu.Group>\n </Menu>\n ) : (\n <Menu\n id={this.props.id}\n ariaLabel={formatMessage({id: 'sidebar.team_menu.menuAriaLabel', defaultMessage: 'team menu'})}\n >\n <Menu.Group>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.MANAGE_TEAM]}\n >\n <Menu.ItemToggleModalRedux\n id='addGroupsToTeam'\n show={teamIsGroupConstrained && isLicensedForLDAPGroups}\n modalId={ModalIdentifiers.ADD_GROUPS_TO_TEAM}\n dialogType={AddGroupsToTeamModal}\n text={formatMessage({id: 'navbar_dropdown.addGroupsToTeam', defaultMessage: 'Add Groups to Team'})}\n />\n </TeamPermissionGate>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n >\n {invitePeopleModal}\n </TeamPermissionGate>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.MANAGE_TEAM]}\n >\n <Menu.ItemToggleModalRedux\n id='teamSettings'\n modalId={ModalIdentifiers.TEAM_SETTINGS}\n dialogType={TeamSettingsModal}\n text={formatMessage({id: 'navbar_dropdown.teamSettings', defaultMessage: 'Team Settings'})}\n />\n </TeamPermissionGate>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.MANAGE_TEAM]}\n >\n <Menu.ItemToggleModalRedux\n id='manageGroups'\n show={teamIsGroupConstrained && isLicensedForLDAPGroups}\n modalId={ModalIdentifiers.MANAGE_TEAM_GROUPS}\n dialogProps={{teamID: teamId}}\n dialogType={TeamGroupsManageModal}\n text={formatMessage({id: 'navbar_dropdown.manageGroups', defaultMessage: 'Manage Groups'})}\n />\n </TeamPermissionGate>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.REMOVE_USER_FROM_TEAM, Permissions.MANAGE_TEAM_ROLES]}\n >\n <Menu.ItemToggleModalRedux\n id='manageMembers'\n modalId={ModalIdentifiers.TEAM_MEMBERS}\n dialogType={TeamMembersModal}\n text={formatMessage({id: 'navbar_dropdown.manageMembers', defaultMessage: 'Manage Members'})}\n />\n </TeamPermissionGate>\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.REMOVE_USER_FROM_TEAM, Permissions.MANAGE_TEAM_ROLES]}\n invert={true}\n >\n <Menu.ItemToggleModalRedux\n id='viewMembers'\n modalId={ModalIdentifiers.TEAM_MEMBERS}\n dialogType={TeamMembersModal}\n text={formatMessage({id: 'navbar_dropdown.viewMembers', defaultMessage: 'View Members'})}\n />\n </TeamPermissionGate>\n <Menu.ItemLink\n id='joinTeam'\n show={!this.props.experimentalPrimaryTeam && this.props.moreTeamsToJoin}\n to='/select_team'\n text={formatMessage({id: 'navbar_dropdown.join', defaultMessage: 'Join Another Team'})}\n />\n <Menu.ItemToggleModalRedux\n id='leaveTeam'\n className='destructive'\n show={!teamIsGroupConstrained && this.props.experimentalPrimaryTeam !== this.props.teamName}\n modalId={ModalIdentifiers.LEAVE_TEAM}\n dialogType={LeaveTeamModal}\n text={formatMessage({id: 'navbar_dropdown.leave', defaultMessage: 'Leave Team'})}\n />\n </Menu.Group>\n <Menu.Group>\n <SystemPermissionGate permissions={[Permissions.CREATE_TEAM]}>\n <Menu.ItemLink\n id='createTeam'\n to='/create_team'\n className={createTeamRestricted ? 'MenuItem__with-icon-tooltip' : ''}\n disabled={teamsLimitReached}\n text={formatMessage({id: 'navbar_dropdown.create', defaultMessage: 'Create a Team'})}\n sibling={createTeamRestricted && (\n <RestrictedIndicator\n feature={MattermostFeatures.CREATE_MULTIPLE_TEAMS}\n minimumPlanRequiredForFeature={LicenseSkus.Professional}\n blocked={!this.props.isFreeTrial}\n tooltipMessage={formatMessage({\n id: 'navbar_dropdown.create.tooltip.cloudFreeTrial',\n defaultMessage: 'During your trial you are able to create multiple teams. These teams will be archived after your trial.',\n })}\n titleAdminPreTrial={formatMessage({\n id: 'navbar_dropdown.create.modal.titleAdminPreTrial',\n defaultMessage: 'Try unlimited teams with a free trial',\n })}\n messageAdminPreTrial={formatMessage({\n id: 'navbar_dropdown.create.modal.messageAdminPreTrial',\n defaultMessage: 'Create unlimited teams with one of our paid plans. Get the full experience of Enterprise when you start a free, {trialLength} day trial.',\n },\n {\n trialLength: FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS,\n },\n )}\n titleAdminPostTrial={formatMessage({\n id: 'navbar_dropdown.create.modal.titleAdminPostTrial',\n defaultMessage: 'Upgrade to create unlimited teams',\n })}\n messageAdminPostTrial={formatMessage({\n id: 'navbar_dropdown.create.modal.messageAdminPostTrial',\n defaultMessage: 'Multiple teams allow for context-specific spaces that are more attuned to your and your teams’ needs. Upgrade to the Professional plan to create unlimited teams.',\n })}\n titleEndUser={formatMessage({\n id: 'navbar_dropdown.create.modal.titleEndUser',\n defaultMessage: 'Multiple teams available in paid plans',\n })}\n messageEndUser={formatMessage({\n id: 'navbar_dropdown.create.modal.messageEndUser',\n defaultMessage: 'Multiple teams allow for context-specific spaces that are more attuned to your teams’ needs.',\n })}\n />\n )}\n />\n </SystemPermissionGate>\n <Menu.Group>\n <div className='MainMenu_dropdown-link'>\n <LearnAboutTeamsLink/>\n </div>\n </Menu.Group>\n </Menu.Group>\n <Menu.Group>\n {pluginItems}\n </Menu.Group>\n </Menu>\n );\n }\n}\n\nexport default injectIntl(MainMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getCloudSubscription as selectCloudSubscription, getSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud';\nimport {\n getConfig,\n getLicense,\n} from 'mattermost-redux/selectors/entities/general';\nimport {haveICurrentTeamPermission, haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {\n getJoinableTeamIds,\n getCurrentTeam,\n} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\nimport {showMentions, showFlaggedPosts, closeRightHandSide, closeMenu as closeRhsMenu} from 'actions/views/rhs';\nimport {getRhsState} from 'selectors/rhs';\n\nimport {RHSStates, CloudProducts} from 'utils/constants';\nimport {isCloudLicense} from 'utils/license_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport MainMenu from './main_menu';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const currentTeam = getCurrentTeam(state);\n const currentUser = getCurrentUser(state);\n\n const appDownloadLink = config.AppDownloadLink;\n const enableCommands = config.EnableCommands === 'true';\n const siteName = config.SiteName;\n const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n const experimentalPrimaryTeam = config.ExperimentalPrimaryTeam;\n const helpLink = config.HelpLink;\n const reportAProblemLink = config.ReportAProblemLink;\n\n const canManageTeamIntegrations = (haveICurrentTeamPermission(state, Permissions.MANAGE_SLASH_COMMANDS) || haveICurrentTeamPermission(state, Permissions.MANAGE_OAUTH) || haveICurrentTeamPermission(state, Permissions.MANAGE_INCOMING_WEBHOOKS) || haveICurrentTeamPermission(state, Permissions.MANAGE_OUTGOING_WEBHOOKS));\n const canManageSystemBots = (haveISystemPermission(state, {permission: Permissions.MANAGE_BOTS}) || haveISystemPermission(state, {permission: Permissions.MANAGE_OTHERS_BOTS}));\n const canManageIntegrations = canManageTeamIntegrations || canManageSystemBots;\n const canInviteTeamMember = haveICurrentTeamPermission(state, Permissions.ADD_USER_TO_TEAM);\n\n const joinableTeams = getJoinableTeamIds(state);\n const moreTeamsToJoin = joinableTeams && joinableTeams.length > 0;\n const rhsState = getRhsState(state);\n\n const subscription = selectCloudSubscription(state);\n const license = getLicense(state);\n const subscriptionProduct = getSubscriptionProduct(state);\n\n const isCloud = isCloudLicense(license);\n const isStarterFree = isCloud && subscriptionProduct?.sku === CloudProducts.STARTER;\n const isFreeTrial = isCloud && subscription?.is_free_trial === 'true';\n\n return {\n appDownloadLink,\n enableCommands,\n canManageIntegrations,\n enableIncomingWebhooks,\n enableOAuthServiceProvider,\n enableOutgoingWebhooks,\n canManageSystemBots,\n experimentalPrimaryTeam,\n helpLink,\n reportAProblemLink,\n pluginMenuItems: state.plugins.components.MainMenu,\n moreTeamsToJoin,\n siteName,\n teamId: currentTeam?.id,\n teamName: currentTeam?.name,\n currentUser,\n isMentionSearch: rhsState === RHSStates.MENTION,\n teamIsGroupConstrained: Boolean(currentTeam?.group_constrained),\n isLicensedForLDAPGroups: state.entities.general.license.LDAPGroups === 'true',\n guestAccessEnabled: config.EnableGuestAccounts === 'true',\n canInviteTeamMember,\n isCloud,\n isStarterFree,\n isFreeTrial,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n showMentions,\n showFlaggedPosts,\n closeRightHandSide,\n closeRhsMenu,\n }, dispatch),\n };\n}\n\nexport default withRouter<any, any>(connect(mapStateToProps, mapDispatchToProps)(MainMenu));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport ExternalLink from 'components/external_link';\nimport './learn_about_teams_link.scss';\n\nconst LearnAboutTeamsLink = () => {\n return (\n <div className='LearnAboutTeamsLink'>\n <FormattedMessage\n id='learn_about_teams'\n defaultMessage='<a>Learn about teams</a>'\n values={{\n a: (chunks) => (\n <ExternalLink\n location='learn_about_teams'\n href='https://mattermost.com/pl/mattermost-academy-team-training'\n >\n <i className='icon icon-lightbulb-outline'/>\n <span>{chunks}</span>\n </ExternalLink>\n ),\n }}\n />\n </div>\n );\n};\nexport default LearnAboutTeamsLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {PostImage, PostType} from '@mattermost/types/posts';\n\nimport type {HighlightWithoutNotificationKey} from 'mattermost-redux/selectors/entities/users';\n\nimport PostEditedIndicator from 'components/post_view/post_edited_indicator';\n\nimport type EmojiMap from 'utils/emoji_map';\nimport messageHtmlToComponent from 'utils/message_html_to_component';\nimport type {ChannelNamesMap, MentionKey, TextFormattingOptions} from 'utils/text_formatting';\nimport {formatText} from 'utils/text_formatting';\n\nimport type {PropsFromRedux} from './index';\n\nexport type Props = PropsFromRedux & OwnProps;\n\nexport type OwnProps = {\n\n /**\n * Any additional text formatting options to be used\n */\n options?: Partial<TextFormattingOptions>;\n\n /**\n * Whether or not to proxy image URLs\n */\n proxyImages?: boolean;\n\n /**\n * prop for passed down to image component for dimensions\n */\n imagesMetadata?: Record<string, PostImage>;\n\n /**\n * Post id prop passed down to markdown image\n */\n postId?: string;\n\n /**\n * When the post is edited this is the timestamp it happened at\n */\n editedAt?: number;\n\n /*\n * The text to be rendered\n */\n message?: string;\n channelNamesMap?: ChannelNamesMap;\n\n /*\n * An array of words that can be used to mention a user\n */\n mentionKeys?: MentionKey[];\n highlightKeys?: HighlightWithoutNotificationKey[];\n\n /**\n * Any extra props that should be passed into the image component\n */\n imageProps?: object;\n\n /**\n * Whether or not to place the LinkTooltip component inside links\n */\n hasPluginTooltips?: boolean;\n\n channelId?: string;\n\n /**\n * Post id prop passed down to markdown image\n */\n postType?: PostType;\n emojiMap?: EmojiMap;\n\n /**\n * Some components processed by messageHtmlToComponent e.g. AtSumOfMembersMention require to have a list of userIds\n */\n userIds?: string[];\n\n /**\n * Some additional data to pass down to rendered component to aid in rendering decisions\n */\n messageMetadata?: Record<string, string>;\n}\n\nfunction Markdown({\n options = {},\n proxyImages = true,\n imagesMetadata = {},\n postId = '', // Needed to avoid proptypes console errors for cases like channel header, which doesn't have a proper value\n editedAt = 0,\n message = '',\n channelNamesMap,\n mentionKeys,\n highlightKeys,\n imageProps,\n channelId,\n hasPluginTooltips,\n postType,\n emojiMap,\n userIds,\n messageMetadata,\n enableFormatting,\n autolinkedUrlSchemes,\n siteURL,\n hasImageProxy,\n team,\n minimumHashtagLength,\n managedResourcePaths,\n}: Props) {\n if (message === '' || !enableFormatting) {\n return (\n <span>\n {message}\n <PostEditedIndicator\n postId={postId}\n editedAt={editedAt}\n />\n </span>\n );\n }\n\n const inputOptions = Object.assign({\n autolinkedUrlSchemes,\n siteURL,\n mentionKeys,\n highlightKeys,\n atMentions: true,\n channelNamesMap,\n proxyImages: hasImageProxy && proxyImages,\n team,\n minimumHashtagLength,\n managedResourcePaths,\n editedAt,\n postId,\n }, options);\n\n const htmlFormattedText = formatText(message, inputOptions, emojiMap);\n\n return messageHtmlToComponent(htmlFormattedText, {\n imageProps,\n imagesMetadata,\n hasPluginTooltips,\n postId,\n userIds,\n messageMetadata,\n channelId,\n postType,\n mentionHighlight: options?.mentionHighlight,\n disableGroupHighlight: options?.disableGroupHighlight,\n editedAt,\n atSumOfMembersMentions: options?.atSumOfMembersMentions,\n atPlanMentions: options?.atPlanMentions,\n });\n}\n\nexport default Markdown;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect, type ConnectedProps} from 'react-redux';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getChannelNameToDisplayNameMap} from 'mattermost-redux/selectors/entities/channels';\nimport {getAutolinkedUrlSchemes, getConfig, getManagedResourcePaths} from 'mattermost-redux/selectors/entities/general';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getAllUserMentionKeys} from 'mattermost-redux/selectors/entities/search';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getEmojiMap} from 'selectors/emojis';\n\nimport {getSiteURL} from 'utils/url';\n\nimport type {GlobalState} from 'types/store';\n\nimport Markdown, {type OwnProps} from './markdown';\n\nfunction makeGetChannelNamesMap() {\n return createSelector(\n 'makeGetChannelNamesMap',\n getChannelNameToDisplayNameMap,\n (_: GlobalState, props: OwnProps) => props && props.channelNamesMap,\n (channelNamesMap, channelMentions) => {\n if (channelMentions) {\n return Object.assign({}, channelMentions, channelNamesMap);\n }\n\n return channelNamesMap;\n },\n );\n}\n\nfunction makeMapStateToProps() {\n const getChannelNamesMap = makeGetChannelNamesMap();\n\n return function mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const config = getConfig(state);\n\n let channelId;\n if (ownProps.postId) {\n channelId = getPost(state, ownProps.postId)?.channel_id;\n }\n\n return {\n autolinkedUrlSchemes: getAutolinkedUrlSchemes(state),\n channelNamesMap: getChannelNamesMap(state, ownProps),\n enableFormatting: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'formatting', true),\n managedResourcePaths: getManagedResourcePaths(state),\n mentionKeys: ownProps.mentionKeys || getAllUserMentionKeys(state),\n siteURL: getSiteURL(),\n team: getCurrentTeam(state),\n hasImageProxy: config.HasImageProxy === 'true',\n minimumHashtagLength: parseInt(config.MinimumHashtagLength || '', 10),\n emojiMap: getEmojiMap(state),\n channelId,\n };\n };\n}\n\nconst connector = connect(makeMapStateToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(Markdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createTheme, ThemeProvider, useTheme as useDefaultMuiTheme, alpha} from '@mui/material/styles';\nimport type {Theme as MuiTheme} from '@mui/material/styles';\nimport React, {memo, useMemo} from 'react';\nimport type {FC, ReactNode} from 'react';\n\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\n\ninterface Props {\n theme?: Theme;\n children?: ReactNode;\n}\n\nconst CompassDesignProvider: FC<Props> = (props: Props) => {\n const defaultMuiTheme = useDefaultMuiTheme();\n\n const theme = useMemo<MuiTheme>(() => createTheme({\n palette: {\n background: {\n paper: props.theme?.centerChannelBg ?? defaultMuiTheme.palette.background.paper,\n },\n divider: alpha(props.theme?.centerChannelColor ?? defaultMuiTheme.palette.divider, 0.08),\n },\n }), [props?.theme]);\n\n return <ThemeProvider theme={theme}>{props.children}</ThemeProvider>;\n};\n\nexport default memo(CompassDesignProvider);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createContext, useMemo, useRef} from 'react';\n\ninterface MenuSubmenuContextType {\n close?: () => void;\n isOpen: boolean;\n addOnClosedListener: (listener: () => void) => void;\n handleClosed: () => void;\n}\n\nexport const MenuContext = createContext<MenuSubmenuContextType>({\n isOpen: false,\n addOnClosedListener: () => {},\n handleClosed: () => {},\n});\nMenuContext.displayName = 'MenuContext';\n\nexport const SubMenuContext = createContext<MenuSubmenuContextType>({\n isOpen: false,\n addOnClosedListener: () => {},\n handleClosed: () => {},\n});\nSubMenuContext.displayName = 'SubMenuContext';\n\nexport function useMenuContextValue(close: () => void, isOpen: boolean): MenuSubmenuContextType {\n const onClosedListeners = useRef(new Set<() => void>());\n\n return useMemo(() => ({\n close,\n isOpen,\n addOnClosedListener: (listener: () => void) => {\n onClosedListeners.current.add(listener);\n },\n handleClosed: () => {\n onClosedListeners.current.forEach((listener) => listener());\n onClosedListeners.current.clear();\n },\n }), [close, isOpen]);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport MuiMenu from '@mui/material/Menu';\nimport type {MenuProps as MuiMenuProps} from '@mui/material/Menu';\nimport {styled} from '@mui/material/styles';\n\ninterface Props extends MuiMenuProps {\n asSubMenu?: boolean;\n width?: string;\n}\n\n/**\n * A styled version of the Material-UI Menu component with few overrides.\n * @warning This component is meant to be only used inside of the Menu component directory.\n */\nexport const MuiMenuStyled = styled(MuiMenu, {\n shouldForwardProp: (prop) => prop !== 'asSubMenu',\n})<Props>(\n ({asSubMenu, width}) => ({\n '& .MuiPaper-root': {\n backgroundColor: 'var(--center-channel-bg)',\n boxShadow: `${\n asSubMenu ? 'var(--elevation-5)' : 'var(--elevation-4)'\n }, 0 0 0 1px rgba(var(--center-channel-color-rgb), 0.12) inset`,\n minWidth: '114px',\n maxWidth: '496px',\n maxHeight: '80vh',\n width,\n },\n }),\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport MuiMenuList from '@mui/material/MenuList';\nimport React, {\n useState,\n useEffect,\n useCallback,\n} from 'react';\nimport type {\n ReactNode,\n MouseEvent,\n KeyboardEvent,\n} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {openModal, closeModal} from 'actions/views/modals';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport CompassDesignProvider from 'components/compass_design_provider';\nimport WithTooltip from 'components/with_tooltip';\n\nimport Constants, {A11yClassNames} from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\n\nimport {MenuContext, useMenuContextValue} from './menu_context';\nimport {MuiMenuStyled} from './menu_styled';\n\nconst MENU_OPEN_ANIMATION_DURATION = 150;\nconst MENU_CLOSE_ANIMATION_DURATION = 100;\n\ntype MenuButtonProps = {\n id: string;\n dateTestId?: string;\n 'aria-label'?: string;\n disabled?: boolean;\n class?: string;\n as?: keyof JSX.IntrinsicElements;\n children: ReactNode;\n}\n\ntype MenuButtonTooltipProps = {\n isVertical?: boolean;\n class?: string;\n text: string;\n disabled?: boolean;\n}\n\ntype MenuProps = {\n id: string;\n 'aria-label'?: string;\n\n /**\n * @warning Make the styling of your components such a way that they dont need this handler\n */\n onToggle?: (isOpen: boolean) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLDivElement>, forceCloseMenu?: () => void) => void;\n width?: string;\n}\n\nconst defaultAnchorOrigin = {vertical: 'bottom', horizontal: 'left'};\nconst defaultTransformOrigin = {vertical: 'top', horizontal: 'left'};\n\ntype VerticalOrigin = 'top' | 'center' | 'bottom';\ntype HorizontalOrigin = 'left' | 'center' | 'right';\n\ninterface Props {\n menuButton: MenuButtonProps;\n menuButtonTooltip?: MenuButtonTooltipProps;\n menu: MenuProps;\n children: ReactNode[];\n\n // Use MUI Anchor Playgroup to try various anchorOrigin\n // and transformOrigin values - https://mui.com/material-ui/react-popover/#anchor-playground\n anchorOrigin?: {\n vertical: VerticalOrigin;\n horizontal: HorizontalOrigin;\n };\n transformOrigin?: {\n vertical: VerticalOrigin;\n horizontal: HorizontalOrigin;\n };\n}\n\n/**\n * @example\n * import * as Menu from 'components/menu';\n *\n * <Menu.Container>\n * <Menu.Item>\n * <Menu.Item>\n * <Menu.Separator/>\n * </Menu.Item>\n */\nexport function Menu(props: Props) {\n const theme = useSelector(getTheme);\n\n const isMobileView = useSelector(getIsMobileView);\n\n const dispatch = useDispatch();\n\n const [anchorElement, setAnchorElement] = useState<null | HTMLElement>(null);\n const [disableAutoFocusItem, setDisableAutoFocusItem] = useState(false);\n const isMenuOpen = Boolean(anchorElement);\n\n // Callback funtion handler called when menu is closed by escapeKeyDown, backdropClick or tabKeyDown\n function handleMenuClose(event: MouseEvent<HTMLDivElement>) {\n event.preventDefault();\n setAnchorElement(null);\n setDisableAutoFocusItem(false);\n }\n\n // Handle function injected into menu items to close the menu\n const closeMenu = useCallback(() => {\n setAnchorElement(null);\n setDisableAutoFocusItem(false);\n }, []);\n\n function handleMenuModalClose(modalId: MenuProps['id']) {\n dispatch(closeModal(modalId));\n setAnchorElement(null);\n }\n\n // Stop sythetic events from bubbling up to the parent\n // @see https://github.com/mui/material-ui/issues/32064\n function handleMenuClick(e: MouseEvent<HTMLLIElement> | KeyboardEvent<HTMLLIElement>) {\n e.stopPropagation();\n }\n\n function handleMenuKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (isKeyPressed(event, Constants.KeyCodes.ENTER) || isKeyPressed(event, Constants.KeyCodes.SPACE)) {\n const target = event.target as HTMLElement;\n const ariaHasPopupAttribute = target?.getAttribute('aria-haspopup') === 'true';\n const ariaHasExpandedAttribute = target?.getAttribute('aria-expanded') === 'true';\n\n if (ariaHasPopupAttribute && ariaHasExpandedAttribute) {\n // Avoid closing the sub menu item on enter\n } else {\n setAnchorElement(null);\n }\n }\n\n if (props.menu.onKeyDown) {\n // We need to pass the closeMenu function to the onKeyDown handler so that the menu can be closed manually\n // This is helpful for cases when menu needs to be closed after certain keybindings are pressed in components which uses menu\n // This however is not the case for mouse events as they are handled/closed by menu item click handlers\n props.menu.onKeyDown(event, closeMenu);\n }\n }\n\n function handleMenuButtonClick(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n if (isMobileView) {\n dispatch(\n openModal<MenuModalProps>({\n modalId: props.menu.id,\n dialogType: MenuModal,\n dialogProps: {\n menuButtonId: props.menuButton.id,\n menuId: props.menu.id,\n menuAriaLabel: props.menu?.['aria-label'] ?? '',\n onModalClose: handleMenuModalClose,\n children: props.children,\n onKeyDown: props.menu.onKeyDown,\n },\n }),\n );\n } else {\n setAnchorElement(event.currentTarget as HTMLElement);\n }\n }\n\n // Function to prevent focus-visible from being set on clicking menu items with the mouse\n function handleMenuButtonMouseDown() {\n setDisableAutoFocusItem(true);\n }\n\n // We construct the menu button so we can set onClick correctly here to support both web and mobile view\n function renderMenuButton() {\n const MenuButtonComponent = props.menuButton?.as ?? 'button';\n\n const triggerElement = (\n <MenuButtonComponent\n id={props.menuButton.id}\n data-testid={props.menuButton.dateTestId}\n aria-controls={props.menu.id}\n aria-haspopup={true}\n aria-expanded={isMenuOpen}\n disabled={props.menuButton?.disabled ?? false}\n aria-label={props.menuButton?.['aria-label'] ?? ''}\n className={props.menuButton?.class ?? ''}\n onClick={handleMenuButtonClick}\n onMouseDown={handleMenuButtonMouseDown}\n >\n {props.menuButton.children}\n </MenuButtonComponent>\n );\n\n if (props.menuButtonTooltip && props.menuButtonTooltip.text && !isMobileView) {\n return (\n <WithTooltip\n title={props.menuButtonTooltip.text}\n isVertical={props.menuButtonTooltip?.isVertical ?? true}\n disabled={isMenuOpen || props.menuButton?.disabled}\n >\n {triggerElement}\n </WithTooltip>\n );\n }\n\n return triggerElement;\n }\n\n useEffect(() => {\n if (props.menu.onToggle) {\n props.menu.onToggle(isMenuOpen);\n }\n }, [isMenuOpen]);\n\n const providerValue = useMenuContextValue(closeMenu, Boolean(anchorElement));\n\n if (isMobileView) {\n // In mobile view, the menu is rendered as a modal\n return renderMenuButton();\n }\n\n return (\n <CompassDesignProvider theme={theme}>\n {renderMenuButton()}\n <MenuContext.Provider value={providerValue}>\n <MuiMenuStyled\n anchorEl={anchorElement}\n open={isMenuOpen}\n onClose={handleMenuClose}\n onClick={handleMenuClick}\n onTransitionExited={providerValue.handleClosed}\n onKeyDown={handleMenuKeyDown}\n className={A11yClassNames.POPUP}\n width={props.menu.width}\n anchorOrigin={props.anchorOrigin || defaultAnchorOrigin}\n transformOrigin={props.transformOrigin || defaultTransformOrigin}\n disableAutoFocusItem={disableAutoFocusItem} // This is not anti-pattern, see handleMenuButtonMouseDown\n MenuListProps={{\n id: props.menu.id,\n 'aria-label': props.menu?.['aria-label'] ?? '',\n }}\n TransitionProps={{\n mountOnEnter: true,\n unmountOnExit: true,\n timeout: {\n enter: MENU_OPEN_ANIMATION_DURATION,\n exit: MENU_CLOSE_ANIMATION_DURATION,\n },\n }}\n >\n {props.children}\n </MuiMenuStyled>\n </MenuContext.Provider>\n </CompassDesignProvider>\n );\n}\n\ninterface MenuModalProps {\n menuButtonId: MenuButtonProps['id'];\n menuId: MenuProps['id'];\n menuAriaLabel: MenuProps['aria-label'];\n onModalClose: (modalId: MenuProps['id']) => void;\n children: Props['children'];\n onKeyDown?: MenuProps['onKeyDown'];\n}\n\nfunction MenuModal(props: MenuModalProps) {\n const theme = useSelector(getTheme);\n\n function closeMenuModal() {\n props.onModalClose(props.menuId);\n }\n\n function handleModalClickCapture(event: MouseEvent<HTMLDivElement>) {\n if (event && event.currentTarget.contains(event.target as Node)) {\n for (const currentElement of event.currentTarget.children) {\n if (currentElement.contains(event.target as Node) && !currentElement.ariaHasPopup) {\n // We check for property ariaHasPopup because we don't want to close the menu\n // if the user clicks on a submenu item or menu item which open modal. And let submenu component handle the click.\n closeMenuModal();\n break;\n }\n }\n }\n }\n\n function handleKeydown(event?: React.KeyboardEvent<HTMLDivElement>) {\n if (event && props.onKeyDown) {\n props.onKeyDown(event, closeMenuModal);\n }\n }\n\n return (\n <CompassDesignProvider theme={theme}>\n <GenericModal\n id={props.menuId}\n className='menuModal'\n backdrop={true}\n ariaLabel={props.menuAriaLabel}\n onExited={closeMenuModal}\n enforceFocus={false}\n handleKeydown={handleKeydown}\n >\n <MuiMenuList // serves as backdrop for modals\n component='div'\n aria-labelledby={props.menuButtonId}\n onClick={handleModalClickCapture}\n >\n {props.children}\n </MuiMenuList>\n </GenericModal>\n </CompassDesignProvider>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport MuiMenuItem from '@mui/material/MenuItem';\nimport type {MenuItemProps as MuiMenuItemProps} from '@mui/material/MenuItem';\nimport {styled} from '@mui/material/styles';\nimport cloneDeep from 'lodash/cloneDeep';\nimport React, {\n Children,\n useContext,\n} from 'react';\nimport type {\n ReactElement,\n ReactNode,\n KeyboardEvent,\n MouseEvent,\n AriaRole,\n} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport Constants, {EventTypes} from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\n\nimport {MenuContext, SubMenuContext} from './menu_context';\n\nexport interface Props extends MuiMenuItemProps {\n\n /**\n * To support quick recognition of menu item. Could be icon, avatar or emoji.\n */\n leadingElement?: ReactNode;\n\n /**\n * There can be two labels for a menu item - primaryLabel and secondaryLabel.\n * If only one element is passed, it will be primaryLabel. And if another element is passed, it will be secondaryLabel.\n * @example\n * <Menu.Item labels={<FormattedMessage id=\"primary.label\" defaultMessage=\"primary Label\"/>}/>\n *\n * @example\n * <Menu.Item labels={\n * <>\n * <FormattedMessage id=\"primary.label\" defaultMessage=\"primary Label\"/>\n * <FormattedMessage id=\"secondary.label\" defaultMessage=\"secondary Label\"/>\n * </>\n * }/>\n *\n * @note\n * Wraps the labels with element such as span, div etc. to support styling instead of passing text node directly.\n */\n labels: ReactElement;\n\n /**\n * for some cases we have explicit requirement for labels to be in row instead of stack\n */\n isLabelsRowLayout?: boolean;\n\n /**\n * The meta data element to display extra information about menu item. Could be chevron, shortcut or badge.\n * It is formed with subMenuDetail and trailingElement. If only one is passed, it will be tailingElement. If two are\n * passed, first will be subMenuDetail and second will be trailingElement.\n *\n * @example\n * <Menu.Item trailingElements={<ChevronRightIcon/>}/>\n *\n * @example\n * <Menu.Item trailingElements={\n * <>\n * <FormattedMessage id=\"submenu.detail\" defaultMessage=\"submenu detail\"/>\n * <ChevronRightIcon/>\n * </>\n * }/>\n */\n trailingElements?: ReactNode;\n\n /**\n * For actions of menu item that are destructive in nature and harder to undo.\n */\n isDestructive?: boolean;\n\n onClick?: (event: MouseEvent<HTMLLIElement> | KeyboardEvent<HTMLLIElement>) => void;\n\n role?: AriaRole;\n\n /**\n * ONLY to support submenus. Avoid passing children to this component. Support for children is only added to support submenus.\n */\n children?: ReactNode;\n}\n\n/**\n * To be used as a child of Menu component.\n * Checkout Compass's Menu Item(compass.mattermost.com) for terminology, styling and usage guidelines.\n *\n * @example <caption>Using a menu in a component</caption>\n * <Menu.Container>\n * <Menu.Item/>\n * </Menu.Container>\n * @example <caption>Wrapping a menu item in another component</caption>\n * // Remember to pass all unused props into the Menu.Item to ensure MUI props for a11y are passed properly\n * const ConsoleLogItem = ({message, ...otherProps}) => ({\n * <Menu.Item\n * onClick={() => console.log(message)}\n * {...otherProps}\n * />\n * });\n *\n */\nexport function MenuItem(props: Props) {\n const {\n leadingElement,\n labels,\n trailingElements,\n isDestructive,\n isLabelsRowLayout,\n children,\n onClick,\n role = 'menuitem',\n ...otherProps\n } = props;\n\n const menuContext = useContext(MenuContext);\n const subMenuContext = useContext(SubMenuContext);\n\n const isMobileView = useSelector(getIsMobileView);\n\n function handleClick(event: MouseEvent<HTMLLIElement> | KeyboardEvent<HTMLLIElement>) {\n if (isCorrectKeyPressedOnMenuItem(event)) {\n // If the menu item is a checkbox or radio button, we don't want to close the menu when it is clicked.\n // see https://www.w3.org/WAI/ARIA/apg/patterns/menubar/\n if (isRoleCheckboxOrRadio(role)) {\n event.stopPropagation();\n } else {\n // close submenu first if it is open\n if (subMenuContext.close) {\n subMenuContext.close();\n }\n\n // And then close the menu\n if (menuContext.close) {\n menuContext.close();\n }\n }\n\n if (onClick) {\n // If the menu is in mobile view, we execute the click event immediately.\n // If the menu item is a checkbox or radio button, we execute the click event immediately.\n if (isMobileView || isRoleCheckboxOrRadio(role)) {\n onClick(event);\n } else {\n // Clone the event since we delay the click handler until after the menu has closed.\n const clonedEvent = cloneDeep(event);\n\n menuContext.addOnClosedListener(() => {\n onClick(clonedEvent);\n });\n }\n }\n }\n }\n\n // When both primary and secondary labels are passed, we need to apply minor changes to the styling. Check below in styled component for more details.\n const hasSecondaryLabel = labels && labels.props && labels.props.children && Children.count(labels.props.children) === 2;\n\n return (\n <MenuItemStyled\n disableRipple={true}\n disableTouchRipple={true}\n isDestructive={isDestructive}\n hasSecondaryLabel={hasSecondaryLabel}\n isLabelsRowLayout={isLabelsRowLayout}\n onClick={handleClick}\n onKeyDown={handleClick}\n role={role}\n {...otherProps}\n >\n {leadingElement && <div className='leading-element'>{leadingElement}</div>}\n <div className='label-elements'>{labels}</div>\n {trailingElements && <div className='trailing-elements'>{trailingElements}</div>}\n {children}\n </MenuItemStyled>\n );\n}\n\ninterface MenuItemStyledProps extends MuiMenuItemProps {\n isDestructive?: boolean;\n hasSecondaryLabel?: boolean;\n isLabelsRowLayout?: boolean;\n}\n\nexport const MenuItemStyled = styled(MuiMenuItem, {\n shouldForwardProp: (prop) => prop !== 'isDestructive' &&\n prop !== 'hasSecondaryLabel' && prop !== 'isLabelsRowLayout',\n})<MenuItemStyledProps>(\n ({isDestructive = false, hasSecondaryLabel = false, isLabelsRowLayout = false}) => {\n const hasOnlyPrimaryLabel = !hasSecondaryLabel;\n const isRegular = !isDestructive;\n\n return ({\n '&.MuiMenuItem-root': {\n fontFamily: '\"Open Sans\", sans-serif',\n color: isRegular ? 'var(--center-channel-color)' : 'var(--error-text)',\n padding: '6px 20px',\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'nowrap',\n justifyContent: 'flex-start',\n alignItems: hasOnlyPrimaryLabel || isLabelsRowLayout ? 'center' : 'flex-start',\n minHeight: '36px',\n maxHeight: '56px',\n\n // aria expanded to add the active styling on parent sub menu item\n '&.Mui-active, &[aria-expanded=\"true\"]': {\n 'background-color': isRegular ? 'rgba(var(--button-bg-rgb), 0.08)' : 'background-color: rgba(var(--error-text-color-rgb), 0.16)',\n },\n\n '&:hover': {\n backgroundColor: isRegular ? 'rgba(var(--center-channel-color-rgb), 0.08)' : 'var(--error-text)',\n color: isDestructive && 'var(--button-color)',\n },\n\n '&.Mui-disabled': {\n color: 'rgba(var(--center-channel-color-rgb), 0.32)',\n },\n\n '&.Mui-focusVisible': {\n boxShadow: isRegular ? '0 0 0 2px var(--sidebar-text-active-border) inset' : '0 0 0 2px rgba(var(--button-color-rgb), 0.16) inset',\n backgroundColor: isRegular ? 'var(--center-channel-bg)' : 'var(--error-text)',\n color: isDestructive && 'var(--button-color)',\n },\n '&.Mui-focusVisible .label-elements>:last-child, &.Mui-focusVisible .label-elements>:first-child, &.Mui-focusVisible .label-elements>:only-child': {\n color: isDestructive && 'var(--button-color)',\n },\n '&.Mui-focusVisible .leading-element, &.Mui-focusVisible .trailing-elements': {\n color: isDestructive && 'var(--button-color)',\n },\n\n '&>.leading-element': {\n width: '18px',\n height: '18px',\n marginInlineEnd: '10px',\n color: isRegular ? 'rgba(var(--center-channel-color-rgb), 0.64)' : 'var(--error-text)',\n },\n '&:hover .leading-element': {\n color: isRegular ? 'rgba(var(--center-channel-color-rgb), 0.8)' : 'var(--button-color)',\n },\n\n '&>.label-elements': {\n display: 'flex',\n flex: '1 0 auto',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'flex-start',\n flexWrap: 'nowrap',\n alignSelf: 'stretch',\n fontWeight: 400,\n textAlign: 'start',\n gap: '4px',\n lineHeight: '16px',\n },\n\n '&>.label-elements>:last-child': {\n fontSize: '12px',\n color: isRegular ? 'rgba(var(--center-channel-color-rgb), 0.75)' : 'var(--error-text)',\n },\n '&:hover .label-elements>:last-child': {\n color: isDestructive && 'var(--button-color)',\n },\n\n '&>.label-elements>:first-child, &>.label-elements>:only-child': {\n fontSize: '14px',\n color: isRegular ? 'var(--center-channel-color)' : 'var(--error-text)',\n },\n '&:hover .label-elements>:first-child, &:hover .label-elements>:only-child': {\n color: isDestructive && 'var(--button-color)',\n },\n\n '&>.trailing-elements': {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'nowrap',\n justifyContent: 'flex-end',\n color: isRegular ? 'rgba(var(--center-channel-color-rgb), 0.75)' : 'var(--error-text)',\n gap: '4px',\n marginInlineStart: '24px',\n fontSize: '12px',\n lineHeight: '16px',\n alignItems: 'center',\n },\n '&:hover .trailing-elements': {\n color: isRegular ? 'rgba(var(--center-channel-color-rgb), 0.75)' : 'var(--button-color)',\n },\n },\n });\n },\n);\n\n/**\n * Use this function to check if the menu item was pressed as per WAI-ARIA guidelines.\n * @param event - The event to check if the menu item was pressed by mouse or keyboard. Either a mouse event or a keyboard event.\n * @returns true if the menu item was pressed by mouse's \"Primary\" key or keyboard's \"Space\" or \"Enter\" key\n **/\nfunction isCorrectKeyPressedOnMenuItem(event: MouseEvent<HTMLLIElement> | KeyboardEvent<HTMLLIElement>) {\n if (event.type === EventTypes.KEY_DOWN) {\n const keyboardEvent = event as KeyboardEvent<HTMLLIElement>;\n if (isKeyPressed(keyboardEvent, Constants.KeyCodes.ENTER) || isKeyPressed(keyboardEvent, Constants.KeyCodes.SPACE)) {\n return true;\n }\n\n return false;\n } else if (event.type === EventTypes.CLICK) {\n const mouseEvent = event as MouseEvent<HTMLLIElement>;\n if (mouseEvent.button === 0) {\n return true;\n }\n\n return false;\n }\n\n return false;\n}\n\nfunction isRoleCheckboxOrRadio(role: AriaRole) {\n return role === 'menuitemcheckbox' || role === 'menuitemradio';\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport MuiMenuList from '@mui/material/MenuList';\nimport type {PopoverOrigin} from '@mui/material/Popover';\nimport React, {\n useState,\n useEffect,\n useMemo,\n useCallback,\n} from 'react';\nimport type {\n ReactNode,\n MouseEvent,\n KeyboardEvent} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {openModal, closeModal} from 'actions/views/modals';\nimport {getIsMobileView} from 'selectors/views/browser';\nimport {isAnyModalOpen} from 'selectors/views/modals';\n\nimport CompassDesignProvider from 'components/compass_design_provider';\n\nimport Constants, {A11yClassNames} from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\n\nimport {SubMenuContext, useMenuContextValue} from './menu_context';\nimport {MenuItem} from './menu_item';\nimport type {Props as MenuItemProps} from './menu_item';\nimport {MuiMenuStyled} from './menu_styled';\n\nimport './sub_menu.scss';\n\ninterface Props {\n id: MenuItemProps['id'];\n leadingElement?: MenuItemProps['leadingElement'];\n labels: MenuItemProps['labels'];\n trailingElements?: MenuItemProps['trailingElements'];\n isDestructive?: MenuItemProps['isDestructive'];\n\n // Menu props\n menuId: string;\n menuAriaLabel?: string;\n forceOpenOnLeft?: boolean; // Most of the times this is not needed, since submenu position is calculated and placed\n\n children: ReactNode;\n}\n\nexport function SubMenu(props: Props) {\n const {\n id,\n leadingElement,\n labels,\n trailingElements,\n isDestructive,\n menuId,\n menuAriaLabel,\n forceOpenOnLeft,\n children,\n ...rest\n } = props;\n\n const [anchorElement, setAnchorElement] = useState<null | HTMLElement>(null);\n const isSubMenuOpen = Boolean(anchorElement);\n\n const isMobileView = useSelector(getIsMobileView);\n const anyModalOpen = useSelector(isAnyModalOpen);\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (anyModalOpen && !isMobileView) {\n setAnchorElement(null);\n }\n }, [anyModalOpen, isMobileView]);\n\n const originOfAnchorAndTransform = useMemo(() => {\n return getOriginOfAnchorAndTransform(forceOpenOnLeft, anchorElement);\n }, [anchorElement, forceOpenOnLeft]);\n\n // Handler function injected in the menu items to close the submenu\n const closeSubMenu = useCallback(() => {\n setAnchorElement(null);\n }, []);\n\n const providerValue = useMenuContextValue(closeSubMenu, Boolean(anchorElement));\n\n const hasSubmenuItems = Boolean(children);\n if (!hasSubmenuItems) {\n return null;\n }\n\n function handleMouseEnter(event: MouseEvent<HTMLLIElement>) {\n event.preventDefault();\n setAnchorElement(event.currentTarget);\n }\n\n function handleMouseLeave(event: MouseEvent<HTMLLIElement>) {\n event.preventDefault();\n setAnchorElement(null);\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLLIElement>) {\n if (\n isKeyPressed(event, Constants.KeyCodes.ENTER) ||\n isKeyPressed(event, Constants.KeyCodes.SPACE) ||\n isKeyPressed(event, Constants.KeyCodes.RIGHT)\n ) {\n event.preventDefault();\n setAnchorElement(event.currentTarget);\n }\n }\n\n function handleSubMenuKeyDown(event: KeyboardEvent<HTMLUListElement>) {\n if (isKeyPressed(event, Constants.KeyCodes.UP) || isKeyPressed(event, Constants.KeyCodes.DOWN)) {\n // Stop the event from propagating upwards since that causes navigation to move by 2 items at a time\n event.stopPropagation();\n } else if (isKeyPressed(event, Constants.KeyCodes.ESCAPE) || isKeyPressed(event, Constants.KeyCodes.LEFT)) {\n event.preventDefault();\n setAnchorElement(null);\n }\n }\n\n // This is used in MobileView to open the submenu in a modal\n function handleOnClick() {\n dispatch(openModal<SubMenuModalProps>({\n modalId: menuId,\n dialogType: SubMenuModal,\n dialogProps: {\n menuId,\n menuAriaLabel,\n children,\n },\n }));\n }\n\n const passedInTriggerButtonProps = {\n id,\n 'aria-controls': menuId,\n 'aria-haspopup': true,\n 'aria-expanded': isSubMenuOpen,\n disableRipple: true,\n leadingElement,\n labels,\n trailingElements,\n isDestructive,\n onClick: isMobileView ? handleOnClick : undefined, // OnClicks on parent menuItem of subMenu is only needed in mobile view\n };\n\n if (isMobileView) {\n return (<MenuItem {...passedInTriggerButtonProps}/>);\n }\n\n return (\n <MenuItem\n {...rest} // pass through other props which might be coming in from the material-ui\n {...passedInTriggerButtonProps}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onKeyDown={handleKeyDown}\n >\n <MuiMenuStyled\n anchorEl={anchorElement}\n open={isSubMenuOpen}\n asSubMenu={true}\n anchorOrigin={originOfAnchorAndTransform.anchorOrigin}\n transformOrigin={originOfAnchorAndTransform.transformOrigin}\n sx={{pointerEvents: 'none'}}\n >\n {/* This component is needed here to re enable pointer events for the submenu items which we had to disable above as */}\n {/* pointer turns to default as soon as it leaves the parent menu */}\n {/* Notice we dont use the below component in menu.tsx */}\n <MuiMenuList\n id={menuId}\n component='ul'\n aria-label={menuAriaLabel}\n className={A11yClassNames.POPUP}\n onKeyDown={handleSubMenuKeyDown}\n sx={{\n pointerEvents: 'auto', // reset pointer events to default from here on\n paddingTop: 0,\n paddingBottom: 0,\n }}\n >\n <SubMenuContext.Provider value={providerValue}>\n {children}\n </SubMenuContext.Provider>\n </MuiMenuList>\n </MuiMenuStyled>\n </MenuItem>\n );\n}\n\ninterface SubMenuModalProps {\n menuId: Props['menuId'];\n menuAriaLabel?: Props['menuAriaLabel'];\n children: Props['children'];\n}\n\nfunction SubMenuModal(props: SubMenuModalProps) {\n const dispatch = useDispatch();\n\n const theme = useSelector(getTheme);\n\n function handleModalClose() {\n dispatch(closeModal(props.menuId));\n }\n\n return (\n <CompassDesignProvider theme={theme}>\n <GenericModal\n id={props.menuId}\n ariaLabel={props.menuAriaLabel}\n onExited={handleModalClose}\n backdrop={true}\n className='menuModal'\n >\n <MuiMenuList\n aria-hidden={true}\n onClick={handleModalClose}\n >\n {props.children}\n </MuiMenuList>\n </GenericModal>\n </CompassDesignProvider>\n );\n}\n\nconst openAtLeft = {\n anchorOrigin: {\n vertical: 'top',\n horizontal: 'left',\n } as PopoverOrigin,\n transformOrigin: {\n vertical: 'top',\n horizontal: 'right',\n } as PopoverOrigin,\n};\n\nconst openAtRight = {\n anchorOrigin: {\n vertical: 'top',\n horizontal: 'right',\n } as PopoverOrigin,\n transformOrigin: {\n vertical: 'top',\n horizontal: 'left',\n } as PopoverOrigin,\n};\n\nfunction getOriginOfAnchorAndTransform(forceOpenOnLeft = false, anchorElement: HTMLElement | null): {anchorOrigin: PopoverOrigin; transformOrigin: PopoverOrigin} {\n if (!anchorElement) {\n return openAtRight;\n }\n\n if (forceOpenOnLeft) {\n return openAtLeft;\n }\n\n if (window && window.innerWidth) {\n const windowWidth = window.innerWidth;\n const anchorElementLeft = anchorElement?.getBoundingClientRect()?.left ?? 0;\n const anchorElementRight = anchorElement?.getBoundingClientRect()?.right ?? 0;\n\n const leftSpace = anchorElementLeft;\n const rightSpace = windowWidth - anchorElementRight;\n\n if (rightSpace < leftSpace) {\n return openAtLeft;\n }\n\n return openAtRight;\n }\n\n return openAtRight;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Divider} from '@mui/material';\nimport React from 'react';\n\n/**\n * A horizontal separator for use in menus.\n * @example\n * <Menu.Container>\n * <Menu.Item>\n * <Menu.Separator />\n * </Menu.Container>\n */\nexport function MenuItemSeparator() {\n return (\n <Divider\n component='li'\n aria-orientation='vertical'\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {getOptionValue} from 'react-select/src/builtins';\n\nimport LoadingScreen from 'components/loading_screen';\n\nimport Constants from 'utils/constants';\nimport {cmdOrCtrlPressed} from 'utils/keyboard';\n\nimport type {Value} from './multiselect';\n\nexport type Props<T extends Value> = {\n ariaLabelRenderer: getOptionValue<T>;\n loading?: boolean;\n onAdd: (value: T) => void;\n onPageChange?: (newPage: number, currentPage: number) => void;\n onSelect: (value: T | null) => void;\n optionRenderer: (\n option: T,\n isSelected: boolean,\n add: (value: T) => void,\n select: (value: T) => void\n ) => void;\n query?: string;\n selectedItemRef?: React.RefObject<HTMLDivElement>;\n options: T[];\n page: number;\n perPage: number;\n customNoOptionsMessage?: React.ReactNode;\n}\n\ntype State = {\n selected: number;\n}\nconst KeyCodes = Constants.KeyCodes;\n\nexport default class MultiSelectList<T extends Value> extends React.PureComponent<Props<T>, State> {\n public static defaultProps = {\n options: [],\n perPage: 50,\n onAction: () => null,\n };\n\n private toSelect = -1;\n private listRef = React.createRef<HTMLDivElement>();\n private selectedItemRef = React.createRef<HTMLDivElement>();\n\n public constructor(props: Props<T>) {\n super(props);\n\n this.state = {\n selected: -1,\n };\n }\n\n public componentDidMount() {\n document.addEventListener('keydown', this.handleArrowPress);\n }\n\n public componentWillUnmount() {\n document.removeEventListener('keydown', this.handleArrowPress);\n }\n\n public componentDidUpdate(_: Props<T>, prevState: State) {\n const options = this.props.options;\n if (options && options.length > 0 && this.state.selected >= 0) {\n this.props.onSelect(options[this.state.selected]);\n }\n\n if (prevState.selected === this.state.selected) {\n return;\n }\n\n const selectRef = this.selectedItemRef.current || this.props.selectedItemRef?.current;\n if (this.listRef.current && selectRef) {\n const elemTop = selectRef.getBoundingClientRect().top;\n const elemBottom = selectRef.getBoundingClientRect().bottom;\n const listTop = this.listRef.current.getBoundingClientRect().top;\n const listBottom = this.listRef.current.getBoundingClientRect().bottom;\n if (elemBottom > listBottom) {\n selectRef.scrollIntoView(false);\n } else if (elemTop < listTop) {\n selectRef.scrollIntoView(true);\n }\n }\n }\n\n // setSelected updates the selected index and is referenced\n // externally by the MultiSelect component.\n public setSelected = (selected: number) => {\n this.setState({selected});\n };\n\n private handleArrowPress = (e: KeyboardEvent) => {\n if (cmdOrCtrlPressed(e) && e.shiftKey) {\n return;\n }\n\n const options = this.props.options;\n if (options.length === 0) {\n return;\n }\n\n let selected;\n switch (e.key) {\n case KeyCodes.DOWN[0]:\n if (this.state.selected === -1) {\n selected = 0;\n break;\n }\n selected = Math.min(this.state.selected + 1, options.length - 1);\n break;\n case KeyCodes.UP[0]:\n if (this.state.selected === -1) {\n selected = 0;\n break;\n }\n selected = Math.max(this.state.selected - 1, 0);\n break;\n default:\n return;\n }\n\n e.preventDefault();\n this.setState({selected});\n this.props.onSelect(options[selected]);\n };\n\n private defaultOptionRenderer = (\n option: T,\n isSelected: boolean,\n add: (value: T) => void,\n select: (value: T) => void,\n ) => {\n let rowSelected = '';\n if (isSelected) {\n rowSelected = 'more-modal__row--selected';\n }\n\n return (\n <div\n ref={isSelected ? this.selectedItemRef : option.value}\n className={rowSelected}\n key={'multiselectoption' + option.value}\n onClick={() => add(option)}\n onMouseEnter={() => select(option)}\n >\n {option.label}\n </div>\n );\n };\n\n private select = (option: T) => {\n const i = this.props.options.indexOf(option);\n if (i !== -1) {\n if (this.state.selected !== i) {\n this.setSelected(i);\n }\n }\n };\n\n public render() {\n const {options, customNoOptionsMessage} = this.props;\n let renderOutput;\n\n if (this.props.loading) {\n renderOutput = (\n <div aria-hidden={true}>\n <LoadingScreen\n position='absolute'\n key='loading'\n />\n </div>\n );\n } else if (options == null || options.length === 0) {\n if (customNoOptionsMessage) {\n renderOutput = customNoOptionsMessage;\n } else {\n renderOutput = (\n <div\n key='no-users-found'\n className='no-channel-message'\n tabIndex={0}\n >\n <p className='primary-message'>\n <FormattedMessage\n id='multiselect.list.notFound'\n defaultMessage='No results found matching <b>{searchQuery}</b>'\n values={{\n searchQuery: this.props.query,\n b: (value: string) => <b>{value}</b>,\n }}\n />\n </p>\n </div>\n );\n }\n } else {\n let renderer: Props<T>['optionRenderer'];\n if (this.props.optionRenderer) {\n renderer = this.props.optionRenderer;\n } else {\n renderer = this.defaultOptionRenderer;\n }\n\n const optionControls = options.map((o, i) => renderer(o, this.state.selected === i, this.props.onAdd, this.select));\n\n const selectedOption = options[this.state.selected];\n const ariaLabel = this.props.ariaLabelRenderer(selectedOption);\n\n renderOutput = (\n <div className='more-modal__list'>\n <div\n className='sr-only'\n aria-live='polite'\n aria-atomic='true'\n >\n {ariaLabel}\n </div>\n <div\n ref={this.listRef}\n id='multiSelectList'\n className='more-modal__options'\n role='presentation'\n aria-hidden={true}\n >\n {optionControls}\n </div>\n </div>\n );\n }\n\n return (\n <div\n className='multi-select__wrapper'\n aria-live='polite'\n >\n {renderOutput}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport type {IntlShape, MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\nimport ReactSelect, {components} from 'react-select';\nimport type {getOptionValue} from 'react-select/src/builtins';\nimport type {InputActionMeta} from 'react-select/src/types';\n\nimport SaveButton from 'components/save_button';\nimport CloseCircleSolidIcon from 'components/widgets/icons/close_circle_solid_icon';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport {Constants, A11yCustomEventTypes} from 'utils/constants';\nimport {formatAsComponent, formatAsString} from 'utils/i18n';\nimport {imageURLForUser, getDisplayName} from 'utils/utils';\n\nimport MultiSelectList from './multiselect_list';\n\nexport type Value = {\n deleteAt?: number;\n display_name?: string;\n id: string;\n label: string;\n scheme_id?: string;\n value: string;\n};\n\nexport type Props<T extends Value> = {\n ariaLabelRenderer: getOptionValue<T>;\n backButtonClick?: () => void;\n backButtonClass?: string;\n backButtonText?: string | MessageDescriptor;\n buttonSubmitLoadingText?: ReactNode | MessageDescriptor;\n buttonSubmitText?: ReactNode | MessageDescriptor;\n handleAdd: (value: T) => void;\n handleDelete: (values: T[]) => void;\n handleInput: (input: string, multiselect: MultiSelect<T>) => void;\n handlePageChange?: (newPage: number, currentPage: number) => void;\n handleSubmit: (value?: T[]) => void;\n intl: IntlShape;\n loading?: boolean;\n saveButtonPosition?: string;\n maxValues?: number;\n noteText?: ReactNode;\n numRemainingText?: ReactNode | MessageDescriptor;\n optionRenderer: (\n option: T,\n isSelected: boolean,\n add: (value: T) => void,\n select: (value: T) => void\n ) => void;\n selectedItemRef?: React.RefObject<HTMLDivElement>;\n options: T[];\n perPage: number;\n placeholderText?: string | MessageDescriptor;\n saving?: boolean;\n submitImmediatelyOn?: (value: T) => boolean;\n totalCount?: number;\n users?: unknown[];\n valueWithImage: boolean;\n valueRenderer?: (props: {data: T}) => any;\n values: T[];\n focusOnLoad?: boolean;\n savingEnabled?: boolean;\n handleCancel?: () => void;\n customNoOptionsMessage?: React.ReactNode;\n}\n\nexport type State = {\n a11yActive: boolean;\n input: string;\n page: number;\n}\n\nconst KeyCodes = Constants.KeyCodes;\n\nexport class MultiSelect<T extends Value> extends React.PureComponent<Props<T>, State> {\n private listRef = React.createRef<MultiSelectList<T>>();\n private reactSelectRef = React.createRef<ReactSelect>();\n private selected: T | null = null;\n\n public static defaultProps = {\n ariaLabelRenderer: defaultAriaLabelRenderer,\n saveButtonPosition: 'top',\n valueWithImage: false,\n focusOnLoad: true,\n savingEnabled: true,\n };\n\n public constructor(props: Props<T>) {\n super(props);\n\n this.state = {\n a11yActive: false,\n page: 0,\n input: '',\n };\n }\n\n public componentDidMount() {\n const inputRef: unknown = this.reactSelectRef.current && this.reactSelectRef.current.select.inputRef;\n\n document.addEventListener<'keydown'>('keydown', this.handleEnterPress);\n if (inputRef && typeof (inputRef as HTMLElement).addEventListener === 'function') {\n (inputRef as HTMLElement).addEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n (inputRef as HTMLElement).addEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n\n if (this.props.focusOnLoad) {\n requestAnimationFrame(() => {\n // known from ternary definition of inputRef\n this.reactSelectRef.current!.focus();\n });\n }\n }\n }\n\n public componentWillUnmount() {\n const inputRef: unknown = this.reactSelectRef.current && this.reactSelectRef.current.select.inputRef;\n\n if (inputRef && typeof (inputRef as HTMLElement).addEventListener === 'function') {\n (inputRef as HTMLElement).removeEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n (inputRef as HTMLElement).removeEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n }\n\n document.removeEventListener('keydown', this.handleEnterPress);\n }\n\n private handleA11yActivateEvent = () => {\n this.setState({a11yActive: true});\n };\n\n private handleA11yDeactivateEvent = () => {\n this.setState({a11yActive: false});\n };\n\n private nextPage = () => {\n if (this.props.handlePageChange) {\n this.props.handlePageChange(this.state.page + 1, this.state.page);\n }\n if (this.listRef.current) {\n this.listRef.current.setSelected(0);\n }\n this.setState({page: this.state.page + 1});\n };\n\n private prevPage = () => {\n if (this.state.page === 0) {\n return;\n }\n\n if (this.props.handlePageChange) {\n this.props.handlePageChange(this.state.page - 1, this.state.page);\n }\n\n if (this.listRef.current) {\n this.listRef.current.setSelected(0);\n }\n this.setState({page: this.state.page - 1});\n };\n\n public resetPaging = () => {\n this.setState({page: 0});\n };\n\n private onSelect = (selected: T | null) => {\n this.selected = selected;\n };\n\n private onAdd = (value: T) => {\n if (this.props.maxValues && this.props.values.length >= this.props.maxValues) {\n return;\n }\n\n for (let i = 0; i < this.props.values.length; i++) {\n if (this.props.values[i].id === value.id) {\n return;\n }\n }\n\n this.props.handleAdd(value);\n this.selected = null;\n\n if (this.reactSelectRef.current) {\n this.reactSelectRef.current.select.handleInputChange(\n {currentTarget: {value: ''}} as React.KeyboardEvent<HTMLInputElement>,\n );\n this.reactSelectRef.current.focus();\n }\n\n const submitImmediatelyOn = this.props.submitImmediatelyOn;\n if (submitImmediatelyOn && submitImmediatelyOn(value)) {\n this.props.handleSubmit([value]);\n }\n };\n\n private onInput = (input: string, change: InputActionMeta) => {\n if (!change) {\n return;\n }\n\n if (change.action === 'input-blur' || change.action === 'menu-close') {\n return;\n }\n\n if (this.state.input === input) {\n return;\n }\n\n this.setState({input});\n\n if (this.listRef.current) {\n if (input === '') {\n this.listRef.current.setSelected(-1);\n } else {\n this.listRef.current.setSelected(0);\n }\n }\n this.selected = null;\n\n this.props.handleInput(input, this);\n };\n\n private onInputKeyDown = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case KeyCodes.ENTER[0]:\n e.preventDefault();\n break;\n }\n };\n\n private handleEnterPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case KeyCodes.ENTER[0]:\n if (this.selected == null) {\n this.props.handleSubmit();\n return;\n }\n this.onAdd(this.selected);\n break;\n }\n };\n\n private handleOnClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n this.props.handleSubmit();\n };\n\n private onChange: ReactSelect['onChange'] = (_, change) => {\n if (change.action !== 'remove-value' && change.action !== 'pop-value') {\n return;\n }\n\n const values = [...this.props.values];\n for (let i = 0; i < values.length; i++) {\n // Types of ReactSelect do not match the behavior here,\n if (values[i].id === (change as any).removedValue.id) {\n values.splice(i, 1);\n break;\n }\n }\n\n this.props.handleDelete(values);\n };\n\n MultiValueRemove = ({children, innerProps}: any) => (\n <div {...innerProps}>\n {children || <CloseCircleSolidIcon/>}\n </div>\n );\n\n formatOptionLabel = (user: any) => {\n const profileImg = imageURLForUser(user.id, user.last_picture_update);\n\n return (\n <>\n <Avatar\n size='sm'\n username={user.username}\n url={profileImg}\n />\n <div className='react-select__value__name'>\n {getDisplayName(user)}\n </div>\n </>\n );\n };\n\n valueRenderer = (props: any) => {\n return this.props.valueWithImage ? <components.MultiValueLabel {...props}/> : this.props.valueRenderer;\n };\n\n public render() {\n const options = Object.assign([...this.props.options]);\n const {totalCount, users, values} = this.props;\n\n let numRemainingText;\n if (this.props.numRemainingText) {\n numRemainingText = formatAsComponent(this.props.numRemainingText);\n } else if (this.props.maxValues != null && this.props.maxValues !== undefined) {\n numRemainingText = (\n <FormattedMessage\n id='multiselect.numRemaining'\n defaultMessage='Up to {max, number} can be added at a time. You have {num, number} remaining.'\n values={{\n max: this.props.maxValues,\n num: this.props.maxValues - this.props.values.length,\n }}\n />\n );\n }\n\n let buttonSubmitText: ReactNode;\n if (this.props.buttonSubmitText) {\n buttonSubmitText = formatAsComponent(this.props.buttonSubmitText);\n } else if (this.props.maxValues != null) {\n buttonSubmitText = (\n <FormattedMessage\n id='multiselect.go'\n defaultMessage='Go'\n />\n );\n }\n\n let backButtonText: ReactNode;\n if (this.props.backButtonText) {\n backButtonText = formatAsComponent(this.props.backButtonText);\n } else {\n backButtonText = (\n <FormattedMessage\n id='multiselect.backButton'\n defaultMessage='Back'\n />\n );\n }\n\n let optionsToDisplay = [];\n let nextButton;\n let previousButton;\n let noteTextContainer;\n\n if (this.props.noteText) {\n noteTextContainer = (\n <div className='multi-select__note'>\n <div className='note__icon'>\n <i\n className='fa fa-info'\n title={this.props.intl.formatMessage({id: 'generic_icons.info', defaultMessage: 'Info Icon'})}\n />\n </div>\n <div>{this.props.noteText}</div>\n </div>\n );\n }\n\n const valueMap: Record<string, boolean> = {};\n for (let i = 0; i < values.length; i++) {\n valueMap[values[i].id] = true;\n }\n\n for (let i = options.length - 1; i >= 0; i--) {\n if (valueMap[options[i].id]) {\n options.splice(i, 1);\n }\n }\n\n if (options && options.length > this.props.perPage) {\n const pageStart = this.state.page * this.props.perPage;\n const pageEnd = pageStart + this.props.perPage;\n optionsToDisplay = options.slice(pageStart, pageEnd);\n if (!this.props.loading) {\n if (options.length > pageEnd) {\n nextButton = (\n <button\n className='btn btn-sm btn-tertiary filter-control filter-control__next'\n onClick={this.nextPage}\n >\n <FormattedMessage\n id='filtered_user_list.next'\n defaultMessage='Next'\n />\n </button>\n );\n }\n\n if (this.state.page > 0) {\n previousButton = (\n <button\n className='btn btn-sm btn-tertiary filter-control filter-control__prev'\n onClick={this.prevPage}\n >\n <FormattedMessage\n id='filtered_user_list.prev'\n defaultMessage='Previous'\n />\n </button>\n );\n }\n }\n } else {\n optionsToDisplay = options;\n }\n\n let multiSelectList;\n\n if (this.props.saveButtonPosition === 'bottom') {\n if (this.state.input) {\n multiSelectList = (\n <MultiSelectList\n ref={this.listRef}\n options={optionsToDisplay}\n optionRenderer={this.props.optionRenderer}\n ariaLabelRenderer={this.props.ariaLabelRenderer}\n page={this.state.page}\n perPage={this.props.perPage}\n onPageChange={this.props.handlePageChange}\n onAdd={this.onAdd}\n onSelect={this.onSelect}\n loading={this.props.loading}\n query={this.state.input}\n selectedItemRef={this.props.selectedItemRef}\n customNoOptionsMessage={this.props.customNoOptionsMessage || undefined}\n />\n );\n }\n } else {\n multiSelectList = (\n <MultiSelectList\n ref={this.listRef}\n options={optionsToDisplay}\n optionRenderer={this.props.optionRenderer}\n ariaLabelRenderer={this.props.ariaLabelRenderer}\n page={this.state.page}\n perPage={this.props.perPage}\n onPageChange={this.props.handlePageChange}\n onAdd={this.onAdd}\n onSelect={this.onSelect}\n loading={this.props.loading}\n query={this.state.input}\n selectedItemRef={this.props.selectedItemRef}\n customNoOptionsMessage={this.props.customNoOptionsMessage || undefined}\n />\n );\n }\n\n let memberCount;\n if (users && users.length && totalCount) {\n memberCount = (\n <FormattedMessage\n id='multiselect.numMembers'\n defaultMessage='{memberOptions, number} of {totalCount, number} members'\n values={{\n memberOptions: optionsToDisplay.length,\n totalCount: this.props.totalCount,\n }}\n />\n );\n }\n\n return (\n <>\n <div className='filtered-user-list'>\n <div className='filter-row filter-row--full'>\n <div className='multi-select__container react-select'>\n <ReactSelect\n id='selectItems'\n ref={this.reactSelectRef as React.RefObject<any>} // type of ref on @types/react-select is outdated\n isMulti={true}\n options={this.props.options}\n styles={styles}\n components={{\n Menu: nullComponent,\n IndicatorsContainer: nullComponent,\n MultiValueLabel: this.props.valueWithImage ? components.MultiValueLabel : paddedComponent(this.props.valueRenderer),\n MultiValueRemove: this.props.valueWithImage ? this.MultiValueRemove : components.MultiValueRemove,\n }}\n isClearable={false}\n openMenuOnFocus={false}\n menuIsOpen={false}\n onInputChange={this.onInput}\n onKeyDown={this.onInputKeyDown as React.KeyboardEventHandler}\n onChange={this.onChange}\n value={this.props.values}\n formatOptionLabel={this.props.valueWithImage ? this.formatOptionLabel : undefined}\n placeholder={formatAsString(this.props.intl.formatMessage, this.props.placeholderText)}\n inputValue={this.state.input}\n getOptionValue={(option: Value) => option.id}\n getOptionLabel={this.props.ariaLabelRenderer}\n aria-label={formatAsString(this.props.intl.formatMessage, this.props.placeholderText)}\n className={this.state.a11yActive ? 'multi-select__focused' : ''}\n classNamePrefix='react-select-auto react-select'\n />\n {this.props.saveButtonPosition === 'top' &&\n <SaveButton\n id='saveItems'\n saving={this.props.saving}\n disabled={this.props.saving}\n onClick={this.handleOnClick}\n defaultMessage={buttonSubmitText}\n savingMessage={formatAsComponent(this.props.buttonSubmitLoadingText)}\n />\n }\n </div>\n <div\n id='multiSelectHelpMemberInfo'\n className='multi-select__help'\n >\n {numRemainingText}\n {memberCount}\n </div>\n </div>\n {multiSelectList}\n <div\n id='multiSelectMessageNote'\n className='multi-select__help'\n >\n {noteTextContainer}\n </div>\n {this.props.saveButtonPosition === 'top' &&\n <div className='filter-controls'>\n {previousButton}\n {nextButton}\n </div>\n }\n </div>\n {this.props.saveButtonPosition === 'bottom' &&\n <div className='multi-select__footer modal-footer'>\n {\n this.props.backButtonClick &&\n <button\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (this.props.backButtonClick) {\n this.props.backButtonClick();\n }\n }}\n className={classNames('btn btn-tertiary', this.props.backButtonClass)}\n >\n {backButtonText}\n </button>\n }\n <SaveButton\n id='saveItems'\n saving={this.props.saving}\n disabled={this.props.saving || !this.props.savingEnabled}\n onClick={this.handleOnClick}\n defaultMessage={buttonSubmitText}\n savingMessage={formatAsComponent(this.props.buttonSubmitLoadingText)}\n />\n </div>\n }\n </>\n );\n }\n}\n\nfunction defaultAriaLabelRenderer(option: Value) {\n if (!option) {\n return null;\n }\n return option.label;\n}\n\nconst nullComponent = () => null;\n\nconst paddedComponent = (WrappedComponent: any) => {\n return (props: {data: any}) => {\n return (\n <div className='react-select__padded-component'>\n <WrappedComponent {...props}/>\n </div>\n );\n };\n};\n\nconst styles = {\n container: () => {\n return {\n display: 'flex',\n overflow: 'hidden',\n flex: 'auto',\n };\n },\n};\n\nexport default MultiSelect;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport function SearchSVG(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='123'\n height='99'\n viewBox='0 0 123 99'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.search', defaultMessage: 'Search Icon'})}\n >\n <g clipPath='url(#clip0_4212_116720)'>\n <rect\n x='0.255005'\n y='32'\n width='107'\n height='31'\n rx='3.75'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <rect\n x='46.255'\n width='76'\n height='27'\n rx='3.75'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <rect\n x='46.255'\n y='67'\n width='76'\n height='27'\n rx='3.75'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <path\n d='M62.5814 6.60593C70.262 6.55738 77.3232 8.54646 83.755 12.5732C86.3956 14.2264 88.9301 16.223 91.3579 18.5631C94.3589 21.6787 96.7911 24.9905 98.653 28.5M62.5813 87.8542C53.6129 87.7863 45.4964 85.1063 38.255 79.7911C36.7377 78.6774 35.2587 77.4479 33.8185 76.1025C30.0784 72.0903 27.2249 67.8234 25.255 63.299M21.9572 47.2301C21.964 41.8688 22.9467 36.7921 24.9051 32C26.8843 27.1573 29.8599 22.6053 33.8322 18.3439M101.949 37C102.786 40.2642 103.206 43.6739 103.206 47.2301C103.2 51.5308 102.585 55.6211 101.358 59.5M100.495 32.5C100.769 33.1979 101.022 33.903 101.255 34.6153'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n />\n <path\n d='M82.6551 5.72396C90.4991 9.4225 96.7179 14.8934 101.302 22.1318C103.184 25.1036 104.79 28.3733 106.12 31.9406'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n />\n <rect\n x='89.8878'\n y='69.3516'\n width='33.9752'\n height='7.45395'\n rx='1'\n transform='rotate(45 89.8878 69.3516)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <rect\n x='89.8878'\n y='70.0587'\n width='32.9752'\n height='6.45395'\n rx='0.5'\n transform='rotate(45 89.8878 70.0587)'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <path\n d='M62.5706 11.2232C72.1732 11.1625 80.6832 14.6952 88.0764 21.8213C95.0689 29.0809 98.5773 37.5423 98.5773 47.2299C98.5652 56.9053 95.0689 65.3789 88.0764 72.6385C80.6832 79.7646 72.1975 83.2973 62.5706 83.2366C52.9559 83.1637 44.4459 79.7039 37.077 72.8206C30.0724 65.3061 26.5761 56.7839 26.564 47.2299C26.5761 37.6759 30.0845 29.1416 37.0892 21.627C44.4702 14.7559 52.968 11.2839 62.5706 11.2232Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M62.5738 11.7232C72.0335 11.6634 80.418 15.1368 87.7227 22.1748C94.6257 29.3444 98.0773 37.6809 98.0773 47.2299C98.0652 56.7673 94.6251 65.1159 87.7228 72.2849C80.418 79.323 72.0576 82.7964 62.5738 82.7366C53.0959 82.6646 44.7093 79.2606 37.431 72.467C30.5135 65.0406 27.0759 56.6419 27.064 47.2294C27.0762 37.8176 30.5255 29.4072 37.4428 21.9809C44.7342 15.1984 53.109 11.783 62.5738 11.7232Z'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M88.076 21.8213C80.6829 14.6952 72.1729 11.1625 62.5703 11.2232C52.9677 11.2839 44.4698 14.7559 37.0888 21.627C30.0841 29.1416 26.5757 37.6759 26.5636 47.2299C26.5757 56.7839 30.072 65.3061 37.0767 72.8206C44.4455 79.7039 52.9555 83.1638 62.5703 83.2366C72.1971 83.2973 80.6829 79.7646 88.076 72.6385C95.0685 65.3789 98.5648 56.9053 98.577 47.2299C98.577 37.5423 95.0685 29.0809 88.076 21.8213ZM84.5637 25.3086C78.1852 19.1606 70.8432 16.1128 62.5586 16.1652C54.274 16.2175 46.9424 19.213 40.5745 25.1411C34.5312 31.6242 31.5043 38.9872 31.4939 47.2299C31.5043 55.4726 34.5207 62.8251 40.564 69.3083C46.9215 75.2468 54.2635 78.2318 62.5586 78.2947C70.8642 78.347 78.1852 75.2992 84.5637 69.1512C90.5965 62.888 93.6129 55.5774 93.6233 47.2299C93.6233 38.872 90.5965 31.5719 84.5637 25.3086Z'\n fill='var(--center-channel-bg)'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M88.076 21.8213C80.6828 14.6952 72.1728 11.1625 62.5702 11.2232C52.9676 11.2839 44.4697 14.7559 37.0887 21.627C30.0841 29.1416 26.5757 37.6759 26.5635 47.2299C26.5757 56.7839 30.0719 65.3061 37.0766 72.8206C44.4455 79.7039 52.9555 83.1638 62.5702 83.2366C72.1971 83.2973 80.6828 79.7646 88.076 72.6385C95.0685 65.3789 98.5648 56.9053 98.5769 47.2299C98.5769 37.5423 95.0685 29.0809 88.076 21.8213ZM84.5636 25.3086C78.1852 19.1606 70.8432 16.1128 62.5585 16.1652C54.2739 16.2175 46.9424 19.213 40.5744 25.1411C34.5312 31.6242 31.5043 38.9872 31.4938 47.2299C31.5043 55.4726 34.5207 62.8251 40.564 69.3083C46.9214 75.2468 54.2634 78.2318 62.5585 78.2947C70.8641 78.347 78.1852 75.2992 84.5636 69.1512C90.5964 62.888 93.6128 55.5774 93.6233 47.2299C93.6233 38.872 90.5964 31.5719 84.5636 25.3086Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.8'\n />\n <path\n d='M62.5736 11.7232C72.0333 11.6634 80.4179 15.1369 87.7225 22.1748C94.6255 29.3444 98.0771 37.681 98.0771 47.2299C98.065 56.7674 94.625 65.1159 87.7226 72.2849C80.4178 79.3231 72.0575 82.7964 62.5736 82.7366C53.0957 82.6647 44.7092 79.2607 37.4308 72.4671C30.5133 65.0407 27.0758 56.642 27.0638 47.2294C27.076 37.8176 30.5254 29.4072 37.4426 21.9809C44.734 15.1984 53.1088 11.783 62.5736 11.7232Z'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <circle\n cx='51.255'\n cy='36'\n r='9'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M43.255 56H85.255'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n />\n <path\n d='M43.255 63H65.255'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n />\n <path\n d='M43.255 50H60.255'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n />\n <path\n d='M65.255 50H80.255'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n />\n </g>\n <defs>\n <clipPath id='clip0_4212_116720'>\n <rect\n width='122'\n height='99'\n fill='white'\n transform='translate(0.255005)'\n />\n </clipPath>\n </defs>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport function ChannelSearchSVG(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='128'\n height='101'\n viewBox='0 0 128 101'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.channel_search', defaultMessage: 'Channel Search Icon'})}\n >\n <g clipPath='url(#clip0_4210_70026)'>\n <path\n opacity='0.4'\n d='M110.046 91.1199L120.002 101V50C120.002 48.8954 119.107 48 118.002 48H70.002C68.8974 48 68.002 48.8954 68.002 50V88.5395C68.002 89.644 68.8974 90.5395 70.002 90.5395H108.637C109.165 90.5395 109.672 90.7481 110.046 91.1199Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M110.046 91.1199L120.002 101V50C120.002 48.8954 119.107 48 118.002 48H70.002C68.8974 48 68.002 48.8954 68.002 50V88.5395C68.002 89.644 68.8974 90.5395 70.002 90.5395H108.637C109.165 90.5395 109.672 90.7481 110.046 91.1199Z'\n fill='var(--button-bg)'\n fillOpacity='0.12'\n />\n <path\n d='M5.50196 18L5.50195 33L94.002 33'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M3.00201 94L13.502 83.5L13.502 44.5L34.502 44.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M21.502 70.5L21.502 56.5L95.5 56.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 8.74228e-08 8.74228e-08 -1 3.00195 18)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 8.74228e-08 8.74228e-08 -1 19.002 74)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <path\n d='M47.6069 78.5638L34.002 92V23C34.002 21.8954 34.8974 21 36.002 21H102.002C103.107 21 104.002 21.8954 104.002 23V75.9868C104.002 77.0914 103.107 77.9868 102.002 77.9868H49.0123C48.4862 77.9868 47.9812 78.1941 47.6069 78.5638Z'\n fill='#28427B'\n />\n <path\n d='M42.6069 73.5638L29.002 87V18C29.002 16.8954 29.8974 16 31.002 16H97.002C98.1065 16 99.002 16.8954 99.002 18V70.9868C99.002 72.0914 98.1065 72.9868 97.002 72.9868H44.0123C43.4862 72.9868 42.9812 73.1941 42.6069 73.5638Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M42.2556 73.2081L29.502 85.8035V18C29.502 17.1716 30.1735 16.5 31.002 16.5H97.002C97.8304 16.5 98.502 17.1716 98.502 18V70.9868C98.502 71.8153 97.8304 72.4868 97.002 72.4868H44.0123C43.3546 72.4868 42.7235 72.746 42.2556 73.2081Z'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <circle\n cx='47.002'\n cy='35'\n r='9'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M62.002 31H78.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M39.002 55H72.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M39.002 62H61.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M62.002 37H87.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M39.002 49H56.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M60.002 49H78.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <circle\n cx='17.8576'\n cy='17.8576'\n r='17.8576'\n transform='matrix(-1 0 0 1 123.717 0)'\n fill='var(--center-channel-bg)'\n />\n <circle\n cx='17.8576'\n cy='17.8576'\n r='17.1433'\n transform='matrix(-1 0 0 1 123.717 0)'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeWidth='1.42861'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <circle\n cx='17.8576'\n cy='17.8576'\n r='17.1433'\n transform='matrix(-1 0 0 1 123.717 0)'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeWidth='1.42861'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M93.002 19C93.002 25.6274 98.3745 31 105.002 31'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeWidth='1.42861'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <line\n x1='0.714303'\n y1='-0.714303'\n x2='15.1722'\n y2='-0.714303'\n transform='matrix(0.707107 0.707107 0.707107 -0.707107 116.769 30.6265)'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeWidth='1.42861'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M127.002 44.5V62H89.502'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M86.002 62H76.002'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <path\n d='M73.002 62H67.002'\n stroke='var(--center-channel-color)'\n strokeLinecap='round'\n />\n <circle\n cx='2.50195'\n cy='94.5'\n r='2.5'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n </g>\n <defs>\n <clipPath id='clip0_4210_70026'>\n <rect\n width='128'\n height='101'\n fill='white'\n transform='translate(0.00195312)'\n />\n </clipPath>\n </defs>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport function MentionsSVG(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='97'\n height='87'\n viewBox='0 0 97 87'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n aria-label={formatMessage({id: 'generic_icons.mention', defaultMessage: 'Mention Icon'})}\n >\n <path\n d='M3.00001 35L3.00001 56L15 56'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M3 31L3 25'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M3 22L3 20'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n opacity='0.16'\n d='M81.8691 78.899L90 87V45C90 43.8954 89.1046 43 88 43H49C47.8954 43 47 43.8954 47 45V76.3158C47 77.4204 47.8954 78.3158 49 78.3158H80.4575C80.9867 78.3158 81.4943 78.5255 81.8691 78.899Z'\n fill='var(--button-bg)'\n />\n <path\n d='M65.7695 65.5385H73.4618'\n stroke='var(--center-channel-bg)'\n strokeLinecap='round'\n />\n <path\n d='M23.605 67.5638L10 81V12C10 10.8954 10.8954 10 12 10H78C79.1046 10 80 10.8954 80 12V64.9868C80 66.0914 79.1046 66.9868 78 66.9868H25.0103C24.4842 66.9868 23.9793 67.1941 23.605 67.5638Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M23.2536 67.2081L10.5 79.8035V12C10.5 11.1716 11.1716 10.5 12 10.5H78C78.8284 10.5 79.5 11.1716 79.5 12V64.9868C79.5 65.8153 78.8284 66.4868 78 66.4868H25.0103C24.3527 66.4868 23.7215 66.746 23.2536 67.2081Z'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <circle\n cx='28'\n cy='29'\n r='9'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M43 25H59'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M20 49H53'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M20 56H42'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M43 31H68'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M20 43H37'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M41 43H59'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <circle\n cx='78'\n cy='19'\n r='19'\n fill='#32539A'\n />\n <path\n d='M73 49L94 49L94 37'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M69 49L63 49'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M60 49L58 49'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <circle\n cx='77.9922'\n cy='19'\n r='5'\n stroke='var(--button-color)'\n />\n <path\n d='M82.9922 19C82.9922 19.1667 82.9922 19.8 82.9922 21C82.9922 22.2 83.9922 24 85.4922 24C86.9922 24 87.9922 23 87.9922 19'\n stroke='var(--button-color)'\n strokeLinecap='round'\n />\n <path\n d='M87.9922 19C87.9922 13.4772 83.515 9 77.9922 9C72.4693 9 67.9922 13.4772 67.9922 19C67.9922 24.5228 72.4693 29 77.9922 29C79.4144 29 80.7673 28.7031 81.9922 28.1679'\n stroke='var(--button-color)'\n strokeLinecap='round'\n />\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport function SavedMessagesSVG(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='97'\n height='87'\n viewBox='0 0 97 87'\n fill='none'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.flag', defaultMessage: 'Flag Icon'})}\n >\n <g clipPath='url(#clip0_4210_81120)'>\n <path\n d='M3.00391 35L3.00392 56L15.0039 56'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M3.00391 31L3.00391 25'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M3.00391 22L3.00391 20'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n opacity='0.16'\n d='M81.873 78.899L90.0039 87V45C90.0039 43.8954 89.1085 43 88.0039 43H49.0039C47.8993 43 47.0039 43.8954 47.0039 45V76.3158C47.0039 77.4204 47.8993 78.3158 49.0039 78.3158H80.4614C80.9906 78.3158 81.4982 78.5255 81.873 78.899Z'\n fill='var(--button-bg)'\n />\n <path\n d='M65.7734 65.5385H73.4657'\n stroke='var(--center-channel-bg)'\n strokeLinecap='round'\n />\n <path\n d='M23.6089 67.5638L10.0039 81V12C10.0039 10.8954 10.8993 10 12.0039 10H78.0039C79.1085 10 80.0039 10.8954 80.0039 12V64.9868C80.0039 66.0914 79.1085 66.9868 78.0039 66.9868H25.0142C24.4881 66.9868 23.9832 67.1941 23.6089 67.5638Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M23.2575 67.2081L10.5039 79.8035V12C10.5039 11.1716 11.1755 10.5 12.0039 10.5H78.0039C78.8323 10.5 79.5039 11.1716 79.5039 12V64.9868C79.5039 65.8153 78.8323 66.4868 78.0039 66.4868H25.0142C24.3566 66.4868 23.7254 66.746 23.2575 67.2081Z'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <circle\n cx='28.0039'\n cy='29'\n r='9'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M43.0039 25H59.0039'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M20.0039 49H53.0039'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M20.0039 56H42.0039'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M43.0039 31H68.0039'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M20.0039 43H37.0039'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M41.0039 43H59.0039'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <circle\n cx='78.0039'\n cy='19'\n r='19'\n fill='#32539A'\n />\n <path\n d='M70.9922 12V27L77.9922 24L84.9922 27V12C84.9922 10.8954 84.0968 10 82.9922 10H72.9922C71.8876 10 70.9922 10.8954 70.9922 12Z'\n stroke='var(--button-color)'\n />\n <path\n d='M73.0039 49L94.0039 49L94.0039 37'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M69.0039 49L63.0039 49'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M60.0039 49L58.0039 49'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </g>\n <defs>\n <clipPath id='clip0_4210_81120'>\n <rect\n width='97'\n height='87'\n fill='white'\n transform='translate(0.00390625)'\n />\n </clipPath>\n </defs>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport function PinSVG(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n\n return (\n <span {...props}>\n <svg\n width='97'\n height='87'\n viewBox='0 0 97 87'\n version='1.1'\n role='img'\n\n //fill='none'\n xmlns='http://www.w3.org/2000/svg'\n aria-label={formatMessage({id: 'generic_icons.pin', defaultMessage: 'Pin Icon'})}\n >\n\n <g clipPath='url(#clip0_4210_84719)'>\n <path\n d='M3.00196 35L3.00197 56L15.002 56'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M3.00195 31L3.00195 25'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M3.00195 22L3.00195 20'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n opacity='0.16'\n d='M81.8711 78.899L90.002 87V45C90.002 43.8954 89.1065 43 88.002 43H49.002C47.8974 43 47.002 43.8954 47.002 45V76.3158C47.002 77.4204 47.8974 78.3158 49.002 78.3158H80.4595C80.9886 78.3158 81.4962 78.5255 81.8711 78.899Z'\n fill='var(--button-bg)'\n />\n <path\n d='M65.7715 65.5385H73.4638'\n stroke='var(--center-channel-bg)'\n strokeLinecap='round'\n />\n <path\n d='M23.6069 67.5638L10.002 81V12C10.002 10.8954 10.8974 10 12.002 10H78.002C79.1065 10 80.002 10.8954 80.002 12V64.9868C80.002 66.0914 79.1065 66.9868 78.002 66.9868H25.0123C24.4862 66.9868 23.9812 67.1941 23.6069 67.5638Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M23.2556 67.2081L10.502 79.8035V12C10.502 11.1716 11.1735 10.5 12.002 10.5H78.002C78.8304 10.5 79.502 11.1716 79.502 12V64.9868C79.502 65.8153 78.8304 66.4868 78.002 66.4868H25.0123C24.3546 66.4868 23.7235 66.746 23.2556 67.2081Z'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <circle\n cx='28.002'\n cy='29'\n r='9'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M43.002 25H59.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M20.002 49H53.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M20.002 56H42.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M43.002 31H68.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M20.002 43H37.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M41.002 43H59.002'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <circle\n cx='78.002'\n cy='19'\n r='19'\n fill='#32539A'\n />\n <path\n d='M79.9922 9L87.9922 17'\n stroke='var(--button-color)'\n strokeLinecap='round'\n />\n <path\n d='M80.4922 27.5L69.4922 16.5C69.4922 16.5 72.4922 15 74.9922 16L80.9922 10L86.9922 16L80.9922 22C81.9922 24.5 80.4922 27.5 80.4922 27.5Z'\n stroke='var(--button-color)'\n strokeLinecap='round'\n />\n <path\n d='M74.9922 22L69.9922 27'\n stroke='var(--button-color)'\n strokeLinecap='round'\n />\n <path\n d='M73.002 49L94.002 49L94.002 37'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M69.002 49L63.002 49'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M60.002 49L58.002 49'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </g>\n <defs>\n <clipPath id='clip0_4210_84719'>\n <rect\n width='97'\n height='87'\n fill='white'\n transform='translate(0.00195312)'\n />\n </clipPath>\n </defs>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport function ChannelFilesSVG(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='132'\n height='108'\n viewBox='0 0 132 108'\n fill='none'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.channel_files', defaultMessage: 'Channel Files Icon'})}\n >\n <rect\n x='1'\n y='51'\n width='131'\n height='35'\n rx='2'\n fill='var(--center-channel-bg)'\n />\n <rect\n opacity='0.12'\n x='1'\n y='51'\n width='131'\n height='35'\n rx='2'\n fill='var(--button-bg)'\n />\n <path\n d='M11.5 44.5L11.5 91.5H100'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <path\n d='M14 20.5L19.5 26V80H40.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.32'\n strokeLinecap='round'\n />\n <rect\n x='34'\n y='26'\n width='67'\n height='82'\n rx='2'\n fill='#28427B'\n />\n <rect\n x='27'\n y='13'\n width='70.3182'\n height='91'\n rx='2'\n fill='var(--center-channel-bg)'\n />\n <rect\n x='27.5'\n y='13.5'\n width='69.3182'\n height='90'\n rx='1.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n />\n <path\n d='M37 22H49'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M36 68H69'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M36 86H75'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M37 27H59'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M36 74H87'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M36 92H87'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M37 33H46'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M36 80H55'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M48 33H57'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <path\n d='M60 80H72'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeLinecap='round'\n />\n <rect\n x='57'\n y='43'\n width='30'\n height='16'\n rx='1'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <g clipPath='url(#clip0_4210_65740)'>\n <path\n d='M44.0003 51.0001L51.867 52.4611C52.665 48.1187 49.7882 43.9429 45.4448 43.1362C41.0993 42.3295 36.9296 45.1946 36.1337 49.5391C35.3357 53.8815 38.2125 58.0572 42.5559 58.8639C43.869 59.1078 45.166 59.0163 46.3599 58.6485L44.0003 51.0001Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M46.3599 58.6485L51.867 52.4611C52.665 48.1187 49.7882 43.9429 45.4448 43.1362C41.0993 42.3295 36.9316 45.1946 36.1337 49.5391C35.3357 53.8815 38.2125 58.0572 42.5559 58.8639C43.869 59.1078 45.166 59.0163 46.3599 58.6485Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.32'\n />\n <path\n d='M46.3596 58.6485C49.1131 57.8011 51.3111 55.4907 51.8667 52.461L44 51L46.3596 58.6485Z'\n fill='#28427B'\n />\n <path\n d='M46.62 53.7927C48.1539 52.3373 48.2244 49.9066 46.7774 48.3638C45.3304 46.8209 42.9139 46.75 41.3799 48.2055C39.846 49.6609 39.7756 52.0916 41.2226 53.6344C42.6696 55.1773 45.0861 55.2482 46.62 53.7927Z'\n fill='var(--center-channel-bg)'\n />\n </g>\n <circle\n cx='17.8576'\n cy='17.8576'\n r='17.8576'\n transform='matrix(-1 0 0 1 115.715 0)'\n fill='var(--center-channel-bg)'\n />\n <circle\n cx='17.8576'\n cy='17.8576'\n r='17.1433'\n transform='matrix(-1 0 0 1 115.715 0)'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeWidth='1.42861'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <circle\n cx='17.8576'\n cy='17.8576'\n r='17.1433'\n transform='matrix(-1 0 0 1 115.715 0)'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeWidth='1.42861'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M85 19C85 25.6274 90.3726 31 97 31'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n strokeWidth='1.42861'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <line\n x1='0.714303'\n y1='-0.714303'\n x2='15.1722'\n y2='-0.714303'\n transform='matrix(0.707107 0.707107 0.707107 -0.707107 108.768 30.6265)'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeWidth='1.42861'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <circle\n cx='11.5'\n cy='42.5'\n r='2.5'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <circle\n cx='2.5'\n cy='2.5'\n r='2.5'\n transform='matrix(1 0 0 -1 10 21)'\n fill='var(--center-channel-color)'\n fillOpacity='0.48'\n />\n <path\n d='M119 46.5V68H91.5'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n <path\n d='M88 68H82'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n />\n <path\n d='M79 68H73'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.8'\n strokeLinecap='round'\n />\n <defs>\n <clipPath id='clip0_4210_65740'>\n <rect\n width='16'\n height='16'\n fill='var(--center-channel-bg)'\n transform='translate(36 43)'\n />\n </clipPath>\n </defs>\n </svg>\n\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport function UserGroupsSVG(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='160'\n height='99'\n viewBox='0 0 160 99'\n fill='none'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.user_groups', defaultMessage: 'User Groups Icon'})}\n >\n <g clipPath='url(#clip0_4220_135496)'>\n <path\n d='M155.129 33.2068C155.129 49.338 141.997 62.4137 125.798 62.4137C116.614 62.4137 108.414 58.2106 103.037 51.6292C98.9293 46.6029 96.4679 40.1917 96.4679 33.2068C96.4679 17.0757 109.6 4 125.798 4C141.997 4 155.129 17.0757 155.129 33.2068Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M155.129 33.2068C155.129 49.338 141.997 62.4137 125.798 62.4137C116.614 62.4137 108.414 58.2106 103.037 51.6292C98.9293 46.6029 96.4679 40.1917 96.4679 33.2068C96.4679 17.0757 109.6 4 125.798 4C141.997 4 155.129 17.0757 155.129 33.2068Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <mask\n id='mask0_4220_135496'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='96'\n y='4'\n width='60'\n height='59'\n >\n <path\n d='M155.129 33.2068C155.129 49.338 141.997 62.4137 125.798 62.4137C116.614 62.4137 108.414 58.2106 103.037 51.6292C98.9293 46.6029 96.4679 40.1917 96.4679 33.2068C96.4679 17.0757 109.6 4 125.798 4C141.997 4 155.129 17.0757 155.129 33.2068Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask0_4220_135496)'>\n <path\n d='M141.063 51.3515L139.916 28.4265C139.429 18.6883 133.256 11.1166 125.804 11.1166C118.351 11.1166 112.178 18.6883 111.691 28.4265L110.544 51.3515H141.063Z'\n fill='#090A0B'\n />\n <path\n d='M147.922 52.088C146.836 48.329 143.796 45.4538 139.983 44.5751L131.917 42.7173H119.689L111.623 44.5751C107.808 45.4538 104.77 48.329 103.684 52.088L100.606 68.3442H151L147.922 52.088Z'\n fill='var(--center-channel-bg)'\n />\n <path\n opacity='0.24'\n d='M147.922 52.088C146.836 48.329 143.796 45.4538 139.983 44.5751L131.917 42.7173H119.689L111.623 44.5751C107.808 45.4538 104.77 48.329 103.684 52.088L100.606 68.3442H151L147.922 52.088Z'\n fill='var(--button-bg)'\n />\n <path\n d='M131.1 43.0557L129.446 37.3966H122.186L120.843 43.0557C123.773 44.6276 128.169 44.6276 131.1 43.0557Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M131.1 43.0557L129.446 37.3966H122.186L120.843 43.0557C123.773 44.6276 128.169 44.6276 131.1 43.0557Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M136.181 25.7253C137.199 25.4367 137.245 27.0273 136.86 28.6774C136.507 30.1811 136.181 32.6383 135.122 32.0418C133.846 35.5824 131.518 38.2746 128.703 39.3405C127.829 39.7414 126.9 39.9608 125.937 39.9608C124.697 39.9608 123.514 39.5972 122.431 38.9506C120 37.6932 118.01 35.1897 116.871 32.0037C115.825 32.2782 115.382 29.6808 115.146 28.6774C114.848 27.4027 114.468 25.7252 115.825 25.7252C115.853 18.0023 120.399 11.7537 126.003 11.7537C131.607 11.7537 136.153 18.0024 136.181 25.7253Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M136.181 25.7253C137.199 25.4367 137.245 27.0273 136.86 28.6774C136.507 30.1811 136.181 32.6383 135.122 32.0418C133.846 35.5824 131.518 38.2746 128.703 39.3405C127.829 39.7414 126.9 39.9608 125.937 39.9608C124.697 39.9608 123.514 39.5972 122.431 38.9506C120 37.6932 118.01 35.1897 116.871 32.0037C115.825 32.2782 115.382 29.6808 115.146 28.6774C114.848 27.4027 114.468 25.7252 115.825 25.7252C115.853 18.0023 120.399 11.7537 126.003 11.7537C131.607 11.7537 136.153 18.0024 136.181 25.7253Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M137.01 25.7675C136.995 25.8843 136.917 25.9877 136.799 26.0461C136.681 26.1045 136.538 26.1111 136.414 26.0628C133.292 24.8733 130.265 21.6652 129.308 18.6539C126.279 21.7953 121.281 25.4689 116.3 26.2763C116.273 26.2813 116.248 26.283 116.22 26.283L116.222 26.2847C116.133 26.2847 116.044 26.2596 115.971 26.2146C115.876 26.1545 115.814 26.0628 115.798 25.9627C115.297 22.3664 116.353 15.5624 119.561 13.4632C121.682 12.0748 123.315 11.1522 125.971 11.3263C128.67 11.5032 131.603 12.9654 133.693 14.4465C136.792 16.6432 137.446 22.2593 137.01 25.7675Z'\n fill='#090A0B'\n />\n </g>\n <path\n d='M62.7768 32.2645C62.7768 48.4275 49.6184 61.5289 33.3884 61.5289C24.1855 61.5289 15.9699 57.3175 10.5822 50.7231C6.4663 45.6869 4 39.2631 4 32.2645C4 16.1015 17.1583 3 33.3884 3C49.6184 3 62.7768 16.1015 62.7768 32.2645Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M62.7768 32.2645C62.7768 48.4275 49.6184 61.5289 33.3884 61.5289C24.1855 61.5289 15.9699 57.3175 10.5822 50.7231C6.4663 45.6869 4 39.2631 4 32.2645C4 16.1015 17.1583 3 33.3884 3C49.6184 3 62.7768 16.1015 62.7768 32.2645Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.12'\n />\n <mask\n id='mask1_4220_135496'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='4'\n y='3'\n width='59'\n height='59'\n >\n <path\n d='M62.7768 32.2645C62.7768 48.4275 49.6184 61.5289 33.3884 61.5289C24.1855 61.5289 15.9699 57.3175 10.5822 50.7231C6.4663 45.6869 4 39.2631 4 32.2645C4 16.1015 17.1583 3 33.3884 3C49.6184 3 62.7768 16.1015 62.7768 32.2645Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask1_4220_135496)'>\n <path\n d='M59.315 56.2833C58.0392 52.1578 54.4779 49.0025 50.0085 48.0379L40.5537 46H26.2191L16.7642 48.0379C12.2928 49.0025 8.73148 52.1578 7.4577 56.2833L3.84967 74.1244H62.923L59.315 56.2833Z'\n fill='var(--center-channel-bg)'\n />\n <path\n opacity='0.24'\n d='M59.316 56.2833C58.0402 52.1578 54.4789 49.0025 50.0095 48.0379L40.5546 46H26.22L16.7652 48.0379C12.2938 49.0025 8.73246 52.1578 7.45868 56.2833L3.85065 74.1244H62.924L59.316 56.2833Z'\n fill='var(--button-bg)'\n />\n <path\n d='M39.1307 46.7931L37.1957 41H28.7017L27.1307 46.7931C30.5593 48.4023 35.7022 48.4023 39.1307 46.7931Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M39.1307 46.7931L37.1957 41H28.7017L27.1307 46.7931C30.5593 48.4023 35.7022 48.4023 39.1307 46.7931Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M44.1566 29.3643C45.2559 29.0676 45.306 30.7029 44.8895 32.3994C44.5088 33.9454 44.1566 36.4716 43.0128 35.8584C41.6345 39.4985 39.1209 42.2663 36.0807 43.3622C35.1366 43.7744 34.1334 44 33.0934 44C31.7545 44 30.4765 43.6261 29.3073 42.9613C26.682 41.6686 24.5333 39.0947 23.3026 35.8192C22.1735 36.1014 21.6947 33.431 21.4406 32.3994C21.1179 31.0889 20.7078 29.3642 22.1735 29.3642C22.2037 21.4243 27.1132 15 33.1651 15C39.2169 15 44.1265 21.4243 44.1566 29.3643Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M44.1566 29.3643C45.2559 29.0676 45.306 30.7029 44.8895 32.3994C44.5088 33.9454 44.1566 36.4716 43.0128 35.8584C41.6345 39.4985 39.1209 42.2663 36.0807 43.3622C35.1366 43.7744 34.1334 44 33.0934 44C31.7545 44 30.4765 43.6261 29.3073 42.9613C26.682 41.6686 24.5333 39.0947 23.3026 35.8192C22.1735 36.1014 21.6947 33.431 21.4406 32.3994C21.1179 31.0889 20.7078 29.3642 22.1735 29.3642C22.2037 21.4243 27.1132 15 33.1651 15C39.2169 15 44.1265 21.4243 44.1566 29.3643Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M21.1539 13.5734C18.3395 17.0127 18.2803 22.6279 20.9939 27.6575C21.921 28.7724 22.846 29.8851 23.7732 31C23.7447 22.8734 25.0621 20.6841 26.3421 20.2854C28.4529 19.6232 30.9539 23.6775 35.5328 23.5762C36.2298 23.5604 37.7927 23.5041 38.7483 22.4094C39.5725 21.4657 39.4476 20.308 39.6953 20.2832C40.1051 20.2426 40.8438 22.4545 42.2642 30.9978C43.1782 29.8761 44.0944 28.7521 45.0084 27.6304C45.5082 25.6799 45.9685 23.1212 45.9992 20.1075C46.0408 16.033 44.0442 13.4537 43.3318 11.1631C40.6446 17.9456 37.9371 9.48613 29.3057 9.5C26.5022 9.50451 22.9973 11.321 21.1539 13.5734Z'\n fill='#090A0B'\n />\n </g>\n <circle\n cx='77.755'\n cy='53.5'\n r='41.5'\n fill='var(--center-channel-bg)'\n />\n <circle\n cx='77.5'\n cy='53.5'\n r='38.5'\n fill='var(--center-channel-color)'\n fillOpacity='0.16'\n />\n <mask\n id='mask2_4220_135496'\n mask-type='luminance'\n maskUnits='userSpaceOnUse'\n x='39'\n y='15'\n width='78'\n height='77'\n >\n <path\n d='M39.0959 53.5C39.0959 74.7639 56.3841 92 77.7082 92C89.7995 92 100.594 86.4595 107.672 77.784C113.08 71.1584 116.32 62.7074 116.32 53.5C116.32 32.2361 99.0322 15 77.7082 15C56.3841 15 39.0959 32.2361 39.0959 53.5Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask2_4220_135496)'>\n <path\n d='M53.4924 74.5C57.4891 71.6636 71.4779 68.9848 77.9727 68C83.9678 69.1818 97.6568 72.3727 104.451 75.6818C111.246 78.9909 112.278 89.2727 111.945 94H44C44 81 48.4964 78.0455 53.4924 74.5Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M53.4924 74.5C57.4891 71.6636 71.4779 68.9848 77.9727 68C83.9678 69.1818 97.6568 72.3727 104.451 75.6818C111.246 78.9909 112.278 89.2727 111.945 94H44C44 81 48.4964 78.0455 53.4924 74.5Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.8'\n />\n <path\n d='M87 70L84.178 61H71.7909L69.5 70C74.5 72.5 82 72.5 87 70Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M87 70L84.178 61H71.7909L69.5 70C74.5 72.5 82 72.5 87 70Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M94.5388 44.2988C96.1877 43.8589 96.2628 46.2836 95.6382 48.7991C95.0671 51.0914 94.5388 54.8372 92.823 53.9279C90.7557 59.3254 86.9853 63.4294 82.4249 65.0543C81.0089 65.6655 79.504 66 77.9441 66C75.9357 66 74.0187 65.4456 72.2648 64.4599C68.3268 62.5431 65.1039 58.7266 63.2578 53.8698C61.5642 54.2883 60.8459 50.3287 60.4648 48.7991C59.9807 46.8559 59.3656 44.2986 61.5642 44.2986C61.6095 32.5256 68.9737 23 78.0515 23C87.1293 23 94.4936 32.5258 94.5388 44.2988Z'\n fill='var(--center-channel-bg)'\n />\n <path\n d='M94.5388 44.2988C96.1877 43.8589 96.2628 46.2836 95.6382 48.7991C95.0671 51.0914 94.5388 54.8372 92.823 53.9279C90.7557 59.3254 86.9853 63.4294 82.4249 65.0543C81.0089 65.6655 79.504 66 77.9441 66C75.9357 66 74.0187 65.4456 72.2648 64.4599C68.3268 62.5431 65.1039 58.7266 63.2578 53.8698C61.5642 54.2883 60.8459 50.3287 60.4648 48.7991C59.9807 46.8559 59.3656 44.2986 61.5642 44.2986C61.6095 32.5256 68.9737 23 78.0515 23C87.1293 23 94.4936 32.5258 94.5388 44.2988Z'\n fill='var(--center-channel-color)'\n fillOpacity='0.56'\n />\n <path\n d='M63.9741 26.383C66.1398 23.3965 67.6892 22.887 68.4475 22.6376C68.7033 22.5535 68.8691 22.499 68.9381 22.389C71.9166 17.6451 84.6741 18.5261 88.1041 21.1133C95.9084 27 93.9865 31.0627 94.8689 35.9071C95.3263 38.3922 94.4557 41.4418 94.2549 44C94.009 42.3029 92.6057 37.0742 92.5 36.5C91.2633 33.5 85.8429 37.1501 83 37C76.6134 36.6628 71.8302 35.5414 68.4475 31.5C67.4347 35.0839 64.3273 39.4355 62.3974 39.8437L61.9885 43.4729C60.8273 37.0332 59.9081 31.9903 63.9741 26.383Z'\n fill='#090A0B'\n />\n </g>\n <path\n d='M125.564 0.427827C131.766 0.388622 137.468 1.9948 142.661 5.24635C144.794 6.58128 146.84 8.19355 148.801 10.0832C151.224 12.599 153.188 15.2733 154.691 18.1072M157.353 24.9709C158.029 27.6067 158.368 30.36 158.368 33.2316C158.363 36.7044 157.866 40.0073 156.876 43.1395M156.178 21.3371C156.4 21.9007 156.605 22.47 156.793 23.0452'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n />\n <path\n d='M114.044 79.5469C109.381 86.3471 103.302 91.3528 95.8113 94.5552C92.7362 95.87 89.4233 96.8809 85.8731 97.5872C81.288 98.3236 76.8785 98.4385 72.6441 97.9295M63.1318 95.6274C59.7416 94.3653 56.4792 92.6456 53.3445 90.4668C49.5568 87.827 46.3284 84.7784 43.6606 81.3206M67.9899 97.102C67.2067 96.9162 66.4298 96.7077 65.6594 96.4764'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n />\n <path\n d='M33.795 65.2666C26.553 65.2117 19.999 63.0477 14.1516 58.7556C12.9264 57.8563 11.7322 56.8635 10.5691 55.7772C7.54909 52.5373 5.24489 49.0918 3.65419 45.4384M0.991235 32.4628C0.996736 28.1336 1.79021 24.0342 3.37166 20.1646C4.9698 16.2542 7.37265 12.5784 10.5802 9.13739'\n stroke='var(--center-channel-color)'\n strokeOpacity='0.48'\n />\n </g>\n <defs>\n <clipPath id='clip0_4220_135496'>\n <rect\n width='159'\n height='99'\n fill='var(--center-channel-bg)'\n transform='translate(0.255005)'\n />\n </clipPath>\n </defs>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ReactNode, CSSProperties} from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport {SearchSVG, ChannelSearchSVG, MentionsSVG, SavedMessagesSVG, PinSVG, ChannelFilesSVG, UserGroupsSVG} from 'components/common/svg_images_components';\n\nimport {NoResultsVariant, NoResultsLayout} from './types';\nimport './no_results_indicator.scss';\n\ninterface Props {\n expanded?: boolean;\n iconGraphic?: ReactNode;\n title?: ReactNode;\n subtitle?: ReactNode;\n variant?: NoResultsVariant;\n titleValues?: Record<string, ReactNode>;\n subtitleValues?: Record<string, ReactNode>;\n style?: CSSProperties;\n layout?: NoResultsLayout;\n titleClassName?: string;\n subtitleClassName?: string;\n}\n\nconst iconMap: {[key in NoResultsVariant]: React.ReactNode } = {\n [NoResultsVariant.Search]: <SearchSVG className='no-results__icon'/>,\n [NoResultsVariant.ChannelSearch]: <ChannelSearchSVG className='no-results__icon'/>,\n [NoResultsVariant.Files]: <ChannelFilesSVG className='no-results__icon'/>,\n [NoResultsVariant.Mentions]: <MentionsSVG className='no-results__icon'/>,\n [NoResultsVariant.FlaggedPosts]: <SavedMessagesSVG className='no-results__icon'/>,\n [NoResultsVariant.PinnedPosts]: <PinSVG className='no-results__icon'/>,\n [NoResultsVariant.ChannelFiles]: <ChannelFilesSVG className='no-results__icon'/>,\n [NoResultsVariant.ChannelFilesFiltered]: <ChannelFilesSVG className='no-results__icon'/>,\n [NoResultsVariant.UserGroups]: <UserGroupsSVG className='no-results__icon'/>,\n [NoResultsVariant.UserGroupMembers]: <UserGroupsSVG className='no-results__icon'/>,\n [NoResultsVariant.UserGroupsArchived]: <UserGroupsSVG className='no-results__icon'/>,\n};\n\nconst titleMap = defineMessages({\n [NoResultsVariant.Search]: {\n id: 'no_results.search.title',\n defaultMessage: 'No results for “{channelName}”',\n },\n [NoResultsVariant.Files]: {\n id: 'no_results.Files.title',\n defaultMessage: 'No file results for “{searchTerm}”',\n },\n [NoResultsVariant.ChannelSearch]: {\n id: 'no_results.channel_search.title',\n defaultMessage: 'No results for “{channelName}”',\n },\n [NoResultsVariant.Mentions]: {\n id: 'no_results.mentions.title',\n defaultMessage: 'No mentions yet',\n },\n [NoResultsVariant.FlaggedPosts]: {\n id: 'no_results.flagged_posts.title',\n defaultMessage: 'No saved messages yet',\n },\n [NoResultsVariant.PinnedPosts]: {\n id: 'no_results.pinned_messages.title',\n defaultMessage: 'No pinned messages yet',\n },\n [NoResultsVariant.ChannelFiles]: {\n id: 'no_results.channel_files.title',\n defaultMessage: 'No files yet',\n },\n [NoResultsVariant.ChannelFilesFiltered]: {\n id: 'no_results.channel_files_filtered.title',\n defaultMessage: 'No files found',\n },\n [NoResultsVariant.UserGroups]: {\n id: 'no_results.user_groups.title',\n defaultMessage: 'No groups yet',\n },\n [NoResultsVariant.UserGroupMembers]: {\n id: 'no_results.user_group_members.title',\n defaultMessage: 'No members yet',\n },\n [NoResultsVariant.UserGroupsArchived]: {\n id: 'no_results.user_groups.archived.title',\n defaultMessage: 'No archived groups',\n },\n});\n\nconst subtitleMap = defineMessages({\n [NoResultsVariant.Search]: {\n id: 'no_results.search.subtitle',\n defaultMessage: 'Check the spelling or try another search.',\n },\n [NoResultsVariant.Files]: {\n id: 'no_results.Files.subtitle',\n defaultMessage: 'Check the spelling or try another search.',\n },\n [NoResultsVariant.ChannelSearch]: {\n id: 'no_results.channel_search.subtitle',\n defaultMessage: 'Check the spelling or try another search.',\n },\n [NoResultsVariant.Mentions]: {\n id: 'no_results.mentions.subtitle',\n defaultMessage: 'Messages where someone mentions you or includes your trigger words are saved here.',\n },\n [NoResultsVariant.FlaggedPosts]: {\n id: 'no_results.flagged_posts.subtitle',\n defaultMessage: 'To save something for later, open the context menu on a message and choose {buttonText}. Saved messages are only visible to you',\n },\n [NoResultsVariant.PinnedPosts]: {\n id: 'no_results.pinned_messages.subtitle',\n defaultMessage: 'To pin important messages, open the context menu on a message and choose {text}. Pinned messages will be visible to everyone in this channel.',\n },\n [NoResultsVariant.ChannelFiles]: {\n id: 'no_results.channel_files.subtitle',\n defaultMessage: 'Files posted in this channel will show here.',\n },\n [NoResultsVariant.ChannelFilesFiltered]: {\n id: 'no_results.channel_files_filtered.subtitle',\n defaultMessage: \"This channel doesn't contains any file with the selected file format.\",\n },\n [NoResultsVariant.UserGroups]: {\n id: 'no_results.user_groups.subtitle',\n defaultMessage: 'Groups are a custom collection of users that can be used for mentions and invites.',\n },\n [NoResultsVariant.UserGroupMembers]: {\n id: 'no_results.user_group_members.subtitle',\n defaultMessage: 'There are currently no members in this group, please add one.',\n },\n [NoResultsVariant.UserGroupsArchived]: {\n id: 'no_results.user_groups.archived.subtitle',\n defaultMessage: 'Groups that are no longer relevant or are not being used can be archived',\n },\n});\n\nconst NoResultsIndicator = ({\n expanded,\n style,\n variant,\n iconGraphic = variant ? (\n <div className='no-results__variant-wrapper'>\n {iconMap[variant]}\n </div>\n ) : null,\n titleValues,\n title = variant ? (\n <FormattedMessage\n {...titleMap[variant]}\n values={titleValues}\n />\n ) : null,\n subtitleValues,\n subtitle = variant ? (\n <FormattedMessage\n {...subtitleMap[variant]}\n values={subtitleValues}\n />\n ) : null,\n layout = NoResultsLayout.Vertical,\n titleClassName,\n subtitleClassName,\n}: Props) => {\n let content = (\n <div\n className={classNames('no-results__wrapper', {'horizontal-layout': layout === NoResultsLayout.Horizontal})}\n style={style}\n >\n {iconGraphic}\n\n <div\n className='no-results__text-container'\n >\n {title && (\n <h3 className={classNames('no-results__title', {'only-title': !subtitle}, titleClassName)}>\n {title}\n </h3>\n )}\n\n {subtitle && (\n <div className={classNames('no-results__subtitle', subtitleClassName)}>\n {subtitle}\n </div>\n )}\n </div>\n\n </div>\n );\n\n if (expanded) {\n content = (\n <div className='no-results__holder'>\n {content}\n </div>\n );\n }\n\n return content;\n};\n\nexport default NoResultsIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport enum NoResultsVariant {\n Search = 'Search',\n Files = 'Files',\n ChannelSearch = 'ChannelSearch',\n Mentions = 'Mentions',\n FlaggedPosts = 'FlaggedPosts',\n PinnedPosts = 'PinnedPosts',\n ChannelFiles = 'ChannelFiles',\n ChannelFilesFiltered = 'ChannelFilesFiltered',\n UserGroups = 'UserGroups',\n UserGroupMembers = 'UserGroupMembers',\n UserGroupsArchived = 'UserGroupsArchived',\n}\n\nexport enum NoResultsLayout {\n Vertical,\n Horizontal,\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport type {NotifyAdminRequest} from '@mattermost/types/cloud';\n\nimport {NotifyStatus, useGetNotifyAdmin} from 'components/common/hooks/useGetNotifyAdmin';\nimport type {NotifyStatusValues} from 'components/common/hooks/useGetNotifyAdmin';\n\nconst Span = styled.span`\n font-family: 'Open Sans';\n font-size: 12px;\n font-style: normal;\n font-weight: 600;\n line-height: 16px;\n`;\n\nconst Button = styled.button<{notified: boolean}>`\n border: none;\n background: none;\n color: ${(props: any) => (props.notified ? 'var(--denim-status-online)' : 'var(--denim-button-bg)')};\n text-decoration: none;\n display: inline;\n`;\n\ntype HookProps = {\n ctaText?: React.ReactNode;\n successText?: React.ReactNode;\n preTrial?: boolean;\n}\n\ntype Props = HookProps & {\n callerInfo: string;\n notifyRequestData: NotifyAdminRequest;\n}\n\ntype ValueOf<T> = T[keyof T]\n\nexport function useNotifyAdmin<T = HTMLAnchorElement | HTMLButtonElement>(props: HookProps, reqData: NotifyAdminRequest): [React.ReactNode, (e: React.MouseEvent<T, MouseEvent>, callerInfo: string) => void, ValueOf<typeof NotifyStatus>] {\n const {btnText: btnFormaText, notifyAdmin, notifyStatus} = useGetNotifyAdmin({});\n const {formatMessage} = useIntl();\n\n const btnText = (status: NotifyStatusValues): React.ReactNode => {\n switch (status) {\n case NotifyStatus.Started:\n case NotifyStatus.Success:\n return props.successText || formatMessage(btnFormaText(NotifyStatus.Success));\n case NotifyStatus.AlreadyComplete:\n case NotifyStatus.Failed:\n return formatMessage(btnFormaText(status));\n default:\n return props.ctaText || formatMessage(btnFormaText(NotifyStatus.NotStarted));\n }\n };\n\n const notifyFunc = async (e: React.MouseEvent<T, MouseEvent>, callerInfo: string) => {\n e.preventDefault();\n e.stopPropagation();\n notifyAdmin({\n trackingArgs: {\n category: 'pricing',\n event: 'click_notify_admin_cta',\n props: {\n callerInfo,\n },\n },\n requestData: reqData,\n });\n };\n\n return [btnText(notifyStatus), notifyFunc, notifyStatus];\n}\n\nfunction NotifyAdminCTA(props: Props) {\n const [btnText, notify, status] = useNotifyAdmin(props, props.notifyRequestData);\n const {formatMessage} = useIntl();\n let title = formatMessage({id: 'pricing_modal.wantToUpgrade', defaultMessage: 'Want to upgrade? '});\n if (props.preTrial) {\n title = formatMessage({id: 'pricing_modal.wantToTry', defaultMessage: 'Want to try? '});\n }\n\n return (\n <>\n {props.ctaText ? (\n <span>\n <Button\n id='notify_admin_cta'\n onClick={(e) => notify(e, props.callerInfo)}\n disabled={status === NotifyStatus.AlreadyComplete}\n notified={status === NotifyStatus.Success}\n >\n {btnText}\n </Button>\n </span>\n ) : (\n <Span id='notify_cta_container'>\n {title}\n <Button\n id='notify_admin_cta'\n onClick={(e) => notify(e, props.callerInfo)}\n disabled={status === NotifyStatus.AlreadyComplete}\n notified={status === NotifyStatus.Success}\n >\n {btnText}\n </Button>\n </Span>\n )}\n </>\n );\n}\n\nexport default NotifyAdminCTA;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nconst FINISHED = 999;\n\nexport const OnboardingTaskCategory = 'onboarding_task_list';\n\n// Whole task list is based on these\nexport const OnboardingTasksName = {\n CHANNELS_TOUR: 'channels_tour',\n INVITE_PEOPLE: 'invite_people',\n DOWNLOAD_APP: 'download_app',\n COMPLETE_YOUR_PROFILE: 'complete_your_profile',\n VISIT_SYSTEM_CONSOLE: 'visit_system_console',\n START_TRIAL: 'start_trial',\n};\n\nexport const OnboardingTaskList = {\n ONBOARDING_TASK_LIST_OPEN: 'onboarding_task_list_open',\n ONBOARDING_TASK_LIST_SHOW: 'onboarding_task_list_show',\n ONBOARDING_TASK_LIST_CLOSE: 'onboarding_task_list_close',\n DECLINED_ONBOARDING_TASK_LIST: 'declined_onboarding_task_list',\n};\n\nexport const GenericTaskSteps = {\n START: 0,\n STARTED: 1,\n FINISHED,\n};\n\nexport const TaskNameMapToSteps = {\n [OnboardingTasksName.CHANNELS_TOUR]: GenericTaskSteps,\n [OnboardingTasksName.COMPLETE_YOUR_PROFILE]: GenericTaskSteps,\n [OnboardingTasksName.DOWNLOAD_APP]: GenericTaskSteps,\n [OnboardingTasksName.VISIT_SYSTEM_CONSOLE]: GenericTaskSteps,\n [OnboardingTasksName.INVITE_PEOPLE]: GenericTaskSteps,\n [OnboardingTasksName.START_TRIAL]: GenericTaskSteps,\n};\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function isShowOnboardingTaskCompletion(state: GlobalState) {\n return state.views.onboardingTasks.isShowOnboardingTaskCompletion;\n}\n\nexport function isShowOnboardingCompleteProfileTour(state: GlobalState) {\n return state.views.onboardingTasks.isShowOnboardingCompleteProfileTour;\n}\n\nexport function isShowOnboardingVisitConsoleTour(state: GlobalState) {\n return state.views.onboardingTasks.isShowOnboardingVisitConsoleTour;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {TourTip, useMeasurePunchouts} from '@mattermost/components';\n\nimport {setShowOnboardingVisitConsoleTour} from 'actions/views/onboarding_tasks';\nimport {isShowOnboardingVisitConsoleTour} from 'selectors/views/onboarding_tasks';\n\nimport {OnboardingTasksName, TaskNameMapToSteps} from './constants';\nimport {useHandleOnBoardingTaskData} from './onboarding_tasks_manager';\n\nconst translate = {x: 0, y: -2};\n\nexport const VisitSystemConsoleTour = () => {\n const dispatch = useDispatch();\n const handleTask = useHandleOnBoardingTaskData();\n const taskName = OnboardingTasksName.VISIT_SYSTEM_CONSOLE;\n const steps = TaskNameMapToSteps[taskName];\n const isOpen = useSelector(isShowOnboardingVisitConsoleTour);\n\n useEffect(() => {\n return () => {\n dispatch(setShowOnboardingVisitConsoleTour(false));\n };\n }, []);\n\n const title = (\n <FormattedMessage\n id='onboardingTask.visitSystemConsole.title'\n defaultMessage={'Visit the System Console'}\n />\n );\n const screen = (\n <p>\n <FormattedMessage\n id='onboardingTask.visitSystemConsole.Description'\n defaultMessage={'More detailed configuration settings for your workspace can be accessed here.'}\n />\n </p>\n );\n\n const overlayPunchOut = useMeasurePunchouts(['product-switcher-menu-dropdown'], []);\n\n const onDismiss = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n handleTask(taskName, steps.START, true, 'dismiss');\n };\n\n return (\n <TourTip\n show={isOpen}\n title={title}\n screen={screen}\n overlayPunchOut={overlayPunchOut}\n step={steps.STARTED}\n placement='left-start'\n pulsatingDotPlacement='right'\n pulsatingDotTranslate={translate}\n handleDismiss={onDismiss}\n singleTip={true}\n showOptOut={false}\n interactivePunchOut={true}\n />\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {TourTip, useMeasurePunchouts} from '@mattermost/components';\n\nimport {setShowOnboardingCompleteProfileTour} from 'actions/views/onboarding_tasks';\nimport {isShowOnboardingCompleteProfileTour} from 'selectors/views/onboarding_tasks';\n\nimport {OnboardingTasksName, TaskNameMapToSteps} from './constants';\nimport {useHandleOnBoardingTaskData} from './onboarding_tasks_manager';\n\nconst translate = {x: 0, y: -2};\n\nexport const CompleteYourProfileTour = () => {\n const dispatch = useDispatch();\n const handleTask = useHandleOnBoardingTaskData();\n const taskName = OnboardingTasksName.COMPLETE_YOUR_PROFILE;\n const steps = TaskNameMapToSteps[taskName];\n const isOpen = useSelector(isShowOnboardingCompleteProfileTour);\n\n useEffect(() => {\n return () => {\n dispatch(setShowOnboardingCompleteProfileTour(false));\n };\n }, []);\n\n const title = (\n <FormattedMessage\n id='onboardingTask.completeYourProfileTour.title'\n defaultMessage={'Edit your profile'}\n />\n );\n const screen = (\n <p>\n <FormattedMessage\n id='onboardingTask.completeYourProfileTour.Description'\n defaultMessage={'Use this menu item to update your profile details and security settings.'}\n />\n </p>\n );\n\n const overlayPunchOut = useMeasurePunchouts(['status-drop-down-menu-list'], [], {y: -6, height: 6, x: 0, width: 0});\n const onDismiss = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n handleTask(taskName, steps.START, true, 'dismiss');\n };\n\n return (\n <TourTip\n show={isOpen}\n title={title}\n screen={screen}\n overlayPunchOut={overlayPunchOut}\n step={steps.STARTED}\n placement='left-start'\n pulsatingDotPlacement='left'\n pulsatingDotTranslate={translate}\n handleDismiss={onDismiss}\n singleTip={true}\n showOptOut={false}\n interactivePunchOut={true}\n />\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nexport default (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '104'}\n height={props.height ? props.height.toString() : '104'}\n fill='var(--center-channel-bg)'\n viewBox='0 0 104 104'\n xmlns='http://www.w3.org/2000/svg'\n >\n <g clipPath='url(#clip0_615_72261)'>\n <path\n d='M52.2541 30.6352H79.2974C80.1074 30.6294 80.9106 30.7851 81.6608 31.0932C82.411 31.4013 83.0935 31.8559 83.6691 32.4308C84.2448 33.0057 84.7022 33.6896 85.0152 34.4433C85.3282 35.197 85.4905 36.0056 85.4929 36.8228V65.117C85.4897 65.9336 85.3267 66.7415 85.0134 67.4945C84.7001 68.2475 84.2425 68.9306 83.6669 69.5049C83.0914 70.0791 82.4092 70.5331 81.6594 70.8409C80.9096 71.1486 80.1069 71.3041 79.2974 71.2983H72.7922V81.9235L63.0219 71.2983H52.2541C51.4446 71.3041 50.642 71.1486 49.8922 70.8409C49.1424 70.5331 48.4601 70.0791 47.8846 69.5049C47.309 68.9306 46.8515 68.2475 46.5381 67.4945C46.2248 66.7415 46.0618 65.9336 46.0586 65.117V36.8228C46.061 36.0056 46.2234 35.197 46.5364 34.4433C46.8493 33.6896 47.3068 33.0057 47.8824 32.4308C48.458 31.8559 49.1405 31.4013 49.8907 31.0932C50.6409 30.7851 51.4441 30.6294 52.2541 30.6352Z'\n fill='#1E325C'\n />\n <path\n d='M68.7899 22.1288H24.6779C23.8679 22.1231 23.0648 22.2787 22.3146 22.5869C21.5644 22.895 20.8819 23.3496 20.3062 23.9245C19.7306 24.4994 19.2732 25.1833 18.9602 25.937C18.6472 26.6907 18.4848 27.4993 18.4824 28.3164V56.5856C18.4857 57.4022 18.6486 58.2102 18.962 58.9631C19.2753 59.7161 19.7329 60.3993 20.3084 60.9735C20.884 61.5478 21.5662 62.0018 22.316 62.3095C23.0658 62.6173 23.8685 62.7727 24.6779 62.7669H31.1894V73.3921L40.9597 62.7669H68.7899C69.5994 62.7727 70.402 62.6173 71.1518 62.3095C71.9016 62.0018 72.5838 61.5478 73.1594 60.9735C73.7349 60.3993 74.1925 59.7161 74.5058 58.9631C74.8192 58.2102 74.9821 57.4022 74.9854 56.5856V28.3164C74.983 27.4993 74.8206 26.6907 74.5076 25.937C74.1946 25.1833 73.7372 24.4994 73.1616 23.9245C72.5859 23.3496 71.9034 22.895 71.1532 22.5869C70.403 22.2787 69.5999 22.1231 68.7899 22.1288Z'\n fill='#FFBC1F'\n />\n <path\n d='M31.6839 38.4102C32.4698 38.4089 33.2385 38.643 33.8925 39.0827C34.5466 39.5225 35.0565 40.1481 35.3579 40.8804C35.6592 41.6128 35.7384 42.4188 35.5854 43.1965C35.4323 43.9743 35.054 44.6887 34.4982 45.2494C33.9424 45.81 33.2342 46.1917 32.4633 46.3461C31.6924 46.5005 30.8934 46.4206 30.1674 46.1166C29.4415 45.8126 28.8214 45.2982 28.3855 44.6384C27.9496 43.9786 27.7175 43.2031 27.7188 42.4102C27.7204 41.3499 28.1387 40.3334 28.8819 39.5836C29.6252 38.8338 30.6328 38.4118 31.6839 38.4102Z'\n fill='white'\n />\n <path\n d='M46.7464 38.4102C47.5323 38.4089 48.301 38.643 48.955 39.0827C49.6091 39.5225 50.119 40.1481 50.4204 40.8804C50.7217 41.6128 50.8009 42.4188 50.6479 43.1965C50.4948 43.9743 50.1165 44.6887 49.5607 45.2494C49.0049 45.81 48.2968 46.1917 47.5258 46.3461C46.7549 46.5005 45.9559 46.4206 45.2299 46.1166C44.504 45.8126 43.8839 45.2982 43.448 44.6384C43.0121 43.9786 42.78 43.2031 42.7813 42.4102C42.7829 41.3499 43.2012 40.3334 43.9444 39.5836C44.6877 38.8338 45.6953 38.4118 46.7464 38.4102Z'\n fill='white'\n />\n <path\n d='M61.8069 38.4102C62.5929 38.4089 63.3616 38.643 64.0156 39.0827C64.6696 39.5225 65.1796 40.1481 65.4809 40.8804C65.7823 41.6128 65.8615 42.4188 65.7084 43.1965C65.5554 43.9743 65.177 44.6887 64.6212 45.2494C64.0655 45.81 63.3573 46.1917 62.5864 46.3461C61.8154 46.5005 61.0164 46.4206 60.2905 46.1166C59.5646 45.8126 58.9444 45.2982 58.5085 44.6384C58.0726 43.9786 57.8406 43.2031 57.8418 42.4102C57.8434 41.3499 58.2617 40.3334 59.005 39.5836C59.7482 38.8338 60.7558 38.4118 61.8069 38.4102Z'\n fill='white'\n />\n </g>\n <defs>\n <clipPath id='clip0_615_72261'>\n <rect\n width='66.9362'\n height='59.7447'\n fill='white'\n transform='translate(18.5312 22.1287)'\n />\n </clipPath>\n </defs>\n </svg>\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst SvgComponent = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '376'}\n height={props.height ? props.height.toString() : '376'}\n fill='var(--center-channel-bg)'\n viewBox='0 0 376 376'\n xmlns='http://www.w3.org/2000/svg'\n >\n <g clipPath='url(#clip0_1_152)'>\n <path\n d='M77.5404 124.26C78.3019 124.196 79.068 124.312 79.7764 124.598C80.4848 124.885 81.1157 125.334 81.6181 125.909C82.1205 126.485 82.4804 127.17 82.6683 127.91C82.8563 128.651 82.8671 129.424 82.7001 130.17L79.585 154.926C79.5617 155.688 79.3594 156.434 78.9947 157.103C78.63 157.772 78.1131 158.347 77.4854 158.78C76.8578 159.213 76.1373 159.493 75.3817 159.596C74.626 159.7 73.8565 159.625 73.1353 159.377L49.9652 152.251C48.3884 151.657 47.0543 150.555 46.173 149.12C45.2917 147.684 44.9134 145.997 45.0975 144.323L46.6552 131.921C46.8909 130.248 47.6805 128.702 48.898 127.529C50.1154 126.357 51.6907 125.625 53.3726 125.452L77.5404 124.26Z'\n fill='#63697E'\n />\n <path\n d='M77.6866 175.889C78.18 175.309 78.8026 174.853 79.5045 174.558C80.2064 174.262 80.9681 174.135 81.728 174.187C82.4879 174.239 83.2249 174.469 83.8799 174.857C84.5349 175.246 85.0895 175.782 85.4991 176.424L100.832 196.122C101.356 196.678 101.742 197.348 101.958 198.08C102.175 198.811 102.216 199.583 102.078 200.334C101.941 201.084 101.629 201.792 101.167 202.399C100.705 203.007 100.107 203.498 99.4206 203.831L77.9786 215.164C76.4444 215.876 74.7151 216.052 73.0688 215.664C71.4224 215.276 69.9545 214.346 68.9005 213.024L61.2338 203.175C60.2178 201.826 59.6827 200.176 59.7136 198.489C59.7444 196.801 60.3394 195.172 61.4041 193.861L77.6866 175.889Z'\n fill='#63697E'\n />\n <path\n d='M114.437 212.295C114.373 211.534 114.489 210.768 114.776 210.061C115.062 209.353 115.512 208.722 116.088 208.22C116.664 207.718 117.35 207.359 118.09 207.171C118.831 206.983 119.606 206.972 120.352 207.139L145.128 210.252C145.89 210.275 146.637 210.477 147.307 210.841C147.976 211.206 148.551 211.722 148.985 212.35C149.418 212.977 149.698 213.697 149.802 214.452C149.905 215.207 149.83 215.976 149.582 216.696L142.451 239.872C141.859 241.45 140.758 242.786 139.32 243.667C137.883 244.548 136.192 244.924 134.516 244.736L122.104 243.18C120.43 242.944 118.882 242.155 117.709 240.939C116.536 239.722 115.804 238.148 115.63 236.468L114.437 212.295Z'\n fill='#63697E'\n />\n <path\n d='M165.986 212.173C165.401 211.68 164.941 211.057 164.642 210.353C164.343 209.649 164.214 208.885 164.266 208.122C164.319 207.359 164.55 206.619 164.942 205.963C165.334 205.306 165.875 204.751 166.522 204.342L186.236 189.046C186.791 188.523 187.462 188.137 188.195 187.921C188.927 187.705 189.699 187.664 190.45 187.801C191.201 187.938 191.91 188.25 192.518 188.711C193.126 189.173 193.617 189.77 193.951 190.456L205.293 211.857C206.002 213.394 206.177 215.125 205.789 216.773C205.401 218.421 204.472 219.892 203.151 220.952L193.415 228.588C192.072 229.615 190.421 230.159 188.729 230.133C187.038 230.106 185.405 229.511 184.094 228.442L165.986 212.173Z'\n fill='#63697E'\n />\n <path\n d='M202.421 175.549C201.664 175.608 200.903 175.489 200.2 175.202C199.497 174.915 198.871 174.468 198.372 173.896C197.873 173.324 197.515 172.644 197.326 171.909C197.138 171.174 197.124 170.405 197.285 169.663L200.376 144.882C200.403 144.123 200.608 143.38 200.975 142.714C201.341 142.047 201.858 141.476 202.485 141.046C203.112 140.616 203.832 140.338 204.585 140.236C205.339 140.133 206.107 140.209 206.826 140.456L230.02 147.582C231.605 148.165 232.946 149.265 233.829 150.703C234.712 152.141 235.085 153.834 234.888 155.51L233.33 167.888C233.103 169.565 232.316 171.115 231.097 172.289C229.878 173.463 228.298 174.192 226.613 174.357L202.421 175.549Z'\n fill='#63697E'\n />\n <path\n d='M202.299 123.92C201.808 124.506 201.185 124.968 200.482 125.268C199.778 125.569 199.014 125.699 198.251 125.65C197.488 125.6 196.747 125.371 196.088 124.982C195.43 124.593 194.873 124.054 194.462 123.409L179.153 103.686C178.629 103.131 178.244 102.461 178.027 101.729C177.811 100.998 177.77 100.226 177.907 99.4751C178.045 98.7247 178.357 98.017 178.819 97.4094C179.28 96.8018 179.878 96.3112 180.565 95.9773L201.982 84.6446C203.524 83.9381 205.257 83.7673 206.907 84.1596C208.557 84.5518 210.027 85.4845 211.085 86.809L218.727 96.6582C219.755 98.0009 220.3 99.6505 220.273 101.341C220.247 103.031 219.651 104.662 218.581 105.972L202.299 123.92Z'\n fill='#63697E'\n />\n <path\n d='M165.67 87.5145C165.734 88.2754 165.618 89.0407 165.331 89.7485C165.045 90.4564 164.595 91.0869 164.019 91.5889C163.444 92.0909 162.757 92.4504 162.017 92.6382C161.276 92.826 160.501 92.837 159.756 92.6701L134.979 89.5572C134.217 89.5339 133.471 89.332 132.801 88.9676C132.131 88.6033 131.556 88.0867 131.122 87.4596C130.689 86.8325 130.409 86.1123 130.305 85.3572C130.202 84.6022 130.277 83.8334 130.525 83.1128L137.656 59.9612C138.237 58.3756 139.336 57.0325 140.776 56.1496C142.216 55.2668 143.913 54.896 145.591 55.0974L157.979 56.6295C159.655 56.8609 161.204 57.6485 162.379 58.8657C163.553 60.083 164.283 61.6594 164.453 63.3415L165.67 87.5145Z'\n fill='#63697E'\n />\n <path\n d='M113.975 87.6604C114.556 88.1516 115.014 88.7722 115.312 89.4725C115.61 90.1728 115.74 90.9332 115.69 91.6924C115.64 92.4517 115.413 93.1887 115.026 93.8442C114.639 94.4997 114.104 95.0554 113.464 95.4667L93.7253 110.788C93.1697 111.311 92.4987 111.696 91.7665 111.913C91.0343 112.129 90.2616 112.17 89.5106 112.033C88.7596 111.895 88.0515 111.583 87.4434 111.122C86.8353 110.661 86.3441 110.063 86.0099 109.377L74.6684 87.9523C73.9631 86.4159 73.793 84.6877 74.1857 83.0435C74.5783 81.3993 75.511 79.9339 76.8346 78.8812L86.5699 71.2208C87.9164 70.1975 89.5688 69.6576 91.2602 69.6885C92.9517 69.7193 94.5833 70.3193 95.8914 71.3911L113.975 87.6604Z'\n fill='#63697E'\n />\n <path\n d='M152.746 196.293C143.565 198.815 133.841 198.56 124.804 195.56C115.768 192.56 107.825 186.95 101.98 179.439C96.1345 171.928 92.6496 162.854 91.966 153.364C91.2825 143.874 93.431 134.395 98.1395 126.125C102.848 117.855 109.905 111.166 118.419 106.904C126.932 102.642 136.519 100.999 145.967 102.181C155.415 103.364 164.3 107.32 171.499 113.548C178.697 119.777 183.884 127.999 186.406 137.173C189.779 149.473 188.129 162.607 181.818 173.692C175.507 184.777 165.051 192.905 152.746 196.293ZM119.743 76.2547C105.163 80.2486 92.0949 88.4726 82.1918 99.8869C72.2887 111.301 65.9948 125.393 64.1065 140.381C62.2181 155.369 64.8199 170.58 71.5827 184.091C78.3455 197.602 88.9658 208.806 102.101 216.286C115.236 223.766 130.295 227.187 145.376 226.115C160.456 225.044 174.88 219.529 186.824 210.268C198.767 201.006 207.695 188.414 212.477 174.083C217.259 159.752 217.681 144.327 213.689 129.756C208.33 110.215 195.421 93.6005 177.804 83.5674C160.186 73.5343 139.302 70.9039 119.743 76.2547Z'\n fill='#63697E'\n />\n <path\n d='M146.077 171.804C141.756 172.991 137.179 172.871 132.925 171.459C128.672 170.047 124.933 167.406 122.182 163.87C119.431 160.335 117.791 156.063 117.469 151.596C117.148 147.129 118.16 142.668 120.377 138.775C122.593 134.883 125.915 131.735 129.923 129.729C133.93 127.724 138.443 126.951 142.89 127.508C147.338 128.066 151.52 129.928 154.907 132.861C158.295 135.793 160.736 139.664 161.922 143.983C162.712 146.849 162.929 149.843 162.56 152.793C162.191 155.743 161.244 158.592 159.772 161.176C158.301 163.76 156.334 166.028 153.984 167.852C151.634 169.676 148.947 171.019 146.077 171.804ZM124.173 92.6214C112.826 95.7215 102.655 102.115 94.9457 110.993C87.2366 119.871 82.3362 130.834 80.8644 142.495C79.3926 154.156 81.4156 165.992 86.6775 176.504C91.9393 187.016 100.204 195.733 110.425 201.551C120.646 207.369 132.364 210.027 144.097 209.188C155.83 208.35 167.051 204.053 176.34 196.841C185.628 189.628 192.566 179.826 196.278 168.672C199.989 157.519 200.306 145.516 197.188 134.182C193.006 119.006 182.97 106.107 169.282 98.3149C155.593 90.5232 139.37 88.4757 124.173 92.6214Z'\n fill='#A4A9B7'\n />\n <path\n d='M146.077 171.804C141.756 172.991 137.179 172.871 132.925 171.459C128.672 170.047 124.933 167.406 122.182 163.87C119.431 160.335 117.791 156.063 117.469 151.596C117.148 147.129 118.16 142.668 120.377 138.775C122.593 134.883 125.915 131.735 129.923 129.729C133.93 127.724 138.443 126.951 142.89 127.508C147.338 128.066 151.52 129.928 154.907 132.861C158.295 135.793 160.736 139.664 161.922 143.983C162.712 146.849 162.929 149.843 162.56 152.793C162.191 155.743 161.244 158.592 159.772 161.176C158.301 163.76 156.334 166.028 153.984 167.852C151.634 169.676 148.947 171.019 146.077 171.804ZM128.091 106.337C119.454 108.713 111.715 113.594 105.854 120.364C99.9935 127.134 96.2736 135.489 95.165 144.372C94.0565 153.255 95.6091 162.267 99.6266 170.268C103.644 178.269 109.946 184.899 117.735 189.321C125.524 193.744 134.451 195.758 143.386 195.111C152.322 194.464 160.864 191.183 167.933 185.684C175.002 180.186 180.281 172.716 183.101 164.219C185.922 155.723 186.157 146.582 183.778 137.952C182.203 132.207 179.511 126.83 175.854 122.127C172.197 117.424 167.647 113.488 162.465 110.544C157.283 107.601 151.571 105.707 145.656 104.973C139.741 104.239 133.739 104.677 127.994 106.264L128.091 106.337Z'\n fill='#63697E'\n />\n <path\n d='M212.935 230.607C213.502 230.569 214.071 230.663 214.597 230.881C215.123 231.099 215.591 231.435 215.965 231.863C216.34 232.291 216.61 232.8 216.756 233.35C216.901 233.9 216.918 234.475 216.805 235.033L214.371 253.588C214.343 254.159 214.183 254.715 213.905 255.215C213.627 255.714 213.237 256.143 212.766 256.467C212.295 256.792 211.756 257.003 211.19 257.086C210.624 257.169 210.047 257.12 209.503 256.944L192.101 251.594C190.911 251.155 189.904 250.328 189.242 249.247C188.58 248.166 188.301 246.894 188.45 245.636L189.594 236.346C189.763 235.087 190.353 233.922 191.267 233.039C192.181 232.156 193.367 231.608 194.632 231.482L212.935 230.607Z'\n fill='#63697E'\n />\n <path\n d='M213.057 269.322C213.434 268.899 213.902 268.568 214.427 268.353C214.952 268.138 215.519 268.046 216.085 268.084C216.65 268.121 217.2 268.288 217.692 268.57C218.184 268.852 218.604 269.242 218.922 269.712L230.41 284.497C230.789 284.921 231.066 285.426 231.219 285.973C231.373 286.52 231.399 287.095 231.295 287.654C231.192 288.213 230.962 288.74 230.623 289.197C230.284 289.653 229.844 290.025 229.339 290.285L213.275 298.797C212.123 299.326 210.827 299.455 209.592 299.164C208.358 298.874 207.256 298.179 206.461 297.192L200.717 289.896C199.931 288.898 199.504 287.664 199.504 286.394C199.504 285.124 199.931 283.891 200.717 282.892L213.057 269.322Z'\n fill='#63697E'\n />\n <path\n d='M240.535 296.633C240.502 296.066 240.599 295.5 240.819 294.978C241.039 294.455 241.375 293.989 241.802 293.616C242.23 293.243 242.737 292.972 243.285 292.825C243.833 292.678 244.407 292.657 244.964 292.766L263.534 295.198C264.106 295.226 264.663 295.385 265.163 295.663C265.662 295.941 266.091 296.331 266.416 296.801C266.741 297.271 266.953 297.81 267.035 298.375C267.118 298.941 267.07 299.518 266.893 300.061L261.539 317.425C261.096 318.614 260.269 319.62 259.189 320.285C258.109 320.951 256.837 321.237 255.576 321.097L246.279 319.93C245.019 319.761 243.852 319.172 242.969 318.259C242.086 317.345 241.537 316.16 241.411 314.896L240.535 296.633Z'\n fill='#63697E'\n />\n <path\n d='M279.281 296.535C278.858 296.158 278.526 295.69 278.311 295.166C278.096 294.641 278.004 294.075 278.042 293.51C278.079 292.944 278.245 292.395 278.528 291.904C278.81 291.412 279.201 290.992 279.671 290.674L294.468 279.171C294.892 278.793 295.397 278.516 295.945 278.363C296.493 278.209 297.068 278.183 297.627 278.286C298.186 278.39 298.715 278.62 299.171 278.958C299.628 279.297 300 279.736 300.261 280.242L308.755 296.292C309.293 297.442 309.427 298.74 309.135 299.975C308.844 301.211 308.144 302.312 307.149 303.101L299.847 308.865C298.835 309.622 297.598 310.022 296.334 310C295.069 309.978 293.847 309.536 292.862 308.743L279.281 296.535Z'\n fill='#63697E'\n />\n <path\n d='M306.711 269.079C306.144 269.112 305.578 269.015 305.054 268.795C304.531 268.576 304.065 268.24 303.692 267.813C303.318 267.386 303.048 266.879 302.9 266.331C302.753 265.784 302.733 265.21 302.841 264.653L305.275 246.074C305.302 245.503 305.461 244.947 305.739 244.448C306.017 243.949 306.408 243.521 306.879 243.198C307.351 242.876 307.891 242.666 308.457 242.587C309.024 242.508 309.6 242.561 310.143 242.742L327.52 248.092C328.71 248.526 329.719 249.347 330.386 250.423C331.052 251.499 331.338 252.768 331.195 254.026L330.027 263.316C329.858 264.575 329.268 265.74 328.354 266.623C327.44 267.505 326.254 268.054 324.989 268.18L306.711 269.079Z'\n fill='#63697E'\n />\n <path\n d='M306.516 230.364C306.137 230.785 305.667 231.115 305.141 231.328C304.615 231.541 304.048 231.631 303.482 231.591C302.916 231.551 302.367 231.382 301.876 231.098C301.385 230.814 300.966 230.421 300.65 229.95L289.138 215.164C288.759 214.743 288.482 214.24 288.329 213.695C288.175 213.149 288.149 212.576 288.253 212.019C288.356 211.462 288.586 210.936 288.926 210.482C289.265 210.028 289.704 209.658 290.209 209.401L306.272 200.889C307.427 200.359 308.726 200.231 309.962 200.526C311.198 200.822 312.298 201.523 313.087 202.518L318.831 209.814C319.613 210.814 320.037 212.047 320.037 213.316C320.037 214.585 319.613 215.818 318.831 216.818L306.516 230.364Z'\n fill='#63697E'\n />\n <path\n d='M279.038 203.053C279.07 203.619 278.973 204.186 278.753 204.708C278.534 205.231 278.197 205.697 277.77 206.07C277.342 206.443 276.836 206.714 276.288 206.861C275.74 207.008 275.165 207.029 274.608 206.92L256.014 204.488C255.444 204.457 254.89 204.295 254.393 204.015C253.897 203.736 253.471 203.346 253.149 202.876C252.827 202.406 252.617 201.869 252.535 201.305C252.454 200.741 252.503 200.166 252.679 199.624L258.034 182.261C258.457 181.064 259.276 180.048 260.356 179.38C261.436 178.712 262.711 178.433 263.972 178.589L273.269 179.756C274.526 179.924 275.689 180.509 276.572 181.418C277.455 182.327 278.006 183.506 278.137 184.766L279.038 203.053Z'\n fill='#63697E'\n />\n <path\n d='M240.267 203.151C240.695 203.525 241.031 203.993 241.248 204.518C241.466 205.042 241.56 205.61 241.522 206.177C241.484 206.744 241.316 207.295 241.031 207.786C240.746 208.278 240.351 208.697 239.877 209.012L225.079 220.49C224.659 220.87 224.158 221.148 223.613 221.303C223.068 221.458 222.495 221.486 221.938 221.385C221.381 221.284 220.854 221.057 220.399 220.72C219.943 220.384 219.571 219.947 219.311 219.444L210.793 203.37C210.264 202.218 210.134 200.923 210.425 199.689C210.716 198.456 211.411 197.355 212.399 196.56L219.701 190.821C220.7 190.036 221.934 189.609 223.205 189.609C224.477 189.609 225.711 190.036 226.71 190.821L240.267 203.151Z'\n fill='#63697E'\n />\n <path\n d='M269.351 284.619C262.469 286.518 255.177 286.336 248.399 284.094C241.621 281.852 235.66 277.651 231.271 272.024C226.883 266.396 224.263 259.594 223.743 252.479C223.224 245.363 224.829 238.254 228.354 232.05C231.879 225.846 237.167 220.825 243.548 217.624C249.929 214.424 257.117 213.186 264.202 214.067C271.287 214.949 277.952 217.911 283.353 222.577C288.753 227.244 292.647 233.407 294.542 240.286C297.074 249.502 295.843 259.346 291.121 267.657C286.398 275.968 278.569 282.068 269.351 284.619ZM244.599 194.639C233.681 197.662 223.904 203.849 216.504 212.421C209.103 220.992 204.411 231.563 203.019 242.798C201.628 254.032 203.6 265.427 208.687 275.543C213.773 285.658 221.745 294.04 231.597 299.631C241.448 305.221 252.737 307.769 264.037 306.953C275.337 306.136 286.141 301.992 295.085 295.043C304.029 288.094 310.711 278.653 314.288 267.911C317.865 257.17 318.175 245.61 315.18 234.692C313.193 227.422 309.788 220.616 305.161 214.664C300.535 208.711 294.778 203.731 288.22 200.007C281.662 196.283 274.433 193.89 266.948 192.965C259.462 192.04 251.867 192.6 244.599 194.615V194.639Z'\n fill='#63697E'\n />\n <path\n d='M264.289 266.21C261.038 267.113 257.593 267.031 254.389 265.975C251.185 264.919 248.366 262.936 246.292 260.278C244.217 257.62 242.978 254.406 242.733 251.044C242.489 247.682 243.248 244.323 244.916 241.392C246.584 238.462 249.085 236.093 252.102 234.584C255.12 233.076 258.517 232.497 261.864 232.92C265.211 233.343 268.357 234.75 270.903 236.962C273.45 239.174 275.281 242.091 276.166 245.344C277.346 249.684 276.76 254.315 274.534 258.225C272.309 262.134 268.625 265.005 264.289 266.21ZM247.982 206.872C239.477 209.201 231.854 213.999 226.077 220.658C220.301 227.316 216.63 235.537 215.53 244.281C214.43 253.024 215.949 261.897 219.896 269.777C223.843 277.658 230.04 284.192 237.703 288.553C245.367 292.914 254.153 294.906 262.949 294.277C271.746 293.649 280.159 290.428 287.123 285.022C294.088 279.616 299.292 272.268 302.076 263.906C304.861 255.545 305.102 246.546 302.768 238.048C299.639 226.656 292.109 216.971 281.836 211.125C271.562 205.278 259.385 203.748 247.982 206.872Z'\n fill='#A4A9B7'\n />\n <path\n d='M264.288 266.21C261.038 267.112 257.592 267.031 254.388 265.975C251.184 264.919 248.366 262.936 246.291 260.278C244.216 257.62 242.978 254.406 242.733 251.044C242.488 247.682 243.248 244.322 244.916 241.392C246.584 238.462 249.085 236.092 252.102 234.584C255.12 233.076 258.517 232.497 261.864 232.92C265.211 233.343 268.357 234.75 270.903 236.962C273.449 239.173 275.281 242.091 276.166 245.344C277.346 249.684 276.76 254.315 274.534 258.225C272.309 262.134 268.625 265.005 264.288 266.21ZM250.732 217.11C244.221 218.878 238.381 222.538 233.954 227.626C229.527 232.714 226.711 239.001 225.864 245.69C225.017 252.379 226.176 259.168 229.195 265.198C232.214 271.227 236.957 276.226 242.822 279.559C248.688 282.892 255.411 284.41 262.141 283.921C268.871 283.432 275.304 280.957 280.624 276.81C285.945 272.664 289.913 267.032 292.027 260.629C294.141 254.226 294.304 247.341 292.497 240.845C290.085 232.178 284.339 224.817 276.514 220.37C268.688 215.923 259.42 214.751 250.732 217.11Z'\n fill='#63697E'\n />\n </g>\n <defs>\n <clipPath id='clip0_1_152'>\n <rect\n width={286}\n height={266}\n fill='var(--center-channel-bg)'\n transform='translate(45 55)'\n />\n </clipPath>\n </defs>\n </svg>\n);\n\nexport default SvgComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst SvgComponent = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '376'}\n height={props.height ? props.height.toString() : '376'}\n fill='var(--center-channel-bg)'\n viewBox='0 0 376 376'\n xmlns='http://www.w3.org/2000/svg'\n >\n <g clipPath='url(#clip0_1_155)'>\n <path\n d='M314.313 195.762L308.159 103.274L266.305 129.357C245.785 125.874 240.115 125.9 224.222 117.876C214.763 113.103 202.481 116.302 196.531 119.708C187.479 109.801 128.716 124.197 122.206 127.19C104.407 122.314 78.2924 101.391 78.2924 101.391L69.3673 206.056L81.2674 208.842C82.4879 212.506 85.2088 221.122 85.2088 221.122C74.1223 235.647 87.4209 252.081 99.7279 246.663C94.3372 260.827 108.653 274.139 120.07 265.109C118.392 278.396 132.377 287.993 142.37 278.757C137.793 294.674 155.542 306.413 165.866 293.462C172.199 298.127 179.084 301.967 186.36 304.891C196.811 309.483 208.533 299.163 206.702 286.341C219.035 300.737 236.86 286.651 232.893 270.862C246.599 281.466 263.254 263.535 254.303 247.772C269.407 256.57 282.579 232.835 267.907 217.743L314.313 195.762Z'\n fill='#FFBC1F'\n />\n <path\n d='M100.973 210.364C108.754 214.028 113.382 225.431 105.448 235.879L102.016 240.059C100.681 242.121 98.8452 243.801 96.6852 244.935C94.5253 246.069 92.1138 246.62 89.6831 246.534C91.2783 247.278 93.0131 247.663 94.7687 247.663C96.5242 247.663 98.259 247.278 99.8542 246.534C100.555 244.684 101.514 242.947 102.702 241.374L106.135 237.169C107.854 234.817 110.139 232.952 112.772 231.751C116.764 221.174 109.669 210.984 100.973 210.364Z'\n fill='#CC8F00'\n />\n <path\n d='M158.491 260.801C166.679 263.045 172.833 273.545 166.425 285.181L163.628 289.927C162.563 292.183 160.962 294.135 158.969 295.608C156.976 297.081 154.654 298.028 152.211 298.364C157.551 299.808 163.755 297.796 167.951 290.185L170.748 285.464C178.376 271.868 168.586 259.666 158.491 260.801Z'\n fill='#CC8F00'\n />\n <path\n d='M123.147 256.931L131.207 244.29C130.964 240.879 129.565 237.659 127.248 235.176C124.93 232.693 121.837 231.1 118.493 230.668C126.122 234.306 130.877 245.734 122.969 256.157L119.536 260.362C118.19 262.42 116.349 264.095 114.186 265.228C112.023 266.361 109.611 266.915 107.178 266.838C109.305 267.834 111.666 268.198 113.989 267.888C116.311 267.577 118.499 266.605 120.299 265.083C120.648 262.187 121.62 259.404 123.147 256.931Z'\n fill='#CC8F00'\n />\n <path\n d='M144.582 233.867C152.642 236.447 158.287 247.437 151.345 258.685L141.657 273.829C140.498 276.012 138.818 277.864 136.77 279.216C134.721 280.568 132.371 281.377 129.935 281.569C135.224 283.349 141.505 281.569 146.056 274.345L155.693 259.227C163.856 246.147 154.753 233.48 144.582 233.867Z'\n fill='#CC8F00'\n />\n <path\n d='M211.457 246.56C214.35 246.008 217.286 245.723 220.23 245.708C212.601 237.969 200.777 243.928 193.759 240.317C198.845 249.037 209.219 246.947 210.465 246.74L222.772 262.503C232.664 275.171 224.781 289.85 214.229 291.682C225.112 295.268 236.147 283.607 232.944 271.043C231.876 269.985 211.457 246.56 211.457 246.56Z'\n fill='#CC8F00'\n />\n <path\n d='M223.561 217.175C228.208 216.281 232.919 215.772 237.647 215.653C230.019 209.513 218.551 215.034 211.177 210.261C212.174 212.434 213.79 214.253 215.816 215.486C217.842 216.718 220.185 217.306 222.543 217.175L245.556 244.006C255.981 256.183 248.709 271.223 238.232 273.597C250.463 276.951 262.134 261.523 254.277 247.798C249.166 245.605 223.561 217.175 223.561 217.175Z'\n fill='#CC8F00'\n />\n <path\n d='M207.618 275.841C200.218 269.779 189.818 274.061 184.962 271.223C187.708 278.189 196.913 277.002 197.396 276.951C205.914 290.443 197.04 304.065 186.487 304.891C196.913 309.431 208.686 299.163 206.829 286.419C206.575 286.135 199.201 276.744 199.201 276.744C201.977 276.207 204.792 275.905 207.618 275.841Z'\n fill='#CC8F00'\n />\n <path\n d='M308.616 187.042C308.616 187.042 300.072 204.689 266.813 214.492C259.301 204.916 250.924 196.071 241.792 188.074C248.835 186.578 252.293 180.825 258.142 179.896C256.26 177.858 248.835 179.122 243.724 181.083C233.706 184.901 210.668 168.184 210.668 168.184L191.445 170.97C177.816 184.282 148.701 191.17 146.997 171.099C145.777 156.858 176.773 147.003 186.105 137.561C198.056 125.642 208.736 111.04 228.442 120.998C244.792 129.253 251.327 128.737 273.17 132.581C280.798 133.897 285.629 137.741 291.401 145.481C286.773 134.645 280.544 130.363 272.432 128.376L307.446 111.478L308.158 103.016L266.253 127.215C246.903 123.99 239.91 124.171 224.399 116.354C214.228 111.194 206.422 112.665 199.633 116.87C187.376 109.827 180.485 111.065 175.858 112.536C161.644 117.051 138.86 117.696 118.925 125.874C122.023 127.095 125.294 127.809 128.613 127.989C148.268 121.798 168.865 122.468 178.273 118.831C180.886 118.135 183.612 117.993 186.281 118.415C188.95 118.836 191.504 119.812 193.784 121.282C189.792 124.816 186.003 129.021 182.062 132.917C172.654 142.307 143.336 155.465 145.319 172.157C146.26 180.154 157.168 201.954 194.14 177.781L209.6 175.639C230.742 187.105 249.599 202.458 265.211 220.916C275.585 232.99 269.127 246.225 258.803 249.295C272.305 252.029 283.951 232.629 270.754 219.033L302.462 201.412L308.616 187.042Z'\n fill='#CC8F00'\n />\n <path\n d='M86.709 219.265C84.9195 214.603 83.5577 209.784 82.6406 204.869L70.2064 196.278L69.3673 206.03L80.0469 208.971C81.168 213.237 82.8802 217.319 85.1324 221.097L86.709 219.265Z'\n fill='#CC8F00'\n />\n <path\n d='M273.857 117.979L303.277 205.488C322.449 196.846 376 164.649 376 164.649L342.919 79.8489C342.919 79.8489 306.43 98.295 273.857 117.979Z'\n fill='#1E325C'\n />\n <path\n d='M40.9386 71L1.52588e-05 170.789C1.52588e-05 170.789 62.2725 206.03 73.9439 208.687C80.4279 210.158 111.475 120.121 109.848 118.986C92.8113 107.17 40.9386 71 40.9386 71Z'\n fill='#1E325C'\n />\n </g>\n <defs>\n <clipPath id='clip0_1_155'>\n <rect\n width={376}\n height={376}\n fill='white'\n />\n </clipPath>\n </defs>\n </svg>\n);\n\nexport default SvgComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst SvgComponent = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '376'}\n height={props.height ? props.height.toString() : '376'}\n fill='var(--center-channel-bg)'\n viewBox='0 0 376 376'\n xmlns='http://www.w3.org/2000/svg'\n >\n <rect\n x={170}\n y={309}\n width={35}\n height={6}\n rx={3}\n fill='#8D93A5'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M257.145 327.922C253.231 331.929 247.65 335 241.529 335H134.471C128.35 335 122.769 331.929 118.855 327.922C114.932 323.906 112 318.258 112 312.145V63.8552C112 57.7407 114.927 52.0924 118.849 48.0755C122.763 44.0673 128.342 41 134.461 41H241.529C247.648 41 253.228 44.0666 257.144 48.0738C261.069 52.0897 264 57.7384 264 63.8552V312.145C264 318.258 261.068 323.906 257.145 327.922ZM241.529 329C249.765 329 258 320.563 258 312.145V63.8552C258 55.4276 249.765 47 241.529 47H134.461C126.226 47 118 55.4276 118 63.8552V312.145C118 320.563 126.235 329 134.471 329H241.529Z'\n fill='#363A45'\n />\n <path\n d='M258 312.145C258 320.563 249.765 329 241.529 329H134.471C126.235 329 118 320.563 118 312.145V63.8552C118 55.4276 126.226 47 134.461 47H241.529C249.765 47 258 55.4276 258 63.8552V312.145Z'\n fill='#3F4350'\n />\n <path\n d='M200 61.4966C200 62.328 199.474 63 198.81 63H177.199C176.544 63 176 62.3072 176 61.4966C176 60.6859 176.544 60 177.199 60H198.773C199.437 60 200 60.6721 200 61.4966Z'\n fill='#8D93A5'\n />\n <path\n d='M252 78H124V299H252V78Z'\n fill='white'\n />\n <path\n opacity={0.85}\n d='M252 78H124V299H252V78Z'\n fill='#3F4350'\n />\n <path\n d='M150.287 88.6721H136.089C134.122 88.6721 132.527 90.2684 132.527 92.2375V106.451C132.527 108.42 134.122 110.016 136.089 110.016H150.287C152.254 110.016 153.849 108.42 153.849 106.451V92.2375C153.849 90.2684 152.254 88.6721 150.287 88.6721Z'\n fill='#32A4EC'\n />\n <path\n d='M180.162 88.6721H165.964C163.997 88.6721 162.402 90.2684 162.402 92.2375V106.451C162.402 108.42 163.997 110.016 165.964 110.016H180.162C182.129 110.016 183.724 108.42 183.724 106.451V92.2375C183.724 90.2684 182.129 88.6721 180.162 88.6721Z'\n fill='#339970'\n />\n <path\n d='M210.012 88.6721H195.814C193.847 88.6721 192.252 90.2684 192.252 92.2375V106.451C192.252 108.42 193.847 110.016 195.814 110.016H210.012C211.979 110.016 213.573 108.42 213.573 106.451V92.2375C213.573 90.2684 211.979 88.6721 210.012 88.6721Z'\n fill='#FFBC1F'\n />\n <path\n d='M239.91 88.6721H225.688C223.721 88.6721 222.126 90.2684 222.126 92.2375V106.451C222.126 108.42 223.721 110.016 225.688 110.016H239.91C241.877 110.016 243.471 108.42 243.471 106.451V92.2375C243.471 90.2684 241.877 88.6721 239.91 88.6721Z'\n fill='#32A4EC'\n />\n <path\n d='M150.287 269H136.089C134.122 269 132.527 270.596 132.527 272.565V286.779C132.527 288.748 134.122 290.344 136.089 290.344H150.287C152.254 290.344 153.849 288.748 153.849 286.779V272.565C153.849 270.596 152.254 269 150.287 269Z'\n fill='#C43133'\n />\n <path\n d='M180.162 269H165.964C163.997 269 162.402 270.596 162.402 272.565V286.779C162.402 288.748 163.997 290.344 165.964 290.344H180.162C182.129 290.344 183.724 288.748 183.724 286.779V272.565C183.724 270.596 182.129 269 180.162 269Z'\n fill='#339970'\n />\n <path\n d='M210.012 269H195.814C193.847 269 192.252 270.596 192.252 272.565V286.779C192.252 288.748 193.847 290.344 195.814 290.344H210.012C211.979 290.344 213.573 288.748 213.573 286.779V272.565C213.573 270.596 211.979 269 210.012 269Z'\n fill='#32A4EC'\n />\n <path\n d='M239.91 269H225.688C223.721 269 222.126 270.596 222.126 272.565V286.779C222.126 288.748 223.721 290.344 225.688 290.344H239.91C241.877 290.344 243.471 288.748 243.471 286.779V272.565C243.471 270.596 241.877 269 239.91 269Z'\n fill='#1279BA'\n />\n <path\n d='M150.287 170.895H136.089C134.122 170.895 132.527 172.492 132.527 174.461V188.674C132.527 190.643 134.122 192.239 136.089 192.239H150.287C152.254 192.239 153.849 190.643 153.849 188.674V174.461C153.849 172.492 152.254 170.895 150.287 170.895Z'\n fill='#339970'\n />\n <path\n d='M180.162 170.895H165.964C163.997 170.895 162.402 172.492 162.402 174.461V188.674C162.402 190.643 163.997 192.239 165.964 192.239H180.162C182.129 192.239 183.724 190.643 183.724 188.674V174.461C183.724 172.492 182.129 170.895 180.162 170.895Z'\n fill='#1279BA'\n />\n <path\n d='M210.012 170.895H195.814C193.847 170.895 192.252 172.492 192.252 174.461V188.674C192.252 190.643 193.847 192.239 195.814 192.239H210.012C211.979 192.239 213.573 190.643 213.573 188.674V174.461C213.573 172.492 211.979 170.895 210.012 170.895Z'\n fill='#32A4EC'\n />\n <path\n d='M150.287 143.487H136.089C134.122 143.487 132.527 145.084 132.527 147.053V161.266C132.527 163.235 134.122 164.831 136.089 164.831H150.287C152.254 164.831 153.849 163.235 153.849 161.266V147.053C153.849 145.084 152.254 143.487 150.287 143.487Z'\n fill='#C43133'\n />\n <path\n d='M180.162 143.487H165.964C163.997 143.487 162.402 145.084 162.402 147.053V161.266C162.402 163.235 163.997 164.831 165.964 164.831H180.162C182.129 164.831 183.724 163.235 183.724 161.266V147.053C183.724 145.084 182.129 143.487 180.162 143.487Z'\n fill='#FFBC1F'\n />\n <path\n d='M210.012 143.487H195.814C193.847 143.487 192.252 145.084 192.252 147.053V161.266C192.252 163.235 193.847 164.831 195.814 164.831H210.012C211.979 164.831 213.573 163.235 213.573 161.266V147.053C213.573 145.084 211.979 143.487 210.012 143.487Z'\n fill='#339970'\n />\n <path\n d='M239.91 143.487H225.688C223.721 143.487 222.126 145.084 222.126 147.053V161.266C222.126 163.235 223.721 164.831 225.688 164.831H239.91C241.877 164.831 243.471 163.235 243.471 161.266V147.053C243.471 145.084 241.877 143.487 239.91 143.487Z'\n fill='#FFBC1F'\n />\n <path\n d='M150.287 116.08H136.089C134.122 116.08 132.527 117.676 132.527 119.645V133.858C132.527 135.827 134.122 137.424 136.089 137.424H150.287C152.254 137.424 153.849 135.827 153.849 133.858V119.645C153.849 117.676 152.254 116.08 150.287 116.08Z'\n fill='#1279BA'\n />\n <path\n d='M180.162 116.08H165.964C163.997 116.08 162.402 117.676 162.402 119.645V133.858C162.402 135.827 163.997 137.424 165.964 137.424H180.162C182.129 137.424 183.724 135.827 183.724 133.858V119.645C183.724 117.676 182.129 116.08 180.162 116.08Z'\n fill='#32A4EC'\n />\n <path\n d='M210.012 116.08H195.814C193.847 116.08 192.252 117.676 192.252 119.645V133.858C192.252 135.827 193.847 137.424 195.814 137.424H210.012C211.979 137.424 213.573 135.827 213.573 133.858V119.645C213.573 117.676 211.979 116.08 210.012 116.08Z'\n fill='#C43133'\n />\n <path\n d='M239.91 116.08H225.688C223.721 116.08 222.126 117.676 222.126 119.645V133.858C222.126 135.827 223.721 137.424 225.688 137.424H239.91C241.877 137.424 243.471 135.827 243.471 133.858V119.645C243.471 117.676 241.877 116.08 239.91 116.08Z'\n fill='#1279BA'\n />\n </svg>\n);\n\nexport default SvgComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst SvgComponent = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '376'}\n height={props.height ? props.height.toString() : '376'}\n fill='var(--center-channel-bg)'\n viewBox='0 0 376 376'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M293.855 118.013L288.883 93.1307C288.135 89.4539 285.961 86.209 282.821 84.0851C259.496 68.2483 228.574 60 188.041 60C147.509 60 116.558 68.2484 93.3171 84.1401C90.1861 86.2723 88.0141 89.5135 87.2555 93.1857L82.1715 118.013C81.8533 119.574 81.9796 121.191 82.5367 122.685C83.0937 124.18 84.0598 125.493 85.328 126.481C92.0322 131.623 95.077 138.414 96.5016 146.992C98.1022 156.013 97.7211 165.266 95.3842 174.129C74.6292 254.33 109.575 290.815 187.902 316C266.117 290.815 301.146 254.33 280.391 174.129C278.069 165.264 277.688 156.014 279.274 146.992C280.81 138.414 283.855 131.623 290.447 126.481C291.766 125.527 292.785 124.227 293.387 122.729C293.99 121.232 294.152 119.597 293.855 118.013Z'\n fill='#CC8F00'\n />\n <path\n d='M188.042 295.709C116.866 271.569 98.2896 241.49 114.491 178.858C117.524 167.345 118.01 155.324 115.916 143.61C114.393 133.27 109.74 123.622 102.563 115.924L106.027 98.877C126.363 85.6247 153.208 79.191 188.042 79.191C222.875 79.191 249.692 85.6247 270.028 98.877L273.492 115.924C266.324 123.625 261.681 133.273 260.167 143.61C258.073 155.324 258.559 167.345 261.592 178.858C277.71 241.463 259.217 271.707 188.042 295.709Z'\n fill='#FFBC1F'\n />\n <path\n d='M188.042 295.709C116.866 271.569 98.2896 241.49 114.491 178.858C117.524 167.345 118.01 155.324 115.916 143.61C114.393 133.27 109.74 123.622 102.563 115.924L106.027 98.877C126.363 85.6247 153.208 79.191 188.042 79.191C222.875 79.191 249.692 85.6247 270.028 98.877L273.492 115.924C266.324 123.625 261.681 133.273 260.167 143.61C258.073 155.324 258.559 167.345 261.592 178.858C277.71 241.463 259.217 271.707 188.042 295.709Z'\n fill='#FFBC1F'\n />\n <path\n d='M188.042 169.098V79.2461C153.208 79.2461 126.363 85.6797 106.027 98.932L102.563 115.979C109.74 123.677 114.393 133.326 115.916 143.665C117.415 152.086 117.575 160.684 116.391 169.153L188.042 169.098Z'\n fill='#FFBC1F'\n />\n <path\n d='M188.041 295.709C259.217 271.706 277.709 241.463 261.591 178.858C260.761 175.643 260.117 172.384 259.664 169.098H188.041V295.709Z'\n fill='#FFBC1F'\n />\n <path\n d='M114.492 178.858C98.29 241.49 116.866 271.569 188.042 295.709V169.098H116.391C115.947 172.384 115.313 175.643 114.492 178.858Z'\n fill='#FFD470'\n />\n <path\n d='M188.041 79.2461V169.153H259.664C258.475 160.683 258.644 152.083 260.166 143.665C261.68 133.328 266.324 123.68 273.491 115.979L270.027 98.932C249.775 85.6247 222.847 79.2461 188.041 79.2461Z'\n fill='#FFD470'\n />\n <path\n d='M229.914 140.861L172.258 203.273L155.526 190.791H146.224L172.258 232.39L239.216 140.861H229.914Z'\n fill='#6F370B'\n />\n </svg>\n);\n\nexport default SvgComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst SvgComponent = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '376'}\n height={props.height ? props.height.toString() : '376'}\n fill='var(--center-channel-bg)'\n viewBox='0 0 376 376'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M68 187.853C68 187.853 72.0233 139.722 97.4808 115.505C122.938 91.2875 147.196 75.1738 198.723 72.1291C250.25 69.0843 282.272 120.822 287.236 130.05C292.201 139.277 307 166.704 307 187.946C307 209.189 307.165 253.807 276.743 273.644C246.321 293.482 216.981 305.029 195.97 303.928C174.959 302.827 121.833 298.424 98.0455 265.377C74.2584 232.329 68 221.673 68 187.853Z'\n fill='#FFBC1F'\n />\n <path\n d='M191.735 97.0247C197.116 95.4807 202.751 95.0106 208.315 95.6417C213.879 96.2727 219.263 97.9923 224.157 100.702C224.438 100.866 224.765 100.935 225.088 100.896C225.412 100.857 225.713 100.713 225.946 100.486C226.179 100.26 226.331 99.9629 226.377 99.642C226.424 99.3211 226.363 98.9939 226.204 98.7109C221.687 90.4436 209.876 75.2908 190.347 94.5187C190.106 94.7428 189.946 95.0408 189.894 95.3654C189.842 95.6899 189.9 96.0224 190.06 96.3102C190.219 96.598 190.471 96.8246 190.774 96.954C191.078 97.0834 191.416 97.1083 191.735 97.0247Z'\n fill='#FFD470'\n />\n <path\n d='M143.808 281.935C131.362 269.124 114.774 253.01 116.421 197.619C118.068 142.228 131.385 122.672 140.914 107.987C146.09 99.9767 164.066 83.4648 186.159 73.0893C143.173 77.9609 120.75 93.2782 97.4808 115.435C72.0233 139.652 68 187.782 68 187.782C68 221.602 74.2349 232.283 98.0455 265.213C121.856 298.143 174.936 302.686 195.97 303.764C195.97 303.811 156.254 294.629 143.808 281.935Z'\n fill='#CC8F00'\n />\n <path\n d='M156.608 229.378C161.549 226.498 164.678 230.409 167.948 232.681C178.348 239.824 188.818 246.546 201.829 247.904C220.652 249.895 235.851 244.368 246.18 227.669C248.297 224.226 250.062 216.989 255.073 219.635C260.697 222.633 254.744 227.739 253.591 231.908L253.379 232.634C250.468 238.619 246.334 243.933 241.241 248.236C236.149 252.539 230.21 255.737 223.804 257.624C208.111 262.308 192.112 262.426 176.748 255.282C169.453 251.797 163.211 246.457 158.655 239.801C156.278 236.803 154.631 233.36 156.608 229.378Z'\n fill='#6F370B'\n />\n <path\n d='M156.607 229.378C158.772 243.15 174.912 255.75 192.253 258.093C217.757 261.535 238.039 253.08 253.426 232.634C253.426 241.862 246.368 246.687 240.391 251.745C218.345 270.482 179.03 267.695 159.642 246.335C155.219 241.651 150.349 236.264 156.607 229.378Z'\n fill='#FFD470'\n />\n <path\n d='M288.776 148.607C288.243 146.827 287.408 145.165 286.875 143.385C286.016 140.498 286.016 137.419 286.875 134.532C286.017 134.415 285.159 134.321 284.255 134.251C277.833 133.665 258.148 134.064 249.059 134.251C241.677 134.424 234.455 136.461 228.052 140.176C222.348 143.309 215.994 145.042 209.504 145.235C203.678 145.374 197.905 144.097 192.671 141.511C188.034 139.591 177.345 138.443 168.627 138.443C159.909 138.443 125.293 139.778 113.19 142.471C101.087 145.165 101.272 152.027 101.272 152.027C102.037 157.952 108.645 157.367 111.312 157.554C113.978 157.741 114.511 159.662 114.697 161.957C115.412 170.814 116.965 179.582 119.334 188.141C122.742 199.851 128.052 201.139 132.202 203.434C136.352 205.729 146.6 205.167 158.889 205.167C170.407 205.114 181.886 203.827 193.135 201.326C199.186 199.617 199.395 194.651 200.09 191.771C200.786 188.89 203.499 172.847 204.728 168.842C205.956 164.838 207.765 163.877 208.716 163.479C210.393 163.158 212.129 163.431 213.631 164.252C216.089 165.212 217.967 170.177 218.732 174.393C220.314 181.341 223 187.985 226.685 194.066C230.278 199.242 239.924 198.469 251.841 198.469C261.409 198.552 270.949 197.435 280.244 195.143C285.901 193.551 288.359 186.431 289.518 182.613C291.032 175.623 292.047 168.532 292.556 161.395C292.741 159.053 292.973 157.39 293.228 155.961C291.176 153.911 289.648 151.387 288.776 148.607Z'\n fill='#CC8F00'\n />\n <path\n d='M106.976 143.151C106.976 143.151 106.79 136.265 118.893 133.595C130.996 130.925 165.636 129.59 174.354 129.59C183.072 129.59 193.83 130.738 198.374 132.635C203.613 135.234 209.397 136.512 215.231 136.359C221.721 136.166 228.075 134.433 233.779 131.3C240.182 127.585 247.404 125.548 254.786 125.375C263.875 125.187 283.559 124.813 289.982 125.375C296.404 125.937 301.899 127.295 303.893 129.192C305.887 131.089 307.487 133.876 306.745 135.703C305.132 138.049 303.15 140.114 300.879 141.816C299.534 142.963 298.561 145.633 298.027 152.519C297.527 159.655 296.519 166.746 295.013 173.737C293.877 177.555 291.419 184.674 285.739 186.29C276.441 188.562 266.902 189.671 257.336 189.593C245.419 189.593 235.773 190.366 232.179 185.213C228.495 179.124 225.809 172.472 224.227 165.517C223.485 161.325 221.584 156.336 219.126 155.399C217.624 154.578 215.888 154.305 214.21 154.626C213.26 155.001 211.358 155.961 210.222 159.966C209.086 163.971 206.443 180.037 205.585 182.918C204.727 185.799 204.658 190.74 198.629 192.473C187.449 194.961 176.041 196.264 164.593 196.361C152.304 196.361 142.079 196.947 137.906 194.651C133.732 192.356 128.446 191.021 125.061 179.358C122.68 170.802 121.127 162.033 120.424 153.174C120.215 150.832 119.658 148.959 117.015 148.771C114.372 148.584 107.741 149.076 106.976 143.151Z'\n fill='#090A0B'\n />\n <path\n d='M131.506 154.205C131.523 157.338 131.74 160.467 132.155 163.573C132.677 167.986 133.776 172.31 135.424 176.431C136.947 179.958 139.342 183.031 142.38 185.354C145.937 186.652 149.706 187.257 153.486 187.134C159.051 187.274 177.344 187.016 180.104 187.134C182.863 187.251 191.836 187.274 194.015 184.979C197.546 181.958 199.877 177.749 200.577 173.128C201.319 166.758 201.574 153.362 201.574 150.692C201.574 148.022 201.829 146.008 199.696 144.321C197.064 142.205 193.785 141.078 190.421 141.136C186.526 141.277 157.961 140.996 151.701 141.136C145.441 141.277 138.462 141.136 135.795 143.806C134.261 145.025 133.061 146.621 132.31 148.441C131.559 150.262 131.282 152.246 131.506 154.205Z'\n fill='#2D3039'\n />\n <path\n d='M230.672 153.596C230.672 153.596 231.692 161.887 232.573 165.587C233.723 169.788 235.506 173.785 237.859 177.438C239.622 179.78 240.178 180.88 244.815 181.372C249.452 181.864 261.045 182.286 266.146 182.145C270.981 182.169 275.79 181.442 280.406 179.991C283.65 178.864 286.35 176.537 287.964 173.48C289.641 169.182 290.431 164.583 290.283 159.966C290.283 153.994 290.028 145.914 289.773 143.408C289.518 140.902 285.877 135.89 279.061 135.633C269.124 135.442 259.184 135.825 249.29 136.78C243.851 137.397 238.535 138.842 233.524 141.066C231.182 142.495 229.513 145.727 230.672 153.596Z'\n fill='#2D3039'\n />\n <path\n d='M133.082 181.489C133.082 181.489 133.291 180.529 133.94 180.529C134.59 180.529 135.262 180.529 136.398 182.169C137.534 183.808 138.485 186.244 140.293 187.157C142.292 188.232 144.549 188.719 146.808 188.562C150.982 188.75 154.39 188.071 155.526 188.562C156.662 189.054 157.219 191.513 155.99 191.607C154.761 191.701 145.765 191.794 143.029 191.607C140.517 191.633 138.068 190.809 136.073 189.265C134.662 187.895 133.617 186.187 133.036 184.3C132.826 183.373 132.842 182.409 133.082 181.489Z'\n fill='#3F4350'\n />\n <path\n d='M140.294 169.334C140.417 169.362 140.544 169.364 140.669 169.341C140.793 169.318 140.911 169.27 141.017 169.2C141.123 169.131 141.214 169.04 141.285 168.934C141.355 168.829 141.405 168.71 141.43 168.585C141.615 167.625 141.221 163.901 141.43 159.873C141.638 155.844 141.801 152.519 144.258 150.903C146.526 149.31 149.009 148.056 151.631 147.179C153.162 146.874 155.04 146.312 156.268 146.125C157.497 145.937 158.448 145.258 158.263 144.79C158.077 144.322 154.182 144.298 151.817 144.298C148.513 144.063 145.197 144.063 141.893 144.298C140.201 144.79 137.929 143.83 136.978 146.968C136.227 150.164 135.968 153.458 136.213 156.734C136.306 159.31 138.021 169.147 140.294 169.334Z'\n fill='#505667'\n />\n <path\n d='M153.532 134.555C153.532 134.555 153.347 135.258 155.434 135.562C157.52 135.867 189.865 136.476 194.015 136.85C198.165 137.225 194.015 134.181 190.05 133.408C183.57 132.018 176.985 131.188 170.365 130.925C163.549 130.925 152.767 131.487 153.532 134.555Z'\n fill='#505667'\n />\n <path\n d='M186.828 150.809C188.038 151.151 189.104 151.883 189.865 152.893C190.816 154.439 191.558 157.109 193.644 156.734C195.731 156.359 196.867 156.383 197.632 153.783C198.095 152.562 198.162 151.224 197.825 149.962C197.487 148.699 196.762 147.577 195.754 146.757C193.436 144.86 191.372 143.478 189.494 144.064C187.616 144.649 184.857 145.048 184.857 146.757C184.857 148.467 183.813 148.701 186.828 150.809Z'\n fill='#63697E'\n />\n <path\n d='M278.412 144.251C279.207 144.48 279.907 144.966 280.406 145.633C281.032 146.664 281.542 148.42 282.933 148.162C284.324 147.905 285.066 147.952 285.553 146.219C285.875 145.408 285.929 144.515 285.708 143.671C285.487 142.827 285.001 142.077 284.324 141.535C282.794 140.27 281.426 139.356 280.174 139.755C278.922 140.153 277.159 140.387 277.159 141.535C277.159 142.682 276.394 142.846 278.412 144.251Z'\n fill='#63697E'\n />\n <path\n d='M237.35 164.112C239.251 164.112 238.486 161.582 238.695 158.865C238.904 156.149 239.622 149.497 242.289 147.741C245.227 145.771 248.407 144.196 251.748 143.057C254.577 142.284 253.812 141.558 251.748 141.16C247.937 140.914 244.109 141.23 240.387 142.097C238.913 142.588 237.61 143.5 236.635 144.721C235.66 145.942 235.055 147.422 234.892 148.982C234.707 152.331 234.707 164.041 237.35 164.112Z'\n fill='#505667'\n />\n <path\n d='M233.315 180.529C233.742 182.276 234.669 183.856 235.981 185.073C236.863 185.831 237.884 186.406 238.986 186.764C240.089 187.122 241.25 187.255 242.404 187.157C246.809 187.368 249.476 187.977 250.357 187.157C251.238 186.337 250.867 184.698 249.847 184.698C247.24 184.946 244.61 184.724 242.079 184.042C240.132 183.035 237.442 181.888 236.723 179.991C236.005 178.093 235.216 176.805 234.08 177.04C232.944 177.274 232.596 178.562 233.315 180.529Z'\n fill='#3F4350'\n />\n <path\n d='M257.916 130.925C257.916 130.925 257.568 131.44 260.234 131.44C262.9 131.44 277.948 131.042 283.42 131.44C287.14 131.62 290.847 132.003 294.526 132.588C296.543 132.963 297.54 133.22 297.795 132.588C298.05 131.956 296.798 130.246 294.387 129.52C290.414 128.51 286.366 127.829 282.284 127.482C278.25 127.108 271.943 127.482 268.14 127.482C264.848 127.639 261.586 128.198 258.426 129.145C257.8 129.403 257.174 129.778 257.916 130.925Z'\n fill='#505667'\n />\n <path\n d='M218.824 142.916C218.605 144.116 218.605 145.346 218.824 146.546C219.195 148.069 218.824 150.153 220.702 150.27C222.58 150.387 223.925 150.059 224.296 148.116C224.682 145.79 224.682 143.415 224.296 141.09C223.925 140.153 222.719 138.443 221.607 138.747C220.494 139.052 218.824 139.286 218.824 142.916Z'\n fill='#505667'\n />\n </svg>\n);\n\nexport default SvgComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport TrialBenefitsModalStepMore from 'components/trial_benefits_modal/trial_benefits_modal_step_more';\n\nimport './learn_more_trial_modal_step.scss';\n\nexport type LearnMoreTrialModalStepProps = {\n id: string;\n title: string;\n description: string;\n svgWrapperClassName: string;\n svgElement: React.ReactNode;\n bottomLeftMessage?: string;\n pageURL?: string;\n buttonLabel?: string;\n handleOnClose?: () => void;\n}\n\nconst LearnMoreTrialModalStep = (\n {\n id,\n title,\n description,\n svgWrapperClassName,\n svgElement,\n bottomLeftMessage,\n pageURL,\n buttonLabel,\n handleOnClose,\n }: LearnMoreTrialModalStepProps) => {\n return (\n <div\n id={`learnMoreTrialModalStep-${id}`}\n className='LearnMoreTrialModalStep slide-container'\n >\n <div className={`${svgWrapperClassName} svg-wrapper`}>\n {svgElement}\n </div>\n <div className='title'>\n {title}\n </div>\n <div className='description'>\n {description}\n </div>\n {(pageURL && buttonLabel) && (\n <TrialBenefitsModalStepMore\n id={id}\n route={pageURL}\n message={buttonLabel}\n onClick={handleOnClose}\n styleLink={true}\n telemetryId={'learn_more_trial_modal'}\n />\n )}\n {bottomLeftMessage && (\n <div className='bottom-text-left-message'>\n {bottomLeftMessage}\n </div>\n )}\n </div>\n );\n};\n\nexport default LearnMoreTrialModalStep;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect, useMemo, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {closeModal} from 'actions/views/modals';\n\nimport SystemRolesSVG from 'components/admin_console/feature_discovery/features/images/system_roles_svg';\nimport Carousel from 'components/common/carousel/carousel';\nimport {BtnStyle} from 'components/common/carousel/carousel_button';\nimport GuestAccessSvg from 'components/common/svg_images_components/guest_access_svg';\nimport MonitorImacLikeSVG from 'components/common/svg_images_components/monitor_imaclike_svg';\n\nimport {ConsolePages, DocLinks, ModalIdentifiers, TELEMETRY_CATEGORIES} from 'utils/constants';\n\nimport LearnMoreTrialModalStep from './learn_more_trial_modal_step';\nimport type {LearnMoreTrialModalStepProps} from './learn_more_trial_modal_step';\nimport StartTrialBtn from './start_trial_btn';\n\ntype Props = {\n onClose?: () => void;\n onExited: () => void;\n launchedBy?: string;\n}\n\nconst LearnMoreTrialModal = (\n {\n onClose,\n onExited,\n launchedBy = '',\n }: Props): JSX.Element | null => {\n const {formatMessage} = useIntl();\n const [embargoed, setEmbargoed] = useState(false);\n const dispatch = useDispatch();\n\n // Cloud conditions\n const license = useSelector(getLicense);\n const isCloud = license?.Cloud === 'true';\n\n const handleEmbargoError = useCallback(() => {\n setEmbargoed(true);\n }, []);\n\n // close this modal once start trial btn is clicked and trial has started successfully\n const dismissAction = useCallback(() => {\n dispatch(closeModal(ModalIdentifiers.LEARN_MORE_TRIAL_MODAL));\n }, []);\n\n const startTrialBtn = (\n <StartTrialBtn\n handleEmbargoError={handleEmbargoError}\n telemetryId={`start_trial__learn_more_modal__${launchedBy}`}\n onClick={dismissAction}\n />\n );\n\n const handleOnClose = useCallback(() => {\n if (onClose) {\n onClose();\n }\n\n onExited();\n }, [onClose, onExited]);\n\n useEffect(() => {\n trackEvent(\n TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_MODAL,\n 'learn_more_trial_modal_view',\n );\n }, []);\n\n const buttonLabel = formatMessage({id: 'learn_more_trial_modal_step.learnMoreAboutFeature', defaultMessage: 'Learn more about this feature.'});\n\n const steps: LearnMoreTrialModalStepProps[] = useMemo(() => [\n {\n id: 'useSso',\n title: formatMessage({id: 'learn_more_about_trial.modal.useSsoTitle', defaultMessage: 'Use SSO (with OpenID, SAML, Google, O365)'}),\n description: formatMessage({id: 'learn_more_about_trial.modal.useSsoDescription', defaultMessage: 'Sign on quickly and easily with our SSO feature that works with OpenID, SAML, Google, and O365.'}),\n svgWrapperClassName: 'guestAccessSvg',\n svgElement: (\n <GuestAccessSvg\n width={400}\n height={180}\n />\n ),\n pageURL: DocLinks.SETUP_SAML,\n buttonLabel,\n },\n {\n id: 'ldap',\n title: formatMessage({id: 'learn_more_about_trial.modal.ldapTitle', defaultMessage: 'Synchronize your Active Directory/LDAP groups'}),\n description: formatMessage({id: 'learn_more_about_trial.modal.ldapDescription', defaultMessage: 'Use AD/LDAP groups to organize and apply actions to multiple users at once. Manage team and channel memberships, permissions and more.'}),\n svgWrapperClassName: 'personMacSvg',\n svgElement: (\n <MonitorImacLikeSVG\n width={400}\n height={180}\n />\n ),\n pageURL: DocLinks.SETUP_LDAP,\n buttonLabel,\n },\n {\n id: 'systemConsole',\n title: formatMessage({id: 'learn_more_about_trial.modal.systemConsoleTitle', defaultMessage: 'Provide controlled access to the System Console'}),\n description: formatMessage({id: 'learn_more_about_trial.modal.systemConsoleDescription', defaultMessage: 'Assign customizable admin roles to give designated users read and/or write access to select sections of System Console.'}),\n svgWrapperClassName: 'personBoxSvg',\n svgElement: (\n <SystemRolesSVG\n width={400}\n height={180}\n />\n ),\n pageURL: ConsolePages.LICENSE,\n buttonLabel,\n },\n ], []);\n\n const handleOnPrevNextSlideClick = useCallback((slideIndex: number) => {\n const slideId = steps[slideIndex - 1]?.id;\n\n if (slideId) {\n trackEvent(\n TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_MODAL,\n 'learn_more_trial_modal_slide_shown_' + slideId,\n );\n }\n }, [steps]);\n\n const getSlides = useMemo(\n () =>\n steps.map(({id, ...rest}) => (\n <LearnMoreTrialModalStep\n {...rest}\n id={id}\n key={id}\n />\n )),\n [],\n );\n\n const headerText = formatMessage({id: 'learn_more_trial_modal.pretitle', defaultMessage: 'With Enterprise, you can...'});\n\n if (isCloud) {\n // Cloud users shouldn't be able to reach this modal, but in case they do, return nothing.\n return null;\n }\n\n return (\n <GenericModal\n compassDesign={true}\n className='LearnMoreTrialModal'\n id='learnMoreTrialModal'\n onExited={handleOnClose}\n modalHeaderText={headerText}\n >\n <Carousel\n dataSlides={getSlides}\n id={'learnMoreTrialModalCarousel'}\n infiniteSlide={false}\n onNextSlideClick={handleOnPrevNextSlideClick}\n onPrevSlideClick={handleOnPrevNextSlideClick}\n disableNextButton={embargoed}\n btnsStyle={BtnStyle.CHEVRON}\n actionButton={startTrialBtn}\n />\n </GenericModal>\n );\n};\n\nexport default LearnMoreTrialModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {matchPath, useLocation} from 'react-router-dom';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {isCurrentUserGuestUser, isCurrentUserSystemAdmin, isFirstAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackEvent as trackEventAction} from 'actions/telemetry_actions';\nimport {openModal} from 'actions/views/modals';\nimport {\n openInvitationsModal,\n setShowOnboardingCompleteProfileTour,\n setShowOnboardingVisitConsoleTour,\n switchToChannels,\n} from 'actions/views/onboarding_tasks';\nimport {setProductMenuSwitcherOpen} from 'actions/views/product_menu';\nimport {setStatusDropdown} from 'actions/views/status_dropdown';\nimport {getOnboardingTaskPreferences} from 'selectors/onboarding';\n\nimport Channels from 'components/common/svg_images_components/channels_svg';\nimport Gears from 'components/common/svg_images_components/gears_svg';\nimport Handshake from 'components/common/svg_images_components/handshake_svg';\nimport Phone from 'components/common/svg_images_components/phone_svg';\nimport Security from 'components/common/svg_images_components/security_svg';\nimport Sunglasses from 'components/common/svg_images_components/sunglasses_svg';\nimport LearnMoreTrialModal from 'components/learn_more_trial_modal/learn_more_trial_modal';\nimport {\n AutoTourStatus,\n FINISHED,\n OnboardingTourSteps,\n OnboardingTourStepsForGuestUsers,\n TTNameMapToATStatusKey,\n TutorialTourName,\n} from 'components/tours';\n\nimport {ModalIdentifiers, TELEMETRY_CATEGORIES} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport {OnboardingTaskCategory, OnboardingTaskList, OnboardingTasksName, TaskNameMapToSteps} from './constants';\nimport {generateTelemetryTag} from './utils';\n\nconst useGetTaskDetails = () => {\n const {formatMessage} = useIntl();\n return {\n [OnboardingTasksName.CHANNELS_TOUR]: {\n id: 'task_learn_more_about_messaging',\n svg: Channels,\n message: formatMessage({\n id: 'onboardingTask.checklist.task_learn_more_about_messaging',\n defaultMessage: 'Take a tour of Channels.',\n }),\n },\n [OnboardingTasksName.INVITE_PEOPLE]: {\n id: 'task_invite_team_members',\n svg: Handshake,\n message: formatMessage({\n id: 'onboardingTask.checklist.task_invite_team_members',\n defaultMessage: 'Invite team members to the workspace.',\n }),\n },\n [OnboardingTasksName.COMPLETE_YOUR_PROFILE]: {\n id: 'task_complete_your_profile',\n svg: Sunglasses,\n message: formatMessage({\n id: 'onboardingTask.checklist.task_complete_your_profile',\n defaultMessage: 'Complete your profile.',\n }),\n },\n\n [OnboardingTasksName.DOWNLOAD_APP]: {\n id: 'task_download_mm_apps',\n svg: Phone,\n message: formatMessage({\n id: 'onboardingTask.checklist.task_download_mm_apps',\n defaultMessage: 'Download the Desktop and Mobile Apps.',\n }),\n },\n\n [OnboardingTasksName.VISIT_SYSTEM_CONSOLE]: {\n id: 'task_visit_system_console',\n svg: Gears,\n message: formatMessage({\n id: 'onboardingTask.checklist.task_visit_system_console',\n defaultMessage: 'Visit the System Console to configure your workspace.',\n }),\n },\n [OnboardingTasksName.START_TRIAL]: {\n id: 'task_start_enterprise_trial',\n svg: Security,\n message: formatMessage({\n id: 'onboardingTask.checklist.task_start_enterprise_trial',\n defaultMessage: 'Learn more about Enterprise-level high-security features.',\n }),\n },\n };\n};\n\nexport const useTasksList = () => {\n const prevTrialLicense = useSelector((state: GlobalState) => state.entities.admin.prevTrialLicense);\n const license = useSelector(getLicense);\n const isPrevLicensed = prevTrialLicense?.IsLicensed;\n const isCurrentLicensed = license?.IsLicensed;\n const isUserAdmin = useSelector((state: GlobalState) => isCurrentUserSystemAdmin(state));\n const isGuestUser = useSelector((state: GlobalState) => isCurrentUserGuestUser(state));\n const isUserFirstAdmin = useSelector(isFirstAdmin);\n\n // Cloud conditions\n const subscription = useSelector((state: GlobalState) => state.entities.cloud.subscription);\n const isCloud = license?.Cloud === 'true';\n const isFreeTrial = subscription?.is_free_trial === 'true';\n const hadPrevCloudTrial = subscription?.is_free_trial === 'false' && subscription?.trial_end_at > 0;\n\n // Show this CTA if the instance is currently not licensed and has never had a trial license loaded before\n // if Cloud, show if not in trial and had never been on trial\n const selfHostedTrialCondition = isCurrentLicensed === 'false' && isPrevLicensed === 'false';\n const cloudTrialCondition = isCloud && !isFreeTrial && !hadPrevCloudTrial;\n\n const showStartTrialTask = selfHostedTrialCondition || cloudTrialCondition;\n\n const list: Record<string, string> = {...OnboardingTasksName};\n if (!showStartTrialTask) {\n delete list.START_TRIAL;\n }\n\n if (!isUserFirstAdmin && !isUserAdmin) {\n delete list.VISIT_SYSTEM_CONSOLE;\n delete list.START_TRIAL;\n }\n\n // invite other users is hidden for guest users\n if (isGuestUser) {\n delete list.INVITE_PEOPLE;\n }\n\n return Object.values(list);\n};\n\nexport const useTasksListWithStatus = () => {\n const dataInDb = useSelector(getOnboardingTaskPreferences);\n const tasksList = useTasksList();\n const getTaskDetails = useGetTaskDetails();\n return useMemo(() =>\n tasksList.map((task) => {\n const status = dataInDb.find((pref) => pref.name === task)?.value;\n return {\n name: task,\n status: status === FINISHED.toString(),\n label: () => {\n const {id, svg, message} = getTaskDetails[task];\n return (\n <div key={id}>\n <picture>\n {React.createElement(svg, {width: 24, height: 24})}\n </picture>\n <span>{message}</span>\n </div>\n );\n },\n };\n }), [dataInDb, tasksList]);\n};\n\nexport const useHandleOnBoardingTaskData = () => {\n const dispatch = useDispatch();\n const currentUserId = useSelector(getCurrentUserId);\n const storeSavePreferences = useCallback(\n (taskCategory: string, taskName, step: number) => {\n const preferences = [\n {\n user_id: currentUserId,\n category: taskCategory,\n name: taskName,\n value: step.toString(),\n },\n ];\n dispatch(savePreferences(currentUserId, preferences));\n },\n [currentUserId],\n );\n\n return useCallback((\n taskName: string,\n step: number,\n trackEvent = true,\n trackEventSuffix?: string,\n taskCategory = OnboardingTaskCategory,\n ) => {\n storeSavePreferences(taskCategory, taskName, step);\n if (trackEvent) {\n const eventSuffix = trackEventSuffix ? `${step}--${trackEventSuffix}` : step.toString();\n const telemetryTag = generateTelemetryTag(OnboardingTaskCategory, taskName, eventSuffix);\n trackEventAction(OnboardingTaskCategory, telemetryTag);\n }\n }, [storeSavePreferences]);\n};\n\nexport const useHandleOnBoardingTaskTrigger = () => {\n const dispatch = useDispatch();\n const {pathname} = useLocation();\n\n const handleSaveData = useHandleOnBoardingTaskData();\n const currentUserId = useSelector(getCurrentUserId);\n const isGuestUser = useSelector((state: GlobalState) => isCurrentUserGuestUser(state));\n const inAdminConsole = matchPath(pathname, {path: '/admin_console'}) != null;\n const inChannels = matchPath(pathname, {path: '/:team/channels/:chanelId'}) != null;\n\n return (taskName: string) => {\n switch (taskName) {\n case OnboardingTasksName.CHANNELS_TOUR: {\n handleSaveData(taskName, TaskNameMapToSteps[taskName].STARTED, true);\n const tourCategory = TutorialTourName.ONBOARDING_TUTORIAL_STEP;\n const preferences = [\n {\n user_id: currentUserId,\n category: tourCategory,\n name: currentUserId,\n\n // use SEND_MESSAGE when user is guest (channel creation and invitation are restricted), so only message box and the configure tips are shown\n value: isGuestUser ? OnboardingTourStepsForGuestUsers.SEND_MESSAGE.toString() : OnboardingTourSteps.CHANNELS_AND_DIRECT_MESSAGES.toString(),\n },\n {\n user_id: currentUserId,\n category: tourCategory,\n name: TTNameMapToATStatusKey[tourCategory],\n value: AutoTourStatus.ENABLED.toString(),\n },\n ];\n dispatch(savePreferences(currentUserId, preferences));\n if (!inChannels) {\n dispatch(switchToChannels());\n }\n break;\n }\n case OnboardingTasksName.COMPLETE_YOUR_PROFILE: {\n dispatch(setStatusDropdown(true));\n dispatch(setShowOnboardingCompleteProfileTour(true));\n handleSaveData(taskName, TaskNameMapToSteps[taskName].STARTED, true);\n if (inAdminConsole) {\n dispatch(switchToChannels());\n }\n break;\n }\n case OnboardingTasksName.VISIT_SYSTEM_CONSOLE: {\n dispatch(setProductMenuSwitcherOpen(true));\n dispatch(setShowOnboardingVisitConsoleTour(true));\n handleSaveData(taskName, TaskNameMapToSteps[taskName].STARTED, true);\n break;\n }\n case OnboardingTasksName.INVITE_PEOPLE: {\n localStorage.setItem(OnboardingTaskCategory, 'true');\n\n if (inAdminConsole) {\n dispatch(openInvitationsModal(1000));\n } else {\n dispatch(openInvitationsModal());\n }\n handleSaveData(taskName, TaskNameMapToSteps[taskName].FINISHED, true);\n break;\n }\n case OnboardingTasksName.DOWNLOAD_APP: {\n handleSaveData(taskName, TaskNameMapToSteps[taskName].FINISHED, true);\n const preferences = [{\n user_id: currentUserId,\n category: OnboardingTaskCategory,\n name: OnboardingTaskList.ONBOARDING_TASK_LIST_OPEN,\n value: 'true',\n }];\n dispatch(savePreferences(currentUserId, preferences));\n window.open('https://mattermost.com/download#desktop', '_blank', 'noopener,noreferrer');\n break;\n }\n case OnboardingTasksName.START_TRIAL: {\n trackEventAction(\n TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_TASK_LIST,\n 'open_start_trial_modal',\n );\n dispatch(openModal({\n modalId: ModalIdentifiers.LEARN_MORE_TRIAL_MODAL,\n dialogType: LearnMoreTrialModal,\n dialogProps: {\n launchedBy: 'onboarding',\n },\n }));\n\n handleSaveData(taskName, TaskNameMapToSteps[taskName].FINISHED, true);\n break;\n }\n default:\n }\n };\n};\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport const generateTelemetryTag = (category: string, name: string, suffix: string) => {\n return `${category}--${name}--${suffix}`;\n};\n\nexport function getAnalyticsCategory(isAdmin: boolean) {\n return isAdmin ? 'admin_onboarding' : 'end_user_onboarding';\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getData, overwrite} from 'country-list';\n\ntype Country = {\n name: string;\n code: string;\n}\n\noverwrite([{\n code: 'TW',\n name: 'Taiwan',\n}]);\n\nexport const COUNTRIES = getData().sort((a: Country, b: Country) => (a.name > b.name ? 1 : -1));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getName} from 'country-list';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport DropdownInput from 'components/dropdown_input';\n\nimport {COUNTRIES} from 'utils/countries';\n\ntype CountrySelectorProps = {\n onChange: (option: any) => void;\n value?: string;\n testId?: string;\n}\n\nconst CountrySelector = (props: CountrySelectorProps) => {\n const {formatMessage} = useIntl();\n\n return (\n <DropdownInput\n testId={props.testId || 'CountrySelector'}\n onChange={props.onChange}\n value={props.value ? {value: props.value, label: getName(props.value) || ''} : undefined}\n options={COUNTRIES.map((country) => ({\n value: country.code,\n label: country.name,\n }))}\n legend={formatMessage({\n id: 'payment_form.country',\n defaultMessage: 'Country/Region',\n })}\n placeholder={formatMessage({\n id: 'payment_form.country',\n defaultMessage: 'Country/Region',\n })}\n name={'country_dropdown'}\n />\n );\n};\n\nexport default CountrySelector;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getMyTeams} from 'mattermost-redux/selectors/entities/teams';\n\nimport Gate from './gate';\n\nexport type Props = {\n\n /**\n * Permissions enough to pass the gate (binary OR)\n */\n permissions: string[];\n\n /**\n * Invert the permission (used for else)\n */\n invert?: boolean;\n\n /**\n * Content protected by the permissions gate\n */\n children: React.ReactNode;\n};\n\nconst AnyTeamPermissionGate = ({permissions, children, invert = false}: Props) => {\n const hasPermission = useSelector((state: GlobalState) => {\n const teams = getMyTeams(state);\n for (const team of teams) {\n for (const permission of permissions) {\n if (haveITeamPermission(state, team.id, permission)) {\n return true;\n }\n }\n }\n\n return false;\n });\n\n return (\n <Gate\n invert={invert}\n hasPermission={hasPermission}\n >\n {children}\n </Gate>\n );\n};\n\nexport default React.memo(AnyTeamPermissionGate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport Gate from './gate';\n\ntype Props = {\n\n /**\n * Channel to check the permission\n */\n channelId?: string;\n\n /**\n * Team to check the permission\n */\n teamId?: string;\n\n /**\n * Permissions enough to pass the gate (binary OR)\n */\n permissions: string[];\n\n /**\n * Invert the permission (used for else)\n */\n invert?: boolean;\n\n /**\n * Content protected by the permissions gate\n */\n children: React.ReactNode;\n}\n\nconst ChannelPermissionGate = ({channelId, teamId, permissions, children, invert = false}: Props) => {\n const hasPermission = useSelector((state: GlobalState) => {\n if (!channelId || teamId === null || typeof teamId === 'undefined') {\n return false;\n }\n for (const permission of permissions) {\n if (haveIChannelPermission(state, teamId, channelId, permission)) {\n return true;\n }\n }\n return false;\n });\n\n return (\n <Gate\n invert={invert}\n hasPermission={hasPermission}\n >\n {children}\n </Gate>\n );\n};\n\nexport default React.memo(ChannelPermissionGate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n hasPermission: boolean;\n invert?: boolean;\n children: React.ReactNode;\n}\n\nconst Gate = ({\n hasPermission,\n invert,\n children,\n}: Props) => {\n if (hasPermission !== invert) {\n return <>{children}</>;\n }\n return null;\n};\n\nexport default Gate;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles_helpers';\n\nimport Gate from './gate';\n\ntype Props = {\n permissions: string[];\n\n /**\n * Invert the permission (used for else)\n */\n invert?: boolean;\n\n /**\n * Content protected by the permissions gate\n */\n children: React.ReactNode;\n};\n\nconst SystemPermissionGate = ({\n invert = false,\n permissions,\n children,\n}: Props) => {\n const hasPermission = useSelector((state: GlobalState) => {\n for (const permission of permissions) {\n if (haveISystemPermission(state, {permission})) {\n return true;\n }\n }\n\n return false;\n });\n\n return (\n <Gate\n invert={invert}\n hasPermission={hasPermission}\n >\n {children}\n </Gate>\n );\n};\n\nexport default React.memo(SystemPermissionGate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport type {GlobalState} from 'types/store';\n\nimport Gate from './gate';\n\ntype Props = {\n\n /**\n * Team to check the permission\n */\n teamId?: string;\n\n /**\n * Permissions enough to pass the gate (binary OR)\n */\n permissions: string[];\n\n /**\n * Invert the permission (used for else)\n */\n invert?: boolean;\n\n /**\n * Content protected by the permissions gate\n */\n children: React.ReactNode;\n};\n\nconst TeamPermissionGate = ({\n teamId,\n permissions,\n invert = false,\n children,\n}: Props) => {\n const hasPermission = useSelector((state: GlobalState) => {\n if (!teamId) {\n return false;\n }\n\n for (const permission of permissions) {\n if (haveITeamPermission(state, teamId, permission)) {\n return true;\n }\n }\n\n return false;\n });\n\n return (\n <Gate\n invert={invert}\n hasPermission={hasPermission}\n >\n {children}\n </Gate>\n );\n};\n\nexport default React.memo(TeamPermissionGate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {MarketplaceApp, MarketplacePlugin} from '@mattermost/types/marketplace';\n\nexport function isPlugin(item: MarketplacePlugin | MarketplaceApp): item is MarketplacePlugin {\n return (item as MarketplacePlugin).manifest.id !== undefined;\n}\n\nexport function getName(item: MarketplacePlugin | MarketplaceApp): string {\n if (isPlugin(item)) {\n return item.manifest.name;\n }\n return item.manifest.display_name;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {MarketplaceApp, MarketplacePlugin} from '@mattermost/types/marketplace';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {isPlugin} from 'mattermost-redux/utils/marketplace';\nimport {secureGetFromRecord} from 'mattermost-redux/utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\nexport const getPlugins = (state: GlobalState): MarketplacePlugin[] => state.views.marketplace.plugins;\n\nexport const getApps = (state: GlobalState): MarketplaceApp[] => state.views.marketplace.apps;\n\nexport const getListing = createSelector(\n 'getListing',\n getPlugins,\n getApps,\n (plugins, apps) => {\n if (plugins) {\n return (plugins as Array<MarketplacePlugin | MarketplaceApp>).concat(apps);\n }\n\n return apps;\n },\n);\n\nexport const getInstalledListing = createSelector(\n 'getInstalledListing',\n getListing,\n (listing) => listing.filter((i) => {\n if (isPlugin(i)) {\n return i.installed_version !== '';\n }\n\n return i.installed;\n }),\n);\n\nexport const getPlugin = (state: GlobalState, id: string): MarketplacePlugin | undefined =>\n getPlugins(state).find(((p) => p.manifest && p.manifest.id === id));\n\nexport const getApp = (state: GlobalState, id: string): MarketplaceApp | undefined =>\n getApps(state).find(((p) => p.manifest && p.manifest.app_id === id));\n\nexport const getFilter = (state: GlobalState): string => state.views.marketplace.filter;\n\nexport const getInstalling = (state: GlobalState, id: string): boolean => Boolean(secureGetFromRecord(state.views.marketplace.installing, id));\n\nexport const getError = (state: GlobalState, id: string): string | undefined => secureGetFromRecord(state.views.marketplace.errors, id);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AppCall, AppExpand, AppFormValues} from '@mattermost/types/apps';\nimport type {MarketplaceApp, MarketplacePlugin} from '@mattermost/types/marketplace';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {AppBindingLocations, AppCallResponseTypes} from 'mattermost-redux/constants/apps';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getFilter, getPlugin} from 'selectors/views/marketplace';\n\nimport {intlShim} from 'components/suggestion/command_provider/app_command_parser/app_command_parser_dependencies';\nimport type {DoAppCallResult} from 'components/suggestion/command_provider/app_command_parser/app_command_parser_dependencies';\n\nimport {createCallContext, createCallRequest} from 'utils/apps';\nimport {ActionTypes} from 'utils/constants';\n\nimport type {ActionFuncAsync, ThunkActionFunc} from 'types/store';\n\nimport {doAppSubmit, openAppsModal, postEphemeralCallResponseForContext} from './apps';\n\n// fetchPlugins fetches the latest marketplace plugins and apps, subject to any existing search filter.\nexport function fetchListing(localOnly = false): ActionFuncAsync<Array<MarketplacePlugin | MarketplaceApp>> {\n return async (dispatch, getState) => {\n const state = getState();\n const filter = getFilter(state);\n\n let plugins: MarketplacePlugin[];\n let apps: MarketplaceApp[] = [];\n\n try {\n plugins = await Client4.getMarketplacePlugins(filter, localOnly);\n } catch (error: any) {\n // If the marketplace server is unreachable, try to get the local plugins only.\n if (error.server_error_id === 'app.plugin.marketplace_client.failed_to_fetch' && !localOnly) {\n await dispatch(fetchListing(true));\n }\n return {error};\n }\n\n dispatch({\n type: ActionTypes.RECEIVED_MARKETPLACE_PLUGINS,\n plugins,\n });\n\n if (appsEnabled(state)) {\n try {\n apps = await Client4.getMarketplaceApps(filter);\n } catch (error) {\n return {data: plugins};\n }\n\n dispatch({\n type: ActionTypes.RECEIVED_MARKETPLACE_APPS,\n apps,\n });\n }\n\n if (plugins) {\n return {data: (plugins as Array<MarketplacePlugin | MarketplaceApp>).concat(apps)};\n }\n\n return {data: apps};\n };\n}\n\n// filterListing sets a search filter for marketplace listing, fetching the latest data.\nexport function filterListing(filter: string): ReturnType<typeof fetchListing> {\n return async (dispatch) => {\n dispatch({\n type: ActionTypes.FILTER_MARKETPLACE_LISTING,\n filter,\n });\n\n return dispatch(fetchListing());\n };\n}\n\n// installPlugin installs the latest version of the given plugin from the marketplace.\n//\n// On success, it also requests the current state of the plugins to reflect the newly installed plugin.\nexport function installPlugin(id: string): ThunkActionFunc<void> {\n return async (dispatch, getState) => {\n dispatch({\n type: ActionTypes.INSTALLING_MARKETPLACE_ITEM,\n id,\n });\n\n const state = getState();\n\n const marketplacePlugin = getPlugin(state, id);\n if (!marketplacePlugin) {\n dispatch({\n type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_FAILED,\n id,\n error: 'Unknown plugin: ' + id,\n });\n return;\n }\n\n try {\n await Client4.installMarketplacePlugin(id);\n } catch (error: any) {\n dispatch({\n type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_FAILED,\n id,\n error: error.message,\n });\n return;\n }\n\n await dispatch(fetchListing());\n dispatch({\n type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_SUCCEEDED,\n id,\n });\n };\n}\n\n// installApp installed an App using a given URL a call to the `/install-listed` call path.\n//\n// On success, it also requests the current state of the apps to reflect the newly installed app.\nexport function installApp(id: string): ThunkActionFunc<Promise<boolean>> {\n return async (dispatch, getState) => {\n dispatch({\n type: ActionTypes.INSTALLING_MARKETPLACE_ITEM,\n id,\n });\n\n const callPath = '/install-listed';\n const call: AppCall = {\n path: callPath,\n };\n\n const expand: AppExpand = {\n acting_user: '+summary',\n locale: 'all',\n };\n\n const values: AppFormValues = {\n app: {\n label: id,\n value: id,\n },\n };\n\n const state = getState();\n const channelID = getCurrentChannelId(state);\n const teamID = getCurrentTeamId(state);\n const location = AppBindingLocations.MARKETPLACE;\n const context = createCallContext('apps', location, channelID, teamID);\n\n const creq = createCallRequest(call, context, expand, values);\n\n const res = await dispatch(doAppSubmit(creq, intlShim)) as DoAppCallResult;\n\n if (res.error) {\n const errorResponse = res.error;\n dispatch({\n type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_FAILED,\n id,\n error: errorResponse.text,\n });\n return false;\n }\n\n dispatch({\n type: ActionTypes.INSTALLING_MARKETPLACE_ITEM_SUCCEEDED,\n id,\n });\n\n const callResp = res.data!;\n if (callResp.type === AppCallResponseTypes.FORM && callResp.form) {\n dispatch(openAppsModal(callResp.form, creq.context));\n }\n\n if (callResp.text) {\n dispatch(postEphemeralCallResponseForContext(callResp, callResp.text, context));\n }\n\n return true;\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport type {MarketplaceLabel} from '@mattermost/types/marketplace';\n\nimport ExternalLink from 'components/external_link';\nimport PluginIcon from 'components/widgets/icons/plugin_icon';\nimport Tag from 'components/widgets/tag/tag';\nimport WithTooltip from 'components/with_tooltip';\n\n// Label renders a tag showing a name and a description in a tooltip.\n// If a URL is provided, clicking on the tag will open the URL in a new tab.\nexport const Label = ({name, description, url}: MarketplaceLabel): JSX.Element => {\n const tag = (\n <Tag\n text={name}\n uppercase={true}\n size={'sm'}\n />\n );\n\n let label;\n if (description) {\n label = (\n <WithTooltip\n title={description}\n >\n {tag}\n </WithTooltip>\n );\n } else {\n label = tag;\n }\n\n if (url) {\n return (\n <ExternalLink\n aria-label={name.toLowerCase()}\n className='style--none more-modal__row--link marketplace__tag'\n href={url}\n location='marketplace_item'\n >\n {label}\n </ExternalLink>\n );\n }\n\n return label;\n};\n\nexport type MarketplaceItemProps = {\n id: string;\n name: string;\n description?: string;\n iconSource?: string;\n labels?: MarketplaceLabel[];\n homepageUrl?: string;\n\n error?: string;\n\n button: JSX.Element;\n updateDetails: JSX.Element | null;\n versionLabel: JSX.Element| null;\n};\n\ntype MarketplaceItemState = {\n showTooltip: boolean;\n};\n\nexport default class MarketplaceItem extends React.PureComponent <MarketplaceItemProps, MarketplaceItemState> {\n descriptionRef: React.RefObject<HTMLParagraphElement>;\n\n constructor(props: MarketplaceItemProps) {\n super(props);\n\n this.descriptionRef = React.createRef();\n\n this.state = {\n showTooltip: false,\n };\n }\n\n componentDidMount(): void {\n this.enableToolTipIfNeeded();\n }\n\n enableToolTipIfNeeded = (): void => {\n const element = this.descriptionRef.current;\n const showTooltip = element && element.offsetWidth < element.scrollWidth;\n this.setState({showTooltip: Boolean(showTooltip)});\n };\n\n render(): JSX.Element {\n const {labels = null} = this.props;\n let icon;\n if (this.props.iconSource) {\n icon = (\n <div className='icon__plugin icon__plugin--background'>\n <img src={this.props.iconSource}/>\n </div>\n );\n } else {\n icon = <PluginIcon className='icon__plugin icon__plugin--background'/>;\n }\n\n const labelComponents = labels?.map((label) => (\n <Label\n key={label.name}\n name={label.name}\n description={label.description}\n url={label.url}\n />\n ));\n\n const pluginDetailsInner = (\n <>\n {this.props.name}\n {this.props.versionLabel}\n </>\n );\n\n const descriptionText = this.props.error || this.props.description;\n let description = (\n <p\n className={classNames('more-modal__description', {error_text: this.props.error})}\n ref={this.descriptionRef}\n >\n {descriptionText}\n </p>\n );\n\n if (this.state.showTooltip) {\n description = (\n <WithTooltip\n title={descriptionText || ''}\n >\n {description}\n </WithTooltip>\n );\n }\n\n let pluginDetails;\n if (this.props.homepageUrl) {\n pluginDetails = (\n <>\n <ExternalLink\n aria-label={this.props.name.toLowerCase()}\n className='style--none more-modal__row--link'\n href={this.props.homepageUrl}\n location='marketplace_item'\n >\n {pluginDetailsInner}\n </ExternalLink>\n {labelComponents}\n <ExternalLink\n aria-label=\"Plugin's website\"\n className='style--none more-modal__row--link'\n href={this.props.homepageUrl}\n location='marketplace_item'\n >\n {description}\n </ExternalLink>\n </>\n );\n } else {\n pluginDetails = (\n <>\n <span\n aria-label={this.props.name.toLowerCase()}\n className='style--none'\n >\n {pluginDetailsInner}\n </span>\n {labelComponents}\n <span\n aria-label=\"Plugin\\'s website\"\n className='style--none'\n >\n {description}\n </span>\n </>\n );\n }\n\n return (\n <>\n <div\n className={classNames('more-modal__row', 'more-modal__row--link', {item_error: this.props.error})}\n key={this.props.id}\n id={'marketplace-plugin-' + this.props.id}\n >\n {icon}\n <div className='more-modal__details'>\n {pluginDetails}\n {this.props.updateDetails}\n </div>\n <div className='more-modal__actions'>\n {this.props.button}\n </div>\n </div>\n </>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\n\nimport type {MarketplaceLabel} from '@mattermost/types/marketplace';\n\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport MarketplaceItem from '../marketplace_item';\n\nexport type MarketplaceItemAppProps = {\n id: string;\n name: string;\n description?: string;\n homepageUrl?: string;\n iconURL?: string;\n\n installed: boolean;\n labels?: MarketplaceLabel[];\n\n installing: boolean;\n error?: string;\n\n trackEvent: (category: string, event: string, props?: Record<string, unknown>) => void;\n\n actions: {\n installApp: (id: string) => Promise<boolean>;\n closeMarketplaceModal: () => void;\n };\n};\n\nexport default class MarketplaceItemApp extends React.PureComponent <MarketplaceItemAppProps> {\n onInstall = (): void => {\n this.props.trackEvent('plugins', 'ui_marketplace_install_app', {\n app_id: this.props.id,\n });\n\n this.props.actions.installApp(this.props.id).then((res) => {\n if (res) {\n this.props.actions.closeMarketplaceModal();\n }\n });\n };\n\n getItemButton(): JSX.Element {\n if (this.props.installed && !this.props.installing && !this.props.error) {\n return (\n <button\n className='app-installed'\n disabled={true}\n >\n <FormattedMessage\n id='marketplace_modal.list.installed'\n defaultMessage='Installed'\n />\n </button>\n );\n }\n\n let actionButton: JSX.Element;\n if (this.props.error) {\n actionButton = (\n <FormattedMessage\n id='marketplace_modal.list.try_again'\n defaultMessage='Try Again'\n />\n );\n } else {\n actionButton = (\n <FormattedMessage\n id='marketplace_modal.list.install'\n defaultMessage='Install'\n />\n );\n }\n\n return (\n <button\n onClick={this.onInstall}\n className='app-install always-show-enabled'\n disabled={this.props.installing}\n >\n <LoadingWrapper\n loading={this.props.installing}\n text={defineMessage({id: 'marketplace_modal.installing', defaultMessage: 'Installing...'})}\n >\n {actionButton}\n </LoadingWrapper>\n\n </button>\n );\n }\n\n render(): JSX.Element {\n return (\n <>\n <MarketplaceItem\n button={this.getItemButton()}\n updateDetails={null}\n versionLabel={null}\n iconSource={this.props.iconURL}\n {...this.props}\n />\n </>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {installApp} from 'actions/marketplace';\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport {closeModal} from 'actions/views/modals';\nimport {getInstalling, getError} from 'selectors/views/marketplace';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport MarketplaceItemApp from './marketplace_item_app';\n\ntype Props = {\n id: string;\n}\n\nfunction mapStateToProps(state: GlobalState, props: Props) {\n const installing = getInstalling(state, props.id);\n const error = getError(state, props.id);\n\n return {\n installing,\n error,\n trackEvent,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n installApp,\n closeMarketplaceModal: () => closeModal(ModalIdentifiers.PLUGIN_MARKETPLACE),\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MarketplaceItemApp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\nimport semver from 'semver';\n\nimport type {MarketplaceLabel} from '@mattermost/types/marketplace';\nimport type {PluginStatusRedux} from '@mattermost/types/plugins';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport ExternalLink from 'components/external_link';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport MarketplaceItem from '../marketplace_item';\n\ntype UpdateVersionProps = {\n version: string;\n releaseNotesUrl?: string;\n};\n\n// UpdateVersion renders the version text in the update details, linking out to release notes if available.\nexport const UpdateVersion = ({version, releaseNotesUrl}: UpdateVersionProps): JSX.Element => {\n if (!releaseNotesUrl) {\n return (\n <span>\n {version}\n </span>\n );\n }\n\n return (\n <ExternalLink\n location='marketplace_item_plugin'\n href={releaseNotesUrl}\n >\n {version}\n </ExternalLink>\n );\n};\n\nexport type UpdateDetailsProps = {\n version: string;\n releaseNotesUrl?: string;\n installedVersion?: string;\n isInstalling: boolean;\n onUpdate: (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => void;\n};\n\n// UpdateDetails renders an inline update prompt for plugins, when available.\nexport const UpdateDetails = ({version, releaseNotesUrl, installedVersion, isInstalling, onUpdate}: UpdateDetailsProps): JSX.Element | null => {\n if (!installedVersion || isInstalling) {\n return null;\n }\n\n let isUpdate = false;\n try {\n isUpdate = semver.gt(version, installedVersion);\n } catch (e) {\n // If we fail to parse the version, assume not an update;\n }\n\n if (!isUpdate) {\n return null;\n }\n\n return (\n <div className={classNames('update')}>\n <FormattedMessage\n id='marketplace_modal.list.update_available'\n defaultMessage='Update available:'\n />\n {' '}\n <UpdateVersion\n version={version}\n releaseNotesUrl={releaseNotesUrl}\n />\n {' - '}\n <b>\n <a onClick={onUpdate}>\n <FormattedMessage\n id='marketplace_modal.list.update'\n defaultMessage='Update'\n />\n </a>\n </b>\n </div>\n );\n};\n\nexport type UpdateConfirmationModalProps = {\n show: boolean;\n name: string;\n version: string;\n releaseNotesUrl?: string;\n installedVersion?: string;\n onUpdate: (checked: boolean) => void;\n onCancel: (checked: boolean) => void;\n};\n\n// UpdateConfirmationModal prompts before allowing upgrade, specially handling major version changes.\nexport const UpdateConfirmationModal = ({show, name, version, installedVersion, releaseNotesUrl, onUpdate, onCancel}: UpdateConfirmationModalProps): JSX.Element | null => {\n if (!installedVersion) {\n return null;\n }\n\n let isUpdate = false;\n try {\n isUpdate = semver.gt(version, installedVersion);\n } catch (e) {\n // If we fail to parse the version, assume not an update;\n }\n\n if (!isUpdate) {\n return null;\n }\n\n const messages = [(\n <p key='intro'>\n <FormattedMessage\n id='marketplace_modal.list.update_confirmation.message.intro'\n defaultMessage={`Are you sure you want to update the ${name} plugin to ${version}?`}\n values={{name, version}}\n />\n </p>\n )];\n\n if (releaseNotesUrl) {\n messages.push(\n <p key='current'>\n <FormattedMessage\n id='marketplace_modal.list.update_confirmation.message.current_with_release_notes'\n defaultMessage='You currently have {installedVersion} installed. View the <a>release notes</a> to learn about the changes included in this update.'\n values={{\n installedVersion,\n a: (chunks: string) => (\n <ExternalLink\n href={releaseNotesUrl as string}\n location='plugin-marketplace'\n >\n {chunks}\n </ExternalLink>\n )}}\n />\n </p>,\n );\n } else {\n messages.push(\n <p key='current'>\n <FormattedMessage\n id='marketplace_modal.list.update_confirmation.message.current'\n defaultMessage={`You currently have ${installedVersion} installed.`}\n values={{installedVersion}}\n />\n </p>,\n );\n }\n\n let sameMajorVersion = false;\n try {\n sameMajorVersion = semver.major(version) === semver.major(installedVersion);\n } catch (e) {\n // If we fail to parse the version, assume a potentially breaking change.\n // In practice, this won't happen since we already tried to parse the version above.\n }\n\n if (!sameMajorVersion) {\n if (releaseNotesUrl) {\n messages.push(\n <p\n className='alert alert-warning'\n key='warning'\n >\n <FormattedMessage\n id='marketplace_modal.list.update_confirmation.message.warning_major_version_with_release_notes'\n defaultMessage='This update may contain breaking changes. Consult the <a>release notes</a> before upgrading.'\n values={{\n a: (chunks: string) => (\n <ExternalLink\n href={releaseNotesUrl as string}\n location='plugin-marketplace'\n >\n {chunks}\n </ExternalLink>\n )}}\n />\n </p>,\n );\n } else {\n messages.push(\n <p\n className='alert alert-warning'\n key='warning'\n >\n <FormattedMessage\n id='marketplace_modal.list.update_confirmation.message.warning_major_version'\n defaultMessage={'This update may contain breaking changes.'}\n />\n </p>,\n );\n }\n }\n\n return (\n <ConfirmModal\n show={show}\n title={\n <FormattedMessage\n id='marketplace_modal.list.update_confirmation.title'\n defaultMessage={'Confirm Plugin Update'}\n />\n }\n message={messages}\n confirmButtonText={\n <FormattedMessage\n id='marketplace_modal.list.update_confirmation.confirm_button'\n defaultMessage='Update'\n />\n }\n onConfirm={onUpdate}\n onCancel={onCancel}\n />\n );\n};\n\nexport type MarketplaceItemPluginProps = {\n id: string;\n name: string;\n description?: string;\n version: string;\n homepageUrl?: string;\n releaseNotesUrl?: string;\n labels?: MarketplaceLabel[];\n iconData?: string;\n installedVersion?: string;\n installing: boolean;\n pluginStatus?: PluginStatusRedux;\n error?: string;\n isDefaultMarketplace: boolean;\n trackEvent: (category: string, event: string, props?: Record<string, unknown>) => void;\n\n actions: {\n installPlugin: (id: string) => void;\n closeMarketplaceModal: () => void;\n };\n};\n\ntype MarketplaceItemState = {\n showUpdateConfirmationModal: boolean;\n};\n\nexport default class MarketplaceItemPlugin extends React.PureComponent <MarketplaceItemPluginProps, MarketplaceItemState> {\n constructor(props: MarketplaceItemPluginProps) {\n super(props);\n\n this.state = {\n showUpdateConfirmationModal: false,\n };\n }\n\n trackEvent = (eventName: string, allowDetail = true): void => {\n if (this.props.isDefaultMarketplace && allowDetail) {\n this.props.trackEvent('plugins', eventName, {\n plugin_id: this.props.id,\n version: this.props.version,\n installed_version: this.props.installedVersion,\n });\n } else {\n this.props.trackEvent('plugins', eventName);\n }\n };\n\n showUpdateConfirmationModal = (): void => {\n this.setState({showUpdateConfirmationModal: true});\n };\n\n hideUpdateConfirmationModal = (): void => {\n this.setState({showUpdateConfirmationModal: false});\n };\n\n onInstall = (): void => {\n this.trackEvent('ui_marketplace_download');\n this.props.actions.installPlugin(this.props.id);\n };\n\n onConfigure = (): void => {\n this.trackEvent('ui_marketplace_configure', false);\n\n this.props.actions.closeMarketplaceModal();\n };\n\n onUpdate = (): void => {\n this.trackEvent('ui_marketplace_download_update');\n\n this.hideUpdateConfirmationModal();\n this.props.actions.installPlugin(this.props.id);\n };\n\n getItemButton(): JSX.Element {\n if (this.props.installedVersion !== '' && !this.props.installing && !this.props.error) {\n return (\n <Link\n to={'/admin_console/plugins/plugin_' + this.props.id}\n >\n <button\n onClick={this.onConfigure}\n className='plugin-configure'\n >\n <FormattedMessage\n id='marketplace_modal.list.configure'\n defaultMessage='Configure'\n />\n </button>\n </Link>\n );\n }\n\n let actionButton: JSX.Element;\n if (this.props.error) {\n actionButton = (\n <FormattedMessage\n id='marketplace_modal.list.try_again'\n defaultMessage='Try Again'\n />\n );\n } else {\n actionButton = (\n <FormattedMessage\n id='marketplace_modal.list.install'\n defaultMessage='Install'\n />\n );\n }\n\n return (\n <button\n onClick={this.onInstall}\n className='plugin-install always-show-enabled'\n disabled={this.props.installing}\n >\n <LoadingWrapper\n loading={this.props.installing}\n text={defineMessage({id: 'marketplace_modal.installing', defaultMessage: 'Installing...'})}\n >\n {actionButton}\n </LoadingWrapper>\n\n </button>\n );\n }\n\n render(): JSX.Element {\n let version = `(${this.props.version})`;\n if (this.props.installedVersion !== '') {\n version = `(${this.props.installedVersion})`;\n }\n\n const versionLabel = <span className='light subtitle'>{version}</span>;\n\n const updateDetails = (\n <UpdateDetails\n version={this.props.version}\n installedVersion={this.props.installedVersion}\n releaseNotesUrl={this.props.releaseNotesUrl}\n isInstalling={this.props.installing}\n onUpdate={this.showUpdateConfirmationModal}\n />\n );\n\n return (\n <>\n <MarketplaceItem\n button={this.getItemButton()}\n versionLabel={versionLabel}\n updateDetails={updateDetails}\n iconSource={this.props.iconData}\n {...this.props}\n error={this.props.error || this.props.pluginStatus?.error}\n />\n <UpdateConfirmationModal\n show={this.state.showUpdateConfirmationModal}\n name={this.props.name}\n version={this.props.version}\n installedVersion={this.props.installedVersion}\n releaseNotesUrl={this.props.releaseNotesUrl}\n onUpdate={this.onUpdate}\n onCancel={this.hideUpdateConfirmationModal}\n />\n </>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getPluginStatus} from 'mattermost-redux/selectors/entities/admin';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {installPlugin} from 'actions/marketplace';\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport {closeModal} from 'actions/views/modals';\nimport {getInstalling, getError} from 'selectors/views/marketplace';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport MarketplaceItemPlugin from './marketplace_item_plugin';\n\ntype Props = {\n id: string;\n}\n\nfunction mapStateToProps(state: GlobalState, props: Props) {\n const installing = getInstalling(state, props.id);\n const error = getError(state, props.id);\n const isDefaultMarketplace = getConfig(state).IsDefaultMarketplace === 'true';\n\n const pluginStatus = getPluginStatus(state, props.id);\n\n return {\n installing,\n error,\n isDefaultMarketplace,\n trackEvent,\n pluginStatus,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n installPlugin,\n closeMarketplaceModal: () => closeModal(ModalIdentifiers.PLUGIN_MARKETPLACE),\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MarketplaceItemPlugin);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {MarketplaceApp, MarketplacePlugin} from '@mattermost/types/marketplace';\n\nimport {isPlugin, getName} from 'mattermost-redux/utils/marketplace';\n\nimport PluginIcon from 'components/widgets/icons/plugin_icon';\n\nimport MarketplaceItemApp from '../marketplace_item/marketplace_item_app';\nimport MarketplaceItemPlugin from '../marketplace_item/marketplace_item_plugin';\n\nexport const ITEMS_PER_PAGE = 15;\n\ntype MarketplaceListProps = {\n listing: Array<MarketplacePlugin | MarketplaceApp>;\n page: number;\n noResultsMessage: string;\n noResultsAction?: {\n label: string;\n onClick: () => void;\n };\n filter?: string;\n listRef?: React.RefObject<HTMLDivElement>;\n};\n\nconst MarketplaceList = ({\n listing,\n page,\n noResultsMessage,\n noResultsAction,\n filter,\n listRef,\n}: MarketplaceListProps) => {\n const {formatMessage} = useIntl();\n\n const pageItems = useMemo(() => {\n if (listing.length === 0) {\n return [];\n }\n\n const pageStart = page * ITEMS_PER_PAGE;\n const pageEnd = pageStart + ITEMS_PER_PAGE;\n\n return [...listing].\n sort((a, b) => getName(a).localeCompare(getName(b))).\n slice(pageStart, pageEnd).\n map((i) => (\n isPlugin(i) ? (\n <MarketplaceItemPlugin\n key={i.manifest.id}\n id={i.manifest.id}\n name={i.manifest.name}\n description={i.manifest.description}\n version={i.manifest.version}\n homepageUrl={i.homepage_url}\n releaseNotesUrl={i.release_notes_url}\n labels={i.labels}\n iconData={i.icon_data}\n installedVersion={i.installed_version}\n />\n ) : (\n <MarketplaceItemApp\n key={i.manifest.app_id}\n id={i.manifest.app_id}\n name={i.manifest.display_name}\n description={i.manifest.description}\n homepageUrl={i.manifest.homepage_url}\n iconURL={i.icon_url}\n installed={i.installed}\n labels={i.labels}\n />\n )\n ));\n }, [listing, page]);\n\n const getNoResultsMessage = useCallback(() => (\n filter ? (\n formatMessage(\n {id: 'marketplace_modal_list.no_plugins_filter', defaultMessage: 'No results for \"{filter}\"'},\n {filter},\n )\n ) : (\n noResultsMessage\n )\n ), [filter, noResultsMessage]);\n\n return (listing.length === 0 ? (\n <div className='no_plugins'>\n <PluginIcon className='icon__plugin'/>\n <div className='no_plugins__message'>\n {getNoResultsMessage()}\n </div>\n {noResultsAction && (\n <button\n className='no_plugins__action'\n onClick={noResultsAction.onClick}\n data-testid='Install-Plugins-button'\n >\n {noResultsAction.label}\n </button>\n )}\n </div>\n ) : (\n <div\n ref={listRef}\n className='more-modal__list'\n >\n {pageItems}\n </div>\n ));\n};\n\nexport default MarketplaceList;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport {ArrowRightIcon} from '@mattermost/compass-icons/components';\n\nimport pluginIconConfluence from 'images/icons/confluence.svg';\nimport pluginIconGiphy from 'images/icons/giphy.svg';\nimport pluginIconPagerDuty from 'images/icons/pager-duty.svg';\nimport webMarketplaceBannerBackground from 'images/marketplace-notice-background.jpg';\n\nimport ExternalLink from '../external_link';\n\nconst WEB_MARKETPLACE_LINK = 'https://mattermost.com/marketplace';\n\nconst WebMarketplaceBanner = () => {\n const {formatMessage} = useIntl();\n\n return (\n <WebMarketplaceBannerRoot className='WebMarketplaceBanner'>\n <ExternalBannerLink\n href={WEB_MARKETPLACE_LINK}\n location='marketplace_modal'\n >\n <Title>\n {formatMessage({id: 'marketplace_modal.web_marketplace_link.title', defaultMessage: 'Discover community integrations'})}\n <ArrowRightIcon size={24}/>\n </Title>\n <Description>\n {formatMessage({id: 'marketplace_modal.web_marketplace_link.desc', defaultMessage: 'Connect the tools you use most to Mattermost'})}\n </Description>\n <IconsContainer>\n <PluginIcon src={pluginIconConfluence}/>\n <PluginIcon src={pluginIconGiphy}/>\n <PluginIcon src={pluginIconPagerDuty}/>\n </IconsContainer>\n </ExternalBannerLink>\n </WebMarketplaceBannerRoot>\n );\n};\n\nconst ExternalBannerLink = styled(ExternalLink)`\n &&,\n &&:hover,\n &&:focus {\n color: var(--denim-center-channel-bg, #FFF);\n text-decoration: none;\n }\n && {\n display: grid;\n grid-template-columns: auto auto;\n justify-content: space-between;\n text-align: left;\n padding: 24px 32px;\n }\n`;\n\nconst WebMarketplaceBannerRoot = styled.section`\n background-image: url(${webMarketplaceBannerBackground});\n background-position: center;\n background-repeat: no-repeat;\n background-size: cover;\n border-radius: 0 0 12px 12px !important;\n margin: -1px;\n`;\n\nconst Title = styled.div`\n font-family: Metropolis;\n font-size: 16px;\n font-style: normal;\n font-weight: 600;\n line-height: 24px;\n margin: 4px 0;\n grid-column: 1;\n\n svg {\n vertical-align: middle;\n display: inline-block;\n margin-left: 4px;\n }\n`;\n\nconst Description = styled.p`\n font-family: Open Sans;\n font-size: 14px;\n font-style: normal;\n font-weight: 400;\n line-height: 20px;\n grid-column: 1;\n margin-bottom: 4px;\n`;\n\nconst PluginIcon = styled.img`\n width: 50px;\n height: 50px;\n border-radius: 50%;\n`;\n\nconst IconsContainer = styled.div`\n grid-column: 2;\n grid-row: span 2/2;\n ${PluginIcon}:nth-child(n+2) {\n margin-left: calc(-54px / 1/4);\n }\n`;\n\nexport default WebMarketplaceBanner;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport debounce from 'lodash/debounce';\nimport React, {useCallback, useEffect, useRef, useState} from 'react';\nimport type {ReactNode} from 'react';\nimport {Tabs, Tab} from 'react-bootstrap';\nimport type {SelectCallback} from 'react-bootstrap';\nimport {useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {Link} from 'react-router-dom';\n\nimport {MagnifyIcon} from '@mattermost/compass-icons/components';\nimport {FooterPagination, GenericModal} from '@mattermost/components';\n\nimport {getPluginStatuses} from 'mattermost-redux/actions/admin';\nimport {setFirstAdminVisitMarketplaceStatus} from 'mattermost-redux/actions/general';\nimport {getFirstAdminVisitMarketplaceStatus, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {streamlinedMarketplaceEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {fetchListing, filterListing} from 'actions/marketplace';\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\nimport {closeModal} from 'actions/views/modals';\nimport {getListing, getInstalledListing} from 'selectors/views/marketplace';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport LoadingScreen from 'components/loading_screen';\nimport Input, {SIZE} from 'components/widgets/inputs/input/input';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {isCloudLicense} from 'utils/license_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport MarketplaceList, {ITEMS_PER_PAGE} from './marketplace_list/marketplace_list';\nimport WebMarketplaceBanner from './web_marketplace_banner';\n\nimport './marketplace_modal.scss';\n\nconst MarketplaceTabs = {\n ALL_LISTING: 'all',\n INSTALLED_LISTING: 'installed',\n};\n\nconst SEARCH_TIMEOUT_MILLISECONDS = 200;\n\nconst linkConsole = (msg: string): ReactNode => (\n <Link to='/admin_console/plugins/plugin_management'>\n {msg}\n </Link>\n);\n\nexport type OpenedFromType = 'actions_menu' | 'app_bar' | 'channel_header' | 'command' | 'open_plugin_install_post' | 'product_menu';\n\ntype MarketplaceModalProps = {\n openedFrom: OpenedFromType;\n}\n\nconst MarketplaceModal = ({\n openedFrom,\n}: MarketplaceModalProps) => {\n const dispatch = useDispatch();\n const {formatMessage} = useIntl();\n const listRef = useRef<HTMLDivElement>(null);\n\n const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.PLUGIN_MARKETPLACE));\n const listing = useSelector(getListing);\n const installedListing = useSelector(getInstalledListing);\n const pluginStatuses = useSelector((state: GlobalState) => state.entities.admin.pluginStatuses);\n const hasFirstAdminVisitedMarketplace = useSelector(getFirstAdminVisitMarketplaceStatus);\n const isStreamlinedMarketplaceEnabled = useSelector(streamlinedMarketplaceEnabled);\n const license = useSelector(getLicense);\n const isCloud = isCloudLicense(license);\n\n const [tabKey, setTabKey] = useState(MarketplaceTabs.ALL_LISTING);\n const [filter, setFilter] = useState('');\n const [page, setPage] = useState(0);\n const [hasLoaded, setHasLoaded] = useState(false);\n const [loading, setLoading] = React.useState(true);\n const [serverError, setServerError] = React.useState(false);\n\n const doFetchListing = useCallback(async () => {\n const {error} = await dispatch(fetchListing());\n\n if (error) {\n setServerError(true);\n }\n\n setLoading(false);\n }, []);\n\n const doSearch = useCallback(async () => {\n trackEvent('plugins', 'ui_marketplace_search', {filter});\n\n const {error} = await dispatch(filterListing(filter));\n\n if (error) {\n setServerError(true);\n }\n }, [filter]);\n\n const debouncedSearch = debounce(doSearch, SEARCH_TIMEOUT_MILLISECONDS);\n\n useEffect(() => {\n async function doFetch() {\n await dispatch(getPluginStatuses());\n await doFetchListing();\n setHasLoaded(true);\n }\n\n trackEvent('plugins', 'ui_marketplace_opened', {from: openedFrom});\n\n if (!hasFirstAdminVisitedMarketplace) {\n trackEvent('plugins', 'ui_first_admin_visit_marketplace_status');\n dispatch(setFirstAdminVisitMarketplaceStatus());\n }\n\n doFetch();\n }, []);\n\n useEffect(() => {\n if (hasLoaded) {\n doFetchListing();\n }\n }, [pluginStatuses]);\n\n useEffect(() => {\n if (hasLoaded) {\n debouncedSearch();\n setPage(0);\n }\n }, [filter]);\n\n const scrollListToTop = useCallback(() => {\n if (listRef.current) {\n listRef.current.scrollTop = 0;\n }\n }, []);\n\n const handleOnClose = () => {\n trackEvent('plugins', 'ui_marketplace_closed');\n dispatch(closeModal(ModalIdentifiers.PLUGIN_MARKETPLACE));\n };\n\n const handleChangeTab: SelectCallback = useCallback((tabKey) => {\n setTabKey(tabKey);\n setPage(0);\n scrollListToTop();\n }, [scrollListToTop]);\n\n const handleOnChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setFilter(event.target.value);\n }, []);\n\n const handleOnClear = useCallback(() => {\n setFilter('');\n }, []);\n\n const handleOnNextPage = useCallback(() => {\n setPage(page + 1);\n scrollListToTop();\n }, [page, scrollListToTop]);\n\n const handleOnPreviousPage = useCallback(() => {\n setPage(page - 1);\n scrollListToTop();\n }, [page, scrollListToTop]);\n\n const handleNoResultsButtonClick = useCallback(() => {\n handleChangeTab(MarketplaceTabs.ALL_LISTING);\n }, [handleChangeTab]);\n\n const getHeaderInput = useCallback(() => {\n if (isStreamlinedMarketplaceEnabled) {\n return null;\n }\n\n return (\n <Input\n id='searchMarketplaceTextbox'\n name='searchMarketplaceTextbox'\n containerClassName='marketplace-modal-search'\n inputClassName='search_input'\n type='text'\n inputSize={SIZE.LARGE}\n inputPrefix={<MagnifyIcon size={24}/>}\n placeholder={formatMessage({id: 'marketplace_modal.search', defaultMessage: 'Search marketplace'})}\n useLegend={false}\n autoFocus={true}\n clearable={true}\n value={filter}\n onChange={handleOnChange}\n onClear={handleOnClear}\n />\n );\n }, [filter, handleOnChange, handleOnClear]);\n\n const getFooterContent = useCallback(() => {\n if (isStreamlinedMarketplaceEnabled && listing.length <= ITEMS_PER_PAGE) {\n return null;\n }\n\n return (\n <FooterPagination\n page={page}\n total={tabKey === MarketplaceTabs.ALL_LISTING ? listing.length : installedListing.length}\n itemsPerPage={ITEMS_PER_PAGE}\n onNextPage={handleOnNextPage}\n onPreviousPage={handleOnPreviousPage}\n />\n );\n }, [installedListing.length, listing.length, page, handleOnNextPage, handleOnPreviousPage, tabKey, isStreamlinedMarketplaceEnabled]);\n\n const getAppendedContent = useCallback(() => {\n if (!isStreamlinedMarketplaceEnabled || isCloud) {\n return null;\n }\n\n return <WebMarketplaceBanner/>;\n }, [isStreamlinedMarketplaceEnabled, isCloud]);\n\n return (\n <GenericModal\n id='marketplace-modal'\n className={classNames('marketplace-modal', {\n 'streamlined-marketplace': isStreamlinedMarketplaceEnabled,\n 'with-web-marketplace-link': isStreamlinedMarketplaceEnabled && !isCloud,\n })}\n modalHeaderText={formatMessage({id: 'marketplace_modal.title', defaultMessage: 'App Marketplace'})}\n ariaLabel={formatMessage({id: 'marketplace_modal.title', defaultMessage: 'App Marketplace'})}\n errorText={serverError ? (\n formatMessage(\n {\n id: 'marketplace_modal.app_error',\n defaultMessage: 'Error connecting to the marketplace server. Please check your settings in the <linkConsole>System Console</linkConsole>.',\n },\n {linkConsole},\n )\n ) : undefined}\n show={show}\n compassDesign={true}\n bodyPadding={false}\n bodyDivider={isStreamlinedMarketplaceEnabled}\n footerDivider={true}\n onExited={handleOnClose}\n footerContent={getFooterContent()}\n appendedContent={getAppendedContent()}\n headerInput={getHeaderInput()}\n >\n {isStreamlinedMarketplaceEnabled ? (\n <>\n {loading ? (\n <LoadingScreen className='loading'/>\n ) : (\n <MarketplaceList\n listRef={listRef}\n listing={listing}\n page={page}\n filter={filter}\n noResultsMessage={formatMessage({id: 'marketplace_modal.no_plugins', defaultMessage: 'No plugins found'})}\n />\n )}\n </>\n ) : (\n <Tabs\n id='marketplaceTabs'\n className='tabs'\n defaultActiveKey={MarketplaceTabs.ALL_LISTING}\n activeKey={tabKey}\n onSelect={handleChangeTab}\n unmountOnExit={true}\n >\n <Tab\n eventKey={MarketplaceTabs.ALL_LISTING}\n title={formatMessage({id: 'marketplace_modal.tabs.all_listing', defaultMessage: 'All'})}\n >\n {loading ? (\n <LoadingScreen className='loading'/>\n ) : (\n <MarketplaceList\n listRef={listRef}\n listing={listing}\n page={page}\n filter={filter}\n noResultsMessage={formatMessage({id: 'marketplace_modal.no_plugins', defaultMessage: 'No plugins found'})}\n />\n )}\n </Tab>\n <Tab\n eventKey={MarketplaceTabs.INSTALLED_LISTING}\n title={formatMessage(\n {id: 'marketplace_modal.tabs.installed_listing', defaultMessage: 'Installed ({count})'},\n {count: installedListing.length},\n )}\n >\n <MarketplaceList\n listRef={listRef}\n listing={installedListing}\n page={page}\n filter={filter}\n noResultsMessage={formatMessage({\n id: 'marketplace_modal.no_plugins_installed',\n defaultMessage: 'No plugins installed found',\n })}\n noResultsAction={{\n label: formatMessage({id: 'marketplace_modal.install_plugins', defaultMessage: 'Install plugins'}),\n onClick: handleNoResultsButtonClick,\n }}\n />\n </Tab>\n </Tabs>\n )}\n </GenericModal>\n );\n};\n\nexport default MarketplaceModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {removePost} from 'mattermost-redux/actions/posts';\nimport type {ExtendedPost} from 'mattermost-redux/actions/posts';\n\nimport {removeDraft} from 'actions/views/drafts';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {getGlobalItem} from 'selectors/storage';\nimport {isThreadOpen} from 'selectors/views/threads';\n\nimport {StoragePrefixes} from 'utils/constants';\n\nimport type {ActionFunc} from 'types/store';\n\n/**\n * This action is called when the deleted post which is shown as 'deleted' in the RHS is then removed from the channel manually.\n * @param post Deleted post\n */\nexport function removePostCloseRHSDeleteDraft(post: ExtendedPost): ActionFunc<boolean> {\n return (dispatch, getState) => {\n if (isThreadOpen(getState(), post.id)) {\n dispatch(closeRightHandSide());\n }\n\n const draftKey = `${StoragePrefixes.COMMENT_DRAFT}${post.id}`;\n if (getGlobalItem(getState(), draftKey, null)) {\n dispatch(removeDraft(draftKey, post.channel_id, post.id));\n }\n\n return dispatch(removePost(post));\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport EditPost from './edit_post';\n\nexport default EditPost;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getEditingPostDetailsAndPost} from 'selectors/posts';\n\nimport AdvancedTextEditor from 'components/advanced_text_editor/advanced_text_editor';\n\nimport {Locations, StoragePrefixes} from 'utils/constants';\n\nimport './edit_post.scss';\n\nexport default function EditPost() {\n const {formatMessage} = useIntl();\n\n const editingPostDetailsAndPost = useSelector(getEditingPostDetailsAndPost);\n\n if (!editingPostDetailsAndPost.show) {\n return null;\n }\n\n const channelId = editingPostDetailsAndPost.post.channel_id;\n const location = editingPostDetailsAndPost.isRHS ? Locations.RHS_COMMENT : Locations.CENTER;\n const rootId = editingPostDetailsAndPost.post.root_id || editingPostDetailsAndPost.post.id || '';\n const storageKey = `${StoragePrefixes.EDIT_DRAFT}${editingPostDetailsAndPost.post.id}`;\n\n return (\n <div className='post-edit__container'>\n <AdvancedTextEditor\n location={location}\n channelId={channelId}\n postId={rootId}\n isInEditMode={true}\n storageKey={storageKey}\n placeholder={formatMessage({id: 'edit_post.editPost', defaultMessage: 'Edit the post...'})}\n />\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getScheme} from 'utils/url';\n\nimport RemoveMarkdown from './remove_markdown';\n\nexport default class LinkOnlyRenderer extends RemoveMarkdown {\n public link(href: string, title: string, text: string) {\n let outHref = href;\n\n if (!getScheme(href)) {\n outHref = `http://${outHref}`;\n }\n\n let output = `<a class=\"theme markdown__link\" href=\"${outHref}\" target=\"_blank\"`;\n\n if (title) {\n output += ' title=\"' + title + '\"';\n }\n\n output += `>${text}</a>`;\n\n return output;\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback} from 'react';\nimport styled, {css} from 'styled-components';\n\nimport type {PostAction, PostActionOption} from '@mattermost/types/integration_actions';\n\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\nimport {secureGetFromRecord} from 'mattermost-redux/utils/post_utils';\nimport {changeOpacity} from 'mattermost-redux/utils/theme_utils';\n\nimport Markdown from 'components/markdown';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nconst getStatusColors = (theme: Theme) => {\n return {\n good: '#339970',\n warning: '#CC8F00',\n danger: theme.errorTextColor,\n default: theme.centerChannelColor,\n primary: theme.buttonBg,\n success: '#339970',\n } as Record<string, string>;\n};\nconst markdownOptions = {\n mentionHighlight: false,\n markdown: false,\n autolinkedUrlSchemes: [],\n};\n\ntype Props = {\n action: PostAction;\n handleAction: (e: React.MouseEvent, options?: PostActionOption[]) => void;\n disabled?: boolean;\n theme: Theme;\n actionExecuting?: boolean;\n actionExecutingMessage?: string;\n}\n\nconst ActionButton = ({\n action,\n handleAction,\n disabled,\n theme,\n actionExecuting,\n actionExecutingMessage,\n}: Props) => {\n const handleActionClick = useCallback((e) => handleAction(e, action.options), [action.options, handleAction]);\n let hexColor: string | null | undefined;\n\n if (action.style) {\n const STATUS_COLORS = getStatusColors(theme);\n hexColor =\n secureGetFromRecord(STATUS_COLORS, action.style) ||\n secureGetFromRecord(theme, action.style) ||\n (action.style.match('^#(?:[0-9a-fA-F]{3}){1,2}$') && action.style);\n }\n\n return (\n <ActionBtn\n data-action-id={action.id}\n data-action-cookie={action.cookie}\n disabled={disabled}\n key={action.id}\n onClick={handleActionClick}\n className='btn btn-sm'\n hexColor={hexColor}\n >\n <LoadingWrapper\n loading={actionExecuting}\n text={actionExecutingMessage}\n >\n <Markdown\n message={action.name}\n options={markdownOptions}\n />\n </LoadingWrapper>\n </ActionBtn>\n );\n};\n\ntype ActionBtnProps = {hexColor: string | null | undefined};\nconst ActionBtn = styled.button<ActionBtnProps>`\n ${({hexColor}) => hexColor && css`\n background-color: ${changeOpacity(hexColor, 0.08)} !important;\n color: ${hexColor} !important;\n &:hover {\n background-color: ${changeOpacity(hexColor, 0.12)} !important;\n }\n &:active {\n background-color: ${changeOpacity(hexColor, 0.16)} !important;\n }\n `}\n`;\n\nexport default memo(ActionButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport ActionButton from './action_button';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n theme: getTheme(state),\n };\n}\n\nexport default connect(mapStateToProps)(ActionButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ninterface PostContextValue {\n handlePopupOpened: ((opened: boolean) => void) | null;\n}\nconst PostContext = React.createContext<PostContextValue>({\n\n // Post component event handler that should be\n // called when any child component opens/closes a\n // popup type component.\n handlePopupOpened: null,\n});\n\nexport default PostContext;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport AutocompleteSelector from 'components/autocomplete_selector';\nimport type {Option, Selected} from 'components/autocomplete_selector';\nimport PostContext from 'components/post_view/post_context';\nimport GenericChannelProvider from 'components/suggestion/generic_channel_provider';\nimport GenericUserProvider from 'components/suggestion/generic_user_provider';\nimport MenuActionProvider from 'components/suggestion/menu_action_provider';\n\nimport type {OwnProps, PropsFromRedux} from './index';\n\ntype Provider = GenericUserProvider | GenericChannelProvider | MenuActionProvider;\n\nexport type Props = OwnProps & PropsFromRedux;\n\ntype State = {\n selected?: Selected;\n value: string;\n};\n\nexport default class ActionMenu extends React.PureComponent<Props, State> {\n private providers: Provider[];\n\n constructor(props: Props) {\n super(props);\n\n const action = props.action;\n this.providers = [];\n if (action) {\n if (action.data_source === 'users') {\n this.providers = [new GenericUserProvider(props.autocompleteUsers)];\n } else if (action.data_source === 'channels') {\n this.providers = [new GenericChannelProvider(props.autocompleteChannels)];\n } else if (action.options) {\n this.providers = [new MenuActionProvider(action.options)];\n }\n }\n\n let selected;\n let value = '';\n\n if (action.default_option && action.options) {\n selected = action.options.find((option) => option.value === action.default_option);\n value = selected ? selected.text : '';\n }\n\n this.state = {\n selected,\n value,\n };\n }\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if (props.selected && props.selected !== state.selected) {\n const selected = props.selected as Option;\n return {\n value: selected.text,\n selected: props.selected,\n };\n }\n\n return null;\n }\n\n handleSelected = (selected: Selected) => {\n if (!selected) {\n return;\n }\n\n const {action} = this.props;\n\n let value = '';\n let text = '';\n if (action.data_source === 'users') {\n const user = selected as UserProfile;\n text = user.username;\n value = user.id;\n } else if (action.data_source === 'channels') {\n const channel = selected as Channel;\n text = channel.display_name;\n value = channel.id;\n } else {\n const option = selected as Option;\n text = option.text;\n value = option.value;\n }\n\n this.props.selectAttachmentMenuAction(\n this.props.postId, this.props.action.id || '', this.props.action.cookie || '', this.props.action?.data_source, text, value);\n\n this.setState({value: text});\n };\n\n render() {\n const {action, disabled} = this.props;\n\n return (\n <PostContext.Consumer>\n {({handlePopupOpened}) => (\n <AutocompleteSelector\n providers={this.providers}\n onSelected={this.handleSelected}\n placeholder={action.name}\n inputClassName='post-attachment-dropdown'\n value={this.state.value}\n toggleFocus={handlePopupOpened}\n disabled={disabled}\n />\n )}\n </PostContext.Consumer>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\n\nimport type {PostAction} from '@mattermost/types/integration_actions';\n\nimport {secureGetFromRecord} from 'mattermost-redux/utils/post_utils';\n\nimport {autocompleteChannels} from 'actions/channel_actions';\nimport {autocompleteUsers} from 'actions/user_actions';\nimport {selectAttachmentMenuAction} from 'actions/views/posts';\n\nimport type {GlobalState} from 'types/store';\n\nimport ActionMenu from './action_menu';\n\nexport type OwnProps = {\n postId: string;\n action: PostAction;\n disabled?: boolean;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const actions = state.views.posts.menuActions[ownProps.postId];\n const selected = (ownProps.action?.id) ? secureGetFromRecord(actions, ownProps.action.id) : undefined;\n\n return {\n selected,\n };\n}\n\nconst mapDispatchToProps = {\n selectAttachmentMenuAction,\n autocompleteChannels,\n autocompleteUsers,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(ActionMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport truncate from 'lodash/truncate';\nimport React from 'react';\nimport type {KeyboardEvent, MouseEvent, CSSProperties} from 'react';\n\nimport type {PostAction, PostActionOption} from '@mattermost/types/integration_actions';\nimport type {\n MessageAttachment as MessageAttachmentType,\n} from '@mattermost/types/message_attachments';\nimport type {PostImage} from '@mattermost/types/posts';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {secureGetFromRecord} from 'mattermost-redux/utils/post_utils';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport ExternalImage from 'components/external_image';\nimport ExternalLink from 'components/external_link';\nimport FilePreviewModal from 'components/file_preview_modal';\nimport Markdown from 'components/markdown';\nimport ShowMore from 'components/post_view/show_more';\nimport SizeAwareImage from 'components/size_aware_image';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport LinkOnlyRenderer from 'utils/markdown/link_only_renderer';\nimport type {TextFormattingOptions} from 'utils/text_formatting';\nimport {isUrlSafe} from 'utils/url';\nimport * as Utils from 'utils/utils';\n\nimport type {ModalData} from 'types/actions';\n\nimport ActionButton from '../action_button';\nimport ActionMenu from '../action_menu';\n\ntype Props = {\n\n /**\n * The post id\n */\n postId: string;\n\n /**\n * The attachment to render\n */\n attachment: MessageAttachmentType;\n\n /**\n * Options specific to text formatting\n */\n options?: Partial<TextFormattingOptions>;\n\n /**\n * images object for dimensions\n */\n imagesMetadata?: Record<string, PostImage>;\n\n actions: {\n doPostActionWithCookie: (postId: string, actionId: string, actionCookie: string, selectedOption?: string) => Promise<ActionResult>;\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n\n currentRelativeTeamUrl: string;\n}\n\ntype State = {\n checkOverflow: number;\n actionExecuting: boolean;\n actionExecutingMessage: string | null;\n}\n\nexport default class MessageAttachment extends React.PureComponent<Props, State> {\n private mounted = false;\n private imageProps = {};\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n checkOverflow: 0,\n actionExecuting: false,\n actionExecutingMessage: null,\n };\n\n this.imageProps = {\n onImageLoaded: this.handleHeightReceived,\n onImageHeightChanged: this.checkPostOverflow,\n };\n }\n\n componentDidMount() {\n this.mounted = true;\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n handleHeightReceivedForThumbUrl = ({height}: {height: number}) => {\n const {attachment} = this.props;\n if (!attachment.thumb_url) {\n return;\n }\n if (!secureGetFromRecord(this.props.imagesMetadata, attachment.thumb_url)) {\n this.handleHeightReceived(height);\n }\n };\n\n handleHeightReceivedForImageUrl = ({height}: {height: number}) => {\n const {attachment} = this.props;\n if (!attachment.image_url) {\n return;\n }\n if (!secureGetFromRecord(this.props.imagesMetadata, attachment.image_url)) {\n this.handleHeightReceived(height);\n }\n };\n\n handleHeightReceived = (height: number) => {\n if (!this.mounted) {\n return;\n }\n\n if (height > 0) {\n this.checkPostOverflow();\n }\n };\n\n checkPostOverflow = () => {\n // Increment checkOverflow to indicate change in height\n // and recompute textContainer height at ShowMore component\n // and see whether overflow text of show more/less is necessary or not.\n this.setState((prevState) => {\n return {checkOverflow: prevState.checkOverflow + 1};\n });\n };\n\n renderPostActions = () => {\n const actions = this.props.attachment.actions;\n if (!actions || !actions.length) {\n return '';\n }\n\n const content = [] as JSX.Element[];\n\n actions.forEach((action: PostAction) => {\n if (!action.id || !action.name) {\n return;\n }\n\n switch (action.type) {\n case 'select':\n content.push(\n <ActionMenu\n key={action.id}\n postId={this.props.postId}\n action={action}\n disabled={action.disabled}\n />,\n );\n break;\n case 'button':\n default:\n content.push(\n <ActionButton\n key={action.id}\n action={action}\n disabled={action.disabled}\n handleAction={this.handleAction}\n actionExecuting={this.state.actionExecuting}\n actionExecutingMessage={this.state.actionExecutingMessage || undefined}\n />,\n );\n break;\n }\n });\n\n return (\n <div\n className='attachment-actions'\n >\n {content}\n </div>\n );\n };\n\n handleAction = (e: React.MouseEvent, actionOptions?: PostActionOption[]) => {\n e.preventDefault();\n\n const actionExecutingMessage = this.getActionOption(actionOptions, 'ActionExecutingMessage');\n if (actionExecutingMessage) {\n this.setState({actionExecuting: true, actionExecutingMessage: actionExecutingMessage.value});\n }\n\n const trackOption = this.getActionOption(actionOptions, 'TrackEventId');\n if (trackOption) {\n trackEvent('admin', 'click_warn_metric_bot_id', {metric: trackOption.value});\n }\n\n const actionId = e.currentTarget.getAttribute('data-action-id') || '';\n const actionCookie = e.currentTarget.getAttribute('data-action-cookie') || '';\n\n this.props.actions.doPostActionWithCookie(this.props.postId, actionId, actionCookie).then(() => {\n this.handleCustomActions(actionOptions);\n if (actionExecutingMessage) {\n this.setState({actionExecuting: false, actionExecutingMessage: null});\n }\n });\n };\n\n handleCustomActions = (actionOptions?: PostActionOption[]) => {\n const extUrlOption = this.getActionOption(actionOptions, 'WarnMetricMailtoUrl');\n if (extUrlOption) {\n const mailtoPayload = JSON.parse(extUrlOption.value);\n window.location.href = 'mailto:' + mailtoPayload.mail_recipient + '?cc=' + mailtoPayload.mail_cc + '&subject=' + encodeURIComponent(mailtoPayload.mail_subject) + '&body=' + encodeURIComponent(mailtoPayload.mail_body);\n }\n };\n\n getActionOption = (actionOptions: PostActionOption[] | undefined, optionName: string) => {\n let opt = null;\n if (actionOptions) {\n opt = actionOptions.find((option) => option.text === optionName);\n }\n return opt;\n };\n\n getFieldsTable = () => {\n const fields = this.props.attachment.fields;\n if (!fields || !fields.length) {\n return '';\n }\n\n const fieldTables = [];\n\n let headerCols = [] as JSX.Element[];\n let bodyCols = [] as JSX.Element[];\n let rowPos = 0;\n let lastWasLong = false;\n let nrTables = 0;\n const markdown = {markdown: false, mentionHighlight: false, atMentions: false};\n\n fields.forEach((field, i) => {\n if (rowPos === 2 || !(field.short === true) || lastWasLong) {\n fieldTables.push(\n <table\n className='attachment-fields'\n key={'attachment__table__' + nrTables}\n >\n <thead>\n <tr>\n {headerCols}\n </tr>\n </thead>\n <tbody>\n <tr>\n {bodyCols}\n </tr>\n </tbody>\n </table>,\n );\n headerCols = [];\n bodyCols = [];\n rowPos = 0;\n nrTables += 1;\n lastWasLong = false;\n }\n headerCols.push(\n <th\n className='attachment-field__caption'\n key={'attachment__field-caption-' + i + '__' + nrTables}\n >\n <Markdown\n message={field.title}\n options={markdown}\n postId={this.props.postId}\n />\n </th>,\n );\n\n bodyCols.push(\n <td\n className='attachment-field'\n key={'attachment__field-' + i + '__' + nrTables}\n >\n <Markdown\n message={String(field.value)}\n postId={this.props.postId}\n />\n </td>,\n );\n rowPos += 1;\n lastWasLong = !(field.short === true);\n });\n if (headerCols.length > 0) { // Flush last fields\n fieldTables.push(\n <table\n className='attachment-fields'\n key={'attachment__table__' + nrTables}\n >\n <thead>\n <tr>\n {headerCols}\n </tr>\n </thead>\n <tbody>\n <tr>\n {bodyCols}\n </tr>\n </tbody>\n </table>,\n );\n }\n return (\n <div>\n {fieldTables}\n </div>\n );\n };\n\n handleFormattedTextClick = (e: MouseEvent) => Utils.handleFormattedTextClick(e, this.props.currentRelativeTeamUrl);\n\n getFileExtensionFromUrl = (url: string) => {\n const index = url.lastIndexOf('.');\n return index > 0 ? url.substring(index + 1) : null;\n };\n\n showModal = (e: (KeyboardEvent<HTMLImageElement> | MouseEvent<HTMLElement>), link = '') => {\n e.preventDefault();\n\n const extension = this.getFileExtensionFromUrl(link);\n\n this.props.actions.openModal({\n modalId: ModalIdentifiers.FILE_PREVIEW_MODAL,\n dialogType: FilePreviewModal,\n dialogProps: {\n postId: this.props.postId,\n fileInfos: [{\n has_preview_image: false,\n link,\n extension: extension ?? '',\n name: link,\n }],\n startIndex: 0,\n },\n });\n };\n\n render() {\n const {attachment, options} = this.props;\n let preTextClass = '';\n\n let preText;\n if (attachment.pretext) {\n preTextClass = 'attachment--pretext';\n preText = (\n <div className='attachment__thumb-pretext'>\n <Markdown\n message={attachment.pretext}\n postId={this.props.postId}\n />\n </div>\n );\n }\n\n let author = [] as JSX.Element[];\n if (attachment.author_name || attachment.author_icon) {\n if (attachment.author_icon) {\n author.push(\n <ExternalImage\n key={'attachment__author-icon'}\n src={attachment.author_icon}\n imageMetadata={secureGetFromRecord(this.props.imagesMetadata, attachment.author_icon)}\n >\n {(iconUrl) => (\n <img\n alt={'attachment author icon'}\n className='attachment__author-icon'\n src={iconUrl}\n height='14'\n width='14'\n />\n )}\n </ExternalImage>,\n );\n }\n if (attachment.author_name) {\n author.push(\n <span\n className='attachment__author-name'\n key={'attachment__author-name'}\n >\n {attachment.author_name}\n </span>,\n );\n }\n }\n if (attachment.author_link && isUrlSafe(attachment.author_link)) {\n author = [(\n <ExternalLink\n href={attachment.author_link}\n key={'attachment__author-name'}\n location='message_attachment'\n >\n {author}\n </ExternalLink>\n )];\n }\n\n let title;\n if (attachment.title) {\n if (attachment.title_link && isUrlSafe(attachment.title_link)) {\n title = (\n <h1 className='attachment__title'>\n <ExternalLink\n className='attachment__title-link'\n href={attachment.title_link}\n location='message_attachment'\n >\n {attachment.title}\n </ExternalLink>\n </h1>\n );\n } else {\n title = (\n <h1 className='attachment__title'>\n <Markdown\n message={attachment.title}\n options={{\n atMentions: false,\n mentionHighlight: false,\n renderer: new LinkOnlyRenderer(),\n autolinkedUrlSchemes: [],\n }}\n postId={this.props.postId}\n />\n </h1>\n );\n }\n }\n\n let attachmentText;\n if (attachment.text) {\n attachmentText = (\n <ShowMore\n checkOverflow={this.state.checkOverflow}\n isAttachmentText={true}\n text={attachment.text}\n maxHeight={200}\n >\n <Markdown\n message={attachment.text || ''}\n options={options}\n postId={this.props.postId}\n imageProps={this.imageProps}\n />\n </ShowMore>\n );\n }\n\n let image;\n if (attachment.image_url) {\n const imageMetadata = secureGetFromRecord(this.props.imagesMetadata, attachment.image_url);\n\n image = (\n <div className='attachment__image-container'>\n <ExternalImage\n src={attachment.image_url}\n imageMetadata={imageMetadata}\n >\n {(imageUrl) => (\n <SizeAwareImage\n className='attachment__image'\n onImageLoaded={this.handleHeightReceivedForImageUrl}\n src={imageUrl}\n dimensions={imageMetadata}\n onClick={this.showModal}\n />\n )}\n </ExternalImage>\n </div>\n );\n }\n\n let footer;\n if (attachment.footer) {\n let footerIcon;\n if (attachment.footer_icon) {\n const footerIconMetadata = secureGetFromRecord(this.props.imagesMetadata, attachment.footer_icon);\n\n footerIcon = (\n <ExternalImage\n src={attachment.footer_icon}\n imageMetadata={footerIconMetadata}\n >\n {(footerIconUrl) => (\n <img\n alt={'attachment footer icon'}\n className='attachment__footer-icon'\n src={footerIconUrl}\n height='16'\n width='16'\n />\n )}\n </ExternalImage>\n );\n }\n\n footer = (\n <div className='attachment__footer-container'>\n {footerIcon}\n <span>{truncate(attachment.footer, {length: Constants.MAX_ATTACHMENT_FOOTER_LENGTH, omission: '…'})}</span>\n </div>\n );\n }\n\n let thumb;\n if (attachment.thumb_url) {\n const thumbMetadata = secureGetFromRecord(this.props.imagesMetadata, attachment.thumb_url);\n\n thumb = (\n <div className='attachment__thumb-container'>\n <ExternalImage\n src={attachment.thumb_url}\n imageMetadata={thumbMetadata}\n >\n {(thumbUrl) => (\n <SizeAwareImage\n onImageLoaded={this.handleHeightReceivedForThumbUrl}\n src={thumbUrl}\n dimensions={thumbMetadata}\n />\n )}\n </ExternalImage>\n </div>\n );\n }\n\n const fields = this.getFieldsTable();\n const actions = this.renderPostActions();\n\n let useBorderStyle;\n if (attachment.color && attachment.color[0] === '#') {\n useBorderStyle = {borderLeftColor: attachment.color};\n }\n\n const hasContent = author.length > 0 || Boolean(title) || Boolean(thumb) || Boolean(attachmentText) || Boolean(image) || Boolean(fields) || Boolean(footer) || Boolean(actions);\n\n return (\n <div\n className={'attachment ' + preTextClass}\n onClick={this.handleFormattedTextClick}\n >\n {preText}\n {\n hasContent &&\n <div className='attachment__content'>\n <div\n className={useBorderStyle ? 'clearfix attachment__container' : 'clearfix attachment__container attachment__container--' + attachment.color}\n style={useBorderStyle}\n >\n {author}\n {title}\n <div>\n <div\n className={thumb ? 'attachment__body' : 'attachment__body attachment__body--no_thumb'}\n >\n {attachmentText}\n {image}\n {fields}\n {footer}\n {actions}\n </div>\n {thumb}\n <div style={style.footer}/>\n </div>\n </div>\n </div>\n }\n </div>\n );\n }\n}\n\nconst style = {\n footer: {clear: 'both'} as CSSProperties,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {doPostActionWithCookie} from 'mattermost-redux/actions/posts';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\n\nimport {openModal} from 'actions/views/modals';\n\nimport MessageAttachment from './message_attachment';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n currentRelativeTeamUrl: getCurrentRelativeTeamUrl(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n doPostActionWithCookie, openModal,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MessageAttachment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport type {MessageAttachment as MessageAttachmentType} from '@mattermost/types/message_attachments';\nimport type {PostImage} from '@mattermost/types/posts';\n\nimport type {TextFormattingOptions} from 'utils/text_formatting';\n\nimport MessageAttachment from './message_attachment';\n\ntype Props = {\n\n /**\n * The post id\n */\n postId: string;\n\n /**\n * Array of attachments to render\n */\n attachments: MessageAttachmentType[];\n\n /**\n * Options specific to text formatting\n */\n options?: Partial<TextFormattingOptions>;\n\n /**\n * Images object used for creating placeholders to prevent scroll popup\n */\n imagesMetadata?: Record<string, PostImage>;\n}\n\nconst EMPTY_METADATA: Record<string, PostImage> = {};\n\nconst MessageAttachmentList = ({\n imagesMetadata = EMPTY_METADATA,\n attachments,\n postId,\n options,\n}: Props) => (\n <div\n id={`messageAttachmentList_${postId}`}\n className='attachment__list'\n >\n {attachments.map((attachment, i) => (\n <MessageAttachment\n attachment={attachment}\n postId={postId}\n key={'att_' + i}\n options={options}\n imagesMetadata={imagesMetadata}\n />\n ))}\n </div>\n);\n\nexport default memo(MessageAttachmentList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport type {KeyboardEvent, MouseEvent} from 'react';\n\nimport type {\n Post,\n PostImage as PostImageMetadata,\n} from '@mattermost/types/posts';\n\nimport ExternalImage from 'components/external_image';\nimport FilePreviewModal from 'components/file_preview_modal';\nimport SizeAwareImage from 'components/size_aware_image';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\ntype PostImageProps = {\n imageMetadata: PostImageMetadata;\n link: string;\n post: Post;\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n}\n\nconst PostImage = ({\n imageMetadata,\n link,\n post,\n actions,\n}: PostImageProps) => {\n const {openModal} = actions;\n const showModal = useCallback((\n e: KeyboardEvent<HTMLImageElement> | MouseEvent<HTMLElement>,\n link = '',\n ) => {\n e.preventDefault();\n\n openModal({\n modalId: ModalIdentifiers.FILE_PREVIEW_MODAL,\n dialogType: FilePreviewModal,\n dialogProps: {\n post,\n startIndex: 0,\n fileInfos: [\n {\n has_preview_image: false,\n link,\n extension: imageMetadata.format,\n name: link,\n },\n ],\n },\n });\n }, [openModal, imageMetadata.format, post]);\n\n return (\n <div className='post__embed-container'>\n <ExternalImage\n src={link}\n imageMetadata={imageMetadata}\n >\n {(safeLink) => (\n <>\n <SizeAwareImage\n className='img-div attachment__image cursor--pointer'\n src={safeLink}\n dimensions={imageMetadata}\n showLoader={true}\n onClick={showModal}\n />\n </>\n )}\n </ExternalImage>\n </div>\n );\n};\n\nexport default PostImage;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {openModal} from 'actions/views/modals';\n\nimport PostImage from './post_image';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n }, dispatch),\n };\n}\n\nconst connector = connect(null, mapDispatchToProps);\n\nexport default connector(PostImage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport const ytRegex = /(?:http|https):\\/\\/(?:www\\.|m\\.)?(?:(?:youtube\\.com\\/(?:(?:v\\/)|(?:(?:watch|embed\\/watch)(?:\\/|.*v=))|(?:embed\\/)|(?:user\\/[^/]+\\/u\\/[0-9]\\/)))|(?:youtu\\.be\\/))([^#&?]*)/;\n\nexport function handleYoutubeTime(link: string) {\n const timeRegex = /[\\\\?&](t|time|start|time_continue)=([0-9]+h)?([0-9]+m)?([0-9]+s?)/;\n\n const time = link.match(timeRegex);\n if (!time?.[0]) {\n return '';\n }\n\n const hours = time[2]?.match(/([0-9]+)h/) ?? null;\n const minutes = time[3]?.match(/([0-9]+)m/) ?? null;\n const seconds = time[4]?.match(/([0-9]+)s?/) ?? null;\n\n let startSeconds = 0;\n\n if (hours?.[1]) {\n startSeconds += parseInt(hours[1], 10) * 3600;\n }\n\n if (minutes?.[1]) {\n startSeconds += parseInt(minutes[1], 10) * 60;\n }\n\n if (seconds?.[1]) {\n startSeconds += parseInt(seconds[1], 10);\n }\n\n return `&start=${startSeconds}`;\n}\n\nexport function getVideoId(link: string) {\n const match = link.trim().match(ytRegex);\n if (!match || match[1].length !== 11) {\n return null;\n }\n\n return match[1];\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {OpenGraphMetadata} from '@mattermost/types/posts';\n\nimport ExternalImage from 'components/external_image';\nimport ExternalLink from 'components/external_link';\n\nimport {getVideoId, ytRegex, handleYoutubeTime} from 'utils/youtube';\n\ntype Props = {\n postId: string;\n link: string;\n show: boolean;\n metadata?: OpenGraphMetadata;\n youtubeReferrerPolicy?: boolean;\n}\n\ntype State = {\n playing: boolean;\n}\n\nexport default class YoutubeVideo extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n playing: false,\n };\n }\n\n static getDerivedStateFromProps(props: Props, state: State): State | null {\n if (!props.show && state.playing) {\n return {playing: false};\n }\n return null;\n }\n\n play = () => {\n this.setState({playing: true});\n };\n\n stop = () => {\n this.setState({playing: false});\n };\n\n render() {\n const {metadata, link} = this.props;\n\n const videoId = getVideoId(link);\n const videoTitle = metadata?.title || 'unknown';\n const time = handleYoutubeTime(link);\n\n const header = (\n <h4>\n <span className='video-type'>{'YouTube - '}</span>\n <span className='video-title'>\n <ExternalLink\n href={this.props.link}\n location='youtube_video'\n >\n {videoTitle}\n </ExternalLink>\n </span>\n </h4>\n );\n\n let content;\n\n if (this.state.playing) {\n content = (\n <iframe\n src={'https://www.youtube.com/embed/' + videoId + '?autoplay=1&autohide=1&border=0&wmode=opaque&fs=1&enablejsapi=1' + time}\n width='480px'\n height='360px'\n frameBorder='0'\n allowFullScreen={true}\n allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'\n referrerPolicy={this.props.youtubeReferrerPolicy ? 'strict-origin-when-cross-origin' : 'no-referrer'}\n title={videoTitle}\n sandbox='allow-scripts allow-same-origin allow-popups allow-presentation'\n />\n );\n } else {\n const image = metadata?.images[0];\n\n content = (\n <div className='embed-responsive video-div__placeholder'>\n <div className='video-thumbnail__container'>\n <ExternalImage src={image?.secure_url || image?.url || ''}>\n {(safeUrl) => (\n <img\n src={safeUrl}\n alt='youtube video thumbnail'\n className='video-thumbnail'\n />\n )}\n </ExternalImage>\n <div className='block'>\n <span className='play-button'><span/></span>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className='post__embed-container'\n >\n <div>\n {header}\n <div\n className='video-div embed-responsive-item'\n onClick={this.play}\n >\n {content}\n </div>\n </div>\n </div>\n );\n }\n\n public static isYoutubeLink(link: string): boolean {\n return Boolean(link.trim().match(ytRegex));\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOpenGraphMetadataForUrl} from 'mattermost-redux/selectors/entities/posts';\n\nimport type {GlobalState} from 'types/store';\n\nimport YoutubeVideo from './youtube_video';\n\ntype OwnProps = {\n postId: string;\n link: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const config = getConfig(state);\n\n return {\n currentChannelId: getCurrentChannelId(state),\n googleDeveloperKey: config.GoogleDeveloperKey,\n hasImageProxy: config.HasImageProxy === 'true',\n metadata: getOpenGraphMetadataForUrl(state, ownProps.postId, ownProps.link),\n youtubeReferrerPolicy: config.YoutubeReferrerPolicy === 'true',\n };\n}\n\nexport default connect(mapStateToProps)(YoutubeVideo);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {AppBinding} from '@mattermost/types/apps';\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {AppBindingLocations, AppCallResponseTypes} from 'mattermost-redux/constants/apps';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport Markdown from 'components/markdown';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport {createCallContext} from 'utils/apps';\n\nimport type {PostEphemeralCallResponseForPost, HandleBindingClick, OpenAppsModal} from 'types/apps';\n\ntype Props = {\n intl: IntlShape;\n binding: AppBinding;\n post: Post;\n actions: {\n handleBindingClick: HandleBindingClick;\n getChannel: (channelId: string) => Promise<ActionResult>;\n postEphemeralCallResponseForPost: PostEphemeralCallResponseForPost;\n openAppsModal: OpenAppsModal;\n };\n}\n\ntype State = {\n executing: boolean;\n}\n\nclass ButtonBinding extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n executing: false,\n };\n }\n\n handleClick = async () => {\n const {binding, post, intl} = this.props;\n\n let teamID = '';\n const {data} = await this.props.actions.getChannel(post.channel_id) as {data?: any; error?: any};\n if (data) {\n const channel = data as Channel;\n teamID = channel.team_id;\n }\n\n const context = createCallContext(\n binding.app_id,\n AppBindingLocations.IN_POST + '/' + binding.location,\n post.channel_id,\n teamID,\n post.id,\n post.root_id,\n );\n\n this.setState({executing: true});\n const res = await this.props.actions.handleBindingClick(binding, context, intl);\n this.setState({executing: false});\n\n if (res.error) {\n const errorResponse = res.error;\n const errorMessage = errorResponse.text || intl.formatMessage({\n id: 'apps.error.unknown',\n defaultMessage: 'Unknown error occurred.',\n });\n this.props.actions.postEphemeralCallResponseForPost(errorResponse, errorMessage, post);\n return;\n }\n\n const callResp = res.data!;\n switch (callResp.type) {\n case AppCallResponseTypes.OK:\n if (callResp.text) {\n this.props.actions.postEphemeralCallResponseForPost(callResp, callResp.text, post);\n }\n break;\n case AppCallResponseTypes.NAVIGATE:\n // already handled\n break;\n case AppCallResponseTypes.FORM:\n if (callResp.form) {\n this.props.actions.openAppsModal(callResp.form, context);\n }\n break;\n default: {\n const errorMessage = intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResp.type,\n });\n this.props.actions.postEphemeralCallResponseForPost(callResp, errorMessage, post);\n }\n }\n };\n\n render() {\n const {binding} = this.props;\n\n if (!binding.submit && !binding.form?.submit && !binding.form?.source) {\n return null;\n }\n\n const label = binding.label || binding.location;\n if (!label) {\n return null;\n }\n\n return (\n <button\n className='btn btn-sm'\n onClick={this.handleClick}\n >\n <LoadingWrapper\n loading={this.state.executing}\n >\n <Markdown\n message={label}\n options={{\n mentionHighlight: false,\n markdown: false,\n autolinkedUrlSchemes: [],\n }}\n />\n </LoadingWrapper>\n </button>\n );\n }\n}\n\nexport default injectIntl(ButtonBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getChannel} from 'mattermost-redux/actions/channels';\n\nimport {postEphemeralCallResponseForPost, handleBindingClick, openAppsModal} from 'actions/apps';\n\nimport ButtonBinding from './button_binding';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n handleBindingClick,\n getChannel,\n postEphemeralCallResponseForPost,\n openAppsModal,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(ButtonBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {AppBinding} from '@mattermost/types/apps';\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {AppBindingLocations, AppCallResponseTypes} from 'mattermost-redux/constants/apps';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AutocompleteSelector from 'components/autocomplete_selector';\nimport type {Option, Selected} from 'components/autocomplete_selector';\nimport PostContext from 'components/post_view/post_context';\nimport MenuActionProvider from 'components/suggestion/menu_action_provider';\n\nimport {createCallContext} from 'utils/apps';\n\nimport type {HandleBindingClick, OpenAppsModal, PostEphemeralCallResponseForPost} from 'types/apps';\n\ntype Props = {\n intl: IntlShape;\n post: Post;\n binding: AppBinding;\n actions: {\n handleBindingClick: HandleBindingClick;\n getChannel: (channelId: string) => Promise<ActionResult>;\n postEphemeralCallResponseForPost: PostEphemeralCallResponseForPost;\n openAppsModal: OpenAppsModal;\n };\n};\n\ntype State = {\n selected?: Option;\n};\n\nclass SelectBinding extends React.PureComponent<Props, State> {\n private providers: MenuActionProvider[];\n private nOptions = 0;\n constructor(props: Props) {\n super(props);\n\n const binding = props.binding;\n this.providers = [];\n if (binding.bindings) {\n const options: Array<{text: string; value: string}> = [];\n const usedLabels: {[label: string]: boolean} = {};\n const usedValues: {[label: string]: boolean} = {};\n binding.bindings.forEach((b) => {\n const label = b.label || b.location;\n if (!label) {\n return;\n }\n\n if (!b.location) {\n return;\n }\n\n if (usedLabels[label]) {\n return;\n }\n\n if (usedValues[b.location]) {\n return;\n }\n\n usedLabels[label] = true;\n usedValues[b.location] = true;\n\n options.push({text: label, value: b.location});\n });\n\n this.nOptions = options.length;\n this.providers = [new MenuActionProvider(options)];\n }\n\n this.state = {};\n }\n\n handleSelected = async (selected: Selected) => {\n //this component expects selected to be of type Option\n if (!selected || !('value' in selected)) {\n return;\n }\n\n this.setState({selected});\n const binding = this.props.binding.bindings?.find((b) => b.location === selected.value);\n if (!binding) {\n console.debug('Trying to select element not present in binding.'); //eslint-disable-line no-console\n return;\n }\n\n const {post, intl} = this.props;\n\n let teamID = '';\n const {data} = await this.props.actions.getChannel(post.channel_id) as {data?: any; error?: any};\n if (data) {\n const channel = data as Channel;\n teamID = channel.team_id;\n }\n\n const context = createCallContext(\n binding.app_id,\n AppBindingLocations.IN_POST + '/' + binding.location,\n post.channel_id,\n teamID,\n post.id,\n post.root_id,\n );\n\n const res = await this.props.actions.handleBindingClick(binding, context, intl);\n\n if (res.error) {\n const errorResponse = res.error;\n const errorMessage = errorResponse.text || intl.formatMessage({\n id: 'apps.error.unknown',\n defaultMessage: 'Unknown error occurred.',\n });\n this.props.actions.postEphemeralCallResponseForPost(errorResponse, errorMessage, post);\n return;\n }\n\n const callResp = res.data!;\n switch (callResp.type) {\n case AppCallResponseTypes.OK:\n if (callResp.text) {\n this.props.actions.postEphemeralCallResponseForPost(callResp, callResp.text, post);\n }\n break;\n case AppCallResponseTypes.NAVIGATE:\n break;\n case AppCallResponseTypes.FORM:\n if (callResp.form) {\n this.props.actions.openAppsModal(callResp.form, context);\n }\n break;\n default: {\n const errorMessage = this.props.intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResp.type,\n });\n this.props.actions.postEphemeralCallResponseForPost(callResp, errorMessage, post);\n }\n }\n };\n\n render() {\n if (!this.nOptions) {\n return null;\n }\n\n const {binding} = this.props;\n const label = binding.label || binding.location;\n if (!label) {\n return null;\n }\n\n return (\n <PostContext.Consumer>\n {({handlePopupOpened}) => (\n <AutocompleteSelector\n providers={this.providers}\n onSelected={this.handleSelected}\n placeholder={label}\n inputClassName='post-attachment-dropdown'\n value={this.state.selected?.text}\n toggleFocus={handlePopupOpened}\n />\n )}\n </PostContext.Consumer>\n );\n }\n}\n\nexport {SelectBinding as RawSelectBinding};\n\nexport default injectIntl(SelectBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getChannel} from 'mattermost-redux/actions/channels';\n\nimport {postEphemeralCallResponseForPost, handleBindingClick, openAppsModal} from 'actions/apps';\n\nimport SelectBinding from './select_binding';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n handleBindingClick,\n getChannel,\n postEphemeralCallResponseForPost,\n openAppsModal,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(SelectBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\n\nimport type {AppBinding} from '@mattermost/types/apps';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {AppBindingLocations} from 'mattermost-redux/constants/apps';\nimport {cleanBinding} from 'mattermost-redux/utils/apps';\n\nimport Markdown from 'components/markdown';\nimport ShowMore from 'components/post_view/show_more';\n\nimport LinkOnlyRenderer from 'utils/markdown/link_only_renderer';\nimport type {TextFormattingOptions} from 'utils/text_formatting';\nimport * as Utils from 'utils/utils';\n\nimport ButtonBinding from '../button_binding';\nimport SelectBinding from '../select_binding';\n\ntype Props = {\n\n /**\n * The post id\n */\n post: Post;\n\n /**\n * The attachment to render\n */\n embed: AppBinding;\n\n /**\n * Options specific to text formatting\n */\n options?: Partial<TextFormattingOptions>;\n\n currentRelativeTeamUrl: string;\n}\n\ntype State = {\n checkOverflow: number;\n embed: AppBinding;\n bindings: AppBinding[];\n}\n\nexport default class EmbeddedBinding extends React.PureComponent<Props, State> {\n private imageProps: Record<string, any>;\n constructor(props: Props) {\n super(props);\n\n const state: State = {\n checkOverflow: 0,\n embed: props.embed,\n bindings: [],\n };\n\n if (props.embed.app_id && props.embed.bindings) {\n state.bindings = EmbeddedBinding.fillBindings(props.embed);\n }\n\n this.state = state;\n\n this.imageProps = {\n onImageLoaded: this.handleHeightReceived,\n onImageHeightChanged: this.checkPostOverflow,\n };\n }\n\n static getDerivedStateFromProps(props: Props, prevState: State) {\n if (props.embed !== prevState.embed) {\n return {\n embed: props.embed,\n bindings: EmbeddedBinding.fillBindings(props.embed),\n };\n }\n\n return null;\n }\n\n static fillBindings = (binding: AppBinding): AppBinding[] => {\n const copiedBindings = JSON.parse(JSON.stringify(binding)) as AppBinding;\n cleanBinding(copiedBindings, AppBindingLocations.IN_POST);\n return copiedBindings.bindings!;\n };\n\n renderBindings = () => {\n if (!this.props.embed.app_id) {\n return null;\n }\n\n if (!this.props.embed.bindings) {\n return null;\n }\n\n const bindings = this.state.bindings;\n if (!bindings || !bindings.length) {\n return null;\n }\n\n const content = [] as JSX.Element[];\n\n bindings.forEach((binding: AppBinding) => {\n if (binding.bindings && binding.bindings.length > 0) {\n content.push(\n <SelectBinding\n key={binding.location}\n post={this.props.post}\n binding={binding}\n />,\n );\n return;\n }\n\n content.push(\n <ButtonBinding\n key={binding.location}\n post={this.props.post}\n binding={binding}\n />,\n );\n });\n\n return (\n <div\n className='attachment-actions'\n >\n {content}\n </div>\n );\n };\n\n handleFormattedTextClick = (e: React.MouseEvent) => Utils.handleFormattedTextClick(e, this.props.currentRelativeTeamUrl);\n\n checkPostOverflow = () => {\n // Increment checkOverflow to indicate change in height\n // and recompute textContainer height at ShowMore component\n // and see whether overflow text of show more/less is necessary or not.\n this.setState((prevState) => {\n return {checkOverflow: prevState.checkOverflow + 1};\n });\n };\n\n handleHeightReceived = (height: number) => {\n if (height > 0) {\n this.checkPostOverflow();\n }\n };\n\n render() {\n const {embed, options} = this.props;\n\n let title;\n if (embed.label) {\n title = (\n <h1 className='attachment__title'>\n <Markdown\n message={embed.label}\n options={{\n mentionHighlight: false,\n renderer: new LinkOnlyRenderer(),\n autolinkedUrlSchemes: [],\n }}\n postId={this.props.post.id}\n />\n </h1>\n );\n }\n\n let attachmentText;\n if (embed.description) {\n attachmentText = (\n <ShowMore\n isAttachmentText={true}\n text={embed.description}\n maxHeight={200}\n >\n <Markdown\n message={embed.description}\n imageProps={this.imageProps}\n options={options}\n postId={this.props.post.id}\n />\n </ShowMore>\n );\n }\n\n const bindings = this.renderBindings();\n\n return (\n <div\n className={'attachment'}\n onClick={this.handleFormattedTextClick}\n >\n <div className='attachment__content'>\n <div\n className={'clearfix attachment__container attachment__container--'}\n >\n {title}\n <div>\n <div\n className={'attachment__body attachment__body--no_thumb'}\n >\n {attachmentText}\n {bindings}\n </div>\n <div style={style.footer}/>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst style = {\n footer: {clear: 'both'} as CSSProperties,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\n\nimport EmbeddedBinding from './embedded_binding';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n currentRelativeTeamUrl: getCurrentRelativeTeamUrl(state),\n };\n}\n\nexport default connect(mapStateToProps)(EmbeddedBinding);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport type {AppBinding} from '@mattermost/types/apps';\nimport type {Post} from '@mattermost/types/posts';\n\nimport type {TextFormattingOptions} from 'utils/text_formatting';\n\nimport EmbeddedBinding from './embedded_binding';\n\ntype Props = {\n\n /**\n * The post id\n */\n post: Post;\n\n /**\n * Array of attachments to render\n */\n embeds: AppBinding[]; // Type App Embed Wrapper\n\n /**\n * Options specific to text formatting\n */\n options?: Partial<TextFormattingOptions>;\n\n}\n\nconst EmbeddedBindings = ({\n embeds,\n post,\n options,\n}: Props) => (\n <div\n id={`messageAttachmentList_${post.id}`}\n className='attachment__list'\n >\n {embeds.map((embed, i) => (\n <EmbeddedBinding\n embed={embed}\n post={post}\n key={'att_' + i}\n options={options}\n />\n ))}\n </div>\n);\n\nexport default memo(EmbeddedBindings);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {isAppBinding, type AppBinding} from '@mattermost/types/apps';\nimport {isMessageAttachmentArray} from '@mattermost/types/message_attachments';\nimport type {Post, PostEmbed} from '@mattermost/types/posts';\nimport {isArrayOf} from '@mattermost/types/utilities';\n\nimport {validateBindings} from 'mattermost-redux/utils/apps';\nimport {getEmbedFromMetadata} from 'mattermost-redux/utils/post_utils';\n\nimport MessageAttachmentList from 'components/post_view/message_attachments/message_attachment_list';\nimport PostAttachmentOpenGraph from 'components/post_view/post_attachment_opengraph';\nimport PostImage from 'components/post_view/post_image';\nimport PostMessagePreview from 'components/post_view/post_message_preview';\nimport YoutubeVideo from 'components/youtube_video';\n\nimport webSocketClient from 'client/web_websocket_client';\nimport type {TextFormattingOptions} from 'utils/text_formatting';\n\nimport type {PostWillRenderEmbedPluginComponent} from 'types/store/plugins';\n\nimport EmbeddedBindings from '../embedded_bindings/embedded_bindings';\n\nexport type Props = {\n post: Post;\n pluginPostWillRenderEmbedComponents?: PostWillRenderEmbedPluginComponent[];\n children?: JSX.Element;\n isEmbedVisible?: boolean;\n options?: Partial<TextFormattingOptions>;\n appsEnabled: boolean;\n handleFileDropdownOpened?: (open: boolean) => void;\n actions: {\n toggleEmbedVisibility: (id: string) => void;\n };\n};\n\nexport default class PostBodyAdditionalContent extends React.PureComponent<Props> {\n toggleEmbedVisibility = () => {\n this.props.actions.toggleEmbedVisibility(this.props.post.id);\n };\n\n getEmbed = () => {\n const {metadata} = this.props.post;\n return getEmbedFromMetadata(metadata);\n };\n\n isEmbedToggleable = (embed: PostEmbed) => {\n const postWillRenderEmbedComponents = this.props.pluginPostWillRenderEmbedComponents || [];\n for (const c of postWillRenderEmbedComponents) {\n if (c.match(embed)) {\n return Boolean(c.toggleable);\n }\n }\n\n return embed.type === 'image' || (embed.type === 'opengraph' && YoutubeVideo.isYoutubeLink(embed.url));\n };\n\n renderEmbed = (embed: PostEmbed) => {\n const postWillRenderEmbedComponents = this.props.pluginPostWillRenderEmbedComponents || [];\n for (const c of postWillRenderEmbedComponents) {\n if (c.match(embed)) {\n const Component = c.component;\n return this.props.isEmbedVisible && (\n <Component\n embed={embed}\n webSocketClient={webSocketClient}\n />\n );\n }\n }\n switch (embed.type) {\n case 'image':\n if (!this.props.isEmbedVisible) {\n return null;\n }\n\n return (\n <PostImage\n imageMetadata={this.props.post.metadata.images[embed.url]}\n link={embed.url}\n post={this.props.post}\n />\n );\n\n case 'message_attachment': {\n const attachments = isMessageAttachmentArray(this.props.post.props?.attachments) ? this.props.post.props?.attachments : [];\n\n return (\n <MessageAttachmentList\n attachments={attachments}\n postId={this.props.post.id}\n options={this.props.options}\n imagesMetadata={this.props.post.metadata.images}\n />\n );\n }\n\n case 'opengraph':\n if (YoutubeVideo.isYoutubeLink(embed.url)) {\n if (!this.props.isEmbedVisible) {\n return null;\n }\n\n return (\n <YoutubeVideo\n postId={this.props.post.id}\n link={embed.url}\n show={this.props.isEmbedVisible}\n />\n );\n }\n\n return (\n <PostAttachmentOpenGraph\n postId={this.props.post.id}\n link={embed.url}\n isEmbedVisible={this.props.isEmbedVisible}\n post={this.props.post}\n toggleEmbedVisibility={this.toggleEmbedVisibility}\n />\n );\n case 'permalink':\n if (embed.data && 'post_id' in embed.data && embed.data.post_id) {\n return (\n <PostMessagePreview\n metadata={embed.data}\n handleFileDropdownOpened={this.props.handleFileDropdownOpened}\n />\n );\n }\n return null;\n default:\n return null;\n }\n };\n\n renderToggle = (prependToggle: boolean) => {\n return (\n <button\n key='toggle'\n className={`style--none post__embed-visibility color--link ${prependToggle ? 'pull-left' : ''}`}\n data-expanded={this.props.isEmbedVisible}\n aria-label='Toggle Embed Visibility'\n onClick={this.toggleEmbedVisibility}\n />\n );\n };\n\n render() {\n const embed = this.getEmbed();\n\n if (this.props.appsEnabled) {\n const appEmbeds = isArrayOf<AppBinding>(this.props.post.props?.app_bindings, isAppBinding) ? validateBindings(this.props.post.props?.app_bindings) : [];\n if (appEmbeds.length) {\n // TODO Put some log / message if the form is not valid?\n return (\n <>\n {this.props.children}\n <EmbeddedBindings\n embeds={appEmbeds}\n post={this.props.post}\n />\n </>\n );\n }\n }\n\n if (embed) {\n const toggleable = this.isEmbedToggleable(embed);\n const prependToggle = (/^\\s*https?:\\/\\/.*$/).test(this.props.post.message);\n\n return (\n <div>\n {(toggleable && prependToggle) && this.renderToggle(true)}\n {this.props.children}\n {(toggleable && !prependToggle) && this.renderToggle(false)}\n {this.renderEmbed(embed)}\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\n\nimport {toggleEmbedVisibility} from 'actions/post_actions';\nimport {isEmbedVisible} from 'selectors/posts';\n\nimport type {GlobalState} from 'types/store';\nimport type {PostWillRenderEmbedPluginComponent} from 'types/store/plugins';\n\nimport PostBodyAdditionalContent from './post_body_additional_content';\nimport type {\n Props,\n} from './post_body_additional_content';\n\nfunction mapStateToProps(state: GlobalState, ownProps: Omit<Props, 'appsEnabled' | 'actions'>) {\n return {\n isEmbedVisible: isEmbedVisible(state, ownProps.post.id),\n pluginPostWillRenderEmbedComponents: state.plugins.components.PostWillRenderEmbedComponent as unknown as PostWillRenderEmbedPluginComponent[],\n appsEnabled: appsEnabled(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({toggleEmbedVisibility}, dispatch),\n };\n}\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps,\n)(PostBodyAdditionalContent);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {Posts} from 'mattermost-redux/constants';\n\nimport PostBodyAdditionalContent from 'components/post_view/post_body_additional_content';\nimport PostMessageView from 'components/post_view/post_message_view';\n\nimport type {PluginsState} from 'types/store/plugins';\n\ntype Props = {\n id?: string;\n post: Post;\n isEmbedVisible?: boolean;\n pluginPostTypes?: PluginsState['postTypes'];\n isRHS: boolean;\n compactDisplay?: boolean;\n}\n\nexport default function MessageWithAdditionalContent({post, isEmbedVisible, pluginPostTypes, isRHS, compactDisplay}: Props) {\n const hasPlugin = post.type && pluginPostTypes && Object.hasOwn(pluginPostTypes, post.type);\n let msg;\n const messageWrapper = (\n <PostMessageView\n post={post}\n isRHS={isRHS}\n compactDisplay={compactDisplay}\n />\n );\n if (post.state === Posts.POST_DELETED || hasPlugin) {\n msg = messageWrapper;\n } else {\n msg = (\n <PostBodyAdditionalContent\n post={post}\n isEmbedVisible={isEmbedVisible}\n >\n {messageWrapper}\n </PostBodyAdditionalContent>\n );\n }\n return msg;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport type {PostAcknowledgement} from '@mattermost/types/posts';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {makeGetDisplayName} from 'mattermost-redux/selectors/entities/users';\n\nimport Nbsp from 'components/html_entities/nbsp';\nimport Timestamp from 'components/timestamp';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n currentUserId: UserProfile['id'];\n list: Array<{user: UserProfile; acknowledgedAt: PostAcknowledgement['acknowledged_at']}>;\n};\n\nconst Item = styled.div`\n display: flex;\n gap: 12px;\n padding: 10px 20px;\n`;\n\nconst Info = styled.div`\n display: flex;\n flex-direction: column;\n min-width: 0;\n overflow-x: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst Title = styled.div`\n color: rgba(var(--center-channel-color-rgb), 0.75);\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n padding: 8px 20px;\n`;\n\nconst Span = styled.span`\n color: rgba(var(--center-channel-color-rgb), 0.75);\n font-size: 12px;\n line-height: 18px;\n`;\n\nconst Popover = styled.div`\n background: var(--center-channel-bg);\n border-radius: 4px;\n border: solid 1px rgba(var(--center-channel-color-rgb), 0.16);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\n color: color.adjust($black, $lightness: 25%);\n font-family: inherit;\n max-height: 400px;\n overflow-y: scroll;\n padding: 8px 0;\n`;\n\nfunction Row({\n acknowledgedAt,\n id,\n isMe,\n lastPictureUpdate,\n username,\n}: {\n acknowledgedAt: number;\n id: UserProfile['id'];\n isMe: boolean;\n lastPictureUpdate: UserProfile['last_picture_update'];\n username: UserProfile['username'];\n}) {\n const getDisplayName = useMemo(makeGetDisplayName, []);\n const displayName = useSelector((state: GlobalState) => getDisplayName(state, id));\n\n return (\n <Item>\n <Avatar\n size='sm'\n url={Client4.getProfilePictureUrl(id, lastPictureUpdate)}\n username={username}\n />\n <Info>\n <div>\n {displayName}\n {isMe && (\n <>\n <Nbsp/>\n <FormattedMessage\n id={'post_priority.you.acknowledge'}\n defaultMessage={'(you)'}\n />\n </>\n )}\n </div>\n <Span>\n <Timestamp value={acknowledgedAt}/>\n </Span>\n </Info>\n </Item>\n );\n}\n\nexport default function PostAcknowledgementsUserPopover({list, currentUserId}: Props) {\n return (\n <Popover>\n <Title>\n <FormattedMessage\n id={'post_priority.acknowledgements.title'}\n defaultMessage={'Acknowledgements'}\n />\n </Title>\n {list.map((item) => (\n <Row\n key={item.user.id}\n acknowledgedAt={item.acknowledgedAt}\n isMe={currentUserId === item.user.id}\n id={item.user.id}\n lastPictureUpdate={item.user.last_picture_update}\n username={item.user.username}\n />\n ))}\n </Popover>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {\n FloatingFocusManager,\n autoUpdate,\n flip,\n offset,\n safePolygon,\n shift,\n useFloating,\n useHover,\n useId,\n useInteractions,\n useRole,\n} from '@floating-ui/react';\nimport classNames from 'classnames';\nimport React, {memo, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {CheckCircleOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {Post, PostAcknowledgement} from '@mattermost/types/posts';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {acknowledgePost, unacknowledgePost} from 'mattermost-redux/actions/posts';\n\nimport PostAcknowledgementsUserPopover from './post_acknowledgements_users_popover';\n\nimport './post_acknowledgements.scss';\n\ntype Props = {\n authorId: UserProfile['id'];\n currentUserId: UserProfile['id'];\n hasReactions: boolean;\n isDeleted: boolean;\n list?: Array<{user: UserProfile; acknowledgedAt: PostAcknowledgement['acknowledged_at']}>;\n postId: Post['id'];\n showDivider?: boolean;\n}\n\nfunction moreThan5minAgo(time: number) {\n const now = new Date().getTime();\n return now - time > 5 * 60 * 1000;\n}\n\nfunction PostAcknowledgements({\n authorId,\n currentUserId,\n hasReactions,\n isDeleted,\n list,\n postId,\n showDivider = true,\n}: Props) {\n let acknowledgedAt = 0;\n const headingId = useId();\n const isCurrentAuthor = authorId === currentUserId;\n const dispatch = useDispatch();\n const [open, setOpen] = useState(false);\n\n if (list && list.length) {\n const ack = list.find((ack) => ack.user.id === currentUserId);\n if (ack) {\n acknowledgedAt = ack.acknowledgedAt;\n }\n }\n const buttonDisabled = (Boolean(acknowledgedAt) && moreThan5minAgo(acknowledgedAt)) || isCurrentAuthor;\n\n const {x, y, strategy, context, refs: {setReference, setFloating}} = useFloating({\n open,\n onOpenChange: setOpen,\n placement: 'top-start',\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(5),\n flip({\n fallbackPlacements: ['bottom-start', 'right'],\n padding: 12,\n }),\n shift({\n padding: 12,\n }),\n ],\n });\n\n const {getReferenceProps, getFloatingProps} = useInteractions([\n useHover(context, {\n enabled: list && list.length > 0,\n mouseOnly: true,\n delay: {\n open: 300,\n close: 0,\n },\n restMs: 100,\n handleClose: safePolygon({\n blockPointerEvents: false,\n }),\n }),\n useRole(context),\n ]);\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (buttonDisabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (acknowledgedAt) {\n dispatch(unacknowledgePost(postId));\n } else {\n dispatch(acknowledgePost(postId));\n }\n };\n\n if (isDeleted) {\n return null;\n }\n\n let buttonText: React.ReactNode = (\n <FormattedMessage\n id={'post_priority.button.acknowledge'}\n defaultMessage={'Acknowledge'}\n />\n );\n\n if ((list && list.length) || isCurrentAuthor) {\n buttonText = list?.length || 0;\n }\n\n const button = (\n <>\n <button\n ref={setReference}\n onClick={handleClick}\n className={classNames({\n AcknowledgementButton: true,\n 'AcknowledgementButton--acked': Boolean(acknowledgedAt),\n 'AcknowledgementButton--disabled': buttonDisabled,\n 'AcknowledgementButton--default': !list || list.length === 0,\n })}\n {...getReferenceProps()}\n >\n <CheckCircleOutlineIcon size={16}/>\n {buttonText}\n </button>\n {showDivider && hasReactions && <div className='AcknowledgementButton__divider'/>}\n </>\n );\n\n if (!list || !list.length) {\n return button;\n }\n\n return (\n <>\n {button}\n {open && (\n <FloatingFocusManager\n context={context}\n modal={false}\n >\n <div\n ref={setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0,\n width: 248,\n zIndex: 999,\n }}\n aria-labelledby={headingId}\n {...getFloatingProps()}\n >\n <PostAcknowledgementsUserPopover\n currentUserId={currentUserId}\n list={list}\n />\n </div>\n </FloatingFocusManager>\n )}\n </>\n );\n}\n\nexport default memo(PostAcknowledgements);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getHasReactions, makeGetPostAcknowledgementsWithProfiles} from 'mattermost-redux/selectors/entities/posts';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostAcknowledgements from './post_acknowledgements';\n\ntype OwnProps = {\n postId: Post['id'];\n};\n\nfunction makeMapStateToProps() {\n const getPostAcknowledgementsWithProfiles = makeGetPostAcknowledgementsWithProfiles();\n\n return (state: GlobalState, ownProps: OwnProps) => {\n const currentUserId = getCurrentUserId(state);\n const hasReactions = getHasReactions(state, ownProps.postId);\n const list = getPostAcknowledgementsWithProfiles(state, ownProps.postId);\n\n return {\n currentUserId,\n hasReactions,\n list,\n };\n };\n}\n\nexport default connect(makeMapStateToProps)(PostAcknowledgements);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\ntype Props = {\n\n /*\n * An array of file metadata for the parent post\n */\n fileInfos?: FileInfo[];\n};\n\nconst CommentedOnFilesMessage = ({\n fileInfos,\n}: Props) => {\n if (!fileInfos?.length) {\n return null;\n }\n\n let plusMore = null;\n if (fileInfos.length > 1) {\n plusMore = (\n <FormattedMessage\n id='post_body.plusMore'\n defaultMessage=' plus {count, number} other {count, plural, one {file} other {files}}'\n values={{\n count: fileInfos.length - 1,\n }}\n />\n );\n }\n\n return (\n <span data-testid='fileInfo'>\n {fileInfos[0].name}\n {plusMore}\n </span>\n );\n};\n\nexport default React.memo(CommentedOnFilesMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {makeGetFilesForPost} from 'mattermost-redux/selectors/entities/files';\n\nimport CommentedOnFilesMessage from './commented_on_files_message';\n\ntype OwnProps = {\n\n /*\n * The id of the post that was commented on\n */\n parentPostId: string;\n}\n\nfunction makeMapStateToProps() {\n const selectFileInfosForPost = makeGetFilesForPost();\n\n return function mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n let fileInfos;\n if (ownProps.parentPostId) {\n fileInfos = selectFileInfosForPost(state, ownProps.parentPostId);\n }\n\n return {\n fileInfos,\n };\n };\n}\n\nexport default connect(makeMapStateToProps)(CommentedOnFilesMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {isMessageAttachmentArray} from '@mattermost/types/message_attachments';\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserProfile as UserProfileType} from '@mattermost/types/users';\n\nimport CommentedOnFilesMessage from 'components/post_view/commented_on_files_message';\nimport UserProfile from 'components/user_profile';\n\nimport {stripMarkdown} from 'utils/markdown';\nimport * as Utils from 'utils/utils';\n\ntype Props = {\n enablePostUsernameOverride?: boolean;\n parentPostUser?: UserProfileType;\n onCommentClick?: React.EventHandler<React.MouseEvent>;\n post: Post;\n};\n\nfunction CommentedOn({post, parentPostUser, onCommentClick}: Props) {\n const makeCommentedOnMessage = () => {\n let message: React.ReactNode = '';\n if (post.message) {\n message = Utils.replaceHtmlEntities(post.message);\n } else if (post.file_ids && post.file_ids.length > 0) {\n message = (\n <CommentedOnFilesMessage parentPostId={post.id}/>\n );\n } else if (isMessageAttachmentArray(post.props?.attachments) && post.props.attachments.length > 0) {\n const attachment = post.props.attachments[0];\n const webhookMessage = attachment.pretext || attachment.title || attachment.text || attachment.fallback || '';\n message = Utils.replaceHtmlEntities(webhookMessage);\n }\n\n return message;\n };\n\n const message = makeCommentedOnMessage();\n const parentPostUserId = parentPostUser?.id ?? '';\n\n const parentUserProfile = (\n <UserProfile\n userId={parentPostUserId}\n />\n );\n\n return (\n <div\n data-testid='post-link'\n className='post__link'\n >\n <span>\n <FormattedMessage\n id='post_body.commentedOn'\n defaultMessage=\"Commented on {name}'s message: \"\n values={{\n name: <a className='theme user_name'>{parentUserProfile}</a>,\n }}\n />\n <a\n className='theme'\n onClick={onCommentClick}\n >\n {typeof message === 'string' ? stripMarkdown(message) : message}\n </a>\n </span>\n </div>\n );\n}\n\nexport default memo(CommentedOn);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback} from 'react';\nimport type {MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {FileInfo} from '@mattermost/types/files';\nimport type {Post} from '@mattermost/types/posts';\n\nimport type {ExtendedPost} from 'mattermost-redux/actions/posts';\n\ntype Props = {\n post: Post;\n actions: {\n createPost: (post: Post, files: FileInfo[]) => void;\n removePost: (post: ExtendedPost) => void;\n };\n};\n\nconst FailedPostOptions = ({\n post,\n actions,\n}: Props) => {\n const retryPost = useCallback((e: MouseEvent): void => {\n e.preventDefault();\n\n const postDetails = {...post};\n Reflect.deleteProperty(postDetails, 'id');\n actions.createPost(postDetails, []);\n }, [actions, post]);\n\n const cancelPost = useCallback((e: MouseEvent): void => {\n e.preventDefault();\n\n actions.removePost(post);\n }, [actions, post]);\n\n return (\n <span className='pending-post-actions'>\n <a\n className='post-retry'\n href='#'\n onClick={retryPost}\n >\n <FormattedMessage\n id='pending_post_actions.retry'\n defaultMessage='Retry'\n />\n </a>\n {' - '}\n <a\n className='post-cancel'\n href='#'\n onClick={cancelPost}\n >\n <FormattedMessage\n id='pending_post_actions.cancel'\n defaultMessage='Cancel'\n />\n </a>\n </span>\n );\n};\n\nexport default memo(FailedPostOptions);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {removePost} from 'mattermost-redux/actions/posts';\n\nimport {createPost} from 'actions/post_actions';\n\nimport FailedPostOptions from './failed_post_options';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n createPost,\n removePost,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(FailedPostOptions);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function FlagIconFilled(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='12px'\n height='15px'\n viewBox='0 0 12 15'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.flagged', defaultMessage: 'Flagged Icon'})}\n >\n <g\n stroke='none'\n strokeWidth='1'\n fill='inherit'\n fillRule='evenodd'\n >\n <g\n transform='translate(-1073.000000, -33.000000)'\n fillRule='nonzero'\n fill='inherit'\n >\n <g transform='translate(-1.000000, 0.000000)'>\n <g transform='translate(1064.000000, 22.000000)'>\n <g transform='translate(10.000000, 11.000000)'>\n <path d='M9.76172 0.800049H2.23828C1.83984 0.800049 1.48828 0.952393 1.18359 1.25708C0.902344 1.53833 0.761719 1.88989 0.761719 2.31177V14.3L6 12.05L11.2383 14.3V2.31177C11.2383 1.88989 11.0859 1.53833 10.7812 1.25708C10.5 0.952393 10.1602 0.800049 9.76172 0.800049Z'/>\n </g>\n </g>\n </g>\n </g>\n </g>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages, injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport FlagIconFilled from 'components/widgets/icons/flag_icon_filled';\n\nexport type Props = {\n intl: IntlShape;\n isFlagged: boolean;\n isPinned?: boolean;\n skipPinned?: boolean;\n skipFlagged?: boolean;\n channelId: string;\n actions: {\n showFlaggedPosts: () => void;\n showPinnedPosts: (channelId: string) => void;\n };\n}\n\nexport enum PostPinnedOrFlagged {\n Flagged,\n Pinned,\n PinnedAndFlagged,\n Neither,\n}\n\nenum MessageInfoKey {\n Flagged = 'flagged',\n Pinned = 'pinned',\n PinnedAndFlagged = 'pinnedAndFlagged',\n}\n\nclass PostPreHeader extends React.PureComponent<Props> {\n getPostStatus(isFlagged: boolean, isPinned?: boolean): PostPinnedOrFlagged {\n if (isFlagged) {\n if (isPinned) {\n return PostPinnedOrFlagged.PinnedAndFlagged;\n }\n\n return PostPinnedOrFlagged.Flagged;\n }\n\n if (isPinned) {\n return PostPinnedOrFlagged.Pinned;\n }\n\n return PostPinnedOrFlagged.Neither;\n }\n\n getMessageInfo(postStatus: PostPinnedOrFlagged, skipFlagged?: boolean, skipPinned?: boolean): MessageInfoKey | false {\n if (skipFlagged && skipPinned) {\n return false;\n }\n\n if (postStatus === PostPinnedOrFlagged.PinnedAndFlagged) {\n if (!skipPinned && !skipFlagged) {\n return MessageInfoKey.PinnedAndFlagged;\n }\n\n if (skipPinned) {\n return MessageInfoKey.Flagged;\n }\n\n if (skipFlagged) {\n return MessageInfoKey.Pinned;\n }\n }\n\n if (postStatus === PostPinnedOrFlagged.Flagged && !skipFlagged) {\n return MessageInfoKey.Flagged;\n }\n\n if (postStatus === PostPinnedOrFlagged.Pinned && !skipPinned) {\n return MessageInfoKey.Pinned;\n }\n\n return false;\n }\n\n handleLinkClick = (messageKey: MessageInfoKey, channelId?: string) => {\n if (messageKey === MessageInfoKey.Pinned && channelId) {\n this.props.actions.showPinnedPosts(channelId);\n } else {\n this.props.actions.showFlaggedPosts();\n }\n };\n\n render() {\n const {isFlagged, isPinned, skipPinned, skipFlagged, channelId} = this.props;\n\n const messageKey = this.getMessageInfo(this.getPostStatus(isFlagged, isPinned), skipFlagged, skipPinned);\n\n if ((!isFlagged && !isPinned) || !messageKey) {\n return null;\n }\n\n return (\n <div className='post-pre-header'>\n <div className='post-pre-header__icons-container'>\n {isPinned && !skipPinned && <span className='icon-pin icon icon--post-pre-header'/>}\n {isFlagged && !skipFlagged && <FlagIconFilled className='icon icon--post-pre-header'/>}\n </div>\n <div className='post-pre-header__text-container'>\n {messageKey &&\n messageKey !== MessageInfoKey.PinnedAndFlagged && (\n <span>\n <a onClick={() => this.handleLinkClick(messageKey, channelId)}>\n <FormattedMessage\n {...messages[messageKey]}\n />\n </a>\n </span>\n )}\n {messageKey &&\n messageKey === MessageInfoKey.PinnedAndFlagged && (\n <span>\n <a onClick={() => this.handleLinkClick(MessageInfoKey.Pinned, channelId)}>\n <FormattedMessage\n {...messages[MessageInfoKey.Pinned]}\n />\n </a>\n <span className='post-pre-header__link-separator'>{'\\u2B24'}</span>\n <a onClick={() => this.handleLinkClick(MessageInfoKey.Flagged)}>\n <FormattedMessage\n {...messages[MessageInfoKey.Flagged]}\n />\n </a>\n </span>\n )}\n </div>\n </div>\n );\n }\n}\n\nconst messages = defineMessages({\n [MessageInfoKey.Flagged]: {\n id: 'post_pre_header.flagged',\n defaultMessage: 'Saved',\n },\n [MessageInfoKey.Pinned]: {\n id: 'post_pre_header.pinned',\n defaultMessage: 'Pinned',\n },\n});\n\nexport default injectIntl(PostPreHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {showFlaggedPosts, showPinnedPosts} from 'actions/views/rhs';\n\nimport PostPreHeader from './post_pre_header';\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n actions: bindActionCreators({\n showFlaggedPosts,\n showPinnedPosts,\n }, dispatch),\n});\n\nexport default connect(null, mapDispatchToProps)(PostPreHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ComponentProps} from 'react';\nimport {Link} from 'react-router-dom';\n\nimport * as GlobalActions from 'actions/global_actions';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {Locations} from 'utils/constants';\nimport {isMobile} from 'utils/user_agent';\n\nconst POST_TOOLTIP_RANGES = [\n RelativeRanges.TODAY_TITLE_CASE,\n RelativeRanges.YESTERDAY_TITLE_CASE,\n];\nconst getTimeFormat: ComponentProps<typeof Timestamp>['useTime'] = (_, {hour, minute, second}) => ({hour, minute, second});\n\ntype Props = {\n\n /*\n * If true, time will be rendered as a permalink to the post\n */\n isPermalink: boolean;\n\n /*\n * The time to display\n */\n eventTime: number;\n\n isMobileView: boolean;\n location: string;\n\n /*\n * The post id of posting being rendered\n */\n postId: string;\n teamUrl: string;\n timestampProps?: ComponentProps<typeof Timestamp>;\n}\n\nexport default class PostTime extends React.PureComponent<Props> {\n static defaultProps: Partial<Props> = {\n eventTime: 0,\n location: Locations.CENTER,\n };\n\n handleClick = () => {\n if (this.props.isMobileView) {\n GlobalActions.emitCloseRightHandSide();\n }\n };\n\n render() {\n const {\n eventTime,\n isPermalink,\n location,\n postId,\n teamUrl,\n timestampProps = {},\n } = this.props;\n\n const postTime = (\n <Timestamp\n value={eventTime}\n className='post__time'\n useDate={false}\n {...timestampProps}\n />\n );\n\n const content = isMobile() || !isPermalink ? (\n <div\n role='presentation'\n className='post__permalink post_permalink_mobile_view'\n >\n {postTime}\n </div>\n ) : (\n <Link\n id={`${location}_time_${postId}`}\n to={`${teamUrl}/pl/${postId}`}\n className='post__permalink'\n onClick={this.handleClick}\n aria-labelledby={eventTime.toString()}\n >\n {postTime}\n </Link>\n );\n\n return (\n <WithTooltip\n title={\n <Timestamp\n value={eventTime}\n ranges={POST_TOOLTIP_RANGES}\n useSemanticOutput={false}\n useTime={getTimeFormat}\n />\n }\n >\n {content}\n </WithTooltip>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostTime from './post_time';\n\ntype OwnProps = {\n teamName?: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n return {\n isMobileView: getIsMobileView(state),\n teamUrl: ownProps.teamName ? `/${ownProps.teamName}` : getCurrentRelativeTeamUrl(state),\n };\n}\n\nexport default connect(mapStateToProps)(PostTime);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport {getChannel} from './channels';\nimport {haveIChannelPermission} from './roles';\n\nexport function canAddReactions(state: GlobalState, channelId: string) {\n const channel = getChannel(state, channelId);\n\n if (!channel || channel.delete_at > 0) {\n return false;\n }\n\n return haveIChannelPermission(state, channel.team_id, channelId, Permissions.ADD_REACTION);\n}\n\nexport function canRemoveReactions(state: GlobalState, channelId: string) {\n const channel = getChannel(state, channelId);\n\n if (!channel || channel.delete_at > 0) {\n return false;\n }\n\n return haveIChannelPermission(state, channel.team_id, channelId, Permissions.REMOVE_REACTION);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Reaction as ReactionType} from '@mattermost/types/reactions';\n\nimport WithTooltip from 'components/with_tooltip';\n\ntype Props = {\n canAddReactions: boolean;\n canRemoveReactions: boolean;\n children: React.ReactNode;\n currentUserReacted: boolean;\n emojiName: string;\n onShow: () => void;\n reactions: ReactionType[];\n users: string[];\n};\n\nconst ReactionTooltip: React.FC<Props> = (props: Props) => {\n const {\n canAddReactions,\n canRemoveReactions,\n children,\n currentUserReacted,\n emojiName,\n onShow,\n reactions,\n users,\n } = props;\n\n const intl = useIntl();\n\n const otherUsersCount = reactions.length - users.length;\n\n let names;\n if (otherUsersCount > 0) {\n if (users.length > 0) {\n names = intl.formatMessage(\n {\n id: 'reaction.usersAndOthersReacted',\n defaultMessage: '{users} and {otherUsers, number} other {otherUsers, plural, one {user} other {users}}',\n },\n {\n users: users.join(', '),\n otherUsers: otherUsersCount,\n },\n );\n } else {\n names = intl.formatMessage(\n {\n id: 'reaction.othersReacted',\n defaultMessage: '{otherUsers, number} {otherUsers, plural, one {user} other {users}}',\n },\n {\n otherUsers: otherUsersCount,\n },\n );\n }\n } else if (users.length > 1) {\n names = intl.formatMessage(\n {\n id: 'reaction.usersReacted',\n defaultMessage: '{users} and {lastUser}',\n },\n {\n users: users.slice(0, -1).join(', '),\n lastUser: users[users.length - 1],\n },\n );\n } else {\n names = users[0];\n }\n\n let reactionVerb;\n if (users.length + otherUsersCount > 1) {\n if (currentUserReacted) {\n reactionVerb = intl.formatMessage({\n id: 'reaction.reactionVerb.youAndUsers',\n defaultMessage: 'reacted',\n });\n } else {\n reactionVerb = intl.formatMessage({\n id: 'reaction.reactionVerb.users',\n defaultMessage: 'reacted',\n });\n }\n } else if (currentUserReacted) {\n reactionVerb = intl.formatMessage({\n id: 'reaction.reactionVerb.you',\n defaultMessage: 'reacted',\n });\n } else {\n reactionVerb = intl.formatMessage({\n id: 'reaction.reactionVerb.user',\n defaultMessage: 'reacted',\n });\n }\n\n const tooltipTitle = intl.formatMessage(\n {\n id: 'reaction.reacted',\n defaultMessage: '{users} {reactionVerb} with {emoji}',\n },\n {\n users: names,\n reactionVerb,\n emoji: ':' + emojiName + ':',\n },\n );\n\n let tooltipHint;\n if (currentUserReacted && canRemoveReactions) {\n tooltipHint = intl.formatMessage({\n id: 'reaction.clickToRemove',\n defaultMessage: '(click to remove)',\n });\n } else if (!currentUserReacted && canAddReactions) {\n tooltipHint = intl.formatMessage({\n id: 'reaction.clickToAdd',\n defaultMessage: '(click to add)',\n });\n }\n\n if (!React.isValidElement(children)) {\n return null;\n }\n\n return (\n <WithTooltip\n title={tooltipTitle}\n hint={tooltipHint}\n emoji={emojiName}\n isEmojiLarge={true}\n onOpen={onShow}\n >\n {children}\n </WithTooltip>\n );\n};\n\nexport default ReactionTooltip;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {Reaction as ReactionType} from '@mattermost/types/reactions';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId, makeGetProfilesForReactions} from 'mattermost-redux/selectors/entities/users';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nimport * as Utils from 'utils/utils';\n\nimport ReactionTooltip from './reaction_tooltip';\n\ntype OwnProps = {\n reactions: ReactionType[];\n};\n\nexport const makeGetNamesOfUsers = () => createSelector(\n 'makeGetNamesOfUsers',\n (state: GlobalState, reactions: ReactionType[]) => reactions,\n getCurrentUserId,\n makeGetProfilesForReactions(),\n getTeammateNameDisplaySetting,\n (reactions: ReactionType[], currentUserId: string, profiles: UserProfile[], teammateNameDisplay: string) => {\n // Sort users by who reacted first with \"you\" being first if the current user reacted\n\n let currentUserReacted = false;\n const sortedReactions = reactions.sort((a, b) => a.create_at - b.create_at);\n const users = sortedReactions.reduce((accumulator, current) => {\n if (current.user_id === currentUserId) {\n currentUserReacted = true;\n } else {\n const user = profiles.find((u) => u.id === current.user_id);\n if (user) {\n accumulator.push(displayUsername(user, teammateNameDisplay));\n }\n }\n return accumulator;\n }, [] as string[]);\n\n if (currentUserReacted) {\n users.unshift(Utils.localizeMessage({id: 'reaction.you', defaultMessage: 'You'}));\n }\n\n return users;\n },\n);\n\nfunction makeMapStateToProps() {\n const getNamesOfUsers = makeGetNamesOfUsers();\n\n return (state: GlobalState, ownProps: OwnProps) => {\n return {\n users: getNamesOfUsers(state, ownProps.reactions),\n };\n };\n}\n\nexport default connect(makeMapStateToProps)(ReactionTooltip);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Post} from '@mattermost/types/posts';\nimport type {Reaction as ReactionType} from '@mattermost/types/reactions';\n\nimport * as Utils from 'utils/utils';\n\nimport ReactionTooltip from './reaction_tooltip';\n\nimport './reaction.scss';\n\ntype State = {\n displayNumber: number;\n reactedClass: 'Reaction--reacted' | 'Reaction--reacting' | 'Reaction--unreacted' | 'Reaction--unreacting';\n};\n\ntype Props = {\n\n /*\n * The post to render the reaction for\n */\n post: Post;\n\n /*\n * The user id of the logged in user\n */\n currentUserId: string;\n\n /*\n * The name of the emoji for the reaction\n */\n emojiName: string;\n\n /*\n * The number of reactions to this post for this emoji\n */\n reactionCount: number;\n\n /*\n * Array of reactions by user\n */\n reactions: ReactionType[];\n\n /*\n * True if the user has the permission to add a reaction in this channel\n */\n canAddReactions: boolean;\n\n /*\n * True if user has the permission to remove his own reactions in this channel\n */\n canRemoveReactions: boolean;\n\n /*\n * The URL of the emoji image\n */\n emojiImageUrl: string;\n\n /*\n * Whether or not the current user has used this reaction\n */\n currentUserReacted: boolean;\n\n actions: {\n\n /*\n * Function to add a reaction to a post\n */\n addReaction: (postId: string, emojiName: string) => void;\n\n /*\n * Function to get non-loaded profiles by id\n */\n getMissingProfilesByIds: (ids: string[]) => void;\n\n /*\n * Function to remove a reaction from a post\n */\n removeReaction: (postId: string, emojiName: string) => void;\n };\n}\n\nexport default class Reaction extends React.PureComponent<Props, State> {\n private reactionButtonRef = React.createRef<HTMLButtonElement>();\n private reactionCountRef = React.createRef<HTMLSpanElement>();\n private animating = false;\n\n constructor(props: Props) {\n super(props);\n\n const {currentUserReacted, reactionCount} = this.props;\n\n if (currentUserReacted) {\n this.state = {\n reactedClass: 'Reaction--reacted',\n displayNumber: reactionCount,\n };\n } else {\n this.state = {\n reactedClass: 'Reaction--unreacted',\n displayNumber: reactionCount,\n };\n }\n }\n\n componentDidUpdate(prevProps: Props): void {\n if (prevProps.reactionCount !== this.props.reactionCount) {\n const {currentUserReacted} = this.props;\n const reactedClass = currentUserReacted ? 'Reaction--reacted' : 'Reaction--unreacted';\n\n this.animating = false;\n this.setState({\n displayNumber: this.props.reactionCount,\n reactedClass,\n });\n }\n }\n\n handleClick = (): void => {\n // only proceed if user has permission to react\n // and we are not animating\n if (\n !(this.props.canAddReactions && this.props.canRemoveReactions) || this.animating\n ) {\n return;\n }\n\n const {currentUserReacted} = this.props;\n\n this.animating = true;\n this.setState((state) => {\n if (currentUserReacted) {\n return {\n displayNumber: state.displayNumber - 1,\n reactedClass: 'Reaction--unreacting',\n };\n }\n\n return {\n displayNumber: state.displayNumber + 1,\n reactedClass: 'Reaction--reacting',\n };\n });\n };\n\n handleAnimationEnded = (): void => {\n const {actions, currentUserReacted, post, emojiName} = this.props;\n\n this.animating = false;\n this.setState<'reactedClass'>((state) => {\n if (state.reactedClass === 'Reaction--reacting') {\n return {\n reactedClass: 'Reaction--reacted',\n };\n } else if (state.reactedClass === 'Reaction--unreacting') {\n return {\n reactedClass: 'Reaction--unreacted',\n };\n }\n return state;\n });\n\n if (currentUserReacted) {\n actions.removeReaction(post.id, emojiName);\n } else {\n actions.addReaction(post.id, emojiName);\n }\n };\n\n loadMissingProfiles = async (): Promise<void> => {\n const ids = this.props.reactions.map((reaction) => reaction.user_id);\n this.props.actions.getMissingProfilesByIds(ids);\n };\n\n render(): React.ReactNode {\n if (!this.props.emojiImageUrl) {\n return null;\n }\n const {\n canAddReactions,\n canRemoveReactions,\n currentUserReacted,\n emojiName,\n reactionCount,\n reactions,\n } = this.props;\n const {displayNumber} = this.state;\n const reactedNumber = currentUserReacted ? reactionCount : reactionCount + 1;\n const unreactedNumber = currentUserReacted ? reactionCount - 1 : reactionCount;\n const unreacted = (unreactedNumber > 0) ? unreactedNumber : '';\n const reacted = (reactedNumber > 0) ? reactedNumber : '';\n const display = (displayNumber > 0) ? displayNumber : '';\n const readOnlyClass = (canAddReactions && canRemoveReactions) ? '' : 'Reaction--read-only';\n\n const emojiNameWithSpaces = this.props.emojiName.replace(/_/g, ' ');\n let ariaLabelEmoji = `${Utils.localizeMessage({id: 'reaction.reactWidth.ariaLabel', defaultMessage: 'react with'})} ${emojiNameWithSpaces}`;\n if (currentUserReacted && canRemoveReactions) {\n ariaLabelEmoji = `${Utils.localizeMessage({id: 'reaction.removeReact.ariaLabel', defaultMessage: 'remove reaction'})} ${emojiNameWithSpaces}`;\n }\n\n const emojiIcon = (\n <img\n className='Reaction__emoji emoticon'\n src={this.props.emojiImageUrl}\n />\n );\n\n return (\n <ReactionTooltip\n canAddReactions={canAddReactions}\n canRemoveReactions={canRemoveReactions}\n currentUserReacted={currentUserReacted}\n emojiName={emojiName}\n reactions={reactions}\n onShow={this.loadMissingProfiles}\n >\n <button\n id={`postReaction-${this.props.post.id}-${this.props.emojiName}`}\n aria-label={ariaLabelEmoji}\n className={`Reaction ${this.state.reactedClass} ${readOnlyClass}`}\n onClick={this.handleClick}\n ref={this.reactionButtonRef}\n >\n <span className='d-flex align-items-center'>\n {emojiIcon}\n <span\n ref={this.reactionCountRef}\n className='Reaction__count'\n >\n <span className='Reaction__number'>\n <span className='Reaction__number--display'>{display}</span>\n <span\n className='Reaction__number--unreacted'\n onAnimationEnd={this.handleAnimationEnded}\n >\n {unreacted}\n </span>\n <span className='Reaction__number--reacted'>{reacted}</span>\n </span>\n </span>\n </span>\n </button>\n </ReactionTooltip>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Emoji as EmojiType} from '@mattermost/types/emojis';\nimport type {Post} from '@mattermost/types/posts';\nimport type {Reaction as ReactionType} from '@mattermost/types/reactions';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {removeReaction} from 'mattermost-redux/actions/posts';\nimport {getMissingProfilesByIds} from 'mattermost-redux/actions/users';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getCustomEmojisByName} from 'mattermost-redux/selectors/entities/emojis';\nimport {canAddReactions, canRemoveReactions} from 'mattermost-redux/selectors/entities/reactions';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils';\n\nimport {addReaction} from 'actions/post_actions';\n\nimport * as Emoji from 'utils/emoji';\n\nimport Reaction from './reaction';\n\ntype Props = {\n emojiName: string;\n post: Post;\n reactions: ReactionType[];\n};\n\nfunction makeMapStateToProps() {\n const didCurrentUserReact = createSelector(\n 'didCurrentUserReact',\n getCurrentUserId,\n (state: GlobalState, reactions: ReactionType[]) => reactions,\n (currentUserId: string, reactions: ReactionType[]) => {\n return reactions.some((reaction) => reaction.user_id === currentUserId);\n },\n );\n\n return function mapStateToProps(state: GlobalState, ownProps: Props) {\n const channelId = ownProps.post.channel_id;\n\n let emoji;\n if (Emoji.EmojiIndicesByAlias.has(ownProps.emojiName)) {\n emoji = Emoji.Emojis[Emoji.EmojiIndicesByAlias.get(ownProps.emojiName) as number];\n } else {\n const emojis = getCustomEmojisByName(state);\n emoji = emojis.get(ownProps.emojiName);\n }\n\n let emojiImageUrl = '';\n if (emoji) {\n emojiImageUrl = getEmojiImageUrl(emoji as EmojiType);\n }\n const currentUserId = getCurrentUserId(state);\n\n return {\n currentUserId,\n reactionCount: ownProps.reactions.length,\n canAddReactions: canAddReactions(state, channelId),\n canRemoveReactions: canRemoveReactions(state, channelId),\n emojiImageUrl,\n currentUserReacted: didCurrentUserReact(state, ownProps.reactions),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n addReaction,\n removeReaction,\n getMissingProfilesByIds,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(Reaction);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function AddReactionIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='16px'\n height='16px'\n viewBox='0 0 16 16'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.add-reaction', defaultMessage: 'Add Reaction Icon'})}\n >\n <path d='M10 8.00001C10.32 8.00001 10.5973 7.88267 10.832 7.64801C11.0773 7.40267 11.2 7.12001 11.2 6.80001C11.2 6.48001 11.0773 6.20267 10.832 5.96801C10.5973 5.72267 10.32 5.60001 10 5.60001C9.68 5.60001 9.39733 5.72267 9.152 5.96801C8.91733 6.20267 8.8 6.48001 8.8 6.80001C8.8 7.12001 8.91733 7.40267 9.152 7.64801C9.39733 7.88267 9.68 8.00001 10 8.00001ZM5.2 8.00001C5.52 8.00001 5.79733 7.88267 6.032 7.64801C6.27733 7.40267 6.4 7.12001 6.4 6.80001C6.4 6.48001 6.27733 6.20267 6.032 5.96801C5.79733 5.72267 5.52 5.60001 5.2 5.60001C4.88 5.60001 4.59733 5.72267 4.352 5.96801C4.11733 6.20267 4 6.48001 4 6.80001C4 7.12001 4.11733 7.40267 4.352 7.64801C4.59733 7.88267 4.88 8.00001 5.2 8.00001ZM13.584 7.93601C13.584 7.97867 13.584 8.05334 13.584 8.16001L13.6 8.40001C13.6 9.48801 13.328 10.496 12.784 11.424C12.2507 12.3307 11.5307 13.0507 10.624 13.584C9.696 14.128 8.688 14.4 7.6 14.4C6.512 14.4 5.504 14.128 4.576 13.584C3.66933 13.0507 2.94933 12.3307 2.416 11.424C1.872 10.496 1.6 9.48801 1.6 8.40001C1.6 7.31201 1.872 6.30401 2.416 5.37601C2.94933 4.46934 3.66933 3.74934 4.576 3.21601C5.504 2.67201 6.512 2.40001 7.6 2.40001L8.064 2.41601C8.17067 1.84001 8.352 1.32801 8.608 0.880006C8.23467 0.826673 7.89867 0.800006 7.6 0.800006C6.224 0.800006 4.944 1.14667 3.76 1.84001C2.61867 2.51201 1.712 3.41867 1.04 4.56001C0.346667 5.74401 0 7.02401 0 8.40001C0 9.77601 0.346667 11.056 1.04 12.24C1.712 13.3813 2.61867 14.288 3.76 14.96C4.944 15.6533 6.224 16 7.6 16C8.976 16 10.256 15.6533 11.44 14.96C12.5813 14.288 13.488 13.3813 14.16 12.24C14.8533 11.056 15.2 9.77601 15.2 8.40001C15.2 8.10134 15.1733 7.76534 15.12 7.39201C14.672 7.64801 14.16 7.82934 13.584 7.93601ZM12 5.72205e-06H13.6V2.40001H16V4.00001H13.6V6.40001H12V4.00001H9.6V2.40001H12V5.72205e-06ZM3.504 10C3.83467 10.832 4.36267 11.504 5.088 12.016C5.84533 12.5387 6.68267 12.8 7.6 12.8C8.51733 12.8 9.35467 12.5387 10.112 12.016C10.8373 11.504 11.3653 10.832 11.696 10H3.504Z'/>\n </svg>\n </span>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages} from 'react-intl';\n\nimport type {Emoji} from '@mattermost/types/emojis';\nimport type {Post} from '@mattermost/types/posts';\nimport type {Reaction as ReactionType} from '@mattermost/types/reactions';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {getEmojiName} from 'mattermost-redux/utils/emoji_utils';\n\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport Reaction from 'components/post_view/reaction';\nimport AddReactionIcon from 'components/widgets/icons/add_reaction_icon';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {localizeMessage} from 'utils/utils';\n\nconst DEFAULT_EMOJI_PICKER_RIGHT_OFFSET = 15;\nconst EMOJI_PICKER_WIDTH_OFFSET = 260;\n\nconst messages = defineMessages({\n addAReaction: {\n id: 'reaction_list.addReactionTooltip',\n defaultMessage: 'Add a reaction',\n },\n});\n\ntype Props = {\n\n /**\n * The post to render reactions for\n */\n post: Post;\n\n /*\n * The id of the team which belongs the post\n */\n teamId: string;\n\n /**\n * The reactions to render\n */\n reactions: { [x: string]: ReactionType } | undefined | null;\n\n /**\n * Whether or not the user can add reactions to this post.\n */\n canAddReactions: boolean;\n\n actions: {\n\n /**\n * Function to add a reaction to the post\n */\n toggleReaction: (postId: string, emojiName: string) => void;\n };\n};\n\ntype State = {\n emojiNames: string[];\n showEmojiPicker: boolean;\n};\n\nexport default class ReactionList extends React.PureComponent<Props, State> {\n private addReactionButtonRef = React.createRef<HTMLButtonElement>();\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n emojiNames: [],\n showEmojiPicker: false,\n };\n }\n\n static getDerivedStateFromProps(props: Props, state: State): Partial<State> | null {\n let emojiNames = state.emojiNames;\n\n for (const {emoji_name: emojiName} of Object.values(props.reactions ?? {})) {\n if (!emojiNames.includes(emojiName)) {\n emojiNames = [...emojiNames, emojiName];\n }\n }\n\n return (emojiNames === state.emojiNames) ? null : {emojiNames};\n }\n\n getTarget = (): HTMLButtonElement | null => {\n return this.addReactionButtonRef.current;\n };\n\n handleEmojiClick = (emoji: Emoji): void => {\n this.setState({showEmojiPicker: false});\n const emojiName = getEmojiName(emoji);\n this.props.actions.toggleReaction(this.props.post.id, emojiName);\n };\n\n hideEmojiPicker = (): void => {\n this.setState({showEmojiPicker: false});\n };\n\n toggleEmojiPicker = (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {\n e?.stopPropagation();\n this.setState({showEmojiPicker: !this.state.showEmojiPicker});\n };\n\n render(): React.ReactNode {\n const reactionsByName = new Map();\n\n if (this.props.reactions) {\n for (const reaction of Object.values(this.props.reactions)) {\n const emojiName = reaction.emoji_name;\n\n if (reactionsByName.has(emojiName)) {\n reactionsByName.get(emojiName).push(reaction);\n } else {\n reactionsByName.set(emojiName, [reaction]);\n }\n }\n }\n\n if (reactionsByName.size === 0) {\n return null;\n }\n\n const reactions = this.state.emojiNames.map((emojiName) => {\n if (reactionsByName.has(emojiName)) {\n return (\n <Reaction\n key={emojiName}\n post={this.props.post}\n emojiName={emojiName}\n reactions={reactionsByName.get(emojiName) || []}\n />\n );\n }\n return null;\n });\n\n const addReactionButton = this.getTarget();\n let rightOffset = DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n if (addReactionButton) {\n rightOffset = window.innerWidth - addReactionButton.getBoundingClientRect().right - EMOJI_PICKER_WIDTH_OFFSET;\n\n if (rightOffset < 0) {\n rightOffset = DEFAULT_EMOJI_PICKER_RIGHT_OFFSET;\n }\n }\n\n let emojiPicker = null;\n if (this.props.canAddReactions) {\n emojiPicker = (\n <span className='emoji-picker__container'>\n <EmojiPickerOverlay\n show={this.state.showEmojiPicker}\n target={this.getTarget}\n onHide={this.hideEmojiPicker}\n onEmojiClick={this.handleEmojiClick}\n rightOffset={rightOffset}\n topOffset={-5}\n />\n <ChannelPermissionGate\n channelId={this.props.post.channel_id}\n teamId={this.props.teamId}\n permissions={[Permissions.ADD_REACTION]}\n >\n <WithTooltip\n title={messages.addAReaction}\n >\n <button\n aria-label={localizeMessage({id: 'reaction.add.ariaLabel', defaultMessage: 'Add a reaction'})}\n className='Reaction'\n onClick={this.toggleEmojiPicker}\n >\n <span\n id={`addReaction-${this.props.post.id}`}\n className='Reaction__add'\n ref={this.addReactionButtonRef}\n >\n <AddReactionIcon/>\n </span>\n </button>\n </WithTooltip>\n </ChannelPermissionGate>\n </span>\n );\n }\n\n let addReactionClassName = 'post-add-reaction';\n if (this.state.showEmojiPicker) {\n addReactionClassName += ' post-add-reaction-emoji-picker-open';\n }\n\n return (\n <div\n aria-label={localizeMessage({id: 'reaction.container.ariaLabel', defaultMessage: 'reactions'})}\n className='post-reaction-list'\n >\n {reactions}\n <div className={addReactionClassName}>\n {emojiPicker}\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {canAddReactions} from 'mattermost-redux/selectors/entities/reactions';\n\nimport {toggleReaction} from 'actions/post_actions';\n\nimport {makeGetUniqueReactionsToPost} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport ReactionList from './reaction_list';\n\ntype Props = {\n post: Post;\n};\n\nfunction makeMapStateToProps() {\n const getReactionsForPost = makeGetUniqueReactionsToPost();\n\n return function mapStateToProps(state: GlobalState, ownProps: Props) {\n const channelId = ownProps.post.channel_id;\n\n const channel = getChannel(state, channelId);\n const teamId = channel?.team_id ?? '';\n\n return {\n teamId,\n reactions: getReactionsForPost(state, ownProps.post.id),\n canAddReactions: canAddReactions(state, channelId),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n toggleReaction,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ReactionList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback, useEffect, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserThread} from '@mattermost/types/threads';\nimport {threadIsSynthetic} from '@mattermost/types/threads';\n\nimport {setThreadFollow, getThread as fetchThread} from 'mattermost-redux/actions/threads';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {makeGetThreadOrSynthetic} from 'mattermost-redux/selectors/entities/threads';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {selectPost} from 'actions/views/rhs';\n\nimport Button from 'components/threading/common/button';\nimport FollowButton from 'components/threading/common/follow_button';\nimport {THREADING_TIME} from 'components/threading/common/options';\nimport Timestamp from 'components/timestamp';\nimport Avatars from 'components/widgets/users/avatars';\nimport WithTooltip from 'components/with_tooltip';\n\nimport type {GlobalState} from 'types/store';\n\nimport './thread_footer.scss';\n\ntype Props = {\n threadId: UserThread['id'];\n replyClick?: React.EventHandler<React.MouseEvent>;\n};\n\nfunction ThreadFooter({\n threadId,\n replyClick,\n}: Props) {\n const dispatch = useDispatch();\n const currentTeamId = useSelector(getCurrentTeamId);\n const currentUserId = useSelector(getCurrentUserId);\n const post = useSelector((state: GlobalState) => getPost(state, threadId));\n const getThreadOrSynthetic = useMemo(makeGetThreadOrSynthetic, [post.id]);\n const thread = useSelector((state: GlobalState) => getThreadOrSynthetic(state, post));\n\n useEffect(() => {\n if (threadIsSynthetic(thread) && thread.is_following && thread.reply_count > 0) {\n dispatch(fetchThread(currentUserId, currentTeamId, threadId));\n }\n }, []);\n\n const {\n participants,\n reply_count: totalReplies = 0,\n last_reply_at: lastReplyAt,\n is_following: isFollowing = false,\n post: {\n channel_id: channelId,\n },\n } = thread;\n\n const participantIds = useMemo(() => (participants || []).map(({id}) => id).reverse(), [participants]);\n\n const handleReply = useCallback((e) => {\n if (replyClick) {\n replyClick(e);\n return;\n }\n\n trackEvent('crt', 'replied_using_footer');\n e.stopPropagation();\n dispatch(selectPost({id: threadId, channel_id: channelId} as Post));\n }, [replyClick, threadId, channelId]);\n\n const handleFollowing = useCallback((e) => {\n e.stopPropagation();\n dispatch(setThreadFollow(currentUserId, currentTeamId, threadId, !isFollowing));\n }, [isFollowing]);\n\n return (\n <div className='ThreadFooter'>\n {!isFollowing || threadIsSynthetic(thread) || !thread.unread_replies ? (\n <div className='indicator'/>\n ) : (\n <WithTooltip\n title={\n <FormattedMessage\n id='threading.numNewMessages'\n defaultMessage='{newReplies, plural, =0 {no unread messages} =1 {one unread message} other {# unread messages}}'\n values={{newReplies: thread.unread_replies}}\n />\n }\n >\n <div\n className='indicator'\n tabIndex={0}\n >\n <div className='dot-unreads'/>\n </div>\n </WithTooltip>\n )}\n\n {participantIds && participantIds.length > 0 ? (\n <Avatars\n userIds={participantIds}\n size='sm'\n />\n ) : null}\n\n {thread.reply_count > 0 && (\n <Button\n onClick={handleReply}\n className='ReplyButton separated'\n prepend={\n <span className='icon'>\n <i className='icon-reply-outline'/>\n </span>\n }\n >\n <FormattedMessage\n id='threading.numReplies'\n defaultMessage='{totalReplies, plural, =0 {Reply} =1 {# reply} other {# replies}}'\n values={{totalReplies}}\n />\n </Button>\n )}\n\n <FollowButton\n isFollowing={isFollowing}\n className='separated'\n onClick={handleFollowing}\n />\n\n {Boolean(lastReplyAt) && (\n <Timestamp\n value={lastReplyAt}\n {...THREADING_TIME}\n >\n {({formatted}) => (\n <span className='Timestamp separated alt-visible'>\n <FormattedMessage\n id='threading.footer.lastReplyAt'\n defaultMessage='Last reply {formatted}'\n values={{formatted}}\n />\n </span>\n )}\n </Timestamp>\n )}\n </div>\n );\n}\n\nexport default memo(ThreadFooter);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function InfoSmallIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n aria-label={formatMessage({id: 'generic_icons.info', defaultMessage: 'Info Icon'})}\n width='24px'\n height='24px'\n viewBox='0 0 24 24'\n version='1.1'\n >\n <g\n stroke='none'\n strokeWidth='1'\n fill='inherit'\n fillRule='evenodd'\n >\n <g\n transform='translate(-1015.000000, -516.000000)'\n fill='inherit'\n >\n <path d='M1027,540 C1020.37258,540 1015,534.627417 1015,528 C1015,521.372583 1020.37258,516 1027,516 C1033.62742,516 1039,521.372583 1039,528 C1039,534.627417 1033.62742,540 1027,540 Z M1027,527 C1025.89543,527 1025,527.895431 1025,529 L1025,533 C1025,534.104569 1025.89543,535 1027,535 C1028.10457,535 1029,534.104569 1029,533 L1029,529 C1029,527.895431 1028.10457,527 1027,527 Z M1027,525 C1028.10457,525 1029,524.104569 1029,523 C1029,521.895431 1028.10457,521 1027,521 C1025.89543,521 1025,521.895431 1025,523 C1025,524.104569 1025.89543,525 1027,525 Z'/>\n </g>\n </g>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n name: string;\n dangerous?: boolean;\n}\n\nexport function ActionsMenuIcon({name, dangerous}: Props) {\n const colorClass = dangerous ? 'MenuItem__compass-icon-dangerous' : 'MenuItem__compass-icon';\n return (\n <span className={`${name} ${colorClass}`}/>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {IntlShape} from 'react-intl';\nimport {FormattedMessage, injectIntl} from 'react-intl';\n\nimport type {AppBinding} from '@mattermost/types/apps';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {AppCallResponseTypes} from 'mattermost-redux/constants/apps';\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport type {OpenedFromType} from 'components/plugin_marketplace/marketplace_modal';\nimport MarketplaceModal from 'components/plugin_marketplace/marketplace_modal';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\nimport Pluggable from 'plugins/pluggable';\nimport {createCallContext} from 'utils/apps';\nimport {Constants, Locations, ModalIdentifiers} from 'utils/constants';\nimport * as PostUtils from 'utils/post_utils';\n\nimport type {ModalData} from 'types/actions';\nimport type {HandleBindingClick, OpenAppsModal, PostEphemeralCallResponseForPost} from 'types/apps';\nimport type {PluginComponent} from 'types/store/plugins';\n\nimport './actions_menu.scss';\n\nimport {ActionsMenuIcon} from './actions_menu_icon';\n\nconst MENU_BOTTOM_MARGIN = 80;\n\nexport const PLUGGABLE_COMPONENT = 'PostDropdownMenuItem';\nexport type Props = {\n appBindings: AppBinding[] | null;\n appsEnabled: boolean;\n handleDropdownOpened?: (open: boolean) => void;\n intl: IntlShape;\n isMenuOpen?: boolean;\n isSysAdmin: boolean;\n location?: 'CENTER' | 'RHS_ROOT' | 'RHS_COMMENT' | 'SEARCH' | string;\n pluginMenuItems?: PluginComponent[];\n post: Post;\n teamId: string;\n canOpenMarketplace: boolean;\n\n /**\n * Components for overriding provided by plugins\n */\n components: {\n [componentName: string]: PluginComponent[];\n };\n\n actions: {\n\n /**\n * Function to open a modal\n */\n openModal: <P>(modalData: ModalData<P>) => void;\n\n /**\n * Function to post the ephemeral message for a call response\n */\n postEphemeralCallResponseForPost: PostEphemeralCallResponseForPost;\n\n /**\n * Function to handle clicking of any post-menu bindings\n */\n handleBindingClick: HandleBindingClick;\n\n /**\n * Function to open the Apps modal with a form\n */\n openAppsModal: OpenAppsModal;\n\n /**\n * Function to get the post menu bindings for this post.\n */\n fetchBindings: (channelId: string, teamId: string) => Promise<ActionResult<AppBinding[]>>;\n\n }; // TechDebt: Made non-mandatory while converting to typescript\n}\n\ntype State = {\n openUp: boolean;\n appBindings?: AppBinding[];\n}\n\nexport class ActionMenuClass extends React.PureComponent<Props, State> {\n public static defaultProps: Partial<Props> = {\n appBindings: [],\n location: Locations.CENTER,\n pluginMenuItems: [],\n };\n private buttonRef: React.RefObject<HTMLButtonElement>;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n openUp: false,\n };\n\n this.buttonRef = React.createRef<HTMLButtonElement>();\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.props.isMenuOpen && !prevProps.isMenuOpen) {\n this.fetchBindings();\n }\n }\n\n static getDerivedStateFromProps(props: Props) {\n const state: Partial<State> = {};\n if (props.appBindings) {\n state.appBindings = props.appBindings;\n }\n return state;\n }\n\n fetchBindings = () => {\n if (this.props.appsEnabled && !this.state.appBindings) {\n this.props.actions.fetchBindings(this.props.post.channel_id, this.props.teamId).then(({data}) => {\n this.setState({appBindings: data});\n });\n }\n };\n\n handleOpenMarketplace = (): void => {\n const openedFrom: OpenedFromType = 'actions_menu';\n const openMarketplaceData = {\n modalId: ModalIdentifiers.PLUGIN_MARKETPLACE,\n dialogType: MarketplaceModal,\n dialogProps: {openedFrom},\n };\n this.props.actions.openModal(openMarketplaceData);\n };\n\n onClickAppBinding = async (binding: AppBinding) => {\n const {post, intl} = this.props;\n\n const context = createCallContext(\n binding.app_id,\n binding.location,\n this.props.post.channel_id,\n this.props.teamId,\n this.props.post.id,\n this.props.post.root_id,\n );\n\n const res = await this.props.actions.handleBindingClick(binding, context, intl);\n\n if (res.error) {\n const errorResponse = res.error;\n const errorMessage = errorResponse.text || intl.formatMessage({\n id: 'apps.error.unknown',\n defaultMessage: 'Unknown error occurred.',\n });\n this.props.actions.postEphemeralCallResponseForPost(errorResponse, errorMessage, post);\n return;\n }\n\n const callResp = res.data!;\n switch (callResp.type) {\n case AppCallResponseTypes.OK:\n if (callResp.text) {\n this.props.actions.postEphemeralCallResponseForPost(callResp, callResp.text, post);\n }\n break;\n case AppCallResponseTypes.NAVIGATE:\n break;\n case AppCallResponseTypes.FORM:\n if (callResp.form) {\n this.props.actions.openAppsModal(callResp.form, context);\n }\n break;\n default: {\n const errorMessage = intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResp.type,\n });\n this.props.actions.postEphemeralCallResponseForPost(callResp, errorMessage, post);\n }\n }\n };\n\n visitMarketplaceTip(): React.ReactElement {\n return (\n <SystemPermissionGate\n permissions={[Permissions.MANAGE_SYSTEM]}\n key='visit-marketplace-permissions'\n >\n <div className='visit-marketplace-text' >\n <p>\n <FormattedMessage\n id='post_info.actions.noActions.first_line'\n defaultMessage='No Actions currently'\n />\n </p>\n <p>\n <FormattedMessage\n id='post_info.actions.noActions.second_line'\n defaultMessage='configured for this server'\n />\n </p>\n </div>\n <div className='visit-marketplace' >\n <button\n id='marketPlaceButton'\n className='btn btn-primary visit-marketplace-button'\n onClick={this.handleOpenMarketplace}\n >\n <ActionsMenuIcon name='icon-view-grid-plus-outline visit-marketplace-button-icon'/>\n <span className='visit-marketplace-button-text'>\n <FormattedMessage\n id='post_info.actions.visitMarketplace'\n defaultMessage='Visit the Marketplace'\n />\n </span>\n </button>\n </div>\n </SystemPermissionGate>\n );\n }\n\n renderDivider = (suffix: string): React.ReactNode => {\n return (\n <li\n id={`divider_post_${this.props.post.id}_${suffix}`}\n className='MenuItem__divider'\n role='menuitem'\n />\n );\n };\n\n handleDropdownOpened = (open: boolean) => {\n this.props.handleDropdownOpened?.(open);\n\n if (!open) {\n return;\n }\n\n const buttonRect = this.buttonRef.current?.getBoundingClientRect();\n let y;\n if (typeof buttonRect?.y === 'undefined') {\n y = typeof buttonRect?.top == 'undefined' ? 0 : buttonRect?.top;\n } else {\n y = buttonRect?.y;\n }\n const windowHeight = window.innerHeight;\n\n const totalSpace = windowHeight - MENU_BOTTOM_MARGIN;\n const spaceOnTop = y - Constants.CHANNEL_HEADER_HEIGHT;\n const spaceOnBottom = (totalSpace - (spaceOnTop + Constants.POST_AREA_HEIGHT));\n\n this.setState({\n openUp: (spaceOnTop > spaceOnBottom),\n });\n };\n\n render(): React.ReactNode {\n const isSystemMessage = PostUtils.isSystemMessage(this.props.post);\n if (isSystemMessage) {\n return null;\n }\n\n const pluginItems = this.props.pluginMenuItems?.\n filter((item) => {\n return item.filter ? item.filter(this.props.post.id) : item;\n }).\n map((item) => {\n if (item.subMenu) {\n return (\n <Menu.ItemSubMenu\n key={item.id + '_pluginmenuitem'}\n id={item.id}\n postId={this.props.post.id}\n text={item.text}\n subMenu={item.subMenu}\n action={item.action}\n root={true}\n />\n );\n }\n return (\n <Menu.ItemAction\n key={item.id + '_pluginmenuitem'}\n text={item.text}\n onClick={() => {\n if (item.action) {\n item.action(this.props.post.id);\n }\n }}\n />\n );\n }) || [];\n\n let appBindings = [] as JSX.Element[];\n if (this.props.appsEnabled && this.state.appBindings) {\n appBindings = this.state.appBindings.map((item) => {\n let icon: JSX.Element | undefined;\n if (item.icon) {\n icon = (\n <img\n key={item.app_id + 'app_icon'}\n src={item.icon}\n />);\n }\n\n return (\n <Menu.ItemAction\n text={item.label}\n key={item.app_id + item.location}\n onClick={() => this.onClickAppBinding(item)}\n icon={icon}\n />\n );\n });\n }\n\n const {formatMessage} = this.props.intl;\n\n let marketPlace = null;\n if (this.props.canOpenMarketplace) {\n marketPlace = (\n <React.Fragment key={'marketplace'}>\n {this.renderDivider('marketplace')}\n <Menu.ItemAction\n id={`marketplace_icon_${this.props.post.id}`}\n key={`marketplace_${this.props.post.id}`}\n show={true}\n text={formatMessage({id: 'post_info.marketplace', defaultMessage: 'App Marketplace'})}\n icon={<ActionsMenuIcon name='icon-view-grid-plus-outline'/>}\n onClick={this.handleOpenMarketplace}\n />\n </React.Fragment>\n );\n }\n\n let menuItems;\n const hasApps = Boolean(appBindings.length);\n const hasPluggables = Boolean(this.props.components[PLUGGABLE_COMPONENT]?.length);\n const hasPluginItems = Boolean(pluginItems?.length);\n\n const hasPluginMenuItems = hasPluginItems || hasApps || hasPluggables;\n if (!this.props.canOpenMarketplace && !hasPluginMenuItems) {\n return null;\n }\n\n if (hasPluginMenuItems) {\n const pluggable = (\n <Pluggable\n postId={this.props.post.id}\n pluggableName={PLUGGABLE_COMPONENT}\n key={this.props.post.id + 'pluggable'}\n />);\n\n menuItems = [\n pluginItems,\n appBindings,\n pluggable,\n marketPlace,\n ];\n } else {\n menuItems = [this.visitMarketplaceTip()];\n if (!this.props.isSysAdmin) {\n return null;\n }\n }\n\n return (\n <MenuWrapper\n open={this.props.isMenuOpen}\n onToggle={this.handleDropdownOpened}\n >\n <WithTooltip\n title={\n <FormattedMessage\n id='post_info.tooltip.actions'\n defaultMessage='Message actions'\n />\n }\n >\n <button\n key='more-actions-button'\n ref={this.buttonRef}\n id={`${this.props.location}_actions_button_${this.props.post.id}`}\n aria-label={formatMessage({id: 'post_info.actions.tooltip.actions', defaultMessage: 'Actions'}).toLowerCase()}\n className={classNames('post-menu__item', {\n 'post-menu__item--active': this.props.isMenuOpen,\n })}\n type='button'\n aria-expanded='false'\n >\n <i className={'icon icon-apps'}/>\n </button>\n </WithTooltip>\n <Menu\n id={`${this.props.location}_actions_dropdown_${this.props.post.id}`}\n openLeft={true}\n openUp={this.state.openUp}\n ariaLabel={formatMessage({id: 'post_info.menuAriaLabel', defaultMessage: 'Post extra options'})}\n key={`${this.props.location}_actions_dropdown_${this.props.post.id}`}\n >\n {menuItems}\n </Menu>\n </MenuWrapper >\n );\n }\n}\n\nexport default injectIntl(ActionMenuClass);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {AppBinding} from '@mattermost/types/apps';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {AppBindingLocations} from 'mattermost-redux/constants/apps';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {isMarketplaceEnabled} from 'mattermost-redux/selectors/entities/general';\nimport {haveICurrentTeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {isCombinedUserActivityPost} from 'mattermost-redux/utils/post_list';\nimport {isSystemMessage} from 'mattermost-redux/utils/post_utils';\nimport {isSystemAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport {makeFetchBindings, postEphemeralCallResponseForPost, handleBindingClick, openAppsModal} from 'actions/apps';\nimport {openModal} from 'actions/views/modals';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport type {GlobalState} from 'types/store';\n\nimport ActionsMenu from './actions_menu';\nimport {makeGetPostOptionBinding} from './selectors';\n\ntype Props = {\n post: Post;\n handleCardClick?: (post: Post) => void;\n handleDropdownOpened: (open: boolean) => void;\n isMenuOpen: boolean;\n location?: ComponentProps<typeof ActionsMenu>['location'];\n};\n\nconst emptyBindings: AppBinding[] = [];\n\nconst getPostOptionBinding = makeGetPostOptionBinding();\n\nconst fetchBindings = makeFetchBindings(AppBindingLocations.POST_MENU_ITEM);\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const {post} = ownProps;\n\n const systemMessage = isSystemMessage(post);\n\n const apps = appsEnabled(state);\n const showBindings = apps && !systemMessage && !isCombinedUserActivityPost(post.id);\n let appBindings: AppBinding[] | null = emptyBindings;\n if (showBindings) {\n appBindings = getPostOptionBinding(state, ownProps.location);\n }\n const currentUser = getCurrentUser(state);\n const isSysAdmin = isSystemAdmin(currentUser.roles);\n\n return {\n appBindings,\n appsEnabled: apps,\n components: state.plugins.components,\n isSysAdmin,\n pluginMenuItems: state.plugins.components.PostDropdownMenu,\n teamId: getCurrentTeamId(state),\n isMobileView: getIsMobileView(state),\n canOpenMarketplace: (\n isMarketplaceEnabled(state) &&\n haveICurrentTeamPermission(state, Permissions.SYSCONSOLE_WRITE_PLUGINS)\n ),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n handleBindingClick,\n fetchBindings,\n openModal,\n openAppsModal,\n postEphemeralCallResponseForPost,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ActionsMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AppBinding} from '@mattermost/types/apps';\n\nimport {AppBindingLocations} from 'mattermost-redux/constants/apps';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {makeAppBindingsSelector, makeRHSAppBindingSelector} from 'mattermost-redux/selectors/entities/apps';\n\nimport {Locations} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nexport function makeGetPostOptionBinding(): (state: GlobalState, location?: string) => AppBinding[] | null {\n const centerBindingsSelector = makeAppBindingsSelector(AppBindingLocations.POST_MENU_ITEM);\n const rhsBindingsSelector = makeRHSAppBindingSelector(AppBindingLocations.POST_MENU_ITEM);\n return createSelector(\n 'postOptionsBindings',\n centerBindingsSelector,\n rhsBindingsSelector,\n (state: GlobalState, location?: string) => location,\n (centerBindings: AppBinding[], rhsBindings: AppBinding[], location?: string) => {\n switch (location) {\n case Locations.RHS_ROOT:\n case Locations.RHS_COMMENT:\n return rhsBindings;\n case Locations.SEARCH:\n return null;\n case Locations.CENTER:\n default:\n return centerBindings;\n }\n },\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function ReplyIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='16px'\n height='14px'\n viewBox='0 0 16 14'\n enableBackground='new -158 242 18 18'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.reply', defaultMessage: 'Reply Icon'})}\n >\n <path d='M5.2 3.88001V5.48001L6.72 5.56001C8.85333 5.63467 10.64 6.51467 12.08 8.20001C11.312 7.94401 10.448 7.76801 9.488 7.67201C8.76267 7.59734 7.84 7.56001 6.72 7.56001H5.12V9.72001L2.16 6.76001L5.2 3.88001ZM6.64 0.600005C6.48 0.600005 6.34667 0.626672 6.24 0.680005L0.08 6.44001C0.048 6.47201 0.0266667 6.50934 0.016 6.55201C0.00533333 6.59467 0 6.66934 0 6.77601C0 6.87201 0.0266667 6.94667 0.08 7.00001L6.24 12.92C6.29333 12.9733 6.4 13 6.56 13C6.61333 12.9467 6.65067 12.8987 6.672 12.856C6.704 12.792 6.72 12.7067 6.72 12.6V9.08001C8.17067 9.08001 9.328 9.16001 10.192 9.32001C11.312 9.53334 12.272 9.91734 13.072 10.472C13.9573 11.0907 14.72 11.9867 15.36 13.16C15.4667 13.2667 15.5467 13.32 15.6 13.32H15.68C15.7653 13.2773 15.824 13.2187 15.856 13.144C15.888 13.0693 15.8827 12.9947 15.84 12.92C15.872 12.8133 15.8453 12.5413 15.76 12.104C15.6533 11.5707 15.4827 11.0107 15.248 10.424C14.96 9.66667 14.5973 8.95201 14.16 8.28001C13.2853 6.88267 12.2187 5.81067 10.96 5.06401C9.70133 4.30667 8.288 3.88534 6.72 3.80001V0.840006C6.752 0.765339 6.75733 0.706672 6.736 0.664005C6.71467 0.621339 6.68267 0.600005 6.64 0.600005Z'/>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport ReplyIcon from 'components/widgets/icons/reply_icon';\nimport WithTooltip from 'components/with_tooltip';\n\nimport type {Locations} from 'utils/constants';\n\ntype Props = {\n location?: keyof typeof Locations;\n handleCommentClick?: React.EventHandler<React.MouseEvent>;\n searchStyle?: string;\n commentCount?: number;\n postId?: string;\n extraClass: string;\n}\n\nconst CommentIcon = ({\n location = 'CENTER',\n searchStyle = '',\n commentCount = 0,\n extraClass = '',\n handleCommentClick,\n postId,\n}: Props) => {\n const intl = useIntl();\n\n let commentCountSpan: JSX.Element | null = null;\n let iconStyle = 'post-menu__item post-menu__item--wide';\n if (commentCount > 0) {\n iconStyle += ' post-menu__item--show';\n commentCountSpan = (\n <span className='post-menu__comment-count'>\n {commentCount}\n </span>\n );\n } else if (searchStyle !== '') {\n iconStyle = `${iconStyle} ${searchStyle}`;\n }\n\n const replyTitle = intl.formatMessage({\n id: 'post_info.comment_icon.tooltip.reply',\n defaultMessage: 'Reply',\n });\n\n return (\n <WithTooltip\n title={replyTitle}\n >\n <button\n id={`${location}_commentIcon_${postId}`}\n aria-label={replyTitle.toLowerCase()}\n className={`${iconStyle} ${extraClass}`}\n onClick={handleCommentClick}\n >\n <span className='d-flex align-items-center'>\n <ReplyIcon className='icon icon--small'/>\n {commentCountSpan}\n </span>\n </button>\n </WithTooltip>\n );\n};\n\nexport default CommentIcon;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport styled, {css} from 'styled-components';\n\nimport {AlertOutlineIcon, CheckIcon, InformationOutlineIcon} from '@mattermost/compass-icons/components';\n\ntype NotificationVariant = 'general' | 'info' | 'success'| 'warning' | 'danger';\n\ntype NotificationProps = {\n id?: string;\n dismissable?: boolean;\n title?: JSX.Element | string;\n text: JSX.Element | string;\n variant: NotificationVariant;\n}\n\nconst variantColorMap: Record<NotificationVariant, string> = {\n general: 'var(--semantic-color-general)',\n info: 'var(--semantic-color-info)',\n success: 'var(--semantic-color-success)',\n warning: 'var(--semantic-color-warning)',\n danger: 'var(--semantic-color-danger)',\n};\n\ntype NotificationWrapperProps = {\n color: string;\n}\n\nconst NotificationWrapper = styled.div(({color}: NotificationWrapperProps) => {\n return css`\n display: grid;\n grid-template-columns: minmax(0px, max-content) 1fr minmax(0px, max-content);\n grid-template-rows: auto;\n grid-template-areas:\n \"icon title close\"\n \". text .\"\n \". actions .\";\n column-gap: 4px;\n\n padding: 16px;\n background-color: rgba(${color}, 0.08);\n border-width: 1px;\n border-style: solid;\n border-color: rgba(${color}, 0.16);\n border-radius: 4px;\n `;\n});\n\nconst NotificationIcon = styled.div`\n grid-area: icon;\n width: 24px;\n place-items: center;\n place-content: center;\n`;\n\nconst NotificationTitle = styled.h2`\n grid-area: title;\n color: rgb(var(--center-channel-color-rgb));\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n`;\n\nconst NotificationText = styled.p(({noTitle}: {noTitle: boolean}) => {\n const area = noTitle ? 'title' : 'text';\n return css`\n grid-area: ${area};\n color: rgb(var(--center-channel-color-rgb));\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n margin: 0;\n `;\n});\n\nconst NotificationBox = ({variant, title, text, id = ''}: NotificationProps) => {\n const color = variantColorMap[variant];\n\n const iconProps = {\n size: 20,\n color: `rgb(${color})`,\n };\n\n let icon = null;\n switch (variant) {\n case 'info':\n icon = <InformationOutlineIcon {...iconProps}/>;\n break;\n case 'success':\n icon = <CheckIcon {...iconProps}/>;\n break;\n case 'warning':\n case 'danger':\n icon = <AlertOutlineIcon {...iconProps}/>;\n break;\n case 'general':\n default:\n break;\n }\n\n return (\n <NotificationWrapper\n color={color}\n data-testid={`notification${id ? `_${id}` : ''}`}\n >\n <NotificationIcon>\n {icon}\n </NotificationIcon>\n {title && <NotificationTitle>{title}</NotificationTitle>}\n {text && (\n <NotificationText\n noTitle={!title}\n data-testid={'notification-text'}\n >\n {text}\n </NotificationText>\n )}\n </NotificationWrapper>\n );\n};\n\nexport default memo(NotificationBox);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type * as CSS from 'csstype';\nimport type {CSSProperties} from 'react';\nimport type {ControlProps} from 'react-select';\n\nimport type {ChannelOption} from './forward_post_channel_select';\n\ntype Pseudos = CSS.Pseudos | '::-webkit-scrollbar' | '::-webkit-scrollbar-track' | '::-webkit-scrollbar-thumb';\n\ntype CSSPropertiesWithPseudos = CSSProperties & { [P in Pseudos]?: CSS.Properties };\n\nconst menuMargin = 4;\nconst selectHeight = 40;\n\nconst getBaseStyles = (bodyHeight: number) => {\n const minMenuHeight = bodyHeight - selectHeight - menuMargin;\n\n return ({\n input: (provided: CSSProperties): CSSPropertiesWithPseudos => ({\n ...provided,\n padding: 0,\n margin: 0,\n color: 'var(--center-channel-color)',\n }),\n placeholder: (provided: CSSProperties): CSSPropertiesWithPseudos => ({\n ...provided,\n margin: 0,\n color: 'rgba(var(--center-channel-color-rgb), 0.75)',\n fontSize: '14px',\n lineHeight: '20px',\n }),\n\n // disabling this rule here since otherwise tsc will complain about it in the props\n // eslint-disable-next-line @typescript-eslint/ban-types\n control: (provided: CSSProperties, state: ControlProps<{}>): CSSPropertiesWithPseudos => {\n const focusShadow = 'inset 0 0 0 2px var(--button-bg)';\n\n return ({\n ...provided,\n color: 'var(--center-channel-color)',\n backgroundColor: 'var(--center-channel-bg)',\n cursor: 'pointer',\n borderWidth: 0,\n boxShadow: state.isFocused ? focusShadow : 'inset 0 0 0 1px rgba(var(--center-channel-color-rgb), 0.16)',\n borderRadius: '4px',\n minHeight: `${selectHeight}px`,\n padding: '0 0 0 16px',\n\n ':hover': {\n color: state.isFocused ? focusShadow : 'inset 0 0 0 1px rgba(var(--center-channel-color-rgb), 0.24)',\n },\n });\n },\n indicatorSeparator: (): CSSPropertiesWithPseudos => ({\n display: 'none',\n }),\n indicatorsContainer: (provided: CSSProperties): CSSPropertiesWithPseudos => ({\n ...provided,\n padding: '2px',\n }),\n dropdownIndicator: (provided: CSSProperties, state: ControlProps<ChannelOption>): CSSPropertiesWithPseudos => ({\n ...provided,\n transform: state.isFocused ? 'rotate(180deg)' : 'rotate(0)',\n transition: 'transform 250ms ease-in-out',\n }),\n valueContainer: (provided: CSSProperties): CSSPropertiesWithPseudos => ({\n ...provided,\n overflow: 'visible',\n padding: '0 16px 0 0',\n margin: 0,\n }),\n menu: (provided: CSSProperties): CSSPropertiesWithPseudos => ({\n ...provided,\n padding: 0,\n margin: `${menuMargin}px 0 0 0`,\n zIndex: 10,\n }),\n menuList: (provided: CSSProperties): CSSPropertiesWithPseudos => ({\n ...provided,\n padding: 0,\n backgroundColor: 'var(--center-channel-bg)',\n borderRadius: '4px',\n border: '1px solid rgba(var(--center-channel-color-rgb), 0.16)',\n maxHeight: `min(${minMenuHeight}px, 300px)`,\n\n /* Elevation 4 */\n boxShadow: '0 8px 24px rgba(0, 0, 0, 0.12)',\n\n /* scrollbar styles */\n overflowY: 'auto', // for Firefox and browsers that doesn't support overflow-y:overlay property\n\n scrollbarColor: 'var(--center-channel-bg)',\n scrollbarWidth: 'thin',\n\n '::-webkit-scrollbar': {\n width: '8px',\n },\n\n '::-webkit-scrollbar-track': {\n width: '0px',\n background: 'transparent',\n },\n\n '::-webkit-scrollbar-thumb': {\n border: '1px var(--center-channel-bg) solid',\n background: 'rgba(var(--center-channel-color-rgb), 0.24) !important',\n backgroundClip: 'padding-box',\n borderRadius: '9999px',\n },\n }),\n groupHeading: (provided: CSSProperties): CSSPropertiesWithPseudos => ({\n ...provided,\n cursor: 'default',\n position: 'relative',\n display: 'flex',\n height: '2.8rem',\n alignItems: 'center',\n justifyContent: 'flex-start',\n padding: '0 0 0 2rem',\n margin: 0,\n color: 'rgba(var(--center-channel-color-rgb), 0.75)',\n backgroundColor: 'none',\n fontSize: '1.2rem',\n fontWeight: 600,\n textTransform: 'uppercase',\n }),\n singleValue: (provided: CSSProperties): CSSPropertiesWithPseudos => ({\n ...provided,\n maxWidth: 'calc(100% - 10px)',\n width: '100%',\n overflow: 'visible',\n }),\n option: (provided: CSSProperties, state: ControlProps<ChannelOption>): CSSPropertiesWithPseudos => ({\n ...provided,\n cursor: 'pointer',\n padding: '8px 20px',\n backgroundColor: state.isFocused ? 'rgba(var(--center-channel-color-rgb), 0.08)' : 'transparent',\n }),\n menuPortalTarget: (provided: CSSProperties): CSSPropertiesWithPseudos => ({\n ...provided,\n zIndex: 10,\n }),\n });\n};\n\nexport {getBaseStyles};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useRef} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport {components} from 'react-select';\nimport type {IndicatorProps, OptionProps, SingleValueProps, ValueType, OptionTypeBase} from 'react-select';\nimport AsyncSelect from 'react-select/async';\n\nimport {\n ArchiveOutlineIcon, ChevronDownIcon,\n GlobeIcon,\n LockOutlineIcon,\n MessageTextOutlineIcon,\n} from '@mattermost/compass-icons/components';\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getMyTeams, getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId, getStatusForUserId, getUser} from 'mattermost-redux/selectors/entities/users';\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport ProfilePicture from 'components/profile_picture';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport type {ProviderResult} from 'components/suggestion/provider';\nimport SwitchChannelProvider from 'components/suggestion/switch_channel_provider';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\n\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport {getBaseStyles} from './forward_post_channel_select_styles';\n\ntype ChannelTypeFromProvider = Channel & {\n userId?: string;\n}\n\nexport type ChannelOption = {\n label: string;\n value: string;\n details: ChannelTypeFromProvider;\n}\n\ntype GroupedOption = {\n label: React.ReactNode;\n options: ChannelOption[];\n}\n\nexport const makeSelectedChannelOption = (channel: Channel): ChannelOption => ({\n label: channel.display_name || channel.name,\n value: channel.id,\n details: channel,\n});\n\nconst FormattedOption = (props: ChannelOption & {className: string; isSingleValue?: boolean}) => {\n const {details} = props;\n\n const {formatMessage} = useIntl();\n\n const currentUserId = useSelector((state: GlobalState) => getCurrentUserId(state));\n const user = useSelector((state: GlobalState) => getUser(state, details.userId || ''));\n const status = useSelector((state: GlobalState) => getStatusForUserId(state, details.userId || ''));\n const teammate = useSelector((state: GlobalState) => getDirectTeammate(state, details.id));\n const team = useSelector((state: GlobalState) => getTeam(state, details.team_id));\n const userImageUrl = user?.id && Utils.imageURLForUser(user.id, user.last_picture_update);\n const isPartOfOnlyOneTeam = useSelector((state: GlobalState) => getMyTeams(state).length === 1);\n\n const channelIsArchived = details.delete_at > 0;\n\n let icon;\n const iconProps = {\n size: 16,\n color: 'rgba(var(--center-channel-color-rgb), 0.75)',\n };\n\n if (channelIsArchived) {\n icon = <ArchiveOutlineIcon {...iconProps}/>;\n } else if (details.type === Constants.OPEN_CHANNEL) {\n icon = <GlobeIcon {...iconProps}/>;\n } else if (details.type === Constants.PRIVATE_CHANNEL) {\n icon = <LockOutlineIcon {...iconProps}/>;\n } else if (details.type === Constants.THREADS) {\n icon = <MessageTextOutlineIcon {...iconProps}/>;\n } else if (details.type === Constants.GM_CHANNEL) {\n icon = <div className='status status--group'>{'G'}</div>;\n } else {\n icon = (\n <ProfilePicture\n src={userImageUrl}\n status={teammate && teammate.is_bot ? undefined : status}\n size='sm'\n />\n );\n }\n\n let customStatus = null;\n\n let name = details.display_name;\n let description = `~${details.name}`;\n\n let tag = null;\n if (details.type === Constants.DM_CHANNEL) {\n if (teammate?.is_bot) {\n tag = <BotTag/>;\n } else if (isGuest(teammate?.roles ?? '')) {\n tag = <GuestTag/>;\n }\n\n const emojiStyle = {\n marginBottom: 2,\n marginLeft: 8,\n };\n\n customStatus = (\n <CustomStatusEmoji\n showTooltip={true}\n userID={user.id}\n emojiStyle={emojiStyle}\n />\n );\n\n const deactivated = user.delete_at ? ` - ${formatMessage({id: 'channel_switch_modal.deactivated', defaultMessage: 'Deactivated'})}` : '';\n\n if (details.display_name && !teammate?.is_bot) {\n description = `@${user.username}${deactivated}`;\n } else {\n name = user.username;\n if (user.id === currentUserId) {\n name += ` ${formatMessage({id: 'suggestion.user.isCurrent', defaultMessage: '(you)'})}`;\n }\n description = deactivated;\n }\n } else if (details.type === Constants.GM_CHANNEL) {\n // remove the slug from the option\n name = details.display_name;\n description = '';\n }\n\n const sharedIcon = details.shared ? (\n <SharedChannelIndicator\n className='shared-channel-icon'\n />\n ) : null;\n\n const teamName = details.team_id && team ? (\n <span className='option__team-name'>{team.display_name}</span>\n ) : null;\n\n const componentType = props.isSingleValue ? 'singleValue' : 'option';\n\n const componentId = `post-forward_channel-select_${componentType}_${details.id}`;\n\n return (\n <div\n id={componentId}\n className={props.className}\n data-testid={details.name}\n aria-label={name}\n >\n {icon}\n <span className='option__content'>\n <span className='option__content--text'>{name}</span>\n {(isPartOfOnlyOneTeam || details.type === Constants.DM_CHANNEL) && description && (\n <span className='option__content--description'>{description}</span>\n )}\n {customStatus}\n {sharedIcon}\n {tag}\n </span>\n {!isPartOfOnlyOneTeam && teamName}\n </div>\n );\n};\n\nconst Option = (props: OptionProps<ChannelOption>) => {\n const {data} = props;\n\n const teammate = useSelector((state: GlobalState) => getDirectTeammate(state, data.details.id));\n\n if (teammate?.is_bot) {\n return null;\n }\n\n return (\n <components.Option {...props}>\n <FormattedOption\n {...data}\n className='option'\n />\n </components.Option>\n );\n};\n\nconst SingleValue = (props: SingleValueProps<ChannelOption>) => {\n const {data} = props;\n\n return (\n <components.SingleValue {...props}>\n <FormattedOption\n {...data}\n isSingleValue={true}\n className='singleValue'\n />\n </components.SingleValue>\n );\n};\n\nconst DropdownIndicator = (props: IndicatorProps<ChannelOption>) => {\n return (\n <components.DropdownIndicator {...props}>\n <ChevronDownIcon\n size={16}\n color={'rgba(var(--center-channel-color-rgb), 0.75)'}\n />\n </components.DropdownIndicator>\n );\n};\n\ntype Props<O extends OptionTypeBase> = {\n onSelect: (channel: ValueType<O>) => void;\n currentBodyHeight: number;\n value?: O;\n validChannelTypes?: string[];\n}\n\nfunction ForwardPostChannelSelect({onSelect, value, currentBodyHeight, validChannelTypes = ['O', 'P', 'D', 'G']}: Props<ChannelOption>) {\n const {formatMessage} = useIntl();\n const {current: provider} = useRef<SwitchChannelProvider>(new SwitchChannelProvider());\n\n useEffect(() => {\n provider.forceDispatch = true;\n }, [provider]);\n\n const baseStyles = getBaseStyles(currentBodyHeight);\n\n const isValidChannelType = (channel: Channel) => validChannelTypes.includes(channel.type) && !channel.delete_at;\n\n const getDefaultResults = () => {\n let options: GroupedOption[] = [];\n\n const handleDefaultResults = (res: ProviderResult<any>) => {\n options = [\n {\n label: formatMessage({id: 'suggestion.mention.recent.channels', defaultMessage: 'Recent'}),\n options: res.items.filter((item) => item?.channel && isValidChannelType(item.channel) && !item.deactivated).map((item) => {\n const {channel} = item;\n return makeSelectedChannelOption(channel);\n }),\n },\n ];\n };\n\n provider.fetchAndFormatRecentlyViewedChannels(handleDefaultResults);\n return options;\n };\n\n const defaultOptions = useRef<GroupedOption[]>(getDefaultResults());\n\n const handleInputChange = (inputValue: string) => {\n return new Promise<ChannelOption[]>((resolve) => {\n let callCount = inputValue ? 0 : 1;\n const options: ChannelOption[] = [];\n\n /** we optimistically assume this callback gets invoked twice when we have a value to be passed into the provider.\n * If, for some reason, we decide to change the behavior of the provider we should change the handling here as well.\n * A comment will be added to the repective section of the provider as well.\n *\n * @see {@link components/suggestion/switch_channel_provider.jsx}\n */\n const handleResults = async (res: ProviderResult<any>) => {\n callCount++;\n await res.items.filter((item) => item?.channel && isValidChannelType(item.channel) && !item.deactivated).forEach((item) => {\n const {channel} = item;\n\n if (options.findIndex((option) => option.value === channel.id) === -1) {\n options.push(makeSelectedChannelOption(channel));\n }\n });\n\n if (callCount === 2) {\n resolve(options);\n }\n };\n\n provider.handlePretextChanged(inputValue, handleResults);\n });\n };\n\n return (\n <AsyncSelect\n value={value}\n onChange={onSelect}\n loadOptions={handleInputChange}\n defaultOptions={defaultOptions.current}\n components={{DropdownIndicator, Option, SingleValue}}\n styles={baseStyles}\n legend='Forward to'\n placeholder='Select channel or people'\n className='forward-post__select'\n data-testid='forward-post-select'\n />\n );\n}\n\nexport default ForwardPostChannelSelect;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useRef} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport Textbox from 'components/textbox';\nimport type {TextboxClass, TextboxElement} from 'components/textbox';\n\nimport Constants from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport {applyMarkdown} from 'utils/markdown/apply_markdown';\nimport type {ApplyMarkdownOptions} from 'utils/markdown/apply_markdown';\nimport * as Utils from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nconst {KeyCodes} = Constants;\n\ntype Props = {\n channelId: string;\n canForwardPost: boolean;\n comment: string;\n permaLinkLength: number;\n onSubmit: () => void;\n onChange: (comment: string) => void;\n onError: (error: React.ReactNode) => void;\n onHeightChange: (width: number, height: number) => void;\n}\n\nconst ForwardPostCommentInput = ({channelId, canForwardPost, comment, permaLinkLength, onChange, onError, onSubmit, onHeightChange}: Props) => {\n const {formatMessage} = useIntl();\n\n const config = useSelector((state: GlobalState) => getConfig(state));\n\n const textboxRef = useRef<TextboxClass>(null);\n\n const maxPostSize =\n (parseInt(config.MaxPostSize || '', 10) ||\n Constants.DEFAULT_CHARACTER_LIMIT) - permaLinkLength - 1;\n const enableEmojiPicker = config.EnableEmojiPicker === 'true';\n\n // we do not allow sending the forwarding when hitting enter\n const postMsgKeyPress = () => {};\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<TextboxElement>) => {\n const message = e.target.value;\n\n onChange(message);\n },\n [onChange],\n );\n\n const setCommentAsync = async (message: string) => {\n await onChange(message);\n };\n\n const applyMarkdownMode = (params: ApplyMarkdownOptions) => {\n const res = applyMarkdown(params);\n\n setCommentAsync(res.message).then(() => {\n const textbox = textboxRef.current?.getInputBox();\n Utils.setSelectionRange(\n textbox,\n res.selectionStart,\n res.selectionEnd,\n );\n });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<TextboxElement>) => {\n const ctrlKeyCombo = Keyboard.cmdOrCtrlPressed(e) && !e.altKey && !e.shiftKey;\n const ctrlAltCombo = Keyboard.cmdOrCtrlPressed(e, true) && e.altKey;\n const ctrlShiftCombo = Keyboard.cmdOrCtrlPressed(e, true) && e.shiftKey;\n const markdownLinkKey = Keyboard.isKeyPressed(e, KeyCodes.K);\n const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey;\n const ctrlEnterKeyCombo =\n Keyboard.isKeyPressed(e, KeyCodes.ENTER) && ctrlOrMetaKeyPressed;\n\n const {selectionStart, selectionEnd, value} =\n e.target as TextboxElement;\n\n // listen for line break key combo and insert new line character\n if (Utils.isUnhandledLineBreakKeyCombo(e)) {\n onChange(Utils.insertLineBreakFromKeyEvent(e.nativeEvent));\n } else if (ctrlAltCombo && markdownLinkKey) {\n applyMarkdownMode({\n markdownMode: 'link',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (ctrlKeyCombo && Keyboard.isKeyPressed(e, KeyCodes.B)) {\n applyMarkdownMode({\n markdownMode: 'bold',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (ctrlKeyCombo && Keyboard.isKeyPressed(e, KeyCodes.I)) {\n applyMarkdownMode({\n markdownMode: 'italic',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (ctrlShiftCombo && Keyboard.isKeyPressed(e, KeyCodes.X)) {\n applyMarkdownMode({\n markdownMode: 'strike',\n selectionStart,\n selectionEnd,\n message: value,\n });\n } else if (ctrlShiftCombo && Keyboard.isKeyPressed(e, KeyCodes.E)) {\n e.stopPropagation();\n e.preventDefault();\n } else if (ctrlEnterKeyCombo && canForwardPost) {\n onSubmit();\n }\n };\n\n const createMessage = formatMessage({\n id: 'forward_post_modal.comment.placeholder',\n defaultMessage: 'Add a comment (optional)',\n });\n\n return (\n <Textbox\n onChange={handleChange}\n onKeyPress={postMsgKeyPress}\n onKeyDown={handleKeyDown}\n onHeightChange={onHeightChange}\n handlePostError={onError}\n value={comment}\n emojiEnabled={enableEmojiPicker}\n createMessage={createMessage}\n channelId={channelId}\n id={'forward_post_textbox'}\n ref={textboxRef}\n characterLimit={maxPostSize}\n useChannelMentions={false}\n supportsCommands={false}\n suggestionListPosition='bottom'\n alignWithTextbox={true}\n />\n );\n};\n\nexport default ForwardPostCommentInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback, useRef, useState, useMemo} from 'react';\nimport {FormattedList, FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport type {ValueType} from 'react-select';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {Post, PostPreviewMetadata} from '@mattermost/types/posts';\n\nimport {General, Permissions} from 'mattermost-redux/constants';\nimport {makeGetChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions';\nimport {joinChannelById, switchToChannel} from 'actions/views/channel';\nimport {forwardPost} from 'actions/views/posts';\nimport {getPermalinkURL} from 'selectors/urls';\n\nimport NotificationBox from 'components/notification_box';\nimport PostMessagePreview from 'components/post_view/post_message_preview';\n\nimport Constants from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\n\nimport type {GlobalState} from 'types/store';\n\nimport ForwardPostChannelSelect, {makeSelectedChannelOption} from './forward_post_channel_select';\nimport type {ChannelOption} from './forward_post_channel_select';\nimport ForwardPostCommentInput from './forward_post_comment_input';\n\nimport './forward_post_modal.scss';\n\ntype Props = {\n\n // The function called immediately after the modal is hidden\n onExited?: () => void;\n\n // the post that is going to be forwarded\n post: Post;\n};\n\nconst noop = () => {};\n\nconst ForwardPostModal = ({onExited, post}: Props) => {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n\n const getChannel = useMemo(makeGetChannel, []);\n\n const channel = useSelector((state: GlobalState) => getChannel(state, post.channel_id));\n const currentTeam = useSelector(getCurrentTeam);\n\n const relativePermaLink = useSelector((state: GlobalState) => (currentTeam ? getPermalinkURL(state, currentTeam.id, post.id) : ''));\n const permaLink = `${getSiteURL()}${relativePermaLink}`;\n\n const isPrivateConversation = channel?.type !== Constants.OPEN_CHANNEL;\n\n const [comment, setComment] = useState('');\n const [bodyHeight, setBodyHeight] = useState<number>(0);\n const [hasError, setHasError] = useState<boolean>(false);\n const [postError, setPostError] = useState<React.ReactNode>(null);\n const [selectedChannel, setSelectedChannel] = useState<ChannelOption>();\n\n const bodyRef = useRef<HTMLDivElement>();\n\n const measuredRef = useCallback((node) => {\n if (node !== null) {\n bodyRef.current = node;\n setBodyHeight(node.getBoundingClientRect().height);\n }\n }, []);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const onHeightChange = (width: number, height: number) => {\n if (bodyRef.current) {\n setBodyHeight(bodyRef.current.getBoundingClientRect().height);\n }\n };\n\n const selectedChannelId = selectedChannel?.details?.id || '';\n\n const canPostInSelectedChannel = useSelector(\n (state: GlobalState) => {\n const channelId = isPrivateConversation ? post.channel_id : selectedChannelId;\n const isDMChannel = selectedChannel?.details?.type === Constants.DM_CHANNEL;\n const teamId = isPrivateConversation ? currentTeam?.id : selectedChannel?.details?.team_id;\n\n const hasChannelPermission = haveIChannelPermission(\n state,\n teamId || currentTeam?.id,\n channelId,\n Permissions.CREATE_POST,\n );\n\n return Boolean(channelId) && (hasChannelPermission || isDMChannel);\n },\n );\n\n const canForwardPost = (isPrivateConversation || canPostInSelectedChannel) && !postError;\n\n const onHide = useCallback(() => {\n onExited?.();\n }, [onExited]);\n\n const handleChannelSelect = useCallback(\n (channel: ValueType<ChannelOption>) => {\n if (Array.isArray(channel)) {\n setSelectedChannel(channel[0]);\n }\n setSelectedChannel(channel as ChannelOption);\n },\n [],\n );\n\n // since the original post has a click handler specified we should prevent any action here\n const preventActionOnPreview = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const messagePreviewTitle = formatMessage({\n id: 'forward_post_modal.preview.title',\n defaultMessage: 'Message preview',\n });\n\n const previewMetaData: PostPreviewMetadata = {\n post,\n post_id: post.id,\n team_name: currentTeam?.name || '',\n channel_display_name: channel?.display_name || '',\n channel_type: channel?.type || 'O',\n channel_id: post.channel_id,\n };\n\n let notification;\n if (isPrivateConversation) {\n let notificationText;\n if (channel?.type === General.PRIVATE_CHANNEL) {\n const channelName = `~${channel.display_name}`;\n notificationText = (\n <FormattedMessage\n id='forward_post_modal.notification.private_channel'\n defaultMessage='This message is from a private channel and can only be shared with <strong>{channelName}</strong>'\n values={{\n channelName,\n strong: (x: React.ReactNode) => <strong>{x}</strong>,\n }}\n />\n );\n } else {\n const allParticipants = channel?.display_name.split(', ') || [];\n const participants = allParticipants.map((participant) => <strong key={participant}>{participant}</strong>);\n\n notificationText = (\n <FormattedMessage\n id='forward_post_modal.notification.dm_or_gm'\n defaultMessage='This message is from a private conversation and can only be shared with {participants}'\n values={{\n participants: <FormattedList value={participants}/>,\n strong: (x: React.ReactNode) => <strong>{x}</strong>,\n }}\n />\n );\n }\n\n notification = (\n <NotificationBox\n variant={'info'}\n text={notificationText}\n id={'forward_post'}\n />\n );\n }\n\n const handlePostError = (error: React.ReactNode) => {\n setPostError(error);\n setHasError(true);\n setTimeout(() => setHasError(false), Constants.ANIMATION_TIMEOUT);\n };\n\n const handleSubmit = () => {\n if (postError) {\n return Promise.resolve();\n }\n\n if (!channel) {\n return Promise.resolve();\n }\n\n const channelToForward = isPrivateConversation ? makeSelectedChannelOption(channel) : selectedChannel;\n\n if (!channelToForward) {\n return Promise.resolve();\n }\n\n const {type, userId} = channelToForward.details;\n\n return Promise.resolve().then(() => {\n if (type === Constants.DM_CHANNEL && userId) {\n return dispatch(openDirectChannelToUserId(userId));\n }\n return {data: false} as ActionResult;\n }).then(({data}) => {\n if (data) {\n channelToForward.details.id = data.id;\n }\n\n return dispatch(forwardPost(\n post,\n channelToForward.details,\n comment,\n ));\n }).then(() => {\n if (type === Constants.MENTION_MORE_CHANNELS && type === Constants.OPEN_CHANNEL) {\n return dispatch(joinChannelById(channelToForward.details.id));\n }\n return {data: false};\n }).then(() => {\n // only switch channels when we are not in a private conversation\n if (!isPrivateConversation) {\n return dispatch(switchToChannel(channelToForward.details));\n }\n return {data: false};\n }).then(() => {\n onHide();\n }).catch((result) => {\n if (result?.error) {\n handlePostError(result.error);\n }\n });\n };\n\n const postPreviewFooterMessage = formatMessage({\n id: 'forward_post_modal.preview.footer_message',\n defaultMessage: 'Originally posted in ~{channel}',\n },\n {\n channel: channel?.display_name || '',\n });\n\n return (\n <GenericModal\n className='a11y__modal forward-post'\n id='forward-post-modal'\n show={true}\n autoCloseOnConfirmButton={false}\n compassDesign={true}\n modalHeaderText={formatMessage({\n id: 'forward_post_modal.title',\n defaultMessage: 'Forward message',\n })}\n confirmButtonText={formatMessage({\n id: 'forward_post_modal.button.forward',\n defaultMessage: 'Forward',\n })}\n cancelButtonText={formatMessage({\n id: 'forward_post_modal.button.cancel',\n defaultMessage: 'Cancel',\n })}\n isConfirmDisabled={!canForwardPost}\n handleConfirm={handleSubmit}\n handleCancel={onHide}\n onExited={onHide}\n >\n <div\n className={'forward-post__body'}\n ref={measuredRef}\n >\n {isPrivateConversation ? (\n notification\n ) : (\n <ForwardPostChannelSelect\n onSelect={handleChannelSelect}\n value={selectedChannel}\n currentBodyHeight={bodyHeight}\n />\n )}\n <ForwardPostCommentInput\n canForwardPost={canForwardPost}\n channelId={selectedChannelId}\n comment={comment}\n onChange={setComment}\n onError={handlePostError}\n onSubmit={handleSubmit}\n onHeightChange={onHeightChange}\n permaLinkLength={permaLink.length}\n />\n <div className={'forward-post__post-preview'}>\n <span className={'forward-post__post-preview--title'}>\n {messagePreviewTitle}\n </span>\n <div\n className='post forward-post__post-preview--override'\n onClick={preventActionOnPreview}\n >\n <PostMessagePreview\n metadata={previewMetaData}\n handleFileDropdownOpened={noop}\n preventClickAction={true}\n previewFooterMessage={postPreviewFooterMessage}\n />\n </div>\n {postError && (\n <label\n className={classNames('post-error', {\n 'animation--highlight': hasError,\n })}\n >\n {postError}\n </label>\n )}\n </div>\n </div>\n </GenericModal>\n );\n};\n\nexport default ForwardPostModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback, useMemo, useRef, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport type {ValueType} from 'react-select';\n\nimport type {ClientError} from '@mattermost/client';\nimport {GenericModal} from '@mattermost/components';\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Post, PostPreviewMetadata} from '@mattermost/types/posts';\n\nimport {makeGetChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport type {ChannelOption} from 'components/forward_post_modal/forward_post_channel_select';\nimport ChannelSelector from 'components/forward_post_modal/forward_post_channel_select';\nimport NotificationBox from 'components/notification_box';\nimport PostMessagePreview from 'components/post_view/post_message_preview';\n\nimport Constants from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport './move_thread_modal.scss';\n\nexport type ActionProps = {\n\n // join the selected channel when necessary\n joinChannelById: (channelId: string) => Promise<ActionResult>;\n\n // switch to the selected channel\n switchToChannel: (channel: Channel) => Promise<ActionResult>;\n\n // action called to move the post from the original channel to a new channel\n moveThread: (postId: string, channelId: string) => Promise<ActionResult>;\n}\n\nexport type OwnProps = {\n\n // The function called immediately after the modal is hidden\n onExited?: () => void;\n\n // the post that is going to be moved\n post: Post;\n};\n\nexport type Props = OwnProps & {actions: ActionProps};\n\nconst noop = () => {};\n\nconst getChannel = makeGetChannel();\n\n// since the original post has a click handler specified we should prevent any action here\nconst preventActionOnPreview = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst MoveThreadModal = ({onExited, post, actions}: Props) => {\n const {formatMessage} = useIntl();\n\n const originalChannel = useSelector((state: GlobalState) => getChannel(state, post.channel_id));\n const currentTeam = useSelector(getCurrentTeam);\n\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const [bodyHeight, setBodyHeight] = useState<number>(0);\n const [hasError, setHasError] = useState<boolean>(false);\n const [postError, setPostError] = useState<React.ReactNode>(null);\n const [selectedChannel, setSelectedChannel] = useState<ChannelOption>();\n const [isButtonClicked, setIsButtonClicked] = useState<boolean>(false);\n\n const bodyRef = useRef<HTMLDivElement>();\n\n const measuredRef = useCallback((node) => {\n if (node !== null) {\n bodyRef.current = node;\n setBodyHeight(node.getBoundingClientRect().height);\n }\n }, []);\n\n const onHide = useCallback(() => {\n onExited?.();\n }, [onExited]);\n\n const handleChannelSelect = useCallback((channel: ValueType<ChannelOption>) => {\n if (Array.isArray(channel)) {\n setSelectedChannel(channel[0]);\n return;\n }\n setSelectedChannel(channel as ChannelOption);\n }, []);\n\n const messagePreviewTitle = formatMessage({\n id: 'move_thread_modal.preview.title',\n defaultMessage: 'Message preview',\n });\n\n const previewMetaData: PostPreviewMetadata = useMemo(() => ({\n post,\n post_id: post.id,\n team_name: currentTeam?.name || '',\n channel_display_name: originalChannel?.display_name || '',\n channel_type: originalChannel?.type || 'O',\n channel_id: originalChannel?.id || '',\n }), [post, currentTeam?.name, originalChannel?.display_name, originalChannel?.type, originalChannel?.id]);\n\n const notificationText = formatMessage({\n id: 'move_thread_modal.notification.dm_or_gm',\n defaultMessage: 'Moving this thread changes who has access',\n });\n\n const notification = (\n <NotificationBox\n variant={'info'}\n text={notificationText}\n id={'move_thread'}\n />\n );\n\n const handlePostError = useCallback((error: ClientError) => {\n setIsButtonClicked(false);\n setPostError(error.message);\n setHasError(true);\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n setHasError(false);\n timeoutRef.current = null;\n }, Constants.ANIMATION_TIMEOUT);\n }, []);\n\n const handleSubmit = useCallback(async () => {\n setIsButtonClicked(true);\n if (!selectedChannel) {\n setIsButtonClicked(false);\n return;\n }\n\n const channel = selectedChannel.details;\n\n let result = await actions.moveThread(post.root_id || post.id, channel.id);\n\n if (result.error) {\n handlePostError(result.error);\n return;\n }\n\n if (\n channel.type === Constants.MENTION_MORE_CHANNELS &&\n channel.type === Constants.OPEN_CHANNEL\n ) {\n result = await actions.joinChannelById(channel.id);\n\n if (result.error) {\n handlePostError(result.error);\n return;\n }\n }\n\n result = await actions.switchToChannel(channel);\n\n if (result.error) {\n handlePostError(result.error);\n return;\n }\n\n onHide();\n }, [selectedChannel, post, actions, handlePostError, onHide]);\n\n const postPreviewFooterMessage = formatMessage({\n id: 'move_thread_modal.preview.footer_message',\n defaultMessage: 'Originally posted in ~{channelName}',\n },\n {\n channelName: originalChannel?.display_name || '',\n });\n\n return (\n <GenericModal\n className='a11y__modal forward-post move-thread'\n id='move-thread-modal'\n show={true}\n autoCloseOnConfirmButton={false}\n compassDesign={true}\n modalHeaderText={formatMessage({\n id: 'move_thread_modal.title',\n defaultMessage: 'Move thread',\n })}\n confirmButtonText={formatMessage({\n id: 'move_thread_modal.button.forward',\n defaultMessage: 'Move',\n })}\n cancelButtonText={formatMessage({\n id: 'move_thread_modal.button.cancel',\n defaultMessage: 'Cancel',\n })}\n cancelButtonClassName={'MoveThreadModal__cancel-button'}\n isConfirmDisabled={isButtonClicked}\n handleConfirm={handleSubmit}\n handleEnterKeyPress={handleSubmit}\n handleCancel={onHide}\n onExited={onHide}\n >\n <div\n className={'move-thread__body'}\n ref={measuredRef}\n >\n {notification}\n <ChannelSelector\n onSelect={handleChannelSelect}\n value={selectedChannel}\n currentBodyHeight={bodyHeight}\n validChannelTypes={['O', 'P']}\n />\n <div className={'move-thread__post-preview'}>\n <span className={'move-thread__post-preview--title'}>\n {messagePreviewTitle}\n </span>\n <div\n className='post move-thread__post-preview--override'\n onClick={preventActionOnPreview}\n >\n <PostMessagePreview\n metadata={previewMetaData}\n handleFileDropdownOpened={noop}\n preventClickAction={true}\n previewFooterMessage={postPreviewFooterMessage}\n />\n </div>\n {postError && (\n <label\n className={classNames('post-error', {\n 'animation--highlight': hasError,\n })}\n >\n {postError}\n </label>\n )}\n </div>\n </div>\n </GenericModal>\n );\n};\n\nexport default MoveThreadModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ConnectedProps} from 'react-redux';\nimport {connect} from 'react-redux';\nimport type {Dispatch} from 'redux';\nimport {bindActionCreators} from 'redux';\n\nimport {moveThread} from 'mattermost-redux/actions/posts';\n\nimport {joinChannelById, switchToChannel} from 'actions/views/channel';\n\nimport MoveThreadModal from './move_thread_modal';\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n joinChannelById,\n switchToChannel,\n moveThread,\n }, dispatch),\n };\n}\nconst connector = connect(null, mapDispatchToProps);\n\nexport default connector(MoveThreadModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {addPostReminder} from 'mattermost-redux/actions/posts';\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {makeAsyncComponent} from 'components/async_load';\n\nimport type {GlobalState} from 'types/store';\n\nconst PostReminderCustomTimePicker = makeAsyncComponent('PostReminderCustomTimePicker', React.lazy(() => import('./post_reminder_custom_time_picker_modal')));\n\nfunction mapStateToProps(state: GlobalState) {\n const timezone = getCurrentTimezone(state);\n const userId = getCurrentUserId(state);\n\n return {\n userId,\n timezone,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n addPostReminder,\n }, dispatch),\n };\n}\nconst connector = connect(mapStateToProps, mapDispatchToProps);\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\nexport default connector(PostReminderCustomTimePicker);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage, FormattedDate, FormattedTime, useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {ChevronRightIcon, ClockOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {addPostReminder} from 'mattermost-redux/actions/posts';\n\nimport {openModal} from 'actions/views/modals';\n\nimport * as Menu from 'components/menu';\nimport PostReminderCustomTimePicker from 'components/post_reminder_custom_time_picker_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {toUTCUnix} from 'utils/datetime';\nimport {getCurrentMomentForTimezone} from 'utils/timezone';\n\ntype Props = {\n userId: string;\n post: Post;\n isMilitaryTime: boolean;\n timezone?: string;\n}\n\nconst PostReminders = {\n THIRTY_MINUTES: 'thirty_minutes',\n ONE_HOUR: 'one_hour',\n TWO_HOURS: 'two_hours',\n TOMORROW: 'tomorrow',\n CUSTOM: 'custom',\n} as const;\n\nfunction PostReminderSubmenu(props: Props) {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n\n function handlePostReminderMenuClick(id: string) {\n if (id === PostReminders.CUSTOM) {\n const postReminderCustomTimePicker = {\n modalId: ModalIdentifiers.POST_REMINDER_CUSTOM_TIME_PICKER,\n dialogType: PostReminderCustomTimePicker,\n dialogProps: {\n postId: props.post.id,\n },\n };\n\n dispatch(openModal(postReminderCustomTimePicker));\n } else {\n const currentDate = getCurrentMomentForTimezone(props.timezone);\n\n let endTime = currentDate;\n if (id === PostReminders.THIRTY_MINUTES) {\n // add 30 minutes in current time\n endTime = currentDate.add(30, 'minutes');\n } else if (id === PostReminders.ONE_HOUR) {\n // add 1 hour in current time\n endTime = currentDate.add(1, 'hour');\n } else if (id === PostReminders.TWO_HOURS) {\n // add 2 hours in current time\n endTime = currentDate.add(2, 'hours');\n } else if (id === PostReminders.TOMORROW) {\n // set to next day 9 in the morning\n endTime = currentDate.add(1, 'day').set({hour: 9, minute: 0});\n }\n\n dispatch(addPostReminder(props.userId, props.post.id, toUTCUnix(endTime.toDate())));\n }\n }\n\n const postReminderSubMenuItems = Object.values(PostReminders).map((postReminder) => {\n let labels = null;\n if (postReminder === PostReminders.THIRTY_MINUTES) {\n labels = (\n <FormattedMessage\n id='post_info.post_reminder.sub_menu.thirty_minutes'\n defaultMessage='30 mins'\n />\n );\n } else if (postReminder === PostReminders.ONE_HOUR) {\n labels = (\n <FormattedMessage\n id='post_info.post_reminder.sub_menu.one_hour'\n defaultMessage='1 hour'\n />\n );\n } else if (postReminder === PostReminders.TWO_HOURS) {\n labels = (\n <FormattedMessage\n id='post_info.post_reminder.sub_menu.two_hours'\n defaultMessage='2 hours'\n />\n );\n } else if (postReminder === PostReminders.TOMORROW) {\n labels = (\n <FormattedMessage\n id='post_info.post_reminder.sub_menu.tomorrow'\n defaultMessage='Tomorrow'\n />\n );\n } else {\n labels = (\n <FormattedMessage\n id='post_info.post_reminder.sub_menu.custom'\n defaultMessage='Custom'\n />\n );\n }\n\n let trailingElements = null;\n if (postReminder === PostReminders.TOMORROW) {\n const tomorrow = getCurrentMomentForTimezone(props.timezone).add(1, 'day').set({hour: 9, minute: 0}).toDate();\n\n trailingElements = (\n <span className={`postReminder-${postReminder}_timestamp`}>\n <FormattedDate\n value={tomorrow}\n weekday='short'\n timeZone={props.timezone}\n />\n {', '}\n <FormattedTime\n value={tomorrow}\n timeStyle='short'\n hour12={!props.isMilitaryTime}\n timeZone={props.timezone}\n />\n </span>\n );\n }\n\n return (\n <Menu.Item\n id={`remind_post_options_${postReminder}`}\n key={`remind_post_options_${postReminder}`}\n labels={labels}\n trailingElements={trailingElements}\n onClick={() => handlePostReminderMenuClick(postReminder)}\n />\n );\n });\n\n return (\n <Menu.SubMenu\n id={`remind_post_${props.post.id}`}\n menuAriaLabel={formatMessage({\n id: 'post_info.post_reminder.sub_menu.header',\n defaultMessage: 'Set a reminder for:',\n })}\n labels={\n <FormattedMessage\n id='post_info.post_reminder.menu'\n defaultMessage='Remind'\n />\n }\n leadingElement={<ClockOutlineIcon size={18}/>}\n trailingElements={<span className={'dot-menu__item-trailing-icon'}><ChevronRightIcon size={16}/></span>}\n menuId={`remind_post_${props.post.id}-menu`}\n >\n <h5 className={'dot-menu__post-reminder-menu-header'}>\n {formatMessage(\n {id: 'post_info.post_reminder.sub_menu.header',\n defaultMessage: 'Set a reminder for:'},\n )}\n </h5>\n {postReminderSubMenuItems}\n </Menu.SubMenu>\n );\n}\n\nexport default memo(PostReminderSubmenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type React from 'react';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {EventTypes, TELEMETRY_CATEGORIES} from 'utils/constants';\n\nexport type ChangeEvent = React.KeyboardEvent | React.MouseEvent;\n\nexport const trackDotMenuEvent = (e: ChangeEvent, suffix: string): void => {\n if (e.type === EventTypes.CLICK) {\n trackEvent(TELEMETRY_CATEGORIES.POST_INFO_MORE, EventTypes.CLICK + '_' + suffix);\n } else {\n trackEvent(TELEMETRY_CATEGORIES.POST_INFO_MORE, EventTypes.SHORTCUT + '_ ' + suffix);\n }\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport {\n ArrowRightBoldOutlineIcon,\n BookmarkIcon,\n BookmarkOutlineIcon,\n ContentCopyIcon,\n DotsHorizontalIcon,\n EmoticonPlusOutlineIcon,\n LinkVariantIcon,\n MarkAsUnreadIcon,\n MessageArrowRightOutlineIcon,\n MessageCheckOutlineIcon,\n MessageMinusOutlineIcon,\n PencilOutlineIcon,\n PinIcon,\n PinOutlineIcon,\n ReplyOutlineIcon,\n TrashCanOutlineIcon,\n} from '@mattermost/compass-icons/components';\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserThread} from '@mattermost/types/threads';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport DeletePostModal from 'components/delete_post_modal';\nimport ForwardPostModal from 'components/forward_post_modal';\nimport * as Menu from 'components/menu';\nimport MoveThreadModal from 'components/move_thread_modal';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\n\nimport {Locations, ModalIdentifiers, Constants, TELEMETRY_LABELS} from 'utils/constants';\nimport DelayedAction from 'utils/delayed_action';\nimport * as Keyboard from 'utils/keyboard';\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils';\n\nimport type {ModalData} from 'types/actions';\n\nimport PostReminderSubMenu from './post_reminder_submenu';\nimport {trackDotMenuEvent} from './utils';\nimport type {ChangeEvent} from './utils';\n\nimport './dot_menu.scss';\n\ntype ShortcutKeyProps = {\n shortcutKey: string;\n};\n\nconst ShortcutKey = ({shortcutKey: shortcut}: ShortcutKeyProps) => (\n <span>\n {shortcut}\n </span>\n);\n\ntype Props = {\n intl: IntlShape;\n post: Post;\n teamId: string;\n location?: keyof typeof Constants.Locations;\n isFlagged?: boolean;\n handleCommentClick?: React.EventHandler<any>;\n handleDropdownOpened: (open: boolean) => void;\n handleAddReactionClick?: () => void;\n isMenuOpen?: boolean;\n isReadOnly?: boolean;\n isLicensed?: boolean; // TechDebt: Made non-mandatory while converting to typescript\n postEditTimeLimit?: string; // TechDebt: Made non-mandatory while converting to typescript\n enableEmojiPicker?: boolean; // TechDebt: Made non-mandatory while converting to typescript\n channelIsArchived?: boolean; // TechDebt: Made non-mandatory while converting to typescript\n teamUrl?: string; // TechDebt: Made non-mandatory while converting to typescript\n isMobileView: boolean;\n timezone?: string;\n isMilitaryTime: boolean;\n canMove: boolean;\n\n actions: {\n\n /**\n * Function flag the post\n */\n flagPost: (postId: string) => void;\n\n /**\n * Function to unflag the post\n */\n unflagPost: (postId: string) => void;\n\n /**\n * Function to set the editing post\n */\n setEditingPost: (postId?: string, refocusId?: string, isRHS?: boolean) => void;\n\n /**\n * Function to pin the post\n */\n pinPost: (postId: string) => void;\n\n /**\n * Function to unpin the post\n */\n unpinPost: (postId: string) => void;\n\n /**\n * Function to open a modal\n */\n openModal: <P>(modalData: ModalData<P>) => void;\n\n /**\n * Function to set the unread mark at given post\n */\n markPostAsUnread: (post: Post, location?: string) => void;\n\n /**\n * Function to set the thread as followed/unfollowed\n */\n setThreadFollow: (userId: string, teamId: string, threadId: string, newState: boolean) => void;\n\n }; // TechDebt: Made non-mandatory while converting to typescript\n\n canEdit: boolean;\n canDelete: boolean;\n userId: string;\n threadId: UserThread['id'];\n isCollapsedThreadsEnabled: boolean;\n isFollowingThread?: boolean;\n isMentionedInRootPost?: boolean;\n threadReplyCount?: number;\n}\n\ntype State = {\n canEdit: boolean;\n canDelete: boolean;\n}\n\nexport class DotMenuClass extends React.PureComponent<Props, State> {\n public static defaultProps: Partial<Props> = {\n isFlagged: false,\n isReadOnly: false,\n location: Locations.CENTER,\n };\n private editDisableAction: DelayedAction;\n private canPostBeForwarded: boolean;\n\n constructor(props: Props) {\n super(props);\n\n this.editDisableAction = new DelayedAction(this.handleEditDisable);\n\n this.state = {\n canEdit: props.canEdit && !props.isReadOnly,\n canDelete: props.canDelete && !props.isReadOnly,\n };\n\n this.canPostBeForwarded = false;\n }\n\n static getDerivedStateFromProps(props: Props) {\n const state: Partial<State> = {\n canEdit: props.canEdit && !props.isReadOnly,\n canDelete: props.canDelete && !props.isReadOnly,\n };\n return state;\n }\n\n disableCanEditPostByTime() {\n const {post, isLicensed} = this.props;\n const {canEdit} = this.state;\n\n const postEditTimeLimit = this.props.postEditTimeLimit || Constants.UNSET_POST_EDIT_TIME_LIMIT;\n\n if (canEdit && isLicensed) {\n if (postEditTimeLimit !== String(Constants.UNSET_POST_EDIT_TIME_LIMIT)) {\n const milliseconds = 1000;\n const timeLeft = (post.create_at + (Number(postEditTimeLimit) * milliseconds)) - Utils.getTimestamp();\n if (timeLeft > 0) {\n this.editDisableAction.fireAfter(timeLeft + milliseconds);\n }\n }\n }\n }\n\n componentDidMount() {\n this.disableCanEditPostByTime();\n }\n\n componentWillUnmount() {\n this.editDisableAction.cancel();\n }\n\n handleEditDisable = () => {\n this.setState({canEdit: false});\n };\n\n handleFlagMenuItemActivated = (e: ChangeEvent) => {\n if (this.props.isFlagged) {\n this.props.actions.unflagPost(this.props.post.id);\n trackDotMenuEvent(e, TELEMETRY_LABELS.UNSAVE);\n } else {\n this.props.actions.flagPost(this.props.post.id);\n trackDotMenuEvent(e, TELEMETRY_LABELS.SAVE);\n }\n };\n\n handleAddReactionMenuItemActivated = () => {\n // to be safe, make sure the handler function has been defined\n if (this.props.handleAddReactionClick) {\n this.props.handleAddReactionClick();\n }\n };\n\n copyLink = (e: ChangeEvent) => {\n Utils.copyToClipboard(`${this.props.teamUrl}/pl/${this.props.post.id}`);\n trackDotMenuEvent(e, TELEMETRY_LABELS.COPY_LINK);\n };\n\n copyText = (e: ChangeEvent) => {\n Utils.copyToClipboard(this.props.post.message_source || this.props.post.message);\n trackDotMenuEvent(e, TELEMETRY_LABELS.COPY_TEXT);\n };\n\n handlePinMenuItemActivated = (e: ChangeEvent): void => {\n if (this.props.post.is_pinned) {\n this.props.actions.unpinPost(this.props.post.id);\n trackDotMenuEvent(e, TELEMETRY_LABELS.UNPIN);\n } else {\n this.props.actions.pinPost(this.props.post.id);\n trackDotMenuEvent(e, TELEMETRY_LABELS.PIN);\n }\n };\n\n handleMarkPostAsUnread = (e: ChangeEvent): void => {\n this.props.actions.markPostAsUnread(this.props.post, this.props.location);\n trackDotMenuEvent(e, TELEMETRY_LABELS.UNREAD);\n };\n\n handleDeleteMenuItemActivated = (e: ChangeEvent): void => {\n const deletePostModalData = {\n modalId: ModalIdentifiers.DELETE_POST,\n dialogType: DeletePostModal,\n dialogProps: {\n post: this.props.post,\n isRHS: this.props.location === Locations.RHS_ROOT || this.props.location === Locations.RHS_COMMENT,\n },\n };\n\n this.props.actions.openModal(deletePostModalData);\n\n trackDotMenuEvent(e, TELEMETRY_LABELS.DELETE);\n };\n\n handleMoveThreadMenuItemActivated = (e: ChangeEvent): void => {\n e.preventDefault();\n if (!this.props.canMove) {\n return;\n }\n\n trackDotMenuEvent(e, TELEMETRY_LABELS.MOVE_THREAD);\n const moveThreadModalData = {\n modalId: ModalIdentifiers.MOVE_THREAD_MODAL,\n dialogType: MoveThreadModal,\n dialogProps: {\n post: this.props.post,\n },\n };\n\n this.props.actions.openModal(moveThreadModalData);\n };\n\n handleForwardMenuItemActivated = (e: ChangeEvent): void => {\n if (!this.canPostBeForwarded) {\n // adding this early return since only hiding the Item from the menu is not enough,\n // since a user can always use the Shortcuts to activate the function as well\n return;\n }\n\n trackDotMenuEvent(e, TELEMETRY_LABELS.FORWARD);\n const forwardPostModalData = {\n modalId: ModalIdentifiers.FORWARD_POST_MODAL,\n dialogType: ForwardPostModal,\n dialogProps: {\n post: this.props.post,\n },\n };\n\n this.props.actions.openModal(forwardPostModalData);\n };\n\n handleEditMenuItemActivated = (e: ChangeEvent): void => {\n this.props.handleDropdownOpened?.(false);\n this.props.actions.setEditingPost(\n this.props.post.id,\n this.props.location === Locations.CENTER ? 'post_textbox' : 'reply_textbox',\n this.props.location === Locations.RHS_ROOT || this.props.location === Locations.RHS_COMMENT || this.props.location === Locations.SEARCH,\n );\n trackDotMenuEvent(e, TELEMETRY_LABELS.EDIT);\n };\n\n handleSetThreadFollow = (e: ChangeEvent) => {\n const {actions, teamId, threadId, userId, isFollowingThread, isMentionedInRootPost} = this.props;\n let followingThread: boolean;\n\n // This is required as post with mention doesn't have isFollowingThread property set to true but user with mention is following, so we will get null as value kind of hack for this.\n\n if (isFollowingThread === null) {\n followingThread = !isMentionedInRootPost;\n } else {\n followingThread = !isFollowingThread;\n }\n if (followingThread) {\n trackDotMenuEvent(e, TELEMETRY_LABELS.FOLLOW);\n } else {\n trackDotMenuEvent(e, TELEMETRY_LABELS.UNFOLLOW);\n }\n actions.setThreadFollow(\n userId,\n teamId,\n threadId,\n followingThread,\n );\n };\n\n handleCommentClick = (e: ChangeEvent) => {\n trackDotMenuEvent(e, TELEMETRY_LABELS.REPLY);\n this.props.handleCommentClick?.(e);\n };\n\n handleMenuKeydown = (event: React.KeyboardEvent<HTMLDivElement>, forceCloseMenu?: (() => void)) => {\n event.preventDefault();\n\n if (!forceCloseMenu) {\n return;\n }\n\n const isShiftKeyPressed = event.shiftKey;\n\n switch (true) {\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.R):\n forceCloseMenu();\n this.handleCommentClick(event);\n break;\n\n // edit post\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.E):\n forceCloseMenu();\n this.handleEditMenuItemActivated(event);\n break;\n\n // follow thread\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.F) && !isShiftKeyPressed:\n forceCloseMenu();\n this.handleSetThreadFollow(event);\n break;\n\n // forward post\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.F) && isShiftKeyPressed:\n forceCloseMenu();\n this.handleForwardMenuItemActivated(event);\n break;\n\n // copy link\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.K):\n forceCloseMenu();\n this.copyLink(event);\n break;\n\n // copy text\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.C):\n forceCloseMenu();\n this.copyText(event);\n break;\n\n // delete post\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.DELETE):\n forceCloseMenu();\n this.handleDeleteMenuItemActivated(event);\n break;\n\n // move thread\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.W):\n forceCloseMenu();\n this.handleMoveThreadMenuItemActivated(event);\n break;\n\n // pin / unpin\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.P):\n forceCloseMenu();\n this.handlePinMenuItemActivated(event);\n break;\n\n // save / unsave\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.S):\n forceCloseMenu();\n this.handleFlagMenuItemActivated(event);\n break;\n\n // mark as unread\n case Keyboard.isKeyPressed(event, Constants.KeyCodes.U):\n forceCloseMenu();\n this.handleMarkPostAsUnread(event);\n break;\n }\n };\n\n handleMenuToggle = (open: boolean) => {\n this.props.handleDropdownOpened?.(open);\n };\n\n render(): JSX.Element {\n const {formatMessage} = this.props.intl;\n const isFollowingThread = this.props.isFollowingThread ?? this.props.isMentionedInRootPost;\n const isMobile = this.props.isMobileView;\n const isSystemMessage = PostUtils.isSystemMessage(this.props.post);\n\n this.canPostBeForwarded = !(isSystemMessage);\n\n const forwardPostItemText = (\n <span className={'dot-menu__item-new-badge'}>\n <FormattedMessage\n id='forward_post_button.label'\n defaultMessage='Forward'\n />\n </span>\n );\n\n const unFollowThreadLabel = (\n <FormattedMessage\n id='threading.threadMenu.unfollow'\n defaultMessage='Unfollow thread'\n />);\n\n const unFollowMessageLabel = (\n <FormattedMessage\n id='threading.threadMenu.unfollowMessage'\n defaultMessage='Unfollow message'\n />);\n\n const followThreadLabel = (\n <FormattedMessage\n id='threading.threadMenu.follow'\n defaultMessage='Follow thread'\n />);\n\n const followMessageLabel = (\n <FormattedMessage\n id='threading.threadMenu.followMessage'\n defaultMessage='Follow message'\n />);\n\n const followPostLabel = () => {\n if (isFollowingThread) {\n return this.props.threadReplyCount ? unFollowThreadLabel : unFollowMessageLabel;\n }\n return this.props.threadReplyCount ? followThreadLabel : followMessageLabel;\n };\n\n const removeFlag = (\n <FormattedMessage\n id='rhs_root.mobile.unflag'\n defaultMessage='Remove from Saved'\n />\n );\n\n const saveFlag = (\n <FormattedMessage\n id='rhs_root.mobile.flag'\n defaultMessage='Save'\n />\n );\n\n const pinPost = (\n <FormattedMessage\n id='post_info.pin'\n defaultMessage='Pin'\n />\n );\n\n const unPinPost = (\n <FormattedMessage\n id='post_info.unpin'\n defaultMessage='Unpin'\n />\n );\n\n return (\n <Menu.Container\n menuButton={{\n id: `${this.props.location}_button_${this.props.post.id}`,\n dateTestId: `PostDotMenu-Button-${this.props.post.id}`,\n class: classNames('post-menu__item', {\n 'post-menu__item--active': this.props.isMenuOpen,\n }),\n 'aria-label': formatMessage({id: 'post_info.dot_menu.tooltip.more', defaultMessage: 'More'}).toLowerCase(),\n children: <DotsHorizontalIcon size={16}/>,\n }}\n menu={{\n id: `${this.props.location}_dropdown_${this.props.post.id}`,\n 'aria-label': formatMessage({id: 'post_info.menuAriaLabel', defaultMessage: 'Post extra options'}),\n onKeyDown: this.handleMenuKeydown,\n width: '264px',\n onToggle: this.handleMenuToggle,\n }}\n menuButtonTooltip={{\n text: formatMessage({id: 'post_info.dot_menu.tooltip.more', defaultMessage: 'More'}),\n class: 'hidden-xs',\n }}\n >\n {!isSystemMessage && this.props.location === Locations.CENTER &&\n <Menu.Item\n id={`reply_to_post_${this.props.post.id}`}\n data-testid={`reply_to_post_${this.props.post.id}`}\n labels={\n <FormattedMessage\n id='post_info.reply'\n defaultMessage='Reply'\n />\n }\n leadingElement={<ReplyOutlineIcon size={18}/>}\n trailingElements={<ShortcutKey shortcutKey='R'/>}\n onClick={this.handleCommentClick}\n />\n }\n {this.canPostBeForwarded &&\n <Menu.Item\n id={`forward_post_${this.props.post.id}`}\n data-testid={`forward_post_${this.props.post.id}`}\n labels={forwardPostItemText}\n isLabelsRowLayout={true}\n leadingElement={<ArrowRightBoldOutlineIcon size={18}/>}\n trailingElements={<ShortcutKey shortcutKey='Shift + F'/>}\n onClick={this.handleForwardMenuItemActivated}\n />\n }\n {Boolean(isMobile && !isSystemMessage && !this.props.isReadOnly && this.props.enableEmojiPicker) &&\n <ChannelPermissionGate\n channelId={this.props.post.channel_id}\n teamId={this.props.teamId}\n permissions={[Permissions.ADD_REACTION]}\n >\n <Menu.Item\n id={`post_reaction_${this.props.post.id}`}\n data-testid={`post_reaction_${this.props.post.id}`}\n labels={\n <FormattedMessage\n id='rhs_root.mobile.add_reaction'\n defaultMessage='Add Reaction'\n />\n }\n leadingElement={<EmoticonPlusOutlineIcon size={18}/>}\n onClick={this.handleAddReactionMenuItemActivated}\n />\n </ChannelPermissionGate>\n }\n {Boolean(\n !isSystemMessage &&\n this.props.isCollapsedThreadsEnabled &&\n (this.props.location === Locations.CENTER ||\n this.props.location === Locations.RHS_ROOT ||\n this.props.location === Locations.RHS_COMMENT)) &&\n <Menu.Item\n id={`follow_post_thread_${this.props.post.id}`}\n data-testid={`follow_post_thread_${this.props.post.id}`}\n trailingElements={<ShortcutKey shortcutKey='F'/>}\n labels={followPostLabel()}\n leadingElement={\n isFollowingThread ? (\n <MessageMinusOutlineIcon size={18}/>\n ) : (\n <MessageCheckOutlineIcon size={18}/>\n )\n }\n onClick={this.handleSetThreadFollow}\n />\n }\n {Boolean(!isSystemMessage && !this.props.channelIsArchived && this.props.location !== Locations.SEARCH) &&\n <Menu.Item\n id={`unread_post_${this.props.post.id}`}\n data-testid={`unread_post_${this.props.post.id}`}\n labels={\n <FormattedMessage\n id='post_info.unread'\n defaultMessage='Mark as Unread'\n />\n }\n leadingElement={<MarkAsUnreadIcon size={18}/>}\n trailingElements={<ShortcutKey shortcutKey='U'/>}\n onClick={this.handleMarkPostAsUnread}\n />\n }\n {!isSystemMessage &&\n <PostReminderSubMenu\n userId={this.props.userId}\n post={this.props.post}\n isMilitaryTime={this.props.isMilitaryTime}\n timezone={this.props.timezone}\n />\n }\n {!isSystemMessage &&\n <Menu.Item\n id={`save_post_${this.props.post.id}`}\n data-testid={`save_post_${this.props.post.id}`}\n labels={this.props.isFlagged ? removeFlag : saveFlag}\n leadingElement={this.props.isFlagged ? <BookmarkIcon size={18}/> : <BookmarkOutlineIcon size={18}/>}\n trailingElements={<ShortcutKey shortcutKey='S'/>}\n onClick={this.handleFlagMenuItemActivated}\n />\n }\n {Boolean(!isSystemMessage && !this.props.isReadOnly) &&\n <Menu.Item\n id={`${this.props.post.is_pinned ? 'unpin' : 'pin'}_post_${this.props.post.id}`}\n data-testid={`pin_post_${this.props.post.id}`}\n labels={this.props.post.is_pinned ? unPinPost : pinPost}\n leadingElement={this.props.post.is_pinned ? <PinIcon size={18}/> : <PinOutlineIcon size={18}/>}\n trailingElements={<ShortcutKey shortcutKey='P'/>}\n onClick={this.handlePinMenuItemActivated}\n />\n }\n {Boolean(!isSystemMessage && this.props.canMove) &&\n <Menu.Item\n id={`move_thread_${this.props.post.id}`}\n labels={\n <FormattedMessage\n id={'post_info.move_thread'}\n defaultMessage={'Move Thread'}\n />}\n leadingElement={<MessageArrowRightOutlineIcon size={18}/>}\n trailingElements={<ShortcutKey shortcutKey='W'/>}\n onClick={this.handleMoveThreadMenuItemActivated}\n />\n }\n {!isSystemMessage && (this.state.canEdit || this.state.canDelete) && <Menu.Separator/>}\n {!isSystemMessage &&\n <Menu.Item\n id={`permalink_${this.props.post.id}`}\n data-testid={`permalink_${this.props.post.id}`}\n labels={\n <FormattedMessage\n id='post_info.permalink'\n defaultMessage='Copy Link'\n />}\n leadingElement={<LinkVariantIcon size={18}/>}\n trailingElements={<ShortcutKey shortcutKey='K'/>}\n onClick={this.copyLink}\n />\n }\n {!isSystemMessage && <Menu.Separator/>}\n {this.state.canEdit &&\n <Menu.Item\n id={`edit_post_${this.props.post.id}`}\n data-testid={`edit_post_${this.props.post.id}`}\n labels={\n <FormattedMessage\n id='post_info.edit'\n defaultMessage='Edit'\n />}\n leadingElement={<PencilOutlineIcon size={18}/>}\n trailingElements={<ShortcutKey shortcutKey='E'/>}\n onClick={this.handleEditMenuItemActivated}\n />\n }\n {!isSystemMessage &&\n <Menu.Item\n id={`copy_${this.props.post.id}`}\n data-testid={`copy_${this.props.post.id}`}\n labels={\n <FormattedMessage\n id='post_info.copy'\n defaultMessage='Copy Text'\n />}\n leadingElement={<ContentCopyIcon size={18}/>}\n trailingElements={<ShortcutKey shortcutKey='C'/>}\n onClick={this.copyText}\n />\n }\n {this.state.canDelete &&\n <Menu.Item\n id={`delete_post_${this.props.post.id}`}\n data-testid={`delete_post_${this.props.post.id}`}\n leadingElement={<TrashCanOutlineIcon size={18}/>}\n trailingElements={<span>{'delete'}</span>}\n labels={\n <FormattedMessage\n id='post_info.del'\n defaultMessage='Delete'\n />}\n onClick={this.handleDeleteMenuItemActivated}\n isDestructive={true}\n />\n }\n </Menu.Container>\n );\n }\n}\n\nexport default injectIntl(DotMenuClass);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {setThreadFollow} from 'mattermost-redux/actions/threads';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getLicense, getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getBool, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeamId, getCurrentTeam, getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {makeGetThreadOrSynthetic} from 'mattermost-redux/selectors/entities/threads';\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\nimport {getCurrentUserId, getCurrentUserMentionKeys} from 'mattermost-redux/selectors/entities/users';\nimport {isSystemMessage} from 'mattermost-redux/utils/post_utils';\n\nimport {\n flagPost,\n unflagPost,\n pinPost,\n unpinPost,\n setEditingPost,\n markPostAsUnread,\n} from 'actions/post_actions';\nimport {openModal} from 'actions/views/modals';\nimport {makeCanWrangler} from 'selectors/posts';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport {Locations, Preferences} from 'utils/constants';\nimport * as PostUtils from 'utils/post_utils';\nimport {matchUserMentionTriggersWithMessageMentions} from 'utils/post_utils';\nimport {allAtMentions} from 'utils/text_formatting';\nimport {getSiteURL} from 'utils/url';\n\nimport type {GlobalState} from 'types/store';\n\nimport DotMenu from './dot_menu';\n\ntype Props = {\n post: Post;\n isFlagged?: boolean;\n handleCommentClick?: React.EventHandler<React.MouseEvent | React.KeyboardEvent>;\n handleCardClick?: (post: Post) => void;\n handleDropdownOpened: (open: boolean) => void;\n handleAddReactionClick?: () => void;\n isMenuOpen: boolean;\n isReadOnly?: boolean;\n enableEmojiPicker?: boolean;\n location?: ComponentProps<typeof DotMenu>['location'];\n};\n\nfunction makeMapStateToProps() {\n const getThreadOrSynthetic = makeGetThreadOrSynthetic();\n const canWrangler = makeCanWrangler();\n\n return function mapStateToProps(state: GlobalState, ownProps: Props) {\n const {post} = ownProps;\n\n const license = getLicense(state);\n const config = getConfig(state);\n const userId = getCurrentUserId(state);\n const channel = getChannel(state, post.channel_id);\n const currentTeam = getCurrentTeam(state);\n const team = channel ? getTeam(state, channel.team_id) : undefined;\n const teamUrl = `${getSiteURL()}/${team?.name || currentTeam?.name}`;\n const isMilitaryTime = getBool(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.USE_MILITARY_TIME, false);\n\n const systemMessage = isSystemMessage(post);\n const collapsedThreads = isCollapsedThreadsEnabled(state);\n\n const rootId = post.root_id || post.id;\n let threadId = rootId;\n let isFollowingThread = false;\n let isMentionedInRootPost = false;\n let threadReplyCount = 0;\n\n if (\n collapsedThreads &&\n rootId && !systemMessage &&\n (\n\n // default prop location would be CENTER\n !ownProps.location ||\n ownProps.location === Locations.RHS_ROOT ||\n ownProps.location === Locations.RHS_COMMENT ||\n ownProps.location === Locations.CENTER\n )\n ) {\n const root = getPost(state, rootId);\n if (root) {\n const thread = getThreadOrSynthetic(state, root);\n threadReplyCount = thread.reply_count;\n const currentUserMentionKeys = getCurrentUserMentionKeys(state);\n const rootMessageMentionKeys = allAtMentions(root.message);\n isFollowingThread = thread.is_following;\n isMentionedInRootPost = thread.reply_count === 0 &&\n matchUserMentionTriggersWithMessageMentions(currentUserMentionKeys, rootMessageMentionKeys);\n threadId = thread.id;\n }\n }\n\n return {\n channelIsArchived: isArchivedChannel(channel),\n components: state.plugins.components,\n postEditTimeLimit: config.PostEditTimeLimit,\n isLicensed: license.IsLicensed === 'true',\n teamId: getCurrentTeamId(state),\n canEdit: PostUtils.canEditPost(state, post, license, config, channel, userId),\n canDelete: PostUtils.canDeletePost(state, post, channel),\n teamUrl,\n userId,\n threadId,\n isFollowingThread,\n isMentionedInRootPost,\n isCollapsedThreadsEnabled: collapsedThreads,\n threadReplyCount,\n isMobileView: getIsMobileView(state),\n timezone: getCurrentTimezone(state),\n isMilitaryTime,\n canMove: channel ? canWrangler(state, channel.type, threadReplyCount) : false,\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n flagPost,\n unflagPost,\n setEditingPost,\n pinPost,\n unpinPost,\n openModal,\n markPostAsUnread,\n setThreadFollow,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(DotMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback, useEffect, useRef, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport FlagIcon from 'components/widgets/icons/flag_icon';\nimport FlagIconFilled from 'components/widgets/icons/flag_icon_filled';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {Locations, A11yCustomEventTypes} from 'utils/constants';\n\nexport type Actions = {\n flagPost: (postId: string) => void;\n unflagPost: (postId: string) => void;\n}\n\ntype Props = {\n location?: keyof typeof Locations;\n postId: string;\n isFlagged: boolean;\n actions: Actions;\n}\n\nconst PostFlagIcon = ({\n actions: {\n flagPost,\n unflagPost,\n },\n isFlagged,\n postId,\n location = Locations.CENTER,\n}: Props) => {\n const intl = useIntl();\n\n const buttonRef = useRef<HTMLButtonElement>(null);\n const [a11yActive, setA11yActive] = useState(false);\n\n const handlePress = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n\n if (isFlagged) {\n unflagPost(postId);\n } else {\n flagPost(postId);\n }\n }, [flagPost, unflagPost, postId, isFlagged]);\n\n useEffect(() => {\n function handleA11yActivateEvent() {\n setA11yActive(true);\n }\n function handleA11yDeactivateEvent() {\n setA11yActive(false);\n }\n\n if (buttonRef.current) {\n buttonRef.current.addEventListener(A11yCustomEventTypes.ACTIVATE, handleA11yActivateEvent);\n buttonRef.current.addEventListener(A11yCustomEventTypes.DEACTIVATE, handleA11yDeactivateEvent);\n }\n return () => {\n if (buttonRef.current) {\n buttonRef.current.removeEventListener(A11yCustomEventTypes.ACTIVATE, handleA11yActivateEvent);\n buttonRef.current.removeEventListener(A11yCustomEventTypes.DEACTIVATE, handleA11yDeactivateEvent);\n }\n };\n }, []);\n\n useEffect(() => {\n if (a11yActive && buttonRef.current) {\n buttonRef.current.dispatchEvent(new Event(A11yCustomEventTypes.UPDATE));\n }\n }, [a11yActive]);\n\n let flagIcon;\n if (isFlagged) {\n flagIcon = <FlagIconFilled className={classNames('icon', 'icon--small', 'icon--small-filled', {'post-menu__item--selected': isFlagged})}/>;\n } else {\n flagIcon = <FlagIcon className={classNames('icon', 'icon--small')}/>;\n }\n\n return (\n <WithTooltip\n key={`flagtooltipkey${isFlagged ? 'flagged' : ''}`}\n title={\n isFlagged ? (\n <FormattedMessage\n id='flag_post.unflag'\n defaultMessage='Remove from Saved'\n />\n ) : (\n <FormattedMessage\n id='flag_post.flag'\n defaultMessage='Save Message'\n />\n )\n }\n >\n <button\n ref={buttonRef}\n id={`${location}_flagIcon_${postId}`}\n aria-label={isFlagged ? intl.formatMessage({id: 'flag_post.unflag', defaultMessage: 'Remove from Saved'}).toLowerCase() : intl.formatMessage({id: 'flag_post.flag', defaultMessage: 'Save'}).toLowerCase()}\n className='post-menu__item'\n onClick={handlePress}\n >\n {flagIcon}\n </button>\n </WithTooltip>\n );\n};\n\nexport default React.memo(PostFlagIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {flagPost, unflagPost} from 'actions/post_actions';\n\nimport PostFlagIcon from './post_flag_icon';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n flagPost,\n unflagPost,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(PostFlagIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {WrappedComponentProps} from 'react-intl';\nimport {defineMessages, injectIntl} from 'react-intl';\n\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {getEmojiName} from 'mattermost-redux/utils/emoji_utils';\n\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {Locations} from 'utils/constants';\n\nconst TOP_OFFSET = -7;\n\nconst messages = defineMessages({\n addReaction: {\n id: 'post_info.tooltip.add_reactions',\n defaultMessage: 'Add Reaction',\n },\n});\n\nexport type Props = WrappedComponentProps & {\n channelId?: string;\n postId: string;\n teamId: string;\n getDotMenuRef: () => HTMLDivElement | null;\n location?: keyof typeof Locations;\n showEmojiPicker: boolean;\n toggleEmojiPicker: (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n actions: {\n toggleReaction: (postId: string, emojiName: string) => void;\n };\n}\n\ntype State = {\n location: keyof typeof Locations;\n showEmojiPicker: boolean;\n}\n\nexport class PostReaction extends React.PureComponent<Props, State> {\n public static defaultProps: Partial<Props> = {\n location: Locations.CENTER as 'CENTER',\n showEmojiPicker: false,\n };\n\n handleToggleEmoji = (emoji: Emoji): void => {\n this.setState({showEmojiPicker: false});\n const emojiName = getEmojiName(emoji);\n this.props.actions.toggleReaction(this.props.postId, emojiName);\n this.props.toggleEmojiPicker();\n };\n\n render() {\n const {\n channelId,\n location,\n postId,\n showEmojiPicker,\n teamId,\n intl,\n } = this.props;\n\n let spaceRequiredAbove;\n let spaceRequiredBelow;\n if (location === Locations.RHS_ROOT || location === Locations.RHS_COMMENT) {\n spaceRequiredAbove = EmojiPickerOverlay.RHS_SPACE_REQUIRED_ABOVE;\n spaceRequiredBelow = EmojiPickerOverlay.RHS_SPACE_REQUIRED_BELOW;\n }\n\n return (\n <ChannelPermissionGate\n channelId={channelId}\n teamId={teamId}\n permissions={[Permissions.ADD_REACTION]}\n >\n <>\n <EmojiPickerOverlay\n show={showEmojiPicker}\n target={this.props.getDotMenuRef}\n onHide={this.props.toggleEmojiPicker}\n onEmojiClick={this.handleToggleEmoji}\n topOffset={TOP_OFFSET}\n spaceRequiredAbove={spaceRequiredAbove}\n spaceRequiredBelow={spaceRequiredBelow}\n />\n <WithTooltip\n title={messages.addReaction}\n >\n <button\n data-testid='post-reaction-emoji-icon'\n id={`${location}_reaction_${postId}`}\n aria-label={intl.formatMessage({id: 'post_info.tooltip.add_reactions', defaultMessage: 'Add Reaction'})}\n className={classNames('post-menu__item', 'post-menu__item--reactions', {\n 'post-menu__item--active': showEmojiPicker,\n })}\n onClick={this.props.toggleEmojiPicker}\n >\n <EmojiIcon className='icon icon--small'/>\n </button>\n </WithTooltip>\n </>\n </ChannelPermissionGate>\n );\n }\n}\n\nexport default injectIntl(PostReaction);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {toggleReaction} from 'actions/post_actions';\n\nimport PostReaction from './post_reaction';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n toggleReaction,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(PostReaction);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport {getEmojiImageUrl, getEmojiName} from 'mattermost-redux/utils/emoji_utils';\n\ntype Props = {\n emoji: Emoji;\n onItemClick: (emoji: Emoji) => void;\n order?: number;\n}\nconst EmojiItem = ({emoji, onItemClick, order}: Props) => {\n const {formatMessage} = useIntl();\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onItemClick(emoji);\n };\n\n const itemClassName = 'post-menu__item';\n\n const emojiName = getEmojiName(emoji);\n\n return (\n <div\n className={classNames(itemClassName, 'post-menu__emoticon')}\n onClick={handleClick}\n >\n <button\n id={`recent_reaction_${order}`}\n data-testid={itemClassName + '_emoji'}\n className='emoticon--post-menu'\n style={{backgroundImage: `url(${getEmojiImageUrl(emoji)})`, backgroundColor: 'transparent'}}\n aria-label={formatMessage(\n {\n id: 'emoji_picker_item.emoji_aria_label',\n defaultMessage: '{emojiName} emoji',\n },\n {\n emojiName: (emojiName).replace(/_/g, ' '),\n },\n )}\n />\n </div>\n );\n};\n\nexport default EmojiItem;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {getEmojiName} from 'mattermost-redux/utils/emoji_utils';\n\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {Locations} from 'utils/constants';\n\nimport EmojiItem from './recent_reactions_emoji_item';\n\ntype LocationTypes = 'CENTER' | 'RHS_ROOT' | 'RHS_COMMENT';\n\ntype Props = {\n channelId?: string;\n postId: string;\n teamId: string;\n location?: LocationTypes;\n locale: string;\n emojis: Emoji[];\n size: number;\n defaultEmojis: Emoji[];\n actions: {\n toggleReaction: (postId: string, emojiName: string) => void;\n };\n}\n\ntype State = {\n location: LocationTypes;\n}\n\nexport default class PostRecentReactions extends React.PureComponent<Props, State> {\n public static defaultProps: Partial<Props> = {\n location: Locations.CENTER as 'CENTER',\n size: 3,\n };\n\n handleToggleEmoji = (emoji: Emoji): void => {\n const emojiName = getEmojiName(emoji);\n this.props.actions.toggleReaction(this.props.postId, emojiName);\n };\n\n complementEmojis = (emojis: Emoji[]): (Emoji[]) => {\n const additional = this.props.defaultEmojis.filter((e) => {\n let ignore = false;\n for (const emoji of emojis) {\n if (e.name === emoji.name) {\n ignore = true;\n break;\n }\n }\n return !ignore;\n });\n const l = emojis.length;\n for (let i = 0; i < this.props.size - l; i++) {\n emojis.push(additional[i]);\n }\n\n return emojis;\n };\n\n emojiName = (emoji: Emoji, locale: string): string => {\n function capitalizeFirstLetter(s: string) {\n return s[0].toLocaleUpperCase(locale) + s.slice(1);\n }\n const name = getEmojiName(emoji);\n return capitalizeFirstLetter(name.replace(/_/g, ' '));\n };\n\n render() {\n const {\n channelId,\n teamId,\n } = this.props;\n\n let emojis = [...this.props.emojis].slice(0, this.props.size);\n if (emojis.length < this.props.size) {\n emojis = this.complementEmojis(emojis);\n }\n\n return emojis.map((emoji, n) => (\n <ChannelPermissionGate\n key={this.emojiName(emoji, this.props.locale)} // emojis will be unique therefore no duplication expected.\n channelId={channelId}\n teamId={teamId}\n permissions={[Permissions.ADD_REACTION]}\n >\n <WithTooltip\n title={this.emojiName(emoji, this.props.locale)}\n emoji={getEmojiName(emoji)}\n isEmojiLarge={true}\n >\n <div>\n <EmojiItem\n emoji={emoji}\n onItemClick={this.handleToggleEmoji}\n order={n}\n />\n </div>\n </WithTooltip>\n </ChannelPermissionGate>\n ),\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport {toggleReaction} from 'actions/post_actions';\nimport {getEmojiMap} from 'selectors/emojis';\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostReaction from './post_recent_reactions';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n toggleReaction,\n }, dispatch),\n };\n}\n\nfunction mapStateToProps(state: GlobalState) {\n const locale = getCurrentLocale(state);\n const emojiMap = getEmojiMap(state);\n const defaultEmojis = [emojiMap.get('thumbsup'), emojiMap.get('grinning'), emojiMap.get('white_check_mark')] as Emoji[];\n\n return {\n defaultEmojis,\n locale,\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PostReaction);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classnames from 'classnames';\nimport React, {useCallback, useEffect, useRef, useState} from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Emoji} from '@mattermost/types/emojis';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {Posts} from 'mattermost-redux/constants/index';\nimport {isPostEphemeral} from 'mattermost-redux/utils/post_utils';\n\nimport ActionsMenu from 'components/actions_menu';\nimport CommentIcon from 'components/common/comment_icon';\nimport DotMenu from 'components/dot_menu';\nimport PostFlagIcon from 'components/post_view/post_flag_icon';\nimport PostReaction from 'components/post_view/post_reaction';\nimport PostRecentReactions from 'components/post_view/post_recent_reactions';\n\nimport {Locations, Constants} from 'utils/constants';\nimport {isSystemMessage, fromAutoResponder} from 'utils/post_utils';\n\nimport type {PluginComponent} from 'types/store/plugins';\n\ntype Props = {\n post: Post;\n teamId: string;\n isFlagged: boolean;\n removePost: (post: Post) => void;\n enableEmojiPicker?: boolean;\n isReadOnly?: boolean;\n channelIsArchived?: boolean;\n handleCommentClick?: (e: React.MouseEvent) => void;\n handleJumpClick?: (e: React.MouseEvent) => void;\n handleDropdownOpened?: (e: boolean) => void;\n collapsedThreadsEnabled?: boolean;\n shouldShowActionsMenu?: boolean;\n oneClickReactionsEnabled?: boolean;\n recentEmojis: Emoji[];\n isExpanded?: boolean;\n hover?: boolean;\n isMobileView: boolean;\n hasReplies?: boolean;\n isFirstReply?: boolean;\n canReply?: boolean;\n replyCount?: number;\n location: keyof typeof Locations;\n isLastPost?: boolean;\n shortcutReactToLastPostEmittedFrom?: string;\n isPostHeaderVisible?: boolean | null;\n isPostBeingEdited?: boolean;\n canDelete?: boolean;\n pluginActions: PluginComponent[];\n actions: {\n emitShortcutReactToLastPostFrom: (emittedFrom: 'CENTER' | 'RHS_ROOT' | 'NO_WHERE') => void;\n };\n};\n\nconst PostOptions = (props: Props): JSX.Element => {\n const dotMenuRef = useRef<HTMLDivElement>(null);\n\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n const [showDotMenu, setShowDotMenu] = useState(false);\n const [showActionsMenu, setShowActionsMenu] = useState(false);\n\n const toggleEmojiPicker = useCallback(() => {\n setShowEmojiPicker(!showEmojiPicker);\n props.handleDropdownOpened!(!showEmojiPicker);\n }, [props.handleDropdownOpened, showEmojiPicker]);\n\n useEffect(() => {\n const locationToUse = props.location === 'RHS_COMMENT' ? Locations.RHS_ROOT : props.location;\n if (props.isLastPost &&\n (props.shortcutReactToLastPostEmittedFrom === locationToUse) &&\n props.isPostHeaderVisible) {\n toggleEmojiPicker();\n props.actions.emitShortcutReactToLastPostFrom(Locations.NO_WHERE);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.isLastPost, props.shortcutReactToLastPostEmittedFrom, props.location, props.isPostHeaderVisible]);\n\n const {\n channelIsArchived,\n collapsedThreadsEnabled,\n isReadOnly,\n post,\n oneClickReactionsEnabled,\n isMobileView,\n } = props;\n\n const isEphemeral = isPostEphemeral(post);\n const systemMessage = isSystemMessage(post);\n const isFromAutoResponder = fromAutoResponder(post);\n\n function removePost() {\n props.removePost(props.post);\n }\n\n const handleDotMenuOpened = (open: boolean) => {\n setShowDotMenu(open);\n props.handleDropdownOpened!(open);\n };\n\n const handleActionsMenuOpened = (open: boolean) => {\n setShowActionsMenu(open);\n props.handleDropdownOpened!(open);\n };\n\n const getDotMenuRef = () => dotMenuRef.current;\n\n const isPostDeleted = post && post.state === Posts.POST_DELETED;\n const hoverLocal = props.hover || showEmojiPicker || showDotMenu || showActionsMenu;\n const showCommentIcon = isFromAutoResponder || (!systemMessage && (isMobileView ||\n hoverLocal || (!post.root_id && Boolean(props.hasReplies)) ||\n props.isFirstReply) && props.location === Locations.CENTER);\n const commentIconExtraClass = isMobileView ? '' : 'pull-right';\n\n let commentIcon;\n if (showCommentIcon) {\n commentIcon = (\n <CommentIcon\n handleCommentClick={props.handleCommentClick}\n postId={post.id}\n extraClass={commentIconExtraClass}\n commentCount={props.collapsedThreadsEnabled ? 0 : props.replyCount}\n />\n );\n }\n\n const showRecentlyUsedReactions = (!isMobileView && !isReadOnly && !isEphemeral && !post.failed && !systemMessage && !channelIsArchived && oneClickReactionsEnabled && props.enableEmojiPicker && hoverLocal);\n\n let showRecentReactions: ReactNode;\n if (showRecentlyUsedReactions) {\n const showMoreReactions = props.isExpanded ||\n props.location === 'CENTER' ||\n (document.getElementById('sidebar-right')?.getBoundingClientRect().width ?? 0) > Constants.SIDEBAR_MINIMUM_WIDTH;\n\n showRecentReactions = (\n <PostRecentReactions\n channelId={post.channel_id}\n postId={post.id}\n teamId={props.teamId}\n emojis={props.recentEmojis}\n size={showMoreReactions ? 3 : 1}\n />\n );\n }\n\n const showReactionIcon = !systemMessage && !isReadOnly && !isEphemeral && !post.failed && props.enableEmojiPicker && !channelIsArchived;\n let postReaction;\n if (showReactionIcon) {\n postReaction = (\n <PostReaction\n channelId={post.channel_id}\n location={props.location}\n postId={post.id}\n teamId={props.teamId}\n getDotMenuRef={getDotMenuRef}\n showEmojiPicker={showEmojiPicker}\n toggleEmojiPicker={toggleEmojiPicker}\n />\n );\n }\n\n let flagIcon: ReactNode = null;\n if (!isMobileView && (!isEphemeral && !post.failed && !systemMessage)) {\n flagIcon = (\n <PostFlagIcon\n location={props.location}\n postId={post.id}\n isFlagged={props.isFlagged}\n />\n );\n }\n\n // Action menus\n const showActionsMenuIcon = props.shouldShowActionsMenu && (isMobileView || hoverLocal);\n const actionsMenu = showActionsMenuIcon && (\n <ActionsMenu\n post={post}\n location={props.location}\n handleDropdownOpened={handleActionsMenuOpened}\n isMenuOpen={showActionsMenu}\n />\n );\n\n let pluginItems: ReactNode = null;\n if ((!isEphemeral && !post.failed && !systemMessage) && hoverLocal) {\n pluginItems = props.pluginActions?.\n map((item) => {\n if (item.component) {\n const Component = item.component as any;\n return (\n <Component\n post={props.post}\n key={item.id}\n />\n );\n }\n return null;\n }) || [];\n }\n\n const dotMenu = (\n <DotMenu\n post={props.post}\n location={props.location}\n isFlagged={props.isFlagged}\n handleDropdownOpened={handleDotMenuOpened}\n handleCommentClick={props.handleCommentClick}\n handleAddReactionClick={toggleEmojiPicker}\n isReadOnly={isReadOnly || channelIsArchived}\n isMenuOpen={showDotMenu}\n enableEmojiPicker={props.enableEmojiPicker}\n />\n );\n\n // Build post options\n let options: ReactNode;\n if (isEphemeral) {\n options = (\n <div className='col col__remove'>\n <button\n className='post__remove theme color--link style--none'\n onClick={removePost}\n >\n {'×'}\n </button>\n </div>\n );\n } else if (isPostDeleted || (systemMessage && !props.canDelete)) {\n options = null;\n } else if (props.location === Locations.SEARCH) {\n const hasCRTFooter = props.collapsedThreadsEnabled && !post.root_id && (post.reply_count > 0 || post.is_following);\n options = (\n <div className='col__controls post-menu'>\n {dotMenu}\n {flagIcon}\n {props.canReply && !hasCRTFooter &&\n <CommentIcon\n location={props.location}\n handleCommentClick={props.handleCommentClick}\n commentCount={props.replyCount}\n postId={post.id}\n searchStyle={'search-item__comment'}\n extraClass={props.replyCount ? 'icon--visible' : ''}\n />\n }\n <a\n href='#'\n onClick={props.handleJumpClick}\n className='search-item__jump'\n >\n <FormattedMessage\n id='search_item.jump'\n defaultMessage='Jump'\n />\n </a>\n </div>\n );\n } else if (!props.isPostBeingEdited) {\n options = (\n <div\n ref={dotMenuRef}\n data-testid={`post-menu-${props.post.id}`}\n className={classnames('col post-menu', {'post-menu--position': !hoverLocal && showCommentIcon})}\n >\n {!collapsedThreadsEnabled && !showRecentlyUsedReactions && dotMenu}\n {showRecentReactions}\n {postReaction}\n {flagIcon}\n {pluginItems}\n {actionsMenu}\n {commentIcon}\n {(collapsedThreadsEnabled || showRecentlyUsedReactions) && dotMenu}\n </div>\n );\n }\n\n return <>{options}</>;\n};\n\nexport default PostOptions;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {setStatusDropdown} from 'actions/views/status_dropdown';\nimport {makeGetCustomStatus, showPostHeaderUpdateStatusButton, isCustomStatusEnabled} from 'selectors/views/custom_status';\n\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\n\nimport type {GlobalState} from 'types/store';\n\ninterface ComponentProps {\n userId: string;\n isSystemMessage: boolean;\n isBot: boolean;\n}\n\nconst PostHeaderCustomStatus = (props: ComponentProps) => {\n const getCustomStatus = useMemo(makeGetCustomStatus, []);\n const {userId, isSystemMessage, isBot} = props;\n const dispatch = useDispatch();\n const userCustomStatus = useSelector((state: GlobalState) => getCustomStatus(state, userId));\n const showUpdateStatusButton = useSelector(showPostHeaderUpdateStatusButton);\n const customStatusEnabled = useSelector(isCustomStatusEnabled);\n\n const isCustomStatusSet = userCustomStatus && userCustomStatus.emoji;\n if (!customStatusEnabled || isSystemMessage || isBot) {\n return null;\n }\n\n if (isCustomStatusSet) {\n return (\n <CustomStatusEmoji\n userID={userId}\n showTooltip={true}\n emojiStyle={{\n marginTop: 2,\n }}\n />\n );\n }\n\n // This must be checked after checking that custom status is not null\n if (!showUpdateStatusButton) {\n return null;\n }\n\n const updateStatus = (event: React.MouseEvent) => {\n event.preventDefault();\n dispatch(setStatusDropdown(true));\n };\n\n return (\n <button\n onClick={updateStatus}\n className='post__header-set-custom-status cursor--pointer style--none'\n >\n <EmojiIcon className='post__header-set-custom-status-icon'/>\n <span className='post__header-set-custom-status-text'>\n <FormattedMessage\n id='post_header.update_status'\n defaultMessage='Update your status'\n />\n </span>\n </button>\n );\n};\n\nexport default PostHeaderCustomStatus;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {ensureString} from 'mattermost-redux/utils/post_utils';\n\nimport PostHeaderCustomStatus from 'components/post_view/post_header_custom_status/post_header_custom_status';\nimport UserProfile from 'components/user_profile';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport Tag from 'components/widgets/tag/tag';\n\nimport {fromAutoResponder, isFromWebhook} from 'utils/post_utils';\n\ntype Props = {\n post: Post;\n compactDisplay?: boolean;\n colorizeUsernames?: boolean;\n enablePostUsernameOverride?: boolean;\n isConsecutivePost?: boolean;\n isBot: boolean;\n isSystemMessage: boolean;\n isMobileView: boolean;\n};\n\nconst PostUserProfile = (props: Props): JSX.Element | null => {\n const intl = useIntl();\n const {post, compactDisplay, isMobileView, isConsecutivePost, enablePostUsernameOverride, isBot, isSystemMessage, colorizeUsernames} = props;\n const isFromAutoResponder = fromAutoResponder(post);\n const colorize = compactDisplay && colorizeUsernames;\n\n let userProfile: ReactNode = null;\n let botIndicator = null;\n let colon = null;\n\n if (props.compactDisplay) {\n colon = <strong className='colon'>{':'}</strong>;\n }\n\n const customStatus = (\n <PostHeaderCustomStatus\n userId={props.post.user_id}\n isBot={props.isBot || post.props.from_webhook === 'true'}\n isSystemMessage={isSystemMessage}\n />\n );\n\n if (compactDisplay || isMobileView) {\n userProfile = (\n <UserProfile\n userId={post.user_id}\n channelId={post.channel_id}\n colorize={colorize}\n />\n );\n }\n\n if (isConsecutivePost) {\n userProfile = (\n <UserProfile\n userId={post.user_id}\n channelId={post.channel_id}\n colorize={colorize}\n />\n );\n } else {\n userProfile = (\n <UserProfile\n userId={post.user_id}\n channelId={post.channel_id}\n colorize={colorize}\n />\n );\n\n if (isFromWebhook(post)) {\n const propOverrideName = ensureString(post.props.override_username);\n const overwriteName = propOverrideName && enablePostUsernameOverride ? propOverrideName : undefined;\n const propOverrideIcon = ensureString(post.props.override_icon_url);\n const overwriteIcon = propOverrideIcon || undefined;\n userProfile = (\n <UserProfile\n userId={post.user_id}\n channelId={post.channel_id}\n hideStatus={true}\n overwriteName={overwriteName}\n colorize={colorize}\n overwriteIcon={overwriteIcon}\n />\n );\n\n // user profile component checks and add bot tag in case webhook is from bot account, but if webhook is from user account we need this.\n\n if (!isBot) {\n botIndicator = (<BotTag/>);\n }\n } else if (isFromAutoResponder) {\n userProfile = (\n <span className='auto-responder'>\n <UserProfile\n userId={post.user_id}\n channelId={post.channel_id}\n hideStatus={true}\n colorize={colorize}\n />\n </span>\n );\n botIndicator = (\n <Tag\n text={\n <FormattedMessage\n id='post_info.auto_responder'\n defaultMessage='AUTOMATIC REPLY'\n />\n }\n />\n );\n } else if (isSystemMessage && isBot) {\n userProfile = (\n <UserProfile\n userId={post.user_id}\n channelId={post.channel_id}\n hideStatus={true}\n colorize={colorize}\n />\n );\n } else if (isSystemMessage) {\n userProfile = (\n <UserProfile\n overwriteName={intl.formatMessage({\n id: 'post_info.system',\n defaultMessage: 'System',\n })}\n userId={post.user_id}\n disablePopover={true}\n channelId={post.channel_id}\n colorize={colorize}\n />\n );\n }\n }\n\n return (<div className='col col__name'>\n {userProfile}\n {colon}\n {botIndicator}\n {customStatus}\n </div>);\n};\n\nexport default PostUserProfile;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Emoji} from '@mattermost/types/emojis';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {General} from 'mattermost-redux/constants';\nimport {getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getPost, makeGetCommentCountForPost, makeIsPostCommentMention, isPostAcknowledgementsEnabled, isPostPriorityEnabled, isPostFlagged} from 'mattermost-redux/selectors/entities/posts';\nimport type {UserActivityPost} from 'mattermost-redux/selectors/entities/posts';\nimport {\n get,\n getBool,\n isCollapsedThreadsEnabled,\n} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeam, getTeam, getTeamMemberships} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId, getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {markPostAsUnread, emitShortcutReactToLastPostFrom} from 'actions/post_actions';\nimport {closeRightHandSide, selectPost, setRhsExpanded, selectPostCard, selectPostFromRightHandSideSearch} from 'actions/views/rhs';\nimport {getShortcutReactToLastPostEmittedFrom, getOneClickReactionEmojis} from 'selectors/emojis';\nimport {getIsPostBeingEdited, getIsPostBeingEditedInRHS, isEmbedVisible} from 'selectors/posts';\nimport {getHighlightedPostId, getRhsState, getSelectedPostCard} from 'selectors/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport {Locations, Preferences, RHSStates} from 'utils/constants';\nimport {areConsecutivePostsBySameUser, canDeletePost, shouldShowActionsMenu, shouldShowDotMenu} from 'utils/post_utils';\nimport {getDisplayNameByUser} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport {removePostCloseRHSDeleteDraft} from './actions';\nimport PostComponent from './post_component';\n\ntype OwnProps = {\n post?: Post | UserActivityPost;\n previousPostId?: string;\n postId?: string;\n shouldHighlight?: boolean;\n location: keyof typeof Locations;\n};\n\nfunction isFirstReply(post: Post, previousPost?: Post | null): boolean {\n if (post.root_id) {\n if (previousPost) {\n // Returns true as long as the previous post is part of a different thread\n return post.root_id !== previousPost.id && post.root_id !== previousPost.root_id;\n }\n\n // The previous post is not a real post\n return true;\n }\n\n // This post is not a reply\n return false;\n}\n\nfunction isConsecutivePost(state: GlobalState, ownProps: OwnProps) {\n let post;\n if (ownProps.postId) {\n post = getPost(state, ownProps.postId);\n } else if (ownProps.post) {\n post = ownProps.post;\n }\n const previousPost = ownProps.previousPostId && getPost(state, ownProps.previousPostId);\n\n let consecutivePost = false;\n\n if (previousPost && post && !post.metadata?.priority?.priority) {\n consecutivePost = areConsecutivePostsBySameUser(post, previousPost);\n }\n return consecutivePost;\n}\n\nfunction makeMapStateToProps() {\n const isPostCommentMention = makeIsPostCommentMention();\n const getReplyCount = makeGetCommentCountForPost();\n\n return function mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n let post;\n if (ownProps.post) {\n post = ownProps.post;\n } else if (ownProps.postId) {\n post = getPost(state, ownProps.postId);\n }\n if (!post) {\n return null;\n }\n let parentPost;\n let parentPostUser;\n\n if (post.root_id) {\n parentPost = getPost(state, post.root_id);\n parentPostUser = parentPost ? getUser(state, parentPost.user_id) : null;\n }\n\n const config = getConfig(state);\n const enableEmojiPicker = config.EnableEmojiPicker === 'true';\n const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n const channel = state.entities.channels.channels[post.channel_id];\n const shortcutReactToLastPostEmittedFrom = getShortcutReactToLastPostEmittedFrom(state);\n\n const user = getUser(state, post.user_id);\n const isBot = Boolean(user && user.is_bot);\n const highlightedPostId = getHighlightedPostId(state);\n\n const selectedCard = getSelectedPostCard(state);\n\n let emojis: Emoji[] = [];\n const oneClickReactionsEnabled = get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.ONE_CLICK_REACTIONS_ENABLED, Preferences.ONE_CLICK_REACTIONS_ENABLED_DEFAULT) === 'true';\n if (oneClickReactionsEnabled) {\n emojis = getOneClickReactionEmojis(state);\n }\n\n let previousPost = null;\n if (ownProps.previousPostId) {\n previousPost = getPost(state, ownProps.previousPostId);\n }\n\n let previousPostIsComment = false;\n\n if (previousPost && !post.props.priority) {\n previousPostIsComment = Boolean(previousPost.root_id);\n }\n\n const currentTeam = getCurrentTeam(state);\n const team = getTeam(state, channel.team_id);\n let teamName = currentTeam?.name;\n let teamDisplayName;\n\n const memberships = getTeamMemberships(state);\n const isDMorGM = channel.type === General.DM_CHANNEL || channel.type === General.GM_CHANNEL;\n const rhsState = getRhsState(state);\n if (\n rhsState !== RHSStates.PIN && // Not show in pinned posts since they are all for the same channel\n !isDMorGM && // Not show for DM or GMs since they don't belong to a team\n memberships && Object.values(memberships).length > 1 // Not show if the user only belongs to one team\n ) {\n teamDisplayName = team?.display_name;\n teamName = team?.name || currentTeam?.name;\n }\n\n const canReply = isDMorGM || (channel.team_id === currentTeam?.id);\n const directTeammate = getDirectTeammate(state, channel.id);\n\n const previewCollapsed = get(\n state,\n Preferences.CATEGORY_DISPLAY_SETTINGS,\n Preferences.COLLAPSE_DISPLAY,\n Preferences.COLLAPSE_DISPLAY_DEFAULT,\n );\n\n const previewEnabled = getBool(\n state,\n Preferences.CATEGORY_DISPLAY_SETTINGS,\n Preferences.LINK_PREVIEW_DISPLAY,\n Preferences.LINK_PREVIEW_DISPLAY_DEFAULT === 'true',\n );\n\n return {\n enableEmojiPicker,\n enablePostUsernameOverride,\n isEmbedVisible: isEmbedVisible(state, post.id),\n isReadOnly: false,\n currentUserId: getCurrentUserId(state),\n isFirstReply: previousPost ? isFirstReply(post, previousPost) : false,\n hasReplies: getReplyCount(state, post) > 0,\n replyCount: getReplyCount(state, post),\n canReply,\n pluginPostTypes: state.plugins.postTypes,\n channelIsArchived: isArchivedChannel(channel),\n isConsecutivePost: isConsecutivePost(state, ownProps),\n previousPostIsComment,\n isFlagged: isPostFlagged(state, post.id),\n compactDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT) === Preferences.MESSAGE_DISPLAY_COMPACT,\n colorizeUsernames: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.COLORIZE_USERNAMES, Preferences.COLORIZE_USERNAMES_DEFAULT) === 'true',\n shouldShowActionsMenu: shouldShowActionsMenu(state, post),\n currentTeam,\n team,\n shortcutReactToLastPostEmittedFrom,\n isBot,\n collapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n shouldHighlight: ownProps.shouldHighlight || highlightedPostId === post.id,\n oneClickReactionsEnabled,\n recentEmojis: emojis,\n center: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_CENTERED,\n isCollapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n isExpanded: state.views.rhs.isSidebarExpanded,\n isPostBeingEdited: ownProps.location === Locations.CENTER ? !getIsPostBeingEditedInRHS(state, post.id) && getIsPostBeingEdited(state, post.id) : getIsPostBeingEditedInRHS(state, post.id),\n isMobileView: getIsMobileView(state),\n previewCollapsed,\n previewEnabled,\n post,\n channelName: channel.display_name,\n channelType: channel.type,\n teamDisplayName,\n displayName: getDisplayNameByUser(state, directTeammate),\n teamName,\n isFlaggedPosts: rhsState === RHSStates.FLAG,\n isPinnedPosts: rhsState === RHSStates.PIN,\n clickToReply: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CLICK_TO_REPLY, Preferences.CLICK_TO_REPLY_DEFAULT) === 'true',\n isCommentMention: isPostCommentMention(state, post.id),\n parentPost,\n parentPostUser,\n isPostAcknowledgementsEnabled: isPostAcknowledgementsEnabled(state),\n isPostPriorityEnabled: isPostPriorityEnabled(state),\n isCardOpen: selectedCard && selectedCard.id === post.id,\n shouldShowDotMenu: shouldShowDotMenu(state, post, channel),\n canDelete: canDeletePost(state, post, channel),\n pluginActions: state.plugins.components.PostAction,\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n markPostAsUnread,\n emitShortcutReactToLastPostFrom,\n selectPost,\n selectPostFromRightHandSideSearch,\n setRhsExpanded,\n removePost: removePostCloseRHSDeleteDraft,\n closeRightHandSide,\n selectPostCard,\n }, dispatch),\n };\n}\n\nconst connector = connect(makeMapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>\n\nexport default connector(PostComponent);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback, useEffect, useRef, useState, useMemo} from 'react';\nimport type {MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Emoji} from '@mattermost/types/emojis';\nimport type {Post} from '@mattermost/types/posts';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Posts} from 'mattermost-redux/constants/index';\nimport {\n isMeMessage as checkIsMeMessage,\n isPostPendingOrFailed} from 'mattermost-redux/utils/post_utils';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport AutoHeightSwitcher, {AutoHeightSlots} from 'components/common/auto_height_switcher';\nimport EditPost from 'components/edit_post';\nimport FileAttachmentListContainer from 'components/file_attachment_list';\nimport MessageWithAdditionalContent from 'components/message_with_additional_content';\nimport PriorityLabel from 'components/post_priority/post_priority_label';\nimport PostProfilePicture from 'components/post_profile_picture';\nimport PostAcknowledgements from 'components/post_view/acknowledgements';\nimport CommentedOn from 'components/post_view/commented_on/commented_on';\nimport DateSeparator from 'components/post_view/date_separator';\nimport FailedPostOptions from 'components/post_view/failed_post_options';\nimport PostAriaLabelDiv from 'components/post_view/post_aria_label_div';\nimport PostBodyAdditionalContent from 'components/post_view/post_body_additional_content';\nimport PostMessageContainer from 'components/post_view/post_message_view';\nimport PostPreHeader from 'components/post_view/post_pre_header';\nimport PostTime from 'components/post_view/post_time';\nimport ReactionList from 'components/post_view/reaction_list';\nimport ThreadFooter from 'components/threading/channel_threads/thread_footer';\nimport type {Props as TimestampProps} from 'components/timestamp/timestamp';\nimport ArchiveIcon from 'components/widgets/icons/archive_icon';\nimport InfoSmallIcon from 'components/widgets/icons/info_small_icon';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants, {A11yCustomEventTypes, AppEvents, Locations} from 'utils/constants';\nimport type {A11yFocusEventDetail} from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\nimport * as PostUtils from 'utils/post_utils';\nimport {getDateForUnixTicks, makeIsEligibleForClick} from 'utils/utils';\n\nimport type {PostPluginComponent, PluginComponent} from 'types/store/plugins';\n\nimport PostOptions from './post_options';\nimport PostUserProfile from './user_profile';\n\nexport type Props = {\n post: Post;\n currentTeam?: Team;\n team?: Team;\n currentUserId: string;\n compactDisplay?: boolean;\n colorizeUsernames?: boolean;\n isFlagged: boolean;\n previewCollapsed?: string;\n previewEnabled?: boolean;\n isEmbedVisible?: boolean;\n enableEmojiPicker?: boolean;\n enablePostUsernameOverride?: boolean;\n isReadOnly?: boolean;\n pluginPostTypes?: {[postType: string]: PostPluginComponent};\n channelIsArchived?: boolean;\n isConsecutivePost?: boolean;\n isLastPost?: boolean;\n recentEmojis: Emoji[];\n center: boolean;\n handleCardClick?: (post: Post) => void;\n togglePostMenu?: (opened: boolean) => void;\n channelName?: string;\n displayName: string;\n teamDisplayName?: string;\n teamName?: string;\n channelType?: string;\n a11yIndex?: number;\n isBot: boolean;\n hasReplies: boolean;\n isFirstReply?: boolean;\n previousPostIsComment?: boolean;\n matches?: string[];\n term?: string;\n isMentionSearch?: boolean;\n location: keyof typeof Locations;\n actions: {\n markPostAsUnread: (post: Post, location: string) => void;\n emitShortcutReactToLastPostFrom: (emittedFrom: 'CENTER' | 'RHS_ROOT' | 'NO_WHERE') => void;\n selectPost: (post: Post) => void;\n selectPostFromRightHandSideSearch: (post: Post) => void;\n removePost: (post: Post) => void;\n closeRightHandSide: () => void;\n selectPostCard: (post: Post) => void;\n setRhsExpanded: (rhsExpanded: boolean) => void;\n };\n timestampProps?: Partial<TimestampProps>;\n shouldHighlight?: boolean;\n isPostBeingEdited?: boolean;\n isCollapsedThreadsEnabled?: boolean;\n isMobileView: boolean;\n canReply?: boolean;\n replyCount?: number;\n isFlaggedPosts?: boolean;\n isPinnedPosts?: boolean;\n clickToReply?: boolean;\n isCommentMention?: boolean;\n parentPost?: Post;\n parentPostUser?: UserProfile | null;\n shortcutReactToLastPostEmittedFrom?: string;\n isPostAcknowledgementsEnabled: boolean;\n isPostPriorityEnabled: boolean;\n isCardOpen?: boolean;\n canDelete?: boolean;\n pluginActions: PluginComponent[];\n};\n\nconst PostComponent = (props: Props): JSX.Element => {\n const {post, shouldHighlight, togglePostMenu} = props;\n\n const isSearchResultItem = (props.matches && props.matches.length > 0) || props.isMentionSearch || (props.term && props.term.length > 0);\n const isRHS = props.location === Locations.RHS_ROOT || props.location === Locations.RHS_COMMENT || props.location === Locations.SEARCH;\n const postRef = useRef<HTMLDivElement>(null);\n const postHeaderRef = useRef<HTMLDivElement>(null);\n const teamId = props.team?.id ?? props.currentTeam?.id ?? '';\n\n const [hover, setHover] = useState(false);\n const [a11yActive, setA11y] = useState(false);\n const [dropdownOpened, setDropdownOpened] = useState(false);\n const [fileDropdownOpened, setFileDropdownOpened] = useState(false);\n const [fadeOutHighlight, setFadeOutHighlight] = useState(false);\n const [alt, setAlt] = useState(false);\n const [hasReceivedA11yFocus, setHasReceivedA11yFocus] = useState(false);\n\n const isSystemMessage = PostUtils.isSystemMessage(post);\n const fromAutoResponder = PostUtils.fromAutoResponder(post);\n\n useEffect(() => {\n if (shouldHighlight) {\n const timer = setTimeout(() => setFadeOutHighlight(true), Constants.PERMALINK_FADEOUT);\n return () => {\n clearTimeout(timer);\n };\n }\n return undefined;\n }, [shouldHighlight]);\n\n const handleA11yActivateEvent = () => setA11y(true);\n const handleA11yDeactivateEvent = () => setA11y(false);\n const handleAlt = (e: KeyboardEvent) => setAlt(e.altKey);\n\n const handleA11yKeyboardFocus = useCallback((e: KeyboardEvent) => {\n if (!hasReceivedA11yFocus && shouldHighlight && isKeyPressed(e, Constants.KeyCodes.TAB) && e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n setHasReceivedA11yFocus(true);\n\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: postRef.current,\n keyboardOnly: true,\n },\n },\n ));\n }\n }, [hasReceivedA11yFocus, shouldHighlight]);\n\n useEffect(() => {\n if (a11yActive) {\n postRef.current?.dispatchEvent(new Event(A11yCustomEventTypes.UPDATE));\n }\n }, [a11yActive]);\n\n useEffect(() => {\n let removeEventListener: (type: string, listener: EventListener) => void;\n\n if (postRef.current) {\n postRef.current.addEventListener(A11yCustomEventTypes.ACTIVATE, handleA11yActivateEvent);\n postRef.current.addEventListener(A11yCustomEventTypes.DEACTIVATE, handleA11yDeactivateEvent);\n removeEventListener = postRef.current.removeEventListener;\n }\n\n return () => {\n if (removeEventListener) {\n removeEventListener(A11yCustomEventTypes.ACTIVATE, handleA11yActivateEvent);\n removeEventListener(A11yCustomEventTypes.DEACTIVATE, handleA11yDeactivateEvent);\n }\n };\n }, []);\n\n useEffect(() => {\n if (hover) {\n document.addEventListener('keydown', handleAlt);\n document.addEventListener('keyup', handleAlt);\n }\n\n return () => {\n document.removeEventListener('keydown', handleAlt);\n document.removeEventListener('keyup', handleAlt);\n };\n }, [hover]);\n\n useEffect(() => {\n document.addEventListener('keyup', handleA11yKeyboardFocus);\n\n return () => {\n document.removeEventListener('keyup', handleA11yKeyboardFocus);\n };\n }, [handleA11yKeyboardFocus]);\n\n const hasSameRoot = (props: Props) => {\n if (props.isFirstReply) {\n return false;\n } else if (!post.root_id && !props.previousPostIsComment && props.isConsecutivePost) {\n return true;\n } else if (post.root_id) {\n return true;\n }\n return false;\n };\n\n const getChannelName = () => {\n let name: React.ReactNode = props.channelName;\n\n const isDirectMessage = props.channelType === Constants.DM_CHANNEL;\n const isPartOfThread = props.isCollapsedThreadsEnabled && (post.reply_count > 0 || post.is_following);\n\n if (isDirectMessage && isPartOfThread) {\n name = (\n <FormattedMessage\n id='search_item.thread_direct'\n defaultMessage='Thread in Direct Message (with {username})'\n values={{\n username: props.displayName,\n }}\n />\n );\n } else if (isPartOfThread) {\n name = (\n <FormattedMessage\n id='search_item.thread'\n defaultMessage='Thread in {channel}'\n values={{\n channel: props.channelName,\n }}\n />\n );\n } else if (isDirectMessage) {\n name = (\n <FormattedMessage\n id='search_item.direct'\n defaultMessage='Direct Message (with {username})'\n values={{\n username: props.displayName,\n }}\n />\n );\n }\n\n return name;\n };\n\n const getPostHeaderVisible = (): boolean | null => {\n const boundingRectOfPostInfo: DOMRect | undefined = postHeaderRef.current?.getBoundingClientRect();\n\n let isPostHeaderVisibleToUser: boolean | null = null;\n if (boundingRectOfPostInfo) {\n isPostHeaderVisibleToUser = (boundingRectOfPostInfo.top - 65) > 0 &&\n boundingRectOfPostInfo.bottom < (window.innerHeight - 85);\n }\n\n return isPostHeaderVisibleToUser;\n };\n\n const getClassName = () => {\n const isMeMessage = checkIsMeMessage(post);\n const hovered =\n hover || fileDropdownOpened || dropdownOpened || a11yActive || props.isPostBeingEdited;\n return classNames('a11y__section post', {\n 'post--highlight': shouldHighlight && !fadeOutHighlight,\n 'same--root': hasSameRoot(props),\n 'other--root': !hasSameRoot(props) && !isSystemMessage,\n 'post--bot': PostUtils.isFromBot(post),\n 'post--editing': props.isPostBeingEdited,\n 'current--user': props.currentUserId === post.user_id && !isSystemMessage,\n 'post--system': isSystemMessage || isMeMessage,\n 'post--root': props.hasReplies && !(post.root_id && post.root_id.length > 0),\n 'post--comment': (post.root_id && post.root_id.length > 0 && !props.isCollapsedThreadsEnabled) || (props.location === Locations.RHS_COMMENT),\n 'post--compact': props.compactDisplay,\n 'post--hovered': hovered,\n 'same--user': props.isConsecutivePost && (!props.compactDisplay || props.location === Locations.RHS_COMMENT),\n 'cursor--pointer': alt && !props.channelIsArchived,\n 'post--hide-controls': post.failed || post.state === Posts.POST_DELETED,\n 'post--comment same--root': fromAutoResponder,\n 'post--pinned-or-flagged': (post.is_pinned || props.isFlagged) && props.location === Locations.CENTER,\n 'mention-comment': props.isCommentMention,\n 'post--thread': isRHS,\n });\n };\n\n const handleFileDropdownOpened = useCallback((open: boolean) => setFileDropdownOpened(open), []);\n\n const handleDropdownOpened = useCallback((opened: boolean) => {\n if (togglePostMenu) {\n togglePostMenu(opened);\n }\n setDropdownOpened(opened);\n }, [togglePostMenu]);\n\n const handleMouseOver = useCallback((e: MouseEvent<HTMLDivElement>) => {\n setHover(true);\n setAlt(e.altKey);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHover(false);\n setAlt(false);\n }, []);\n\n const handleCardClick = (post?: Post) => {\n if (!post) {\n return;\n }\n if (props.handleCardClick) {\n props.handleCardClick(post);\n }\n props.actions.selectPostCard(post);\n };\n\n // When adding clickable targets within a root post to exclude from post's on click to open thread,\n // please add to/maintain the selector below\n const isEligibleForClick = useMemo(() => makeIsEligibleForClick('.post-image__column, .embed-responsive-item, .attachment, .hljs, code'), []);\n\n const handlePostClick = useCallback((e: MouseEvent<HTMLDivElement>) => {\n if (!post || props.channelIsArchived) {\n return;\n }\n\n if (\n !e.altKey &&\n props.clickToReply &&\n (fromAutoResponder || !isSystemMessage) &&\n isEligibleForClick(e) &&\n props.location === Locations.CENTER &&\n !props.isPostBeingEdited\n ) {\n trackEvent('crt', 'clicked_to_reply');\n props.actions.selectPost(post);\n }\n\n if (e.altKey) {\n props.actions.markPostAsUnread(post, props.location);\n }\n }, [\n post,\n fromAutoResponder,\n isEligibleForClick,\n isSystemMessage,\n props.channelIsArchived,\n props.clickToReply,\n props.actions,\n props.location,\n props.isPostBeingEdited,\n ]);\n\n const handleJumpClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n if (props.isMobileView) {\n props.actions.closeRightHandSide();\n }\n\n props.actions.setRhsExpanded(false);\n getHistory().push(`/${props.teamName}/pl/${post.id}`);\n }, [props.isMobileView, props.actions, props.teamName, post?.id]);\n\n const {selectPostFromRightHandSideSearch} = props.actions;\n\n const handleCommentClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n\n if (!post) {\n return;\n }\n selectPostFromRightHandSideSearch(post);\n }, [post, selectPostFromRightHandSideSearch]);\n\n const handleThreadClick = useCallback((e: React.MouseEvent) => {\n if (props.currentTeam?.id === teamId) {\n handleCommentClick(e);\n } else {\n handleJumpClick(e);\n }\n }, [handleCommentClick, handleJumpClick, props.currentTeam?.id, teamId]);\n\n const postClass = classNames('post__body', {'post--edited': PostUtils.isEdited(post), 'search-item-snippet': isSearchResultItem});\n\n let comment;\n if (props.isFirstReply && props.parentPost && props.parentPostUser && post.type !== Constants.PostTypes.EPHEMERAL) {\n comment = (\n <CommentedOn\n post={props.parentPost}\n parentPostUser={props.parentPostUser}\n onCommentClick={handleCommentClick}\n />\n );\n }\n\n let visibleMessage = null;\n if (post.type === Constants.PostTypes.EPHEMERAL && !props.compactDisplay && post.state !== Posts.POST_DELETED) {\n visibleMessage = (\n <span className='post__visibility'>\n <FormattedMessage\n id='post_info.message.visible'\n defaultMessage='(Only visible to you)'\n />\n </span>\n );\n }\n\n let profilePic;\n const hideProfilePicture = hasSameRoot(props) && (!post.root_id && !props.hasReplies) && !PostUtils.isFromBot(post);\n const hideProfileCase = !(props.location === Locations.RHS_COMMENT && props.compactDisplay && props.isConsecutivePost);\n if (!hideProfilePicture && hideProfileCase) {\n profilePic = (\n <PostProfilePicture\n compactDisplay={props.compactDisplay}\n post={post}\n userId={post.user_id}\n />\n );\n\n if (fromAutoResponder) {\n profilePic = (\n <span className='auto-responder'>\n {profilePic}\n </span>\n );\n }\n }\n\n const message = isSearchResultItem ? (\n <PostBodyAdditionalContent\n post={post}\n options={{\n searchTerm: props.term,\n searchMatches: props.matches,\n }}\n >\n <PostMessageContainer\n post={post}\n options={{\n searchTerm: props.term,\n searchMatches: props.matches,\n mentionHighlight: props.isMentionSearch,\n }}\n isRHS={isRHS}\n />\n </PostBodyAdditionalContent>\n ) : (\n <MessageWithAdditionalContent\n post={post}\n isEmbedVisible={props.isEmbedVisible}\n pluginPostTypes={props.pluginPostTypes}\n isRHS={isRHS}\n compactDisplay={props.compactDisplay}\n />\n );\n\n const slotBasedOnEditOrMessageView = props.isPostBeingEdited ? AutoHeightSlots.SLOT2 : AutoHeightSlots.SLOT1;\n const threadFooter = props.location !== Locations.RHS_ROOT && props.isCollapsedThreadsEnabled && !post.root_id && (props.hasReplies || post.is_following) ? (\n <ThreadFooter\n threadId={post.id}\n replyClick={handleThreadClick}\n />\n ) : null;\n const currentPostDay = getDateForUnixTicks(post.create_at);\n const channelDisplayName = getChannelName();\n const showReactions = props.location !== Locations.SEARCH || props.isPinnedPosts || props.isFlaggedPosts;\n\n const getTestId = () => {\n let idPrefix: string;\n switch (props.location) {\n case 'CENTER':\n idPrefix = 'post';\n break;\n case 'RHS_ROOT':\n case 'RHS_COMMENT':\n idPrefix = 'rhsPost';\n break;\n case 'SEARCH':\n idPrefix = 'searchResult';\n break;\n\n default:\n idPrefix = 'post';\n }\n\n return idPrefix + `_${post.id}`;\n };\n\n let priority;\n if (post.metadata?.priority && props.isPostPriorityEnabled) {\n priority = <span className='d-flex mr-2 ml-1'><PriorityLabel priority={post.metadata.priority.priority}/></span>;\n }\n\n let postAriaLabelDivTestId = '';\n if (props.location === Locations.CENTER) {\n postAriaLabelDivTestId = 'postView';\n } else if (props.location === Locations.RHS_ROOT || props.location === Locations.RHS_COMMENT) {\n postAriaLabelDivTestId = 'rhsPostView';\n }\n\n const showFileAttachments = post.file_ids && post.file_ids.length > 0 && !props.isPostBeingEdited;\n\n return (\n <>\n {(isSearchResultItem || (props.location !== Locations.CENTER && (props.isPinnedPosts || props.isFlaggedPosts))) && <DateSeparator date={currentPostDay}/>}\n <PostAriaLabelDiv\n ref={postRef}\n id={getTestId()}\n data-testid={postAriaLabelDivTestId}\n tabIndex={0}\n post={post}\n className={getClassName()}\n onClick={handlePostClick}\n onMouseOver={handleMouseOver}\n onMouseLeave={handleMouseLeave}\n >\n {(Boolean(isSearchResultItem) || (props.location !== Locations.CENTER && props.isFlagged)) &&\n <div\n className='search-channel__name__container'\n aria-hidden='true'\n >\n {(Boolean(isSearchResultItem) || props.isFlaggedPosts) &&\n <span className='search-channel__name'>\n {channelDisplayName}\n </span>\n }\n {props.channelIsArchived &&\n <span className='search-channel__archived'>\n <ArchiveIcon className='icon icon__archive channel-header-archived-icon svg-text-color'/>\n <FormattedMessage\n id='search_item.channelArchived'\n defaultMessage='Archived'\n />\n </span>\n }\n {(Boolean(isSearchResultItem) || props.isFlaggedPosts) && Boolean(props.teamDisplayName) &&\n <span className='search-team__name'>\n {props.teamDisplayName}\n </span>\n }\n </div>\n }\n <PostPreHeader\n isFlagged={props.isFlagged}\n isPinned={post.is_pinned}\n skipPinned={props.location === Locations.SEARCH && props.isPinnedPosts}\n skipFlagged={props.location === Locations.SEARCH && props.isFlaggedPosts}\n channelId={post.channel_id}\n />\n <div\n role='application'\n className={`post__content ${props.center ? 'center' : ''}`}\n data-testid='postContent'\n >\n <div className='post__img'>\n {profilePic}\n </div>\n <div>\n <div\n className='post__header'\n ref={postHeaderRef}\n >\n <PostUserProfile\n {...props}\n isSystemMessage={isSystemMessage}\n />\n <div className='col d-flex align-items-center'>\n {((!hideProfilePicture && props.location === Locations.CENTER) || hover || props.location !== Locations.CENTER) &&\n <PostTime\n isPermalink={!(Posts.POST_DELETED === post.state || isPostPendingOrFailed(post))}\n teamName={props.team?.name}\n eventTime={post.create_at}\n postId={post.id}\n location={props.location}\n timestampProps={{...props.timestampProps, style: props.isConsecutivePost && !props.compactDisplay ? 'narrow' : undefined}}\n />\n }\n {priority}\n {post.props && post.props.card &&\n <WithTooltip\n title={\n <FormattedMessage\n id='post_info.info.view_additional_info'\n defaultMessage='View additional info'\n />\n }\n >\n <button\n className={'card-icon__container icon--show style--none ' + (props.isCardOpen ? 'active' : '')}\n onClick={(e) => {\n e.preventDefault();\n handleCardClick(post);\n }}\n >\n <InfoSmallIcon\n className='icon icon__info'\n aria-hidden='true'\n />\n </button>\n </WithTooltip>\n }\n {visibleMessage}\n </div>\n {!props.isPostBeingEdited &&\n <PostOptions\n {...props}\n teamId={teamId}\n handleDropdownOpened={handleDropdownOpened}\n handleCommentClick={handleCommentClick}\n hover={hover || a11yActive}\n removePost={props.actions.removePost}\n handleJumpClick={handleJumpClick}\n isPostHeaderVisible={getPostHeaderVisible()}\n />\n }\n </div>\n {comment}\n <div\n className={postClass}\n id={isRHS ? undefined : `${post.id}_message`}\n >\n {post.failed && <FailedPostOptions post={post}/>}\n <AutoHeightSwitcher\n showSlot={slotBasedOnEditOrMessageView}\n shouldScrollIntoView={props.isPostBeingEdited}\n slot1={message}\n slot2={<EditPost/>}\n onTransitionEnd={() => document.dispatchEvent(new Event(AppEvents.FOCUS_EDIT_TEXTBOX))}\n />\n {\n showFileAttachments &&\n <FileAttachmentListContainer\n post={post}\n compactDisplay={props.compactDisplay}\n handleFileDropdownOpened={handleFileDropdownOpened}\n />\n }\n <div className='post__body-reactions-acks'>\n {props.isPostAcknowledgementsEnabled && post.metadata?.priority?.requested_ack && (\n <PostAcknowledgements\n authorId={post.user_id}\n isDeleted={post.state === Posts.POST_DELETED}\n postId={post.id}\n />\n )}\n {showReactions && <ReactionList post={post}/>}\n </div>\n {threadFooter}\n </div>\n </div>\n </div>\n </PostAriaLabelDiv>\n </>\n );\n};\n\nexport default PostComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages, injectIntl} from 'react-intl';\nimport type {IntlShape, MessageDescriptor} from 'react-intl';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport {secureGetFromRecord} from 'mattermost-redux/utils/post_utils';\n\nimport Markdown from 'components/markdown';\n\nimport type {TextFormattingOptions} from 'utils/text_formatting';\n\nconst typeMessage = defineMessages({\n [Posts.POST_TYPES.ADD_TO_CHANNEL]: {\n id: 'last_users_message.added_to_channel.type',\n defaultMessage: 'were **added to the channel** by {actor}.',\n },\n [Posts.POST_TYPES.JOIN_CHANNEL]: {\n id: 'last_users_message.joined_channel.type',\n defaultMessage: '**joined the channel**.',\n },\n [Posts.POST_TYPES.LEAVE_CHANNEL]: {\n id: 'last_users_message.left_channel.type',\n defaultMessage: '**left the channel**.',\n },\n [Posts.POST_TYPES.JOIN_LEAVE_CHANNEL]: {\n id: 'last_users_message.joined_left_channel.type',\n defaultMessage: '**joined and left the channel**.',\n },\n [Posts.POST_TYPES.REMOVE_FROM_CHANNEL]: {\n id: 'last_users_message.removed_from_channel.type',\n defaultMessage: 'were **removed from the channel**.',\n },\n [Posts.POST_TYPES.ADD_TO_TEAM]: {\n id: 'last_users_message.added_to_team.type',\n defaultMessage: 'were **added to the team** by {actor}.',\n },\n [Posts.POST_TYPES.JOIN_TEAM]: {\n id: 'last_users_message.joined_team.type',\n defaultMessage: '**joined the team**.',\n },\n [Posts.POST_TYPES.LEAVE_TEAM]: {\n id: 'last_users_message.left_team.type',\n defaultMessage: '**left the team**.',\n },\n [Posts.POST_TYPES.REMOVE_FROM_TEAM]: {\n id: 'last_users_message.removed_from_team.type',\n defaultMessage: 'were **removed from the team**.',\n },\n});\n\ntype Props = {\n actor?: string;\n expandedLocale: MessageDescriptor;\n formatOptions: Partial<TextFormattingOptions>;\n intl: IntlShape;\n postType: string;\n usernames: string[];\n}\n\ntype State = {\n expand: boolean;\n}\n\nexport class LastUsers extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n expand: false,\n };\n }\n\n handleOnClick = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {\n e.preventDefault();\n\n this.setState({expand: true});\n };\n\n renderMessage = (formattedMessage: string): JSX.Element => {\n return (\n <Markdown\n message={formattedMessage}\n options={this.props.formatOptions}\n />\n );\n };\n\n render(): JSX.Element {\n const {formatMessage} = this.props.intl;\n const {expand} = this.state;\n const {\n actor,\n expandedLocale,\n postType,\n usernames,\n } = this.props;\n\n const firstUser = usernames[0];\n const lastIndex = usernames.length - 1;\n const lastUser = usernames[lastIndex];\n\n if (expand) {\n const formattedMessage = formatMessage(expandedLocale, {\n users: usernames.slice(0, lastIndex).join(', '),\n lastUser,\n actor,\n });\n\n return this.renderMessage(formattedMessage);\n }\n\n const firstUserMessage = formatMessage(\n {id: 'last_users_message.first', defaultMessage: '{firstUser} and '},\n {firstUser},\n );\n\n const otherUsersMessage = formatMessage(\n {id: 'last_users_message.others', defaultMessage: '{numOthers} others '},\n {numOthers: lastIndex},\n );\n\n const selectedTypeMessage = secureGetFromRecord(typeMessage, postType);\n\n const actorMessage = selectedTypeMessage ? formatMessage(\n {id: selectedTypeMessage.id, defaultMessage: selectedTypeMessage.defaultMessage},\n {actor},\n ) : '';\n\n return (\n <span>\n {this.renderMessage(firstUserMessage)}\n <a onClick={this.handleOnClick}>\n {otherUsersMessage}\n </a>\n {this.renderMessage(actorMessage)}\n </span>\n );\n }\n}\nexport default injectIntl(LastUsers);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages, injectIntl} from 'react-intl';\nimport type {IntlShape, MessageDescriptor} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport type {MessageData} from 'mattermost-redux/utils/post_list';\nimport {secureGetFromRecord} from 'mattermost-redux/utils/post_utils';\n\nimport Markdown from 'components/markdown';\n\nimport LastUsers from './last_users';\n\nconst {\n JOIN_CHANNEL, ADD_TO_CHANNEL, REMOVE_FROM_CHANNEL, LEAVE_CHANNEL, JOIN_LEAVE_CHANNEL,\n JOIN_TEAM, ADD_TO_TEAM, REMOVE_FROM_TEAM, LEAVE_TEAM,\n} = Posts.POST_TYPES;\n\nconst postTypeMessage = {\n [JOIN_CHANNEL]: defineMessages({\n one: {\n id: 'combined_system_message.joined_channel.one',\n defaultMessage: '{firstUser} **joined the channel**.',\n },\n one_you: {\n id: 'combined_system_message.joined_channel.one_you',\n defaultMessage: 'You **joined the channel**.',\n },\n two: {\n id: 'combined_system_message.joined_channel.two',\n defaultMessage: '{firstUser} and {secondUser} **joined the channel**.',\n },\n many_expanded: {\n id: 'combined_system_message.joined_channel.many_expanded',\n defaultMessage: '{users} and {lastUser} **joined the channel**.',\n },\n }),\n [ADD_TO_CHANNEL]: defineMessages({\n one: {\n id: 'combined_system_message.added_to_channel.one',\n defaultMessage: '{firstUser} **added to the channel** by {actor}.',\n },\n one_you: {\n id: 'combined_system_message.added_to_channel.one_you',\n defaultMessage: 'You were **added to the channel** by {actor}.',\n },\n two: {\n id: 'combined_system_message.added_to_channel.two',\n defaultMessage: '{firstUser} and {secondUser} **added to the channel** by {actor}.',\n },\n many_expanded: {\n id: 'combined_system_message.added_to_channel.many_expanded',\n defaultMessage: '{users} and {lastUser} were **added to the channel** by {actor}.',\n },\n }),\n [REMOVE_FROM_CHANNEL]: defineMessages({\n one: {\n id: 'combined_system_message.removed_from_channel.one',\n defaultMessage: '{firstUser} was **removed from the channel**.',\n },\n one_you: {\n id: 'combined_system_message.removed_from_channel.one_you',\n defaultMessage: 'You were **removed from the channel**.',\n },\n two: {\n id: 'combined_system_message.removed_from_channel.two',\n defaultMessage: '{firstUser} and {secondUser} were **removed from the channel**.',\n },\n many_expanded: {\n id: 'combined_system_message.removed_from_channel.many_expanded',\n defaultMessage: '{users} and {lastUser} were **removed from the channel**.',\n },\n }),\n [LEAVE_CHANNEL]: defineMessages({\n one: {\n id: 'combined_system_message.left_channel.one',\n defaultMessage: '{firstUser} **left the channel**.',\n },\n one_you: {\n id: 'combined_system_message.left_channel.one_you',\n defaultMessage: 'You **left the channel**.',\n },\n two: {\n id: 'combined_system_message.left_channel.two',\n defaultMessage: '{firstUser} and {secondUser} **left the channel**.',\n },\n many_expanded: {\n id: 'combined_system_message.left_channel.many_expanded',\n defaultMessage: '{users} and {lastUser} **left the channel**.',\n },\n }),\n [JOIN_LEAVE_CHANNEL]: defineMessages({\n one: {\n id: 'combined_system_message.join_left_channel.one',\n defaultMessage: '{firstUser} **joined and left the channel**.',\n },\n one_you: {\n id: 'combined_system_message.join_left_channel.one_you',\n defaultMessage: 'You **joined and left the channel**.',\n },\n two: {\n id: 'combined_system_message.join_left_channel.two',\n defaultMessage: '{firstUser} and {secondUser} **joined and left the channel**.',\n },\n many_expanded: {\n id: 'combined_system_message.join_left_channel.many_expanded',\n defaultMessage: '{users} and {lastUser} **joined and left the channel**.',\n },\n }),\n [JOIN_TEAM]: defineMessages({\n one: {\n id: 'combined_system_message.joined_team.one',\n defaultMessage: '{firstUser} **joined the team**.',\n },\n one_you: {\n id: 'combined_system_message.joined_team.one_you',\n defaultMessage: 'You **joined the team**.',\n },\n two: {\n id: 'combined_system_message.joined_team.two',\n defaultMessage: '{firstUser} and {secondUser} **joined the team**.',\n },\n many_expanded: {\n id: 'combined_system_message.joined_team.many_expanded',\n defaultMessage: '{users} and {lastUser} **joined the team**.',\n },\n }),\n [ADD_TO_TEAM]: defineMessages({\n one: {\n id: 'combined_system_message.added_to_team.one',\n defaultMessage: '{firstUser} **added to the team** by {actor}.',\n },\n one_you: {\n id: 'combined_system_message.added_to_team.one_you',\n defaultMessage: 'You were **added to the team** by {actor}.',\n },\n two: {\n id: 'combined_system_message.added_to_team.two',\n defaultMessage: '{firstUser} and {secondUser} **added to the team** by {actor}.',\n },\n many_expanded: {\n id: 'combined_system_message.added_to_team.many_expanded',\n defaultMessage: '{users} and {lastUser} were **added to the team** by {actor}.',\n },\n }),\n [REMOVE_FROM_TEAM]: defineMessages({\n one: {\n id: 'combined_system_message.removed_from_team.one',\n defaultMessage: '{firstUser} was **removed from the team**.',\n },\n one_you: {\n id: 'combined_system_message.removed_from_team.one_you',\n defaultMessage: 'You were **removed from the team**.',\n },\n two: {\n id: 'combined_system_message.removed_from_team.two',\n defaultMessage: '{firstUser} and {secondUser} were **removed from the team**.',\n },\n many_expanded: {\n id: 'combined_system_message.removed_from_team.many_expanded',\n defaultMessage: '{users} and {lastUser} were **removed from the team**.',\n },\n }),\n [LEAVE_TEAM]: defineMessages({\n one: {\n id: 'combined_system_message.left_team.one',\n defaultMessage: '{firstUser} **left the team**.',\n },\n one_you: {\n id: 'combined_system_message.left_team.one_you',\n defaultMessage: 'You **left the team**.',\n },\n two: {\n id: 'combined_system_message.left_team.two',\n defaultMessage: '{firstUser} and {secondUser} **left the team**.',\n },\n many_expanded: {\n id: 'combined_system_message.left_team.many_expanded',\n defaultMessage: '{users} and {lastUser} **left the team**.',\n },\n }),\n};\n\nexport type Props = {\n allUserIds: string[];\n allUsernames: string[];\n currentUserId: string;\n currentUsername: string;\n intl: IntlShape;\n messageData: MessageData[];\n showJoinLeave: boolean;\n userProfiles: UserProfile[];\n actions: {\n getMissingProfilesByIds: (userIds: string[]) => void;\n getMissingProfilesByUsernames: (usernames: string[]) => void;\n };\n}\n\nexport class CombinedSystemMessage extends React.PureComponent<Props> {\n static defaultProps = {\n allUserIds: [],\n allUsernames: [],\n };\n\n componentDidMount(): void {\n this.loadUserProfiles(this.props.allUserIds, this.props.allUsernames);\n }\n\n componentDidUpdate(prevProps: Props): void {\n const {allUserIds, allUsernames} = this.props;\n if (allUserIds !== prevProps.allUserIds || allUsernames !== prevProps.allUsernames) {\n this.loadUserProfiles(allUserIds, allUsernames);\n }\n }\n\n loadUserProfiles = (allUserIds: string[], allUsernames: string[]): void => {\n if (allUserIds.length > 0) {\n this.props.actions.getMissingProfilesByIds(allUserIds);\n }\n\n if (allUsernames.length > 0) {\n this.props.actions.getMissingProfilesByUsernames(allUsernames);\n }\n };\n\n getAllUsernames = (): {[p: string]: string} => {\n const {\n allUserIds,\n allUsernames,\n currentUserId,\n currentUsername,\n userProfiles,\n } = this.props;\n const {formatMessage} = this.props.intl;\n const usernames = userProfiles.reduce((acc: {[key: string]: string}, user: UserProfile) => {\n acc[user.id] = user.username;\n acc[user.username] = user.username;\n return acc;\n }, {});\n\n const currentUserDisplayName = formatMessage({id: 'combined_system_message.you', defaultMessage: 'You'});\n if (allUserIds.includes(currentUserId)) {\n usernames[currentUserId] = currentUserDisplayName;\n } else if (allUsernames.includes(currentUsername)) {\n usernames[currentUsername] = currentUserDisplayName;\n }\n\n return usernames;\n };\n\n getUsernamesByIds = (userIds: string | string[] = []): string[] => {\n const userIdsArray = Array.isArray(userIds) ? userIds : [userIds];\n const {currentUserId, currentUsername} = this.props;\n const allUsernames = this.getAllUsernames();\n\n const {formatMessage} = this.props.intl;\n const someone = formatMessage({id: 'channel_loader.someone', defaultMessage: 'Someone'});\n\n const usernames = userIdsArray.\n filter((userId) => {\n return userId !== currentUserId && userId !== currentUsername;\n }).\n map((userId) => {\n const username = secureGetFromRecord(allUsernames, userId);\n return username ? `@${username}` : someone;\n }).\n filter((username) => {\n return username && username !== '';\n });\n\n if (userIdsArray.includes(currentUserId)) {\n usernames.unshift(allUsernames[currentUserId]);\n } else if (userIdsArray.includes(currentUsername)) {\n usernames.unshift(allUsernames[currentUsername]);\n }\n\n return Array.from(new Set(usernames));\n };\n\n renderFormattedMessage(postType: string, userIds: string[], actorId?: string): JSX.Element {\n const {formatMessage} = this.props.intl;\n const {currentUserId, currentUsername} = this.props;\n const usernames = this.getUsernamesByIds(userIds);\n let actor = actorId ? this.getUsernamesByIds([actorId])[0] : '';\n if (actor && (actorId === currentUserId || actorId === currentUsername)) {\n actor = actor.toLowerCase();\n }\n\n const firstUser = usernames[0];\n const secondUser = usernames[1];\n const numOthers = usernames.length - 1;\n\n const options = {\n atMentions: true,\n mentionKeys: [{key: firstUser}, {key: secondUser}, {key: actor}],\n mentionHighlight: false,\n singleline: true,\n };\n\n const selectedPostTypeMessage = secureGetFromRecord(postTypeMessage, postType);\n if (!selectedPostTypeMessage) {\n return <></>;\n }\n\n if (numOthers > 1) {\n return (\n <LastUsers\n actor={actor}\n expandedLocale={selectedPostTypeMessage.many_expanded}\n formatOptions={options}\n postType={postType}\n usernames={usernames}\n />\n );\n }\n\n let localeHolder: MessageDescriptor = {};\n if (numOthers === 0) {\n localeHolder = selectedPostTypeMessage.one;\n\n if (\n (userIds[0] === this.props.currentUserId || userIds[0] === this.props.currentUsername) &&\n selectedPostTypeMessage.one_you\n ) {\n localeHolder = selectedPostTypeMessage.one_you;\n }\n } else if (numOthers === 1) {\n localeHolder = selectedPostTypeMessage.two;\n }\n\n const formattedMessage = formatMessage(localeHolder, {firstUser, secondUser, actor});\n\n return (\n <Markdown\n message={formattedMessage}\n options={options}\n />\n );\n }\n\n renderMessage(index: number, postType: string, userIds: string[], actorId?: string): JSX.Element {\n return (\n <React.Fragment key={index}>\n {this.renderFormattedMessage(postType, userIds, actorId)}\n <br/>\n </React.Fragment>\n );\n }\n\n render(): JSX.Element {\n const {\n currentUserId,\n messageData,\n } = this.props;\n\n const content = [];\n for (let i = 0; i < messageData.length; i++) {\n const message = messageData[i];\n const {\n postType,\n actorId,\n } = message;\n let userIds = message.userIds;\n\n if (!this.props.showJoinLeave && actorId !== currentUserId) {\n const affectsCurrentUser = userIds.indexOf(currentUserId) !== -1;\n\n if (affectsCurrentUser) {\n // Only show the message that the current user was added, etc\n userIds = [currentUserId];\n } else {\n // Not something the current user did or was affected by\n continue;\n }\n }\n\n content.push(this.renderMessage(i, postType, userIds, actorId));\n }\n\n return (\n <>\n {content}\n </>\n );\n }\n}\n\nexport default injectIntl(CombinedSystemMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getMissingProfilesByIds, getMissingProfilesByUsernames} from 'mattermost-redux/actions/users';\nimport {shouldShowJoinLeaveMessages} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, makeGetProfilesByIdsAndUsernames} from 'mattermost-redux/selectors/entities/users';\n\nimport CombinedSystemMessage from './combined_system_message';\n\ntype OwnProps = {\n allUserIds: string[];\n allUsernames: string[];\n}\n\nfunction makeMapStateToProps() {\n const getProfilesByIdsAndUsernames = makeGetProfilesByIdsAndUsernames();\n\n return (state: GlobalState, ownProps: OwnProps) => {\n const currentUser = getCurrentUser(state);\n const {allUserIds, allUsernames} = ownProps;\n\n return {\n currentUserId: currentUser.id,\n currentUsername: currentUser.username,\n showJoinLeave: shouldShowJoinLeaveMessages(state),\n userProfiles: getProfilesByIdsAndUsernames(state, {allUserIds, allUsernames}),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getMissingProfilesByIds,\n getMissingProfilesByUsernames,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(CombinedSystemMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useMemo, useRef} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\nimport {isStringArray} from '@mattermost/types/utilities';\n\nimport {getMissingProfilesByIds} from 'mattermost-redux/actions/users';\nimport {makeGetProfilesByIdsAndUsernames} from 'mattermost-redux/selectors/entities/users';\n\nimport {renderUsername} from 'components/post_markdown/system_message_helpers';\n\nimport type {GlobalState} from 'types/store';\n\nexport type Props = {\n post: Post;\n}\nfunction GMConversionMessage(props: Props): JSX.Element {\n const convertedByUserId = props.post.props.convertedByUserId;\n const gmMembersDuringConversionIDs = isStringArray(props.post.props.gmMembersDuringConversionIDs) ? props.post.props.gmMembersDuringConversionIDs : [];\n\n const dispatch = useDispatch();\n const intl = useIntl();\n\n useEffect(() => {\n dispatch(getMissingProfilesByIds(gmMembersDuringConversionIDs));\n }, [props.post]);\n\n const getProfilesByIdsAndUsernames = useRef(makeGetProfilesByIdsAndUsernames());\n const userProfiles = useSelector(\n (state: GlobalState) => getProfilesByIdsAndUsernames.current(\n state,\n {allUserIds: gmMembersDuringConversionIDs, allUsernames: []},\n ),\n );\n\n const convertedByUsername = useMemo(() => {\n const convertedByUser = userProfiles.find((user) => user.id === convertedByUserId);\n\n if (!convertedByUser) {\n return (\n <FormattedMessage\n id='api.channel.group_message_converted_to.someone'\n defaultMessage='Someone'\n />\n );\n }\n return renderUsername(convertedByUser.username);\n }, [convertedByUserId, userProfiles]);\n\n const gmMembersUsernames = userProfiles.map((user) => renderUsername(user.username));\n\n if (!convertedByUserId || !gmMembersDuringConversionIDs || gmMembersDuringConversionIDs.length === 0) {\n return (\n <span>{props.post.message}</span>\n );\n }\n\n return (\n <FormattedMessage\n id='api.channel.group_message_converted_to.private_channel'\n defaultMessage='{convertedBy} created this channel from a group message with {gmMembers}.'\n values={{\n convertedBy: convertedByUsername,\n gmMembers: intl.formatList(gmMembersUsernames),\n }}\n />\n );\n}\n\nexport default GMConversionMessage;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {sendAddToChannelEphemeralPost} from 'actions/global_actions';\n\nimport AtMention from 'components/at_mention';\n\nimport {Constants} from 'utils/constants';\n\ninterface Actions {\n addChannelMember: (channelId: string, userId: string, rootId: string) => void;\n removePost: (post: Post) => void;\n}\n\nexport interface Props {\n currentUser: UserProfile;\n channelType: string;\n postId: string;\n post: Post;\n userIds: string[];\n usernames: string[];\n noGroupsUsernames: string[];\n actions: Actions;\n}\n\ninterface State {\n expanded: boolean;\n}\n\nexport default class PostAddChannelMember extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n expanded: false,\n };\n }\n\n handleAddChannelMember = () => {\n const {currentUser, post, userIds, usernames} = this.props;\n\n if (post && post.channel_id) {\n let createAt = post.create_at;\n userIds.forEach((userId, index) => {\n createAt++;\n this.props.actions.addChannelMember(post.channel_id, userId, post.root_id);\n sendAddToChannelEphemeralPost(currentUser, usernames[index], userId, post.channel_id, post.root_id, createAt);\n });\n\n this.props.actions.removePost(post);\n }\n };\n\n expand = () => {\n this.setState({expanded: true});\n };\n\n generateAtMentions(usernames = [] as string[]) {\n if (usernames.length === 1) {\n return (\n <AtMention\n mentionName={usernames[0]}\n channelId={this.props.post?.channel_id}\n />\n );\n } else if (usernames.length > 1) {\n function andSeparator(key: number) {\n return (\n <FormattedMessage\n key={key}\n id={'post_body.check_for_out_of_channel_mentions.link.and'}\n defaultMessage={' and '}\n />\n );\n }\n\n function commaSeparator(key: number) {\n return <span key={key}>{', '}</span>;\n }\n\n if (this.state.expanded || usernames.length <= 3) {\n return (\n <span>\n {\n usernames.map((username) => {\n return (\n <AtMention\n key={username}\n mentionName={username}\n channelId={this.props.post?.channel_id}\n />\n );\n }).reduce((acc, el, idx, arr) => {\n if (idx === 0) {\n return [el];\n } else if (idx === arr.length - 1) {\n return [...acc, andSeparator(idx), el];\n }\n\n return [...acc, commaSeparator(idx), el];\n }, [] as JSX.Element[])\n }\n </span>\n );\n }\n const otherUsers = [...usernames];\n const firstUserName = otherUsers.shift() as string; // will never be undefined\n const lastUserName = otherUsers.pop() as string; // will never be undefined\n return (\n <span>\n <AtMention\n key={firstUserName}\n mentionName={firstUserName}\n channelId={this.props.post?.channel_id}\n />\n {commaSeparator(1)}\n <a\n className='PostBody_otherUsersLink'\n onClick={this.expand}\n >\n <FormattedMessage\n id={'post_body.check_for_out_of_channel_mentions.others'}\n defaultMessage={'{numOthers} others'}\n values={{\n numOthers: otherUsers.length,\n }}\n />\n </a>\n {andSeparator(1)}\n <AtMention\n key={lastUserName}\n mentionName={lastUserName}\n channelId={this.props.post?.channel_id}\n />\n </span>\n );\n }\n\n return '';\n }\n\n render() {\n const {channelType, postId, usernames, noGroupsUsernames} = this.props;\n if (!postId || !channelType) {\n return null;\n }\n\n let link;\n if (channelType === Constants.PRIVATE_CHANNEL) {\n link = (\n <FormattedMessage\n id='post_body.check_for_out_of_channel_mentions.link.private'\n defaultMessage='add them to this private channel'\n />\n );\n } else if (channelType === Constants.OPEN_CHANNEL) {\n link = (\n <FormattedMessage\n id='post_body.check_for_out_of_channel_mentions.link.public'\n defaultMessage='add them to the channel'\n />\n );\n }\n\n let outOfChannelMessagePart;\n const outOfChannelAtMentions = this.generateAtMentions(usernames);\n if (usernames.length === 1) {\n outOfChannelMessagePart = (\n <FormattedMessage\n id='post_body.check_for_out_of_channel_mentions.message.one'\n defaultMessage='did not get notified by this mention because they are not in the channel. Would you like to '\n />\n );\n } else if (usernames.length > 1) {\n outOfChannelMessagePart = (\n <FormattedMessage\n id='post_body.check_for_out_of_channel_mentions.message.multiple'\n defaultMessage='did not get notified by this mention because they are not in the channel. Would you like to '\n />\n );\n }\n\n let outOfGroupsMessagePart;\n const outOfGroupsAtMentions = this.generateAtMentions(noGroupsUsernames);\n if (noGroupsUsernames.length) {\n outOfGroupsMessagePart = (\n <FormattedMessage\n id='post_body.check_for_out_of_channel_groups_mentions.message'\n defaultMessage='did not get notified by this mention because they are not in the channel. They cannot be added to the channel because they are not a member of the linked groups. To add them to this channel, they must be added to the linked groups.'\n />\n );\n }\n\n let outOfChannelMessage = null;\n let outOfGroupsMessage = null;\n\n if (usernames.length) {\n outOfChannelMessage = (\n <p>\n {outOfChannelAtMentions}\n {' '}\n {outOfChannelMessagePart}\n <a\n className='PostBody_addChannelMemberLink'\n onClick={this.handleAddChannelMember}\n >\n {link}\n </a>\n <FormattedMessage\n id={'post_body.check_for_out_of_channel_mentions.message_last'}\n defaultMessage={'? They will have access to all message history.'}\n />\n </p>\n );\n }\n\n if (noGroupsUsernames.length) {\n outOfGroupsMessage = (\n <p>\n {outOfGroupsAtMentions}\n {' '}\n {outOfGroupsMessagePart}\n </p>\n );\n }\n\n return (\n <>\n {outOfChannelMessage}\n {outOfGroupsMessage}\n </>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {addChannelMember} from 'mattermost-redux/actions/channels';\nimport {removePost} from 'mattermost-redux/actions/posts';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport PostAddChannelMember from './post_add_channel_member';\n\ntype OwnProps = {\n postId: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const post = getPost(state, ownProps.postId) || {};\n let channelType = '';\n if (post && post.channel_id) {\n const channel = getChannel(state, post.channel_id);\n if (channel && channel.type) {\n channelType = channel.type;\n }\n }\n\n return {\n channelType,\n currentUser: getCurrentUser(state),\n post,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n addChannelMember,\n removePost,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PostAddChannelMember);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedDate, FormattedMessage, FormattedTime, defineMessages} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Post} from '@mattermost/types/posts';\nimport type {Team} from '@mattermost/types/teams';\nimport {isStringArray} from '@mattermost/types/utilities';\n\nimport {General, Posts} from 'mattermost-redux/constants';\nimport {isUserActivityProp} from 'mattermost-redux/utils/post_list';\nimport {ensureNumber, ensureString, isPostEphemeral} from 'mattermost-redux/utils/post_utils';\n\nimport Markdown from 'components/markdown';\nimport CombinedSystemMessage from 'components/post_view/combined_system_message';\nimport GMConversionMessage from 'components/post_view/gm_conversion_message/gm_conversion_message';\nimport PostAddChannelMember from 'components/post_view/post_add_channel_member';\n\nimport {isChannelNamesMap, type TextFormattingOptions} from 'utils/text_formatting';\nimport {getSiteURL} from 'utils/url';\n\nexport function renderUsername(value: unknown): ReactNode {\n const verifiedValue = ensureString(value);\n const username = (verifiedValue[0] === '@') ? verifiedValue : `@${verifiedValue}`;\n\n const options = {\n markdown: false,\n };\n\n return renderFormattedText(username, options);\n}\n\nfunction renderFormattedText(value: unknown, options?: Partial<TextFormattingOptions>, post?: Post): ReactNode {\n const verifiedValue = ensureString(value);\n return (\n <Markdown\n message={verifiedValue}\n options={options}\n postId={post && post.id}\n postType={post && post.type}\n />\n );\n}\n\nfunction renderJoinChannelMessage(post: Post): ReactNode {\n const username = renderUsername(post.props.username);\n\n return (\n <FormattedMessage\n id='api.channel.join_channel.post_and_forget'\n defaultMessage='{username} joined the channel.'\n values={{username}}\n />\n );\n}\n\nfunction renderGuestJoinChannelMessage(post: Post, hideGuestTags: boolean): ReactNode {\n if (hideGuestTags) {\n return renderJoinChannelMessage(post);\n }\n const username = renderUsername(post.props.username);\n\n return (\n <FormattedMessage\n id='api.channel.guest_join_channel.post_and_forget'\n defaultMessage='{username} joined the channel as a guest.'\n values={{username}}\n />\n );\n}\n\nfunction renderLeaveChannelMessage(post: Post): ReactNode {\n const username = renderUsername(post.props.username);\n\n return (\n <FormattedMessage\n id='api.channel.leave.left'\n defaultMessage='{username} has left the channel.'\n values={{username}}\n />\n );\n}\n\nfunction renderAddToChannelMessage(post: Post): ReactNode {\n const username = renderUsername(post.props.username);\n const addedUsername = renderUsername(post.props.addedUsername);\n\n return (\n <FormattedMessage\n id='api.channel.add_member.added'\n defaultMessage='{addedUsername} added to the channel by {username}.'\n values={{\n username,\n addedUsername,\n }}\n />\n );\n}\n\nfunction renderAddGuestToChannelMessage(post: Post, hideGuestTags: boolean): ReactNode {\n if (hideGuestTags) {\n return renderAddToChannelMessage(post);\n }\n const username = renderUsername(post.props.username);\n const addedUsername = renderUsername(post.props.addedUsername);\n\n return (\n <FormattedMessage\n id='api.channel.add_guest.added'\n defaultMessage='{addedUsername} added to the channel as a guest by {username}.'\n values={{\n username,\n addedUsername,\n }}\n />\n );\n}\n\nfunction renderRemoveFromChannelMessage(post: Post): ReactNode {\n const removedUsername = renderUsername(post.props.removedUsername);\n\n return (\n <FormattedMessage\n id='api.channel.remove_member.removed'\n defaultMessage='{removedUsername} was removed from the channel'\n values={{\n removedUsername,\n }}\n />\n );\n}\n\nfunction renderJoinTeamMessage(post: Post): ReactNode {\n const username = renderUsername(post.props.username);\n\n return (\n <FormattedMessage\n id='api.team.join_team.post_and_forget'\n defaultMessage='{username} joined the team.'\n values={{username}}\n />\n );\n}\n\nfunction renderLeaveTeamMessage(post: Post): ReactNode {\n const username = renderUsername(post.props.username);\n\n return (\n <FormattedMessage\n id='api.team.leave.left'\n defaultMessage='{username} left the team.'\n values={{username}}\n />\n );\n}\n\nfunction renderAddToTeamMessage(post: Post): ReactNode {\n const username = renderUsername(post.props.username);\n const addedUsername = renderUsername(post.props.addedUsername);\n\n return (\n <FormattedMessage\n id='api.team.add_member.added'\n defaultMessage='{addedUsername} added to the team by {username}.'\n values={{\n username,\n addedUsername,\n }}\n />\n );\n}\n\nfunction renderRemoveFromTeamMessage(post: Post): ReactNode {\n const removedUsername = renderUsername(post.props.username);\n\n return (\n <FormattedMessage\n id='api.team.remove_user_from_team.removed'\n defaultMessage='{removedUsername} was removed from the team.'\n values={{\n removedUsername,\n }}\n />\n );\n}\n\nfunction renderHeaderChangeMessage(post: Post): ReactNode {\n if (!post.props.username) {\n return null;\n }\n\n const headerOptions = {\n channelNamesMap: isChannelNamesMap(post.props?.channel_mentions) ? post.props.channel_mentions : undefined,\n mentionHighlight: true,\n };\n\n const username = renderUsername(post.props.username);\n const oldHeader = post.props.old_header ? renderFormattedText(post.props.old_header, headerOptions, post) : null;\n const newHeader = post.props.new_header ? renderFormattedText(post.props.new_header, headerOptions, post) : null;\n\n if (post.props.new_header) {\n if (post.props.old_header) {\n return (\n <FormattedMessage\n id='api.channel.post_update_channel_header_message_and_forget.updated_from'\n defaultMessage='{username} updated the channel header <br></br><strong>From:</strong> {old} <br></br><strong>To:</strong> {new}'\n values={{\n username,\n old: oldHeader,\n new: newHeader,\n strong: (chunks: React.ReactNode) => (<strong>{chunks}</strong>),\n br: (x: React.ReactNode) => (<><br/>{x}</>),\n }}\n />\n );\n }\n\n return (\n <FormattedMessage\n id='api.channel.post_update_channel_header_message_and_forget.updated_to'\n defaultMessage='{username} updated the channel header to: {new}'\n values={{\n username,\n new: newHeader,\n }}\n />\n );\n } else if (post.props.old_header) {\n return (\n <FormattedMessage\n id='api.channel.post_update_channel_header_message_and_forget.removed'\n defaultMessage='{username} removed the channel header (was: {old})'\n values={{\n username,\n old: oldHeader,\n }}\n />\n );\n }\n\n return null;\n}\n\nfunction renderDisplayNameChangeMessage(post: Post): ReactNode {\n if (!(post.props.username && post.props.old_displayname && post.props.new_displayname)) {\n return null;\n }\n\n const username = renderUsername(post.props.username);\n const oldDisplayName = post.props.old_displayname;\n const newDisplayName = post.props.new_displayname;\n\n return (\n <FormattedMessage\n id='api.channel.post_update_channel_displayname_message_and_forget.updated_from'\n defaultMessage='{username} updated the channel display name from: {old} to: {new}'\n values={{\n username,\n old: oldDisplayName,\n new: newDisplayName,\n }}\n />\n );\n}\n\nfunction renderConvertChannelToPrivateMessage(post: Post): ReactNode {\n if (!(post.props.username)) {\n return null;\n }\n\n const username = renderUsername(post.props.username);\n\n return (\n <FormattedMessage\n id='api.channel.post_convert_channel_to_private.updated_from'\n defaultMessage='{username} converted the channel from public to private'\n values={{\n username,\n }}\n />\n );\n}\n\nfunction renderPurposeChangeMessage(post: Post): ReactNode {\n if (!post.props.username) {\n return null;\n }\n\n const username = renderUsername(post.props.username);\n const oldPurpose = post.props.old_purpose;\n const newPurpose = post.props.new_purpose;\n\n if (post.props.new_purpose) {\n if (post.props.old_purpose) {\n return (\n <FormattedMessage\n id='app.channel.post_update_channel_purpose_message.updated_from'\n defaultMessage='{username} updated the channel purpose from: {old} to: {new}'\n values={{\n username,\n old: oldPurpose,\n new: newPurpose,\n }}\n />\n );\n }\n\n return (\n <FormattedMessage\n id='app.channel.post_update_channel_purpose_message.updated_to'\n defaultMessage='{username} updated the channel purpose to: {new}'\n values={{\n username,\n new: newPurpose,\n }}\n />\n );\n } else if (post.props.old_purpose) {\n return (\n <FormattedMessage\n id='app.channel.post_update_channel_purpose_message.removed'\n defaultMessage='{username} removed the channel purpose (was: {old})'\n values={{\n username,\n old: oldPurpose,\n }}\n />\n );\n }\n\n return null;\n}\n\nfunction renderChannelDeletedMessage(post: Post): ReactNode {\n if (!post.props.username) {\n return null;\n }\n\n const username = renderUsername(post.props.username);\n\n return (\n <FormattedMessage\n id='api.channel.delete_channel.archived'\n defaultMessage='{username} has archived the channel.'\n values={{username}}\n />\n );\n}\n\nfunction renderChannelUnarchivedMessage(post: Post): ReactNode {\n if (!post.props.username) {\n return null;\n }\n\n const username = renderUsername(post.props.username);\n\n return (\n <FormattedMessage\n id='api.channel.restore_channel.unarchived'\n defaultMessage='{username} has unarchived the channel.'\n values={{username}}\n />\n );\n}\n\nfunction renderMeMessage(post: Post): ReactNode {\n // Trim off the leading and trailing asterisk added to /me messages\n const message = post.message.replace(/^\\*|\\*$/g, '');\n\n return renderFormattedText(message);\n}\n\nconst systemMessageRenderers = {\n [Posts.POST_TYPES.JOIN_CHANNEL]: renderJoinChannelMessage,\n [Posts.POST_TYPES.LEAVE_CHANNEL]: renderLeaveChannelMessage,\n [Posts.POST_TYPES.ADD_TO_CHANNEL]: renderAddToChannelMessage,\n [Posts.POST_TYPES.EPHEMERAL_ADD_TO_CHANNEL]: renderAddToChannelMessage,\n [Posts.POST_TYPES.REMOVE_FROM_CHANNEL]: renderRemoveFromChannelMessage,\n [Posts.POST_TYPES.JOIN_TEAM]: renderJoinTeamMessage,\n [Posts.POST_TYPES.LEAVE_TEAM]: renderLeaveTeamMessage,\n [Posts.POST_TYPES.ADD_TO_TEAM]: renderAddToTeamMessage,\n [Posts.POST_TYPES.REMOVE_FROM_TEAM]: renderRemoveFromTeamMessage,\n [Posts.POST_TYPES.HEADER_CHANGE]: renderHeaderChangeMessage,\n [Posts.POST_TYPES.DISPLAYNAME_CHANGE]: renderDisplayNameChangeMessage,\n [Posts.POST_TYPES.CONVERT_CHANNEL]: renderConvertChannelToPrivateMessage,\n [Posts.POST_TYPES.PURPOSE_CHANGE]: renderPurposeChangeMessage,\n [Posts.POST_TYPES.CHANNEL_DELETED]: renderChannelDeletedMessage,\n [Posts.POST_TYPES.CHANNEL_UNARCHIVED]: renderChannelUnarchivedMessage,\n [Posts.POST_TYPES.ME]: renderMeMessage,\n};\n\nexport type AddMemberProps = {\n post_id: string;\n not_in_channel_user_ids: string[];\n not_in_groups_usernames: string[];\n not_in_channel_usernames: string[];\n}\n\nexport function isAddMemberProps(v: unknown): v is AddMemberProps {\n if (typeof v !== 'object' || !v) {\n return false;\n }\n\n if (!('post_id' in v) || typeof v.post_id !== 'string') {\n return false;\n }\n\n if (!('not_in_channel_user_ids' in v) || !isStringArray(v.not_in_channel_user_ids)) {\n return false;\n }\n\n if (!('not_in_groups_usernames' in v) || !isStringArray(v.not_in_groups_usernames)) {\n return false;\n }\n\n if (!('not_in_channel_usernames' in v) || !isStringArray(v.not_in_channel_usernames)) {\n return false;\n }\n\n return true;\n}\n\nexport function renderSystemMessage(post: Post, currentTeamName: string, channel: Channel, hideGuestTags: boolean, isUserCanManageMembers?: boolean, isMilitaryTime?: boolean, timezone?: string): ReactNode {\n const isEphemeral = isPostEphemeral(post);\n if (isEphemeral && post.props?.type === Posts.POST_TYPES.REMINDER) {\n return renderReminderACKMessage(post, currentTeamName, Boolean(isMilitaryTime), timezone);\n }\n if (isAddMemberProps(post.props?.add_channel_member)) {\n if (channel && (channel.type === General.PRIVATE_CHANNEL || channel.type === General.OPEN_CHANNEL) &&\n isUserCanManageMembers &&\n isEphemeral\n ) {\n const addMemberProps = post.props.add_channel_member;\n return (\n <PostAddChannelMember\n postId={addMemberProps.post_id}\n userIds={addMemberProps.not_in_channel_user_ids}\n noGroupsUsernames={addMemberProps.not_in_groups_usernames}\n usernames={addMemberProps.not_in_channel_usernames}\n />\n );\n }\n\n return null;\n } else if (systemMessageRenderers[post.type]) {\n return systemMessageRenderers[post.type](post);\n } else if (post.type === Posts.POST_TYPES.GUEST_JOIN_CHANNEL) {\n return renderGuestJoinChannelMessage(post, hideGuestTags);\n } else if (post.type === Posts.POST_TYPES.ADD_GUEST_TO_CHANNEL) {\n return renderAddGuestToChannelMessage(post, hideGuestTags);\n } else if (post.type === Posts.POST_TYPES.COMBINED_USER_ACTIVITY && isUserActivityProp(post.props.user_activity)) {\n const {allUserIds, allUsernames, messageData} = post.props.user_activity;\n\n return (\n <CombinedSystemMessage\n allUserIds={allUserIds}\n allUsernames={allUsernames}\n messageData={messageData}\n />\n );\n } else if (post.type === Posts.POST_TYPES.GM_CONVERTED_TO_CHANNEL) {\n // This is rendered via a separate component instead of registering in\n // systemMessageRenderers because we need to format a list with keeping i18n support\n // which cannot be done outside a react component.\n return (\n <GMConversionMessage post={post}/>\n );\n }\n\n return null;\n}\n\nfunction renderReminderACKMessage(post: Post, currentTeamName: string, isMilitaryTime: boolean, timezone?: string): ReactNode {\n const username = renderUsername(post.props.username);\n const teamUrl = `${getSiteURL()}/${post.props.team_name || currentTeamName}`;\n const link = `${teamUrl}/pl/${post.props.post_id}`;\n const permaLink = renderFormattedText(`[${link}](${link})`);\n const targetTime = ensureNumber(post.props.target_time);\n const localTime = new Date(targetTime * 1000);\n\n const reminderTime = (\n <FormattedTime\n value={localTime}\n hour12={!isMilitaryTime}\n timeZone={timezone}\n />);\n const reminderDate = (\n <FormattedDate\n value={localTime}\n day='2-digit'\n month='short'\n year='numeric'\n timeZone={timezone}\n />);\n return (\n <FormattedMessage\n id={'post.reminder.acknowledgement'}\n defaultMessage='You will be reminded at {reminderTime}, {reminderDate} about this message from {username}: {permaLink}'\n values={{\n reminderTime,\n reminderDate,\n username,\n permaLink,\n }}\n />\n );\n}\n\nexport function renderReminderSystemBotMessage(post: Post, currentTeam: Team): ReactNode {\n const username = post.props.username ? renderUsername(post.props.username) : '';\n const teamUrl = `${getSiteURL()}/${post.props.team_name || currentTeam.name}`;\n const link = `${teamUrl}/pl/${post.props.post_id}`;\n const permaLink = renderFormattedText(`[${link}](${link})`);\n return (\n <FormattedMessage\n id={'post.reminder.systemBot'}\n defaultMessage=\"Hi there, here's your reminder about this message from {username}: {permaLink}\"\n values={{\n username,\n permaLink,\n }}\n />\n );\n}\n\n// These messages are used by app.MoveThread on the server\ndefineMessages({\n channelMultipleMessages: {\n id: 'app.post.move_thread_command.channel.multiple_messages',\n defaultMessage: 'A thread with {numMessages, number} messages has been moved: {link}\\n',\n },\n channelOneMessage: {\n id: 'app.post.move_thread_command.channel.one_message',\n defaultMessage: 'A message has been moved: {link}\\n',\n },\n dmMultipleMessages: {\n id: 'app.post.move_thread_command.direct_or_group.multiple_messages',\n defaultMessage: 'A thread with {numMessages, number} messages has been moved to a Direct/Group Message\\n',\n },\n dmOneMessage: {\n id: 'app.post.move_thread_command.direct_or_group.one_message',\n defaultMessage: 'A message has been moved to a Direct/Group Message\\n',\n },\n fromAnotherChannel: {\n id: 'app.post.move_thread.from_another_channel',\n defaultMessage: 'This thread was moved from another channel',\n },\n});\n\nexport function renderWranglerSystemMessage(post: Post): ReactNode {\n let values: React.ComponentProps<typeof FormattedMessage>['values'] = {};\n const id = ensureString(post.props?.TranslationID);\n const movedThreadPermalink = ensureString(post.props?.MovedThreadPermalink);\n if (movedThreadPermalink) {\n values = {\n link: movedThreadPermalink,\n };\n const numMessages = ensureNumber(post.props.NumMessages);\n if (numMessages > 1) {\n values.number = post.props.NumMessages;\n }\n }\n return (\n <FormattedMessage\n id={id}\n defaultMessage={post.message}\n values={values}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport memoize from 'memoize-one';\nimport React from 'react';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {Posts} from 'mattermost-redux/constants';\n\nimport Markdown from 'components/markdown';\n\nimport {isChannelNamesMap, type TextFormattingOptions} from 'utils/text_formatting';\n\nimport {renderReminderSystemBotMessage, renderSystemMessage, renderWranglerSystemMessage} from './system_message_helpers';\n\nimport {type PropsFromRedux} from './index';\n\nexport type OwnProps = {\n\n /**\n * Any extra props that should be passed into the image component\n */\n imageProps?: Record<string, unknown>;\n\n /**\n * The post text to be rendered\n */\n message: string;\n\n /**\n * The optional post for which this message is being rendered\n */\n post?: Post;\n channelId: string;\n\n /**\n * Whether or not to render the post edited indicator\n * @default true\n */\n showPostEditedIndicator?: boolean;\n options?: TextFormattingOptions;\n};\n\ntype Props = PropsFromRedux & OwnProps;\n\nexport default class PostMarkdown extends React.PureComponent<Props> {\n static defaultProps = {\n pluginHooks: [],\n options: {},\n showPostEditedIndicator: true,\n };\n\n getOptions = memoize(\n (options?: TextFormattingOptions, disableGroupHighlight?: boolean, mentionHighlight?: boolean, editedAt?: number) => {\n return {\n ...options,\n disableGroupHighlight,\n mentionHighlight,\n editedAt,\n };\n });\n\n render() {\n let message = this.props.message;\n\n if (this.props.post) {\n const renderedSystemMessage = this.props.channel ? renderSystemMessage(this.props.post,\n this.props.currentTeam?.name ?? '',\n this.props.channel,\n this.props.hideGuestTags,\n this.props.isUserCanManageMembers,\n this.props.isMilitaryTime,\n this.props.timezone) : null;\n if (renderedSystemMessage) {\n return <div>{renderedSystemMessage}</div>;\n }\n }\n\n if (this.props.post && this.props.post.type === Posts.POST_TYPES.REMINDER) {\n if (!this.props.currentTeam) {\n return null;\n }\n const renderedSystemBotMessage = renderReminderSystemBotMessage(this.props.post, this.props.currentTeam);\n return <div>{renderedSystemBotMessage}</div>;\n }\n\n if (this.props.post && this.props.post.type === Posts.POST_TYPES.WRANGLER) {\n const renderedWranglerMessage = renderWranglerSystemMessage(this.props.post);\n return <div>{renderedWranglerMessage}</div>;\n }\n\n // Proxy images if we have an image proxy and the server hasn't already rewritten the this.props.post's image URLs.\n const proxyImages = !this.props.post || !this.props.post.message_source || this.props.post.message === this.props.post.message_source;\n const channelNamesMap = isChannelNamesMap(this.props.post?.props?.channel_mentions) ? this.props.post?.props?.channel_mentions : undefined;\n\n this.props.pluginHooks?.forEach((o) => {\n if (o && o.hook && this.props.post) {\n message = o.hook(this.props.post, message);\n }\n });\n\n let mentionHighlight = this.props.options?.mentionHighlight;\n if (this.props.post && this.props.post.props) {\n mentionHighlight = !this.props.post.props.mentionHighlightDisabled;\n }\n\n const options = this.getOptions(\n this.props.options,\n this.props.post?.props?.disable_group_highlight === true,\n mentionHighlight,\n this.props.post?.edit_at,\n );\n\n let highlightKeys;\n if (!this.props.isEnterpriseOrCloudOrSKUStarterFree && this.props.isEnterpriseReady) {\n highlightKeys = this.props.highlightKeys;\n }\n\n return (\n <Markdown\n imageProps={this.props.imageProps}\n message={message}\n proxyImages={proxyImages}\n mentionKeys={this.props.mentionKeys}\n highlightKeys={highlightKeys}\n options={options}\n channelNamesMap={channelNamesMap}\n hasPluginTooltips={this.props.hasPluginTooltips}\n imagesMetadata={this.props.post?.metadata?.images}\n postId={this.props.post?.id}\n editedAt={this.props.showPostEditedIndicator ? this.props.post?.edit_at : undefined}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {type ConnectedProps, connect} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {\n getMyGroupMentionKeysForChannel,\n getMyGroupMentionKeys,\n} from 'mattermost-redux/selectors/entities/groups';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\nimport {getCurrentUserMentionKeys, getHighlightWithoutNotificationKeys} from 'mattermost-redux/selectors/entities/users';\n\nimport {canManageMembers} from 'utils/channel_utils';\nimport {Preferences} from 'utils/constants';\nimport {isEnterpriseOrCloudOrSKUStarterFree} from 'utils/license_utils';\nimport type {MentionKey} from 'utils/text_formatting';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostMarkdown, {type OwnProps} from './post_markdown';\n\nexport function makeGetMentionKeysForPost(): (\n state: GlobalState,\n post?: Post,\n channel?: Channel\n) => MentionKey[] {\n return createSelector(\n 'makeGetMentionKeysForPost',\n getCurrentUserMentionKeys,\n (state: GlobalState, post?: Post) => post,\n (state: GlobalState, post?: Post, channel?: Channel) =>\n (channel ? getMyGroupMentionKeysForChannel(state, channel.team_id, channel.id) : getMyGroupMentionKeys(state, false)),\n (mentionKeysWithoutGroups, post, groupMentionKeys) => {\n let mentionKeys = mentionKeysWithoutGroups;\n if (!post?.props?.disable_group_highlight) {\n mentionKeys = mentionKeys.concat(groupMentionKeys);\n }\n\n if (post?.props?.mentionHighlightDisabled) {\n mentionKeys = mentionKeys.filter(\n (value) => !['@all', '@channel', '@here'].includes(value.key),\n );\n }\n\n return mentionKeys;\n },\n );\n}\n\nfunction makeMapStateToProps() {\n const getMentionKeysForPost = makeGetMentionKeysForPost();\n\n return (state: GlobalState, ownProps: OwnProps) => {\n const channel = getChannel(state, ownProps.channelId);\n const currentTeam = getCurrentTeam(state);\n\n const license = getLicense(state);\n const subscriptionProduct = getSubscriptionProduct(state);\n\n const config = getConfig(state);\n const isEnterpriseReady = config.BuildEnterpriseReady === 'true';\n\n return {\n channel,\n currentTeam,\n pluginHooks: state.plugins.components.MessageWillFormat,\n hasPluginTooltips: Boolean(state.plugins.components.LinkTooltip),\n isUserCanManageMembers: channel && canManageMembers(state, channel),\n mentionKeys: getMentionKeysForPost(state, ownProps.post, channel),\n highlightKeys: getHighlightWithoutNotificationKeys(state),\n isMilitaryTime: getBool(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.USE_MILITARY_TIME, false),\n timezone: getCurrentTimezone(state),\n hideGuestTags: getConfig(state).HideGuestTags === 'true',\n isEnterpriseOrCloudOrSKUStarterFree: isEnterpriseOrCloudOrSKUStarterFree(license, subscriptionProduct, isEnterpriseReady),\n isEnterpriseReady,\n };\n };\n}\n\nconst connector = connect(makeMapStateToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(PostMarkdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo} from 'react';\nimport {FormattedMessage, FormattedList} from 'react-intl';\n\nexport function HasSpecialMentions({specialMentions}: {specialMentions: {[key: string]: boolean}}) {\n const mentions = useMemo(() => {\n return Object.keys(specialMentions).\n filter((key) => specialMentions[key]).\n map((key) => `@${key}`);\n\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [\n specialMentions.all,\n specialMentions.here,\n specialMentions.channel,\n ]);\n /* eslint-enable react-hooks/exhaustive-deps */\n\n return (\n <FormattedMessage\n id={'post_priority.error.special_mentions'}\n defaultMessage={'{mention} can’t be used with persistent notifications'}\n values={{\n mention: (\n <FormattedList\n value={mentions}\n type='disjunction'\n />\n ),\n }}\n />\n );\n}\n\nexport function HasNoMentions() {\n return (\n <FormattedMessage\n id={'post_priority.error.no_mentions'}\n defaultMessage={'Recipients must be @mentioned'}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {PostPriority} from '@mattermost/types/posts';\n\nimport Tag from 'components/widgets/tag/tag';\nimport type {TagSize} from 'components/widgets/tag/tag';\n\ntype Props = {\n priority?: PostPriority|'';\n size?: TagSize;\n uppercase?: boolean;\n}\n\nexport default function PriorityLabel({\n priority,\n ...rest\n}: Props) {\n const {formatMessage} = useIntl();\n\n if (priority === PostPriority.URGENT) {\n return (\n <Tag\n {...rest}\n variant='danger'\n icon={'alert-outline'}\n text={formatMessage({id: 'post_priority.priority.urgent', defaultMessage: 'Urgent'})}\n uppercase={true}\n />\n );\n }\n\n if (priority === PostPriority.IMPORTANT) {\n return (\n <Tag\n {...rest}\n variant='info'\n icon={'alert-circle-outline'}\n text={formatMessage({id: 'post_priority.priority.important', defaultMessage: 'Important'})}\n uppercase={true}\n />\n );\n }\n\n return null;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {ensureString} from 'mattermost-redux/utils/post_utils';\n\nimport ProfilePicture from 'components/profile_picture';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\n\nimport Constants, {UserStatuses} from 'utils/constants';\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils';\n\ntype Props = {\n availabilityStatusOnPosts: string;\n compactDisplay?: boolean;\n enablePostIconOverride: boolean;\n hasImageProxy: boolean;\n post: Post;\n status?: string;\n user: UserProfile;\n isBot?: boolean;\n overwriteIcon?: string;\n}\n\nexport default class PostProfilePicture extends React.PureComponent<Props> {\n static defaultProps = {\n status: UserStatuses.OFFLINE,\n };\n\n getProfilePictureURL = (): string => {\n const {post, user} = this.props;\n\n if (user && user.id === post.user_id) {\n return Utils.imageURLForUser(user.id, user.last_picture_update);\n } else if (post.user_id) {\n return Utils.imageURLForUser(post.user_id);\n }\n\n return '';\n };\n\n getStatus = (fromAutoResponder: boolean, fromWebhook: boolean, user: UserProfile): string | undefined => {\n if (fromAutoResponder || fromWebhook || (user && user.is_bot)) {\n return '';\n }\n\n return this.props.status;\n };\n\n getPostIconURL = (defaultURL: string, fromAutoResponder: boolean, fromWebhook: boolean): string => {\n const {enablePostIconOverride, hasImageProxy, post} = this.props;\n const postProps = post.props;\n const postIconOverrideURL = ensureString(postProps?.override_icon_url);\n const useUserIcon = ensureString(postProps?.use_user_icon);\n\n if (this.props.compactDisplay) {\n return '';\n }\n\n if (!fromAutoResponder && fromWebhook && !useUserIcon && enablePostIconOverride) {\n if (postIconOverrideURL && postIconOverrideURL !== '') {\n return PostUtils.getImageSrc(postIconOverrideURL, hasImageProxy);\n }\n\n return Constants.DEFAULT_WEBHOOK_LOGO;\n }\n\n return defaultURL;\n };\n\n render() {\n const {\n availabilityStatusOnPosts,\n compactDisplay,\n post,\n user,\n isBot,\n } = this.props;\n\n const isSystemMessage = PostUtils.isSystemMessage(post);\n const fromWebhook = PostUtils.isFromWebhook(post);\n\n if (isSystemMessage && !compactDisplay && !fromWebhook && !isBot) {\n return <MattermostLogo className='icon'/>;\n }\n const fromAutoResponder = PostUtils.fromAutoResponder(post);\n\n const profileSrc = this.getProfilePictureURL();\n const src = this.getPostIconURL(profileSrc, fromAutoResponder, fromWebhook);\n\n const overrideIconEmoji = ensureString(post.props.override_icon_emoji);\n const overwriteName = ensureString(post.props?.override_username);\n const isEmoji = overrideIconEmoji !== '';\n const status = this.getStatus(fromAutoResponder, fromWebhook, user);\n\n return (\n <ProfilePicture\n size='md'\n src={src}\n profileSrc={profileSrc}\n isEmoji={isEmoji}\n status={availabilityStatusOnPosts === 'true' ? status : ''}\n userId={user?.id}\n channelId={post.channel_id}\n username={user?.username}\n overwriteIcon={this.props.overwriteIcon}\n overwriteName={overwriteName}\n isBot={user?.is_bot}\n fromAutoResponder={fromAutoResponder}\n fromWebhook={fromWebhook}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\nimport {getUser, getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\nimport {ensureString} from 'mattermost-redux/utils/post_utils';\n\nimport {Preferences} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostProfilePicture from './post_profile_picture';\n\ntype Props = {\n userId: string;\n post: Post;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const config = getConfig(state);\n const user = getUser(state, ownProps.userId);\n const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n const availabilityStatusOnPosts = get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.AVAILABILITY_STATUS_ON_POSTS, Preferences.AVAILABILITY_STATUS_ON_POSTS_DEFAULT);\n const overrideIconUrl = enablePostIconOverride && ensureString(ownProps.post?.props?.override_icon_url);\n let overwriteIcon;\n if (overrideIconUrl) {\n overwriteIcon = Client4.getAbsoluteUrl(overrideIconUrl);\n }\n\n return {\n availabilityStatusOnPosts,\n enablePostIconOverride: config.EnablePostIconOverride === 'true',\n overwriteIcon,\n hasImageProxy: config.HasImageProxy === 'true',\n status: getStatusForUserId(state, ownProps.userId),\n isBot: Boolean(user && user.is_bot),\n user,\n };\n}\n\nexport default connect(mapStateToProps)(PostProfilePicture);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {makeGenerateCombinedPost} from 'mattermost-redux/utils/post_list';\n\nimport Post from 'components/post';\n\nimport {shouldShowDotMenu} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n combinedId: string;\n shouldHighlight?: boolean;\n shouldShowDotMenu?: boolean;\n}\n\nfunction makeMapStateToProps() {\n const generateCombinedPost = makeGenerateCombinedPost();\n\n return (state: GlobalState, ownProps: Props) => {\n const post = generateCombinedPost(state, ownProps.combinedId);\n const channel = state.entities.channels.channels[post.channel_id];\n\n return {\n post,\n postId: ownProps.combinedId,\n shouldHighlight: ownProps.shouldHighlight,\n shouldShowDotMenu: shouldShowDotMenu(state, post, channel),\n };\n };\n}\n\n// Note that this also passes through Post's mapStateToProps\nexport default connect(makeMapStateToProps)(Post);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React, {memo} from 'react';\nimport type {FC} from 'react';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport BasicSeparator from 'components/widgets/separator/basic-separator';\n\nconst DATE_RANGES = [\n RelativeRanges.TODAY_TITLE_CASE,\n RelativeRanges.YESTERDAY_TITLE_CASE,\n];\n\ntype Props = {\n date: number | Date;\n}\n\nconst DateSeparator: FC<Props> = ({date}) => {\n return (\n <BasicSeparator>\n <Timestamp\n value={date}\n useTime={false}\n useSemanticOutput={false}\n ranges={DATE_RANGES}\n />\n </BasicSeparator>\n );\n};\n\nDateSeparator.propTypes = {\n date: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.instanceOf(Date),\n ]).isRequired,\n};\n\nexport default memo(DateSeparator);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\n\nconst DATE_RANGES = [\n RelativeRanges.TODAY_TITLE_CASE,\n RelativeRanges.YESTERDAY_TITLE_CASE,\n];\ntype Props = {\n isScrolling: boolean;\n createAt: Date | number;\n toastPresent: boolean;\n isRhsPost?: boolean;\n}\n\nconst FloatingTimestamp = ({createAt, isScrolling, isRhsPost, toastPresent}: Props) => {\n if (createAt === 0) {\n return null;\n }\n\n const classes = classNames('post-list__timestamp', {\n scrolling: isScrolling,\n rhs: isRhsPost,\n toastAdjustment: toastPresent,\n });\n\n return (\n <div\n className={classes}\n data-testid='floatingTimestamp'\n >\n <div>\n <span>\n <Timestamp\n value={createAt}\n useTime={false}\n ranges={DATE_RANGES}\n />\n </span>\n </div>\n </div>\n );\n};\n\nexport default React.memo(FloatingTimestamp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport * as PostListUtils from 'mattermost-redux/utils/post_list';\n\nimport {getToastStatus} from 'selectors/views/channel';\nimport {getThreadToastStatus} from 'selectors/views/threads';\n\nimport type {GlobalState} from 'types/store';\n\nimport FloatingTimestamp from './floating_timestamp';\n\ntype OwnProps = {\n postId: string;\n isRhsPost?: boolean;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n let postId = ownProps.postId;\n if (PostListUtils.isCombinedUserActivityPost(postId)) {\n const combinedIds = PostListUtils.getPostIdsForCombinedUserActivityPost(postId);\n\n postId = combinedIds[combinedIds.length - 1];\n }\n\n const post = getPost(state, postId);\n\n const toastPresent = ownProps.isRhsPost ? getThreadToastStatus(state) : getToastStatus(state);\n return {\n createAt: post ? post.create_at : 0,\n toastPresent,\n };\n}\n\nexport default connect(mapStateToProps)(FloatingTimestamp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport './separator.scss';\nimport './notification-separator.scss';\n\ntype Props = {\n children?: React.ReactNode;\n};\n\nconst NotificationSeparator = ({children}: Props) => {\n return (\n <div\n className='Separator NotificationSeparator'\n data-testid='NotificationSeparator'\n >\n <hr className='separator__hr'/>\n {children && (\n <div className='separator__text'>\n {children}\n </div>\n )}\n </div>\n );\n};\n\nexport default React.memo(NotificationSeparator);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport * as PostList from 'mattermost-redux/utils/post_list';\n\nimport NotificationSeparator from 'components/widgets/separator/notification-separator';\n\nimport type {PluginComponent} from 'types/store/plugins';\n\ntype Props = {\n separatorId: string;\n wrapperRef?: React.RefObject<HTMLDivElement>;\n newMessagesSeparatorActions: PluginComponent[];\n channelId?: string;\n threadId?: string;\n}\n\nconst NewMessageSeparator = ({\n newMessagesSeparatorActions,\n channelId,\n threadId,\n wrapperRef,\n separatorId,\n}: Props) => {\n const lastViewedAt = PostList.getTimestampForStartOfNewMessages(separatorId);\n\n const pluginItems = newMessagesSeparatorActions?.\n map((item) => {\n if (!item.component) {\n return null;\n }\n\n const Component = item.component as any;\n return (\n <Component\n key={item.id}\n lastViewedAt={lastViewedAt}\n channelId={channelId}\n threadId={threadId}\n />\n );\n });\n\n return (\n <div\n ref={wrapperRef}\n className='new-separator'\n >\n <NotificationSeparator>\n <FormattedMessage\n id='posts_view.newMsg'\n defaultMessage='New Messages'\n />\n {pluginItems}\n </NotificationSeparator>\n </div>\n );\n};\n\nexport default memo(NewMessageSeparator);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {usePostAriaLabel} from 'utils/post_utils';\n\nexport type Props = React.HTMLProps<HTMLDivElement> & {\n post: Post;\n}\n\nconst PostAriaLabelDiv = React.forwardRef((props: Props, ref: React.Ref<HTMLDivElement>) => {\n const {\n children,\n post,\n ...otherProps\n } = props;\n\n const ariaLabel = usePostAriaLabel(post);\n\n return (\n <div\n ref={ref}\n aria-label={ariaLabel}\n {...otherProps}\n >\n {children}\n </div>\n );\n});\n\nPostAriaLabelDiv.displayName = 'PostAriaLabelDiv';\n\nexport default PostAriaLabelDiv;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\ntype Point = {\n height: number;\n width: number;\n};\n\ntype PartialPoint = Partial<Point>;\n\nfunction isPointDefined(point: PartialPoint): point is Point {\n return point.height !== undefined && point.width !== undefined;\n}\n\nexport function getDistanceBW2Points(point1: Point, point2: Point) {\n return Math.sqrt(Math.pow(point1.width - point2.width, 2) + Math.pow(point1.height - point2.height, 2));\n}\n\n/**\n * Funtion to return nearest point of given pivot point.\n * It return two points one nearest and other nearest but having both coorditanes smaller than the given point's coordinates.\n */\nexport function getNearestPoint<T extends PartialPoint>(pivot: Point, points: T[]): T {\n return points.reduce((nearest, point) => {\n if (isPointDefined(nearest) && isPointDefined(point) &&\n getDistanceBW2Points(point, pivot) >= getDistanceBW2Points(nearest, pivot)) {\n return nearest;\n }\n return point;\n }, {} as T);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo, useRef} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {CloseIcon, MenuDownIcon, MenuRightIcon} from '@mattermost/compass-icons/components';\nimport type {\n OpenGraphMetadata,\n OpenGraphMetadataImage,\n Post,\n PostImage,\n} from '@mattermost/types/posts';\n\nimport AutoHeightSwitcher from 'components/common/auto_height_switcher';\nimport ExternalImage from 'components/external_image';\nimport ExternalLink from 'components/external_link';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {PostTypes} from 'utils/constants';\nimport {isSystemMessage} from 'utils/post_utils';\nimport {makeUrlSafe} from 'utils/url';\n\nimport {getNearestPoint} from './get_nearest_point';\n\nimport './post_attachment_opengraph.scss';\n\nconst DIMENSIONS_NEAREST_POINT_IMAGE = {\n height: 80,\n width: 80,\n};\n\nconst LARGE_IMAGE_RATIO = 4 / 3;\nconst LARGE_IMAGE_WIDTH = 150;\n\nexport type Props = {\n postId: string;\n link: string;\n currentUserId?: string;\n post: Post;\n openGraphData?: OpenGraphMetadata;\n enableLinkPreviews?: boolean;\n previewEnabled?: boolean;\n isEmbedVisible?: boolean;\n toggleEmbedVisibility: () => void;\n actions: {\n editPost: (post: { id: string; props: Record<string, any> }) => void;\n };\n isInPermalink?: boolean;\n imageCollapsed?: boolean;\n};\n\ntype ImageMetadata = Partial<OpenGraphMetadataImage> & PostImage;\n\nexport function getBestImage(openGraphData?: OpenGraphMetadata, imagesMetadata?: Record<string, PostImage>) {\n if (!openGraphData?.images?.length) {\n return null;\n }\n\n // Get the dimensions from the post metadata if they weren't provided by the website as part of the OpenGraph data\n const images = openGraphData.images.map((image: OpenGraphMetadataImage) => {\n const imageUrl = image.secure_url || image.url;\n\n return {\n ...image,\n height: image.height || imagesMetadata?.[imageUrl]?.height || -1,\n width: image.width || imagesMetadata?.[imageUrl]?.width || -1,\n format: image.type?.split('/')[1] || image.type || '',\n frameCount: 0,\n };\n });\n\n return getNearestPoint<ImageMetadata>(DIMENSIONS_NEAREST_POINT_IMAGE, images);\n}\n\nexport const getIsLargeImage = (data: ImageMetadata|null) => {\n if (!data) {\n return false;\n }\n\n const {height, width} = data;\n\n return width >= LARGE_IMAGE_WIDTH && (width / height) >= LARGE_IMAGE_RATIO;\n};\n\nconst PostAttachmentOpenGraph = ({openGraphData, post, actions, link, isInPermalink, previewEnabled, ...rest}: Props) => {\n const {formatMessage} = useIntl();\n const {current: bestImageData} = useRef<ImageMetadata>(getBestImage(openGraphData, post.metadata.images));\n const isPreviewRemoved = post?.props?.[PostTypes.REMOVE_LINK_PREVIEW] === 'true';\n\n // block of early return statements\n if (!rest.enableLinkPreviews || !previewEnabled || isPreviewRemoved) {\n return null;\n }\n\n if (!post || isSystemMessage(post)) {\n return null;\n }\n\n if (!openGraphData) {\n return null;\n }\n\n const handleRemovePreview = async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n\n // prevent the button-click to trigger visiting the link\n e.stopPropagation();\n const props = Object.assign({}, post.props);\n props[PostTypes.REMOVE_LINK_PREVIEW] = 'true';\n\n const patchedPost = {\n id: post.id,\n props,\n };\n\n return actions.editPost(patchedPost);\n };\n\n const safeLink = makeUrlSafe(openGraphData?.url || link);\n\n return (\n <ExternalLink\n className='PostAttachmentOpenGraph'\n role='link'\n href={safeLink}\n title={openGraphData?.title || openGraphData?.url || link}\n location='post_attachment_opengraph'\n >\n {rest.currentUserId === post.user_id && !isInPermalink && (\n <WithTooltip\n title={formatMessage({id: 'link_preview.remove_link_preview', defaultMessage: 'Remove link preview'})}\n >\n <button\n type='button'\n className='remove-button style--none'\n aria-label='Remove'\n onClick={handleRemovePreview}\n data-testid='removeLinkPreviewButton'\n >\n <CloseIcon\n size={14}\n color={'currentColor'}\n />\n </button>\n </WithTooltip>\n )}\n <PostAttachmentOpenGraphBody\n isInPermalink={isInPermalink}\n sitename={openGraphData?.site_name}\n title={openGraphData?.title || openGraphData?.url || link}\n description={openGraphData?.description}\n />\n <PostAttachmentOpenGraphImage\n imageMetadata={bestImageData}\n title={openGraphData?.title}\n isInPermalink={isInPermalink}\n isEmbedVisible={rest.isEmbedVisible}\n toggleEmbedVisibility={rest.toggleEmbedVisibility}\n />\n </ExternalLink>\n );\n};\n\ntype BodyProps = {\n title: string;\n isInPermalink?: boolean;\n sitename?: string;\n description?: string;\n}\n\nexport const PostAttachmentOpenGraphBody = memo(({title, isInPermalink, sitename = '', description = ''}: BodyProps) => {\n return title ? (\n <div className={classNames('PostAttachmentOpenGraph__body', {isInPermalink})}>\n {(!isInPermalink && sitename) && <span className='sitename'>{sitename}</span>}\n <span className='title'>{title}</span>\n {description && <span className='description'>{description}</span>}\n </div>\n ) : null;\n});\n\ntype ImageProps = {\n title?: string;\n imageMetadata?: ImageMetadata|null;\n isInPermalink: Props['isInPermalink'];\n isEmbedVisible: Props['isEmbedVisible'];\n toggleEmbedVisibility: Props['toggleEmbedVisibility'];\n}\n\nexport const PostAttachmentOpenGraphImage = memo(({imageMetadata, isInPermalink, toggleEmbedVisibility, isEmbedVisible = true, title = ''}: ImageProps) => {\n const {formatMessage} = useIntl();\n\n if (!imageMetadata || isInPermalink) {\n return null;\n }\n\n const large = getIsLargeImage(imageMetadata);\n const src = imageMetadata.secure_url || imageMetadata.url || '';\n\n const toggleImagePreview = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n\n // prevent the button-click to trigger visiting the link\n e.stopPropagation();\n toggleEmbedVisibility();\n };\n\n const collapsedLabel = formatMessage({id: 'link_preview.image_preview', defaultMessage: 'Show image preview'});\n\n const imageCollapseButton = (\n <button\n className='preview-toggle style--none'\n onClick={toggleImagePreview}\n >\n {isEmbedVisible ? (\n <MenuDownIcon\n size={18}\n color='currentColor'\n />\n ) : (\n <>\n <MenuRightIcon\n size={18}\n color='currentColor'\n />\n {collapsedLabel}\n </>\n )}\n </button>\n );\n\n const image = (\n <ExternalImage\n src={src}\n imageMetadata={imageMetadata}\n >\n {(source) => (\n <>\n {large && imageCollapseButton}\n <figure>\n <img\n src={source}\n alt={title}\n />\n </figure>\n </>\n )}\n </ExternalImage>\n );\n\n return (\n <div className={classNames('PostAttachmentOpenGraph__image', {large, collapsed: !isEmbedVisible})}>\n {large ? (\n <AutoHeightSwitcher\n showSlot={isEmbedVisible ? 1 : 2}\n slot1={image}\n slot2={imageCollapseButton}\n />\n ) : image}\n </div>\n );\n});\n\nexport default PostAttachmentOpenGraph;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOpenGraphMetadataForUrl} from 'mattermost-redux/selectors/entities/posts';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {editPost} from 'actions/views/posts';\nimport {arePreviewsCollapsed} from 'selectors/preferences';\n\nimport {Preferences} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostAttachmentOpenGraph from './post_attachment_opengraph';\nimport type {Props} from './post_attachment_opengraph';\n\ntype OwnProps = Pick<Props, 'postId' | 'link'>;\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const config = getConfig(state);\n const imageCollapsed = arePreviewsCollapsed(state);\n\n return {\n currentUserId: getCurrentUserId(state),\n enableLinkPreviews: config.EnableLinkPreviews === 'true',\n openGraphData: getOpenGraphMetadataForUrl(\n state,\n ownProps.postId,\n ownProps.link,\n ),\n previewEnabled: getBool(\n state,\n Preferences.CATEGORY_DISPLAY_SETTINGS,\n Preferences.LINK_PREVIEW_DISPLAY,\n true,\n ),\n imageCollapsed,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({editPost}, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PostAttachmentOpenGraph);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MouseEvent, KeyboardEvent} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {PencilOutlineIcon} from '@mattermost/compass-icons/components';\n\nimport {getDateForTimezone} from 'mattermost-redux/utils/timezone_utils';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport Constants from 'utils/constants';\nimport {isSameDay, isWithinLastWeek, isYesterday} from 'utils/datetime';\n\nimport type {Props} from './index';\n\nconst PostEditedIndicator = ({postId, isMilitaryTime, timeZone, editedAt = 0, postOwner, post, canEdit, actions}: Props): JSX.Element | null => {\n const {formatMessage, formatDate, formatTime} = useIntl();\n\n if (!postId || editedAt === 0) {\n return null;\n }\n\n const editedDate = timeZone ? getDateForTimezone(new Date(editedAt), timeZone) : new Date(editedAt);\n\n let date;\n switch (true) {\n case isSameDay(editedDate):\n date = formatMessage({id: 'datetime.today', defaultMessage: 'today '});\n break;\n case isYesterday(editedDate):\n date = formatMessage({id: 'datetime.yesterday', defaultMessage: 'yesterday '});\n break;\n case isWithinLastWeek(editedDate):\n date = formatDate(editedDate, {weekday: 'long'});\n break;\n case !isWithinLastWeek(editedDate):\n default:\n date = formatDate(editedDate, {month: 'long', day: 'numeric'});\n }\n\n const time = formatTime(editedDate, {hour: 'numeric', minute: '2-digit', hour12: !isMilitaryTime});\n\n const editedText = formatMessage({\n id: 'post_message_view.edited',\n defaultMessage: 'Edited',\n });\n\n const formattedTime = formatMessage({\n id: 'timestamp.datetime',\n defaultMessage: '{relativeOrDate} at {time}',\n },\n {\n relativeOrDate: date,\n time,\n });\n const viewHistoryText = formatMessage({\n id: 'post_message_view.view_post_edit_history',\n defaultMessage: 'Click to view history',\n });\n\n const postOwnerTooltipInfo = (postOwner && canEdit) ? (\n <span className='view-history__text'>{viewHistoryText}</span>\n ) : null;\n\n const showPostEditHistory = (e: MouseEvent<HTMLButtonElement> | KeyboardEvent<unknown>) => {\n e.preventDefault();\n if (post?.id) {\n actions.openShowEditHistory(post);\n }\n };\n\n const handleKeyPress = (e: KeyboardEvent<unknown>) => {\n if (e.key === Constants.KeyCodes.ENTER[0] || e.key === Constants.KeyCodes.SPACE[0]) {\n showPostEditHistory(e);\n }\n };\n\n const editedIndicatorContent = (\n <span\n id={`postEdited_${postId}`}\n className='post-edited__indicator'\n data-post-id={postId}\n data-edited-at={editedAt}\n >\n <PencilOutlineIcon size={12}/>\n {editedText}\n </span>\n );\n\n const editedIndicator = (postOwner && canEdit) ? (\n <button\n className={'style--none'}\n tabIndex={0}\n onClick={showPostEditHistory}\n onKeyUp={handleKeyPress}\n aria-label={editedText}\n >\n {editedIndicatorContent}\n </button>\n ) : editedIndicatorContent;\n\n return !postId || editedAt === 0 ? null : (\n <WithTooltip\n title={\n <>\n {`${editedText} ${formattedTime}`}\n {postOwnerTooltipInfo}\n </>\n }\n >\n {editedIndicator}\n </WithTooltip>\n );\n};\n\nexport default PostEditedIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\n\nimport {openShowEditHistory} from 'actions/views/rhs';\n\nimport type {Props as TimestampProps} from 'components/timestamp/timestamp';\n\nimport {Preferences} from 'utils/constants';\nimport {isPostOwner, canEditPost} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostEditedIndicator from './post_edited_indicator';\n\ntype OwnProps = {\n postId?: string;\n editedAt?: number;\n}\n\ntype StateProps = {\n postOwner?: boolean;\n isMilitaryTime: boolean;\n timeZone?: string;\n post?: Post;\n canEdit: boolean;\n}\n\ntype DispatchProps = {\n actions: {\n openShowEditHistory: (post: Post) => void;\n };\n}\n\nexport type Props = OwnProps & StateProps & DispatchProps;\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps): StateProps {\n const currentUserId = getCurrentUserId(state);\n const post = ownProps.postId ? getPost(state, ownProps.postId) : undefined;\n const license = getLicense(state);\n const config = getConfig(state);\n const channel = getChannel(state, post?.channel_id || '');\n\n const timeZone: TimestampProps['timeZone'] = getCurrentTimezone(state);\n const postOwner = post ? isPostOwner(state, post) : undefined;\n\n const isMilitaryTime = getBool(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.USE_MILITARY_TIME, false);\n const canEdit = post ? canEditPost(state, post, license, config, channel, currentUserId) : false;\n return {isMilitaryTime, timeZone, postOwner, post, canEdit};\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openShowEditHistory,\n }, dispatch),\n };\n}\n\nexport default connect<StateProps, DispatchProps, OwnProps, GlobalState>(mapStateToProps, mapDispatchToProps)(PostEditedIndicator);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {matchPath, useHistory} from 'react-router-dom';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {isTeamSameWithCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {focusPost} from 'components/permalink_view/actions';\n\nimport type {GlobalState} from 'types/store';\n\nexport type Props = {\n className?: string;\n children?: JSX.Element;\n preventClickAction?: boolean;\n link: string;\n};\n\ntype LinkParams = {\n postId: string;\n teamName: string;\n}\n\nconst getTeamAndPostIdFromLink = (link: string) => {\n const match = matchPath<LinkParams>(link, {path: '/:teamName/pl/:postId'});\n return match?.params;\n};\n\nconst PostAttachmentContainer = (props: Props) => {\n const {children, className, link, preventClickAction} = props;\n const history = useHistory();\n\n const params = getTeamAndPostIdFromLink(link);\n\n const dispatch = useDispatch();\n\n const currentUserId = useSelector(getCurrentUserId);\n const shouldFocusPostWithoutRedirect = useSelector((state: GlobalState) => isTeamSameWithCurrentTeam(state, params?.teamName ?? ''));\n const post = useSelector((state: GlobalState) => getPost(state, params?.postId ?? ''));\n const crtEnabled = useSelector(isCollapsedThreadsEnabled);\n\n const handleOnClick = useCallback((e) => {\n const {tagName} = e.target;\n e.stopPropagation();\n const elements = ['A', 'IMG', 'BUTTON', 'I'];\n\n if (\n !elements.includes(tagName) &&\n e.target.getAttribute('role') !== 'button' &&\n e.target.className !== `attachment attachment--${className}`\n ) {\n const classNames = [\n 'icon icon-menu-down',\n 'icon icon-menu-right',\n 'post-image',\n 'file-icon',\n ];\n\n if (params && shouldFocusPostWithoutRedirect && crtEnabled && post && post.root_id) {\n dispatch(focusPost(params.postId, link, currentUserId, {skipRedirectReplyPermalink: true}));\n return;\n }\n if (!classNames.some((className) => e.target.className.includes(className)) && e.target.id !== 'image-name-text') {\n history.push(link);\n }\n }\n }, [className, crtEnabled, dispatch, history, link, params, post, shouldFocusPostWithoutRedirect, currentUserId]);\n return (\n <div\n className={`attachment attachment--${className}`}\n role={preventClickAction ? undefined : 'button'}\n onClick={preventClickAction ? undefined : handleOnClick}\n >\n <div\n className={`attachment__content attachment__content--${className}`}\n >\n <div\n className={`clearfix attachment__container attachment__container--${className}`}\n >\n <div\n className={`attachment__body__wrap attachment__body__wrap--${className}`}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PostAttachmentContainer;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {General} from 'mattermost-redux/constants';\nimport {ensureString} from 'mattermost-redux/utils/post_utils';\n\nimport FileAttachmentListContainer from 'components/file_attachment_list';\nimport PriorityLabel from 'components/post_priority/post_priority_label';\nimport PostAttachmentOpenGraph from 'components/post_view/post_attachment_opengraph';\nimport PostMessageView from 'components/post_view/post_message_view';\nimport Timestamp from 'components/timestamp';\nimport UserProfileComponent from 'components/user_profile';\nimport MattermostLogo from 'components/widgets/icons/mattermost_logo';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport {Constants} from 'utils/constants';\nimport * as PostUtils from 'utils/post_utils';\nimport * as Utils from 'utils/utils';\n\nimport PostAttachmentContainer from '../post_attachment_container/post_attachment_container';\n\nimport type {OwnProps} from './index';\n\nexport type Props = OwnProps & {\n previewPost?: Post;\n currentTeamUrl: string;\n channelDisplayName?: string;\n user: UserProfile | null;\n hasImageProxy: boolean;\n enablePostIconOverride: boolean;\n isEmbedVisible: boolean;\n compactDisplay: boolean;\n isPostPriorityEnabled: boolean;\n handleFileDropdownOpened?: (open: boolean) => void;\n actions: {\n toggleEmbedVisibility: (id: string) => void;\n };\n};\n\nconst PostMessagePreview = (props: Props) => {\n const {currentTeamUrl, channelDisplayName, user, previewPost, metadata, isEmbedVisible, compactDisplay, preventClickAction, previewFooterMessage, handleFileDropdownOpened, isPostPriorityEnabled} = props;\n\n const toggleEmbedVisibility = () => {\n if (previewPost) {\n props.actions.toggleEmbedVisibility(previewPost.id);\n }\n };\n\n const getPostIconURL = (defaultURL: string, fromAutoResponder: boolean, fromWebhook: boolean): string => {\n const {enablePostIconOverride, hasImageProxy, previewPost} = props;\n const postProps = previewPost?.props;\n const postIconOverrideURL = ensureString(postProps?.override_icon_url);\n const useUserIcon = ensureString(postProps?.use_user_icon);\n\n if (!fromAutoResponder && fromWebhook && !useUserIcon && enablePostIconOverride) {\n if (postIconOverrideURL && postIconOverrideURL !== '') {\n return PostUtils.getImageSrc(postIconOverrideURL, hasImageProxy);\n }\n return Constants.DEFAULT_WEBHOOK_LOGO;\n }\n\n return defaultURL;\n };\n\n if (!previewPost) {\n return null;\n }\n\n const isBot = Boolean(user && user.is_bot);\n const isSystemMessage = PostUtils.isSystemMessage(previewPost);\n const fromWebhook = PostUtils.isFromWebhook(previewPost);\n const fromAutoResponder = PostUtils.fromAutoResponder(previewPost);\n const profileSrc = Utils.imageURLForUser(user?.id ?? '');\n const src = getPostIconURL(profileSrc, fromAutoResponder, fromWebhook);\n\n let avatar = (\n <Avatar\n size={'sm'}\n url={src}\n className={'avatar-post-preview'}\n />\n );\n if (isSystemMessage && !fromWebhook && !isBot) {\n avatar = (<MattermostLogo className='icon'/>);\n } else if (user?.id) {\n avatar = (\n <Avatar\n username={user.username}\n size={'sm'}\n url={src}\n className={'avatar-post-preview'}\n />\n );\n }\n\n let fileAttachmentPreview = null;\n\n if (((previewPost.file_ids && previewPost.file_ids.length > 0) || (previewPost.filenames && previewPost.filenames.length > 0))) {\n fileAttachmentPreview = (\n <FileAttachmentListContainer\n post={previewPost}\n compactDisplay={compactDisplay}\n isInPermalink={true}\n handleFileDropdownOpened={handleFileDropdownOpened}\n />\n );\n }\n\n let urlPreview = null;\n\n if (previewPost && previewPost.metadata && previewPost.metadata.embeds) {\n const embed = previewPost.metadata.embeds[0];\n\n if (embed && embed.type === 'opengraph') {\n urlPreview = (\n <PostAttachmentOpenGraph\n postId={previewPost.id}\n link={embed.url}\n isEmbedVisible={isEmbedVisible}\n post={previewPost}\n toggleEmbedVisibility={toggleEmbedVisibility}\n isInPermalink={true}\n />\n );\n }\n }\n\n let teamUrl = `/${metadata.team_name}`;\n if (metadata.channel_type === General.DM_CHANNEL || metadata.channel_type === General.GM_CHANNEL) {\n teamUrl = currentTeamUrl;\n }\n\n const previewFooter = channelDisplayName || previewFooterMessage ? (\n <div className='post__preview-footer'>\n <p>\n {previewFooterMessage || (\n <FormattedMessage\n id='post_message_preview.channel'\n defaultMessage='Only visible to users in ~{channel}'\n values={{\n channel: channelDisplayName,\n }}\n />\n )}\n </p>\n </div>\n ) : null;\n\n const overwriteName = ensureString(previewPost.props?.override_username);\n\n return (\n <PostAttachmentContainer\n className='permalink'\n link={`${teamUrl}/pl/${metadata.post_id}`}\n preventClickAction={preventClickAction}\n >\n <div className='post-preview'>\n <div className='post-preview__header'>\n <div className='col col__name'>\n <div className='post__img'>\n <span className='profile-icon'>\n {avatar}\n </span>\n </div>\n </div>\n <div className={classNames('col col__name', 'permalink--username')}>\n <UserProfileComponent\n userId={user?.id ?? ''}\n disablePopover={true}\n overwriteName={overwriteName}\n />\n </div>\n <div className='col d-flex align-items-center'>\n <Timestamp\n value={previewPost.create_at}\n units={[\n 'now',\n 'minute',\n 'hour',\n 'day',\n ]}\n useTime={false}\n day={'numeric'}\n className='post-preview__time'\n />\n {previewPost.metadata?.priority && isPostPriorityEnabled && (\n <span className='d-flex mr-2 ml-1'>\n <PriorityLabel priority={previewPost.metadata.priority.priority}/>\n </span>\n )}\n </div>\n </div>\n <PostMessageView\n post={previewPost}\n overflowType='ellipsis'\n maxHeight={105}\n />\n {urlPreview}\n {fileAttachmentPreview}\n {previewFooter}\n </div>\n </PostAttachmentContainer>\n );\n};\n\nexport default PostMessagePreview;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {PostPreviewMetadata} from '@mattermost/types/posts';\n\nimport {General} from 'mattermost-redux/constants';\nimport {makeGetChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getPost, isPostPriorityEnabled} from 'mattermost-redux/selectors/entities/posts';\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {toggleEmbedVisibility} from 'actions/post_actions';\nimport {isEmbedVisible} from 'selectors/posts';\n\nimport {Preferences} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostMessagePreview from './post_message_preview';\n\nexport type OwnProps = {\n metadata: PostPreviewMetadata;\n preventClickAction?: boolean;\n previewFooterMessage?: string;\n}\n\nfunction makeMapStateToProps() {\n const getChannel = makeGetChannel();\n\n return (state: GlobalState, ownProps: OwnProps) => {\n const config = getConfig(state);\n const currentTeamUrl = getCurrentRelativeTeamUrl(state);\n let user = null;\n let embedVisible = false;\n let channelDisplayName = ownProps.metadata.channel_display_name;\n const previewPost = getPost(state, ownProps.metadata.post_id);\n\n if (previewPost && previewPost.user_id) {\n user = getUser(state, previewPost.user_id);\n }\n if (previewPost && previewPost.id) {\n embedVisible = isEmbedVisible(state, previewPost.id);\n }\n\n if (ownProps.metadata.channel_type === General.DM_CHANNEL) {\n channelDisplayName = getChannel(state, ownProps.metadata.channel_id)?.display_name || '';\n }\n\n return {\n currentTeamUrl,\n channelDisplayName,\n hasImageProxy: config.HasImageProxy === 'true',\n enablePostIconOverride: config.EnablePostIconOverride === 'true',\n previewPost,\n user,\n isEmbedVisible: embedVisible,\n compactDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT) === Preferences.MESSAGE_DISPLAY_COMPACT,\n isPostPriorityEnabled: isPostPriorityEnabled(state),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({toggleEmbedVisibility}, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(PostMessagePreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\nimport {isPostEphemeral} from 'mattermost-redux/utils/post_utils';\n\nimport PostMarkdown from 'components/post_markdown';\nimport ShowMore from 'components/post_view/show_more';\nimport type {AttachmentTextOverflowType} from 'components/post_view/show_more/show_more';\n\nimport Pluggable from 'plugins/pluggable';\nimport type {TextFormattingOptions} from 'utils/text_formatting';\nimport * as Utils from 'utils/utils';\n\ntype Props = {\n post: Post; /* The post to render the message for */\n enableFormatting?: boolean; /* Set to enable Markdown formatting */\n options?: TextFormattingOptions; /* Options specific to text formatting */\n compactDisplay?: boolean; /* Set to render post body compactly */\n isRHS?: boolean; /* Flags if the post_message_view is for the RHS (Reply). */\n isRHSOpen?: boolean; /* Whether or not the RHS is visible */\n isRHSExpanded?: boolean; /* Whether or not the RHS is expanded */\n theme: Theme; /* Logged in user's theme */\n pluginPostTypes?: any; /* Post type components from plugins */\n currentRelativeTeamUrl: string;\n overflowType?: AttachmentTextOverflowType;\n maxHeight?: number; /* The max height used by the show more component */\n showPostEditedIndicator?: boolean; /* Whether or not to render the post edited indicator */\n}\n\ntype State = {\n collapse: boolean;\n hasOverflow: boolean;\n checkOverflow: number;\n}\n\nexport default class PostMessageView extends React.PureComponent<Props, State> {\n private imageProps: any;\n\n static defaultProps = {\n options: {},\n isRHS: false,\n pluginPostTypes: {},\n overflowType: undefined,\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n collapse: true,\n hasOverflow: false,\n checkOverflow: 0,\n };\n\n this.imageProps = {\n onImageLoaded: this.handleHeightReceived,\n onImageHeightChanged: this.checkPostOverflow,\n };\n }\n\n checkPostOverflow = () => {\n // Increment checkOverflow to indicate change in height\n // and recompute textContainer height at ShowMore component\n // and see whether overflow text of show more/less is necessary or not.\n this.setState((prevState) => {\n return {checkOverflow: prevState.checkOverflow + 1};\n });\n };\n\n handleHeightReceived = (height: number) => {\n if (height > 0) {\n this.checkPostOverflow();\n }\n };\n\n renderDeletedPost() {\n return (\n <p>\n <FormattedMessage\n id='post_body.deleted'\n defaultMessage='(message deleted)'\n />\n </p>\n );\n }\n\n handleFormattedTextClick = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) =>\n Utils.handleFormattedTextClick(e, this.props.currentRelativeTeamUrl);\n\n render() {\n const {\n post,\n enableFormatting,\n options,\n pluginPostTypes,\n compactDisplay,\n isRHS,\n theme,\n overflowType,\n maxHeight,\n } = this.props;\n\n if (post.state === Posts.POST_DELETED) {\n return this.renderDeletedPost();\n }\n\n if (!enableFormatting) {\n return <span>{post.message}</span>;\n }\n\n const postType = typeof post.props?.type === 'string' ? post.props.type : post.type;\n\n if (pluginPostTypes && Object.hasOwn(pluginPostTypes, postType)) {\n const PluginComponent = pluginPostTypes[postType].component;\n return (\n <PluginComponent\n post={post}\n compactDisplay={compactDisplay}\n isRHS={isRHS}\n theme={theme}\n />\n );\n }\n\n let message = post.message;\n const isEphemeral = isPostEphemeral(post);\n if (compactDisplay && isEphemeral) {\n const visibleMessage = Utils.localizeMessage({id: 'post_info.message.visible.compact', defaultMessage: ' (Only visible to you)'});\n message = message.concat(visibleMessage);\n }\n\n const id = isRHS ? `rhsPostMessageText_${post.id}` : `postMessageText_${post.id}`;\n\n return (\n <ShowMore\n checkOverflow={this.state.checkOverflow}\n text={message}\n overflowType={overflowType}\n maxHeight={maxHeight}\n >\n <div\n tabIndex={0}\n id={id}\n className='post-message__text'\n dir='auto'\n onClick={this.handleFormattedTextClick}\n >\n <PostMarkdown\n message={message}\n imageProps={this.imageProps}\n options={options}\n post={post}\n channelId={post.channel_id}\n showPostEditedIndicator={this.props.showPostEditedIndicator}\n />\n </div>\n <Pluggable\n pluggableName='PostMessageAttachment'\n postId={post.id}\n onHeightChange={this.handleHeightReceived}\n />\n </ShowMore>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getTheme, getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getIsRhsExpanded, getIsRhsOpen} from 'selectors/rhs';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostMessageView from './post_message_view';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n enableFormatting: getBool(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'formatting', true),\n isRHSExpanded: getIsRhsExpanded(state),\n isRHSOpen: getIsRhsOpen(state),\n pluginPostTypes: state.plugins.postTypes,\n theme: getTheme(state),\n currentRelativeTeamUrl: getCurrentRelativeTeamUrl(state),\n };\n}\n\nexport default connect(mapStateToProps)(PostMessageView);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nexport type AttachmentTextOverflowType = 'ellipsis';\n\nconst MAX_POST_HEIGHT = 600;\nconst MARGIN_CHANGE_FOR_COMPACT_POST = 22;\n\ntype Props = {\n children?: React.ReactNode;\n checkOverflow?: number;\n isAttachmentText?: boolean;\n isRHSExpanded: boolean;\n isRHSOpen: boolean;\n text?: string;\n compactDisplay: boolean;\n overflowType?: AttachmentTextOverflowType;\n maxHeight?: number;\n}\n\ntype State = {\n isCollapsed: boolean;\n isOverflow: boolean;\n}\n\nexport default class ShowMore extends React.PureComponent<Props, State> {\n private maxHeight: number;\n private textContainer: React.RefObject<HTMLDivElement>;\n private overflowRef?: number;\n\n constructor(props: Props) {\n super(props);\n this.maxHeight = this.props.maxHeight || MAX_POST_HEIGHT;\n this.textContainer = React.createRef();\n this.state = {\n isCollapsed: true,\n isOverflow: false,\n };\n }\n\n componentDidMount() {\n this.checkTextOverflow();\n\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(prevProps: Props) {\n if (\n this.props.text !== prevProps.text ||\n this.props.isRHSExpanded !== prevProps.isRHSExpanded ||\n this.props.isRHSOpen !== prevProps.isRHSOpen ||\n this.props.checkOverflow !== prevProps.checkOverflow\n ) {\n this.checkTextOverflow();\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n if (this.overflowRef) {\n window.cancelAnimationFrame(this.overflowRef);\n }\n }\n\n toggleCollapse = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n e.stopPropagation();\n this.setState((prevState) => {\n return {\n isCollapsed: !prevState.isCollapsed,\n };\n });\n };\n\n checkTextOverflow = () => {\n if (this.overflowRef) {\n window.cancelAnimationFrame(this.overflowRef);\n }\n this.overflowRef = window.requestAnimationFrame(() => {\n let isOverflow = false;\n\n if (this.textContainer.current && this.textContainer.current.scrollHeight > this.maxHeight) {\n isOverflow = true;\n }\n\n if (isOverflow !== this.state.isOverflow) {\n this.setState({\n isOverflow,\n });\n }\n });\n };\n\n handleResize = () => {\n this.checkTextOverflow();\n };\n\n render() {\n const {\n isCollapsed,\n isOverflow,\n } = this.state;\n\n const {\n children,\n isAttachmentText,\n compactDisplay,\n overflowType,\n } = this.props;\n\n let className = 'post-message';\n let collapsedMaxHeightStyle: number | undefined;\n if (isCollapsed) {\n collapsedMaxHeightStyle = this.maxHeight;\n className += ' post-message--collapsed';\n } else {\n className += ' post-message--expanded';\n }\n\n const collapseShowMoreClass = isAttachmentText ? 'post-attachment-collapse__show-more' : 'post-collapse__show-more';\n\n let attachmentTextOverflow = null;\n if (isOverflow) {\n if (!isAttachmentText && isCollapsed && compactDisplay) {\n if (collapsedMaxHeightStyle) {\n collapsedMaxHeightStyle -= MARGIN_CHANGE_FOR_COMPACT_POST;\n }\n }\n\n let showIcon = 'fa fa-angle-up';\n let showText = (\n <FormattedMessage\n id='post_info.message.show_less'\n defaultMessage='Show less'\n />\n );\n if (isCollapsed) {\n showIcon = 'fa fa-angle-down';\n showText = (\n <FormattedMessage\n id='post_info.message.show_more'\n defaultMessage='Show more'\n />\n );\n }\n switch (overflowType) {\n case 'ellipsis':\n attachmentTextOverflow = (\n <button\n id='showMoreButton'\n className='post-preview-collapse__show-more-button color--link'\n onClick={this.toggleCollapse}\n >\n {showText}\n </button>\n );\n className += ' post-message-preview--overflow';\n break;\n\n default:\n attachmentTextOverflow = (\n <div className='post-collapse'>\n <div className={collapseShowMoreClass}>\n <div className='post-collapse__show-more-line'/>\n <button\n id='showMoreButton'\n className='post-collapse__show-more-button'\n onClick={this.toggleCollapse}\n >\n <span className={showIcon}/>\n {showText}\n </button>\n <div className='post-collapse__show-more-line'/>\n </div>\n </div>\n );\n className += ' post-message--overflow';\n break;\n }\n }\n\n return (\n <div className={className}>\n <div\n style={{maxHeight: collapsedMaxHeightStyle}}\n className='post-message__text-container'\n ref={this.textContainer}\n >\n {children}\n </div>\n {attachmentTextOverflow}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {getIsRhsExpanded, getIsRhsOpen} from 'selectors/rhs';\n\nimport {Preferences} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport ShowMore from './show_more';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n isRHSExpanded: getIsRhsExpanded(state),\n isRHSOpen: getIsRhsOpen(state),\n compactDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT) === Preferences.MESSAGE_DISPLAY_COMPACT,\n };\n}\n\nexport default connect(mapStateToProps)(ShowMore);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './description.scss';\n\ntype Props = {\n children: React.ReactNode | React.ReactNodeArray;\n}\n\nconst Description = (props: Props) => {\n return (<p className='PreparingWorkspaceDescription'>\n {props.children}\n </p>);\n};\n\nexport default Description;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useEffect} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\nimport {CSSTransition} from 'react-transition-group';\n\nimport {GeneralTypes} from 'mattermost-redux/action_types';\n\nimport LogoSvg from 'components/common/svg_images_components/logo_dark_blue_svg';\n\nimport loadingIcon from 'images/spinner-48x48-blue.apng';\n\nimport Description from './description';\nimport {Animations, mapAnimationReasonToClass} from './steps';\nimport type {PreparingWorkspacePageProps} from './steps';\nimport Title from './title';\n\nimport './launching_workspace.scss';\n\ntype Props = PreparingWorkspacePageProps & {\n fullscreen?: boolean;\n zIndex?: number;\n};\n\n// Want to make sure background channels has rendered to limit animation jank,\n// including things like tour tips auto-showing\nexport const START_TRANSITIONING_OUT = 500;\nconst TRANSITION_DURATION = 500;\n\n// needs to be on top. Current known highest is tour tip at 1000\nexport const LAUNCHING_WORKSPACE_FULLSCREEN_Z_INDEX = 1001;\n\nfunction LaunchingWorkspace(props: Props) {\n const [hasEntered, setHasEntered] = useState(false);\n const dispatch = useDispatch();\n useEffect(() => {\n // This component is showed in both the preparing workspace route as an outro (!fullscreen)\n // and in the main webapp as an intro (fullscreen)\n // We only want to track the page view once\n if (!props.fullscreen && props.show) {\n props.onPageView();\n }\n }, [props.show, props.fullscreen]);\n\n useEffect(() => {\n if (hasEntered) {\n return;\n }\n if (!props.fullscreen) {\n return;\n }\n setTimeout(() => {\n setHasEntered(true);\n\n // Needs to happen after animation time plays out\n setTimeout(() => {\n dispatch({type: GeneralTypes.SHOW_LAUNCHING_WORKSPACE, open: false});\n }, TRANSITION_DURATION);\n }, START_TRANSITIONING_OUT);\n }, [hasEntered, props.fullscreen]);\n\n let bodyClass = 'LaunchingWorkspace-body';\n if (!props.fullscreen) {\n bodyClass += ' LaunchingWorkspace-body--non-fullscreen';\n }\n const body = (\n <div className={bodyClass}>\n <div className='LaunchingWorkspace__spinner'>\n <img\n src={loadingIcon}\n />\n </div>\n <Title>\n <FormattedMessage\n id='onboarding_wizard.launching_workspace.title'\n defaultMessage='Launching your workspace now'\n />\n </Title>\n <Description>\n <FormattedMessage\n id='onboarding_wizard.launching_workspace.description'\n defaultMessage='It’ll be ready in a moment'\n />\n </Description>\n </div>\n );\n\n let content = null;\n if (props.fullscreen) {\n content = (\n <CSSTransition\n in={props.show && !hasEntered}\n timeout={TRANSITION_DURATION}\n classNames={'LaunchingWorkspaceFullscreenWrapper'}\n exit={true}\n enter={false}\n mountOnEnter={true}\n unmountOnExit={true}\n >\n <div\n className='LaunchingWorkspaceFullscreenWrapper-body'\n style={{\n zIndex: props.zIndex,\n }}\n >\n <div className='LaunchingWorkspaceFullscreenWrapper__logo'>\n <LogoSvg/>\n </div>\n {body}\n </div>\n </CSSTransition>\n\n );\n } else {\n content = (\n <CSSTransition\n in={props.show}\n timeout={Animations.PAGE_SLIDE}\n classNames={mapAnimationReasonToClass('LaunchingWorkspace', props.transitionDirection)}\n mountOnEnter={true}\n unmountOnExit={true}\n >\n {body}\n </CSSTransition>\n );\n }\n return content;\n}\n\nexport default LaunchingWorkspace;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport deepFreeze from 'mattermost-redux/utils/deep_freeze';\n\nexport const WizardSteps = {\n Organization: 'Organization',\n Plugins: 'Plugins',\n InviteMembers: 'InviteMembers',\n LaunchingWorkspace: 'LaunchingWorkspace',\n} as const;\n\nexport const Animations = {\n PAGE_SLIDE: 300,\n Reasons: {\n EnterFromBefore: 'EnterFromBefore',\n EnterFromAfter: 'EnterFromAfter',\n ExitToBefore: 'ExitToBefore',\n ExitToAfter: 'ExitToAfter',\n } as const,\n};\n\nexport function mapStepToNextName(step: WizardStep): string {\n switch (step) {\n case WizardSteps.Organization:\n return 'admin_onboarding_next_organization';\n case WizardSteps.Plugins:\n return 'admin_onboarding_next_plugins';\n case WizardSteps.InviteMembers:\n return 'admin_onboarding_next_invite_members';\n case WizardSteps.LaunchingWorkspace:\n return 'admin_onboarding_next_transitioning_out';\n default:\n return 'admin_onboarding_next_unknown';\n }\n}\n\nexport function mapStepToPrevious(step: WizardStep): string {\n switch (step) {\n case WizardSteps.Organization:\n return 'admin_onboarding_previous_organization';\n case WizardSteps.Plugins:\n return 'admin_onboarding_previous_plugins';\n case WizardSteps.InviteMembers:\n return 'admin_onboarding_previous_invite_members';\n case WizardSteps.LaunchingWorkspace:\n return 'admin_onboarding_previous_transitioning_out';\n default:\n return 'admin_onboarding_previous_unknown';\n }\n}\n\nexport function mapStepToPageView(step: WizardStep): string {\n switch (step) {\n case WizardSteps.Organization:\n return 'pageview_admin_onboarding_organization';\n case WizardSteps.Plugins:\n return 'pageview_admin_onboarding_plugins';\n case WizardSteps.InviteMembers:\n return 'pageview_admin_onboarding_invite_members';\n case WizardSteps.LaunchingWorkspace:\n return 'pageview_admin_onboarding_transitioning_out';\n default:\n return 'pageview_admin_onboarding_unknown';\n }\n}\n\nexport function mapStepToSubmitFail(step: WizardStep): string {\n switch (step) {\n case WizardSteps.Organization:\n return 'admin_onboarding_organization_submit_fail';\n case WizardSteps.Plugins:\n return 'admin_onboarding_plugins_submit_fail';\n case WizardSteps.InviteMembers:\n return 'admin_onboarding_invite_members_submit_fail';\n case WizardSteps.LaunchingWorkspace:\n return 'admin_onboarding_transitioning_out_submit_fail';\n default:\n return 'admin_onboarding_unknown_submit_fail';\n }\n}\n\nexport function mapStepToSkipName(step: WizardStep): string {\n switch (step) {\n case WizardSteps.Organization:\n return 'admin_onboarding_skip_organization';\n case WizardSteps.Plugins:\n return 'admin_onboarding_skip_plugins';\n case WizardSteps.InviteMembers:\n return 'admin_onboarding_skip_invite_members';\n case WizardSteps.LaunchingWorkspace:\n return 'admin_onboarding_skip_transitioning_out';\n default:\n return 'admin_onboarding_skip_unknown';\n }\n}\n\nexport type AnimationReason = typeof Animations['Reasons'][keyof typeof Animations['Reasons']];\n\nexport type WizardStep = typeof WizardSteps[keyof typeof WizardSteps];\n\nexport function mapAnimationReasonToClass(classPrefix: string, animationReason: AnimationReason): string {\n switch (animationReason) {\n case Animations.Reasons.ExitToBefore:\n return `${classPrefix}--exit-to-before`;\n case Animations.Reasons.ExitToAfter:\n return `${classPrefix}--exit-to-after`;\n case Animations.Reasons.EnterFromAfter:\n return `${classPrefix}--enter-from-after`;\n case Animations.Reasons.EnterFromBefore:\n return `${classPrefix}--enter-from-before`;\n default:\n return `${classPrefix}--enter-from-before`;\n }\n}\n\ntype PluginNameMap = {\n [Key in keyof Omit<Form['plugins'], 'skipped'>]: string\n};\nexport const PLUGIN_NAME_TO_ID_MAP: PluginNameMap = {\n github: 'github',\n gitlab: 'com.github.manland.mattermost-plugin-gitlab',\n jira: 'jira',\n zoom: 'zoom',\n servicenow: 'mattermost-plugin-servicenow',\n} as const;\n\nexport type Form = {\n organization?: string;\n url?: string;\n urlSkipped: boolean;\n inferredProtocol: 'http' | 'https' | null;\n useCase: {\n boards: boolean;\n playbooks: boolean;\n channels: boolean;\n };\n plugins: {\n github: boolean;\n gitlab: boolean;\n jira: boolean;\n zoom: boolean;\n servicenow: boolean;\n\n // set if user clicks skip for now\n skipped: boolean;\n };\n channel: {\n name: string;\n skipped: boolean;\n };\n teamMembers: {\n inviteId: string;\n invites: string[];\n skipped: boolean;\n };\n}\n\nexport const emptyForm = deepFreeze({\n organization: '',\n inferredProtocol: null,\n urlSkipped: false,\n useCase: {\n boards: false,\n playbooks: false,\n channels: false,\n },\n plugins: {\n github: false,\n gitlab: false,\n jira: false,\n zoom: false,\n servicenow: false,\n\n // set if user clicks skip for now\n skipped: false,\n },\n channel: {\n name: '',\n skipped: false,\n },\n teamMembers: {\n inviteId: '',\n invites: [],\n skipped: false,\n },\n});\n\nexport type PreparingWorkspacePageProps = {\n transitionDirection: AnimationReason;\n next?: () => void;\n skip?: () => void;\n previous?: React.ReactNode;\n show: boolean;\n onPageView: () => void;\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './title.scss';\n\ntype Props = {\n children: React.ReactNode | React.ReactNodeArray;\n}\nconst Title = (props: Props) => {\n return (<h1 className='PreparingWorkspaceTitle'>\n {props.children}\n </h1>);\n};\n\nexport default Title;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {getCloudSubscription as selectCloudSubscription, isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {TrialPeriodDays} from 'utils/constants';\nimport {getRemainingDaysFromFutureTimestamp} from 'utils/utils';\n\ntype PlanLabelProps = {\n text: string;\n bgColor: string;\n color: string;\n firstSvg: JSX.Element;\n secondSvg?: JSX.Element;\n renderLastDaysOnTrial?: boolean;\n}\n\ntype StyledProps = {\n bgColor?: string;\n color?: string;\n}\n\nconst StyledPlanLabel = styled.div<StyledProps>`\nbackground-color: ${(props) => props.bgColor};\ncolor: ${(props) => props.color};\n`;\n\nfunction PlanLabel(props: PlanLabelProps) {\n const {formatMessage} = useIntl();\n const isCloud = useSelector(isCurrentLicenseCloud);\n const subscription = useSelector(selectCloudSubscription);\n const license = useSelector(getLicense);\n const isSelfHostedEnterpriseTrial = license.IsTrial === 'true';\n\n let text = props.text;\n\n if (props.renderLastDaysOnTrial && ((isCloud && subscription?.is_free_trial === 'true') || isSelfHostedEnterpriseTrial)) {\n const daysLeftOnTrial = Math.min(\n getRemainingDaysFromFutureTimestamp(isSelfHostedEnterpriseTrial ? parseInt(license.ExpiresAt, 10) : subscription?.trial_end_at),\n TrialPeriodDays.TRIAL_30_DAYS,\n );\n text = formatMessage({id: 'pricing_modal.plan_label_trialDays', defaultMessage: '{days} DAYS LEFT ON TRIAL'}, {days: daysLeftOnTrial});\n }\n\n return (\n <StyledPlanLabel\n className='planLabel'\n bgColor={props.bgColor}\n color={props.color}\n >\n {props.firstSvg}\n {text}\n {props.secondSvg}\n </StyledPlanLabel>\n );\n}\n\nexport default PlanLabel;\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nexport default function CheckMarkSvg() {\n return (\n <svg\n width='16'\n height='16'\n viewBox='0 0 16 16'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M8 0.493804C6.644 0.493804 5.384 0.835804 4.22 1.5198C3.08 2.1798 2.18 3.0798 1.52 4.2198C0.836 5.3838 0.494 6.6438 0.494 7.9998C0.494 9.3558 0.836 10.6158 1.52 11.7798C2.18 12.9198 3.08 13.8198 4.22 14.4798C5.384 15.1638 6.644 15.5058 8 15.5058C9.356 15.5058 10.616 15.1638 11.78 14.4798C12.92 13.8198 13.82 12.9198 14.48 11.7798C15.164 10.6158 15.506 9.3558 15.506 7.9998C15.506 6.6438 15.164 5.3838 14.48 4.2198C13.82 3.0798 12.92 2.1798 11.78 1.5198C10.616 0.835804 9.356 0.493804 8 0.493804ZM6.686 11.5098L5.624 10.4658L3.5 8.3418L4.562 7.2798L6.686 9.4038L11.456 4.6158L12.518 5.6778L6.686 11.5098Z'\n fill='#3DB887'\n />\n </svg>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst BlankCardImage = () => {\n return (\n <svg\n width='264'\n height='191'\n viewBox='0 0 264 191'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n >\n <g clipPath='url(#clip0_880_97924)'>\n <path\n opacity='0.64'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M151.099 23.4667C97.2454 23.4667 53.6738 58.1746 53.6738 100.897C53.6738 143.619 97.2454 178.327 151.099 178.327C204.952 178.327 248.524 143.619 248.524 100.897C248.524 58.1746 204.952 23.4667 151.099 23.4667ZM53.1868 100.897C53.1868 57.8316 97.0706 22.9951 151.099 22.9951C205.127 22.9951 249.011 57.8316 249.011 100.897C249.011 143.962 205.127 178.799 151.099 178.799C97.0706 178.799 53.1868 143.962 53.1868 100.897Z'\n fill='#3F4350'\n fillOpacity='0.64'\n />\n <path\n d='M214.989 15.7373H171.357C170.557 15.7347 169.765 15.8847 169.025 16.1786C168.285 16.4726 167.612 16.9048 167.045 17.4505C166.478 17.9963 166.027 18.645 165.718 19.3595C165.41 20.074 165.25 20.8403 165.247 21.6148V48.4725C165.25 49.247 165.41 50.0133 165.718 50.7278C166.027 51.4423 166.478 52.091 167.045 52.6368C167.612 53.1825 168.285 53.6147 169.025 53.9087C169.765 54.2026 170.557 54.3526 171.357 54.35H177.796V64.4035L187.455 54.35H214.973C215.773 54.3526 216.565 54.2026 217.305 53.9087C218.045 53.6147 218.718 53.1825 219.285 52.6368C219.852 52.091 220.303 51.4423 220.611 50.7278C220.92 50.0133 221.08 49.247 221.083 48.4725V21.6148C221.077 20.0533 220.433 18.5576 219.29 17.4558C218.148 16.354 216.601 15.736 214.989 15.7373Z'\n fill='#FFBC1F'\n />\n <path\n d='M187.455 54.3499H214.974C215.773 54.3525 216.565 54.2026 217.305 53.9086C218.045 53.6147 218.718 53.1825 219.285 52.6367C219.852 52.0909 220.303 51.4423 220.612 50.7278C220.92 50.0133 221.08 49.2469 221.083 48.4725V32.1672C221.083 32.1672 219.162 47.2451 218.816 48.5722C218.471 49.8994 217.786 51.8852 214.541 52.2145C211.295 52.5438 187.455 54.3499 187.455 54.3499Z'\n fill='#CC8F00'\n />\n <path\n d='M178.27 31.2043C179.047 31.2043 179.807 31.4276 180.453 31.8459C181.1 32.2642 181.603 32.8588 181.901 33.5544C182.198 34.25 182.276 35.0154 182.125 35.7539C181.973 36.4924 181.599 37.1707 181.049 37.7031C180.499 38.2355 179.799 38.5981 179.036 38.745C178.274 38.8918 177.484 38.8165 176.765 38.5283C176.047 38.2402 175.433 37.7522 175.002 37.1262C174.57 36.5002 174.339 35.7642 174.339 35.0112C174.338 34.5111 174.44 34.0158 174.637 33.5536C174.834 33.0914 175.124 32.6715 175.489 32.3179C175.854 31.9643 176.288 31.6839 176.765 31.4928C177.242 31.3017 177.753 31.2037 178.27 31.2043Z'\n fill='white'\n />\n <path\n d='M193.173 31.2043C193.95 31.2043 194.71 31.4276 195.357 31.8459C196.003 32.2642 196.507 32.8588 196.804 33.5544C197.102 34.25 197.18 35.0154 197.028 35.7539C196.876 36.4924 196.502 37.1707 195.952 37.7031C195.403 38.2355 194.702 38.5981 193.94 38.745C193.177 38.8918 192.387 38.8165 191.669 38.5283C190.951 38.2402 190.337 37.7522 189.905 37.1262C189.473 36.5002 189.242 35.7642 189.242 35.0112C189.242 34.5111 189.343 34.0158 189.54 33.5536C189.738 33.0914 190.027 32.6715 190.392 32.3179C190.757 31.9643 191.191 31.6839 191.668 31.4928C192.145 31.3017 192.657 31.2037 193.173 31.2043Z'\n fill='white'\n />\n <path\n d='M208.06 31.2043C208.838 31.2034 209.598 31.4258 210.245 31.8435C210.892 32.2612 211.397 32.8554 211.695 33.5509C211.993 34.2465 212.072 35.0121 211.921 35.7509C211.77 36.4896 211.396 37.1684 210.846 37.7013C210.297 38.2342 209.597 38.5973 208.834 38.7446C208.071 38.8919 207.281 38.8168 206.562 38.5288C205.844 38.2408 205.23 37.7529 204.798 37.1267C204.365 36.5006 204.135 35.7644 204.135 35.0112C204.134 34.5115 204.235 34.0166 204.432 33.5548C204.629 33.0929 204.918 32.6732 205.283 32.3197C205.647 31.9661 206.08 31.6856 206.557 31.4942C207.033 31.3029 207.544 31.2043 208.06 31.2043Z'\n fill='white'\n />\n <path\n d='M169.775 26.9834C170.219 25.4635 170.968 24.0436 171.98 22.8054C172.993 21.5672 174.248 20.5352 175.674 19.7688C175.758 19.7275 175.826 19.6601 175.867 19.5774C175.907 19.4947 175.919 19.4012 175.899 19.3116C175.879 19.222 175.828 19.1414 175.756 19.0824C175.684 19.0234 175.593 18.9893 175.499 18.9855C172.748 18.8258 167.195 19.3946 168.936 26.9435C168.954 27.0357 169.004 27.1192 169.077 27.1807C169.15 27.2422 169.243 27.2781 169.339 27.2827C169.436 27.2873 169.532 27.2603 169.611 27.206C169.69 27.1518 169.748 27.0734 169.775 26.9834Z'\n fill='#FFD470'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M136.167 65.1412C136.167 97.9081 108.757 124.471 74.9451 124.471C41.1333 124.471 13.7234 97.9081 13.7234 65.1412C13.7234 32.3743 41.1333 5.81152 74.9451 5.81152C108.757 5.81152 136.167 32.3743 136.167 65.1412ZM135.57 65.1412C135.57 97.5884 108.427 123.892 74.9451 123.892C41.4632 123.892 14.3207 97.5884 14.3207 65.1412C14.3207 32.694 41.4632 6.39035 74.9451 6.39035C108.427 6.39035 135.57 32.694 135.57 65.1412Z'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <path\n d='M74.9452 123.892C108.427 123.892 135.57 97.5885 135.57 65.1413C135.57 32.694 108.427 6.39038 74.9452 6.39038C41.4633 6.39038 14.3208 32.694 14.3208 65.1413C14.3208 97.5885 41.4633 123.892 74.9452 123.892Z'\n fill='white'\n />\n <path\n d='M74.9452 123.892C108.427 123.892 135.57 97.5885 135.57 65.1413C135.57 32.694 108.427 6.39038 74.9452 6.39038C41.4633 6.39038 14.3208 32.694 14.3208 65.1413C14.3208 97.5885 41.4633 123.892 74.9452 123.892Z'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <mask\n id='mask0_880_97924'\n\n maskUnits='userSpaceOnUse'\n x='14'\n y='6'\n width='122'\n height='118'\n >\n <path\n d='M74.9452 123.892C108.427 123.892 135.57 97.5885 135.57 65.1413C135.57 32.694 108.427 6.39038 74.9452 6.39038C41.4633 6.39038 14.3208 32.694 14.3208 65.1413C14.3208 97.5885 41.4633 123.892 74.9452 123.892Z'\n fill='#E8E9ED'\n />\n </mask>\n <g mask='url(#mask0_880_97924)'>\n <path\n d='M27.9571 44.6527C26.8484 45.1959 25.9702 46.0966 25.4736 47.1996C24.977 48.3027 24.8932 49.5389 25.2367 50.6953C26.0152 53.3343 27.8681 57.2851 32.0098 62.9573C41.8792 76.4794 47.4267 74.5901 47.4267 74.5901L21.6533 93.6897L23.2971 127.481L100.927 127.697C100.927 127.697 122.725 101.777 123.059 100.661C127.285 86.2274 122.391 64.2541 102.817 48.7436C83.3165 33.2977 65.9021 26.0637 27.9571 44.6527Z'\n fill='white'\n />\n <path\n d='M27.9571 44.6527C26.8484 45.1959 25.9702 46.0966 25.4736 47.1996C24.977 48.3027 24.8932 49.5389 25.2367 50.6953C26.0152 53.3343 27.8681 57.2851 32.0098 62.9572C41.8792 76.4794 47.4267 74.5901 47.4267 74.5901L21.6533 93.6896L23.2971 127.481L100.927 127.696C100.927 127.696 122.725 101.777 123.059 100.661C127.285 86.2274 122.391 64.2541 102.817 48.7436C83.3164 33.2977 65.9021 26.0637 27.9571 44.6527Z'\n fill='#3F4350'\n fillOpacity='0.04'\n />\n <rect\n opacity='0.24'\n x='-0.0141602'\n y='-18.7185'\n width='125.898'\n height='165.23'\n fill='url(#pattern0)'\n />\n </g>\n <path\n d='M109.973 113.804C111.503 112.703 112.944 111.32 114.212 110.077C115.422 108.89 117.042 108.114 118.18 106.884C119.895 104.752 121.628 102.632 123.452 100.581C124.49 99.1964 125.474 97.7667 126.404 96.2918C128.16 93.4862 129.761 90.5918 131.199 87.621C131.796 86.3974 131.929 84.7321 132.519 83.5042C132.474 82.3065 132.43 81.4814 132.405 81.3112C132.101 79.1426 131.796 76.9733 131.489 74.8032C131.222 72.9248 130.957 71.0419 130.523 69.1914C129.689 65.6176 127.767 60.6111 127.614 57.0351C127.552 55.6219 130.332 51.6839 130.95 50.7878C133.62 46.9101 135.468 46.4621 138.911 42.5155C139.22 42.1622 139.516 41.615 139.185 41.279C138.853 40.9429 138.331 41.1691 137.941 41.3931L132.881 44.3014C132.492 44.5168 132.51 44.5922 132.063 44.5405C131.395 44.4651 131.506 43.7477 131.618 43.4634C131.813 43.011 131.978 42.1945 132.314 41.6193C133.717 39.2087 133.76 39.4134 135.165 37.0028C135.501 36.4254 136.135 34.5943 136.5 33.9868C137.35 32.5758 137.09 31.3781 136.278 31.4018C135.561 31.4255 134.276 33.556 132.941 34.6331C133.646 33.0174 135.699 30.1092 135.085 29.618C133.831 28.6012 131.591 31.3177 130.414 32.9119C129.143 34.6411 127.754 36.2856 126.255 37.8343C125.903 38.1984 125.552 38.4677 125.365 38.2953C125.143 38.0799 127.018 35.3332 127.367 34.6331C128.237 32.8882 132.26 27.955 130.101 28.6486C128.971 29.0106 124.451 33.235 122.251 36.7874C120.824 39.0268 119.264 41.1846 117.58 43.2501C117.58 43.2501 116.092 41.391 116.132 39.4543C116.132 38.9718 116.468 36.5719 115.8 35.4948C115.295 34.6805 114.953 35.3526 114.688 35.7102C113.576 37.2182 113.798 38.7262 112.713 42.9334C112.028 45.581 112.915 48.3707 112.935 51.1001C112.964 53.7305 112.435 56.3328 111.975 58.9265C108.86 76.5913 109.432 94.6352 109.695 112.567C109.697 112.994 109.791 113.415 109.973 113.804Z'\n fill='#FFBC1F'\n />\n <path\n d='M76.0292 37.3669C79.1432 34.9541 84.3126 32.313 86.7683 29.3423C88.9548 26.6969 93.7349 19.3639 94.133 16.8607C94.8382 12.4079 100.648 2.55006 107.942 3.18987C116.045 3.90292 122.669 10.008 122.669 15.077C122.669 21.6151 119.582 24.0171 115.918 28.4505C113.471 31.4233 114.386 33.2049 114.079 33.5022C113.525 34.0386 112.522 32.5974 111.93 33.2049C109.414 35.8094 107.417 38.1036 103.951 39.4522C103.08 39.8084 102.121 39.9117 101.191 39.7495C101.191 39.7495 95.9726 47.774 93.8261 54.6137C93.468 55.749 84.0056 52.83 78.1756 46.2919C74.283 41.9145 76.0292 37.3669 76.0292 37.3669Z'\n fill='#FFBC1F'\n />\n <path\n d='M101.182 39.7108C98.6687 39.1291 96.3999 37.8603 94.4513 36.1283C94.2096 35.9114 93.979 35.6845 93.7595 35.4475C93.6462 35.3254 93.4922 35.2455 93.3244 35.2219C93.1565 35.1983 92.9855 35.2324 92.8409 35.3183H92.8275C92.7312 35.3753 92.6499 35.4533 92.5903 35.5461C92.5307 35.6389 92.4943 35.744 92.4841 35.8529C92.474 35.9618 92.4903 36.0715 92.5318 36.1732C92.5733 36.2749 92.6387 36.3657 92.723 36.4385L92.9944 36.6755C95.7236 39.1055 96.8959 42.7138 97.0583 46.1821C97.0583 46.4493 97.0583 46.7207 97.0583 46.9921C99.1269 42.9271 101.196 39.7431 101.196 39.7431H101.222L101.182 39.7108Z'\n fill='#CC8F00'\n />\n <path\n d='M100.27 19.5363C100.88 18.8901 100.27 17.4467 100.27 16.2662C100.27 14.4825 103.031 12.9982 104.367 14.9736C104.961 15.8526 105.633 16.5936 106.407 16.8586C108.567 17.5997 111.846 15.7664 114.079 16.264C116.163 16.7293 115.825 16.249 117.653 17.3282C119.482 18.4075 121.499 19.3941 123.637 19.3144C125.774 19.2347 127.994 17.7138 128.085 15.6522C128.101 15.2817 128.057 14.8789 128.261 14.5751C128.441 14.2972 128.771 14.1572 129.062 13.9935C130.461 13.205 131.186 11.6733 131.827 10.2343C131.944 10.0037 132.025 9.7576 132.067 9.50402C132.156 8.71126 131.469 7.99605 130.699 7.72031C129.929 7.44457 129.086 7.44888 128.268 7.35194C124.14 6.86508 120.979 3.6251 117.146 2.07405C110.834 -0.480879 103.406 -1.01944 99.0556 4.09688C94.7048 9.2132 90.265 15.984 91.3839 22.5221C91.3705 22.507 95.9749 24.1356 100.27 19.5363Z'\n fill='#6F370B'\n />\n <path\n d='M109.07 32.2593C109.171 32.8302 109.385 33.3767 109.702 33.8685C109.924 34.2196 110.504 33.8965 110.278 33.541C109.992 33.0971 109.8 32.6029 109.713 32.0869C109.639 31.6776 108.996 31.8521 109.07 32.2593Z'\n fill='#6F370B'\n />\n <path\n d='M102.306 16.0012C103.273 15.6501 104.227 16.5548 103.731 17.4898C103.536 17.8582 104.112 18.1856 104.307 17.8151C105.044 16.4234 103.687 14.8099 102.128 15.3786C101.729 15.523 101.905 16.1477 102.306 16.0012Z'\n fill='#6F370B'\n />\n <path\n d='M68.6156 55.4691C69.2583 54.9289 69.7923 54.2781 70.1904 53.5497C71.0231 51.9643 71.4184 50.1974 71.3382 48.4204C71.1158 43.0348 71.4805 42.7483 71.1158 38.5109C71.0624 37.912 69.5988 34.4545 69.5476 33.8556C69.363 31.7121 69.8167 27.4489 71.227 25.9539C71.4761 25.691 72.0233 26.1499 72.2279 26.4472C72.6728 27.0934 72.1567 30.5553 72.4504 31.8328C72.7217 33.0198 73.5759 34.7668 74.1987 35.9474C74.2212 35.996 74.2614 36.0348 74.3117 36.0563C74.362 36.0778 74.4188 36.0805 74.471 36.0639C74.5232 36.0473 74.5673 36.0126 74.5946 35.9664C74.622 35.9202 74.6307 35.8659 74.6191 35.8138C74.341 34.2261 73.9896 31.5656 74.2298 29.2477C74.3032 28.5282 75.7446 25.704 76.2317 25.1546C76.7189 24.6053 78.6785 22.5695 79.5682 23.4312C80.2355 24.0775 77.5663 27.2033 77.5663 30.7557C77.5663 32.3024 78.3226 34.3985 78.8498 35.6673C78.8592 35.7016 78.8823 35.7308 78.914 35.7486C78.9457 35.7664 78.9834 35.7713 79.0188 35.7621C79.0542 35.753 79.0844 35.7306 79.1028 35.6999C79.1211 35.6692 79.1261 35.6327 79.1167 35.5984C78.832 33.8061 78.5273 30.3399 79.784 27.7397C80.1488 26.99 81.8304 24.1012 82.6756 24.5084C84.0103 25.1546 82.2775 28.8599 82.2308 30.9711C82.1818 33.1253 82.8625 34.9112 83.5654 36.7875C83.588 36.8452 83.6306 36.8935 83.686 36.9239C83.7414 36.9544 83.806 36.9652 83.8687 36.9545C83.9315 36.9438 83.9884 36.9122 84.0296 36.8652C84.0709 36.8182 84.0939 36.7587 84.0948 36.6971C84.0948 36.2425 84.1504 36.0163 84.2393 35.0555C84.3639 33.6983 84.9556 31.5161 86.1367 31.1003C86.2355 31.0694 86.3412 31.0654 86.4422 31.0886C86.5433 31.1119 86.6357 31.1615 86.7096 31.2322C86.7835 31.3029 86.8359 31.3918 86.8612 31.4894C86.8865 31.5869 86.8836 31.6893 86.853 31.7854C85.9165 34.741 88.688 40.2149 88.2054 46.7832C87.6982 53.6574 83.2295 61.1671 80.6938 65.5617C79.5393 67.563 77.2816 71.5936 76.0471 73.5453C73.4157 77.7095 68.7246 84.4523 64.5384 89.5815C59.8495 95.3247 55.125 101.102 49.4418 105.928C45.0532 109.655 40.1463 112.768 35.1282 115.652C29.0958 119.12 22.5807 122.358 15.5673 122.524C14.6376 122.548 13.6789 122.509 12.8292 122.141C12.1563 121.812 11.5462 121.375 11.0252 120.848C7.56391 117.633 4.80354 113.778 2.90738 109.511C1.01123 105.244 0.0177922 100.653 -0.0141602 96.0076C-0.0141602 92.033 0.686506 88.0843 1.72972 84.2433C4.71923 73.2394 16.2858 56.9318 26.9626 48.3149C26.9626 48.3149 30.2502 50.0383 37.9153 59.4458C44.7306 67.8043 46.0919 73.0886 46.0919 73.0886C46.0919 73.0886 56.5486 65.7642 68.6156 55.4691Z'\n fill='#FFBC1F'\n />\n <mask\n id='mask1_880_97924'\n maskUnits='userSpaceOnUse'\n x='-1'\n y='23'\n width='90'\n height='100'\n >\n <path\n d='M68.6156 55.4691C69.2583 54.9289 69.7923 54.2781 70.1904 53.5497C71.0231 51.9643 71.4184 50.1974 71.3382 48.4204C71.1158 43.0348 71.4805 42.7483 71.1158 38.5109C71.0624 37.912 69.5988 34.4545 69.5476 33.8556C69.363 31.7121 69.8167 27.4489 71.227 25.9539C71.4761 25.691 72.0233 26.1499 72.2279 26.4472C72.6728 27.0934 72.1567 30.5553 72.4504 31.8328C72.7217 33.0198 73.5759 34.7668 74.1987 35.9474C74.2212 35.996 74.2614 36.0348 74.3117 36.0563C74.362 36.0778 74.4188 36.0805 74.471 36.0639C74.5232 36.0473 74.5673 36.0126 74.5946 35.9664C74.622 35.9202 74.6307 35.8659 74.6191 35.8138C74.341 34.2261 73.9896 31.5656 74.2298 29.2477C74.3032 28.5282 75.7446 25.704 76.2317 25.1546C76.7189 24.6053 78.6785 22.5695 79.5682 23.4312C80.2355 24.0775 77.5663 27.2033 77.5663 30.7557C77.5663 32.3024 78.3226 34.3985 78.8498 35.6673C78.8592 35.7016 78.8823 35.7308 78.914 35.7486C78.9457 35.7664 78.9834 35.7713 79.0188 35.7621C79.0542 35.753 79.0844 35.7306 79.1028 35.6999C79.1211 35.6692 79.1261 35.6327 79.1167 35.5984C78.832 33.8061 78.5273 30.3399 79.784 27.7397C80.1488 26.99 81.8304 24.1012 82.6756 24.5084C84.0103 25.1546 82.2775 28.8599 82.2308 30.9711C82.1818 33.1253 82.8625 34.9112 83.5654 36.7875C83.588 36.8452 83.6306 36.8935 83.686 36.9239C83.7414 36.9544 83.806 36.9652 83.8687 36.9545C83.9315 36.9438 83.9884 36.9122 84.0296 36.8652C84.0709 36.8182 84.0939 36.7587 84.0948 36.6971C84.0948 36.2425 84.1504 36.0163 84.2393 35.0555C84.3639 33.6983 84.9556 31.5161 86.1367 31.1003C86.2355 31.0694 86.3412 31.0654 86.4422 31.0886C86.5433 31.1119 86.6357 31.1615 86.7096 31.2322C86.7835 31.3029 86.8359 31.3918 86.8612 31.4894C86.8865 31.5869 86.8836 31.6893 86.853 31.7854C85.9165 34.741 88.688 40.2149 88.2054 46.7832C87.6982 53.6574 83.2295 61.1671 80.6938 65.5617C79.5393 67.563 77.2816 71.5936 76.0471 73.5453C73.4157 77.7095 68.7246 84.4523 64.5384 89.5815C59.8495 95.3247 55.125 101.102 49.4418 105.928C45.0532 109.655 40.1463 112.768 35.1282 115.652C29.0958 119.12 22.5807 122.358 15.5673 122.524C14.6376 122.548 13.6789 122.509 12.8292 122.141C12.1563 121.812 11.5462 121.375 11.0252 120.848C7.56391 117.633 4.80354 113.778 2.90738 109.511C1.01123 105.244 0.0177922 100.653 -0.0141602 96.0076C-0.0141602 92.033 0.686506 88.0843 1.72972 84.2433C4.71923 73.2394 16.2858 56.9318 26.9626 48.3149C26.9626 48.3149 30.2502 50.0383 37.9153 59.4458C44.7306 67.8043 46.0919 73.0886 46.0919 73.0886C46.0919 73.0886 56.5486 65.7642 68.6156 55.4691Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask1_880_97924)'>\n <rect\n x='-0.0141602'\n y='-18.7188'\n width='55.8309'\n height='98.2334'\n fill='url(#pattern1)'\n fillOpacity='0.32'\n />\n </g>\n <path\n d='M82.3596 32.7267C82.5376 33.987 82.7422 35.3829 83.5252 36.4428C83.5596 36.4959 83.609 36.5383 83.6676 36.565C83.7262 36.5917 83.7914 36.6016 83.8556 36.5934C83.9198 36.5852 83.9802 36.5594 84.0297 36.5189C84.0791 36.4785 84.1156 36.4251 84.1347 36.3652C84.4416 35.4885 84.7152 34.5988 85.0377 33.7263C85.2602 33.1511 85.4826 32.367 85.9608 31.9361C86.8239 31.1455 86.4057 32.2334 86.3812 32.647C86.355 33.1497 86.3646 33.6536 86.4102 34.155C86.5481 35.9839 86.9751 37.7655 87.2532 39.5729C87.3155 39.9844 87.9605 39.8099 87.896 39.4027C87.509 36.8866 86.8017 34.4006 87.1798 31.8499C87.3199 30.8978 86.5125 30.6091 85.7495 31.2037C84.3749 32.2808 84.0212 34.6785 83.4918 36.1972L84.1013 36.1196C83.3561 35.1093 83.1737 33.7629 83.0025 32.5608C82.9446 32.1494 82.3018 32.3239 82.3596 32.731V32.7267Z'\n fill='#6F370B'\n />\n <path\n d='M87.2866 39.6678C88.1608 43.7996 88.0585 48.0155 86.7528 52.0525C86.6238 52.4489 87.2689 52.6191 87.3956 52.2227C88.7302 48.0779 88.8281 43.7371 87.9295 39.4954C87.845 39.0883 87.1999 39.2606 87.2866 39.6678Z'\n fill='#6F370B'\n />\n <path\n d='M129.229 40.3936C130.397 38.9244 131.51 37.4165 132.565 35.8697C132.801 35.5207 132.223 35.1976 131.989 35.5423C130.936 37.0933 129.824 38.6013 128.653 40.0662C128.392 40.3936 128.971 40.7124 129.229 40.3915V40.3936Z'\n fill='#6F370B'\n />\n <path\n d='M132.948 35.174L133.286 34.8552C133.345 34.7939 133.377 34.7129 133.376 34.6292C133.374 34.5455 133.339 34.4656 133.278 34.4064C133.217 34.3472 133.134 34.3133 133.048 34.3118C132.961 34.3103 132.878 34.3414 132.814 34.3985L132.476 34.7152C132.445 34.7452 132.421 34.7808 132.404 34.82C132.387 34.8593 132.378 34.9013 132.378 34.9438C132.378 34.9863 132.386 35.0285 132.403 35.0678C132.42 35.1071 132.444 35.1428 132.475 35.1729C132.506 35.2031 132.543 35.227 132.584 35.2434C132.624 35.2597 132.667 35.2682 132.711 35.2683C132.755 35.2684 132.799 35.2601 132.839 35.2439C132.88 35.2278 132.917 35.204 132.948 35.174Z'\n fill='#6F370B'\n />\n <path\n d='M117.538 43.0369C118.247 43.9718 119.184 44.9757 119.566 46.0851C120.176 47.8581 119.072 49.7947 117.406 50.5573C117.017 50.7361 117.355 51.2919 117.742 51.1153C118.569 50.7329 119.26 50.1221 119.728 49.36C120.197 48.5979 120.422 47.7185 120.376 46.8326C120.283 45.245 119.041 43.9352 118.114 42.7116C117.862 42.3798 117.284 42.7008 117.538 43.0369Z'\n fill='#6F370B'\n />\n <path\n d='M124.504 58.8061C126.833 59.0409 128.094 56.4084 129.193 54.8531C129.436 54.5084 128.86 54.1852 128.617 54.5278C127.658 55.8849 126.52 58.3623 124.504 58.1598C124.077 58.1167 124.079 58.763 124.504 58.8061Z'\n fill='#6F370B'\n />\n <path\n d='M78.2448 34.0192C78.3601 34.617 78.4344 35.2215 78.4672 35.8287C78.485 36.0894 78.6074 36.7464 78.4984 36.9489C78.3027 37.3173 78.8765 37.6448 79.0745 37.2742C79.2725 36.9037 79.1657 36.3759 79.1457 35.9946C79.1107 35.2716 79.0237 34.5517 78.8854 33.8404C78.8053 33.4311 78.1603 33.6034 78.2426 34.0106L78.2448 34.0192Z'\n fill='#6F370B'\n />\n <path\n d='M74.0743 36.1197C74.1512 36.4936 74.1398 36.8795 74.0409 37.2485C73.9119 37.647 74.5548 37.8172 74.6838 37.4208C74.8116 36.9394 74.823 36.4359 74.7171 35.9495C74.646 35.5402 74.0031 35.7125 74.0743 36.1197Z'\n fill='#6F370B'\n />\n <path\n d='M113.045 25.2644H112.989C112.782 25.2644 112.584 25.3438 112.438 25.4852C112.292 25.6266 112.21 25.8184 112.21 26.0184C112.21 26.2184 112.292 26.4101 112.438 26.5515C112.584 26.6929 112.782 26.7724 112.989 26.7724H113.045C113.251 26.7724 113.449 26.6929 113.595 26.5515C113.741 26.4101 113.823 26.2184 113.823 26.0184C113.823 25.8184 113.741 25.6266 113.595 25.4852C113.449 25.3438 113.251 25.2644 113.045 25.2644Z'\n fill='#6F370B'\n />\n <mask\n id='mask2_880_97924'\n maskUnits='userSpaceOnUse'\n x='91'\n y='0'\n width='42'\n height='23'\n >\n <path\n d='M100.27 19.5363C100.88 18.8901 100.27 17.4467 100.27 16.2662C100.27 14.4825 103.031 12.9982 104.368 14.9736C104.961 15.8526 105.633 16.5936 106.407 16.8586C108.567 17.5997 111.846 15.7664 114.079 16.264C116.163 16.7293 115.825 16.249 117.654 17.3282C119.482 18.4075 121.499 19.3941 123.637 19.3144C125.775 19.2347 127.995 17.7138 128.086 15.6522C128.101 15.2817 128.057 14.8789 128.261 14.5751C128.442 14.2972 128.771 14.1572 129.062 13.9935C130.461 13.205 131.186 11.6733 131.827 10.2343C131.944 10.0037 132.025 9.7576 132.067 9.50402C132.156 8.71126 131.469 7.99605 130.699 7.72031C129.93 7.44457 129.087 7.44888 128.268 7.35194C124.14 6.86508 120.979 3.6251 117.146 2.07405C110.834 -0.480879 103.407 -1.01944 99.0559 4.09688C94.7051 9.2132 90.2653 15.984 91.3841 22.5221C91.3708 22.507 95.9752 24.1356 100.27 19.5363Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask2_880_97924)'>\n <rect\n opacity='0.32'\n x='-0.013916'\n y='-18.7188'\n width='132.126'\n height='52.7789'\n fill='url(#pattern2)'\n />\n </g>\n <path\n d='M45.7271 72.4853C41.6605 75.9737 37.1804 78.982 32.3811 81.4469C28.0592 83.6615 23.1745 85.1824 19.7135 88.6744C19.4154 88.976 19.887 89.4327 20.185 89.1311C23.7707 85.5141 28.9511 83.9911 33.4043 81.6473C37.9964 79.2231 42.2901 76.3027 46.2031 72.942C46.5256 72.6662 46.0519 72.2095 45.7316 72.4853H45.7271Z'\n fill='#6F370B'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M262.624 135.525C262.624 166.203 237 191.072 205.392 191.072C173.784 191.072 148.16 166.203 148.16 135.525C148.16 104.847 173.784 79.9771 205.392 79.9771C237 79.9771 262.624 104.847 262.624 135.525ZM262.066 135.525C262.066 165.904 236.692 190.531 205.392 190.531C174.092 190.531 148.719 165.904 148.719 135.525C148.719 105.146 174.092 80.519 205.392 80.519C236.692 80.519 262.066 105.146 262.066 135.525Z'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <path\n d='M205.392 190.531C236.692 190.531 262.066 165.904 262.066 135.525C262.066 105.146 236.692 80.519 205.392 80.519C174.092 80.519 148.719 105.146 148.719 135.525C148.719 165.904 174.092 190.531 205.392 190.531Z'\n fill='white'\n />\n <path\n d='M205.392 190.531C236.692 190.531 262.066 165.904 262.066 135.525C262.066 105.146 236.692 80.519 205.392 80.519C174.092 80.519 148.719 105.146 148.719 135.525C148.719 165.904 174.092 190.531 205.392 190.531Z'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <mask\n id='mask3_880_97924'\n maskUnits='userSpaceOnUse'\n x='148'\n y='80'\n width='115'\n height='111'\n >\n <path\n d='M205.392 190.531C236.692 190.531 262.066 165.904 262.066 135.525C262.066 105.146 236.692 80.519 205.392 80.519C174.092 80.519 148.719 105.146 148.719 135.525C148.719 165.904 174.092 190.531 205.392 190.531Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask3_880_97924)'>\n <path\n d='M179.564 151.478C196.645 143.38 215.247 140.67 233.113 144.784C241.138 146.632 258.453 158.24 264.204 165.942C264.186 176.63 245.13 207.443 214.302 208.883C201.327 209.489 162.229 175.616 158.643 169.647C158.643 169.654 169.544 156.23 179.564 151.478Z'\n fill='white'\n />\n <path\n d='M179.564 151.478C196.645 143.38 215.247 140.67 233.113 144.784C241.138 146.632 258.453 158.24 264.204 165.942C264.186 176.63 245.13 207.443 214.302 208.883C201.327 209.489 162.229 175.616 158.643 169.647C158.643 169.654 169.544 156.23 179.564 151.478Z'\n fill='#3F4350'\n fillOpacity='0.04'\n />\n <mask\n id='mask4_880_97924'\n maskUnits='userSpaceOnUse'\n x='158'\n y='142'\n width='107'\n height='67'\n >\n <path\n d='M179.564 151.478C196.645 143.38 215.247 140.67 233.113 144.784C241.138 146.632 258.453 158.24 264.204 165.942C264.186 176.63 245.13 207.443 214.302 208.883C201.327 209.489 162.229 175.616 158.643 169.647C158.643 169.654 169.544 156.23 179.564 151.478Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask4_880_97924)'>\n <rect\n x='134.026'\n y='80.519'\n width='137.479'\n height='142.545'\n fill='url(#pattern3)'\n fillOpacity='0.24'\n />\n </g>\n <path\n d='M172.291 140.716C174.2 145.914 179.411 151.737 185.747 152.332C196.386 153.333 200.644 145.922 203.897 138.398C206.283 132.866 207.497 120.347 206.751 113.357C205.607 102.652 198.996 92.4149 195.865 93.7857C177.479 101.832 172.577 119.557 171.874 123.862C171.1 128.602 170.843 136.754 172.291 140.716Z'\n fill='#4A2407'\n />\n <mask\n id='mask5_880_97924'\n\n maskUnits='userSpaceOnUse'\n x='171'\n y='93'\n width='36'\n height='60'\n >\n <path\n d='M172.291 140.716C174.2 145.914 179.411 151.737 185.747 152.332C196.386 153.333 200.644 145.922 203.897 138.398C206.283 132.866 207.497 120.347 206.751 113.357C205.607 102.652 198.996 92.4149 195.865 93.7857C177.479 101.832 172.577 119.557 171.874 123.862C171.1 128.602 170.843 136.754 172.291 140.716Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask5_880_97924)'>\n <rect\n opacity='0.32'\n x='134.026'\n y='80.5193'\n width='78.2318'\n height='87.066'\n fill='url(#pattern4)'\n />\n </g>\n <path\n d='M183.621 118.294C183.907 124.51 188.469 138.821 194.052 141.022C195.434 141.542 196.953 141.606 198.376 141.204L200.807 151.15C200.807 151.15 195.758 156.449 193.328 160.986C190.897 165.524 187.257 180.222 195.51 182.222C209.07 185.503 224.041 164.89 225.968 158.542C228.655 149.652 222.328 149.409 220.79 145.487C218.058 138.509 215.85 130.635 218.913 121.3C220.557 116.271 220.45 104.977 215.293 100.378C210.474 96.0797 194.265 95.5877 188.832 99.1311C184.585 101.895 183.366 112.76 183.621 118.294Z'\n fill='#AD831F'\n />\n <path\n d='M205.515 138.477C205.519 138.39 205.498 138.303 205.454 138.227C205.411 138.151 205.347 138.087 205.269 138.043C203.062 139.268 200.76 140.325 198.385 141.204L199.142 144.304C199.776 143.832 204.889 138.957 205.515 138.477Z'\n fill='#8B6918'\n />\n <path\n d='M206.598 90.9205C211.167 91.1493 220.784 95.4337 224.677 102.164C227.001 106.189 230.053 109.727 232.239 113.825C234.639 118.32 238.846 121.641 243.194 124.441C245.072 125.656 247.026 126.812 248.547 128.428C251.885 131.971 252.58 137.616 250.199 141.824C247.819 146.031 242.537 148.491 237.664 147.659C236.222 147.414 234.801 146.908 233.339 146.981C231.876 147.054 228.167 149.99 222.958 148.692C216.576 147.1 207.756 136.577 203.062 127.836C199.307 120.851 200.801 110.921 190.178 106.013C188.428 105.203 185.119 101.285 186.06 99.6413C189.859 92.9898 198.785 90.5277 206.598 90.9205Z'\n fill='#4A2407'\n />\n <mask\n id='mask6_880_97924'\n maskUnits='userSpaceOnUse'\n x='185'\n y='90'\n width='67'\n height='60'\n >\n <path\n d='M206.598 90.9205C211.167 91.1493 220.784 95.4337 224.677 102.164C227.001 106.189 230.053 109.727 232.239 113.825C234.639 118.32 238.846 121.641 243.194 124.441C245.072 125.656 247.026 126.812 248.547 128.428C251.885 131.971 252.58 137.616 250.199 141.824C247.819 146.031 242.537 148.491 237.664 147.659C236.222 147.414 234.801 146.908 233.339 146.981C231.876 147.054 228.167 149.99 222.958 148.692C216.576 147.1 207.756 136.577 203.062 127.836C199.307 120.851 200.801 110.921 190.178 106.013C188.428 105.203 185.119 101.285 186.06 99.6413C189.859 92.9898 198.785 90.5277 206.598 90.9205Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask6_880_97924)'>\n <rect\n opacity='0.32'\n x='134.026'\n y='80.519'\n width='113.697'\n height='81.599'\n fill='url(#pattern5)'\n />\n </g>\n <path\n d='M195.516 116.469L195.55 116.336C195.577 116.23 195.583 116.121 195.567 116.013C195.55 115.906 195.513 115.803 195.455 115.709C195.398 115.616 195.322 115.535 195.232 115.47C195.143 115.405 195.041 115.358 194.932 115.331C194.824 115.305 194.711 115.299 194.6 115.315C194.489 115.331 194.383 115.367 194.287 115.423C194.191 115.479 194.107 115.552 194.04 115.639C193.973 115.726 193.925 115.825 193.897 115.931L193.864 116.064C193.809 116.277 193.843 116.502 193.959 116.691C194.074 116.879 194.262 117.015 194.482 117.069C194.701 117.122 194.933 117.089 195.127 116.977C195.321 116.865 195.461 116.682 195.516 116.469Z'\n fill='#4A2407'\n />\n <path\n d='M186.414 117.544L186.448 117.411C186.503 117.198 186.469 116.973 186.353 116.785C186.237 116.596 186.049 116.46 185.83 116.407C185.611 116.353 185.379 116.386 185.185 116.498C184.991 116.611 184.851 116.793 184.795 117.006L184.762 117.139C184.707 117.352 184.741 117.577 184.856 117.766C184.972 117.954 185.16 118.09 185.38 118.144C185.599 118.197 185.831 118.165 186.025 118.052C186.219 117.94 186.359 117.757 186.414 117.544Z'\n fill='#4A2407'\n />\n <path\n d='M193.697 132.67C194.769 132.225 195.735 131.572 196.536 130.751C197.337 129.93 197.957 128.958 198.356 127.895C198.548 127.397 197.73 127.203 197.521 127.693C197.167 128.62 196.624 129.468 195.925 130.186C195.225 130.904 194.383 131.477 193.449 131.872C192.954 132.074 193.188 132.884 193.689 132.666L193.697 132.67Z'\n fill='#4A2407'\n />\n <path\n d='M189.414 121.699C189.607 122.65 189.555 123.632 189.264 124.558C189.08 125.135 188.473 125.773 188.4 126.348C188.263 127.397 190.044 127.6 190.787 127.638C191.334 127.666 191.309 126.84 190.764 126.812C190.537 126.8 189.604 126.743 189.406 126.484C189.256 126.281 189.521 126.079 189.65 125.822C189.881 125.377 190.061 124.908 190.186 124.425C190.421 123.453 190.436 122.444 190.23 121.466C190.13 120.944 189.314 121.181 189.414 121.699Z'\n fill='#4A2407'\n />\n <path\n d='M200.047 151.474C200.54 152.944 201.99 157.309 200.148 158.38C199.678 158.654 200.116 159.363 200.588 159.087C202.968 157.704 201.527 153.215 200.863 151.241C200.694 150.737 199.876 150.966 200.047 151.474Z'\n fill='#4A2407'\n />\n </g>\n <path\n d='M104.406 188.861C103.212 190.634 100.517 190.89 98.421 189.454L74.7569 173.279C73.9846 172.773 73.4434 171.997 73.2461 171.114C73.0488 170.23 73.2106 169.307 73.6978 168.536L94.5152 137.67C95.0895 136.911 95.9133 136.365 96.8506 136.121C97.7879 135.878 98.7826 135.952 99.6706 136.332L126.534 147.803C128.91 148.82 129.896 151.066 128.714 152.866L104.406 188.861Z'\n fill='#FFBC1F'\n />\n <path\n d='M100.64 186.762L76.2473 170.576L97.7036 138.769L124.887 150.816L100.64 186.762Z'\n fill='white'\n />\n <path\n d='M116.084 148.559C115.875 148.813 115.582 148.99 115.254 149.06C114.926 149.129 114.584 149.087 114.285 148.939L104.025 144.262C103.892 144.215 103.772 144.14 103.673 144.042C103.574 143.944 103.499 143.825 103.453 143.695C103.407 143.565 103.392 143.427 103.409 143.291C103.425 143.155 103.473 143.024 103.548 142.908L105.157 140.52C105.347 140.276 105.617 140.102 105.924 140.029C106.23 139.956 106.552 139.987 106.838 140.117L117.232 144.599C117.377 144.644 117.509 144.72 117.619 144.821C117.728 144.922 117.813 145.046 117.867 145.183C117.921 145.321 117.942 145.468 117.929 145.615C117.917 145.761 117.87 145.903 117.793 146.03L116.084 148.559Z'\n fill='#8D93A5'\n />\n <path\n d='M114.122 145.458L107.51 142.543L109.141 140.123C109.334 139.883 109.605 139.713 109.909 139.639C110.214 139.565 110.535 139.592 110.822 139.715L115.221 141.564C115.363 141.606 115.494 141.68 115.604 141.778C115.713 141.877 115.798 141.998 115.852 142.134C115.906 142.269 115.928 142.414 115.915 142.558C115.903 142.703 115.857 142.843 115.781 142.967L114.122 145.458Z'\n fill='#2D3039'\n />\n <path\n d='M114.604 158.572L100.881 151.735L101.598 150.669L115.372 157.435L114.604 158.572Z'\n fill='#3DB887'\n />\n <path\n d='M96.5548 151.039C96.5227 151.059 96.4863 151.072 96.4483 151.076C96.4104 151.081 96.3718 151.077 96.3357 151.065C96.2995 151.053 96.2666 151.033 96.2395 151.007C96.2124 150.981 96.1919 150.949 96.1793 150.914L95.3388 148.499C95.328 148.463 95.3253 148.424 95.3311 148.387C95.3369 148.35 95.3508 148.314 95.3721 148.283C95.3934 148.251 95.4215 148.225 95.4545 148.205C95.4874 148.185 95.5244 148.172 95.5629 148.167L95.8823 148.102C95.9654 148.085 96.052 148.096 96.1275 148.134C96.203 148.171 96.2628 148.233 96.297 148.308L96.7453 149.57C96.7571 149.605 96.7771 149.637 96.8037 149.663C96.8302 149.689 96.8626 149.709 96.8984 149.721C96.9341 149.734 96.9723 149.737 97.0099 149.733C97.0475 149.728 97.0835 149.716 97.1151 149.695L99.6592 148.303C99.7382 148.264 99.8282 148.252 99.9153 148.267C100.002 148.283 100.082 148.326 100.141 148.39L100.343 148.624C100.37 148.652 100.389 148.686 100.4 148.723C100.411 148.76 100.413 148.799 100.406 148.837C100.399 148.875 100.383 148.911 100.36 148.942C100.336 148.973 100.305 148.998 100.27 149.015L96.5548 151.039Z'\n fill='#3DB887'\n />\n <path\n d='M110.116 165.224L96.6614 157.99L97.3842 156.918L110.883 164.087L110.116 165.224Z'\n fill='#BABEC9'\n />\n <path\n d='M94.0838 158.24L90.1165 156.075L92.4027 152.676L96.4205 154.775L94.0838 158.24Z'\n fill='#BABEC9'\n />\n <path\n d='M105.627 171.881L92.4475 164.239L93.1648 163.168L106.395 170.744L105.627 171.881Z'\n fill='#BABEC9'\n />\n <path\n d='M89.9036 164.44L86.0146 162.151L88.3065 158.751L92.2459 160.976L89.9036 164.44Z'\n fill='#BABEC9'\n />\n <path\n d='M101.139 178.533L88.2336 170.488L88.9509 169.422L101.906 177.396L101.139 178.533Z'\n fill='#BABEC9'\n />\n <path\n d='M85.7231 170.635L81.9126 168.226L84.2101 164.832L88.0654 167.171L85.7231 170.635Z'\n fill='#BABEC9'\n />\n </g>\n <defs>\n <pattern\n id='pattern0'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image0_880_97924'\n transform='scale(0.00176678 0.00130378)'\n />\n </pattern>\n <pattern\n id='pattern1'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image1_880_97924'\n transform='scale(0.00398406 0.00219298)'\n />\n </pattern>\n <pattern\n id='pattern2'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image2_880_97924'\n transform='scale(0.0016835 0.00408163)'\n />\n </pattern>\n <pattern\n id='pattern3'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image3_880_97924'\n transform='scale(0.00151745 0.00142045)'\n />\n </pattern>\n <pattern\n id='pattern4'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image4_880_97924'\n transform='scale(0.00266667 0.00232558)'\n />\n </pattern>\n <pattern\n id='pattern5'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image5_880_97924'\n transform='scale(0.00183486 0.00248139)'\n />\n </pattern>\n <clipPath id='clip0_880_97924'>\n <rect\n width='264'\n height='191'\n fill='white'\n />\n </clipPath>\n <image\n id='image0_880_97924'\n width='566'\n height='767'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image1_880_97924'\n width='251'\n height='456'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image2_880_97924'\n width='594'\n height='245'\n xlinkHref='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlIAAAD1CAYAAACbWRsMAAAgAElEQVR4Xu2dz/v9RJXnq+y9P+i9P3AvCrO2ld7bgHsbmPXY4uxtYNajwH4acK/86LUis2+B3qswexX+gCbzvNKn0ieVqqSSm3s/ufe+8zw8yvcmlapX8jVvzzn1PjHoEAEREAEREAEROByBruu+EUL4dQjhSyGE52OMvzvcJDWhEMVABERABERABETgeAS6rnvahBSTeyXG+MLxZqkZSUjpHRABERABERCBAxLouu4rIYTfhhC6EMIzMcaPDzjNu5+ShNTdvwICIAIiIAIiIAIisJWAhNRWcrpOBERABERABETg7glISN39KyAAIiACIiACIiACWwlISG0lp+tEQAREQAREQATunoCE1N2/AgIgAiIgAiIgAiKwlYCE1FZyuk4EREAEREAERODuCUhI3f0rIAAiIAIiIAIiIAJbCUhIbSWn60RABERABERABO6egITU3b8CAiACIiACIiACIrCVgITUVnK6TgREQAREQARE4O4JSEjd/SsgACIgAiIgAnsT6LruqRDCL0IIr8YYX9l7fI13HAISUsd5FpqJCIiACIjADRDouo5v6+9DCN8OIfw1xvjIDSxLS6gQkJDSqyECIiACIiACOxOwiNQ/hRDeUURqZ7gHG05C6mAPRNMRAREQAREQgYci0HXd90IIH8cYP36oOVzbfSWkru2Jab4iIAIiIAIisDMBS0e+HkL4R9KRIYRHY4yf7nybmxxOQuomH6sWJQIiIAIiMEfAIi9fjjG+fRRSXdf9cwjhayGEn15axJiQojiedKSE1IqXQkJqBSydKgIiIAIicP0Euq77jhWDdyGEp2OM7zz0qrqu+34I4bchBOaEkLr4Tr+u674eQviHEML7McYPH5rJtdxfQupanpTmKQIiIAIisAuBTLQ8F2N8c5eBTxik67qvmLgjIvX4kpDpuu7L3O7SkasTlnizl0pI3eyj1cJEQAREQARqBLquezaE8OnBUntN4qjrum+Y6PpSCOHJGOPv9KQfjoCE1MOx151FQAREQASMQNd1T4cQ/iWE8FaM8XmBqRNwETVOeinG+OIaXl3XcT71WL+IMf50zbU6d0pAQkpvhQiIgAiIwIMSsEJn6oPYek+N0GJq60EnfICbm08VxfJvrJmOsf5jCIF6KFizO+8k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'\n />\n <image\n id='image3_880_97924'\n width='659'\n height='704'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image4_880_97924'\n width='375'\n height='430'\n xlinkHref='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXcAAAGuCAYAAABr8UYZAAAgAElEQVR4Xu2dO9j9SnXeJdNzOfRc3cbHcHowUMfmUicBUtvGpDYGUsfAcU2A4xoDpydgXGPAqR1Deozt3ijPb85aytJoJI1u+9tb+9Xz8HD+35ZGM++M1qxZl3e1jS4hIASEgBC4HALt5UakAQkBISAEhEAj4a5FIASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4XnFQNSQgIASEg4a41IASEgBC4IAIS7hecVA1JCAgBISDhrjUgBISAELggAhLuF5xUDUkICAEhIOGuNSAEhIAQuCACEu4X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'\n />\n <image\n id='image5_880_97924'\n width='545'\n height='403'\n xlinkHref='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAiEAAAGTCAYAAAD+/cJkAAAgAElEQVR4Xu29S7fGRpWmKdHzNnbOm8Q55+KeQ0LNSeyec3HNSeyaZ9qeNwn8gAS7x1Vg5l3GzCttmDfGNS9s/gDR61HurdwKhaTQ5fv0XV6txcI+R1JEPJJPvNrXttEhAiIgAiIgAiIgAicQaE8YU0OKgAiIgAiIgAiIQCMRopdABERABERABETgFAISIadg16AiIAIiIAIiIAISIXoHREAEREAEREAETiEgEXIKdg0qAiIgAiIgAiIgEaJ3QAREQAREQARE4BQCEiGnYNegIiACIiACIiACEiF6B0RABERABERABE4hIBFyCnYNKgIiIAIiIAIiIBGid0AEREAEREAEROAUAhIhp2DXoCIgAiIgAiIgAhIhegdEQAREQAREQAROISARcgp2DSoCIiACIiACIiARondABERABERABETgFAISIadg16AiIAIiIAIiIAISIXoHREAEREAEREAETiEgEXIKdg0qAiIgAiIgAiIgEaJ3QAREQAREQARE4BQCEiGnYNegIiACIiACIiACEiF6B0RABERABERABE4hIBFyCnYNKgIiIAIiIAIiIBGid0AEREAEREAEROAUAhIhp2DXoCIgAiIgAiIgAhIhegdEQAREQAREQAROISARcgp2DSoCIiACIiACIiARondABERABERABETgFAISIadg16AiIAIiIAIiIAISIXoHREAEREAEREAETiEgEXIKdg0qAiIgAiIgAiIgEaJ3QAREQAREQARE4BQCEiGnYNegIiACIiACIiACEiF6B0RABERABERABE4hIBFyCnYNKgIiIAIiIAIiIBGid0AEREAEREAEROAUAhIhp2DXoCIgAiIgAiIgAhIhegdEQAREQAREQAROISARcgp2DSoCIiACIiACIiARondABERABERABETgFAISIadg16AiIAIiIAIiIAISIXoHREAEREAEREAETiEgEXIKdg0qAiIgAiIgAiIgEaJ3QAREQAREQARE4BQCEiGnYNegIiACIiACIiACEiF6B0RABERABERABE4hIBFyCnYNKgIiIAIiIAIiIBGid0AEREAEREAEROAUAhIhp2DXoCIgAiIgAiIgAhIhegdEQAREQAREQAROISARcgp2DSoCIiACIiACIiARondABERABERABETgFAISIadg16AiIAIiIAIiIAISIXoHREAEREAEREAETiEgEXIKdg0qAiIgAiIgAiIgEaJ3QAREQAREQARE4BQCEiGnYNegIiACIiACIiACEiF6B0RABERABERABE4hIBFyCnYNKgIiIAIiIAIiIBGid0AEREAEREAEROAUAhIhp2DXoCIgAiIgAiIgAhIhegdEQAREQAREQAROISARcgp2DSoCIiACIiACIiARondABERABERABETgFAISIadg16AiIAIiIAIiIAISIXoHREAEREAEREAETiEgEXIKdg0qAiIgAiIgAiIgEaJ3QAREQAREQARE4BQCEiGnYNegIiACIiACIiACEiF6B0RABERABERABE4hIBFyCnYNKgIiIAIiIAIiIBGid0AEREAEREAEROAUAhIhp2DXoCIgAiIgAiIgAhIhegdEQAREQAREQAROISARcgp2DSoCIiACIiACIiARondABERABERABETgFAISIadg16AiIAIiIAIiIAISIXoHREAEREAEREAETiEgEXIKdg0qAiIgAiIgAiIgEaJ3QAREQAREQARE4BQCEiGnYNegIiACIiACIiACEiF6B0RABERABERABE4hIBFyCnYNKgIiIAIiIAIiIBGid0AEREAEREAEROAUAhIhp2DXoCIgAiIgAiIgAhIhegdEQAREQAREQAROISARcgp2DSoCIiACIiACIiARondABERABERABETgFAISIadg16AiIAIiIAIiIAISIXoHREAEREAEREAETiEgEXIKdg0qAiIgAiIgAiIgEaJ3QAREQAREQARE4BQCEiGnYNegIiACIiACIiACEiF6B0RABERABERABE4hIBFyCnYNKgIiIAIiIAIiIBGid0AEREAEREAEROAUAhIhp2DXoCIgAiIgAiIgAhIhegdEQAREQAREQAROISARcgp2DSoCIiACIiACIiARondABERABERABETgFAISIadg16AiIAIiIAIiIAISIXoHREAEREAEREAETiEgEXIKdg0qAiIgAiIgAiIgEaJ3QAREQAREQARE4BQCEiGnYNegIiACIiACIiACEiF6B0RABERABERABE4hIBFyCnYNKgIiIAIiIAIiIBGid0AEREAEREAEROAUAhIhp2DXoCIgAiIgAiIgAhIhegdEQAREQAREQAROISARcgp2DSoC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'\n />\n </defs>\n </svg>\n\n );\n};\n\nexport default BlankCardImage;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nfunction BuildingSvg() {\n return (\n <svg\n width='98'\n height='80'\n viewBox='0 0 98 80'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <g clipPath='url(#clip0_249_14083)'>\n <path\n d='M97.2396 28.5905C97.7492 29.0983 98.0081 29.735 98.0081 30.5008V77.324C98.0081 78.0897 97.7492 78.7265 97.2396 79.2343C96.73 79.7421 96.091 80 95.3225 80H2.87974C2.11127 80 1.43987 79.7421 0.865539 79.2343C0.291209 78.7265 0 78.0897 0 77.324V30.5008C0 29.735 0.291209 29.0983 0.865539 28.5905C1.43987 28.0826 2.11127 27.8247 2.87974 27.8247H95.3144C96.0829 27.8247 96.7219 28.0826 97.2315 28.5905H97.2396Z'\n fill='#818698'\n />\n <path\n d='M8.63085 48.4675H5.37092C4.47303 48.3385 3.96341 47.8952 3.83398 47.1295V38.1501C3.96341 37.2635 4.47303 36.8121 5.37092 36.8121H8.63085C9.52065 36.8121 10.0384 37.2635 10.1678 38.1501V47.1295C10.0384 47.8952 9.52874 48.3385 8.63085 48.4675ZM8.63085 59.1718H5.37092C4.47303 59.0428 3.96341 58.5995 3.83398 57.8337V54.7788C3.96341 53.8922 4.47303 53.4408 5.37092 53.4408H8.63085C9.52065 53.4408 10.0384 53.8922 10.1678 54.7788V57.8337C10.0384 58.5995 9.52874 59.0428 8.63085 59.1718ZM8.63085 69.4892H5.37092C4.47303 69.3602 3.96341 68.9169 3.83398 68.1511V65.0962C3.96341 64.3305 4.47303 63.8871 5.37092 63.7582H8.63085C9.52065 63.8871 10.0384 64.3305 10.1678 65.0962V68.1511C10.0384 68.9169 9.52874 69.3602 8.63085 69.4892ZM17.6422 48.4675H14.1881C13.2902 48.3385 12.8453 47.8952 12.8453 47.1295V38.1501C12.8453 37.2635 13.2902 36.8121 14.1881 36.8121H17.6422C18.4106 36.8121 18.8555 37.2635 18.985 38.1501V47.1295C18.8555 47.8952 18.4106 48.3385 17.6422 48.4675ZM17.6422 59.1718H14.1881C13.2902 59.0428 12.8453 58.5995 12.8453 57.8337V54.7788C12.8453 53.8922 13.2902 53.4408 14.1881 53.4408H17.6422C18.4106 53.4408 18.8555 53.8922 18.985 54.7788V57.8337C18.8555 58.5995 18.4106 59.0428 17.6422 59.1718ZM17.6422 69.4892H14.1881C13.2902 69.3602 12.8453 68.9169 12.8453 68.1511V65.0962C12.8453 64.3305 13.2902 63.8871 14.1881 63.7582H17.6422C18.4106 63.8871 18.8555 64.3305 18.985 65.0962V68.1511C18.8555 68.9169 18.4106 69.3602 17.6422 69.4892ZM85.9145 47.1295V38.1501C85.7851 37.2635 85.2755 36.8121 84.3776 36.8121H81.1177C80.2198 36.8121 79.7102 37.2635 79.5807 38.1501V47.1295C79.7102 47.8952 80.2198 48.3385 81.1177 48.4675H84.3776C85.2674 48.3385 85.7851 47.8952 85.9145 47.1295ZM84.3776 59.1718H81.1177C80.2198 59.0428 79.7102 58.5995 79.5807 57.8337V54.7788C79.7102 53.8922 80.2198 53.4408 81.1177 53.4408H84.3776C85.2674 53.4408 85.7851 53.8922 85.9145 54.7788V57.8337C85.7851 58.5995 85.2755 59.0428 84.3776 59.1718ZM84.3776 69.4892H81.1177C80.2198 69.3602 79.7102 68.9169 79.5807 68.1511V65.0962C79.7102 64.3305 80.2198 63.8871 81.1177 63.7582H84.3776C85.2674 63.8871 85.7851 64.3305 85.9145 65.0962V68.1511C85.7851 68.9169 85.2755 69.3602 84.3776 69.4892ZM93.3889 48.4675H89.9349C89.037 48.3385 88.592 47.8952 88.592 47.1295V38.1501C88.592 37.2635 89.037 36.8121 89.9349 36.8121H93.3889C94.1574 36.8121 94.6023 37.2635 94.7317 38.1501V47.1295C94.6023 47.8952 94.1574 48.3385 93.3889 48.4675ZM93.3889 59.1718H89.9349C89.037 59.0428 88.592 58.5995 88.592 57.8337V54.7788C88.592 53.8922 89.037 53.4408 89.9349 53.4408H93.3889C94.1574 53.4408 94.6023 53.8922 94.7317 54.7788V57.8337C94.6023 58.5995 94.1574 59.0428 93.3889 59.1718ZM93.3889 69.4892H89.9349C89.037 69.3602 88.592 68.9169 88.592 68.1511V65.0962C88.592 64.3305 89.037 63.8871 89.9349 63.7582H93.3889C94.1574 63.8871 94.6023 64.3305 94.7317 65.0962V68.1511C94.6023 68.9169 94.1574 69.3602 93.3889 69.4892Z'\n fill='#EBEBEF'\n />\n <path\n d='M75.7548 3.44179V77.8962C75.6254 79.1697 75.1805 79.871 74.412 80H25.1248C24.2269 79.871 23.7173 79.1697 23.5879 77.8962V3.44179C23.7173 2.16824 24.2269 1.46698 25.1248 1.33801H74.412C75.1805 1.46698 75.6254 2.16824 75.7548 3.44179Z'\n fill='#BABEC9'\n />\n <path\n d='M34.7109 41.2051C34.5814 42.0998 34.1365 42.5431 33.3681 42.5431H29.1455C28.2476 42.5431 27.8027 42.0998 27.8027 41.2051V30.6942C27.8027 29.8076 28.2476 29.3562 29.1455 29.3562H33.3681C34.1365 29.3562 34.5814 29.8076 34.7109 30.6942V41.2051ZM33.3681 53.8197C34.1365 53.8197 34.5814 53.3763 34.7109 52.4816V49.4267C34.5814 48.661 34.1365 48.2176 33.3681 48.0887H29.1455C28.2476 48.2176 27.8027 48.661 27.8027 49.4267V52.4816C27.8027 53.3763 28.2476 53.8197 29.1455 53.8197H33.3681ZM33.3681 64.9028C34.1365 64.9028 34.5814 64.4595 34.7109 63.5647V60.5098C34.5814 59.7441 34.1365 59.3008 33.3681 59.1718H29.1455C28.2476 59.3008 27.8027 59.7441 27.8027 60.5098V63.5647C27.8027 64.4595 28.2476 64.9028 29.1455 64.9028H33.3681ZM33.3681 75.0348C34.1365 74.9058 34.5814 74.4625 34.7109 73.6967V70.6418C34.5814 69.8761 34.1365 69.4328 33.3681 69.3038H29.1455C28.2476 69.4328 27.8027 69.8761 27.8027 70.6418V73.6967C27.8027 74.4625 28.2476 74.9058 29.1455 75.0348H33.3681ZM43.342 42.5431C44.2318 42.5431 44.7495 42.0998 44.8789 41.2051V30.6942C44.7495 29.8076 44.2399 29.3562 43.342 29.3562H39.1195C38.351 29.3562 37.9061 29.8076 37.7767 30.6942V41.2051C37.9061 42.0998 38.351 42.5431 39.1195 42.5431H43.342ZM43.342 53.8197C44.2318 53.8197 44.7495 53.3763 44.8789 52.4816V49.4267C44.7495 48.661 44.2399 48.2176 43.342 48.0887H39.1195C38.351 48.2176 37.9061 48.661 37.7767 49.4267V52.4816C37.9061 53.3763 38.351 53.8197 39.1195 53.8197H43.342ZM60.0299 42.5431C60.7984 42.5431 61.2433 42.0998 61.3727 41.2051V30.6942C61.2433 29.8076 60.7984 29.3562 60.0299 29.3562H55.8074C54.9095 29.3562 54.3998 29.8076 54.2704 30.6942V41.2051C54.3998 42.0998 54.9095 42.5431 55.8074 42.5431H60.0299ZM60.0299 53.8197C60.7984 53.8197 61.2433 53.3763 61.3727 52.4816V49.4267C61.2433 48.661 60.7984 48.2176 60.0299 48.0887H55.8074C54.9095 48.2176 54.3998 48.661 54.2704 49.4267V52.4816C54.3998 53.3763 54.9095 53.8197 55.8074 53.8197H60.0299ZM70.0038 42.5431C70.8936 42.5431 71.3466 42.0998 71.3466 41.2051V30.6942C71.3466 29.8076 70.8936 29.3562 70.0038 29.3562H65.7813C65.0128 29.3562 64.5679 29.8076 64.4385 30.6942V41.2051C64.5679 42.0998 65.0128 42.5431 65.7813 42.5431H70.0038ZM34.7109 22.1421C34.5814 23.0368 34.1365 23.4801 33.3681 23.4801H29.1455C28.2476 23.4801 27.8027 23.0368 27.8027 22.1421V11.6312C27.8027 10.7446 28.2476 10.2932 29.1455 10.2932H33.3681C34.1365 10.2932 34.5814 10.7446 34.7109 11.6312V22.1421ZM43.342 23.4801C44.2318 23.4801 44.7495 23.0368 44.8789 22.1421V11.6312C44.7495 10.7446 44.2399 10.2932 43.342 10.2932H39.1195C38.351 10.2932 37.9061 10.7446 37.7767 11.6312V22.1421C37.9061 23.0368 38.351 23.4801 39.1195 23.4801H43.342ZM60.0299 23.4801C60.7984 23.4801 61.2433 23.0368 61.3727 22.1421V11.6312C61.2433 10.7446 60.7984 10.2932 60.0299 10.2932H55.8074C54.9095 10.2932 54.3998 10.7446 54.2704 11.6312V22.1421C54.3998 23.0368 54.9095 23.4801 55.8074 23.4801H60.0299ZM70.0038 23.4801C70.8936 23.4801 71.3466 23.0368 71.3466 22.1421V11.6312C71.3466 10.7446 70.8936 10.2932 70.0038 10.2932H65.7813C65.0128 10.2932 64.5679 10.7446 64.4385 11.6312V22.1421C64.5679 23.0368 65.0128 23.4801 65.7813 23.4801H70.0038ZM70.0038 53.8197C70.8936 53.8197 71.3466 53.3763 71.3466 52.4816V49.4267C71.3466 48.661 70.8936 48.2176 70.0038 48.0887H65.7813C65.0128 48.2176 64.5679 48.661 64.4385 49.4267V52.4816C64.5679 53.3763 65.0128 53.8197 65.7813 53.8197H70.0038ZM70.0038 64.9028C70.8936 64.9028 71.3466 64.4595 71.3466 63.5647V60.5098C71.3466 59.7441 70.8936 59.3008 70.0038 59.1718H65.7813C65.0128 59.3008 64.5679 59.7441 64.4385 60.5098V63.5647C64.5679 64.4595 65.0128 64.9028 65.7813 64.9028H70.0038ZM70.0038 75.0348C70.8936 74.9058 71.3466 74.4625 71.3466 73.6967V70.6418C71.3466 69.8761 70.8936 69.4328 70.0038 69.3038H65.7813C65.0128 69.4328 64.5679 69.8761 64.4385 70.6418V73.6967C64.5679 74.4625 65.0128 74.9058 65.7813 75.0348H70.0038Z'\n fill='#818698'\n />\n <path\n d='M59.649 59.5506H39.7012V80H59.649V59.5506Z'\n fill='#E0E9EF'\n />\n <path\n d='M75.7548 5.15869H23.7821C22.8842 5.02972 22.3745 4.5864 22.2451 3.82065V1.33804C22.3745 0.451385 22.8842 0 23.7821 0H75.7548C76.5233 0 76.9682 0.451385 77.0976 1.33804V3.82065C76.9682 4.5864 76.5233 5.02972 75.7548 5.15869ZM59.8354 57.068H39.5074C38.6095 57.197 38.1646 57.6403 38.1646 58.406V60.7033C38.1646 61.598 38.6095 62.0413 39.5074 62.0413H49.093V80.0081H50.2416V62.0413H59.8273C60.7171 62.0413 61.2348 61.598 61.3642 60.7033V58.406C61.2348 57.6403 60.7252 57.197 59.8273 57.068H59.8354Z'\n fill='#5A6072'\n />\n </g>\n <defs>\n <clipPath id='clip0_249_14083'>\n <rect\n width='98'\n height='80'\n fill='white'\n />\n </clipPath>\n </defs>\n </svg>\n );\n}\n\nexport default BuildingSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nfunction TadaSvg() {\n return (\n <svg\n width='46'\n height='46'\n viewBox='0 0 46 46'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <circle\n cx='23'\n cy='23'\n r='23'\n fill='white'\n />\n <path\n d='M9 36L13.004 34.6039L9.98 33.2079L9 36Z'\n fill='#CC8F00'\n />\n <path\n d='M20.648 24.5522L14.964 18.8563L14.04 21.4809L20.648 24.5522Z'\n fill='#FFBC1F'\n />\n <path\n d='M14.0412 21.4809L13.0332 24.4126L25.5492 30.2203L26.1092 30.0248L20.6492 24.5522L14.0412 21.4809Z'\n fill='#CC8F00'\n />\n <path\n d='M12.0234 27.3444L21.3474 31.6722L25.5474 30.2203L13.0314 24.4126L12.0234 27.3444Z'\n fill='#FFBC1F'\n />\n <path\n d='M10.9873 30.2761L17.1753 33.152L21.3473 31.6722L12.0233 27.3444L10.9873 30.2761Z'\n fill='#CC8F00'\n />\n <path\n d='M10.9885 30.2761L9.98047 33.2078L13.0045 34.6039L17.1765 33.152L10.9885 30.2761Z'\n fill='#FFBC1F'\n />\n <path\n d='M22.9448 22.123C26.0808 25.2223 27.7048 28.6287 26.5848 29.7456C25.4368 30.8625 21.9648 29.2709 18.8008 26.1717C15.6648 23.0724 14.0408 19.666 15.1608 18.5491C16.3088 17.4322 19.8088 19.0238 22.9448 22.123Z'\n fill='#66320A'\n />\n <path\n d='M19.0225 14.333C18.2665 13.272 19.0785 12.7973 20.0865 12.9928C19.1345 11.8201 19.7225 10.9824 21.2345 11.3175C21.7105 11.4292 21.0385 12.211 20.6185 12.183C21.9065 13.1324 21.2065 14.1375 19.8345 13.9142C21.0385 15.5615 18.9665 15.1427 18.0705 15.2265C17.8465 16.455 19.2465 17.8511 18.7705 17.8511C17.7625 17.8511 16.1105 13.97 19.0225 14.333Z'\n fill='#32A4EC'\n />\n <path\n d='M28.8515 16.5946C28.1515 16.9018 26.1915 13.8304 28.5995 13.8025C27.1995 12.546 27.3955 11.9317 29.2435 11.9038C27.1155 9.78179 30.5035 8.99999 30.8675 10.1448C30.9795 10.4798 29.8315 9.83763 29.4675 10.4519C29.0475 11.1499 32.0995 12.9369 28.9355 12.8531C30.0835 14.0258 30.1675 14.5843 28.3195 14.7797C28.5435 15.0869 29.2995 16.3992 28.8515 16.5946Z'\n fill='#E07315'\n />\n <path\n d='M29.6367 23.8542L30.3367 23.2399C30.3367 23.2399 31.0087 24.2172 31.4847 24.5801C31.8487 22.9328 31.7367 21.9276 33.6967 23.0724C32.6047 20.1965 34.3967 21.2854 36.1047 22.0672C35.9927 21.3413 36.1327 21.425 36.8607 21.2017C37.5047 23.6587 35.7687 22.9328 34.3127 22.151C35.1247 24.3568 34.2847 24.273 32.4647 23.5191C32.4367 24.4685 32.1287 25.5295 31.5687 25.6132C30.9247 25.697 29.6367 23.8542 29.6367 23.8542Z'\n fill='#C43133'\n />\n <path\n d='M24.399 16.9297C23.531 18.0465 22.215 18.6608 21.235 19.6381C20.199 20.6432 19.583 23.4633 19.583 23.4633C19.583 23.4633 19.947 20.5315 20.955 19.4147C21.851 18.4095 23.139 17.6556 23.839 16.4829C25.071 14.3609 23.979 11.5408 22.383 9.92141C22.719 9.61427 23.167 9.25129 23.419 9C24.903 10.8987 26.219 14.5843 24.399 16.9297Z'\n fill='#6167BD'\n />\n <path\n d='M25.8289 19.3309C24.5969 20.2244 23.7569 21.5088 22.8889 22.7094C22.1329 23.7984 19.7529 25.1107 19.7529 25.1107C19.7529 25.1107 21.9929 23.6029 22.6649 22.4581C23.4769 21.0621 24.3449 19.6101 25.6329 18.605C28.2369 16.5946 32.0169 16.818 34.9849 17.879C34.8169 18.2978 34.4809 19.1913 34.4809 19.1913C34.4809 19.1913 28.3209 17.544 25.8289 19.3309Z'\n fill='#E07315'\n />\n <path\n d='M31.0367 19.1076C30.2527 20.1406 29.8607 21.3971 29.2447 22.5419C28.6847 23.6029 27.9567 24.636 26.8647 25.1944C25.6607 25.8087 22.9727 25.5853 22.9727 25.5853C22.9727 25.5853 25.6607 25.5574 26.7527 24.8035C27.8727 24.0496 28.4607 22.7653 28.9087 21.5367C29.7207 19.2192 30.7567 16.7063 33.1927 15.6732C33.3607 16.12 33.6687 16.9855 33.6687 16.9855C33.6687 16.9855 32.3527 17.3764 31.0367 19.1076Z'\n fill='#32A4EC'\n />\n <path\n d='M10.8849 12.9145L9.55859 14.2375L10.8853 15.5601L12.2116 14.2371L10.8849 12.9145Z'\n fill='#32A4EC'\n />\n <path\n d='M12.7326 17.0697L11.4062 18.3927L12.733 19.7153L14.0593 18.3923L12.7326 17.0697Z'\n fill='#E07315'\n />\n <path\n d='M16.0949 10.8513L14.7686 12.1742L16.0953 13.4969L17.4216 12.1739L16.0949 10.8513Z'\n fill='#C43133'\n />\n <path\n d='M30.4818 26.5819L29.1553 27.9047L30.4818 29.2275L31.8083 27.9047L30.4818 26.5819Z'\n fill='#6167BD'\n />\n <path\n d='M27.5285 31.1187L26.2021 32.4417L27.5289 33.7643L28.8552 32.4413L27.5285 31.1187Z'\n fill='#C43133'\n />\n <path\n d='M33.3187 32.1512L31.9922 33.474L33.3187 34.7968L34.6452 33.474L33.3187 32.1512Z'\n fill='#E07315'\n />\n <path\n d='M34.6293 26.153L33.3027 27.4758L34.6293 28.7986L35.9558 27.4758L34.6293 26.153Z'\n fill='#32A4EC'\n />\n <path\n d='M32.44 12.2356L31.1133 13.5582L32.4396 14.8812L33.7663 13.5586L32.44 12.2356Z'\n fill='#32A4EC'\n />\n <path\n d='M18.2882 20.164L16.9619 21.487L18.2886 22.8096L19.615 21.4866L18.2882 20.164Z'\n fill='#E74C5C'\n />\n </svg>\n\n );\n}\n\nexport default TadaSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\nimport ExternalLink from 'components/external_link';\n\nimport {HostedCustomerLinks} from 'utils/constants';\n\nimport BlankCardImage from './blank_card_image.svg';\nimport BuildingSvg from './building.svg';\nimport TadaSvg from './tada.svg';\n\nexport enum ButtonCustomiserClasses {\n grayed = 'grayed',\n active = 'active',\n special = 'special',\n secondary = 'secondary',\n green = 'green',\n}\n\ntype PlanBriefing = {\n title: string;\n items?: string[];\n}\n\ntype PlanAddonsInfo = {\n title: string;\n items: PlanBriefing[];\n}\n\ntype ButtonDetails = {\n action: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n text: ReactNode;\n disabled?: boolean;\n customClass?: ButtonCustomiserClasses;\n}\n\ntype CardProps = {\n id: string;\n topColor: string;\n planLabel?: JSX.Element;\n plan: string;\n planSummary?: ReactNode;\n price?: string;\n rate?: ReactNode;\n planExtraInformation?: JSX.Element;\n buttonDetails?: ButtonDetails;\n customButtonDetails?: JSX.Element;\n contactSalesCTA?: JSX.Element;\n briefing: PlanBriefing;\n planAddonsInfo?: PlanAddonsInfo;\n planTrialDisclaimer?: JSX.Element;\n isCloud: boolean;\n}\n\ntype StyledProps = {\n bgColor?: string;\n}\n\nconst StyledDiv = styled.div<StyledProps>`\nbackground-color: ${(props) => props.bgColor};\n`;\n\nexport function BlankCard() {\n const {formatMessage} = useIntl();\n const [, contactSalesLink] = useOpenSalesLink();\n\n return (\n <div className='BlankCard'>\n <div className='image'>\n <BlankCardImage/>\n </div>\n\n <div className='description'>\n <div className='title'>\n <span className='questions'>\n {formatMessage({id: 'pricing_modal.questions', defaultMessage: 'Questions?'})}\n </span>\n <span className='contact'>\n <ExternalLink\n location='cloud_pricing_modal'\n href={contactSalesLink}\n >\n {formatMessage({id: 'pricing_modal.contact_us', defaultMessage: 'Contact us'})}\n </ExternalLink>\n </span>\n </div>\n <div className='content'>\n {formatMessage({id: 'pricing_modal.reach_out', defaultMessage: 'Reach out to us and we’ll help you decide which plan is right for you and your organization.'})}\n </div>\n </div>\n <hr/>\n <div className='self-hosted-interest'>\n <span className='interested'>\n {formatMessage({id: 'pricing_modal.interested_self_hosting', defaultMessage: 'Interested in self-hosting?'})}\n </span>\n <span className='learn'>\n <ExternalLink\n location='cloud_pricing_modal'\n href={HostedCustomerLinks.DOWNLOAD}\n >\n {formatMessage({id: 'pricing_modal.learn_more', defaultMessage: 'Learn more'})}\n </ExternalLink>\n </span>\n </div>\n </div>\n );\n}\n\nfunction Card(props: CardProps) {\n const {formatMessage} = useIntl();\n const bottomClassName = classNames('bottom', {\n bottom__round: props.isCloud,\n });\n\n const contactSalesCTAClassName = classNames('contact_sales_cta', {\n contact_sales_cta__reduced: props.isCloud,\n });\n\n const planBriefingContentClassName = classNames('plan_briefing_content', 'plan_briefing_content__reduced');\n\n const planPriceRateSectionClassName = classNames('plan_price_rate_section', 'plan_price_rate_section__expanded');\n\n const planLimitsCtaClassName = classNames('plan_limits_cta', 'plan_limits_cta__expanded');\n\n const buildingImgClassName = classNames('building_img', 'building_img__expanded');\n\n return (\n <div\n id={props.id}\n className='PlanCard'\n >\n {props.planLabel}\n {!props.isCloud && (\n <StyledDiv\n className='top'\n bgColor={props.topColor}\n />\n )}\n\n <div className={bottomClassName}>\n <div className='bottom_container'>\n <div className={planPriceRateSectionClassName}>\n <h3>{props.plan}</h3>\n <p>{props.planSummary}</p>\n {props.price ? <h1>{props.price}</h1> : <div className={buildingImgClassName}><BuildingSvg/></div>}\n <span className='plan_rate'>{props.rate}</span>\n </div>\n\n <div className={planLimitsCtaClassName}>\n {props.planExtraInformation}\n </div>\n\n <div className='plan_buttons'>\n {props.customButtonDetails || (\n <button\n id={props.id + '_action'}\n className={`plan_action_btn ${props.buttonDetails?.disabled ? ButtonCustomiserClasses.grayed : props.buttonDetails?.customClass}`}\n disabled={props.buttonDetails?.disabled}\n onClick={props.buttonDetails?.action}\n >\n {props.buttonDetails?.text}\n </button>\n )}\n </div>\n\n <div className={contactSalesCTAClassName}>\n {props.contactSalesCTA && (\n <div>\n <p>{formatMessage({id: 'pricing_modal.or', defaultMessage: 'or'})}</p>\n {props.contactSalesCTA}\n </div>)}\n </div>\n\n <div className='plan_briefing'>\n {props.planTrialDisclaimer}\n <div className={planBriefingContentClassName}>\n <span className='title'>{props.briefing.title}</span>\n {props.briefing.items?.map((i) => {\n return (\n <div\n className='item'\n key={i}\n >\n <i className='fa fa-circle bullet'/><p>{i}</p>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {props.planAddonsInfo && (\n <div className='plan_add_ons'>\n <div className='illustration'><TadaSvg/></div>\n <h4 className='title'>{props.planAddonsInfo.title}</h4>\n {props.planAddonsInfo.items.map((i) => {\n return (\n <div\n className='item'\n key={i.title}\n >\n <div className='item_title'><i className='fa fa-circle bullet fa-xs'/><p>{i.title}</p></div>\n {i.items?.map((sub) => {\n return (\n <div\n className='subitem'\n key={sub}\n >\n <div className='subitem_title'><i className='fa fa-circle bullet fa-xs'/><p>{sub}</p></div>\n </div>\n\n );\n })}\n </div>\n );\n })}\n\n </div>\n )}\n\n </div>\n </div>\n );\n}\n\nexport default Card;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {\n getCloudSubscription as selectCloudSubscription,\n getSubscriptionProduct as selectSubscriptionProduct,\n getCloudProducts as selectCloudProducts,\n} from 'mattermost-redux/selectors/entities/cloud';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {NotifyStatus} from 'components/common/hooks/useGetNotifyAdmin';\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\nimport PlanLabel from 'components/common/plan_label';\nimport {useNotifyAdmin} from 'components/notify_admin_cta/notify_admin_cta';\nimport CheckMarkSvg from 'components/widgets/icons/check_mark_icon';\n\nimport {CloudProducts, LicenseSkus, MattermostFeatures, TELEMETRY_CATEGORIES, RecurringIntervals} from 'utils/constants';\nimport {findOnlyYearlyProducts, findProductBySku} from 'utils/products';\n\nimport Card, {BlankCard, ButtonCustomiserClasses} from './card';\n\nimport './content.scss';\n\ntype ContentProps = {\n onHide: () => void;\n\n // callerCTA is information about the cta that opened this modal. This helps us provide a telemetry path\n // showing information about how the modal was opened all the way to more CTAs within the modal itself\n callerCTA?: string;\n}\n\nfunction Content(props: ContentProps) {\n const {formatMessage, formatNumber} = useIntl();\n\n const isAdmin = useSelector(isCurrentUserSystemAdmin);\n\n const subscription = useSelector(selectCloudSubscription);\n const currentProduct = useSelector(selectSubscriptionProduct);\n const products = useSelector(selectCloudProducts);\n\n const yearlyProducts = findOnlyYearlyProducts(products || {}); // pricing modal should now only show yearly products\n\n const currentSubscriptionIsMonthly = currentProduct?.recurring_interval === RecurringIntervals.MONTH;\n const isEnterprise = currentProduct?.sku === CloudProducts.ENTERPRISE;\n const isEnterpriseTrial = subscription?.is_free_trial === 'true';\n const yearlyProfessionalProduct = findProductBySku(yearlyProducts, CloudProducts.PROFESSIONAL);\n const professionalPrice = formatNumber((yearlyProfessionalProduct?.price_per_seat || 0) / 12, {maximumFractionDigits: 2});\n\n const isProfessional = currentProduct?.sku === CloudProducts.PROFESSIONAL;\n const currentSubscriptionIsMonthlyProfessional = currentSubscriptionIsMonthly && isProfessional;\n\n const isPreTrial = subscription?.trial_end_at === 0;\n\n let isPostTrial = false;\n if ((subscription && subscription.trial_end_at > 0) && !isEnterpriseTrial && isEnterprise) {\n isPostTrial = true;\n }\n\n const [notifyAdminBtnTextEnterprise, notifyAdminOnEnterpriseFeatures, enterpriseNotifyRequestStatus] = useNotifyAdmin({\n ctaText: formatMessage({id: 'pricing_modal.noitfy_cta.request', defaultMessage: 'Request admin to upgrade'}),\n successText: (\n <>\n <i className='icon icon-check'/>\n {formatMessage({id: 'pricing_modal.noitfy_cta.request_success', defaultMessage: 'Request sent'})}\n </>),\n }, {\n required_feature: MattermostFeatures.ALL_ENTERPRISE_FEATURES,\n required_plan: LicenseSkus.Enterprise,\n trial_notification: isPreTrial,\n });\n\n const getAdminProfessionalBtnText = () => {\n if (currentSubscriptionIsMonthlyProfessional) {\n return formatMessage({id: 'pricing_modal.btn.switch_to_annual', defaultMessage: 'Switch to annual billing'});\n }\n\n return formatMessage({id: 'pricing_modal.btn.purchase', defaultMessage: 'Purchase'});\n };\n\n const adminProfessionalTierText = getAdminProfessionalBtnText();\n\n const [openContactSales] = useOpenSalesLink();\n\n const professionalBtnDetails = () => {\n return {\n action: () => { },\n text: adminProfessionalTierText,\n disabled: true,\n customClass: (isPostTrial) ? ButtonCustomiserClasses.special : ButtonCustomiserClasses.active,\n };\n };\n\n const enterpriseBtnDetails = () => {\n if (isAdmin) {\n return {\n action: () => {\n trackEvent(TELEMETRY_CATEGORIES.CLOUD_PRICING, 'click_enterprise_contact_sales');\n openContactSales();\n },\n text: formatMessage({id: 'pricing_modal.btn.contactSales', defaultMessage: 'Contact Sales'}),\n customClass: ButtonCustomiserClasses.special,\n };\n }\n\n let trialBtnClass = ButtonCustomiserClasses.special;\n if (isPostTrial) {\n trialBtnClass = ButtonCustomiserClasses.special;\n } else {\n trialBtnClass = ButtonCustomiserClasses.active;\n }\n\n if (enterpriseNotifyRequestStatus === NotifyStatus.Success) {\n trialBtnClass = ButtonCustomiserClasses.green;\n }\n return {\n action: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n notifyAdminOnEnterpriseFeatures(e, 'enterprise_plan_pricing_modal_card');\n },\n text: notifyAdminBtnTextEnterprise,\n disabled: isEnterprise,\n customClass: trialBtnClass,\n };\n };\n\n const professionalPlanLabelText = () => {\n if (isProfessional || !isAdmin) {\n return formatMessage({id: 'pricing_modal.planLabel.currentPlan', defaultMessage: 'CURRENT PLAN'});\n }\n\n return formatMessage({id: 'pricing_modal.planLabel.currentPlanMonthly', defaultMessage: 'CURRENTLY ON MONTHLY BILLING'});\n };\n\n return (\n <div className='Content'>\n <Modal.Header className='PricingModal__header'>\n <div className='header_lhs'>\n <h1 className='title'>\n {formatMessage({id: 'pricing_modal.title', defaultMessage: 'Select a plan'})}\n </h1>\n <div>{formatMessage({id: 'pricing_modal.subtitle', defaultMessage: 'Choose a plan to get started'})}</div>\n </div>\n <button\n id='closeIcon'\n className='close'\n aria-label='Close'\n title='Close'\n onClick={props.onHide}\n >\n <span aria-hidden='true'>{'×'}</span>\n </button>\n </Modal.Header>\n <Modal.Body>\n <div\n className='PricingModal__body'\n style={{marginTop: '74px'}}\n >\n {isProfessional &&\n <Card\n id='professional'\n topColor='var(--denim-button-bg)'\n plan='Professional'\n planSummary={formatMessage({id: 'pricing_modal.planSummary.professional', defaultMessage: 'Scalable solutions {br} for growing teams'}, {\n br: <br/>,\n })}\n price={`$${professionalPrice}`}\n rate={formatMessage({id: 'pricing_modal.rate.seatPerMonth', defaultMessage: 'USD per seat/month {br}<b>(billed annually)</b>'}, {\n br: <br/>,\n b: (chunks: React.ReactNode | React.ReactNodeArray) => (\n <span className='billed_annually'>\n {chunks}\n </span>\n ),\n })}\n isCloud={true}\n planLabel={isProfessional ? (\n <PlanLabel\n text={professionalPlanLabelText()}\n color='var(--denim-status-online)'\n bgColor='var(--center-channel-bg)'\n firstSvg={<CheckMarkSvg/>}\n />) : undefined}\n buttonDetails={professionalBtnDetails()}\n briefing={{\n title: formatMessage({id: 'pricing_modal.briefing.title_no_limit', defaultMessage: 'No limits on your team’s usage'}),\n items: [\n formatMessage({id: 'pricing_modal.briefing.professional.messageBoardsIntegrationsCalls', defaultMessage: 'Unlimited access to messages and files'}),\n formatMessage({id: 'pricing_modal.briefing.professional.unLimitedTeams', defaultMessage: 'Unlimited teams'}),\n formatMessage({id: 'pricing_modal.briefing.professional.advancedPlaybook', defaultMessage: 'Advanced Playbook workflows with retrospectives'}),\n formatMessage({id: 'pricing_modal.extra_briefing.professional.ssoSaml', defaultMessage: 'SSO with SAML 2.0, including Okta, OneLogin, and ADFS'}),\n formatMessage({id: 'pricing_modal.extra_briefing.professional.ssoadLdap', defaultMessage: 'SSO support with AD/LDAP, Google, O365, OpenID'}),\n formatMessage({id: 'pricing_modal.extra_briefing.professional.guestAccess', defaultMessage: 'Guest access with MFA enforcement'}),\n ],\n }}\n />}\n\n <Card\n id='enterprise'\n topColor='#E07315'\n plan='Enterprise'\n planSummary={formatMessage({id: 'pricing_modal.planSummary.enterprise', defaultMessage: 'Administration, security, and compliance for large teams'})}\n isCloud={true}\n planLabel={\n isEnterprise ? (\n <PlanLabel\n text={formatMessage({id: 'pricing_modal.planLabel.currentPlan', defaultMessage: 'CURRENT PLAN'})}\n color='var(--denim-status-online)'\n bgColor='var(--center-channel-bg)'\n firstSvg={<CheckMarkSvg/>}\n renderLastDaysOnTrial={true}\n />) : undefined}\n buttonDetails={enterpriseBtnDetails()}\n planTrialDisclaimer={undefined}\n briefing={{\n title: formatMessage({id: 'pricing_modal.briefing.title_large_scale', defaultMessage: 'Large scale collaboration'}),\n items: [\n formatMessage({id: 'pricing_modal.briefing.enterprise.groupSync', defaultMessage: 'AD/LDAP group sync'}),\n formatMessage({id: 'pricing_modal.briefing.enterprise.rolesAndPermissions', defaultMessage: 'Advanced roles and permissions'}),\n formatMessage({id: 'pricing_modal.briefing.enterprise.advancedComplianceManagement', defaultMessage: 'Advanced compliance management'}),\n formatMessage({id: 'pricing_modal.briefing.enterprise.mobileSecurity', defaultMessage: 'Advanced mobile security via ID-only push notifications'}),\n formatMessage({id: 'pricing_modal.extra_briefing.enterprise.playBookAnalytics', defaultMessage: 'Playbook analytics dashboard'}),\n ],\n }}\n planAddonsInfo={{\n title: formatMessage({id: 'pricing_modal.addons.title', defaultMessage: 'Available Add-ons'}),\n items: [\n {title: formatMessage({id: 'pricing_modal.addons.premiumSupport', defaultMessage: 'Premium support'})},\n {title: formatMessage({id: 'pricing_modal.addons.missionCritical', defaultMessage: 'Mission-critical 24x7'})},\n {title: '1hr-L1, 2hr-L2'},\n {title: formatMessage({id: 'pricing_modal.addons.USSupport', defaultMessage: 'U.S.- only based support'})},\n {title: formatMessage({id: 'pricing_modal.addons.dedicatedDeployment', defaultMessage: 'Dedicated virtual secure cloud deployment (Cloud)'})},\n {title: formatMessage({id: 'pricing_modal.addons.dedicatedK8sCluster', defaultMessage: 'Dedicated Kubernetes cluster'})},\n {title: formatMessage({id: 'pricing_modal.addons.dedicatedDB', defaultMessage: 'Dedicated database'})},\n {title: formatMessage({id: 'pricing_modal.addons.dedicatedEncryption', defaultMessage: 'Dedicated encryption keys'})},\n {title: formatMessage({id: 'pricing_modal.addons.uptimeGuarantee', defaultMessage: '99% uptime guarantee'})},\n ],\n }}\n />\n <BlankCard/>\n </div>\n </Modal.Body>\n </div>\n );\n}\n\nexport default Content;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\n\nimport {TELEMETRY_CATEGORIES} from 'utils/constants';\n\nconst StyledA = styled.a`\ncolor: var(--denim-button-bg);\nfont-family: 'Open Sans';\nfont-size: 12px;\nfont-style: normal;\nfont-weight: 600;\nline-height: 16px;\ncursor: pointer;\ntext-align: center;\n`;\n\nfunction ContactSalesCTA() {\n const {formatMessage} = useIntl();\n const [openSalesLink] = useOpenSalesLink();\n\n const isCloud = useSelector(isCurrentLicenseCloud);\n\n return (\n <StyledA\n id='contact_sales_quote'\n onClick={(e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n e.preventDefault();\n if (isCloud) {\n trackEvent(TELEMETRY_CATEGORIES.CLOUD_PRICING, 'click_enterprise_contact_sales');\n } else {\n trackEvent('self_hosted_pricing', 'click_enterprise_contact_sales');\n }\n openSalesLink();\n }}\n >\n {formatMessage({id: 'pricing_modal.btn.contactSalesForQuote', defaultMessage: 'Contact Sales'})}\n </StyledA>\n );\n}\n\nexport default ContactSalesCTA;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport ExternalLink from 'components/external_link';\n\nimport {AboutLinks, LicenseLinks} from 'utils/constants';\n\nconst ContainerSpan = styled.span`\nfont-style: normal;\ndisplay: inline-block;\nfont-weight: 400;\nfont-size: 10px;\nline-height: 14px;\nletter-spacing: 0.02em;\ncolor: rgba(var(--center-channel-color-rgb), 0.75);\n`;\n\nconst Span = styled.span`\nfont-weight: 600;\n`;\n\nfunction StartTrialCaution() {\n const {formatMessage} = useIntl();\n\n const message = formatMessage({\n id: 'pricing_modal.start_trial.disclaimer',\n defaultMessage: 'By selecting <span>Try free for 30 days,</span> I agree to the <linkAgreement>Mattermost Software and Services License Agreement</linkAgreement>, <linkPrivacy>Privacy Policy</linkPrivacy>, and receiving product emails.',\n }, {\n span: (chunks: React.ReactNode | React.ReactNodeArray) => (<Span>{chunks}</Span>),\n linkAgreement: (msg: React.ReactNode) => (\n <ExternalLink\n href={LicenseLinks.SOFTWARE_SERVICES_LICENSE_AGREEMENT}\n location='start_trial_caution'\n >\n {msg}\n </ExternalLink>\n ),\n linkPrivacy: (msg: React.ReactNode) => (\n <ExternalLink\n href={AboutLinks.PRIVACY_POLICY}\n location='start_trial_caution'\n >\n {msg}\n </ExternalLink>\n ),\n });\n return (<ContainerSpan>{message}</ContainerSpan>);\n}\n\nexport default StartTrialCaution;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getPrevTrialLicense} from 'mattermost-redux/actions/admin';\nimport {Client4} from 'mattermost-redux/client';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {closeModal} from 'actions/views/modals';\n\nimport useFetchAdminConfig from 'components/common/hooks/useFetchAdminConfig';\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\nimport PlanLabel from 'components/common/plan_label';\nimport ExternalLink from 'components/external_link';\nimport StartTrialBtn from 'components/learn_more_trial_modal/start_trial_btn';\nimport CheckMarkSvg from 'components/widgets/icons/check_mark_icon';\n\nimport {CloudLinks, ModalIdentifiers, LicenseSkus, TELEMETRY_CATEGORIES, RecurringIntervals} from 'utils/constants';\n\nimport Card, {ButtonCustomiserClasses} from './card';\nimport ContactSalesCTA from './contact_sales_cta';\nimport StartTrialCaution from './start_trial_caution';\n\nimport './content.scss';\n\ntype ContentProps = {\n onHide: () => void;\n}\n\nconst FALL_BACK_PROFESSIONAL_PRICE = '10';\n\nfunction SelfHostedContent(props: ContentProps) {\n const [professionalPrice, setProfessionalPrice] = useState(' ');\n useFetchAdminConfig();\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n const [openSalesLink] = useOpenSalesLink();\n\n useEffect(() => {\n dispatch(getPrevTrialLicense());\n }, []);\n\n useEffect(() => {\n async function fetchSelfHostedProducts() {\n try {\n const products = await Client4.getSelfHostedProducts();\n const professionalProduct = products.find((prod) => prod.sku === LicenseSkus.Professional && prod.recurring_interval === RecurringIntervals.YEAR);\n const price = professionalProduct ? professionalProduct.price_per_seat.toString() : FALL_BACK_PROFESSIONAL_PRICE;\n setProfessionalPrice(`$${price}`);\n } catch (error) {\n setProfessionalPrice(`$${FALL_BACK_PROFESSIONAL_PRICE}`);\n }\n }\n\n fetchSelfHostedProducts();\n }, []);\n\n const isAdmin = useSelector(isCurrentUserSystemAdmin);\n\n const license = useSelector(getLicense);\n const prevSelfHostedTrialLicense = useSelector((state: GlobalState) => state.entities.admin.prevTrialLicense);\n\n const isSelfHostedEnterpriseTrial = license.IsTrial === 'true';\n\n const isStarter = license.IsLicensed === 'false';\n const isProfessional = license.SkuShortName === LicenseSkus.Professional;\n const isEnterprise = license.SkuShortName === LicenseSkus.Enterprise;\n const isPostSelfHostedEnterpriseTrial = prevSelfHostedTrialLicense.IsLicensed === 'true';\n\n const [openContactSales] = useOpenSalesLink();\n\n const closePricingModal = () => {\n dispatch(closeModal(ModalIdentifiers.PRICING_MODAL));\n };\n\n const starterBriefing = [\n formatMessage({id: 'pricing_modal.briefing.unlimitedWorkspaceTeams', defaultMessage: 'Unlimited workspace teams'}),\n formatMessage({id: 'pricing_modal.briefing.unlimitedPlaybookRuns', defaultMessage: 'Unlimited playbooks and runs'}),\n formatMessage({id: 'pricing_modal.extra_briefing.free.calls', defaultMessage: 'Voice calls and screen share'}),\n formatMessage({id: 'pricing_modal.briefing.fullMessageAndHistory', defaultMessage: 'Full message and file history'}),\n formatMessage({id: 'pricing_modal.briefing.ssoWithGitLab', defaultMessage: 'SSO with Gitlab'}),\n ];\n\n const professionalBriefing = [\n formatMessage({id: 'pricing_modal.briefing.customUserGroups', defaultMessage: 'Custom user groups'}),\n formatMessage({id: 'pricing_modal.extra_briefing.professional.ssoSaml', defaultMessage: 'SSO with SAML 2.0, including Okta, OneLogin, and ADFS'}),\n formatMessage({id: 'pricing_modal.extra_briefing.professional.ssoadLdap', defaultMessage: 'SSO support with AD/LDAP, Google, O365, OpenID'}),\n formatMessage({id: 'pricing_modal.extra_briefing.professional.guestAccess', defaultMessage: 'Guest access with MFA enforcement'}),\n\n ];\n\n const enterpriseBriefing = [\n formatMessage({id: 'pricing_modal.briefing.enterprise.groupSync', defaultMessage: 'AD/LDAP group sync'}),\n formatMessage({id: 'pricing_modal.briefing.enterprise.mobileSecurity', defaultMessage: 'Advanced mobile security via ID-only push notifications'}),\n formatMessage({id: 'pricing_modal.briefing.enterprise.rolesAndPermissions', defaultMessage: 'Advanced roles and permissions'}),\n formatMessage({id: 'pricing_modal.briefing.enterprise.advancedComplianceManagement', defaultMessage: 'Advanced compliance management'}),\n formatMessage({id: 'pricing_modal.extra_briefing.enterprise.playBookAnalytics', defaultMessage: 'Playbook analytics dashboard'}),\n ];\n\n const renderAlert = () => {\n return (\n <div className='alert-option'>\n <span>\n {formatMessage({id: 'pricing_modal.lookingForCloudOption', defaultMessage: 'Looking for a cloud option?'})}\n </span>\n <ExternalLink\n onClick={() => {\n trackEvent(\n TELEMETRY_CATEGORIES.SELF_HOSTED_PURCHASING,\n 'click_looking_for_a_cloud_option',\n );\n }\n }\n href={CloudLinks.CLOUD_SIGNUP_PAGE}\n location='pricing_modal_self_hosted_content'\n >{formatMessage({id: 'pricing_modal.reviewDeploymentOptions', defaultMessage: 'Review deployment options'})}</ExternalLink>\n </div>\n );\n };\n\n const trialButton = () => {\n return (\n <StartTrialBtn\n telemetryId='start_trial_from_self_hosted_pricing_modal'\n renderAsButton={true}\n disabled={isSelfHostedEnterpriseTrial}\n btnClass={`plan_action_btn ${isSelfHostedEnterpriseTrial ? ButtonCustomiserClasses.grayed : ButtonCustomiserClasses.special}`}\n onClick={closePricingModal}\n />\n );\n };\n\n return (\n <div className='Content Content--self-hosted'>\n <Modal.Header className='PricingModal__header'>\n <div className='header_lhs'>\n <h1 className='title'>\n {formatMessage({id: 'pricing_modal.title', defaultMessage: 'Select a plan'})}\n </h1>\n <div>{formatMessage({id: 'pricing_modal.subtitle', defaultMessage: 'Choose a plan to get started'})}</div>\n </div>\n <button\n id='closeIcon'\n className='close'\n aria-label='Close'\n title='Close'\n onClick={() => {\n trackEvent('self_hosted_pricing', 'close_pricing_modal');\n props.onHide();\n }}\n >\n <span aria-hidden='true'>{'×'}</span>\n </button>\n </Modal.Header>\n <Modal.Body>\n {renderAlert()}\n <div className='PricingModal__body'>\n <Card\n id='free'\n topColor='#339970'\n plan='Free'\n planSummary={formatMessage({id: 'pricing_modal.planSummary.free', defaultMessage: 'Increased productivity for small teams'})}\n price='$0'\n isCloud={false}\n planLabel={\n isStarter ? (\n <PlanLabel\n text={formatMessage({id: 'pricing_modal.planLabel.currentPlan', defaultMessage: 'CURRENT PLAN'})}\n color='var(--denim-status-online)'\n bgColor='var(--center-channel-bg)'\n firstSvg={<CheckMarkSvg/>}\n />) : undefined}\n buttonDetails={{\n action: () => {},\n text: formatMessage({id: 'pricing_modal.btn.downgrade', defaultMessage: 'Downgrade'}),\n disabled: true,\n customClass: ButtonCustomiserClasses.active,\n }}\n briefing={{\n title: formatMessage({id: 'pricing_modal.briefing.title', defaultMessage: 'Top features'}),\n items: starterBriefing,\n }}\n />\n <Card\n id='professional'\n topColor='var(--denim-button-bg)'\n plan='Professional'\n planSummary={formatMessage({id: 'pricing_modal.planSummary.professional', defaultMessage: 'Scalable solutions {br} for growing teams'}, {\n br: <br/>,\n })}\n price={professionalPrice}\n rate={formatMessage({id: 'pricing_modal.rate.seatPerMonth', defaultMessage: 'USD per seat/month {br}<b>(billed annually)</b>'}, {\n br: <br/>,\n b: (chunks: React.ReactNode | React.ReactNodeArray) => (\n <span className='billed_annually'>\n <b>{chunks}</b>\n </span>\n ),\n })}\n isCloud={false}\n planLabel={\n isProfessional ? (\n <PlanLabel\n text={formatMessage({id: 'pricing_modal.planLabel.currentPlan', defaultMessage: 'CURRENT PLAN'})}\n color='var(--denim-status-online)'\n bgColor='var(--center-channel-bg)'\n firstSvg={<CheckMarkSvg/>}\n />) : undefined}\n buttonDetails={{\n action: () => {\n trackEvent('self_hosted_pricing', 'click_upgrade_button');\n openSalesLink();\n },\n text: formatMessage({id: 'pricing_modal.btn.upgrade', defaultMessage: 'Upgrade'}),\n disabled: !isAdmin || isProfessional,\n customClass: isPostSelfHostedEnterpriseTrial ? ButtonCustomiserClasses.special : ButtonCustomiserClasses.active,\n }}\n\n briefing={{\n title: formatMessage({id: 'pricing_modal.briefing.title', defaultMessage: 'Top features'}),\n items: professionalBriefing,\n }}\n />\n <Card\n id='enterprise'\n topColor='#E07315'\n plan='Enterprise'\n planSummary={formatMessage({id: 'pricing_modal.planSummary.enterprise', defaultMessage: 'Administration, security, and compliance for large teams'})}\n isCloud={false}\n planLabel={\n isEnterprise ? (\n <PlanLabel\n text={formatMessage({id: 'pricing_modal.planLabel.currentPlan', defaultMessage: 'CURRENT PLAN'})}\n color='var(--denim-status-online)'\n bgColor='var(--center-channel-bg)'\n firstSvg={<CheckMarkSvg/>}\n renderLastDaysOnTrial={true}\n />) : undefined}\n buttonDetails={(isPostSelfHostedEnterpriseTrial || !isAdmin) ? {\n action: () => {\n trackEvent('self_hosted_pricing', 'click_enterprise_contact_sales');\n openContactSales();\n },\n text: formatMessage({id: 'pricing_modal.btn.contactSales', defaultMessage: 'Contact Sales'}),\n customClass: ButtonCustomiserClasses.special,\n } : undefined}\n customButtonDetails={(!isPostSelfHostedEnterpriseTrial && isAdmin) ? (\n trialButton()\n ) : undefined}\n planTrialDisclaimer={(!isPostSelfHostedEnterpriseTrial && isAdmin) ? <StartTrialCaution/> : undefined}\n contactSalesCTA={(isPostSelfHostedEnterpriseTrial || !isAdmin) ? undefined : <ContactSalesCTA/>}\n briefing={{\n title: formatMessage({id: 'pricing_modal.briefing.title', defaultMessage: 'Top features'}),\n items: enterpriseBriefing,\n }}\n />\n </div>\n </Modal.Body>\n </div>\n );\n}\n\nexport default SelfHostedContent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useState, useEffect} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {getConfig as getConfigAction} from 'mattermost-redux/actions/admin';\nimport {getConfig} from 'mattermost-redux/selectors/entities/admin';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\n// used only for queueing the fetch, where needed. Data is read from redux\n// rather than this hook when it is used\nexport default function useFetchAdminConfig() {\n const isSystemAdmin = useSelector(isCurrentUserSystemAdmin);\n const dispatch = useDispatch();\n const [requested, setRequested] = useState(false);\n const hasData = Object.keys(useSelector(getConfig)).length > 0;\n\n useEffect(() => {\n if (isSystemAdmin && !requested && !hasData) {\n dispatch(getConfigAction());\n setRequested(true);\n }\n }, [isSystemAdmin, requested, hasData]);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport Content from './content';\nimport SelfHostedContent from './self_hosted_content';\n\nimport './pricing_modal.scss';\n\ntype Props = {\n\n // callerCTA is information about the cta that opened this modal. This helps us provide a telemetry path\n // showing information about how the modal was opened all the way to more CTAs within the modal itself\n callerCTA?: string;\n}\n\nfunction PricingModal(props: Props) {\n const [showModal, setShowModal] = useState(true);\n const dispatch = useDispatch();\n const isCloud = useSelector(isCurrentLicenseCloud);\n const isCloudPurchaseModalOpen = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.CLOUD_PURCHASE));\n\n const onHide = () => {\n // this fixes problem when both pricing modal and purchase modal are open and subsequently, when a user closes the pricing modal,\n // the purchase modal becomes unresponsive for sometime because the pricing modal is still in the DOM.\n if (isCloudPurchaseModalOpen) {\n dispatch(closeModal(ModalIdentifiers.PRICING_MODAL));\n } else {\n setShowModal(false);\n }\n };\n\n const content = isCloud ? (\n <Content\n onHide={onHide}\n callerCTA={props.callerCTA}\n />\n ) : (\n <SelfHostedContent\n onHide={onHide}\n />\n );\n\n return (\n <Modal\n className='PricingModal'\n show={showModal}\n id='pricingModal'\n onExited={() => {\n dispatch(closeModal(ModalIdentifiers.PRICING_MODAL));\n }}\n data-testid='pricingModal'\n dialogClassName='a11y__modal'\n onHide={onHide}\n role='none'\n aria-modal='true'\n aria-labelledby='pricing_modal_title'\n >\n {content}\n\n </Modal>\n );\n}\n\nexport default PricingModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n className?: string;\n status?: string;\n}\n\nconst statusToIconMap: { [key: string]: string } = {\n online: 'icon-check-circle',\n away: 'icon-clock',\n dnd: 'icon-minus-circle',\n default: 'icon-circle-outline',\n};\n\nconst StatusIconNew = ({className = '', status = ''}: Props) => {\n if (!status) {\n return null;\n }\n\n const iconName = statusToIconMap[status] || statusToIconMap.default;\n\n return <i className={`${iconName} ${className}`}/>;\n};\n\nexport default React.memo(StatusIconNew);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport styled from 'styled-components';\n\nimport ProfilePopover from 'components/profile_popover';\nimport StatusIcon from 'components/status_icon';\nimport StatusIconNew from 'components/status_icon_new';\nimport Avatar, {getAvatarWidth} from 'components/widgets/users/avatar';\nimport type {TAvatarSizeToken} from 'components/widgets/users/avatar';\n\ntype Props = {\n size?: TAvatarSizeToken;\n isEmoji?: boolean;\n wrapperClass?: string;\n profileSrc?: string;\n src: string;\n isBot?: boolean;\n fromAutoResponder?: boolean;\n status?: string;\n fromWebhook?: boolean;\n userId?: string;\n channelId?: string;\n username?: string;\n overwriteIcon?: string;\n overwriteName?: string;\n newStatusIcon?: boolean;\n statusClass?: string;\n}\n\nfunction ProfilePicture(props: Props) {\n // profileSrc will, if possible, be the original user profile picture even if the icon\n // for the post is overriden, so that the popup shows the user identity\n const profileSrc = typeof props.profileSrc === 'string' && props.profileSrc !== '' ? props.profileSrc : props.src;\n\n const profileIconClass = `profile-icon ${props.isEmoji ? 'emoji' : ''}`;\n\n const hideStatus = props.isBot || props.fromAutoResponder || props.fromWebhook;\n\n if (props.userId) {\n return (\n <ProfilePopover\n triggerComponentClass={classNames('status-wrapper', props.wrapperClass)}\n userId={props.userId}\n src={profileSrc}\n channelId={props.channelId}\n hideStatus={hideStatus}\n overwriteIcon={props.overwriteIcon}\n overwriteName={props.overwriteName}\n fromWebhook={props.fromWebhook}\n >\n <>\n <RoundButton\n className='style--none'\n size={props?.size ?? 'md'}\n >\n <span className={profileIconClass}>\n <Avatar\n username={props.username}\n size={props.size}\n url={props.src}\n />\n </span>\n </RoundButton>\n <StatusIcon status={props.status}/>\n </>\n </ProfilePopover>\n );\n }\n\n return (\n <span\n className={classNames('status-wrapper', 'style--none', props.wrapperClass)}\n >\n <span className={profileIconClass}>\n <Avatar\n size={props?.size ?? 'md'}\n url={props.src}\n />\n </span>\n {props.newStatusIcon ? (\n <StatusIconNew\n className={props.statusClass}\n status={props.status}\n />\n ) : (\n <StatusIcon status={props.status}/>\n )}\n </span>\n );\n}\n\nconst RoundButton = styled.button<{size: TAvatarSizeToken}>`\n border-radius: 50%;\n width: ${(p) => getAvatarWidth(p.size)}px;\n height: ${(p) => getAvatarWidth(p.size)}px;\n`;\n\nexport default ProfilePicture;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport StatusIcon from 'components/status_icon';\nimport Avatar from 'components/widgets/users/avatar';\n\ntype Props = {\n username?: string;\n hideStatus?: boolean;\n status?: string;\n urlSrc: string;\n}\nconst ProfilePopoverAvatar = ({\n username,\n hideStatus,\n status,\n urlSrc,\n}: Props) => {\n return (\n <div className='user-popover-image'>\n <Avatar\n id='userAvatar'\n size='xxl'\n username={username}\n url={urlSrc}\n tabIndex={-1}\n />\n <StatusIcon\n className='status user-popover-status'\n status={hideStatus ? undefined : status}\n button={true}\n />\n </div>\n );\n};\n\nexport default ProfilePopoverAvatar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {getCustomProfileAttributeFields} from 'mattermost-redux/actions/general';\nimport {Client4} from 'mattermost-redux/client';\nimport {getCustomProfileAttributes} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n userID: string;\n}\nconst ProfilePopoverCustomAttributes = ({\n userID,\n}: Props) => {\n const dispatch = useDispatch();\n const [customAttributeValues, setCustomAttributeValues] = useState<Record<string, string>>({});\n const customProfileAttributeFields = useSelector((state: GlobalState) => getCustomProfileAttributes(state));\n\n useEffect(() => {\n const fetchValues = async () => {\n const response = await Client4.getUserCustomProfileAttributesValues(userID);\n setCustomAttributeValues(response);\n };\n dispatch(getCustomProfileAttributeFields());\n fetchValues();\n }, [userID, dispatch]);\n const attributeSections = Object.values(customProfileAttributeFields).map((attribute) => {\n const value = customAttributeValues[attribute.id];\n if (!value) {\n return null;\n }\n return (\n <div\n key={'customAttribute_' + attribute.id}\n className='user-popover__custom_attributes'\n >\n <strong\n id={`user-popover__custom_attributes-title-${attribute.id}`}\n className='user-popover__subtitle'\n >\n {attribute.name}\n </strong>\n <p\n aria-labelledby={`user-popover__custom_attributes-title-${attribute.id}`}\n className='user-popover__subtitle-text'\n >\n {value}\n </p>\n </div>\n );\n });\n return (\n <>{attributeSections}</>\n );\n};\n\nexport default ProfilePopoverCustomAttributes;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\nimport {CustomStatusDuration} from '@mattermost/types/users';\n\nimport {openModal} from 'actions/views/modals';\nimport {makeGetCustomStatus, isCustomStatusEnabled as getIsCustomStatusEnabled, isCustomStatusExpired as getIsCustomStatusExpired} from 'selectors/views/custom_status';\n\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport CustomStatusModal from 'components/custom_status/custom_status_modal';\nimport CustomStatusText from 'components/custom_status/custom_status_text';\nimport ExpiryTime from 'components/custom_status/expiry_time';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n user: UserProfile;\n currentUserId: string;\n hideStatus?: boolean;\n hide?: () => void;\n returnFocus?: () => void;\n currentUserTimezone?: string;\n haveOverrideProp: boolean;\n}\n\nconst emojiStyles: React.CSSProperties = {\n marginRight: 8,\n width: 16,\n height: 16,\n};\nconst ProfilePopoverCustomStatus = ({\n currentUserId,\n hideStatus,\n user,\n hide,\n returnFocus,\n currentUserTimezone,\n haveOverrideProp,\n}: Props) => {\n const dispatch = useDispatch();\n const getCustomStatus = useMemo(makeGetCustomStatus, []);\n const customStatus = useSelector((state: GlobalState) => getCustomStatus(state, user.id));\n const isCustomStatusExpired = useSelector((state: GlobalState) => getIsCustomStatusExpired(state, customStatus));\n const isCustomStatusEnabled = useSelector((state: GlobalState) => getIsCustomStatusEnabled(state));\n\n const showCustomStatusModal = useCallback(() => {\n hide?.();\n const customStatusInputModalData = {\n modalId: ModalIdentifiers.CUSTOM_STATUS,\n dialogType: CustomStatusModal,\n dialogProps: {onExited: returnFocus},\n };\n dispatch(openModal(customStatusInputModalData));\n }, [hide, returnFocus]);\n\n const customStatusSet = (customStatus?.text || customStatus?.emoji) && !isCustomStatusExpired;\n const showExpiryTime = customStatusSet && customStatus.expires_at && customStatus.duration !== CustomStatusDuration.DONT_CLEAR;\n const canSetCustomStatus = user.id === currentUserId;\n const shouldShowCustomStatus = isCustomStatusEnabled && !haveOverrideProp && !hideStatus && (customStatusSet || canSetCustomStatus);\n\n if (!shouldShowCustomStatus) {\n return null;\n }\n\n let customStatusContent;\n if (customStatusSet) {\n customStatusContent = (\n <div\n className='user-popover__custom-status'\n aria-labelledby='user-popover__custom-status-title'\n >\n <CustomStatusEmoji\n userID={user.id}\n showTooltip={false}\n emojiStyle={emojiStyles}\n />\n <CustomStatusText\n text={customStatus.text || ''}\n />\n </div>\n );\n } else if (canSetCustomStatus) {\n customStatusContent = (\n <button\n className='btn btn-sm btn-quaternary user-popover__set-status'\n onClick={showCustomStatusModal}\n >\n <i className='icon icon-emoticon-plus-outline'/>\n <FormattedMessage\n id='user_profile.custom_status.set_status'\n defaultMessage='Set a status'\n />\n </button>\n );\n }\n\n return (\n <div\n id='user-popover-status'\n className='user-popover__time-status-container'\n >\n <strong\n id='user-popover__custom-status-title'\n className='user-popover__subtitle'\n >\n <FormattedMessage\n id='user_profile.custom_status'\n defaultMessage='Status'\n />\n {showExpiryTime && (\n <ExpiryTime\n time={customStatus.expires_at!} // has to be defined since showExpiryTime is true\n timezone={currentUserTimezone}\n withinBrackets={true}\n />\n )}\n </strong>\n {customStatusContent}\n </div>\n );\n};\n\nexport default ProfilePopoverCustomStatus;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n email?: string;\n haveOverrideProp?: boolean;\n isBot?: boolean;\n}\nconst ProfilePopoverEmail = ({\n email,\n haveOverrideProp,\n isBot,\n}: Props) => {\n if (!email || isBot || haveOverrideProp) {\n return null;\n }\n\n return (\n <div\n title={email}\n className='user-profile-popover__email'\n\n >\n <i\n className='icon icon-email-outline'\n aria-hidden='true'\n />\n <a\n href={'mailto:' + email}\n >\n {email}\n </a>\n </div>\n );\n};\n\nexport default ProfilePopoverEmail;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {displayLastActiveLabel, getLastActiveTimestampUnits, getLastActivityForUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport Timestamp from 'components/timestamp';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n userId: string;\n}\nconst ProfilePopoverLastActive = ({\n userId,\n}: Props) => {\n const lastActivityTimestamp = useSelector((state: GlobalState) => getLastActivityForUserId(state, userId));\n const enableLastActiveTime = useSelector<GlobalState>((state) => displayLastActiveLabel(state, userId));\n const timestampUnits = useSelector((state: GlobalState) => getLastActiveTimestampUnits(state, userId));\n\n if (!enableLastActiveTime) {\n return null;\n }\n\n return (\n <div className='user-popover-last-active'>\n <FormattedMessage\n id='channel_header.lastOnline'\n defaultMessage='Last online {timestamp}'\n values={{\n timestamp: (\n <Timestamp\n value={lastActivityTimestamp}\n units={timestampUnits}\n useTime={false}\n style={'short'}\n />\n ),\n }}\n />\n </div>\n );\n};\n\nexport default ProfilePopoverLastActive;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\ntype Props = {\n botDescription: UserProfile['bot_description'];\n}\n\nconst ProfilePopoverBotDescription = ({\n botDescription,\n}: Props) => {\n return (\n <p\n className='user-profile-popover__non-heading'\n title={botDescription}\n >\n {botDescription}\n </p>\n );\n};\n\nexport default ProfilePopoverBotDescription;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport SharedUserIndicator from 'components/shared_user_indicator';\n\ntype Props = {\n fullname: string;\n username: string;\n remoteId?: string;\n}\nconst ProfilePopoverFullName = ({\n fullname,\n username,\n remoteId,\n}: Props) => {\n if (!fullname) {\n return null;\n }\n\n let sharedIcon = null;\n if (remoteId) {\n sharedIcon = (\n <SharedUserIndicator\n className='shared-user-icon'\n withTooltip={true}\n />\n );\n }\n\n return (\n <div\n data-testid={`popover-fullname-${username}`}\n className='user-profile-popover__heading'\n >\n <p title={fullname}>{fullname}</p>\n {sharedIcon}\n </div>\n );\n};\n\nexport default ProfilePopoverFullName;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n position: UserProfile['position'];\n}\n\nconst ProfilePopoverPosition = ({\n position,\n}: Props) => {\n const positionSubstringed = (position).substring(0, Constants.MAX_POSITION_LENGTH);\n\n return (\n <p\n className='user-profile-popover__non-heading'\n title={position}\n >\n {positionSubstringed}\n </p>\n );\n};\n\nexport default ProfilePopoverPosition;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n hasFullName: boolean;\n username: string;\n}\n\nconst ProfilePopoverUserName = ({\n hasFullName,\n username,\n}: Props) => {\n return (\n <p\n id='userPopoverUsername'\n className={\n hasFullName ? 'user-profile-popover__non-heading' : 'user-profile-popover__heading'\n }\n title={username}\n >\n {`@${username}`}\n </p>\n );\n};\n\nexport default ProfilePopoverUserName;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport BotDescription from 'components/profile_popover/profile_popover_bot_description';\nimport FullName from 'components/profile_popover/profile_popover_full_name';\nimport Position from 'components/profile_popover/profile_popover_position';\nimport UserName from 'components/profile_popover/profile_popover_user_name';\n\ntype Props = {\n haveOverrideProp: boolean;\n user: UserProfile;\n fullname: string;\n}\nconst ProfilePopoverName = ({\n user,\n haveOverrideProp,\n fullname,\n}: Props) => {\n return (\n <>\n <FullName\n fullname={fullname}\n remoteId={user.remote_id}\n username={user.username}\n />\n {(user.is_bot && !haveOverrideProp) && (\n <BotDescription\n botDescription={user.bot_description}\n />\n )}\n <UserName\n hasFullName={Boolean(fullname)}\n username={user.username}\n />\n {(user.position && !haveOverrideProp) && (\n <Position\n position={user.position}\n />\n )}\n </>\n );\n};\n\nexport default ProfilePopoverName;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {\n getChannelsInCurrentTeam,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getMyChannelMemberships} from 'mattermost-redux/selectors/entities/common';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUserLocale} from 'mattermost-redux/selectors/entities/i18n';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {sortChannelsByTypeAndDisplayName} from 'mattermost-redux/utils/channel_utils';\n\nimport store from 'stores/redux_store';\n\nimport {Constants} from 'utils/constants';\n\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport {SuggestionContainer} from './suggestion';\nimport type {SuggestionProps} from './suggestion';\n\ninterface WrappedChannel {\n channel: Channel;\n name: Channel['name'];\n deactivated: boolean;\n type: Channel['type'];\n}\n\ntype ChannelSearchFunction = (teamId: string, channelPrefix: string) => Promise<ActionResult>\n\nconst SearchChannelWithPermissionsSuggestion = React.forwardRef<HTMLDivElement, SuggestionProps<WrappedChannel>>((props, ref) => {\n const {item} = props;\n const channel = item.channel;\n const channelIsArchived = channel.delete_at && channel.delete_at !== 0;\n\n const displayName = channel.display_name;\n let icon = null;\n if (channelIsArchived) {\n icon = (\n <i className='icon icon--no-spacing icon-archive-outline'/>\n );\n } else if (channel.type === Constants.OPEN_CHANNEL) {\n icon = (\n <i className='icon icon--no-spacing icon-globe'/>\n );\n } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n icon = (\n <i className='icon icon--no-spacing icon-lock-outline'/>\n );\n }\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n >\n <span className='suggestion-list__icon suggestion-list__icon--large'>{icon}</span>\n <div className='suggestion-list__ellipsis'>\n <span className='suggestion-list__main'>{displayName}</span>\n </div>\n </SuggestionContainer>\n );\n});\nSearchChannelWithPermissionsSuggestion.displayName = 'SearchChannelWithPermissionsSuggestion';\n\nlet prefix = '';\n\nfunction channelSearchSorter(wrappedA: WrappedChannel, wrappedB: WrappedChannel) {\n const aIsArchived = wrappedA.channel.delete_at ? wrappedA.channel.delete_at !== 0 : false;\n const bIsArchived = wrappedB.channel.delete_at ? wrappedB.channel.delete_at !== 0 : false;\n if (aIsArchived && !bIsArchived) {\n return 1;\n } else if (!aIsArchived && bIsArchived) {\n return -1;\n }\n\n const locale = getCurrentUserLocale(store.getState());\n\n const a = wrappedA.channel;\n const b = wrappedB.channel;\n\n const aDisplayName = a.display_name.toLowerCase();\n const bDisplayName = b.display_name.toLowerCase();\n\n const aStartsWith = aDisplayName.startsWith(prefix);\n const bStartsWith = bDisplayName.startsWith(prefix);\n if (aStartsWith && bStartsWith) {\n return sortChannelsByTypeAndDisplayName(locale, a, b);\n } else if (!aStartsWith && !bStartsWith) {\n return sortChannelsByTypeAndDisplayName(locale, a, b);\n } else if (aStartsWith) {\n return -1;\n }\n\n return 1;\n}\n\nexport default class SearchChannelWithPermissionsProvider extends Provider {\n autocompleteChannelsForSearch: ChannelSearchFunction;\n\n constructor(channelSearchFunc: ChannelSearchFunction) {\n super();\n this.autocompleteChannelsForSearch = channelSearchFunc;\n }\n\n makeChannelSearchFilter(channelPrefix: string) {\n const channelPrefixLower = channelPrefix.toLowerCase();\n\n return (channel: Channel) => {\n const state = store.getState();\n const channelId = channel.id;\n const teamId = getCurrentTeamId(state);\n\n const searchString = channel.display_name;\n\n if (channel.type === Constants.OPEN_CHANNEL &&\n haveIChannelPermission(state, teamId, channelId, Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS)) {\n return searchString.toLowerCase().includes(channelPrefixLower);\n } else if (channel.type === Constants.PRIVATE_CHANNEL &&\n haveIChannelPermission(state, teamId, channelId, Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS)) {\n return searchString.toLowerCase().includes(channelPrefixLower);\n }\n\n return false;\n };\n }\n\n handlePretextChanged(channelPrefix: string, resultsCallback: ResultsCallback<WrappedChannel>) {\n if (channelPrefix) {\n prefix = channelPrefix;\n this.startNewRequest(channelPrefix);\n const state = store.getState();\n\n // Dispatch suggestions for local data\n const channels = getChannelsInCurrentTeam(state);\n this.formatChannelsAndDispatch(channelPrefix, resultsCallback, channels);\n\n // Fetch data from the server and dispatch\n this.fetchChannels(channelPrefix, resultsCallback);\n }\n\n return true;\n }\n\n async fetchChannels(channelPrefix: string, resultsCallback: ResultsCallback<WrappedChannel>) {\n const state = store.getState();\n const teamId = getCurrentTeamId(state);\n if (!teamId) {\n return;\n }\n\n const channelsAsync = this.autocompleteChannelsForSearch(teamId, channelPrefix);\n\n let channelsFromServer: Channel[] = [];\n try {\n const {data} = await channelsAsync;\n channelsFromServer = data ?? [];\n } catch (err) {\n store.dispatch(logError(err));\n }\n\n if (this.shouldCancelDispatch(channelPrefix)) {\n return;\n }\n\n const channels = getChannelsInCurrentTeam(state).concat(channelsFromServer);\n this.formatChannelsAndDispatch(channelPrefix, resultsCallback, channels);\n }\n\n formatChannelsAndDispatch(channelPrefix: string, resultsCallback: ResultsCallback<WrappedChannel>, allChannels: Channel[]) {\n const channels = [];\n\n const state = store.getState();\n\n const members = getMyChannelMemberships(state);\n\n if (this.shouldCancelDispatch(channelPrefix)) {\n return;\n }\n\n const completedChannels: Record<Channel['id'], boolean> = {};\n\n const channelFilter = this.makeChannelSearchFilter(channelPrefix);\n\n const config = getConfig(state);\n const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n\n for (const channel of allChannels) {\n if (completedChannels[channel.id]) {\n continue;\n }\n\n if (channelFilter(channel)) {\n const newChannel = Object.assign({}, channel);\n const channelIsArchived = channel.delete_at !== 0;\n\n const wrappedChannel = {channel: newChannel, name: newChannel.name, deactivated: false, type: newChannel.type};\n if (!viewArchivedChannels && channelIsArchived) {\n continue;\n } else if (!members[channel.id]) {\n continue;\n } else if (channel.type !== Constants.OPEN_CHANNEL && channel.type !== Constants.PRIVATE_CHANNEL) {\n continue;\n }\n completedChannels[channel.id] = true;\n channels.push(wrappedChannel);\n }\n }\n\n const channelNames = channels.\n sort(channelSearchSorter).\n map((wrappedChannel) => wrappedChannel.channel.name);\n\n resultsCallback({\n matchedPretext: channelPrefix,\n terms: channelNames,\n items: channels,\n component: SearchChannelWithPermissionsSuggestion,\n });\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, FormEvent} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {getFullName} from 'mattermost-redux/utils/user_utils';\n\nimport ModalSuggestionList from 'components/suggestion/modal_suggestion_list';\nimport SearchChannelWithPermissionsProvider from 'components/suggestion/search_channel_with_permissions_provider';\nimport SuggestionBox from 'components/suggestion/suggestion_box';\nimport type SuggestionBoxComponent from 'components/suggestion/suggestion_box/suggestion_box';\n\nimport {placeCaretAtEnd} from 'utils/utils';\n\nexport type Props = {\n\n /**\n * Function that's called after modal is closed\n */\n onExited: () => void;\n\n /**\n * The user that is being added to a channel\n */\n user: UserProfile;\n\n /**\n * Object used to determine if the user\n * is a member of a given channel\n */\n channelMembers: RelationOneToOne<Channel, Record<string, ChannelMembership>>;\n\n actions: {\n\n /**\n * Function to add the user to a channel\n */\n addChannelMember: (channelId: string, userId: string) => Promise<ActionResult>;\n\n /**\n * Function to fetch the user's channel membership\n */\n getChannelMember: (channelId: string, userId: string) => Promise<ActionResult>;\n\n /**\n * Function passed on to the constructor of the\n * SearchChannelWithPermissionsProvider class to fetch channels\n * based on a search term\n */\n autocompleteChannelsForSearch: (teamId: string, term: string) => Promise<ActionResult<Channel[]>>;\n };\n\n}\n\ntype State = {\n\n /**\n * Whether or not the modal is visible\n */\n show: boolean;\n\n /**\n * Whether or not a request to add the user is in progress\n */\n saving: boolean;\n\n /**\n * Whether or not a request to check for the user's channel membership\n * is in progress\n */\n checkingForMembership: boolean;\n\n /**\n * The user input in the channel search box\n */\n text: string;\n\n /**\n * The id for the channel that is selected\n */\n selectedChannelId: string | null;\n\n /**\n * An error to display when the add request fails\n */\n submitError: string;\n}\n\nexport default class AddUserToChannelModal extends React.PureComponent<Props, State> {\n private suggestionProviders: SearchChannelWithPermissionsProvider[];\n private channelSearchBox?: SuggestionBoxComponent;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n show: true,\n saving: false,\n checkingForMembership: false,\n text: '',\n selectedChannelId: null,\n submitError: '',\n };\n this.suggestionProviders = [new SearchChannelWithPermissionsProvider(props.actions.autocompleteChannelsForSearch)];\n this.enableChannelProvider();\n }\n\n enableChannelProvider = () => {\n this.suggestionProviders[0].disableDispatches = false;\n };\n\n focusTextbox = () => {\n if (this.channelSearchBox == null) {\n return;\n }\n\n const textbox = this.channelSearchBox.getTextbox();\n if (document.activeElement !== textbox) {\n textbox.focus();\n placeCaretAtEnd(textbox);\n }\n };\n\n onInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({text: e.target.value, selectedChannelId: null});\n };\n\n onHide = () => {\n this.setState({show: false});\n };\n\n onExited = () => {\n this.props.onExited();\n };\n\n setSearchBoxRef = (input: SuggestionBoxComponent) => {\n this.channelSearchBox = input;\n this.focusTextbox();\n };\n\n handleSubmitError = (error: {message: string}) => {\n if (error) {\n this.setState({submitError: error.message, saving: false});\n }\n };\n\n didSelectChannel = (selection: {channel: Channel}) => {\n const channel = selection.channel;\n const userId = this.props.user.id;\n\n this.setState({\n text: channel.display_name,\n selectedChannelId: channel.id,\n checkingForMembership: true,\n submitError: '',\n });\n\n this.props.actions.getChannelMember(channel.id, userId).then(() => {\n this.setState({checkingForMembership: false});\n });\n };\n\n handleSubmit = (e: FormEvent) => {\n if (e && e.preventDefault) {\n e.preventDefault();\n }\n\n const channelId = this.state.selectedChannelId;\n const user = this.props.user;\n\n if (!channelId) {\n return;\n }\n\n if (this.isUserMemberOfChannel(channelId) || this.state.saving) {\n return;\n }\n\n this.setState({saving: true});\n\n this.props.actions.addChannelMember(channelId, user.id).then(({error}) => {\n if (error) {\n this.handleSubmitError(error);\n } else {\n this.onHide();\n }\n });\n };\n\n isUserMemberOfChannel = (channelId: string | null) => {\n const user = this.props.user;\n const memberships = this.props.channelMembers;\n\n if (!channelId) {\n return false;\n }\n\n if (!memberships[channelId]) {\n return false;\n }\n\n return Boolean(memberships[channelId][user.id]);\n };\n\n render() {\n const user = this.props.user;\n const channelId = this.state.selectedChannelId;\n const targetUserIsMemberOfSelectedChannel = this.isUserMemberOfChannel(channelId);\n\n let name = getFullName(user);\n if (!name) {\n name = `@${user.username}`;\n }\n\n let errorMsg;\n if (!this.state.saving) {\n if (this.state.submitError) {\n errorMsg = (\n <span\n id='add-user-to-channel-modal__invite-error'\n className='modal__error has-error control-label'\n >\n {this.state.submitError}\n </span>\n );\n } else if (targetUserIsMemberOfSelectedChannel) {\n errorMsg = (\n <span\n id='add-user-to-channel-modal__user-is-member'\n className='modal__error has-error control-label'\n >\n <FormattedMessage\n id='add_user_to_channel_modal.membershipExistsError'\n defaultMessage='{name} is already a member of that channel'\n values={{\n name,\n }}\n />\n </span>\n );\n }\n }\n\n const help = (\n <FormattedMessage\n id='add_user_to_channel_modal.help'\n defaultMessage='Type to find a channel. Use ↑↓ to browse, ↵ to select, ESC to dismiss.'\n />\n );\n\n const content = (\n <SuggestionBox\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n ref={this.setSearchBoxRef}\n className='form-control focused'\n onChange={this.onInputChange}\n value={this.state.text}\n onItemSelected={this.didSelectChannel}\n listComponent={ModalSuggestionList}\n maxLength='64'\n providers={this.suggestionProviders}\n listPosition='bottom'\n completeOnTab={false}\n delayInputUpdate={true}\n openWhenEmpty={false}\n />\n );\n\n const shouldDisableAddButton = targetUserIsMemberOfSelectedChannel ||\n this.state.checkingForMembership ||\n Boolean(!this.state.selectedChannelId) ||\n this.state.saving;\n\n return (\n <Modal\n dialogClassName='a11y__modal modal--overflow'\n show={this.state.show}\n onHide={this.onHide}\n onExited={this.onExited}\n enforceFocus={true}\n role='none'\n aria-labelledby='addChannelModalLabel'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='addChannelModalLabel'\n >\n <FormattedMessage\n id='add_user_to_channel_modal.title'\n defaultMessage='Add {name} to a Channel'\n values={{\n name,\n }}\n />\n </Modal.Title>\n </Modal.Header>\n <form\n role='form'\n onSubmit={this.handleSubmit}\n >\n <Modal.Body>\n <div className='modal__hint'>\n {help}\n </div>\n <div className='pos-relative'>\n {content}\n </div>\n <div>\n {errorMsg}\n </div>\n </Modal.Body>\n <Modal.Footer>\n <button\n type='button'\n className='btn btn-tertiary'\n onClick={this.onHide}\n >\n <FormattedMessage\n id='add_user_to_channel_modal.cancel'\n defaultMessage='Cancel'\n />\n </button>\n <button\n type='button'\n id='add-user-to-channel-modal__add-button'\n className='btn btn-primary'\n onClick={this.handleSubmit}\n disabled={shouldDisableAddButton}\n >\n <FormattedMessage\n id='add_user_to_channel_modal.add'\n defaultMessage='Add'\n />\n </button>\n </Modal.Footer>\n </form>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {addChannelMember, getChannelMember, autocompleteChannelsForSearch} from 'mattermost-redux/actions/channels';\nimport {getChannelMembersInChannels} from 'mattermost-redux/selectors/entities/channels';\n\nimport AddUserToChannelModal from './add_user_to_channel_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n const channelMembers = getChannelMembersInChannels(state) || {};\n return {\n channelMembers,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n addChannelMember,\n getChannelMember,\n autocompleteChannelsForSearch,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddUserToChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {canManageAnyChannelMembersInCurrentTeam as getCanManageAnyChannelMembersInCurrentTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam, getTeamMember} from 'mattermost-redux/selectors/entities/teams';\n\nimport AddUserToChannelModal from 'components/add_user_to_channel_modal';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n user: UserProfile;\n returnFocus: () => void;\n handleCloseModals: () => void;\n hide?: () => void;\n};\n\nfunction getIsInCurrentTeam(state: GlobalState, userId: string) {\n const team = getCurrentTeam(state);\n const teamMember = team ? getTeamMember(state, team.id, userId) : undefined;\n return Boolean(teamMember) && teamMember?.delete_at === 0;\n}\n\nconst ProfilePopoverAddToChannel = ({\n handleCloseModals,\n returnFocus,\n user,\n hide,\n}: Props) => {\n const {formatMessage} = useIntl();\n\n const canManageAnyChannelMembersInCurrentTeam = useSelector((state: GlobalState) => getCanManageAnyChannelMembersInCurrentTeam(state));\n const isInCurrentTeam = useSelector((state: GlobalState) => getIsInCurrentTeam(state, user.id));\n\n const handleAddToChannel = useCallback(() => {\n hide?.();\n handleCloseModals();\n }, [hide, handleCloseModals]);\n\n if (!canManageAnyChannelMembersInCurrentTeam || !isInCurrentTeam) {\n return null;\n }\n\n return (\n <WithTooltip\n title={formatMessage({\n id: 'user_profile.add_user_to_channel',\n defaultMessage: 'Add to a Channel',\n })}\n >\n {/* This span is necessary as tooltip is not able to pass trigger props to a custom component */}\n <span>\n <ToggleModalButton\n id='addToChannelButton'\n className='btn btn-icon btn-sm'\n ariaLabel={formatMessage({\n id: 'user_profile.add_user_to_channel',\n defaultMessage: 'Add to a Channel',\n })}\n modalId={ModalIdentifiers.ADD_USER_TO_CHANNEL}\n dialogType={AddUserToChannelModal}\n dialogProps={{user, onExited: returnFocus}}\n onClick={handleAddToChannel}\n >\n <i\n className='icon icon-account-plus-outline'\n aria-hidden='true'\n />\n </ToggleModalButton>\n </span>\n </WithTooltip>\n );\n};\n\nexport default ProfilePopoverAddToChannel;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useEffect, useRef} from 'react';\nimport {useDispatch} from 'react-redux';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\n\nimport {createDirectChannel} from 'mattermost-redux/actions/channels';\n\nimport {Constants} from 'utils/constants';\n\nimport type {PluginComponent} from 'types/store/plugins';\n\ntype Props = {\n channelMember?: ChannelMembership;\n pluginCallComponents: PluginComponent[];\n sidebarOpen: boolean;\n currentUserId: string;\n userId: string;\n customButton?: JSX.Element;\n dmChannel?: Channel | null;\n}\n\nexport default function ProfilePopoverCallButton({pluginCallComponents, channelMember, sidebarOpen, customButton, dmChannel, currentUserId, userId}: Props) {\n const [clickEnabled, setClickEnabled] = useState(true);\n const prevSidebarOpen = useRef(sidebarOpen);\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (prevSidebarOpen.current && !sidebarOpen) {\n setClickEnabled(false);\n setTimeout(() => {\n setClickEnabled(true);\n }, Constants.CHANNEL_HEADER_BUTTON_DISABLE_TIMEOUT);\n }\n prevSidebarOpen.current = sidebarOpen;\n }, [sidebarOpen]);\n\n if (pluginCallComponents.length === 0) {\n return null;\n }\n\n const getDmChannel = async () => {\n if (!dmChannel) {\n const {data} = await dispatch(createDirectChannel(currentUserId, userId));\n if (data) {\n return data;\n }\n }\n return dmChannel;\n };\n\n const item = pluginCallComponents[0];\n const handleStartCall = async () => {\n const channelForCall = await getDmChannel();\n item.action?.(channelForCall, channelMember);\n };\n const clickHandler = async () => {\n if (clickEnabled) {\n handleStartCall();\n }\n };\n\n return (\n <div\n onClick={clickHandler}\n onTouchEnd={clickHandler}\n >\n {customButton}\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getMyCurrentChannelMembership} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store/index';\n\nimport ProfilePopoverCallButton from './profile_popover_call_button';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n pluginCallComponents: state.plugins.components.CallButton,\n channelMember: getMyCurrentChannelMembership(state),\n sidebarOpen: state.views.rhs.isSidebarOpen,\n currentUserId: getCurrentUserId(state),\n };\n}\n\nexport default connect(mapStateToProps)(ProfilePopoverCallButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getChannelByName} from 'mattermost-redux/selectors/entities/channels';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\nimport {isSystemAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport {\n isCallsEnabled as getIsCallsEnabled,\n getSessionsInCalls,\n getCallsConfig,\n callsChannelExplicitlyDisabled,\n callsChannelExplicitlyEnabled,\n} from 'selectors/calls';\n\nimport ProfilePopoverCallButton from 'components/profile_popover/profile_popover_calls_button';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {getDirectChannelName} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n userId: string;\n currentUserId: string;\n fullname: string;\n username: string;\n}\n\nexport function isUserInCall(state: GlobalState, userId: string, channelId: string) {\n const sessionsInCall = getSessionsInCalls(state)[channelId] || {};\n\n for (const session of Object.values(sessionsInCall)) {\n if (session.user_id === userId) {\n return true;\n }\n }\n\n return false;\n}\n\nconst CallButton = ({\n userId,\n currentUserId,\n fullname,\n username,\n}: Props) => {\n const {formatMessage} = useIntl();\n\n const isCallsEnabled = useSelector((state: GlobalState) => getIsCallsEnabled(state));\n const dmChannel = useSelector((state: GlobalState) => getChannelByName(state, getDirectChannelName(currentUserId, userId)));\n\n const shouldRenderButton = useSelector((state: GlobalState) => {\n // 1. No one should get the button if the plugin is disabled.\n if (!isCallsEnabled) {\n return false;\n }\n\n // 2. No one should get the button if calls in channel have been explicitly disabled in the DM channel.\n if (callsChannelExplicitlyDisabled(state, dmChannel?.id ?? '')) {\n return false;\n }\n\n // 3. Admins should get the button unless calls have been explicitly disabled in the DM channel. This\n // should apply in test mode as well (DefaultEnabled = false).\n if (isSystemAdmin(getUser(state, currentUserId)?.roles)) {\n return true;\n }\n\n // 4. Users should only see the button if test mode is off (DefaultEnabled = true) and calls in the DM channel are not disabled.\n if (getCallsConfig(state).DefaultEnabled) {\n return true;\n }\n\n // 5. Everyone should see the button if calls have been explicitly enabled in the DM channel, regardless of test mode state.\n if (callsChannelExplicitlyEnabled(state, dmChannel?.id ?? '')) {\n return true;\n }\n\n return false;\n });\n\n const hasDMCall = useSelector((state: GlobalState) => {\n if (isCallsEnabled && dmChannel) {\n return isUserInCall(state, currentUserId, dmChannel.id) || isUserInCall(state, userId, dmChannel.id);\n }\n return false;\n });\n\n if (!shouldRenderButton) {\n return null;\n }\n\n // We disable the button if there's already a call ongoing with the user.\n const disabled = hasDMCall;\n const startCallMessage = hasDMCall ? formatMessage({\n id: 'user_profile.call.ongoing',\n defaultMessage: 'Call with {user} is ongoing',\n }, {user: fullname || username},\n ) : formatMessage({\n id: 'webapp.mattermost.feature.start_call',\n defaultMessage: 'Start Call',\n });\n const callButton = (\n <WithTooltip\n title={startCallMessage}\n >\n <button\n id='startCallButton'\n type='button'\n disabled={disabled}\n className='btn btn-icon btn-sm style--none'\n aria-label={startCallMessage}\n >\n <span\n className='icon icon-phone'\n aria-hidden='true'\n />\n </button>\n </WithTooltip>\n );\n\n if (disabled) {\n return callButton;\n }\n\n return (\n <ProfilePopoverCallButton\n dmChannel={dmChannel}\n userId={userId}\n customButton={callButton}\n />\n );\n};\n\nexport default CallButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport ProfilePopoverAddToChannel from 'components/profile_popover/profile_popover_add_to_channel';\nimport ProfilePopoverCallButtonWrapper from 'components/profile_popover/profile_popover_call_button_wrapper';\n\ntype Props = {\n user: UserProfile;\n fullname: string;\n currentUserId: string;\n haveOverrideProp: boolean;\n handleShowDirectChannel: (e: React.MouseEvent<HTMLButtonElement>) => void;\n returnFocus: () => void;\n handleCloseModals: () => void;\n hide?: () => void;\n};\n\nconst ProfilePopoverOtherUserRow = ({\n currentUserId,\n haveOverrideProp,\n user,\n handleShowDirectChannel,\n handleCloseModals,\n returnFocus,\n hide,\n fullname,\n}: Props) => {\n if (user.id === currentUserId || haveOverrideProp) {\n return null;\n }\n\n return (\n <div className='user-popover__bottom-row-container'>\n <button\n type='button'\n className='btn btn-primary btn-sm'\n onClick={handleShowDirectChannel}\n >\n <i\n className='icon icon-send'\n aria-hidden='true'\n />\n <FormattedMessage\n id='user_profile.send.dm'\n defaultMessage='Message'\n />\n </button>\n <div className='user-popover__bottom-row-end'>\n <ProfilePopoverAddToChannel\n handleCloseModals={handleCloseModals}\n returnFocus={returnFocus}\n user={user}\n hide={hide}\n />\n <ProfilePopoverCallButtonWrapper\n currentUserId={currentUserId}\n fullname={fullname}\n userId={user.id}\n username={user.username}\n />\n </div>\n </div>\n );\n};\n\nexport default ProfilePopoverOtherUserRow;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\ntype Props = {\n username: string;\n haveOverrideProp: boolean;\n}\nconst ProfilePopoverOverrideDisclaimer = ({\n username,\n haveOverrideProp,\n}: Props) => {\n const {formatMessage} = useIntl();\n\n if (!haveOverrideProp) {\n return null;\n }\n\n return (\n <p\n className='user-popover__bottom-row-container'\n >\n {formatMessage({\n id: 'user_profile.account.post_was_created',\n defaultMessage: 'This post was created by an integration from @{username}',\n },\n {\n username,\n })}\n </p>\n );\n};\n\nexport default ProfilePopoverOverrideDisclaimer;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {openModal} from 'actions/views/modals';\n\nimport UserSettingsModal from 'components/user_settings/modal';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n userId: string;\n currentUserId: string;\n haveOverrideProp: boolean;\n hide?: () => void;\n returnFocus: () => void;\n handleCloseModals: () => void;\n handleShowDirectChannel: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nconst ProfilePopoverSelfUserRow = ({\n userId,\n currentUserId,\n haveOverrideProp,\n hide,\n returnFocus,\n handleCloseModals,\n handleShowDirectChannel,\n}: Props) => {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n\n const handleEditAccountSettings = useCallback(() => {\n hide?.();\n dispatch(openModal({\n modalId: ModalIdentifiers.USER_SETTINGS,\n dialogType: UserSettingsModal,\n dialogProps: {isContentProductSettings: false, onExited: returnFocus},\n }));\n handleCloseModals();\n }, [hide, returnFocus, handleCloseModals]);\n\n if (userId !== currentUserId || haveOverrideProp) {\n return null;\n }\n\n return (\n <div\n className='user-popover__bottom-row-container'\n >\n <button\n type='button'\n className='btn btn-primary btn-sm'\n onClick={handleEditAccountSettings}\n >\n <i\n className='icon icon-account-outline'\n aria-hidden='true'\n />\n <FormattedMessage\n id='user_profile.account.editProfile'\n defaultMessage='Edit Profile'\n />\n </button>\n <WithTooltip\n title={formatMessage({id: 'user_profile.send.dm.yourself', defaultMessage: 'Send yourself a message'})}\n >\n <button\n type='button'\n className='btn btn-icon btn-sm'\n onClick={handleShowDirectChannel}\n aria-label={formatMessage({id: 'user_profile.send.dm.yourself', defaultMessage: 'Send yourself a message'})}\n >\n <i\n className='icon icon-send'\n aria-hidden='true'\n />\n </button>\n </WithTooltip>\n </div>\n );\n};\n\nexport default ProfilePopoverSelfUserRow;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {DateTime, Duration} from 'luxon';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {UserTimezone} from '@mattermost/types/users';\n\nimport {getUserCurrentTimezone} from 'mattermost-redux/utils/timezone_utils';\n\nimport Timestamp from 'components/timestamp';\n\ntype ProfileTimezoneProps = {\n profileUserTimezone?: UserTimezone;\n currentUserTimezone: string | undefined;\n haveOverrideProp: boolean;\n}\n\nconst TimeZoneDifference = ({\n currentUserTimezone,\n profileUserTimezone,\n}: {\n currentUserTimezone: string | undefined | null;\n profileUserTimezone: string;\n},\n) => {\n const {formatMessage} = useIntl();\n\n if (!currentUserTimezone) {\n return null;\n }\n const currentUserDate = DateTime.local().setZone(currentUserTimezone);\n const profileUserDate = DateTime.local().setZone(profileUserTimezone);\n\n const offset = Duration.fromObject({\n hours: (profileUserDate.offset - currentUserDate.offset) / 60,\n });\n\n if (!offset.valueOf()) {\n return null;\n }\n\n const timeOffset = offset.toHuman({unitDisplay: 'short', signDisplay: 'never'});\n\n return offset.valueOf() > 0 ? (\n <>\n {formatMessage(\n {\n id: 'user_profile.account.hoursAhead',\n defaultMessage: '({timeOffset} ahead)',\n },\n {timeOffset},\n )}\n </>\n ) : (\n <>\n {\n formatMessage(\n {\n id: 'user_profile.account.hoursBehind',\n defaultMessage: '({timeOffset} behind)',\n },\n {timeOffset},\n )\n }\n </>\n );\n};\n\nconst ProfileTimezone = ({\n currentUserTimezone,\n profileUserTimezone,\n haveOverrideProp,\n}: ProfileTimezoneProps) => {\n const {formatMessage} = useIntl();\n\n if (haveOverrideProp || !profileUserTimezone) {\n return null;\n }\n\n const profileTimezone = getUserCurrentTimezone(profileUserTimezone) || 'UTC';\n const profileTimezoneShort = profileTimezone ? DateTime.now().setZone(profileTimezone).offsetNameShort : undefined;\n\n return (\n <div\n className='user-popover__time-status-container'\n >\n <strong\n id='user-popover__timezone-title'\n className='user-popover__subtitle'\n >\n {profileTimezoneShort ? formatMessage(\n {\n id: 'user_profile.account.localTimeWithTimezone',\n defaultMessage: 'Local Time ({timezone})',\n },\n {\n timezone: profileTimezoneShort,\n },\n ) : formatMessage({\n id: 'user_profile.account.localTime',\n defaultMessage: 'Local Time',\n })}\n </strong>\n <p\n aria-labelledby='user-popover__timezone-title'\n className='user-popover__subtitle-text'\n >\n <Timestamp\n useRelative={false}\n useDate={false}\n userTimezone={profileUserTimezone}\n useTime={{\n hour: 'numeric',\n minute: 'numeric',\n }}\n />\n {' '}\n <TimeZoneDifference\n currentUserTimezone={currentUserTimezone}\n profileUserTimezone={profileTimezone}\n />\n </p>\n </div>\n );\n};\n\nexport default ProfileTimezone;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useRef} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getChannelMember} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam, getTeamMember} from 'mattermost-redux/selectors/entities/teams';\nimport {isGuest, isSystemAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport {getRhsState} from 'selectors/rhs';\n\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\nimport Tag from 'components/widgets/tag/tag';\n\nimport type {A11yFocusEventDetail} from 'utils/constants';\nimport {A11yCustomEventTypes} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n isBot?: boolean;\n roles: string;\n returnFocus: () => void;\n hide?: () => void;\n userId: string;\n channelId?: string;\n}\n\nfunction getIsTeamAdmin(state: GlobalState, userId: string) {\n const team = getCurrentTeam(state);\n const teamMember = team ? getTeamMember(state, team.id, userId) : undefined;\n\n return Boolean(teamMember && teamMember.scheme_admin);\n}\n\nfunction getIsChannelAdmin(state: GlobalState, userId: string, channelId?: string) {\n if (!channelId) {\n return false;\n }\n\n const channelMember = getChannelMember(state, channelId, userId);\n\n if (getRhsState(state) !== 'search' && channelMember != null && channelMember.scheme_admin) {\n return true;\n }\n\n return false;\n}\n\nconst ProfilePopoverTitle = ({\n isBot,\n roles,\n returnFocus,\n hide,\n userId,\n channelId,\n}: Props) => {\n const {formatMessage} = useIntl();\n\n const closeRef = useRef<HTMLButtonElement>(null);\n\n const isTeamAdmin = useSelector((state: GlobalState) => getIsTeamAdmin(state, userId));\n const isChannelAdmin = useSelector((state: GlobalState) => getIsChannelAdmin(state, userId, channelId));\n\n useEffect(() => {\n // Focus the close button when the popover first opens\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: closeRef.current,\n keyboardOnly: true,\n },\n },\n ));\n }, []);\n\n function handleClose() {\n hide?.();\n returnFocus();\n }\n\n let roleTitle;\n if (isBot) {\n roleTitle = (\n <BotTag\n className='user-popover__role'\n size={'sm'}\n />\n );\n } else if (isGuest(roles)) {\n roleTitle = (\n <GuestTag\n className='user-popover__role'\n size={'sm'}\n />\n );\n } else if (isSystemAdmin(roles)) {\n roleTitle = (\n <Tag\n className='user-popover__role'\n size={'sm'}\n text={formatMessage({\n id: 'user_profile.roleTitle.system_admin',\n defaultMessage: 'System Admin',\n })}\n />\n );\n } else if (isTeamAdmin) {\n roleTitle = (\n <Tag\n className='user-popover__role'\n size={'sm'}\n text={formatMessage({\n id: 'user_profile.roleTitle.team_admin',\n defaultMessage: 'Team Admin',\n })}\n />\n );\n } else if (isChannelAdmin) {\n roleTitle = (\n <Tag\n className='user-popover__role'\n size={'sm'}\n text={formatMessage({\n id: 'user_profile.roleTitle.channel_admin',\n defaultMessage: 'Channel Admin',\n })}\n />\n );\n }\n\n return (\n <div className='user-profile-popover-title'>\n {roleTitle}\n <button\n ref={closeRef}\n className='btn btn-icon btn-sm closeButtonRelativePosition'\n onClick={handleClose}\n aria-label={formatMessage({id: 'user_profile.close', defaultMessage: 'Close user profile popover'})}\n >\n <i className='icon icon-close'/>\n </button>\n </div>\n );\n};\n\nexport default ProfilePopoverTitle;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect, useMemo, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {getCurrentChannelId, getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getFeatureFlagValue} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentRelativeTeamUrl, getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\nimport {getStatusForUserId, getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions';\nimport * as GlobalActions from 'actions/global_actions';\nimport {closeModal} from 'actions/views/modals';\nimport {getMembershipForEntities} from 'actions/views/profile_popover';\nimport {getSelectedPost} from 'selectors/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport Pluggable from 'plugins/pluggable';\nimport {getHistory} from 'utils/browser_history';\nimport {A11yCustomEventTypes, UserStatuses} from 'utils/constants';\nimport type {A11yFocusEventDetail} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport ProfilePopoverAvatar from './profile_popover_avatar';\nimport ProfilePopoverCustomAttributes from './profile_popover_custom_attributes';\nimport ProfilePopoverCustomStatus from './profile_popover_custom_status';\nimport ProfilePopoverEmail from './profile_popover_email';\nimport ProfilePopoverLastActive from './profile_popover_last_active';\nimport ProfilePopoverName from './profile_popover_name';\nimport ProfilePopoverOtherUserRow from './profile_popover_other_user_row';\nimport ProfilePopoverOverrideDisclaimer from './profile_popover_override_disclaimer';\nimport ProfilePopoverSelfUserRow from './profile_popover_self_user_row';\nimport ProfilePopoverTimezone from './profile_popover_timezone';\nimport ProfilePopoverTitle from './profile_popover_title';\n\nimport './profile_popover.scss';\n\nconst PLUGGABLE_COMPONENT_NAME_PROFILE_POPOVER = 'PopoverUserAttributes';\nexport interface Props {\n userId: string;\n src: string;\n channelId?: string;\n hideStatus?: boolean;\n fromWebhook?: boolean;\n hide?: () => void;\n returnFocus?: () => void;\n overwriteIcon?: string;\n overwriteName?: string;\n}\n\n/**\n * The profile popover, or hover card, that appears with user information when clicking\n * on the username, profile picture of a user, or others.\n * However this component should not be used directly, instead use the `ProfilePopoverController` which is\n * what is default exported from 'components/profile_popover'.\n */\nconst ProfilePopover = ({\n userId,\n src,\n channelId: channelIdProp,\n hideStatus,\n fromWebhook,\n hide,\n returnFocus,\n overwriteIcon,\n overwriteName,\n}: Props) => {\n const dispatch = useDispatch();\n const user = useSelector((state: GlobalState) => getUser(state, userId));\n const currentTeamId = useSelector((state: GlobalState) => getCurrentTeamId(state));\n const channelId = useSelector((state: GlobalState) => (channelIdProp || getDefaultChannelId(state)));\n const isMobileView = useSelector(getIsMobileView);\n const teamUrl = useSelector(getCurrentRelativeTeamUrl);\n const modals = useSelector((state: GlobalState) => state.views.modals);\n const status = useSelector((state: GlobalState) => getStatusForUserId(state, userId) || UserStatuses.OFFLINE);\n const currentUserTimezone = useSelector(getCurrentTimezone);\n const currentUserId = useSelector(getCurrentUserId);\n const enableCustomProfileAttributes = useSelector((state: GlobalState) => getFeatureFlagValue(state, 'CustomProfileAttributes') === 'true');\n\n const [loadingDMChannel, setLoadingDMChannel] = useState<string>();\n\n const handleReturnFocus = useMemo(() => {\n if (returnFocus) {\n return returnFocus;\n }\n\n const previouslyFocused = document.activeElement;\n return () => {\n document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: previouslyFocused as HTMLElement,\n keyboardOnly: true,\n },\n },\n ));\n };\n }, [returnFocus]);\n\n const handleCloseModals = useCallback(() => {\n for (const modal in modals?.modalState) {\n if (!Object.hasOwn(modals, modal)) {\n continue;\n }\n if (modals?.modalState[modal].open) {\n dispatch(closeModal(modal));\n }\n }\n }, [modals, dispatch]);\n\n const handleShowDirectChannel = useCallback(async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (!user) {\n return;\n }\n\n if (loadingDMChannel !== undefined) {\n return;\n }\n setLoadingDMChannel(user.id);\n\n handleCloseModals();\n const result = await dispatch(openDirectChannelToUserId(user.id));\n if (!result.error) {\n if (isMobileView) {\n GlobalActions.emitCloseRightHandSide();\n }\n setLoadingDMChannel(undefined);\n hide?.();\n getHistory().push(`${teamUrl}/messages/@${user.username}`);\n }\n }, [user, loadingDMChannel, handleCloseModals, isMobileView, hide, teamUrl, dispatch]);\n\n useEffect(() => {\n if (currentTeamId && userId) {\n dispatch(getMembershipForEntities(\n currentTeamId,\n userId,\n channelId,\n ));\n }\n }, [channelId, userId, currentTeamId, dispatch]);\n\n if (!user) {\n return null;\n }\n\n const urlSrc = overwriteIcon || src;\n const haveOverrideProp = Boolean(overwriteIcon || overwriteName);\n const fullname = overwriteName || Utils.getFullName(user);\n\n return (\n <div className='user-profile-popover_container'>\n <ProfilePopoverTitle\n channelId={channelId}\n isBot={user.is_bot}\n returnFocus={handleReturnFocus}\n roles={user.roles}\n userId={user.id}\n hide={hide}\n />\n <div className='user-profile-popover-content'>\n <ProfilePopoverAvatar\n hideStatus={hideStatus}\n urlSrc={urlSrc}\n username={user.username}\n status={status}\n />\n <ProfilePopoverLastActive userId={user.id}/>\n <ProfilePopoverName\n user={user}\n haveOverrideProp={haveOverrideProp}\n fullname={fullname}\n />\n <hr/>\n <ProfilePopoverEmail\n email={user.email}\n haveOverrideProp={haveOverrideProp}\n isBot={user.is_bot}\n />\n <div className='user-profile-popover-pluggables'>\n <Pluggable\n pluggableName={PLUGGABLE_COMPONENT_NAME_PROFILE_POPOVER}\n user={user}\n hide={hide}\n status={hideStatus ? null : status}\n fromWebhook={fromWebhook}\n />\n </div>\n\n {enableCustomProfileAttributes && (\n <ProfilePopoverCustomAttributes\n userID={userId}\n />\n )}\n <ProfilePopoverTimezone\n currentUserTimezone={currentUserTimezone}\n profileUserTimezone={user.timezone}\n haveOverrideProp={haveOverrideProp}\n />\n <ProfilePopoverCustomStatus\n currentUserId={currentUserId}\n currentUserTimezone={currentUserTimezone}\n haveOverrideProp={haveOverrideProp}\n hideStatus={hideStatus}\n user={user}\n returnFocus={handleReturnFocus}\n hide={hide}\n />\n </div>\n <div className='user-profile-popover-bottom-row'>\n <hr className='user-popover__bottom-row-hr'/>\n <ProfilePopoverOverrideDisclaimer\n haveOverrideProp={haveOverrideProp}\n username={user.username}\n />\n <ProfilePopoverSelfUserRow\n currentUserId={currentUserId}\n handleCloseModals={handleCloseModals}\n handleShowDirectChannel={handleShowDirectChannel}\n haveOverrideProp={haveOverrideProp}\n returnFocus={handleReturnFocus}\n userId={user.id}\n hide={hide}\n />\n <ProfilePopoverOtherUserRow\n currentUserId={currentUserId}\n fullname={fullname}\n handleCloseModals={handleCloseModals}\n handleShowDirectChannel={handleShowDirectChannel}\n haveOverrideProp={haveOverrideProp}\n returnFocus={handleReturnFocus}\n user={user}\n hide={hide}\n />\n <Pluggable\n pluggableName='PopoverUserActions'\n user={user}\n hide={hide}\n status={hideStatus ? null : status}\n />\n </div>\n </div>\n );\n};\n\nfunction getDefaultChannelId(state: GlobalState) {\n const selectedPost = getSelectedPost(state);\n return selectedPost.exists ? selectedPost.channel_id : getCurrentChannelId(state);\n}\n\nexport default React.memo(ProfilePopover);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getChannelMember} from 'mattermost-redux/actions/channels';\nimport {getTeamMember} from 'mattermost-redux/actions/teams';\n\nimport type {ThunkActionFunc} from 'types/store';\n\nexport function getMembershipForEntities(teamId: string, userId: string, channelId?: string): ThunkActionFunc<unknown> {\n return (dispatch) => {\n return Promise.all([\n dispatch(getTeamMember(teamId, userId)),\n channelId && dispatch(getChannelMember(channelId, userId)),\n ]);\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {\n useFloating,\n autoUpdate,\n autoPlacement,\n useTransitionStyles,\n useClick,\n useDismiss,\n useInteractions,\n useRole,\n shift,\n FloatingFocusManager,\n FloatingOverlay,\n FloatingPortal,\n} from '@floating-ui/react';\nimport classNames from 'classnames';\nimport type {HtmlHTMLAttributes, ReactNode} from 'react';\nimport React, {useCallback, useState} from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {A11yClassNames, OverlaysTimings, OverlayTransitionStyles, RootHtmlPortalId} from 'utils/constants';\n\nimport ProfilePopover from './profile_popover';\n\ninterface Props<TriggerComponentType> {\n\n /**\n * The Props for the trigger component\n */\n triggerComponentAs?: React.ElementType;\n triggerComponentId?: HtmlHTMLAttributes<TriggerComponentType>['id'];\n triggerComponentClass?: HtmlHTMLAttributes<TriggerComponentType>['className'];\n triggerComponentStyle?: HtmlHTMLAttributes<TriggerComponentType>['style'];\n\n /**\n * Source URL from the image to display in the popover\n */\n src: string;\n\n /**\n * This should be the trigger button for the popover, Do note that the root element of the trigger component should be passed in triggerComponentRoot\n */\n children: ReactNode;\n userId: UserProfile['id'];\n channelId?: Channel['id'];\n\n /**\n * The overwritten username that should be shown at the top of the popover\n */\n overwriteName?: string;\n\n /**\n * Source URL from the image that should override default image\n */\n overwriteIcon?: string;\n\n /**\n * Set to true of the popover was opened from a webhook post\n */\n fromWebhook?: boolean;\n hideStatus?: boolean;\n\n /**\n * Function to call to return focus to the previously focused element when the popover closes.\n * If not provided, the popover will automatically determine the previously focused element\n * and focus that on close. However, if the previously focused element is not correctly detected\n * by the popover, or the previously focused element will disappear after the popover opens,\n * it is necessary to provide this function to focus the correct element.\n */\n returnFocus?: () => void;\n\n onToggle?: (isMounted: boolean) => void;\n}\n\nexport function ProfilePopoverController<TriggerComponentType = HTMLSpanElement>(props: Props<TriggerComponentType>) {\n const [isOpen, setOpen] = useState(false);\n\n const {refs, floatingStyles, context: floatingContext} = useFloating({\n open: isOpen,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [autoPlacement(), shift()],\n });\n\n const {isMounted, styles: transitionStyles} = useTransitionStyles(floatingContext, TRANSITION_STYLE_PROPS);\n\n const clickInteractions = useClick(floatingContext);\n const dismissInteraction = useDismiss(floatingContext);\n const role = useRole(floatingContext);\n\n const {getReferenceProps, getFloatingProps} = useInteractions([\n clickInteractions,\n dismissInteraction,\n role,\n ]);\n\n const handleHide = useCallback(() => {\n setOpen(false);\n }, []);\n\n const TriggerComponent = props.triggerComponentAs ?? 'span';\n\n return (\n <>\n <TriggerComponent\n id={props.triggerComponentId}\n ref={refs.setReference}\n className={props.triggerComponentClass}\n style={props.triggerComponentStyle}\n {...getReferenceProps()}\n >\n {props.children}\n </TriggerComponent>\n\n {isMounted && (\n <FloatingPortal id={RootHtmlPortalId}>\n <FloatingOverlay\n className='user-profile-popover-floating-overlay'\n lockScroll={true}\n >\n <FloatingFocusManager context={floatingContext}>\n <div\n ref={refs.setFloating}\n style={{...floatingStyles, ...transitionStyles}}\n className={classNames('user-profile-popover', A11yClassNames.POPUP)}\n {...getFloatingProps()}\n >\n <ProfilePopover\n userId={props.userId}\n src={props.src}\n channelId={props.channelId}\n hideStatus={props.hideStatus}\n fromWebhook={props.fromWebhook}\n hide={handleHide}\n returnFocus={props.returnFocus}\n overwriteIcon={props.overwriteIcon}\n overwriteName={props.overwriteName}\n />\n </div>\n </FloatingFocusManager>\n </FloatingOverlay>\n </FloatingPortal>\n )}\n </>\n );\n}\n\nconst TRANSITION_STYLE_PROPS = {\n duration: {\n open: OverlaysTimings.FADE_IN_DURATION,\n close: OverlaysTimings.FADE_OUT_DURATION,\n },\n initial: OverlayTransitionStyles.START,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {ProfilePopoverController} from './profile_popover_controller';\n\nexport default ProfilePopoverController;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {Fragment, forwardRef} from 'react';\nimport type {FC, InputHTMLAttributes} from 'react';\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n className: string;\n defaultValue?: string;\n maxLength: number;\n}\n\n// An input component that renders a validation message (-{number of exceeding characters})\n// when the characters length of the value exceeds maxLength prop\n// to be used with QuickInput as an inputComponent\nconst MaxLengthInput: FC<InputProps> = forwardRef<HTMLInputElement, InputProps>(\n ({className, defaultValue, maxLength, ...props}: InputProps, ref) => {\n const excess: number = defaultValue ? defaultValue.length - maxLength : 0;\n\n const classes: string = classNames({\n MaxLengthInput: true,\n [className]: Boolean(className),\n 'has-error': excess > 0,\n });\n\n return (\n <>\n <input\n className={classes}\n defaultValue={defaultValue}\n ref={ref}\n {...props}\n />\n {excess > 0 && (\n <span className='MaxLengthInput__validation'>\n {'-'}\n {excess}\n </span>\n )}\n </>\n );\n },\n);\n\nexport default MaxLengthInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {ReactComponentLike} from 'prop-types';\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport AutosizeTextarea from 'components/autosize_textarea';\nimport WithTooltip from 'components/with_tooltip';\n\nexport type Props = {\n\n /**\n * Whether to delay updating the value of the textbox from props. Should only be used\n * on textboxes that to properly compose CJK characters as the user types.\n */\n delayInputUpdate?: boolean;\n\n /**\n * An optional React component that will be used instead of an HTML input when rendering\n */\n inputComponent?: ReactComponentLike;\n\n /**\n * The string value displayed in this input\n */\n value: string;\n\n /**\n * When true, and an onClear callback is defined, show an X on the input field that clears\n * the input when clicked.\n */\n clearable?: boolean;\n\n /**\n * The optional tooltip text to display on the X shown when clearable. Pass a components\n * such as FormattedMessage to localize.\n */\n clearableTooltipText?: string | ReactNode;\n\n /**\n * Callback to clear the input value, and used in tandem with the clearable prop above.\n */\n onClear?: () => void;\n\n /**\n * ClassName for the clear button container\n */\n clearClassName?: string;\n\n /**\n * Callback to handle the change event of the input\n */\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n\n /**\n * Callback to handle the key up of the input\n */\n onKeyUp?: (event: React.KeyboardEvent) => void;\n\n /**\n * Callback to handle the key down of the input\n */\n onKeyDown?: (event: React.KeyboardEvent) => void;\n\n /**\n * When true, and an onClear callback is defined, show an X on the input field even if\n * the input is empty.\n */\n clearableWithoutValue?: boolean;\n\n forwardedRef?: ((instance: HTMLInputElement | HTMLTextAreaElement | null) => void) | React.MutableRefObject<HTMLInputElement | HTMLTextAreaElement | null> | null;\n\n maxLength?: number;\n className?: string;\n placeholder?: string;\n autoFocus?: boolean;\n type?: string;\n id?: string;\n onInput?: (e?: React.FormEvent<HTMLInputElement>) => void;\n tabIndex?: number;\n}\n\n// A component that can be used to make controlled inputs that function properly in certain\n// environments (ie. IE11) where typing quickly would sometimes miss inputs\nexport class QuickInput extends React.PureComponent<Props> {\n private input?: HTMLInputElement | HTMLTextAreaElement;\n\n static defaultProps = {\n delayInputUpdate: false,\n value: '',\n clearable: false,\n };\n\n componentDidMount() {\n if (this.props.autoFocus) {\n requestAnimationFrame(() => {\n this.input?.focus();\n });\n }\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.value !== this.props.value) {\n if (this.props.delayInputUpdate) {\n requestAnimationFrame(this.updateInputFromProps);\n } else {\n this.updateInputFromProps();\n }\n }\n }\n\n private updateInputFromProps = () => {\n if (!this.input || this.input.value === this.props.value) {\n return;\n }\n\n this.input.value = this.props.value;\n };\n\n private setInputRef = (input: HTMLInputElement) => {\n if (this.props.forwardedRef) {\n if (typeof this.props.forwardedRef === 'function') {\n this.props.forwardedRef(input);\n } else {\n this.props.forwardedRef.current = input;\n }\n }\n\n this.input = input;\n };\n\n private onClear = (e: React.MouseEvent<HTMLButtonElement> | React.TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.props.onClear) {\n this.props.onClear();\n }\n\n this.input?.focus();\n };\n\n render() {\n let clearableTooltipText = this.props.clearableTooltipText || '';\n if (!clearableTooltipText) {\n clearableTooltipText = (\n <FormattedMessage\n id={'input.clear'}\n defaultMessage='Clear'\n />\n );\n }\n\n const {\n value,\n inputComponent,\n clearable,\n clearClassName,\n clearableWithoutValue,\n ...props\n } = this.props;\n\n Reflect.deleteProperty(props, 'delayInputUpdate');\n Reflect.deleteProperty(props, 'onClear');\n Reflect.deleteProperty(props, 'clearableTooltipText');\n Reflect.deleteProperty(props, 'channelId');\n Reflect.deleteProperty(props, 'clearClassName');\n Reflect.deleteProperty(props, 'tooltipPosition');\n Reflect.deleteProperty(props, 'forwardedRef');\n\n if (inputComponent !== AutosizeTextarea) {\n Reflect.deleteProperty(props, 'onHeightChange');\n Reflect.deleteProperty(props, 'onWidthChange');\n }\n\n const inputElement = React.createElement(\n inputComponent || 'input',\n {\n ...props,\n ref: this.setInputRef,\n defaultValue: value, // Only set the defaultValue since the real one will be updated using componentDidUpdate\n },\n );\n\n const showClearButton = this.props.onClear && (clearableWithoutValue || (clearable && value));\n\n return (\n <div className='input-wrapper'>\n {inputElement}\n {showClearButton && (\n <WithTooltip title={clearableTooltipText}>\n <button\n data-testid='input-clear'\n className={classNames(clearClassName, 'input-clear visible')}\n onClick={this.onClear}\n >\n <span\n className='input-clear-x'\n aria-hidden='true'\n >\n <i className='icon icon-close-circle'/>\n </span>\n </button>\n </WithTooltip>\n )}\n </div>\n );\n }\n}\n\ntype ForwardedProps = Omit<React.ComponentPropsWithoutRef<typeof QuickInput>, 'forwardedRef'>;\n\nconst forwarded = React.forwardRef<HTMLInputElement | HTMLTextAreaElement, ForwardedProps>((props, ref) => (\n <QuickInput\n forwardedRef={ref}\n {...props}\n />\n));\nforwarded.displayName = 'QuickInput';\n\nexport default forwarded;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {PreferenceType} from '@mattermost/types/preferences';\nimport type {UserStatus} from '@mattermost/types/users';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\n\nimport {UserStatuses} from 'utils/constants';\n\nconst messages: Record<string, Record<string, MessageDescriptor>> = {\n away: defineMessages({\n auto_responder_message: {\n id: 'modal.manual_status.auto_responder.message_away',\n defaultMessage: 'Would you like to switch your status to \"Away\" and disable automatic replies?',\n },\n button: {\n id: 'modal.manual_status.button_away',\n defaultMessage: 'Set status to \"Away\"',\n },\n cancel: {\n id: 'modal.manual_status.cancel_away',\n defaultMessage: 'Stay as \"Away\"',\n },\n message: {\n id: 'modal.manual_status.message_away',\n defaultMessage: 'Would you like to switch your status to \"Away\"?',\n },\n title: {\n id: 'modal.manual_status.title_away',\n defaultMessage: 'Your status is set to \"Away\"',\n },\n }),\n dnd: defineMessages({\n auto_responder_message: {\n id: 'modal.manual_status.auto_responder.message_dnd',\n defaultMessage: 'Would you like to switch your status to \"Do not disturb\" and disable automatic replies?',\n },\n button: {\n id: 'modal.manual_status.button_dnd',\n defaultMessage: 'Set status to \"Do not disturb\"',\n },\n cancel: {\n id: 'modal.manual_status.cancel_dnd',\n defaultMessage: 'Stay as \"Do not disturb\"',\n },\n message: {\n id: 'modal.manual_status.message_dnd',\n defaultMessage: 'Would you like to switch your status to \"Do not disturb\"?',\n },\n title: {\n id: 'modal.manual_status.title_dnd',\n defaultMessage: 'Your status is set to \"Do not disturb\"',\n },\n }),\n offline: defineMessages({\n auto_responder_message: {\n id: 'modal.manual_status.auto_responder.message_offline',\n defaultMessage: 'Would you like to switch your status to \"Offline\" and disable automatic replies?',\n },\n button: {\n id: 'modal.manual_status.button_offline',\n defaultMessage: 'Set status to \"Offline\"',\n },\n cancel: {\n id: 'modal.manual_status.cancel_offline',\n defaultMessage: 'Stay \"Offline\"',\n },\n message: {\n id: 'modal.manual_status.message_offline',\n defaultMessage: 'Would you like to switch your status to \"Offline\"?',\n },\n title: {\n id: 'modal.manual_status.title_offline',\n defaultMessage: 'Your status is set to \"Offline\"',\n },\n }),\n online: defineMessages({\n auto_responder_message: {\n id: 'modal.manual_status.auto_responder.message_online',\n defaultMessage: 'Would you like to switch your status to \"Online\" and disable automatic replies?',\n },\n button: {\n id: 'modal.manual_status.button_online',\n defaultMessage: 'Set status to \"Online\"',\n },\n message: {\n id: 'modal.manual_status.message_online',\n defaultMessage: 'Would you like to switch your status to \"Online\"?',\n },\n }),\n ooo: defineMessages({\n cancel: {\n id: 'modal.manual_status.cancel_ooo',\n defaultMessage: 'Stay \"Out of office\"',\n },\n title: {\n id: 'modal.manual_status.title_ooo',\n defaultMessage: 'Your status is set to \"Out of office\"',\n },\n }),\n};\n\ntype Props = {\n\n /*\n * The user's preference for whether their status is automatically reset\n */\n autoResetPref?: string;\n\n /*\n * Props value is used to update currentUserStatus\n */\n currentUserStatus?: string;\n\n /*\n * Props value is used to reset status from status_dropdown\n */\n newStatus?: string;\n\n /*\n * Function called when modal is dismissed\n */\n onHide?: () => void;\n\n /**\n * Function called after the modal has been hidden\n */\n onExited?: () => void;\n\n actions: {\n\n /*\n * Function to get and then reset the user's status if needed\n */\n autoResetStatus: () => Promise<ActionResult<UserStatus>>;\n\n /*\n * Function to set the status for a user\n */\n setStatus: (status: UserStatus) => void;\n\n /*\n * Function to save user preferences\n */\n savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n };\n}\n\ntype State = {\n show: boolean;\n currentUserStatus: UserStatus;\n newStatus: string;\n}\n\nexport default class ResetStatusModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n show: false,\n currentUserStatus: {} as UserStatus,\n newStatus: props.newStatus || 'online',\n };\n }\n\n public componentDidMount(): void {\n this.props.actions.autoResetStatus().then(\n (result) => {\n if (result.data! === null) {\n return;\n }\n const status = result.data!;\n const statusIsManual = status?.manual;\n const autoResetPrefNotSet = this.props.autoResetPref === '';\n\n this.setState({\n currentUserStatus: status, // Set in state until status refactor where we store 'manual' field in redux\n show: Boolean(status?.status === UserStatuses.OUT_OF_OFFICE || (statusIsManual && autoResetPrefNotSet)),\n });\n },\n );\n }\n\n private hideModal = (): void => this.setState({show: false});\n\n public onConfirm = (checked: boolean): void => {\n this.hideModal();\n\n const newStatus = {...this.state.currentUserStatus};\n newStatus.status = this.state.newStatus;\n this.props.actions.setStatus(newStatus);\n\n if (checked) {\n const pref = {category: Preferences.CATEGORY_AUTO_RESET_MANUAL_STATUS, user_id: newStatus.user_id, name: newStatus.user_id, value: 'true'};\n this.props.actions.savePreferences(pref.user_id, [pref]);\n }\n };\n\n public onCancel = (checked: boolean): void => {\n this.hideModal();\n\n if (checked) {\n const status = {...this.state.currentUserStatus};\n const pref = {category: Preferences.CATEGORY_AUTO_RESET_MANUAL_STATUS, user_id: status.user_id, name: status.user_id, value: 'false'};\n this.props.actions.savePreferences(pref.user_id, [pref]);\n }\n };\n\n private renderModalMessage = () => {\n if (this.props.currentUserStatus === UserStatuses.OUT_OF_OFFICE) {\n return messages[this.state.newStatus] ? (<FormattedMessage {...messages[this.state.newStatus].auto_responder_message}/>) : '';\n }\n\n return messages[this.state.newStatus] ? (<FormattedMessage {...messages[this.state.newStatus].message}/>) : '';\n };\n\n public render(): JSX.Element {\n const userStatus = this.state.currentUserStatus?.status || '';\n const manualStatusTitle = messages[userStatus] ? (<FormattedMessage {...messages[userStatus].title}/>) : '';\n\n const manualStatusMessage = this.renderModalMessage();\n const manualStatusButton = messages[this.state.newStatus] ? (<FormattedMessage {...messages[this.state.newStatus].button}/>) : '';\n const manualStatusCancel = messages[userStatus] ? (<FormattedMessage {...messages[userStatus].cancel}/>) : '';\n\n const manualStatusCheckbox = (\n <FormattedMessage\n id='modal.manual_status.ask'\n defaultMessage='Do not ask me again'\n />\n );\n\n const showCheckbox = this.props.currentUserStatus !== UserStatuses.OUT_OF_OFFICE;\n\n return (\n <ConfirmModal\n show={this.state.show}\n title={manualStatusTitle}\n message={manualStatusMessage}\n confirmButtonText={manualStatusButton}\n onConfirm={this.onConfirm}\n cancelButtonText={manualStatusCancel}\n onCancel={this.onCancel}\n onExited={this.props.onExited}\n showCheckbox={showCheckbox}\n checkboxText={manualStatusCheckbox}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {setStatus} from 'mattermost-redux/actions/users';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\nimport {getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {autoResetStatus} from 'actions/user_actions';\n\nimport type {GlobalState} from 'types/store/index.js';\n\nimport ResetStatusModal from './reset_status_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n const {currentUserId} = state.entities.users;\n return {\n autoResetPref: get(state, Preferences.CATEGORY_AUTO_RESET_MANUAL_STATUS, currentUserId, ''),\n currentUserStatus: getStatusForUserId(state, currentUserId),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n autoResetStatus,\n setStatus,\n savePreferences,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ResetStatusModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Store} from 'redux';\n\nimport store from 'stores/redux_store';\n\nimport type {ActionFuncAsync, ThunkActionFunc} from 'types/store';\n\nimport PluginRegistry from './registry';\n\nexport abstract class ProductPlugin {\n abstract initialize(registry: PluginRegistry, store: Store): void;\n abstract uninitialize(): void;\n}\n\nexport function initializeProducts(): ThunkActionFunc<Promise<unknown>> {\n return (dispatch) => {\n return Promise.all([\n dispatch(loadRemoteModules()),\n dispatch(configureClient()),\n ]);\n };\n}\n\nfunction configureClient(): ActionFuncAsync {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return (dispatch, getState) => {\n return Promise.resolve({data: true});\n };\n}\n\nfunction loadRemoteModules(): ActionFuncAsync {\n /* eslint-disable no-console */\n return async (/*dispatch, getState*/) => {\n // const config = getConfig(getState());\n\n /**\n * products contains a map of product IDs to a function that will load all of their parts. Calling that\n * function will return an object where each field is a Promise that will resolve to that module.\n *\n * Note that these import paths must be statically defined or else they won't be found at runtime. They\n * can't be constructed based on the name of a product at runtime.\n */\n const products: any[] = [];\n\n await Promise.all(products.map(async (product) => {\n if (!REMOTE_CONTAINERS[product.id]) {\n console.log(`Product ${product.id} not found. Not loading it.`);\n return;\n }\n\n console.log(`Loading product ${product.id}...`);\n\n // Start loading the product\n let imports;\n try {\n imports = product.load();\n } catch (e) {\n console.error(`Error loading ${product.id}`, e);\n return;\n }\n\n // Wait for the individual parts to load\n let index;\n try {\n index = await imports.index;\n } catch (e) {\n console.error(`Error loading index for ${product.id}`, e);\n return;\n }\n\n // let manifest;\n // try {\n // manifest = await imports.manifest;\n // } catch (e) {\n // console.error(`Error loading manifest for ${product.id}`, e);\n // return;\n // }\n\n // Initialize the previously loaded data\n console.log(`Initializing product ${product.id}...`);\n\n try {\n initializeProduct(product.id, index.default);\n } catch (e) {\n console.error(`Error loading and initializing product ${product.id}`, e);\n }\n\n console.log(`Product ${product.id} initialized!`);\n }));\n\n return {data: true};\n };\n\n /* eslint-enable no-console */\n}\n\nfunction initializeProduct(id: string, Product: new () => ProductPlugin) {\n const plugin = new Product();\n const registry = new PluginRegistry(id);\n\n plugin.initialize(registry, store);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {History} from 'history';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {GeneralTypes} from 'mattermost-redux/action_types';\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {getClientConfig, getLicenseConfig, getFirstAdminSetupComplete} from 'mattermost-redux/actions/general';\nimport {getServerLimits} from 'mattermost-redux/actions/limits';\nimport {getMyPreferences} from 'mattermost-redux/actions/preferences';\nimport {getMyTeamMembers, getMyTeams, getMyTeamUnreads} from 'mattermost-redux/actions/teams';\nimport {getMe, getProfiles} from 'mattermost-redux/actions/users';\nimport {Client4} from 'mattermost-redux/client';\nimport {General} from 'mattermost-redux/constants';\nimport {isCollapsedThreadsEnabled, getIsOnboardingFlowEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getActiveTeamsList} from 'mattermost-redux/selectors/entities/teams';\nimport {checkIsFirstAdmin, getCurrentUser, isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {redirectUserToDefaultTeam, emitUserLoggedOutEvent} from 'actions/global_actions';\n\nimport {ActionTypes, StoragePrefixes} from 'utils/constants';\nimport {doesCookieContainsMMUserId} from 'utils/utils';\n\nimport type {ActionFuncAsync, ThunkActionFunc} from 'types/store';\nimport type {Translations} from 'types/store/i18n';\n\nexport type TranslationPluginFunction = (locale: string) => Translations\n\n/**\n * This function meant to be used in root.tsx component loads config, license and if user is logged in, it loads user and its related data.\n */\nexport function loadConfigAndMe(): ThunkActionFunc<Promise<{isLoaded: boolean; isMeRequested?: boolean}>> {\n return async (dispatch, getState) => {\n // attempt to load config and license regardless if user is logged in or not\n try {\n await Promise.all([\n dispatch(getClientConfig()),\n dispatch(getLicenseConfig()),\n ]);\n } catch (error) {\n dispatch(logError(error as ServerError));\n return {\n isLoaded: false,\n };\n }\n\n // Return early if user is not logged in\n if (!doesCookieContainsMMUserId()) {\n return {\n isLoaded: true,\n isMeRequested: false,\n };\n }\n\n // Load user and its related data now that we know that user is logged in\n const serverVersion = getState().entities.general.serverVersion || Client4.getServerVersion();\n dispatch({type: GeneralTypes.RECEIVED_SERVER_VERSION, data: serverVersion});\n\n try {\n await Promise.all([\n dispatch(getMe()),\n dispatch(getMyPreferences()),\n dispatch(getMyTeams()),\n dispatch(getMyTeamMembers()),\n ]);\n\n dispatch(getMyTeamUnreads(isCollapsedThreadsEnabled(getState())));\n dispatch(getServerLimits());\n } catch (error) {\n dispatch(logError(error as ServerError));\n return {\n isLoaded: false,\n };\n }\n\n return {\n isLoaded: true,\n isMeRequested: true,\n };\n };\n}\n\nexport function registerCustomPostRenderer(type: string, component: any, id: string): ActionFuncAsync {\n return async (dispatch) => {\n // piggyback on plugins state to register a custom post renderer\n dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_POST_COMPONENT,\n data: {\n postTypeId: id,\n pluginId: id,\n type,\n component,\n },\n });\n return {data: true};\n };\n}\n\nexport function redirectToOnboardingOrDefaultTeam(history: History, searchParams?: URLSearchParams): ThunkActionFunc<void> {\n return async (dispatch, getState) => {\n const state = getState();\n const isUserAdmin = isCurrentUserSystemAdmin(state);\n if (!isUserAdmin) {\n redirectUserToDefaultTeam(searchParams);\n return;\n }\n\n const teams = getActiveTeamsList(state);\n\n const onboardingFlowEnabled = getIsOnboardingFlowEnabled(state);\n\n if (teams.length > 0 || !onboardingFlowEnabled) {\n redirectUserToDefaultTeam(searchParams);\n return;\n }\n\n const firstAdminSetupComplete = await dispatch(getFirstAdminSetupComplete());\n if (firstAdminSetupComplete?.data) {\n redirectUserToDefaultTeam(searchParams);\n return;\n }\n\n const profilesResult = await dispatch(getProfiles(0, General.PROFILE_CHUNK_SIZE, {roles: General.SYSTEM_ADMIN_ROLE}));\n if (profilesResult.error) {\n redirectUserToDefaultTeam(searchParams);\n return;\n }\n const currentUser = getCurrentUser(getState());\n const adminProfiles = profilesResult.data?.reduce(\n (acc: Record<string, UserProfile>, curr: UserProfile) => {\n acc[curr.id] = curr;\n return acc;\n },\n {},\n );\n if (adminProfiles && checkIsFirstAdmin(currentUser, adminProfiles)) {\n history.push('/preparing-workspace');\n return;\n }\n\n redirectUserToDefaultTeam(searchParams);\n };\n}\n\nexport function handleLoginLogoutSignal(e: StorageEvent): ThunkActionFunc<void> {\n return (dispatch, getState) => {\n // when one tab on a browser logs out, it sets __logout__ in localStorage to trigger other tabs to log out\n const isNewLocalStorageEvent = (event: StorageEvent) => event.storageArea === localStorage && event.newValue;\n\n if (e.key === StoragePrefixes.LOGOUT && isNewLocalStorageEvent(e)) {\n console.log('detected logout from a different tab'); //eslint-disable-line no-console\n emitUserLoggedOutEvent('/', false, false);\n }\n if (e.key === StoragePrefixes.LOGIN && isNewLocalStorageEvent(e)) {\n const isLoggedIn = getCurrentUser(getState());\n\n // make sure this is not the same tab which sent login signal\n // because another tabs will also send login signal after reloading\n if (isLoggedIn) {\n return;\n }\n\n // detected login from a different tab\n function reloadOnFocus() {\n location.reload();\n }\n window.addEventListener('focus', reloadOnFocus);\n }\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// As per rudder-sdk-js documentation, import this only once and use like a singleton.\n// See https://github.com/rudderlabs/rudder-sdk-js#step-1-install-rudderstack-using-the-code-snippet\nimport * as rudderAnalytics from 'rudder-sdk-js';\n\nimport type {TelemetryHandler} from '@mattermost/client';\n\nimport {TrackMiscCategory, eventCategory, eventSKUs, TrackPropertyUser} from 'mattermost-redux/constants/telemetry';\nimport {isSystemAdmin} from 'mattermost-redux/utils/user_utils';\n\nexport {rudderAnalytics};\n\nexport class RudderTelemetryHandler implements TelemetryHandler {\n trackEvent(userId: string, userRoles: string, category: string, event: string, props: Record<string, unknown> = {}) {\n const properties = Object.assign({\n category,\n type: event,\n user_actual_role: getActualRoles(userRoles),\n [TrackPropertyUser]: userId,\n }, props);\n const options = {\n context: {\n ip: '0.0.0.0',\n },\n page: {\n path: '',\n referrer: '',\n search: '',\n title: '',\n url: '',\n },\n anonymousId: '00000000000000000000000000',\n };\n\n rudderAnalytics.track('event', properties, options);\n }\n\n trackFeatureEvent(userId: string, userRoles: string, featureName: string, event: string, props: Record<string, unknown> = {}) {\n const properties = Object.assign({\n category: getEventCategory(event),\n type: event,\n [TrackPropertyUser]: userId,\n user_actual_role: getActualRoles(userRoles),\n }, props);\n\n const options = {\n context: {\n feature: {\n name: featureName,\n skus: getSKUs(event),\n },\n },\n };\n\n rudderAnalytics.track(event, properties, options);\n }\n\n pageVisited(userId: string, userRoles: string, category: string, name: string) {\n rudderAnalytics.page(\n category,\n name,\n {\n path: '',\n referrer: '',\n search: '',\n title: '',\n url: '',\n user_actual_role: getActualRoles(userRoles),\n [TrackPropertyUser]: userId,\n },\n {\n context: {\n ip: '0.0.0.0',\n },\n anonymousId: '00000000000000000000000000',\n },\n );\n }\n}\n\nfunction getActualRoles(userRoles: string) {\n return userRoles && isSystemAdmin(userRoles) ? 'system_admin, system_user' : 'system_user';\n}\n\nfunction getSKUs(eventName: string) {\n const skus: string[] | undefined = eventSKUs[eventName];\n\n if (skus === undefined) {\n // Next line is to be aware if you've forgotten to add a SKU, add an empty array for Team edition\n // eslint-disable-next-line\n console.warn(`Event ${eventName} has no SKUs attached`);\n }\n\n return skus ?? [];\n}\n\nfunction getEventCategory(eventName: string) {\n const category: string | undefined = eventCategory[eventName];\n\n if (category === undefined) {\n // eslint-disable-next-line\n console.warn(`Event ${eventName} doesn't have a category`);\n }\n\n return category ?? TrackMiscCategory;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl, defineMessages} from 'react-intl';\nimport styled from 'styled-components';\n\nimport type {SuggestionProps} from 'components/suggestion/suggestion';\n\nimport {getCompassIconClassName} from 'utils/utils';\n\nimport type {ExtensionItem} from './extension_suggestions_provider';\n\nconst SearchFileExtensionSuggestionContainer = styled.div`\n display: flex;\n align-items: center;\n padding: 8px 2.4rem;\n &.selected,\n &:hover {\n background: rgba(var(--center-channel-color-rgb), 0.08);\n }\n\n .file-icon {\n background-size: 16px 20px;\n width: 24px;\n height: 24px;\n font-size: 18px;\n margin-right: 12px;\n display: flex;\n align-items: center;\n &.icon-file-excel-outline {\n color: #339970;\n }\n &.icon-file-powerpoint-outline {\n color: #e07315;\n }\n &.icon-file-pdf-outline {\n color: #c43133;\n }\n &.icon-file-image-outline,\n &.icon-file-audio-outline,\n &.icon-file-video-outline,\n &.icon-file-word-outline {\n color: #5d89ea;\n }\n }\n`;\n\nconst ExtensionText = styled.span`\n margin-left: 4px;\n`;\n\nconst messages: Record<string, MessageDescriptor> =\n defineMessages({\n pdf: {\n id: 'file_type.pdf',\n defaultMessage: 'Acrobat',\n },\n word: {\n id: 'file_type.word',\n defaultMessage: 'Word Document',\n },\n image: {\n id: 'file_type.image',\n defaultMessage: 'Image',\n },\n audio: {\n id: 'file_type.audio',\n defaultMessage: 'Audio',\n },\n video: {\n id: 'file_type.video',\n defaultMessage: 'Video',\n },\n presentation: {\n id: 'file_type.presentation',\n defaultMessage: 'Powerpoint Presentation',\n },\n spreadsheet: {\n id: 'file_type.spreadsheet',\n defaultMessage: 'Excel spreadsheet',\n },\n code: {\n id: 'file_type.code',\n defaultMessage: 'Code file',\n },\n patch: {\n id: 'file_type.patch',\n defaultMessage: 'Patch file',\n },\n svg: {\n id: 'file_type.svg',\n defaultMessage: 'Vector graphics',\n },\n text: {\n id: 'file_type.text',\n defaultMessage: 'Text file',\n },\n });\n\nconst SearchFileExtensionSuggestion = React.forwardRef<\nHTMLDivElement,\nSuggestionProps<ExtensionItem>\n>(({item, onClick, matchedPretext, isSelection}, ref) => {\n const intl = useIntl();\n\n const optionClicked = useCallback(() => {\n onClick(item.value, matchedPretext);\n }, [onClick, item.value, matchedPretext]);\n\n const labelName = messages[item.type] ?\n intl.formatMessage(messages[item.type]) :\n item.type;\n\n return (\n <SearchFileExtensionSuggestionContainer\n ref={ref}\n className={classNames({selected: isSelection})}\n onClick={optionClicked}\n >\n <div className={classNames('file-icon', getCompassIconClassName(item.type))}/>\n {labelName}\n <ExtensionText>{`(.${item.value})`}</ExtensionText>\n </SearchFileExtensionSuggestionContainer>\n );\n});\nSearchFileExtensionSuggestion.displayName = 'SearchFileExtensionSuggestion';\n\nexport default SearchFileExtensionSuggestion;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ResultsCallback} from 'components/suggestion/provider';\nimport Provider from 'components/suggestion/provider';\n\nimport Constants from 'utils/constants';\n\nimport SearchFileExtensionSuggestion from './extension_suggestions';\n\nexport type ExtensionItem = {\n label: string;\n type: string;\n value: string;\n};\n\nconst globalExtensions: ExtensionItem[] = [];\nConstants.TEXT_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'text', value: extension}));\nConstants.IMAGE_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'image', value: extension}));\nConstants.AUDIO_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'audio', value: extension}));\nConstants.VIDEO_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'video', value: extension}));\nConstants.PRESENTATION_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'presentation', value: extension}));\nConstants.SPREADSHEET_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'spreadsheet', value: extension}));\nConstants.WORD_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'word', value: extension}));\nConstants.CODE_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'code', value: extension}));\nConstants.PDF_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'pdf', value: extension}));\nConstants.PATCH_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'patch', value: extension}));\nConstants.SVG_TYPES.forEach((extension) => globalExtensions.push({label: extension, type: 'svg', value: extension}));\nglobalExtensions.sort((a, b) => a.label.localeCompare(b.label));\n\nexport class SearchFileExtensionProvider extends Provider {\n handlePretextChanged(pretext: string, resultsCallback: ResultsCallback<ExtensionItem>) {\n const captured = (/\\b(?:ext):\\s*(\\S*)$/i).exec(pretext.toLowerCase());\n if (captured) {\n const matchedPretext = captured[1];\n\n let extensions: ExtensionItem[] = [...globalExtensions];\n if (matchedPretext.length > 0) {\n extensions = extensions.filter((extension) => extension.label.startsWith(matchedPretext.toLowerCase()));\n extensions = extensions.slice(0, 10);\n } else {\n extensions = [\n {label: 'text', type: 'text', value: 'txt'},\n {label: 'word', type: 'word', value: 'docx'},\n {label: 'spreadsheet', type: 'spreadsheet', value: 'xlsx'},\n {label: 'presentation', type: 'presentation', value: 'pptx'},\n {label: 'pdf', type: 'pdf', value: 'pdf'},\n {label: 'image', type: 'image', value: 'png'},\n {label: 'image', type: 'image', value: 'jpg'},\n {label: 'audio', type: 'audio', value: 'mp3'},\n {label: 'video', type: 'video', value: 'mp4'},\n ];\n }\n\n const terms = extensions.map((extension) => extension.value);\n\n resultsCallback({\n matchedPretext,\n terms,\n items: extensions,\n component: SearchFileExtensionSuggestion,\n });\n }\n\n return Boolean(captured);\n }\n\n allowDividers() {\n return false;\n }\n\n presentationType() {\n return 'text';\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport {searchHintOptions, searchFilesHintOptions} from 'utils/constants';\n\ntype Props = {\n onSelectFilter: (filter: string) => void;\n searchType: string;\n searchTerms: string;\n hasSelectedOption: boolean;\n isDate: boolean;\n}\n\nconst SearchHintsContainer = styled.div`\n display: flex;\n padding: 20px 24px;\n color: rgba(var(--center-channel-color-rgb), 0.75);\n i {\n margin-right: 8px;\n color: var(--center-channel-color-56);\n }\n`;\n\nconst SearchFilter = styled.button`\n display: flex;\n padding: 4px 10px;\n color: var(--center-channel-color);\n background: rgba(var(--center-channel-color-rgb), 0.08);\n border-radius: var(--radius-l);\n border: none;\n font-size: 10px;\n font-weight: 600;\n line-height: 12px;\n margin-left: 8px;\n &:hover {\n background: rgba(var(--center-channel-color-rgb), 0.16);\n }\n`;\n\nconst SearchHints = ({onSelectFilter, searchType, searchTerms, hasSelectedOption, isDate}: Props): JSX.Element => {\n const intl = useIntl();\n let filters = searchHintOptions.filter((filter) => filter.searchTerm !== '-' && filter.searchTerm !== '\"\"');\n if (searchType === 'files') {\n filters = searchFilesHintOptions.filter((filter) => filter.searchTerm !== '-' && filter.searchTerm !== '\"\"');\n }\n\n if (isDate) {\n return <></>;\n }\n\n if (hasSelectedOption) {\n return (\n <SearchHintsContainer id='searchHints'>\n <i className='icon icon-keyboard-return'/>\n <FormattedMessage\n id='search_hint.enter_to_select'\n defaultMessage='Press Enter to select'\n />\n </SearchHintsContainer>\n );\n }\n\n if (searchTerms.length > 0 && searchTerms[searchTerms.length - 1] !== ' ') {\n return (\n <SearchHintsContainer id='searchHints'>\n <i className='icon icon-keyboard-return'/>\n <FormattedMessage\n id='search_hint.enter_to_search'\n defaultMessage='Press Enter to search'\n />\n </SearchHintsContainer>\n );\n }\n\n return (\n <SearchHintsContainer id='searchHints'>\n <i className='icon icon-lightbulb-outline'/>\n <FormattedMessage\n id='search_hint.filter'\n defaultMessage='Filter your search with:'\n />\n {filters.map((filter) => (\n <SearchFilter\n key={filter.searchTerm}\n onClick={() => onSelectFilter(filter.searchTerm)}\n >\n <span title={intl.formatMessage(filter.message)}>\n {filter.searchTerm}\n </span>\n </SearchFilter>\n ))}\n </SearchHintsContainer>\n );\n};\n\nexport default SearchHints;\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getSearchBoxHints} from 'selectors/plugins';\n\nimport type {ProviderResult} from 'components/suggestion/provider';\nimport SearchDateSuggestion from 'components/suggestion/search_date_suggestion';\n\nimport ErrorBoundary from 'plugins/pluggable/error_boundary';\n\nimport SearchHints from './search_hint';\n\ntype Props = {\n searchTerms: string;\n setSearchTerms: (searchTerms: string) => void;\n searchType: string;\n selectedOption: number;\n providerResults: ProviderResult<unknown>|null;\n focus: (pos: number) => void;\n}\n\nconst SearchBoxHints = ({searchTerms, setSearchTerms, searchType, providerResults, selectedOption, focus}: Props) => {\n const filterSelectedCallback = useCallback((filter: string) => {\n if (searchTerms.endsWith(' ') || searchTerms.length === 0) {\n setSearchTerms(searchTerms + filter);\n focus(searchTerms.length + filter.length);\n } else {\n setSearchTerms(searchTerms + ' ' + filter);\n focus(searchTerms.length + filter.length + 1);\n }\n }, [searchTerms, setSearchTerms, focus]);\n\n const searchChangeCallback = useCallback((value: string, matchedPretext: string) => {\n const changedValue = value.replace(matchedPretext, '');\n setSearchTerms(searchTerms + changedValue + ' ');\n focus(searchTerms.length + changedValue.length + 1);\n }, [searchTerms, setSearchTerms, focus]);\n\n const searchPluginHints = useSelector(getSearchBoxHints);\n\n if (searchType === '' || searchType === 'messages' || searchType === 'files') {\n return (\n <SearchHints\n onSelectFilter={filterSelectedCallback}\n searchType={searchType}\n searchTerms={searchTerms}\n hasSelectedOption={Boolean(providerResults && providerResults.items.length > 0 && selectedOption !== -1)}\n isDate={providerResults?.component === SearchDateSuggestion}\n />\n );\n }\n\n const pluginComponentInfo = searchPluginHints.find(({pluginId}: any) => {\n if (searchType === pluginId) {\n return true;\n }\n return false;\n });\n\n if (!pluginComponentInfo) {\n return null;\n }\n\n const Component: any = pluginComponentInfo.component;\n\n return (\n <ErrorBoundary>\n <Component\n key={pluginComponentInfo.pluginId}\n onChangeSearch={searchChangeCallback}\n searchTerms={searchTerms}\n />\n </ErrorBoundary>\n );\n};\n\nexport default SearchBoxHints;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {forwardRef, useCallback} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {\n updateSearchTerms,\n updateSearchType,\n} from 'actions/views/rhs';\n\nimport QuickInput from 'components/quick_input';\n\nconst SearchInputContainer = styled.div`\n position: relative;\n display: flex;\n align-items: center;\n i {\n color: var(--center-channel-color-56);\n display: flex;\n align-items: center;\n &.icon-close {\n postion: absolute;\n right: 10px;\n }\n &.icon-magnify {\n position: absolute;\n left: 20px;\n top: 21px;\n font-size: 24px;\n }\n }\n .input-wrapper {\n flex-grow: 1;\n }\n && input {\n padding: 20px 100px 20px 58px;\n height: auto;\n border-radius: 0;\n border: none;\n border-bottom: var(--border-default);\n font-size: 20px;\n line-height: 28px;\n font-family: Metropolis, sans-serif;\n :focus {\n border: none;\n border-bottom: var(--border-default);\n box-shadow: none;\n }\n ::placeholder {\n color: rgba(var(--center-channel-color-rgb), 0.75);\n }\n }\n`;\n\nconst ClearButton = styled.button`\n display: flex;\n position: absolute;\n right: 12px;\n background: none;\n color: rgba(var(--center-channel-color-rgb), 0.75);\n &:hover{\n color: rgba(var(--center-channel-color-rgb), 0.88);\n background: rgba(var(--center-channel-color-rgb), 0.08);\n }\n`;\n\ntype Props = {\n searchTerms: string;\n searchType: string;\n setSearchTerms: (searchTerms: string) => void;\n onKeyDown: (e: React.KeyboardEvent<Element>) => void;\n focus: (newPosition: number) => void;\n}\n\nconst SearchInput = ({searchTerms, searchType, setSearchTerms, onKeyDown, focus}: Props, inputRef: React.Ref<HTMLInputElement>) => {\n const intl = useIntl();\n let searchPlaceholder = intl.formatMessage({id: 'search_bar.search', defaultMessage: 'Search'});\n\n if (searchType === 'messages' || searchType === '') {\n searchPlaceholder = intl.formatMessage({id: 'search_bar.search_messages', defaultMessage: 'Search messages'});\n }\n if (searchType === 'files') {\n searchPlaceholder = intl.formatMessage({id: 'search_bar.search_files', defaultMessage: 'Search files'});\n }\n\n const dispatch = useDispatch();\n\n const inputChangeCallback = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchTerms(e.target.value);\n }, [setSearchTerms]);\n\n const clearSearch = useCallback(() => {\n setSearchTerms('');\n dispatch(updateSearchTerms(''));\n dispatch(updateSearchType('messages'));\n focus(0);\n }, [focus, setSearchTerms]);\n\n return (\n <SearchInputContainer>\n <i className='icon icon-magnify'/>\n <QuickInput\n ref={inputRef}\n className={'search-bar form-control'}\n aria-describedby={'searchbar-help-popup'}\n aria-label={searchPlaceholder}\n placeholder={searchPlaceholder}\n value={searchTerms}\n onChange={inputChangeCallback}\n type='search'\n delayInputUpdate={true}\n clearable={true}\n autoFocus={true}\n onKeyDown={onKeyDown}\n tabIndex={0}\n />\n {searchTerms.length > 0 && (\n <ClearButton\n className='btn btn-sm input-clear-x'\n onClick={clearSearch}\n >\n <i className='icon icon-close-circle'/>\n <FormattedMessage\n id='search_bar.clear'\n defaultMessage='Clear'\n />\n </ClearButton>\n )}\n </SearchInputContainer>\n );\n};\n\nexport default forwardRef<HTMLInputElement, Props>(SearchInput);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getSearchPluginSuggestions} from 'selectors/plugins';\n\nimport type {ProviderResult} from 'components/suggestion/provider';\nimport type {SuggestionProps} from 'components/suggestion/suggestion';\n\nimport ErrorBoundary from 'plugins/pluggable/error_boundary';\n\nconst SuggestionsHeader = styled.div`\n margin-top: 16px;\n padding: 8px 24px;\n color: rgba(var(--center-channel-color-rgb), 0.56);\n font-size: 12px;\n line-height: 16px;\n font-weight: 600;\n text-transform: uppercase;\n`;\n\nconst SuggestionsBody = styled.div`\n border-bottom: 1px solid rgba(var(--center-channel-color-rgb), 0.08);\n padding-bottom: 16px;\n`;\n\ntype Props = {\n searchType: string;\n searchTerms: string;\n selectedOption: number;\n setSelectedOption: (idx: number) => void;\n suggestionsHeader: React.ReactNode;\n providerResults: ProviderResult<unknown> | null;\n onSearch: (searchType: string, searchTerms: string) => void;\n onSuggestionSelected: (value: string, matchedPretext: string) => void;\n}\n\nconst SearchSuggestions = ({searchType, searchTerms, suggestionsHeader, providerResults, selectedOption, setSelectedOption, onSearch, onSuggestionSelected}: Props) => {\n const runSearch = useCallback((searchTerms: string) => {\n onSearch(searchType, searchTerms);\n }, [onSearch, searchType]);\n\n const searchPluginSuggestions = useSelector(getSearchPluginSuggestions);\n\n const generateLabel = (item: any) => {\n let label = '';\n if (item.username) {\n label = item.username;\n if ((item.first_name || item.last_name) && item.nickname) {\n label += ` ${item.first_name} ${item.last_name} ${item.nickname}`;\n } else if (item.nickname) {\n label += ` ${item.nickname}`;\n } else if (item.first_name || item.last_name) {\n label += ` ${item.first_name} ${item.last_name}`;\n }\n } else if (item.type === 'D' || item.type === 'G') {\n label = item.display_name;\n } else if (item.type === 'P' || item.type === 'O') {\n label = item.name;\n } else if (item.emoji) {\n label = item.name;\n }\n\n if (label) {\n label = label.toLowerCase();\n }\n return label;\n };\n\n if (searchType === '' || searchType === 'messages' || searchType === 'files') {\n if (!providerResults) {\n return null;\n }\n\n return (\n <SuggestionsBody>\n <SuggestionsHeader>{suggestionsHeader}</SuggestionsHeader>\n {providerResults.component && providerResults.items[selectedOption] && (\n <div\n aria-live='polite'\n role='alert'\n className='sr-only'\n key={providerResults.terms[selectedOption]}\n >\n {generateLabel(providerResults.items[selectedOption])}\n </div>\n )}\n {providerResults.items.map((item, idx) => {\n if (!providerResults.component) {\n return null;\n }\n const Component = providerResults.component as React.ComponentType<SuggestionProps<any>>;\n return (\n <Component\n key={providerResults.terms[idx]}\n item={item as UserProfile}\n term={providerResults.terms[idx]}\n matchedPretext={providerResults.matchedPretext}\n isSelection={idx === selectedOption}\n onClick={onSuggestionSelected}\n onMouseMove={() => {\n setSelectedOption(idx);\n }}\n />\n );\n })}\n </SuggestionsBody>\n );\n }\n\n const pluginComponentInfo = searchPluginSuggestions.find(({pluginId}: any) => {\n if (searchType === pluginId) {\n return true;\n }\n return false;\n });\n\n if (!pluginComponentInfo) {\n return null;\n }\n\n const Component: any = pluginComponentInfo.component;\n\n return (\n <ErrorBoundary>\n <Component\n key={pluginComponentInfo.pluginId}\n searchTerms={searchTerms}\n onChangeSearch={onSuggestionSelected}\n onRunSearch={runSearch}\n />\n </ErrorBoundary>\n );\n};\n\nexport default SearchSuggestions;\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {getSearchButtons} from 'selectors/plugins';\n\nimport ErrorBoundary from 'plugins/pluggable/error_boundary';\n\nconst SearchTypeSelectorContainer = styled.div`\n margin: 20px 20px 0px 20px;\n display: flex;\n align-items: center;\n padding: 3px;\n background-color: var(--center-channel-bg);\n border-radius: var(--radius-m);\n border: var(--border-default);\n width: fit-content;\n gap: 3px;\n`;\n\ntype SearchTypeItemProps = {\n selected: boolean;\n};\n\nconst SearchTypeItem = styled.button<SearchTypeItemProps>`\n display: flex;\n cursor: pointer;\n padding: 4px 10px;\n background-color: ${(props) => (props.selected ? 'rgba(var(--button-bg-rgb), 0.08)' : 'transparent')};\n color: ${(props) => (props.selected ? 'var(--button-bg)' : 'rgba(var(--center-channel-color-rgb), 0.75)')};\n border-radius: 4px;\n font-size: 12px;\n line-height: 16px;\n font-weight: 600;\n border: none;\n &:hover {\n color: rgba(var(--center-channel-color-rgb), 0.88);\n background: rgba(var(--center-channel-color-rgb), 0.08);\n }\n`;\n\ntype Props = {\n searchType: string;\n setSearchType: (searchType: string) => void;\n}\n\nconst SearchTypeSelector = ({searchType, setSearchType}: Props) => {\n const setMessagesSearchType = useCallback(() => setSearchType('messages'), [setSearchType]);\n const setFilesSearchType = useCallback(() => setSearchType('files'), [setSearchType]);\n\n const searchPluginButtons = useSelector(getSearchButtons);\n\n return (\n <SearchTypeSelectorContainer>\n <SearchTypeItem\n selected={searchType === 'messages'}\n onClick={setMessagesSearchType}\n >\n <FormattedMessage\n id='search_bar.usage.search_type_messages'\n defaultMessage='Messages'\n />\n </SearchTypeItem>\n <SearchTypeItem\n selected={searchType === 'files'}\n onClick={setFilesSearchType}\n >\n <FormattedMessage\n id='search_bar.usage.search_type_files'\n defaultMessage='Files'\n />\n </SearchTypeItem>\n {searchPluginButtons.map(({component, pluginId}: any) => {\n const Component = component as React.ComponentType;\n return (\n <SearchTypeItem\n key={pluginId}\n selected={searchType === pluginId}\n onClick={() => setSearchType(pluginId)}\n >\n <ErrorBoundary>\n <Component/>\n </ErrorBoundary>\n </SearchTypeItem>\n );\n })}\n </SearchTypeSelectorContainer>\n );\n};\n\nexport default SearchTypeSelector;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useRef, forwardRef, useCallback, useEffect} from 'react';\nimport {useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport Constants from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport {escapeRegex} from 'utils/text_formatting';\n\nimport useSearchSuggestions from './hooks';\nimport SearchBoxHints from './search_box_hints';\nimport SearchInput from './search_box_input';\nimport SearchSuggestions from './search_box_suggestions';\nimport SearchTypeSelector from './search_box_type_selector';\n\nconst {KeyCodes} = Constants;\n\ntype Props = {\n onClose: () => void;\n onSearch: (searchType: string, searchTerms: string) => void;\n initialSearchTerms: string;\n initialSearchType: string;\n};\n\nconst SearchBoxContainer = styled.div`\n padding: 0px;\n\n .rdp {\n margin: 0;\n padding: 16px 20px;\n\n .rdp-months {\n justify-content: center;\n width: 100%;\n }\n\n .rdp-month {\n width: 100%;\n }\n\n .rdp-table {\n max-width: none;\n width: 100%;\n }\n\n .rdp-tbody .rdp-button {\n display: unset;\n }\n }\n`;\n\nconst CloseIcon = styled.button`\n position: absolute;\n top: 18px;\n right: 18px;\n z-index: 1;\n`;\n\nconst SearchBox = forwardRef(\n (\n {onClose, onSearch, initialSearchTerms, initialSearchType}: Props,\n ref: React.Ref<HTMLDivElement>,\n ): JSX.Element => {\n const intl = useIntl();\n const [caretPosition, setCaretPosition] = useState<number>(0);\n const [searchTerms, setSearchTerms] = useState<string>(initialSearchTerms);\n const [searchType, setSearchType] = useState<string>(initialSearchType || 'messages');\n const [selectedOption, setSelectedOption] = useState<number>(-1);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const getCaretPosition = useCallback(() => {\n return inputRef.current?.selectionEnd || 0;\n }, []);\n\n const addSearchHint = useCallback((newSearchTerms: string) => {\n setSearchTerms(newSearchTerms);\n setTimeout(() => {\n inputRef.current?.setSelectionRange(newSearchTerms.length, newSearchTerms.length);\n setCaretPosition(newSearchTerms.length);\n }, 0);\n }, []);\n\n useEffect(() => {\n function updateCaretPosition() {\n setCaretPosition(inputRef.current?.selectionEnd || 0);\n }\n\n const input = inputRef.current;\n\n if (input) {\n input.addEventListener('change', updateCaretPosition);\n input.addEventListener('keypress', updateCaretPosition);\n input.addEventListener('keyup', updateCaretPosition);\n input.addEventListener('mousedown', updateCaretPosition);\n input.addEventListener('touchstart', updateCaretPosition);\n input.addEventListener('input', updateCaretPosition);\n input.addEventListener('paste', updateCaretPosition);\n input.addEventListener('cut', updateCaretPosition);\n input.addEventListener('mousemove', updateCaretPosition);\n input.addEventListener('select', updateCaretPosition);\n input.addEventListener('selectstart', updateCaretPosition);\n }\n\n return () => {\n if (input) {\n input.removeEventListener('change', updateCaretPosition);\n input.removeEventListener('keypress', updateCaretPosition);\n input.removeEventListener('mousedown', updateCaretPosition);\n input.removeEventListener('keyup', updateCaretPosition);\n input.removeEventListener('touchstart', updateCaretPosition);\n input.removeEventListener('input', updateCaretPosition);\n input.removeEventListener('paste', updateCaretPosition);\n input.removeEventListener('cut', updateCaretPosition);\n input.removeEventListener('mousemove', updateCaretPosition);\n input.removeEventListener('select', updateCaretPosition);\n input.removeEventListener('selectstart', updateCaretPosition);\n }\n };\n }, [inputRef.current]);\n\n const [providerResults, suggestionsHeader] = useSearchSuggestions(\n searchType,\n searchTerms,\n caretPosition,\n getCaretPosition,\n setSelectedOption,\n );\n\n const focus = useCallback((newposition: number) => {\n if (inputRef.current) {\n inputRef.current.focus();\n setTimeout(() => {\n inputRef.current?.setSelectionRange(newposition, newposition);\n }, 0);\n }\n }, []);\n\n const updateSearchValue = useCallback(\n (value: string, matchedPretext: string) => {\n const escapedMatchedPretext = escapeRegex(matchedPretext);\n const caretPosition = getCaretPosition();\n const extraSpace = caretPosition === searchTerms.length ? ' ' : '';\n setSearchTerms(\n searchTerms.slice(0, caretPosition).replace(new RegExp(escapedMatchedPretext + '$', 'i'), '') +\n value +\n extraSpace +\n searchTerms.slice(caretPosition),\n );\n focus((caretPosition + value.length + 1) - matchedPretext.length);\n },\n [searchTerms, setSearchTerms, focus, getCaretPosition],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<Element>): void => {\n if (Keyboard.isKeyPressed(e as any, KeyCodes.ESCAPE)) {\n e.stopPropagation();\n e.preventDefault();\n if (!providerResults || providerResults?.items.length === 0 || selectedOption === -1) {\n onClose();\n } else {\n setSelectedOption(-1);\n }\n }\n\n if (Keyboard.isKeyPressed(e as any, KeyCodes.DOWN)) {\n e.stopPropagation();\n e.preventDefault();\n const totalItems = providerResults?.items.length || 0;\n if (selectedOption + 1 < totalItems) {\n setSelectedOption(selectedOption + 1);\n }\n }\n\n if (Keyboard.isKeyPressed(e as any, KeyCodes.UP)) {\n e.stopPropagation();\n e.preventDefault();\n if (selectedOption > 0) {\n setSelectedOption(selectedOption - 1);\n }\n }\n\n if (Keyboard.isKeyPressed(e as any, KeyCodes.ENTER)) {\n e.stopPropagation();\n e.preventDefault();\n if (!providerResults || providerResults?.items.length === 0 || selectedOption === -1) {\n onSearch(searchType, searchTerms);\n } else {\n const matchedPretext = providerResults?.matchedPretext;\n const value = providerResults?.terms[selectedOption];\n updateSearchValue(value, matchedPretext);\n setSelectedOption(-1);\n }\n }\n },\n [providerResults, onClose, selectedOption, onSearch, searchType, searchTerms, updateSearchValue],\n );\n\n const closeHandler = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onClose();\n },\n [onClose],\n );\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [searchType]);\n\n return (\n <SearchBoxContainer\n ref={ref}\n id='searchBox'\n aria-label={intl.formatMessage({\n id: 'search_bar.search',\n defaultMessage: 'Search',\n })}\n aria-describedby='searchHints'\n role='searchbox'\n >\n <CloseIcon\n data-testid='searchBoxClose'\n className='btn btn-icon btn-m'\n onClick={closeHandler}\n >\n <i className='icon icon-close'/>\n </CloseIcon>\n <SearchTypeSelector\n searchType={searchType}\n setSearchType={setSearchType}\n />\n <SearchInput\n ref={inputRef}\n searchTerms={searchTerms}\n searchType={searchType}\n setSearchTerms={setSearchTerms}\n onKeyDown={handleKeyDown}\n focus={focus}\n />\n <SearchSuggestions\n searchType={searchType}\n searchTerms={searchTerms}\n suggestionsHeader={suggestionsHeader}\n providerResults={providerResults}\n selectedOption={selectedOption}\n setSelectedOption={setSelectedOption}\n onSearch={onSearch}\n onSuggestionSelected={updateSearchValue}\n />\n <SearchBoxHints\n searchTerms={searchTerms}\n setSearchTerms={addSearchHint}\n searchType={searchType}\n providerResults={providerResults}\n selectedOption={selectedOption}\n focus={focus}\n />\n </SearchBoxContainer>\n );\n },\n);\n\nexport default SearchBox;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useRef, useEffect, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport {autocompleteChannelsForSearch} from 'actions/channel_actions';\nimport {autocompleteUsersInTeam} from 'actions/user_actions';\n\nimport type {ProviderResult} from 'components/suggestion/provider';\nimport type Provider from 'components/suggestion/provider';\nimport SearchChannelProvider from 'components/suggestion/search_channel_provider';\nimport SearchDateProvider from 'components/suggestion/search_date_provider';\nimport SearchUserProvider from 'components/suggestion/search_user_provider';\n\nimport {SearchFileExtensionProvider} from './extension_suggestions_provider';\n\nconst useSearchSuggestions = (searchType: string, searchTerms: string, caretPosition: number, getCaretPosition: () => number, setSelectedOption: (idx: number) => void): [ProviderResult<unknown>|null, React.ReactNode] => {\n const dispatch = useDispatch();\n\n const [providerResults, setProviderResults] = useState<ProviderResult<unknown>|null>(null);\n const [suggestionsHeader, setSuggestionsHeader] = useState<React.ReactNode>(<span/>);\n\n const suggestionProviders = useRef<Provider[]>([\n new SearchDateProvider(),\n new SearchChannelProvider((term: string, success?: (channels: Channel[]) => void, error?: (err: ServerError) => void) => dispatch(autocompleteChannelsForSearch(term, success, error))),\n new SearchUserProvider((username: string) => dispatch(autocompleteUsersInTeam(username))),\n new SearchFileExtensionProvider(),\n ]);\n\n const headers = useMemo<React.ReactNode[]>(() => [\n <span key={1}/>,\n <FormattedMessage\n id='search_bar.channels'\n defaultMessage='Channels'\n key={2}\n />,\n <FormattedMessage\n id='search_bar.users'\n defaultMessage='Users'\n key={3}\n />,\n <FormattedMessage\n id='search_bar.file_types'\n defaultMessage='File types'\n key={4}\n />,\n ], []);\n\n useEffect(() => {\n setProviderResults(null);\n if (searchType !== '' && searchType !== 'messages' && searchType !== 'files') {\n return;\n }\n\n const partialSearchTerms = searchTerms.slice(0, caretPosition);\n if (searchTerms.length > caretPosition && searchTerms[caretPosition] !== ' ') {\n return;\n }\n\n if (caretPosition > 0 && searchTerms[caretPosition - 1] === ' ') {\n return;\n }\n\n suggestionProviders.current.forEach((provider, idx) => {\n provider.handlePretextChanged(partialSearchTerms, (res: ProviderResult<unknown>) => {\n if (idx === 3 && searchType !== 'files') {\n return;\n }\n if (caretPosition !== getCaretPosition()) {\n return;\n }\n res.items = res.items.slice(0, 10);\n res.terms = res.terms.slice(0, 10);\n setProviderResults(res);\n setSelectedOption(0);\n setSuggestionsHeader(headers[idx]);\n });\n });\n }, [searchTerms, searchType, caretPosition]);\n\n return [providerResults, suggestionsHeader];\n};\n\nexport default useSearchSuggestions;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState, useRef, useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {getCurrentChannelNameForSearchShortcut} from 'mattermost-redux/selectors/entities/channels';\n\nimport {updateSearchTerms, showSearchResults, updateSearchType} from 'actions/views/rhs';\nimport {getSearchButtons} from 'selectors/plugins';\nimport {getSearchTerms, getSearchType} from 'selectors/rhs';\n\nimport Popover from 'components/widgets/popover';\n\nimport a11yController from 'utils/a11y_controller_instance';\nimport type {A11yFocusEventDetail} from 'utils/constants';\nimport Constants, {A11yCustomEventTypes} from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport {isServerVersionGreaterThanOrEqualTo} from 'utils/server_version';\nimport {isDesktopApp, getDesktopVersion, isMacApp} from 'utils/user_agent';\n\nimport SearchBox from './search_box';\n\nconst PopoverStyled = styled(Popover)`\n min-width: 600px;\n left: -90px;\n top: -12px;\n border-radius: 12px;\n max-height: 90vh;\n overflow-y: auto;\n\n .popover-content {\n padding: 0px;\n }\n`;\n\nconst SearchTypeBadge = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2px 2px 2px 7px;\n border-radius: 4px;\n margin: 0 6px;\n background: rgba(var(--sidebar-text-rgb), 0.08);\n color: var(--sidebar-text);\n font-size: 10px;\n font-weight: 700;\n\n .icon-close {\n padding: 2px;\n cursor: pointer;\n }\n\n &:hover {\n background: rgba(v(button-bg-rgb), 0.16);\n }\n`;\n\nconst CloseIcon = styled.div`\n position: absolute;\n top: 0;\n right: 2px;\n display: flex;\n width: 2.4rem;\n height: 100%;\n align-items: center;\n justify-content: center;\n margin: 0;\n cursor: pointer;\n font-size: 16px;\n visibility: visible;\n transition: opacity 0.12s easy-out;\n`;\n\nconst NewSearchContainer = styled.div`\n display: flex;\n position: relative;\n align-items: center;\n height: 28px;\n width: 100%;\n background-color: rgba(var(--sidebar-text-rgb), 0.08);\n color: rgba(var(--sidebar-text-rgb), 0.64);\n font-size: 12px;\n font-weight: 500;\n border-radius: var(--radius-s);\n border: none;\n padding: 4px;\n cursor: pointer;\n &:hover {\n background-color: rgba(var(--sidebar-text-rgb), 0.16);\n color: rgba(var(--sidebar-text-rgb), 0.88);\n }\n`;\n\nconst NewSearch = (): JSX.Element => {\n const currentChannelName = useSelector(getCurrentChannelNameForSearchShortcut);\n const searchTerms = useSelector(getSearchTerms) || '';\n const searchType = useSelector(getSearchType) || '';\n const pluginSearch = useSelector(getSearchButtons);\n\n const dispatch = useDispatch();\n const [focused, setFocused] = useState<boolean>(false);\n const [currentChannel, setCurrentChannel] = useState('');\n const searchBoxRef = useRef<HTMLDivElement | null>(null);\n const searchButtonRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const isDesktop = isDesktopApp() && isServerVersionGreaterThanOrEqualTo(getDesktopVersion(), '4.7.0');\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (Keyboard.isKeyPressed(e, Constants.KeyCodes.ESCAPE)) {\n e.preventDefault();\n setCurrentChannel('');\n setFocused(false);\n }\n\n if (Keyboard.cmdOrCtrlPressed(e) && Keyboard.isKeyPressed(e, Constants.KeyCodes.F6)) {\n e.preventDefault();\n setCurrentChannel('');\n setFocused(false);\n }\n\n if (Keyboard.cmdOrCtrlPressed(e) && Keyboard.isKeyPressed(e, Constants.KeyCodes.F)) {\n if (!isDesktop && !e.shiftKey) {\n return;\n }\n\n // Special case for Mac Desktop xApp where Ctrl+Cmd+F triggers full screen view\n if (isMacApp() && e.ctrlKey) {\n return;\n }\n\n e.preventDefault();\n setCurrentChannel(currentChannelName || '');\n setFocused(true);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [currentChannelName]);\n\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n if (searchBoxRef.current) {\n if (e.target !== searchBoxRef.current && !searchBoxRef.current.contains(e.target as Node)) {\n setFocused(false);\n setCurrentChannel('');\n }\n }\n };\n\n document.addEventListener('click', handleClick, {capture: true});\n return () => {\n document.removeEventListener('click', handleClick);\n };\n }, []);\n\n const closeSearchBox = useCallback(() => {\n setFocused(false);\n setCurrentChannel('');\n if (searchButtonRef.current) {\n document.dispatchEvent(\n new CustomEvent<A11yFocusEventDetail>(A11yCustomEventTypes.FOCUS, {\n detail: {\n target: searchButtonRef.current,\n keyboardOnly: false,\n },\n }),\n );\n a11yController.resetOriginElement();\n }\n }, []);\n\n const openSearchBox = useCallback(() => {\n setFocused(true);\n if (searchButtonRef.current) {\n a11yController.storeOriginElement(searchButtonRef.current);\n }\n }, []);\n\n const openSearchBoxOnKeyPress = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Shift' || e.key === 'Control' || e.key === 'Meta') {\n return;\n }\n\n if (Keyboard.isKeyPressed(e, Constants.KeyCodes.TAB)) {\n return;\n }\n if (Keyboard.cmdOrCtrlPressed(e) && Keyboard.isKeyPressed(e, Constants.KeyCodes.F6)) {\n setFocused(false);\n return;\n }\n openSearchBox();\n },\n [openSearchBox],\n );\n\n const runSearch = useCallback(\n (searchType: string, searchTerms: string) => {\n dispatch(updateSearchType(searchType));\n dispatch(updateSearchTerms(searchTerms));\n\n if (searchType === '' || searchType === 'messages' || searchType === 'files') {\n dispatch(showSearchResults(false));\n } else {\n pluginSearch.forEach((pluginData: any) => {\n if (pluginData.pluginId === searchType) {\n pluginData.action(searchTerms);\n }\n });\n }\n setFocused(false);\n setCurrentChannel('');\n },\n [pluginSearch],\n );\n\n const onClose = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n dispatch(updateSearchType(''));\n dispatch(updateSearchTerms(''));\n }, []);\n\n const clearSearchType = useCallback(() => dispatch(updateSearchType('')), []);\n\n return (\n <NewSearchContainer\n tabIndex={0}\n onKeyDown={openSearchBoxOnKeyPress}\n onClick={openSearchBox}\n id='searchFormContainer'\n role='button'\n className='a11y__region'\n ref={searchButtonRef}\n >\n <i className='icon icon-magnify'/>\n {(searchType === 'messages' || searchType === 'files') && (\n <SearchTypeBadge>\n {searchType === 'messages' && (\n <FormattedMessage\n id='search_bar.search_types.messages'\n defaultMessage='MESSAGES'\n />\n )}\n {searchType === 'files' && (\n <FormattedMessage\n id='search_bar.search_types.files'\n defaultMessage='FILES'\n />\n )}\n <i\n className='icon icon-close icon-12'\n onClick={clearSearchType}\n />\n </SearchTypeBadge>\n )}\n {searchTerms && <span tabIndex={0}>{searchTerms}</span>}\n {searchTerms && (\n <CloseIcon\n data-testid='input-clear'\n role='button'\n onClick={onClose}\n >\n <span\n className='input-clear-x'\n aria-hidden='true'\n >\n <i className='icon icon-close-circle'/>\n </span>\n </CloseIcon>\n )}\n {!searchTerms && (\n <FormattedMessage\n id='search_bar.search'\n defaultMessage='Search'\n />\n )}\n {focused && (\n <PopoverStyled\n id='searchPopover'\n placement='bottom'\n >\n <SearchBox\n ref={searchBoxRef}\n onClose={closeSearchBox}\n onSearch={runSearch}\n initialSearchTerms={currentChannel ? `in:${currentChannel} ` : searchTerms}\n initialSearchType={searchType}\n />\n </PopoverStyled>\n )}\n </NewSearchContainer>\n );\n};\n\nexport default NewSearch;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport Flex from '@mattermost/compass-components/utilities/layout/Flex'; // eslint-disable-line no-restricted-imports\n\nimport {closeRightHandSide, showMentions} from 'actions/views/rhs';\nimport {getRhsState} from 'selectors/rhs';\n\nimport NewSearch from 'components/new_search/new_search';\n\nimport {\n Constants,\n RHSStates,\n} from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\n\nimport type {GlobalState} from 'types/store';\n\nconst GlobalSearchNav = (): JSX.Element => {\n const dispatch = useDispatch();\n const rhsState = useSelector((state: GlobalState) => getRhsState(state));\n\n useEffect(() => {\n const handleShortcut = (e: KeyboardEvent) => {\n if (Keyboard.cmdOrCtrlPressed(e) && e.shiftKey) {\n if (Keyboard.isKeyPressed(e, Constants.KeyCodes.M)) {\n e.preventDefault();\n if (rhsState === RHSStates.MENTION) {\n dispatch(closeRightHandSide());\n } else {\n dispatch(showMentions());\n }\n }\n }\n };\n\n document.addEventListener('keydown', handleShortcut);\n return () => {\n document.removeEventListener('keydown', handleShortcut);\n };\n }, [rhsState, dispatch]);\n\n return (\n <Flex\n row={true}\n width={432}\n flex={1}\n alignment='center'\n >\n <NewSearch/>\n </Flex>\n );\n};\n\nexport default GlobalSearchNav;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {WrappedComponentProps} from 'react-intl';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button'; // eslint-disable-line no-restricted-imports\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport KeyboardShortcutsModal from 'components/keyboard_shortcuts/keyboard_shortcuts_modal/keyboard_shortcuts_modal';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {PropsFromRedux} from './index';\n\nconst mattermostUserGuideLink = 'https://docs.mattermost.com/guides/use-mattermost.html';\nconst trainingResourcesLink = 'https://academy.mattermost.com/';\nconst askTheCommunityUrl = 'https://mattermost.com/pl/default-ask-mattermost-community/';\n\ntype Props = WrappedComponentProps & PropsFromRedux & {\n location: {\n pathname: string;\n };\n}\n\ntype State = {\n buttonActive: boolean;\n};\n\nclass UserGuideDropdown extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n buttonActive: false,\n };\n }\n\n openKeyboardShortcutsModal = (e: MouseEvent) => {\n e.preventDefault();\n this.props.actions.openModal({\n modalId: ModalIdentifiers.KEYBOARD_SHORTCUTS_MODAL,\n dialogType: KeyboardShortcutsModal,\n });\n };\n\n buttonToggleState = (menuActive: boolean) => {\n this.setState({\n buttonActive: menuActive,\n });\n };\n\n askTheCommunityClick = () => {\n trackEvent('ui', 'help_ask_the_community');\n };\n\n renderDropdownItems = (): React.ReactNode => {\n const {\n intl,\n pluginMenuItems,\n } = this.props;\n\n const pluginItems = pluginMenuItems?.map((item) => {\n return (\n <Menu.ItemAction\n id={item.id + '_pluginmenuitem'}\n iconClassName='icon-thumbs-up-down'\n key={item.id + '_pluginmenuitem'}\n onClick={item.action}\n text={item.text}\n />\n );\n });\n\n return (\n <Menu.Group>\n <Menu.ItemExternalLink\n id='mattermostUserGuideLink'\n iconClassName='icon-file-text-outline'\n url={mattermostUserGuideLink}\n text={intl.formatMessage({id: 'userGuideHelp.mattermostUserGuide', defaultMessage: 'Mattermost user guide'})}\n />\n {this.props.helpLink && (\n <Menu.ItemExternalLink\n id='trainingResourcesLink'\n iconClassName='icon-lightbulb-outline'\n url={trainingResourcesLink}\n text={intl.formatMessage({id: 'userGuideHelp.trainingResources', defaultMessage: 'Training resources'})}\n />\n )}\n {this.props.enableAskCommunityLink === 'true' && (\n <Menu.ItemExternalLink\n id='askTheCommunityLink'\n iconClassName='icon-help'\n url={askTheCommunityUrl}\n text={intl.formatMessage({id: 'userGuideHelp.askTheCommunity', defaultMessage: 'Ask the community'})}\n onClick={this.askTheCommunityClick}\n />\n )}\n {this.props.reportAProblemLink && (\n <Menu.ItemExternalLink\n id='reportAProblemLink'\n iconClassName='icon-alert-outline'\n url={this.props.reportAProblemLink}\n text={intl.formatMessage({id: 'userGuideHelp.reportAProblem', defaultMessage: 'Report a problem'})}\n />\n )}\n <Menu.ItemAction\n id='keyboardShortcuts'\n iconClassName='icon-keyboard-return'\n onClick={this.openKeyboardShortcutsModal}\n text={intl.formatMessage({id: 'userGuideHelp.keyboardShortcuts', defaultMessage: 'Keyboard shortcuts'})}\n />\n {pluginItems}\n </Menu.Group>\n );\n };\n\n render() {\n const {intl} = this.props;\n const tooltipText = (\n <FormattedMessage\n id={'channel_header.userHelpGuide'}\n defaultMessage='Help'\n />\n );\n\n return (\n <MenuWrapper\n id='helpMenuPortal'\n className='userGuideHelp'\n onToggle={this.buttonToggleState}\n >\n <WithTooltip\n title={tooltipText}\n >\n <IconButton\n size={'sm'}\n icon={'help-circle-outline'}\n onClick={() => {}} // icon button currently requires onclick ... needs to revisit\n active={this.state.buttonActive}\n inverted={true}\n compact={true}\n aria-controls='AddChannelDropdown'\n aria-expanded={this.state.buttonActive}\n aria-label={intl.formatMessage({id: 'channel_header.userHelpGuide', defaultMessage: 'Help'})}\n />\n </WithTooltip>\n <Menu\n openLeft={false}\n openUp={false}\n id='AddChannelDropdown'\n ariaLabel={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channel Dropdown'})}\n >\n {this.renderDropdownItems()}\n </Menu>\n </MenuWrapper>\n );\n }\n}\n\nexport default injectIntl(UserGuideDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getIsOnboardingFlowEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {isFirstAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\nimport {getUserGuideDropdownPluginMenuItems} from 'selectors/plugins';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport type {GlobalState} from 'types/store';\n\nimport UserGuideDropdown from './user_guide_dropdown';\n\nfunction mapStateToProps(state: GlobalState) {\n const {HelpLink, ReportAProblemLink, EnableAskCommunityLink} = getConfig(state);\n\n return {\n helpLink: HelpLink || '',\n isMobileView: getIsMobileView(state),\n reportAProblemLink: ReportAProblemLink || '',\n enableAskCommunityLink: EnableAskCommunityLink || '',\n teamUrl: getCurrentRelativeTeamUrl(state),\n pluginMenuItems: getUserGuideDropdownPluginMenuItems(state),\n isFirstAdmin: isFirstAdmin(state),\n onboardingFlowEnabled: getIsOnboardingFlowEnabled(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default withRouter(connector(UserGuideDropdown));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\n\nimport type {ProductIdentifier} from '@mattermost/types/products';\n\nimport Pluggable from 'plugins/pluggable';\nimport {isChannels} from 'utils/products';\n\nimport GlobalSearchNav from './global_search_nav/global_search_nav';\nimport UserGuideDropdown from './user_guide_dropdown';\n\nconst CenterControlsContainer = styled.div`\n display: flex;\n align-items: center;\n height: 40px;\n justify-content: center;\n flex-grow: 1;\n flex-basis: 40%;\n\n > * + * {\n margin-left: 8px;\n }\n`;\n\nexport type Props = {\n productId?: ProductIdentifier;\n}\n\nconst CenterControls = ({productId = null}: Props): JSX.Element => {\n return (\n <CenterControlsContainer>\n {isChannels(productId) ? (\n <>\n <GlobalSearchNav/>\n <UserGuideDropdown/>\n </>\n ) : (\n <Pluggable\n pluggableName={'Product'}\n subComponentName={'headerCentreComponent'}\n pluggableId={productId}\n />\n )}\n </CenterControlsContainer>\n );\n};\n\nexport default CenterControls;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button'; // eslint-disable-line no-restricted-imports\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport KeyboardShortcutSequence, {\n KEYBOARD_SHORTCUTS,\n} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport type {\n KeyboardShortcutDescriptor} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport WithTooltip from 'components/with_tooltip';\n\nimport DesktopApp from 'utils/desktop_api';\n\nconst HistoryButtonsContainer = styled.nav`\n display: flex;\n align-items: center;\n\n > :first-child {\n margin-right: 1px;\n }\n`;\n\nconst HistoryButtons = (): JSX.Element => {\n const history = useHistory();\n const intl = useIntl();\n\n const [canGoBack, setCanGoBack] = useState(true);\n const [canGoForward, setCanGoForward] = useState(true);\n\n const getTooltip = (shortcut: KeyboardShortcutDescriptor) => (\n <KeyboardShortcutSequence\n shortcut={shortcut}\n hoistDescription={true}\n isInsideTooltip={true}\n />\n );\n\n const goBack = () => {\n trackEvent('ui', 'ui_history_back');\n history.goBack();\n requestButtons();\n };\n\n const goForward = () => {\n trackEvent('ui', 'ui_history_forward');\n history.goForward();\n requestButtons();\n };\n\n const requestButtons = async () => {\n const {canGoBack, canGoForward} = await DesktopApp.getBrowserHistoryStatus();\n updateButtons(canGoBack, canGoForward);\n };\n\n const updateButtons = (enableBack: boolean, enableForward: boolean) => {\n setCanGoBack(enableBack);\n setCanGoForward(enableForward);\n };\n\n useEffect(() => {\n const off = DesktopApp.onBrowserHistoryStatusUpdated(updateButtons);\n return off;\n }, []);\n\n return (\n <HistoryButtonsContainer>\n <WithTooltip\n title={getTooltip(KEYBOARD_SHORTCUTS.browserChannelPrev)}\n >\n <IconButton\n icon={'arrow-left'}\n onClick={goBack}\n size={'sm'}\n compact={true}\n inverted={true}\n disabled={!canGoBack}\n aria-label={intl.formatMessage({id: 'sidebar_left.channel_navigator.goBackLabel', defaultMessage: 'Back'})}\n />\n </WithTooltip>\n <WithTooltip\n title={getTooltip(KEYBOARD_SHORTCUTS.browserChannelNext)}\n >\n <IconButton\n icon={'arrow-right'}\n onClick={goForward}\n size={'sm'}\n compact={true}\n inverted={true}\n disabled={!canGoForward}\n aria-label={intl.formatMessage({id: 'sidebar_left.channel_navigator.goForwardLabel', defaultMessage: 'Forward'})}\n />\n </WithTooltip>\n </HistoryButtonsContainer>\n );\n};\n\nexport default HistoryButtons;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport HistoryButtons from './history_buttons';\n\nexport default HistoryButtons;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function isSwitcherOpen(state: GlobalState): boolean {\n return state.views.productMenu.switcherOpen;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\n\nimport Heading from '@mattermost/compass-components/components/heading'; // eslint-disable-line no-restricted-imports\nimport glyphMap, {ProductChannelsIcon} from '@mattermost/compass-icons/components';\n\nimport {useCurrentProduct} from 'utils/products';\n\nconst ProductBrandingContainer = styled.div`\n display: flex;\n align-items: center;\n\n > * + * {\n margin-left: 8px;\n }\n`;\n\nconst ProductBranding = (): JSX.Element => {\n const currentProduct = useCurrentProduct();\n\n const Icon = currentProduct?.switcherIcon ? glyphMap[currentProduct.switcherIcon] : ProductChannelsIcon;\n\n return (\n <ProductBrandingContainer tabIndex={0}>\n <Icon size={24}/>\n <Heading\n element='h1'\n size={200}\n margin='none'\n >\n {currentProduct ? currentProduct.switcherText : 'Channels'}\n </Heading>\n </ProductBrandingContainer>\n );\n};\n\nexport default ProductBranding;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\n\nimport Logo from 'components/common/svg_images_components/logo_dark_blue_svg';\n\nconst ProductBrandingTeamEditionContainer = styled.div`\n display: flex;\n align-items: center;\n\n > * + * {\n margin-left: 8px;\n }\n`;\n\nconst StyledLogo = styled(Logo)`\n path {\n fill: rgba(var(--sidebar-text-rgb), 0.75);\n }\n`;\n\nconst Badge = styled.div`\n display: flex;\n align-self: center;\n padding: 2px 6px;\n position: relative;\n top: 1px;\n border-radius: var(--radius-s);\n margin-left: 12px;\n background: rgba(var(--sidebar-text-rgb), 0.08);\n color: rgba(var(--sidebar-text-rgb), 0.75);\n font-family: 'Open Sans', sans-serif;\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.025em;\n line-height: 16px;\n`;\n\nconst ProductBrandingTeamEdition = (): JSX.Element => {\n return (\n <ProductBrandingTeamEditionContainer tabIndex={0}>\n <StyledLogo\n width={116}\n height={20}\n />\n <Badge>{'FREE EDITION'}</Badge>\n </ProductBrandingTeamEditionContainer>\n );\n};\n\nexport default ProductBrandingTeamEdition;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Link} from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport glyphMap, {CheckIcon} from '@mattermost/compass-icons/components';\nimport type {IconGlyphTypes} from '@mattermost/compass-icons/IconGlyphs';\n\nexport interface ProductMenuItemProps {\n destination: string;\n icon: IconGlyphTypes;\n text: React.ReactNode;\n active: boolean;\n onClick: () => void;\n\n tourTip?: React.ReactNode;\n id?: string;\n}\n\nconst MenuItem = styled(Link)`\n && {\n text-decoration: none;\n color: inherit;\n }\n\n height: 40px;\n width: 270px;\n padding-left: 16px;\n padding-right: 20px;\n display: flex;\n align-items: center;\n cursor: pointer;\n position: relative;\n\n &:hover {\n background: rgba(var(--center-channel-color-rgb), 0.08);\n text-decoration: none;\n color: inherit;\n }\n\n button {\n padding: 0 6px;\n }\n`;\n\nconst MenuItemTextContainer = styled.div`\n margin-left: 8px;\n flex-grow: 1;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n`;\n\nconst ProductMenuItem = ({icon, destination, text, active, onClick, tourTip, id}: ProductMenuItemProps): JSX.Element => {\n const ProductIcon = glyphMap[icon];\n\n return (\n <MenuItem\n to={destination}\n onClick={onClick}\n id={id}\n >\n <ProductIcon\n size={24}\n color={'var(--button-bg)'}\n />\n <MenuItemTextContainer>\n {text}\n </MenuItemTextContainer>\n {active && (\n <CheckIcon\n size={18}\n color={'var(--button-bg)'}\n />\n )}\n {tourTip || null}\n </MenuItem>\n );\n};\n\nexport default ProductMenuItem;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {\n AccountMultipleOutlineIcon,\n ApplicationCogIcon,\n DownloadOutlineIcon,\n InformationOutlineIcon,\n ViewGridPlusOutlineIcon,\n WebhookIncomingIcon,\n} from '@mattermost/compass-icons/components';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport AboutBuildModal from 'components/about_build_modal';\nimport {VisitSystemConsoleTour} from 'components/onboarding_tasks';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport MarketplaceModal from 'components/plugin_marketplace/marketplace_modal';\nimport UserGroupsModal from 'components/user_groups_modal';\nimport Menu from 'components/widgets/menu/menu';\nimport RestrictedIndicator from 'components/widgets/menu/menu_items/restricted_indicator';\n\nimport {FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS} from 'utils/cloud_utils';\nimport {LicenseSkus, ModalIdentifiers, MattermostFeatures} from 'utils/constants';\nimport {makeUrlSafe} from 'utils/url';\nimport * as UserAgent from 'utils/user_agent';\n\nimport type {ModalData} from 'types/actions';\n\nimport './product_menu_list.scss';\n\nexport type Props = {\n isMobile: boolean;\n teamId?: string;\n teamName?: string;\n siteName: string;\n currentUser: UserProfile;\n appDownloadLink: string;\n isMessaging: boolean;\n enableCommands: boolean;\n enableIncomingWebhooks: boolean;\n enableOAuthServiceProvider: boolean;\n enableOutgoingWebhooks: boolean;\n canManageSystemBots: boolean;\n canManageIntegrations: boolean;\n enablePluginMarketplace: boolean;\n showVisitSystemConsoleTour: boolean;\n isStarterFree: boolean;\n isFreeTrial: boolean;\n onClick?: React.MouseEventHandler<HTMLElement>;\n handleVisitConsoleClick: React.MouseEventHandler<HTMLElement>;\n enableCustomUserGroups?: boolean;\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n getPrevTrialLicense: () => void;\n };\n};\n\nconst ProductMenuList = (props: Props): JSX.Element | null => {\n const {\n teamId,\n teamName,\n siteName,\n currentUser,\n appDownloadLink,\n isMessaging,\n enableCommands,\n enableIncomingWebhooks,\n enableOAuthServiceProvider,\n enableOutgoingWebhooks,\n canManageSystemBots,\n canManageIntegrations,\n enablePluginMarketplace,\n showVisitSystemConsoleTour,\n isStarterFree,\n isFreeTrial,\n onClick,\n handleVisitConsoleClick,\n isMobile = false,\n enableCustomUserGroups,\n } = props;\n const {formatMessage} = useIntl();\n\n useEffect(() => {\n props.actions.getPrevTrialLicense();\n }, []);\n\n if (!currentUser) {\n return null;\n }\n\n const openGroupsModal = () => {\n props.actions.openModal({\n modalId: ModalIdentifiers.USER_GROUPS,\n dialogType: UserGroupsModal,\n dialogProps: {\n backButtonAction: openGroupsModal,\n },\n });\n };\n\n const someIntegrationEnabled = enableIncomingWebhooks || enableOutgoingWebhooks || enableCommands || enableOAuthServiceProvider || canManageSystemBots;\n const showIntegrations = !isMobile && someIntegrationEnabled && canManageIntegrations;\n\n return (\n <Menu.Group>\n <div onClick={onClick}>\n <Menu.CloudTrial id='menuCloudTrial'/>\n <Menu.ItemCloudLimit id='menuItemCloudLimit'/>\n <SystemPermissionGate permissions={Permissions.SYSCONSOLE_READ_PERMISSIONS}>\n <Menu.ItemLink\n id='systemConsole'\n show={!isMobile}\n to='/admin_console'\n text={(\n <>\n {formatMessage({id: 'navbar_dropdown.console', defaultMessage: 'System Console'})}\n {showVisitSystemConsoleTour && (\n <div\n onClick={handleVisitConsoleClick}\n className={'system-console-visit'}\n >\n <VisitSystemConsoleTour/>\n </div>\n )}\n </>\n )}\n icon={<ApplicationCogIcon size={18}/>}\n />\n </SystemPermissionGate>\n <Menu.ItemLink\n id='integrations'\n show={isMessaging && showIntegrations}\n to={'/' + teamName + '/integrations'}\n text={formatMessage({id: 'navbar_dropdown.integrations', defaultMessage: 'Integrations'})}\n icon={<WebhookIncomingIcon size={18}/>}\n />\n <Menu.ItemToggleModalRedux\n id='userGroups'\n modalId={ModalIdentifiers.USER_GROUPS}\n show={enableCustomUserGroups || isStarterFree || isFreeTrial}\n dialogType={UserGroupsModal}\n dialogProps={{\n backButtonAction: openGroupsModal,\n }}\n text={formatMessage({id: 'navbar_dropdown.userGroups', defaultMessage: 'User Groups'})}\n icon={<AccountMultipleOutlineIcon size={18}/>}\n disabled={isStarterFree}\n sibling={(isStarterFree || isFreeTrial) && (\n <RestrictedIndicator\n blocked={isStarterFree}\n feature={MattermostFeatures.CUSTOM_USER_GROUPS}\n minimumPlanRequiredForFeature={LicenseSkus.Professional}\n tooltipMessage={formatMessage({\n id: 'navbar_dropdown.userGroups.tooltip.cloudFreeTrial',\n defaultMessage: 'During your trial you are able to create user groups. These user groups will be archived after your trial.',\n })}\n titleAdminPreTrial={formatMessage({\n id: 'navbar_dropdown.userGroups.modal.titleAdminPreTrial',\n defaultMessage: 'Try unlimited user groups with a free trial',\n })}\n messageAdminPreTrial={formatMessage({\n id: 'navbar_dropdown.userGroups.modal.messageAdminPreTrial',\n defaultMessage: 'Create unlimited user groups with one of our paid plans. Get the full experience of Enterprise when you start a free, {trialLength} day trial.',\n },\n {\n trialLength: FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS,\n },\n )}\n titleAdminPostTrial={formatMessage({\n id: 'navbar_dropdown.userGroups.modal.titleAdminPostTrial',\n defaultMessage: 'Upgrade to create unlimited user groups',\n })}\n messageAdminPostTrial={formatMessage({\n id: 'navbar_dropdown.userGroups.modal.messageAdminPostTrial',\n defaultMessage: 'User groups are a way to organize users and apply actions to all users within that group. Upgrade to the Professional plan to create unlimited user groups.',\n })}\n titleEndUser={formatMessage({\n id: 'navbar_dropdown.userGroups.modal.titleEndUser',\n defaultMessage: 'User groups available in paid plans',\n })}\n messageEndUser={formatMessage({\n id: 'navbar_dropdown.userGroups.modal.messageEndUser',\n defaultMessage: 'User groups are a way to organize users and apply actions to all users within that group.',\n })}\n />\n )}\n />\n <TeamPermissionGate\n teamId={teamId}\n permissions={[Permissions.SYSCONSOLE_WRITE_PLUGINS]}\n >\n <Menu.ItemToggleModalRedux\n id='marketplaceModal'\n modalId={ModalIdentifiers.PLUGIN_MARKETPLACE}\n show={isMessaging && !isMobile && enablePluginMarketplace}\n dialogType={MarketplaceModal}\n dialogProps={{openedFrom: 'product_menu'}}\n text={formatMessage({id: 'navbar_dropdown.marketplace', defaultMessage: 'App Marketplace'})}\n icon={<ViewGridPlusOutlineIcon size={18}/>}\n />\n </TeamPermissionGate>\n <Menu.ItemExternalLink\n id='nativeAppLink'\n show={appDownloadLink && !UserAgent.isMobileApp()}\n url={makeUrlSafe(appDownloadLink)}\n text={formatMessage({id: 'navbar_dropdown.nativeApps', defaultMessage: 'Download Apps'})}\n icon={<DownloadOutlineIcon size={18}/>}\n />\n <Menu.ItemToggleModalRedux\n id='about'\n modalId={ModalIdentifiers.ABOUT}\n dialogType={AboutBuildModal}\n text={formatMessage({id: 'navbar_dropdown.about', defaultMessage: 'About {appTitle}'}, {appTitle: siteName})}\n icon={<InformationOutlineIcon size={18}/>}\n />\n </div>\n </Menu.Group>\n );\n};\n\nexport default ProductMenuList;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getPrevTrialLicense} from 'mattermost-redux/actions/admin';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getCloudSubscription, getSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud';\nimport {\n getConfig,\n getFirstAdminVisitMarketplaceStatus,\n getLicense,\n isMarketplaceEnabled,\n} from 'mattermost-redux/selectors/entities/general';\nimport {\n getInt,\n isCustomGroupsEnabled,\n} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveICurrentTeamPermission, haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {OnboardingTaskCategory, OnboardingTasksName, TaskNameMapToSteps} from 'components/onboarding_tasks';\n\nimport {CloudProducts} from 'utils/constants';\nimport {isCloudLicense} from 'utils/license_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport ProductMenuList from './product_menu_list';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const currentTeam = getCurrentTeam(state);\n const currentUser = getCurrentUser(state);\n\n const appDownloadLink = config.AppDownloadLink || '';\n const enableCommands = config.EnableCommands === 'true';\n const siteName = config.SiteName || 'Mattermost';\n const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n const enablePluginMarketplace = isMarketplaceEnabled(state);\n const canManageTeamIntegrations = (haveICurrentTeamPermission(state, Permissions.MANAGE_SLASH_COMMANDS) || haveICurrentTeamPermission(state, Permissions.MANAGE_OAUTH) || haveICurrentTeamPermission(state, Permissions.MANAGE_INCOMING_WEBHOOKS) || haveICurrentTeamPermission(state, Permissions.MANAGE_OUTGOING_WEBHOOKS));\n const canManageSystemBots = (haveISystemPermission(state, {permission: Permissions.MANAGE_BOTS}) || haveISystemPermission(state, {permission: Permissions.MANAGE_OTHERS_BOTS}));\n const canManageIntegrations = canManageTeamIntegrations || canManageSystemBots;\n const step = getInt(state, OnboardingTaskCategory, OnboardingTasksName.VISIT_SYSTEM_CONSOLE, 0);\n const showVisitSystemConsoleTour = step === TaskNameMapToSteps[OnboardingTasksName.VISIT_SYSTEM_CONSOLE].STARTED;\n const enableCustomUserGroups = isCustomGroupsEnabled(state);\n const isMobile = getIsMobileView(state);\n\n const subscription = getCloudSubscription(state);\n const license = getLicense(state);\n const subscriptionProduct = getSubscriptionProduct(state);\n\n const isCloud = isCloudLicense(license);\n const isCloudStarterFree = isCloud && subscriptionProduct?.sku === CloudProducts.STARTER;\n const isCloudFreeTrial = isCloud && subscription?.is_free_trial === 'true';\n\n const isEnterpriseReady = config.BuildEnterpriseReady === 'true';\n const isSelfHostedStarter = isEnterpriseReady && (license.IsLicensed === 'false');\n const isSelfHostedFreeTrial = license.IsTrial === 'true';\n\n const isStarterFree = isCloudStarterFree || isSelfHostedStarter;\n const isFreeTrial = isCloudFreeTrial || isSelfHostedFreeTrial;\n\n return {\n isMobile,\n appDownloadLink,\n enableCommands,\n canManageIntegrations,\n enableIncomingWebhooks,\n enableOAuthServiceProvider,\n enableOutgoingWebhooks,\n canManageSystemBots,\n enablePluginMarketplace,\n pluginMenuItems: state.plugins.components.MainMenu,\n siteName,\n teamId: currentTeam?.id,\n teamName: currentTeam?.name,\n currentUser,\n firstAdminVisitMarketplaceStatus: getFirstAdminVisitMarketplaceStatus(state),\n showVisitSystemConsoleTour,\n enableCustomUserGroups,\n isStarterFree,\n isFreeTrial,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n getPrevTrialLicense,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ProductMenuList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useRef} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button'; // eslint-disable-line no-restricted-imports\n\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {setProductMenuSwitcherOpen} from 'actions/views/product_menu';\nimport {isSwitcherOpen} from 'selectors/views/product_menu';\n\nimport {\n OnboardingTaskCategory,\n OnboardingTasksName,\n TaskNameMapToSteps,\n useHandleOnBoardingTaskData,\n} from 'components/onboarding_tasks';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {useCurrentProductId, useProducts, isChannels} from 'utils/products';\n\nimport ProductBranding from './product_branding';\nimport ProductBrandingTeamEdition from './product_branding_team_edition';\nimport ProductMenuItem from './product_menu_item';\nimport ProductMenuList from './product_menu_list';\n\nimport {useClickOutsideRef} from '../../hooks';\n\nexport const ProductMenuContainer = styled.nav`\n display: flex;\n align-items: center;\n cursor: pointer;\n\n > * + * {\n margin-left: 12px;\n }\n`;\n\nexport const ProductMenuButton = styled(IconButton).attrs(() => ({\n id: 'product_switch_menu',\n icon: 'products',\n size: 'sm',\n\n // we currently need this, since not passing a onClick handler is disabling the IconButton\n // this is a known issue and is being tracked by UI platform team\n // TODO@UI: remove the onClick, when it is not a mandatory prop anymore\n onClick: () => {},\n inverted: true,\n compact: true,\n}))`\n > i::before {\n font-size: 20px;\n letter-spacing: 20px;\n }\n`;\n\nconst ProductMenu = (): JSX.Element => {\n const {formatMessage} = useIntl();\n const products = useProducts();\n const dispatch = useDispatch();\n const switcherOpen = useSelector(isSwitcherOpen);\n const menuRef = useRef<HTMLDivElement>(null);\n const currentProductID = useCurrentProductId();\n const license = useSelector(getLicense);\n\n const handleClick = () => dispatch(setProductMenuSwitcherOpen(!switcherOpen));\n\n const handleOnBoardingTaskData = useHandleOnBoardingTaskData();\n\n const visitSystemConsoleTaskName = OnboardingTasksName.VISIT_SYSTEM_CONSOLE;\n const handleVisitConsoleClick = () => {\n const steps = TaskNameMapToSteps[visitSystemConsoleTaskName];\n handleOnBoardingTaskData(visitSystemConsoleTaskName, steps.FINISHED, true, 'finish');\n localStorage.setItem(OnboardingTaskCategory, 'true');\n };\n\n useClickOutsideRef(menuRef, () => {\n if (!switcherOpen) {\n return;\n }\n dispatch(setProductMenuSwitcherOpen(false));\n });\n\n const productItems = products?.map((product) => {\n let tourTip;\n\n return (\n <ProductMenuItem\n key={product.id}\n destination={product.switcherLinkURL}\n icon={product.switcherIcon}\n text={product.switcherText}\n active={product.id === currentProductID}\n onClick={handleClick}\n tourTip={tourTip}\n id={`product-menu-item-${product.pluginId || product.id}`}\n />\n );\n });\n\n return (\n <div ref={menuRef}>\n <MenuWrapper\n open={switcherOpen}\n >\n <ProductMenuContainer onClick={handleClick}>\n <ProductMenuButton\n active={switcherOpen}\n aria-expanded={switcherOpen}\n aria-label={formatMessage({id: 'global_header.productSwitchMenu', defaultMessage: 'Product switch menu'})}\n aria-controls='product-switcher-menu'\n />\n {license.IsLicensed === 'false' && <ProductBrandingTeamEdition/>}\n {license.IsLicensed === 'true' && <ProductBranding/>}\n </ProductMenuContainer>\n <Menu\n listId={'product-switcher-menu-dropdown'}\n className={'product-switcher-menu'}\n id={'product-switcher-menu'}\n ariaLabel={'switcherOpen'}\n >\n <ProductMenuItem\n destination={'/'}\n icon={'product-channels'}\n text={'Channels'}\n active={isChannels(currentProductID)}\n onClick={handleClick}\n />\n {productItems}\n <ProductMenuList\n isMessaging={isChannels(currentProductID)}\n onClick={handleClick}\n handleVisitConsoleClick={handleVisitConsoleClick}\n />\n <Menu.Group>\n <Menu.StartTrial\n id='startTrial'\n />\n </Menu.Group>\n </Menu>\n </MenuWrapper>\n </div>\n );\n};\n\nexport default ProductMenu;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\n\nimport {isDesktopApp} from 'utils/user_agent';\n\nimport HistoryButtons from './history_buttons';\nimport ProductMenu from './product_menu';\n\nconst LeftControlsContainer = styled.div`\n display: flex;\n align-items: center;\n height: 40px;\n flex-shrink: 0;\n flex-basis: 30%;\n\n > * + * {\n margin-left: 12px;\n }\n`;\n\nconst LeftControls = (): JSX.Element => (\n <LeftControlsContainer>\n <ProductMenu/>\n {isDesktopApp() && <HistoryButtons/>}\n </LeftControlsContainer>\n);\n\nexport default LeftControls;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function isStatusDropdownOpen(state: GlobalState) {\n return state.views.statusDropdown.isOpen;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {setStatus} from 'mattermost-redux/actions/users';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport {makeAsyncComponent} from 'components/async_load';\n\nimport type {GlobalState} from 'types/store';\n\nconst DndCustomTimePicker = makeAsyncComponent('DndCustomTimePicker', React.lazy(() => import('./dnd_custom_time_picker_modal')));\n\nfunction mapStateToProps(state: GlobalState) {\n const userId = getCurrentUserId(state);\n const locale = getCurrentLocale(state);\n const theme = getTheme(state);\n\n return {\n userId,\n locale,\n theme,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n setStatus,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DndCustomTimePicker);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport moment from 'moment-timezone';\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {injectIntl, FormattedDate, FormattedMessage, FormattedTime, defineMessage, defineMessages} from 'react-intl';\nimport type {IntlShape, MessageDescriptor} from 'react-intl';\n\nimport StatusIcon from '@mattermost/compass-components/components/status-icon'; // eslint-disable-line no-restricted-imports\nimport Text from '@mattermost/compass-components/components/text'; // eslint-disable-line no-restricted-imports\nimport type {TUserStatus} from '@mattermost/compass-components/shared'; // eslint-disable-line no-restricted-imports\nimport {AccountOutlineIcon, CancelIcon, CheckIcon, ExitToAppIcon} from '@mattermost/compass-icons/components';\nimport {PulsatingDot} from '@mattermost/components';\nimport type {PreferenceType} from '@mattermost/types/preferences';\nimport {CustomStatusDuration} from '@mattermost/types/users';\nimport type {UserCustomStatus, UserProfile, UserStatus} from '@mattermost/types/users';\n\nimport * as GlobalActions from 'actions/global_actions';\n\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport CustomStatusModal from 'components/custom_status/custom_status_modal';\nimport CustomStatusText from 'components/custom_status/custom_status_text';\nimport ExpiryTime from 'components/custom_status/expiry_time';\nimport DndCustomTimePicker from 'components/dnd_custom_time_picker_modal';\nimport {OnboardingTaskCategory, OnboardingTasksName, TaskNameMapToSteps, CompleteYourProfileTour} from 'components/onboarding_tasks';\nimport ResetStatusModal from 'components/reset_status_modal';\nimport UserSettingsModal from 'components/user_settings/modal';\nimport EmojiIcon from 'components/widgets/icons/emoji_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Avatar from 'components/widgets/users/avatar/avatar';\nimport type {TAvatarSizeToken} from 'components/widgets/users/avatar/avatar';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ModalIdentifiers, UserStatuses} from 'utils/constants';\nimport {getBrowserTimezone, getCurrentDateTimeForTimezone, getCurrentMomentForTimezone} from 'utils/timezone';\n\nimport type {ModalData} from 'types/actions';\nimport type {Menu as MenuType} from 'types/store/plugins';\n\nimport './status_dropdown.scss';\n\ntype Props = {\n intl: IntlShape;\n status?: string;\n userId: string;\n profilePicture?: string;\n autoResetPref?: string;\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n setStatus: (status: UserStatus) => void;\n unsetCustomStatus: () => void;\n savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n setStatusDropdown: (open: boolean) => void;\n };\n customStatus?: UserCustomStatus;\n currentUser: UserProfile;\n isCustomStatusEnabled: boolean;\n isCustomStatusExpired: boolean;\n isMilitaryTime: boolean;\n isStatusDropdownOpen: boolean;\n showCompleteYourProfileTour: boolean;\n showCustomStatusPulsatingDot: boolean;\n timezone?: string;\n dndEndTime?: number;\n}\n\ntype State = {\n openUp: boolean;\n width: number;\n isStatusSet: boolean;\n};\n\nexport const statusDropdownMessages: Record<string, Record<string, MessageDescriptor>> = {\n ooo: defineMessages({\n name: {\n id: 'status_dropdown.set_ooo',\n defaultMessage: 'Out of office',\n },\n extra: {\n id: 'status_dropdown.set_ooo.extra',\n defaultMessage: 'Automatic Replies are enabled',\n },\n }),\n online: defineMessages({\n name: {\n id: 'status_dropdown.set_online',\n defaultMessage: 'Online',\n },\n }),\n away: defineMessages({\n name: {\n id: 'status_dropdown.set_away',\n defaultMessage: 'Away',\n },\n }),\n dnd: defineMessages({\n name: {\n id: 'status_dropdown.set_dnd',\n defaultMessage: 'Do not disturb',\n },\n }),\n offline: defineMessages({\n name: {\n id: 'status_dropdown.set_offline',\n defaultMessage: 'Offline',\n },\n }),\n};\n\nexport class StatusDropdown extends React.PureComponent<Props, State> {\n dndTimes = [\n {id: 'dont_clear', label: defineMessage({id: 'status_dropdown.dnd_sub_menu_item.dont_clear', defaultMessage: 'Don\\'t clear'})},\n {id: 'thirty_minutes', label: defineMessage({id: 'status_dropdown.dnd_sub_menu_item.thirty_minutes', defaultMessage: '30 mins'})},\n {id: 'one_hour', label: defineMessage({id: 'status_dropdown.dnd_sub_menu_item.one_hour', defaultMessage: '1 hour'})},\n {id: 'two_hours', label: defineMessage({id: 'status_dropdown.dnd_sub_menu_item.two_hours', defaultMessage: '2 hours'})},\n {id: 'tomorrow', label: defineMessage({id: 'status_dropdown.dnd_sub_menu_item.tomorrow', defaultMessage: 'Tomorrow'})},\n {id: 'custom', label: defineMessage({id: 'status_dropdown.dnd_sub_menu_item.custom', defaultMessage: 'Choose date and time'})},\n ];\n static defaultProps = {\n userId: '',\n profilePicture: '',\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n openUp: false,\n width: 0,\n isStatusSet: false,\n };\n }\n\n openProfileModal = (): void => {\n this.props.actions.openModal({\n modalId: ModalIdentifiers.USER_SETTINGS,\n dialogType: UserSettingsModal,\n dialogProps: {isContentProductSettings: false},\n });\n };\n\n setStatus = (status: string, dndEndTime?: number): void => {\n this.props.actions.setStatus({\n user_id: this.props.userId,\n status,\n dnd_end_time: dndEndTime,\n });\n };\n\n isUserOutOfOffice = (): boolean => {\n return this.props.status === UserStatuses.OUT_OF_OFFICE;\n };\n\n setOnline = (event: Event): void => {\n event.preventDefault();\n this.setStatus(UserStatuses.ONLINE);\n };\n\n setOffline = (event: Event): void => {\n event.preventDefault();\n this.setStatus(UserStatuses.OFFLINE);\n };\n\n setAway = (event: Event): void => {\n event.preventDefault();\n this.setStatus(UserStatuses.AWAY);\n };\n\n setDnd = (index: number): void => {\n const currentDate = getCurrentMomentForTimezone(this.props.timezone);\n let endTime = currentDate;\n switch (index) {\n case 0:\n endTime = moment(0);\n break;\n case 1:\n // add 30 minutes in current time\n endTime = currentDate.add(30, 'minutes');\n break;\n case 2:\n // add 1 hour in current time\n endTime = currentDate.add(1, 'hour');\n break;\n case 3:\n // add 2 hours in current time\n endTime = currentDate.add(2, 'hours');\n break;\n case 4:\n // set to next day 9 in the morning\n endTime = currentDate.add(1, 'day').set({hour: 9, minute: 0});\n break;\n }\n\n this.setStatus(UserStatuses.DND, endTime.utc().unix());\n };\n\n setCustomTimedDnd = (): void => {\n const dndCustomTimePicker = {\n modalId: ModalIdentifiers.DND_CUSTOM_TIME_PICKER,\n dialogType: DndCustomTimePicker,\n dialogProps: {\n currentDate: this.props.timezone ? getCurrentDateTimeForTimezone(this.props.timezone) : new Date(),\n },\n };\n\n this.props.actions.openModal(dndCustomTimePicker);\n };\n\n showStatusChangeConfirmation = (status: string): void => {\n const resetStatusModalData = {\n modalId: ModalIdentifiers.RESET_STATUS,\n dialogType: ResetStatusModal,\n dialogProps: {newStatus: status},\n };\n\n this.props.actions.openModal(resetStatusModalData);\n };\n\n renderProfilePicture = (size: TAvatarSizeToken): ReactNode => {\n if (!this.props.profilePicture) {\n return null;\n }\n return (\n <Avatar\n size={size}\n url={this.props.profilePicture}\n tabIndex={undefined}\n />\n );\n };\n\n handleClearStatus = (e: React.MouseEvent<HTMLButtonElement> | React.MouseEvent<HTMLDivElement> | React.TouchEvent): void => {\n e.stopPropagation();\n e.preventDefault();\n this.props.actions.unsetCustomStatus();\n };\n\n handleEmitUserLoggedOutEvent = (): void => {\n GlobalActions.emitUserLoggedOutEvent();\n };\n\n onToggle = (open: boolean): void => {\n this.props.actions.setStatusDropdown(open);\n };\n\n handleCompleteYourProfileTask = (): void => {\n const taskName = OnboardingTasksName.COMPLETE_YOUR_PROFILE;\n const steps = TaskNameMapToSteps[taskName];\n const currentUserId = this.props.currentUser.id;\n const preferences = [\n {\n user_id: currentUserId,\n category: OnboardingTaskCategory,\n name: taskName,\n value: steps.FINISHED.toString(),\n },\n ];\n this.props.actions.savePreferences(currentUserId, preferences);\n };\n\n handleCustomStatusEmojiClick = (event: React.MouseEvent): void => {\n event.stopPropagation();\n const customStatusInputModalData = {\n modalId: ModalIdentifiers.CUSTOM_STATUS,\n dialogType: CustomStatusModal,\n };\n this.props.actions.openModal(customStatusInputModalData);\n };\n\n renderCustomStatus = (isStatusSet: boolean | undefined): ReactNode => {\n if (!this.props.isCustomStatusEnabled) {\n return null;\n }\n const {customStatus} = this.props;\n\n let customStatusText;\n let customStatusHelpText;\n switch (true) {\n case isStatusSet && customStatus?.text && customStatus.text.length > 0:\n customStatusText = customStatus?.text;\n break;\n case isStatusSet && !customStatus?.text && customStatus?.duration === CustomStatusDuration.DONT_CLEAR:\n customStatusHelpText = this.props.intl.formatMessage({id: 'status_dropdown.set_custom_text', defaultMessage: 'Set custom status text...'});\n break;\n case isStatusSet && !customStatus?.text && customStatus?.duration !== CustomStatusDuration.DONT_CLEAR:\n customStatusText = '';\n break;\n case !isStatusSet:\n customStatusHelpText = this.props.intl.formatMessage({id: 'status_dropdown.set_custom', defaultMessage: 'Set a custom status'});\n }\n\n const customStatusEmoji = isStatusSet ? (\n <span className='d-flex'>\n <CustomStatusEmoji\n showTooltip={false}\n emojiStyle={{marginLeft: 0}}\n />\n </span>\n ) : (\n <EmojiIcon className={'custom-status-emoji'}/>\n );\n\n const pulsatingDot = !isStatusSet && this.props.showCustomStatusPulsatingDot && (\n <PulsatingDot/>\n );\n\n const clearableTooltipText = (\n <FormattedMessage\n id={'input.clear'}\n defaultMessage='Clear'\n />\n );\n\n const clearButton = isStatusSet && !pulsatingDot && (\n <div\n className={classNames('status-dropdown-menu__clear-container', 'input-clear visible')}\n onClick={this.handleClearStatus}\n onTouchEnd={this.handleClearStatus}\n >\n <WithTooltip\n title={clearableTooltipText}\n >\n <span\n className='input-clear-x'\n aria-hidden='true'\n >\n <i className='icon icon-close-circle'/>\n </span>\n </WithTooltip>\n </div>\n );\n\n const expiryTime = isStatusSet && customStatus?.expires_at && customStatus.duration !== CustomStatusDuration.DONT_CLEAR &&\n (\n <ExpiryTime\n time={customStatus.expires_at}\n timezone={this.props.timezone}\n className={classNames('custom_status__expiry', {\n padded: customStatus?.text?.length > 0,\n })}\n withinBrackets={true}\n />\n );\n\n return (\n <Menu.Group>\n <Menu.ItemToggleModalRedux\n ariaLabel={customStatusText || customStatusHelpText}\n modalId={ModalIdentifiers.CUSTOM_STATUS}\n dialogType={CustomStatusModal}\n className={classNames('MenuItem__primary-text custom_status__row', {\n flex: customStatus?.text?.length === 0,\n })}\n id={'status-menu-custom-status'}\n >\n <span className='custom_status__container'>\n <span className='custom_status__icon'>\n {customStatusEmoji}\n </span>\n <CustomStatusText\n text={customStatusText}\n className='custom_status__text'\n />\n <Text\n margin='none'\n >\n {customStatusHelpText}\n </Text>\n {clearButton}\n {pulsatingDot}\n </span>\n {expiryTime}\n </Menu.ItemToggleModalRedux>\n </Menu.Group>\n );\n };\n\n renderDndExtraText = (dndEndTime?: number, timezone?: string) => {\n if (!(dndEndTime && dndEndTime > 0)) {\n return this.props.intl.formatMessage({id: 'status_dropdown.set_dnd.extra', defaultMessage: 'Disables all notifications'});\n }\n\n const tz = timezone || getBrowserTimezone();\n const currentTime = moment().tz(tz);\n const endTime = moment.unix(dndEndTime).tz(tz);\n\n let formattedEndTime;\n\n const diffDays = endTime.clone().startOf('day').diff(currentTime.clone().startOf('day'), 'days');\n\n switch (diffDays) {\n case 0:\n formattedEndTime = (\n <FormattedMessage\n id='custom_status.expiry.until'\n defaultMessage='Until {time}'\n values={{time: endTime.format('h:mm A')}}\n />\n );\n break;\n case 1:\n formattedEndTime = (\n <FormattedMessage\n id='custom_status.expiry.until_tomorrow'\n defaultMessage='Until Tomorrow {time}'\n values={{time: endTime.format('h:mm A')}}\n />\n );\n break;\n default:\n formattedEndTime = (\n <FormattedMessage\n id='custom_status.expiry.until'\n defaultMessage='Until {time}'\n values={{time: endTime.format('lll')}}\n />\n );\n }\n\n return formattedEndTime;\n };\n\n render = (): JSX.Element => {\n const {intl} = this.props;\n const needsConfirm = this.isUserOutOfOffice() && this.props.autoResetPref === '';\n const {status, customStatus, isCustomStatusExpired, currentUser, timezone, dndEndTime} = this.props;\n const isStatusSet = customStatus && !isCustomStatusExpired && (customStatus.text?.length > 0 || customStatus.emoji?.length > 0);\n\n const setOnline = needsConfirm ? () => this.showStatusChangeConfirmation('online') : this.setOnline;\n const setDnd = needsConfirm ? () => this.showStatusChangeConfirmation('dnd') : this.setDnd;\n const setAway = needsConfirm ? () => this.showStatusChangeConfirmation('away') : this.setAway;\n const setOffline = needsConfirm ? () => this.showStatusChangeConfirmation('offline') : this.setOffline;\n const setCustomTimedDnd = needsConfirm ? () => this.showStatusChangeConfirmation('dnd') : this.setCustomTimedDnd;\n\n const selectedIndicator = (\n <CheckIcon\n size={16}\n color={'var(--button-bg)'}\n />\n );\n\n const dndSubMenuItems = ([\n {\n id: 'dndSubMenu-header',\n direction: 'right',\n text: this.props.intl.formatMessage({id: 'status_dropdown.dnd_sub_menu_header', defaultMessage: 'Clear after:'}),\n isHeader: true,\n },\n ] as MenuType[])?.concat(\n this.dndTimes.map<MenuType>(({id, label}, index) => {\n let text: MenuType['text'] = this.props.intl.formatMessage(label);\n if (index === 4) {\n const tomorrow = getCurrentMomentForTimezone(this.props.timezone).add(1, 'day').set({hour: 9, minute: 0}).toDate();\n text = (\n <>\n {text}\n <span className={`dndTime-${id}_timestamp`}>\n <FormattedDate\n value={tomorrow}\n weekday='short'\n timeZone={this.props.timezone}\n />\n {', '}\n <FormattedTime\n value={tomorrow}\n timeStyle='short'\n hour12={!this.props.isMilitaryTime}\n timeZone={this.props.timezone}\n />\n </span>\n </>\n );\n }\n return {\n id: `dndTime-${id}`,\n direction: 'right',\n text,\n action:\n index === 5 ? () => setCustomTimedDnd() : () => setDnd(index),\n };\n }),\n );\n\n const customStatusComponent = this.renderCustomStatus(isStatusSet);\n\n let menuAriaLabeltext;\n switch (this.props.status) {\n case UserStatuses.AWAY:\n menuAriaLabeltext = intl.formatMessage({\n id: 'status_dropdown.profile_button_label.away',\n defaultMessage: 'Current status: Away. Select to open profile and status menu.',\n });\n break;\n case UserStatuses.DND:\n menuAriaLabeltext = intl.formatMessage({\n id: 'status_dropdown.profile_button_label.dnd',\n defaultMessage: 'Current status: Do not disturb. Select to open profile and status menu.',\n });\n break;\n case UserStatuses.OFFLINE:\n menuAriaLabeltext = intl.formatMessage({\n id: 'status_dropdown.profile_button_label.offline',\n defaultMessage: 'Current status: Offline. Select to open profile and status menu.',\n });\n break;\n case UserStatuses.ONLINE:\n menuAriaLabeltext = intl.formatMessage({\n id: 'status_dropdown.profile_button_label.online',\n defaultMessage: 'Current status: Online. Select to open profile and status menu.',\n });\n break;\n case UserStatuses.OUT_OF_OFFICE:\n menuAriaLabeltext = intl.formatMessage({\n id: 'status_dropdown.profile_button_label.ooo',\n defaultMessage: 'Current status: Out of office. Select to open profile and status menu.',\n });\n break;\n default:\n menuAriaLabeltext = intl.formatMessage({\n id: 'status_dropdown.profile_button_label',\n defaultMessage: 'Select to open profile and status menu.',\n });\n }\n\n const dndExtraText = this.renderDndExtraText(dndEndTime, timezone);\n\n return (\n <MenuWrapper\n onToggle={this.onToggle}\n open={this.props.isStatusDropdownOpen}\n className={classNames('status-dropdown-menu status-dropdown-menu-global-header', {\n active: this.props.isStatusDropdownOpen || isStatusSet,\n })}\n >\n <button\n className='status-wrapper style--none'\n aria-label={menuAriaLabeltext}\n aria-expanded={this.props.isStatusDropdownOpen}\n aria-controls='statusDropdownMenu'\n >\n <CustomStatusEmoji\n showTooltip={true}\n emojiStyle={{marginRight: '6px'}}\n onClick={this.handleCustomStatusEmojiClick as () => void}\n />\n {this.renderProfilePicture('sm')}\n <div\n className='status'\n >\n <StatusIcon\n size={'sm'}\n status={(this.props.status || 'offline') as TUserStatus}\n />\n </div>\n </button>\n <Menu\n ariaLabel={this.props.intl.formatMessage({id: 'status_dropdown.menuAriaLabel', defaultMessage: 'Set a status'})}\n id={'statusDropdownMenu'}\n listId={'status-drop-down-menu-list'}\n >\n {currentUser && (\n <Menu.Header onClick={this.openProfileModal}>\n {this.renderProfilePicture('lg')}\n <div className={'username-wrapper'}>\n <Text\n className={'bold'}\n margin={'none'}\n >{`${currentUser.first_name} ${currentUser.last_name}`}</Text>\n <Text\n margin={'none'}\n className={!currentUser.first_name && !currentUser.last_name ? 'bold' : 'contrast'}\n color={!currentUser.first_name && !currentUser.last_name ? undefined : 'inherit'}\n >\n {'@' + currentUser.username}\n </Text>\n </div>\n </Menu.Header>\n )}\n <Menu.Group>\n <Menu.ItemAction\n show={this.isUserOutOfOffice()}\n onClick={setOnline}\n ariaLabel={this.props.intl.formatMessage(statusDropdownMessages.ooo.name)}\n text={this.props.intl.formatMessage(statusDropdownMessages.ooo.name)}\n icon={(\n <CancelIcon\n color={'rgba(var(--center-channel-color-rgb), 0.56)'}\n />\n )}\n extraText={this.props.intl.formatMessage(statusDropdownMessages.ooo.extra)}\n rightDecorator={selectedIndicator}\n />\n </Menu.Group>\n {customStatusComponent}\n <Menu.Group>\n <Menu.ItemAction\n onClick={setOnline}\n ariaLabel={this.props.intl.formatMessage(statusDropdownMessages.online.name)}\n text={this.props.intl.formatMessage(statusDropdownMessages.online.name)}\n icon={(\n <StatusIcon\n status={'online'}\n className={'status-icon'}\n />\n )}\n rightDecorator={status === 'online' && selectedIndicator}\n id={'status-menu-online'}\n />\n <Menu.ItemAction\n onClick={setAway}\n ariaLabel={this.props.intl.formatMessage(statusDropdownMessages.away.name)}\n text={this.props.intl.formatMessage(statusDropdownMessages.away.name)}\n icon={(\n <StatusIcon\n status={'away'}\n className={'status-icon'}\n />\n )}\n rightDecorator={status === 'away' && selectedIndicator}\n id={'status-menu-away'}\n />\n <Menu.ItemSubMenu\n subMenu={dndSubMenuItems}\n ariaLabel={`${this.props.intl.formatMessage(statusDropdownMessages.dnd.name)}. ${dndExtraText}`}\n text={this.props.intl.formatMessage(statusDropdownMessages.dnd.name)}\n extraText={dndExtraText}\n icon={(\n <StatusIcon\n status={'dnd'}\n className={'status-icon'}\n />\n )}\n rightDecorator={status === 'dnd' && selectedIndicator}\n direction={'left'}\n openUp={this.state.openUp}\n id={'status-menu-dnd'}\n action={() => setDnd(0)}\n />\n <Menu.ItemAction\n onClick={setOffline}\n ariaLabel={this.props.intl.formatMessage(statusDropdownMessages.offline.name)}\n text={this.props.intl.formatMessage(statusDropdownMessages.offline.name)}\n icon={(\n <StatusIcon\n status={'offline'}\n className={'status-icon'}\n />\n )}\n rightDecorator={status === 'offline' && selectedIndicator}\n id={'status-menu-offline'}\n />\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemToggleModalRedux\n id='accountSettings'\n ariaLabel='Profile'\n modalId={ModalIdentifiers.USER_SETTINGS}\n dialogType={UserSettingsModal}\n dialogProps={{isContentProductSettings: false}}\n text={this.props.intl.formatMessage({id: 'navbar_dropdown.profileSettings', defaultMessage: 'Profile'})}\n icon={\n <AccountOutlineIcon\n size={16}\n color={'rgba(var(--center-channel-color-rgb), 0.56)'}\n />\n }\n >\n {this.props.showCompleteYourProfileTour && (\n <div\n onClick={this.handleCompleteYourProfileTask}\n className={'account-settings-complete'}\n >\n <CompleteYourProfileTour/>\n </div>\n )}\n </Menu.ItemToggleModalRedux>\n </Menu.Group>\n <Menu.Group>\n <span className={'logout__icon'}>\n <Menu.ItemAction\n id='logout'\n onClick={this.handleEmitUserLoggedOutEvent}\n text={this.props.intl.formatMessage({id: 'navbar_dropdown.logout', defaultMessage: 'Log Out'})}\n icon={\n <ExitToAppIcon\n size={16}\n color={'rgba(var(--center-channel-color-rgb), 0.56)'}\n />\n }\n />\n </span>\n </Menu.Group>\n </Menu>\n </MenuWrapper>\n );\n };\n}\nexport default injectIntl(StatusDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {setStatus, unsetCustomStatus} from 'mattermost-redux/actions/users';\nimport {Client4} from 'mattermost-redux/client';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {get, getBool, getInt} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\nimport {getCurrentUser, getDndEndTimeForUserId, getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\nimport {setStatusDropdown} from 'actions/views/status_dropdown';\nimport {makeGetCustomStatus, isCustomStatusEnabled, showStatusDropdownPulsatingDot, isCustomStatusExpired} from 'selectors/views/custom_status';\nimport {isStatusDropdownOpen} from 'selectors/views/status_dropdown';\n\nimport {\n OnboardingTaskCategory,\n OnboardingTasksName,\n TaskNameMapToSteps,\n} from 'components/onboarding_tasks';\n\nimport type {GlobalState} from 'types/store';\n\nimport StatusDropdown from './status_dropdown';\n\nfunction makeMapStateToProps() {\n const getCustomStatus = makeGetCustomStatus();\n\n return function mapStateToProps(state: GlobalState) {\n const currentUser = getCurrentUser(state);\n\n const userId = currentUser?.id;\n const customStatus = getCustomStatus(state, userId);\n const isMilitaryTime = getBool(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.USE_MILITARY_TIME, false);\n const step = getInt(state, OnboardingTaskCategory, OnboardingTasksName.COMPLETE_YOUR_PROFILE, 0);\n const showCompleteYourProfileTour = step === TaskNameMapToSteps[OnboardingTasksName.COMPLETE_YOUR_PROFILE].STARTED;\n return {\n userId,\n profilePicture: Client4.getProfilePictureUrl(userId, currentUser?.last_picture_update),\n autoResetPref: get(state, Preferences.CATEGORY_AUTO_RESET_MANUAL_STATUS, userId, ''),\n status: getStatusForUserId(state, userId),\n customStatus,\n currentUser,\n isCustomStatusEnabled: isCustomStatusEnabled(state),\n isCustomStatusExpired: isCustomStatusExpired(state, customStatus),\n isMilitaryTime,\n isStatusDropdownOpen: isStatusDropdownOpen(state),\n showCustomStatusPulsatingDot: showStatusDropdownPulsatingDot(state),\n showCompleteYourProfileTour,\n timezone: getCurrentTimezone(state),\n dndEndTime: getDndEndTimeForUserId(state, userId),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n setStatus,\n unsetCustomStatus,\n setStatusDropdown,\n savePreferences,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(StatusDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button'; // eslint-disable-line no-restricted-imports\n\nimport {closeRightHandSide, showMentions} from 'actions/views/rhs';\nimport {getRhsState} from 'selectors/rhs';\n\nimport KeyboardShortcutSequence, {KEYBOARD_SHORTCUTS} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {RHSStates} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nconst AtMentionsButton = (): JSX.Element => {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n const rhsState = useSelector((state: GlobalState) => getRhsState(state));\n\n const mentionButtonClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (rhsState === RHSStates.MENTION) {\n dispatch(closeRightHandSide());\n } else {\n dispatch(showMentions());\n }\n };\n\n return (\n <WithTooltip\n title={\n <>\n <FormattedMessage\n id='channel_header.recentMentions'\n defaultMessage='Recent mentions'\n />\n <KeyboardShortcutSequence\n shortcut={KEYBOARD_SHORTCUTS.navMentions}\n hideDescription={true}\n isInsideTooltip={true}\n />\n </>\n }\n >\n <IconButton\n size={'sm'}\n icon={'at'}\n toggled={rhsState === RHSStates.MENTION}\n onClick={mentionButtonClick}\n inverted={true}\n compact={true}\n aria-expanded={rhsState === RHSStates.MENTION}\n aria-controls='searchContainer' // Must be changed if the ID of the container changes\n aria-label={formatMessage({id: 'channel_header.recentMentions', defaultMessage: 'Recent mentions'})}\n />\n </WithTooltip>\n );\n};\n\nexport default AtMentionsButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {getCloudProducts, getCloudSubscription} from 'mattermost-redux/actions/cloud';\nimport {getCloudSubscription as selectCloudSubscription, getSubscriptionProduct as selectSubscriptionProduct, isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport type {TelemetryProps} from 'components/common/hooks/useOpenPricingModal';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {CloudProducts} from 'utils/constants';\n\nconst UpgradeButton = styled.button`\nbackground: var(--denim-button-bg);\nborder-radius: 4px;\nborder: none;\nbox-shadow: none;\nheight: 24px;\nwidth: auto;\nfont-family: 'Open Sans';\nfont-style: normal;\nfont-weight: 600;\nfont-size: 11px !important;\nline-height: 10px;\nletter-spacing: 0.02em;\ncolor: var(--button-color);\n`;\n\nlet openPricingModal: (telemetryProps?: TelemetryProps) => void;\n\nconst PlanUpgradeButton = (): JSX.Element | null => {\n const dispatch = useDispatch();\n const {formatMessage} = useIntl();\n\n openPricingModal = useOpenPricingModal();\n const isCloud = useSelector(isCurrentLicenseCloud);\n\n useEffect(() => {\n if (isCloud) {\n dispatch(getCloudSubscription());\n dispatch(getCloudProducts());\n }\n }, [isCloud]);\n\n const isAdmin = useSelector(isCurrentUserSystemAdmin);\n const subscription = useSelector(selectCloudSubscription);\n const product = useSelector(selectSubscriptionProduct);\n const config = useSelector(getConfig);\n const license = useSelector(getLicense);\n\n const isEnterpriseTrial = subscription?.is_free_trial === 'true';\n\n const isCloudFree = product?.sku === CloudProducts.STARTER;\n\n const isSelfHostedEnterpriseTrial = !isCloud && license.IsTrial === 'true';\n const isSelfHostedStarter = license.IsLicensed === 'false';\n const isEnterpriseReady = config.BuildEnterpriseReady === 'true';\n\n if (!isAdmin) {\n return null;\n }\n\n // If not on Enterprise edition, don't show\n if (!isEnterpriseReady) {\n return null;\n }\n\n // for cloud, only show when subscribed to free or enterprise trial plans\n if (isCloud && !(isCloudFree || isEnterpriseTrial)) {\n return null;\n }\n\n // for non cloud, only show when subscribed to self hosted starter or self hosted enterprise trial plans\n if (!isCloud && !(isSelfHostedStarter || isSelfHostedEnterpriseTrial)) {\n return null;\n }\n\n return (\n <WithTooltip\n title={formatMessage({id: 'pricing_modal.btn.tooltip', defaultMessage: 'Only visible to system admins'})}\n >\n <UpgradeButton\n id='UpgradeButton'\n aria-haspopup='dialog'\n onClick={() => openPricingModal({trackingLocation: 'global_header_plan_upgrade_button'})}\n >\n {formatMessage({id: 'pricing_modal.btn.viewPlans', defaultMessage: 'View plans'})}\n </UpgradeButton>\n </WithTooltip>);\n};\n\nexport default PlanUpgradeButton;\nexport {openPricingModal};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button'; // eslint-disable-line no-restricted-imports\n\nimport {closeRightHandSide, showFlaggedPosts} from 'actions/views/rhs';\nimport {getRhsState} from 'selectors/rhs';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport {RHSStates} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nconst SavedPostsButton = (): JSX.Element | null => {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n const rhsState = useSelector((state: GlobalState) => getRhsState(state));\n\n const savedPostsButtonClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (rhsState === RHSStates.FLAG) {\n dispatch(closeRightHandSide());\n } else {\n dispatch(showFlaggedPosts());\n }\n };\n\n return (\n <WithTooltip\n title={\n <FormattedMessage\n id='channel_header.flagged'\n defaultMessage='Saved messages'\n />\n }\n >\n <IconButton\n size={'sm'}\n icon={'bookmark-outline'}\n toggled={rhsState === RHSStates.FLAG}\n onClick={savedPostsButtonClick}\n inverted={true}\n compact={true}\n aria-expanded={rhsState === RHSStates.FLAG}\n aria-controls='searchContainer' // Must be changed if the ID of the container changes\n aria-label={formatMessage({id: 'channel_header.flagged', defaultMessage: 'Saved messages'})}\n />\n </WithTooltip>\n );\n};\n\nexport default SavedPostsButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport IconButton from '@mattermost/compass-components/components/icon-button'; // eslint-disable-line no-restricted-imports\n\nimport UserSettingsModal from 'components/user_settings/modal';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\ntype Props = {\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n};\n\nconst SettingsButton = (props: Props): JSX.Element | null => {\n const {formatMessage} = useIntl();\n\n return (\n <WithTooltip\n title={\n <FormattedMessage\n id='global_header.productSettings'\n defaultMessage='Settings'\n />\n }\n >\n <IconButton\n size={'sm'}\n icon={'settings-outline'}\n onClick={(): void => {\n props.actions.openModal({modalId: ModalIdentifiers.USER_SETTINGS, dialogType: UserSettingsModal, dialogProps: {isContentProductSettings: true}});\n }}\n inverted={true}\n compact={true}\n aria-haspopup='dialog'\n aria-label={formatMessage({id: 'global_header.productSettings', defaultMessage: 'Settings'})}\n />\n </WithTooltip>\n );\n};\n\nexport default SettingsButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {openModal} from 'actions/views/modals';\n\nimport SettingsButton from './settings_button';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(SettingsButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport type {ProductIdentifier} from '@mattermost/types/products';\n\nimport {isCurrentUserGuestUser} from 'mattermost-redux/selectors/entities/users';\n\nimport StatusDropdown from 'components/status_dropdown';\nimport {OnboardingTourSteps, OnboardingTourStepsForGuestUsers} from 'components/tours';\nimport {\n CustomizeYourExperienceTour,\n useShowOnboardingTutorialStep,\n} from 'components/tours/onboarding_tour';\n\nimport Pluggable from 'plugins/pluggable';\nimport {isChannels} from 'utils/products';\n\nimport type {GlobalState} from 'types/store';\n\nimport AtMentionsButton from './at_mentions_button/at_mentions_button';\nimport PlanUpgradeButton from './plan_upgrade_button';\nimport SavedPostsButton from './saved_posts_button/saved_posts_button';\nimport SettingsButton from './settings_button';\n\nconst RightControlsContainer = styled.div`\n display: flex;\n align-items: center;\n height: 40px;\n flex-shrink: 0;\n position: relative;\n flex-basis: 30%;\n justify-content: flex-end;\n\n > * + * {\n margin-left: 8px;\n }\n`;\n\nconst StyledCustomizeYourExperienceTour = styled.div`\n display: flex;\n align-items: center;\n height: 100%\n`;\n\nconst StyledStatusDropdown = styled.div`\n margin-left: 8px;\n`;\n\nexport type Props = {\n productId?: ProductIdentifier;\n}\n\nconst RightControls = ({productId = null}: Props): JSX.Element => {\n // guest validation to see which point the messaging tour tip starts\n const isGuestUser = useSelector((state: GlobalState) => isCurrentUserGuestUser(state));\n const tourStep = isGuestUser ? OnboardingTourStepsForGuestUsers.CUSTOMIZE_EXPERIENCE : OnboardingTourSteps.CUSTOMIZE_EXPERIENCE;\n\n const showCustomizeTip = useShowOnboardingTutorialStep(tourStep);\n\n return (\n <RightControlsContainer\n id={'RightControlsContainer'}\n >\n <PlanUpgradeButton/>\n {isChannels(productId) ? (\n <>\n <AtMentionsButton/>\n <SavedPostsButton/>\n </>\n ) : (\n <Pluggable\n pluggableName={'Product'}\n subComponentName={'headerRightComponent'}\n pluggableId={productId}\n />\n )}\n <StyledCustomizeYourExperienceTour id='CustomizeYourExperienceTour'>\n {\n isChannels(productId) ? (\n <>\n <SettingsButton/>\n {showCustomizeTip && <CustomizeYourExperienceTour/>}\n </>\n ) : null\n }\n <StyledStatusDropdown>\n <StatusDropdown/>\n </StyledStatusDropdown>\n </StyledCustomizeYourExperienceTour>\n </RightControlsContainer>\n );\n};\n\nexport default RightControls;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport CompassThemeProvider from 'components/compass_theme_provider/compass_theme_provider';\n\nimport {useCurrentProductId} from 'utils/products';\n\nimport CenterControls from './center_controls/center_controls';\nimport {useIsLoggedIn} from './hooks';\nimport LeftControls from './left_controls/left_controls';\nimport RightControls from './right_controls/right_controls';\n\nconst GlobalHeaderContainer = styled.header`\n position: relative;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between;\n height: 44px;\n color: rgba(var(--sidebar-text-rgb), 0.64);\n padding: 0 4px 0 8px;\n z-index: 99;\n\n > * + * {\n margin-left: 12px;\n }\n\n @media screen and (max-width: 768px) {\n display: none;\n }\n`;\n\nconst GlobalHeader = (): JSX.Element | null => {\n const isLoggedIn = useIsLoggedIn();\n const currentProductID = useCurrentProductId();\n const theme = useSelector(getTheme);\n\n if (!isLoggedIn) {\n return null;\n }\n\n return (\n <CompassThemeProvider theme={theme}>\n <GlobalHeaderContainer id='global-header'>\n <LeftControls/>\n <CenterControls productId={currentProductID}/>\n <RightControls productId={currentProductID}/>\n </GlobalHeaderContainer>\n </CompassThemeProvider>\n );\n};\n\nexport default GlobalHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useCallback} from 'react';\nimport {Route} from 'react-router-dom';\n\nimport AnnouncementBar from 'components/announcement_bar';\n\nimport type {HeaderProps} from './header';\n\nimport './header_footer_route.scss';\n\nconst Header = React.lazy(() => import('./header'));\nconst Footer = React.lazy(() => import('./footer'));\n\nexport type CustomizeHeaderType = (props: HeaderProps) => void;\n\nexport type HFRouteProps = {\n path: string;\n component: React.ComponentType<{onCustomizeHeader?: CustomizeHeaderType}>;\n};\n\nexport const HFRoute = ({path, component: Component}: HFRouteProps) => {\n const [headerProps, setHeaderProps] = useState<HeaderProps>({});\n\n const customizeHeader: CustomizeHeaderType = useCallback((props) => {\n setHeaderProps(props);\n }, []);\n\n return (\n <Route\n path={path}\n render={() => (\n <>\n <React.Suspense fallback={null}>\n <AnnouncementBar/>\n </React.Suspense>\n <div className='header-footer-route'>\n <div className='header-footer-route-container'>\n <React.Suspense fallback={null}>\n <Header {...headerProps}/>\n </React.Suspense>\n <React.Suspense fallback={null}>\n <Component onCustomizeHeader={customizeHeader}/>\n </React.Suspense>\n <React.Suspense fallback={null}>\n <Footer/>\n </React.Suspense>\n </div>\n </div>\n </>\n )}\n />\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ComponentType} from 'react';\nimport {Route} from 'react-router-dom';\nimport type {RouteProps} from 'react-router-dom';\n\nconst HeaderFooterTemplate = React.lazy(() => import('components/header_footer_template/header_footer_template'));\nconst LoggedIn = React.lazy(() => import('components/logged_in'));\n\ninterface Props extends RouteProps {\n component: ComponentType<any>;\n}\n\nexport const HFTRoute = ({component: Component, ...rest}: Props) => (\n <Route\n {...rest}\n render={(props) => (\n <React.Suspense fallback={null}>\n <HeaderFooterTemplate {...props}>\n <Component {...props}/>\n </HeaderFooterTemplate>\n </React.Suspense>\n )}\n />\n);\n\nexport const LoggedInHFTRoute = ({component: Component, ...rest}: Props) => (\n <Route\n {...rest}\n render={(props) => (\n <React.Suspense fallback={null}>\n <LoggedIn {...props}>\n <React.Suspense fallback={null}>\n <HeaderFooterTemplate {...props}>\n <Component {...props}/>\n </HeaderFooterTemplate>\n </React.Suspense>\n </LoggedIn>\n </React.Suspense>\n )}\n />\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {lazy} from 'react';\nimport type {RouteComponentProps} from 'react-router-dom';\nimport {Route} from 'react-router-dom';\n\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport CompassThemeProvider from 'components/compass_theme_provider/compass_theme_provider';\nimport LoggedIn from 'components/logged_in';\n\nconst OnBoardingTaskList = makeAsyncComponent('OnboardingTaskList', lazy(() => import('components/onboarding_tasklist')));\n\ntype Props = {\n component: React.ComponentType<RouteComponentProps<any>>;\n path: string | string[];\n theme?: Theme; // the routes that send the theme are the ones that will actually need to show the onboarding tasklist\n};\n\nexport default function LoggedInRoute(props: Props) {\n const {component: Component, theme, ...rest} = props;\n\n return (\n <Route\n {...rest}\n render={(routeProps) => (\n <LoggedIn {...routeProps}>\n {theme && (\n <CompassThemeProvider theme={theme}>\n <OnBoardingTaskList/>\n </CompassThemeProvider>\n )}\n <Component {...(routeProps)}/>\n </LoggedIn>\n )}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nconst ANIMATION_DURATION = 500;\n\nexport const TRANSITION_TIMEOUT = {\n enter: ANIMATION_DURATION,\n exit: ANIMATION_DURATION,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo} from 'react';\nimport {Link} from 'react-router-dom';\nimport {CSSTransition} from 'react-transition-group';\n\nimport MainMenu from 'components/main_menu';\n\nimport {Constants} from 'utils/constants';\n\nimport {TRANSITION_TIMEOUT} from './constant';\n\ntype Props = {\n isMobileView: boolean;\n isOpen: boolean;\n teamDisplayName?: string;\n siteName?: string;\n};\n\nconst SidebarRightMenu = ({\n siteName: defaultSiteName,\n teamDisplayName: defaultTeamDisplayName,\n isOpen,\n isMobileView,\n}: Props) => {\n let siteName = '';\n if (defaultSiteName != null) {\n siteName = defaultSiteName;\n }\n let teamDisplayName = siteName;\n if (defaultTeamDisplayName) {\n teamDisplayName = defaultTeamDisplayName;\n }\n\n return (\n <div\n className={classNames('sidebar--menu', {'move--left': isOpen && isMobileView})}\n id='sidebar-menu'\n >\n <div className='team__header theme'>\n <Link\n className='team__name'\n to={`/channels/${Constants.DEFAULT_CHANNEL}`}\n >\n {teamDisplayName}\n </Link>\n </div>\n\n <div className='nav-pills__container mobile-main-menu'>\n <CSSTransition\n in={isOpen && isMobileView}\n classNames='MobileRightSidebarMenu'\n enter={true}\n exit={true}\n mountOnEnter={true}\n unmountOnExit={true}\n timeout={TRANSITION_TIMEOUT}\n >\n <MainMenu mobile={true}/>\n </CSSTransition>\n </div>\n </div>\n );\n};\n\nexport default memo(SidebarRightMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getIsRhsMenuOpen} from 'selectors/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport type {GlobalState} from 'types/store';\n\nimport SidebarMobileRightMenu from './sidebar_mobile_right_menu';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const currentTeam = getCurrentTeam(state);\n\n const siteName = config.SiteName;\n\n return {\n teamDisplayName: currentTeam && currentTeam.display_name,\n isMobileView: getIsMobileView(state),\n isOpen: getIsRhsMenuOpen(state),\n siteName,\n };\n}\n\nexport default connect(mapStateToProps)(SidebarMobileRightMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Settings} from 'luxon';\nimport {useEffect} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\n\nimport {getCurrentLocale} from 'selectors/i18n';\n\nexport default function LuxonController() {\n const locale = useSelector(getCurrentLocale);\n\n useEffect(() => {\n Settings.defaultLocale = locale;\n }, [locale]);\n\n const tz = useSelector(getCurrentTimezone);\n useEffect(() => {\n Settings.defaultZone = tz ?? 'system';\n }, [tz]);\n\n return null;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/**\n * A list mapping IDs or CSS classes to regions of the app. In case of nested regions, these are sorted deepest-first.\n *\n * The region names map to values of model.AcceptedLCPRegions on the server.\n */\nconst elementIdentifiers = [\n\n // Post list\n ['post__content', 'post'],\n ['create_post', 'post_textbox'],\n\n // LHS\n ['SidebarContainer', 'channel_sidebar'],\n ['team-sidebar', 'team_sidebar'],\n\n // Header\n ['channel-header', 'channel_header'],\n ['global-header', 'global_header'],\n ['announcement-bar', 'announcement_bar'],\n\n // Areas of the app\n ['channel_view', 'center_channel'],\n ['modal-content', 'modal_content'],\n] as const satisfies Array<[string, string]>;\n\nexport type ElementIdentifier = 'other' | typeof elementIdentifiers[number][1];\n\nexport function identifyElementRegion(element: Element): ElementIdentifier {\n let currentElement: Element | null = element;\n\n while (currentElement) {\n for (const identifier of elementIdentifiers) {\n if (currentElement.id === identifier[0] || currentElement.classList.contains(identifier[0])) {\n return identifier[1];\n }\n }\n\n currentElement = currentElement.parentElement;\n }\n\n return 'other';\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Store} from 'redux';\nimport {onCLS, onFCP, onINP, onLCP} from 'web-vitals/attribution';\nimport type {INPMetricWithAttribution, LCPMetricWithAttribution, Metric} from 'web-vitals/attribution';\n\nimport type {Client4} from '@mattermost/client';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport type {DesktopAppAPI} from 'utils/desktop_api';\n\nimport type {GlobalState} from 'types/store';\n\nimport {identifyElementRegion} from './element_identification';\nimport type {PerformanceLongTaskTiming} from './long_task';\nimport type {PlatformLabel, UserAgentLabel} from './platform_detection';\nimport {getDesktopAppVersionLabel, getPlatformLabel, getUserAgentLabel} from './platform_detection';\n\nimport {Measure} from '.';\n\ntype PerformanceReportMeasure = {\n\n /**\n * metric is the name of a counter or histogram metric which must match a MetricType constant as defined in\n * model/metrics.go on the server.\n */\n metric: string;\n\n /**\n * value is the floating point value of the metric. It's often a millisecond duration, but it's meaning depends\n * on which metric this is.\n */\n value: number;\n\n /**\n * timestamp is an integer value representing when the metric was measured as a millisecond value. Some browsers\n * use floating point numbers for performance timestamps, so we need to make sure to round this.\n */\n timestamp: number;\n\n /**\n * labels is an optional map of extra labels to attach to the measure. They must be supported constants as defined\n * in model/metrics.go on the server.\n */\n labels?: Record<string, string>;\n}\n\ntype PerformanceReport = {\n version: '0.1.0';\n\n labels: {\n platform: PlatformLabel;\n agent: UserAgentLabel;\n desktop_app_version?: string;\n };\n\n start: number;\n end: number;\n\n counters: PerformanceReportMeasure[];\n histograms: PerformanceReportMeasure[];\n}\n\nexport default class PerformanceReporter {\n private client: Client4;\n private store: Store<GlobalState>;\n\n private desktopAPI: DesktopAppAPI;\n private desktopOffListener?: () => void;\n\n private platformLabel: PlatformLabel;\n private userAgentLabel: UserAgentLabel;\n private desktopAppVersion?: string;\n\n private counters: Map<string, number>;\n private histogramMeasures: PerformanceReportMeasure[];\n\n private observer: PerformanceObserver;\n private reportTimeout: number | undefined;\n\n // These values are protected instead of private so that they can be modified by unit tests\n protected reportPeriodBase = 60 * 1000;\n protected reportPeriodJitter = 15 * 1000;\n\n constructor(client: Client4, store: Store<GlobalState>, desktopAPI: DesktopAppAPI) {\n this.client = client;\n this.store = store;\n this.desktopAPI = desktopAPI;\n\n this.platformLabel = getPlatformLabel();\n this.userAgentLabel = getUserAgentLabel();\n\n // We want to submit by prerelease version if it exists, so we don't muddy up the metrics for the release builds\n this.desktopAppVersion = getDesktopAppVersionLabel(desktopAPI.getAppVersion(), desktopAPI.getPrereleaseVersion());\n\n this.counters = new Map();\n this.histogramMeasures = [];\n\n // This uses a PerformanceObserver to listen for calls to Performance.measure made by frontend code. It's\n // recommended to use an observer rather than to call Performance.getEntriesByName directly\n this.observer = new PerformanceObserver((entries) => this.handleObservations(entries));\n }\n\n public observe() {\n const observedEntryTypes = ['mark', 'measure'];\n if (PerformanceObserver.supportedEntryTypes.includes('longtask')) {\n observedEntryTypes.push('longtask');\n }\n\n this.observer.observe({\n entryTypes: observedEntryTypes,\n });\n\n // Record the page navigation separately because it arrived before we were observing and because you can't use\n // the buffered option for PerformanceObserver with multiple entry types.\n this.measurePageNavigation();\n\n // Register handlers for standard metrics and Web Vitals\n onCLS((metric) => this.handleWebVital(metric));\n onFCP((metric) => this.handleWebVital(metric));\n onINP((metric) => this.handleWebVital(metric));\n onLCP((metric) => this.handleWebVital(metric));\n\n // Periodically send performance telemetry to the server, roughly every minute but with some randomness to\n // avoid overloading the server every minute.\n this.reportTimeout = window.setTimeout(() => this.handleReportTimeout(), this.nextTimeout());\n\n // Send any remaining metrics when the page becomes hidden rather than when it's unloaded because that's\n // what's recommended by various sites due to unload handlers being unreliable, particularly on mobile.\n addEventListener('visibilitychange', this.handleVisibilityChange);\n\n if (!this.desktopAPI.isDev()) {\n this.desktopOffListener = this.desktopAPI.onReceiveMetrics((metrics) => this.collectDesktopAppMetrics(metrics));\n }\n }\n\n private measurePageNavigation() {\n const entries = performance.getEntriesByType('navigation');\n\n if (entries.length === 0) {\n return;\n }\n\n const entry = entries[0];\n const ts = Date.now();\n\n this.histogramMeasures.push({\n metric: Measure.TTFB,\n value: entry.responseStart,\n timestamp: ts,\n });\n this.histogramMeasures.push({\n metric: Measure.TTLB,\n value: entry.responseEnd,\n timestamp: ts,\n });\n this.histogramMeasures.push({\n metric: Measure.DomInteractive,\n value: entry.domInteractive,\n timestamp: ts,\n });\n this.histogramMeasures.push({\n metric: Measure.PageLoad,\n value: entry.duration,\n timestamp: ts,\n });\n }\n\n /**\n * This method is for testing only because we can't clean up the callbacks registered with web-vitals.\n */\n protected disconnect() {\n removeEventListener('visibilitychange', this.handleVisibilityChange);\n\n clearTimeout(this.reportTimeout);\n this.reportTimeout = undefined;\n\n this.observer.disconnect();\n\n this.desktopOffListener?.();\n }\n\n protected handleObservations(list: PerformanceObserverEntryList) {\n for (const entry of list.getEntries()) {\n if (isPerformanceMeasure(entry)) {\n this.handleMeasure(entry);\n } else if (isPerformanceMark(entry)) {\n this.handleMark(entry);\n } else if (isPerformanceLongTask(entry)) {\n this.handleLongTask();\n }\n }\n }\n\n private handleMeasure(entry: PerformanceMeasure) {\n let report;\n try {\n report = Boolean(entry.detail?.report);\n } catch {\n // Measures recorded by browser extensions may be in a separate context which causes accessing\n // entry.detail to throw an error\n report = false;\n }\n\n if (!report) {\n return;\n }\n\n this.histogramMeasures.push({\n metric: entry.name,\n value: entry.duration,\n labels: entry.detail.labels,\n timestamp: Date.now(),\n });\n }\n\n private handleMark(entry: PerformanceMeasure) {\n let report;\n try {\n report = Boolean(entry.detail?.report);\n } catch {\n // Measures recorded by browser extensions may be in a separate context which causes accessing\n // entry.detail to throw an error\n report = false;\n }\n\n if (!report) {\n return;\n }\n\n this.incrementCounter(entry.name);\n }\n\n private handleLongTask() {\n this.incrementCounter('long_tasks');\n }\n\n private incrementCounter(name: string) {\n const current = this.counters.get(name) ?? 0;\n this.counters.set(name, current + 1);\n }\n\n private handleWebVital(metric: Metric) {\n let labels: Record<string, string> | undefined;\n\n if (isLCPMetric(metric)) {\n const selector = metric.attribution?.element;\n const element = selector ? document.querySelector(selector) : null;\n\n if (element) {\n labels = {\n region: identifyElementRegion(element),\n };\n }\n } else if (isINPMetric(metric)) {\n labels = {\n interaction: metric.attribution?.interactionType,\n };\n }\n\n this.histogramMeasures.push({\n metric: metric.name,\n value: metric.value,\n timestamp: Date.now(),\n labels,\n });\n }\n\n private handleReportTimeout() {\n this.maybeSendReport();\n\n this.reportTimeout = window.setTimeout(() => this.handleReportTimeout(), this.nextTimeout());\n }\n\n private handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this.maybeSendReport();\n }\n };\n\n /** Returns a random timeout for the next report, ranging between 45 seconds and 1 minute 15 seconds. */\n private nextTimeout() {\n // Returns a random value between base-jitter and base+jitter\n const jitter = ((2 * Math.random()) - 1) * this.reportPeriodJitter;\n return this.reportPeriodBase + jitter;\n }\n\n private canReportMetrics() {\n const state = this.store.getState();\n\n if (getConfig(state).EnableClientMetrics === 'false') {\n return false;\n }\n\n if (getCurrentUserId(state) === '') {\n return false;\n }\n\n return true;\n }\n\n protected maybeSendReport() {\n const histogramMeasures = this.histogramMeasures;\n this.histogramMeasures = [];\n\n const counters = this.counters;\n this.counters = new Map();\n\n if (histogramMeasures.length === 0 && counters.size === 0) {\n return;\n }\n\n if (!this.canReportMetrics()) {\n return;\n }\n\n this.sendReport(this.generateReport(histogramMeasures, counters));\n }\n\n private generateReport(histogramMeasures: PerformanceReportMeasure[], counters: Map<string, number>): PerformanceReport {\n const now = Date.now();\n\n const counterMeasures = this.countersToMeasures(now, counters);\n\n return {\n version: '0.1.0',\n\n labels: {\n platform: this.platformLabel,\n agent: this.userAgentLabel,\n desktop_app_version: this.desktopAppVersion,\n },\n\n ...this.getReportStartEnd(now, histogramMeasures, counterMeasures),\n\n counters: this.countersToMeasures(now, counters),\n histograms: histogramMeasures,\n };\n }\n\n private getReportStartEnd(now: number, histogramMeasures: PerformanceReportMeasure[], counterMeasures: PerformanceReportMeasure[]): {start: number; end: number} {\n let start = now;\n let end = 0;\n\n for (const measure of histogramMeasures) {\n start = Math.min(start, measure.timestamp);\n end = Math.max(end, measure.timestamp);\n }\n for (const measure of counterMeasures) {\n start = Math.min(start, measure.timestamp);\n end = Math.max(end, measure.timestamp);\n }\n\n return {\n start,\n end,\n };\n }\n\n private countersToMeasures(now: number, counters: Map<string, number>): PerformanceReportMeasure[] {\n const counterMeasures = [];\n\n for (const [name, value] of counters.entries()) {\n counterMeasures.push({\n metric: name,\n value,\n timestamp: now,\n });\n }\n\n return counterMeasures;\n }\n\n private sendReport(report: PerformanceReport) {\n const url = this.client.getClientMetricsRoute();\n const data = JSON.stringify(report);\n\n const beaconSent = this.sendBeacon(url, data);\n\n if (!beaconSent) {\n // The data couldn't be queued as a beacon for some reason, so fall back to sending an immediate fetch\n fetch(url, {method: 'POST', body: data});\n }\n }\n\n protected sendBeacon(url: string | URL, data?: BodyInit | null | undefined): boolean {\n // Confirm that sendBeacon exists because it doesn't on Firefox with certain settings enabled\n if (!navigator.sendBeacon) {\n return false;\n }\n\n return navigator.sendBeacon(url, data);\n }\n\n protected collectDesktopAppMetrics(metricsMap: Map<string, {cpu?: number; memory?: number}>) {\n const now = Date.now();\n\n for (const [processName, metrics] of metricsMap.entries()) {\n let process = processName;\n if (process.startsWith('Server ')) {\n process = 'Server';\n }\n\n if (metrics.cpu) {\n this.histogramMeasures.push({\n metric: 'desktop_cpu',\n timestamp: now,\n labels: {process},\n value: metrics.cpu,\n });\n }\n\n if (metrics.memory) {\n this.histogramMeasures.push({\n metric: 'desktop_memory',\n timestamp: now,\n labels: {process},\n value: metrics.memory,\n });\n }\n }\n }\n}\n\nfunction isPerformanceLongTask(entry: PerformanceEntry): entry is PerformanceLongTaskTiming {\n return entry.entryType === 'longtask';\n}\n\nfunction isPerformanceMark(entry: PerformanceEntry): entry is PerformanceMark {\n return entry.entryType === 'mark';\n}\n\nfunction isPerformanceMeasure(entry: PerformanceEntry): entry is PerformanceMeasure {\n return entry.entryType === 'measure';\n}\n\nfunction isLCPMetric(entry: Metric): entry is LCPMetricWithAttribution {\n return entry.name === 'LCP';\n}\n\nfunction isINPMetric(entry: Metric): entry is INPMetricWithAttribution {\n return entry.name === 'INP';\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as UserAgent from 'utils/user_agent';\n\nexport type PlatformLabel = ReturnType<typeof getPlatformLabel>;\nexport type UserAgentLabel = ReturnType<typeof getUserAgentLabel>;\n\nexport function getPlatformLabel() {\n if (UserAgent.isIos()) {\n return 'ios';\n } else if (UserAgent.isAndroid()) {\n return 'android';\n } else if (UserAgent.isLinux()) {\n return 'linux';\n } else if (UserAgent.isMac()) {\n return 'macos';\n } else if (UserAgent.isWindows()) {\n return 'windows';\n }\n\n return 'other';\n}\n\nexport function getUserAgentLabel() {\n if (UserAgent.isDesktopApp()) {\n return 'desktop';\n } else if (UserAgent.isFirefox() || UserAgent.isIosFirefox()) {\n return 'firefox';\n } else if (UserAgent.isChromiumEdge()) {\n return 'edge';\n } else if (UserAgent.isChrome() || UserAgent.isIosChrome()) {\n return 'chrome';\n } else if (UserAgent.isSafari()) {\n return 'safari';\n }\n\n return 'other';\n}\n\nexport function getDesktopAppVersionLabel(appVersion?: string | null, prereleaseVersion?: string) {\n return prereleaseVersion?.split('.')[0] ?? appVersion ?? 'unknown';\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect, useRef} from 'react';\nimport {useStore} from 'react-redux';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport DesktopAppAPI from 'utils/desktop_api';\nimport PerformanceReporter from 'utils/performance_telemetry/reporter';\n\nexport default function PerformanceReporterController() {\n const store = useStore();\n\n const reporter = useRef<PerformanceReporter>();\n\n useEffect(() => {\n reporter.current = new PerformanceReporter(Client4, store, DesktopAppAPI);\n reporter.current.observe();\n\n // There's no way to clean up web-vitals, so continue to assume that this component won't ever be unmounted\n return () => {\n // eslint-disable-next-line no-console\n console.error('PerformanceReporterController - Component unmounted or store changed');\n };\n }, [store]);\n\n return null;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {IntlProvider as BaseIntlProvider} from 'react-intl';\nimport type {IntlConfig} from 'react-intl';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {setLocalizeFunction} from 'mattermost-redux/utils/i18n_utils';\n\nimport * as I18n from 'i18n/i18n';\nimport {localizeMessage} from 'utils/utils';\n\ntype Props = {\n children: ReactNode;\n locale: IntlConfig['locale'];\n translations?: IntlConfig['messages'];\n actions: {\n loadTranslations: (locale: string, url: string) => void;\n };\n};\n\nexport default class IntlProvider extends React.PureComponent<Props> {\n componentDidMount() {\n // Pass localization function back to mattermost-redux\n setLocalizeFunction(localizeMessage);\n\n this.handleLocaleChange(this.props.locale);\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.locale !== this.props.locale) {\n this.handleLocaleChange(this.props.locale);\n }\n }\n\n handleLocaleChange = (locale: string) => {\n Client4.setAcceptLanguage(locale);\n\n this.loadTranslationsIfNecessary(locale);\n };\n\n loadTranslationsIfNecessary = (locale: string) => {\n if (this.props.translations) {\n // Already loaded\n return;\n }\n const localeInfo = I18n.getLanguageInfo(locale);\n\n if (!localeInfo) {\n return;\n }\n\n this.props.actions.loadTranslations(locale, localeInfo.url);\n };\n\n render() {\n if (!this.props.translations) {\n return null;\n }\n\n return (\n <BaseIntlProvider\n key={this.props.locale}\n locale={this.props.locale}\n messages={this.props.translations}\n textComponent='span'\n wrapRichTextChunksInFragment={false}\n >\n {this.props.children}\n </BaseIntlProvider>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {loadTranslations} from 'actions/views/root';\nimport {getCurrentLocale, getTranslations} from 'selectors/i18n';\n\nimport type {GlobalState} from 'types/store';\n\nimport IntlProvider from './intl_provider';\n\nfunction mapStateToProps(state: GlobalState) {\n const locale = getCurrentLocale(state);\n\n return {\n locale,\n translations: getTranslations(state, locale),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadTranslations,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(IntlProvider);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport IntlProvider from 'components/intl_provider';\n\nimport WebSocketClient from 'client/web_websocket_client';\nimport {WebSocketContext} from 'utils/use_websocket';\n\ntype Props = {\n children: React.ReactNode;\n}\n\nexport default function RootProvider(props: Props) {\n return (\n <IntlProvider>\n <WebSocketContext.Provider value={WebSocketClient}>\n {props.children}\n </WebSocketContext.Provider>\n </IntlProvider>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {Redirect, useHistory, useLocation} from 'react-router-dom';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport * as GlobalActions from 'actions/global_actions';\n\nexport type Props = {\n isElegibleForFirstAdmingOnboarding: boolean;\n currentUserId: string;\n location?: Location;\n isFirstAdmin: boolean;\n areThereTeams: boolean;\n actions: {\n getFirstAdminSetupComplete: () => Promise<ActionResult>;\n };\n}\n\nexport default function RootRedirect(props: Props) {\n const history = useHistory();\n const location = useLocation();\n\n useEffect(() => {\n if (props.currentUserId) {\n if (props.isElegibleForFirstAdmingOnboarding) {\n props.actions.getFirstAdminSetupComplete().then((firstAdminCompletedSignup) => {\n // root.tsx ensures admin profiles are eventually loaded\n if (firstAdminCompletedSignup.data === false && props.isFirstAdmin && !props.areThereTeams) {\n history.push('/preparing-workspace');\n } else {\n GlobalActions.redirectUserToDefaultTeam(new URLSearchParams(location.search));\n }\n });\n } else {\n GlobalActions.redirectUserToDefaultTeam(new URLSearchParams(location.search));\n }\n }\n }, [props.currentUserId, props.isElegibleForFirstAdmingOnboarding]);\n\n if (props.currentUserId) {\n // Ideally, this would be a Redirect like below, but since we need to call an action, this redirect is done above\n return null;\n }\n\n return (\n <Redirect\n to={{\n ...props.location,\n pathname: '/login',\n }}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getFirstAdminSetupComplete} from 'mattermost-redux/actions/general';\nimport {getIsOnboardingFlowEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getActiveTeamsList} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId, isCurrentUserSystemAdmin, isFirstAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport RootRedirect from './root_redirect';\n\nfunction mapStateToProps(state: GlobalState) {\n const onboardingFlowEnabled = getIsOnboardingFlowEnabled(state);\n const teams = getActiveTeamsList(state);\n let isElegibleForFirstAdmingOnboarding = onboardingFlowEnabled;\n if (isElegibleForFirstAdmingOnboarding) {\n isElegibleForFirstAdmingOnboarding = isCurrentUserSystemAdmin(state);\n }\n return {\n currentUserId: getCurrentUserId(state),\n isElegibleForFirstAdmingOnboarding,\n isFirstAdmin: isFirstAdmin(state),\n areThereTeams: Boolean(teams.length),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getFirstAdminSetupComplete,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RootRedirect);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Channel, ChannelStats, ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ChannelMembersDropdown from 'components/channel_members_dropdown';\nimport LoadingScreen from 'components/loading_screen';\nimport SearchableUserList from 'components/searchable_user_list/searchable_user_list_container';\n\nimport Constants from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\n\nconst USERS_PER_PAGE = 50;\n\nexport type Props = {\n currentTeamId: string;\n currentChannelId: string;\n searchTerm: string;\n usersToDisplay: UserProfile[];\n actionUserProps: {\n [userId: string]: {\n channel: Channel;\n teamMember: any;\n channelMember: ChannelMembership;\n };\n };\n totalChannelMembers: number;\n channel: Channel;\n actions: {\n searchProfiles: (term: string, options?: Record<string, unknown>) => Promise<ActionResult<UserProfile[]>>;\n getChannelMembers: (channelId: string) => Promise<ActionResult<ChannelMembership[]>>;\n getChannelStats: (channelId: string) => Promise<ActionResult<ChannelStats>>;\n setModalSearchTerm: (term: string) => void;\n loadProfilesAndTeamMembersAndChannelMembers: (\n page: number,\n perPage: number,\n teamId: string,\n channelId: string,\n options?: any\n ) => Promise<ActionResult>;\n loadStatusesForProfilesList: (users: UserProfile[]) => void;\n loadTeamMembersAndChannelMembersForProfilesList: (\n profiles: UserProfile[],\n teamId: string,\n channelId: string\n ) => Promise<ActionResult>;\n };\n}\n\ntype State = {\n loading: boolean;\n}\n\nexport default class MemberListChannel extends React.PureComponent<Props, State> {\n private searchTimeoutId: number;\n\n constructor(props: Props) {\n super(props);\n\n this.searchTimeoutId = 0;\n\n this.state = {\n loading: true,\n };\n }\n\n async componentDidMount() {\n const {\n actions,\n currentChannelId,\n currentTeamId,\n } = this.props;\n\n await Promise.all([\n actions.loadProfilesAndTeamMembersAndChannelMembers(0, Constants.PROFILE_CHUNK_SIZE, currentTeamId, currentChannelId, {active: true}),\n actions.getChannelMembers(currentChannelId),\n actions.getChannelStats(currentChannelId),\n ]);\n this.loadComplete();\n }\n\n componentWillUnmount() {\n this.props.actions.setModalSearchTerm('');\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.searchTerm !== this.props.searchTerm) {\n clearTimeout(this.searchTimeoutId);\n const searchTerm = this.props.searchTerm;\n\n if (searchTerm === '') {\n this.loadComplete();\n this.searchTimeoutId = 0;\n return;\n }\n\n const searchTimeoutId = window.setTimeout(\n async () => {\n const {data} = await prevProps.actions.searchProfiles(searchTerm, {team_id: this.props.currentTeamId, in_channel_id: this.props.currentChannelId});\n\n if (searchTimeoutId !== this.searchTimeoutId) {\n return;\n }\n\n this.props.actions.loadStatusesForProfilesList(data!);\n this.props.actions.loadTeamMembersAndChannelMembersForProfilesList(data!, this.props.currentTeamId, this.props.currentChannelId).then(({data: membersLoaded}) => {\n if (membersLoaded) {\n this.loadComplete();\n }\n });\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n\n this.searchTimeoutId = searchTimeoutId;\n }\n }\n\n loadComplete = () => {\n this.setState({loading: false});\n };\n\n nextPage = (page: number) => {\n this.props.actions.loadProfilesAndTeamMembersAndChannelMembers(page + 1, USERS_PER_PAGE, '', '', {active: true});\n };\n\n handleSearch = (term: string) => {\n this.props.actions.setModalSearchTerm(term);\n };\n\n render() {\n if (this.state.loading) {\n return (<LoadingScreen/>);\n }\n const channelIsArchived = this.props.channel.delete_at !== 0;\n return (\n <SearchableUserList\n users={this.props.usersToDisplay}\n usersPerPage={USERS_PER_PAGE}\n total={this.props.totalChannelMembers}\n nextPage={this.nextPage}\n search={this.handleSearch}\n actions={channelIsArchived ? [] : [ChannelMembersDropdown]}\n actionUserProps={this.props.actionUserProps}\n focusOnMount={!UserAgent.isMobile()}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getChannelStats, getChannelMembers} from 'mattermost-redux/actions/channels';\nimport {searchProfiles} from 'mattermost-redux/actions/users';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getMembersInCurrentChannel, getCurrentChannelStats, getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getMembersInCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {searchProfilesInCurrentChannel, getProfilesInCurrentChannel} from 'mattermost-redux/selectors/entities/users';\nimport {sortByUsername} from 'mattermost-redux/utils/user_utils';\n\nimport {loadStatusesForProfilesList} from 'actions/status_actions';\nimport {\n loadProfilesAndTeamMembersAndChannelMembers,\n loadTeamMembersAndChannelMembersForProfilesList,\n} from 'actions/user_actions';\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport MemberListChannel from './member_list_channel';\n\nconst getUsersAndActionsToDisplay = createSelector(\n 'getUsersAndActionsToDisplay',\n (state: GlobalState, users: UserProfile[]) => users,\n getMembersInCurrentTeam,\n getMembersInCurrentChannel,\n getCurrentChannel,\n (users = [], teamMembers = {}, channelMembers = {}, channel) => {\n const actionUserProps: {\n [userId: string]: {\n channel: Channel;\n teamMember: any;\n channelMember: ChannelMembership;\n };\n } = {};\n const usersToDisplay: UserProfile[] = [];\n\n if (!channel) {\n return {\n usersToDisplay,\n actionUserProps,\n };\n }\n for (let i = 0; i < users.length; i++) {\n const user = users[i];\n\n if (teamMembers[user.id] && channelMembers[user.id] && user.delete_at === 0) {\n usersToDisplay.push(user);\n\n actionUserProps[user.id] = {\n channel,\n teamMember: teamMembers[user.id],\n channelMember: channelMembers[user.id],\n };\n }\n }\n\n return {\n usersToDisplay: usersToDisplay.sort(sortByUsername),\n actionUserProps,\n };\n },\n);\n\nfunction mapStateToProps(state: GlobalState) {\n const searchTerm = state.views.search.modalSearch;\n\n let users;\n if (searchTerm) {\n users = searchProfilesInCurrentChannel(state, searchTerm);\n } else {\n users = getProfilesInCurrentChannel(state);\n }\n\n const stats = getCurrentChannelStats(state) || {member_count: 0};\n\n return {\n ...getUsersAndActionsToDisplay(state, users),\n currentTeamId: state.entities.teams.currentTeamId,\n currentChannelId: state.entities.channels.currentChannelId,\n searchTerm,\n totalChannelMembers: stats.member_count,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getChannelMembers,\n searchProfiles,\n getChannelStats,\n setModalSearchTerm,\n loadProfilesAndTeamMembersAndChannelMembers,\n loadStatusesForProfilesList,\n loadTeamMembersAndChannelMembersForProfilesList,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MemberListChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport MemberListChannel from 'components/member_list_channel';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\ntype Props = {\n\n /**\n * Bool whether user has permission to manage current channel\n */\n canManageChannelMembers: boolean;\n\n /**\n * Object with info about current channel\n */\n channel: Channel;\n\n /**\n * Function that is called after the modal is hidden\n */\n onExited: () => void;\n\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n}\n\ntype State = {\n show: boolean;\n}\n\nexport default class ChannelMembersModal extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n show: true,\n };\n }\n\n handleHide = () => {\n this.setState({show: false});\n };\n\n onAddNewMembersButton = () => {\n const {channel, actions} = this.props;\n\n actions.openModal({\n modalId: ModalIdentifiers.CHANNEL_INVITE,\n dialogType: ChannelInviteModal,\n dialogProps: {channel},\n });\n\n this.handleHide();\n };\n\n render() {\n const channelIsArchived = this.props.channel.delete_at !== 0;\n return (\n <div>\n <Modal\n dialogClassName='a11y__modal more-modal more-modal--action'\n show={this.state.show}\n onHide={this.handleHide}\n onExited={this.props.onExited}\n role='none'\n aria-labelledby='channelMembersModalLabel'\n id='channelMembersModal'\n >\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='channelMembersModalLabel'\n >\n <span className='name'>{this.props.channel.display_name}</span>\n <FormattedMessage\n id='channel_members_modal.members'\n defaultMessage=' Members'\n />\n </Modal.Title>\n {this.props.canManageChannelMembers && !channelIsArchived &&\n <a\n id='showInviteModal'\n className='btn btn-md btn-primary'\n href='#'\n onClick={this.onAddNewMembersButton}\n >\n <FormattedMessage\n id='channel_members_modal.addNew'\n defaultMessage=' Add Members'\n />\n </a>\n }\n </Modal.Header>\n <Modal.Body>\n <MemberListChannel\n channel={this.props.channel}\n />\n </Modal.Body>\n </Modal>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {canManageChannelMembers} from 'mattermost-redux/selectors/entities/channels';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelMembersModal from './channel_members_modal';\n\nconst mapStateToProps = (state: GlobalState) => ({\n canManageChannelMembers: canManageChannelMembers(state),\n});\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n actions: bindActionCreators({openModal}, dispatch),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelMembersModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {IntegrationTypes} from 'mattermost-redux/action_types';\n\nimport {openModal} from 'actions/views/modals';\nimport store from 'stores/redux_store';\n\nimport InteractiveDialog from 'components/interactive_dialog';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nexport function openInteractiveDialog(dialog: any): void {\n store.dispatch({type: IntegrationTypes.RECEIVED_DIALOG, data: dialog});\n\n store.dispatch(openModal({modalId: ModalIdentifiers.INTERACTIVE_DIALOG, dialogType: InteractiveDialog}));\n}\n\n// This code is problematic for a couple of different reasons:\n// * it monitors the store to modify the store: this is perhaps better handled by a saga\n// * it makes importing this file impure by triggering a side-effect which may not be obvious\n// * it's not really located in the \"right place\": dialogs are applicable to non-plugins too\n// * it's nigh impossible to test as written\n//\n// It's worth fixing all of this, but I think this requires some refactoring.\nlet previousTriggerId = '';\nstore.subscribe(() => {\n const state = store.getState();\n const currentTriggerId = state.entities.integrations.dialogTriggerId;\n\n if (currentTriggerId === previousTriggerId) {\n return;\n }\n\n previousTriggerId = currentTriggerId;\n\n const dialog = state.entities.integrations.dialog || {};\n if (dialog.trigger_id !== currentTriggerId) {\n return;\n }\n\n store.dispatch(openModal({modalId: ModalIdentifiers.INTERACTIVE_DIALOG, dialogType: InteractiveDialog}));\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Textbox from 'components/textbox';\nimport type BaseTextbox from 'components/textbox/textbox';\n\ntype Props = Omit<React.ComponentPropsWithRef<typeof Textbox>, 'suggestionListPosition'> & {\n suggestionListStyle?: React.ComponentPropsWithRef<typeof Textbox>['suggestionListPosition'];\n}\n\nconst PluginTextbox = React.forwardRef((props: Props, ref?: React.Ref<BaseTextbox>) => {\n const {\n suggestionListStyle,\n ...otherProps\n } = props;\n\n return (\n <Textbox\n ref={ref}\n suggestionListPosition={suggestionListStyle}\n {...otherProps}\n />\n );\n});\n\nexport default PluginTextbox;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {notifyMe} from 'actions/notification_actions';\nimport {openModal} from 'actions/views/modals';\nimport {closeRightHandSide, selectPostById} from 'actions/views/rhs';\nimport {getSelectedPostId, getIsRhsOpen} from 'selectors/rhs';\n\nimport AdvancedTextEditor from 'components/advanced_text_editor/advanced_text_editor';\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport ChannelMembersModal from 'components/channel_members_modal';\nimport {openPricingModal} from 'components/global_header/right_controls/plan_upgrade_button';\nimport {useNotifyAdmin} from 'components/notify_admin_cta/notify_admin_cta';\nimport PostMessagePreview from 'components/post_view/post_message_preview';\nimport StartTrialFormModal from 'components/start_trial_form_modal';\nimport ThreadViewer from 'components/threading/thread_viewer';\nimport Timestamp from 'components/timestamp';\nimport UserSettingsModal from 'components/user_settings/modal';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport {getHistory} from 'utils/browser_history';\nimport {ModalIdentifiers} from 'utils/constants';\nimport DesktopApp from 'utils/desktop_api';\nimport messageHtmlToComponent from 'utils/message_html_to_component';\nimport * as NotificationSounds from 'utils/notification_sounds';\nimport {formatText} from 'utils/text_formatting';\nimport {useWebSocket, useWebSocketClient, WebSocketContext} from 'utils/use_websocket';\nimport {imageURLForUser} from 'utils/utils';\n\nimport {openInteractiveDialog} from './interactive_dialog'; // This import has intentional side effects. Do not remove without research.\nimport Textbox from './textbox';\n\ninterface WindowWithLibraries {\n React: typeof import('react');\n ReactDOM: typeof import('react-dom');\n ReactIntl: typeof import('react-intl');\n Redux: typeof import('redux');\n ReactRedux: typeof import('react-redux');\n ReactBootstrap: typeof import('react-bootstrap');\n ReactRouterDom: typeof import('react-router-dom');\n PropTypes: typeof import('prop-types');\n Luxon: typeof import('luxon');\n StyledComponents: typeof import('styled-components');\n PostUtils: {\n formatText: typeof formatText;\n messageHtmlToComponent: (html: string, ...args: any[]) => JSX.Element;\n };\n openInteractiveDialog: typeof openInteractiveDialog;\n useNotifyAdmin: typeof useNotifyAdmin;\n WebappUtils: {\n modals: {\n openModal: typeof openModal;\n ModalIdentifiers: typeof ModalIdentifiers;\n };\n notificationSounds: {\n ring: typeof NotificationSounds.ring;\n stopRing: typeof NotificationSounds.stopRing;\n };\n sendDesktopNotificationToMe: typeof notifyMe;\n openUserSettings: (dialogProps: any) => void;\n browserHistory: ReturnType<typeof getHistory>;\n };\n openPricingModal: () => typeof openPricingModal;\n Components: {\n Textbox: typeof Textbox;\n Timestamp: typeof Timestamp;\n ChannelInviteModal: typeof ChannelInviteModal;\n ChannelMembersModal: typeof ChannelMembersModal;\n Avatar: typeof Avatar;\n imageURLForUser: typeof imageURLForUser;\n BotBadge: typeof BotTag;\n StartTrialFormModal: typeof StartTrialFormModal;\n ThreadViewer: typeof ThreadViewer;\n PostMessagePreview: typeof PostMessagePreview;\n AdvancedTextEditor: typeof AdvancedTextEditor;\n };\n ProductApi: {\n useWebSocket: typeof useWebSocket;\n useWebSocketClient: typeof useWebSocketClient;\n WebSocketProvider: typeof WebSocketContext;\n closeRhs: typeof closeRightHandSide;\n selectRhsPost: typeof selectPostById;\n getRhsSelectedPostId: typeof getSelectedPostId;\n getIsRhsOpen: typeof getIsRhsOpen;\n };\n DesktopApp: typeof DesktopApp;\n}\ndeclare let window: WindowWithLibraries;\n\n// Common libraries exposed on window for plugins to use as Webpack externals.\nwindow.React = require('react');\nwindow.ReactDOM = require('react-dom');\nwindow.ReactIntl = require('react-intl');\nwindow.Redux = require('redux');\nwindow.ReactRedux = require('react-redux');\nwindow.ReactBootstrap = require('react-bootstrap');\nwindow.ReactRouterDom = require('react-router-dom');\nwindow.PropTypes = require('prop-types');\nwindow.Luxon = require('luxon');\nwindow.StyledComponents = require('styled-components');\n\n// Functions exposed on window for plugins to use.\nwindow.PostUtils = {\n formatText,\n messageHtmlToComponent: (html: string, ...otherArgs: any[]) => {\n // Previously, this function took an extra isRHS argument as the second parameter. For backwards compatibility,\n // support calling this as either messageHtmlToComponent(html, options) or messageHtmlToComponent(html, isRhs, options)\n\n let options;\n if (otherArgs.length === 2) {\n options = otherArgs[1];\n } else if (otherArgs.length === 1 && typeof otherArgs[0] === 'object') {\n options = otherArgs[0];\n }\n\n return messageHtmlToComponent(html, options);\n },\n};\nwindow.openInteractiveDialog = openInteractiveDialog;\nwindow.useNotifyAdmin = useNotifyAdmin;\nwindow.WebappUtils = {\n get browserHistory() {\n return getHistory();\n },\n modals: {openModal, ModalIdentifiers},\n notificationSounds: {ring: NotificationSounds.ring, stopRing: NotificationSounds.stopRing},\n sendDesktopNotificationToMe: notifyMe,\n openUserSettings: (dialogProps) => openModal({\n modalId: ModalIdentifiers.USER_SETTINGS,\n dialogType: UserSettingsModal,\n dialogProps,\n }),\n};\n\n// This need to be a function because `openPricingModal`\n// is initialized when `UpgradeCloudButton` is loaded.\n// So if we export `openPricingModal` directly, it will be locked\n// to the initial value of undefined.\nwindow.openPricingModal = () => openPricingModal;\n\n// Components exposed on window FOR INTERNAL PLUGIN USE ONLY. These components may have breaking changes in the future\n// outside of major releases. They will be replaced by common components once that project is more mature and able to\n// guarantee better compatibility.\nwindow.Components = {\n Textbox,\n Timestamp,\n ChannelInviteModal,\n ChannelMembersModal,\n Avatar,\n imageURLForUser,\n BotBadge: BotTag,\n StartTrialFormModal,\n ThreadViewer,\n PostMessagePreview,\n AdvancedTextEditor,\n};\n\n// This is a prototype of the Product API for use by internal plugins only while we transition to the proper architecture\n// for them using module federation.\nwindow.ProductApi = {\n useWebSocket,\n useWebSocketClient,\n WebSocketProvider: WebSocketContext,\n closeRhs: closeRightHandSide,\n selectRhsPost: selectPostById,\n getRhsSelectedPostId: getSelectedPostId,\n getIsRhsOpen,\n};\n\n// Desktop App module containing the app info and a series of helpers to work with legacy code\nwindow.DesktopApp = DesktopApp;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport deepEqual from 'fast-deep-equal';\nimport React, {lazy} from 'react';\nimport {Route, Switch, Redirect} from 'react-router-dom';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport {ServiceEnvironment} from '@mattermost/types/config';\n\nimport {setSystemEmojis} from 'mattermost-redux/actions/emojis';\nimport {setUrl} from 'mattermost-redux/actions/general';\nimport {Client4} from 'mattermost-redux/client';\nimport {rudderAnalytics, RudderTelemetryHandler} from 'mattermost-redux/client/rudder';\nimport {Preferences} from 'mattermost-redux/constants';\n\nimport {measurePageLoadTelemetry, temporarilySetPageLoadContext, trackEvent, trackSelectorMetrics} from 'actions/telemetry_actions.jsx';\nimport BrowserStore from 'stores/browser_store';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport GlobalHeader from 'components/global_header/global_header';\nimport {HFRoute} from 'components/header_footer_route/header_footer_route';\nimport {HFTRoute, LoggedInHFTRoute} from 'components/header_footer_template_route';\nimport InitialLoadingScreen from 'components/initial_loading_screen';\nimport LoggedIn from 'components/logged_in';\nimport LoggedInRoute from 'components/logged_in_route';\nimport {LAUNCHING_WORKSPACE_FULLSCREEN_Z_INDEX} from 'components/preparing_workspace/launching_workspace';\nimport {Animations} from 'components/preparing_workspace/steps';\nimport SidebarMobileRightMenu from 'components/sidebar_mobile_right_menu';\n\nimport webSocketClient from 'client/web_websocket_client';\nimport {initializePlugins} from 'plugins';\nimport 'utils/a11y_controller_instance';\nimport {PageLoadContext, SCHEDULED_POST_URL_SUFFIX} from 'utils/constants';\nimport DesktopApp from 'utils/desktop_api';\nimport {EmojiIndicesByAlias} from 'utils/emoji';\nimport {TEAM_NAME_PATH_PATTERN} from 'utils/path';\nimport {getSiteURL} from 'utils/url';\nimport {isAndroidWeb, isChromebook, isDesktopApp, isIosWeb} from 'utils/user_agent';\nimport {applyTheme, isTextDroppableEvent} from 'utils/utils';\n\nimport LuxonController from './luxon_controller';\nimport PerformanceReporterController from './performance_reporter_controller';\nimport RootProvider from './root_provider';\nimport RootRedirect from './root_redirect';\n\nimport type {PropsFromRedux} from './index';\n\nimport 'plugins/export';\n\nconst MobileViewWatcher = makeAsyncComponent('MobileViewWatcher', lazy(() => import('components/mobile_view_watcher')));\nconst WindowSizeObserver = makeAsyncComponent('WindowSizeObserver', lazy(() => import('components/window_size_observer/WindowSizeObserver')));\nconst ErrorPage = makeAsyncComponent('ErrorPage', lazy(() => import('components/error_page')));\nconst Login = makeAsyncComponent('LoginController', lazy(() => import('components/login/login')));\nconst AccessProblem = makeAsyncComponent('AccessProblem', lazy(() => import('components/access_problem')));\nconst PasswordResetSendLink = makeAsyncComponent('PasswordResedSendLink', lazy(() => import('components/password_reset_send_link')));\nconst PasswordResetForm = makeAsyncComponent('PasswordResetForm', lazy(() => import('components/password_reset_form')));\nconst Signup = makeAsyncComponent('SignupController', lazy(() => import('components/signup/signup')));\nconst ShouldVerifyEmail = makeAsyncComponent('ShouldVerifyEmail', lazy(() => import('components/should_verify_email/should_verify_email')));\nconst DoVerifyEmail = makeAsyncComponent('DoVerifyEmail', lazy(() => import('components/do_verify_email/do_verify_email')));\nconst ClaimController = makeAsyncComponent('ClaimController', lazy(() => import('components/claim')));\nconst TermsOfService = makeAsyncComponent('TermsOfService', lazy(() => import('components/terms_of_service')));\nconst LinkingLandingPage = makeAsyncComponent('LinkingLandingPage', lazy(() => import('components/linking_landing_page')));\nconst AdminConsole = makeAsyncComponent('AdminConsole', lazy(() => import('components/admin_console')));\nconst SelectTeam = makeAsyncComponent('SelectTeam', lazy(() => import('components/select_team')));\nconst Authorize = makeAsyncComponent('Authorize', lazy(() => import('components/authorize')));\nconst CreateTeam = makeAsyncComponent('CreateTeam', lazy(() => import('components/create_team')));\nconst Mfa = makeAsyncComponent('Mfa', lazy(() => import('components/mfa/mfa_controller')));\nconst PreparingWorkspace = makeAsyncComponent('PreparingWorkspace', lazy(() => import('components/preparing_workspace')));\nconst Pluggable = makeAsyncComponent('Pluggable', lazy(() => import('plugins/pluggable')));\nconst LaunchingWorkspace = makeAsyncComponent('LaunchingWorkspace', lazy(() => import('components/preparing_workspace/launching_workspace')));\nconst CompassThemeProvider = makeAsyncComponent('CompassThemeProvider', lazy(() => import('components/compass_theme_provider/compass_theme_provider')));\nconst TeamController = makeAsyncComponent('TeamController', lazy(() => import('components/team_controller')));\nconst AnnouncementBarController = makeAsyncComponent('AnnouncementBarController', lazy(() => import('components/announcement_bar')));\nconst SystemNotice = makeAsyncComponent('SystemNotice', lazy(() => import('components/system_notice')));\nconst CloudEffects = makeAsyncComponent('CloudEffects', lazy(() => import('components/cloud_effects')));\nconst TeamSidebar = makeAsyncComponent('TeamSidebar', lazy(() => import('components/team_sidebar')));\nconst SidebarRight = makeAsyncComponent('SidebarRight', lazy(() => import('components/sidebar_right')));\nconst ModalController = makeAsyncComponent('ModalController', lazy(() => import('components/modal_controller')));\nconst AppBar = makeAsyncComponent('AppBar', lazy(() => import('components/app_bar/app_bar')));\nconst ComponentLibrary = makeAsyncComponent('ComponentLibrary', lazy(() => import('components/component_library')));\n\nconst noop = () => {};\n\nexport type Props = PropsFromRedux & RouteComponentProps;\n\ninterface State {\n shouldMountAppRoutes?: boolean;\n}\n\nexport default class Root extends React.PureComponent<Props, State> {\n // The constructor adds a bunch of event listeners,\n // so we do need this.\n constructor(props: Props) {\n super(props);\n\n setUrl(getSiteURL());\n\n // Disable auth header to enable CSRF check\n Client4.setAuthHeader = false;\n\n setSystemEmojis(new Set(EmojiIndicesByAlias.keys()));\n\n this.state = {\n shouldMountAppRoutes: false,\n };\n }\n\n setRudderConfig = () => {\n const telemetryId = this.props.telemetryId;\n\n const rudderUrl = 'https://pdat.matterlytics.com';\n let rudderKey = '';\n switch (this.props.serviceEnvironment) {\n case ServiceEnvironment.PRODUCTION:\n rudderKey = '1aoejPqhgONMI720CsBSRWzzRQ9';\n break;\n case ServiceEnvironment.TEST:\n rudderKey = '1aoeoCDeh7OCHcbW2kseWlwUFyq';\n break;\n case ServiceEnvironment.DEV:\n break;\n }\n\n if (rudderKey !== '' && this.props.telemetryEnabled) {\n const rudderCfg: {setCookieDomain?: string} = {};\n if (this.props.siteURL !== '') {\n try {\n rudderCfg.setCookieDomain = new URL(this.props.siteURL || '').hostname;\n } catch (_) {\n // eslint-disable-next-line no-console\n console.error('Failed to set cookie domain for RudderStack');\n }\n }\n\n rudderAnalytics.load(rudderKey, rudderUrl || '', rudderCfg);\n\n rudderAnalytics.identify(telemetryId, {}, {\n context: {\n ip: '0.0.0.0',\n },\n page: {\n path: '',\n referrer: '',\n search: '',\n title: '',\n url: '',\n },\n anonymousId: '00000000000000000000000000',\n });\n\n rudderAnalytics.page('ApplicationLoaded', {\n path: '',\n referrer: '',\n search: ('' as any),\n title: '',\n url: '',\n } as any,\n {\n context: {\n ip: '0.0.0.0',\n },\n anonymousId: '00000000000000000000000000',\n });\n\n const utmParams = this.captureUTMParams();\n rudderAnalytics.ready(() => {\n Client4.setTelemetryHandler(new RudderTelemetryHandler());\n if (utmParams) {\n trackEvent('utm_params', 'utm_params', utmParams);\n }\n });\n }\n };\n\n onConfigLoaded = () => {\n Promise.all([\n this.props.actions.initializeProducts(),\n initializePlugins(),\n ]).then(() => {\n this.setState({shouldMountAppRoutes: true});\n });\n\n this.props.actions.migrateRecentEmojis();\n this.props.actions.loadRecentlyUsedCustomEmojis();\n\n this.showLandingPageIfNecessary();\n\n this.applyTheme();\n };\n\n private showLandingPageIfNecessary = () => {\n // Only show Landing Page if enabled\n if (!this.props.enableDesktopLandingPage) {\n return;\n }\n\n // We have nothing to redirect to if we're already on Desktop App\n // Chromebook has no Desktop App to switch to\n if (isDesktopApp() || isChromebook()) {\n return;\n }\n\n // Nothing to link to if we've removed the Android App download link\n if (isAndroidWeb() && !this.props.androidDownloadLink) {\n return;\n }\n\n // Nothing to link to if we've removed the iOS App download link\n if (isIosWeb() && !this.props.iosDownloadLink) {\n return;\n }\n\n // Nothing to link to if we've removed the Desktop App download link\n if (!this.props.appDownloadLink) {\n return;\n }\n\n // Only show the landing page once\n if (BrowserStore.hasSeenLandingPage()) {\n return;\n }\n\n // We don't want to show when resetting the password\n if (this.props.location.pathname === '/reset_password_complete') {\n return;\n }\n\n // We don't want to show when we're doing Desktop App external login\n if (this.props.location.pathname === '/login/desktop') {\n return;\n }\n\n // Stop this infinitely redirecting\n if (this.props.location.pathname.includes('/landing')) {\n return;\n }\n\n // Disabled to avoid breaking the CWS flow\n if (this.props.isCloud) {\n return;\n }\n\n // Disable for Rainforest tests\n if (window.location.hostname?.endsWith('.test.mattermost.com')) {\n return;\n }\n\n this.props.history.push('/landing#' + this.props.location.pathname + this.props.location.search);\n BrowserStore.setLandingPageSeen(true);\n };\n\n applyTheme() {\n // don't apply theme when in system console; system console hardcoded to THEMES.denim\n // AdminConsole will apply denim on mount re-apply user theme on unmount\n if (this.props.location.pathname.startsWith('/admin_console')) {\n return;\n }\n\n applyTheme(this.props.theme);\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n if (!deepEqual(prevProps.theme, this.props.theme)) {\n this.applyTheme();\n }\n\n if (this.props.location.pathname === '/') {\n if (this.props.noAccounts) {\n prevProps.history.push('/signup_user_complete');\n } else if (this.props.showTermsOfService) {\n prevProps.history.push('/terms_of_service');\n }\n }\n\n if (\n this.props.shouldShowAppBar !== prevProps.shouldShowAppBar ||\n this.props.rhsIsOpen !== prevProps.rhsIsOpen ||\n this.props.rhsIsExpanded !== prevProps.rhsIsExpanded\n ) {\n this.setRootMeta();\n }\n\n if (!prevProps.isConfigLoaded && this.props.isConfigLoaded) {\n this.setRudderConfig();\n }\n\n if (prevState.shouldMountAppRoutes === false && this.state.shouldMountAppRoutes === true) {\n if (!doesRouteBelongToTeamControllerRoutes(this.props.location.pathname)) {\n DesktopApp.reactAppInitialized();\n InitialLoadingScreen.stop('root');\n }\n }\n }\n\n captureUTMParams() {\n const qs = new URLSearchParams(window.location.search);\n\n // list of key that we want to track\n const keys = ['utm_source', 'utm_medium', 'utm_campaign'];\n\n const campaign = keys.reduce((acc, key) => {\n if (qs.has(key)) {\n const value = qs.get(key);\n if (value) {\n acc[key] = value;\n }\n qs.delete(key);\n }\n return acc;\n }, {} as Record<string, string>);\n\n if (Object.keys(campaign).length > 0) {\n this.props.history.replace({search: qs.toString()});\n return campaign;\n }\n return null;\n }\n\n initiateMeRequests = async () => {\n const {isLoaded, isMeRequested} = await this.props.actions.loadConfigAndMe();\n\n if (isLoaded) {\n const isUserAtRootRoute = this.props.location.pathname === '/';\n\n if (isUserAtRootRoute) {\n if (isMeRequested) {\n this.props.actions.redirectToOnboardingOrDefaultTeam(this.props.history, new URLSearchParams(this.props.location.search));\n } else if (this.props.noAccounts) {\n this.props.history.push('/signup_user_complete');\n }\n }\n\n this.onConfigLoaded();\n }\n };\n\n handleDropEvent = (e: DragEvent) => {\n if (e.dataTransfer && e.dataTransfer.items.length > 0 && e.dataTransfer.items[0].kind === 'file') {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n handleDragOverEvent = (e: DragEvent) => {\n if (!isTextDroppableEvent(e) && !document.body.classList.contains('focalboard-body')) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n componentDidMount() {\n temporarilySetPageLoadContext(PageLoadContext.PAGE_LOAD);\n\n this.initiateMeRequests();\n\n measurePageLoadTelemetry();\n trackSelectorMetrics();\n\n // Force logout of all tabs if one tab is logged out\n window.addEventListener('storage', this.handleLogoutLoginSignal);\n\n // Prevent drag and drop files from navigating away from the app\n document.addEventListener('drop', this.handleDropEvent);\n\n document.addEventListener('dragover', this.handleDragOverEvent);\n }\n\n componentWillUnmount() {\n window.removeEventListener('storage', this.handleLogoutLoginSignal);\n document.removeEventListener('drop', this.handleDropEvent);\n document.removeEventListener('dragover', this.handleDragOverEvent);\n }\n\n handleLogoutLoginSignal = (e: StorageEvent) => {\n this.props.actions.handleLoginLogoutSignal(e);\n };\n\n setRootMeta = () => {\n const root = document.getElementById('root')!;\n\n for (const [className, enabled] of Object.entries({\n 'app-bar-enabled': this.props.shouldShowAppBar,\n 'rhs-open': this.props.rhsIsOpen,\n 'rhs-open-expanded': this.props.rhsIsExpanded,\n })) {\n root.classList.toggle(className, enabled);\n }\n };\n\n render() {\n if (!this.state.shouldMountAppRoutes) {\n return <div/>;\n }\n\n return (\n <RootProvider>\n <MobileViewWatcher/>\n <LuxonController/>\n <PerformanceReporterController/>\n <Switch>\n <Route\n path={'/error'}\n component={ErrorPage}\n />\n <HFRoute\n path={'/login'}\n component={Login}\n />\n <HFRoute\n path={'/access_problem'}\n component={AccessProblem}\n />\n <HFTRoute\n path={'/reset_password'}\n component={PasswordResetSendLink}\n />\n <HFTRoute\n path={'/reset_password_complete'}\n component={PasswordResetForm}\n />\n <HFRoute\n path={'/signup_user_complete'}\n component={Signup}\n />\n <HFRoute\n path={'/should_verify_email'}\n component={ShouldVerifyEmail}\n />\n <HFRoute\n path={'/do_verify_email'}\n component={DoVerifyEmail}\n />\n <HFTRoute\n path={'/claim'}\n component={ClaimController}\n />\n <LoggedInRoute\n path={'/terms_of_service'}\n component={TermsOfService}\n />\n <Route\n path={'/landing'}\n component={LinkingLandingPage}\n />\n {this.props.isDevModeEnabled && (\n <Route\n path={'/component_library'}\n component={ComponentLibrary}\n />\n )}\n <Route\n path={'/admin_console'}\n >\n <Switch>\n <LoggedInRoute\n theme={Preferences.THEMES.denim}\n path={'/admin_console'}\n component={AdminConsole}\n />\n <RootRedirect/>\n </Switch>\n </Route>\n <LoggedInHFTRoute\n path={'/select_team'}\n component={SelectTeam}\n />\n <LoggedInHFTRoute\n path={'/oauth/authorize'}\n component={Authorize}\n />\n <LoggedInHFTRoute\n path={'/create_team'}\n component={CreateTeam}\n />\n <LoggedInRoute\n path={'/mfa'}\n component={Mfa}\n />\n <LoggedInRoute\n path={'/preparing-workspace'}\n component={PreparingWorkspace}\n />\n <Redirect\n from={'/_redirect/integrations/:subpath*'}\n to={`/${this.props.permalinkRedirectTeamName}/integrations/:subpath*`}\n />\n <Redirect\n from={'/_redirect/pl/:postid'}\n to={`/${this.props.permalinkRedirectTeamName}/pl/:postid`}\n />\n <CompassThemeProvider theme={this.props.theme}>\n {(this.props.showLaunchingWorkspace && !this.props.location.pathname.includes('/preparing-workspace') &&\n <LaunchingWorkspace\n fullscreen={true}\n zIndex={LAUNCHING_WORKSPACE_FULLSCREEN_Z_INDEX}\n show={true}\n onPageView={noop}\n transitionDirection={Animations.Reasons.EnterFromBefore}\n />\n )}\n <WindowSizeObserver/>\n <ModalController/>\n <AnnouncementBarController/>\n <SystemNotice/>\n <GlobalHeader/>\n <CloudEffects/>\n <TeamSidebar/>\n <div className='main-wrapper'>\n <Switch>\n {this.props.products?.filter((product) => Boolean(product.publicComponent)).map((product) => (\n <Route\n key={`${product.id}-public`}\n path={`${product.baseURL}/public`}\n render={(props) => {\n return (\n <Pluggable\n pluggableName={'Product'}\n subComponentName={'publicComponent'}\n pluggableId={product.id}\n css={{gridArea: 'center'}}\n {...props}\n />\n );\n }}\n />\n ))}\n {this.props.products?.map((product) => (\n <Route\n key={product.id}\n path={product.baseURL}\n render={(props) => {\n let pluggable = (\n <Pluggable\n pluggableName={'Product'}\n subComponentName={'mainComponent'}\n pluggableId={product.id}\n webSocketClient={webSocketClient}\n css={product.wrapped ? undefined : {gridArea: 'center'}}\n />\n );\n if (product.wrapped) {\n pluggable = (\n <div className={classNames(['product-wrapper', {wide: !product.showTeamSidebar}])}>\n {pluggable}\n </div>\n );\n }\n return (\n <LoggedIn {...props}>\n {pluggable}\n </LoggedIn>\n );\n }}\n />\n ))}\n {this.props.plugins?.map((plugin) => (\n <Route\n key={plugin.id}\n path={'/plug/' + (plugin as any).route}\n render={() => (\n <Pluggable\n pluggableName={'CustomRouteComponent'}\n pluggableId={plugin.id}\n css={{gridArea: 'center'}}\n />\n )}\n />\n ))}\n <LoggedInRoute\n theme={this.props.theme}\n path={`/:team(${TEAM_NAME_PATH_PATTERN})`}\n component={TeamController}\n />\n <RootRedirect/>\n </Switch>\n <SidebarRight/>\n </div>\n <Pluggable pluggableName='Global'/>\n <AppBar/>\n <SidebarMobileRightMenu/>\n </CompassThemeProvider>\n </Switch>\n </RootProvider>\n );\n }\n}\n\nexport function doesRouteBelongToTeamControllerRoutes(pathname: RouteComponentProps['location']['pathname']): boolean {\n // Note: we have specifically added admin_console to the negative lookahead as admin_console can have integrations as subpaths (admin_console/integrations/bot_accounts)\n // and we don't want to treat those as team controller routes.\n const TEAM_CONTROLLER_PATH_PATTERN = new RegExp(`^/(?!admin_console)([a-z0-9\\\\-_]+)/(channels|messages|threads|drafts|integrations|emoji|${SCHEDULED_POST_URL_SUFFIX})(/.*)?$`);\n\n return TEAM_CONTROLLER_PATH_PATTERN.test(pathname);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport isEmpty from 'lodash/isEmpty';\nimport type {ConnectedProps} from 'react-redux';\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getFirstAdminSetupComplete} from 'mattermost-redux/actions/general';\nimport {getProfiles} from 'mattermost-redux/actions/users';\nimport {isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {shouldShowTermsOfService, getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadRecentlyUsedCustomEmojis, migrateRecentEmojis} from 'actions/emoji_actions';\nimport {isDevModeEnabled} from 'selectors/general';\nimport {getShowLaunchingWorkspace} from 'selectors/onboarding';\nimport {shouldShowAppBar} from 'selectors/plugins';\nimport {\n getIsRhsExpanded,\n getIsRhsOpen,\n getRhsState,\n} from 'selectors/rhs';\nimport LocalStorageStore from 'stores/local_storage_store';\n\nimport {initializeProducts} from 'plugins/products';\n\nimport type {GlobalState} from 'types/store/index';\n\nimport {\n loadConfigAndMe,\n registerCustomPostRenderer,\n handleLoginLogoutSignal,\n redirectToOnboardingOrDefaultTeam,\n} from './actions';\nimport Root from './root';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const showTermsOfService = shouldShowTermsOfService(state);\n const plugins = state.plugins.components.CustomRouteComponent;\n const products = state.plugins.components.Product;\n const userId = getCurrentUserId(state);\n\n const teamId = LocalStorageStore.getPreviousTeamId(userId);\n const permalinkRedirectTeam = getTeam(state, teamId!);\n\n const isConfigLoaded = config && !isEmpty(config);\n\n return {\n theme: getTheme(state),\n isConfigLoaded,\n telemetryEnabled: config.DiagnosticsEnabled === 'true',\n noAccounts: config.NoAccounts === 'true',\n telemetryId: config.DiagnosticId,\n serviceEnvironment: config.ServiceEnvironment,\n siteURL: config.SiteURL,\n iosDownloadLink: config.IosAppDownloadLink,\n androidDownloadLink: config.AndroidAppDownloadLink,\n appDownloadLink: config.AppDownloadLink,\n enableDesktopLandingPage: config.EnableDesktopLandingPage === 'true',\n permalinkRedirectTeamName: permalinkRedirectTeam ? permalinkRedirectTeam.name : '',\n showTermsOfService,\n plugins,\n products,\n showLaunchingWorkspace: getShowLaunchingWorkspace(state),\n rhsIsExpanded: getIsRhsExpanded(state),\n rhsIsOpen: getIsRhsOpen(state),\n rhsState: getRhsState(state),\n shouldShowAppBar: shouldShowAppBar(state),\n isCloud: isCurrentLicenseCloud(state),\n isDevModeEnabled: isDevModeEnabled(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadConfigAndMe,\n getFirstAdminSetupComplete,\n getProfiles,\n loadRecentlyUsedCustomEmojis,\n migrateRecentEmojis,\n registerCustomPostRenderer,\n initializeProducts,\n handleLoginLogoutSignal,\n redirectToOnboardingOrDefaultTeam,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default withRouter(connector(Root));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\ntype Props = {\n saving?: boolean;\n disabled?: boolean;\n id?: string;\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n savingMessage?: React.ReactNode;\n defaultMessage?: React.ReactNode;\n btnClass?: string;\n extraClasses?: string;\n};\n\nconst SaveButton: React.FC<Props> = ({\n saving = false,\n disabled = false,\n savingMessage = (\n <FormattedMessage\n id='save_button.saving'\n defaultMessage='Saving'\n />\n ),\n defaultMessage = (\n <FormattedMessage\n id='save_button.save'\n defaultMessage='Save'\n />\n ),\n btnClass = '',\n extraClasses = '',\n ...props\n}) => {\n let className = 'btn';\n if (!btnClass) {\n className += ' btn-primary';\n }\n\n if (!disabled || saving) {\n className += ' ' + btnClass;\n }\n\n if (extraClasses) {\n className += ' ' + extraClasses;\n }\n\n return (\n <button\n type='submit'\n data-testid='saveSetting'\n id='saveSetting'\n className={className}\n disabled={disabled}\n {...props}\n >\n <LoadingWrapper\n loading={saving}\n text={savingMessage}\n >\n <span>{defaultMessage}</span>\n </LoadingWrapper>\n </button>\n );\n};\n\nexport default SaveButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {ConnectedComponent} from 'react-redux';\nimport styled from 'styled-components';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile as UserProfileType} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport Nbsp from 'components/html_entities/nbsp';\nimport ProfilePicture from 'components/profile_picture';\nimport UserProfile from 'components/user_profile';\n\nimport {createSafeId, displayFullAndNicknameForUser} from 'utils/utils';\n\nconst CustomStatus = styled.span`\n margin: auto 0;\n padding-left: 8px;\n span {\n display: flex;\n }\n`;\n\ntype Props = {\n user: UserProfileType;\n status?: string;\n extraInfo?: Array<string | JSX.Element>;\n actions?: Array<ConnectedComponent<any, any>>;\n actionProps?: {\n mfaEnabled: boolean;\n enableUserAccessTokens: boolean;\n experimentalEnableAuthenticationTransfer: boolean;\n doPasswordReset: (user: UserProfileType) => void;\n doEmailReset: (user: UserProfileType) => void;\n doManageTeams: (user: UserProfileType) => void;\n doManageRoles: (user: UserProfileType) => void;\n doManageTokens: (user: UserProfileType) => void;\n isDisabled?: boolean;\n };\n actionUserProps?: {\n [userId: string]: {\n channel: Channel;\n teamMember: TeamMembership;\n channelMember: ChannelMembership;\n };\n };\n index?: number;\n totalUsers?: number;\n userCount?: number;\n};\n\nconst UserListRow = ({user, status, extraInfo = [], actions = [], actionProps, actionUserProps = {}, index, totalUsers, userCount}: Props) => {\n let buttons = null;\n if (actions) {\n buttons = actions.map((Action, actionIndex) => {\n return (\n <Action\n key={actionIndex.toString()}\n user={user}\n index={index}\n totalUsers={totalUsers}\n {...actionProps}\n {...actionUserProps}\n />\n );\n });\n }\n\n // QUICK HACK, NEEDS A PROP FOR TOGGLING STATUS\n let emailProp: ReactNode = user.email;\n let emailStyle = 'more-modal__description';\n let statusProp: string | undefined;\n if (extraInfo && extraInfo.length > 0) {\n emailProp = (\n <FormattedMessage\n id='admin.user_item.email_title'\n defaultMessage='<strong>Email:</strong> {email}'\n values={{\n email: user.email,\n strong: (chunks: React.ReactNode) => <strong>{chunks}</strong>,\n }}\n />\n );\n emailStyle = '';\n } else if (user.status) {\n statusProp = user.status;\n } else {\n statusProp = status;\n }\n\n if (user.is_bot) {\n statusProp = undefined;\n emailProp = undefined;\n }\n\n let userCountID: string | undefined;\n let userCountEmail: string | undefined;\n if (userCount && userCount >= 0) {\n userCountID = createSafeId('userListRowName' + userCount);\n userCountEmail = createSafeId('userListRowEmail' + userCount);\n }\n\n return (\n <div\n key={user.id}\n className='more-modal__row'\n >\n <ProfilePicture\n src={Client4.getProfilePictureUrl(user.id, user.last_picture_update)}\n status={statusProp}\n size='md'\n userId={user.id}\n username={user.username}\n />\n <div\n className='more-modal__details'\n data-testid='userListItemDetails'\n >\n <div className='d-flex whitespace--nowrap'>\n <div\n id={userCountID}\n className='more-modal__name'\n >\n <UserProfile\n userId={user.id}\n displayUsername={true}\n />\n {\n (user.first_name || user.last_name || user.nickname) && (\n <>\n <Nbsp/>\n {'-'}\n <Nbsp/>\n {\n displayFullAndNicknameForUser(user)\n }\n </>\n )\n }\n\n </div>\n <CustomStatus>\n <CustomStatusEmoji\n userID={user.id}\n emojiSize={16}\n showTooltip={true}\n spanStyle={{\n display: 'flex',\n flex: '0 0 auto',\n alignItems: 'center',\n }}\n />\n </CustomStatus>\n\n </div>\n <div\n id={userCountEmail}\n className={emailStyle}\n >\n {emailProp}\n </div>\n {extraInfo}\n </div>\n <div\n data-testid='userListItemActions'\n className='more-modal__actions'\n >\n {buttons}\n </div>\n </div>\n );\n};\n\nexport default UserListRow;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport UserListRow from './user_list_row';\n\ntype OwnProps = {\n user: UserProfile;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const user = ownProps.user;\n return {\n status: getStatusForUserId(state, user.id),\n };\n}\n\nexport default connect(mapStateToProps)(UserListRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport LoadingScreen from 'components/loading_screen';\n\nimport UserListRow from './user_list_row';\n\ntype Props = {\n rowComponentType?: React.ComponentType<any>;\n length?: number;\n actions?: ReactNode[];\n actionUserProps?: {\n [userId: string]: {\n channel?: Channel;\n teamMember: TeamMembership;\n channelMember?: ChannelMembership;\n };\n };\n isDisabled?: boolean;\n users?: UserProfile[] | null;\n extraInfo?: {[key: string]: Array<string | JSX.Element>};\n actionProps?: {\n mfaEnabled: boolean;\n enableUserAccessTokens: boolean;\n experimentalEnableAuthenticationTransfer: boolean;\n doPasswordReset: (user: UserProfile) => void;\n doEmailReset: (user: UserProfile) => void;\n doManageTeams: (user: UserProfile) => void;\n doManageRoles: (user: UserProfile) => void;\n doManageTokens: (user: UserProfile) => void;\n isDisabled?: boolean;\n };\n}\n\nexport default class UserList extends React.PureComponent <Props> {\n static defaultProps = {\n users: [],\n extraInfo: {},\n actions: [],\n actionProps: {},\n rowComponentType: UserListRow,\n };\n containerRef: React.RefObject<any>;\n\n constructor(props: Props) {\n super(props);\n this.containerRef = React.createRef();\n }\n\n scrollToTop = () => {\n if (this.containerRef.current) {\n this.containerRef.current.scrollTop = 0;\n }\n };\n\n render() {\n const users = this.props.users;\n const RowComponentType = this.props.rowComponentType;\n\n let content;\n if (users == null) {\n return <LoadingScreen/>;\n } else if (users.length > 0 && RowComponentType && this.props.actionProps) {\n content = users.map((user: UserProfile, index: number) => {\n const {actionUserProps, extraInfo} = this.props;\n const userId = user.id;\n return (\n <RowComponentType\n key={user.id}\n user={user}\n extraInfo={extraInfo?.[userId]}\n actions={this.props.actions}\n actionProps={this.props.actionProps}\n actionUserProps={actionUserProps?.[userId]}\n index={index}\n totalUsers={users.length}\n userCount={index >= 0 ? index : -1}\n isDisabled={this.props.isDisabled}\n />\n );\n });\n } else {\n content = (\n <div\n key='no-users-found'\n className='more-modal__placeholder-row'\n data-testid='noUsersFound'\n >\n <p>\n <FormattedMessage\n id='user_list.notFound'\n defaultMessage='No users found'\n />\n </p>\n </div>\n );\n }\n\n return (\n <div ref={this.containerRef}>\n {content}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport Scrollbars from 'react-custom-scrollbars';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport QuickInput from 'components/quick_input';\nimport UserList from 'components/user_list';\n\nconst NEXT_BUTTON_TIMEOUT = 500;\n\ntype Props = {\n users: UserProfile[] | null;\n usersPerPage: number;\n total: number;\n extraInfo?: {[key: string]: Array<string | JSX.Element>};\n nextPage: () => void;\n previousPage: () => void;\n search: (term: string) => void;\n actions?: React.ReactNode[];\n noBuiltInFilters?: boolean;\n actionProps?: {\n mfaEnabled: boolean;\n enableUserAccessTokens: boolean;\n experimentalEnableAuthenticationTransfer: boolean;\n doPasswordReset: (user: UserProfile) => void;\n doEmailReset: (user: UserProfile) => void;\n doManageTeams: (user: UserProfile) => void;\n doManageRoles: (user: UserProfile) => void;\n doManageTokens: (user: UserProfile) => void;\n isDisabled?: boolean;\n };\n actionUserProps?: {\n [userId: string]: {\n channel?: Channel;\n teamMember: TeamMembership;\n channelMember?: ChannelMembership;\n };\n };\n focusOnMount?: boolean;\n renderCount?: (count: number, total: number, startCount: number, endCount: number, isSearch: boolean) => JSX.Element | null;\n filter?: string;\n renderFilterRow?: (handleFilter: ((event: React.FormEvent<HTMLInputElement>) => void) | undefined) => JSX.Element;\n page: number;\n term: string;\n onTermChange: (term: string) => void;\n intl: IntlShape;\n isDisabled?: boolean;\n\n // the type of user list row to render\n rowComponentType?: React.ComponentType<any>;\n}\n\nconst renderView = (props: Record<string, unknown>): JSX.Element => (\n <div\n {...props}\n className='scrollbar--view'\n />\n);\n\nconst renderThumbHorizontal = (): JSX.Element => (\n <div/>\n);\n\nconst renderThumbVertical = (props: Record<string, unknown>): JSX.Element => (\n <div\n {...props}\n className='scrollbar--vertical'\n />\n);\n\ntype State = {\n nextDisabled: boolean;\n};\n\nclass SearchableUserList extends React.PureComponent<Props, State> {\n static defaultProps: Partial<Props> = {\n users: [],\n usersPerPage: 50,\n extraInfo: {},\n actions: [],\n actionProps: {\n mfaEnabled: false,\n enableUserAccessTokens: false,\n experimentalEnableAuthenticationTransfer: false,\n doPasswordReset() {},\n doEmailReset() {},\n doManageTeams() {},\n doManageRoles() {},\n doManageTokens() {},\n isDisabled: false,\n },\n actionUserProps: {},\n focusOnMount: false,\n };\n\n private nextTimeoutId: NodeJS.Timeout;\n private scrollbarsRef: React.RefObject<Scrollbars>;\n private filterRef: React.RefObject<HTMLInputElement>;\n\n constructor(props: Props) {\n super(props);\n\n this.nextTimeoutId = {} as NodeJS.Timeout;\n\n this.state = {\n nextDisabled: false,\n };\n\n this.scrollbarsRef = React.createRef();\n this.filterRef = React.createRef();\n }\n\n public scrollToTop = (): void => {\n this.scrollbarsRef.current?.scrollToTop();\n };\n\n componentDidMount() {\n this.focusSearchBar();\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.props.page !== prevProps.page || this.props.term !== prevProps.term) {\n this.scrollToTop();\n }\n }\n\n componentWillUnmount() {\n clearTimeout(this.nextTimeoutId);\n }\n\n nextPage = (e: React.MouseEvent) => {\n e.preventDefault();\n\n this.setState({nextDisabled: true});\n this.nextTimeoutId = setTimeout(() => this.setState({nextDisabled: false}), NEXT_BUTTON_TIMEOUT);\n\n this.props.nextPage();\n this.scrollToTop();\n };\n\n previousPage = (e: React.MouseEvent) => {\n e.preventDefault();\n\n this.props.previousPage();\n this.scrollToTop();\n };\n\n focusSearchBar = () => {\n if (this.props.focusOnMount && this.filterRef.current) {\n this.filterRef.current.focus();\n }\n };\n\n handleInput = (e: React.FormEvent<HTMLInputElement> | undefined) => {\n if (e) {\n this.props.onTermChange(e.currentTarget.value);\n this.props.search(e.currentTarget.value);\n }\n };\n\n renderCount = (users: UserProfile[] | null | undefined) => {\n if (!users || !this.props.users) {\n return null;\n }\n\n if (this.props.filter) {\n return null;\n }\n\n const count = users.length;\n const total = this.props.total;\n const isSearch = Boolean(this.props.term);\n\n let startCount;\n let endCount;\n if (isSearch) {\n startCount = -1;\n endCount = -1;\n } else {\n startCount = this.props.page * this.props.usersPerPage;\n endCount = Math.min(startCount + this.props.usersPerPage, total);\n if (this.props.users.length < endCount) {\n endCount = this.props.users.length;\n }\n }\n\n if (this.props.renderCount) {\n return this.props.renderCount(count, this.props.total, startCount, endCount, isSearch);\n }\n\n if (this.props.total) {\n if (isSearch) {\n return (\n <FormattedMessage\n id='filtered_user_list.countTotal'\n defaultMessage='{count, number} {count, plural, one {member} other {members}} of {total, number} total'\n values={{\n count,\n total,\n }}\n />\n );\n }\n\n return (\n <FormattedMessage\n id='filtered_user_list.countTotalPage'\n defaultMessage='{startCount, number} - {endCount, number} {count, plural, one {member} other {members}} of {total, number} total'\n values={{\n count,\n startCount: startCount + 1,\n endCount,\n total,\n }}\n />\n );\n }\n\n return null;\n };\n\n render() {\n let nextButton;\n let previousButton;\n let usersToDisplay;\n\n if (this.props.term || !this.props.users) {\n usersToDisplay = this.props.users;\n } else if (!this.props.term) {\n const pageStart = this.props.page * this.props.usersPerPage;\n let pageEnd = pageStart + this.props.usersPerPage;\n if (this.props.users.length < pageEnd) {\n pageEnd = this.props.users.length;\n }\n\n usersToDisplay = this.props.users.slice(pageStart, pageEnd);\n\n if (pageEnd < this.props.total) {\n nextButton = (\n <button\n id='searchableUserListNextBtn'\n className='btn btn-sm btn-tertiary filter-control filter-control__next'\n onClick={this.nextPage}\n disabled={this.state.nextDisabled}\n >\n <FormattedMessage\n id='filtered_user_list.next'\n defaultMessage='Next'\n />\n </button>\n );\n }\n\n if (this.props.page > 0) {\n previousButton = (\n <button\n id='searchableUserListPrevBtn'\n className='btn btn-sm btn-tertiary filter-control filter-control__prev'\n onClick={this.previousPage}\n >\n <FormattedMessage\n id='filtered_user_list.prev'\n defaultMessage='Previous'\n />\n </button>\n );\n }\n }\n\n let filterRow;\n if (!this.props.noBuiltInFilters) {\n if (this.props.renderFilterRow) {\n filterRow = this.props.renderFilterRow(this.handleInput);\n } else {\n filterRow = (\n <div className='col-xs-12'>\n <label\n className='hidden-label'\n htmlFor='searchUsersInput'\n >\n <FormattedMessage\n id='filtered_user_list.search'\n defaultMessage='Search users'\n />\n </label>\n <QuickInput\n ref={this.filterRef}\n id='searchUsersInput'\n className='form-control filter-textbox'\n placeholder={this.props.intl.formatMessage({id: 'filtered_user_list.search', defaultMessage: 'Search users'})}\n aria-label={this.props.intl.formatMessage({id: 'filtered_user_list.search', defaultMessage: 'Search users'})}\n onInput={this.handleInput}\n value={this.props.term}\n />\n </div>\n );\n }\n }\n\n return (\n <div className='filtered-user-list'>\n <div className='filter-row'>\n {filterRow}\n <div className='col-sm-12'>\n <span\n id='searchableUserListTotal'\n className='member-count pull-left'\n aria-live='polite'\n >\n {this.renderCount(usersToDisplay)}\n </span>\n </div>\n </div>\n <div className='more-modal__list'>\n <Scrollbars\n ref={this.scrollbarsRef}\n autoHide={true}\n autoHideTimeout={500}\n autoHideDuration={500}\n renderThumbHorizontal={renderThumbHorizontal}\n renderThumbVertical={renderThumbVertical}\n renderView={renderView}\n >\n <UserList\n users={usersToDisplay}\n extraInfo={this.props.extraInfo}\n actions={this.props.actions}\n actionProps={this.props.actionProps}\n actionUserProps={this.props.actionUserProps}\n rowComponentType={this.props.rowComponentType}\n isDisabled={this.props.isDisabled}\n />\n </Scrollbars>\n </div>\n <div className='filter-controls'>\n {previousButton}\n {nextButton}\n </div>\n </div>\n );\n }\n}\n\nexport default injectIntl(SearchableUserList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport SearchableUserList from './searchable_user_list';\n\ntype Props = {\n users: UserProfile[] | null;\n usersPerPage: number;\n total: number;\n extraInfo?: {[key: string]: Array<string | JSX.Element>};\n nextPage: (page: number) => void;\n search: (term: string) => void;\n actions?: React.ReactNode[];\n actionProps?: {\n mfaEnabled: boolean;\n enableUserAccessTokens: boolean;\n experimentalEnableAuthenticationTransfer: boolean;\n doPasswordReset: (user: UserProfile) => void;\n doEmailReset: (user: UserProfile) => void;\n doManageTeams: (user: UserProfile) => void;\n doManageRoles: (user: UserProfile) => void;\n doManageTokens: (user: UserProfile) => void;\n isDisabled: boolean | undefined;\n };\n actionUserProps: {\n [userId: string]: {\n channel?: Channel;\n teamMember: TeamMembership;\n channelMember?: ChannelMembership;\n };\n };\n focusOnMount?: boolean;\n}\n\nexport default function SearchableUserListContainer(props: Props) {\n const [term, setTerm] = useState('');\n const [page, setPage] = useState(0);\n\n const handleTermChange = (term: string) => {\n setTerm(term);\n };\n\n const nextPage = () => {\n setPage(page + 1);\n props.nextPage(page + 1);\n };\n\n const previousPage = () => {\n setPage(page - 1);\n };\n\n const search = (term: string) => {\n props.search(term);\n\n if (term !== '') {\n setPage(0);\n }\n };\n\n return (\n <SearchableUserList\n {...props}\n nextPage={nextPage}\n previousPage={previousPage}\n search={search}\n page={page}\n term={term}\n onTermChange={handleTermChange}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport type {SectionNoticeButtonProp} from './types';\n\ntype Props = {\n button: SectionNoticeButtonProp;\n buttonClass: 'btn-primary' | 'btn-secondary' | 'btn-tertiary' | 'btn-link';\n}\n\nconst SectionNoticeButton = ({\n button,\n buttonClass,\n}: Props) => {\n const leading = button.leadingIcon ? (<i className={classNames('icon', button.leadingIcon)}/>) : null;\n const trailing = button.trailingIcon ? (<i className={classNames('icon', button.trailingIcon)}/>) : null;\n return (\n <button\n onClick={button.onClick}\n className={classNames('btn btn-sm sectionNoticeButton', buttonClass)}\n disabled={button.disabled}\n >\n {button.loading && (<i className='icon fa fa-pulse fa-spinner'/>)}\n {leading}\n {button.text}\n {trailing}\n </button>\n );\n};\n\nexport default SectionNoticeButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport Markdown from 'components/markdown';\n\nimport SectionNoticeButton from './section_notice_button';\nimport type {SectionNoticeButtonProp} from './types';\n\nimport './section_notice.scss';\n\ntype Props = {\n title: string | React.ReactElement;\n text?: string;\n primaryButton?: SectionNoticeButtonProp;\n secondaryButton?: SectionNoticeButtonProp;\n tertiaryButton?: SectionNoticeButtonProp;\n linkButton?: SectionNoticeButtonProp;\n type?: 'info' | 'success' | 'danger' | 'welcome' | 'warning' | 'hint';\n isDismissable?: boolean;\n onDismissClick?: () => void;\n};\n\nconst iconByType = {\n info: 'icon-information-outline',\n hint: 'icon-lightbulb-outline',\n success: 'icon-check',\n danger: 'icon-alert-outline',\n warning: 'icon-alert-outline',\n welcome: undefined,\n};\n\nconst SectionNotice = ({\n title,\n text,\n primaryButton,\n secondaryButton,\n tertiaryButton,\n linkButton,\n type = 'info',\n isDismissable,\n onDismissClick,\n}: Props) => {\n const intl = useIntl();\n const icon = iconByType[type];\n const showDismiss = Boolean(isDismissable && onDismissClick);\n const hasButtons = Boolean(primaryButton || secondaryButton || tertiaryButton || linkButton);\n return (\n <div className={classNames('sectionNoticeContainer', type)}>\n <div className={'sectionNoticeContent'}>\n {icon && <i className={classNames('icon sectionNoticeIcon', icon, type)}/>}\n <div className='sectionNoticeBody'>\n <h4 className={classNames('sectionNoticeTitle', {welcome: type === 'welcome', noText: !text})}>{title}</h4>\n {text && <Markdown message={text}/>}\n {hasButtons && (\n <div className='sectionNoticeActions'>\n {primaryButton &&\n <SectionNoticeButton\n button={primaryButton}\n buttonClass='btn-primary'\n />\n }\n {secondaryButton &&\n <SectionNoticeButton\n button={secondaryButton}\n buttonClass='btn-secondary'\n />\n }\n {tertiaryButton && (\n <SectionNoticeButton\n button={tertiaryButton}\n buttonClass='btn-tertiary'\n />\n )}\n {linkButton &&\n <SectionNoticeButton\n button={linkButton}\n buttonClass='btn-link'\n />\n }\n </div>\n )}\n </div>\n </div>\n {showDismiss &&\n <button\n className='btn btn-icon btn-sm sectionNoticeClose'\n onClick={onDismissClick}\n aria-label={intl.formatMessage({\n id: 'sectionNotice.dismiss',\n defaultMessage: 'Dismiss notice',\n })}\n >\n <i className='icon icon-close'/>\n </button>\n }\n </div>\n );\n};\n\nexport default SectionNotice;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport WithTooltip from 'components/with_tooltip';\n\ntype Props = {\n className?: string;\n withTooltip?: boolean;\n};\n\nconst SharedChannelIndicator: React.FC<Props> = (props: Props): JSX.Element => {\n const sharedIcon = (<i className={`${props.className || ''} icon-circle-multiple-outline`}/>);\n\n if (!props.withTooltip) {\n return sharedIcon;\n }\n\n const sharedTooltipText = (\n <FormattedMessage\n id='shared_channel_indicator.tooltip'\n defaultMessage='Shared with trusted organizations'\n />\n );\n\n return (\n <WithTooltip\n title={sharedTooltipText}\n >\n {sharedIcon}\n </WithTooltip>\n );\n};\n\nexport default SharedChannelIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {AriaRole, AriaAttributes} from 'react';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport WithTooltip from 'components/with_tooltip';\n\ntype Props = {\n\n /**\n * If not provided, the default title 'From trusted organizations' will be used for the tooltip.\n */\n title?: string;\n ariaLabel?: AriaAttributes['aria-label'];\n role?: AriaRole;\n\n className?: string;\n withTooltip?: boolean;\n};\n\nconst SharedUserIndicator = (props: Props) => {\n const intl = useIntl();\n\n const sharedIcon = (\n <i\n className={classNames('icon icon-circle-multiple-outline', props.className)}\n aria-label={props.ariaLabel || intl.formatMessage({id: 'shared_user_indicator.aria_label', defaultMessage: 'shared user indicator'})}\n role={props?.role}\n />\n );\n\n if (!props.withTooltip) {\n return sharedIcon;\n }\n\n return (\n <WithTooltip\n title={props.title || intl.formatMessage({id: 'shared_user_indicator.tooltip', defaultMessage: 'From trusted organizations'})}\n >\n {sharedIcon}\n </WithTooltip>\n );\n};\n\nexport default SharedUserIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport './shortcut_key.scss';\n\nexport enum ShortcutKeyVariant {\n Contrast = 'contrast',\n Tooltip = 'tooltip',\n TutorialTip = 'tutorialTip',\n ShortcutModal = 'shortcut',\n}\n\nexport type ShortcutKeyProps = {\n variant?: ShortcutKeyVariant;\n children: React.ReactNode;\n}\n\nexport const ShortcutKey = ({children, variant}: ShortcutKeyProps): JSX.Element => {\n return (\n <mark\n className={classNames('shortcut-key', {\n 'shortcut-key--contrast': variant === ShortcutKeyVariant.Contrast,\n 'shortcut-key--tooltip': variant === ShortcutKeyVariant.Tooltip,\n 'shortcut-key--tutorial-tip': variant === ShortcutKeyVariant.TutorialTip,\n 'shortcut-key--shortcut-modal': variant === ShortcutKeyVariant.ShortcutModal,\n })}\n >\n {children}\n </mark>\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable @mattermost/use-external-link */\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {KeyboardEvent, MouseEvent, SyntheticEvent} from 'react';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {WrappedComponentProps} from 'react-intl';\n\nimport {DownloadOutlineIcon, LinkVariantIcon, CheckIcon} from '@mattermost/compass-icons/components';\nimport type {FileInfo} from '@mattermost/types/files';\nimport type {PostImage} from '@mattermost/types/posts';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {getFileMiniPreviewUrl} from 'mattermost-redux/utils/file_utils';\n\nimport LoadingImagePreview from 'components/loading_image_preview';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {FileTypes} from 'utils/constants';\nimport {copyToClipboard, getFileType} from 'utils/utils';\n\nconst MIN_IMAGE_SIZE = 48;\nconst MIN_IMAGE_SIZE_FOR_INTERNAL_BUTTONS = 100;\nconst MAX_IMAGE_HEIGHT = 350;\n\nexport type Props = WrappedComponentProps & {\n\n /*\n * The source URL of the image\n */\n src: string;\n\n /*\n * dimensions object to create empty space required to prevent scroll pop\n */\n dimensions?: Partial<PostImage>;\n fileInfo?: FileInfo;\n\n /**\n * fileURL of the original image\n */\n fileURL?: string;\n\n alt?: string;\n height?: string;\n width?: string;\n title?: string;\n\n /*\n * Boolean value to pass for showing a loader when image is being loaded\n */\n showLoader?: boolean;\n\n /*\n * A callback that is called as soon as the image component has a height value\n */\n onImageLoaded?: ({height, width}: {height: number; width: number}) => void;\n\n /*\n * A callback that is called when image load fails\n */\n onImageLoadFail?: () => void;\n\n /*\n * Fetch the onClick function\n */\n onClick?: (e: (KeyboardEvent<HTMLImageElement> | MouseEvent<HTMLImageElement | HTMLDivElement>), link?: string) => void;\n\n /*\n * css classes that can added to the img as well as parent div on svg for placeholder\n */\n className?: string;\n\n /*\n * Enables the logic of surrounding small images with a bigger container div for better click/tap targeting\n */\n handleSmallImageContainer?: boolean;\n\n /**\n * Enables copy URL functionality through a button on image hover.\n */\n enablePublicLink?: boolean;\n\n /**\n * Action to fetch public link of an image from server.\n */\n getFilePublicLink?: () => Promise<ActionResult<{ link: string }>>;\n\n /*\n * Prevents display of utility buttons when image in a location that makes them inappropriate\n */\n hideUtilities?: boolean;\n}\n\ntype State = {\n loaded: boolean;\n isSmallImage: boolean;\n linkCopiedRecently: boolean;\n linkCopyInProgress: boolean;\n error: boolean;\n imageWidth: number;\n}\n\n// SizeAwareImage is a component used for rendering images where the dimensions of the image are important for\n// ensuring that the page is laid out correctly.\nexport class SizeAwareImage extends React.PureComponent<Props, State> {\n public heightTimeout = 0;\n public mounted = false;\n public timeout: NodeJS.Timeout | null = null;\n\n constructor(props: Props) {\n super(props);\n const {dimensions} = props;\n\n this.state = {\n loaded: false,\n isSmallImage: this.dimensionsAvailable(dimensions) ? this.isSmallImage(\n dimensions?.width ?? 0, dimensions?.height ?? 0) : false,\n linkCopiedRecently: false,\n linkCopyInProgress: false,\n error: false,\n imageWidth: 0,\n };\n\n this.heightTimeout = 0;\n }\n\n componentDidMount() {\n this.mounted = true;\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n dimensionsAvailable = (dimensions?: Partial<PostImage>) => {\n return dimensions && dimensions.width && dimensions.height;\n };\n\n isSmallImage = (width: number, height: number) => {\n return width < MIN_IMAGE_SIZE || height < MIN_IMAGE_SIZE;\n };\n\n handleLoad = (event: SyntheticEvent<HTMLImageElement, Event>) => {\n if (this.mounted) {\n const image = event.target as HTMLImageElement;\n const isSmallImage = this.isSmallImage(image.naturalWidth, image.naturalHeight);\n this.setState({\n loaded: true,\n error: false,\n isSmallImage,\n imageWidth: image.naturalWidth,\n }, () => { // Call onImageLoaded prop only after state has already been set\n if (this.props.onImageLoaded && image.naturalHeight) {\n this.props.onImageLoaded({height: image.naturalHeight, width: image.naturalWidth});\n }\n });\n }\n };\n\n handleError = () => {\n if (this.mounted) {\n if (this.props.onImageLoadFail) {\n this.props.onImageLoadFail();\n }\n this.setState({error: true});\n }\n };\n\n handleImageClick = (e: MouseEvent<HTMLImageElement>) => {\n this.props.onClick?.(e, this.props.src);\n };\n\n onEnterKeyDown = (e: KeyboardEvent<HTMLImageElement>) => {\n if (e.key === 'Enter') {\n this.props.onClick?.(e, this.props.src);\n }\n };\n\n renderImageLoaderIfNeeded = () => {\n if (!this.state.loaded && this.props.showLoader && !this.state.error) {\n return (\n <div style={{position: 'absolute', top: '50%', transform: 'translate(-50%, -50%)', left: '50%'}}>\n <LoadingImagePreview\n containerClass={'file__image-loading'}\n />\n </div>\n );\n }\n return null;\n };\n\n renderImageWithContainerIfNeeded = () => {\n const {\n fileInfo,\n dimensions,\n src,\n fileURL,\n enablePublicLink,\n intl,\n ...props\n } = this.props;\n Reflect.deleteProperty(props, 'showLoader');\n Reflect.deleteProperty(props, 'onImageLoaded');\n Reflect.deleteProperty(props, 'onImageLoadFail');\n Reflect.deleteProperty(props, 'dimensions');\n Reflect.deleteProperty(props, 'handleSmallImageContainer');\n Reflect.deleteProperty(props, 'enablePublicLink');\n Reflect.deleteProperty(props, 'onClick');\n Reflect.deleteProperty(props, 'hideUtilities');\n Reflect.deleteProperty(props, 'getFilePublicLink');\n Reflect.deleteProperty(props, 'intl');\n\n let ariaLabelImage = intl.formatMessage({id: 'file_attachment.thumbnail', defaultMessage: 'file thumbnail'});\n if (fileInfo) {\n ariaLabelImage += ` ${fileInfo.name}`.toLowerCase();\n }\n\n const fileType = getFileType(fileInfo?.extension ?? '');\n\n let conditionalSVGStyleAttribute;\n if (fileType === FileTypes.SVG) {\n conditionalSVGStyleAttribute = {\n width: dimensions?.width || MIN_IMAGE_SIZE,\n height: 'auto',\n };\n }\n\n const image = (\n <img\n {...props}\n aria-label={ariaLabelImage}\n tabIndex={0}\n onClick={this.handleImageClick}\n onKeyDown={this.onEnterKeyDown}\n className={\n this.props.className +\n (this.props.handleSmallImageContainer &&\n this.state.isSmallImage ? ' small-image--inside-container' : '')}\n src={src}\n onError={this.handleError}\n onLoad={this.handleLoad}\n style={conditionalSVGStyleAttribute}\n />\n );\n\n // copyLink, download are two buttons overlayed on image preview\n // copyLinkTooltip, downloadTooltip are tooltips for the buttons respectively.\n // if linkCopiedRecently is true, defaultMessage would be 'Copy Link', else 'Copied!'\n\n const copyLinkTooltipText = this.state.linkCopiedRecently ? (\n <FormattedMessage\n id={'single_image_view.copied_link_tooltip'}\n defaultMessage={'Copied'}\n />\n ) : (\n <FormattedMessage\n id={'single_image_view.copy_link_tooltip'}\n defaultMessage={'Copy link'}\n />\n );\n const copyLink = (\n <WithTooltip\n title={copyLinkTooltipText}\n >\n <button\n className={classNames('style--none', 'size-aware-image__copy_link', {\n 'size-aware-image__copy_link--recently_copied': this.state.linkCopiedRecently,\n })}\n aria-label={intl.formatMessage({id: 'single_image_view.copy_link_tooltip', defaultMessage: 'Copy link'})}\n onClick={this.copyLinkToAsset}\n >\n {this.state.linkCopiedRecently ? (\n <CheckIcon\n className={'svg-check style--none'}\n size={20}\n />\n ) : (\n <LinkVariantIcon\n className={'style--none'}\n size={20}\n />\n )}\n </button>\n </WithTooltip>\n );\n\n const downloadTooltipText = (\n <FormattedMessage\n id='single_image_view.download_tooltip'\n defaultMessage='Download'\n />\n );\n const download = (\n <WithTooltip\n title={downloadTooltipText}\n >\n <a\n target='_blank'\n rel='noopener noreferrer'\n href={this.isInternalImage ? fileURL : src}\n className='style--none size-aware-image__download'\n download={true}\n role={this.isInternalImage ? 'button' : undefined}\n aria-label={intl.formatMessage({id: 'single_image_view.download_tooltip', defaultMessage: 'Download'})}\n >\n <DownloadOutlineIcon\n className={'style--none'}\n size={20}\n />\n </a>\n </WithTooltip>\n );\n\n if (this.props.handleSmallImageContainer && this.state.isSmallImage) {\n let className = 'small-image__container cursor--pointer a11y--active';\n if (this.state.imageWidth < MIN_IMAGE_SIZE) {\n className += ' small-image__container--min-width';\n }\n\n // 24 is the offset on a 48px wide image, for every pixel added to the width of the image, it's added to the left offset to buttons\n const wideImageButtonsOffset = (24 + this.state.imageWidth) - MIN_IMAGE_SIZE;\n\n /**\n * creation of left offset for 2 nested cases\n * - if a small image with larger width\n * - if copy link button is enabled\n */\n const modifierCopyButton = enablePublicLink ? 0 : 8;\n\n // decrease modifier if imageWidth > 100\n const modifierLargerWidth = this.state.imageWidth > MIN_IMAGE_SIZE_FOR_INTERNAL_BUTTONS ? 40 : 0;\n\n // since there is a max-width constraint on images, a max-left clause follows.\n const leftStyle = this.state.imageWidth > MIN_IMAGE_SIZE ? {\n left: `min(${wideImageButtonsOffset + (modifierCopyButton - modifierLargerWidth)}px, calc(100% - ${31 - (modifierCopyButton - modifierLargerWidth)}px)`,\n } : {};\n\n const wideSmallImageStyle = this.state.imageWidth > MIN_IMAGE_SIZE ? {\n width: this.state.imageWidth + 2, // 2px to account for the border\n } : {};\n return (\n <div\n className='small-image-utility-buttons-wrapper'\n >\n <div\n onClick={this.handleImageClick}\n className={classNames(className)}\n style={wideSmallImageStyle}\n >\n {image}\n </div>\n <span\n className={classNames('image-preview-utility-buttons-container', 'image-preview-utility-buttons-container--small-image', {\n 'image-preview-utility-buttons-container--small-image-no-copy-button': !enablePublicLink,\n })}\n style={leftStyle}\n >\n {enablePublicLink && copyLink}\n {download}\n </span>\n </div>\n );\n }\n\n // handling external small images (OR) handling all large internal / large external images\n const utilityButtonsWrapper = this.props.hideUtilities || (this.state.isSmallImage && !this.isInternalImage) ? null :\n (\n <span\n className={classNames('image-preview-utility-buttons-container', {\n\n // cases for when image isn't a small image but width is < 100px\n 'image-preview-utility-buttons-container--small-image': this.state.imageWidth < MIN_IMAGE_SIZE_FOR_INTERNAL_BUTTONS,\n 'image-preview-utility-buttons-container--small-image-no-copy-button': (!enablePublicLink || !this.isInternalImage) && this.state.imageWidth < MIN_IMAGE_SIZE_FOR_INTERNAL_BUTTONS,\n })}\n >\n {(enablePublicLink || !this.isInternalImage) && copyLink}\n {download}\n </span>\n );\n return (\n <figure className={classNames('image-loaded-container')}>\n {image}\n {utilityButtonsWrapper}\n </figure>\n );\n };\n\n renderImageOrFallback = () => {\n const {\n dimensions,\n fileInfo,\n } = this.props;\n\n let ariaLabelImage = this.props.intl.formatMessage({id: 'file_attachment.thumbnail', defaultMessage: 'file thumbnail'});\n if (fileInfo) {\n ariaLabelImage += ` ${fileInfo.name}`.toLowerCase();\n }\n\n let fallback;\n\n if (this.dimensionsAvailable(dimensions) && !this.state.loaded) {\n const ratio = (dimensions?.height ?? 0) > MAX_IMAGE_HEIGHT ? MAX_IMAGE_HEIGHT / (dimensions?.height ?? 1) : 1;\n const height = (dimensions?.height ?? 0) * ratio;\n const width = (dimensions?.width ?? 0) * ratio;\n\n const miniPreview = getFileMiniPreviewUrl(fileInfo);\n\n if (miniPreview) {\n fallback = (\n <div\n className={`image-loading__container ${this.props.className}`}\n style={{maxWidth: dimensions?.width}}\n >\n <img\n aria-label={ariaLabelImage}\n className={this.props.className}\n src={miniPreview}\n tabIndex={0}\n height={height}\n width={width}\n />\n </div>\n );\n } else {\n fallback = (\n <div\n className={`image-loading__container ${this.props.className}`}\n style={{maxWidth: width}}\n >\n {this.renderImageLoaderIfNeeded()}\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox={`0 0 ${width} ${height}`}\n style={{maxHeight: height, maxWidth: width, verticalAlign: 'middle'}}\n />\n </div>\n );\n }\n }\n\n const shouldShowImg = !this.dimensionsAvailable(dimensions) || this.state.loaded;\n\n return (\n <>\n {fallback}\n <div\n className='file-preview__button'\n style={{display: shouldShowImg ? 'inline-block' : 'none'}}\n >\n {this.renderImageWithContainerIfNeeded()}\n </div>\n </>\n );\n };\n\n isInternalImage = (this.props.fileInfo !== undefined) && (this.props.fileInfo !== null);\n\n startCopyTimer = () => {\n // set linkCopiedRecently to true, and reset to false after 1.5 seconds\n this.setState({linkCopiedRecently: true});\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n this.timeout = setTimeout(() => {\n this.setState({linkCopiedRecently: false, linkCopyInProgress: false});\n }, 1500);\n };\n\n copyLinkToAsset = async () => {\n // if linkCopyInProgress is true return\n if (this.state.linkCopyInProgress !== true) {\n // set linkCopyInProgress to true to prevent multiple api calls\n this.setState({linkCopyInProgress: true});\n\n // check if image is external, if not copy this.props.src\n if (!this.isInternalImage) {\n copyToClipboard(this.props.src ?? '');\n this.startCopyTimer();\n return;\n }\n\n // copying public link to clipboard\n if (this.props.getFilePublicLink) {\n const data: any = await this.props.getFilePublicLink();\n const fileURL = data.data?.link;\n copyToClipboard(fileURL ?? '');\n this.startCopyTimer();\n }\n }\n };\n\n render() {\n return (\n this.renderImageOrFallback()\n );\n }\n}\n\nexport default injectIntl(SizeAwareImage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\n\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\ntype Props = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n children?: ReactNode;\n spinning: boolean;\n spinningText: ReactNode | MessageDescriptor;\n}\n\nconst SpinnerButton = ({\n spinning = false,\n spinningText,\n children,\n ...props\n}: Props) => {\n return (\n <button\n disabled={spinning}\n {...props}\n >\n <LoadingWrapper\n loading={spinning}\n text={spinningText}\n >\n {children}\n </LoadingWrapper>\n </button>\n );\n};\nexport default React.memo(SpinnerButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n height?: number;\n width?: number;\n}\n\nconst AirgappedTrialActivationConfirmSvg = ({height = 474, width = 578}: SvgProps) => (\n <svg\n width={width.toString()}\n height={height.toString()}\n viewBox='0 0 223 159'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <g clipPath='url(#clip0_754_57919)'>\n <path\n d='M17.1671 115.779H174.208C175.364 115.763 176.466 115.281 177.273 114.439C178.081 113.597 178.528 112.464 178.516 111.287V4.46575C178.528 3.28926 178.081 2.15606 177.273 1.3142C176.466 0.47233 175.364 -0.00961028 174.208 -0.026123H17.1671C16.0121 -0.00797133 14.9109 0.474468 14.1039 1.31597C13.297 2.15748 12.8496 3.28974 12.8595 4.46575V111.294C12.8513 112.468 13.2993 113.599 14.1061 114.439C14.9129 115.279 16.0131 115.761 17.1671 115.779Z'\n fill='#3F4350'\n />\n <path\n d='M-0.15625 131.141C-0.15625 136.459 4.17094 141.776 9.41922 141.776H181.963C186.909 141.776 191.532 136.471 191.532 131.141H-0.15625Z'\n fill='#767D93'\n />\n <path\n d='M175.559 115.779H15.8173L-0.15625 131.141H191.532L175.559 115.779Z'\n fill='#D1D4DB'\n />\n <path\n d='M170.782 116.961H20.5884L15.2266 123.46H176.15L170.782 116.961Z'\n fill='#AFB3C0'\n />\n <path\n d='M112.155 125.823H79.2272L76.7559 129.369H114.62L112.155 125.823Z'\n fill='#24262E'\n />\n <g clipPath='url(#clip1_754_57919)'>\n <rect\n width='146.725'\n height='94.5349'\n transform='translate(22.3262 10.0183)'\n fill='white'\n />\n <rect\n x='22.3262'\n y='10.0183'\n width='43.7808'\n height='95.1258'\n fill='#1E325C'\n />\n <ellipse\n opacity='0.32'\n cx='29.4256'\n cy='17.6994'\n rx='4.14142'\n ry='4.1359'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='36.5254'\n y='16.5176'\n width='19.5238'\n height='1.77253'\n rx='0.886265'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='26.4678'\n y='27.1528'\n width='13.0159'\n height='1.77253'\n rx='0.886265'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='26.4678'\n y='83.8738'\n width='13.0159'\n height='1.77253'\n rx='0.886265'\n fill='white'\n />\n <ellipse\n opacity='0.32'\n cx='28.5385'\n cy='34.5382'\n rx='2.07071'\n ry='2.06795'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='32.9756'\n y='33.6519'\n width='24.5527'\n height='1.69648'\n rx='0.848242'\n fill='white'\n />\n <ellipse\n opacity='0.32'\n cx='28.5385'\n cy='55.8087'\n rx='2.07071'\n ry='2.06795'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='32.9756'\n y='54.9224'\n width='24.2569'\n height='1.77253'\n rx='0.886265'\n fill='white'\n />\n <ellipse\n opacity='0.32'\n cx='28.5385'\n cy='41.6285'\n rx='2.07071'\n ry='2.06795'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='32.9756'\n y='40.7422'\n width='21.2987'\n height='1.77253'\n rx='0.886264'\n fill='white'\n />\n <ellipse\n opacity='0.32'\n cx='28.5385'\n cy='62.8988'\n rx='2.07071'\n ry='2.06795'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='32.9756'\n y='62.0125'\n width='21.2987'\n height='1.77253'\n rx='0.886265'\n fill='white'\n />\n <ellipse\n opacity='0.32'\n cx='28.5385'\n cy='48.7186'\n rx='2.07071'\n ry='2.06795'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='32.9756'\n y='47.8323'\n width='27.8067'\n height='1.77253'\n rx='0.886265'\n fill='white'\n />\n <ellipse\n opacity='0.32'\n cx='28.5385'\n cy='69.9888'\n rx='2.07071'\n ry='2.06795'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='32.9756'\n y='69.1025'\n width='27.8067'\n height='1.77253'\n rx='0.886265'\n fill='white'\n />\n <ellipse\n opacity='0.32'\n cx='28.5385'\n cy='91.2594'\n rx='2.07071'\n ry='2.06795'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='32.9756'\n y='90.373'\n width='27.8067'\n height='1.77253'\n rx='0.886265'\n fill='white'\n />\n <ellipse\n opacity='0.32'\n cx='28.5385'\n cy='77.0789'\n rx='2.07071'\n ry='2.06795'\n fill='white'\n />\n <rect\n opacity='0.32'\n x='32.9756'\n y='76.1926'\n width='18.3406'\n height='1.77253'\n rx='0.886265'\n fill='white'\n />\n <ellipse\n cx='74.3896'\n cy='34.8336'\n rx='3.54979'\n ry='3.54506'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='81.4893'\n y='31.8794'\n width='20.1155'\n height='1.77253'\n rx='0.886265'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='81.4893'\n y='37.197'\n width='60.9381'\n height='1.18169'\n rx='0.590843'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='81.4893'\n y='41.9238'\n width='68.6293'\n height='1.18169'\n rx='0.590843'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <ellipse\n cx='74.3896'\n cy='59.0582'\n rx='3.54979'\n ry='3.54506'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='81.4893'\n y='56.104'\n width='20.1155'\n height='1.77253'\n rx='0.886265'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='81.4893'\n y='61.4216'\n width='60.9381'\n height='1.18169'\n rx='0.590843'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='81.4893'\n y='66.1484'\n width='68.6293'\n height='1.18169'\n rx='0.590843'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <ellipse\n cx='74.3896'\n cy='81.5104'\n rx='3.54979'\n ry='3.54506'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='81.4893'\n y='78.5562'\n width='20.1155'\n height='1.77253'\n rx='0.886265'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='81.4893'\n y='83.8738'\n width='60.9381'\n height='1.18169'\n rx='0.590843'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='81.4893'\n y='88.6006'\n width='68.6293'\n height='1.18169'\n rx='0.590843'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <ellipse\n cx='92.73'\n cy='17.6993'\n rx='1.77489'\n ry='1.77253'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <ellipse\n cx='124.086'\n cy='17.6993'\n rx='1.77489'\n ry='1.77253'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <ellipse\n cx='154.26'\n cy='17.6993'\n rx='1.77489'\n ry='1.77253'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <ellipse\n cx='159.584'\n cy='17.6993'\n rx='1.77489'\n ry='1.77253'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <ellipse\n cx='97.4634'\n cy='17.6993'\n rx='1.77489'\n ry='1.77253'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='70.8398'\n y='17.1084'\n width='18.3406'\n height='1.18169'\n rx='0.590843'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='127.637'\n y='16.5176'\n width='23.0736'\n height='2.36337'\n rx='1.18169'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n </g>\n <path\n d='M95.6878 2.92798C96.1559 2.92798 96.6134 3.06659 97.0026 3.32629C97.3918 3.58598 97.6951 3.95508 97.8742 4.38693C98.0533 4.81878 98.1002 5.29397 98.0089 5.75242C97.9175 6.21087 97.6922 6.63199 97.3612 6.96251C97.0303 7.29303 96.6086 7.51813 96.1495 7.60932C95.6905 7.70051 95.2146 7.65369 94.7822 7.47481C94.3497 7.29593 93.9801 6.99303 93.7201 6.60438C93.4601 6.21572 93.3213 5.75878 93.3213 5.29135C93.3213 4.66455 93.5707 4.06341 94.0145 3.62019C94.4583 3.17697 95.0602 2.92798 95.6878 2.92798Z'\n fill='#989DAE'\n />\n <path\n d='M109.322 138.231H81.4444C80.4823 138.231 77.9395 138.231 77.9395 134.686H112.846C112.846 138.231 110.228 138.231 109.322 138.231Z'\n fill='#3F4350'\n />\n </g>\n <g clipPath='url(#clip2_754_57919)'>\n <rect\n x='184.015'\n y='147.833'\n width='14.3123'\n height='2.45026'\n rx='1.22513'\n fill='#8D93A5'\n />\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M219.65 155.56C218.049 157.196 215.767 158.45 213.264 158.45H169.486C166.983 158.45 164.701 157.196 163.1 155.56C161.496 153.92 160.297 151.613 160.297 149.117V47.721C160.297 45.2239 161.494 42.9173 163.098 41.2769C164.698 39.6401 166.979 38.3875 169.482 38.3875H213.264C215.766 38.3875 218.048 39.6398 219.65 41.2762C221.254 42.9162 222.453 45.223 222.453 47.721V149.117C222.453 151.613 221.254 153.92 219.65 155.56ZM213.264 156C216.632 156 219.999 152.554 219.999 149.117V47.721C219.999 44.2793 216.632 40.8377 213.264 40.8377H169.482C166.114 40.8377 162.75 44.2793 162.75 47.721V149.117C162.75 152.554 166.118 156 169.486 156H213.264Z'\n fill='#363A45'\n />\n <path\n d='M220 149.117C220 152.554 216.632 156 213.265 156H169.486C166.119 156 162.751 152.554 162.751 149.117V47.7209C162.751 44.2793 166.115 40.8376 169.482 40.8376H213.265C216.632 40.8376 220 44.2793 220 47.7209V149.117Z'\n fill='#3F4350'\n />\n <path\n d='M196.283 46.7579C196.283 47.0974 196.068 47.3719 195.796 47.3719H186.959C186.691 47.3719 186.469 47.0889 186.469 46.7579C186.469 46.4268 186.691 46.1467 186.959 46.1467H195.781C196.053 46.1467 196.283 46.4212 196.283 46.7579Z'\n fill='#8D93A5'\n />\n <path\n d='M217.546 53.4976H165.204V143.749H217.546V53.4976Z'\n fill='white'\n />\n <ellipse\n cx='171.516'\n cy='71.2071'\n rx='3.53454'\n ry='3.52983'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <ellipse\n cx='171.516'\n cy='92.386'\n rx='3.53454'\n ry='3.52983'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <ellipse\n cx='171.516'\n cy='113.565'\n rx='3.53454'\n ry='3.52983'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='69.0891'\n width='24.0349'\n height='1.41193'\n rx='0.705966'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='90.2681'\n width='24.0349'\n height='1.41193'\n rx='0.705967'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='111.447'\n width='24.0349'\n height='1.41193'\n rx='0.705967'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='77.5608'\n width='33.9316'\n height='1.41193'\n rx='0.705966'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='98.7397'\n width='33.9316'\n height='1.41193'\n rx='0.705965'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='119.919'\n width='33.9316'\n height='1.41193'\n rx='0.705963'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='81.7966'\n width='16.9658'\n height='1.41193'\n rx='0.705966'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='102.976'\n width='16.9658'\n height='1.41193'\n rx='0.705965'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='124.155'\n width='16.9658'\n height='1.41193'\n rx='0.705967'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='73.325'\n width='36.7592'\n height='1.41193'\n rx='0.705966'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='94.5039'\n width='36.7592'\n height='1.41193'\n rx='0.705965'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='176.465'\n y='115.683'\n width='36.7592'\n height='1.41193'\n rx='0.705967'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <rect\n x='165.204'\n y='53.4976'\n width='52.342'\n height='9.80105'\n fill='#1E325C'\n />\n <rect\n opacity='0.4'\n x='173.791'\n y='57.9897'\n width='17.1747'\n height='1.22513'\n rx='0.612565'\n fill='white'\n />\n <rect\n opacity='0.4'\n x='210.595'\n y='56.3562'\n width='4.08922'\n height='4.08377'\n rx='2'\n fill='white'\n />\n <rect\n opacity='0.4'\n x='168.066'\n y='56.3562'\n width='4.08922'\n height='4.08377'\n rx='2'\n fill='white'\n />\n </g>\n <defs>\n <clipPath id='clip0_754_57919'>\n <rect\n width='179'\n height='142'\n fill='white'\n />\n </clipPath>\n <clipPath id='clip1_754_57919'>\n <rect\n width='146.725'\n height='94.5349'\n fill='white'\n transform='translate(22.3262 10.0183)'\n />\n </clipPath>\n <clipPath id='clip2_754_57919'>\n <rect\n width='63'\n height='121'\n fill='white'\n transform='translate(160 38)'\n />\n </clipPath>\n </defs>\n </svg>\n\n);\n\nexport default AirgappedTrialActivationConfirmSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Button, Modal} from 'react-bootstrap';\nimport {useIntl} from 'react-intl';\n\nimport AirgappedTrialActivationConfirmSvg from 'components/common/svg_images_components/airgapped_trial_activation_confirm_svg';\nimport ExternalLink from 'components/external_link';\n\nimport './air_gapped_modal.scss';\n\ntype Props = {\n onClose?: () => void;\n}\n\nfunction AirGappedModal({onClose}: Props) {\n const {formatMessage} = useIntl();\n const airGappedLink = (\n <ExternalLink\n location='start_trial_air_gapped_modal'\n href='https://mattermost.com/trial/'\n >\n {'https://mattermost.com/trial/'}\n </ExternalLink>\n );\n return (\n <Modal\n className={'AirGappedModal'}\n dialogClassName={'AirGappedModal__dialog'}\n show={true}\n id='airGappedModal'\n role='none'\n onHide={() => onClose?.()}\n >\n <Modal.Header closeButton={true}>\n <div className='title'>\n {formatMessage({id: 'air_gapped_modal.title', defaultMessage: 'Request a trial key'})}\n </div>\n </Modal.Header>\n <Modal.Body>\n <div className='body'>\n <div className='description'>\n {\n formatMessage(\n {\n id: 'air_gapped_modal.description',\n defaultMessage: 'To start your trial, please visit {link} and request a trial key.',\n },\n {\n link: airGappedLink,\n },\n )\n }\n </div>\n <div className='icon'>\n <AirgappedTrialActivationConfirmSvg\n width={256}\n height={200}\n />\n </div>\n </div>\n <div className='buttons'>\n <Button\n className='confirm-btn'\n onClick={() => onClose?.()}\n >\n {formatMessage({id: 'air_gapped_modal.close', defaultMessage: 'Close'})}\n </Button>\n </div>\n </Modal.Body>\n </Modal>\n );\n}\n\nexport default AirGappedModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport './icon_message.scss';\n\ntype Props = {\n icon: JSX.Element;\n error?: boolean;\n formattedButtonText?: JSX.Element;\n formattedLinkText?: React.ReactNode;\n formattedTertiaryButonText?: JSX.Element;\n formattedTitle?: JSX.Element;\n formattedSubtitle?: React.ReactNode;\n buttonHandler?: () => void;\n tertiaryButtonHandler?: () => void;\n footer?: JSX.Element;\n testId?: string;\n className?: string;\n}\n\nexport default function IconMessage(props: Props) {\n const {\n icon,\n error,\n formattedButtonText,\n formattedTertiaryButonText,\n formattedTitle,\n formattedSubtitle,\n formattedLinkText,\n buttonHandler,\n tertiaryButtonHandler,\n footer,\n testId,\n className,\n } = props;\n\n let button = null;\n if (formattedButtonText && buttonHandler) {\n button = (\n <div className={classNames('IconMessage-button', error ? 'error' : '')}>\n <button\n className='btn btn-primary Form-btn'\n onClick={buttonHandler}\n >\n {formattedButtonText}\n </button>\n </div>\n );\n }\n\n let tertiaryBtn = null;\n if (formattedTertiaryButonText && tertiaryButtonHandler) {\n tertiaryBtn = (\n <div className={classNames('IconMessage-tertiary-button', error ? 'error' : '')}>\n <button\n className='btn Form-btn'\n onClick={tertiaryButtonHandler}\n >\n {formattedTertiaryButonText}\n </button>\n </div>\n );\n }\n\n let link = null;\n if (formattedLinkText) {\n link = (\n <div className='IconMessage-link'>\n {formattedLinkText}\n </div>\n );\n }\n const withTestId: {'data-testid'?: string} = {};\n if (testId) {\n withTestId['data-testid'] = testId;\n }\n\n return (\n <div\n id='payment_complete_header'\n className='IconMessage'\n {...withTestId}\n >\n <div className={classNames('content', className || '')}>\n <div className='IconMessage__svg-wrapper'>\n {icon}\n </div>\n <h3 className='IconMessage-h3'>\n {formattedTitle || null}\n </h3>\n <div className={classNames('IconMessage-sub', error || '')}>\n {formattedSubtitle || null}\n </div>\n <div className='IconMessage-buttons'>\n {tertiaryBtn}\n {button}\n </div>\n {link}\n {footer}\n </div>\n </div>\n );\n}\n\nIconMessage.defaultProps = {\n error: false,\n subtitle: '',\n date: '',\n className: '',\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function BackIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='24px'\n height='24px'\n viewBox='0 0 24 24'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.back', defaultMessage: 'Back Icon'})}\n >\n <path d='M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z'/>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport {CSSTransition} from 'react-transition-group';\n\nimport BackIcon from 'components/widgets/icons/back_icon';\nimport CloseIcon from 'components/widgets/icons/close_icon';\n\nimport './full_screen_modal.scss';\n\n// This must be on sync with the animation time in ./full_screen_modal.scss\nconst ANIMATION_DURATION = 100;\n\ntype Props = {\n show: boolean;\n onClose: () => void;\n onGoBack?: () => void;\n children: React.ReactNode;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n intl: any; // TODO This needs to be replaced with IntlShape once react-intl is upgraded\n overrideTargetEvent?: boolean;\n ignoreExit?: boolean;\n};\n\nclass FullScreenModal extends React.PureComponent<Props> {\n private modal = React.createRef<HTMLDivElement>();\n\n public componentDidMount() {\n document.addEventListener('keydown', this.handleKeypress);\n document.addEventListener('focus', this.enforceFocus, this.props.overrideTargetEvent);\n this.enforceFocus();\n }\n\n public componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeypress);\n document.removeEventListener('focus', this.enforceFocus, this.props.overrideTargetEvent);\n }\n\n public enforceFocus = () => {\n setTimeout(() => {\n const currentActiveElement = document.activeElement;\n if (this.modal && this.modal.current && !this.modal.current.contains(currentActiveElement)) {\n this.modal.current.focus();\n }\n });\n };\n\n private handleKeypress = (e: KeyboardEvent) => {\n if (this.props.ignoreExit !== undefined && this.props.ignoreExit && e.key === 'Escape') {\n return;\n }\n\n const currentActiveElement = document.activeElement;\n if (!this.props.overrideTargetEvent && e.key === 'Escape' && this.props.show && e.target && this.modal.current && this.modal.current.contains(currentActiveElement)) {\n this.close();\n }\n if (this.props.overrideTargetEvent && e.key === 'Escape' && this.props.show) {\n this.close();\n }\n };\n\n private close = () => {\n this.props.onClose();\n };\n\n public render() {\n return (\n <CSSTransition\n in={this.props.show}\n classNames='FullScreenModal'\n mountOnEnter={true}\n unmountOnExit={true}\n timeout={ANIMATION_DURATION}\n appear={true}\n >\n <>\n <div\n className='FullScreenModal'\n ref={this.modal}\n tabIndex={-1}\n aria-modal={true}\n aria-label={this.props.ariaLabel}\n aria-labelledby={this.props.ariaLabelledBy}\n role='none'\n >\n {this.props.onGoBack &&\n <button\n onClick={this.props.onGoBack}\n className='back'\n aria-label={this.props.intl.formatMessage({id: 'full_screen_modal.back', defaultMessage: 'Back'})}\n >\n <BackIcon id='backIcon'/>\n </button>}\n <button\n onClick={this.close}\n className='close-x'\n aria-label={this.props.intl.formatMessage({id: 'full_screen_modal.close', defaultMessage: 'Close'})}\n >\n <CloseIcon id='closeIcon'/>\n </button>\n {this.props.children}\n </div>\n <div\n tabIndex={0}\n style={{display: 'none'}}\n />\n </>\n </CSSTransition>\n );\n }\n}\n\nconst wrappedComponent = injectIntl(FullScreenModal, {forwardRef: true});\nwrappedComponent.displayName = 'injectIntl(FullScreenModal)';\nwrappedComponent.defaultProps = {\n overrideTargetEvent: true,\n};\nexport default wrappedComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {useOpenCloudZendeskSupportForm} from 'components/common/hooks/useOpenZendeskForm';\nimport IconMessage from 'components/purchase_modal/icon_message';\nimport FullScreenModal from 'components/widgets/modals/full_screen_modal';\n\nimport type {GlobalState} from 'types/store';\n\nimport './result_modal.scss';\n\ntype Props = {\n type?: string;\n onHide?: () => void;\n icon: JSX.Element;\n title: JSX.Element;\n subtitle: JSX.Element;\n primaryButtonText: JSX.Element;\n primaryButtonHandler: () => void;\n identifier: string;\n contactSupportButtonVisible?: boolean;\n resultType: string;\n ignoreExit: boolean;\n};\n\nexport default function ResultModal({type, icon, title, subtitle, primaryButtonText, primaryButtonHandler, identifier, contactSupportButtonVisible, resultType, ignoreExit, onHide}: Props) {\n const dispatch = useDispatch();\n\n const [openContactSupport] = useOpenCloudZendeskSupportForm('Delete workspace', '');\n\n const isResultModalOpen = useSelector((state: GlobalState) =>\n isModalOpen(state, identifier),\n );\n\n const handleHide = () => {\n dispatch(closeModal(identifier));\n onHide?.();\n };\n\n const modalType = `delete-workspace-result_modal__${resultType}`;\n if (type === 'small') {\n return (\n <Modal\n className='ResultModal__small'\n show={isResultModalOpen}\n onHide={handleHide}\n >\n <Modal.Header closeButton={true}/>\n <div className={modalType}>\n <IconMessage\n formattedTitle={title}\n formattedSubtitle={subtitle}\n error={false}\n icon={icon}\n formattedButtonText={primaryButtonText}\n buttonHandler={primaryButtonHandler}\n className={'success'}\n formattedTertiaryButonText={\n contactSupportButtonVisible ? (\n <FormattedMessage\n id={'admin.billing.deleteWorkspace.resultModal.ContactSupport'}\n defaultMessage={'Contact Support'}\n />\n ) : undefined\n }\n tertiaryButtonHandler={contactSupportButtonVisible ? openContactSupport : undefined}\n />\n </div>\n </Modal>\n );\n }\n\n return (\n <FullScreenModal\n show={isResultModalOpen}\n onClose={handleHide}\n ignoreExit={ignoreExit}\n >\n <div className={modalType}>\n <IconMessage\n formattedTitle={title}\n formattedSubtitle={subtitle}\n error={false}\n icon={icon}\n formattedButtonText={primaryButtonText}\n buttonHandler={primaryButtonHandler}\n className={'success'}\n formattedTertiaryButonText={\n contactSupportButtonVisible ? (\n\n <FormattedMessage\n id={'admin.billing.deleteWorkspace.resultModal.ContactSupport'}\n defaultMessage={'Contact Support'}\n />) : undefined\n }\n tertiaryButtonHandler={contactSupportButtonVisible ? openContactSupport : undefined}\n />\n </div>\n </FullScreenModal>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getCloudCustomer} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {getCloudSupportLink, goToCloudSupportForm} from 'utils/contact_support_sales';\n\nexport function useOpenCloudZendeskSupportForm(subject: string, description: string): [() => void, string] {\n const customer = useSelector(getCloudCustomer);\n const customerEmail = customer?.email || '';\n\n const url = getCloudSupportLink(customerEmail, subject, description, window.location.host);\n\n const openContactSupport = useCallback(\n () => goToCloudSupportForm(customerEmail, subject, description, window.location.host),\n [customerEmail, subject, description],\n );\n return [openContactSupport, url];\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width?: number;\n height?: number;\n}\n\nconst Svg = (props: SvgProps) => (\n <svg\n width={props.width?.toString() || '170'}\n height={props.height?.toString() || '129'}\n viewBox='0 0 170 129'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M23.6258 81.7032H134.554C135.371 81.6915 136.149 81.3515 136.719 80.7574C137.29 80.1633 137.605 79.3636 137.597 78.5334V3.15128C137.605 2.32105 137.29 1.52137 136.719 0.927285C136.149 0.333195 135.371 -0.00690192 134.554 -0.0185547H23.6258C22.81 -0.00574534 22.0321 0.334704 21.4621 0.928539C20.8921 1.52237 20.5761 2.32139 20.5831 3.15128V78.5378C20.5773 79.3669 20.8938 80.1648 21.4637 80.7577C22.0336 81.3505 22.8107 81.6904 23.6258 81.7032Z'\n fill='#3F4350'\n />\n <path\n d='M11.3887 92.5439C11.3887 96.2965 14.4453 100.049 18.1524 100.049H140.031C143.525 100.049 146.791 96.3052 146.791 92.5439H11.3887Z'\n fill='#767D93'\n />\n <path\n d='M135.508 81.7031H22.6718L11.3887 92.5438H146.791L135.508 81.7031Z'\n fill='#D1D4DB'\n />\n <path\n d='M132.133 82.5371H26.0413L22.2539 87.1235H135.925L132.133 82.5371Z'\n fill='#AFB3C0'\n />\n <path\n d='M90.7217 88.7915H67.4624L65.7168 91.2932H92.4629L90.7217 88.7915Z'\n fill='#24262E'\n />\n <rect\n width='103.641'\n height='66.7116'\n transform='translate(27.2695 7.06982)'\n fill='white'\n />\n <rect\n x='27.2695'\n y='7.06982'\n width='104'\n height='67'\n fill='#3F4350'\n fillOpacity='0.16'\n />\n <path\n d='M79.0896 2.06641C79.4202 2.06641 79.7434 2.16423 80.0183 2.34748C80.2932 2.53074 80.5075 2.79121 80.634 3.09596C80.7605 3.40071 80.7936 3.73605 80.7291 4.05957C80.6646 4.38309 80.5054 4.68026 80.2717 4.9135C80.0379 5.14675 79.74 5.30559 79.4157 5.36994C79.0915 5.4343 78.7553 5.40125 78.4499 5.27502C78.1444 5.14879 77.8834 4.93504 77.6997 4.66077C77.516 4.38651 77.418 4.06405 77.418 3.7342C77.418 3.29187 77.5941 2.86766 77.9076 2.55489C78.2211 2.24212 78.6463 2.06641 79.0896 2.06641Z'\n fill='#989DAE'\n />\n <path\n d='M88.7203 97.5471H69.0285C68.3489 97.5471 66.5527 97.5471 66.5527 95.0454H91.2093C91.2093 97.5471 89.3602 97.5471 88.7203 97.5471Z'\n fill='#3F4350'\n />\n <path\n d='M60.1793 63.0923C57.6677 63.0923 56.5297 61.286 57.6504 59.0783L77.9502 19.2945C79.0997 17.0926 80.9101 17.0926 82.0366 19.2945L102.331 59.0783C103.48 61.2803 102.331 63.0923 99.8019 63.0923H60.1793Z'\n fill='#FFBC1F'\n />\n <path\n d='M76.8061 34.0084L78.8924 47.9941C78.9125 48.2716 79.0372 48.5312 79.2414 48.7207C79.4456 48.9103 79.7141 49.0156 79.993 49.0156C80.2719 49.0156 80.5404 48.9103 80.7446 48.7207C80.9488 48.5312 81.0736 48.2716 81.0937 47.9941L83.18 34.0084C83.5593 28.5552 76.421 28.5552 76.8061 34.0084Z'\n fill='#2D3039'\n />\n <path\n d='M79.9903 50.523C80.6221 50.5241 81.2393 50.712 81.7641 51.063C82.2888 51.4141 82.6976 51.9124 82.9385 52.4951C83.1795 53.0777 83.242 53.7186 83.118 54.3367C82.9941 54.9547 82.6893 55.5223 82.2421 55.9676C81.795 56.4129 81.2256 56.716 80.6059 56.8385C79.9862 56.9611 79.344 56.8976 78.7604 56.6561C78.1768 56.4147 77.6781 56.006 77.3272 55.4818C76.9763 54.9577 76.7891 54.3415 76.7891 53.7112C76.7891 53.292 76.8718 52.8769 77.0328 52.4898C77.1937 52.1026 77.4297 51.7509 77.727 51.4547C78.0244 51.1586 78.3773 50.9239 78.7657 50.764C79.1541 50.6041 79.5702 50.5222 79.9903 50.523Z'\n fill='#2D3039'\n />\n </svg>\n);\n\nexport default Svg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {closeModal} from 'actions/views/modals';\n\nimport ResultModal from 'components/admin_console/billing/delete_workspace/result_modal';\nimport LaptopAlertSvg from 'components/common/svg_images_components/laptop_with_warning_symbol_svg';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n onTryAgain?: () => void;\n title?: JSX.Element;\n subtitle?: JSX.Element;\n buttonText?: JSX.Element;\n}\n\nexport default function StartTrialFormModalResult(props: Props) {\n const dispatch = useDispatch();\n\n const handleButtonClick = () => {\n props.onTryAgain?.();\n dispatch(closeModal(ModalIdentifiers.START_TRIAL_FORM_MODAL_RESULT));\n };\n\n const title = props.title || (\n <FormattedMessage\n defaultMessage={'Please try again'}\n id={'start_trial_form_modal.failureModal.title'}\n />\n );\n\n const subtitle = (\n <>\n <FormattedMessage\n id={'start_trial_form_modal.failureModal.subtitle'}\n defaultMessage={'There was an issue processing your trial request.'}\n />\n <br/>\n <FormattedMessage\n id={'start_trial_form_modal.failureModal.subtitle2'}\n defaultMessage={'Please try again or contact support.'}\n />\n </>\n );\n\n const buttonText = props.buttonText || (\n <FormattedMessage\n id='admin.billing.deleteWorkspace.failureModal.buttonText'\n defaultMessage={'Try Again'}\n />\n );\n\n return (\n <ResultModal\n primaryButtonText={buttonText}\n primaryButtonHandler={handleButtonClick}\n onHide={handleButtonClick}\n identifier={ModalIdentifiers.START_TRIAL_FORM_MODAL_RESULT}\n subtitle={subtitle}\n title={title}\n ignoreExit={false}\n type='small'\n resultType='failure'\n icon={\n <LaptopAlertSvg\n width={135}\n height={100}\n />\n }\n contactSupportButtonVisible={true}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect, useState} from 'react';\nimport {Modal, Button} from 'react-bootstrap';\nimport {FormattedMessage, defineMessages, useIntl} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {getLicenseConfig} from 'mattermost-redux/actions/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/common';\n\nimport {requestTrialLicense} from 'actions/admin_actions';\nimport {validateBusinessEmail} from 'actions/cloud';\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {closeModal, openModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport useCWSAvailabilityCheck, {CSWAvailabilityCheckTypes} from 'components/common/hooks/useCWSAvailabilityCheck';\nimport useGetTotalUsersNoBots from 'components/common/hooks/useGetTotalUsersNoBots';\nimport DropdownInput from 'components/dropdown_input';\nimport ExternalLink from 'components/external_link';\nimport CountrySelector from 'components/payment_form/country_selector';\nimport Input, {SIZE} from 'components/widgets/inputs/input/input';\nimport type {CustomMessageInputType} from 'components/widgets/inputs/input/input';\n\nimport {AboutLinks, LicenseLinks, ModalIdentifiers, TELEMETRY_CATEGORIES} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport AirGappedModal from './air_gapped_modal';\nimport StartTrialFormModalResult from './failure_modal';\n\nimport './start_trial_form_modal.scss';\n\nconst TrialBenefitsModal = makeAsyncComponent('TrialBenefitsModal', React.lazy(() => import('components/trial_benefits_modal/trial_benefits_modal')));\n\nenum TrialLoadStatus {\n NotStarted = 'NOT_STARTED',\n Started = 'STARTED',\n Success = 'SUCCESS',\n Failed = 'FAILED'\n}\n\ndefineMessages({\n ONE_TO_50: {\n id: 'ONE_TO_50',\n defaultMessage: '1-50',\n },\n FIFTY_TO_100: {\n id: 'FIFTY_TO_100',\n defaultMessage: '51-100',\n },\n ONE_HUNDRED_TO_500: {\n id: 'ONE_HUNDRED_TO_500',\n defaultMessage: '101-500',\n },\n FIVE_HUNDRED_TO_1000: {\n id: 'FIVE_HUNDRED_TO_1000',\n defaultMessage: '501-1000',\n },\n ONE_THOUSAND_TO_2500: {\n id: 'ONE_THOUSAND_TO_2500',\n defaultMessage: '1001-2500',\n },\n TWO_THOUSAND_FIVE_HUNDRED_AND_UP: {\n id: 'TWO_THOUSAND_FIVE_HUNDRED_AND_UP',\n defaultMessage: '2501+',\n },\n});\n\nexport enum OrgSize {\n ONE_TO_50 = '1-50',\n FIFTY_TO_100 = '51-100',\n ONE_HUNDRED_TO_500 = '101-500',\n FIVE_HUNDRED_TO_1000 = '501-1000',\n ONE_THOUSAND_TO_2500 = '1001-2500',\n TWO_THOUSAND_FIVE_HUNDRED_AND_UP = '2501+',\n}\n\ntype Props = {\n onClose?: () => void;\n page?: string;\n}\n\nfunction StartTrialFormModal(props: Props): JSX.Element | null {\n const [status, setLoadStatus] = useState(TrialLoadStatus.NotStarted);\n const dispatch = useDispatch();\n const currentUser = useSelector(getCurrentUser);\n const [name, setName] = useState('');\n const [email, setEmail] = useState(currentUser.email);\n const [companyName, setCompanyName] = useState('');\n const [orgSize, setOrgSize] = useState<OrgSize | undefined>();\n const [country, setCountry] = useState('');\n const [businessEmailError, setBusinessEmailError] = useState<CustomMessageInputType | undefined>(undefined);\n const {formatMessage} = useIntl();\n const cwsAvailability = useCWSAvailabilityCheck();\n const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.START_TRIAL_FORM_MODAL));\n const totalUsers = useGetTotalUsersNoBots(true) || 0;\n const [didOnce, setDidOnce] = useState(false);\n\n const handleValidateBusinessEmail = async (email: string) => {\n setDidOnce(true);\n if (!email) {\n setBusinessEmailError(undefined);\n return;\n }\n const isBusinessEmail = await validateBusinessEmail(email)();\n\n if (isBusinessEmail) {\n setBusinessEmailError(undefined);\n return;\n }\n\n setBusinessEmailError({\n type: 'error',\n value: formatMessage({id: 'start_trial_form.invalid_business_email', defaultMessage: 'Please enter a valid business email address.'},\n ),\n });\n };\n\n useEffect(() => {\n trackEvent(TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_MODAL, 'form_opened');\n if (email && !didOnce) {\n handleValidateBusinessEmail(email);\n }\n }, [email, didOnce]);\n\n if (!show) {\n return null;\n }\n\n const openTrialBenefitsModal = () => {\n dispatch(openModal({\n modalId: ModalIdentifiers.TRIAL_BENEFITS_MODAL,\n dialogType: TrialBenefitsModal,\n dialogProps: {trialJustStarted: true},\n }));\n };\n\n // Reset the TrialLoadStatus so the user can re-submit the form\n const handleErrorModalTryAgain = () => {\n dispatch(closeModal(ModalIdentifiers.START_TRIAL_FORM_MODAL_RESULT));\n setLoadStatus(TrialLoadStatus.NotStarted);\n };\n\n const requestLicense = async () => {\n setLoadStatus(TrialLoadStatus.Started);\n const requestedUsers = Math.max(totalUsers, 30);\n const trialRequestBody = {\n users: requestedUsers,\n terms_accepted: true,\n receive_emails_accepted: true,\n contact_name: name,\n contact_email: email,\n company_name: companyName,\n company_country: country,\n company_size: orgSize,\n };\n const {error, data} = await dispatch(requestTrialLicense(trialRequestBody, props.page || 'license'));\n if (error) {\n setLoadStatus(TrialLoadStatus.Failed);\n let title;\n let subtitle;\n let buttonText;\n let onTryAgain = handleErrorModalTryAgain;\n\n if ((data as any).status === 422) {\n title = (<></>);\n subtitle = (\n <FormattedMessage\n id='admin.license.trial-request.embargoed'\n defaultMessage='We were unable to process the request due to limitations for embargoed countries. <link>Learn more in our documentation</link>, or reach out to legal@mattermost.com for questions around export limitations.'\n values={{\n link: (text: string) => (\n <ExternalLink\n location='trial_banner'\n href={LicenseLinks.EMBARGOED_COUNTRIES}\n >\n {text}\n </ExternalLink>\n ),\n }}\n />\n );\n buttonText = (\n <FormattedMessage\n id='admin.license.trial-request.embargoed.button'\n defaultMessage='Close'\n />\n );\n onTryAgain = handleOnClose;\n }\n dispatch(openModal({\n modalId: ModalIdentifiers.START_TRIAL_FORM_MODAL_RESULT,\n dialogType: StartTrialFormModalResult,\n dialogProps: {\n onTryAgain,\n title,\n subtitle,\n buttonText,\n },\n }));\n return;\n }\n\n setLoadStatus(TrialLoadStatus.Success);\n await dispatch(getLicenseConfig());\n dispatch(closeModal(ModalIdentifiers.START_TRIAL_FORM_MODAL));\n openTrialBenefitsModal();\n };\n\n const btnText = (status: TrialLoadStatus): string => {\n switch (status) {\n case TrialLoadStatus.Started:\n return formatMessage({id: 'start_trial.modal.loading', defaultMessage: 'Loading...'});\n case TrialLoadStatus.Success:\n return formatMessage({id: 'start_trial.modal.loaded', defaultMessage: 'Loaded!'});\n case TrialLoadStatus.Failed:\n return formatMessage({id: 'start_trial.modal.failed', defaultMessage: 'Failed'});\n default:\n return formatMessage({id: 'start_trial_form.modal_btn.start', defaultMessage: 'Start trial'});\n }\n };\n\n const handleOnClose = () => {\n if (props.onClose) {\n props.onClose();\n }\n trackEvent(TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_MODAL, 'form_closed');\n dispatch(closeModal(ModalIdentifiers.START_TRIAL_FORM_MODAL));\n };\n\n const getOrgSizeDropdownValue = () => {\n if (typeof orgSize === 'undefined') {\n return orgSize;\n }\n return {\n value: orgSize,\n label: formatMessage({id: orgSize, defaultMessage: OrgSize[orgSize as unknown as keyof typeof OrgSize]}),\n };\n };\n\n const isSubmitDisabled = (\n !name ||\n !email ||\n !companyName ||\n !orgSize ||\n !country ||\n Boolean(businessEmailError) ||\n status === TrialLoadStatus.Started ||\n status === TrialLoadStatus.Success\n );\n\n if (cwsAvailability === CSWAvailabilityCheckTypes.Unavailable) {\n return (\n <AirGappedModal\n onClose={handleOnClose}\n />\n );\n }\n\n return (\n <Modal\n className={classNames('StartTrialFormModal', {error: TrialLoadStatus.Failed === status})}\n dialogClassName='a11y__modal'\n show={show}\n id='StartTrialFormModal'\n role='none'\n onHide={handleOnClose}\n >\n <Modal.Header closeButton={true}>\n <div className='title'>\n <FormattedMessage\n id='start_trial_form.modal_title'\n defaultMessage='Start Trial'\n />\n </div>\n <div className='description'>\n <FormattedMessage\n id='start_trial_form.modal_body'\n defaultMessage='Just a few quick items to help us tailor your trial experience.'\n />\n </div>\n </Modal.Header>\n <Modal.Body>\n <Input\n className={'name_input'}\n name='name'\n type='text'\n value={name}\n inputSize={SIZE.LARGE}\n onChange={(e) => setName(e.target.value)}\n required={true}\n placeholder={formatMessage({id: 'start_trial_form.name', defaultMessage: 'Name'})}\n />\n <Input\n className={'email_input'}\n onBlur={(e) => handleValidateBusinessEmail(e.target.value)}\n name='email'\n type='text'\n value={email}\n inputSize={SIZE.LARGE}\n onChange={(e) => setEmail(e.target.value)}\n required={true}\n placeholder={formatMessage({id: 'start_trial_form.email', defaultMessage: 'Business Email'})}\n customMessage={businessEmailError}\n />\n <Input\n className={'company_name_input'}\n name='company_name'\n type='text'\n inputSize={SIZE.LARGE}\n value={companyName}\n onChange={(e) => setCompanyName(e.target.value)}\n required={true}\n placeholder={formatMessage({id: 'start_trial_form.company_name', defaultMessage: 'Company Name'})}\n />\n <DropdownInput\n className={'company_size_dropdown'}\n onChange={(e) => {\n setOrgSize(e.value as OrgSize);\n }}\n value={getOrgSizeDropdownValue()}\n options={Object.entries(OrgSize).map(([value, label]) => ({value, label}))}\n legend={formatMessage({id: 'start_trial_form.company_size', defaultMessage: 'Company Size'})}\n placeholder={formatMessage({id: 'start_trial_form.company_size', defaultMessage: 'Company Size'})}\n name='company_size_dropdown'\n />\n <div className='countries-section'>\n <CountrySelector\n onChange={(e) => setCountry(e.value)}\n value={country}\n />\n </div>\n <div className='disclaimer'>\n <FormattedMessage\n id='start_trial_form.disclaimer'\n defaultMessage='By selecting Start trial, I agree to the <agreement>Mattermost Software Evaluation Agreement</agreement>, <privacypolicy>Privacy Policy</privacypolicy>, and receiving product emails.'\n values={{\n agreement: (msg: React.ReactNode) => (\n <ExternalLink\n href='https://mattermost.com/software-evaluation-agreement/'\n location='start_trial_form_modal'\n >\n {msg}\n </ExternalLink>\n ),\n privacypolicy: (msg: React.ReactNode) => (\n <ExternalLink\n href={AboutLinks.PRIVACY_POLICY}\n location='start_trial_form_modal'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n <div className='buttons'>\n <Button\n disabled={isSubmitDisabled}\n className='confirm-btn'\n onClick={requestLicense}\n >\n {btnText(status)}\n </Button>\n </div>\n </Modal.Body>\n </Modal>\n );\n}\n\nexport default StartTrialFormModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusAwayAvatarIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='13px'\n height='13px'\n viewBox='0 0 12 12'\n style={style}\n role='img'\n aria-label={formatMessage({id: 'mobile.set_status.away.icon', defaultMessage: 'Away Icon'})}\n >\n <path\n className='away--icon'\n d='M9.081,5.712C9.267,5.712 9.417,5.863 9.417,6.048L9.417,9.086L11.864,10.499C12.025,10.592 12.08,10.797 11.987,10.958L11.482,11.832C11.39,11.993 11.184,12.048 11.023,11.955L7.904,10.154C7.788,10.087 7.727,9.961 7.737,9.836C7.736,9.827 7.736,9.818 7.736,9.809L7.736,6.048C7.736,5.863 7.886,5.712 8.072,5.712L9.081,5.712ZM4.812,11.513L4.605,11.513C2.325,11.41 0.253,10.374 0.046,9.027C-0.058,8.923 0.046,8.509 0.046,8.405C0.15,7.576 0.357,6.437 0.771,5.815C0.978,5.401 2.015,5.297 2.015,5.297C2.015,5.297 2.015,7.369 4.605,7.369L5.019,7.369C4.915,7.784 4.812,8.198 4.812,8.612C4.812,9.648 5.226,10.581 5.848,11.41C5.537,11.513 5.123,11.513 4.812,11.513ZM4.605,0.117C6.034,0.117 7.195,1.277 7.195,2.707C7.195,4.136 6.034,5.297 4.605,5.297C3.175,5.297 2.015,4.136 2.015,2.707C2.015,1.277 3.175,0.117 4.605,0.117Z'\n />\n </svg>\n </span>\n );\n}\n\nconst style: CSSProperties = {\n fillRule: 'evenodd',\n clipRule: 'evenodd',\n strokeLinejoin: 'round',\n strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusAwayIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='100%'\n height='100%'\n viewBox='0 0 20 20'\n style={style}\n role='img'\n aria-label={formatMessage({id: 'mobile.set_status.away.icon', defaultMessage: 'Away Icon'})}\n >\n <path\n className='away--icon'\n d='M10,0C15.519,0 20,4.481 20,10C20,15.519 15.519,20 10,20C4.481,20 0,15.519 0,10C0,4.481 4.481,0 10,0ZM10.27,3C10.949,3 11.5,3.586 11.5,4.307L11.5,9.379L15.002,12.881C15.492,13.37 15.499,14.158 15.019,14.638L14.638,15.019C14.158,15.499 13.37,15.492 12.881,15.002L8.887,11.008C8.739,10.861 8.636,10.686 8.576,10.501C8.528,10.402 8.5,10.299 8.5,10.193L8.5,4.307C8.5,3.586 9.051,3 9.73,3L10.27,3Z'\n />\n </svg>\n </span>\n );\n}\n\nconst style: CSSProperties = {\n fillRule: 'evenodd',\n clipRule: 'evenodd',\n strokeLinejoin: 'round',\n strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusDndAvatarIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n x='0px'\n y='0px'\n width='13px'\n height='13px'\n viewBox='-299 391 12 12'\n enableBackground='new -299 391 12 12'\n role='img'\n aria-label={formatMessage({id: 'mobile.set_status.dnd.icon', defaultMessage: 'Do Not Disturb Icon'})}\n >\n <g>\n <ellipse\n className='dnd--icon'\n cx='-294.6'\n cy='394'\n rx='2.5'\n ry='2.5'\n />\n <path\n className='dnd--icon'\n d='M-293.8,399.4c0-0.4,0.1-0.7,0.2-1c-0.3,0.1-0.6,0.2-1,0.2c-2.5,0-2.5-2-2.5-2s-1,0.1-1.2,0.5c-0.4,0.6-0.6,1.7-0.7,2.5 c0,0.1-0.1,0.5,0,0.6c0.2,1.3,2.2,2.3,4.4,2.4c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0.7,0,1.4-0.1,2-0.3 C-293.3,401.5-293.8,400.5-293.8,399.4z'\n />\n </g>\n <path\n className='dnd--icon'\n d='M-287,400c0,0.1-0.1,0.1-0.1,0.1l-4.9,0c-0.1,0-0.1-0.1-0.1-0.1v-1.6c0-0.1,0.1-0.1,0.1-0.1l4.9,0c0.1,0,0.1,0.1,0.1,0.1 V400z'\n />\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusDndIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='100%'\n height='100%'\n viewBox='0 0 20 20'\n style={style}\n role='img'\n aria-label={formatMessage({id: 'mobile.set_status.dnd.icon', defaultMessage: 'Do Not Disturb Icon'})}\n >\n <path\n className='dnd--icon'\n d='M10,0c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c0,-5.519 4.481,-10 10,-10Zm5.25,8.5l-10.5,0c-0.414,0 -0.75,0.336 -0.75,0.75l0,1.5c0,0.414 0.336,0.75 0.75,0.75l10.5,0c0.414,0 0.75,-0.336 0.75,-0.75l0,-1.5c0,-0.414 -0.336,-0.75 -0.75,-0.75Z'\n />\n </svg>\n </span>\n );\n}\n\nconst style: CSSProperties = {\n fillRule: 'evenodd',\n clipRule: 'evenodd',\n strokeLinejoin: 'round',\n strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusOfflineAvatarIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n x='0px'\n y='0px'\n width='13px'\n height='13px'\n viewBox='-299 391 12 12'\n enableBackground='new -299 391 12 12'\n role='img'\n aria-label={formatMessage({id: 'mobile.set_status.offline.icon', defaultMessage: 'Offline Icon'})}\n >\n <g>\n <g>\n <ellipse\n className='offline--icon'\n cx='-294.5'\n cy='394'\n rx='2.5'\n ry='2.5'\n />\n <path\n className='offline--icon'\n d='M-294.3,399.7c0-0.4,0.1-0.8,0.2-1.2c-0.1,0-0.2,0-0.4,0c-2.5,0-2.5-2-2.5-2s-1,0.1-1.2,0.5c-0.4,0.6-0.6,1.7-0.7,2.5 c0,0.1-0.1,0.5,0,0.6c0.2,1.3,2.2,2.3,4.4,2.4h0.1h0.1c0.3,0,0.7,0,1-0.1C-293.9,401.6-294.3,400.7-294.3,399.7z'\n />\n </g>\n </g>\n <g>\n <path\n className='offline--icon'\n d='M-288.9,399.4l1.8-1.8c0.1-0.1,0.1-0.3,0-0.3l-0.7-0.7c-0.1-0.1-0.3-0.1-0.3,0l-1.8,1.8l-1.8-1.8c-0.1-0.1-0.3-0.1-0.3,0 l-0.7,0.7c-0.1,0.1-0.1,0.3,0,0.3l1.8,1.8l-1.8,1.8c-0.1,0.1-0.1,0.3,0,0.3l0.7,0.7c0.1,0.1,0.3,0.1,0.3,0l1.8-1.8l1.8,1.8 c0.1,0.1,0.3,0.1,0.3,0l0.7-0.7c0.1-0.1,0.1-0.3,0-0.3L-288.9,399.4z'\n />\n </g>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusOfflineIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='100%'\n height='100%'\n className='offline--icon'\n viewBox='0 0 20 20'\n style={style}\n role='img'\n aria-label={formatMessage({id: 'mobile.set_status.offline.icon', defaultMessage: 'Offline Icon'})}\n >\n <path d='M10,0c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c0,-5.519 4.481,-10 10,-10Zm0,2c4.415,0 8,3.585 8,8c0,4.415 -3.585,8 -8,8c-4.415,0 -8,-3.585 -8,-8c0,-4.415 3.585,-8 8,-8Z'/>\n </svg>\n </span>\n );\n}\n\nconst style: CSSProperties = {\n fillRule: 'evenodd',\n clipRule: 'evenodd',\n strokeLinejoin: 'round',\n strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusOnlineAvatarIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n x='0px'\n y='0px'\n width='13px'\n height='13px'\n viewBox='-243 245 12 12'\n enableBackground='new -243 245 12 12'\n role='img'\n aria-label={formatMessage({id: 'mobile.set_status.online.icon', defaultMessage: 'Online Icon'})}\n >\n <g>\n <path\n className='online--icon'\n d='M-236,250.5C-236,250.5-236,250.5-236,250.5C-236,250.5-236,250.5-236,250.5C-236,250.5-236,250.5-236,250.5z'\n />\n <ellipse\n className='online--icon'\n cx='-238.5'\n cy='248'\n rx='2.5'\n ry='2.5'\n />\n </g>\n <path\n className='online--icon'\n d='M-238.9,253.8c0-0.4,0.1-0.9,0.2-1.3c-2.2-0.2-2.2-2-2.2-2s-1,0.1-1.2,0.5c-0.4,0.6-0.6,1.7-0.7,2.5c0,0.1-0.1,0.5,0,0.6 c0.2,1.3,2.2,2.3,4.4,2.4c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0C-238.7,255.7-238.9,254.8-238.9,253.8z'\n />\n <g>\n <g>\n <path\n className='online--icon'\n d='M-232.3,250.1l1.3,1.3c0,0,0,0.1,0,0.1l-4.1,4.1c0,0,0,0-0.1,0c0,0,0,0,0,0l-2.7-2.7c0,0,0-0.1,0-0.1l1.2-1.2 c0,0,0.1,0,0.1,0l1.4,1.4l2.9-2.9C-232.4,250.1-232.3,250.1-232.3,250.1z'\n />\n </g>\n </g>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function StatusOnlineIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='100%'\n height='100%'\n viewBox='0 0 20 20'\n style={style}\n role='img'\n aria-label={formatMessage({id: 'mobile.set_status.online.icon', defaultMessage: 'Online Icon'})}\n >\n <path\n className='online--icon'\n d='M10,0c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c0,-5.519 4.481,-10 10,-10Zm6.19,7.18c0,0.208 -0.075,0.384 -0.224,0.53l-5.782,5.64l-1.087,1.059c-0.149,0.146 -0.33,0.218 -0.543,0.218c-0.213,0 -0.394,-0.072 -0.543,-0.218l-1.086,-1.059l-2.891,-2.82c-0.149,-0.146 -0.224,-0.322 -0.224,-0.53c0,-0.208 0.075,-0.384 0.224,-0.53l1.086,-1.059c0.149,-0.146 0.33,-0.218 0.543,-0.218c0.213,0 0.394,0.072 0.543,0.218l2.348,2.298l5.24,-5.118c0.149,-0.146 0.33,-0.218 0.543,-0.218c0.213,0 0.394,0.072 0.543,0.218l1.086,1.059c0.149,0.146 0.224,0.322 0.224,0.53Z'\n />\n </svg>\n </span>\n );\n}\n\nconst style: CSSProperties = {\n fillRule: 'evenodd',\n clipRule: 'evenodd',\n strokeLinejoin: 'round',\n strokeMiterlimit: 1.41421,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport StatusAwayAvatarIcon from 'components/widgets/icons/status_away_avatar_icon';\nimport StatusAwayIcon from 'components/widgets/icons/status_away_icon';\nimport StatusDndAvatarIcon from 'components/widgets/icons/status_dnd_avatar_icon';\nimport StatusDndIcon from 'components/widgets/icons/status_dnd_icon';\nimport StatusOfflineAvatarIcon from 'components/widgets/icons/status_offline_avatar_icon';\nimport StatusOfflineIcon from 'components/widgets/icons/status_offline_icon';\nimport StatusOnlineAvatarIcon from 'components/widgets/icons/status_online_avatar_icon';\nimport StatusOnlineIcon from 'components/widgets/icons/status_online_icon';\n\ntype Props = {\n button?: boolean;\n status?: string;\n className?: string;\n type?: string;\n}\n\nconst StatusIcon = ({\n className = '',\n button = false,\n status,\n type,\n}: Props) => {\n if (!status) {\n return null;\n }\n\n let iconClassName = `status ${className}`;\n\n if (button) {\n iconClassName = className || '';\n }\n\n if (type === 'avatar') {\n if (status === 'online') {\n return <StatusOnlineAvatarIcon className={iconClassName}/>;\n } else if (status === 'away') {\n return <StatusAwayAvatarIcon className={iconClassName}/>;\n } else if (status === 'dnd') {\n return <StatusDndAvatarIcon className={iconClassName}/>;\n }\n return <StatusOfflineAvatarIcon className={iconClassName}/>;\n } else if (status === 'online') {\n return <StatusOnlineIcon className={iconClassName}/>;\n } else if (status === 'away') {\n return <StatusAwayIcon className={iconClassName}/>;\n } else if (status === 'dnd') {\n return <StatusDndIcon className={iconClassName}/>;\n }\n return <StatusOfflineIcon className={iconClassName}/>;\n};\n\nexport default memo(StatusIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable max-lines */\n\nimport type {Store} from 'redux';\n\nimport {Constants} from 'utils/constants';\n\nimport {\n AppsTypes,\n\n AppBindingLocations,\n AppCallResponseTypes,\n AppFieldTypes,\n makeAppBindingsSelector,\n selectChannel,\n getChannel,\n getCurrentTeamId,\n doAppFetchForm,\n doAppLookup,\n getStore,\n EXECUTE_CURRENT_COMMAND_ITEM_ID,\n COMMAND_SUGGESTION_ERROR,\n getExecuteSuggestion,\n createCallRequest,\n selectUserByUsername,\n getUserByUsername,\n selectUser,\n getUser,\n getChannelByNameAndTeamName,\n getCurrentTeam,\n selectChannelByName,\n errorMessage as parserErrorMessage,\n filterEmptyOptions,\n autocompleteUsersInChannel,\n autocompleteChannels,\n getOpenInModalSuggestion,\n OPEN_COMMAND_IN_MODAL_ITEM_ID,\n getChannelSuggestions,\n getUserSuggestions,\n inTextMentionSuggestions,\n getAppCommandForm,\n getAppRHSCommandForm,\n makeRHSAppBindingSelector,\n} from './app_command_parser_dependencies';\nimport type {\n AppCallRequest,\n AppBinding,\n AppCall,\n AppField,\n DoAppCallResult,\n AppLookupResponse,\n AppContext,\n AppForm,\n AppCallValues,\n AppSelectOption,\n AutocompleteSuggestion,\n AutocompleteStaticSelect,\n Channel,\n ExtendedAutocompleteSuggestion,\n intlShim} from './app_command_parser_dependencies';\n\nexport enum ParseState {\n Start = 'Start',\n Command = 'Command',\n EndCommand = 'EndCommand',\n CommandSeparator = 'CommandSeparator',\n StartParameter = 'StartParameter',\n ParameterSeparator = 'ParameterSeparator',\n Flag1 = 'Flag1',\n Flag = 'Flag',\n FlagValueSeparator = 'FlagValueSeparator',\n StartValue = 'StartValue',\n NonspaceValue = 'NonspaceValue',\n QuotedValue = 'QuotedValue',\n TickValue = 'TickValue',\n EndValue = 'EndValue',\n EndQuotedValue = 'EndQuotedValue',\n EndTickedValue = 'EndTickedValue',\n Error = 'Error',\n MultiselectStart = 'MultiselectStart',\n MultiselectStartValue = 'MultiselectStartValue',\n MultiselectNonspaceValue = 'MultiselectNonspaceValue',\n MultiselectQuotedValue = 'MultiselectQuotedValue',\n MultiselectTickValue = 'MultiselectTickValue',\n MultiselectEndValue = 'MultiselectEndValue',\n MultiselectEndQuotedValue = 'MultiselectEndQuotedValue',\n MultiselectEndTickedValue = 'MultiselectEndTickedValue',\n MultiselectValueSeparator = 'MultiselectValueSeparator',\n MultiselectNextValue = 'MultiselectNextValue',\n Rest = 'Rest',\n}\n\ninterface FormsCache {\n getSubmittableForm: (location: string, binding: AppBinding) => Promise<{form?: AppForm; error?: string} | undefined>;\n}\n\ntype Intl = typeof intlShim;\n\nconst getCommandBindings = makeAppBindingsSelector(AppBindingLocations.COMMAND);\nconst getRHSCommandBindings = makeRHSAppBindingSelector(AppBindingLocations.COMMAND);\n\nexport class ParsedCommand {\n state = ParseState.Start;\n command: string;\n i = 0;\n incomplete = '';\n incompleteStart = 0;\n binding: AppBinding | undefined;\n resolvedForm: AppForm | undefined;\n formsCache: FormsCache;\n field: AppField | undefined;\n position = 0;\n values: {[name: string]: string | string[]} = {};\n location = '';\n error = '';\n intl: Intl;\n\n constructor(command: string, formsCache: FormsCache, intl: any) {\n this.command = command;\n this.formsCache = formsCache || [];\n this.intl = intl;\n }\n\n private asError = (message: string): ParsedCommand => {\n this.state = ParseState.Error;\n this.error = message;\n return this;\n };\n\n // matchBinding finds the closest matching command binding.\n public matchBinding = async (commandBindings: AppBinding[], autocompleteMode = false): Promise<ParsedCommand> => {\n if (commandBindings.length === 0) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.no_bindings',\n defaultMessage: 'No command bindings.',\n }));\n }\n let bindings = commandBindings;\n\n let done = false;\n while (!done) {\n let c = '';\n if (this.i < this.command.length) {\n c = this.command[this.i];\n }\n\n switch (this.state) {\n case ParseState.Start: {\n if (c !== '/') {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.no_slash_start',\n defaultMessage: 'Command must start with a `/`.',\n }));\n }\n this.i++;\n this.incomplete = '';\n this.incompleteStart = this.i;\n this.state = ParseState.Command;\n break;\n }\n\n case ParseState.Command: {\n switch (c) {\n case '': {\n if (autocompleteMode) {\n // Finish in the Command state, 'incomplete' will have the query string\n done = true;\n } else {\n this.state = ParseState.EndCommand;\n }\n break;\n }\n case ' ':\n case '\\t': {\n this.state = ParseState.EndCommand;\n break;\n }\n default:\n this.incomplete += c;\n this.i++;\n break;\n }\n break;\n }\n\n case ParseState.EndCommand: {\n const binding = bindings.find((b: AppBinding) => b.label.toLowerCase() === this.incomplete.toLowerCase());\n if (!binding) {\n // gone as far as we could, this token doesn't match a sub-command.\n // return the state from the last matching binding\n done = true;\n break;\n }\n this.binding = binding;\n this.location += '/' + binding.label;\n bindings = binding.bindings || [];\n this.state = ParseState.CommandSeparator;\n break;\n }\n\n case ParseState.CommandSeparator: {\n if (c === '') {\n done = true;\n }\n\n switch (c) {\n case ' ':\n case '\\t': {\n this.i++;\n break;\n }\n default: {\n this.incomplete = '';\n this.incompleteStart = this.i;\n this.state = ParseState.Command;\n break;\n }\n }\n break;\n }\n\n default: {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.unexpected_state',\n defaultMessage: 'Unreachable: Unexpected state in matchBinding: `{state}`.',\n }, {\n state: this.state,\n }));\n }\n }\n }\n\n if (!this.binding) {\n if (autocompleteMode) {\n return this;\n }\n\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.no_match',\n defaultMessage: '`{command}`: No matching command found in this workspace.',\n }, {\n command: this.command,\n }));\n }\n\n if (!autocompleteMode && this.binding.bindings?.length) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.execute_non_leaf',\n defaultMessage: 'You must select a subcommand.',\n }));\n }\n\n if (!this.binding.bindings?.length) {\n // No more sub-bindings, must be a submit or a form.\n if (this.binding.submit && !this.binding.form) {\n // Submit, no form in the binding, construct an empty form for\n // submission.\n this.resolvedForm = {\n submit: this.binding.submit,\n };\n } else if (this.binding.form && !this.binding.submit) {\n // Form, no submit in the binding. Refresh the form from the\n // source/cache as needed.\n const form = this.binding.form;\n if (!form.submit) {\n const fetched = await this.formsCache.getSubmittableForm(this.location, this.binding);\n if (fetched?.error) {\n return this.asError(fetched.error);\n }\n this.resolvedForm = fetched?.form;\n }\n this.resolvedForm = this.binding?.form;\n } else {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser',\n defaultMessage: 'Parsing error: {error}',\n }, {\n error: 'unreachable: invalid binding, neither or both Submit and Form',\n }));\n }\n }\n return this;\n };\n\n // parseForm parses the rest of the command using the previously matched form.\n public parseForm = (autocompleteMode = false): ParsedCommand => {\n if (this.state === ParseState.Error || !this.resolvedForm) {\n return this;\n }\n\n let fields: AppField[] = [];\n if (this.resolvedForm.fields) {\n fields = this.resolvedForm.fields;\n }\n\n fields = fields.filter((f) => f.type !== AppFieldTypes.MARKDOWN && !f.readonly);\n this.state = ParseState.StartParameter;\n this.i = this.incompleteStart || 0;\n let flagEqualsUsed = false;\n let escaped = false;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let c = '';\n if (this.i < this.command.length) {\n c = this.command[this.i];\n }\n\n switch (this.state) {\n case ParseState.StartParameter: {\n switch (c) {\n case '':\n return this;\n case '-': {\n // Named parameter (aka Flag). Flag1 consumes the optional second '-'.\n this.state = ParseState.Flag1;\n this.i++;\n break;\n }\n case '—': {\n // Em dash, introduced when two '-' are set in iOS. Will be considered as such.\n this.state = ParseState.Flag;\n this.i++;\n this.incomplete = '';\n this.incompleteStart = this.i;\n flagEqualsUsed = false;\n break;\n }\n default: {\n // Positional parameter.\n this.position++;\n let field = fields.find((f: AppField) => f.position === this.position);\n if (!field) {\n field = fields.find((f) => f.position === -1 && f.type === AppFieldTypes.TEXT);\n if (!field || this.values[field.name]) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.no_argument_pos_x',\n defaultMessage: 'Unable to identify argument.',\n }));\n }\n this.incompleteStart = this.i;\n this.incomplete = '';\n this.field = field;\n this.state = ParseState.Rest;\n break;\n }\n this.field = field;\n this.state = ParseState.StartValue;\n break;\n }\n }\n break;\n }\n\n case ParseState.Rest: {\n if (!this.field) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_field_value',\n defaultMessage: 'Field value is missing.',\n }));\n }\n\n if (autocompleteMode && c === '') {\n return this;\n }\n\n if (c === '') {\n this.values[this.field.name] = this.incomplete;\n return this;\n }\n\n this.i++;\n this.incomplete += c;\n break;\n }\n\n case ParseState.ParameterSeparator: {\n this.incompleteStart = this.i;\n switch (c) {\n case '':\n this.state = ParseState.StartParameter;\n return this;\n case ' ':\n case '\\t': {\n this.i++;\n break;\n }\n default:\n this.state = ParseState.StartParameter;\n break;\n }\n break;\n }\n\n case ParseState.Flag1: {\n // consume the optional second '-'\n if (c === '-') {\n this.i++;\n }\n this.state = ParseState.Flag;\n this.incomplete = '';\n this.incompleteStart = this.i;\n flagEqualsUsed = false;\n break;\n }\n\n case ParseState.Flag: {\n if (c === '' && autocompleteMode) {\n return this;\n }\n\n switch (c) {\n case '':\n case ' ':\n case '\\t':\n case '=': {\n const field = fields.find((f) => f.label?.toLowerCase() === this.incomplete.toLowerCase());\n if (!field) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.unexpected_flag',\n defaultMessage: 'Command does not accept flag `{flagName}`.',\n }, {\n flagName: this.incomplete,\n }));\n }\n this.state = ParseState.FlagValueSeparator;\n this.field = field;\n this.incomplete = '';\n break;\n }\n default: {\n this.incomplete += c;\n this.i++;\n break;\n }\n }\n break;\n }\n\n case ParseState.FlagValueSeparator: {\n this.incompleteStart = this.i;\n switch (c) {\n case '': {\n if (autocompleteMode) {\n return this;\n }\n this.state = ParseState.StartValue;\n break;\n }\n case ' ':\n case '\\t': {\n this.i++;\n break;\n }\n case '=': {\n if (flagEqualsUsed) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.multiple_equal',\n defaultMessage: 'Multiple `=` signs are not allowed.',\n }));\n }\n flagEqualsUsed = true;\n this.i++;\n break;\n }\n default: {\n this.state = ParseState.StartValue;\n }\n }\n break;\n }\n\n case ParseState.StartValue: {\n this.incomplete = '';\n this.incompleteStart = this.i;\n switch (c) {\n case '\"': {\n this.state = ParseState.QuotedValue;\n this.i++;\n break;\n }\n case '`': {\n this.state = ParseState.TickValue;\n this.i++;\n break;\n }\n case ' ':\n case '\\t':\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.unexpected_whitespace',\n defaultMessage: 'Unreachable: Unexpected whitespace.',\n }));\n case '[':\n if (!this.field?.multiselect) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.unexpected_squared_bracket',\n defaultMessage: 'Unexpected list opening.',\n }));\n }\n this.state = ParseState.MultiselectStart;\n this.i++;\n break;\n default: {\n this.state = ParseState.NonspaceValue;\n break;\n }\n }\n break;\n }\n\n case ParseState.NonspaceValue: {\n switch (c) {\n case '':\n case ' ':\n case '\\t': {\n this.state = ParseState.EndValue;\n break;\n }\n default: {\n this.incomplete += c;\n this.i++;\n break;\n }\n }\n break;\n }\n\n case ParseState.QuotedValue: {\n switch (c) {\n case '': {\n if (!autocompleteMode) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_quote',\n defaultMessage: 'Matching double quote expected before end of input.',\n }));\n }\n return this;\n }\n case '\"': {\n if (this.incompleteStart === this.i - 1) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.empty_value',\n defaultMessage: 'Empty values are not allowed',\n }));\n }\n this.i++;\n this.state = ParseState.EndQuotedValue;\n break;\n }\n case '\\\\': {\n escaped = true;\n this.i++;\n break;\n }\n default: {\n this.incomplete += c;\n this.i++;\n if (escaped) {\n //TODO: handle \\n, \\t, other escaped chars\n escaped = false;\n }\n break;\n }\n }\n break;\n }\n\n case ParseState.TickValue: {\n switch (c) {\n case '': {\n if (!autocompleteMode) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_tick',\n defaultMessage: 'Matching tick quote expected before end of input.',\n }));\n }\n return this;\n }\n case '`': {\n if (this.incompleteStart === this.i - 1) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.empty_value',\n defaultMessage: 'Empty values are not allowed',\n }));\n }\n this.i++;\n this.state = ParseState.EndTickedValue;\n break;\n }\n default: {\n this.incomplete += c;\n this.i++;\n break;\n }\n }\n break;\n }\n\n case ParseState.EndTickedValue:\n case ParseState.EndQuotedValue:\n case ParseState.EndValue: {\n if (!this.field) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_field_value',\n defaultMessage: 'Field value is missing.',\n }));\n }\n\n // special handling for optional BOOL values ('--boolflag true'\n // vs '--boolflag next-positional' vs '--boolflag\n // --next-flag...')\n if (this.field.type === AppFieldTypes.BOOL &&\n ((autocompleteMode && !'true'.startsWith(this.incomplete) && !'false'.startsWith(this.incomplete)) ||\n (!autocompleteMode && this.incomplete !== 'true' && this.incomplete !== 'false'))) {\n // reset back where the value started, and treat as a new parameter\n this.i = this.incompleteStart;\n this.values[this.field.name] = 'true';\n this.state = ParseState.StartParameter;\n } else {\n if (autocompleteMode && c === '') {\n return this;\n }\n this.values[this.field.name] = this.incomplete;\n this.incomplete = '';\n this.incompleteStart = this.i;\n if (c === '') {\n return this;\n }\n this.state = ParseState.ParameterSeparator;\n }\n break;\n }\n\n case ParseState.MultiselectStart:\n if (!this.field) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_field_value',\n defaultMessage: 'Field value is missing.',\n }));\n }\n\n this.values![this.field.name] = [];\n switch (c) {\n case ' ':\n case '\\t':\n this.i++;\n break;\n case ']':\n this.i++;\n this.state = ParseState.ParameterSeparator;\n break;\n default:\n this.state = ParseState.MultiselectStartValue;\n break;\n }\n break;\n\n case ParseState.MultiselectStartValue:\n this.incomplete = '';\n this.incompleteStart = this.i;\n switch (c) {\n case '':\n if (!autocompleteMode) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_list_end',\n defaultMessage: 'Expected list closing token.',\n }));\n }\n return this;\n case '\"': {\n this.state = ParseState.MultiselectQuotedValue;\n this.i++;\n break;\n }\n case '`': {\n this.state = ParseState.MultiselectTickValue;\n this.i++;\n break;\n }\n case ' ':\n case '\\t':\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.unexpected_whitespace',\n defaultMessage: 'Unreachable: Unexpected whitespace.',\n }));\n case ',':\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.unexpected_comma',\n defaultMessage: 'Unexpected comma.',\n }));\n default: {\n this.state = ParseState.MultiselectNonspaceValue;\n break;\n }\n }\n break;\n\n case ParseState.MultiselectNonspaceValue: {\n switch (c) {\n case '':\n case ' ':\n case '\\t':\n case ',':\n case ']': {\n this.state = ParseState.MultiselectEndValue;\n break;\n }\n default: {\n this.incomplete += c;\n this.i++;\n break;\n }\n }\n break;\n }\n\n case ParseState.MultiselectQuotedValue: {\n switch (c) {\n case '': {\n if (!autocompleteMode) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_quote',\n defaultMessage: 'Matching double quote expected before end of input.',\n }));\n }\n return this;\n }\n case '\"': {\n if (this.incompleteStart === this.i - 1) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.empty_value',\n defaultMessage: 'Empty values are not allowed',\n }));\n }\n this.i++;\n this.state = ParseState.MultiselectEndQuotedValue;\n break;\n }\n case '\\\\': {\n escaped = true;\n this.i++;\n break;\n }\n default: {\n this.incomplete += c;\n this.i++;\n if (escaped) {\n //TODO: handle \\n, \\t, other escaped chars\n escaped = false;\n }\n break;\n }\n }\n break;\n }\n\n case ParseState.MultiselectTickValue: {\n switch (c) {\n case '': {\n if (!autocompleteMode) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_tick',\n defaultMessage: 'Matching tick quote expected before end of input.',\n }));\n }\n return this;\n }\n case '`': {\n if (this.incompleteStart === this.i - 1) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.empty_value',\n defaultMessage: 'Empty values are not allowed',\n }));\n }\n this.i++;\n this.state = ParseState.MultiselectEndTickedValue;\n break;\n }\n default: {\n this.incomplete += c;\n this.i++;\n break;\n }\n }\n break;\n }\n\n case ParseState.MultiselectEndTickedValue:\n case ParseState.MultiselectEndQuotedValue:\n case ParseState.MultiselectEndValue: {\n if (!this.field) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_field_value',\n defaultMessage: 'Field value is missing.',\n }));\n }\n\n if (autocompleteMode && c === '') {\n return this;\n }\n (this.values![this.field.name] as string[]).push(this.incomplete);\n this.incomplete = '';\n this.incompleteStart = this.i;\n if (c === '') {\n return this;\n }\n this.state = ParseState.MultiselectValueSeparator;\n break;\n }\n\n case ParseState.MultiselectValueSeparator:\n switch (c) {\n case '':\n if (!autocompleteMode) {\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.missing_list_end',\n defaultMessage: 'Expected list closing token.',\n }));\n }\n return this;\n case ']':\n this.i++;\n this.state = ParseState.ParameterSeparator;\n break;\n case ' ':\n case '\\t':\n this.i++;\n break;\n case ',':\n this.i++;\n this.state = ParseState.MultiselectNextValue;\n break;\n default:\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.unexpected_character',\n defaultMessage: 'Unexpected character.',\n }));\n }\n break;\n case ParseState.MultiselectNextValue:\n switch (c) {\n case ' ':\n case '\\t':\n this.i++;\n break;\n default:\n this.state = ParseState.MultiselectStartValue;\n }\n break;\n default:\n return this.asError(this.intl.formatMessage({\n id: 'apps.error.parser.unexpected_state',\n defaultMessage: 'Unreachable: Unexpected state in matchBinding: `{state}`.',\n }, {\n state: this.state,\n }));\n }\n }\n };\n}\n\nexport class AppCommandParser {\n private store: Store;\n private channelID: string;\n private teamID: string;\n private rootPostID?: string;\n private intl: Intl;\n\n constructor(store: Store|null, intl: Intl, channelID: string, teamID = '', rootPostID = '') {\n this.store = store || getStore();\n this.channelID = channelID;\n this.rootPostID = rootPostID;\n this.teamID = teamID;\n this.intl = intl;\n }\n\n // composeCommandSubmitCall creates the form submission call\n public composeCommandSubmitCall = async (command: string): Promise<{creq: AppCallRequest | null; errorMessage?: string}> => {\n let parsed = new ParsedCommand(command, this, this.intl);\n\n const commandBindings = this.getCommandBindings();\n if (!commandBindings) {\n return {creq: null,\n errorMessage: this.intl.formatMessage({\n id: 'apps.error.parser.no_bindings',\n defaultMessage: 'No command bindings.',\n })};\n }\n\n parsed = await parsed.matchBinding(commandBindings, false);\n parsed = parsed.parseForm(false);\n if (parsed.state === ParseState.Error) {\n return {creq: null, errorMessage: parserErrorMessage(this.intl, parsed.error, parsed.command, parsed.i)};\n }\n\n await this.addDefaultAndReadOnlyValues(parsed);\n\n const missing = this.getMissingFields(parsed);\n if (missing.length > 0) {\n const missingStr = missing.map((f) => f.label).join(', ');\n return {creq: null,\n errorMessage: this.intl.formatMessage({\n id: 'apps.error.command.field_missing',\n defaultMessage: 'Required fields missing: `{fieldName}`.',\n }, {\n fieldName: missingStr,\n })};\n }\n\n const {creq, errorMessage} = await this.composeCallRequest(parsed, parsed.resolvedForm?.submit);\n if (errorMessage) {\n return {creq: null, errorMessage};\n }\n\n return {creq};\n };\n\n public composeFormFromCommand = async (command: string): Promise<{form: AppForm | null; context: AppContext | null; errorMessage?: string}> => {\n let parsed = new ParsedCommand(command, this, this.intl);\n\n const commandBindings = this.getCommandBindings();\n if (!commandBindings) {\n return {\n form: null,\n context: null,\n errorMessage: this.intl.formatMessage({\n id: 'apps.error.parser.no_bindings',\n defaultMessage: 'No command bindings.',\n })};\n }\n\n parsed = await parsed.matchBinding(commandBindings, false);\n parsed = parsed.parseForm(false);\n\n const form = JSON.parse(JSON.stringify(parsed.resolvedForm));\n if (!form) {\n return {\n form: null,\n context: null,\n errorMessage: this.intl.formatMessage({\n id: 'apps.error.parser.no_form',\n defaultMessage: 'No form found.',\n }),\n };\n }\n\n const values: AppCallValues = parsed.values;\n await this.expandOptions(parsed, values);\n\n for (const field of form.fields || []) {\n if (values[field.name]) {\n field.value = values[field.name];\n }\n }\n\n if (!form.title) {\n form.title = parsed.binding?.location;\n }\n\n const context = this.getAppContext(parsed.binding!);\n return {form, context};\n };\n\n private async addDefaultAndReadOnlyValues(parsed: ParsedCommand) {\n if (!parsed.resolvedForm?.fields) {\n return;\n }\n\n await Promise.all(parsed.resolvedForm?.fields.map(async (f) => {\n if (!f.value) {\n return;\n }\n\n if (f.readonly || !(f.name in parsed.values)) {\n switch (f.type) {\n case AppFieldTypes.TEXT:\n parsed.values[f.name] = f.value as string;\n break;\n case AppFieldTypes.BOOL:\n parsed.values[f.name] = 'true';\n break;\n case AppFieldTypes.USER: {\n const userID = (f.value as AppSelectOption).value;\n let user = selectUser(this.store.getState(), userID);\n if (!user) {\n const dispatchResult = await this.store.dispatch(getUser(userID));\n if ('error' in dispatchResult) {\n // Silently fail on default value\n break;\n }\n user = dispatchResult.data!;\n }\n parsed.values[f.name] = user.username;\n break;\n }\n case AppFieldTypes.CHANNEL: {\n const channelID = (f.value as AppSelectOption).label;\n let channel = selectChannel(this.store.getState(), channelID);\n if (!channel) {\n const dispatchResult = await this.store.dispatch(getChannel(channelID));\n if ('error' in dispatchResult) {\n // Silently fail on default value\n break;\n }\n channel = dispatchResult.data!;\n }\n parsed.values[f.name] = channel.name;\n break;\n }\n case AppFieldTypes.STATIC_SELECT:\n case AppFieldTypes.DYNAMIC_SELECT:\n parsed.values[f.name] = (f.value as AppSelectOption).value;\n break;\n case AppFieldTypes.MARKDOWN:\n\n // Do nothing\n }\n }\n }) || []);\n }\n\n // getSuggestionsBase is a synchronous function that returns results for base commands\n public getSuggestionsBase = (pretext: string): AutocompleteSuggestion[] => {\n const command = pretext.toLowerCase();\n const result: AutocompleteSuggestion[] = [];\n\n const bindings = this.getCommandBindings();\n\n for (const binding of bindings) {\n let base = binding.label;\n if (!base) {\n continue;\n }\n\n if (base[0] !== '/') {\n base = '/' + base;\n }\n\n if (base.startsWith(command)) {\n result.push({\n Complete: binding.label,\n Suggestion: base,\n Description: binding.description || '',\n Hint: binding.hint || '',\n IconData: binding.icon || '',\n type: Constants.Integrations.COMMAND,\n });\n }\n }\n\n return result;\n };\n\n // getSuggestions returns suggestions for subcommands and/or form arguments\n public getSuggestions = async (pretext: string): Promise<ExtendedAutocompleteSuggestion[]> => {\n let parsed = new ParsedCommand(pretext, this, this.intl);\n let suggestions: ExtendedAutocompleteSuggestion[] = [];\n\n const commandBindings = this.getCommandBindings();\n if (!commandBindings) {\n return [];\n }\n\n parsed = await parsed.matchBinding(commandBindings, true);\n if (parsed.state === ParseState.Error) {\n suggestions = this.getErrorSuggestion(parsed);\n }\n\n if (parsed.state === ParseState.Command) {\n suggestions = this.getCommandSuggestions(parsed);\n }\n\n if (parsed.resolvedForm || parsed.incomplete) {\n parsed = parsed.parseForm(true);\n if (parsed.state === ParseState.Error) {\n suggestions = this.getErrorSuggestion(parsed);\n }\n const argSuggestions = await this.getParameterSuggestions(parsed);\n suggestions = suggestions.concat(argSuggestions);\n }\n\n // Add \"Execute Current Command\" suggestion\n // TODO get full text from SuggestionBox\n const executableStates: string[] = [\n ParseState.EndCommand,\n ParseState.CommandSeparator,\n ParseState.StartParameter,\n ParseState.ParameterSeparator,\n ParseState.EndValue,\n ParseState.Rest,\n ];\n\n const modalStates: string[] = [\n ParseState.StartParameter,\n ParseState.Error,\n ParseState.TickValue,\n ParseState.QuotedValue,\n ParseState.EndValue,\n ParseState.Rest,\n ParseState.Flag,\n ParseState.FlagValueSeparator,\n ];\n const call = parsed.resolvedForm?.submit || parsed.binding?.form?.submit;\n const hasRequired = this.getMissingFields(parsed).length === 0;\n const hasValue = (parsed.state !== ParseState.EndValue || (parsed.field && parsed.values[parsed.field.name] !== undefined));\n\n if (executableStates.includes(parsed.state) && call && hasRequired && hasValue) {\n const execute = getExecuteSuggestion(parsed);\n if (execute) {\n suggestions = [execute, ...suggestions];\n }\n } else if (suggestions.length === 0 && (parsed.field?.type !== AppFieldTypes.USER && parsed.field?.type !== AppFieldTypes.CHANNEL)) {\n suggestions = this.getNoMatchingSuggestion();\n }\n\n if (modalStates.includes(parsed.state) && call && parsed.resolvedForm?.fields?.length) {\n const open = getOpenInModalSuggestion(parsed);\n if (open) {\n suggestions = [...suggestions, open];\n }\n }\n\n return suggestions.map((suggestion) => this.decorateSuggestionComplete(parsed, suggestion));\n };\n\n getNoMatchingSuggestion = () => {\n return [{\n Complete: '',\n Suggestion: '',\n Hint: this.intl.formatMessage({\n id: 'apps.suggestion.no_suggestion',\n defaultMessage: 'No matching suggestions.',\n }),\n IconData: COMMAND_SUGGESTION_ERROR,\n Description: '',\n }];\n };\n\n getErrorSuggestion = (parsed: ParsedCommand) => {\n return [{\n Complete: '',\n Suggestion: '',\n Hint: this.intl.formatMessage({\n id: 'apps.suggestion.errors.parser_error',\n defaultMessage: 'Parsing error',\n }),\n IconData: COMMAND_SUGGESTION_ERROR,\n Description: parsed.error,\n }];\n };\n\n // composeCallRequest creates the form submission call\n private composeCallRequest = async (parsed: ParsedCommand, call: AppCall | undefined): Promise<{creq: AppCallRequest | null; errorMessage?: string}> => {\n if (!parsed.binding) {\n return {creq: null,\n errorMessage: this.intl.formatMessage({\n id: 'apps.error.parser.missing_binding',\n defaultMessage: 'Missing command bindings.',\n })};\n }\n if (!call) {\n return {creq: null,\n errorMessage: this.intl.formatMessage({\n id: 'apps.error.parser.missing_submit',\n defaultMessage: 'No submit call in binding or form.',\n })};\n }\n\n const values: AppCallValues = parsed.values;\n const {errorMessage} = await this.expandOptions(parsed, values);\n if (errorMessage) {\n return {creq: null, errorMessage};\n }\n\n const context = this.getAppContext(parsed.binding);\n return {creq: createCallRequest(call, context, {}, values, parsed.command)};\n };\n\n private expandOptions = async (parsed: ParsedCommand, values: AppCallValues): Promise<{errorMessage?: string}> => {\n if (!parsed.resolvedForm?.fields) {\n return {};\n }\n\n const errors: {[key: string]: string} = {};\n await Promise.all(parsed.resolvedForm.fields.map(async (f) => {\n if (!values[f.name]) {\n return;\n }\n switch (f.type) {\n case AppFieldTypes.DYNAMIC_SELECT:\n if (f.multiselect && Array.isArray(values[f.name])) {\n const options: AppSelectOption[] = [];\n const commandValues = values[f.name] as string[];\n for (const value of commandValues) {\n if (options.find((o) => o.value === value)) {\n errors[f.name] = this.intl.formatMessage({\n id: 'apps.error.command.same_option',\n defaultMessage: 'Option repeated for field `{fieldName}`: `{option}`.',\n }, {\n fieldName: f.name,\n option: value,\n });\n }\n }\n values[f.name] = options;\n break;\n }\n\n values[f.name] = {label: values[f.name], value: values[f.name]};\n break;\n case AppFieldTypes.STATIC_SELECT: {\n const getOption = (value: string) => {\n return f.options?.find((o) => (o.value === value));\n };\n\n const setOptionError = (value: string) => {\n errors[f.name] = this.intl.formatMessage({\n id: 'apps.error.command.unknown_option',\n defaultMessage: 'Unknown option for field `{fieldName}`: `{option}`.',\n }, {\n fieldName: f.name,\n option: value,\n });\n values[f.name] = undefined;\n };\n\n if (f.multiselect && Array.isArray(values[f.name])) {\n const options: AppSelectOption[] = [];\n const commandValues = values[f.name] as string[];\n for (const value of commandValues) {\n const option = getOption(value);\n if (!option) {\n setOptionError(value);\n return;\n }\n if (options.find((o) => o.value === option.value)) {\n errors[f.name] = this.intl.formatMessage({\n id: 'apps.error.command.same_option',\n defaultMessage: 'Option repeated for field `{fieldName}`: `{option}`.',\n }, {\n fieldName: f.name,\n option: value,\n });\n }\n options.push(option);\n }\n values[f.name] = options;\n break;\n }\n\n const option = getOption(values[f.name]);\n if (!option) {\n setOptionError(values[f.name]);\n return;\n }\n values[f.name] = option;\n break;\n }\n case AppFieldTypes.USER: {\n const getUser = async (userName: string) => {\n let user = selectUserByUsername(this.store.getState(), userName);\n if (!user) {\n const dispatchResult = await this.store.dispatch(getUserByUsername(userName) as any);\n if ('error' in dispatchResult) {\n return null;\n }\n user = dispatchResult.data;\n }\n return user;\n };\n\n const setUserError = (username: string) => {\n errors[f.name] = this.intl.formatMessage({\n id: 'apps.error.command.unknown_user',\n defaultMessage: 'Unknown user for field `{fieldName}`: `{option}`.',\n }, {\n fieldName: f.name,\n option: username,\n });\n };\n\n if (f.multiselect && Array.isArray(values[f.name])) {\n const options: AppSelectOption[] = [];\n const commandValues = values[f.name] as string[];\n /* eslint-disable no-await-in-loop */\n for (const value of commandValues) {\n let userName = value;\n if (userName[0] === '@') {\n userName = userName.substr(1);\n }\n const user = await getUser(userName);\n if (!user) {\n setUserError(userName);\n return;\n }\n\n if (options.find((o) => o.value === user?.id)) {\n errors[f.name] = this.intl.formatMessage({\n id: 'apps.error.command.same_user',\n defaultMessage: 'User repeated for field `{fieldName}`: `{option}`.',\n }, {\n fieldName: f.name,\n option: userName,\n });\n }\n options.push({label: user.username, value: user.id});\n }\n /* eslint-enable no-await-in-loop */\n values[f.name] = options;\n break;\n }\n\n let userName = values[f.name] as string;\n if (userName[0] === '@') {\n userName = userName.substr(1);\n }\n const user = await getUser(userName);\n if (!user) {\n setUserError(userName);\n return;\n }\n values[f.name] = {label: user.username, value: user.id};\n break;\n }\n case AppFieldTypes.CHANNEL: {\n const getChannel = async (channelName: string) => {\n let channel = selectChannelByName(this.store.getState(), channelName);\n if (!channel) {\n const team = getCurrentTeam(this.store.getState());\n if (!team) {\n return null;\n }\n const dispatchResult = await this.store.dispatch(getChannelByNameAndTeamName(team.name, channelName) as any);\n if ('error' in dispatchResult) {\n return null;\n }\n channel = dispatchResult.data;\n }\n return channel;\n };\n\n const setChannelError = (channelName: string) => {\n errors[f.name] = this.intl.formatMessage({\n id: 'apps.error.command.unknown_channel',\n defaultMessage: 'Unknown channel for field `{fieldName}`: `{option}`.',\n }, {\n fieldName: f.name,\n option: channelName,\n });\n };\n\n if (f.multiselect && Array.isArray(values[f.name])) {\n const options: AppSelectOption[] = [];\n const commandValues = values[f.name] as string[];\n /* eslint-disable no-await-in-loop */\n for (const value of commandValues) {\n let channelName = value;\n if (channelName[0] === '~') {\n channelName = channelName.substr(1);\n }\n const channel = await getChannel(channelName);\n if (!channel) {\n setChannelError(channelName);\n return;\n }\n\n if (options.find((o) => o.value === channel?.id)) {\n errors[f.name] = this.intl.formatMessage({\n id: 'apps.error.command.same_channel',\n defaultMessage: 'Channel repeated for field `{fieldName}`: `{option}`.',\n }, {\n fieldName: f.name,\n option: channelName,\n });\n }\n\n options.push({label: channel?.display_name, value: channel?.id});\n }\n /* eslint-enable no-await-in-loop */\n values[f.name] = options;\n break;\n }\n\n let channelName = values[f.name] as string;\n if (channelName[0] === '~') {\n channelName = channelName.substr(1);\n }\n const channel = await getChannel(channelName);\n if (!channel) {\n setChannelError(channelName);\n return;\n }\n values[f.name] = {label: channel?.display_name, value: channel?.id};\n break;\n }\n case AppFieldTypes.BOOL: {\n const strValue = values[f.name] as string;\n if (strValue.toLowerCase() === 'true') {\n values[f.name] = true;\n } else {\n values[f.name] = false;\n }\n }\n }\n }));\n\n if (Object.keys(errors).length === 0) {\n return {};\n }\n\n let errorMessage = '';\n Object.keys(errors).forEach((v) => {\n errorMessage = errorMessage + errors[v] + '\\n';\n });\n return {errorMessage};\n };\n\n // decorateSuggestionComplete applies the necessary modifications for a suggestion to be processed\n private decorateSuggestionComplete = (parsed: ParsedCommand, choice: AutocompleteSuggestion): AutocompleteSuggestion => {\n if (choice.Complete && (\n choice.Complete.endsWith(EXECUTE_CURRENT_COMMAND_ITEM_ID) ||\n choice.Complete.endsWith(OPEN_COMMAND_IN_MODAL_ITEM_ID))) {\n return choice as AutocompleteSuggestion;\n }\n\n let goBackSpace = 0;\n if (choice.Complete === '') {\n goBackSpace = 1;\n }\n let complete = parsed.command.substring(0, parsed.incompleteStart - goBackSpace);\n complete += choice.Complete === undefined ? choice.Suggestion : choice.Complete;\n choice.Hint = choice.Hint || '';\n complete = complete.substring(1);\n\n return {\n ...choice,\n Complete: complete,\n };\n };\n\n // getCommandBindings returns the commands in the redux store.\n // They are grouped by app id since each app has one base command\n private getCommandBindings = (): AppBinding[] => {\n const state = this.store.getState();\n if (this.rootPostID) {\n return getRHSCommandBindings(state);\n }\n return getCommandBindings(state);\n };\n\n // getChannel gets the channel in which the user is typing the command\n private getChannel = (): Channel | undefined => {\n const state = this.store.getState();\n return selectChannel(state, this.channelID);\n };\n\n public setChannelContext = (channelID: string, teamID = '', rootPostID?: string) => {\n this.channelID = channelID;\n this.rootPostID = rootPostID;\n this.teamID = teamID;\n };\n\n // isAppCommand determines if subcommand/form suggestions need to be returned.\n // When this returns true, the caller knows that the parser should handle all suggestions for the current command string.\n // When it returns false, the caller should call getSuggestionsBase() to check if there are any base commands that match the command string.\n public isAppCommand = (pretext: string): boolean => {\n const command = pretext.toLowerCase();\n for (const binding of this.getCommandBindings()) {\n let base = binding.label;\n if (!base) {\n continue;\n }\n\n if (base[0] !== '/') {\n base = '/' + base;\n }\n\n if (command.startsWith(base + ' ')) {\n return true;\n }\n }\n return false;\n };\n\n // getAppContext collects post/channel/team info for performing calls\n private getAppContext = (binding: AppBinding): AppContext => {\n const context: AppContext = {\n app_id: binding.app_id,\n location: binding.location,\n root_id: this.rootPostID,\n };\n\n const channel = this.getChannel();\n if (!channel) {\n return context;\n }\n\n context.channel_id = channel.id;\n context.team_id = channel.team_id || getCurrentTeamId(this.store.getState());\n\n return context;\n };\n\n // fetchSubmittableForm unconditionaly retrieves the form for the given binding (subcommand)\n private fetchSubmittableForm = async (source: AppCall, context: AppContext): Promise<{form?: AppForm; error?: string} | undefined> => {\n const payload = createCallRequest(source, context);\n const res = await this.store.dispatch(doAppFetchForm(payload, this.intl)) as DoAppCallResult;\n if (res.error) {\n const errorResponse = res.error;\n return {error: errorResponse.text || this.intl.formatMessage({\n id: 'apps.error.unknown',\n defaultMessage: 'Unknown error occurred.',\n })};\n }\n\n const callResponse = res.data!;\n switch (callResponse.type) {\n case AppCallResponseTypes.FORM:\n break;\n case AppCallResponseTypes.NAVIGATE:\n case AppCallResponseTypes.OK:\n return {error: this.intl.formatMessage({\n id: 'apps.error.responses.unexpected_type',\n defaultMessage: 'App response type was not expected. Response type: {type}',\n }, {\n type: callResponse.type,\n })};\n default:\n return {error: this.intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResponse.type,\n })};\n }\n\n if (!callResponse.form?.submit) {\n return {error: this.intl.formatMessage({\n id: 'apps.error.parser.missing_submit',\n defaultMessage: 'No submit call in binding or form.',\n })};\n }\n\n return {form: callResponse.form};\n };\n\n public getSubmittableForm = async (location: string, binding: AppBinding): Promise<{form?: AppForm; error?: string} | undefined> => {\n const rootID = this.rootPostID || '';\n const key = `${this.channelID}-${rootID}-${location}`;\n const submittableForm = this.rootPostID ? getAppRHSCommandForm(this.store.getState(), key) : getAppCommandForm(this.store.getState(), key);\n if (submittableForm) {\n return {form: submittableForm};\n }\n\n if (!binding.form?.source) {\n return {error: this.intl.formatMessage({\n id: 'apps.error.parser.missing_source',\n defaultMessage: 'Form has neither submit nor source.',\n })};\n }\n const context = this.getAppContext(binding);\n const fetched = await this.fetchSubmittableForm(binding.form.source, context);\n if (fetched?.form) {\n let actionType: string = AppsTypes.RECEIVED_APP_COMMAND_FORM;\n if (this.rootPostID) {\n actionType = AppsTypes.RECEIVED_APP_RHS_COMMAND_FORM;\n }\n this.store.dispatch({\n data: {form: fetched.form, location: key},\n type: actionType,\n });\n }\n return fetched;\n };\n\n // getSuggestionsForSubCommands returns suggestions for a subcommand's name\n private getCommandSuggestions = (parsed: ParsedCommand): AutocompleteSuggestion[] => {\n if (!parsed.binding?.bindings?.length) {\n return [];\n }\n const bindings = parsed.binding.bindings;\n const result: AutocompleteSuggestion[] = [];\n\n bindings.forEach((b) => {\n if (b.label.toLowerCase().startsWith(parsed.incomplete.toLowerCase())) {\n result.push({\n Complete: b.label,\n Suggestion: b.label,\n Description: b.description || '',\n Hint: b.hint || '',\n IconData: b.icon || '',\n type: Constants.Integrations.COMMAND,\n });\n }\n });\n\n return result;\n };\n\n // getParameterSuggestions computes suggestions for positional argument values, flag names, and flag argument values\n private getParameterSuggestions = async (parsed: ParsedCommand): Promise<ExtendedAutocompleteSuggestion[]> => {\n switch (parsed.state) {\n case ParseState.StartParameter: {\n // see if there's a matching positional field\n const positional = parsed.resolvedForm?.fields?.find((f: AppField) => f.position === parsed.position + 1);\n if (positional) {\n parsed.field = positional;\n return this.getValueSuggestions(parsed);\n }\n return this.getFlagNameSuggestions(parsed);\n }\n\n case ParseState.Flag:\n return this.getFlagNameSuggestions(parsed);\n\n case ParseState.FlagValueSeparator: {\n const suggestions = await this.getValueSuggestions(parsed);\n if (parsed.field?.multiselect) {\n suggestions.unshift({\n Complete: '[',\n Suggestion: '[',\n Description: 'Start building a list',\n Hint: '',\n IconData: '',\n });\n }\n return suggestions;\n }\n case ParseState.EndValue:\n case ParseState.NonspaceValue:\n case ParseState.MultiselectNextValue:\n case ParseState.MultiselectStart:\n case ParseState.MultiselectNonspaceValue:\n case ParseState.MultiselectEndValue:\n case ParseState.MultiselectStartValue:\n return this.getValueSuggestions(parsed);\n case ParseState.EndQuotedValue:\n case ParseState.QuotedValue:\n case ParseState.MultiselectQuotedValue:\n return this.getValueSuggestions(parsed, '\"');\n case ParseState.EndTickedValue:\n case ParseState.TickValue:\n case ParseState.MultiselectTickValue:\n return this.getValueSuggestions(parsed, '`');\n case ParseState.MultiselectValueSeparator:\n return this.getMultiselectValueSeparatorSuggestion();\n case ParseState.Rest: {\n return this.getValueSuggestions(parsed);\n }\n }\n return [];\n };\n\n private getMultiselectValueSeparatorSuggestion = (): AutocompleteSuggestion[] => {\n return [\n {\n Complete: ',',\n Suggestion: ',',\n Description: 'Add new element',\n Hint: '',\n IconData: '',\n },\n {\n Complete: ']',\n Suggestion: ']',\n Description: 'End list',\n Hint: '',\n IconData: '',\n },\n ];\n };\n\n // getMissingFields collects the required fields that were not supplied in a submission\n private getMissingFields = (parsed: ParsedCommand): AppField[] => {\n const form = parsed.resolvedForm;\n if (!form) {\n return [];\n }\n\n const missing: AppField[] = [];\n\n const values = parsed.values || [];\n const fields = form.fields || [];\n for (const field of fields) {\n if (field.is_required && !values[field.name]) {\n missing.push(field);\n }\n }\n\n return missing;\n };\n\n // getFlagNameSuggestions returns suggestions for flag names\n private getFlagNameSuggestions = (parsed: ParsedCommand): AutocompleteSuggestion[] => {\n if (!parsed.resolvedForm?.fields?.length) {\n return [];\n }\n\n // There have been 0 to 2 dashes in the command prior to this call, adjust.\n const prevCharIndex = parsed.incompleteStart - 1;\n let prefix = '--';\n for (let i = prevCharIndex; i > 0 && i >= parsed.incompleteStart - 2 && parsed.command[i] === '-'; i--) {\n prefix = prefix.substring(1);\n }\n if (prevCharIndex > 0 && parsed.command[prevCharIndex] === '—') {\n prefix = '';\n }\n\n const applicable = parsed.resolvedForm.fields.filter((field) => field.label && field.label.toLowerCase().startsWith(parsed.incomplete.toLowerCase()) && !parsed.values[field.name]);\n if (applicable) {\n return applicable.map((f) => {\n return {\n Complete: prefix + (f.label || f.name),\n Suggestion: '--' + (f.label || f.name),\n Description: f.description || '',\n Hint: f.hint || '',\n IconData: parsed.binding?.icon || '',\n };\n });\n }\n\n return [];\n };\n\n // getSuggestionsForField gets suggestions for a positional or flag field value\n private getValueSuggestions = async (parsed: ParsedCommand, delimiter?: string): Promise<ExtendedAutocompleteSuggestion[]> => {\n if (!parsed || !parsed.field) {\n return [];\n }\n const f = parsed.field;\n\n switch (f.type) {\n case AppFieldTypes.USER:\n return this.getUserFieldSuggestions(parsed);\n case AppFieldTypes.CHANNEL:\n return this.getChannelFieldSuggestions(parsed);\n case AppFieldTypes.BOOL:\n return this.getBooleanSuggestions(parsed);\n case AppFieldTypes.DYNAMIC_SELECT:\n return this.getDynamicSelectSuggestions(parsed, delimiter);\n case AppFieldTypes.STATIC_SELECT:\n return this.getStaticSelectSuggestions(parsed, delimiter);\n }\n\n const mentionSuggestions = await inTextMentionSuggestions(parsed.incomplete, this.store, this.channelID, this.teamID, delimiter);\n if (mentionSuggestions) {\n return mentionSuggestions;\n }\n\n // Handle text values\n let complete = parsed.incomplete;\n if (complete && delimiter) {\n complete = delimiter + complete + delimiter;\n }\n\n const fieldName = parsed.field.modal_label || parsed.field.label || parsed.field.name;\n return [{\n Complete: complete,\n Suggestion: `${fieldName}: ${delimiter || '\"'}${parsed.incomplete}${delimiter || '\"'}`,\n Description: f.description || '',\n Hint: '',\n IconData: parsed.binding?.icon || '',\n }];\n };\n\n // getStaticSelectSuggestions returns suggestions specified in the field's options property\n private getStaticSelectSuggestions = (parsed: ParsedCommand, delimiter?: string): AutocompleteSuggestion[] => {\n const f = parsed.field as AutocompleteStaticSelect;\n const opts = f.options?.filter((opt) => opt.label.toLowerCase().startsWith(parsed.incomplete.toLowerCase()));\n if (!opts?.length) {\n return [{\n Complete: '',\n Suggestion: '',\n Hint: this.intl.formatMessage({\n id: 'apps.suggestion.no_static',\n defaultMessage: 'No matching options.',\n }),\n Description: '',\n IconData: COMMAND_SUGGESTION_ERROR,\n }];\n }\n return opts.map((opt) => {\n let complete = opt.value;\n if (delimiter) {\n complete = delimiter + complete + delimiter;\n } else if (isMultiword(opt.value)) {\n complete = '`' + complete + '`';\n }\n return {\n Complete: complete,\n Suggestion: opt.label,\n Hint: f.hint || '',\n Description: f.description || '',\n IconData: opt.icon_data || parsed.binding?.icon || '',\n };\n });\n };\n\n // getDynamicSelectSuggestions fetches and returns suggestions from the server\n private getDynamicSelectSuggestions = async (parsed: ParsedCommand, delimiter?: string): Promise<AutocompleteSuggestion[]> => {\n const f = parsed.field;\n if (!f) {\n // Should never happen\n return this.makeDynamicSelectSuggestionError(this.intl.formatMessage({\n id: 'apps.error.parser.unexpected_error',\n defaultMessage: 'Unexpected error.',\n }));\n }\n\n const {creq, errorMessage} = await this.composeCallRequest(parsed, f.lookup);\n if (!creq) {\n return this.makeDynamicSelectSuggestionError(this.intl.formatMessage({\n id: 'apps.error.lookup.error_preparing_request',\n defaultMessage: 'Error preparing lookup request: {errorMessage}',\n }, {\n errorMessage,\n }));\n }\n creq.query = parsed.incomplete;\n creq.selected_field = parsed.field?.name;\n\n const res = await this.store.dispatch(doAppLookup(creq, this.intl)) as DoAppCallResult<AppLookupResponse>;\n\n if (res.error) {\n const errorResponse = res.error;\n return this.makeDynamicSelectSuggestionError(errorResponse.text || this.intl.formatMessage({\n id: 'apps.error.unknown',\n defaultMessage: 'Unknown error occurred.',\n }));\n }\n\n const callResponse = res.data!;\n switch (callResponse.type) {\n case AppCallResponseTypes.OK:\n break;\n case AppCallResponseTypes.NAVIGATE:\n case AppCallResponseTypes.FORM:\n return this.makeDynamicSelectSuggestionError(this.intl.formatMessage({\n id: 'apps.error.responses.unexpected_type',\n defaultMessage: 'App response type was not expected. Response type: {type}',\n }, {\n type: callResponse.type,\n }));\n default:\n return this.makeDynamicSelectSuggestionError(this.intl.formatMessage({\n id: 'apps.error.responses.unknown_type',\n defaultMessage: 'App response type not supported. Response type: {type}.',\n }, {\n type: callResponse.type,\n }));\n }\n\n let items = callResponse?.data?.items;\n items = items?.filter(filterEmptyOptions);\n if (!items?.length) {\n return [{\n Complete: '',\n Suggestion: '',\n Hint: this.intl.formatMessage({\n id: 'apps.suggestion.no_static',\n defaultMessage: 'No matching options.',\n }),\n IconData: '',\n Description: this.intl.formatMessage({\n id: 'apps.suggestion.no_dynamic',\n defaultMessage: 'No data was returned for dynamic suggestions',\n }),\n }];\n }\n\n return items.map((s): AutocompleteSuggestion => {\n let complete = s.value;\n if (delimiter) {\n complete = delimiter + complete + delimiter;\n } else if (isMultiword(s.value)) {\n complete = '`' + complete + '`';\n }\n return ({\n Complete: complete,\n Description: s.label || s.value,\n Suggestion: s.value,\n Hint: '',\n IconData: s.icon_data || parsed.binding?.icon || '',\n });\n });\n };\n\n private makeDynamicSelectSuggestionError = (message: string): AutocompleteSuggestion[] => {\n const errMsg = this.intl.formatMessage({\n id: 'apps.error',\n defaultMessage: 'Error: {error}',\n }, {\n error: message,\n });\n return [{\n Complete: '',\n Suggestion: '',\n Hint: this.intl.formatMessage({\n id: 'apps.suggestion.dynamic.error',\n defaultMessage: 'Dynamic select error',\n }),\n IconData: COMMAND_SUGGESTION_ERROR,\n Description: errMsg,\n }];\n };\n\n private getUserFieldSuggestions = async (parsed: ParsedCommand): Promise<AutocompleteSuggestion[]> => {\n let input = parsed.incomplete.trim();\n if (input[0] === '@') {\n input = input.substring(1);\n }\n const {data} = await this.store.dispatch(autocompleteUsersInChannel(input, this.channelID));\n return getUserSuggestions(data);\n };\n\n private getChannelFieldSuggestions = async (parsed: ParsedCommand): Promise<AutocompleteSuggestion[]> => {\n let input = parsed.incomplete.trim();\n if (input[0] === '~') {\n input = input.substring(1);\n }\n const {data} = await this.store.dispatch(autocompleteChannels(this.teamID, input));\n return getChannelSuggestions(data);\n };\n\n // getBooleanSuggestions returns true/false suggestions\n private getBooleanSuggestions = (parsed: ParsedCommand): AutocompleteSuggestion[] => {\n const suggestions: AutocompleteSuggestion[] = [];\n\n if ('true'.startsWith(parsed.incomplete)) {\n suggestions.push({\n Complete: 'true',\n Suggestion: 'true',\n Description: parsed.field?.description || '',\n Hint: parsed.field?.hint || '',\n IconData: parsed.binding?.icon || '',\n });\n }\n if ('false'.startsWith(parsed.incomplete)) {\n suggestions.push({\n Complete: 'false',\n Suggestion: 'false',\n Description: parsed.field?.description || '',\n Hint: parsed.field?.hint || '',\n IconData: parsed.binding?.icon || '',\n });\n }\n return suggestions;\n };\n}\n\nfunction isMultiword(value: string) {\n if (value.indexOf(' ') !== -1) {\n return true;\n }\n\n if (value.indexOf('\\t') !== -1) {\n return true;\n }\n\n return false;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Store} from 'redux';\n\nimport type {UserAutocomplete} from '@mattermost/types/autocomplete';\nimport type {Channel} from '@mattermost/types/channels';\nimport type {AutocompleteSuggestion} from '@mattermost/types/integrations';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {autocompleteChannels} from 'mattermost-redux/actions/channels';\n\nimport {autocompleteUsersInChannel} from 'actions/views/channel';\n\nimport {Constants} from 'utils/constants';\n\nexport const COMMAND_SUGGESTION_CHANNEL = Constants.Integrations.COMMAND_SUGGESTION_CHANNEL;\nexport const COMMAND_SUGGESTION_USER = Constants.Integrations.COMMAND_SUGGESTION_USER;\n\nexport async function inTextMentionSuggestions(pretext: string, store: Store, channelID: string, teamID: string, delimiter = ''): Promise<AutocompleteSuggestion[] | null> {\n const separatedWords = pretext.split(' ');\n const incompleteLessLastWord = separatedWords.slice(0, -1).join(' ');\n const lastWord = separatedWords[separatedWords.length - 1];\n if (lastWord.startsWith('@')) {\n const {data} = await store.dispatch(autocompleteUsersInChannel(lastWord.substring(1), channelID));\n const users = await getUserSuggestions(data);\n users.forEach((u) => {\n let complete = incompleteLessLastWord ? incompleteLessLastWord + ' ' + u.Complete : u.Complete;\n if (delimiter) {\n complete = delimiter + complete;\n }\n u.Complete = complete;\n });\n return users;\n }\n\n if (lastWord.startsWith('~') && !lastWord.startsWith('~~')) {\n const {data} = await store.dispatch(autocompleteChannels(teamID, lastWord.substring(1)));\n const channels = await getChannelSuggestions(data);\n channels.forEach((c) => {\n let complete = incompleteLessLastWord ? incompleteLessLastWord + ' ' + c.Complete : c.Complete;\n if (delimiter) {\n complete = delimiter + complete;\n }\n c.Complete = complete;\n });\n return channels;\n }\n\n return null;\n}\n\nexport async function getUserSuggestions(usersAutocomplete?: UserAutocomplete): Promise<AutocompleteSuggestion[]> {\n const notFoundSuggestions = [{\n Complete: '',\n Suggestion: '',\n Description: 'No user found',\n Hint: '',\n IconData: '',\n }];\n if (!usersAutocomplete) {\n return notFoundSuggestions;\n }\n\n if (!usersAutocomplete.users.length && !usersAutocomplete.out_of_channel?.length) {\n return notFoundSuggestions;\n }\n\n const items: AutocompleteSuggestion[] = [];\n usersAutocomplete.users.forEach((u) => {\n items.push(getUserSuggestion(u));\n });\n usersAutocomplete.out_of_channel?.forEach((u) => {\n items.push(getUserSuggestion(u));\n });\n\n return items;\n}\n\nexport async function getChannelSuggestions(channels?: Channel[]): Promise<AutocompleteSuggestion[]> {\n const notFoundSuggestion = [{\n Complete: '',\n Suggestion: '',\n Description: 'No channel found',\n Hint: '',\n IconData: '',\n }];\n if (!channels) {\n return notFoundSuggestion;\n }\n if (!channels.length) {\n return notFoundSuggestion;\n }\n\n const items = channels.map((c) => {\n return {\n Complete: '~' + c.name,\n Suggestion: c.name,\n Description: '',\n Hint: '',\n IconData: '',\n type: COMMAND_SUGGESTION_CHANNEL,\n item: c,\n };\n });\n\n return items;\n}\n\nfunction getUserSuggestion(u: UserProfile) {\n return {\n Complete: '@' + u.username,\n Suggestion: u.username,\n Description: '',\n Hint: '',\n IconData: '',\n type: COMMAND_SUGGESTION_USER,\n item: u,\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {AutocompleteSuggestion} from '@mattermost/types/integrations';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {sendEphemeralPost} from 'actions/global_actions';\nimport reduxStore from 'stores/redux_store';\n\nimport {Constants} from 'utils/constants';\nimport {isMac} from 'utils/user_agent';\nimport {localizeAndFormatMessage} from 'utils/utils';\n\nimport type {ParsedCommand} from './app_command_parser';\n\nexport type {\n AppCall,\n AppCallRequest,\n AppCallValues,\n AppBinding,\n AppField,\n AppContext,\n AppForm,\n AutocompleteElement,\n AutocompleteDynamicSelect,\n AutocompleteStaticSelect,\n AutocompleteUserSelect,\n AutocompleteChannelSelect,\n AppLookupResponse,\n AppSelectOption,\n} from '@mattermost/types/apps';\n\nexport type {\n DoAppCallResult,\n} from 'types/apps';\n\nexport type {AutocompleteSuggestion};\n\nexport type {Channel};\n\nexport type {UserAutocomplete} from '@mattermost/types/autocomplete';\n\nexport type {UserProfile};\n\nexport {\n AppBindingLocations,\n AppFieldTypes,\n AppCallResponseTypes,\n} from 'mattermost-redux/constants/apps';\n\nexport {autocompleteUsersInChannel} from 'actions/views/channel';\n\nexport {makeAppBindingsSelector, makeRHSAppBindingSelector, getAppCommandForm, getAppRHSCommandForm} from 'mattermost-redux/selectors/entities/apps';\n\nexport {getPost} from 'mattermost-redux/selectors/entities/posts';\nexport {getChannel as selectChannel, getCurrentChannel, getChannelByName as selectChannelByName} from 'mattermost-redux/selectors/entities/channels';\nexport {getCurrentTeamId, getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nexport {getUserByUsername as selectUserByUsername, getUser as selectUser} from 'mattermost-redux/selectors/entities/users';\n\nexport {getUserByUsername, getUser} from 'mattermost-redux/actions/users';\nexport {getChannelByNameAndTeamName, getChannel, autocompleteChannels} from 'mattermost-redux/actions/channels';\n\nexport {doAppFetchForm, doAppLookup} from 'actions/apps';\n\nexport {\n createCallRequest,\n filterEmptyOptions,\n} from 'utils/apps';\n\nexport const getStore = () => reduxStore;\n\nexport {getChannelSuggestions, getUserSuggestions, inTextMentionSuggestions} from '../mentions';\n\nexport const EXECUTE_CURRENT_COMMAND_ITEM_ID = Constants.Integrations.EXECUTE_CURRENT_COMMAND_ITEM_ID;\nexport const OPEN_COMMAND_IN_MODAL_ITEM_ID = Constants.Integrations.OPEN_COMMAND_IN_MODAL_ITEM_ID;\nexport const COMMAND_SUGGESTION_ERROR = Constants.Integrations.COMMAND_SUGGESTION_ERROR;\nexport const COMMAND_SUGGESTION_CHANNEL = Constants.Integrations.COMMAND_SUGGESTION_CHANNEL;\nexport const COMMAND_SUGGESTION_USER = Constants.Integrations.COMMAND_SUGGESTION_USER;\n\nexport {AppsTypes} from 'mattermost-redux/action_types';\n\nexport const getExecuteSuggestion = (parsed: ParsedCommand): AutocompleteSuggestion | null => {\n let key = 'Ctrl';\n if (isMac()) {\n key = '⌘';\n }\n\n return {\n Complete: parsed.command.substring(1) + EXECUTE_CURRENT_COMMAND_ITEM_ID,\n Suggestion: 'Execute Current Command',\n Hint: '',\n Description: 'Select this option or use ' + key + '+Enter to execute the current command.',\n IconData: EXECUTE_CURRENT_COMMAND_ITEM_ID,\n };\n};\n\nexport const getOpenInModalSuggestion = (parsed: ParsedCommand): AutocompleteSuggestion | null => {\n return {\n Complete: parsed.command.substring(1) + OPEN_COMMAND_IN_MODAL_ITEM_ID,\n Suggestion: 'Open in modal',\n Hint: '',\n Description: 'Select this option to open the current command in a modal.',\n IconData: OPEN_COMMAND_IN_MODAL_ITEM_ID,\n };\n};\n\nexport type ExtendedAutocompleteSuggestion = AutocompleteSuggestion & {\n item?: UserProfile | Channel;\n}\n\nexport const displayError = (err: string, channelID: string, rootID?: string) => {\n reduxStore.dispatch(sendEphemeralPost(err, channelID, rootID));\n};\n\n// Shim of mobile-version intl\nexport const intlShim = {\n formatMessage: (config: {id: string; defaultMessage?: string}, values?: {[name: string]: any}) => {\n return localizeAndFormatMessage(config, values);\n },\n};\n\nexport const errorMessage = (intl: typeof intlShim, error: string, _command: string, _position: number): string => { // eslint-disable-line @typescript-eslint/no-unused-vars\n return intl.formatMessage({\n id: 'apps.error.parser',\n defaultMessage: 'Parsing error: {error}',\n }, {\n error,\n });\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport {SuggestionContainer} from './suggestion';\nimport type {SuggestionProps} from './suggestion';\n\ntype ChannelSearchFunc = (term: string, success: (channels: Channel[]) => void, error?: (err: ServerError) => void) => (ActionResult | Promise<ActionResult | ActionResult[]>);\n\nconst GenericChannelSuggestion = React.forwardRef<HTMLDivElement, SuggestionProps<Channel>>((props, ref) => {\n const {item} = props;\n\n const channelName = item.display_name;\n const purpose = item.purpose;\n\n const icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className='icon icon--standard icon--no-spacing icon-globe'/>\n </span>\n );\n\n const description = '(~' + item.name + ')';\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n >\n {icon}\n <div className='suggestion-list__ellipsis'>\n <span className='suggestion-list__main'>\n {channelName}\n </span>\n {description}\n {purpose}\n </div>\n </SuggestionContainer>\n );\n});\nGenericChannelSuggestion.displayName = 'GenericChannelSuggestion';\n\nexport default class GenericChannelProvider extends Provider {\n autocompleteChannels: ChannelSearchFunc;\n constructor(channelSearchFunc: ChannelSearchFunc) {\n super();\n\n this.autocompleteChannels = channelSearchFunc;\n }\n\n handlePretextChanged(pretext: string, resultsCallback: ResultsCallback<Channel>) {\n const normalizedPretext = pretext.toLowerCase();\n this.startNewRequest(normalizedPretext);\n\n this.autocompleteChannels(\n normalizedPretext,\n (channels: Channel[]) => {\n if (this.shouldCancelDispatch(normalizedPretext)) {\n return;\n }\n\n resultsCallback({\n matchedPretext: normalizedPretext,\n terms: channels.map((channel: Channel) => channel.display_name),\n items: channels,\n component: GenericChannelSuggestion,\n });\n },\n );\n\n return true;\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport * as Utils from 'utils/utils';\n\nimport type {UserAutocomplete, UserProfile} from './command_provider/app_command_parser/app_command_parser_dependencies.js';\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport {SuggestionContainer} from './suggestion';\nimport type {SuggestionProps} from './suggestion';\n\nconst GenericUserSuggestion = React.forwardRef<HTMLDivElement, SuggestionProps<UserProfile>>((props, ref) => {\n const {item} = props;\n\n const username = item.username;\n let description = '';\n\n if ((item.first_name || item.last_name) && item.nickname) {\n description = `- ${Utils.getFullName(item)} (${item.nickname})`;\n } else if (item.nickname) {\n description = `- (${item.nickname})`;\n } else if (item.first_name || item.last_name) {\n description = `- ${Utils.getFullName(item)}`;\n }\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n >\n <Avatar\n size='xxs'\n username={username}\n url={Client4.getUsersRoute() + '/' + item.id + '/image?_=' + (item.last_picture_update || 0)}\n />\n <div className='suggestion-list__ellipsis'>\n <span className='suggestion-list__main'>\n {'@' + username}\n </span>\n {description}\n </div>\n {item.is_bot && <BotTag/>}\n {isGuest(item.roles) && <GuestTag/>}\n </SuggestionContainer>\n );\n});\nGenericUserSuggestion.displayName = 'GenericUserSuggestion';\n\nexport default class GenericUserProvider extends Provider {\n autocompleteUsers: (text: string) => Promise<UserAutocomplete>;\n\n constructor(searchUsersFunc: (username: string) => Promise<UserAutocomplete>) {\n super();\n this.autocompleteUsers = searchUsersFunc;\n }\n\n handlePretextChanged(pretext: string, resultsCallback: ResultsCallback<UserProfile>) {\n const normalizedPretext = pretext.toLowerCase();\n this.startNewRequest(normalizedPretext);\n\n this.autocompleteUsers(normalizedPretext).then((data) => {\n if (this.shouldCancelDispatch(normalizedPretext)) {\n return;\n }\n\n const users = data.users;\n\n resultsCallback({\n matchedPretext: normalizedPretext,\n terms: users.map((user: UserProfile) => user.username),\n items: users,\n component: GenericUserSuggestion,\n });\n });\n\n return true;\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport {SuggestionContainer} from './suggestion';\nimport type {SuggestionProps} from './suggestion';\n\ninterface MenuAction {\n text: string;\n value: string;\n}\n\nconst MenuActionSuggestion = React.forwardRef<HTMLDivElement, SuggestionProps<MenuAction>>((props, ref) => {\n const {item} = props;\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n >\n {item.text}\n </SuggestionContainer>\n );\n});\nMenuActionSuggestion.displayName = 'MenuActionSuggestion';\n\nexport default class MenuActionProvider extends Provider {\n private options: MenuAction[];\n\n constructor(options: MenuAction[]) {\n super();\n this.options = options;\n }\n\n handlePretextChanged(prefix: string, resultsCallback: ResultsCallback<MenuAction>) {\n if (prefix.length === 0) {\n this.displayAllOptions(resultsCallback);\n return true;\n }\n\n if (prefix) {\n this.filterOptions(prefix, resultsCallback);\n return true;\n }\n\n return false;\n }\n\n async displayAllOptions(resultsCallback: ResultsCallback<MenuAction>) {\n const terms = this.options.map((option) => option.text);\n\n resultsCallback({\n matchedPretext: '',\n terms,\n items: this.options,\n component: MenuActionSuggestion,\n });\n }\n\n async filterOptions(prefix: string, resultsCallback: ResultsCallback<MenuAction>) {\n const filteredOptions = this.options.filter((option) => option.text.toLowerCase().indexOf(prefix.toLowerCase()) >= 0);\n const terms = filteredOptions.map((option) => option.text);\n\n resultsCallback({\n matchedPretext: prefix,\n terms,\n items: filteredOptions,\n component: MenuActionSuggestion,\n });\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport SuggestionList from 'components/suggestion/suggestion_list';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface SuggestionItem {}\n\ntype SuggestionListProps = {\n ariaLiveRef?: React.RefObject<HTMLDivElement>;\n renderDividers?: string[];\n renderNoResults?: boolean;\n preventClose?: () => void;\n onItemHover: (term: string) => void;\n onCompleteWord: (term: string, matchedPretext: string, e?: React.KeyboardEventHandler<HTMLDivElement>) => boolean;\n pretext: string;\n matchedPretext: string[];\n items: SuggestionItem[];\n terms: string[];\n selection: string;\n components: Array<React.FunctionComponent<any>>;\n wrapperHeight?: number;\n\n // suggestionBoxAlgn is an optional object that can be passed to align the SuggestionList with the keyboard caret\n // as the user is typing.\n suggestionBoxAlgn?: {\n lineHeight: number;\n pixelsToMoveX: number;\n pixelsToMoveY: number;\n };\n}\n\ntype Props = SuggestionListProps & {\n open: boolean;\n cleared: boolean;\n inputRef: React.RefObject<HTMLInputElement>;\n onLoseVisibility: () => void;\n position?: 'top' | 'bottom';\n};\n\ntype State = {\n scroll: number;\n modalBounds: {top: number; bottom: number};\n inputBounds: {top: number; bottom: number; width: number};\n position: 'top' | 'bottom' | undefined;\n open?: boolean;\n cleared?: boolean;\n}\n\nexport default class ModalSuggestionList extends React.PureComponent<Props, State> {\n container: React.RefObject<HTMLDivElement>;\n latestHeight: number;\n suggestionList: React.RefObject<any>;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n scroll: 0,\n modalBounds: {top: 0, bottom: 0},\n inputBounds: {top: 0, bottom: 0, width: 0},\n position: props.position,\n };\n\n this.container = React.createRef();\n this.suggestionList = React.createRef();\n this.latestHeight = 0;\n }\n\n calculateInputRect = () => {\n if (this.props.inputRef.current) {\n const rect = this.props.inputRef.current.getBoundingClientRect();\n return {top: rect.top, bottom: rect.bottom, width: rect.width};\n }\n return {top: 0, bottom: 0, width: 0};\n };\n\n onModalScroll = (e: Event) => {\n const eventTarget = e.target as HTMLElement;\n if (this.state.scroll !== eventTarget.scrollTop &&\n this.latestHeight !== 0) {\n this.setState({scroll: eventTarget.scrollTop});\n }\n };\n\n componentDidMount() {\n if (this.container.current) {\n const modalBodyContainer = this.container.current.closest('.modal-body');\n modalBodyContainer?.addEventListener('scroll', this.onModalScroll);\n }\n window.addEventListener('resize', this.updateModalBounds);\n }\n\n componentWillUnmount() {\n if (this.container.current) {\n const modalBodyContainer = this.container.current.closest('.modal-body');\n modalBodyContainer?.removeEventListener('scroll', this.onModalScroll);\n }\n window.removeEventListener('resize', this.updateModalBounds);\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n if (!this.props.open || this.props.cleared) {\n return;\n }\n\n if (prevProps.open !== this.state.open ||\n prevProps.cleared !== this.state.cleared ||\n prevState.scroll !== this.state.scroll ||\n prevState.modalBounds.top !== this.state.modalBounds.top ||\n prevState.modalBounds.bottom !== this.state.modalBounds.bottom) {\n const newInputBounds = this.updateInputBounds();\n this.updatePosition(newInputBounds);\n\n if (this.container.current) {\n const modalBodyContainer = this.container.current.closest('.modal-body');\n const modalBodyRect = modalBodyContainer?.getBoundingClientRect();\n if (modalBodyRect && ((newInputBounds.bottom < modalBodyRect.top) || (newInputBounds.top > modalBodyRect.bottom))) {\n this.props.onLoseVisibility();\n return;\n }\n }\n\n this.updateModalBounds();\n }\n }\n\n getChildHeight = () => {\n if (!this.container.current) {\n return 0;\n }\n\n const listElement = this.suggestionList?.current?.getContent()?.[0];\n if (!listElement) {\n return 0;\n }\n\n return listElement.getBoundingClientRect().height;\n };\n\n updateInputBounds = () => {\n const inputBounds = this.calculateInputRect();\n if (inputBounds.top !== this.state.inputBounds.top ||\n inputBounds.bottom !== this.state.inputBounds.bottom ||\n inputBounds.width !== this.state.inputBounds.width) {\n this.setState({inputBounds});\n }\n return inputBounds;\n };\n\n updatePosition = (newInputBounds: { top: number; bottom: number; width: number}) => {\n let inputBounds = newInputBounds;\n if (!newInputBounds) {\n inputBounds = this.state.inputBounds;\n }\n\n if (!this.container.current) {\n return;\n }\n\n this.latestHeight = this.getChildHeight();\n\n let newPosition = this.props.position;\n if (window.innerHeight < inputBounds.bottom + this.latestHeight) {\n newPosition = 'top';\n }\n if (inputBounds.top - this.latestHeight < 0) {\n newPosition = 'bottom';\n }\n\n if (this.state.position !== newPosition) {\n this.setState({position: newPosition});\n }\n };\n\n updateModalBounds = () => {\n if (!this.container.current) {\n return;\n }\n\n const modalBodyContainer = this.container.current.closest('.modal-body');\n const modalBounds = modalBodyContainer?.getBoundingClientRect();\n\n if (modalBounds) {\n if (this.state.modalBounds.top !== modalBounds.top || this.state.modalBounds.bottom !== modalBounds.bottom) {\n this.setState({modalBounds: {top: modalBounds.top, bottom: modalBounds.bottom}});\n }\n }\n };\n\n render() {\n const {\n ...props\n } = this.props;\n\n Reflect.deleteProperty(props, 'onLoseVisibility');\n\n let position = {};\n if (this.state.position === 'top') {\n position = {bottom: this.state.modalBounds.bottom - this.state.inputBounds.top};\n }\n\n return (\n <div\n style={{position: 'absolute', zIndex: 101, width: this.state.inputBounds.width, ...position}}\n ref={this.container}\n >\n <SuggestionList\n {...props}\n position={this.state.position}\n ref={this.suggestionList}\n />\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {RequireOnlyOne} from '@mattermost/types/utilities';\n\nexport type ProviderResult<Item> = {\n matchedPretext: string;\n terms: string[];\n items: Array<Item | Loading>;\n} & RequireOnlyOne<{\n component: React.ReactNode;\n components: React.ReactNode[];\n}>;\n\nexport type Loading = {\n type: string;\n loading: boolean;\n};\n\nexport type ResultsCallback<Item> = (result: ProviderResult<Item>) => void;\n\nexport default abstract class Provider {\n latestPrefix: string;\n latestComplete: boolean;\n disableDispatches: boolean;\n requestStarted: boolean;\n forceDispatch: boolean;\n\n triggerCharacter?: string;\n\n constructor() {\n this.latestPrefix = '';\n this.latestComplete = true;\n this.disableDispatches = false;\n this.requestStarted = false;\n this.forceDispatch = false;\n }\n\n abstract handlePretextChanged(pretext: string, callback: (res: ProviderResult<unknown>) => void): boolean;\n\n resetRequest() {\n this.requestStarted = false;\n }\n\n startNewRequest(prefix: string) {\n this.latestPrefix = prefix;\n this.latestComplete = false;\n this.requestStarted = true;\n }\n\n shouldCancelDispatch(prefix: string) {\n if (this.forceDispatch) {\n return false;\n }\n\n if (this.disableDispatches) {\n return true;\n }\n\n if (!this.requestStarted) {\n return true;\n }\n\n if (prefix === this.latestPrefix) {\n this.latestComplete = true;\n } else if (this.latestComplete) {\n return true;\n }\n\n return false;\n }\n\n allowDividers() {\n return true;\n }\n\n presentationType() {\n return 'text';\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {getUserIdFromChannelName} from 'mattermost-redux/utils/channel_utils';\n\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport Constants from 'utils/constants';\nimport {imageURLForUser} from 'utils/utils';\n\nimport {SuggestionContainer} from '../suggestion';\nimport type {SuggestionProps} from '../suggestion';\n\nfunction itemToName(item: Channel, currentUserId: string): {icon: React.ReactElement; name: string; description: string} | null {\n if (item.type === Constants.DM_CHANNEL) {\n const profilePicture = (\n <Avatar\n url={imageURLForUser(getUserIdFromChannelName(currentUserId, item.name))}\n size='sm'\n />\n );\n\n return {\n icon: profilePicture,\n name: '@' + item.display_name,\n description: '',\n };\n }\n\n if (item.type === Constants.GM_CHANNEL) {\n return {\n icon: (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <div className='status status--group'>{'G'}</div>\n </span>\n ),\n name: '@' + item.display_name.replace(/ /g, ''),\n description: '',\n };\n }\n\n if (item.type === Constants.OPEN_CHANNEL) {\n return {\n icon: (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className='icon icon--standard icon--no-spacing icon-globe'/>\n </span>\n ),\n name: item.display_name,\n description: '~' + item.name,\n };\n }\n\n if (item.type === Constants.PRIVATE_CHANNEL) {\n return {\n icon: (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className='icon icon--standard icon--no-spacing icon-lock-outline'/>\n </span>\n ),\n name: item.display_name,\n description: '~' + item.name,\n };\n }\n\n return null;\n}\n\ntype Props = SuggestionProps<Channel> & {\n currentUserId: string;\n teammateIsBot: boolean;\n}\n\nconst SearchChannelSuggestion = React.forwardRef<HTMLDivElement, Props>((props, ref) => {\n const {item, teammateIsBot, currentUserId} = props;\n\n const nameObject = itemToName(item, currentUserId);\n if (!nameObject) {\n return (<></>);\n }\n\n const {icon, name, description} = nameObject;\n\n const tag = item.type === Constants.DM_CHANNEL && teammateIsBot ? <BotTag/> : null;\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n >\n {icon}\n <div className='suggestion-list__ellipsis'>\n <span className='suggestion-list__main'>\n {name}\n </span>\n {description}\n </div>\n {tag}\n </SuggestionContainer>\n );\n});\nSearchChannelSuggestion.displayName = 'SearchChannelSuggestion';\nexport default SearchChannelSuggestion;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport SearchChannelSuggestion from './search_channel_suggestion';\n\ntype OwnProps = {\n item: Channel;\n}\n\nconst mapStateToProps = (state: GlobalState, ownProps: OwnProps) => {\n const teammate = getDirectTeammate(state, ownProps.item.id);\n\n return {\n teammateIsBot: Boolean(teammate && teammate.is_bot),\n currentUserId: getCurrentUserId(state),\n };\n};\n\nexport default connect(mapStateToProps, null, null, {forwardRef: true})(SearchChannelSuggestion);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport {isDirectChannel, isGroupChannel, sortChannelsByTypeListAndDisplayName} from 'mattermost-redux/utils/channel_utils';\n\nimport {getCurrentLocale} from 'selectors/i18n';\nimport store from 'stores/redux_store';\n\nimport Constants from 'utils/constants';\n\nimport type {Channel} from './command_provider/app_command_parser/app_command_parser_dependencies.js';\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport SearchChannelSuggestion from './search_channel_suggestion';\n\nconst getState = store.getState;\n\nfunction itemToTerm(isAtSearch: boolean, item: { type: string; display_name: string; name: string }) {\n const prefix = isAtSearch ? '' : '@';\n if (item.type === Constants.DM_CHANNEL) {\n return prefix + item.display_name;\n }\n if (item.type === Constants.GM_CHANNEL) {\n return prefix + item.display_name.replace(/ /g, '');\n }\n if (item.type === Constants.OPEN_CHANNEL || item.type === Constants.PRIVATE_CHANNEL) {\n return item.name;\n }\n return item.name;\n}\n\ntype SearchChannelAutocomplete = (term: string, success?: (channels: Channel[]) => void, error?: (err: ServerError) => void) => void;\n\nexport default class SearchChannelProvider extends Provider {\n autocompleteChannelsForSearch: SearchChannelAutocomplete;\n\n constructor(channelSearchFunc: SearchChannelAutocomplete) {\n super();\n this.autocompleteChannelsForSearch = channelSearchFunc;\n }\n\n handlePretextChanged(pretext: string, resultsCallback: ResultsCallback<Channel>) {\n const captured = (/\\b(?:in|channel):\\s*(\\S*)$/i).exec(pretext.toLowerCase());\n if (captured) {\n let channelPrefix = captured[1];\n const isAtSearch = channelPrefix.startsWith('@');\n if (isAtSearch) {\n channelPrefix = channelPrefix.replace(/^@/, '');\n }\n const isTildeSearch = channelPrefix.startsWith('~');\n if (isTildeSearch) {\n channelPrefix = channelPrefix.replace(/^~/, '');\n }\n this.startNewRequest(channelPrefix);\n\n this.autocompleteChannelsForSearch(\n channelPrefix,\n (data: Channel[]) => {\n if (this.shouldCancelDispatch(channelPrefix)) {\n return;\n }\n\n let channels = data;\n if (isAtSearch) {\n channels = channels.filter((ch: Channel) => isDirectChannel(ch) || isGroupChannel(ch));\n }\n\n const locale = getCurrentLocale(getState());\n\n channels = channels.sort(sortChannelsByTypeListAndDisplayName.bind(null, locale, [Constants.OPEN_CHANNEL, Constants.PRIVATE_CHANNEL, Constants.DM_CHANNEL, Constants.GM_CHANNEL]));\n const channelNames = channels.map(itemToTerm.bind(null, isAtSearch));\n\n resultsCallback({\n matchedPretext: channelPrefix,\n terms: channelNames,\n items: channels,\n component: SearchChannelSuggestion,\n });\n },\n );\n }\n\n return Boolean(captured);\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport SearchDateSuggestion from './search_date_suggestion';\n\ntype DateItem = {label: string; date: string};\n\nexport default class SearchDateProvider extends Provider {\n handlePretextChanged(pretext: string, resultsCallback: ResultsCallback<DateItem>) {\n const captured = (/\\b(?:on|before|after):\\s*(\\S*)$/i).exec(pretext.toLowerCase());\n if (captured) {\n const datePrefix = captured[1];\n\n this.startNewRequest(datePrefix);\n\n const dates: DateItem[] = Object.assign([], [{label: 'Selected Date', date: datePrefix}]);\n const terms = dates.map((date) => date.date);\n\n resultsCallback({\n matchedPretext: datePrefix,\n terms,\n items: dates,\n component: SearchDateSuggestion,\n });\n }\n\n return Boolean(captured);\n }\n\n allowDividers() {\n return false;\n }\n\n presentationType() {\n return 'date';\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Locale} from 'date-fns';\nimport React, {useCallback, useEffect, useState} from 'react';\nimport {DayPicker} from 'react-day-picker';\n\nimport Constants from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport * as Utils from 'utils/utils';\n\nimport type {SuggestionProps} from '../suggestion';\n\nimport 'react-day-picker/dist/style.css';\n\ntype Props = SuggestionProps<never> & {\n currentDate?: Date;\n handleEscape?: () => void;\n locale: string;\n preventClose?: () => void;\n}\n\nconst IconLeft = () => {\n return (\n <i className='icon icon-chevron-left'/>\n );\n};\n\nconst IconRight = () => {\n return (\n <i className='icon icon-chevron-right'/>\n );\n};\n\nconst DAY_PICKER_ICONS = {IconRight, IconLeft};\n\nconst SearchDateSuggestion = ({\n currentDate,\n handleEscape,\n locale,\n preventClose,\n matchedPretext,\n onClick,\n}: Props) => {\n let loadedLocales: Record<string, Locale> = {};\n loadedLocales = Utils.getDatePickerLocalesForDateFns(locale, loadedLocales);\n const [datePickerFocused, setDatePickerFocused] = useState(false);\n\n const handleDayClick = useCallback((day: Date) => {\n const dayString = new Date(Date.UTC(day.getFullYear(), day.getMonth(), day.getDate())).toISOString().split('T')[0];\n onClick(dayString, matchedPretext);\n }, [onClick, matchedPretext]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (Keyboard.isKeyPressed(e, Constants.KeyCodes.DOWN) && document.activeElement?.id === 'searchBox') {\n setDatePickerFocused(true);\n } else if (Keyboard.isKeyPressed(e, Constants.KeyCodes.ESCAPE)) {\n handleEscape?.();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleEscape]);\n\n return (\n <DayPicker\n onDayClick={handleDayClick}\n showOutsideDays={true}\n mode={'single'}\n locale={loadedLocales[locale]}\n initialFocus={datePickerFocused}\n onMonthChange={preventClose}\n id='searchDatePicker'\n selected={currentDate}\n components={DAY_PICKER_ICONS}\n />\n );\n};\nexport default React.memo(SearchDateSuggestion);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getCurrentTimezone} from 'mattermost-redux/selectors/entities/timezone';\n\nimport {getCurrentLocale} from 'selectors/i18n';\n\nimport {getCurrentDateForTimezone} from 'utils/timezone';\n\nimport type {GlobalState} from 'types/store';\n\nimport SearchDateSuggestion from './search_date_suggestion';\n\nfunction mapStateToProps(state: GlobalState) {\n const timezone = getCurrentTimezone(state);\n const locale = getCurrentLocale(state);\n const currentDate = getCurrentDateForTimezone(timezone);\n\n return {\n currentDate,\n locale,\n };\n}\n\nexport default connect(mapStateToProps, null, null, {forwardRef: true})(SearchDateSuggestion);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {UserAutocomplete} from '@mattermost/types/autocomplete';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport SharedUserIndicator from 'components/shared_user_indicator';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport * as Utils from 'utils/utils';\n\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport {SuggestionContainer} from './suggestion';\nimport type {SuggestionProps} from './suggestion';\n\nexport const SearchUserSuggestion = React.forwardRef<HTMLDivElement, SuggestionProps<UserProfile>>((props, ref) => {\n const {item} = props;\n\n const username = item.username;\n let description = '';\n\n if ((item.first_name || item.last_name) && item.nickname) {\n description = `${Utils.getFullName(item)} (${item.nickname})`;\n } else if (item.nickname) {\n description = `(${item.nickname})`;\n } else if (item.first_name || item.last_name) {\n description = `${Utils.getFullName(item)}`;\n }\n\n let sharedIcon;\n if (item.remote_id) {\n sharedIcon = (\n <SharedUserIndicator\n className='mention__shared-user-icon'\n />\n );\n }\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n >\n <Avatar\n size='sm'\n username={username}\n url={Utils.imageURLForUser(item.id, item.last_picture_update)}\n />\n <div className='suggestion-list__ellipsis'>\n <span className='suggestion-list__main'>\n {'@'}{username}\n </span>\n {item.is_bot && <BotTag/>}\n {description}\n </div>\n {sharedIcon}\n </SuggestionContainer>\n );\n});\nSearchUserSuggestion.displayName = 'SearchUserSuggestion';\n\nexport default class SearchUserProvider extends Provider {\n private autocompleteUsersInTeam: (username: string) => Promise<UserAutocomplete>;\n constructor(userSearchFunc: (username: string) => Promise<UserAutocomplete>) {\n super();\n this.autocompleteUsersInTeam = userSearchFunc;\n }\n\n handlePretextChanged(pretext: string, resultsCallback: ResultsCallback<UserProfile>) {\n const captured = (/\\bfrom:\\s*(\\S*)$/i).exec(pretext.toLowerCase());\n\n this.doAutocomplete(captured, resultsCallback);\n\n return Boolean(captured);\n }\n\n async doAutocomplete(captured: RegExpExecArray | null, resultsCallback: ResultsCallback<UserProfile>) {\n if (!captured) {\n return;\n }\n\n const usernamePrefix = captured[1];\n\n this.startNewRequest(usernamePrefix);\n\n const data = await this.autocompleteUsersInTeam(usernamePrefix);\n\n if (this.shouldCancelDispatch(usernamePrefix)) {\n return;\n }\n\n const users = Object.assign([], data.users);\n const mentions = users.map((user: UserProfile) => user.username);\n\n resultsCallback({\n matchedPretext: usernamePrefix,\n terms: mentions,\n items: users,\n component: SearchUserSuggestion,\n });\n }\n\n allowDividers() {\n return true;\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback} from 'react';\n\nexport interface SuggestionProps<Item> extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick' | 'onMouseMove'> {\n // eslint-disable-next-line react/no-unused-prop-types\n item: Item;\n\n term: string;\n matchedPretext: string;\n isSelection: boolean;\n\n children?: React.ReactNode;\n onClick: (term: string, matchedPretext: string) => void;\n onMouseMove: (term: string) => void;\n}\n\nconst SuggestionContainer = React.forwardRef<HTMLDivElement, SuggestionProps<unknown>>((props, ref) => {\n const {\n children,\n term,\n matchedPretext,\n isSelection,\n\n onClick,\n onMouseMove,\n\n role = 'button',\n tabIndex = -1,\n ...otherProps\n } = props;\n\n Reflect.deleteProperty(otherProps, 'item');\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n\n onClick(term, matchedPretext);\n }, [onClick, term, matchedPretext]);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n\n onMouseMove(term);\n }, [onMouseMove, term]);\n\n return (\n <div\n ref={ref}\n className={classNames('suggestion-list__item', {'suggestion--selected': isSelection})}\n onClick={handleClick}\n onMouseMove={handleMouseMove}\n role={role}\n tabIndex={tabIndex}\n {...otherProps}\n >\n {children}\n </div>\n );\n});\n\nSuggestionContainer.displayName = 'SuggestionContainer';\nexport {SuggestionContainer};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nimport QuickInput from 'components/quick_input';\n\nimport Constants, {A11yCustomEventTypes} from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils';\n\nconst EXECUTE_CURRENT_COMMAND_ITEM_ID = Constants.Integrations.EXECUTE_CURRENT_COMMAND_ITEM_ID;\nconst OPEN_COMMAND_IN_MODAL_ITEM_ID = Constants.Integrations.OPEN_COMMAND_IN_MODAL_ITEM_ID;\nconst KeyCodes = Constants.KeyCodes;\n\nexport default class SuggestionBox extends React.PureComponent {\n static propTypes = {\n\n /**\n * The list component to render, usually SuggestionList\n */\n listComponent: PropTypes.any.isRequired,\n\n /**\n * Where the list will be displayed relative to the input box, defaults to 'top'\n */\n listPosition: PropTypes.oneOf(['top', 'bottom']),\n\n /**\n * The input component to render (it is passed through props to the QuickInput)\n */\n inputComponent: PropTypes.elementType,\n\n /**\n * The date component to render\n */\n dateComponent: PropTypes.any,\n\n /**\n * The value of in the input\n */\n value: PropTypes.string.isRequired,\n\n /**\n * Array of suggestion providers\n */\n providers: PropTypes.arrayOf(PropTypes.object).isRequired,\n\n /**\n * CSS class for the div parent of the input box\n */\n containerClass: PropTypes.string,\n\n /**\n * Set to ['all'] to draw all available dividers, or use an array of the types of dividers to only render those\n * (e.g. [Constants.MENTION_RECENT_CHANNELS, Constants.MENTION_PUBLIC_CHANNELS]) between types of list items\n */\n renderDividers: PropTypes.arrayOf(PropTypes.string),\n\n /**\n * Set to true to render a message when there were no results found, defaults to false\n */\n renderNoResults: PropTypes.bool,\n\n /**\n * Set to true if we want the suggestions to take in the complete word as the pretext, defaults to false\n */\n shouldSearchCompleteText: PropTypes.bool,\n\n /**\n * Set to allow TAB to select an item in the list, defaults to true\n */\n completeOnTab: PropTypes.bool,\n\n /**\n * Function called when input box gains focus\n */\n onFocus: PropTypes.func,\n\n /**\n * Function called when input box loses focus\n */\n onBlur: PropTypes.func,\n\n /**\n * Function called when input box value changes\n */\n onChange: PropTypes.func,\n\n /**\n * Function called when a key is pressed and the input box is in focus\n */\n onKeyDown: PropTypes.func,\n onKeyPress: PropTypes.func,\n onComposition: PropTypes.func,\n\n onSearchTypeSelected: PropTypes.func,\n\n /**\n * Function called when an item is selected\n */\n onItemSelected: PropTypes.func,\n\n /**\n * The number of characters required to show the suggestion list, defaults to 1\n */\n requiredCharacters: PropTypes.number,\n\n /**\n * If true, the suggestion box is opened on focus, default to false\n */\n openOnFocus: PropTypes.bool,\n\n /**\n * If true, the suggestion box is disabled\n */\n disabled: PropTypes.bool,\n\n /**\n * If true, it displays allow to display a default list when empty\n */\n openWhenEmpty: PropTypes.bool,\n\n /**\n * If true, replace all input in the suggestion box with the selected option after a select, defaults to false\n */\n replaceAllInputOnSelect: PropTypes.bool,\n\n /**\n * An optional, opaque identifier that distinguishes the context in which the suggestion\n * box is rendered. This allows the reused component to otherwise respond to changes.\n */\n contextId: PropTypes.string,\n\n /**\n * Allows parent to access received suggestions\n */\n onSuggestionsReceived: PropTypes.func,\n\n /**\n * To show suggestions even when focus is lost\n */\n forceSuggestionsWhenBlur: PropTypes.bool,\n\n /**\n * aligns the suggestionlist with the textbox dimension\n */\n alignWithTextbox: PropTypes.bool,\n\n actions: PropTypes.shape({\n addMessageIntoHistory: PropTypes.func.isRequired,\n }).isRequired,\n\n /**\n * Props for input\n */\n id: PropTypes.string,\n className: PropTypes.string,\n placeholder: PropTypes.string,\n maxLength: PropTypes.string,\n delayInputUpdate: PropTypes.bool,\n spellCheck: PropTypes.string,\n onMouseUp: PropTypes.func,\n onKeyUp: PropTypes.func,\n onHeightChange: PropTypes.func,\n onWidthChange: PropTypes.func,\n onPaste: PropTypes.func,\n style: PropTypes.object,\n tabIndex: PropTypes.string,\n type: PropTypes.string,\n clearable: PropTypes.bool,\n onClear: PropTypes.func,\n };\n\n static defaultProps = {\n listPosition: 'top',\n containerClass: '',\n renderDividers: [],\n renderNoResults: false,\n shouldSearchCompleteText: false,\n completeOnTab: true,\n requiredCharacters: 1,\n openOnFocus: false,\n openWhenEmpty: false,\n replaceAllInputOnSelect: false,\n forceSuggestionsWhenBlur: false,\n alignWithTextbox: false,\n };\n\n constructor(props) {\n super(props);\n this.suggestionReadOut = React.createRef();\n\n // Keep track of whether we're composing a CJK character so we can make suggestions for partial characters\n this.composing = false;\n\n this.pretext = '';\n\n // Used for debouncing pretext changes\n this.timeoutId = '';\n\n // Used for preventing suggestion list to close when scrollbar is clicked\n this.preventSuggestionListCloseFlag = false;\n\n // pretext: the text before the cursor\n // matchedPretext: a list of the text before the cursor that will be replaced if the corresponding autocomplete term is selected\n // terms: a list of strings which the previously typed text may be replaced by\n // items: a list of objects backing the terms which may be used in rendering\n // components: a list of react components that can be used to render their corresponding item\n // selection: the term currently selected by the keyboard\n this.state = {\n focused: false,\n cleared: true,\n matchedPretext: [],\n items: [],\n terms: [],\n components: [],\n selection: '',\n selectionIndex: 0,\n allowDividers: true,\n presentationType: 'text',\n suggestionBoxAlgn: undefined,\n };\n\n this.inputRef = React.createRef();\n }\n\n componentDidMount() {\n this.handlePretextChanged(this.pretext);\n }\n\n componentDidUpdate(prevProps) {\n const {value} = this.props;\n\n // Post was just submitted, update pretext property.\n if (value === '' && this.pretext !== value) {\n this.handlePretextChanged(value);\n return;\n }\n\n if (prevProps.contextId !== this.props.contextId) {\n const textbox = this.getTextbox();\n const pretext = textbox.value.substring(0, textbox.selectionEnd).toLowerCase();\n\n this.handlePretextChanged(pretext);\n }\n }\n\n componentWillUnmount() {\n clearTimeout(this.timeoutId);\n }\n\n getTextbox = () => {\n if (!this.inputRef.current) {\n return null;\n }\n\n return this.inputRef.current;\n };\n\n handleEmitClearSuggestions = (delay = 0) => {\n setTimeout(() => {\n this.clear();\n this.handlePretextChanged('');\n }, delay);\n };\n\n preventSuggestionListClose = () => {\n this.preventSuggestionListCloseFlag = true;\n };\n\n handleFocusOut = (e) => {\n if (this.preventSuggestionListCloseFlag) {\n this.preventSuggestionListCloseFlag = false;\n return;\n }\n\n // Focus is switching TO e.relatedTarget, so only treat this as a blur event if we're not switching\n // between children (like from the textbox to the suggestion list)\n if (this.container.contains(e.relatedTarget)) {\n return;\n }\n\n if (UserAgent.isIos() && !e.relatedTarget) {\n // On Safari and iOS classic app, the autocomplete stays open\n // when you tap outside of the post textbox or search box.\n return;\n }\n\n if (!this.props.forceSuggestionsWhenBlur) {\n this.handleEmitClearSuggestions();\n }\n\n this.setState({focused: false});\n\n if (this.props.onBlur) {\n this.props.onBlur(e);\n }\n };\n\n handleFocusIn = (e) => {\n // Focus is switching FROM e.relatedTarget, so only treat this as a focus event if we're not switching\n // between children (like from the textbox to the suggestion list). PreventSuggestionListCloseFlag is\n // checked because if true, it means that the focusIn comes from a click in the suggestion box, an\n // option choice, so we don't want the focus event to be triggered\n if (this.container.contains(e.relatedTarget) || this.preventSuggestionListCloseFlag) {\n return;\n }\n\n this.setState({focused: true});\n\n if (this.props.openOnFocus || this.props.openWhenEmpty) {\n setTimeout(() => {\n const textbox = this.getTextbox();\n if (textbox) {\n const pretext = textbox.value.substring(0, textbox.selectionEnd);\n if (this.props.openWhenEmpty || pretext.length >= this.props.requiredCharacters) {\n if (this.pretext !== pretext) {\n this.handlePretextChanged(pretext);\n }\n }\n }\n });\n }\n\n if (this.props.onFocus) {\n this.props.onFocus();\n }\n };\n\n handleChange = (e) => {\n const textbox = this.getTextbox();\n const pretext = this.props.shouldSearchCompleteText ? textbox.value.trim() : textbox.value.substring(0, textbox.selectionEnd);\n\n if (!this.composing && this.pretext !== pretext) {\n this.handlePretextChanged(pretext);\n }\n\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n };\n\n handleCompositionStart = () => {\n this.composing = true;\n if (this.props.onComposition) {\n this.props.onComposition();\n }\n };\n\n handleCompositionUpdate = (e) => {\n if (!e.data) {\n return;\n }\n\n // The caret appears before the CJK character currently being composed, so re-add it to the pretext\n const textbox = this.getTextbox();\n const pretext = textbox.value.substring(0, textbox.selectionStart) + e.data;\n\n this.handlePretextChanged(pretext);\n if (this.props.onComposition) {\n this.props.onComposition();\n }\n };\n\n handleCompositionEnd = () => {\n this.composing = false;\n if (this.props.onComposition) {\n this.props.onComposition();\n }\n };\n\n addTextAtCaret = (term, matchedPretext) => {\n const textbox = this.getTextbox();\n const caret = textbox.selectionEnd;\n const text = this.props.value;\n const pretext = textbox.value.substring(0, textbox.selectionEnd);\n\n let prefix;\n let keepPretext = false;\n if (pretext.toLowerCase().endsWith(matchedPretext.toLowerCase())) {\n prefix = pretext.substring(0, pretext.length - matchedPretext.length);\n } else {\n // the pretext has changed since we got a term to complete so see if the term still fits the pretext\n const termWithoutMatched = term.substring(matchedPretext.length);\n const overlap = SuggestionBox.findOverlap(pretext, termWithoutMatched);\n\n keepPretext = overlap.length === 0;\n prefix = pretext.substring(0, pretext.length - overlap.length - matchedPretext.length);\n }\n\n if (keepPretext) {\n // The term no longer fits the pretext, so don't change anything or else we might erase something\n return;\n }\n\n const suffix = text.substring(caret);\n\n const newValue = prefix + term + ' ' + suffix;\n textbox.value = newValue;\n\n if (this.props.onChange) {\n // fake an input event to send back to parent components\n const e = {\n target: textbox,\n };\n\n // don't call handleChange or we'll get into an event loop\n this.props.onChange(e);\n }\n\n // set the caret position after the next rendering\n window.requestAnimationFrame(() => {\n if (textbox.value === newValue) {\n Utils.setCaretPosition(textbox, prefix.length + term.length + 1);\n }\n });\n };\n\n replaceText = (term) => {\n const textbox = this.getTextbox();\n textbox.value = term;\n\n if (this.props.onChange) {\n // fake an input event to send back to parent components\n const e = {\n target: textbox,\n };\n\n // don't call handleChange or we'll get into an event loop\n this.props.onChange(e);\n }\n };\n\n handleCompleteWord = (term, matchedPretext, e) => {\n let fixedTerm = term;\n let finish = false;\n let openCommandInModal = false;\n if (term.endsWith(EXECUTE_CURRENT_COMMAND_ITEM_ID)) {\n fixedTerm = term.substring(0, term.length - EXECUTE_CURRENT_COMMAND_ITEM_ID.length);\n finish = true;\n }\n\n if (term.endsWith(OPEN_COMMAND_IN_MODAL_ITEM_ID)) {\n fixedTerm = term.substring(0, term.length - OPEN_COMMAND_IN_MODAL_ITEM_ID.length);\n finish = true;\n openCommandInModal = true;\n }\n\n if (!finish) {\n if (this.props.replaceAllInputOnSelect) {\n this.replaceText(fixedTerm);\n } else {\n this.addTextAtCaret(fixedTerm, matchedPretext);\n }\n }\n\n if (this.props.onItemSelected) {\n const items = this.state.items;\n const terms = this.state.terms;\n for (let i = 0; i < terms.length; i++) {\n if (terms[i] === fixedTerm) {\n this.props.onItemSelected(items[i]);\n break;\n }\n }\n }\n\n this.clear();\n this.handlePretextChanged('');\n\n if (openCommandInModal) {\n const appProvider = this.props.providers.find((p) => p.openAppsModalFromCommand);\n if (!appProvider) {\n return false;\n }\n appProvider.openAppsModalFromCommand(fixedTerm);\n this.props.actions.addMessageIntoHistory(fixedTerm);\n this.inputRef.current.value = '';\n this.handleChange({target: this.inputRef.current});\n return false;\n }\n\n this.inputRef.current.focus();\n\n if (finish && this.props.onKeyPress) {\n let ke = e;\n if (!e || Keyboard.isKeyPressed(e, Constants.KeyCodes.TAB)) {\n ke = new KeyboardEvent('keydown', {\n bubbles: true, cancelable: true, keyCode: 13,\n });\n if (e) {\n e.preventDefault();\n }\n }\n this.props.onKeyPress(ke);\n return true;\n }\n\n if (!finish) {\n for (const provider of this.props.providers) {\n if (provider.handleCompleteWord) {\n provider.handleCompleteWord(fixedTerm, matchedPretext, this.handlePretextChanged);\n }\n }\n }\n return false;\n };\n\n selectNext = () => {\n this.setSelectionByDelta(1);\n };\n\n selectPrevious = () => {\n this.setSelectionByDelta(-1);\n };\n\n setSelectionByDelta = (delta) => {\n let selectionIndex = this.state.terms.indexOf(this.state.selection);\n\n if (selectionIndex === -1) {\n this.setState({\n selection: '',\n });\n return;\n }\n\n selectionIndex += delta;\n\n if (selectionIndex < 0) {\n selectionIndex = 0;\n } else if (selectionIndex > this.state.terms.length - 1) {\n selectionIndex = this.state.terms.length - 1;\n }\n\n this.setState({\n selection: this.state.terms[selectionIndex],\n selectionIndex,\n });\n };\n\n setSelection = (term) => {\n const selectionIndex = this.state.terms.indexOf(this.state.selection);\n\n this.setState({\n selection: term,\n selectionIndex,\n });\n };\n\n clear = () => {\n if (!this.state.cleared) {\n this.setState({\n cleared: true,\n matchedPretext: [],\n terms: [],\n items: [],\n components: [],\n selection: '',\n suggestionBoxAlgn: undefined,\n });\n }\n };\n\n hasSuggestions = () => {\n return this.state.items.some((item) => !item.loading);\n };\n\n handleKeyDown = (e) => {\n if ((this.props.openWhenEmpty || this.props.value) && this.hasSuggestions()) {\n const ctrlOrMetaKeyPressed = e.ctrlKey || e.metaKey;\n if (Keyboard.isKeyPressed(e, KeyCodes.UP)) {\n this.selectPrevious();\n e.preventDefault();\n } else if (Keyboard.isKeyPressed(e, KeyCodes.DOWN)) {\n this.selectNext();\n e.preventDefault();\n } else if ((Keyboard.isKeyPressed(e, KeyCodes.ENTER) && !ctrlOrMetaKeyPressed) || (this.props.completeOnTab && Keyboard.isKeyPressed(e, KeyCodes.TAB))) {\n let matchedPretext = '';\n for (let i = 0; i < this.state.terms.length; i++) {\n if (this.state.terms[i] === this.state.selection) {\n matchedPretext = this.state.matchedPretext[i];\n }\n }\n\n // If these don't match, the user typed quickly and pressed enter before we could\n // update the pretext, so update the pretext before completing\n if (this.pretext.toLowerCase().endsWith(matchedPretext.toLowerCase())) {\n if (this.handleCompleteWord(this.state.selection, matchedPretext, e)) {\n return;\n }\n } else {\n clearTimeout(this.timeoutId);\n this.nonDebouncedPretextChanged(this.pretext, true);\n }\n\n if (this.props.onKeyDown) {\n this.props.onKeyDown(e);\n }\n e.preventDefault();\n } else if (Keyboard.isKeyPressed(e, KeyCodes.ESCAPE)) {\n this.clear();\n this.setState({presentationType: 'text'});\n e.preventDefault();\n } else if (this.props.onKeyDown) {\n this.props.onKeyDown(e);\n }\n } else if (this.props.onKeyDown) {\n this.props.onKeyDown(e);\n }\n };\n\n focusInputOnEscape = () => {\n if (this.inputRef.current) {\n document.dispatchEvent(new CustomEvent(\n A11yCustomEventTypes.FOCUS, {\n detail: {\n target: this.inputRef.current,\n keyboardOnly: true,\n },\n },\n ));\n }\n };\n\n handleReceivedSuggestions = (suggestions) => {\n let newComponents = [];\n const newPretext = [];\n if (this.props.onSuggestionsReceived) {\n this.props.onSuggestionsReceived(suggestions);\n }\n\n for (let i = 0; i < suggestions.terms.length; i++) {\n newComponents.push(suggestions.component);\n newPretext.push(suggestions.matchedPretext);\n }\n\n if (suggestions.components) {\n newComponents = suggestions.components;\n }\n\n const terms = suggestions.terms;\n const items = suggestions.items;\n let selection = this.state.selection;\n const selectionIndex = terms.indexOf(selection);\n if (selectionIndex !== this.state.selectionIndex) {\n if (terms.length > 0) {\n selection = terms[0];\n } else if (this.state.selection) {\n selection = '';\n }\n }\n\n this.setState({\n cleared: false,\n selection,\n terms,\n items,\n components: newComponents,\n matchedPretext: newPretext,\n });\n\n return {selection, matchedPretext: suggestions.matchedPretext};\n };\n\n makeHandleReceivedSuggestionsAndComplete = () => {\n let firstComplete = true;\n return (suggestions) => {\n const {selection, matchedPretext} = this.handleReceivedSuggestions(suggestions);\n\n if (selection && firstComplete) {\n this.handleCompleteWord(selection, matchedPretext);\n firstComplete = false;\n }\n };\n };\n\n nonDebouncedPretextChanged = (pretext, complete = false) => {\n const {alignWithTextbox} = this.props;\n this.pretext = pretext;\n let handled = false;\n let callback = this.handleReceivedSuggestions;\n if (complete) {\n callback = this.makeHandleReceivedSuggestionsAndComplete();\n }\n for (const provider of this.props.providers) {\n handled = provider.handlePretextChanged(pretext, callback) || handled;\n\n if (handled) {\n if (!this.state.suggestionBoxAlgn && ['@', ':', '~', '/'].includes(provider.triggerCharacter)) {\n const char = provider.triggerCharacter;\n const pxToSubstract = Utils.getPxToSubstract(char);\n\n // get the alignment for the box and set it in the component state\n const suggestionBoxAlgn = Utils.getSuggestionBoxAlgn(this.getTextbox(), pxToSubstract, alignWithTextbox);\n this.setState({\n suggestionBoxAlgn,\n });\n }\n\n this.setState({\n presentationType: provider.presentationType(),\n allowDividers: provider.allowDividers(),\n });\n\n break;\n }\n }\n if (!handled) {\n this.clear();\n }\n };\n\n debouncedPretextChanged = (pretext) => {\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => this.nonDebouncedPretextChanged(pretext), Constants.SEARCH_TIMEOUT_MILLISECONDS);\n };\n\n handlePretextChanged = (pretext) => {\n this.pretext = pretext;\n this.debouncedPretextChanged(pretext);\n };\n\n blur = () => {\n this.inputRef.current.blur();\n };\n\n focus = () => {\n const input = this.inputRef.current;\n if (input.value === '\"\"' || input.value.endsWith('\"\"')) {\n input.selectionStart = input.value.length - 1;\n input.selectionEnd = input.value.length - 1;\n } else {\n input.selectionStart = input.value.length;\n }\n input.focus();\n\n this.handleChange({target: this.inputRef.current});\n };\n\n setContainerRef = (container) => {\n // Attach/detach event listeners that aren't supported by React\n if (this.container) {\n this.container.removeEventListener('focusin', this.handleFocusIn);\n this.container.removeEventListener('focusout', this.handleFocusOut);\n }\n\n if (container) {\n container.addEventListener('focusin', this.handleFocusIn);\n container.addEventListener('focusout', this.handleFocusOut);\n }\n\n // Save ref\n this.container = container;\n };\n\n getListPosition = (listPosition) => {\n if (!this.state.suggestionBoxAlgn) {\n return listPosition;\n }\n\n return listPosition === 'bottom' && this.state.suggestionBoxAlgn.placementShift ? 'top' : listPosition;\n };\n\n render() {\n const {\n dateComponent,\n listComponent,\n listPosition,\n renderNoResults,\n ...props\n } = this.props;\n\n // set the renderDivider const to either the value stored in the renderDividers prop or an empty string\n // (the renderDividers prop can also probably be a empty string, but is not guaranteed to be)\n let renderDividers;\n if (this.state.allowDividers) {\n renderDividers = this.props.renderDividers;\n }\n\n // Don't pass props used by SuggestionBox\n Reflect.deleteProperty(props, 'providers');\n Reflect.deleteProperty(props, 'onChange'); // We use onInput instead of onChange on the actual input\n Reflect.deleteProperty(props, 'onComposition');\n Reflect.deleteProperty(props, 'onItemSelected');\n Reflect.deleteProperty(props, 'completeOnTab');\n Reflect.deleteProperty(props, 'requiredCharacters');\n Reflect.deleteProperty(props, 'openOnFocus');\n Reflect.deleteProperty(props, 'openWhenEmpty');\n Reflect.deleteProperty(props, 'onFocus');\n Reflect.deleteProperty(props, 'onBlur');\n Reflect.deleteProperty(props, 'containerClass');\n Reflect.deleteProperty(props, 'replaceAllInputOnSelect');\n Reflect.deleteProperty(props, 'renderDividers');\n Reflect.deleteProperty(props, 'contextId');\n Reflect.deleteProperty(props, 'forceSuggestionsWhenBlur');\n Reflect.deleteProperty(props, 'onSuggestionsReceived');\n Reflect.deleteProperty(props, 'actions');\n Reflect.deleteProperty(props, 'shouldSearchCompleteText');\n Reflect.deleteProperty(props, 'alignWithTextbox');\n\n // This needs to be upper case so React doesn't think it's an html tag\n const SuggestionListComponent = listComponent;\n const SuggestionDateComponent = dateComponent;\n\n return (\n <div\n ref={this.setContainerRef}\n className={this.props.containerClass}\n >\n <div\n ref={this.suggestionReadOut}\n aria-live='polite'\n role='alert'\n className='sr-only'\n />\n <QuickInput\n ref={this.inputRef}\n autoComplete='off'\n {...props}\n onInput={this.handleChange}\n onCompositionStart={this.handleCompositionStart}\n onCompositionUpdate={this.handleCompositionUpdate}\n onCompositionEnd={this.handleCompositionEnd}\n onKeyDown={this.handleKeyDown}\n />\n {(this.props.openWhenEmpty || this.props.value.length >= this.props.requiredCharacters) && this.state.presentationType === 'text' && (\n <SuggestionListComponent\n ariaLiveRef={this.suggestionReadOut}\n open={this.state.focused || this.props.forceSuggestionsWhenBlur}\n pretext={this.pretext}\n position={this.getListPosition(listPosition)}\n renderDividers={renderDividers}\n renderNoResults={renderNoResults}\n onCompleteWord={this.handleCompleteWord}\n preventClose={this.preventSuggestionListClose}\n onItemHover={this.setSelection}\n cleared={this.state.cleared}\n matchedPretext={this.state.matchedPretext}\n items={this.state.items}\n terms={this.state.terms}\n suggestionBoxAlgn={this.state.suggestionBoxAlgn}\n selection={this.state.selection}\n components={this.state.components}\n inputRef={this.inputRef}\n onLoseVisibility={this.blur}\n />\n )}\n {(this.props.openWhenEmpty || this.props.value.length >= this.props.requiredCharacters) && this.state.presentationType === 'date' &&\n <SuggestionDateComponent\n items={this.state.items}\n terms={this.state.terms}\n components={this.state.components}\n matchedPretext={this.state.matchedPretext}\n onCompleteWord={this.handleCompleteWord}\n preventClose={this.preventSuggestionListClose}\n handleEscape={this.focusInputOnEscape}\n />\n }\n </div>\n );\n }\n\n // Finds the longest substring that's at both the end of b and the start of a. For example,\n // if a = \"firepit\" and b = \"pitbull\", findOverlap would return \"pit\".\n static findOverlap(a, b) {\n const aLower = a.toLowerCase();\n const bLower = b.toLowerCase();\n\n for (let i = bLower.length; i > 0; i--) {\n const substring = bLower.substring(0, i);\n\n if (aLower.endsWith(substring)) {\n return substring;\n }\n }\n\n return '';\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\n\nimport {addMessageIntoHistory} from 'mattermost-redux/actions/posts';\n\nimport SuggestionBox from './suggestion_box';\n\nfunction mapDispatchToProps(dispatch) {\n return {\n actions: bindActionCreators({\n addMessageIntoHistory,\n }, dispatch),\n };\n}\nexport default connect(null, mapDispatchToProps, null, {forwardRef: true})(SuggestionBox);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport cloneDeep from 'lodash/cloneDeep';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport {FormattedMessage} from 'react-intl';\n\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {Constants} from 'utils/constants';\nimport {isEmptyObject} from 'utils/utils';\n\nexport interface Props {\n ariaLiveRef?: React.RefObject<HTMLDivElement>;\n inputRef?: React.RefObject<HTMLDivElement>;\n open: boolean;\n position?: 'top' | 'bottom';\n renderDividers?: string[];\n renderNoResults?: boolean;\n onCompleteWord: (term: string, matchedPretext: string, e?: React.KeyboardEventHandler<HTMLDivElement>) => boolean;\n preventClose?: () => void;\n onItemHover: (term: string) => void;\n pretext: string;\n cleared: boolean;\n matchedPretext: string[];\n items: any[];\n terms: string[];\n selection: string;\n components: Array<React.ComponentType<any>>;\n wrapperHeight?: number;\n\n // suggestionBoxAlgn is an optional object that can be passed to align the SuggestionList with the keyboard caret\n // as the user is typing.\n suggestionBoxAlgn?: {\n lineHeight?: number;\n pixelsToMoveX?: number;\n pixelsToMoveY?: number;\n };\n}\n\nexport default class SuggestionList extends React.PureComponent<Props> {\n static defaultProps = {\n renderDividers: [],\n renderNoResults: false,\n };\n contentRef: React.RefObject<HTMLDivElement>;\n wrapperRef: React.RefObject<HTMLDivElement>;\n itemRefs: Map<string, any>;\n currentLabel: string | null;\n currentItem: any;\n maxHeight: number;\n\n constructor(props: Props) {\n super(props);\n\n this.contentRef = React.createRef();\n this.wrapperRef = React.createRef();\n this.itemRefs = new Map();\n this.currentLabel = '';\n this.currentItem = {};\n this.maxHeight = 0;\n }\n\n componentDidMount() {\n this.updateMaxHeight();\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.props.selection !== prevProps.selection && this.props.selection) {\n this.scrollToItem(this.props.selection);\n }\n\n if (!isEmptyObject(this.currentItem)) {\n this.generateLabel(this.currentItem);\n }\n\n if (this.props.items.length > 0 && prevProps.items.length === 0) {\n this.updateMaxHeight();\n }\n }\n\n componentWillUnmount() {\n this.removeLabel();\n }\n\n updateMaxHeight = () => {\n if (!this.props.inputRef?.current) {\n return;\n }\n\n const inputHeight = (this.props.inputRef as React.RefObject<HTMLInputElement>).current?.clientHeight ?? 0;\n\n this.maxHeight = Math.min(\n window.innerHeight - (inputHeight + Constants.POST_MODAL_PADDING),\n Constants.SUGGESTION_LIST_MAXHEIGHT,\n );\n\n if (this.contentRef.current) {\n this.contentRef.current.style.maxHeight = `${this.maxHeight}px`;\n }\n };\n\n announceLabel() {\n const suggestionReadOut = this.props.ariaLiveRef?.current;\n if (suggestionReadOut) {\n suggestionReadOut.textContent = this.currentLabel;\n }\n }\n\n removeLabel() {\n const suggestionReadOut = this.props.ariaLiveRef?.current;\n if (suggestionReadOut) {\n suggestionReadOut.textContent = '';\n }\n }\n\n generateLabel(item: any) {\n if (item.username) {\n this.currentLabel = item.username;\n if ((item.first_name || item.last_name) && item.nickname) {\n this.currentLabel += ` ${item.first_name} ${item.last_name} ${item.nickname}`;\n } else if (item.nickname) {\n this.currentLabel += ` ${item.nickname}`;\n } else if (item.first_name || item.last_name) {\n this.currentLabel += ` ${item.first_name} ${item.last_name}`;\n }\n } else if (item.type === 'mention.channels') {\n this.currentLabel = item.channel.display_name;\n } else if (item.emoji) {\n this.currentLabel = item.name;\n }\n\n if (this.currentLabel) {\n this.currentLabel = this.currentLabel.toLowerCase();\n }\n this.announceLabel();\n }\n\n getContent = () => {\n return this.contentRef.current;\n };\n\n scrollToItem = (term: string) => {\n const content = this.getContent();\n if (!content) {\n return;\n }\n\n const visibleContentHeight = content.clientHeight;\n const actualContentHeight = content.scrollHeight;\n\n if (visibleContentHeight < actualContentHeight) {\n const contentTop = content.scrollTop;\n const contentTopPadding = this.getComputedCssProperty(content, 'paddingTop');\n const contentBottomPadding = this.getComputedCssProperty(content, 'paddingTop');\n\n const item = ReactDOM.findDOMNode(this.itemRefs.get(term));\n if (!item) {\n return;\n }\n\n const itemTop = (item as HTMLElement).offsetTop - this.getComputedCssProperty(item, 'marginTop');\n const itemBottomMargin = this.getComputedCssProperty(item, 'marginBottom') + this.getComputedCssProperty(item, 'paddingBottom');\n const itemBottom = (item as HTMLElement).offsetTop + this.getComputedCssProperty(item, 'height') + itemBottomMargin;\n if (itemTop - contentTopPadding < contentTop) {\n // the item is off the top of the visible space\n content.scrollTop = itemTop - contentTopPadding;\n } else if (itemBottom + contentTopPadding + contentBottomPadding > contentTop + visibleContentHeight) {\n // the item has gone off the bottom of the visible space\n content.scrollTop = (itemBottom - visibleContentHeight) + contentTopPadding + contentBottomPadding;\n }\n }\n };\n\n getComputedCssProperty(element: Element | Text, property: string) {\n return parseInt(getComputedStyle(element as HTMLElement).getPropertyValue(property) || '0', 10);\n }\n\n getTransform() {\n if (!this.props.suggestionBoxAlgn) {\n return {};\n }\n\n const {lineHeight, pixelsToMoveX} = this.props.suggestionBoxAlgn;\n let pixelsToMoveY = this.props.suggestionBoxAlgn.pixelsToMoveY;\n\n if (this.props.position === 'bottom' && pixelsToMoveY) {\n // Add the line height and 4 extra px so it looks less tight\n pixelsToMoveY += (lineHeight || 0) + 4;\n }\n\n // If the suggestion box was invoked from the first line in the post box, stick to the top of the post box\n // if the lineHeight is smalller or undefined, then pixelsToMoveY should be 0\n if (lineHeight && pixelsToMoveY) {\n pixelsToMoveY = pixelsToMoveY > lineHeight ? pixelsToMoveY : 0;\n } else {\n pixelsToMoveY = 0;\n }\n\n return {\n transform: `translate(${pixelsToMoveX}px, ${pixelsToMoveY}px)`,\n };\n }\n\n renderDivider(type: string) {\n const id = type ? 'suggestion.' + type : 'suggestion.default';\n return (\n <div\n key={type + '-divider'}\n className='suggestion-list__divider'\n >\n <span>\n <FormattedMessage id={id}/>\n </span>\n </div>\n );\n }\n\n renderNoResults() {\n return (\n <div\n key='list-no-results'\n className='suggestion-list__no-results'\n ref={this.contentRef}\n >\n <FormattedMessage\n id='suggestionList.noMatches'\n defaultMessage='No items match <b>{value}</b>'\n values={{\n value: this.props.pretext || '\"\"',\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n </div>\n );\n }\n\n render() {\n const {renderDividers} = this.props;\n\n if (!this.props.open || this.props.cleared) {\n return null;\n }\n\n const clonedItems = cloneDeep(this.props.items);\n\n const items = [];\n if (clonedItems.length === 0) {\n if (!this.props.renderNoResults) {\n return null;\n }\n items.push(this.renderNoResults());\n }\n\n let prevItemType = null;\n for (let i = 0; i < this.props.items.length; i++) {\n const item = this.props.items[i];\n const term = this.props.terms[i];\n const isSelection = term === this.props.selection;\n\n // ReactComponent names need to be upper case when used in JSX\n const Component = this.props.components[i];\n if ((renderDividers?.includes('all') || renderDividers?.includes(item.type)) && prevItemType !== item.type) {\n items.push(this.renderDivider(item.type));\n prevItemType = item.type;\n }\n\n if (item.loading) {\n items.push(<LoadingSpinner key={item.type}/>);\n continue;\n }\n\n if (isSelection) {\n this.currentItem = item;\n }\n\n items.push(\n <Component\n key={term}\n ref={(ref: any) => this.itemRefs.set(term, ref)}\n item={this.props.items[i]}\n term={term}\n matchedPretext={this.props.matchedPretext[i]}\n isSelection={isSelection}\n onClick={this.props.onCompleteWord}\n onMouseMove={this.props.onItemHover}\n />,\n );\n }\n const mainClass = 'suggestion-list suggestion-list--' + this.props.position;\n const contentClass = 'suggestion-list__content suggestion-list__content--' + this.props.position;\n\n return (\n <div\n ref={this.wrapperRef}\n className={mainClass}\n >\n <div\n id='suggestionList'\n data-testid='suggestionList'\n role='list'\n ref={this.contentRef}\n style={{\n maxHeight: this.maxHeight,\n ...this.getTransform(),\n }}\n className={contentClass}\n onMouseDown={this.props.preventClose}\n >\n {items}\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {defineMessages, injectIntl} from 'react-intl';\nimport type {WrappedComponentProps} from 'react-intl';\nimport {connect, useSelector} from 'react-redux';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {PreferenceType} from '@mattermost/types/preferences';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport {UserTypes} from 'mattermost-redux/action_types';\nimport {fetchAllMyTeamsChannels, searchAllChannels} from 'mattermost-redux/actions/channels';\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {Client4} from 'mattermost-redux/client';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {\n getDirectAndGroupChannels,\n getGroupChannels,\n getMyChannelMemberships,\n getChannelByName,\n getCurrentChannel,\n getDirectTeammate,\n getChannelsInAllTeams,\n getSortedAllTeamsUnreadChannels,\n getAllTeamsUnreadChannelIds,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getMyPreferences, isGroupChannelManuallyVisible, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {\n getActiveTeamsList,\n getCurrentTeamId,\n getMyTeams,\n getTeam,\n} from 'mattermost-redux/selectors/entities/teams';\nimport {getThreadCountsInCurrentTeam} from 'mattermost-redux/selectors/entities/threads';\nimport {\n getCurrentUserId,\n getUserIdsInChannels,\n getUser,\n makeSearchProfilesMatchingWithTerm,\n getStatusForUserId,\n} from 'mattermost-redux/selectors/entities/users';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {sortChannelsByTypeAndDisplayName, isChannelMuted} from 'mattermost-redux/utils/channel_utils';\nimport {getPreferenceKey} from 'mattermost-redux/utils/preference_utils';\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport {getPostDraft} from 'selectors/rhs';\nimport globalStore from 'stores/redux_store';\n\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport ProfilePicture from 'components/profile_picture';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\n\nimport {Constants, StoragePrefixes} from 'utils/constants';\nimport {getIntl} from 'utils/i18n';\nimport * as Utils from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport {SuggestionContainer} from './suggestion';\nimport type {SuggestionProps} from './suggestion';\n\nconst searchProfilesMatchingWithTerm = makeSearchProfilesMatchingWithTerm();\n\nconst ThreadsChannel: FakeChannel = {\n id: 'threads',\n name: 'threads',\n display_name: 'Threads',\n type: Constants.THREADS,\n update_at: 0,\n delete_at: 0,\n};\n\ntype FakeChannel = Pick<Channel, 'id' | 'name' | 'display_name' | 'update_at' | 'delete_at'> & {\n type: string;\n}\n\ntype FakeDirectChannel = FakeChannel & {\n userId: string;\n}\n\ntype ChannelItem = Channel | FakeChannel | FakeDirectChannel;\n\nfunction isRealChannel(item?: ChannelItem): item is Channel {\n return Boolean(item) && !isFakeChannel(item) && !isFakeDirectChannel(item);\n}\n\nfunction isFakeChannel(item?: ChannelItem): item is FakeChannel {\n return Boolean(item) && !('create_at' in item!);\n}\n\nfunction isFakeDirectChannel(item?: ChannelItem): item is FakeDirectChannel {\n return Boolean(item && 'userId' in item);\n}\n\ninterface WrappedChannel {\n channel: ChannelItem;\n name: string;\n deactivated: boolean;\n last_viewed_at?: number;\n type?: string;\n unread?: boolean;\n unread_mentions?: number;\n}\n\ntype Props = SuggestionProps<WrappedChannel> & WrappedComponentProps & {\n channelMember: ChannelMembership;\n collapsedThreads: boolean;\n dmChannelTeammate?: UserProfile;\n hasDraft: boolean;\n isPartOfOnlyOneTeam: boolean;\n status?: string;\n team?: Team;\n}\n\nconst SwitchChannelSuggestion = React.forwardRef<HTMLDivElement, Props>((props, ref) => {\n const {item, status, collapsedThreads, team, isPartOfOnlyOneTeam} = props;\n const channel = item.channel;\n const channelIsArchived = channel.delete_at && channel.delete_at !== 0;\n\n const currentUserId = useSelector(getCurrentUserId);\n\n const member = props.channelMember;\n const teammate = props.dmChannelTeammate;\n let badge = null;\n\n if ((member && member.notify_props) || item.unread_mentions) {\n let unreadMentions;\n if (item.unread_mentions) {\n unreadMentions = item.unread_mentions;\n } else {\n unreadMentions = collapsedThreads ? member.mention_count_root : member.mention_count;\n }\n if (unreadMentions > 0 && !channelIsArchived) {\n badge = (\n <div className={classNames('suggestion-list_unread-mentions', (isPartOfOnlyOneTeam ? 'position-end' : ''))}>\n <span className='badge'>\n {unreadMentions}\n </span>\n </div>\n );\n }\n }\n\n let name = channel.display_name;\n let description = '~' + channel.name;\n let icon;\n if (channelIsArchived) {\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className='icon icon-archive-outline'/>\n </span>\n );\n } else if (props.hasDraft) {\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className='icon icon-pencil-outline'/>\n </span>\n );\n } else if (channel.type === Constants.OPEN_CHANNEL) {\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className='icon icon-globe'/>\n </span>\n );\n } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className='icon icon-lock-outline'/>\n </span>\n );\n } else if (channel.type === Constants.THREADS) {\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className='icon icon-message-text-outline'/>\n </span>\n );\n } else if (channel.type === Constants.GM_CHANNEL) {\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <div className='status status--group'>{'G'}</div>\n </span>\n );\n } else if (teammate) {\n icon = (\n <ProfilePicture\n src={Utils.imageURLForUser(teammate.id, teammate.last_picture_update)}\n status={teammate.is_bot ? undefined : status}\n size='sm'\n />\n );\n }\n\n let tag = null;\n let customStatus = null;\n if (channel.type === Constants.DM_CHANNEL && teammate) {\n if (teammate && teammate.is_bot) {\n tag = <BotTag/>;\n } else if (isGuest(teammate ? teammate.roles : '')) {\n tag = <GuestTag/>;\n }\n\n customStatus = (\n <CustomStatusEmoji\n showTooltip={true}\n userID={teammate.id}\n emojiStyle={{\n marginBottom: 2,\n }}\n />\n );\n\n let deactivated = '';\n if (teammate.delete_at) {\n deactivated = (' - ' + props.intl.formatMessage({id: 'channel_switch_modal.deactivated', defaultMessage: 'Deactivated'}));\n }\n\n if (channel.display_name && !(teammate && teammate.is_bot)) {\n description = '@' + teammate.username + deactivated;\n } else {\n name = teammate.username;\n if (teammate.id === currentUserId) {\n name += (' ' + props.intl.formatMessage({id: 'suggestion.user.isCurrent', defaultMessage: '(you)'}));\n }\n description = deactivated;\n }\n } else if (channel.type === Constants.GM_CHANNEL) {\n // remove the slug from the option\n name = channel.display_name;\n description = '';\n }\n\n let sharedIcon = null;\n if (isRealChannel(channel) && channel.shared) {\n sharedIcon = (\n <SharedChannelIndicator\n className='shared-channel-icon'\n />\n );\n }\n\n let teamName = null;\n if (isRealChannel(channel) && channel.team_id && team) {\n teamName = (<span className='ml-2 suggestion-list__team-name'>{team.display_name}</span>);\n }\n const showSlug = (isPartOfOnlyOneTeam || channel.type === Constants.DM_CHANNEL) && channel.type !== Constants.THREADS;\n\n return (\n <SuggestionContainer\n ref={ref}\n id={`switchChannel_${channel.name}`}\n data-testid={channel.name}\n role='listitem'\n {...props}\n >\n {icon}\n <div className='suggestion-list__ellipsis suggestion-list__flex'>\n <span className='suggestion-list__main'>\n <span className={classNames({'suggestion-list__unread': item.unread && !channelIsArchived})}>{name}</span>\n {showSlug && description && <span className='ml-2 suggestion-list__desc'>{description}</span>}\n </span>\n {customStatus}\n {sharedIcon}\n {tag}\n {badge}\n {!isPartOfOnlyOneTeam && teamName}\n </div>\n </SuggestionContainer>\n );\n});\nSwitchChannelSuggestion.displayName = 'SwitchChannelSuggestion';\n\ntype OwnProps = SuggestionProps<WrappedChannel>;\n\nfunction mapStateToPropsForSwitchChannelSuggestion(state: GlobalState, ownProps: OwnProps) {\n const channel = ownProps.item && ownProps.item.channel;\n const channelId = channel ? channel.id : '';\n const draft = channelId ? getPostDraft(state, StoragePrefixes.DRAFT, channelId) : false;\n\n let dmChannelTeammate;\n if (isRealChannel(channel) && channel.type === Constants.DM_CHANNEL) {\n dmChannelTeammate = getDirectTeammate(state, channel.id);\n } else if (isFakeDirectChannel(channel)) {\n dmChannelTeammate = getUser(state, channel.userId);\n }\n\n let status;\n if (dmChannelTeammate) {\n status = getStatusForUserId(state, dmChannelTeammate.id);\n }\n\n const collapsedThreads = isCollapsedThreadsEnabled(state);\n\n let team;\n if (isRealChannel(channel)) {\n team = getTeam(state, channel.team_id);\n }\n\n const isPartOfOnlyOneTeam = getMyTeams(state).length === 1;\n\n return {\n channelMember: getMyChannelMemberships(state)[channelId],\n hasDraft: draft && Boolean(draft.message.trim() || draft.fileInfos.length || draft.uploadsInProgress.length),\n dmChannelTeammate,\n status,\n collapsedThreads,\n team,\n isPartOfOnlyOneTeam,\n };\n}\n\nconst ConnectedSwitchChannelSuggestion = connect(mapStateToPropsForSwitchChannelSuggestion, null, null, {forwardRef: true})(injectIntl(SwitchChannelSuggestion));\n\nlet prefix = '';\n\nfunction sortChannelsByRecencyAndTypeAndDisplayName(wrappedA: WrappedChannel, wrappedB: WrappedChannel) {\n if (wrappedA.last_viewed_at && wrappedB.last_viewed_at) {\n return wrappedB.last_viewed_at - wrappedA.last_viewed_at;\n } else if (wrappedA.last_viewed_at) {\n return -1;\n } else if (wrappedB.last_viewed_at) {\n return 1;\n }\n\n // MM-12677 When this is migrated this needs to be fixed to pull the user's locale\n return sortChannelsByTypeAndDisplayName('en', wrappedA.channel as Channel, wrappedB.channel as Channel);\n}\n\nexport function quickSwitchSorter(wrappedA: WrappedChannel, wrappedB: WrappedChannel) {\n const aIsArchived = wrappedA.channel.delete_at ? wrappedA.channel.delete_at !== 0 : false;\n const bIsArchived = wrappedB.channel.delete_at ? wrappedB.channel.delete_at !== 0 : false;\n\n if (aIsArchived && !bIsArchived) {\n return 1;\n } else if (!aIsArchived && bIsArchived) {\n return -1;\n }\n\n if (wrappedA.deactivated && !wrappedB.deactivated) {\n return 1;\n } else if (wrappedB.deactivated && !wrappedA.deactivated) {\n return -1;\n }\n\n const a = wrappedA.channel;\n const b = wrappedB.channel;\n\n let aDisplayName = a.display_name.toLowerCase();\n let bDisplayName = b.display_name.toLowerCase();\n\n if (a.type === Constants.DM_CHANNEL && aDisplayName.startsWith('@')) {\n aDisplayName = aDisplayName.substring(1);\n }\n\n if (b.type === Constants.DM_CHANNEL && bDisplayName.startsWith('@')) {\n bDisplayName = bDisplayName.substring(1);\n }\n\n const aStartsWith = aDisplayName.startsWith(prefix) || wrappedA.name.toLowerCase().startsWith(prefix);\n const bStartsWith = bDisplayName.startsWith(prefix) || wrappedB.name.toLowerCase().startsWith(prefix);\n\n // Open channels user haven't interacted should be at the bottom of the list\n if (a.type === Constants.OPEN_CHANNEL && !wrappedA.last_viewed_at && (b.type !== Constants.OPEN_CHANNEL || wrappedB.last_viewed_at)) {\n return 1;\n } else if (b.type === Constants.OPEN_CHANNEL && !wrappedB.last_viewed_at) {\n return -1;\n }\n\n // Sort channels starting with the search term first\n if (aStartsWith && !bStartsWith) {\n return -1;\n } else if (!aStartsWith && bStartsWith) {\n return 1;\n }\n return sortChannelsByRecencyAndTypeAndDisplayName(wrappedA, wrappedB);\n}\n\nfunction makeChannelSearchFilter(curState: GlobalState, channelPrefix: string) {\n const channelPrefixLower = channelPrefix.toLowerCase();\n const splitPrefixBySpace = channelPrefixLower.trim().split(/[ ,]+/);\n const usersInChannels = getUserIdsInChannels(curState);\n const userSearchStrings: RelationOneToOne<UserProfile, string> = {};\n const SEPARATOR = ';|;';\n\n return (channel: ChannelItem) => {\n let searchString = `${channel.display_name}${SEPARATOR}${channel.name}`;\n if (channel.type === Constants.GM_CHANNEL || channel.type === Constants.DM_CHANNEL) {\n const usersInChannel = usersInChannels[channel.id] || new Set([]);\n\n // In case the channel is a DM and the profilesInChannel is not populated\n if (!usersInChannel.size && channel.type === Constants.DM_CHANNEL) {\n const userId = Utils.getUserIdFromChannelId(channel.name);\n const user = getUser(curState, userId);\n if (user) {\n usersInChannel.add(userId);\n }\n }\n\n for (const userId of usersInChannel) {\n let userString = userSearchStrings[userId];\n\n if (!userString) {\n const user = getUser(curState, userId);\n if (!user) {\n continue;\n }\n const {nickname, username} = user;\n userString = [nickname, username, Utils.getFullName(user)].join(SEPARATOR);\n userSearchStrings[userId] = userString;\n }\n searchString += userString;\n }\n }\n\n if (splitPrefixBySpace.length > 1) {\n const lowerCaseSearch = searchString.toLowerCase();\n return splitPrefixBySpace.every((searchPrefix) => {\n return lowerCaseSearch.includes(searchPrefix);\n });\n }\n\n return searchString.toLowerCase().includes(channelPrefixLower);\n };\n}\n\nexport default class SwitchChannelProvider extends Provider {\n store = globalStore;\n\n /**\n * whenever this gets adjusted/refactored to not call the callback twice we need to adjust the behavior in\n * the ForwardPostChannelSelect component as well.\n *\n * @see {@link components/forward_post_modal/forward_post_channel_select.tsx}\n */\n handlePretextChanged(channelPrefix: string, resultsCallback: ResultsCallback<WrappedChannel>) {\n if (channelPrefix) {\n prefix = channelPrefix;\n this.startNewRequest(channelPrefix);\n if (this.shouldCancelDispatch(channelPrefix)) {\n return false;\n }\n\n // Dispatch suggestions for local data (filter out deleted and archived channels from local store data)\n let channels = getChannelsInAllTeams(this.store.getState()).concat(getDirectAndGroupChannels(this.store.getState())).filter((c) => c.delete_at === 0);\n channels = this.removeChannelsFromArchivedTeams(channels);\n const users = searchProfilesMatchingWithTerm(this.store.getState(), channelPrefix, false);\n const formattedData = this.formatList(channelPrefix, [ThreadsChannel, ...channels], users, true, true);\n if (formattedData) {\n resultsCallback(formattedData);\n }\n\n // Fetch data from the server and dispatch\n this.fetchUsersAndChannels(channelPrefix, resultsCallback);\n } else {\n this.fetchAndFormatRecentlyViewedChannels(resultsCallback);\n }\n\n return true;\n }\n\n async fetchUsersAndChannels(channelPrefix: string, resultsCallback: ResultsCallback<WrappedChannel>) {\n const state = this.store.getState();\n const teamId = getCurrentTeamId(state);\n\n if (!teamId) {\n return;\n }\n\n const config = getConfig(state);\n let usersAsync;\n if (config.RestrictDirectMessage === 'team') {\n usersAsync = Client4.autocompleteUsers(channelPrefix, teamId, '');\n } else {\n usersAsync = Client4.autocompleteUsers(channelPrefix, '', '');\n }\n\n const channelsAsync = this.store.dispatch(searchAllChannels(channelPrefix, {nonAdminSearch: true}));\n\n let usersFromServer;\n let channelsFromServer;\n\n try {\n usersFromServer = await usersAsync;\n const channelsResponse = await channelsAsync;\n channelsFromServer = (channelsResponse as ActionResult).data;\n } catch (err) {\n this.store.dispatch(logError(err));\n return;\n }\n\n if (this.shouldCancelDispatch(channelPrefix)) {\n return;\n }\n\n const currentUserId = getCurrentUserId(state);\n\n // filter out deleted and archived channels from local store data\n let localChannelData = getChannelsInAllTeams(state).concat(getDirectAndGroupChannels(state)).filter((c) => c.delete_at === 0) || [];\n localChannelData = this.removeChannelsFromArchivedTeams(localChannelData);\n const localUserData = searchProfilesMatchingWithTerm(state, channelPrefix, false);\n const localFormattedData = this.formatList(channelPrefix, [ThreadsChannel, ...localChannelData], localUserData);\n let remoteChannelData = channelsFromServer.concat(getGroupChannels(state)) || [];\n remoteChannelData = this.removeChannelsFromArchivedTeams(remoteChannelData);\n\n const remoteUserData = usersFromServer.users || [];\n const remoteFormattedData = this.formatList(channelPrefix, remoteChannelData, remoteUserData, false);\n\n this.store.dispatch({\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: [...localUserData.filter((user) => user.id !== currentUserId), ...remoteUserData.filter((user) => user.id !== currentUserId)],\n });\n const combinedTerms = [...localFormattedData.terms, ...remoteFormattedData.terms.filter((term) => !localFormattedData.terms.includes(term))];\n const combinedItems = [...localFormattedData.items, ...remoteFormattedData.items.filter((item: any) => !localFormattedData.terms.includes((item.channel as FakeDirectChannel).userId || item.channel.id))];\n\n resultsCallback({\n ...localFormattedData,\n items: combinedItems,\n terms: combinedTerms,\n });\n }\n\n userWrappedChannel(user: UserProfile, channel?: ChannelItem): WrappedChannel {\n const intl = getIntl();\n\n let displayName = '';\n const currentUserId = getCurrentUserId(this.store.getState());\n\n // The naming format is fullname (nickname)\n // username is shown seperately\n if ((user.first_name || user.last_name) && user.nickname) {\n displayName += Utils.getFullName(user);\n if (user.id !== currentUserId) {\n displayName += ` (${user.nickname})`;\n }\n } else if (user.nickname && !user.first_name && !user.last_name) {\n displayName += `${user.nickname}`;\n } else if (user.first_name || user.last_name) {\n displayName += `${Utils.getFullName(user)}`;\n }\n\n if (user.id === currentUserId && displayName) {\n displayName += (' ' + intl.formatMessage({id: 'suggestion.user.isCurrent', defaultMessage: '(you)'}));\n }\n\n return {\n channel: {\n display_name: displayName,\n name: user.username,\n id: channel ? channel.id : user.id,\n userId: user.id,\n update_at: user.update_at,\n delete_at: 0,\n type: Constants.DM_CHANNEL,\n },\n type: 'search.direct',\n name: user.username,\n deactivated: Boolean(user.delete_at),\n };\n }\n\n formatList(channelPrefix: string, allChannels: ChannelItem[], users: UserProfile[], skipNotMember = true, localData = false) {\n const channels = [];\n\n const members = getMyChannelMemberships(this.store.getState());\n\n const completedChannels: RelationOneToOne<Channel, boolean> = {};\n\n const channelFilter = makeChannelSearchFilter(this.store.getState(), channelPrefix);\n\n const state = this.store.getState();\n const config = getConfig(state);\n const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n const allUnreadChannelIds = getAllTeamsUnreadChannelIds(state);\n const allUnreadChannelIdsSet = new Set(allUnreadChannelIds);\n const currentUserId = getCurrentUserId(state);\n\n for (const channel of allChannels) {\n if (completedChannels[channel.id]) {\n continue;\n }\n if (channelFilter(channel)) {\n const newChannel = {...channel};\n const channelIsArchived = channel.delete_at !== 0;\n\n let wrappedChannel: WrappedChannel = {channel: newChannel, name: newChannel.name, deactivated: false};\n if (members[channel.id]) {\n wrappedChannel.last_viewed_at = members[channel.id].last_viewed_at;\n } else if (skipNotMember && (newChannel.type !== Constants.THREADS)) {\n continue;\n }\n\n if (!viewArchivedChannels && channelIsArchived) {\n continue;\n } else if (channelIsArchived && members[channel.id]) {\n wrappedChannel.type = Constants.ARCHIVED_CHANNEL;\n } else if (newChannel.type === Constants.OPEN_CHANNEL) {\n wrappedChannel.type = Constants.MENTION_PUBLIC_CHANNELS;\n } else if (newChannel.type === Constants.PRIVATE_CHANNEL) {\n wrappedChannel.type = Constants.MENTION_PRIVATE_CHANNELS;\n } else if (channelIsArchived && !members[channel.id]) {\n continue;\n } else if (newChannel.type === Constants.THREADS) {\n const threadItem = this.getThreadsItem('total');\n if (threadItem) {\n wrappedChannel = threadItem;\n } else {\n continue;\n }\n } else if (newChannel.type === Constants.GM_CHANNEL) {\n newChannel.name = newChannel.display_name;\n wrappedChannel.name = newChannel.name;\n wrappedChannel.type = Constants.MENTION_GROUPS;\n const isGMVisible = isGroupChannelManuallyVisible(state, channel.id);\n if (!isGMVisible && skipNotMember) {\n continue;\n }\n } else if (newChannel.type === Constants.DM_CHANNEL) {\n const userId = Utils.getUserIdFromChannelId(newChannel.name);\n const user = users.find((u) => u.id === userId);\n\n if (user) {\n completedChannels[user.id] = true;\n wrappedChannel = this.userWrappedChannel(\n user,\n newChannel,\n );\n if (members[channel.id]) {\n wrappedChannel.last_viewed_at = members[channel.id].last_viewed_at;\n }\n } else {\n continue;\n }\n }\n\n const unread = allUnreadChannelIdsSet.has(newChannel.id) && !isChannelMuted(members[channel.id]);\n if (unread) {\n wrappedChannel.unread = true;\n }\n completedChannels[channel.id] = true;\n channels.push(wrappedChannel);\n }\n }\n\n for (let i = 0; i < users.length; i++) {\n const user = users[i];\n\n if (completedChannels[user.id]) {\n continue;\n }\n\n const channelName = Utils.getDirectChannelName(currentUserId, user.id);\n const channel = getChannelByName(state, channelName);\n\n const wrappedChannel = this.userWrappedChannel(user, channel);\n\n if (channel && members[channel.id]) {\n wrappedChannel.last_viewed_at = members[channel.id].last_viewed_at;\n } else if (skipNotMember) {\n continue;\n }\n\n if (channel) {\n const unread = allUnreadChannelIdsSet.has(channel.id) && !isChannelMuted(members[channel.id]);\n if (unread) {\n wrappedChannel.unread = true;\n }\n }\n\n completedChannels[user.id] = true;\n channels.push(wrappedChannel);\n }\n\n const channelNames = channels.\n sort(quickSwitchSorter).\n map((wrappedChannel) => {\n if (isFakeDirectChannel(wrappedChannel.channel) && wrappedChannel.channel.userId) {\n return wrappedChannel.channel.userId;\n }\n\n return wrappedChannel.channel.id;\n });\n\n if (localData && !channels.length) {\n channels.push({\n type: Constants.MENTION_MORE_CHANNELS,\n loading: true,\n });\n }\n\n return {\n matchedPretext: channelPrefix,\n terms: channelNames,\n items: channels,\n component: ConnectedSwitchChannelSuggestion,\n };\n }\n\n removeChannelsFromArchivedTeams(channels: Channel[]) {\n const state = this.store.getState();\n const activeTeams = getActiveTeamsList(state).map((team: Team) => team.id);\n const newChannels = channels.filter((channel: Channel) => {\n if (!channel.team_id) {\n return true;\n }\n return activeTeams.includes(channel.team_id);\n });\n return newChannels;\n }\n\n fetchAndFormatRecentlyViewedChannels(resultsCallback: ResultsCallback<WrappedChannel>) {\n const state = this.store.getState();\n let recentChannels = getChannelsInAllTeams(state).concat(getDirectAndGroupChannels(state));\n recentChannels = this.removeChannelsFromArchivedTeams(recentChannels);\n const wrappedRecentChannels = this.wrapChannels(recentChannels, Constants.MENTION_RECENT_CHANNELS);\n const unreadChannels = getSortedAllTeamsUnreadChannels(state);\n const myMembers = getMyChannelMemberships(state);\n const unreadChannelsExclMuted = unreadChannels.filter((channel) => {\n const member = myMembers[channel.id];\n return !isChannelMuted(member);\n }).slice(0, 5);\n let sortedUnreadChannels = this.wrapChannels(unreadChannelsExclMuted, Constants.MENTION_UNREAD);\n if (wrappedRecentChannels.length === 0) {\n prefix = '';\n this.startNewRequest('');\n this.fetchChannels(resultsCallback);\n }\n const sortedUnreadChannelIDs = sortedUnreadChannels.map((wrappedChannel) => wrappedChannel.channel.id);\n const sortedRecentChannels = wrappedRecentChannels.filter((wrappedChannel) => !sortedUnreadChannelIDs.includes(wrappedChannel.channel.id)).\n sort(sortChannelsByRecencyAndTypeAndDisplayName).slice(0, 20);\n const threadsItem = this.getThreadsItem('unread', Constants.MENTION_UNREAD);\n if (threadsItem) {\n sortedUnreadChannels = [threadsItem, ...sortedUnreadChannels].slice(0, 5);\n }\n const sortedChannels = [...sortedUnreadChannels, ...sortedRecentChannels];\n const channelNames = sortedChannels.map((wrappedChannel) => wrappedChannel.channel.id);\n resultsCallback({\n matchedPretext: '',\n terms: channelNames,\n items: sortedChannels,\n component: ConnectedSwitchChannelSuggestion,\n });\n }\n\n getThreadsItem(countType = 'total', itemType?: string) {\n const state = this.store.getState();\n const counts = getThreadCountsInCurrentTeam(state);\n const collapsedThreads = isCollapsedThreadsEnabled(state);\n\n // adding last viewed at equal to Date.now() to push it to the top of the list\n let threadsItem: WrappedChannel = {\n channel: ThreadsChannel,\n name: ThreadsChannel.name,\n unread: Boolean(counts?.total_unread_threads),\n unread_mentions: counts?.total_unread_mentions || 0,\n deactivated: false,\n last_viewed_at: Date.now(),\n };\n if (itemType) {\n threadsItem = {...threadsItem, type: itemType};\n }\n if (collapsedThreads && ((countType === 'unread' && counts?.total_unread_threads) || (countType === 'total'))) {\n return threadsItem;\n }\n\n return null;\n }\n\n getTimestampFromPrefs(myPreferences: Record<string, PreferenceType>, category: string, name: string) {\n const pref = myPreferences[getPreferenceKey(category, name)];\n const prefValue = pref ? pref.value : '0';\n return parseInt(prefValue ?? '', 10);\n }\n\n getLastViewedAt(member: ChannelMembership, myPreferences: Record<string, PreferenceType>, channel: Channel) {\n // The server only ever sets the last_viewed_at to the time of the last post in channel,\n // So thought of using preferences but it seems that also not keeping track.\n // TODO Update and remove comment once solution is finalized\n return Math.max(\n member.last_viewed_at,\n this.getTimestampFromPrefs(myPreferences, Preferences.CATEGORY_CHANNEL_APPROXIMATE_VIEW_TIME, channel.id),\n this.getTimestampFromPrefs(myPreferences, Preferences.CATEGORY_CHANNEL_OPEN_TIME, channel.id),\n );\n }\n\n wrapChannels(channels: Channel[], channelType: string) {\n const state = this.store.getState();\n const currentChannel = getCurrentChannel(state);\n const myMembers = getMyChannelMemberships(state);\n const myPreferences = getMyPreferences(state);\n const allUnreadChannelIds = getAllTeamsUnreadChannelIds(state);\n const allUnreadChannelIdsSet = new Set(allUnreadChannelIds);\n\n const channelList = [];\n for (let i = 0; i < channels.length; i++) {\n const channel = channels[i];\n if (channel.id === currentChannel?.id) {\n continue;\n }\n let wrappedChannel: WrappedChannel = {channel, name: channel.name, deactivated: false};\n const member = myMembers[channel.id];\n if (member) {\n wrappedChannel.last_viewed_at = this.getLastViewedAt(member, myPreferences, channel);\n }\n if (channel.type === Constants.GM_CHANNEL) {\n wrappedChannel.name = channel.display_name;\n } else if (channel.type === Constants.DM_CHANNEL) {\n const user = getUser(this.store.getState(), Utils.getUserIdFromChannelId(channel.name));\n\n if (!user) {\n continue;\n }\n const userWrappedChannel = this.userWrappedChannel(\n user,\n channel,\n );\n wrappedChannel = {...wrappedChannel, ...userWrappedChannel};\n }\n const unread = allUnreadChannelIdsSet.has(channel.id) && !isChannelMuted(member);\n if (unread) {\n wrappedChannel.unread = true;\n }\n\n wrappedChannel.type = channelType;\n channelList.push(wrappedChannel);\n }\n return channelList;\n }\n\n async fetchChannels(resultsCallback: ResultsCallback<WrappedChannel>) {\n const state = this.store.getState();\n const teamId = getCurrentTeamId(state);\n if (!teamId) {\n return;\n }\n const channelsAsync = this.store.dispatch(fetchAllMyTeamsChannels());\n let channels;\n\n try {\n const {data} = await channelsAsync;\n channels = data as Channel[];\n } catch (err) {\n this.store.dispatch(logError(err));\n return;\n }\n\n if (this.latestPrefix !== '') {\n return;\n }\n const sortedChannels = this.wrapChannels(channels, Constants.MENTION_PUBLIC_CHANNELS).slice(0, 20);\n const channelNames = sortedChannels.map((wrappedChannel) => wrappedChannel.channel.id);\n\n resultsCallback({\n matchedPretext: '',\n terms: channelNames,\n items: sortedChannels,\n component: ConnectedSwitchChannelSuggestion,\n });\n }\n}\n\ndefineMessages({\n moreChannels: {\n id: 'suggestion.mention.morechannels',\n defaultMessage: 'Other Channels',\n },\n privateChannelsDivider: {\n id: 'suggestion.mention.private.channels',\n defaultMessage: 'Private Channels',\n },\n recentChannels: {\n id: 'suggestion.mention.recent.channels',\n defaultMessage: 'Recent',\n },\n unreadChannels: {\n id: 'suggestion.mention.unread',\n defaultMessage: 'Unread',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport SharedUserIndicator from 'components/shared_user_indicator';\nimport StatusIcon from 'components/status_icon';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\nimport Tag from 'components/widgets/tag/tag';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport {Constants} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport {SuggestionContainer} from '../suggestion';\nimport type {SuggestionProps} from '../suggestion';\n\nexport interface Item extends UserProfile {\n display_name: string;\n name: string;\n isCurrentUser: boolean;\n type: string;\n}\n\ninterface Group extends Item {\n member_count: number;\n}\n\nconst AtMentionSuggestion = React.forwardRef<HTMLDivElement, SuggestionProps<Item>>((props, ref) => {\n const {item} = props;\n\n const intl = useIntl();\n\n let itemname: string;\n let description: ReactNode;\n let icon: JSX.Element;\n let customStatus: ReactNode;\n if (item.username === 'all') {\n itemname = 'all';\n description = (\n <FormattedMessage\n id='suggestion.mention.all'\n defaultMessage='Notifies everyone in this channel'\n />\n );\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i\n className='icon icon-account-multiple-outline'\n title={intl.formatMessage({id: 'generic_icons.member', defaultMessage: 'Member Icon'})}\n />\n </span>\n );\n } else if (item.username === 'channel') {\n itemname = 'channel';\n description = (\n <FormattedMessage\n id='suggestion.mention.channel'\n defaultMessage='Notifies everyone in this channel'\n />\n );\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i\n className='icon icon-account-multiple-outline'\n title={intl.formatMessage({id: 'generic_icons.member', defaultMessage: 'Member Icon'})}\n />\n </span>\n );\n } else if (item.username === 'here') {\n itemname = 'here';\n description = (\n <FormattedMessage\n id='suggestion.mention.here'\n defaultMessage='Notifies everyone online in this channel'\n />\n );\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i\n className='icon icon-account-multiple-outline'\n title={intl.formatMessage({id: 'generic_icons.member', defaultMessage: 'Member Icon'})}\n />\n </span>\n );\n } else if (item.type === Constants.MENTION_GROUPS) {\n itemname = item.name;\n description = (\n <span className='ml-1'>{'- '}{item.display_name}</span>\n );\n icon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i\n className='icon icon-account-multiple-outline'\n title={intl.formatMessage({id: 'generic_icons.member', defaultMessage: 'Member Icon'})}\n />\n </span>\n );\n } else {\n itemname = item.username;\n\n if (item.isCurrentUser) {\n if (item.first_name || item.last_name) {\n description = <span>{Utils.getFullName(item)}</span>;\n }\n } else if (item.first_name || item.last_name || item.nickname) {\n description = <span>{`${Utils.getFullName(item)} ${item.nickname ? `(${item.nickname})` : ''}`.trim()}</span>;\n }\n\n icon = (\n <span className='status-wrapper style--none'>\n <span className='profile-icon'>\n <Avatar\n username={item && item.username}\n size='sm'\n url={Utils.imageURLForUser(item.id, item.last_picture_update)}\n />\n </span>\n <StatusIcon status={item && item.status}/>\n </span>\n );\n\n customStatus = (\n <CustomStatusEmoji\n showTooltip={true}\n userID={item.id}\n emojiSize={15}\n emojiStyle={{\n margin: '0 4px 4px',\n }}\n />\n );\n }\n\n const youElement = item.isCurrentUser ? (\n <FormattedMessage\n id='suggestion.user.isCurrent'\n defaultMessage='(you)'\n />\n ) : null;\n\n const sharedIcon = item.remote_id ? (\n <SharedUserIndicator\n className='shared-user-icon'\n />\n ) : null;\n\n let countBadge;\n if (item.type === Constants.MENTION_GROUPS) {\n countBadge = (\n <span className='suggestion-list__group-count'>\n <Tag\n text={\n <FormattedMessage\n id='suggestion.group.members'\n defaultMessage='{member_count} {member_count, plural, one {member} other {members}}'\n values={{\n member_count: (item as Group).member_count,\n }}\n />\n }\n />\n </span>\n );\n }\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n data-testid={`mentionSuggestion_${itemname}`}\n >\n {icon}\n <span className='suggestion-list__ellipsis'>\n <span className='suggestion-list__main'>\n {'@' + itemname}\n </span>\n {item.is_bot && <BotTag/>}\n {description}\n {youElement}\n {customStatus}\n {sharedIcon}\n {isGuest(item.roles) && <GuestTag/>}\n </span>\n {countBadge}\n </SuggestionContainer>\n );\n});\n\nAtMentionSuggestion.displayName = 'AtMentionSuggestion';\nexport default AtMentionSuggestion;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {defineMessages} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {Filters} from 'mattermost-redux/selectors/entities/users';\nimport {makeGetProfilesInChannel} from 'mattermost-redux/selectors/entities/users';\nimport {makeAddLastViewAtToProfiles} from 'mattermost-redux/selectors/entities/utils';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport {getSuggestionsSplitBy, getSuggestionsSplitByMultiple} from 'mattermost-redux/utils/user_utils';\n\nimport store from 'stores/redux_store';\n\nimport {Constants} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport AtMentionSuggestion from './at_mention_suggestion';\n\nimport Provider from '../provider';\n\nconst profilesInChannelOptions = {active: true};\nconst regexForAtMention = /(?:^|\\W)@([\\p{L}\\d\\-_. ]*)$/iu;\n\ntype UserProfileWithLastViewAt = UserProfile & {last_viewed_at?: number};\n\ntype CreatedProfile = UserProfile & {\n type: string;\n isCurrentUser?: boolean;\n last_viewed_at?: number;\n};\n\ntype CreatedGroup = Group & {type: string};\n\ntype Results = {\n matchedPretext: string;\n terms: string[];\n items: any;\n component: React.ElementType;\n};\n\ntype ResultsCallback = (results: Results) => void;\n\nexport type Props = {\n currentUserId: string;\n channelId: string;\n autocompleteUsersInChannel: (prefix: string) => Promise<ActionResult>;\n useChannelMentions: boolean;\n autocompleteGroups: Group[] | null;\n searchAssociatedGroupsForReference: (prefix: string) => Promise<{data: any}>;\n priorityProfiles: UserProfile[] | undefined;\n}\n\n// The AtMentionProvider provides matches for at mentions, including @here, @channel, @all,\n// users in the channel and users not in the channel. It mixes together results from the local\n// store with results fetched from the server.\nexport default class AtMentionProvider extends Provider {\n public currentUserId: string;\n public channelId: string;\n public autocompleteUsersInChannel: (prefix: string) => Promise<ActionResult>;\n public useChannelMentions: boolean;\n public autocompleteGroups: Group[] | null;\n public searchAssociatedGroupsForReference: (prefix: string) => Promise<{data: any}>;\n public priorityProfiles: UserProfile[] | undefined;\n\n public data: any;\n public lastCompletedWord: string;\n public lastPrefixWithNoResults: string;\n public getProfilesInChannel: (state: GlobalState, channelId: string, filters?: Filters | undefined) => UserProfile[];\n public addLastViewAtToProfiles: (state: GlobalState, profiles: UserProfile[]) => UserProfileWithLastViewAt[];\n\n constructor(props: Props) {\n super();\n\n const {currentUserId, channelId, autocompleteUsersInChannel, useChannelMentions, autocompleteGroups, searchAssociatedGroupsForReference, priorityProfiles} = props;\n\n this.currentUserId = currentUserId;\n this.channelId = channelId;\n this.autocompleteUsersInChannel = autocompleteUsersInChannel;\n this.useChannelMentions = useChannelMentions;\n this.autocompleteGroups = autocompleteGroups;\n this.searchAssociatedGroupsForReference = searchAssociatedGroupsForReference;\n this.priorityProfiles = priorityProfiles;\n\n this.data = null;\n this.lastCompletedWord = '';\n this.lastPrefixWithNoResults = '';\n this.triggerCharacter = '@';\n this.getProfilesInChannel = makeGetProfilesInChannel();\n this.addLastViewAtToProfiles = makeAddLastViewAtToProfiles();\n }\n\n setProps({currentUserId, channelId, autocompleteUsersInChannel, useChannelMentions, autocompleteGroups, searchAssociatedGroupsForReference, priorityProfiles}: Props) {\n this.currentUserId = currentUserId;\n this.channelId = channelId;\n this.autocompleteUsersInChannel = autocompleteUsersInChannel;\n this.useChannelMentions = useChannelMentions;\n this.autocompleteGroups = autocompleteGroups;\n this.searchAssociatedGroupsForReference = searchAssociatedGroupsForReference;\n this.priorityProfiles = priorityProfiles;\n }\n\n // specialMentions matches one of @here, @channel or @all, unless using /msg.\n specialMentions() {\n if (this.latestPrefix.startsWith('/msg') || !this.useChannelMentions) {\n return [];\n }\n\n return ['here', 'channel', 'all'].filter((item) =>\n item.startsWith(this.latestPrefix),\n ).map((name) => ({\n username: name,\n type: Constants.MENTION_SPECIAL,\n }));\n }\n\n // retrieves the parts of the profile that should be checked\n // against the term\n getProfileSuggestions(profile: UserProfile) {\n const profileSuggestions: string[] = [];\n if (!profile) {\n return profileSuggestions;\n }\n\n if (profile.username) {\n const usernameSuggestions = getSuggestionsSplitByMultiple(profile.username.toLowerCase(), Constants.AUTOCOMPLETE_SPLIT_CHARACTERS);\n profileSuggestions.push(...usernameSuggestions);\n }\n [profile.first_name, profile.last_name, profile.nickname].forEach((property) => {\n const suggestions = getSuggestionsSplitBy(property.toLowerCase(), ' ');\n profileSuggestions.push(...suggestions);\n });\n profileSuggestions.push(profile.first_name.toLowerCase() + ' ' + profile.last_name.toLowerCase());\n\n return profileSuggestions;\n }\n\n // retrieves the parts of the group mention that should be checked\n // against the term\n getGroupSuggestions(group: Group) {\n const groupSuggestions: string[] = [];\n if (!group) {\n return groupSuggestions;\n }\n\n if (group.name) {\n const groupnameSuggestions = getSuggestionsSplitByMultiple(group.name.toLowerCase(), Constants.AUTOCOMPLETE_SPLIT_CHARACTERS);\n groupSuggestions.push(...groupnameSuggestions);\n }\n\n const suggestions = getSuggestionsSplitBy(group.display_name.toLowerCase(), ' ');\n groupSuggestions.push(...suggestions);\n\n groupSuggestions.push(group.display_name.toLowerCase());\n return groupSuggestions;\n }\n\n // normalizeString performs a unicode normalization to a string\n normalizeString(name: string) {\n return name.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n }\n\n // filterProfile constrains profiles to those matching the latest prefix.\n filterProfile(profile: UserProfile | UserProfileWithLastViewAt) {\n if (!profile) {\n return false;\n }\n\n const prefixLower = this.latestPrefix.toLowerCase();\n const profileSuggestions = this.getProfileSuggestions(profile);\n return profileSuggestions.some((suggestion) =>\n this.normalizeString(suggestion).startsWith(this.normalizeString(prefixLower)),\n );\n }\n\n // filterGroup constrains group mentions to those matching the latest prefix.\n filterGroup(group: Group) {\n if (!group) {\n return false;\n }\n\n const prefixLower = this.latestPrefix.toLowerCase();\n const groupSuggestions = this.getGroupSuggestions(group);\n return groupSuggestions.some((suggestion) => suggestion.startsWith(prefixLower));\n }\n\n getProfilesWithLastViewAtInChannel() {\n const state = store.getState();\n\n const profilesInChannel = this.getProfilesInChannel(state, this.channelId, profilesInChannelOptions);\n const profilesWithLastViewAtInChannel = this.addLastViewAtToProfiles(state, profilesInChannel);\n\n return profilesWithLastViewAtInChannel;\n }\n\n // localMembers matches up to 25 local results from the store before the server has responded.\n localMembers() {\n const localMembers = this.getProfilesWithLastViewAtInChannel().\n filter((profile) => this.filterProfile(profile)).\n map((profile) => this.createFromProfile(profile, Constants.MENTION_MEMBERS)).\n splice(0, 25);\n\n return localMembers;\n }\n\n filterPriorityProfiles() {\n if (!this.priorityProfiles) {\n return [];\n }\n\n const priorityProfiles = this.priorityProfiles.\n filter((profile) => this.filterProfile(profile)).\n map((profile) => this.createFromProfile(profile, Constants.MENTION_MEMBERS));\n\n return priorityProfiles;\n }\n\n // localGroups matches up to 25 local results from the store\n localGroups() {\n if (!this.autocompleteGroups) {\n return [];\n }\n\n const localGroups = this.autocompleteGroups.\n filter((group) => this.filterGroup(group)).\n map((group) => this.createFromGroup(group, Constants.MENTION_GROUPS)).\n sort((a, b) => a.name.localeCompare(b.name)).\n splice(0, 25);\n\n return localGroups;\n }\n\n // remoteMembers matches the users listed in the channel by the server.\n remoteMembers() {\n if (!this.data) {\n return [];\n }\n\n const remoteMembers = (this.data.users || []).\n filter((profile: UserProfileWithLastViewAt) => this.filterProfile(profile)).\n map((profile: UserProfileWithLastViewAt) => this.createFromProfile(profile, Constants.MENTION_MEMBERS));\n\n return remoteMembers;\n }\n\n // remoteGroups matches the users listed in the channel by the server.\n remoteGroups() {\n if (!this.data) {\n return [];\n }\n const remoteGroups = ((this.data.groups || []) as Group[]).\n filter((group: Group) => this.filterGroup(group)).\n map((group: Group) => this.createFromGroup(group, Constants.MENTION_GROUPS));\n\n return remoteGroups;\n }\n\n // remoteNonMembers matches users listed as not in the channel by the server.\n // listed in the channel from local results.\n remoteNonMembers(): CreatedProfile[] {\n if (!this.data) {\n return [];\n }\n\n return (this.data.out_of_channel || []).\n filter((profile: UserProfileWithLastViewAt) => this.filterProfile(profile)).\n map((profile: UserProfileWithLastViewAt) => ({\n type: Constants.MENTION_NONMEMBERS,\n ...profile,\n }));\n }\n\n items() {\n const priorityProfilesIds: Record<string, boolean> = {};\n const priorityProfiles = this.filterPriorityProfiles();\n\n priorityProfiles.forEach((member) => {\n priorityProfilesIds[member.id] = true;\n });\n\n const specialMentions = this.specialMentions();\n const localMembers = this.localMembers().filter((member) => !priorityProfilesIds[member.id]);\n\n const localUserIds: Record<string, boolean> = {};\n\n localMembers.forEach((member) => {\n localUserIds[member.id] = true;\n });\n\n const remoteMembers = this.remoteMembers().filter((member: CreatedProfile) => !localUserIds[member.id] && !priorityProfilesIds[member.id]);\n\n // comparator which prioritises users with usernames starting with search term\n const orderUsers = (a: CreatedProfile, b: CreatedProfile) => {\n const aStartsWith = a.username.startsWith(this.latestPrefix);\n const bStartsWith = b.username.startsWith(this.latestPrefix);\n\n if (aStartsWith && !bStartsWith) {\n return -1;\n } else if (!aStartsWith && bStartsWith) {\n return 1;\n }\n\n // Sort recently viewed channels first\n if (a.last_viewed_at && b.last_viewed_at) {\n return b.last_viewed_at - a.last_viewed_at;\n } else if (a.last_viewed_at) {\n return -1;\n } else if (b.last_viewed_at) {\n return 1;\n }\n\n return a.username.localeCompare(b.username);\n };\n\n // Combine the local and remote members, sorting to mix the results together.\n const localAndRemoteMembers = localMembers.concat(remoteMembers).sort(orderUsers);\n\n // handle groups\n const localGroups = this.localGroups();\n\n const localGroupIds: Record<string, boolean> = {};\n localGroups.forEach((group) => {\n localGroupIds[group.id] = true;\n });\n\n const remoteGroups = this.remoteGroups().filter((group) => !localGroupIds[group.id]);\n\n // comparator which prioritises users with usernames starting with search term\n const orderGroups = (a: CreatedGroup, b: CreatedGroup) => {\n const aStartsWith = a.name.startsWith(this.latestPrefix);\n const bStartsWith = b.name.startsWith(this.latestPrefix);\n\n if (aStartsWith && bStartsWith) {\n return a.name.localeCompare(b.name);\n }\n if (aStartsWith) {\n return -1;\n }\n if (bStartsWith) {\n return 1;\n }\n return a.name.localeCompare(b.name);\n };\n\n // Combine the local and remote groups, sorting to mix the results together.\n const localAndRemoteGroups = localGroups.concat(remoteGroups).sort(orderGroups);\n\n const remoteNonMembers = this.remoteNonMembers().\n filter((member) => !localUserIds[member.id]).\n sort(orderUsers);\n\n return [...priorityProfiles, ...localAndRemoteMembers, ...localAndRemoteGroups, ...specialMentions, ...remoteNonMembers];\n }\n\n // updateMatches invokes the resultCallback with the metadata for rendering at mentions\n updateMatches(resultCallback: ResultsCallback, items: any[]) {\n if (items.length === 0) {\n this.lastPrefixWithNoResults = this.latestPrefix;\n } else if (this.lastPrefixWithNoResults === this.latestPrefix) {\n this.lastPrefixWithNoResults = '';\n }\n const mentions = items.map((item) => {\n if (item.username) {\n return '@' + item.username;\n } else if (item.name) {\n return '@' + item.name;\n }\n return '';\n });\n\n resultCallback({\n matchedPretext: `@${this.latestPrefix}`,\n terms: mentions,\n items,\n component: AtMentionSuggestion,\n });\n }\n\n handlePretextChanged(pretext: string, resultCallback: ResultsCallback) {\n const captured = regexForAtMention.exec(pretext.toLowerCase());\n if (!captured) {\n return false;\n }\n\n if (this.lastCompletedWord && captured[0].trim().startsWith(this.lastCompletedWord.trim())) {\n // It appears we're still matching a channel handle that we already completed\n return false;\n }\n\n const prefix = captured[1];\n if (this.lastPrefixWithNoResults && prefix.startsWith(this.lastPrefixWithNoResults)) {\n // Just give up since we know it won't return any results\n return false;\n }\n\n this.startNewRequest(prefix);\n this.updateMatches(resultCallback, this.items());\n\n // If we haven't gotten server-side results in 500 ms, add the loading indicator.\n let showLoadingIndicator: NodeJS.Timeout | null = setTimeout(() => {\n if (this.shouldCancelDispatch(prefix)) {\n return;\n }\n\n this.updateMatches(resultCallback, [...this.items(), ...[{\n type: Constants.MENTION_MORE_MEMBERS,\n loading: true,\n }]]);\n\n showLoadingIndicator = null;\n }, 500);\n\n // Query the server for remote results to add to the local results.\n this.autocompleteUsersInChannel(prefix).then(({data}) => {\n if (showLoadingIndicator) {\n clearTimeout(showLoadingIndicator);\n }\n if (this.shouldCancelDispatch(prefix)) {\n return;\n }\n this.data = data;\n this.searchAssociatedGroupsForReference(prefix).then((groupsData) => {\n if (this.data && groupsData && groupsData.data) {\n this.data.groups = groupsData.data;\n }\n this.updateMatches(resultCallback, this.items());\n });\n });\n\n return true;\n }\n\n handleCompleteWord(term: string) {\n this.lastCompletedWord = term;\n this.lastPrefixWithNoResults = '';\n }\n\n createFromProfile(profile: UserProfile | UserProfileWithLastViewAt, type: string): CreatedProfile {\n if (profile.id === this.currentUserId) {\n return {\n type,\n ...profile,\n isCurrentUser: true,\n };\n }\n\n return {\n type,\n ...profile,\n };\n }\n\n createFromGroup(group: Group, type: string): CreatedGroup {\n return {\n type,\n ...group,\n };\n }\n}\n\ndefineMessages({\n groupDivider: {\n id: 'suggestion.search.group',\n defaultMessage: 'Group Mentions',\n },\n memberDivider: {\n id: 'suggestion.mention.members',\n defaultMessage: 'Channel Members',\n },\n moreMembersDivider: {\n id: 'suggestion.mention.moremembers',\n defaultMessage: 'Other Members',\n },\n nonmemberDivider: {\n id: 'suggestion.mention.nonmembers',\n defaultMessage: 'Not in Channel',\n },\n specialDivider: {\n id: 'suggestion.mention.special',\n defaultMessage: 'Special Mentions',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport AtMentionProvider from './at_mention_provider';\n\nexport default AtMentionProvider;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {getMyChannels, getMyChannelMemberships} from 'mattermost-redux/selectors/entities/channels';\nimport type {ActionResult} from 'mattermost-redux/types/actions.js';\nimport {sortChannelsByTypeAndDisplayName} from 'mattermost-redux/utils/channel_utils';\n\nimport store from 'stores/redux_store';\n\nimport {Constants} from 'utils/constants';\n\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport {SuggestionContainer} from './suggestion';\nimport type {SuggestionProps} from './suggestion';\n\nexport const MIN_CHANNEL_LINK_LENGTH = 2;\n\ntype WrappedChannel = {\n type: string;\n channel?: Channel;\n loading?: boolean;\n}\n\nexport const ChannelMentionSuggestion = React.forwardRef<HTMLDivElement, SuggestionProps<WrappedChannel>>((props, ref) => {\n const {item} = props;\n const channelIsArchived = item.channel && item.channel.delete_at && item.channel.delete_at !== 0;\n\n const channelName = item.channel?.display_name;\n let channelIcon;\n if (channelIsArchived) {\n channelIcon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className='icon icon-archive-outline'/>\n </span>\n );\n } else {\n channelIcon = (\n <span className='suggestion-list__icon suggestion-list__icon--large'>\n <i className={`icon icon--no-spacing icon-${item.channel?.type === Constants.OPEN_CHANNEL ? 'globe' : 'lock-outline'}`}/>\n </span>\n );\n }\n\n const description = '~' + item.channel?.name;\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n >\n {channelIcon}\n <div className='suggestion-list__ellipsis'>\n <span className='suggestion-list__main'>\n {channelName}\n </span>\n {description}\n </div>\n </SuggestionContainer>\n );\n});\nChannelMentionSuggestion.displayName = 'ChannelMentionSuggestion';\n\nexport default class ChannelMentionProvider extends Provider {\n private lastPrefixTrimmed: string;\n private lastPrefixWithNoResults: string;\n private lastCompletedWord: string;\n triggerCharacter: string;\n private delayChannelAutocomplete: boolean;\n autocompleteChannels: (term: string, success: (channels: Channel[]) => void, error: () => void) => Promise<ActionResult>;\n\n constructor(channelSearchFunc: (term: string, success: (channels: Channel[]) => void, error: () => void) => Promise<ActionResult>, delayChannelAutocomplete: boolean) {\n super();\n\n this.lastPrefixTrimmed = '';\n this.lastPrefixWithNoResults = '';\n this.lastCompletedWord = '';\n this.triggerCharacter = '~';\n\n this.autocompleteChannels = channelSearchFunc;\n this.delayChannelAutocomplete = delayChannelAutocomplete;\n }\n\n setProps(props: {delayChannelAutocomplete: boolean}) {\n this.delayChannelAutocomplete = props.delayChannelAutocomplete;\n }\n\n handlePretextChanged(pretext: string, resultCallback: ResultsCallback<WrappedChannel>) {\n this.resetRequest();\n\n const captured = (/\\B(~([^~\\r\\n]*))$/i).exec(pretext.toLowerCase());\n\n if (!captured) {\n // Not a channel mention\n return false;\n }\n\n if (captured.index > 0 && pretext[captured.index - 1] === '~') {\n // Multiple ~'s in a row so let's return and not show the autocomplete\n return false;\n }\n\n const prefix = captured[2];\n\n if (this.delayChannelAutocomplete && prefix.length < MIN_CHANNEL_LINK_LENGTH) {\n return false;\n }\n\n if (this.lastPrefixTrimmed && prefix.trim() === this.lastPrefixTrimmed) {\n // Don't keep searching if the user keeps typing spaces\n return true;\n }\n\n this.lastPrefixTrimmed = prefix.trim();\n\n if (this.lastPrefixWithNoResults && prefix.startsWith(this.lastPrefixWithNoResults)) {\n // Just give up since we know it won't return any results\n return false;\n }\n\n if (this.lastCompletedWord && captured[0].startsWith(this.lastCompletedWord)) {\n // It appears we're still matching a channel handle that we already completed\n return false;\n }\n\n // Clear the last completed word since we've started to match new text\n this.lastCompletedWord = '';\n\n this.startNewRequest(prefix);\n\n const words = prefix.toLowerCase().split(/\\s+/);\n const wrappedChannelIds: Record<string, boolean> = {};\n let wrappedChannels: WrappedChannel[] = [];\n getMyChannels(store.getState()).forEach((item) => {\n if (item.type !== 'O' || item.delete_at > 0) {\n return;\n }\n const nameWords = item.name.toLowerCase().split(/\\s+/).concat(item.display_name.toLowerCase().split(/\\s+/));\n let matched = true;\n for (let j = 0; matched && j < words.length; j++) {\n if (!words[j]) {\n continue;\n }\n let wordMatched = false;\n for (let i = 0; i < nameWords.length; i++) {\n if (nameWords[i].startsWith(words[j])) {\n wordMatched = true;\n break;\n }\n }\n if (!wordMatched) {\n matched = false;\n break;\n }\n }\n if (!matched) {\n return;\n }\n wrappedChannelIds[item.id] = true;\n wrappedChannels.push({\n type: Constants.MENTION_CHANNELS,\n channel: item,\n });\n });\n wrappedChannels = wrappedChannels.sort((a, b) => {\n //\n // MM-12677 When this is migrated this needs to be fixed to pull the user's locale\n //\n return sortChannelsByTypeAndDisplayName('en', a.channel as Channel, b.channel as Channel);\n });\n const channelMentions = wrappedChannels.map((item) => '~' + item.channel?.name);\n resultCallback({\n terms: channelMentions.concat([' ']),\n items: wrappedChannels.concat([{\n type: Constants.MENTION_MORE_CHANNELS,\n loading: true,\n }]),\n component: ChannelMentionSuggestion,\n matchedPretext: captured[1],\n });\n\n const handleChannels = (channels: Channel[], withError: boolean) => {\n if (prefix !== this.latestPrefix || this.shouldCancelDispatch(prefix)) {\n return;\n }\n\n const myMembers = getMyChannelMemberships(store.getState());\n\n if (channels.length === 0 && !withError) {\n this.lastPrefixWithNoResults = prefix;\n }\n\n // Wrap channels in an outer object to avoid overwriting the 'type' property.\n const wrappedMoreChannels: WrappedChannel[] = [];\n channels.forEach((item) => {\n if (item.delete_at > 0 && !myMembers[item.id]) {\n return;\n }\n\n if (myMembers[item.id] && !wrappedChannelIds[item.id]) {\n wrappedChannelIds[item.id] = true;\n wrappedChannels.push({\n type: Constants.MENTION_CHANNELS,\n channel: item,\n });\n return;\n }\n\n if (myMembers[item.id] && wrappedChannelIds[item.id]) {\n return;\n }\n\n if (!myMembers[item.id] && wrappedChannelIds[item.id]) {\n delete wrappedChannelIds[item.id];\n const idx = wrappedChannels.map((el) => el.channel?.id).indexOf(item.id);\n if (idx >= 0) {\n wrappedChannels.splice(idx, 1);\n }\n }\n\n wrappedMoreChannels.push({\n type: Constants.MENTION_MORE_CHANNELS,\n channel: item,\n });\n });\n\n wrappedChannels = wrappedChannels.sort((a, b) => {\n //\n // MM-12677 When this is migrated this needs to be fixed to pull the user's locale\n //\n return sortChannelsByTypeAndDisplayName('en', a.channel as Channel, b.channel as Channel);\n });\n\n const wrapped = wrappedChannels.concat(wrappedMoreChannels);\n const mentions = wrapped.map((item) => '~' + item.channel?.name);\n\n resultCallback({\n matchedPretext: captured[1],\n terms: mentions,\n items: wrapped,\n component: ChannelMentionSuggestion,\n });\n };\n\n this.autocompleteChannels(\n prefix,\n (channels: Channel[]) => handleChannels(channels, false),\n () => handleChannels([], true),\n );\n\n return true;\n }\n\n handleCompleteWord(term: string) {\n this.lastCompletedWord = term;\n this.lastPrefixWithNoResults = '';\n }\n}\n\ndefineMessages({\n myChannelsDivider: {\n id: 'suggestion.mention.channels',\n defaultMessage: 'My Channels',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages} from 'react-intl';\nimport type {Store} from 'redux';\n\nimport {DockWindowIcon} from '@mattermost/compass-icons/components';\nimport type {AutocompleteSuggestion, CommandArgs} from '@mattermost/types/integrations';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\n\nimport globalStore from 'stores/redux_store';\n\nimport {Constants} from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\n\nimport type {GlobalState} from 'types/store';\n\nimport {AppCommandParser} from './app_command_parser/app_command_parser';\nimport {intlShim} from './app_command_parser/app_command_parser_dependencies';\n\nimport Provider from '../provider';\nimport type {ResultsCallback} from '../provider';\nimport {SuggestionContainer} from '../suggestion';\nimport type {SuggestionProps} from '../suggestion';\n\nconst EXECUTE_CURRENT_COMMAND_ITEM_ID = Constants.Integrations.EXECUTE_CURRENT_COMMAND_ITEM_ID;\nconst OPEN_COMMAND_IN_MODAL_ITEM_ID = Constants.Integrations.OPEN_COMMAND_IN_MODAL_ITEM_ID;\nconst COMMAND_SUGGESTION_ERROR = Constants.Integrations.COMMAND_SUGGESTION_ERROR;\n\nconst CommandSuggestion = React.forwardRef<HTMLDivElement, SuggestionProps<AutocompleteSuggestion>>((props, ref) => {\n const {item} = props;\n\n let symbolSpan = <span>{'/'}</span>;\n switch (item.IconData) {\n case EXECUTE_CURRENT_COMMAND_ITEM_ID:\n symbolSpan = <span className='block mt-1'>{'↵'}</span>;\n break;\n case OPEN_COMMAND_IN_MODAL_ITEM_ID:\n symbolSpan = (\n <span className='block mt-1'>\n <DockWindowIcon size={28}/>\n </span>\n );\n break;\n case COMMAND_SUGGESTION_ERROR:\n symbolSpan = <span>{'!'}</span>;\n break;\n }\n let icon = <div className='slash-command__icon'>{symbolSpan}</div>;\n if (item.IconData && ![EXECUTE_CURRENT_COMMAND_ITEM_ID, COMMAND_SUGGESTION_ERROR, OPEN_COMMAND_IN_MODAL_ITEM_ID].includes(item.IconData)) {\n icon = (\n <div\n className='slash-command__icon'\n style={{backgroundColor: 'transparent'}}\n >\n <img src={item.IconData}/>\n </div>);\n }\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n >\n {icon}\n <div className='slash-command__info'>\n <div className='slash-command__title'>\n {item.Suggestion.substring(1) + ' ' + item.Hint}\n </div>\n <div className='slash-command__desc'>\n {item.Description}\n </div>\n </div>\n </SuggestionContainer>\n );\n});\nCommandSuggestion.displayName = 'CommandSuggestion';\nexport {CommandSuggestion};\n\ntype Props = {\n teamId: string;\n channelId: string;\n rootId?: string;\n};\n\nexport default class CommandProvider extends Provider {\n private props: Props;\n private store: Store<GlobalState>;\n public triggerCharacter: string;\n private appCommandParser: AppCommandParser;\n\n constructor(props: Props) {\n super();\n\n this.store = globalStore;\n this.props = props;\n this.appCommandParser = new AppCommandParser(this.store as any, intlShim, props.channelId, props.teamId, props.rootId);\n this.triggerCharacter = '/';\n }\n\n setProps(props: Props) {\n this.props = props;\n this.appCommandParser.setChannelContext(props.channelId, props.teamId, props.rootId);\n }\n\n handlePretextChanged(pretext: string, resultCallback: ResultsCallback<AutocompleteSuggestion>) {\n if (!pretext.startsWith(this.triggerCharacter)) {\n return false;\n }\n\n if (appsEnabled(this.store.getState()) && this.appCommandParser.isAppCommand(pretext)) {\n this.appCommandParser.getSuggestions(pretext).then((suggestions) => {\n const matches = suggestions.map((suggestion) => ({\n ...suggestion,\n Complete: '/' + suggestion.Complete,\n Suggestion: '/' + suggestion.Suggestion,\n }));\n\n const terms = matches.map((suggestion) => suggestion.Complete);\n resultCallback({\n matchedPretext: pretext,\n terms,\n items: matches,\n component: CommandSuggestion,\n });\n });\n return true;\n }\n\n if (UserAgent.isMobile()) {\n this.handleMobile(pretext, resultCallback);\n } else {\n this.handleWebapp(pretext, resultCallback);\n }\n\n return true;\n }\n\n handleCompleteWord(term: string, pretext: string, callback: (s: string) => void) {\n callback(term + ' ');\n }\n\n handleMobile(pretext: string, resultCallback: ResultsCallback<AutocompleteSuggestion>) {\n const {teamId} = this.props;\n\n const command = pretext.toLowerCase();\n Client4.getCommandsList(teamId).then(\n (data) => {\n let matches: AutocompleteSuggestion[] = [];\n if (appsEnabled(this.store.getState())) {\n const appCommandSuggestions = this.appCommandParser.getSuggestionsBase(pretext);\n matches = matches.concat(appCommandSuggestions);\n }\n\n data.forEach((cmd) => {\n if (!cmd.auto_complete) {\n return;\n }\n\n if (cmd.trigger === 'shortcuts') {\n return;\n }\n\n if ((this.triggerCharacter + cmd.trigger).indexOf(command) === 0) {\n const s = this.triggerCharacter + cmd.trigger;\n let hint = '';\n if (cmd.auto_complete_hint && cmd.auto_complete_hint.length !== 0) {\n hint = cmd.auto_complete_hint;\n }\n matches.push({\n Suggestion: s,\n Complete: '',\n Hint: hint,\n Description: cmd.auto_complete_desc,\n IconData: '',\n type: Constants.Integrations.COMMAND,\n });\n }\n });\n\n matches = matches.sort((a, b) => a.Suggestion.localeCompare(b.Suggestion));\n\n // pull out the suggested commands from the returned data\n const terms = matches.map((suggestion) => suggestion.Suggestion);\n\n resultCallback({\n matchedPretext: command,\n terms,\n items: matches,\n component: CommandSuggestion,\n });\n },\n );\n }\n\n handleWebapp(pretext: string, resultCallback: ResultsCallback<AutocompleteSuggestion>) {\n const command = pretext.toLowerCase();\n\n const {teamId, channelId, rootId} = this.props;\n const args: CommandArgs = {\n team_id: teamId,\n channel_id: channelId,\n root_id: rootId,\n };\n\n Client4.getCommandAutocompleteSuggestionsList(command, teamId, args).then(\n ((data: AutocompleteSuggestion[]) => {\n let matches: AutocompleteSuggestion[] = [];\n\n let cmd = 'Ctrl';\n if (UserAgent.isMac()) {\n cmd = '⌘';\n }\n\n if (appsEnabled(this.store.getState())) {\n const appCommandSuggestions = this.appCommandParser.getSuggestionsBase(pretext).map((suggestion) => ({\n ...suggestion,\n Complete: '/' + suggestion.Complete,\n Suggestion: suggestion.Suggestion,\n }));\n matches = matches.concat(appCommandSuggestions);\n }\n\n data.forEach((s) => {\n if (!this.contains(matches, this.triggerCharacter + s.Complete)) {\n matches.push({\n Complete: this.triggerCharacter + s.Complete,\n Suggestion: this.triggerCharacter + s.Suggestion,\n Hint: s.Hint,\n Description: s.Description,\n IconData: s.IconData,\n type: Constants.Integrations.COMMAND,\n });\n }\n });\n\n // sort only if we are looking at base commands\n if (!pretext.includes(' ')) {\n matches.sort((a, b) => {\n if (a.Suggestion.toLowerCase() > b.Suggestion.toLowerCase()) {\n return 1;\n } else if (a.Suggestion.toLowerCase() < b.Suggestion.toLowerCase()) {\n return -1;\n }\n return 0;\n });\n }\n\n if (this.shouldAddExecuteItem(data, pretext)) {\n matches.unshift({\n Complete: pretext + EXECUTE_CURRENT_COMMAND_ITEM_ID,\n Suggestion: '/Execute Current Command',\n Hint: '',\n Description: 'Select this option or use ' + cmd + '+Enter to execute the current command.',\n IconData: EXECUTE_CURRENT_COMMAND_ITEM_ID,\n type: Constants.Integrations.COMMAND,\n });\n }\n\n // pull out the suggested commands from the returned data\n const terms = matches.map((suggestion) => suggestion.Complete);\n\n resultCallback({\n matchedPretext: command,\n terms,\n items: matches,\n component: CommandSuggestion,\n });\n }),\n );\n }\n\n shouldAddExecuteItem(data: AutocompleteSuggestion[], pretext: string) {\n if (data.length === 0) {\n return false;\n }\n if (pretext[pretext.length - 1] === ' ') {\n return true;\n }\n\n // If suggestion is empty it means that user can input any text so we allow them to execute.\n return data.findIndex((item) => item.Suggestion === '') !== -1;\n }\n\n contains(matches: AutocompleteSuggestion[], complete: string) {\n return matches.findIndex((match) => match.Complete === complete) !== -1;\n }\n}\n\ndefineMessages({\n commandsDivider: {\n id: 'suggestion.commands',\n defaultMessage: 'Commands',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type React from 'react';\nimport type {Store} from 'redux';\n\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\n\nimport {openAppsModal} from 'actions/apps';\nimport globalStore from 'stores/redux_store';\n\nimport {Constants} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport {AppCommandParser} from './app_command_parser/app_command_parser';\nimport {COMMAND_SUGGESTION_CHANNEL, COMMAND_SUGGESTION_USER, intlShim} from './app_command_parser/app_command_parser_dependencies';\nimport type {AutocompleteSuggestion, Channel, UserProfile} from './app_command_parser/app_command_parser_dependencies';\nimport {CommandSuggestion} from './command_provider';\n\nimport AtMentionSuggestion from '../at_mention_provider/at_mention_suggestion';\nimport {ChannelMentionSuggestion} from '../channel_mention_provider';\nimport Provider from '../provider';\nimport type {ResultsCallback} from '../provider';\n\ntype Props = {\n teamId: string;\n channelId: string;\n rootId?: string;\n};\n\ntype Item = AutocompleteSuggestion | UserProfile | {channel: Channel};\n\nexport default class AppCommandProvider extends Provider {\n private store: Store<GlobalState>;\n public triggerCharacter: string;\n private appCommandParser: AppCommandParser;\n\n constructor(props: Props) {\n super();\n\n this.store = globalStore;\n this.appCommandParser = new AppCommandParser(this.store as any, intlShim, props.channelId, props.teamId, props.rootId);\n this.triggerCharacter = '/';\n }\n\n setProps(props: Props) {\n this.appCommandParser.setChannelContext(props.channelId, props.teamId, props.rootId);\n }\n\n handlePretextChanged(pretext: string, resultCallback: ResultsCallback<Item>) {\n if (!pretext.startsWith(this.triggerCharacter)) {\n return false;\n }\n\n if (!appsEnabled(this.store.getState())) {\n return false;\n }\n\n if (!this.appCommandParser.isAppCommand(pretext)) {\n return false;\n }\n\n this.appCommandParser.getSuggestions(pretext).then((suggestions) => {\n const element: React.ElementType[] = [];\n const matches = suggestions.map((suggestion) => {\n switch (suggestion.type) {\n case COMMAND_SUGGESTION_USER:\n element.push(AtMentionSuggestion);\n return {...suggestion.item! as UserProfile, type: Constants.Integrations.COMMAND};\n case COMMAND_SUGGESTION_CHANNEL:\n element.push(ChannelMentionSuggestion);\n return {channel: suggestion.item! as Channel, type: Constants.Integrations.COMMAND};\n default:\n element.push(CommandSuggestion);\n return {\n ...suggestion,\n Complete: '/' + suggestion.Complete,\n Suggestion: '/' + suggestion.Suggestion,\n type: Constants.Integrations.COMMAND,\n };\n }\n });\n\n const terms = suggestions.map((suggestion) => '/' + suggestion.Complete);\n resultCallback({\n matchedPretext: pretext,\n terms,\n items: matches,\n components: element,\n });\n });\n return true;\n }\n\n public async openAppsModalFromCommand(pretext: string) {\n const {form, context} = await this.appCommandParser.composeFormFromCommand(pretext);\n if (!form || !context) {\n return;\n }\n this.store.dispatch(openAppsModal(form, context) as any);\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages} from 'react-intl';\n\nimport type {Emoji} from '@mattermost/types/emojis';\n\nimport {autocompleteCustomEmojis} from 'mattermost-redux/actions/emojis';\nimport {getEmojiImageUrl, isSystemEmoji} from 'mattermost-redux/utils/emoji_utils';\n\nimport {getEmojiMap, getRecentEmojisNames} from 'selectors/emojis';\nimport store from 'stores/redux_store';\n\nimport {compareEmojis, emojiMatchesSkin} from 'utils/emoji_utils';\nimport * as Emoticons from 'utils/emoticons';\n\nimport Provider from './provider';\nimport type {ResultsCallback} from './provider';\nimport {SuggestionContainer} from './suggestion';\nimport type {SuggestionProps} from './suggestion';\n\nexport const MIN_EMOTICON_LENGTH = 2;\nexport const EMOJI_CATEGORY_SUGGESTION_BLOCKLIST = ['skintone'];\n\ntype EmojiItem = {\n name: string;\n emoji: Emoji;\n type: string;\n}\n\nconst suggestionTypeEmoji = 'emoji';\n\nconst EmoticonSuggestion = React.forwardRef<HTMLDivElement, SuggestionProps<EmojiItem>>((props, ref) => {\n const text = props.term;\n const emoji = props.item.emoji;\n\n return (\n <SuggestionContainer\n ref={ref}\n {...props}\n >\n <div className='pull-left emoticon-suggestion__image-container'>\n <img\n alt={text}\n className='emoticon-suggestion__image'\n src={getEmojiImageUrl(emoji)}\n title={text}\n />\n </div>\n <div className='pull-left'>\n {text}\n </div>\n </SuggestionContainer>\n );\n});\nEmoticonSuggestion.displayName = 'EmoticonSuggestion';\n\nexport default class EmoticonProvider extends Provider {\n constructor() {\n super();\n\n this.triggerCharacter = ':';\n }\n\n handlePretextChanged(pretext: string, resultsCallback: ResultsCallback<EmojiItem>) {\n // Look for the potential emoticons at the start of the text, after whitespace, and at the start of emoji reaction commands\n const captured = (/(^|\\s|^\\+|^-)(:([^:\\s]*))$/g).exec(pretext.toLowerCase());\n if (!captured) {\n return false;\n }\n\n const prefix = captured[1];\n const text = captured[2];\n const partialName = captured[3];\n\n if (partialName.length < MIN_EMOTICON_LENGTH) {\n return false;\n }\n\n // Check for text emoticons if this isn't for an emoji reaction\n if (prefix !== '-' && prefix !== '+') {\n for (const emoticon of Object.keys(Emoticons.emoticonPatterns)) {\n if (Emoticons.emoticonPatterns[emoticon].test(text)) {\n // Don't show the autocomplete for text emoticons\n return false;\n }\n }\n }\n\n if (store.getState().entities.general.config.EnableCustomEmoji === 'true') {\n store.dispatch(autocompleteCustomEmojis(partialName)).then(() => this.findAndSuggestEmojis(text, partialName, resultsCallback));\n } else {\n this.findAndSuggestEmojis(text, partialName, resultsCallback);\n }\n\n return true;\n }\n\n formatEmojis(emojis: EmojiItem[]) {\n return emojis.map((item) => ':' + item.name + ':');\n }\n\n // findAndSuggestEmojis uses the provided partialName to match anywhere inside an emoji name.\n //\n // For example, typing `:welc` would match both `:welcome:` and `:youre_welcome:` if those\n // emojis are present in the local store. Note, however, that the server only does prefix\n // matches, so a query to populate the local store for `:welc` would only return `:welcome:`.\n // This results in surprising differences between a fresh load of the application, and the\n // changes to the cache from expanding the cache with emojis found in existing posts.\n //\n // For now, this behaviour and difference is by design.\n // See https://mattermost.atlassian.net/browse/MM-17320.\n findAndSuggestEmojis(text: string, partialName: string, resultsCallback: ResultsCallback<EmojiItem>) {\n const recentMatched: EmojiItem[] = [];\n const matched: EmojiItem[] = [];\n const state = store.getState();\n const skintone = state.entities?.preferences?.myPreferences['emoji--emoji_skintone']?.value || 'default';\n const emojiMap = getEmojiMap(state);\n const recentEmojis = getRecentEmojisNames(state);\n\n // Check for named emoji\n for (const [name, emoji] of emojiMap) {\n if (EMOJI_CATEGORY_SUGGESTION_BLOCKLIST.includes(emoji.category)) {\n continue;\n }\n\n if (isSystemEmoji(emoji)) {\n // This is a system emoji so it may have multiple names\n for (const alias of emoji.short_names) {\n if (alias.indexOf(partialName) !== -1) {\n const matchedArray = recentEmojis.includes(alias) || recentEmojis.includes(name) ? recentMatched : matched;\n\n // if the emoji has skin, only add those that match with the user selected skin.\n if (emojiMatchesSkin(emoji, skintone)) {\n matchedArray.push({name: alias, emoji, type: suggestionTypeEmoji});\n }\n break;\n }\n }\n } else if (name.indexOf(partialName) !== -1) {\n // This is a custom emoji so it only has one name\n if (emojiMap.hasSystemEmoji(name)) {\n // System emojis take precedence over custom ones\n continue;\n }\n\n const matchedArray = recentEmojis.includes(name) ? recentMatched : matched;\n\n matchedArray.push({name, emoji, type: suggestionTypeEmoji});\n }\n }\n\n const sortEmojisHelper = (a: EmojiItem, b: EmojiItem) => {\n return compareEmojis(a.emoji, b.emoji, partialName);\n };\n\n recentMatched.sort(sortEmojisHelper);\n\n matched.sort(sortEmojisHelper);\n\n const terms = [\n ...this.formatEmojis(recentMatched),\n ...this.formatEmojis(matched),\n ];\n\n const items = [\n ...recentMatched,\n ...matched,\n ];\n\n // Required to get past the dispatch during dispatch error\n resultsCallback({\n matchedPretext: text,\n terms,\n items,\n component: EmoticonSuggestion,\n });\n }\n}\n\ndefineMessages({\n emojisDivider: {\n id: 'suggestion.emoji',\n defaultMessage: 'Emoji',\n },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ChangeEvent, ElementType, FocusEvent, KeyboardEvent, MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Group} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AutosizeTextarea from 'components/autosize_textarea';\nimport PostMarkdown from 'components/post_markdown';\nimport AtMentionProvider from 'components/suggestion/at_mention_provider';\nimport ChannelMentionProvider from 'components/suggestion/channel_mention_provider';\nimport AppCommandProvider from 'components/suggestion/command_provider/app_provider';\nimport CommandProvider from 'components/suggestion/command_provider/command_provider';\nimport EmoticonProvider from 'components/suggestion/emoticon_provider';\nimport type Provider from 'components/suggestion/provider';\nimport SuggestionBox from 'components/suggestion/suggestion_box';\nimport type SuggestionBoxComponent from 'components/suggestion/suggestion_box/suggestion_box';\nimport SuggestionList from 'components/suggestion/suggestion_list';\n\nimport * as Utils from 'utils/utils';\n\nimport type {TextboxElement} from './index';\n\nconst ALL = ['all'];\n\nexport type Props = {\n id: string;\n channelId: string;\n rootId?: string;\n tabIndex?: number;\n value: string;\n onChange: (e: ChangeEvent<TextboxElement>) => void;\n onKeyPress: (e: KeyboardEvent<any>) => void;\n onComposition?: () => void;\n onHeightChange?: (height: number, maxHeight: number) => void;\n onWidthChange?: (width: number) => void;\n createMessage: string;\n onKeyDown?: (e: KeyboardEvent<TextboxElement>) => void;\n onMouseUp?: (e: React.MouseEvent<TextboxElement>) => void;\n onKeyUp?: (e: React.KeyboardEvent<TextboxElement>) => void;\n onBlur?: (e: FocusEvent<TextboxElement>) => void;\n onFocus?: (e: FocusEvent<TextboxElement>) => void;\n supportsCommands?: boolean;\n handlePostError?: (message: JSX.Element | null) => void;\n onPaste?: (e: ClipboardEvent) => void;\n suggestionList?: React.ComponentProps<typeof SuggestionBox>['listComponent'];\n suggestionListPosition?: React.ComponentProps<typeof SuggestionList>['position'];\n alignWithTextbox?: boolean;\n emojiEnabled?: boolean;\n characterLimit: number;\n disabled?: boolean;\n badConnection?: boolean;\n currentUserId: string;\n currentTeamId: string;\n preview?: boolean;\n autocompleteGroups: Group[] | null;\n delayChannelAutocomplete: boolean;\n actions: {\n autocompleteUsersInChannel: (prefix: string, channelId: string) => Promise<ActionResult>;\n autocompleteChannels: (term: string, success: (channels: Channel[]) => void, error: () => void) => Promise<ActionResult>;\n searchAssociatedGroupsForReference: (prefix: string, teamId: string, channelId: string | undefined) => Promise<{ data: any }>;\n };\n useChannelMentions: boolean;\n inputComponent?: ElementType;\n openWhenEmpty?: boolean;\n priorityProfiles?: UserProfile[];\n hasLabels?: boolean;\n isInEditMode?: boolean;\n};\n\nconst VISIBLE = {visibility: 'visible'};\nconst HIDDEN = {visibility: 'hidden'};\n\nexport default class Textbox extends React.PureComponent<Props> {\n private readonly suggestionProviders: Provider[];\n private readonly wrapper: React.RefObject<HTMLDivElement>;\n private readonly message: React.RefObject<SuggestionBoxComponent>;\n private readonly preview: React.RefObject<HTMLDivElement>;\n\n static defaultProps = {\n supportsCommands: true,\n inputComponent: AutosizeTextarea,\n suggestionList: SuggestionList,\n };\n\n constructor(props: Props) {\n super(props);\n\n this.suggestionProviders = [];\n\n if (props.supportsCommands) {\n this.suggestionProviders.push(new AppCommandProvider({\n teamId: this.props.currentTeamId,\n channelId: this.props.channelId,\n rootId: this.props.rootId,\n }));\n }\n\n this.suggestionProviders.push(\n new AtMentionProvider({\n currentUserId: this.props.currentUserId,\n channelId: this.props.channelId,\n autocompleteUsersInChannel: (prefix: string) => this.props.actions.autocompleteUsersInChannel(prefix, this.props.channelId),\n useChannelMentions: this.props.useChannelMentions,\n autocompleteGroups: this.props.autocompleteGroups,\n searchAssociatedGroupsForReference: (prefix: string) => this.props.actions.searchAssociatedGroupsForReference(prefix, this.props.currentTeamId, this.props.channelId),\n priorityProfiles: this.props.priorityProfiles,\n }),\n new ChannelMentionProvider(props.actions.autocompleteChannels, props.delayChannelAutocomplete),\n new EmoticonProvider(),\n );\n\n if (props.supportsCommands) {\n this.suggestionProviders.push(new CommandProvider({\n teamId: this.props.currentTeamId,\n channelId: this.props.channelId,\n rootId: this.props.rootId,\n }));\n }\n\n this.checkMessageLength(props.value);\n this.wrapper = React.createRef();\n this.message = React.createRef();\n this.preview = React.createRef();\n }\n\n handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n this.props.onChange(e);\n };\n\n updateSuggestions(prevProps: Props) {\n if (this.props.channelId !== prevProps.channelId ||\n this.props.currentUserId !== prevProps.currentUserId ||\n this.props.autocompleteGroups !== prevProps.autocompleteGroups ||\n this.props.useChannelMentions !== prevProps.useChannelMentions ||\n this.props.currentTeamId !== prevProps.currentTeamId ||\n this.props.priorityProfiles !== prevProps.priorityProfiles) {\n // Update channel id for AtMentionProvider.\n for (const provider of this.suggestionProviders) {\n if (provider instanceof AtMentionProvider) {\n provider.setProps({\n currentUserId: this.props.currentUserId,\n channelId: this.props.channelId,\n autocompleteUsersInChannel: (prefix: string) => this.props.actions.autocompleteUsersInChannel(prefix, this.props.channelId),\n useChannelMentions: this.props.useChannelMentions,\n autocompleteGroups: this.props.autocompleteGroups,\n searchAssociatedGroupsForReference: (prefix: string) => this.props.actions.searchAssociatedGroupsForReference(prefix, this.props.currentTeamId, this.props.channelId),\n priorityProfiles: this.props.priorityProfiles,\n });\n }\n }\n }\n\n if (this.props.channelId !== prevProps.channelId ||\n this.props.currentTeamId !== prevProps.currentTeamId ||\n this.props.rootId !== prevProps.rootId) {\n // Update channel id for CommandProvider and AppCommandProvider.\n for (const provider of this.suggestionProviders) {\n if (provider instanceof CommandProvider) {\n provider.setProps({\n teamId: this.props.currentTeamId,\n channelId: this.props.channelId,\n rootId: this.props.rootId,\n });\n }\n if (provider instanceof AppCommandProvider) {\n provider.setProps({\n teamId: this.props.currentTeamId,\n channelId: this.props.channelId,\n rootId: this.props.rootId,\n });\n }\n }\n }\n\n if (this.props.delayChannelAutocomplete !== prevProps.delayChannelAutocomplete) {\n for (const provider of this.suggestionProviders) {\n if (provider instanceof ChannelMentionProvider) {\n provider.setProps({\n delayChannelAutocomplete: this.props.delayChannelAutocomplete,\n });\n }\n }\n }\n\n if (prevProps.value !== this.props.value) {\n this.checkMessageLength(this.props.value);\n }\n }\n\n componentDidUpdate(prevProps: Props) {\n if (!prevProps.preview && this.props.preview) {\n this.preview.current?.focus();\n }\n\n this.updateSuggestions(prevProps);\n }\n\n checkMessageLength = (message: string) => {\n if (this.props.handlePostError) {\n if (message.length > this.props.characterLimit) {\n const errorMessage = (\n <FormattedMessage\n id='create_post.error_message'\n defaultMessage='Your message is too long. Character count: {length}/{limit}'\n values={{\n length: message.length,\n limit: this.props.characterLimit,\n }}\n />);\n this.props.handlePostError(errorMessage);\n } else {\n this.props.handlePostError(null);\n }\n }\n };\n\n // adding in the HTMLDivElement to support event handling in preview state\n handleKeyDown = (e: KeyboardEvent<TextboxElement | HTMLDivElement>) => {\n // since we do only handle the sending when in preview mode this is fine to be casted\n this.props.onKeyDown?.(e as KeyboardEvent<TextboxElement>);\n };\n\n handleMouseUp = (e: MouseEvent<TextboxElement>) => this.props.onMouseUp?.(e);\n\n handleKeyUp = (e: KeyboardEvent<TextboxElement>) => this.props.onKeyUp?.(e);\n\n // adding in the HTMLDivElement to support event handling in preview state\n handleBlur = (e: FocusEvent<TextboxElement | HTMLDivElement>) => {\n // since we do only handle the sending when in preview mode this is fine to be casted\n this.props.onBlur?.(e as FocusEvent<TextboxElement>);\n };\n\n getInputBox = () => {\n return this.message.current?.getTextbox();\n };\n\n focus = () => {\n const textbox = this.getInputBox();\n if (textbox) {\n textbox.focus();\n Utils.placeCaretAtEnd(textbox);\n setTimeout(() => {\n Utils.scrollToCaret(textbox);\n });\n\n // reset character count warning\n this.checkMessageLength(textbox.value);\n }\n };\n\n blur = () => {\n this.getInputBox()?.blur();\n };\n\n getStyle = () => {\n return this.props.preview ? HIDDEN : VISIBLE;\n };\n\n render() {\n let textboxClassName = 'form-control custom-textarea textbox-edit-area';\n if (this.props.emojiEnabled) {\n textboxClassName += ' custom-textarea--emoji-picker';\n }\n if (this.props.badConnection) {\n textboxClassName += ' bad-connection';\n }\n if (this.props.hasLabels) {\n textboxClassName += ' textarea--has-labels';\n }\n\n return (\n <div\n ref={this.wrapper}\n className={classNames('textarea-wrapper', {'textarea-wrapper-preview': this.props.preview})}\n >\n <div\n tabIndex={this.props.tabIndex || 0}\n ref={this.preview}\n className={classNames('form-control custom-textarea textbox-preview-area', {'textarea--has-labels': this.props.hasLabels})}\n onKeyPress={this.props.onKeyPress}\n onKeyDown={this.handleKeyDown}\n onBlur={this.handleBlur}\n >\n <PostMarkdown\n message={this.props.value}\n channelId={this.props.channelId}\n imageProps={{hideUtilities: true}}\n />\n </div>\n <SuggestionBox\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n ref={this.message}\n id={this.props.id}\n className={textboxClassName}\n spellCheck='true'\n placeholder={this.props.createMessage}\n onChange={this.handleChange}\n onKeyPress={this.props.onKeyPress}\n onKeyDown={this.handleKeyDown}\n onMouseUp={this.handleMouseUp}\n onKeyUp={this.handleKeyUp}\n onComposition={this.props.onComposition}\n onBlur={this.handleBlur}\n onFocus={this.props.onFocus}\n onHeightChange={this.props.onHeightChange}\n onWidthChange={this.props.onWidthChange}\n onPaste={this.props.onPaste}\n style={this.getStyle()}\n inputComponent={this.props.inputComponent}\n listComponent={this.props.suggestionList}\n listPosition={this.props.suggestionListPosition}\n providers={this.suggestionProviders}\n value={this.props.value}\n renderDividers={ALL}\n disabled={this.props.disabled}\n contextId={this.props.channelId}\n openWhenEmpty={this.props.openWhenEmpty}\n alignWithTextbox={this.props.alignWithTextbox}\n />\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MouseEvent, ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport ExternalLink from 'components/external_link';\n\ntype Props = {\n showPreview?: boolean;\n previewMessageLink?: ReactNode;\n hasText?: boolean;\n hasExceededCharacterLimit?: boolean;\n updatePreview?: (showPreview: boolean) => void;\n};\n\nfunction TextboxLinks({\n showPreview,\n previewMessageLink,\n hasText = false,\n hasExceededCharacterLimit = false,\n updatePreview,\n}: Props) {\n const togglePreview = (e: MouseEvent) => {\n e.preventDefault();\n updatePreview?.(!showPreview);\n };\n\n let editHeader;\n\n let helpTextClass = '';\n\n if (hasExceededCharacterLimit) {\n helpTextClass = 'hidden';\n }\n\n if (previewMessageLink) {\n editHeader = previewMessageLink;\n } else {\n editHeader = (\n <FormattedMessage\n id='textbox.edit'\n defaultMessage='Edit message'\n />\n );\n }\n\n const previewLink = (\n <button\n id='previewLink'\n onClick={togglePreview}\n className='style--none textbox-preview-link color--link'\n >\n {showPreview ? (\n editHeader\n ) : (\n <FormattedMessage\n id='textbox.preview'\n defaultMessage='Preview'\n />\n )}\n </button>\n );\n\n const helpText = (\n <div\n style={{visibility: hasText ? 'visible' : 'hidden', opacity: hasText ? '0.45' : '0'}}\n className='help__format-text'\n >\n <b>\n <FormattedMessage\n id='textbox.bold'\n defaultMessage='**bold**'\n />\n </b>\n <i>\n <FormattedMessage\n id='textbox.italic'\n defaultMessage='*italic*'\n />\n </i>\n <span>\n {'~~'}\n <s>\n <FormattedMessage\n id='textbox.strike'\n defaultMessage='strike'\n />\n </s>\n {'~~ '}\n </span>\n <span>\n <FormattedMessage\n id='textbox.inlinecode'\n defaultMessage='`inline code`'\n />\n </span>\n <span>\n <FormattedMessage\n id='textbox.preformatted'\n defaultMessage='```preformatted```'\n />\n </span>\n <span>\n <FormattedMessage\n id='textbox.quote'\n defaultMessage='>quote'\n />\n </span>\n </div>\n );\n\n return (\n <div className={'help__text ' + helpTextClass}>\n {helpText}\n {previewLink}\n <ExternalLink\n location='textbox_links'\n href={'https://docs.mattermost.com/collaborate/format-messages.html'}\n className='textbox-help-link'\n >\n <FormattedMessage\n id='textbox.help'\n defaultMessage='Help'\n />\n </ExternalLink>\n </div>\n );\n}\n\nexport default TextboxLinks;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getAssociatedGroupsForReference} from 'mattermost-redux/selectors/entities/groups';\nimport {makeGetProfilesForThread} from 'mattermost-redux/selectors/entities/posts';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {autocompleteChannels} from 'actions/channel_actions';\nimport {autocompleteUsersInChannel} from 'actions/views/channel';\nimport {searchAssociatedGroupsForReference} from 'actions/views/group';\n\nimport Textbox from './textbox';\nimport TextboxLinks from './textbox_links';\n\ntype Props = {\n channelId: string;\n rootId?: string;\n};\n\nexport type TextboxElement = HTMLInputElement | HTMLTextAreaElement;\n\nconst makeMapStateToProps = () => {\n const getProfilesForThread = makeGetProfilesForThread();\n return (state: GlobalState, ownProps: Props) => {\n const teamId = getCurrentTeamId(state);\n const license = getLicense(state);\n const useGroupMentions = license?.IsLicensed === 'true' && license?.LDAPGroups === 'true' && haveIChannelPermission(state,\n teamId,\n ownProps.channelId,\n Permissions.USE_GROUP_MENTIONS,\n );\n const autocompleteGroups = useGroupMentions ? getAssociatedGroupsForReference(state, teamId, ownProps.channelId) : null;\n\n return {\n currentUserId: getCurrentUserId(state),\n currentTeamId: teamId,\n autocompleteGroups,\n priorityProfiles: getProfilesForThread(state, ownProps.rootId ?? ''),\n delayChannelAutocomplete: getConfig(state).DelayChannelAutocomplete === 'true',\n };\n };\n};\n\nconst mapDispatchToProps = (dispatch: Dispatch) => ({\n actions: bindActionCreators({\n autocompleteUsersInChannel,\n autocompleteChannels,\n searchAssociatedGroupsForReference,\n }, dispatch),\n});\n\nexport {Textbox as TextboxClass};\n\nexport default connect(makeMapStateToProps, mapDispatchToProps, null, {forwardRef: true})(Textbox);\nexport {TextboxLinks};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo} from 'react';\nimport type {ButtonHTMLAttributes, ReactNode} from 'react';\n\nimport './button.scss';\n\ntype Props = {\n prepend?: ReactNode;\n append?: ReactNode;\n isActive?: boolean;\n hasDot?: boolean;\n allowTextOverflow?: boolean;\n marginTop?: boolean;\n}\n\ntype Attrs = Exclude<ButtonHTMLAttributes<HTMLButtonElement>, Props>\n\nfunction Button({\n prepend,\n append,\n children,\n isActive,\n hasDot,\n marginTop,\n allowTextOverflow = false,\n ...attrs\n}: Props & Attrs) {\n return (\n <button\n {...attrs}\n className={classNames('Button Button___transparent', {'is-active': isActive, allowTextOverflow}, attrs.className)}\n >\n {prepend && (\n <span className='Button_prepended'>\n {prepend}\n </span>\n )}\n <span className={classNames('Button_label', {margin_top: marginTop})}>\n {children}\n {hasDot && <span className='dot'/>}\n </span>\n {append && (\n <span className='Button_appended'>\n {append}\n </span>\n )}\n </button>\n );\n}\n\nexport default memo(Button);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo} from 'react';\nimport type {ComponentProps} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport Button from '../button';\n\ntype Props = {\n isFollowing: boolean | null | undefined;\n}\n\nfunction FollowButton({\n isFollowing,\n ...props\n}: Props & Exclude<ComponentProps<typeof Button>, Props>) {\n const {formatMessage} = useIntl();\n return (\n <Button\n {...props}\n className={classNames(props.className, 'FollowButton')}\n disabled={Boolean(props.disabled)}\n isActive={isFollowing ?? false}\n >\n {isFollowing ? formatMessage({\n id: 'threading.following',\n defaultMessage: 'Following',\n }) : formatMessage({\n id: 'threading.notFollowing',\n defaultMessage: 'Follow',\n })}\n </Button>\n );\n}\n\nexport default memo(FollowButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps} from 'react';\n\nimport type Timestamp from 'components/timestamp';\n\nexport const THREADING_TIME: Partial<ComponentProps<typeof Timestamp>> = {\n units: [\n 'now',\n 'minute',\n 'hour',\n 'day',\n 'week',\n ],\n useTime: false,\n day: 'numeric',\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useEffect, useCallback} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport Toast from 'components/toast/toast';\n\nimport Constants from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\n\nimport './new_replies_banner.scss';\n\ntype Props = {\n hasNewReplies: boolean;\n width: number;\n onClick: () => void;\n onDismiss: () => void;\n actions: {\n updateThreadToastStatus: (status: boolean) => void;\n };\n}\n\nfunction NewRepliesBanner({\n hasNewReplies,\n onClick,\n onDismiss,\n width,\n actions,\n}: Props) {\n const intl = useIntl();\n const onClickMessage = intl.formatMessage({id: 'postlist.toast.scrollToLatest', defaultMessage: 'Jump to new messages'});\n\n useEffect(() => {\n actions.updateThreadToastStatus(hasNewReplies);\n }, [hasNewReplies]);\n\n const handleShortcut = useCallback((e) => {\n if (isKeyPressed(e, Constants.KeyCodes.ESCAPE)) {\n if (hasNewReplies) {\n onDismiss();\n }\n }\n }, [hasNewReplies]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleShortcut);\n\n return () => {\n document.removeEventListener('keydown', handleShortcut);\n };\n }, [handleShortcut]);\n\n return (\n <div\n className='new-replies-banner'\n style={{width}}\n >\n <Toast\n show={hasNewReplies}\n showActions={true}\n onClick={onClick}\n onDismiss={onDismiss}\n onClickMessage={onClickMessage}\n width={156}\n >\n <FormattedMessage\n id='rhs_thread.toast.newReplies'\n defaultMessage='New Replies'\n />\n </Toast>\n </div>\n );\n}\n\nexport default memo(NewRepliesBanner);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {makeGetPostsForThread} from 'mattermost-redux/selectors/entities/posts';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {updateThreadToastStatus} from 'actions/views/threads';\n\nimport type {GlobalState} from 'types/store';\n\nimport NewRepliesBanner from './new_replies_banner';\n\ntype Props = {\n threadId: Post['id'];\n lastViewedBottom: number;\n canShow: boolean;\n}\n\nfunction makeGetHasNewRepliesSince(): (state: GlobalState, threadId: string, lastViewed: number) => boolean {\n const getPostsForThread = makeGetPostsForThread();\n\n return createSelector(\n 'makeGetHasNewRepliesSince',\n getPostsForThread,\n getCurrentUser,\n (_state: GlobalState, _threadId: string, lastViewed: number) => lastViewed,\n (posts, currentUser, lastViewed) => posts.\n some((post) => post.create_at > lastViewed && post.user_id !== currentUser.id),\n );\n}\n\nfunction makeMapStateToProps() {\n const getHasNewRepliesSince = makeGetHasNewRepliesSince();\n\n return (state: GlobalState, ownProps: Props) => {\n const {threadId, lastViewedBottom, canShow} = ownProps;\n\n const hasNewReplies = canShow ? getHasNewRepliesSince(state, threadId, lastViewedBottom) : false;\n\n return {\n hasNewReplies,\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n updateThreadToastStatus,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(NewRepliesBanner);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable max-lines */\n\nimport React from 'react';\n\nimport type {SubmitPostReturnType} from 'actions/views/create_comment';\n\nimport AdvancedTextEditor from 'components/advanced_text_editor/advanced_text_editor';\n\nimport {Locations} from 'utils/constants';\n\nexport type Props = {\n\n // The channel for which this comment is a part of\n channelId: string;\n\n // The id of the parent post\n rootId: string;\n\n isThreadView?: boolean;\n placeholder?: string;\n\n /**\n * Used by plugins to act after the post is made\n */\n afterSubmit?: (response: SubmitPostReturnType) => void;\n}\n\nconst AdvancedCreateComment = ({\n channelId,\n rootId,\n isThreadView,\n placeholder,\n afterSubmit,\n}: Props) => {\n return (\n <AdvancedTextEditor\n location={Locations.RHS_COMMENT}\n channelId={channelId}\n postId={rootId}\n isThreadView={isThreadView}\n placeholder={placeholder}\n afterSubmit={afterSubmit}\n />\n );\n};\n\nexport default React.memo(AdvancedCreateComment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport AdvancedCreateComment from './advanced_create_comment';\n\nexport default AdvancedCreateComment;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, forwardRef, useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {ArchiveOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {makeGetChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getPost, getLimitedViews} from 'mattermost-redux/selectors/entities/posts';\n\nimport AdvancedCreateComment from 'components/advanced_create_comment';\nimport BasicSeparator from 'components/widgets/separator/basic-separator';\n\nimport Constants from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n teammate?: UserProfile;\n threadId: string;\n isThreadView?: boolean;\n placeholder?: string;\n};\n\nconst CreateComment = forwardRef<HTMLDivElement, Props>(({\n teammate,\n threadId,\n isThreadView,\n placeholder,\n}: Props, ref) => {\n const getChannel = useMemo(makeGetChannel, []);\n const rootPost = useSelector((state: GlobalState) => getPost(state, threadId));\n const threadIsLimited = useSelector(getLimitedViews).threads[threadId];\n const channel = useSelector((state: GlobalState) => {\n if (threadIsLimited) {\n return null;\n }\n return getChannel(state, rootPost.channel_id);\n });\n if (!channel || threadIsLimited) {\n return null;\n }\n const isFakeDeletedPost = rootPost.type === Constants.PostTypes.FAKE_PARENT_DELETED;\n\n const channelType = channel.type;\n const channelIsArchived = channel.delete_at !== 0;\n\n if (channelType === Constants.DM_CHANNEL && teammate?.delete_at) {\n return (\n <div\n className='post-create-message'\n >\n <FormattedMessage\n id='createComment.threadFromDeactivatedUserMessage'\n defaultMessage='You are viewing an archived channel with a <strong>deactivated user</strong>. New messages cannot be posted.'\n values={{\n strong: (chunks: string) => <strong>{chunks}</strong>,\n }}\n />\n </div>\n );\n }\n\n if (isFakeDeletedPost) {\n return null;\n }\n\n if (channelIsArchived) {\n return (\n <div className='channel-archived-warning__container'>\n <BasicSeparator/>\n <div className='channel-archived-warning__content'>\n <ArchiveOutlineIcon\n size={20}\n color={'rgba(var(--center-channel-color-rgb), 0.75)'}\n />\n <FormattedMessage\n id='createComment.threadFromArchivedChannelMessage'\n defaultMessage='You are viewing a thread from an <strong>archived channel</strong>. New messages cannot be posted.'\n values={{\n strong: (chunks: string) => <strong>{chunks}</strong>,\n }}\n />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className='post-create__container'\n ref={ref}\n data-testid='comment-create'\n >\n <AdvancedCreateComment\n placeholder={placeholder}\n channelId={channel.id}\n rootId={threadId}\n isThreadView={isThreadView}\n />\n </div>\n );\n});\n\nexport default memo(CreateComment);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {makeGetThreadOrSynthetic} from 'mattermost-redux/selectors/entities/threads';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n postId: string;\n};\n\nconst RootPostDivider: React.FC<Props> = ({postId}) => {\n const post = useSelector((state: GlobalState) => getPost(state, postId));\n const getThreadOrSynthetic = useMemo(makeGetThreadOrSynthetic, []);\n\n const totalReplies = useSelector((state: GlobalState) => {\n const thread = getThreadOrSynthetic(state, post);\n return thread.reply_count || 0;\n });\n\n if (totalReplies === 0) {\n return null; // Return null if there are no replies\n }\n\n return (\n <div className='root-post__divider'>\n <div>\n <FormattedMessage\n id='threading.numReplies'\n defaultMessage='{totalReplies, plural, =0 {Reply} =1 {# reply} other {# replies}}'\n values={{totalReplies}}\n />\n </div>\n </div>\n );\n};\n\nexport default RootPostDivider;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport PostComponent from 'components/post';\nimport type {Props as TimestampProps} from 'components/timestamp/timestamp';\n\nimport {Locations} from 'utils/constants';\n\ntype Props = {\n a11yIndex: number;\n currentUserId: string;\n isLastPost: boolean;\n onCardClick: (post: Post) => void;\n post: Post;\n previousPostId: string;\n timestampProps?: Partial<TimestampProps>;\n id?: Post['id'];\n}\n\nfunction Reply({\n a11yIndex,\n isLastPost,\n onCardClick,\n post,\n previousPostId,\n timestampProps,\n}: Props) {\n return (\n <PostComponent\n a11yIndex={a11yIndex}\n handleCardClick={onCardClick}\n isLastPost={isLastPost}\n post={post}\n previousPostId={previousPostId}\n timestampProps={timestampProps}\n location={Locations.RHS_COMMENT}\n />\n );\n}\n\nexport default memo(Reply);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {get, getBool} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {Preferences} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport Reply from './reply';\n\ntype OwnProps = {\n id: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const previewCollapsed = get(\n state,\n Preferences.CATEGORY_DISPLAY_SETTINGS,\n Preferences.COLLAPSE_DISPLAY,\n Preferences.COLLAPSE_DISPLAY_DEFAULT,\n );\n const previewEnabled = getBool(\n state,\n Preferences.CATEGORY_DISPLAY_SETTINGS,\n Preferences.LINK_PREVIEW_DISPLAY,\n Preferences.LINK_PREVIEW_DISPLAY_DEFAULT === 'true',\n );\n\n return {\n post: getPost(state, ownProps.id),\n previewEnabled,\n previewCollapsed,\n };\n}\n\nexport default connect(mapStateToProps)(Reply);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport * as PostListUtils from 'mattermost-redux/utils/post_list';\n\nimport PostComponent from 'components/post';\nimport CombinedUserActivityPost from 'components/post_view/combined_user_activity_post';\nimport DateSeparator from 'components/post_view/date_separator';\nimport NewMessageSeparator from 'components/post_view/new_message_separator/new_message_separator';\nimport RootPostDivider from 'components/root_post_divider/root_post_divider';\nimport type {Props as TimestampProps} from 'components/timestamp/timestamp';\n\nimport {Locations} from 'utils/constants';\n\nimport type {PluginComponent} from 'types/store/plugins';\n\nimport Reply from './reply';\n\ntype Props = {\n a11yIndex: number;\n currentUserId: string;\n isRootPost: boolean;\n isLastPost: boolean;\n listId: string;\n onCardClick: (post: Post) => void;\n previousPostId: string;\n timestampProps?: Partial<TimestampProps>;\n threadId: string;\n newMessagesSeparatorActions: PluginComponent[];\n};\n\nfunction noop() {}\nfunction ThreadViewerRow({\n a11yIndex,\n currentUserId,\n isRootPost,\n isLastPost,\n listId,\n onCardClick,\n previousPostId,\n timestampProps,\n threadId,\n newMessagesSeparatorActions,\n}: Props) {\n switch (true) {\n case PostListUtils.isDateLine(listId): {\n const date = PostListUtils.getDateForDateLine(listId);\n return (\n <DateSeparator\n key={date}\n date={date}\n />\n );\n }\n\n case PostListUtils.isStartOfNewMessages(listId):\n return (\n <NewMessageSeparator\n separatorId={listId}\n threadId={threadId}\n newMessagesSeparatorActions={newMessagesSeparatorActions}\n />\n );\n\n case isRootPost:\n return (\n <>\n <PostComponent\n postId={listId}\n isLastPost={isLastPost}\n handleCardClick={onCardClick}\n timestampProps={timestampProps}\n location={Locations.RHS_ROOT}\n />\n <RootPostDivider postId={listId}/>\n </>\n );\n case PostListUtils.isCombinedUserActivityPost(listId): {\n return (\n <CombinedUserActivityPost\n location={Locations.CENTER}\n combinedId={listId}\n previousPostId={previousPostId}\n isLastPost={isLastPost}\n shouldHighlight={false}\n togglePostMenu={noop}\n />\n );\n }\n default:\n return (\n <Reply\n a11yIndex={a11yIndex}\n currentUserId={currentUserId}\n id={listId}\n isLastPost={isLastPost}\n onCardClick={onCardClick}\n previousPostId={previousPostId}\n timestampProps={timestampProps}\n />\n );\n }\n}\n\nexport default memo(ThreadViewerRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {DynamicSizeList} from 'dynamic-virtualized-list';\nimport type {OnScrollArgs, OnItemsRenderedArgs} from 'dynamic-virtualized-list';\nimport React, {PureComponent} from 'react';\nimport type {RefObject} from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getNewMessagesIndex, isDateLine, isStartOfNewMessages, isCreateComment} from 'mattermost-redux/utils/post_list';\n\nimport NewRepliesBanner from 'components/new_replies_banner';\nimport FloatingTimestamp from 'components/post_view/floating_timestamp';\nimport {THREADING_TIME as BASE_THREADING_TIME} from 'components/threading/common/options';\n\nimport Constants from 'utils/constants';\nimport DelayedAction from 'utils/delayed_action';\nimport {getPreviousPostId, getLatestPostId} from 'utils/post_utils';\nimport * as Utils from 'utils/utils';\n\nimport type {PluginComponent} from 'types/store/plugins';\nimport type {FakePost} from 'types/store/rhs';\n\nimport CreateComment from './create_comment';\nimport Row from './thread_viewer_row';\nimport './virtualized_thread_viewer.scss';\n\ntype Props = {\n currentUserId: string;\n directTeammate: UserProfile | undefined;\n highlightedPostId?: Post['id'];\n selectedPostFocusedAt?: number;\n lastPost: Post;\n onCardClick: (post: Post) => void;\n replyListIds: string[];\n selected: Post | FakePost;\n useRelativeTimestamp: boolean;\n isMobileView: boolean;\n isThreadView: boolean;\n newMessagesSeparatorActions: PluginComponent[];\n inputPlaceholder?: string;\n measureRhsOpened: () => void;\n}\n\ntype State = {\n isScrolling: boolean;\n topRhsPostId?: string;\n userScrolledToBottom: boolean;\n lastViewedBottom: number;\n visibleStartIndex?: number;\n visibleStopIndex?: number;\n overscanStartIndex?: number;\n overscanStopIndex?: number;\n}\n\nconst virtListStyles = {\n position: 'absolute',\n willChange: 'transform',\n overflowY: 'auto',\n overflowAnchor: 'none',\n bottom: '0px',\n maxHeight: '100%',\n};\n\nconst innerStyles = {\n paddingTop: '28px',\n};\n\nconst THREADING_TIME: typeof BASE_THREADING_TIME = {\n ...BASE_THREADING_TIME,\n units: [\n 'now',\n 'minute',\n 'hour',\n 'day',\n 'week',\n 'month',\n 'year',\n ],\n};\n\nconst OFFSET_TO_SHOW_TOAST = -50;\n\n// To handle issue caused by slight difference in scrollHeight and scrollOffset + clientHeight of virtaulized list\n// we add a buffer to the scrollOffset\nconst SCROLL_OFFSET_BUFFER = 5;\n\nconst OVERSCAN_COUNT_FORWARD = 80;\nconst OVERSCAN_COUNT_BACKWARD = 80;\n\nclass ThreadViewerVirtualized extends PureComponent<Props, State> {\n private mounted = false;\n private scrollStopAction: DelayedAction;\n private scrollShortCircuit = 0;\n listRef: RefObject<DynamicSizeList>;\n innerRef: RefObject<HTMLDivElement>;\n initRangeToRender: number[];\n\n constructor(props: Props) {\n super(props);\n\n const postIndex = this.getInitialPostIndex();\n\n this.initRangeToRender = [\n Math.max(postIndex - 30, 0),\n Math.max(postIndex + 30, Math.min(props.replyListIds.length - 1, 50)),\n ];\n\n this.listRef = React.createRef();\n this.innerRef = React.createRef();\n this.scrollStopAction = new DelayedAction(this.handleScrollStop);\n\n this.state = {\n isScrolling: false,\n userScrolledToBottom: false,\n topRhsPostId: undefined,\n lastViewedBottom: Date.now(),\n visibleStartIndex: undefined,\n visibleStopIndex: undefined,\n overscanStartIndex: undefined,\n overscanStopIndex: undefined,\n };\n }\n\n componentDidMount() {\n this.mounted = true;\n\n this.props.measureRhsOpened();\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n componentDidUpdate(prevProps: Props) {\n const {highlightedPostId, selectedPostFocusedAt, lastPost, currentUserId, directTeammate} = this.props;\n\n // In case the user is being deactivated, we need to trigger a re-render\n if (directTeammate?.delete_at !== prevProps.directTeammate?.delete_at) {\n this.scrollToBottom();\n }\n\n if ((highlightedPostId && prevProps.highlightedPostId !== highlightedPostId) ||\n prevProps.selectedPostFocusedAt !== selectedPostFocusedAt) {\n this.scrollToHighlightedPost();\n } else if (\n prevProps.lastPost.id !== lastPost.id &&\n (lastPost.user_id === currentUserId || this.state.userScrolledToBottom)\n ) {\n this.scrollToBottom();\n }\n }\n\n canLoadMorePosts() {\n return Promise.resolve();\n }\n\n initScrollToIndex = (): {index: number; position: string; offset?: number} => {\n const {highlightedPostId, replyListIds} = this.props;\n\n if (highlightedPostId) {\n const index = replyListIds.indexOf(highlightedPostId);\n return {\n index,\n position: 'center',\n };\n }\n\n const newMessagesSeparatorIndex = getNewMessagesIndex(replyListIds);\n if (newMessagesSeparatorIndex > 0) {\n return {\n index: newMessagesSeparatorIndex,\n position: 'start',\n offset: OFFSET_TO_SHOW_TOAST,\n };\n }\n\n return {\n index: 0,\n position: 'end',\n };\n };\n\n handleScroll = ({scrollHeight, scrollUpdateWasRequested, scrollOffset, clientHeight}: OnScrollArgs) => {\n if (scrollHeight <= 0) {\n return;\n }\n\n const updatedState: Partial<State> = {};\n\n const userScrolledToBottom = scrollHeight - scrollOffset - SCROLL_OFFSET_BUFFER <= clientHeight;\n\n if (!scrollUpdateWasRequested) {\n this.scrollShortCircuit = 0;\n\n updatedState.userScrolledToBottom = userScrolledToBottom;\n\n if (this.props.isMobileView) {\n if (!this.state.isScrolling) {\n updatedState.isScrolling = true;\n }\n\n if (this.scrollStopAction) {\n this.scrollStopAction.fireAfter(Constants.SCROLL_DELAY);\n }\n }\n }\n\n if (userScrolledToBottom) {\n updatedState.lastViewedBottom = Date.now();\n }\n\n this.setState(updatedState as State);\n };\n\n updateFloatingTimestamp = (visibleTopItem: number) => {\n if (!this.props.replyListIds) {\n return;\n }\n\n this.setState({\n topRhsPostId: getLatestPostId(this.props.replyListIds.slice(visibleTopItem)),\n });\n };\n\n onItemsRendered = ({\n visibleStartIndex,\n visibleStopIndex,\n overscanStartIndex,\n overscanStopIndex,\n }: OnItemsRenderedArgs) => {\n if (this.props.isMobileView) {\n this.updateFloatingTimestamp(visibleStartIndex);\n }\n this.setState({\n visibleStartIndex,\n visibleStopIndex,\n overscanStartIndex,\n overscanStopIndex,\n });\n };\n\n getInitialPostIndex = (): number => {\n let postIndex = 0;\n\n if (this.props.highlightedPostId) {\n postIndex = this.props.replyListIds.findIndex((postId) => postId === this.props.highlightedPostId);\n } else {\n postIndex = getNewMessagesIndex(this.props.replyListIds);\n }\n\n return postIndex === -1 ? 0 : postIndex;\n };\n\n handleScrollToFailed = (index: number) => {\n if (index < 0 || index >= this.props.replyListIds.length) {\n return;\n }\n const {overscanStopIndex, overscanStartIndex} = this.state;\n\n if (overscanStartIndex != null && index < overscanStartIndex) {\n this.scrollToItemCorrection(index, Math.max(overscanStartIndex + 1, 0));\n }\n\n if (overscanStopIndex != null && index > overscanStopIndex) {\n this.scrollToItemCorrection(index, Math.min(overscanStopIndex - 1, this.props.replyListIds.length - 1));\n }\n };\n\n scrollToItemCorrection = (index: number, nearIndex: number) => {\n // stop after 10 times so we won't end up in an infinite loop\n if (this.scrollShortCircuit > 10) {\n return;\n }\n\n this.scrollShortCircuit++;\n\n // this should not trigger a failure to scroll\n // it should always be an index in between rendered items (overscanStartIndex < nearIndex < overscanStopIndex)\n this.scrollToItem(nearIndex, 'start');\n\n window.requestAnimationFrame(() => {\n this.scrollToItem(index, 'start');\n });\n };\n\n scrollToItem = (index: number, position: string, offset?: number) => {\n if (this.listRef.current) {\n this.listRef.current.scrollToItem(index, position, offset);\n }\n };\n\n scrollToBottom = () => {\n this.scrollToItem(0, 'end');\n };\n\n handleToastDismiss = () => {\n this.setState({lastViewedBottom: Date.now()});\n };\n\n handleToastClick = () => {\n const index = getNewMessagesIndex(this.props.replyListIds);\n if (index >= 0) {\n this.scrollToItem(index, 'start', OFFSET_TO_SHOW_TOAST);\n } else {\n this.scrollToBottom();\n }\n };\n\n scrollToHighlightedPost = () => {\n const {highlightedPostId, replyListIds} = this.props;\n\n if (highlightedPostId) {\n this.setState({userScrolledToBottom: false}, () => {\n this.scrollToItem(replyListIds.indexOf(highlightedPostId), 'center');\n });\n }\n };\n\n handleScrollStop = () => {\n if (this.mounted) {\n this.setState({isScrolling: false});\n }\n };\n\n renderRow = ({data, itemId, style}: {data: any; itemId: any; style: any}) => {\n const index = data.indexOf(itemId);\n let className = '';\n let a11yIndex = 0;\n const basePaddingClass = 'post-row__padding';\n const previousItemId = (index !== -1 && index < data.length - 1) ? data[index + 1] : '';\n const nextItemId = (index > 0 && index < data.length) ? data[index - 1] : '';\n\n if (isDateLine(nextItemId) || isStartOfNewMessages(nextItemId)) {\n className += basePaddingClass + ' bottom';\n }\n\n if (isDateLine(previousItemId) || isStartOfNewMessages(previousItemId)) {\n if (className.includes(basePaddingClass)) {\n className += ' top';\n } else {\n className += basePaddingClass + ' top';\n }\n }\n\n const isLastPost = itemId === this.props.lastPost.id;\n const isRootPost = itemId === this.props.selected.id;\n\n if (!isDateLine(itemId) && !isStartOfNewMessages(itemId) && !isCreateComment(itemId) && !isRootPost) {\n a11yIndex++;\n }\n\n return (\n <div\n style={style}\n className={className}\n >\n <Row\n a11yIndex={a11yIndex}\n currentUserId={this.props.currentUserId}\n isRootPost={isRootPost}\n isLastPost={isLastPost}\n listId={itemId}\n onCardClick={this.props.onCardClick}\n previousPostId={getPreviousPostId(data, index)}\n timestampProps={this.props.useRelativeTimestamp ? THREADING_TIME : undefined}\n threadId={this.props.selected.id}\n newMessagesSeparatorActions={this.props.newMessagesSeparatorActions}\n />\n </div>\n );\n };\n\n getInnerStyles = (): React.CSSProperties|undefined => {\n if (!this.props.useRelativeTimestamp) {\n return innerStyles;\n }\n\n return undefined;\n };\n\n isNewMessagesVisible = (): boolean => {\n const {visibleStopIndex} = this.state;\n const newMessagesSeparatorIndex = getNewMessagesIndex(this.props.replyListIds);\n if (visibleStopIndex != null) {\n return visibleStopIndex < newMessagesSeparatorIndex;\n }\n return false;\n };\n\n renderToast = (width: number) => {\n const {visibleStopIndex, lastViewedBottom, userScrolledToBottom} = this.state;\n const canShow =\n visibleStopIndex !== 0 &&\n !this.isNewMessagesVisible() &&\n !userScrolledToBottom;\n\n return (\n <NewRepliesBanner\n threadId={this.props.selected.id}\n lastViewedBottom={lastViewedBottom}\n canShow={canShow}\n onDismiss={this.handleToastDismiss}\n width={width}\n onClick={this.handleToastClick}\n />\n );\n };\n\n render() {\n const {topRhsPostId} = this.state;\n\n return (\n <div className='virtual-list__ctr'>\n {this.props.isMobileView && topRhsPostId && !this.props.useRelativeTimestamp && (\n <FloatingTimestamp\n isRhsPost={true}\n isScrolling={this.state.isScrolling}\n postId={topRhsPostId}\n />\n )}\n <div\n role='application'\n aria-label={Utils.localizeMessage({id: 'accessibility.sections.rhsContent', defaultMessage: 'message details complimentary region'})}\n className='post-right__content a11y__region'\n style={{height: '100%'}}\n data-a11y-sort-order='3'\n data-a11y-focus-child={true}\n data-a11y-order-reversed={true}\n >\n <AutoSizer>\n {({width, height}) => (\n <>\n <DynamicSizeList\n canLoadMorePosts={this.canLoadMorePosts}\n height={height}\n initRangeToRender={this.initRangeToRender}\n initScrollToIndex={this.initScrollToIndex}\n innerListStyle={this.getInnerStyles()}\n innerRef={this.innerRef}\n itemData={this.props.replyListIds}\n scrollToFailed={this.handleScrollToFailed}\n onItemsRendered={this.onItemsRendered}\n onScroll={this.handleScroll}\n overscanCountBackward={OVERSCAN_COUNT_BACKWARD}\n overscanCountForward={OVERSCAN_COUNT_FORWARD}\n ref={this.listRef}\n style={virtListStyles}\n width={width}\n className={'post-list__dynamic--RHS'}\n correctScrollToBottom={true}\n >\n {this.renderRow}\n </DynamicSizeList>\n {this.renderToast(width)}\n </>\n )}\n </AutoSizer>\n </div>\n <CreateComment\n placeholder={this.props.inputPlaceholder}\n isThreadView={this.props.isThreadView}\n teammate={this.props.directTeammate}\n threadId={this.props.selected.id}\n />\n </div>\n );\n }\n}\n\nexport default ThreadViewerVirtualized;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {measureRhsOpened} from 'actions/views/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\nimport {makePrepareReplyIdsForThreadViewer, makeGetThreadLastViewedAt} from 'selectors/views/threads';\n\nimport type {GlobalState} from 'types/store';\nimport type {FakePost} from 'types/store/rhs';\n\nimport ThreadViewerVirtualized from './virtualized_thread_viewer';\n\ntype OwnProps = {\n channelId: string;\n postIds: Array<Post['id'] | FakePost['id']>;\n selected: Post | FakePost;\n useRelativeTimestamp: boolean;\n onCardClick: (post: Post) => void;\n}\n\nfunction makeMapStateToProps() {\n const getRepliesListWithSeparators = makePrepareReplyIdsForThreadViewer();\n const getThreadLastViewedAt = makeGetThreadLastViewedAt();\n\n return (state: GlobalState, ownProps: OwnProps) => {\n const {postIds, useRelativeTimestamp, selected, channelId} = ownProps;\n\n const collapsedThreads = isCollapsedThreadsEnabled(state);\n const currentUserId = getCurrentUserId(state);\n const lastViewedAt = getThreadLastViewedAt(state, selected.id);\n const directTeammate = getDirectTeammate(state, channelId);\n\n const lastPost = getPost(state, postIds[0]);\n\n const replyListIds = getRepliesListWithSeparators(state, {\n postIds,\n showDate: !useRelativeTimestamp,\n lastViewedAt: collapsedThreads ? lastViewedAt : undefined,\n });\n const newMessagesSeparatorActions = state.plugins.components.NewMessagesSeparatorAction;\n\n return {\n currentUserId,\n directTeammate,\n isMobileView: getIsMobileView(state),\n lastPost,\n replyListIds,\n newMessagesSeparatorActions,\n };\n };\n}\n\nconst mapDispatchToProps = {\n measureRhsOpened,\n};\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ThreadViewerVirtualized);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {HTMLAttributes} from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserThread} from '@mattermost/types/threads';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport deferComponentRender from 'components/deferComponentRender';\nimport FileUploadOverlay from 'components/file_upload_overlay';\nimport {DropOverlayIdThreads} from 'components/file_upload_overlay/file_upload_overlay';\nimport LoadingScreen from 'components/loading_screen';\n\nimport WebSocketClient from 'client/web_websocket_client';\n\nimport type {FakePost} from 'types/store/rhs';\n\nimport ThreadViewerVirtualized from '../virtualized_thread_viewer';\n\nimport './thread_viewer.scss';\n\nconst DeferredThreadViewerVirt = deferComponentRender(ThreadViewerVirtualized);\n\ntype Attrs = Pick<HTMLAttributes<HTMLDivElement>, 'className' | 'id'>;\n\nexport type Props = Attrs & {\n isCollapsedThreadsEnabled: boolean;\n appsEnabled: boolean;\n userThread?: UserThread | null;\n channel?: Channel;\n selected?: Post | FakePost;\n currentUserId: string;\n currentTeamId: string;\n socketConnectionStatus: boolean;\n actions: {\n fetchRHSAppsBindings: (channelId: string, rootID: string) => unknown;\n getNewestPostThread: (rootId: string) => Promise<ActionResult>;\n getPostThread: (rootId: string, fetchThreads: boolean) => Promise<ActionResult>;\n getThread: (userId: string, teamId: string, threadId: string, extended: boolean) => Promise<ActionResult>;\n selectPostCard: (post: Post) => void;\n updateThreadLastOpened: (threadId: string, lastViewedAt: number) => unknown;\n updateThreadRead: (userId: string, teamId: string, threadId: string, timestamp: number) => unknown;\n };\n useRelativeTimestamp?: boolean;\n postIds: string[];\n highlightedPostId?: Post['id'];\n selectedPostFocusedAt?: number;\n isThreadView: boolean;\n inputPlaceholder?: string;\n rootPostId: string;\n enableWebSocketEventScope: boolean;\n};\n\ntype State = {\n isLoading: boolean;\n}\n\nexport default class ThreadViewer extends React.PureComponent<Props, State> {\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n isLoading: false,\n };\n }\n\n public componentDidMount() {\n if (this.props.isCollapsedThreadsEnabled && this.props.userThread !== null) {\n this.markThreadRead();\n }\n\n this.onInit();\n\n if (this.props.appsEnabled) {\n this.props.actions.fetchRHSAppsBindings(this.props.channel?.id || '', this.props.selected?.id || this.props.rootPostId);\n }\n }\n\n public componentWillUnmount() {\n if (this.props.enableWebSocketEventScope) {\n WebSocketClient.updateActiveThread(this.props.isThreadView, '');\n }\n }\n\n public componentDidUpdate(prevProps: Props) {\n const reconnected = this.props.socketConnectionStatus && !prevProps.socketConnectionStatus;\n\n if (!this.props.selected) {\n return;\n }\n\n const selectedChanged = this.props.selected.id !== prevProps.selected?.id;\n\n if (reconnected || selectedChanged) {\n this.onInit(reconnected);\n }\n\n if (\n this.props.isCollapsedThreadsEnabled &&\n this.props.userThread?.id !== prevProps.userThread?.id\n ) {\n this.markThreadRead();\n }\n\n if (this.props.appsEnabled && (\n this.props.channel?.id !== prevProps.channel?.id || this.props.selected.id !== prevProps.selected?.id\n )) {\n this.props.actions.fetchRHSAppsBindings(this.props.channel?.id || '', this.props.selected.id);\n }\n }\n\n public morePostsToFetch(): boolean {\n const replyCount = this.getReplyCount();\n return Boolean(this.props.selected) && this.props.postIds.length < (replyCount + 1);\n }\n\n public getReplyCount(): number {\n return (this.props.selected as Post)?.reply_count || this.props.userThread?.reply_count || 0;\n }\n\n fetchThread() {\n const {\n actions: {\n getThread,\n },\n currentUserId,\n currentTeamId,\n selected,\n } = this.props;\n\n if (selected && this.getReplyCount() && (this.props.selected as Post)?.is_following) {\n return getThread(\n currentUserId,\n currentTeamId,\n selected.id,\n true,\n );\n }\n\n return Promise.resolve({data: true});\n }\n\n markThreadRead() {\n if (this.props.userThread) {\n // update last viewed at for thread before marking as read.\n this.props.actions.updateThreadLastOpened(\n this.props.userThread.id,\n this.props.userThread.last_viewed_at,\n );\n\n if (\n this.props.userThread.last_viewed_at < this.props.userThread.last_reply_at ||\n this.props.userThread.unread_mentions ||\n this.props.userThread.unread_replies\n ) {\n this.props.actions.updateThreadRead(\n this.props.currentUserId,\n this.props.currentTeamId,\n this.props.selected?.id || this.props.rootPostId,\n Date.now(),\n );\n }\n }\n }\n\n // called either after mount, socket reconnected, or selected thread changed\n // fetches the thread/posts if needed and\n // scrolls to either bottom or new messages line\n private onInit = async (reconnected = false): Promise<void> => {\n this.setState({isLoading: !reconnected});\n await this.props.actions.getPostThread(this.props.selected?.id || this.props.rootPostId, !reconnected);\n\n if (\n this.props.isCollapsedThreadsEnabled &&\n this.props.userThread == null\n ) {\n await this.fetchThread();\n }\n\n if (this.props.channel && this.props.enableWebSocketEventScope) {\n WebSocketClient.updateActiveThread(this.props.isThreadView, this.props.channel?.id);\n }\n this.setState({isLoading: false});\n };\n\n private handleCardClick = (post: Post) => {\n if (!post) {\n return;\n }\n\n this.props.actions.selectPostCard(post);\n };\n\n public render(): JSX.Element {\n if (this.props.postIds == null || this.props.selected == null || !this.props.channel) {\n return (\n <span/>\n );\n }\n\n if (this.state.isLoading && this.props.postIds.length < 2) {\n return (\n <LoadingScreen\n style={{\n display: 'grid',\n placeContent: 'center',\n flex: '1',\n }}\n />\n );\n }\n\n return (\n <>\n <div className={classNames('ThreadViewer', this.props.className)}>\n <div className='post-right-comments-container'>\n <>\n <FileUploadOverlay\n overlayType='right'\n id={DropOverlayIdThreads}\n />\n {this.props.selected && (\n <DeferredThreadViewerVirt\n inputPlaceholder={this.props.inputPlaceholder}\n key={this.props.selected.id}\n channelId={this.props.channel.id}\n onCardClick={this.handleCardClick}\n postIds={this.props.postIds}\n selected={this.props.selected}\n useRelativeTimestamp={this.props.useRelativeTimestamp || false}\n highlightedPostId={this.props.highlightedPostId}\n selectedPostFocusedAt={this.props.selectedPostFocusedAt}\n isThreadView={Boolean(this.props.isCollapsedThreadsEnabled && this.props.isThreadView)}\n />\n )}\n </>\n </div>\n </div>\n </>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {ClientConfig} from '@mattermost/types/config';\nimport type {UserThread} from '@mattermost/types/threads';\n\nimport {fetchRHSAppsBindings} from 'mattermost-redux/actions/apps';\nimport {getNewestPostThread, getPostThread} from 'mattermost-redux/actions/posts';\nimport {getThread as fetchThread, updateThreadRead} from 'mattermost-redux/actions/threads';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {makeGetChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getPost, makeGetPostIdsForThread} from 'mattermost-redux/selectors/entities/posts';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getThread} from 'mattermost-redux/selectors/entities/threads';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {selectPostCard} from 'actions/views/rhs';\nimport {updateThreadLastOpened} from 'actions/views/threads';\nimport {getHighlightedPostId, getSelectedPostFocussedAt} from 'selectors/rhs';\nimport {getSocketStatus} from 'selectors/views/websocket';\n\nimport type {GlobalState} from 'types/store';\n\nimport ThreadViewer from './thread_viewer';\n\ntype OwnProps = {\n rootPostId: string;\n};\n\nfunction makeMapStateToProps() {\n const getPostIdsForThread = makeGetPostIdsForThread();\n const getChannel = makeGetChannel();\n\n return function mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const currentUserId = getCurrentUserId(state);\n const currentTeamId = getCurrentTeamId(state);\n const selected = getPost(state, ownProps.rootPostId);\n const socketStatus = getSocketStatus(state);\n const highlightedPostId = getHighlightedPostId(state);\n const selectedPostFocusedAt = getSelectedPostFocussedAt(state);\n const config: Partial<ClientConfig> = getConfig(state);\n const enableWebSocketEventScope = config.FeatureFlagWebSocketEventScope === 'true';\n\n let postIds: string[] = [];\n let userThread: UserThread | null = null;\n let channel: Channel | undefined;\n\n if (selected) {\n postIds = getPostIdsForThread(state, selected.id);\n userThread = getThread(state, selected.id);\n channel = getChannel(state, selected.channel_id);\n }\n\n return {\n isCollapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n appsEnabled: appsEnabled(state),\n currentUserId,\n currentTeamId,\n userThread,\n selected,\n postIds,\n socketConnectionStatus: socketStatus.connected,\n channel,\n highlightedPostId,\n selectedPostFocusedAt,\n enableWebSocketEventScope,\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n fetchRHSAppsBindings,\n getNewestPostThread,\n getPostThread,\n getThread: fetchThread,\n selectPostCard,\n updateThreadLastOpened,\n updateThreadRead,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ThreadViewer);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {RangeDescriptor} from './timestamp';\n\nexport const TODAY_YESTERDAY: RangeDescriptor = {\n within: ['day', -1],\n display: ['day'],\n};\n\nexport const TODAY_TITLE_CASE: RangeDescriptor = {\n equals: ['day', 0],\n display: (\n <FormattedMessage\n id='date_separator.today'\n defaultMessage='Today'\n />\n ),\n};\n\nexport const YESTERDAY_TITLE_CASE: RangeDescriptor = {\n equals: ['day', -1],\n display: (\n <FormattedMessage\n id='date_separator.yesterday'\n defaultMessage='Yesterday'\n />\n ),\n};\n\nexport const TOMORROW_TITLE_CASE: RangeDescriptor = {\n equals: ['day', 1],\n display: (\n <FormattedMessage\n id='date_separator.tomorrow'\n defaultMessage='Tomorrow'\n />\n ),\n};\n\nexport const STANDARD_UNITS: {[key: string]: RangeDescriptor} = {\n now: {within: ['second', -45], display: ['second', 0]},\n second: {within: ['second', -59], display: ['second']},\n minute: {within: ['minute', -59], display: ['minute']},\n hour: {within: ['hour', -23.75], display: ['hour']},\n 'today-yesterday': TODAY_YESTERDAY,\n Today: TODAY_TITLE_CASE,\n Yesterday: YESTERDAY_TITLE_CASE,\n day: {within: ['day', -6], display: ['day']},\n week: {within: ['week', -3], display: ['week']},\n month: {within: ['month', -11], display: ['month']},\n quarter: {within: ['quarter', -3], display: ['quarter']},\n year: {within: ['year', -1000], display: ['year']},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\ntype ResolvableFunction<TVal, TArg, TArg2> = (arg: TArg, arg2: TArg2) => TVal;\n\nexport type Resolvable<TVal, TArg = undefined, TArg2 = undefined> = ResolvableFunction<TVal, TArg, TArg2> | TVal;\n\nexport function resolve<TVal, TArg = undefined, TArg2 = undefined>(\n prop: Resolvable<TVal, TArg, TArg2>,\n arg: TArg,\n arg2: TArg2,\n): TVal {\n return typeof prop === 'function' ? (prop as ResolvableFunction<TVal, TArg, TArg2>)(arg, arg2) : prop;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {DateTime} from 'luxon';\nimport React, {memo} from 'react';\nimport type {FC, ReactNode, TimeHTMLAttributes} from 'react';\n\nexport type Props = {\n value: Date;\n children?: ReactNode;\n} & TimeHTMLAttributes<HTMLTimeElement>;\n\nconst SemanticTime: FC<Props> = ({\n value,\n children,\n ...props\n}: Props) => {\n return (\n <time\n {...props}\n dateTime={DateTime.fromJSDate(value).toLocal().toISO({includeOffset: false})}\n >\n {children}\n </time>\n );\n};\n\nexport default memo(SemanticTime);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport caps from 'lodash/capitalize';\nimport isArray from 'lodash/isArray';\nimport type {Moment} from 'moment-timezone';\nimport moment from 'moment-timezone';\nimport React, {PureComponent} from 'react';\nimport type {ReactNode} from 'react';\nimport {\n injectIntl,\n FormattedMessage,\n} from 'react-intl';\nimport type {\n IntlShape,\n FormatDateOptions,\n FormatRelativeTimeOptions} from 'react-intl';\nimport {isValidElementType} from 'react-is';\n\nimport type {RequireOnlyOne} from '@mattermost/types/utilities';\n\nimport {isSameYear, isWithin, isEqual, getDiff} from 'utils/datetime';\nimport {resolve} from 'utils/resolvable';\nimport type {Resolvable} from 'utils/resolvable';\n\nimport {STANDARD_UNITS} from './relative_ranges';\nimport SemanticTime from './semantic_time';\n\n// Feature test the browser for support of hourCycle.\n// Note that Intl.DateTimeFormatOptions typings are stale and do not have definitions of hourCycle, dateStyle, etc..\n// See https://github.com/microsoft/TypeScript/issues/34399\nexport const supportsHourCycle = Boolean(((new Intl.DateTimeFormat('en-US', {hour: 'numeric'})).resolvedOptions() as DateTimeOptions).hourCycle);\n\nexport type DateTimeOptions = FormatDateOptions & {\n hourCycle?: string;\n}\n\nfunction is12HourTime(hourCycle: DateTimeOptions['hourCycle'], hour12?: DateTimeOptions['hour12']) {\n return hour12 ?? !(hourCycle === 'h23' || hourCycle === 'h24');\n}\n\nexport type RelativeOptions = FormatRelativeTimeOptions & {\n unit: Intl.RelativeTimeFormatUnit;\n relNearest?: number;\n truncateEndpoints?: boolean;\n updateIntervalInSeconds?: number;\n capitalize?: boolean;\n}\n\nfunction isRelative(format: ResolvedFormats['relative']): format is RelativeOptions {\n return Boolean((format as RelativeOptions)?.unit);\n}\n\nexport type SimpleRelativeOptions = {\n message: ReactNode;\n updateIntervalInSeconds?: number;\n}\n\nfunction isSimpleRelative(format: unknown): format is SimpleRelativeOptions {\n return (format as SimpleRelativeOptions)?.message != null;\n}\n\nconst defaultRefreshIntervals = new Map<Intl.RelativeTimeFormatUnit, number /* seconds */>([\n ['hour', 60 * 5],\n ['minute', 15],\n ['second', 1],\n]);\n\ntype UnitDescriptor = [Intl.RelativeTimeFormatUnit, number?, boolean?];\n\nfunction isUnitDescriptor(unit: unknown): unit is UnitDescriptor {\n return isArray(unit) && typeof unit[0] === 'string';\n}\n\ntype Breakpoint = RequireOnlyOne<{\n within: UnitDescriptor;\n equals: UnitDescriptor;\n}>\n\ntype DisplayAs = {\n display: UnitDescriptor | ReactNode;\n updateIntervalInSeconds?: number;\n capitalize?: boolean;\n}\n\nexport type RangeDescriptor = Breakpoint & DisplayAs;\n\nfunction normalizeRangeDescriptor(unit: NonNullable<Props['units']>[number]): RangeDescriptor {\n if (typeof unit === 'string' || typeof unit === 'number') {\n return STANDARD_UNITS[unit];\n }\n if (isUnitDescriptor(unit)) {\n const [u, n] = unit;\n return {within: [u, n], display: [u]};\n }\n return unit;\n}\n\nexport type ResolvedFormats = {\n relative: RelativeOptions | SimpleRelativeOptions | false;\n date: DateTimeOptions | false;\n time: DateTimeOptions | false;\n}\n\ntype FormattedParts = {\n relative?: ReactNode;\n date?: ReactNode;\n time?: ReactNode;\n}\n\ntype FormatOptions = DateTimeOptions & Partial<RelativeOptions>;\n\nexport type Props = FormatOptions & {\n value?: ConstructorParameters<typeof Date>[0];\n\n useRelative?: Resolvable<ResolvedFormats['relative'], {value: Date}, FormatOptions>;\n units?: Array<RangeDescriptor | UnitDescriptor | Intl.RelativeTimeFormatUnit | keyof typeof STANDARD_UNITS>;\n ranges?: Props['units'];\n useDate?: Resolvable<Exclude<ResolvedFormats['date'], 'timeZone'> | false, {value: Date}, FormatOptions>;\n useTime?: Resolvable<Exclude<ResolvedFormats['time'], 'timeZone' | 'hourCycle' | 'hour12'> | false, {value: Date}, FormatOptions>;\n\n children?: Resolvable<ReactNode, {value: Date; timeZone: DateTimeOptions['timeZone']; formatted: ReactNode} & FormattedParts, ResolvedFormats>;\n className?: string;\n label?: string;\n useSemanticOutput?: boolean;\n\n intl: IntlShape;\n}\n\ntype State = {\n now: Date;\n prevValue: Props['value'];\n}\n\n/**\n * A feature-rich, react-intl oriented wrapper around Intl.DateTimeFormat and Intl.RelativeTimeFormat.\n *\n * If (for some odd reason) Intl.DateTimeFormat does not support the specified timezone, Moment will be used as a fallback formatter.\n * This fallback implementation only supports the following non-localized formats:\n *\n * TIME:\n * - `h:mm A`\n * - `HH:mm`\n *\n * DATE:\n * - `dddd`\n * - `MMMM DD`\n * - `MMMM DD, YYYY`\n * - `dddd, MMMM DD, YYYY`\n *\n * `DateTimeOptions.hourCycle` is preferred over `DateTimeOptions.hour12`.\n *\n * `hour12` will override the specified `hourCycle` and will defer to the default locale `hourCycle`.\n * This might result in `H24` behavior. (See https://github.com/formatjs/formatjs/issues/1577)\n *\n * @remarks Fallback-formatting should be rare, as `Intl.DateTimeFormat` (in Chrome, Safari, FF, and Edge) supports all timezones that are supported by `moment-timezone`.\n */\nclass Timestamp extends PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n now: new Date(),\n prevValue: props.value,\n };\n }\n\n static defaultProps: Partial<Props> = {\n\n // relative\n numeric: 'auto',\n style: 'long',\n relNearest: 1,\n\n // fixed\n year: 'numeric',\n month: 'long',\n day: '2-digit',\n weekday: 'long',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n hourCycle: 'h12',\n timeZoneName: 'short',\n };\n nextUpdate: ReturnType<typeof setTimeout> | null = null;\n mounted = false;\n\n componentDidMount() {\n this.mounted = true;\n }\n\n formatParts(value: Date, {relative: relFormat, date: dateFormat, time: timeFormat}: ResolvedFormats): FormattedParts {\n try {\n let relative: FormattedParts['relative'];\n let date: FormattedParts['date'];\n let time: FormattedParts['time'];\n\n if (isSimpleRelative(relFormat)) {\n relative = relFormat.message;\n } else if (isRelative(relFormat)) {\n relative = this.formatRelative(value, relFormat);\n\n if (relFormat.unit !== 'day' || !timeFormat) {\n return {relative};\n }\n }\n\n if (relative == null && dateFormat) {\n date = this.formatDateTime(value, dateFormat);\n }\n\n if (timeFormat) {\n const {\n hourCycle,\n hour12 = supportsHourCycle ? undefined : is12HourTime(hourCycle),\n } = this.props;\n\n time = this.formatDateTime(value, {hourCycle, hour12, ...timeFormat});\n }\n\n return {relative, date, time};\n } catch {\n // fallback to moment for unsupported timezones\n const {timeZone, hourCycle, hour12} = this.props;\n\n const momentValue = moment.utc(value.getTime());\n\n if (timeZone) {\n momentValue.tz(timeZone);\n }\n\n return {\n date: dateFormat && Timestamp.momentDate(momentValue, {...dateFormat}),\n time: timeFormat && Timestamp.momentTime(momentValue, {hourCycle, hour12, ...timeFormat}),\n };\n }\n }\n\n formatRelative(value: Date, {unit, relNearest, truncateEndpoints, ...format}: RelativeOptions): string {\n let diff: number;\n\n if (relNearest === 0) {\n diff = 0;\n } else {\n diff = getDiff(value, this.state.now, this.props.timeZone, unit, truncateEndpoints);\n if (relNearest != null) {\n diff = Math.round(diff / relNearest) * relNearest;\n }\n }\n\n if (diff === 0) {\n diff = value <= this.state.now ? -0 : +0;\n }\n\n const rel = this.props.intl.formatRelativeTime(diff, unit, format);\n return format.capitalize ? caps(rel) : rel;\n }\n\n formatDateTime(value: Date, format: DateTimeOptions): string {\n const {timeZone, intl: {locale}} = this.props;\n\n return (new Intl.DateTimeFormat(locale, {timeZone, ...format} as any)).format(value); // TODO remove any when React-Intl is next updated\n }\n\n static momentTime(value: Moment, {hour, minute, hourCycle, hour12}: DateTimeOptions): string | undefined {\n if (hour && minute) {\n return value.format(is12HourTime(hourCycle, hour12) ? 'h:mm A' : 'HH:mm');\n }\n return undefined;\n }\n\n static momentDate(value: Moment, {weekday, day, month, year}: DateTimeOptions): string | undefined {\n if (weekday && day && month && year) {\n return value.format('dddd, MMMM DD, YYYY');\n } else if (day && month && year) {\n return value.format('MMMM DD, YYYY');\n } else if (day && month) {\n return value.format('MMMM DD');\n } else if (weekday) {\n return value.format('dddd');\n }\n return undefined;\n }\n\n autoRange(value: Date, units: Props['units'] = (this.props.units || this.props.ranges)): DisplayAs {\n return units?.map(normalizeRangeDescriptor).find(({equals, within}) => {\n if (equals != null) {\n return isEqual(value, this.state.now, this.props.timeZone, ...equals);\n }\n if (within != null) {\n return isWithin(value, this.state.now, this.props.timeZone, ...within);\n }\n return false;\n }) ?? {\n display: [this.props.unit],\n updateIntervalInSeconds: this.props.updateIntervalInSeconds,\n };\n }\n\n private getFormats(value: Date): ResolvedFormats {\n const {\n numeric,\n style,\n useRelative = (): ResolvedFormats['relative'] => {\n const {\n display,\n updateIntervalInSeconds = this.props.updateIntervalInSeconds,\n capitalize = this.props.capitalize,\n } = this.autoRange(value);\n\n if (display) {\n if (isValidElementType(display) || !Array.isArray(display)) {\n return {\n message: display,\n updateIntervalInSeconds,\n };\n }\n\n const [\n unit,\n relNearest = this.props.relNearest,\n truncateEndpoints = this.props.truncateEndpoints,\n ] = display as UnitDescriptor;\n\n if (unit) {\n return {\n unit,\n relNearest,\n truncateEndpoints,\n numeric,\n style,\n updateIntervalInSeconds: updateIntervalInSeconds ?? defaultRefreshIntervals.get(unit),\n capitalize,\n };\n }\n }\n\n return false;\n },\n year,\n month,\n day,\n weekday,\n hour,\n minute,\n timeZone,\n useDate = (): ResolvedFormats['date'] => {\n if (isWithin(value, this.state.now, timeZone, 'day', -6)) {\n return {weekday};\n }\n if (isSameYear(value)) {\n return {day, month};\n }\n\n return {year, month, day};\n },\n useTime = {hour, minute},\n } = this.props;\n\n const relative = resolve(useRelative, {value}, this.props);\n const date = !relative && resolve(useDate, {value}, this.props);\n const time = resolve(useTime, {value}, this.props);\n\n return {relative, date, time};\n }\n\n componentWillUnmount() {\n this.mounted = false;\n if (this.nextUpdate) {\n clearTimeout(this.nextUpdate);\n this.nextUpdate = null;\n }\n }\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if (props.value !== state.prevValue) {\n return ({now: new Date(), prevValue: props.value});\n }\n\n return null;\n }\n\n private maybeUpdate(relative: ResolvedFormats['relative']): ReturnType<typeof setTimeout> | null {\n if (!relative ||\n !relative.updateIntervalInSeconds) {\n return null;\n }\n return setTimeout(() => {\n if (this.mounted) {\n this.setState({now: new Date()});\n }\n }, relative.updateIntervalInSeconds * 1000);\n }\n\n static format({relative, date, time}: FormattedParts): ReactNode {\n return (relative || date) && time ? (\n <FormattedMessage\n id='timestamp.datetime'\n defaultMessage='{relativeOrDate} at {time}'\n values={{\n relativeOrDate: relative || date,\n time,\n }}\n />\n ) : relative || date || time;\n }\n\n static formatLabel(value: Date, timeZone?: string) {\n const momentValue = moment(value);\n\n if (timeZone) {\n momentValue.tz(timeZone);\n }\n\n return momentValue.toString() + (timeZone ? ` (${momentValue.tz()})` : '');\n }\n\n render() {\n const {\n value: unparsed = this.state.now,\n children,\n useSemanticOutput = true,\n timeZone,\n label,\n className,\n } = this.props;\n\n const value = unparsed instanceof Date ? unparsed : new Date(unparsed);\n const formats = this.getFormats(value);\n const parts = this.formatParts(value, formats);\n let formatted = Timestamp.format(parts);\n\n if (useSemanticOutput) {\n formatted = (\n <SemanticTime\n value={value}\n aria-label={label}\n className={className}\n >\n {formatted}\n </SemanticTime>\n );\n }\n\n this.nextUpdate = this.maybeUpdate(formats.relative);\n\n if (children) {\n return resolve(children, {value, timeZone, formatted, ...parts}, formats);\n }\n\n return formatted;\n }\n}\n\nexport default injectIntl(Timestamp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {UserTimezone} from '@mattermost/types/users';\n\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTimezoneFull} from 'mattermost-redux/selectors/entities/timezone';\nimport {getUserCurrentTimezone} from 'mattermost-redux/utils/timezone_utils';\n\nimport {Preferences} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport * as RelativeRanges from './relative_ranges';\nimport Timestamp, {supportsHourCycle} from './timestamp';\nimport type {Props as TimestampProps} from './timestamp';\n\ntype Props = {\n userTimezone?: UserTimezone;\n hour12?: TimestampProps['hour12'];\n timeZone?: TimestampProps['timeZone'];\n hourCycle?: TimestampProps['hourCycle'];\n}\n\nexport function mapStateToProps(state: GlobalState, ownProps: Props) {\n const timeZone: TimestampProps['timeZone'] = getUserCurrentTimezone(ownProps.userTimezone ?? getCurrentTimezoneFull(state)) || undefined;\n let hourCycle: TimestampProps['hourCycle'];\n let hour12: TimestampProps['hour12'];\n\n const useMilitaryTime = getBool(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.USE_MILITARY_TIME, false);\n\n if (supportsHourCycle) {\n hourCycle = ownProps.hourCycle || (useMilitaryTime ? 'h23' : 'h12');\n } else {\n hour12 = ownProps.hour12 ?? (!useMilitaryTime);\n }\n\n return {timeZone: ownProps.timeZone || timeZone, hourCycle, hour12};\n}\n\nexport default connect(mapStateToProps)(Timestamp);\n\nexport {default as SemanticTime} from './semantic_time';\nexport {RelativeRanges};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function UnreadAboveIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span\n {...props}\n >\n {/* TODO: should replace transform css to svg */}\n <svg\n style={{transform: 'scaleY(-1)'}}\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n viewBox='0 0 16 16'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.arrow.up', defaultMessage: 'Up Arrow Icon'})}\n >\n <path d='M8.696 2H7.184V11L3.062 6.878L2 7.94L7.94 13.88L13.88 7.94L12.818 6.878L8.696 11V2Z'/>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ReactNode, MouseEventHandler} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport CloseIcon from 'components/widgets/icons/close_icon';\nimport UnreadAboveIcon from 'components/widgets/icons/unread_above_icon';\nimport UnreadBelowIcon from 'components/widgets/icons/unread_below_icon';\nimport WithTooltip from 'components/with_tooltip';\n\nimport Constants from 'utils/constants';\n\nimport './toast.scss';\n\nexport type Props = {\n onClick?: MouseEventHandler<HTMLDivElement>;\n onClickMessage?: ReactNode;\n onDismiss?: () => void;\n children?: ReactNode;\n show: boolean;\n showActions?: boolean; //used for showing jump actions\n width: number;\n extraClasses?: string;\n jumpDirection?: 'up' | 'down';\n};\n\nexport default function Toast({\n onClick,\n onClickMessage,\n onDismiss,\n children,\n show,\n showActions,\n width,\n extraClasses = '',\n jumpDirection = 'down',\n}: Props) {\n function handleDismiss() {\n if (typeof onDismiss === 'function') {\n onDismiss();\n }\n }\n\n const toastClass = classNames('toast', {\n toast__visible: show,\n [extraClasses]: extraClasses.length > 0,\n });\n\n const toastActionClass = classNames('toast__message', {\n toast__pointer: showActions,\n });\n\n return (\n <div className={toastClass}>\n <div\n className={toastActionClass}\n onClick={showActions ? onClick : undefined}\n >\n {showActions && (\n <div className='toast__jump'>\n {jumpDirection === 'down' ? (<UnreadBelowIcon/>) : (<UnreadAboveIcon/>)}\n {width > Constants.MOBILE_SCREEN_WIDTH && onClickMessage}\n </div>\n )}\n {children}\n </div>\n <WithTooltip\n title={\n <>\n <FormattedMessage\n id='general_button.close'\n defaultMessage='Close'\n />\n <div className='tooltip__shortcut--txt'>\n <FormattedMessage\n id='general_button.esc'\n defaultMessage='esc'\n />\n </div>\n </>\n }\n disabled={!showActions || !show}\n >\n <div\n className='toast__dismiss'\n onClick={handleDismiss}\n data-testid={extraClasses ? `dismissToast-${extraClasses}` : 'dismissToast'}\n >\n <CloseIcon\n className='close-btn'\n id='dismissToast'\n />\n </div>\n </WithTooltip>\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\ntype Props = {\n onToggle: () => void;\n toggled?: boolean;\n disabled?: boolean;\n onText?: React.ReactNode;\n offText?: React.ReactNode;\n id?: string;\n overrideTestId?: boolean;\n size?: 'btn-lg' | 'btn-md' |'btn-sm';\n toggleClassName?: string;\n}\n\nconst Toggle: React.FC<Props> = (props: Props) => {\n const {\n onToggle,\n toggled,\n disabled,\n onText,\n offText,\n id,\n overrideTestId,\n size = 'btn-lg',\n toggleClassName = 'btn-toggle',\n } = props;\n let dataTestId = `${id}-button`;\n if (overrideTestId) {\n dataTestId = id || '';\n }\n\n const className = classNames(\n 'btn',\n size,\n toggleClassName,\n {\n active: toggled,\n disabled,\n },\n );\n\n return (\n <button\n data-testid={dataTestId}\n id={id}\n type='button'\n onClick={onToggle}\n className={className}\n aria-pressed={toggled ? 'true' : 'false'}\n disabled={disabled}\n >\n <div className='handle'/>\n {text(toggled, onText, offText)}\n </button>\n );\n};\n\nfunction text(toggled?: boolean, onText?: React.ReactNode, offText?: React.ReactNode): React.ReactNode | null {\n if ((toggled && !onText) || (!toggled && !offText)) {\n return null;\n }\n return (<div className={`bg-text ${toggled ? 'on' : 'off'}`}>{toggled ? onText : offText}</div>);\n}\n\nexport default Toggle;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {type ComponentType, type MouseEvent, type ReactNode} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {openModal} from 'actions/views/modals';\n\ntype Props = {\n ariaLabel?: string;\n children: ReactNode;\n modalId: string;\n dialogType: ComponentType<any>;\n dialogProps?: Record<string, any>;\n onClick?: () => void;\n className?: string;\n showUnread?: boolean;\n disabled?: boolean;\n id?: string;\n role?: string;\n};\n\nconst ToggleModalButton = ({\n ariaLabel,\n children,\n modalId,\n dialogType,\n dialogProps = {},\n onClick,\n className = '',\n showUnread,\n disabled,\n id,\n role,\n}: Props) => {\n const intl = useIntl();\n\n const dispatch = useDispatch();\n\n const show = (e: MouseEvent<HTMLButtonElement>) => {\n if (e) {\n e.preventDefault();\n }\n\n const modalData = {\n modalId,\n dialogProps,\n dialogType,\n };\n\n dispatch(openModal(modalData));\n };\n\n const ariaLabelElement = ariaLabel ? intl.formatMessage({\n id: 'accessibility.button.dialog',\n defaultMessage: '{dialogName} dialog',\n }, {\n dialogName: ariaLabel,\n }) : undefined;\n\n const badge = showUnread ? <span className={'unread-badge'}/> : null;\n\n // allow callers to provide an onClick which will be called before the modal is shown\n const clickHandler = (e: MouseEvent<HTMLButtonElement>) => {\n onClick?.();\n show(e);\n };\n\n return (\n <button\n className={'style--none ' + className}\n aria-label={ariaLabelElement}\n onClick={clickHandler}\n id={id}\n disabled={disabled}\n role={role}\n >\n {children}\n {badge}\n </button>\n );\n};\n\nexport default ToggleModalButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport const FINISHED = 999;\nexport const SKIPPED = 999;\n\nexport const ChannelsTourTelemetryPrefix = 'channels-tour';\nconst AutoStatusSuffix = '_auto_tour_status';\n\nexport const AutoTourStatus = {\n ENABLED: 1,\n DISABLED: 0,\n};\n\n// this should be used as for the tours related to channels\nexport const ChannelsTour = 'channels_tour';\n\nexport const OtherToolsTour = 'other_tools_tour';\n\nexport const TutorialTourName = {\n ONBOARDING_TUTORIAL_STEP: 'tutorial_step',\n ONBOARDING_TUTORIAL_STEP_FOR_GUESTS: 'tutorial_step_for_guest',\n CRT_TUTORIAL_STEP: 'crt_tutorial_step',\n CRT_THREAD_PANE_STEP: 'crt_thread_pane_step',\n AUTO_TOUR_STATUS: 'auto_tour_status',\n};\n\nexport const OnboardingTourSteps = {\n CHANNELS_AND_DIRECT_MESSAGES: 0,\n CREATE_AND_JOIN_CHANNELS: 1,\n INVITE_PEOPLE: 2,\n SEND_MESSAGE: 3,\n CUSTOMIZE_EXPERIENCE: 4,\n FINISHED,\n};\n\nexport const OnboardingTourStepsForGuestUsers = {\n SEND_MESSAGE: 0,\n CUSTOMIZE_EXPERIENCE: 1,\n FINISHED,\n};\n\nexport const CrtTutorialSteps = {\n WELCOME_POPOVER: 0,\n LIST_POPOVER: 1,\n UNREAD_POPOVER: 2,\n FINISHED,\n};\n\nexport const CrtTutorialTriggerSteps = {\n START: 0,\n STARTED: 1,\n FINISHED,\n};\n\nexport const TTNameMapToATStatusKey = {\n [TutorialTourName.ONBOARDING_TUTORIAL_STEP]: TutorialTourName.ONBOARDING_TUTORIAL_STEP + AutoStatusSuffix,\n [TutorialTourName.CRT_TUTORIAL_STEP]: 'crt_tutorial_auto_tour_status',\n [TutorialTourName.CRT_THREAD_PANE_STEP]: TutorialTourName.CRT_THREAD_PANE_STEP + AutoStatusSuffix,\n};\n\nexport const TTNameMapToTourSteps = {\n [TutorialTourName.ONBOARDING_TUTORIAL_STEP]: OnboardingTourSteps,\n [TutorialTourName.ONBOARDING_TUTORIAL_STEP_FOR_GUESTS]: OnboardingTourStepsForGuestUsers,\n [TutorialTourName.CRT_TUTORIAL_STEP]: CrtTutorialSteps,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type React from 'react';\n\nimport {FINISHED} from './constant';\n\nexport type ActionType = 'next' | 'prev' | 'dismiss' | 'jump' | 'skipped'\n\nexport interface ChannelsTourTipManager {\n show: boolean;\n currentStep: number;\n tourSteps: Record<string, number>;\n handleOpen: (e: React.MouseEvent) => void;\n handleSkip: (e: React.MouseEvent) => void;\n handleDismiss: (e: React.MouseEvent) => void;\n handlePrevious: (e: React.MouseEvent) => void;\n handleNext: (e: React.MouseEvent) => void;\n handleJump: (e: React.MouseEvent, jumpStep: number) => void;\n}\n\nexport const KeyCodes: Record<string, [string, number]> = {\n ENTER: ['Enter', 13],\n COMPOSING: ['Composing', 229],\n};\n\n// This is extracted from utils file to remove dependency on utils file of webapp\nexport function isKeyPressed(event: KeyboardEvent, key: [string, number]): boolean {\n // There are two types of keyboards\n // 1. English with different layouts(Ex: Dvorak)\n // 2. Different language keyboards(Ex: Russian)\n\n if (event.keyCode === KeyCodes.COMPOSING[1]) {\n return false;\n }\n\n // checks for event.key for older browsers and also for the case of different English layout keyboards.\n if (typeof event.key !== 'undefined' && event.key !== 'Unidentified' && event.key !== 'Dead') {\n const isPressedByCode = event.key === key[0] || event.key === key[0].toUpperCase();\n if (isPressedByCode) {\n return true;\n }\n }\n\n // used for different language keyboards to detect the position of keys\n return event.keyCode === key[1];\n}\n\nexport const getLastStep = (Steps: Record<string, number>) => {\n return Object.values(Steps).reduce((maxStep, candidateMaxStep) => {\n // ignore the \"opt out\" FINISHED step as the max step.\n if (candidateMaxStep > maxStep && candidateMaxStep !== FINISHED) {\n return candidateMaxStep;\n }\n return maxStep;\n }, Number.MIN_SAFE_INTEGER);\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\nimport type {Placement} from 'tippy.js';\n\nimport type {PunchOutCoordsHeightAndWidth} from '@mattermost/components';\nimport {TourTip} from '@mattermost/components';\n\nimport {useTourTipManager} from './tour_manager';\nimport {getLastStep} from './utils';\n\n// TODO MM-51399 These strings are properly defined in @mattermost/components, but the i18n tooling currently can't\n// find them there, so we've had to redefine them here\ndefineMessages({\n optOut: {\n id: 'tutorial_tip.out',\n defaultMessage: 'Opt out of these tips.',\n },\n seenBefore: {\n id: 'tutorial_tip.seen',\n defaultMessage: 'Seen this before? ',\n },\n});\n\nexport type ChannelsTourTipProps = {\n screen: JSX.Element;\n title: JSX.Element;\n imageURL?: string;\n overlayPunchOut: PunchOutCoordsHeightAndWidth | null;\n singleTip?: boolean;\n placement?: Placement;\n pulsatingDotPlacement?: Omit<Placement, 'auto'| 'auto-end'>;\n pulsatingDotTranslate?: {x: number; y: number};\n offset?: [number, number];\n width?: string | number;\n tourCategory: string;\n hideBackdrop?: boolean;\n tippyBlueStyle?: boolean;\n showOptOut?: boolean;\n interactivePunchOut?: boolean;\n}\n\nexport const ChannelsTourTip = ({\n title,\n screen,\n imageURL,\n overlayPunchOut,\n singleTip,\n pulsatingDotTranslate,\n pulsatingDotPlacement,\n offset = [-18, 4],\n placement = 'right-start',\n width = 320,\n tourCategory,\n hideBackdrop = false,\n tippyBlueStyle = false,\n showOptOut = true,\n interactivePunchOut = false,\n}: ChannelsTourTipProps) => {\n const {\n show,\n currentStep,\n tourSteps,\n handleOpen,\n handleDismiss,\n handleNext,\n handlePrevious,\n handleSkip,\n handleJump,\n } = useTourTipManager(tourCategory);\n\n const prevBtn = (\n <>\n <i className='icon icon-chevron-left'/>\n <FormattedMessage\n id='generic.previous'\n defaultMessage='Previous'\n />\n </>\n );\n\n const nextBtn = (): JSX.Element => {\n let buttonText = (\n <>\n <FormattedMessage\n id={'tutorial_tip.ok'}\n defaultMessage={'Next'}\n />\n <i className='icon icon-chevron-right'/>\n </>\n );\n if (singleTip) {\n buttonText = (\n <FormattedMessage\n id={'tutorial_tip.got_it'}\n defaultMessage={'Got it'}\n />\n );\n return buttonText;\n }\n\n const lastStep = getLastStep(tourSteps);\n if (currentStep === lastStep) {\n buttonText = (\n <FormattedMessage\n id={'tutorial_tip.done'}\n defaultMessage={'Done'}\n />\n );\n }\n return buttonText;\n };\n\n return (\n <TourTip\n show={show}\n tourSteps={tourSteps}\n title={title}\n screen={screen}\n singleTip={singleTip}\n imageURL={imageURL}\n overlayPunchOut={overlayPunchOut}\n nextBtn={nextBtn()}\n prevBtn={singleTip ? undefined : prevBtn}\n step={currentStep}\n placement={placement}\n pulsatingDotPlacement={pulsatingDotPlacement}\n pulsatingDotTranslate={pulsatingDotTranslate}\n width={width}\n offset={offset}\n handleOpen={handleOpen}\n handleDismiss={handleDismiss}\n handleNext={handleNext}\n handlePrevious={handlePrevious}\n handleSkip={handleSkip}\n handleJump={handleJump}\n hideBackdrop={hideBackdrop}\n tippyBlueStyle={tippyBlueStyle}\n showOptOut={showOptOut}\n interactivePunchOut={interactivePunchOut}\n />\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback, useEffect, useState} from 'react';\nimport type React from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {savePreferences as storeSavePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentChannelId, getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {trackEvent as trackEventAction} from 'actions/telemetry_actions';\n\nimport {\n generateTelemetryTag,\n} from 'components/onboarding_tasks';\nimport {\n getLastStep,\n isKeyPressed,\n KeyCodes,\n useGetTourSteps,\n useHandleNavigationAndExtraActions,\n} from 'components/tours';\nimport type {\n ActionType,\n ChannelsTourTipManager} from 'components/tours';\n\nimport {\n AutoTourStatus,\n ChannelsTour,\n FINISHED,\n SKIPPED,\n TTNameMapToATStatusKey,\n} from './constant';\n\nexport const useTourTipManager = (tourCategory: string): ChannelsTourTipManager => {\n const [show, setShow] = useState(false);\n const tourSteps = useGetTourSteps(tourCategory);\n\n // Function to save the tutorial step in redux store start here which needs to be modified\n const dispatch = useDispatch();\n const currentUserId = useSelector(getCurrentUserId);\n const currentChannelId = useSelector(getCurrentChannelId);\n const currentStep = useSelector((state: GlobalState) => getInt(state, tourCategory, currentUserId, 0));\n const autoTourStatus = useSelector((state: GlobalState) => getInt(state, tourCategory, TTNameMapToATStatusKey[tourCategory], 0));\n const isAutoTourEnabled = autoTourStatus === AutoTourStatus.ENABLED;\n const handleActions = useHandleNavigationAndExtraActions(tourCategory);\n\n const handleSaveDataAndTrackEvent = useCallback(\n (stepValue: number, eventSource: ActionType, autoTour = true, trackEvent = true) => {\n const preferences = [\n {\n user_id: currentUserId,\n category: tourCategory,\n name: currentUserId,\n value: stepValue.toString(),\n },\n {\n user_id: currentUserId,\n category: tourCategory,\n name: TTNameMapToATStatusKey[tourCategory],\n value: (autoTour && !(eventSource === 'skipped' || eventSource === 'dismiss') ? AutoTourStatus.ENABLED : AutoTourStatus.DISABLED).toString(),\n },\n ];\n dispatch(storeSavePreferences(currentUserId, preferences));\n if (trackEvent) {\n const eventSuffix = `${stepValue}--${eventSource}`;\n const telemetryTag = generateTelemetryTag(ChannelsTour, tourCategory, eventSuffix);\n trackEventAction(tourCategory, telemetryTag);\n }\n },\n [currentUserId, currentChannelId, tourCategory],\n );\n\n // Function to save the tutorial step in redux store end here\n\n const handleEventPropagationAndDefault = (e: React.MouseEvent | KeyboardEvent) => {\n e.stopPropagation();\n e.preventDefault();\n };\n\n useEffect(() => {\n if (isAutoTourEnabled) {\n setShow(true);\n }\n }, [isAutoTourEnabled]);\n\n const handleHide = useCallback((): void => {\n setShow(false);\n }, []);\n\n const handleOpen = useCallback((e: React.MouseEvent): void => {\n handleEventPropagationAndDefault(e);\n setShow(true);\n }, [isAutoTourEnabled]);\n\n const handleSavePreferences = useCallback((nextStep: boolean | number): void => {\n let stepValue = currentStep;\n let type: ActionType;\n if (nextStep === true) {\n stepValue += 1;\n type = 'next';\n } else if (nextStep === false) {\n stepValue -= 1;\n type = 'prev';\n } else {\n stepValue = nextStep;\n type = 'jump';\n }\n handleHide();\n handleSaveDataAndTrackEvent(stepValue, type);\n handleActions(stepValue, currentStep);\n }, [currentStep, handleHide, handleSaveDataAndTrackEvent, handleActions]);\n\n const handleDismiss = useCallback((e: React.MouseEvent): void => {\n handleEventPropagationAndDefault(e);\n handleHide();\n handleSaveDataAndTrackEvent(currentStep, 'dismiss', false);\n }, [handleSaveDataAndTrackEvent, handleHide]);\n\n const handlePrevious = useCallback((e: React.MouseEvent): void => {\n handleEventPropagationAndDefault(e);\n handleSavePreferences(false);\n }, [handleSavePreferences]);\n\n const handleNext = useCallback((e?: React.MouseEvent): void => {\n if (e) {\n handleEventPropagationAndDefault(e);\n }\n if (getLastStep(tourSteps) === currentStep) {\n handleSavePreferences(FINISHED);\n } else {\n handleSavePreferences(true);\n }\n }, [handleSavePreferences]);\n\n const handleJump = useCallback((e: React.MouseEvent, jumpStep: number): void => {\n if (e) {\n handleEventPropagationAndDefault(e);\n }\n handleSavePreferences(jumpStep);\n }, [handleSavePreferences]);\n\n const handleSkip = useCallback((e: React.MouseEvent): void => {\n handleEventPropagationAndDefault(e);\n handleHide();\n handleSaveDataAndTrackEvent(SKIPPED, 'skipped', false);\n handleActions(SKIPPED, currentStep);\n }, [handleSaveDataAndTrackEvent, handleHide]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent): void => {\n if (isKeyPressed(e, KeyCodes.ENTER) && show) {\n handleNext();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () =>\n window.removeEventListener('keydown', handleKeyDown);\n }, [handleNext, show]);\n\n return {\n show,\n currentStep,\n tourSteps,\n handleOpen,\n handleDismiss,\n handleNext,\n handleJump,\n handlePrevious,\n handleSkip,\n };\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId, isCurrentUserGuestUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {setAddChannelDropdown} from 'actions/views/add_channel_dropdown';\nimport {close as closeLhs, open as openLhs} from 'actions/views/lhs';\nimport {switchToChannels} from 'actions/views/onboarding_tasks';\n\nimport {OnboardingTaskCategory, OnboardingTaskList, OnboardingTasksName} from 'components/onboarding_tasks';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport type {GlobalState} from 'types/store';\n\nimport {\n CrtTutorialSteps,\n FINISHED,\n OnboardingTourSteps,\n TTNameMapToTourSteps,\n TutorialTourName,\n} from './constant';\n\nexport const useGetTourSteps = (tourCategory: string) => {\n const isGuestUser = useSelector((state: GlobalState) => isCurrentUserGuestUser(state));\n\n let tourSteps: Record<string, number> = TTNameMapToTourSteps[tourCategory];\n\n if (tourCategory === TutorialTourName.ONBOARDING_TUTORIAL_STEP && isGuestUser) {\n // restrict the 'learn more about messaging' tour when user is guest (townSquare, channel creation and user invite are restricted to guests)\n tourSteps = TTNameMapToTourSteps[TutorialTourName.ONBOARDING_TUTORIAL_STEP_FOR_GUESTS];\n }\n return tourSteps;\n};\n\nexport const useHandleNavigationAndExtraActions = (tourCategory: string) => {\n const dispatch = useDispatch();\n const currentUserId = useSelector(getCurrentUserId);\n const teamUrl = useSelector((state: GlobalState) => getCurrentRelativeTeamUrl(state));\n\n const nextStepActions = useCallback((step: number) => {\n if (tourCategory === TutorialTourName.ONBOARDING_TUTORIAL_STEP) {\n switch (step) {\n case OnboardingTourSteps.CHANNELS_AND_DIRECT_MESSAGES : {\n dispatch(openLhs());\n break;\n }\n case OnboardingTourSteps.CREATE_AND_JOIN_CHANNELS : {\n dispatch(setAddChannelDropdown(true));\n break;\n }\n case OnboardingTourSteps.INVITE_PEOPLE : {\n dispatch(setAddChannelDropdown(true));\n break;\n }\n case OnboardingTourSteps.SEND_MESSAGE : {\n dispatch(switchToChannels());\n break;\n }\n case OnboardingTourSteps.FINISHED: {\n let preferences = [\n {\n user_id: currentUserId,\n category: OnboardingTaskCategory,\n name: OnboardingTasksName.CHANNELS_TOUR,\n value: FINISHED.toString(),\n },\n ];\n preferences = [...preferences,\n {\n user_id: currentUserId,\n category: OnboardingTaskCategory,\n name: OnboardingTaskList.ONBOARDING_TASK_LIST_OPEN,\n value: 'true',\n },\n ];\n dispatch(savePreferences(currentUserId, preferences));\n break;\n }\n default:\n }\n } else if (tourCategory === TutorialTourName.CRT_TUTORIAL_STEP) {\n switch (step) {\n case CrtTutorialSteps.WELCOME_POPOVER : {\n dispatch(openLhs());\n break;\n }\n case CrtTutorialSteps.LIST_POPOVER : {\n const nextUrl = `${teamUrl}/threads`;\n getHistory().push(nextUrl);\n break;\n }\n case CrtTutorialSteps.UNREAD_POPOVER : {\n break;\n }\n default:\n }\n }\n }, [currentUserId, teamUrl, tourCategory]);\n\n const lastStepActions = useCallback((lastStep: number) => {\n if (tourCategory === TutorialTourName.ONBOARDING_TUTORIAL_STEP) {\n switch (lastStep) {\n case OnboardingTourSteps.CREATE_AND_JOIN_CHANNELS : {\n dispatch(setAddChannelDropdown(false));\n break;\n }\n case OnboardingTourSteps.INVITE_PEOPLE : {\n dispatch(setAddChannelDropdown(false));\n break;\n }\n default:\n }\n } else if (tourCategory === TutorialTourName.CRT_TUTORIAL_STEP) {\n switch (lastStep) {\n case CrtTutorialSteps.WELCOME_POPOVER : {\n dispatch(closeLhs());\n break;\n }\n default:\n }\n }\n }, [currentUserId, tourCategory]);\n\n return useCallback((step: number, lastStep: number) => {\n lastStepActions(lastStep);\n nextStepActions(step);\n }, [nextStepActions, lastStepActions]);\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useSelector} from 'react-redux';\n\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport {TutorialTourName} from '../constant';\n\nexport const useShowOnboardingTutorialStep = (stepToShow: number): boolean => {\n const currentUserId = useSelector(getCurrentUserId);\n const boundGetInt = (state: GlobalState) => getInt(state, TutorialTourName.ONBOARDING_TUTORIAL_STEP, currentUserId, 0);\n const step = useSelector<GlobalState, number>(boundGetInt);\n return step === stepToShow;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport {ChannelsTourTip, TutorialTourName} from 'components/tours';\nimport type {ChannelsTourTipProps} from 'components/tours';\n\nconst OnboardingTourTip = (props: Omit<ChannelsTourTipProps, 'tourCategory'>) => {\n return (\n <ChannelsTourTip\n {...props}\n tourCategory={TutorialTourName.ONBOARDING_TUTORIAL_STEP}\n />\n );\n};\n\nexport default OnboardingTourTip;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {useMeasurePunchouts} from '@mattermost/components';\n\nimport OnboardingTourTip from './onboarding_tour_tip';\n\nconst translate = {x: 0, y: 70};\n\nexport const CreateAndJoinChannelsTour = () => {\n const title = (\n <FormattedMessage\n id='onboardingTour.CreateAndJoinChannels.title'\n defaultMessage={'Create and join channels'}\n />\n );\n const screen = (\n <p>\n <FormattedMessage\n id='onboardingTour.CreateAndJoinChannels.Description'\n defaultMessage={'Create new channels or browse available channels to see what your team is discussing. As you join channels, organize them into categories based on how you work.'}\n />\n </p>\n );\n\n const overlayPunchOut = useMeasurePunchouts(['showMoreChannels', 'showNewChannel'], [], {y: -8, height: 16, x: 0, width: 0});\n\n return (\n <OnboardingTourTip\n title={title}\n screen={screen}\n placement='right-start'\n pulsatingDotPlacement='right-start'\n pulsatingDotTranslate={translate}\n width={352}\n overlayPunchOut={overlayPunchOut}\n />\n );\n};\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {useMeasurePunchouts} from '@mattermost/components';\n\nimport OnboardingTourTip from './onboarding_tour_tip';\n\nconst translate = {x: 0, y: -18};\n\nexport const InvitePeopleTour = () => {\n const title = (\n <FormattedMessage\n id='onboardingTour.invitePeople.title'\n defaultMessage={'Invite people to the team'}\n />\n );\n const screen = (\n <p>\n <FormattedMessage\n id='onboardingTour.invitePeople.Description'\n defaultMessage={'Invite members of your organization or external guests to the team and start collaborating with them.'}\n />\n </p>\n );\n\n const overlayPunchOut = useMeasurePunchouts(['invitePeople'], [], {y: -8, height: 16, x: 0, width: 0});\n\n return (\n <OnboardingTourTip\n title={title}\n screen={screen}\n placement='right-start'\n pulsatingDotPlacement='right-end'\n pulsatingDotTranslate={translate}\n width={352}\n overlayPunchOut={overlayPunchOut}\n />\n );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {useMeasurePunchouts} from '@mattermost/components';\n\nimport {getChannelsNameMapInCurrentTeam} from 'mattermost-redux/selectors/entities/channels';\n\nimport ChannelsImg from 'images/channels_and_direct_tour_tip.svg';\nimport Constants from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport OnboardingTourTip from './onboarding_tour_tip';\n\ntype Props = {\n firstChannelName?: string;\n}\n\nconst FirstChannel = ({firstChannelName}: {firstChannelName: string}) => {\n return (\n <FormattedMessage\n id='onboardingTour.ChannelsAndDirectMessagesTour.firstChannel'\n defaultMessage='Hey look, there’s your **{firstChannelName}** channel! '\n values={{firstChannelName}}\n />\n );\n};\n\nexport const ChannelsAndDirectMessagesTour = ({firstChannelName}: Props) => {\n const channelsByName = useSelector((state: GlobalState) => getChannelsNameMapInCurrentTeam(state));\n const townSquareDisplayName = channelsByName[Constants.DEFAULT_CHANNEL]?.display_name || Constants.DEFAULT_CHANNEL_UI_NAME;\n const offTopicDisplayName = channelsByName[Constants.OFFTOPIC_CHANNEL]?.display_name || Constants.OFFTOPIC_CHANNEL_UI_NAME;\n\n const title = (\n <FormattedMessage\n id='onboardingTour.ChannelsAndDirectMessagesTour.title'\n defaultMessage={'Channels and direct messages'}\n />\n );\n const screen = (\n <>\n <p>\n {firstChannelName && <FirstChannel firstChannelName={firstChannelName}/>}\n <FormattedMessage\n id='onboardingTour.ChannelsAndDirectMessagesTour.channels'\n defaultMessage={'Channels are where you can communicate with your team about a topic or project.'}\n />\n </p>\n <p>\n <FormattedMessage\n id='onboardingTour.ChannelsAndDirectMessagesTour.townSquare'\n defaultMessage='We’ve also added the <b>{townSquare}</b> and <b>{offTopic}</b> channels for everyone on your team.'\n values={{townSquare: townSquareDisplayName, offTopic: offTopicDisplayName, b: (value: string) => <b>{value}</b>}}\n />\n </p>\n <p>\n <FormattedMessage\n id='onboardingTour.ChannelsAndDirectMessagesTour.directMessages'\n defaultMessage='<b>Direct messages</b> are for private conversations between individuals or small groups.'\n values={{b: (value: string) => <b>{value}</b>}}\n />\n </p>\n </>\n );\n\n const overlayPunchOut = useMeasurePunchouts(['sidebar-droppable-categories'], []);\n\n return (\n <OnboardingTourTip\n title={title}\n screen={screen}\n imageURL={ChannelsImg}\n placement='right-start'\n pulsatingDotPlacement='right'\n width={352}\n overlayPunchOut={overlayPunchOut}\n />\n );\n};\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {useMeasurePunchouts} from '@mattermost/components';\n\nimport CustomImg from 'images/Customize-Your-Experience.gif';\n\nimport OnboardingTourTip from './onboarding_tour_tip';\n\nconst translate = {x: -56, y: 4};\nconst offset: [number, number] = [17, 0];\n\nexport const CustomizeYourExperienceTour = () => {\n const title = (\n <FormattedMessage\n id='onboardingTour.customizeYourExperience.title'\n defaultMessage={'Customize your experience'}\n />\n );\n const screen = (\n <p>\n <FormattedMessage\n id='onboardingTour.customizeYourExperience.Description'\n defaultMessage={'Set your availability, add a custom status, and access Settings and your Profile to configure your experience, including notification preferences and custom theme colors.'}\n />\n </p>\n );\n\n const overlayPunchOut = useMeasurePunchouts(['CustomizeYourExperienceTour'], []);\n\n return (\n <OnboardingTourTip\n title={title}\n screen={screen}\n imageURL={CustomImg}\n placement='bottom-start'\n pulsatingDotPlacement='right-end'\n pulsatingDotTranslate={translate}\n offset={offset}\n width={352}\n overlayPunchOut={overlayPunchOut}\n />\n );\n};\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo, memo} from 'react';\nimport {defineMessage, useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {getChannel, getDirectTeammate} from 'mattermost-redux/selectors/entities/channels';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport Chip from 'components/common/chip/chip';\n\nimport Constants from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n prefillMessage: (msg: string, shouldFocus: boolean) => void;\n channelId: string;\n currentUserId: string;\n}\n\nconst UsernameMention = styled.span`\n margin-left: 5px;\n color: var(--link-color);\n`;\n\nconst ChipContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n`;\n\nconst PrewrittenChips = ({channelId, currentUserId, prefillMessage}: Props) => {\n const {formatMessage} = useIntl();\n const channelType = useSelector((state: GlobalState) => getChannel(state, channelId)?.type || Constants.OPEN_CHANNEL);\n const channelTeammateId = useSelector((state: GlobalState) => getDirectTeammate(state, channelId)?.id || '');\n const channelTeammateUsername = useSelector((state: GlobalState) => getUser(state, channelTeammateId)?.username || '');\n\n const chips = useMemo(() => {\n const customChip = {\n event: 'prefilled_message_selected_custom',\n message: defineMessage({\n id: '',\n defaultMessage: '',\n }),\n display: defineMessage({\n id: 'create_post.prewritten.custom',\n defaultMessage: 'Custom message...',\n }),\n leadingIcon: '',\n };\n\n if (\n channelType === Constants.OPEN_CHANNEL ||\n channelType === Constants.PRIVATE_CHANNEL ||\n channelType === Constants.GM_CHANNEL\n ) {\n return [\n {\n event: 'prefilled_message_selected_team_hi',\n message: defineMessage({\n id: 'create_post.prewritten.tip.team_hi_message',\n defaultMessage: ':wave: Hi team!',\n }),\n display: defineMessage({\n id: 'create_post.prewritten.tip.team_hi',\n defaultMessage: 'Hi team!',\n }),\n leadingIcon: 'wave',\n },\n {\n event: 'prefilled_message_selected_team_excited',\n message: defineMessage({\n id: 'create_post.prewritten.tip.team_excited_message',\n defaultMessage: ':raised_hands: Excited to be here!',\n }),\n display: defineMessage({\n id: 'create_post.prewritten.tip.team_excited',\n defaultMessage: 'Excited to be here!',\n }),\n leadingIcon: 'raised_hands',\n },\n {\n event: 'prefilled_message_selected_team_hey',\n message: defineMessage({\n id: 'create_post.prewritten.tip.team_hey_message',\n defaultMessage: ':smile: Hey everyone!',\n }),\n display: defineMessage({\n id: 'create_post.prewritten.tip.team_hey',\n defaultMessage: 'Hey everyone!',\n }),\n leadingIcon: 'smile',\n },\n customChip,\n ];\n }\n\n if (channelTeammateId === currentUserId) {\n return [\n {\n event: 'prefilled_message_selected_self_note',\n message: defineMessage({\n id: 'create_post.prewritten.tip.self_note',\n defaultMessage: 'Note to self...',\n }),\n display: defineMessage({\n id: 'create_post.prewritten.tip.self_note',\n defaultMessage: 'Note to self...',\n }),\n leadingIcon: '',\n },\n {\n event: 'prefilled_message_selected_self_should',\n message: defineMessage({\n id: 'create_post.prewritten.tip.self_should',\n defaultMessage: 'Tomorrow I should...',\n }),\n display: defineMessage({\n id: 'create_post.prewritten.tip.self_should',\n defaultMessage: 'Tomorrow I should...',\n }),\n leadingIcon: '',\n },\n customChip,\n ];\n }\n\n return [\n {\n event: 'prefilled_message_selected_dm_hey',\n message: defineMessage({\n id: 'create_post.prewritten.tip.dm_hey_message',\n defaultMessage: ':wave: Hey @{username}',\n }),\n display: defineMessage({\n id: 'create_post.prewritten.tip.dm_hey',\n defaultMessage: 'Hey',\n }),\n leadingIcon: 'wave',\n },\n {\n event: 'prefilled_message_selected_dm_hello',\n message: defineMessage({\n id: 'create_post.prewritten.tip.dm_hello_message',\n defaultMessage: ':v: Oh hello',\n }),\n display: defineMessage({\n id: 'create_post.prewritten.tip.dm_hello',\n defaultMessage: 'Oh hello',\n }),\n leadingIcon: 'v',\n },\n customChip,\n ];\n }, [channelType, channelTeammateId, currentUserId]);\n\n return (\n <ChipContainer>\n {chips.map(({event, message, display, leadingIcon}) => {\n const values = {username: channelTeammateUsername};\n const messageToPrefill = message.id ? formatMessage(\n message,\n values,\n ) : '';\n\n const additionalMarkup = message.id === 'create_post.prewritten.tip.dm_hey' ? (\n <UsernameMention>\n {'@'}{channelTeammateUsername}\n </UsernameMention>\n ) : null;\n\n return (\n <Chip\n key={display.id}\n display={display}\n additionalMarkup={additionalMarkup}\n values={values}\n onClick={() => {\n if (event) {\n trackEvent('ui', event);\n }\n prefillMessage(messageToPrefill, true);\n }}\n otherOption={!message.id}\n leadingIcon={leadingIcon}\n />\n );\n })}\n </ChipContainer>\n );\n};\n\nexport default memo(PrewrittenChips);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {useMeasurePunchouts} from '@mattermost/components';\n\nimport PrewrittenChips from 'components/advanced_create_post/prewritten_chips';\n\nimport OnboardingTourTip from './onboarding_tour_tip';\n\ntype Props = {\n prefillMessage: (msg: string, shouldFocus: boolean) => void;\n channelId: string;\n currentUserId: string;\n}\n\nconst translate = {x: -6, y: -6};\n\nexport const SendMessageTour = ({\n prefillMessage,\n channelId,\n currentUserId,\n}: Props) => {\n const chips = (\n <PrewrittenChips\n prefillMessage={prefillMessage}\n channelId={channelId}\n currentUserId={currentUserId}\n />\n );\n\n const title = (\n <FormattedMessage\n id='onboardingTour.sendMessage.title'\n defaultMessage={'Send messages'}\n />\n );\n\n const screen = (\n <>\n <p>\n <FormattedMessage\n id='onboardingTour.sendMessage.Description'\n defaultMessage={'Start collaborating with others by typing or selecting one of the messages below. You can also drag and drop attachments into the text field or upload them using the paperclip icon.'}\n />\n </p>\n <div>\n {chips}\n </div>\n </>\n );\n const overlayPunchOut = useMeasurePunchouts(['post-create'], [], {y: -11, height: 11, x: 0, width: 0});\n\n return (\n <OnboardingTourTip\n title={title}\n screen={screen}\n placement='top-start'\n pulsatingDotPlacement='top-start'\n pulsatingDotTranslate={translate}\n width={400}\n overlayPunchOut={overlayPunchOut}\n />\n );\n};\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n width: number;\n height: number;\n}\n\nconst PersonWithChecklistSvg = (props: SvgProps) => (\n <svg\n width={props.width ? props.width.toString() : '230'}\n height={props.height ? props.height.toString() : '220'}\n viewBox='0 0 230 220'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <g clipPath='url(#clip0_715_435373)'>\n <path\n d='M85.235 40.9879L85.6705 28.0413L84.6808 22.9142C86.4919 18.2522 89.1542 18.5789 90.7872 18.4304C94.5084 18.0939 96.9926 16.0549 98.7047 17.8563C99.635 18.9352 100.684 23.3398 100.852 26.7645C100.971 28.5758 101.605 30.1199 100.259 31.0305C99.3307 31.5366 98.3604 31.9606 97.3587 32.2975L97.8536 41.9876L85.235 40.9879Z'\n fill='#AD831F'\n />\n <path\n d='M99.7042 22.6667C100.937 23.5192 102.063 24.5161 103.059 25.6361C103.366 26.9921 99.6349 27.685 99.6349 27.685L99.7042 22.6667Z'\n fill='#AD831F'\n />\n <path\n d='M93.3999 32.8121C94.7197 32.9561 96.0549 32.7901 97.2993 32.3271C97.7644 32.1391 96.4382 32.9804 95.9632 33.1487C95.3525 33.4621 94.6689 33.6057 93.9838 33.5644C93.5087 33.4852 92.8951 32.7725 93.3999 32.8121Z'\n fill='#7A5600'\n />\n <path\n d='M103.722 16.3122C103.563 15.9235 103.266 15.6074 102.888 15.4247C102.51 15.242 102.077 15.2055 101.674 15.3224C98.1603 15.9063 98.8234 12.8479 93.6473 13.7189C90.0449 14.3227 86.2444 13.7189 83.0576 15.55C81.6989 16.2098 80.5986 17.3033 79.9302 18.658C79.618 19.3389 79.5539 20.1076 79.7492 20.8308C79.9444 21.554 80.3866 22.186 80.9991 22.6172C81.2168 22.7459 81.4741 22.8548 81.583 23.0824C81.6527 23.3191 81.6315 23.5732 81.5236 23.7951C81.0782 25.1313 80.6824 26.7645 81.682 27.7543C82.2362 28.3085 83.1665 28.5659 83.3842 29.3182C83.503 29.7339 83.3842 30.1793 83.4337 30.6148C83.6415 31.763 85.4131 31.951 86.2543 31.1394C87 30.2174 87.3898 29.0583 87.3529 27.873C87.442 26.8337 87.4717 25.6361 86.6997 24.9036C86.3434 24.5671 85.8387 24.3691 85.6506 23.9138C85.5751 23.6385 85.589 23.3463 85.6904 23.0794C85.7918 22.8125 85.9755 22.5848 86.2148 22.4291C86.5354 22.2032 86.9009 22.0486 87.2864 21.976C87.6719 21.9034 88.0685 21.9145 88.4494 22.0083C88.8303 22.1021 89.1866 22.2766 89.4943 22.5199C89.802 22.7633 90.0538 23.0699 90.2329 23.4189C90.5199 24.0722 90.609 24.9334 91.2226 25.2501C92.0243 25.646 92.9348 24.7552 93.0436 23.8743C93.0326 22.9839 92.9432 22.0963 92.7764 21.2216C92.7764 20.3308 93.2317 19.242 94.1224 19.242C94.4168 19.2573 94.7072 19.3173 94.9834 19.4201C96.7319 19.9132 98.576 19.9609 100.348 19.5587C101.227 19.4303 102.063 19.0907 102.782 18.5689C103.13 18.3141 103.401 17.9691 103.566 17.5714C103.732 17.1737 103.786 16.7383 103.722 16.3122Z'\n fill='#4A2407'\n />\n <path\n d='M96.933 21.8353L96.9825 21.7363C94.34 21.4987 91.0443 21.2909 88.7878 21.3206C86.5313 21.3502 85.4922 21.667 84.3144 23.6961C84.1165 24.0425 84.6905 24.29 84.8984 23.9436C85.1324 23.3878 85.5165 22.9083 86.0077 22.5587C86.4989 22.209 87.0778 22.0031 87.6794 21.964C88.8274 21.8749 90.0151 21.964 91.1532 21.964C92.6081 21.964 94.8646 22.1718 96.745 22.3499C96.8044 22.1718 96.8637 22.0035 96.933 21.8353Z'\n fill='white'\n />\n <path\n d='M97.2796 23.7654C96.9872 23.5504 96.7621 23.2565 96.6306 22.9182C96.4992 22.5799 96.4668 22.2111 96.5373 21.8551C96.6759 20.8158 97.4478 20.0636 98.2495 20.1725C98.6801 20.2952 99.0461 20.5809 99.2696 20.9689C99.4932 21.357 99.5568 21.8168 99.447 22.251C99.3085 23.2408 98.5365 24.0426 97.7349 23.9337C97.5725 23.9119 97.4171 23.8545 97.2796 23.7654ZM98.4672 20.796C98.3848 20.7399 98.2894 20.7058 98.1901 20.697C97.6458 20.6178 97.1212 21.182 97.0124 21.9541C96.9035 22.7261 97.2598 23.419 97.8041 23.4982C98.3485 23.5774 98.8631 23.0032 98.972 22.2312C99.0388 21.9629 99.0268 21.681 98.9372 21.4193C98.8477 21.1577 98.6845 20.9275 98.4672 20.7564V20.796Z'\n fill='white'\n />\n <path\n d='M92.4102 40.1466C118.142 40.3446 118.073 37.9295 120.656 68.2867C123.239 98.6439 123.279 99.7425 97.8337 101.415C80.8704 102.534 70.8547 109.334 69.9739 100.01C69.0831 90.5077 68.519 90.7848 67.0048 74.6412C63.5705 38.9192 64.1545 39.9289 92.4102 40.1466Z'\n fill='#AD831F'\n />\n <path\n d='M103.97 62.5854C111.313 70.9195 127.901 77.3631 140.717 77.3631C142.548 77.3745 144.372 77.1415 146.141 76.6703C147.227 76.3767 148.284 75.9823 149.298 75.4924C159.848 70.3355 162.985 54.4195 165.281 48.9558C168.112 42.2351 165.172 46.4121 167.083 42.5717C167.765 41.1958 169.448 40.305 169.992 39.6023C170.774 38.6125 169.28 37.2762 163.638 41.0968C154.731 47.0356 155.721 59.0024 146.952 60.2594C145.851 60.3988 144.737 60.3988 143.637 60.2594C142.652 60.1535 141.677 59.9782 140.717 59.7348C125.07 55.8746 123.744 41.0869 108.344 40.4831C108.344 40.4435 96.6164 54.1919 103.97 62.5854Z'\n fill='#AD831F'\n />\n <path\n d='M23.5177 51.4699C23.2208 52.3013 24.5074 56.4189 24.8538 60.1901C25.7049 69.2764 28.4959 83.2227 41.4608 88.5478C43.1038 89.2059 44.8484 89.5743 46.6171 89.6366C47.7413 89.6868 48.8676 89.6337 49.9821 89.4782C57.8996 88.4884 66.599 82.7179 70.9141 73.7206C76.8522 61.2986 79.2671 40.2257 79.2671 40.2257C73.5467 40.2257 59.4732 39.1271 54.3565 61.7341C54.0363 63.4975 53.3298 65.1681 52.2877 66.6261C51.2457 68.0841 49.8939 69.2934 48.3293 70.1672C47.3487 70.6848 46.2824 71.0202 45.1821 71.157C43.6876 71.3487 42.169 71.1325 40.7874 70.5313C39.4057 69.9301 38.2124 68.9664 37.3338 67.7422C29.6538 57.4582 28.7037 46.3922 23.1713 45.3034C17.6389 44.2146 24.9626 47.4216 23.5177 51.4699Z'\n fill='#AD831F'\n />\n <path\n d='M108.344 40.4435C123.744 41.0473 125.07 55.835 140.717 59.6952C142.35 60.1284 144.035 60.3349 145.725 60.3088C146.447 65.5845 146.972 70.8898 147.477 76.205C145.304 76.9618 143.018 77.3401 140.717 77.3235C127.901 77.3235 111.313 70.8799 103.97 62.5359C96.6263 54.1919 108.344 40.4435 108.344 40.4435Z'\n fill='#1E325C'\n />\n <path\n d='M47.0031 70.7314C50.3087 69.613 53.2778 66.5644 54.3565 61.7342C59.4337 39.1271 73.5467 40.2159 79.2572 40.2258C79.2572 40.2258 76.872 61.2987 70.9141 73.7207C66.1042 83.7374 55.9103 89.706 47.3 89.6466C48.1318 83.3613 48.0317 76.9875 47.0031 70.7314Z'\n fill='#1E325C'\n />\n <path\n d='M121.804 85.9645C136.808 129.951 137.718 148.015 136.323 163.169C134.927 178.323 123.873 193.912 109.453 205.325C106.414 207.482 102.614 209.007 105.019 214.886C108.513 223.438 99.3183 212.204 97.0222 206.611C94.7261 201.019 119.073 191.289 113.451 161.427C107.83 131.565 92.7467 119.35 83.3149 98.2182C73.8832 77.086 121.804 85.9645 121.804 85.9645Z'\n fill='#1C58D9'\n />\n <path\n d='M121.804 85.9645C136.808 129.951 137.718 148.015 136.323 163.169C134.927 178.323 123.873 193.912 109.453 205.325C106.414 207.482 102.614 209.007 105.019 214.886C108.513 223.438 99.3183 212.204 97.0222 206.611C94.7261 201.019 119.073 191.289 113.451 161.427C107.83 131.565 92.7467 119.35 83.3149 98.2182C73.8832 77.086 121.804 85.9645 121.804 85.9645Z'\n fill='black'\n fillOpacity='0.16'\n />\n <mask\n id='mask0_715_435373'\n style={{maskType: 'alpha'}}\n maskUnits='userSpaceOnUse'\n x='82'\n y='84'\n width='55'\n height='134'\n >\n <path\n d='M121.804 85.9645C136.808 129.951 137.718 148.015 136.323 163.169C134.927 178.323 123.872 193.912 109.453 205.325C106.414 207.482 102.614 209.007 105.019 214.886C108.512 223.438 99.3182 212.204 97.0221 206.611C94.726 201.019 119.072 191.289 113.451 161.427C107.83 131.565 92.7466 119.35 83.3148 98.2182C73.883 77.086 121.804 85.9645 121.804 85.9645Z'\n fill='#1452BD'\n />\n </mask>\n <g mask='url(#mask0_715_435373)'>\n <rect\n x='75.9232'\n y='76.573'\n width='39.6883'\n height='110.592'\n fill='url(#pattern0)'\n />\n </g>\n <path\n d='M102.515 121.528C103.841 124.052 105.365 126.754 106.969 129.545L106.424 129.991C104.752 127.021 103.158 124.191 101.941 121.865C101.743 121.488 102.307 121.152 102.515 121.528Z'\n fill='#1E325C'\n />\n <path\n d='M110.69 193.11C109.7 194.209 108.71 195.298 107.77 196.387L107.355 195.931C108.344 194.872 109.275 193.803 110.215 192.724L110.69 193.11Z'\n fill='#1E325C'\n />\n <path\n d='M104.287 88.8943C106.108 138.186 101.387 160.863 80.0391 176.808C58.6914 192.754 42.1437 193.328 41.5004 201.365C40.8571 209.403 38.9272 207.562 38.1751 199.317C37.1854 188.122 32.514 196.436 57.3256 177.293C82.1372 158.151 70.4193 107.71 69.2019 92.7644C67.9846 77.8184 104.287 88.8943 104.287 88.8943Z'\n fill='#1C58D9'\n />\n <path\n d='M41.1936 193.16C53.6439 187.023 66.5891 180.184 72.3689 166.782C78.8019 151.865 76.0605 135.108 75.6547 119.449C75.4172 110.007 75.6547 100.554 76.2683 91.1312C76.2683 90.7056 76.9611 90.7056 76.9314 91.1312C76.4069 99.792 76.1298 108.463 76.2782 117.143C76.4267 125.824 77.2679 134.504 77.2679 143.205C77.2184 150.737 76.397 158.378 73.6753 165.455C71.1709 171.891 67.0128 177.552 61.6209 181.866C55.5738 186.815 48.5371 190.309 41.5796 193.744C41.1441 193.922 40.8076 193.348 41.1936 193.16Z'\n fill='#1E325C'\n />\n <path\n d='M114.876 188.003C114.461 188.557 114.035 189.102 113.6 189.646C112.966 190.438 112.313 191.21 111.62 191.982L111.145 191.606C112.224 190.349 113.273 189.062 114.263 187.736L114.876 188.003Z'\n fill='#1E325C'\n />\n <path\n d='M118.142 182.975C117.405 184.281 116.602 185.55 115.737 186.776L115.163 186.518C116.005 185.311 116.796 184.074 117.519 182.787L118.142 182.975Z'\n fill='#1E325C'\n />\n <path\n d='M119.993 177.224L120.636 177.382C120.164 178.841 119.578 180.261 118.884 181.629L118.251 181.441C118.657 180.619 119.053 179.788 119.389 178.917C119.617 178.392 119.805 177.788 119.993 177.224Z'\n fill='#1E325C'\n />\n <path\n d='M121.824 164.624C121.955 165.94 122.018 167.261 122.012 168.583L121.359 168.514C121.362 167.215 121.296 165.916 121.161 164.624H121.824Z'\n fill='#1E325C'\n />\n <path\n d='M120.518 157.606C120.656 158.121 120.785 158.596 120.903 159.121C121.22 160.457 121.468 161.823 121.656 163.189H120.983C120.717 161.373 120.343 159.575 119.864 157.804L120.518 157.606Z'\n fill='#1E325C'\n />\n <path\n d='M118.805 152.44C119.28 153.677 119.726 154.914 120.102 156.131L119.449 156.359C119.073 155.112 118.647 153.885 118.192 152.667L118.805 152.44Z'\n fill='#1E325C'\n />\n <path\n d='M116.311 146.718C117.004 148.173 117.657 149.629 118.291 151.074L117.697 151.301C117.103 149.817 116.45 148.332 115.767 146.926L116.311 146.718Z'\n fill='#1E325C'\n />\n <path\n d='M110.086 134.979C111.016 136.603 111.937 138.252 112.847 139.928L112.293 140.334C111.422 138.77 110.482 137.107 109.512 135.385L110.086 134.979Z'\n fill='#1E325C'\n />\n <path\n d='M107.721 130.882C108.255 131.812 108.8 132.752 109.344 133.712L108.78 134.138C108.245 133.208 107.701 132.257 107.176 131.327L107.721 130.882Z'\n fill='#1E325C'\n />\n <path\n d='M113.55 141.245C114.282 142.611 114.985 143.98 115.658 145.353L115.074 145.56C114.777 144.967 114.48 144.373 114.174 143.799C113.867 143.224 113.421 142.393 113.016 141.641L113.55 141.245Z'\n fill='#1E325C'\n />\n <path\n d='M121.953 170.098C121.85 172.073 121.548 174.033 121.052 175.947L120.409 175.799C120.9 173.91 121.198 171.977 121.299 170.028L121.953 170.098Z'\n fill='#1E325C'\n />\n <path\n d='M106.781 197.505C106.028 198.356 105.276 199.198 104.544 200.069C104.395 199.91 104.247 199.752 104.089 199.604C104.831 198.742 105.593 197.891 106.355 197.05C106.494 197.198 106.642 197.347 106.781 197.505Z'\n fill='#1E325C'\n />\n <path\n d='M103.119 200.742L103.584 201.217C102.762 202.207 101.961 203.197 101.189 204.236C100.941 204.572 100.367 204.236 100.615 203.899C101.416 202.82 102.307 201.781 103.119 200.742Z'\n fill='#1E325C'\n />\n <path\n d='M85.2845 40.0972C85.9076 41.1371 86.8577 41.9411 87.9863 42.3836C92.0539 44.0564 97.23 44.0563 99.5063 40.1664C118.212 40.1664 118.38 40.9979 120.696 68.2867C121.863 82.0053 122.507 89.7456 120.527 94.269C110.205 98.733 98.3385 100.208 87.5212 102.306C82.8102 103.217 78.0795 103.989 73.3389 104.672C71.4188 104.207 70.2807 102.87 70.0135 100.01C69.1228 90.5077 68.5586 90.7848 67.0444 74.6412C63.8873 42.2351 64.0753 40.0576 85.2845 40.0972Z'\n fill='white'\n />\n <path\n d='M85.2845 40.0972C85.9076 41.1371 86.8577 41.9411 87.9863 42.3836C92.0539 44.0564 97.23 44.0563 99.5063 40.1664C118.212 40.1664 118.38 40.9979 120.696 68.2867C121.863 82.0053 122.507 89.7456 120.527 94.269C110.205 98.733 98.3385 100.208 87.5212 102.306C82.8102 103.217 78.0795 103.989 73.3389 104.672C71.4188 104.207 70.2807 102.87 70.0135 100.01C69.1228 90.5077 68.5586 90.7848 67.0444 74.6412C63.8873 42.2351 64.0753 40.0576 85.2845 40.0972Z'\n fill='#3F4350'\n fillOpacity='0.08'\n />\n <mask\n id='mask1_715_435373'\n style={{maskType: 'alpha'}}\n maskUnits='userSpaceOnUse'\n x='65'\n y='40'\n width='57'\n height='65'\n >\n <path\n d='M85.2845 40.0972C85.9076 41.1371 86.8577 41.9411 87.9863 42.3836C92.0539 44.0564 97.23 44.0563 99.5063 40.1664C118.212 40.1664 118.38 40.9979 120.696 68.2867C121.863 82.0053 122.507 89.7456 120.527 94.269C110.205 98.733 98.3385 100.208 87.5212 102.306C82.8102 103.217 78.0795 103.989 73.3389 104.672C71.4188 104.207 70.2807 102.87 70.0135 100.01C69.1228 90.5077 68.5586 90.7848 67.0444 74.6412C63.8873 42.2351 64.0753 40.0576 85.2845 40.0972Z'\n fill='white'\n />\n </mask>\n <g mask='url(#mask1_715_435373)'>\n <rect\n opacity='0.7'\n x='64.3289'\n y='47.5872'\n width='49.4989'\n height='58.4176'\n fill='url(#pattern1)'\n />\n </g>\n <path\n d='M110.433 92.1112C107.572 86.8932 105.349 81.3501 103.812 75.6013C100.951 63.9723 99.1428 52.1096 98.4078 40.1565C118.202 40.1565 120.181 39.434 122.586 67.2474C122.705 68.5935 121.141 71.0086 121.596 72.3844C125.426 83.1337 139.144 94.1601 138.015 96.6346C136.442 100.178 130.434 103.959 122.873 106.928C120.894 107.433 118.865 107.839 116.836 108.156C115.188 102.626 113.045 97.2559 110.433 92.1112Z'\n fill='#1E325C'\n />\n <path\n d='M66.8465 94.5956C66.2823 101.178 65.5401 106.81 66.0052 111.848C70.35 111.125 74.7145 110.67 79.0989 110.363C83.8148 100.344 86.6911 89.5583 87.5904 78.5211C88.1644 71.939 89.936 46.6594 89.5005 42.8883C89.2234 40.3544 86.0663 42.4924 85.423 40.0773C64.0852 40.0773 61.799 41.661 64.9264 74.1363C65.0749 75.7596 67.2621 77.8184 67.3314 79.3526C67.5095 84.4387 67.3475 89.5311 66.8465 94.5956Z'\n fill='#1E325C'\n />\n <path\n d='M99.7735 38.8895C101.238 40.0674 100.971 39.7407 99.9715 41.5917C98.9719 43.4426 98.4671 45.1154 97.6457 42.8686C96.8242 40.6217 96.7154 40.978 97.7842 39.6418C98.8531 38.3056 99.0313 38.2858 99.7735 38.8895Z'\n fill='#1C58D9'\n />\n <path\n d='M87.5211 39.2657C90.8366 40.7207 89.6193 40.3842 90.2527 42.5716C91.6283 47.2732 89.7083 44.7789 85.0073 42.0668C81.8106 40.2159 82.1867 39.9288 83.305 38.8004C84.4234 37.6721 84.0869 37.7216 87.343 39.2657C90.5991 40.8098 84.1957 37.8404 87.5211 39.2657Z'\n fill='#1C58D9'\n />\n <path\n d='M45.2217 71.355C46.8269 77.3078 47.3003 83.5091 46.6172 89.6366C47.7413 89.6868 48.8677 89.6337 49.9821 89.4782C50.6158 83.1022 50.0927 76.6641 48.4382 70.474C48.4168 70.3671 48.3802 70.2637 48.3294 70.1672C47.3488 70.6848 46.2824 71.0202 45.1821 71.157C45.191 71.2238 45.2042 71.2899 45.2217 71.355Z'\n fill='#1C58D9'\n />\n <path\n d='M143.637 60.2197C144.244 65.7296 145.078 71.1999 146.141 76.6306C147.227 76.337 148.284 75.9427 149.298 75.4528C148.308 70.3949 147.526 65.3271 146.952 60.2098C145.852 60.3525 144.738 60.3559 143.637 60.2197Z'\n fill='#1C58D9'\n />\n <path\n d='M105.336 208.482C104.197 209.888 103.762 211.768 105.019 214.837C108.512 223.388 99.3182 212.154 97.0222 206.562C96.458 205.176 97.517 203.543 99.3479 201.415C101.397 203.731 103.376 206.107 105.336 208.482Z'\n fill='#1E325C'\n />\n <path\n d='M41.0451 189.032C41.1837 189.369 41.3222 189.696 41.4509 190.022C42.4406 192.259 43.3313 194.496 44.321 196.713C43.5341 197.233 42.8704 197.919 42.3764 198.723C41.8823 199.527 41.5698 200.428 41.4608 201.365C40.8274 209.393 38.8876 207.562 38.1354 199.317C37.4526 191.863 35.1763 193.051 41.0451 189.032Z'\n fill='#1E325C'\n />\n <path\n d='M50.4389 1.30575L4.36272 1.30575C4.30693 1.31392 4.25001 1.30875 4.19656 1.29068C4.1431 1.2726 4.0946 1.24212 4.05496 1.20168C4.01533 1.16124 3.98566 1.11195 3.96836 1.05783C3.95106 1.00371 3.9466 0.946279 3.95535 0.890104C3.94447 0.767772 3.98073 0.645915 4.05659 0.549834C4.13244 0.453753 4.24208 0.390819 4.36272 0.374115L50.4389 0.374115C50.5604 0.389696 50.6712 0.452142 50.748 0.548347C50.8249 0.644552 50.8618 0.767045 50.851 0.890104C50.8589 0.946546 50.8537 1.00406 50.8357 1.05812C50.8178 1.11218 50.7877 1.16129 50.7477 1.20159C50.7078 1.2419 50.6591 1.27228 50.6055 1.29036C50.5519 1.30843 50.4948 1.31371 50.4389 1.30575ZM50.4389 6.49422C50.5613 6.47864 50.6728 6.41549 50.7498 6.31823C50.8268 6.22098 50.8631 6.09728 50.851 5.97344C50.8579 5.91719 50.852 5.86011 50.8337 5.8065C50.8155 5.7529 50.7853 5.70419 50.7456 5.66411C50.7058 5.62403 50.6576 5.59363 50.6044 5.5752C50.5513 5.55678 50.4946 5.55083 50.4389 5.5578L4.36272 5.5578C4.30712 5.55065 4.25064 5.55654 4.19765 5.57497C4.14467 5.59341 4.09661 5.62391 4.05721 5.66411C4.0178 5.70432 3.98811 5.75312 3.97045 5.80677C3.95278 5.86041 3.94762 5.91745 3.95535 5.97344C3.94318 6.09655 3.97884 6.21962 4.05482 6.31675C4.1308 6.41388 4.24118 6.4775 4.36272 6.49422L50.4389 6.49422ZM50.4389 11.5776C50.4948 11.5855 50.5519 11.5803 50.6055 11.5622C50.6591 11.5441 50.7078 11.5137 50.7477 11.4734C50.7877 11.4331 50.8178 11.384 50.8357 11.33C50.8537 11.2759 50.8589 11.2184 50.851 11.1619C50.8631 11.0381 50.8268 10.9144 50.7498 10.8171C50.6728 10.7199 50.5613 10.6567 50.4389 10.6412L4.36272 10.6412C4.24118 10.6579 4.1308 10.7215 4.05482 10.8186C3.97884 10.9157 3.94318 11.0388 3.95535 11.1619C3.9466 11.2181 3.95106 11.2755 3.96836 11.3297C3.98566 11.3838 4.01533 11.4331 4.05496 11.4735C4.0946 11.514 4.1431 11.5444 4.19656 11.5625C4.25001 11.5806 4.30693 11.5858 4.36272 11.5776L50.4389 11.5776ZM50.4389 16.7613C50.7089 16.7613 50.851 16.5893 50.851 16.2453C50.8589 16.1888 50.8537 16.1313 50.8357 16.0773C50.8178 16.0232 50.7877 15.9741 50.7477 15.9338C50.7078 15.8935 50.6591 15.8631 50.6055 15.845C50.5519 15.8269 50.4948 15.8217 50.4389 15.8296L4.36272 15.8296C4.08798 15.8296 3.95535 15.9825 3.95535 16.3074C3.95535 16.6323 4.08798 16.7852 4.36272 16.7852L50.4389 16.7613ZM50.4389 21.8446C50.4948 21.8526 50.5519 21.8473 50.6055 21.8292C50.6591 21.8112 50.7078 21.7808 50.7477 21.7405C50.7877 21.7002 50.8178 21.6511 50.8357 21.597C50.8537 21.5429 50.8589 21.4854 50.851 21.429C50.8618 21.3059 50.8249 21.1834 50.748 21.0872C50.6712 20.991 50.5604 20.9286 50.4389 20.913L4.36272 20.913C4.24208 20.9297 4.13244 20.9926 4.05659 21.0887C3.98073 21.1848 3.94447 21.3067 3.95535 21.429C3.9466 21.4852 3.95106 21.5426 3.96836 21.5967C3.98566 21.6509 4.01533 21.7001 4.05496 21.7406C4.0946 21.781 4.1431 21.8115 4.19656 21.8296C4.25001 21.8476 4.30693 21.8528 4.36272 21.8446L50.4389 21.8446ZM50.4389 27.0331C50.4948 27.0411 50.5519 27.0358 50.6055 27.0177C50.6591 26.9997 50.7078 26.9693 50.7477 26.929C50.7877 26.8887 50.8178 26.8395 50.8357 26.7855C50.8537 26.7314 50.8589 26.6739 50.851 26.6175C50.851 26.2687 50.7089 26.0967 50.4389 26.0967L4.36272 26.0967C4.08798 26.0967 3.95535 26.2543 3.95535 26.5744C3.95535 26.8945 4.08798 27.0522 4.36272 27.0522L50.4389 27.0331ZM50.4389 32.2168C50.5613 32.2012 50.6728 32.1381 50.7498 32.0408C50.8268 31.9436 50.8631 31.8199 50.851 31.696C50.8581 31.64 50.8523 31.583 50.834 31.5295C50.8157 31.4761 50.7854 31.4276 50.7456 31.3879C50.7057 31.3482 50.6573 31.3182 50.6041 31.3004C50.5509 31.2826 50.4944 31.2774 50.4389 31.2852L4.36272 31.2852C4.30738 31.2772 4.25096 31.2823 4.19792 31.3001C4.14488 31.318 4.09669 31.348 4.05716 31.3878C4.01763 31.4277 3.98785 31.4763 3.97017 31.5298C3.9525 31.5833 3.94743 31.6402 3.95535 31.696C3.94318 31.8192 3.97884 31.9422 4.05482 32.0393C4.1308 32.1365 4.24118 32.2001 4.36272 32.2168L50.4389 32.2168ZM50.4389 37.3002C50.4948 37.3081 50.5519 37.3029 50.6055 37.2848C50.6591 37.2667 50.7078 37.2363 50.7477 37.196C50.7877 37.1557 50.8178 37.1066 50.8357 37.0525C50.8537 36.9985 50.8589 36.9409 50.851 36.8845C50.851 36.5405 50.7089 36.3638 50.4389 36.3638L4.36272 36.3638C4.08798 36.3638 3.95535 36.5214 3.95535 36.8415C3.95535 37.1616 4.08798 37.3193 4.36272 37.3193L50.4389 37.3002ZM50.4389 42.4839C50.5604 42.4683 50.6712 42.4058 50.748 42.3096C50.8249 42.2134 50.8618 42.0909 50.851 41.9679C50.8589 41.9114 50.8537 41.8539 50.8357 41.7999C50.8178 41.7458 50.7877 41.6967 50.7477 41.6564C50.7078 41.6161 50.6591 41.5857 50.6055 41.5676C50.5519 41.5495 50.4948 41.5443 50.4389 41.5522L4.36272 41.5522C4.30693 41.5441 4.25001 41.5492 4.19656 41.5673C4.1431 41.5854 4.0946 41.6159 4.05496 41.6563C4.01533 41.6967 3.98566 41.746 3.96836 41.8001C3.95106 41.8542 3.9466 41.9117 3.95535 41.9679C3.94447 42.0902 3.98073 42.2121 4.05659 42.3081C4.13244 42.4042 4.24208 42.4672 4.36272 42.4839L50.4389 42.4839Z'\n fill='#3F4350'\n fillOpacity='0.24'\n />\n <path\n d='M6.31924 46.7407C6.20014 46.9344 6.03315 47.0934 5.83466 47.2023C5.63617 47.3112 5.41302 47.3662 5.18711 47.3618C5.00939 47.366 4.83298 47.3301 4.67078 47.2567C4.52071 47.1907 4.38532 47.0949 4.27264 46.9751C4.15997 46.8553 4.07231 46.7139 4.01487 46.5593C3.95743 46.4046 3.93139 46.2399 3.93828 46.0749C3.94517 45.91 3.98486 45.7481 4.05498 45.5988L17.4273 18.5242C17.5115 18.3672 17.6282 18.2304 17.7697 18.1232C17.9111 18.016 18.0739 17.9409 18.2468 17.9031C18.6029 17.8371 18.9706 17.9105 19.2747 18.1086L26.0628 23.0916L44.0631 7.01024C44.1729 6.89438 44.3073 6.80511 44.4562 6.74917C44.6051 6.69322 44.7647 6.67206 44.9229 6.68723C45.081 6.7024 45.2338 6.75351 45.3696 6.83676C45.5053 6.92002 45.6206 7.03322 45.7068 7.16788C45.8206 7.27881 45.911 7.4117 45.9728 7.55862C46.0346 7.70554 46.0664 7.8635 46.0664 8.02308C46.0664 8.18267 46.0346 8.3406 45.9728 8.48752C45.911 8.63444 45.8206 8.76733 45.7068 8.87826L26.887 25.6811C26.6648 25.8508 26.3936 25.9426 26.1149 25.9426C25.8361 25.9426 25.565 25.8508 25.3428 25.6811L18.9668 21.0134L6.31924 46.7407Z'\n fill='#D24B4E'\n />\n <path\n d='M194.674 132.536C193.011 135.07 189.256 135.435 186.335 133.383L153.362 110.265C152.286 109.542 151.532 108.434 151.257 107.171C150.982 105.908 151.208 104.588 151.887 103.487L180.893 59.3722C181.694 58.2874 182.841 57.5068 184.147 57.1591C185.453 56.8115 186.839 56.9176 188.077 57.4599L225.508 73.8541C228.819 75.3078 230.193 78.5182 228.545 81.0912L194.674 132.536Z'\n fill='#FFBC1F'\n />\n <path\n d='M189.427 129.535L155.439 106.402L185.336 60.9424L223.212 78.1606L189.427 129.535Z'\n fill='white'\n />\n <path\n d='M210.946 74.9346C210.655 75.2987 210.247 75.5516 209.79 75.6508C209.334 75.7499 208.857 75.6891 208.44 75.4787L194.143 68.7936C193.958 68.7264 193.791 68.6188 193.653 68.4786C193.515 68.3385 193.41 68.1694 193.347 67.9838C193.283 67.7981 193.262 67.6007 193.285 67.4059C193.308 67.2111 193.375 67.0238 193.48 66.858L195.721 63.4454C195.985 63.0963 196.363 62.8486 196.789 62.7438C197.216 62.6391 197.666 62.6837 198.063 62.8702L212.547 69.2755C212.748 69.3397 212.932 69.4481 213.085 69.5926C213.238 69.7372 213.356 69.9143 213.431 70.1107C213.506 70.307 213.536 70.5177 213.518 70.7271C213.5 70.9364 213.435 71.1391 213.328 71.3199L210.946 74.9346Z'\n fill='#8D93A5'\n />\n <path\n d='M208.213 70.5038L199 66.3372L201.272 62.878C201.542 62.5356 201.919 62.2923 202.343 62.1867C202.767 62.0812 203.214 62.1193 203.614 62.295L209.744 64.938C209.943 64.9985 210.125 65.1032 210.278 65.2442C210.43 65.3852 210.548 65.5588 210.623 65.7519C210.699 65.9451 210.729 66.1527 210.712 66.3591C210.694 66.5655 210.63 66.7653 210.524 66.9435L208.213 70.5038Z'\n fill='#2D3039'\n />\n <path\n d='M208.885 89.2455L189.763 79.4743L190.763 77.9507L209.955 87.6209L208.885 89.2455Z'\n fill='#3DB887'\n />\n <path\n d='M183.735 78.4793C183.691 78.5081 183.64 78.5265 183.587 78.533C183.534 78.5395 183.48 78.5338 183.43 78.5166C183.38 78.4994 183.334 78.471 183.296 78.4335C183.258 78.3961 183.23 78.3506 183.212 78.3004L182.041 74.849C182.026 74.7973 182.022 74.7429 182.03 74.6896C182.038 74.6363 182.058 74.5854 182.087 74.5404C182.117 74.4953 182.156 74.4572 182.202 74.4286C182.248 74.4001 182.3 74.3817 182.353 74.3749L182.798 74.2816C182.914 74.2574 183.035 74.2735 183.14 74.3272C183.245 74.381 183.328 74.4692 183.376 74.577L184.001 76.3804C184.017 76.4304 184.045 76.4758 184.082 76.5133C184.119 76.5508 184.164 76.5793 184.214 76.5965C184.264 76.6138 184.317 76.6195 184.369 76.613C184.422 76.6065 184.472 76.5881 184.516 76.5592L188.061 74.5692C188.171 74.5137 188.296 74.4958 188.418 74.5183C188.539 74.5407 188.65 74.6024 188.732 74.6936L189.013 75.0279C189.051 75.0685 189.078 75.1171 189.093 75.17C189.109 75.2228 189.112 75.2785 189.102 75.3327C189.092 75.3869 189.07 75.438 189.037 75.4822C189.004 75.5264 188.961 75.5625 188.912 75.5875L183.735 78.4793Z'\n fill='#3DB887'\n />\n <path\n d='M202.631 98.7525L183.884 88.4138L184.891 86.8824L203.7 97.1278L202.631 98.7525Z'\n fill='#BABEC9'\n />\n <path\n d='M180.292 88.7714L174.764 85.6775L177.95 80.8191L183.548 83.8197L180.292 88.7714Z'\n fill='#BABEC9'\n />\n <path\n d='M196.377 108.267L178.012 97.3454L179.012 95.814L197.446 106.642L196.377 108.267Z'\n fill='#BABEC9'\n />\n <path\n d='M174.467 97.6331L169.049 94.3605L172.242 89.5021L177.731 92.6814L174.467 97.6331Z'\n fill='#BABEC9'\n />\n <path\n d='M190.122 117.774L172.141 106.277L173.14 104.754L191.192 116.149L190.122 117.774Z'\n fill='#BABEC9'\n />\n <path\n d='M168.643 106.487L163.333 103.043L166.534 98.1928L171.906 101.535L168.643 106.487Z'\n fill='#BABEC9'\n />\n <ellipse\n cx='104.011'\n cy='217.944'\n rx='43.3171'\n ry='2.19225'\n fill='black'\n fillOpacity='0.12'\n />\n </g>\n <defs>\n <pattern\n id='pattern0'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image0_715_435373'\n transform='scale(0.011236 0.00403226)'\n />\n </pattern>\n <pattern\n id='pattern1'\n patternContentUnits='objectBoundingBox'\n width='1'\n height='1'\n >\n <use\n xlinkHref='#image1_715_435373'\n transform='scale(0.00900901 0.00763359)'\n />\n </pattern>\n <clipPath id='clip0_715_435373'>\n <rect\n width='228.037'\n height='220'\n fill='white'\n transform='translate(0.98175)'\n />\n </clipPath>\n <image\n id='image0_715_435373'\n width='89'\n height='248'\n xlinkHref='data:image/png;base64,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'\n />\n <image\n id='image1_715_435373'\n width='111'\n height='131'\n xlinkHref='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG8AAACDCAYAAACDQ0WZAAASuklEQVR4Xu1dy5XbxhIlwc9WfmvbxDACyxFIikByBJIisF4EGkdgOQLLEUiOwHIEliPAcOS99bbiZ965dar6FArdAMhpfMnZaERiGo2+qOr63KqeTi4/g12B6WBnfpn45ALegF+CC3gX8Aa8AgOe+kXyLuANeAUGPPWL5F3AG/AKDHjqF8m7gBdvBbIs+2q9Xn+ON+J4R+qV5GVZdoWlXq/XN+Nd8nhP1ivw4j3WeYw0WPCgXieTCVTs2UrpkMGDigV4H89DzopPOVjwzhUw/dyjB2/M1mtn4GFRZ7PZ69Vq9V/9NtnFzrLsxXq9fnuqpGVZ9nCsqrUz8ACGXVj8n/exD6eCdU5/1yl457TQTTxrL8DLsuzxer2ulDZ2D3Dte7sYY1aPIeAbBa+usZBl2TMfIE28rWMas1Hw/vnnn+fffPPNb/ddMIA7mUxgeFzLXjmZTG7OPQbaKHhVoLGB8tkXJTkVeMRHfePBal0sFncxXqaq52rr+07Bi/2QHNg+m6hL6+BBAiaTyYeAdOR8MgYDnxUMFAG+7r4a+0Xpw3hdgIeAMtI+lLNj1Un7F+9tHwPAvppMJm/1PsfWJ2KcNNa5BalbB89j4hfchNvb219Xq9VL39sNtwJg6aiJgGg+I1DHbNS0Dl6VT5dlGSSM1CSHz15qH66ummT1DGk8ObTWB9VYNod7g8dvPfaloJOtF1zHKuVz7efxPgeL8YN8ry1PgLter9+YeGjOwhSw6wLdd5Aac9JrgucNDmdZ9ma9Xr9S0gaViJdAwPOa/TaQzT6ge3nqRls+ffr047fffvvL2YIX48H5BcBQFPoS1ap9Nt7rYMw4ctLt7e3PNisRYz5DGePeavOUBw050sr8d5LKexcAA93hZjabATCvMVM2lzH6gF2BV5mju729/SNJkrfb7fbPMjcgtK+dA8elE/C0hACk1Wr1xDrd2A8Xi8Vfh8PhsUiaGC4eAyfnEsheVmXZnqI1+vQ3rYB3e3v7br/fvwz5XFjsJEluvv766999jjqrzvfKsc/5hmzw5Bz4Pi1yU3NpBDyxIkMhrE+fPr3e7Xa/w6lm9QbznzIG+NlsNpA4SOPD5XL5AKByNMaRchlkRGaIPabVJH8HHy8YVmtqQdsctxHwKgwHcFd+1ZIoBowAybFPZ/oz2H/DhZjP53c+8z4UB63rNrS56LHu1Tp4MnGoyt1u97d27hWIQYOGVSjio1CjN0xkOskCjbWIXY3TGXjG0UayVSQNjrmoQoTK8DnSPPS91DNApbKEOr/v1BxgV4t/3/v2AjzfQ+jQGZx39vMAIPw9DbCrKmK1e42ojfYZddbdGj/3XcAu/74x8FhCYIi4hTTSpo0PlylQ0RZIFgwSqkXgCAt+/Tibzd7BvcC1i8Xiqc6Oc4oJxopI74W3eewbVkJHoMXkRQZoiPq7ghEGD2oUvhtCZdjfkMBFaKwQ/JbvbbD62PkO8frGJC+gCgEWVF4hTRNikCkjBpLo5bsMceFjzLl18Kx1qROmOtTF1ij8O1ie14Ek7MP5fP5Iuw4AG/HPsqBAjIXrwxitgmcfGAudJMkfaZqueV+jfY6vw++URWBAftzv9wATKhXRFKheSil5xj2L0uhOwJMQmK2vYzBfHQ6H94vFIoUhIgYIJGy32/0WCrEJjZDTSk4ts8Riz4QVOqpCzGjgsQkOSQkWO5qMuuOYCGeFLVTx2yS35zLn6ntyFSB57Kwj647fAVBlM4I6c+2DWqyaQ0zwyBfTb7cOMvvM+oowGtQmfgAGcTGlimg2m0GFojRMWGOVgHnclMGTk6KBV/WW4Htkvvf7/U+8jxWsR09tHtwEcdAhqeB7EkVw7EHnOuvZKngq6gGjw2UE1OfXi8Ui2263v7PFCOkCaLRXWZWI/UyyDiyVuNbL+1T3qEwE11m4PlzTCXhsWTpyUZZl2KvgDhAhl39gZEA6YU3ic8eclvwdf+7o7WyVImPxQ5lhM5ZK2dbBq2BFi5qUSApRCsVQMSxrctirKPFjVrGNg2cXV8UoARTtYSJqyAowZ8XFROGsT6fTzxK/FKoh/D2mDV4tFotHoeqfKrJTH9TfqXNoBDzNHQkRgSytz0ZekiR5dzgcsOcRyPP5HBzLn1hlAnQJPJeCd+rCDOHvmgKvViTfSoXseWKNKoDIh+MFlX1R74EwVNz/TyHTDpFd3Qh4dd5azoC/nk6nNxKblIIRqMTlcvmXcFeUpfgY9QsctyQL1MOHwccu36f+NtgxqWrfrPM8XVzTGnhSoxAgDuVqHaSGT0uTWKhsfQI4Up0malMIFPDfkbVqgwhdLHjMe7YGXtmk2YgRX64Qf2SJhOpEIPqjyjhgWCRkv1MGTaisORisHipBtxfgaWtTgfBssVg8uLu7u2JDhbr8mRSSi74olwJpohTkJg5SO0ph6AXSlUkxJaPpsRoHT6dtZE8LOcnGSiViraVFCHgeprV2+knKfEYIq+2ci9L0Ijc1fhvgFdRVXTWlmGKfpU+Zpwxa4p2iVkvTPkO0KkPgNw4erEGoPT0BhMM4BkkcFVWPnpMIk/Khv2HDg3gvMEDm8/lzZl8j2gIA8R2k0JWKNfXmdz1u4+BV7DMTiY74+ksH1J7sczK0WJGFPKK1bLte7Nj3jwreMSqp6lokaPf7/UbXMPgeXnw03gvLSqu9mYzYC9rmeLHBg1TgJ9etwT6Qj9lsy7F8uT0prGTAENuk2nTeQ3Fvkb6q3i1CJRx0i+Oo4FW9dZvN5m2api94b8LCS4Yc0Q8KRqv0kFibmpxLWQfez2wTAeF6ioUqyV4vQGOwOlsFzxgtrju7WJ9cPYRMu24OIE1yqG5BEZNIesRwYWIu0eHrEI18e2zVy9e377sET0tUKCpCqlB8NpZO6fwHSSPwVAD7GRx0WwLGUgZVXtnTs28Alc2ncfBCpcUqL0fmv11Y+d5XAsb7HHE2OTD9i9AmfBl0SFlZzm9IgOm5Ng6e3KzKujQq9aHEKwUcgMIxzT+VpLnyZo6PIs75gPmeoyfetgketaUqaQr3fj6fP4XK8zRHdb0ydXaCDRcyTCTuKXRAMLGRzFUxT2rMo14m8Q+Pog32SUpbA6/OopnYJu2DJuWjrc1cZEarXl9dA6vaUTWT6wI8WXSvJJomcZAO7IdEXzcNdXQNXi7Rei7dIaKCV9VlKLTvbTabN2mawsdDs4FCfTlT+nCABjoAwkVAlwcASySkPqmyNucSGzzhV4aKIF1bfaMOAQQFk5V6BUjw2eB0C1DXm80mOxwOaF8lfuLbYxhixxhObQJxyr2igld3AmyQAEiSGk08QsOd1Wr1gwJRF5poqYOhIdxNicYQG1osT9WMwO2dxxSk1H2erq7rBDwxHlS9ea72QCVgiepuWhMDQCl5Jun0FLhAKqWSiBz9UxvOdQVMnfs2Ap5OmJZNwtfghiUDf4bYJ4ov36Vp+h87jo8JzXlCOO+DNf/rgCbXNAUeha5MuZevQ63b14yTTtYjS5VuNkBSB0d8t9u9uru7e2KBKuvBGYr2WOf/mAXs8tpGwPM9kGQLKiQRoE+m0+nzq6sr2vfsEWzCmGZnHBIGY0a6SlCayNY2qH21wOeU74Yora2BFwJNjAuhLUggWhksVEHkkUx8JE53Lu3DahtSCl8w50qMqRdZZ+D5JFE4K5JUVdkEws4YLg85GI2ziryHbAQ0QC0qfpfqsO69Wwevpvp8sVwu//3y5QuC0J+5Xyc63r4VwlGdw36FnMthttFV07YOnlF/RKyVLIAqYYaqfKb8NRgtFCJDNOZwOEgQAP/mztMLncFwjCNf983v+rrWwGNCEZ0Pq4okdULWpYGsH6i6RcACpYz6bDZ7zk0FXqAH5263A1kJdD+yascUSQm9JI2AJ/XhJtwFycHCC4vLF0LTLGmXoFW9pQE2DBE00aGoyXQ6fXd1daV7VEtvM4rG2LOHbKO5rqXnPvePDl6dsw6qLD4OPlNcM2R0sKsgh2e4/azG2AXKxaXE64hXSKk2IRfZhgFSVOJO5sqyDJILSYJqhOuAIDYVnnB2QbgtuQy6CYAHK4iGKJHRJe8IDOGAX6OIElalLYjU6SEJhZXR9WDczOfz76R+XdJTqi7vA1utYKcNmq/ZaHisCkDJ34VU4nK5TLlNv+xfIqH2uBorZTlGmu8ItjpqvWr+ffm+FcmDxIhLUBJpse2GrQvgVKlq45hjPuu9S6eZ+rLYsefRCni++KHn7AVqlqOa6UiHW6R/YPqTK7HdbjFnWKzY8yBpVBUkZFy+F7GnebzRnq0QBTwfqfWYTuuyl7EBIjk8aZBDDd6wXyVJ8n673SI9RC2LQ6xndX4eqVtEZYZ81Fqjfl4gil87hmh7skg5sh5X1fG5fU1LtK9gU9W6D77Dnw/AKJJXpss3m83rNE3R/KZAuwvVz93c3MDx/kEki7PgjhqBkmaOruDW8PHQtwz7H9Ru7lTL2PtMn8ZrHDx5WH14oS8LrrkrzBb7EQcbSgdbS9bl9o9oGkCUCBMzLbTs79Oix5pLa+CVWZmGMCtnDYHtjH2PmGXChFZVQjn1WbUg7NhTWK3q2qF83wl4vD/RyV3apJc9SlI4UINJklylaSrd3amt/ylBZ6hVpJlsV6WhANXJnmdvqit2eE+j1vtsfOBfIhCpThCFKlfeK4njos4YwnFt5NwPGZBj5t6J5FU56ty6caPLo23AWbq+c80eUR7E4mQ1i7joqOrx7LpFBU/7XXqxBQx99rlHImElwvhwqpQrfZDukQITSsiytYn2IIXad1X3V6tC9pg3vW/XxgYPxgUdl6YPo5dGcLyXFSiALDUFv1AB8RW3pPofHPQkSX5N0/T7OouprVXpDj8WiYwKXp3FZKAKlqLpbOQYY5pIixdiuVxmX758wQkosEpTLj7xdVmiHpwcYfnuEmGpi07Jdaxa5cg1b9zRdEVyXeDFF1ThNNwJ2fSf2al3OT/j9+UOCI7wGL0YoivJk0bg0s1B1+BBRVIsUtSc5nIGaO7SgwXjuv4svVjhBifROHgmskIcFEuiVeeauxbEUjwiPqFU/CC1tN1usfdRldFms7mGH4g1KguGj6F1R3Rrs6r1/THNapjqQAc2qU7vRIWw9xHnvi59QbokjekklHtLXhXhx+MSFIpQzP7kWF92jwv10CzxGyszG0OWyHuDF0Ol+1jUInnq4Asq2+IG4VCblKSV+/P1OLobfaeFu1mocwi8TJDuwSVto4Fn6XOhciprBVpHm7MFqD/A3kh16kmSYF/D/vbv4XB4whl1AkrGC9Q+OCmuUu8xXsK2x4gJnqtGLXsI3c/ZSAva7j+H32YAFkoDsgHkYuj2jBY0Q/Vz3d7rvExtL/597xcNvKqJ4M2fzWaP9vv9L7hWH6HNERndzUgAA1D4nDgsqlkOJWCP3U+r5ji071sDr8So0Gznx6arH8ArNPOGdImVycWWuc5KcthUkiQvOJ00ylZWrYFnc3C+niu6j4t2MfTB9YiTLhaLO7wMXF0E31Fo7/S7r0BTUk1Dk66y+TYOnioScfuPHCEjnR70vqVCX9LNIVf146EMkmOvcoCjJBv5QIwKns8h92W9A58JOxrmvz5uxmUqfA8ASZxOp0+lhn1MklX1LLHBqxUA1qdsiQmvQ1taTeIBLC+0DhsaY8jBwENsFlAFHL6PDR6xnOvS72yjb0xIRVV8aR6SQtxjuVy+43oG70H3DDoBaN0PWRjbbanOgvXpmqjgyYIZ51laTkkOr+wcdWrLodpxSAb9jXA5+R65itpTq36ODe31CbjokhfYkwpd2j3+GbkIOKWZM/EIROfa/AtpV4wTO4acLVRWgdS3xb/vfKJLXp0JKdVIZj+fE5uzEhWZiD6XSqPtdgti0tH8FHkZxkKBaEvyCu2AVbREyLTSZph8NPbVsOehChbRltzpzT71rF8a1YCglgFV54Xr4zWdSJ6qWtWZAoTN4CK4Umd9MqU0TN3v93SoFM5gWK1WTzw1eYVOgX1c+BhzahW8QJcIyZ5LpEQ3TJUaPXwGoMlQ4azC957WVO6gjRiL0/cxGgWvKtEpZCRpkCM+3Ww2e8qsMFGZV/P5/JHnsAsvjZDHcc3EQyAMPU3UBnjBcJVOD+kFVpYl9WJR5wvl0k62q1HVYVIeK9fbHaLvEifziwKez9mWGzAvhQ7q9UmE7cQOY2M6nX7c7XZTfUqXil1KaumljZyorhE5UOQAqqGAUneeUcCrczPLtSwrtWKGNaROelBT44AkSR4dDgdk2W3fFp0LxHegP4y+63ub4AUPpAB9L0mSOzmeVGfYlQRLdoEaquJHeCdK4rzn015im3XEq+Y1Om+nVamhN0jUhaqFpAaCr5fTTq7n8/m/aJyz3W5RJQtgwZqmsjB2zCGVlcdt15x6ry77P2pkWVZ5c4r2AAAAAElFTkSuQmCC'\n />\n </defs>\n </svg>\n);\n\nexport default PersonWithChecklistSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport TrialBenefitsModalStepMore from './trial_benefits_modal_step_more';\n\nimport './trial_benefits_modal_step.scss';\n\nexport type TrialBenefitsModalStepProps = {\n id: string;\n title: string;\n description: string | JSX.Element;\n svgWrapperClassName: string;\n svgElement: React.ReactNode;\n bottomLeftMessage?: string;\n buttonLabel?: string;\n pageURL?: string;\n isCloud?: boolean;\n onClose?: () => void;\n}\n\nconst TrialBenefitsModalStep = (\n {\n id,\n title,\n description,\n svgWrapperClassName,\n svgElement,\n bottomLeftMessage,\n buttonLabel,\n pageURL,\n onClose,\n }: TrialBenefitsModalStepProps) => {\n return (\n <div\n id={`trialBenefitsModalStep-${id}`}\n className='TrialBenefitsModalStep slide-container'\n >\n <div className='title'>\n {title}\n </div>\n <div className='description'>\n {description}\n </div>\n {(pageURL && buttonLabel) && (\n <TrialBenefitsModalStepMore\n id={id}\n route={pageURL}\n message={buttonLabel}\n onClick={onClose}\n />\n )}\n <div className={`${svgWrapperClassName} svg-wrapper`}>\n {svgElement}\n </div>\n {bottomLeftMessage && (\n <div className='bottom-text-left-message'>\n {bottomLeftMessage}\n </div>\n )}\n </div>\n );\n};\n\nexport default TrialBenefitsModalStep;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport React, {useCallback, useEffect, useMemo} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport {matchPath, useLocation} from 'react-router-dom';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport BlockableLink from 'components/admin_console/blockable_link';\nimport SystemRolesSVG from 'components/admin_console/feature_discovery/features/images/system_roles_svg';\nimport Carousel from 'components/common/carousel/carousel';\nimport useOpenInvitePeopleModal from 'components/common/hooks/useOpenInvitePeopleModal';\nimport GuestAccessSvg from 'components/common/svg_images_components/guest_access_svg';\nimport MonitorImacLikeSVG from 'components/common/svg_images_components/monitor_imaclike_svg';\nimport PersonWithChecklistSvg from 'components/common/svg_images_components/person_with_checklist';\nimport SuccessSvg from 'components/common/svg_images_components/success_svg';\n\nimport {ConsolePages, DocLinks, ModalIdentifiers, TELEMETRY_CATEGORIES} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport TrialBenefitsModalStep from './trial_benefits_modal_step';\nimport type {TrialBenefitsModalStepProps} from './trial_benefits_modal_step';\n\nimport './trial_benefits_modal.scss';\n\nexport type Props = {\n onClose?: () => void;\n onExited: () => void;\n trialJustStarted?: boolean;\n}\n\nconst TrialBenefitsModal = ({\n onClose,\n onExited,\n trialJustStarted,\n}: Props): JSX.Element | null => {\n const {formatMessage} = useIntl();\n\n const license = useSelector((state: GlobalState) => getLicense(state));\n const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.TRIAL_BENEFITS_MODAL));\n\n // determine if the modal will be open from admin console so the action button must be close instead of the invite people CTA\n // since console is team/channel agnostic\n const {pathname} = useLocation();\n const inAdminConsole = matchPath(pathname, {path: '/admin_console'}) != null;\n\n const isCloud = license?.Cloud === 'true';\n\n const openInvitePeopleModal = useOpenInvitePeopleModal();\n\n useEffect(() => {\n if (!trialJustStarted) {\n trackEvent(\n TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_MODAL,\n 'benefits_modal_post_enterprise_view',\n );\n }\n }, []);\n\n // by default all licence last 30 days plus 8 hours. We use this value as a fallback for the trial license duration information shown in the modal\n const trialLicenseDuration = (1000 * 60 * 60 * 24 * 30) + (1000 * 60 * 60 * 8);\n const trialEndDate = moment.unix((Number(license?.ExpiresAt) || new Date(Date.now()).getTime() + trialLicenseDuration) / 1000).format('MMMM,DD,YYYY');\n\n const buttonLabel = formatMessage({id: 'learn_more_trial_modal_step.learnMoreAboutFeature', defaultMessage: 'Learn more about this feature.'});\n\n const steps: TrialBenefitsModalStepProps[] = useMemo(() => [\n {\n id: 'useSso',\n title: formatMessage({id: 'trial_benefits.modal.useSsoTitle', defaultMessage: 'Use SSO (with OpenID, SAML, Google, O365)'}),\n description: formatMessage({id: 'trial_benefits.modal.useSsoDescription', defaultMessage: 'Sign on quickly and easily with our SSO feature that works with OpenID, SAML, Google, and O365.'}),\n svgWrapperClassName: 'guestAccessSvg',\n svgElement: (\n <GuestAccessSvg\n width={400}\n height={180}\n />\n ),\n pageURL: DocLinks.SETUP_SAML,\n buttonLabel,\n },\n {\n id: 'ldap',\n title: formatMessage({id: 'trial_benefits.modal.ldapTitle', defaultMessage: 'Synchronize your Active Directory/LDAP groups'}),\n description: formatMessage({id: 'trial_benefits.modal.ldapDescription', defaultMessage: 'Use AD/LDAP groups to organize and apply actions to multiple users at once. Manage team and channel memberships, permissions and more.'}),\n svgWrapperClassName: 'personMacSvg',\n svgElement: (\n <MonitorImacLikeSVG\n width={400}\n height={180}\n />\n ),\n pageURL: DocLinks.SETUP_LDAP,\n buttonLabel,\n },\n {\n id: 'systemConsole',\n title: formatMessage({id: 'trial_benefits.modal.systemConsoleTitle', defaultMessage: 'Provide controlled access to the System Console'}),\n description: formatMessage({id: 'trial_benefits.modal.systemConsoleDescription', defaultMessage: 'Assign customizable admin roles to give designated users read and/or write access to select sections of System Console.'}),\n svgWrapperClassName: 'personBoxSvg',\n svgElement: (\n <SystemRolesSVG\n width={400}\n height={180}\n />\n ),\n pageURL: ConsolePages.LICENSE,\n buttonLabel,\n },\n {\n id: 'playbooks',\n title: formatMessage({id: 'trial_benefits.modal.playbooksTitle', defaultMessage: 'Playbooks get superpowers'}),\n description: formatMessage({id: 'trial_benefits.modal.playbooksDescription', defaultMessage: 'Create private playbooks, manage granular permissions schemes, and track custom metrics with a dedicated dashboard.'}),\n svgWrapperClassName: 'personSheetSvg',\n svgElement: (\n <PersonWithChecklistSvg\n width={250}\n height={200}\n />\n ),\n pageURL: '/playbooks/start',\n buttonLabel: formatMessage({id: 'trial_benefits.modal.playbooksButton', defaultMessage: 'Open Playbooks'}),\n },\n ], []);\n\n let trialJustStartedTitle = formatMessage({id: 'trial_benefits.modal.trialStartTitle', defaultMessage: 'Your trial has started! Explore the benefits of Enterprise'});\n\n if (isCloud) {\n trialJustStartedTitle = formatMessage({id: 'trial_benefits.modal.trialStartTitleCloud', defaultMessage: 'Your trial has started!'});\n }\n\n // declares the content shown just after the trial has started\n const trialJustStartedDeclaration = {\n id: 'trialStart',\n title: trialJustStartedTitle,\n description: (\n <>\n <FormattedMessage\n id='trial_benefits.modal.trialStartedDescriptionIntro'\n defaultMessage='Welcome to your Mattermost Enterprise trial! It expires on {trialExpirationDate}. '\n values={{\n trialExpirationDate: trialEndDate,\n }}\n />\n <FormattedMessage\n id='trial_benefits.modal.trialStartedDescriptionBody'\n defaultMessage='You now have access to <guestAccountsLink>guest accounts</guestAccountsLink>, <autoComplianceReportsLink>automated compliance reports</autoComplianceReportsLink>, and <mobileSecureNotificationsLink>mobile secure-ID push notifications</mobileSecureNotificationsLink>, among many other features.'\n values={{\n guestAccountsLink: (text: string) => (\n <BlockableLink\n to={ConsolePages.GUEST_ACCOUNTS}\n onClick={handleOnClose}\n >\n {text}\n </BlockableLink>\n ),\n autoComplianceReportsLink: (text: string) => (\n <BlockableLink\n to={ConsolePages.COMPLIANCE_EXPORT}\n onClick={handleOnClose}\n >\n {text}\n </BlockableLink>\n ),\n mobileSecureNotificationsLink: (text: string) => (\n <BlockableLink\n to={ConsolePages.PUSH_NOTIFICATION_CENTER}\n onClick={handleOnClose}\n >\n {text}\n </BlockableLink>\n ),\n }}\n />\n </>\n ),\n svgWrapperClassName: 'handsSvg',\n svgElement: (\n <SuccessSvg\n width={162}\n height={103.5\n }\n />\n ),\n bottomLeftMessage: formatMessage({id: 'trial_benefits.modal.onlyVisibleToAdmins', defaultMessage: 'Only visible to admins'}),\n isCloud,\n };\n\n const handleOnClose = useCallback(() => {\n if (onClose) {\n onClose();\n }\n\n onExited();\n }, [onClose, onExited]);\n\n const invitePeople = () => {\n openInvitePeopleModal();\n handleOnClose();\n };\n\n const handleOnPrevNextSlideClick = useCallback((slideIndex: number) => {\n const slideId = steps[slideIndex - 1]?.id;\n\n if (slideId) {\n trackEvent(\n TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_MODAL,\n 'benefits_modal_slide_shown_' + slideId,\n );\n }\n }, [steps]);\n\n const getSlides = useCallback(() => steps.map(({id, ...rest}) => (\n <TrialBenefitsModalStep\n {...rest}\n id={id}\n key={id}\n onClose={handleOnClose}\n />\n )), [steps, handleOnClose]);\n\n const trialJustStartedScreen = ({\n id,\n title,\n description,\n svgWrapperClassName,\n svgElement,\n bottomLeftMessage,\n isCloud,\n }: TrialBenefitsModalStepProps) => {\n // when we are in cloud, ommit the cta to go to the system console, this because the license changes take some time to get applied (see MM-44463)\n // also, the design of the modal changes a little bit by placing the svg image on top and the title changes too.\n let actionButton = (\n <a\n className={`${isCloud ? 'primary-button' : 'tertiary-button'}`}\n onClick={handleOnClose}\n >\n <FormattedMessage\n id='trial_benefits_modal.trial_just_started.buttons.close'\n defaultMessage='Close'\n />\n </a>\n );\n\n if (isCloud && !inAdminConsole) {\n actionButton = (\n <a\n className='primary-button'\n onClick={invitePeople}\n >\n <FormattedMessage\n id='trial_benefits_modal.trial_just_started.buttons.invitePeople'\n defaultMessage='Invite people'\n />\n </a>\n );\n }\n return (\n <div\n id={`trialBenefitsModalStarted-${id}`}\n className='TrialBenefitsModalStep trial-just-started slide-container'\n >\n {isCloud && <div className={`${svgWrapperClassName} svg-wrapper`}>\n {svgElement}\n </div>}\n <div className='title'>\n {title}\n </div>\n <div className='description'>\n {description}\n </div>\n {!isCloud && <div className={`${svgWrapperClassName} svg-wrapper`}>\n {svgElement}\n </div>}\n <div className='buttons-section-wrapper'>\n {actionButton}\n {!isCloud &&\n <BlockableLink\n className='primary-button'\n to={ConsolePages.GUEST_ACCOUNTS}\n onClick={handleOnClose}\n >\n <FormattedMessage\n id='trial_benefits_modal.trial_just_started.buttons.setUp'\n defaultMessage='Set up system console'\n />\n </BlockableLink>\n }\n </div>\n {bottomLeftMessage && (\n <div className='bottom-text-left-message'>\n {bottomLeftMessage}\n </div>\n )}\n </div>\n );\n };\n\n const content = () => {\n if (trialJustStarted) {\n return trialJustStartedScreen(trialJustStartedDeclaration);\n }\n return (\n <Carousel\n dataSlides={getSlides()}\n id={'trialBenefitsModalCarousel'}\n infiniteSlide={false}\n onNextSlideClick={handleOnPrevNextSlideClick}\n onPrevSlideClick={handleOnPrevNextSlideClick}\n />\n );\n };\n\n return (\n <GenericModal\n className='TrialBenefitsModal'\n show={show}\n id='trialBenefitsModal'\n onExited={handleOnClose}\n >\n {content()}\n </GenericModal>\n );\n};\n\nexport default TrialBenefitsModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useCallback} from 'react';\nimport {useDispatch} from 'react-redux';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {openModal} from 'actions/views/modals';\n\nimport InvitationModal from 'components/invitation_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nexport default function useOpenInvitePeopleModal() {\n const dispatch = useDispatch();\n return useCallback(() => {\n trackEvent('invite_people', 'click_open_invite_people_modal');\n dispatch(openModal({\n modalId: ModalIdentifiers.INVITATION,\n dialogType: InvitationModal,\n }));\n }, [dispatch]);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {TELEMETRY_CATEGORIES} from 'utils/constants';\n\nimport './trial_benefits_modal_step_more.scss';\n\nexport type TrialBenefitsModalStepMoreProps = {\n id: string;\n route: string;\n message: string;\n telemetryId?: string;\n onClick?: () => void;\n styleLink?: boolean; // show as a anchor link\n}\n\nconst TrialBenefitsModalStepMore = (\n {\n id,\n route,\n message,\n onClick,\n styleLink = false,\n telemetryId = 'benefits_modal',\n }: TrialBenefitsModalStepMoreProps) => {\n const history = useHistory();\n\n const redirect = useCallback(() => {\n if (route.indexOf('http://') === 0 || route.indexOf('https://') === 0) {\n window.open(route);\n } else {\n history.push(route);\n }\n\n if (onClick) {\n onClick();\n }\n\n trackEvent(\n TELEMETRY_CATEGORIES.SELF_HOSTED_START_TRIAL_MODAL,\n telemetryId + '_section_opened_' + id,\n );\n }, [route, onClick]);\n\n return (\n <a\n className={`TrialBenefitsModalStepMore ${styleLink ? '' : 'learn-more-button'}`}\n onClick={redirect}\n >\n {message}\n </a>\n );\n};\n\nexport default TrialBenefitsModalStepMore;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport React, {memo, useEffect, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getPrevTrialLicense} from 'mattermost-redux/actions/admin';\nimport {checkHadPriorTrial, isCurrentLicenseCloud, getSubscriptionProduct as selectSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {isAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport useOpenSalesLink from 'components/common/hooks/useOpenSalesLink';\nimport StartTrialBtn from 'components/learn_more_trial_modal/start_trial_btn';\n\nimport {CloudProducts, LicenseSkus} from 'utils/constants';\nimport {getBrowserTimezone} from 'utils/timezone';\n\nfunction ADLDAPUpsellBanner() {\n const [show, setShow] = useState(true);\n const [confirmed, setConfirmed] = useState(false);\n\n const dispatch = useDispatch();\n const {formatMessage} = useIntl();\n const [openSalesLink] = useOpenSalesLink();\n\n useEffect(() => {\n dispatch(getPrevTrialLicense());\n }, []);\n\n const isAdminUser = isAdmin(useSelector(getCurrentUser).roles);\n const isCloud = useSelector(isCurrentLicenseCloud);\n const currentLicense = useSelector(getLicense);\n const prevTrialLicense = useSelector((state: GlobalState) => state.entities.admin.prevTrialLicense);\n const product = useSelector(selectSubscriptionProduct);\n\n const prevCloudTrialed = useSelector(checkHadPriorTrial);\n const prevSelfHostedTrialed = prevTrialLicense?.IsLicensed === 'true';\n const prevTrialed = prevSelfHostedTrialed || prevCloudTrialed;\n\n const isSelfHostedProfessional = currentLicense?.SkuShortName === LicenseSkus.Professional;\n const isCloudProfessional = product?.sku === CloudProducts.PROFESSIONAL;\n const isProfessional = isSelfHostedProfessional || isCloudProfessional;\n\n if (!show) {\n return null;\n }\n\n const currentLicenseEndDate = new Date(parseInt(currentLicense?.ExpiresAt, 10));\n\n const confirmBanner = (\n <div className='ad_ldap_upsell_confirm'>\n <div className='upsell-confirm-backdrop'/>\n <div className='upsell-confirm-foreground'>\n <p className='title'>{formatMessage({id: 'adldap_upsell_banner.confirm.title', defaultMessage: 'Your trial has started!'})}</p>\n <p className='subtitle'>{formatMessage({id: 'adldap_upsell_banner.confirm.license_trial', defaultMessage: 'Welcome to your Mattermost Enterprise trial! It expires on {endDate}. You now have access to high-security Enterprise features, for free.'}, {endDate: moment(currentLicenseEndDate).tz(getBrowserTimezone()).format('MMMM Do YYYY')})}</p>\n <div className='btns-container'>\n <button\n className='confrim-btn learn-more'\n onClick={openSalesLink}\n >\n {formatMessage({id: 'adldap_upsell_banner.confirm.learn_more', defaultMessage: 'Learn more'})}\n </button>\n <button\n className='confrim-btn continue'\n onClick={() => setShow(false)}\n >\n {formatMessage({id: 'adldap_upsell_banner.confirm.continue', defaultMessage: 'Continue'})}\n </button>\n </div>\n </div>\n </div>\n );\n\n if (confirmed) {\n return confirmBanner;\n }\n\n if (!isAdminUser) {\n return null;\n }\n\n if (!isProfessional) {\n return null;\n }\n\n let btn: JSX.Element | null = (\n <StartTrialBtn\n btnClass='ad-ldap-banner-btn'\n telemetryId={'start_self-hosted_trial_from_adldap_upsell_banner'}\n renderAsButton={true}\n onClick={() => setConfirmed(true)}\n />);\n\n if (prevTrialed || isCloud) {\n btn = (\n <button\n className='ad-ldap-banner-btn'\n onClick={openSalesLink}\n >\n {formatMessage({id: 'adldap_upsell_banner.sales_btn', defaultMessage: 'Contact sales to use'})}\n </button>\n );\n }\n\n return (\n <div\n id='ad_ldap_upsell_banner'\n className='ad_ldap_upsell_banner'\n >\n <div className='message'>\n <i className='icon icon-information-outline'/>\n {formatMessage({id: 'adldap_upsell_banner.banner_message', defaultMessage: 'AD/LDAP group sync creates groups faster'})}\n </div>\n <div className='btn-container'>\n {btn}\n <button\n type='button'\n aria-label='Close'\n className='banner-close'\n onClick={() => setShow(false)}\n >\n <span aria-hidden='true'>{'×'}</span>\n <span className='sr-only'>{'Close'}</span>\n </button>\n </div>\n </div>\n );\n}\n\nexport default memo(ADLDAPUpsellBanner);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\ntype Props = {\n selectedFilter: string;\n getGroups: (page: number, groupType: string) => void;\n}\n\nconst UserGroupsFilter = (props: Props) => {\n const {\n selectedFilter,\n getGroups,\n } = props;\n\n const intl = useIntl();\n\n const allGroupsOnClick = useCallback(() => {\n getGroups(0, 'all');\n }, [getGroups]);\n\n const myGroupsOnClick = useCallback(() => {\n getGroups(0, 'my');\n }, [getGroups]);\n\n const archivedGroupsOnClick = useCallback(() => {\n getGroups(0, 'archived');\n }, [getGroups]);\n\n const filterLabel = useCallback(() => {\n if (selectedFilter === 'all') {\n return intl.formatMessage({id: 'user_groups_modal.showAllGroups', defaultMessage: 'Show: All Groups'});\n } else if (selectedFilter === 'my') {\n return intl.formatMessage({id: 'user_groups_modal.showMyGroups', defaultMessage: 'Show: My Groups'});\n } else if (selectedFilter === 'archived') {\n return intl.formatMessage({id: 'user_groups_modal.showArchivedGroups', defaultMessage: 'Show: Archived Groups'});\n }\n return '';\n }, [selectedFilter]);\n\n return (\n <div className='more-modal__dropdown'>\n <MenuWrapper id='groupsFilterDropdown'>\n <a>\n <span>{filterLabel()}</span>\n <span className='icon icon-chevron-down'/>\n </a>\n <Menu\n openLeft={false}\n ariaLabel={intl.formatMessage({id: 'user_groups_modal.filterAriaLabel', defaultMessage: 'Groups Filter Menu'})}\n >\n <Menu.Group>\n <Menu.ItemAction\n id='groupsDropdownAll'\n buttonClass='groups-filter-btn'\n onClick={allGroupsOnClick}\n text={intl.formatMessage({id: 'user_groups_modal.allGroups', defaultMessage: 'All Groups'})}\n rightDecorator={selectedFilter === 'all' && <i className='icon icon-check'/>}\n />\n <Menu.ItemAction\n id='groupsDropdownMy'\n buttonClass='groups-filter-btn'\n onClick={myGroupsOnClick}\n text={intl.formatMessage({id: 'user_groups_modal.myGroups', defaultMessage: 'My Groups'})}\n rightDecorator={selectedFilter === 'my' && <i className='icon icon-check'/>}\n />\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemAction\n id='groupsDropdownArchived'\n buttonClass='groups-filter-btn'\n onClick={archivedGroupsOnClick}\n text={intl.formatMessage({id: 'user_groups_modal.archivedGroups', defaultMessage: 'Archived Groups'})}\n rightDecorator={selectedFilter === 'archived' && <i className='icon icon-check'/>}\n />\n </Menu.Group>\n </Menu>\n </MenuWrapper>\n </div>\n );\n};\n\nexport default React.memo(UserGroupsFilter);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect, useRef, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport type {ListChildComponentProps} from 'react-window';\nimport {VariableSizeList} from 'react-window';\nimport InfiniteLoader from 'react-window-infinite-loader';\n\nimport type {Group, GroupPermissions} from '@mattermost/types/groups';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport LoadingScreen from 'components/loading_screen';\nimport NoResultsIndicator from 'components/no_results_indicator';\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\nimport ViewUserGroupModal from 'components/view_user_group_modal';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\nimport ADLDAPUpsellBanner from '../ad_ldap_upsell_banner';\n\nexport type Props = {\n groups: Group[];\n searchTerm: string;\n loading: boolean;\n groupPermissionsMap: Record<string, GroupPermissions>;\n loadMoreGroups: () => void;\n onExited: () => void;\n backButtonAction: () => void;\n hasNextPage: boolean;\n actions: {\n archiveGroup: (groupId: string) => Promise<ActionResult>;\n restoreGroup: (groupId: string) => Promise<ActionResult>;\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n}\n\nconst UserGroupsList = (props: Props) => {\n const {\n groups,\n searchTerm,\n loading,\n groupPermissionsMap,\n hasNextPage,\n loadMoreGroups,\n backButtonAction,\n onExited,\n actions,\n } = props;\n\n const infiniteLoaderRef = useRef<InfiniteLoader | null>(null);\n const variableSizeListRef = useRef<VariableSizeList | null>(null);\n const [hasMounted, setHasMounted] = useState(false);\n const [overflowState, setOverflowState] = useState('overlay');\n const {formatMessage} = useIntl();\n\n useEffect(() => {\n if (groups.length === 1) {\n setOverflowState('visible');\n }\n }, [groups]);\n\n useEffect(() => {\n if (hasMounted) {\n if (infiniteLoaderRef.current) {\n infiniteLoaderRef.current.resetloadMoreItemsCache();\n }\n if (variableSizeListRef.current) {\n variableSizeListRef.current.resetAfterIndex(0);\n }\n }\n setHasMounted(true);\n }, [searchTerm, groups.length, hasMounted]);\n\n const itemCount = hasNextPage ? groups.length + 1 : groups.length;\n\n const loadMoreItems = loading ? () => {} : loadMoreGroups;\n\n const isItemLoaded = (index: number) => {\n return !hasNextPage || index < groups.length;\n };\n\n const archiveGroup = useCallback(async (groupId: string) => {\n await actions.archiveGroup(groupId);\n }, [actions.archiveGroup]);\n\n const restoreGroup = useCallback(async (groupId: string) => {\n await actions.restoreGroup(groupId);\n }, [actions.restoreGroup]);\n\n const goToViewGroupModal = useCallback((group: Group) => {\n actions.openModal({\n modalId: ModalIdentifiers.VIEW_USER_GROUP,\n dialogType: ViewUserGroupModal,\n dialogProps: {\n groupId: group.id,\n backButtonCallback: backButtonAction,\n backButtonAction: () => {\n goToViewGroupModal(group);\n },\n },\n });\n onExited();\n }, [actions.openModal, onExited, backButtonAction]);\n\n const groupListOpenUp = (groupListItemIndex: number): boolean => {\n if (groupListItemIndex === 0) {\n return false;\n }\n return true;\n };\n\n const Item = ({index, style}: ListChildComponentProps) => {\n if (groups.length === 0 && searchTerm) {\n return (\n <NoResultsIndicator\n variant={NoResultsVariant.Search}\n titleValues={{channelName: `${searchTerm}`}}\n />\n );\n }\n if (isItemLoaded(index)) {\n const group = groups[index] as Group;\n if (!group) {\n return null;\n }\n\n return (\n <div\n className='group-row'\n style={style}\n key={group.id}\n onClick={() => {\n goToViewGroupModal(group);\n }}\n >\n <span className='group-display-name'>\n {\n group.delete_at > 0 &&\n <i className='icon icon-archive-outline'/>\n }\n {group.display_name}\n </span>\n <span className='group-name'>\n {'@'}{group.name}\n </span>\n <div className='group-member-count'>\n <FormattedMessage\n id='user_groups_modal.memberCount'\n defaultMessage='{member_count} {member_count, plural, one {member} other {members}}'\n values={{\n member_count: group.member_count,\n }}\n />\n </div>\n <div className='group-action'>\n <MenuWrapper\n isDisabled={false}\n stopPropagationOnToggle={true}\n id={`customWrapper-${group.id}`}\n >\n <button className='btn btn-icon btn-xs'>\n <i className='icon icon-dots-vertical'/>\n </button>\n <Menu\n openLeft={true}\n openUp={groupListOpenUp(index)}\n className={'group-actions-menu'}\n ariaLabel={formatMessage({id: 'admin.user_item.menuAriaLabel', defaultMessage: 'User Actions Menu'})}\n >\n <Menu.Group>\n <Menu.ItemAction\n onClick={() => {\n goToViewGroupModal(group);\n }}\n icon={<i className='icon-account-multiple-outline'/>}\n text={formatMessage({id: 'user_groups_modal.viewGroup', defaultMessage: 'View Group'})}\n disabled={false}\n />\n </Menu.Group>\n <Menu.Group>\n <Menu.ItemAction\n show={groupPermissionsMap[group.id].can_delete}\n onClick={() => {\n archiveGroup(group.id);\n }}\n icon={<i className='icon-archive-outline'/>}\n text={formatMessage({id: 'user_groups_modal.archiveGroup', defaultMessage: 'Archive Group'})}\n disabled={false}\n isDangerous={true}\n />\n <Menu.ItemAction\n show={groupPermissionsMap[group.id].can_restore}\n onClick={() => {\n restoreGroup(group.id);\n }}\n icon={<i className='icon-restore'/>}\n text={formatMessage({id: 'user_groups_modal.restoreGroup', defaultMessage: 'Restore Group'})}\n disabled={false}\n />\n </Menu.Group>\n </Menu>\n </MenuWrapper>\n </div>\n </div>\n );\n }\n if (loading) {\n return <LoadingScreen/>;\n }\n return null;\n };\n\n return (\n <div\n className='user-groups-modal__content user-groups-list'\n style={{overflow: overflowState}}\n >\n <InfiniteLoader\n ref={infiniteLoaderRef}\n isItemLoaded={isItemLoaded}\n itemCount={100000}\n loadMoreItems={loadMoreItems}\n >\n {({onItemsRendered, ref}) => (\n <VariableSizeList\n itemCount={itemCount}\n onItemsRendered={onItemsRendered}\n ref={ref}\n itemSize={() => 52}\n height={groups.length >= 8 ? 416 : Math.max(groups.length, 3) * 52}\n width={'100%'}\n >\n {Item}\n </VariableSizeList>)}\n </InfiniteLoader>\n <ADLDAPUpsellBanner/>\n </div>\n );\n};\n\nexport default React.memo(UserGroupsList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {archiveGroup, restoreGroup} from 'mattermost-redux/actions/groups';\nimport {getGroupListPermissions} from 'mattermost-redux/selectors/entities/roles';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport UserGroupsList from './user_groups_list';\n\nfunction mapStateToProps(state: GlobalState) {\n const groupPermissionsMap = getGroupListPermissions(state);\n return {\n groupPermissionsMap,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n archiveGroup,\n restoreGroup,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps, null, {forwardRef: true})(UserGroupsList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport CreateUserGroupsModal from 'components/create_user_groups_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\nexport type Props = {\n canCreateCustomGroups: boolean;\n onExited: () => void;\n backButtonAction: () => void;\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n}\n\nconst UserGroupsModalHeader = (props: Props) => {\n const goToCreateModal = useCallback(() => {\n props.actions.openModal({\n modalId: ModalIdentifiers.USER_GROUPS_CREATE,\n dialogType: CreateUserGroupsModal,\n dialogProps: {\n backButtonCallback: props.backButtonAction,\n },\n });\n props.onExited();\n }, [props.actions.openModal, props.backButtonAction, props.onExited]);\n\n return (\n <Modal.Header closeButton={true}>\n <Modal.Title\n componentClass='h1'\n id='userGroupsModalLabel'\n >\n <FormattedMessage\n id='user_groups_modal.title'\n defaultMessage='User Groups'\n />\n </Modal.Title>\n {\n props.canCreateCustomGroups &&\n <button\n className='user-groups-create btn btn-secondary btn-sm'\n onClick={goToCreateModal}\n >\n <FormattedMessage\n id='user_groups_modal.createNew'\n defaultMessage='Create Group'\n />\n </button>\n }\n </Modal.Header>\n );\n};\n\nexport default React.memo(UserGroupsModalHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport UserGroupsModalHeader from './user_groups_modal_header';\n\nfunction mapStateToProps(state: GlobalState) {\n const canCreateCustomGroups = haveISystemPermission(state, {permission: Permissions.CREATE_CUSTOM_GROUP});\n\n return {\n canCreateCustomGroups,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(UserGroupsModalHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect, useMemo, useState} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {defineMessage} from 'react-intl';\n\nimport type {GetGroupsForUserParams, GetGroupsParams, Group, GroupSearchParams} from '@mattermost/types/groups';\n\nimport './user_groups_modal.scss';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport NoResultsIndicator from 'components/no_results_indicator';\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport Constants from 'utils/constants';\n\nimport ADLDAPUpsellBanner from './ad_ldap_upsell_banner';\nimport {usePagingMeta} from './hooks';\nimport UserGroupsFilter from './user_groups_filter/user_groups_filter';\nimport UserGroupsList from './user_groups_list';\nimport UserGroupsModalHeader from './user_groups_modal_header';\n\nconst GROUPS_PER_PAGE = 60;\n\nexport type Props = {\n onExited: () => void;\n groups: Group[];\n myGroups: Group[];\n archivedGroups: Group[];\n searchTerm: string;\n currentUserId: string;\n backButtonAction: () => void;\n actions: {\n getGroups: (\n opts: GetGroupsParams,\n ) => Promise<ActionResult<Group[]>>;\n setModalSearchTerm: (term: string) => void;\n getGroupsByUserIdPaginated: (\n opts: GetGroupsForUserParams,\n ) => Promise<ActionResult<Group[]>>;\n searchGroups: (\n params: GroupSearchParams,\n ) => Promise<ActionResult>;\n };\n}\n\nconst UserGroupsModal = (props: Props) => {\n const [searchTimeoutId, setSearchTimeoutId] = useState(0);\n const [loading, setLoading] = useState(false);\n const [show, setShow] = useState(true);\n const [selectedFilter, setSelectedFilter] = useState('all');\n const [groupsFull, setGroupsFull] = useState(false);\n const [groups, setGroups] = useState(props.groups);\n\n const [page, setPage] = usePagingMeta(selectedFilter);\n\n useEffect(() => {\n if (selectedFilter === 'all') {\n setGroups(props.groups);\n }\n if (selectedFilter === 'my') {\n setGroups(props.myGroups);\n }\n if (selectedFilter === 'archived') {\n setGroups(props.archivedGroups);\n }\n }, [selectedFilter, props.groups, props.myGroups]);\n\n const doHide = () => {\n setShow(false);\n };\n\n const getGroups = useCallback(async (page: number, groupType: string) => {\n const {actions, currentUserId} = props;\n setLoading(true);\n const groupsParams: GetGroupsParams = {\n filter_allow_reference: false,\n page,\n per_page: GROUPS_PER_PAGE,\n include_member_count: true,\n };\n let data: ActionResult<Group[]> = {data: []};\n\n if (groupType === 'all') {\n groupsParams.include_archived = true;\n data = await actions.getGroups(groupsParams);\n } else if (groupType === 'my') {\n const groupsUserParams = {\n ...groupsParams,\n filter_has_member: currentUserId,\n include_archived: true,\n } as GetGroupsForUserParams;\n data = await actions.getGroupsByUserIdPaginated(groupsUserParams);\n } else if (groupType === 'archived') {\n groupsParams.filter_archived = true;\n data = await actions.getGroups(groupsParams);\n }\n\n if (data && data.data!.length === 0) {\n setGroupsFull(true);\n } else {\n setGroupsFull(false);\n }\n setLoading(false);\n setSelectedFilter(groupType);\n }, [props.actions.getGroups, props.actions.getGroupsByUserIdPaginated, props.currentUserId]);\n\n useEffect(() => {\n getGroups(0, 'all');\n return () => {\n props.actions.setModalSearchTerm('');\n };\n }, []);\n\n useEffect(() => {\n clearTimeout(searchTimeoutId);\n const searchTerm = props.searchTerm;\n\n if (searchTerm === '') {\n setLoading(false);\n setSearchTimeoutId(0);\n return;\n }\n\n const timeoutId = window.setTimeout(\n async () => {\n const params: GroupSearchParams = {\n q: searchTerm,\n filter_allow_reference: true,\n page,\n per_page: GROUPS_PER_PAGE,\n include_archived: true,\n include_member_count: true,\n };\n if (selectedFilter === 'all') {\n await props.actions.searchGroups(params);\n } else if (selectedFilter === 'my') {\n params.filter_has_member = props.currentUserId;\n await props.actions.searchGroups(params);\n } else if (selectedFilter === 'archived') {\n params.filter_archived = true;\n await props.actions.searchGroups(params);\n }\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n\n setSearchTimeoutId(timeoutId);\n }, [props.searchTerm, setSearchTimeoutId]);\n\n const handleSearch = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const term = e.target.value;\n props.actions.setModalSearchTerm(term);\n }, [props.actions.setModalSearchTerm]);\n\n const loadMoreGroups = useCallback(() => {\n const newPage = page + 1;\n setPage(newPage);\n if (selectedFilter === 'all' && !loading) {\n getGroups(newPage, 'all');\n }\n if (selectedFilter === 'my' && !loading) {\n getGroups(newPage, 'my');\n }\n if (selectedFilter === 'archived' && !loading) {\n getGroups(newPage, 'archived');\n }\n }, [selectedFilter, page, getGroups, loading]);\n\n const inputPrefix = useMemo(() => {\n return <i className={'icon icon-magnify'}/>;\n }, []);\n\n const noResultsType = useMemo(() => {\n if (selectedFilter === 'archived') {\n return NoResultsVariant.UserGroupsArchived;\n }\n return NoResultsVariant.UserGroups;\n }, [selectedFilter]);\n\n return (\n <Modal\n dialogClassName='a11y__modal user-groups-modal'\n show={show}\n onHide={doHide}\n onExited={props.onExited}\n role='none'\n aria-labelledby='userGroupsModalLabel'\n id='userGroupsModal'\n >\n <UserGroupsModalHeader\n onExited={props.onExited}\n backButtonAction={props.backButtonAction}\n />\n <Modal.Body>\n <div className='user-groups-search'>\n <Input\n type='text'\n placeholder={defineMessage({id: 'user_groups_modal.searchGroups', defaultMessage: 'Search Groups'})}\n onChange={handleSearch}\n value={props.searchTerm}\n data-testid='searchInput'\n className={'user-group-search-input'}\n inputPrefix={inputPrefix}\n />\n </div>\n <UserGroupsFilter\n selectedFilter={selectedFilter}\n getGroups={getGroups}\n />\n {(groups.length === 0 && !props.searchTerm) ? <>\n <NoResultsIndicator\n variant={noResultsType}\n />\n <ADLDAPUpsellBanner/>\n </> : <>\n <UserGroupsList\n groups={groups}\n searchTerm={props.searchTerm}\n loading={loading}\n hasNextPage={!groupsFull}\n loadMoreGroups={loadMoreGroups}\n onExited={props.onExited}\n backButtonAction={props.backButtonAction}\n />\n </>\n }\n </Modal.Body>\n </Modal>\n );\n};\n\nexport default React.memo(UserGroupsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useState} from 'react';\n\nexport function usePagingMeta(groupType: string): [number, (page: number) => void] {\n const [page, setPage] = useState(0);\n const [myGroupsPage, setMyGroupsPage] = useState(0);\n const [archivedGroupsPage, setArchivedGroupsPage] = useState(0);\n if (groupType === 'all') {\n return [page, setPage];\n } else if (groupType === 'my') {\n return [myGroupsPage, setMyGroupsPage];\n }\n\n return [\n archivedGroupsPage,\n setArchivedGroupsPage,\n ];\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Group} from '@mattermost/types/groups';\n\nimport {getGroups, getGroupsByUserIdPaginated, searchGroups} from 'mattermost-redux/actions/groups';\nimport {makeGetAllAssociatedGroupsForReference, makeGetMyAllowReferencedGroups, searchAllowReferencedGroups, searchMyAllowReferencedGroups, searchArchivedGroups, getArchivedGroups} from 'mattermost-redux/selectors/entities/groups';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {setModalSearchTerm} from 'actions/views/search';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport UserGroupsModal from './user_groups_modal';\n\nfunction makeMapStateToProps() {\n const getAllAssociatedGroupsForReference = makeGetAllAssociatedGroupsForReference();\n const getMyAllowReferencedGroups = makeGetMyAllowReferencedGroups();\n\n return function mapStateToProps(state: GlobalState) {\n const searchTerm = state.views.search.modalSearch;\n\n let groups: Group[] = [];\n let myGroups: Group[] = [];\n let archivedGroups: Group[] = [];\n if (searchTerm) {\n groups = searchAllowReferencedGroups(state, searchTerm, true);\n myGroups = searchMyAllowReferencedGroups(state, searchTerm, true);\n archivedGroups = searchArchivedGroups(state, searchTerm);\n } else {\n groups = getAllAssociatedGroupsForReference(state, true);\n myGroups = getMyAllowReferencedGroups(state, true);\n archivedGroups = getArchivedGroups(state);\n }\n\n return {\n showModal: isModalOpen(state, ModalIdentifiers.USER_GROUPS),\n groups,\n searchTerm,\n myGroups,\n archivedGroups,\n currentUserId: getCurrentUserId(state),\n };\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getGroups,\n setModalSearchTerm,\n getGroupsByUserIdPaginated,\n searchGroups,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps, null, {forwardRef: true})(UserGroupsModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport ColorContrastChecker from 'color-contrast-checker';\nimport ColorHash from 'color-hash';\n\nconst REQUIRED_COLOR_RATIO = 4.5;\n\nexport const cachedUserNameColors = new Map<string, string>();\n\nexport function generateColor(username: string, background: string): string {\n const cacheKey = `${username}-${background}`;\n const cachedColor = cachedUserNameColors.get(cacheKey);\n if (cachedColor) {\n return cachedColor;\n }\n\n let userColor = background;\n let contrastRatio = 1;\n let userAndSalt = username;\n const checker = new ColorContrastChecker();\n const colorHash = new ColorHash();\n\n const backgroundLuminance = checker.hexToLuminance(background);\n for (let tries = 10; tries > 0; tries--) {\n const textColor = colorHash.hex(userAndSalt);\n\n const cr = checker.getContrastRatio(\n checker.hexToLuminance(textColor),\n backgroundLuminance,\n );\n\n if (cr > contrastRatio) {\n userColor = textColor;\n contrastRatio = cr;\n }\n\n if (cr >= REQUIRED_COLOR_RATIO) {\n break;\n }\n\n userAndSalt += 'salt';\n }\n\n cachedUserNameColors.set(cacheKey, userColor);\n return userColor;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ConnectedProps} from 'react-redux';\nimport {connect} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {UserProfile as UserProfileType} from '@mattermost/types/users';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getUser, makeGetDisplayName} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport UserProfile from './user_profile';\n\nexport type OwnProps = {\n userId: UserProfileType['id'];\n overwriteName?: string;\n overwriteIcon?: string;\n disablePopover?: boolean;\n displayUsername?: boolean;\n colorize?: boolean;\n hideStatus?: boolean;\n channelId?: Channel['id'];\n}\n\nfunction makeMapStateToProps() {\n const getDisplayName = makeGetDisplayName();\n\n return (state: GlobalState, ownProps: OwnProps) => {\n const user = getUser(state, ownProps.userId);\n const theme = getTheme(state);\n\n return {\n displayName: getDisplayName(state, ownProps.userId, true),\n user,\n theme,\n isShared: Boolean(user && user.remote_id),\n };\n };\n}\n\nconst connector = connect(makeMapStateToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connect(makeMapStateToProps)(UserProfile);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ReactNode} from 'react';\nimport React from 'react';\n\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport ProfilePopover from 'components/profile_popover';\nimport SharedUserIndicator from 'components/shared_user_indicator';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\n\nimport {imageURLForUser} from 'utils/utils';\n\nimport {generateColor} from './utils';\n\nimport type {OwnProps, PropsFromRedux} from './index';\n\nexport type Props = PropsFromRedux & OwnProps;\n\nexport default function UserProfile({\n disablePopover = false,\n displayUsername = false,\n hideStatus = false,\n overwriteName = '',\n colorize = false,\n user,\n displayName,\n theme,\n userId,\n channelId,\n overwriteIcon,\n}: Props) {\n let name: ReactNode;\n if (user && displayUsername) {\n name = `@${(user.username)}`;\n } else {\n name = overwriteName || displayName || '...';\n }\n\n let userColor = theme?.centerChannelColor;\n if (user && theme) {\n userColor = generateColor(user.username, theme.centerChannelBg);\n }\n\n let userStyle;\n if (colorize) {\n userStyle = {color: userColor};\n }\n\n if (disablePopover) {\n return (\n <div\n className='user-popover'\n style={userStyle}\n >\n {name}\n </div>\n );\n }\n\n let profileImg = '';\n let userIsRemote = false;\n if (user) {\n profileImg = imageURLForUser(user.id, user.last_picture_update);\n if (user.remote_id) {\n userIsRemote = true;\n }\n }\n\n return (\n <>\n <ProfilePopover<HTMLButtonElement>\n triggerComponentAs='button'\n triggerComponentClass='user-popover style--none'\n triggerComponentStyle={userStyle}\n userId={userId}\n src={profileImg}\n channelId={channelId}\n hideStatus={hideStatus}\n overwriteIcon={overwriteIcon}\n overwriteName={overwriteName}\n >\n {name}\n </ProfilePopover>\n {userIsRemote &&\n <SharedUserIndicator\n className='shared-user-icon'\n withTooltip={true}\n />\n }\n {(user && user.is_bot) && <BotTag/>}\n {(user && isGuest(user.roles)) && <GuestTag/>}\n </>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {lazy} from 'react';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getUserPreferences} from 'mattermost-redux/actions/preferences';\nimport {getUser, sendVerificationEmail} from 'mattermost-redux/actions/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getUserPreferences as getUserPreferencesSelector} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, getUser as getUserSelector} from 'mattermost-redux/selectors/entities/users';\n\nimport {getPluginUserSettings} from 'selectors/plugins';\n\nimport {makeAsyncComponent} from 'components/async_load';\n\nimport type {GlobalState} from 'types/store';\n\nconst UserSettingsModalAsync = makeAsyncComponent('UserSettingsModal', lazy(() => import('./user_settings_modal')));\n\nimport type {OwnProps} from './user_settings_modal';\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const config = getConfig(state);\n\n const sendEmailNotifications = config.SendEmailNotifications === 'true';\n const requireEmailVerification = config.RequireEmailVerification === 'true';\n\n const user = ownProps.adminMode && ownProps.userID ? getUserSelector(state, ownProps.userID) : getCurrentUser(state);\n\n return {\n user,\n userPreferences: ownProps.adminMode && ownProps.userID ? getUserPreferencesSelector(state, ownProps.userID) : undefined,\n sendEmailNotifications,\n requireEmailVerification,\n pluginSettings: getPluginUserSettings(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n sendVerificationEmail,\n getUserPreferences,\n getUser,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(UserSettingsModalAsync);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {GroupSource} from '@mattermost/types/groups';\nimport type {Group} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getStatusForUserId} from 'mattermost-redux/selectors/entities/users';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport StatusIcon from 'components/status_icon';\nimport Avatar from 'components/widgets/users/avatar';\n\nimport {UserStatuses} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nexport type Props = {\n groupId: string;\n user: UserProfile;\n group: Group;\n decrementMemberCount: () => void;\n permissionToLeaveGroup: boolean;\n actions: {\n removeUsersFromGroup: (groupId: string, userIds: string[]) => Promise<ActionResult>;\n };\n}\n\nconst ViewUserGroupListItem = (props: Props) => {\n const {\n user,\n group,\n groupId,\n } = props;\n\n const removeUserFromGroup = useCallback(async () => {\n const {actions, decrementMemberCount} = props;\n\n await actions.removeUsersFromGroup(groupId, [user.id]).then((data) => {\n if (!data.error) {\n decrementMemberCount();\n }\n });\n }, [user.id, groupId, props.decrementMemberCount, props.actions.removeUsersFromGroup]);\n\n const status = useSelector((state: GlobalState) => getStatusForUserId(state, user?.id) || UserStatuses.OFFLINE);\n\n return (\n <div\n key={user.id}\n className='group-member-row'\n >\n <span className='status-wrapper'>\n\n <Avatar\n username={user.username}\n size={'sm'}\n url={Utils.imageURLForUser(user?.id ?? '')}\n className={'avatar-post-preview'}\n />\n <StatusIcon\n status={status}\n />\n </span>\n <div className='group-member-name'>\n {Utils.getFullName(user)}\n </div>\n <div className='group-member-username'>\n {`@${user.username}`}\n </div>\n {\n (group.source.toLowerCase() !== GroupSource.Ldap && props.permissionToLeaveGroup) &&\n <button\n type='button'\n className='remove-group-member btn btn-icon btn-xs'\n aria-label='Close'\n onClick={removeUserFromGroup}\n >\n <i\n className='icon icon-trash-can-outline'\n />\n </button>\n }\n </div>\n );\n};\n\nexport default React.memo(ViewUserGroupListItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {removeUsersFromGroup} from 'mattermost-redux/actions/groups';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getGroup as getGroupById} from 'mattermost-redux/selectors/entities/groups';\nimport {haveIGroupPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport type {GlobalState} from 'types/store';\n\nimport ViewUserGroupListItem from './view_user_group_list_item';\n\ntype OwnProps = {\n groupId: string;\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const group = getGroupById(state, ownProps.groupId);\n const permissionToLeaveGroup = haveIGroupPermission(state, ownProps.groupId, Permissions.MANAGE_CUSTOM_GROUP_MEMBERS);\n\n return {\n group,\n permissionToLeaveGroup,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n removeUsersFromGroup,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ViewUserGroupListItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState, useCallback, useMemo} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {defineMessage, FormattedMessage, useIntl} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AddUserToGroupMultiSelect from 'components/add_user_to_group_multiselect';\n\nimport type {ModalData} from 'types/actions';\n\nimport 'components/user_groups_modal/user_groups_modal.scss';\n\nexport type Props = {\n onExited: () => void;\n groupId: string;\n group: Group;\n backButtonCallback: () => void;\n actions: {\n addUsersToGroup: (groupId: string, userIds: string[]) => Promise<ActionResult>;\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n}\n\nconst AddUsersToGroupModal = (props: Props) => {\n const [show, setShow] = useState(true);\n const [saving, setSaving] = useState(false);\n const [usersToAdd, setUsersToAdd] = useState<UserProfile[]>([]);\n const [showUnknownError, setShowUnknownError] = useState(false);\n const {formatMessage} = useIntl();\n\n const doHide = useCallback(() => {\n setShow(false);\n }, []);\n\n const isSaveEnabled = useCallback(() => {\n return usersToAdd.length > 0;\n }, [usersToAdd]);\n\n const addUserCallback = useCallback((users: UserProfile[]): void => {\n setUsersToAdd(users);\n }, []);\n\n const deleteUserCallback = useCallback((users: UserProfile[]): void => {\n setUsersToAdd(users);\n }, []);\n\n const goBack = useCallback(() => {\n props.backButtonCallback();\n props.onExited();\n }, [props.backButtonCallback, props.onExited]);\n\n const addUsersToGroup = useCallback(async (users?: UserProfile[]) => {\n setSaving(true);\n if (!users || users.length === 0) {\n setSaving(false);\n return;\n }\n const userIds = users.map((user) => {\n return user.id;\n });\n\n const data = await props.actions.addUsersToGroup(props.groupId, userIds);\n\n if (data?.error) {\n setShowUnknownError(true);\n setSaving(false);\n } else {\n goBack();\n }\n }, [goBack, props.actions.addUsersToGroup, props.groupId]);\n\n const searchOptions = useMemo(() => {\n return {\n not_in_group_id: props.groupId,\n };\n }, [props.groupId]);\n\n const titleValue = useMemo(() => {\n return {\n group: props.group.display_name,\n };\n }, [props.group.display_name]);\n\n return (\n <Modal\n dialogClassName='a11y__modal user-groups-modal-create'\n show={show}\n onHide={doHide}\n onExited={props.onExited}\n role='none'\n aria-labelledby='createUserGroupsModalLabel'\n id='addUsersToGroupsModal'\n >\n <Modal.Header closeButton={true}>\n <div className='d-flex align-items-center'>\n <button\n type='button'\n className='modal-header-back-button btn btn-icon'\n aria-label={formatMessage({id: 'user_groups_modal.goBackLabel', defaultMessage: 'Back'})}\n onClick={goBack}\n >\n <i className='icon icon-arrow-left'/>\n </button>\n <Modal.Title\n componentClass='h1'\n id='addUsersToGroupsModalLabel'\n >\n <FormattedMessage\n id='user_groups_modal.addPeopleTitle'\n defaultMessage='Add people to {group}'\n values={titleValue}\n />\n </Modal.Title>\n </div>\n </Modal.Header>\n <Modal.Body\n className='overflow--visible'\n >\n <div className='user-groups-modal__content'>\n <form role='form'>\n <div className='group-add-user'>\n <AddUserToGroupMultiSelect\n multilSelectKey={'addUsersToGroupKey'}\n onSubmitCallback={addUsersToGroup}\n focusOnLoad={false}\n savingEnabled={isSaveEnabled()}\n addUserCallback={addUserCallback}\n deleteUserCallback={deleteUserCallback}\n groupId={props.groupId}\n searchOptions={searchOptions}\n buttonSubmitText={defineMessage({id: 'multiselect.addPeopleToGroup', defaultMessage: 'Add People'})}\n buttonSubmitLoadingText={defineMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'})}\n backButtonClick={goBack}\n backButtonClass={'multiselect-back'}\n saving={saving}\n />\n </div>\n {\n showUnknownError &&\n <div className='Input___error group-error'>\n <i className='icon icon-alert-outline'/>\n <FormattedMessage\n id='user_groups_modal.unknownError'\n defaultMessage='An unknown error has occurred.'\n />\n </div>\n }\n </form>\n </div>\n </Modal.Body>\n </Modal>\n );\n};\n\nexport default React.memo(AddUsersToGroupModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {addUsersToGroup} from 'mattermost-redux/actions/groups';\nimport {getGroup} from 'mattermost-redux/selectors/entities/groups';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddUsersToGroupModal from './add_users_to_group_modal';\n\ntype OwnProps = {\n groupId: string;\n}\n\nfunction mapStateToProps(state: GlobalState, props: OwnProps) {\n const group = getGroup(state, props.groupId);\n\n return {\n group,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n addUsersToGroup,\n openModal,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddUsersToGroupModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect, useState} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {CustomGroupPatch, Group} from '@mattermost/types/groups';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport SaveButton from 'components/save_button';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport Constants, {ItemStatus} from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\n\nimport type {ModalData} from 'types/actions';\n\nimport 'components/user_groups_modal/user_groups_modal.scss';\nimport './update_user_group_modal.scss';\n\nexport type Props = {\n onExited: () => void;\n groupId: string;\n group: Group;\n backButtonCallback: () => void;\n actions: {\n patchGroup: (groupId: string, group: CustomGroupPatch) => Promise<ActionResult>;\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n}\n\nconst UpdateUserGroupModal = ({\n actions,\n backButtonCallback,\n group,\n groupId,\n onExited,\n}: Props) => {\n const [hasUpdated, setHasUpdated] = useState(false);\n const [name, setName] = useState(group.display_name);\n const [mention, setMention] = useState(`@${group.name}`);\n const [saving, setSaving] = useState(false);\n const [show, setShow] = useState(true);\n const [mentionInputErrorText, setMentionInputErrorText] = useState('');\n const [nameInputErrorText, setNameInputErrorText] = useState('');\n const [showUnknownError, setShowUnknownError] = useState(false);\n const [mentionUpdatedManually, setMentionUpdatedManually] = useState(false);\n\n const {formatMessage} = useIntl();\n\n const doHide = useCallback(() => {\n setShow(false);\n }, []);\n\n const isSaveEnabled = useCallback(() => {\n return name.length > 0 && mention.length > 0 && hasUpdated && !saving;\n }, [name, mention, hasUpdated, saving]);\n\n const updateNameState = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n let newMention = mention;\n if (!mentionUpdatedManually) {\n newMention = value.replace(/[^A-Za-z0-9.\\-_@]/g, '').toLowerCase();\n if (newMention.substring(0, 1) !== '@') {\n newMention = `@${newMention}`;\n }\n }\n setName(value);\n setHasUpdated(true);\n setMention(newMention);\n }, [mention, mentionUpdatedManually]);\n\n const updateMentionState = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setHasUpdated(true);\n setMention(value);\n setMentionUpdatedManually(true);\n }, []);\n\n const goBack = useCallback(() => {\n backButtonCallback();\n onExited();\n }, [backButtonCallback, onExited]);\n\n const patchGroup = useCallback(async () => {\n setSaving(true);\n let newMention = mention;\n const displayName = name;\n\n if (!displayName || !displayName.trim()) {\n setNameInputErrorText(formatMessage({id: 'user_groups_modal.nameIsEmpty', defaultMessage: 'Name is a required field.'}));\n setSaving(false);\n return;\n }\n\n if (newMention.substring(0, 1) === '@') {\n newMention = newMention.substring(1, newMention.length);\n }\n\n if (newMention.length < 1) {\n setMentionInputErrorText(formatMessage({id: 'user_groups_modal.mentionIsEmpty', defaultMessage: 'Mention is a required field.'}));\n setSaving(false);\n return;\n }\n\n if (Constants.SPECIAL_MENTIONS.includes(newMention.toLowerCase())) {\n setMentionInputErrorText(formatMessage({id: 'user_groups_modal.mentionReservedWord', defaultMessage: 'Mention contains a reserved word.'}));\n setSaving(false);\n return;\n }\n\n const mentionRegEx = new RegExp(/^[a-z0-9.\\-_]+$/);\n if (!mentionRegEx.test(newMention)) {\n setMentionInputErrorText(formatMessage({id: 'user_groups_modal.mentionInvalidError', defaultMessage: 'Invalid character in mention.'}));\n setSaving(false);\n return;\n }\n\n const group: CustomGroupPatch = {\n name: newMention,\n display_name: displayName,\n };\n const data = await actions.patchGroup(groupId, group);\n if (data?.error) {\n if (data.error?.server_error_id === 'app.custom_group.unique_name') {\n setMentionInputErrorText(formatMessage({id: 'user_groups_modal.mentionNotUnique', defaultMessage: 'Mention needs to be unique.'}));\n setSaving(false);\n } else if (data.error?.server_error_id === 'app.group.username_conflict') {\n setMentionInputErrorText(formatMessage({id: 'user_groups_modal.mentionUsernameConflict', defaultMessage: 'A username already exists with this name. Mention must be unique.'}));\n setSaving(false);\n } else {\n setShowUnknownError(true);\n setSaving(false);\n }\n } else {\n goBack();\n }\n }, [mention, name, actions, groupId, formatMessage, goBack]);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (Keyboard.isKeyPressed(e, Constants.KeyCodes.ENTER) && isSaveEnabled()) {\n patchGroup();\n }\n }, [isSaveEnabled, patchGroup]);\n\n const onSaveClick = useCallback<React.MouseEventHandler<HTMLButtonElement>>((e) => {\n e.preventDefault();\n patchGroup();\n }, [patchGroup]);\n\n const onBackClick = useCallback<React.MouseEventHandler<HTMLButtonElement>>((e) => {\n e.preventDefault();\n goBack();\n }, [goBack]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return (\n <Modal\n dialogClassName='a11y__modal user-groups-modal-update'\n show={show}\n onHide={doHide}\n onExited={onExited}\n role='none'\n aria-labelledby='createUserGroupsModalLabel'\n id='createUserGroupsModal'\n >\n <Modal.Header closeButton={true}>\n <button\n type='button'\n className='modal-header-back-button btn btn-icon'\n aria-label={formatMessage({id: 'user_groups_modal.goBackLabel', defaultMessage: 'Back'})}\n onClick={goBack}\n >\n <i className='icon icon-arrow-left'/>\n </button>\n <Modal.Title\n componentClass='h1'\n id='updateGroupsModalTitle'\n >\n <FormattedMessage\n id='user_groups_modal.editGroupTitle'\n defaultMessage='Edit Group Details'\n />\n </Modal.Title>\n </Modal.Header>\n <Modal.Body\n className='overflow--visible'\n >\n <div className='user-groups-modal__content'>\n <div className='group-name-input-wrapper'>\n <Input\n type='text'\n placeholder={formatMessage({id: 'user_groups_modal.name', defaultMessage: 'Name'})}\n onChange={updateNameState}\n value={name}\n data-testid='nameInput'\n autoFocus={true}\n customMessage={{type: ItemStatus.ERROR, value: nameInputErrorText}}\n />\n </div>\n <div className='group-mention-input-wrapper'>\n <Input\n type='text'\n placeholder={formatMessage({id: 'user_groups_modal.mention', defaultMessage: 'Mention'})}\n onChange={updateMentionState}\n value={mention}\n data-testid='nameInput'\n customMessage={{type: ItemStatus.ERROR, value: mentionInputErrorText}}\n />\n </div>\n <div className='update-buttons-wrapper'>\n {\n showUnknownError &&\n <div className='Input___error group-error'>\n <i className='icon icon-alert-outline'/>\n <FormattedMessage\n id='user_groups_modal.unknownError'\n defaultMessage='An unknown error has occurred.'\n />\n </div>\n }\n <button\n onClick={onBackClick}\n className='btn btn-tertiary'\n >\n <FormattedMessage\n id='multiselect.backButton'\n defaultMessage='Back'\n />\n </button>\n <SaveButton\n id='saveItems'\n saving={saving}\n disabled={!isSaveEnabled()}\n onClick={onSaveClick}\n defaultMessage={formatMessage({id: 'multiselect.saveDetailsButton', defaultMessage: 'Save Details'})}\n savingMessage={formatMessage({id: 'multiselect.savingDetailsButton', defaultMessage: 'Saving...'})}\n />\n </div>\n </div>\n </Modal.Body>\n </Modal>\n );\n};\n\nexport default React.memo(UpdateUserGroupModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {patchGroup} from 'mattermost-redux/actions/groups';\nimport {getGroup} from 'mattermost-redux/selectors/entities/groups';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport UpdateUserGroupModal from './update_user_group_modal';\n\ntype OwnProps = {\n groupId: string;\n}\n\nfunction makeMapStateToProps(state: GlobalState, props: OwnProps) {\n const group = getGroup(state, props.groupId);\n\n return {\n group,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n patchGroup,\n openModal,\n }, dispatch),\n };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(UpdateUserGroupModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport UpdateUserGroupModal from 'components/update_user_group_modal';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport type {ModalData} from 'types/actions';\n\nexport type Props = {\n group: Group;\n onExited: () => void;\n backButtonCallback: () => void;\n backButtonAction: () => void;\n permissionToEditGroup: boolean;\n permissionToJoinGroup: boolean;\n permissionToLeaveGroup: boolean;\n permissionToArchiveGroup: boolean;\n isGroupMember: boolean;\n currentUserId: string;\n incrementMemberCount: () => void;\n decrementMemberCount: () => void;\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n removeUsersFromGroup: (groupId: string, userIds: string[]) => Promise<ActionResult>;\n addUsersToGroup: (groupId: string, userIds: string[]) => Promise<ActionResult>;\n archiveGroup: (groupId: string) => Promise<ActionResult>;\n };\n}\n\nconst ViewUserGroupHeaderSubMenu = (props: Props) => {\n const {\n group,\n isGroupMember,\n currentUserId,\n decrementMemberCount,\n incrementMemberCount,\n backButtonCallback,\n backButtonAction,\n onExited,\n actions,\n } = props;\n\n const goToEditGroupModal = useCallback(() => {\n actions.openModal({\n modalId: ModalIdentifiers.EDIT_GROUP_MODAL,\n dialogType: UpdateUserGroupModal,\n dialogProps: {\n groupId: group.id,\n backButtonCallback: backButtonAction,\n },\n });\n onExited();\n }, [actions.openModal, group.id, backButtonAction, onExited]);\n\n const leaveGroup = useCallback(async () => {\n await actions.removeUsersFromGroup(group.id, [currentUserId]).then(() => {\n decrementMemberCount();\n });\n }, [group.id, actions.removeUsersFromGroup, decrementMemberCount, currentUserId]);\n\n const joinGroup = useCallback(async () => {\n await actions.addUsersToGroup(group.id, [currentUserId]).then(() => {\n incrementMemberCount();\n });\n }, [group.id, actions.addUsersToGroup, incrementMemberCount, currentUserId]);\n\n const archiveGroup = useCallback(async () => {\n await actions.archiveGroup(group.id).then(() => {\n backButtonCallback();\n onExited();\n });\n }, [group.id, actions.archiveGroup, backButtonCallback, onExited]);\n\n const {formatMessage} = useIntl();\n\n return (\n <div className='details-action'>\n <MenuWrapper\n isDisabled={false}\n stopPropagationOnToggle={false}\n id={`detailsCustomWrapper-${group.id}`}\n >\n <button className='btn btn-icon'>\n <i\n className='icon icon-dots-vertical'\n aria-label={formatMessage({id: 'user_groups_modal.goBackLabel', defaultMessage: 'Back'})}\n />\n </button>\n <Menu\n openLeft={false}\n openUp={false}\n ariaLabel={Utils.localizeMessage({id: 'admin.user_item.menuAriaLabel', defaultMessage: 'User Actions Menu'})}\n >\n <Menu.ItemAction\n show={props.permissionToEditGroup}\n onClick={goToEditGroupModal}\n text={Utils.localizeMessage({id: 'user_groups_modal.editDetails', defaultMessage: 'Edit Details'})}\n disabled={false}\n />\n <Menu.ItemAction\n show={props.permissionToJoinGroup && !isGroupMember}\n onClick={joinGroup}\n text={Utils.localizeMessage({id: 'user_groups_modal.joinGroup', defaultMessage: 'Join Group'})}\n disabled={false}\n />\n <Menu.ItemAction\n show={props.permissionToLeaveGroup && isGroupMember}\n onClick={leaveGroup}\n text={Utils.localizeMessage({id: 'user_groups_modal.leaveGroup', defaultMessage: 'Leave Group'})}\n disabled={false}\n isDangerous={true}\n />\n <Menu.ItemAction\n show={props.permissionToArchiveGroup}\n onClick={archiveGroup}\n text={Utils.localizeMessage({id: 'user_groups_modal.archiveGroup', defaultMessage: 'Archive Group'})}\n disabled={false}\n isDangerous={true}\n />\n </Menu>\n </MenuWrapper>\n </div>\n );\n};\n\nexport default React.memo(ViewUserGroupHeaderSubMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {addUsersToGroup, archiveGroup, removeUsersFromGroup} from 'mattermost-redux/actions/groups';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport ViewUserGroupHeaderSubMenu from './view_user_group_header_sub_menu';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n currentUserId: getCurrentUserId(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n removeUsersFromGroup,\n addUsersToGroup,\n archiveGroup,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ViewUserGroupHeaderSubMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AddUsersToGroupModal from 'components/add_users_to_group_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\nimport ViewUserGroupHeaderSubMenu from '../view_user_group_header_sub_menu';\n\nexport type Props = {\n groupId: string;\n group: Group;\n onExited: () => void;\n backButtonCallback: () => void;\n backButtonAction: () => void;\n permissionToEditGroup: boolean;\n permissionToJoinGroup: boolean;\n permissionToLeaveGroup: boolean;\n permissionToArchiveGroup: boolean;\n permissionToRestoreGroup: boolean;\n isGroupMember: boolean;\n incrementMemberCount: () => void;\n decrementMemberCount: () => void;\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n removeUsersFromGroup: (groupId: string, userIds: string[]) => Promise<ActionResult>;\n addUsersToGroup: (groupId: string, userIds: string[]) => Promise<ActionResult>;\n archiveGroup: (groupId: string) => Promise<ActionResult>;\n restoreGroup: (groupId: string) => Promise<ActionResult>;\n };\n}\n\nconst ViewUserGroupModalHeader = ({\n groupId,\n group,\n onExited,\n backButtonCallback,\n backButtonAction,\n permissionToEditGroup,\n permissionToJoinGroup,\n permissionToLeaveGroup,\n permissionToArchiveGroup,\n permissionToRestoreGroup,\n isGroupMember,\n incrementMemberCount,\n decrementMemberCount,\n actions,\n}: Props) => {\n const {formatMessage} = useIntl();\n\n const goToAddPeopleModal = useCallback(() => {\n actions.openModal({\n modalId: ModalIdentifiers.ADD_USERS_TO_GROUP,\n dialogType: AddUsersToGroupModal,\n dialogProps: {\n groupId,\n backButtonCallback: backButtonAction,\n },\n });\n onExited();\n }, [actions.openModal, groupId, onExited, backButtonAction]);\n\n const restoreGroup = useCallback(async () => {\n await actions.restoreGroup(groupId);\n }, [actions.restoreGroup, groupId]);\n\n const showSubMenu = useCallback(() => {\n return permissionToEditGroup ||\n permissionToJoinGroup ||\n permissionToLeaveGroup ||\n permissionToArchiveGroup;\n }, [permissionToEditGroup, permissionToJoinGroup, permissionToLeaveGroup, permissionToArchiveGroup]);\n\n const modalTitle = useCallback(() => {\n if (group) {\n return (\n <Modal.Title\n componentClass='h1'\n id='userGroupsModalLabel'\n >\n {group.display_name}\n {\n group.delete_at > 0 &&\n <i className='icon icon-archive-outline'/>\n }\n </Modal.Title>\n );\n }\n return (<></>);\n }, [group]);\n\n const addPeopleButton = useCallback(() => {\n if (permissionToJoinGroup) {\n return (\n <button\n className='mr-2 btn btn-secondary btn-sm'\n onClick={goToAddPeopleModal}\n >\n <FormattedMessage\n id='user_groups_modal.addPeople'\n defaultMessage='Add people'\n />\n </button>\n );\n }\n return (<></>);\n }, [permissionToJoinGroup, goToAddPeopleModal]);\n\n const restoreGroupButton = useCallback(() => {\n if (permissionToRestoreGroup) {\n return (\n <button\n className='user-groups-create btn btn-md btn-primary'\n onClick={restoreGroup}\n >\n <FormattedMessage\n id='user_groups_modal.button.restoreGroup'\n defaultMessage='Restore Group'\n />\n </button>\n );\n }\n return (<></>);\n }, [permissionToRestoreGroup, restoreGroup]);\n\n const subMenuButton = () => {\n if (group && showSubMenu()) {\n return (\n <ViewUserGroupHeaderSubMenu\n group={group}\n isGroupMember={isGroupMember}\n decrementMemberCount={decrementMemberCount}\n incrementMemberCount={incrementMemberCount}\n backButtonCallback={backButtonCallback}\n backButtonAction={backButtonAction}\n onExited={onExited}\n permissionToEditGroup={permissionToEditGroup}\n permissionToJoinGroup={permissionToJoinGroup}\n permissionToLeaveGroup={permissionToLeaveGroup}\n permissionToArchiveGroup={permissionToArchiveGroup}\n />\n );\n }\n return null;\n };\n\n const goBack = useCallback(() => {\n backButtonCallback();\n onExited();\n }, [backButtonCallback, onExited]);\n\n return (\n <Modal.Header closeButton={true}>\n <div className='d-flex align-items-center'>\n <button\n type='button'\n className='modal-header-back-button btn btn-icon'\n aria-label={formatMessage({id: 'user_groups_modal.goBackLabel', defaultMessage: 'Back'})}\n onClick={goBack}\n >\n <i\n className='icon icon-arrow-left'\n />\n </button>\n {modalTitle()}\n </div>\n <div className='d-flex align-items-center'>\n {addPeopleButton()}\n {restoreGroupButton()}\n {subMenuButton()}\n </div>\n </Modal.Header>\n );\n};\n\nexport default React.memo(ViewUserGroupModalHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {addUsersToGroup, archiveGroup, removeUsersFromGroup, restoreGroup} from 'mattermost-redux/actions/groups';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getGroup as getGroupById, isMyGroup} from 'mattermost-redux/selectors/entities/groups';\nimport {haveIGroupPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport ViewUserGroupModalHeader from './view_user_group_modal_header';\n\ntype OwnProps = {\n groupId: string;\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const isGroupMember = isMyGroup(state, ownProps.groupId);\n const group = getGroupById(state, ownProps.groupId);\n\n const permissionToEditGroup = haveIGroupPermission(state, ownProps.groupId, Permissions.EDIT_CUSTOM_GROUP);\n const permissionToJoinGroup = haveIGroupPermission(state, ownProps.groupId, Permissions.MANAGE_CUSTOM_GROUP_MEMBERS);\n const permissionToLeaveGroup = haveIGroupPermission(state, ownProps.groupId, Permissions.MANAGE_CUSTOM_GROUP_MEMBERS);\n const permissionToArchiveGroup = haveIGroupPermission(state, ownProps.groupId, Permissions.DELETE_CUSTOM_GROUP);\n const permissionToRestoreGroup = haveIGroupPermission(state, ownProps.groupId, Permissions.RESTORE_CUSTOM_GROUP);\n\n return {\n permissionToEditGroup,\n permissionToJoinGroup,\n permissionToLeaveGroup,\n permissionToArchiveGroup,\n permissionToRestoreGroup,\n isGroupMember,\n group,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n removeUsersFromGroup,\n addUsersToGroup,\n archiveGroup,\n restoreGroup,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ViewUserGroupModalHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {createRef} from 'react';\nimport type {RefObject} from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {defineMessage, FormattedMessage} from 'react-intl';\n\nimport type {Group} from '@mattermost/types/groups';\nimport {GroupSource} from '@mattermost/types/groups';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {debounce} from 'mattermost-redux/actions/helpers';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport LoadingScreen from 'components/loading_screen';\nimport NoResultsIndicator from 'components/no_results_indicator';\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport Constants from 'utils/constants';\n\nimport ViewUserGroupListItem from './view_user_group_list_item';\nimport ViewUserGroupModalHeader from './view_user_group_modal_header';\n\nimport './view_user_group_modal.scss';\n\nconst USERS_PER_PAGE = 60;\n\nexport type Props = {\n onExited: () => void;\n searchTerm: string;\n groupId: string;\n group?: Group;\n users: UserProfile[];\n backButtonCallback: () => void;\n backButtonAction: () => void;\n actions: {\n getGroup: (groupId: string, includeMemberCount: boolean) => Promise<ActionResult<Group>>;\n getUsersInGroup: (groupId: string, page: number, perPage: number) => Promise<ActionResult<UserProfile[]>>;\n setModalSearchTerm: (term: string) => void;\n searchProfiles: (term: string, options: any) => Promise<ActionResult>;\n };\n}\n\ntype State = {\n page: number;\n loading: boolean;\n show: boolean;\n selectedFilter: string;\n memberCount: number;\n}\n\nexport default class ViewUserGroupModal extends React.PureComponent<Props, State> {\n private divScrollRef: RefObject<HTMLDivElement>;\n private searchTimeoutId: number;\n\n constructor(props: Props) {\n super(props);\n\n this.divScrollRef = createRef();\n this.searchTimeoutId = 0;\n this.state = {\n page: 0,\n loading: true,\n show: true,\n selectedFilter: 'all',\n memberCount: props.group?.member_count || 0,\n };\n }\n\n incrementMemberCount = () => {\n this.setState({memberCount: this.state.memberCount + 1});\n };\n\n decrementMemberCount = () => {\n this.setState({memberCount: this.state.memberCount - 1});\n };\n\n doHide = () => {\n this.setState({show: false});\n };\n\n async componentDidMount() {\n const {\n groupId,\n actions,\n } = this.props;\n\n await Promise.all([\n actions.getGroup(groupId, true),\n actions.getUsersInGroup(groupId, 0, USERS_PER_PAGE),\n ]);\n this.loadComplete();\n }\n\n componentWillUnmount() {\n this.props.actions.setModalSearchTerm('');\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.searchTerm !== this.props.searchTerm) {\n clearTimeout(this.searchTimeoutId);\n const searchTerm = this.props.searchTerm;\n\n if (searchTerm === '') {\n this.loadComplete();\n this.searchTimeoutId = 0;\n return;\n }\n\n const searchTimeoutId = window.setTimeout(\n async () => {\n await prevProps.actions.searchProfiles(searchTerm, {in_group_id: this.props.groupId});\n },\n Constants.SEARCH_TIMEOUT_MILLISECONDS,\n );\n\n this.searchTimeoutId = searchTimeoutId;\n }\n if (prevProps.group?.member_count !== this.props.group?.member_count) {\n this.setMemberCount(this.props.group?.member_count || 0);\n }\n }\n\n setMemberCount = (count: number) => {\n this.setState({memberCount: count});\n };\n\n startLoad = () => {\n this.setState({loading: true});\n };\n\n loadComplete = () => {\n this.setState({loading: false});\n };\n\n handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const term = e.target.value;\n this.props.actions.setModalSearchTerm(term);\n };\n\n getGroupMembers = debounce(\n async () => {\n const {actions, groupId} = this.props;\n const {page} = this.state;\n const newPage = page + 1;\n\n this.setState({page: newPage});\n\n this.startLoad();\n await actions.getUsersInGroup(groupId, newPage, USERS_PER_PAGE);\n this.loadComplete();\n },\n 200,\n false,\n (): void => {},\n );\n\n onScroll = () => {\n const scrollHeight = this.divScrollRef.current?.scrollHeight || 0;\n const scrollTop = this.divScrollRef.current?.scrollTop || 0;\n const clientHeight = this.divScrollRef.current?.clientHeight || 0;\n\n if (((scrollTop + clientHeight + 30) >= scrollHeight && this.props.group) && (this.props.users.length !== this.props.group.member_count && this.state.loading === false)) {\n this.getGroupMembers();\n }\n };\n\n mentionName = () => {\n const {group} = this.props;\n\n if (group) {\n return (\n <div className='group-mention-name'>\n <span className='group-name'>{`@${group.name}`}</span>\n {\n group.source.toLowerCase() === GroupSource.Ldap &&\n <span className='group-source'>\n <FormattedMessage\n id='view_user_group_modal.ldapSynced'\n defaultMessage='AD/LDAP SYNCED'\n />\n </span>\n }\n </div>\n );\n }\n return (<></>);\n };\n\n render() {\n const {groupId, group, users, onExited} = this.props;\n\n return (\n <Modal\n dialogClassName='a11y__modal view-user-groups-modal'\n show={this.state.show}\n onHide={this.doHide}\n onExited={onExited}\n role='none'\n aria-labelledby='viewUserGroupModalLabel'\n >\n <ViewUserGroupModalHeader\n onExited={onExited}\n groupId={groupId}\n backButtonCallback={this.props.backButtonCallback}\n backButtonAction={this.props.backButtonAction}\n incrementMemberCount={this.incrementMemberCount}\n decrementMemberCount={this.decrementMemberCount}\n />\n <Modal.Body>\n {this.mentionName()}\n {((users.length === 0 && !this.props.searchTerm && !this.state.loading) || !group) ? (\n <NoResultsIndicator\n variant={NoResultsVariant.UserGroupMembers}\n />\n ) : (\n <>\n <div className='user-groups-search'>\n <Input\n type='text'\n placeholder={defineMessage({id: 'search_bar.searchGroupMembers', defaultMessage: 'Search group members'})}\n onChange={this.handleSearch}\n value={this.props.searchTerm}\n data-testid='searchInput'\n className={'user-group-search-input'}\n inputPrefix={<i className={'icon icon-magnify'}/>}\n />\n </div>\n <div\n className='user-groups-modal__content group-member-list'\n onScroll={this.onScroll}\n ref={this.divScrollRef}\n >\n {(users.length !== 0) &&\n <h2 className='group-member-count'>\n <FormattedMessage\n id='view_user_group_modal.memberCount'\n defaultMessage='{member_count} {member_count, plural, one {Member} other {Members}}'\n values={{\n member_count: this.state.memberCount,\n }}\n />\n </h2>\n }\n {(users.length === 0 && this.props.searchTerm) &&\n <NoResultsIndicator\n variant={NoResultsVariant.Search}\n titleValues={{channelName: `${this.props.searchTerm}`}}\n />\n }\n {users.map((user) => {\n return (\n <ViewUserGroupListItem\n groupId={groupId}\n user={user}\n decrementMemberCount={this.decrementMemberCount}\n key={user.id}\n />\n );\n })}\n {\n this.state.loading &&\n <LoadingScreen/>\n }\n </div>\n </>\n )}\n </Modal.Body>\n </Modal>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getGroup} from 'mattermost-redux/actions/groups';\nimport {getProfilesInGroup as getUsersInGroup, searchProfiles} from 'mattermost-redux/actions/users';\nimport {getGroup as getGroupById} from 'mattermost-redux/selectors/entities/groups';\nimport {getProfilesInGroup, searchProfilesInGroup} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport ViewUserGroupModal from './view_user_group_modal';\n\ntype OwnProps = {\n groupId: string;\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const searchTerm = state.views.search.modalSearch;\n\n const group = getGroupById(state, ownProps.groupId);\n\n let users: UserProfile[] = [];\n if (searchTerm) {\n users = searchProfilesInGroup(state, ownProps.groupId, searchTerm);\n } else {\n users = getProfilesInGroup(state, ownProps.groupId);\n }\n\n return {\n group,\n users,\n searchTerm,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getGroup,\n getUsersInGroup,\n setModalSearchTerm,\n openModal,\n searchProfiles,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ViewUserGroupModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function ArchiveIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='16px'\n height='16px'\n viewBox='0 0 16 16'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.archive', defaultMessage: 'Archive Icon'})}\n >\n <path d='M13.994 14.75H2.006V6.50599H3.5V13.256H12.5V6.50599H13.994V14.75ZM1.25 1.24999H14.75V5.74999H1.25V1.24999ZM6.128 7.24399H9.872C9.98 7.24399 10.07 7.27999 10.142 7.35199C10.214 7.42399 10.25 7.51399 10.25 7.62199V8.75599H5.75V7.62199C5.75 7.51399 5.786 7.42399 5.858 7.35199C5.93 7.27999 6.02 7.24399 6.128 7.24399ZM2.744 2.74399V4.25599H13.256V2.74399H2.744Z'/>\n </svg>\n </span>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function CloseCircleSolidIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='16px'\n height='16px'\n viewBox='0 0 16 16'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.close', defaultMessage: 'Close Icon'})}\n >\n <path\n d='m 8,0 c 4.424,0 8,3.576 8,8 0,4.424 -3.576,8 -8,8 C 3.576,16 0,12.424 0,8 0,3.576 3.576,0 8,0 Z M 10.872,4 8,6.872 5.128,4 4,5.128 6.872,8 4,10.872 5.128,12 8,9.128 10.872,12 12,10.872 9.128,8 12,5.128 Z'\n />\n </svg>\n </span>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function CloseIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='24px'\n height='24px'\n viewBox='0 0 24 24'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.close', defaultMessage: 'Close Icon'})}\n >\n <path\n fillRule='nonzero'\n d='M18 7.209L16.791 6 12 10.791 7.209 6 6 7.209 10.791 12 6 16.791 7.209 18 12 13.209 16.791 18 18 16.791 13.209 12z'\n />\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\ntype Props = React.HTMLAttributes<HTMLSpanElement>;\n\nconst EmojiIcon = (props: Props) => {\n return (\n <span {...props}>\n <svg\n width='16px'\n height='16px'\n viewBox='0 0 16 16'\n role='img'\n aria-label='Emoji icon'\n >\n <path d='M9.872 8.00005C10.184 8.00005 10.448 7.88605 10.664 7.65805C10.892 7.43005 11.006 7.16605 11.006 6.86605C11.006 6.56605 10.892 6.30805 10.664 6.09205C10.448 5.86405 10.184 5.75005 9.872 5.75005C9.572 5.75005 9.308 5.86405 9.08 6.09205C8.864 6.30805 8.756 6.56605 8.756 6.86605C8.756 7.16605 8.864 7.43005 9.08 7.65805C9.308 7.88605 9.572 8.00005 9.872 8.00005ZM5.372 8.00005C5.684 8.00005 5.948 7.88605 6.164 7.65805C6.392 7.43005 6.506 7.16605 6.506 6.86605C6.506 6.56605 6.392 6.30805 6.164 6.09205C5.948 5.86405 5.684 5.75005 5.372 5.75005C5.072 5.75005 4.808 5.86405 4.58 6.09205C4.364 6.30805 4.256 6.56605 4.256 6.86605C4.256 7.16605 4.364 7.43005 4.58 7.65805C4.808 7.88605 5.072 8.00005 5.372 8.00005ZM13.22 7.92805C13.244 8.12005 13.256 8.27005 13.256 8.37805C13.256 9.39805 12.998 10.34 12.482 11.204C11.99 12.056 11.318 12.728 10.466 13.22C9.59 13.736 8.642 13.994 7.622 13.994C6.602 13.994 5.654 13.736 4.778 13.22C3.938 12.728 3.266 12.056 2.762 11.204C2.258 10.34 2.006 9.39805 2.006 8.37805C2.006 7.35805 2.264 6.41005 2.78 5.53405C3.272 4.69405 3.944 4.02205 4.796 3.51805C5.66 3.00205 6.602 2.74405 7.622 2.74405C7.73 2.74405 7.88 2.75605 8.072 2.78005C8.144 2.27605 8.306 1.79005 8.558 1.32205C8.15 1.27405 7.838 1.25005 7.622 1.25005C6.338 1.25005 5.138 1.57405 4.022 2.22205C2.954 2.84605 2.102 3.69805 1.466 4.77805C0.818 5.88205 0.494 7.08205 0.494 8.37805C0.494 9.67405 0.818 10.874 1.466 11.978C2.102 13.058 2.954 13.91 4.022 14.534C5.138 15.182 6.338 15.506 7.622 15.506C8.906 15.506 10.106 15.182 11.222 14.534C12.29 13.898 13.142 13.046 13.778 11.978C14.426 10.862 14.75 9.66205 14.75 8.37805C14.75 8.16205 14.726 7.85005 14.678 7.44205C14.21 7.69405 13.724 7.85605 13.22 7.92805ZM11.744 0.494048H13.256V2.74405H15.506V4.25605H13.256V6.50605H11.744V4.25605H9.494V2.74405H11.744V0.494048ZM3.788 9.87205C4.088 10.652 4.586 11.288 5.282 11.78C5.978 12.26 6.758 12.5 7.622 12.5C8.486 12.5 9.266 12.26 9.962 11.78C10.658 11.288 11.162 10.652 11.474 9.87205H3.788Z'/>\n </svg>\n </span>\n );\n};\n\nexport default memo(EmojiIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function DropdownIcon() {\n const {formatMessage} = useIntl();\n return (\n <i\n className='fa fa-angle-down'\n title={formatMessage({id: 'generic_icons.dropdown', defaultMessage: 'Dropdown Icon'})}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function EditIcon() {\n const {formatMessage} = useIntl();\n return (\n <i\n className='icon-pencil-outline'\n title={formatMessage({id: 'generic_icons.edit', defaultMessage: 'Edit Icon'})}\n />\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function SuccessIcon() {\n const {formatMessage} = useIntl();\n\n return (\n <i\n className='fa fa-check'\n title={formatMessage({id: 'generic_icons.success', defaultMessage: 'Success Icon'})}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function FlagIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='16px'\n height='16px'\n viewBox='0 0 16 16'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.flag', defaultMessage: 'Flag Icon'})}\n >\n <path d='M11.744 12.5L8 10.862L4.256 12.5V2.74405H11.744V12.5ZM11.744 1.25005H4.256C3.836 1.25005 3.476 1.40005 3.176 1.70005C2.888 1.98805 2.744 2.33605 2.744 2.74405V14.75L8 12.5L13.256 14.75V2.74405C13.256 2.33605 13.106 1.98805 12.806 1.70005C12.518 1.40005 12.164 1.25005 11.744 1.25005Z'/>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function MattermostLogo(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n version='1.1'\n x='0px'\n y='0px'\n viewBox='0 0 500 500'\n enableBackground='new 0 0 500 500'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.mattermost', defaultMessage: 'Mattermost Logo'})}\n >\n <g>\n <g>\n <path\n style={style}\n d='M396.9,47.7l2.6,53.1c43,47.5,60,114.8,38.6,178.1c-32,94.4-137.4,144.1-235.4,110.9 S51.1,253.1,83,158.7C104.5,95.2,159.2,52,222.5,40.5l34.2-40.4C150-2.8,49.3,63.4,13.3,169.9C-31,300.6,39.1,442.5,169.9,486.7 s272.6-25.8,316.9-156.6C522.7,223.9,483.1,110.3,396.9,47.7z'\n />\n </g>\n <path\n style={style}\n d='M335.6,204.3l-1.8-74.2l-1.5-42.7l-1-37c0,0,0.2-17.8-0.4-22c-0.1-0.9-0.4-1.6-0.7-2.2 c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.2-0.1-0.2c-0.7-1.2-1.8-2.1-3.1-2.6c-1.4-0.5-2.9-0.4-4.2,0.2c0,0-0.1,0-0.1,0 c-0.2,0.1-0.3,0.1-0.4,0.2c-0.6,0.3-1.2,0.7-1.8,1.3c-3,3-13.7,17.2-13.7,17.2l-23.2,28.8l-27.1,33l-46.5,57.8 c0,0-21.3,26.6-16.6,59.4s29.1,48.7,48,55.1c18.9,6.4,48,8.5,71.6-14.7C336.4,238.4,335.6,204.3,335.6,204.3z'\n />\n </g>\n </svg>\n </span>\n );\n}\n\nconst style: CSSProperties = {\n fillRule: 'evenodd',\n clipRule: 'evenodd',\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function PluginIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n width='61px'\n height='61px'\n viewBox='0 0 61 61'\n aria-label={formatMessage({id: 'generic_icons.plugin', defaultMessage: 'Plugin Icon'})}\n >\n <g\n stroke='none'\n strokeWidth='1'\n fill='inherit'\n fillRule='evenodd'\n >\n <g\n transform='translate(-347.000000, -211.000000)'\n fill='inherit'\n >\n <g transform='translate(377.585786, 241.500000) rotate(-315.000000) translate(-377.585786, -241.500000) translate(358.585786, 200.000000)'>\n <g transform='translate(0.000000, -0.000000)'>\n <path\n d='M3.28846154,6.10822511 L3.05411255,6.10822511 C1.36737277,6.10822511 2.06566048e-16,4.74085234 0,3.05411255 C-2.06566048e-16,1.36737277 1.36737277,-7.78498519e-14 3.05411255,-7.81597009e-14 L34.9458874,-7.81597009e-14 C36.6326272,-8.16905472e-14 38,1.36737277 38,3.05411255 C38,4.74085234 36.6326272,6.10822511 34.9458874,6.10822511 L34.7115385,6.10822511 L34.7115385,14.7316017 C34.7115385,20.9798931 29.0184395,26.1638765 21.5576923,27.1415606 L21.5576923,33.1964286 C21.5576923,34.5081049 20.4943686,35.5714286 19.1826923,35.5714286 C17.871016,35.5714286 16.8076923,34.5081049 16.8076923,33.1964286 L16.8076923,27.1859094 C9.16823824,26.3322077 3.28846154,21.0815081 3.28846154,14.7316017 L3.28846154,6.10822511 Z M19.1431901,14.7316017 C17.8533303,14.7316017 16.8076923,15.7772397 16.8076923,17.0670996 C16.8076923,18.3569594 17.8533303,19.4025974 19.1431901,19.4025974 L19.2221945,19.4025974 C20.5120543,19.4025974 21.5576923,18.3569594 21.5576923,17.0670996 C21.5576923,15.7772397 20.5120543,14.7316017 19.2221945,14.7316017 L19.1431901,14.7316017 Z'\n transform='translate(19.000000, 17.785714) rotate(-180.000000) translate(-19.000000, -17.785714) '\n />\n <path\n d='M32.1538462,53.5367965 L34.7115385,53.5367965 L34.7115385,62.1601732 C34.7115385,68.4084646 29.0184395,73.592448 21.5576923,74.5701321 L21.5576923,80.625 C21.5576923,81.9366763 20.4943686,83 19.1826923,83 C17.871016,83 16.8076923,81.9366763 16.8076923,80.625 L16.8076923,74.6144809 C9.16823824,73.7607791 3.28846154,68.5100796 3.28846154,62.1601732 L3.28846154,53.5367965 L3.05411255,53.5367965 C1.36737277,53.5367965 2.06566048e-16,52.1694238 0,50.482684 C-2.06566048e-16,48.7959442 1.36737277,47.4285714 3.05411255,47.4285714 L8.40384615,47.4285714 L8.40384615,42.2581169 C8.40384615,40.9464406 9.46716987,39.8831169 10.7788462,39.8831169 C12.0905224,39.8831169 13.1538462,40.9464406 13.1538462,42.2581169 L13.1538462,47.4285714 L24.8461538,47.4285714 L24.8461538,42.2581169 C24.8461538,40.9464406 25.9094776,39.8831169 27.2211538,39.8831169 C28.5328301,39.8831169 29.5961538,40.9464406 29.5961538,42.2581169 L29.5961538,47.4285714 L34.9458874,47.4285714 C36.6326272,47.4285714 38,48.7959442 38,50.482684 C38,52.1694238 36.6326272,53.5367965 34.9458874,53.5367965 L32.1538462,53.5367965 Z M19.1431901,62.1601732 C17.8533303,62.1601732 16.8076923,63.2058112 16.8076923,64.495671 C16.8076923,65.7855308 17.8533303,66.8311688 19.1431901,66.8311688 L19.2221945,66.8311688 C20.5120543,66.8311688 21.5576923,65.7855308 21.5576923,64.495671 C21.5576923,63.2058112 20.5120543,62.1601732 19.2221945,62.1601732 L19.1431901,62.1601732 Z'\n transform='translate(19.000000, 61.441558) rotate(-360.000000) translate(-19.000000, -61.441558) '\n />\n </g>\n </g>\n </g>\n </g>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function UnreadBelowIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n const {formatMessage} = useIntl();\n return (\n <span {...props}>\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='16'\n height='16'\n viewBox='0 0 16 16'\n role='img'\n aria-label={formatMessage({id: 'generic_icons.arrow.down', defaultMessage: 'Down Arrow Icon'})}\n >\n <path d='M8.696 2H7.184V11L3.062 6.878L2 7.94L7.94 13.88L13.88 7.94L12.818 6.878L8.696 11V2Z'/>\n </svg>\n </span>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useState, useEffect} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl} from 'react-intl';\n\nimport {CloseCircleIcon} from '@mattermost/compass-icons/components';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ItemStatus} from 'utils/constants';\nimport {formatAsString} from 'utils/i18n';\n\nimport './input.scss';\n\nexport enum SIZE {\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n\nexport type CustomMessageInputType = {type?: 'info' | 'error' | 'warning' | 'success'; value: React.ReactNode} | null;\n\ninterface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>, 'placeholder'> {\n required?: boolean;\n hasError?: boolean;\n addon?: React.ReactElement;\n textPrefix?: string;\n inputPrefix?: JSX.Element;\n inputSuffix?: JSX.Element;\n label?: string | MessageDescriptor;\n placeholder?: MessageDescriptor | string;\n containerClassName?: string;\n wrapperClassName?: string;\n inputClassName?: string;\n limit?: number;\n useLegend?: boolean;\n customMessage?: CustomMessageInputType;\n inputSize?: SIZE;\n clearable?: boolean;\n clearableTooltipText?: string;\n onClear?: () => void;\n}\n\nconst Input = React.forwardRef((\n {\n name,\n value,\n label,\n placeholder,\n useLegend = true,\n className,\n hasError,\n required,\n addon,\n textPrefix,\n inputPrefix,\n inputSuffix,\n containerClassName,\n wrapperClassName,\n inputClassName,\n limit,\n customMessage,\n maxLength,\n inputSize = SIZE.MEDIUM,\n disabled,\n clearable,\n clearableTooltipText,\n onFocus,\n onBlur,\n onChange,\n onClear,\n ...otherProps\n }: InputProps,\n ref?: React.Ref<HTMLInputElement | HTMLTextAreaElement>,\n) => {\n const {formatMessage} = useIntl();\n\n const [focused, setFocused] = useState(false);\n const [customInputLabel, setCustomInputLabel] = useState<CustomMessageInputType>(null);\n\n useEffect(() => {\n if (customMessage === undefined || customMessage === null) {\n if (customInputLabel !== null) {\n // edge-use case: a consumer of this component may have its input updated\n // from more than one place, such as by a network fetching data after load\n // in that case, we need to remove the error according to the response\n setCustomInputLabel(customMessage || null);\n }\n return;\n }\n\n if (customMessage !== undefined && customMessage !== null && Boolean(customMessage.value)) {\n setCustomInputLabel(customMessage);\n }\n }, [customMessage]);\n\n const handleOnFocus = (event: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFocused(true);\n\n if (onFocus) {\n onFocus(event);\n }\n };\n\n const handleOnBlur = (event: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFocused(false);\n validateInput();\n\n if (onBlur) {\n onBlur(event);\n }\n };\n\n const handleOnChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setCustomInputLabel(null);\n\n if (onChange) {\n onChange(event);\n }\n };\n\n const handleOnClear = () => {\n if (onClear) {\n onClear();\n }\n };\n\n const validateInput = () => {\n if (!required || (value !== null && value !== '')) {\n return;\n }\n const validationErrorMsg = formatMessage({id: 'widget.input.required', defaultMessage: 'This field is required'});\n setCustomInputLabel({type: ItemStatus.ERROR, value: validationErrorMsg});\n };\n\n const showLegend = Boolean(focused || value);\n const error = customInputLabel?.type === 'error';\n const limitExceeded = limit && value && !Array.isArray(value) ? value.toString().length - limit : 0;\n\n const clearButton = value && clearable ? (\n <div\n className='Input__clear'\n onMouseDown={handleOnClear}\n onTouchEnd={handleOnClear}\n >\n <WithTooltip\n title={clearableTooltipText || formatMessage({id: 'widget.input.clear', defaultMessage: 'Clear'})}\n >\n <CloseCircleIcon size={18}/>\n </WithTooltip>\n </div>\n ) : null;\n\n const generateInput = () => {\n const placeholderValue = formatAsString(formatMessage, focused ? (label && placeholder) || label : label || placeholder);\n const ariaLabel = formatAsString(formatMessage, label || placeholder);\n\n if (otherProps.type === 'textarea') {\n return (\n <textarea\n ref={ref as React.RefObject<HTMLTextAreaElement>}\n id={`input_${name || ''}`}\n className={classNames('Input form-control', inputSize, inputClassName, {Input__focus: showLegend})}\n value={value}\n placeholder={placeholderValue}\n aria-label={ariaLabel}\n rows={3}\n name={name}\n disabled={disabled}\n {...otherProps}\n maxLength={limit ? undefined : maxLength}\n onFocus={handleOnFocus}\n onBlur={handleOnBlur}\n onChange={handleOnChange}\n />);\n }\n return (\n <input\n ref={ref as React.RefObject<HTMLInputElement>}\n id={`input_${name || ''}`}\n className={classNames('Input form-control', inputSize, inputClassName, {Input__focus: showLegend})}\n value={value}\n placeholder={placeholderValue}\n aria-label={ariaLabel}\n name={name}\n disabled={disabled}\n {...otherProps}\n maxLength={limit ? undefined : maxLength}\n onFocus={handleOnFocus}\n onBlur={handleOnBlur}\n onChange={handleOnChange}\n />\n );\n };\n\n return (\n <div className={classNames('Input_container', containerClassName, {disabled})}>\n <fieldset\n className={classNames('Input_fieldset', className, {\n Input_fieldset___error: error || hasError || limitExceeded > 0,\n Input_fieldset___legend: showLegend,\n })}\n >\n {useLegend && (\n <legend className={classNames('Input_legend', {Input_legend___focus: showLegend})}>\n {showLegend ? formatAsString(formatMessage, label || placeholder) : null}\n </legend>\n )}\n <div className={classNames('Input_wrapper', wrapperClassName)}>\n {inputPrefix}\n {textPrefix && <span>{textPrefix}</span>}\n {generateInput()}\n {limitExceeded > 0 && (\n <span className='Input_limit-exceeded'>\n {'-'}{limitExceeded}\n </span>\n )}\n {inputSuffix}\n {clearButton}\n </div>\n {addon}\n </fieldset>\n {customInputLabel && (\n <div className={`Input___customMessage Input___${customInputLabel.type}`}>\n {customInputLabel.type && (\n <i\n className={classNames(`icon ${customInputLabel.type}`, {\n 'icon-alert-outline': customInputLabel.type === ItemStatus.WARNING,\n 'icon-alert-circle-outline': customInputLabel.type === ItemStatus.ERROR,\n 'icon-information-outline': customInputLabel.type === ItemStatus.INFO,\n 'icon-check': customInputLabel.type === ItemStatus.SUCCESS,\n })}\n />)}\n <span>{customInputLabel.value}</span>\n </div>\n )}\n </div>\n );\n});\n\nexport default Input;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl} from 'react-intl';\n\nimport {formatAsComponent} from 'utils/i18n';\n\ntype Props = {\n text?: React.ReactNode | MessageDescriptor;\n style?: React.CSSProperties;\n}\nconst LoadingSpinner = ({text, style}: Props) => {\n const {formatMessage} = useIntl();\n\n return (\n <span\n id='loadingSpinner'\n className={classNames('LoadingSpinner', {'with-text': Boolean(text)})}\n style={style}\n data-testid='loadingSpinner'\n >\n <span\n className='fa fa-spinner fa-fw fa-pulse spinner'\n title={formatMessage({id: 'generic_icons.loading', defaultMessage: 'Loading Icon'})}\n />\n {formatAsComponent(text)}\n </span>\n );\n};\n\nexport default React.memo(LoadingSpinner);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\n\nimport LoadingSpinner from './loading_spinner';\n\ntype Props = {\n loading?: boolean;\n text?: MessageDescriptor | React.ReactNode;\n children?: React.ReactNode;\n}\n\nconst LoadingWrapper = ({loading = true, text, children}: Props) => {\n return (\n <>\n {loading ? <LoadingSpinner text={text}/> : children}\n </>\n );\n};\n\nexport default React.memo(LoadingWrapper);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getIsMobileView} from 'selectors/views/browser';\nimport store from 'stores/redux_store';\n\n/**\n * @deprecated This is a horrible hack that shouldn't used done elsewhere because we shouldn't be accessing the global\n * store directly, but it's too hard to get this value into these component properly without rewriting everything.\n * These components will eventually be replaced by the newer components in `components/menu` anyway.\n */\nexport function isMobile() {\n return getIsMobileView(store.getState());\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './menu_header.scss';\n\ntype Props = {\n children?: React.ReactNode;\n onClick?: () => void;\n}\n\n/**\n * @deprecated Use the \"webapp/channels/src/components/menu\" instead.\n */\nconst MenuHeader = ({children, onClick}: Props) => {\n return (\n <li\n className='MenuHeader'\n onClick={onClick}\n >\n {children}\n </li>\n );\n};\n\nexport default React.memo(MenuHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {getCloudSubscription, getSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {openModal} from 'actions/views/modals';\n\nimport useGetHighestThresholdCloudLimit from 'components/common/hooks/useGetHighestThresholdCloudLimit';\nimport useGetLimits from 'components/common/hooks/useGetLimits';\nimport useGetUsage from 'components/common/hooks/useGetUsage';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport TrialBenefitsModal from 'components/trial_benefits_modal/trial_benefits_modal';\n\nimport {ModalIdentifiers, CloudProducts} from 'utils/constants';\n\nimport './menu_item.scss';\n\ntype Props = {\n id: string;\n}\nconst MenuCloudTrial = ({id}: Props): JSX.Element | null => {\n const subscription = useSelector(getCloudSubscription);\n const subscriptionProduct = useSelector(getSubscriptionProduct);\n const license = useSelector(getLicense);\n const dispatch = useDispatch();\n\n const isCloud = license?.Cloud === 'true';\n const isFreeTrial = subscription?.is_free_trial === 'true';\n const freeTrialEndDay = moment(subscription?.trial_end_at).format('MMMM DD');\n const isAdmin = useSelector(isCurrentUserSystemAdmin);\n const openPricingModal = useOpenPricingModal();\n\n const openTrialBenefitsModal = async () => {\n await dispatch(openModal({\n modalId: ModalIdentifiers.TRIAL_BENEFITS_MODAL,\n dialogType: TrialBenefitsModal,\n }));\n };\n\n const someLimitNeedsAttention = Boolean(useGetHighestThresholdCloudLimit(useGetUsage(), useGetLimits()[0]));\n\n if (!isCloud) {\n return null;\n }\n\n const isStarter = subscriptionProduct?.sku === CloudProducts.STARTER;\n\n if (someLimitNeedsAttention || (!isStarter && !isFreeTrial)) {\n return null;\n }\n\n // for end users only display the trial information\n if (!isAdmin && !isFreeTrial) {\n return null;\n }\n\n const freeTrialContent = (\n <div className='MenuCloudTrial__free-trial'>\n <h5 className='MenuCloudTrial__free-trial__content-title'>\n <FormattedMessage\n id='menu.cloudFree.enterpriseTrialTitle'\n defaultMessage='Enterprise Trial'\n />\n </h5>\n <div className='MenuCloudTrial__free-trial__content-section'>\n <div className='MenuCloudTrial__free-trial__content-section__icon-section'>\n <i className='icon-arrow-up-bold-circle-outline'/>\n </div>\n <FormattedMessage\n id='menu.cloudFree.enterpriseTrialDescription'\n defaultMessage='Your trial is active until {trialEndDay}. Discover our top Enterprise features. <openModalLink>Learn more</openModalLink>'\n values={\n {\n trialEndDay: freeTrialEndDay,\n openModalLink: (msg: string) => (\n <a\n className='open-trial-benefits-modal style-link'\n onClick={isAdmin ? openTrialBenefitsModal : () => openPricingModal({trackingLocation: 'menu_cloud_trial'})}\n >\n {msg}\n </a>\n ),\n }\n }\n />\n </div>\n </div>\n );\n\n // menu option displayed when the workspace is not running any trial\n const noFreeTrialContent = (\n <FormattedMessage\n id='menu.cloudFree.postTrial.tryEnterprise'\n defaultMessage='Interested in a limitless plan with high-security features? <openModalLink>See plans</openModalLink>'\n values={\n {\n openModalLink: (msg: string) => (\n <a\n className='open-see-plans-modal style-link'\n onClick={() => openPricingModal({trackingLocation: 'menu_cloud_trial'})}\n >\n {msg}\n </a>\n ),\n }\n }\n />\n );\n\n return (\n <li\n className='MenuCloudTrial'\n role='menuitem'\n id={id}\n >\n {isFreeTrial ? freeTrialContent : noFreeTrialContent}\n </li>\n );\n};\nexport default MenuCloudTrial;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport menuItem from './menu_item';\n\ntype Props = {\n onClick: (e: React.MouseEvent) => void;\n ariaLabel?: string;\n text: React.ReactNode;\n extraText?: string;\n id?: string;\n buttonClass?: string;\n rightDecorator?: React.ReactNode;\n isDangerous?: boolean;\n disabled?: boolean;\n sibling?: React.ReactNode;\n iconClassName?: string;\n}\nexport const MenuItemActionImpl = ({\n onClick,\n ariaLabel,\n text,\n extraText,\n id,\n buttonClass,\n rightDecorator,\n isDangerous,\n disabled,\n sibling,\n iconClassName,\n}: Props) => (\n <>\n <button\n data-testid={id}\n id={id}\n aria-label={ariaLabel}\n className={classNames('style--none', buttonClass, {\n 'MenuItem__with-help': extraText,\n 'MenuItem__with-sibling': sibling,\n disabled,\n MenuItem__dangerous: isDangerous,\n })}\n onClick={onClick}\n disabled={disabled}\n >\n {iconClassName && <i className={`icon ${iconClassName}`}/>}\n {text && <span className='MenuItem__primary-text'>{text}{rightDecorator}</span>}\n {extraText && <span className='MenuItem__help-text'>{extraText}</span>}\n </button>\n {sibling}\n </>\n\n);\n\nconst MenuItemAction = menuItem(MenuItemActionImpl);\nMenuItemAction.displayName = 'MenuItemAction';\n\nexport default MenuItemAction;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {getSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud';\n\nimport {closeModal} from 'actions/views/modals';\n\nimport useGetHighestThresholdCloudLimit from 'components/common/hooks/useGetHighestThresholdCloudLimit';\nimport useGetLimits from 'components/common/hooks/useGetLimits';\nimport useGetUsage from 'components/common/hooks/useGetUsage';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport type {Message} from 'utils/i18n';\nimport {fallbackStarterLimits, asGBString, LimitTypes} from 'utils/limits';\n\nimport CloudUsageModal from './index';\n\nexport default function LHSNearingLimitsModal() {\n const dispatch = useDispatch();\n const product = useSelector(getSubscriptionProduct);\n const usage = useGetUsage();\n const intl = useIntl();\n const openPricingModal = useOpenPricingModal();\n\n const [limits] = useGetLimits();\n\n const primaryAction = {\n message: defineMessage({\n id: 'workspace_limits.modals.view_plans',\n defaultMessage: 'View plans',\n }),\n onClick: () => openPricingModal({trackingLocation: 'cloud_usage_lhs_nearing_limit_modal'}),\n };\n const secondaryAction = {\n message: defineMessage({\n id: 'workspace_limits.modals.close',\n defaultMessage: 'Close',\n }),\n onClick: () => {\n dispatch(closeModal(ModalIdentifiers.CLOUD_LIMITS));\n },\n };\n const highestLimit = useGetHighestThresholdCloudLimit(usage, limits);\n let title: Message = defineMessage({\n id: 'workspace_limits.modals.informational.title',\n defaultMessage: '{planName} limits',\n values: {\n planName: product?.name,\n },\n });\n\n let description: Message = defineMessage({\n id: 'workspace_limits.modals.informational.description.freeLimits',\n defaultMessage: '{planName} is restricted to {messages} message history and {storage} file storage.',\n values: {\n planName: product?.name,\n messages: intl.formatNumber(limits?.messages?.history ?? fallbackStarterLimits.messages.history),\n storage: asGBString(limits?.files?.total_storage ?? fallbackStarterLimits.files.totalStorage, intl.formatNumber),\n },\n });\n\n if (highestLimit && highestLimit.id === LimitTypes.messageHistory) {\n title = defineMessage({\n id: 'workspace_limits.modals.limits_reached.title.message_history',\n defaultMessage: 'Message history',\n });\n\n description = defineMessage({\n id: 'workspace_limits.modals.limits_reached.description.message_history',\n defaultMessage: 'Your sent message history is no longer available but you can still send messages. Upgrade to a paid plan and get unlimited access to your message history.',\n });\n }\n\n return (\n <CloudUsageModal\n title={title}\n description={description}\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n onClose={() => {\n dispatch(closeModal(ModalIdentifiers.CLOUD_LIMITS));\n }}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {getCloudSubscription} from 'mattermost-redux/selectors/entities/cloud';\nimport {isCloudLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {isAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport {openModal} from 'actions/views/modals';\n\nimport LHSNearingLimitsModal from 'components/cloud_usage_modal/lhs_nearing_limit_modal';\nimport useGetHighestThresholdCloudLimit from 'components/common/hooks/useGetHighestThresholdCloudLimit';\nimport useGetLimits from 'components/common/hooks/useGetLimits';\nimport useGetUsage from 'components/common/hooks/useGetUsage';\nimport UsagePercentBar from 'components/common/usage_percent_bar';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {limitThresholds} from 'utils/limits';\n\nimport useWords from './useWords';\n\nimport './menu_item.scss';\n\ntype Props = {\n id: string;\n}\n\nconst MenuItemCloudLimit = ({id}: Props) => {\n const dispatch = useDispatch();\n const subscription = useSelector(getCloudSubscription);\n const isAdminUser = isAdmin(useSelector(getCurrentUser).roles);\n const isCloud = useSelector(isCloudLicense);\n const isFreeTrial = subscription?.is_free_trial === 'true';\n const [limits] = useGetLimits();\n const usage = useGetUsage();\n const highestLimit = useGetHighestThresholdCloudLimit(usage, limits);\n const words = useWords(highestLimit, isAdminUser, 'menu_item_cloud_limit');\n\n const show = isCloud && !isFreeTrial;\n\n // words and highestLimit checks placed here instead of as part of show\n // because typescript doesn't correctly infer values later on otherwise\n if (!show || !words || !highestLimit) {\n return null;\n }\n\n let itemClass = 'MenuItemCloudLimit';\n if (((highestLimit.usage / highestLimit.limit) * 100) >= limitThresholds.danger) {\n itemClass += ' MenuItemCloudLimit--critical';\n }\n\n const descriptionClass = 'MenuItemCloudLimit__description';\n\n return (\n <li\n className={itemClass}\n role='menuitem'\n id={id}\n >\n <div className='MenuItemCloudLimit__title'>\n {words.title}\n {' '}\n <i\n className='icon icon-information-outline'\n onClick={() => dispatch(openModal({\n modalId: ModalIdentifiers.CLOUD_LIMITS,\n dialogType: LHSNearingLimitsModal,\n }))}\n />\n </div>\n <div className={descriptionClass}>{words.description}</div>\n <div className='MenuItemCloudLimit__usage'>\n <UsagePercentBar\n percent={Math.floor((highestLimit.usage / highestLimit.limit) * 100)}\n />\n <span className='MenuItemCloudLimit__usage-label'>{words.status}</span>\n </div>\n </li>\n );\n};\n\nexport default MenuItemCloudLimit;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {PrimitiveType, FormatXMLElementFn} from 'intl-messageformat';\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {defineMessage, useIntl} from 'react-intl';\n\nimport type {LimitSummary} from 'components/common/hooks/useGetHighestThresholdCloudLimit';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport NotifyAdminCTA from 'components/notify_admin_cta/notify_admin_cta';\n\nimport {MattermostFeatures, LicenseSkus} from 'utils/constants';\nimport {limitThresholds, asGBString, inK, LimitTypes} from 'utils/limits';\n\ninterface Words {\n title: React.ReactNode;\n description: React.ReactNode;\n status: React.ReactNode;\n}\n\nexport default function useWords(highestLimit: LimitSummary | false, isAdminUser: boolean, callerInfo: string): Words | false {\n const intl = useIntl();\n const openPricingModal = useOpenPricingModal();\n if (!highestLimit) {\n return false;\n }\n const usageRatio = (highestLimit.usage / highestLimit.limit) * 100;\n\n let callToAction = intl.formatMessage({\n id: 'workspace_limits.menu_limit.view_plans',\n defaultMessage: 'View plans',\n });\n\n if (isAdminUser) {\n callToAction = intl.formatMessage({\n id: 'workspace_limits.menu_limit.view_upgrade_options',\n defaultMessage: 'View upgrade options.',\n });\n }\n\n const values: Record<string, PrimitiveType | FormatXMLElementFn<string, string> | ((chunks: React.ReactNode | React.ReactNodeArray) => JSX.Element)> = {\n callToAction,\n a: (chunks: React.ReactNode | React.ReactNodeArray) => (\n <a\n id='view_plans_cta'\n onClick={() => openPricingModal({trackingLocation: callerInfo})}\n >\n {chunks}\n </a>),\n\n };\n\n let featureToNotifyOn = '';\n switch (highestLimit.id) {\n case LimitTypes.messageHistory:\n featureToNotifyOn = MattermostFeatures.UNLIMITED_MESSAGES;\n break;\n case LimitTypes.fileStorage:\n featureToNotifyOn = MattermostFeatures.UNLIMITED_FILE_STORAGE;\n break;\n default:\n break;\n }\n\n if (!isAdminUser && (usageRatio >= limitThresholds.danger || usageRatio >= limitThresholds.exceeded)) {\n values.callToAction = intl.formatMessage({\n id: 'workspace_limits.menu_limit.notify_admin',\n defaultMessage: 'Notify admin',\n });\n values.a = (chunks: React.ReactNode | React.ReactNodeArray) => (\n <NotifyAdminCTA\n ctaText={chunks}\n callerInfo={callerInfo}\n notifyRequestData={{\n required_feature: featureToNotifyOn,\n required_plan: LicenseSkus.Professional,\n trial_notification: false}}\n />);\n }\n\n switch (highestLimit.id) {\n case LimitTypes.messageHistory: {\n let description = defineMessage({\n id: 'workspace_limits.menu_limit.warn.messages_history',\n defaultMessage: 'You’re getting closer to the free {limit} message limit. <a>{callToAction}</a>',\n });\n values.limit = intl.formatNumber(highestLimit.limit);\n if (usageRatio >= limitThresholds.danger) {\n if (isAdminUser) {\n description = defineMessage({\n id: 'workspace_limits.menu_limit.critical.messages_history',\n defaultMessage: 'You’re close to hitting the free {limit} message history limit <a>{callToAction}</a>',\n });\n } else {\n description = defineMessage({\n id: 'workspace_limits.menu_limit.critical.messages_history_non_admin',\n defaultMessage: 'You\\'re almost at the message limit. Your admin can upgrade your plan for unlimited messages. <a>{callToAction}</a>',\n });\n }\n }\n if (usageRatio >= limitThresholds.reached) {\n if (isAdminUser) {\n description = defineMessage({\n id: 'workspace_limits.menu_limit.reached.messages_history',\n defaultMessage: 'You’ve reached the free message history limit. You can only view up to the last {limit} messages in your history. <a>{callToAction}</a>',\n });\n values.limit = inK(highestLimit.limit);\n } else {\n description = defineMessage({\n id: 'workspace_limits.menu_limit.reached.messages_history_non_admin',\n defaultMessage: 'You’ve reached your message limit. Your admin can upgrade your plan for unlimited messages. <a>{callToAction}</a>',\n });\n }\n }\n if (usageRatio >= limitThresholds.exceeded) {\n if (isAdminUser) {\n description = defineMessage({\n id: 'workspace_limits.menu_limit.over.messages_history',\n defaultMessage: 'You’re over the free message history limit. You can only view up to the last {limit} messages in your history. <a>{callToAction}</a>',\n });\n values.limit = inK(highestLimit.limit);\n } else {\n description = defineMessage({\n id: 'workspace_limits.menu_limit.over.messages_history_non_admin',\n defaultMessage: 'You\\'re over your message limit. Your admin can upgrade your plan for unlimited messages. <a>{callToAction}</a>',\n });\n }\n }\n return {\n title: intl.formatMessage({\n id: 'workspace_limits.menu_limit.messages',\n defaultMessage: 'Total messages',\n }),\n description: intl.formatMessage<ReactNode>(\n description,\n values,\n ),\n status: inK(highestLimit.usage),\n };\n }\n case LimitTypes.fileStorage: {\n let description = defineMessage({\n id: 'workspace_limits.menu_limit.warn.files_storage',\n defaultMessage: 'You’re getting closer to the {limit} file storage limit. <a>{callToAction}</a>',\n });\n values.limit = asGBString(highestLimit.limit, intl.formatNumber);\n if (usageRatio >= limitThresholds.danger) {\n description = defineMessage({\n id: 'workspace_limits.menu_limit.critical.files_storage',\n defaultMessage: 'You’re getting closer to the {limit} file storage limit. <a>{callToAction}</a>',\n });\n }\n if (usageRatio >= limitThresholds.reached) {\n description = defineMessage({\n id: 'workspace_limits.menu_limit.reached.files_storage',\n defaultMessage: 'You’ve reached the {limit} file storage limit. You can only access the most recent {limit} worth of files. <a>{callToAction}</a>',\n });\n }\n if (usageRatio >= limitThresholds.exceeded) {\n description = defineMessage({\n id: 'workspace_limits.menu_limit.over.files_storage',\n defaultMessage: 'You’re over the {limit} file storage limit. You can only access the most recent {limit} worth of files. <a>{callToAction}</a>',\n });\n }\n\n return {\n title: intl.formatMessage({\n id: 'workspace_limits.menu_limit.file_storage',\n defaultMessage: 'File storage limit',\n }),\n description: intl.formatMessage<ReactNode>(\n description,\n values,\n ),\n status: asGBString(highestLimit.usage, intl.formatNumber),\n };\n }\n default:\n return false;\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport ExternalLink from 'components/external_link';\n\nimport menuItem from './menu_item';\n\ntype Props = {\n url: string;\n text: React.ReactNode;\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n iconClassName?: string;\n}\nexport const MenuItemExternalLinkImpl: React.FC<Props> = ({url, text, iconClassName, onClick}: Props) => (\n <ExternalLink\n href={url}\n onClick={onClick}\n location='menu_item_external_link'\n >\n {iconClassName && <i className={`icon ${iconClassName}`}/>}\n <span className='MenuItem__primary-text'>\n {text}\n </span>\n </ExternalLink>\n);\n\nconst MenuItemExternalLink = menuItem(MenuItemExternalLinkImpl);\nMenuItemExternalLink.displayName = 'MenuItemExternalLink';\nexport default MenuItemExternalLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {Link} from 'react-router-dom';\n\nimport menuItem from './menu_item';\n\ntype Props = {\n to: string;\n text: React.ReactNode;\n className?: string;\n disabled?: boolean;\n sibling?: React.ReactNode;\n}\n\nexport const MenuItemLinkImpl = ({to, text, className, disabled, sibling}: Props) => (\n <>\n <Link\n to={to}\n className={classNames(className, {'MenuItem__with-sibling': sibling, disabled})}\n disabled={disabled}\n >\n <span className='MenuItem__primary-text'>{text}</span>\n </Link>\n {sibling}\n </>\n);\n\nconst MenuItemLink = menuItem(MenuItemLinkImpl);\nMenuItemLink.displayName = 'MenuItemLink';\n\nexport default MenuItemLink;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport ToggleModalButton from 'components/toggle_modal_button';\n\nimport menuItem from './menu_item';\n\ntype Props = {\n modalId: string;\n dialogType: React.ComponentType<any>;\n dialogProps?: Record<string, any>;\n extraText?: string;\n text?: React.ReactNode;\n ariaLabel?: string;\n className?: string;\n children?: React.ReactNode;\n sibling?: React.ReactNode;\n showUnread?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n}\n\nexport const MenuItemToggleModalReduxImpl: React.FC<Props> = ({modalId, dialogType, dialogProps, text, ariaLabel, extraText, children, className, sibling, showUnread, disabled, onClick}: Props) => (\n <>\n <ToggleModalButton\n ariaLabel={ariaLabel}\n modalId={modalId}\n dialogType={dialogType}\n dialogProps={dialogProps}\n className={classNames({\n 'MenuItem__with-help': extraText,\n [`${className}`]: className,\n 'MenuItem__with-sibling': sibling,\n disabled,\n })}\n showUnread={showUnread}\n disabled={disabled}\n onClick={onClick}\n >\n {text && <span className='MenuItem__primary-text'>{text}</span>}\n {extraText && <span className='MenuItem__help-text'>{extraText}</span>}\n {children}\n </ToggleModalButton>\n {sibling}\n </>\n);\n\nconst MenuItemToggleModalRedux = menuItem(MenuItemToggleModalReduxImpl);\nMenuItemToggleModalRedux.displayName = 'MenuItemToggleModalRedux';\n\nexport default MenuItemToggleModalRedux;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\n\nimport ExternalLink from 'components/external_link';\n\nimport {LicenseLinks} from 'utils/constants';\n\nimport './menu_item.scss';\n\nconst FreeVersionBadge = styled.div`\n position: relative;\n top: 1px;\n display: flex;\n padding: 2px 6px;\n border-radius: var(--radius-s);\n margin-bottom: 6px;\n background: rgba(var(--center-channel-color-rgb), 0.08);\n color: rgba(var(--center-channel-color-rgb), 0.75);\n font-family: 'Open Sans', sans-serif;\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.025em;\n line-height: 16px;\n`;\n\ntype Props = {\n id: string;\n}\n\nconst MenuStartTrial = (props: Props): JSX.Element | null => {\n const {formatMessage} = useIntl();\n\n const license = useSelector(getLicense);\n const isCurrentLicensed = license?.IsLicensed;\n\n if (isCurrentLicensed === 'true') {\n return null;\n }\n\n return (\n <li\n className={'MenuStartTrial'}\n role='menuitem'\n id={props.id}\n >\n <FreeVersionBadge>{'FREE EDITION'}</FreeVersionBadge>\n <div className='editionText'>\n {formatMessage(\n {\n id: 'navbar_dropdown.versionText',\n defaultMessage: 'This is the free <link>unsupported</link> edition of Mattermost.',\n },\n {\n link: (msg: React.ReactNode) => (\n <ExternalLink\n location='menu_start_trial.unsupported-link'\n href={LicenseLinks.UNSUPPORTED}\n >\n {msg}\n </ExternalLink>\n ),\n },\n )}\n </div>\n </li>\n );\n};\n\nexport default MenuStartTrial;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {CSSProperties} from 'react';\nimport {injectIntl} from 'react-intl';\nimport type {WrappedComponentProps} from 'react-intl';\n\nimport {showMobileSubMenuModal} from 'actions/global_actions';\n\nimport Constants from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\n\nimport type {Menu} from 'types/store/plugins';\n\nimport {isMobile as isMobileViewHack} from '../is_mobile_view_hack';\n\nimport './menu_item.scss';\n\n// Requires an object conforming to a submenu structure passed to registerPostDropdownSubMenuAction\n// of the form:\n// {\n// \"id\": \"A\",\n// \"parentMenuId\": null,\n// \"text\": \"A text\",\n// \"subMenu\": [\n// {\n// \"id\": \"B\",\n// \"parentMenuId\": \"A\",\n// \"text\": \"B text\"\n// \"subMenu\": [],\n// \"action\": () => {},\n// \"filter\": () => {},\n// }\n// ],\n// \"action\": () => {},\n// \"filter\": () => {},\n// }\n// Submenus can contain Submenus as well\n\nexport type Props = WrappedComponentProps & {\n id?: string;\n postId?: string;\n text: React.ReactNode;\n selectedValueText?: React.ReactNode;\n renderSelected?: boolean;\n subMenu?: Menu[];\n subMenuClass?: string;\n icon?: React.ReactNode;\n action?: (id?: string) => void;\n filter?: (id?: string) => boolean;\n ariaLabel?: string;\n root?: boolean;\n show?: boolean;\n direction?: 'left' | 'right';\n openUp?: boolean;\n styleSelectableItem?: boolean;\n extraText?: string| JSX.Element;\n rightDecorator?: React.ReactNode;\n isHeader?: boolean;\n tabIndex?: number;\n}\n\ntype State = {\n show: boolean;\n}\n\n/**\n * @deprecated Use the \"webapp/channels/src/components/menu\" instead.\n */\nexport class SubMenuItem extends React.PureComponent<Props, State> {\n private node: React.RefObject<HTMLLIElement>;\n\n public static defaultProps = {\n show: true,\n direction: 'left' as const,\n subMenuClass: 'pl-4',\n renderSelected: true,\n };\n\n public constructor(props: Props) {\n super(props);\n this.node = React.createRef();\n\n this.state = {\n show: false,\n };\n }\n\n show = () => {\n this.setState({show: true});\n };\n\n hide = () => {\n this.setState({show: false});\n };\n\n private onClick = (event: React.SyntheticEvent<HTMLElement>| React.BaseSyntheticEvent<HTMLElement>) => {\n event.preventDefault();\n const {id, postId, subMenu, action, root, isHeader} = this.props;\n const isMobile = isMobileViewHack();\n if (isHeader) {\n event.stopPropagation();\n return;\n }\n if (isMobile) {\n if (subMenu && subMenu.length) { // if contains a submenu, call openModal with it\n if (!root) { //required to close only the original menu\n event.stopPropagation();\n }\n showMobileSubMenuModal(subMenu);\n } else if (action) { // leaf node in the tree handles action only\n action(postId);\n }\n } else {\n const shouldCallAction =\n (event.type === 'keydown' && event.currentTarget.id === id) ||\n event.target.parentElement.id === id;\n if (shouldCallAction && action) {\n action(postId);\n }\n }\n };\n\n handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (Keyboard.isKeyPressed(event, Constants.KeyCodes.ENTER)) {\n if (this.props.action) {\n this.onClick(event);\n } else {\n this.show();\n }\n }\n\n if (Keyboard.isKeyPressed(event, Constants.KeyCodes.RIGHT)) {\n if (this.props.direction === 'right') {\n this.show();\n } else {\n this.hide();\n }\n }\n\n if (Keyboard.isKeyPressed(event, Constants.KeyCodes.LEFT)) {\n if (this.props.direction === 'left') {\n this.show();\n } else {\n this.hide();\n }\n }\n };\n\n public render() {\n const {id, postId, text, selectedValueText, subMenu, icon, filter, ariaLabel, direction, styleSelectableItem, extraText, renderSelected, rightDecorator, tabIndex, intl} = this.props;\n const isMobile = isMobileViewHack();\n\n if (filter && !filter(id)) {\n return ('');\n }\n\n let textProp = text;\n if (icon) {\n textProp = (\n <>\n <span className={classNames(['icon', {'sorting-menu-icon': styleSelectableItem}])}>{icon}</span>\n {textProp}\n </>\n );\n }\n\n const hasSubmenu = subMenu && subMenu.length;\n const subMenuStyle: CSSProperties = {\n visibility: (this.state.show && hasSubmenu && !isMobile ? 'visible' : 'hidden') as 'visible' | 'hidden',\n top: this.node && this.node.current ? String(this.node.current.offsetTop) + 'px' : 'unset',\n };\n\n const menuOffset = '100%';\n if (direction === 'left') {\n subMenuStyle.right = menuOffset;\n } else {\n subMenuStyle.left = menuOffset;\n }\n\n let subMenuContent: React.ReactNode = '';\n\n if (!isMobile) {\n subMenuContent = (\n <ul\n className={classNames(['a11y__popup Menu dropdown-menu SubMenu', {styleSelectableItem}])}\n style={subMenuStyle}\n >\n {hasSubmenu ? subMenu!.map((s) => {\n const hasDivider = s.id === 'ChannelMenu-moveToDivider';\n let aria = ariaLabel;\n if (s.action) {\n aria = s.text === selectedValueText ? s.text + ' ' + intl.formatMessage({id: 'sidebar.menu.item.selected', defaultMessage: 'selected'}) : s.text + ' ' + intl.formatMessage({id: 'sidebar.menu.item.notSelected', defaultMessage: 'not selected'});\n }\n return (\n <span\n className={classNames(['SubMenuItemContainer', {hasDivider}])}\n key={s.id}\n tabIndex={s.id.includes('Divider') ? 1 : 0}\n >\n <SubMenuItem\n id={s.id}\n postId={postId}\n text={s.text}\n selectedValueText={s.selectedValueText}\n icon={s.icon}\n subMenu={s.subMenu}\n action={s.action}\n filter={s.filter}\n ariaLabel={aria}\n root={false}\n direction={s.direction}\n isHeader={s.isHeader}\n tabIndex={1}\n intl={this.props.intl}\n />\n {s.text === selectedValueText && <span className='sorting-menu-checkbox'>\n <i className='icon-check'/>\n </span>}\n </span>\n );\n }) : ''}\n </ul>\n );\n }\n\n return (\n <li\n className={classNames(['SubMenuItem MenuItem', {styleSelectableItem}])}\n role='menuitem'\n id={id + '_menuitem'}\n ref={this.node}\n onClick={this.onClick}\n >\n <div\n className={classNames([{styleSelectableItemDiv: styleSelectableItem}])}\n id={id}\n aria-label={ariaLabel}\n onMouseEnter={this.show}\n onMouseLeave={this.hide}\n tabIndex={tabIndex ?? 0}\n onKeyDown={this.handleKeyDown}\n >\n <div className={icon ? 'grid' : 'flex'}>\n {textProp}{rightDecorator}\n {renderSelected && <span className='selected'>{selectedValueText}</span>}\n {id !== 'ChannelMenu-moveToDivider' &&\n <span\n id={'channelHeaderDropdownIconRight_' + id}\n className={classNames([`fa fa-angle-right SubMenu__icon-right${hasSubmenu ? '' : '-empty'}`, {mobile: isMobile}])}\n aria-label={intl.formatMessage({id: 'post_info.submenu.icon', defaultMessage: 'submenu icon'}).toLowerCase()}\n />\n }\n </div>\n {extraText && <span className='MenuItem__help-text'>{extraText}</span>}\n {subMenuContent}\n </div>\n </li>\n );\n }\n}\n\nexport default injectIntl(SubMenuItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {CSSProperties} from 'react';\n\nimport MenuGroup from './menu_group';\nimport MenuHeader from './menu_header';\nimport MenuCloudTrial from './menu_items/menu_cloud_trial';\nimport MenuItemAction from './menu_items/menu_item_action';\nimport MenuItemCloudLimit from './menu_items/menu_item_cloud_limit';\nimport MenuItemExternalLink from './menu_items/menu_item_external_link';\nimport MenuItemLink from './menu_items/menu_item_link';\nimport MenuItemToggleModalRedux from './menu_items/menu_item_toggle_modal_redux';\nimport MenuStartTrial from './menu_items/menu_start_trial';\nimport SubMenuItem from './menu_items/submenu_item';\n\nimport './menu.scss';\n\ntype Props = {\n children?: React.ReactNode;\n openLeft?: boolean;\n openUp?: boolean;\n id?: string;\n ariaLabel: string;\n customStyles?: CSSProperties;\n className?: string;\n listId?: string;\n}\n\n/**\n * @deprecated Use the \"webapp/channels/src/components/menu\" instead.\n */\nexport default class Menu extends React.PureComponent<Props> {\n public static Header = MenuHeader;\n public static Group = MenuGroup;\n public static ItemAction = MenuItemAction;\n public static ItemExternalLink = MenuItemExternalLink;\n public static ItemLink = MenuItemLink;\n public static ItemToggleModalRedux = MenuItemToggleModalRedux;\n public static ItemSubMenu = SubMenuItem;\n public static CloudTrial = MenuCloudTrial;\n public static StartTrial = MenuStartTrial;\n public static ItemCloudLimit = MenuItemCloudLimit;\n\n public node: React.RefObject<HTMLUListElement>; //Public because it is used by tests\n private observer: MutationObserver;\n\n public constructor(props: Props) {\n super(props);\n this.node = React.createRef();\n this.observer = new MutationObserver(this.hideUnneededDividers);\n }\n\n public hideUnneededDividers = () => { //Public because it is used by tests\n if (this.node.current === null) {\n return;\n }\n\n this.observer.disconnect();\n const children = Object.values(this.node.current.children).slice(0, this.node.current.children.length) as HTMLElement[];\n\n // Hiding dividers at beginning and duplicated ones\n let prevWasDivider = false;\n let isAtBeginning = true;\n for (const child of children) {\n if (child.classList.contains('menu-divider') || child.classList.contains('mobile-menu-divider')) {\n child.style.display = 'block';\n if (isAtBeginning || prevWasDivider) {\n child.style.display = 'none';\n }\n prevWasDivider = true;\n } else {\n isAtBeginning = false;\n prevWasDivider = false;\n }\n }\n children.reverse();\n\n // Hiding trailing dividers\n for (const child of children) {\n if (child.classList.contains('menu-divider') || child.classList.contains('mobile-menu-divider')) {\n child.style.display = 'none';\n } else {\n break;\n }\n }\n this.observer.observe(this.node.current, {attributes: true, childList: true, subtree: true});\n };\n\n public componentDidMount() {\n this.hideUnneededDividers();\n }\n\n public componentDidUpdate() {\n this.hideUnneededDividers();\n }\n\n public componentWillUnmount() {\n this.observer.disconnect();\n }\n\n // Used from DotMenu component to know in which direction show the menu\n public rect() {\n if (this.node && this.node.current) {\n return this.node.current.getBoundingClientRect();\n }\n return null;\n }\n\n handleMenuClick = (e: React.MouseEvent) => {\n if (e.target === this.node.current) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n public render() {\n const {children, openUp, openLeft, id, listId, ariaLabel, customStyles} = this.props;\n let styles: CSSProperties = {};\n if (customStyles) {\n styles = customStyles;\n }\n\n return (\n <div\n aria-label={ariaLabel}\n className='a11y__popup Menu'\n id={id}\n role='menu'\n >\n <ul\n id={listId}\n ref={this.node}\n style={styles}\n className={classNames(\n 'Menu__content dropdown-menu',\n {\n openLeft,\n openUp,\n },\n this.props.className,\n )}\n onClick={this.handleMenuClick}\n >\n {children}\n </ul>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport './menu_group.scss';\n\ntype Props = {\n divider?: React.ReactNode;\n children?: React.ReactNode;\n};\n\n/**\n * @deprecated Use the \"webapp/channels/src/components/menu\" instead.\n */\nconst MenuGroup = (props: Props) => {\n const handleDividerClick = (e: React.MouseEvent): void => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const divider = props.divider ?? (\n <li\n className='MenuGroup menu-divider'\n onClick={handleDividerClick}\n />\n );\n\n return (\n <>\n {divider}\n {props.children}\n </>\n );\n};\n\nexport default React.memo(MenuGroup);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport './menu_item.scss';\n\n/**\n * @deprecated Use the \"webapp/channels/src/components/menu\" instead.\n */\nexport default function menuItem(Component: React.ComponentType<any>) {\n type Props = {\n show: boolean;\n id?: string;\n icon?: React.ReactNode;\n text?: React.ReactNode;\n }\n class MenuItem extends React.PureComponent<Props & React.ComponentProps<typeof Component>> {\n public static defaultProps = {\n show: true,\n };\n\n public static displayName?: string;\n\n public render() {\n const {id, show, icon, text, ...props} = this.props;\n if (!show) {\n return null;\n }\n\n let textProp: React.ReactNode = text;\n if (icon) {\n textProp = (\n <>\n <span className='icon'>{icon}</span>\n <div className='text'>{text}</div>\n </>\n );\n }\n\n return (\n <li\n className={classNames('MenuItem', {\n 'MenuItem--with-icon': icon,\n })}\n role='menuitem'\n id={id}\n >\n <Component\n text={textProp}\n ariaLabel={text?.toString()}\n id={id + '-button'}\n {...props}\n />\n </li>\n );\n }\n }\n return MenuItem;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect} from 'react';\nimport {useIntl, FormattedMessage} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {getPrevTrialLicense} from 'mattermost-redux/actions/admin';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {isCurrentUserSystemAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {NotifyStatus} from 'components/common/hooks/useGetNotifyAdmin';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport ExternalLink from 'components/external_link';\nimport StartTrialBtn from 'components/learn_more_trial_modal/start_trial_btn';\nimport {useNotifyAdmin} from 'components/notify_admin_cta/notify_admin_cta';\n\nimport {FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS} from 'utils/cloud_utils';\nimport {ModalIdentifiers, AboutLinks, LicenseLinks} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport './feature_restricted_modal.scss';\n\ntype FeatureRestrictedModalProps = {\n titleAdminPreTrial: string;\n messageAdminPreTrial: string;\n titleAdminPostTrial?: string;\n messageAdminPostTrial?: string;\n titleEndUser?: string;\n messageEndUser?: string;\n customSecondaryButton?: { msg: string; action: () => void };\n feature?: string;\n minimumPlanRequiredForFeature?: string;\n}\n\nconst FeatureRestrictedModal = ({\n titleAdminPreTrial,\n messageAdminPreTrial,\n titleAdminPostTrial,\n messageAdminPostTrial,\n titleEndUser,\n messageEndUser,\n customSecondaryButton,\n feature,\n minimumPlanRequiredForFeature,\n}: FeatureRestrictedModalProps) => {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(getPrevTrialLicense());\n }, []);\n\n const prevTrialLicense = useSelector((state: GlobalState) => state.entities.admin.prevTrialLicense);\n const hasSelfHostedPriorTrial = prevTrialLicense.IsLicensed === 'true';\n\n const hasPriorTrial = hasSelfHostedPriorTrial;\n const isSystemAdmin = useSelector(isCurrentUserSystemAdmin);\n const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.FEATURE_RESTRICTED_MODAL));\n const license = useSelector(getLicense);\n const isCloud = license?.Cloud === 'true';\n const openPricingModal = useOpenPricingModal();\n\n const [notifyAdminBtnText, notifyAdmin, notifyRequestStatus] = useNotifyAdmin({\n ctaText: formatMessage({\n id: 'feature_restricted_modal.button.notify',\n defaultMessage: 'Notify Admin',\n }),\n }, {\n required_feature: feature || '',\n required_plan: minimumPlanRequiredForFeature || '',\n trial_notification: false,\n });\n\n if (!show) {\n return null;\n }\n\n const dismissAction = () => {\n dispatch(closeModal(ModalIdentifiers.FEATURE_RESTRICTED_MODAL));\n };\n\n const handleViewPlansClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (isSystemAdmin) {\n openPricingModal({trackingLocation: 'feature_restricted_modal'});\n dismissAction();\n } else {\n notifyAdmin(e, 'feature_restricted_modal');\n }\n };\n\n const getTitle = () => {\n if (isSystemAdmin) {\n return (hasPriorTrial) ? titleAdminPostTrial : titleAdminPreTrial;\n }\n\n return titleEndUser;\n };\n\n const getMessage = () => {\n if (isSystemAdmin) {\n return (hasPriorTrial) ? messageAdminPostTrial : messageAdminPreTrial;\n }\n\n return messageEndUser;\n };\n\n const showStartTrial = isSystemAdmin && !hasPriorTrial && !isCloud;\n\n // define what is the secondary button text and action, by default will be the View Plan button\n let secondaryBtnMsg = formatMessage({id: 'feature_restricted_modal.button.plans', defaultMessage: 'View plans'});\n if (!isSystemAdmin) {\n secondaryBtnMsg = notifyAdminBtnText as string;\n }\n let secondaryBtnAction = handleViewPlansClick;\n if (customSecondaryButton) {\n secondaryBtnMsg = customSecondaryButton.msg;\n secondaryBtnAction = customSecondaryButton.action;\n }\n\n const trialBtn = (\n <StartTrialBtn\n onClick={dismissAction}\n telemetryId='start_self_hosted_trial_after_team_creation_restricted'\n btnClass='btn btn-primary'\n renderAsButton={true}\n />\n );\n\n return (\n <GenericModal\n id='FeatureRestrictedModal'\n className='FeatureRestrictedModal'\n compassDesign={true}\n modalHeaderText={getTitle()}\n onExited={dismissAction}\n >\n <div className='FeatureRestrictedModal__body'>\n <p className='FeatureRestrictedModal__description'>\n {getMessage()}\n </p>\n {showStartTrial && (\n <p className='FeatureRestrictedModal__terms'>\n <FormattedMessage\n id='feature_restricted_modal.agreement'\n defaultMessage='By selecting <highlight>Try free for {trialLength} days</highlight>, I agree to the <linkEvaluation>Mattermost Software and Services License Agreement</linkEvaluation>, <linkPrivacy>Privacy Policy</linkPrivacy>, and receiving product emails.'\n values={{\n trialLength: FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS,\n highlight: (msg: React.ReactNode) => (\n <strong>{msg}</strong>\n ),\n linkEvaluation: (msg: React.ReactNode) => (\n <ExternalLink\n href={LicenseLinks.SOFTWARE_SERVICES_LICENSE_AGREEMENT}\n location='feature_restricted_modal'\n >\n {msg}\n </ExternalLink>\n ),\n linkPrivacy: (msg: React.ReactNode) => (\n <ExternalLink\n href={AboutLinks.PRIVACY_POLICY}\n location='feature_restricted_modal'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>\n )}\n <div className={classNames('FeatureRestrictedModal__buttons', {single: !showStartTrial})}>\n <button\n id='button-plans'\n className='button-plans'\n onClick={secondaryBtnAction}\n disabled={notifyRequestStatus === NotifyStatus.AlreadyComplete}\n >\n {secondaryBtnMsg}\n </button>\n {showStartTrial && (\n trialBtn\n )}\n </div>\n </div>\n </GenericModal>\n );\n};\n\nexport default FeatureRestrictedModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useCallback, type ReactNode} from 'react';\nimport {useIntl} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\n\nimport FeatureRestrictedModal from 'components/feature_restricted_modal/feature_restricted_modal';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS} from 'utils/cloud_utils';\nimport {LicenseSkus, ModalIdentifiers} from 'utils/constants';\n\nimport './restricted_indicator.scss';\n\ntype Props = {\n useModal?: boolean;\n blocked?: boolean;\n feature?: string;\n minimumPlanRequiredForFeature?: string;\n tooltipTitle?: ReactNode;\n tooltipMessage?: ReactNode;\n tooltipMessageBlocked?: string | MessageDescriptor;\n titleAdminPreTrial?: ReactNode;\n messageAdminPreTrial?: ReactNode;\n titleAdminPostTrial?: ReactNode;\n messageAdminPostTrial?: ReactNode;\n titleEndUser?: ReactNode;\n messageEndUser?: ReactNode;\n ctaExtraContent?: ReactNode;\n clickCallback?: () => void;\n customSecondaryButtonInModal?: {msg: string; action: () => void};\n}\n\nfunction capitalizeFirstLetter(s: string) {\n return s?.charAt(0)?.toUpperCase() + s?.slice(1);\n}\n\nconst RestrictedIndicator = ({\n useModal = true,\n blocked,\n tooltipTitle,\n tooltipMessage,\n tooltipMessageBlocked,\n titleAdminPreTrial,\n messageAdminPreTrial,\n titleAdminPostTrial,\n messageAdminPostTrial,\n titleEndUser,\n messageEndUser,\n ctaExtraContent,\n clickCallback,\n customSecondaryButtonInModal,\n feature,\n minimumPlanRequiredForFeature,\n}: Props) => {\n const {formatMessage} = useIntl();\n\n const getTooltipMessageBlocked = useCallback(() => {\n if (!tooltipMessageBlocked) {\n return formatMessage(\n {\n id: 'restricted_indicator.tooltip.message.blocked',\n defaultMessage: 'This is a paid feature, available with a free {trialLength}-day trial',\n }, {\n trialLength: FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS,\n },\n );\n }\n\n return typeof tooltipMessageBlocked === 'string' ? tooltipMessageBlocked : formatMessage(tooltipMessageBlocked, {\n trialLength: FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS,\n article: minimumPlanRequiredForFeature === LicenseSkus.Enterprise ? 'an' : 'a',\n minimumPlanRequiredForFeature,\n });\n }, [tooltipMessageBlocked]);\n\n const icon = <i className={classNames('RestrictedIndicator__icon-tooltip', 'icon', blocked ? 'icon-key-variant' : 'trial')}/>;\n\n const handleClickCallback = () => {\n if (clickCallback) {\n clickCallback();\n }\n };\n\n return (\n <span className='RestrictedIndicator__icon-tooltip-container'>\n <WithTooltip\n title={\n <div className='RestrictedIndicator__icon-tooltip'>\n <span className='title'>\n {tooltipTitle || formatMessage({id: 'restricted_indicator.tooltip.title', defaultMessage: '{minimumPlanRequiredForFeature} feature'}, {minimumPlanRequiredForFeature: capitalizeFirstLetter(minimumPlanRequiredForFeature!)})}\n </span>\n <span className='message'>\n {blocked ? (\n getTooltipMessageBlocked()\n ) : (\n tooltipMessage || formatMessage({id: 'restricted_indicator.tooltip.mesage', defaultMessage: 'During your trial you are able to use this feature.'})\n )}\n </span>\n </div>\n }\n >\n {useModal && blocked ? (\n <span>\n <ToggleModalButton\n id={`${feature}-restricted-indicator`?.replaceAll('.', '_')}\n className='RestrictedIndicator__button'\n modalId={ModalIdentifiers.FEATURE_RESTRICTED_MODAL}\n dialogType={FeatureRestrictedModal}\n onClick={handleClickCallback}\n dialogProps={{\n titleAdminPreTrial,\n messageAdminPreTrial,\n titleAdminPostTrial,\n messageAdminPostTrial,\n titleEndUser,\n messageEndUser,\n customSecondaryButton: customSecondaryButtonInModal,\n feature,\n minimumPlanRequiredForFeature,\n }}\n >\n {icon}\n {ctaExtraContent}\n </ToggleModalButton>\n </span>\n ) : (\n <div className='RestrictedIndicator__content'>\n {icon}\n {ctaExtraContent}\n </div>\n )}\n </WithTooltip>\n </span>\n );\n};\n\nexport default RestrictedIndicator;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {CSSTransition} from 'react-transition-group';\n\nimport {isMobile} from './is_mobile_view_hack';\n\nconst ANIMATION_DURATION = 80;\n\ntype Props = {\n children?: React.ReactNode;\n show: boolean;\n}\n\n/**\n * @deprecated Use the \"webapp/channels/src/components/menu\" instead.\n */\nexport default function MenuWrapperAnimation(props: Props) {\n if (isMobile()) {\n if (props.show) {\n return props.children;\n }\n\n return null;\n }\n\n return (\n <CSSTransition\n in={props.show}\n classNames='MenuWrapperAnimation'\n enter={true}\n exit={true}\n mountOnEnter={true}\n unmountOnExit={true}\n timeout={ANIMATION_DURATION}\n >\n {props.children}\n </CSSTransition>\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport Constants from 'utils/constants';\n\nimport MenuWrapperAnimation from './menu_wrapper_animation';\n\nimport './menu_wrapper.scss';\n\ndeclare module 'react' {\n\n // This isn't a valid HTML attribute, but we use it in enough places now that it'll require some work to remove it\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface HTMLAttributes<T> {\n disabled?: boolean;\n }\n}\n\ntype Props = {\n children?: React.ReactNode;\n className: string;\n onToggle?: (open: boolean) => void;\n animationComponent: any;\n id?: string;\n isDisabled?: boolean;\n stopPropagationOnToggle?: boolean;\n open?: boolean;\n}\n\ntype State = {\n open: boolean;\n}\n\n/**\n * @deprecated Use the \"webapp/channels/src/components/menu\" instead.\n */\nexport default class MenuWrapper extends React.PureComponent<Props, State> {\n private node: React.RefObject<HTMLDivElement>;\n\n public static defaultProps = {\n className: '',\n animationComponent: MenuWrapperAnimation,\n };\n\n public constructor(props: Props) {\n super(props);\n if (!Array.isArray(props.children) || props.children.length !== 2) {\n throw new Error('MenuWrapper needs exactly 2 children');\n }\n this.state = {\n open: false,\n };\n this.node = React.createRef();\n }\n\n public componentDidMount() {\n if (this.state.open) {\n this.addEventListeners();\n }\n }\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if (props.open !== undefined && props.open !== state.open) {\n return {\n open: props.open,\n };\n }\n return null;\n }\n\n public componentDidUpdate(prevProps: Props, prevState: State) {\n if (this.state.open && !prevState.open) {\n this.addEventListeners();\n } else if (!this.state.open && prevState.open) {\n this.removeEventListeners();\n }\n }\n\n public componentWillUnmount() {\n if (this.state.open) {\n this.removeEventListeners();\n }\n }\n\n private addEventListeners() {\n document.addEventListener('click', this.closeOnBlur, true);\n document.addEventListener('keyup', this.keyboardClose, true);\n }\n\n private removeEventListeners() {\n document.removeEventListener('click', this.closeOnBlur, true);\n document.removeEventListener('keyup', this.keyboardClose, true);\n }\n\n private keyboardClose = (e: KeyboardEvent) => {\n if (e.key === Constants.KeyCodes.ESCAPE[0]) {\n this.close();\n }\n\n if (e.key === Constants.KeyCodes.TAB[0]) {\n this.closeOnBlur(e);\n }\n };\n\n private closeOnBlur = (e: Event) => {\n if (this.node && this.node.current && e.target && this.node.current.contains(e.target as Node)) {\n return;\n }\n\n this.close();\n };\n\n public close = () => {\n if (this.state.open) {\n this.setState({open: false});\n if (this.props.onToggle) {\n this.props.onToggle(false);\n }\n }\n };\n\n toggle = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n /**\n * This is only here so that we can toggle the menus in the sidebar, because the default behavior of the mobile\n * version (ie the one that uses a modal) needs propagation to close the modal after selecting something\n * We need to refactor this so that the modal is explicitly closed on toggle, but for now I am aiming to preserve the existing logic\n * so as to not break other things\n **/\n if (this.props.stopPropagationOnToggle) {\n e.preventDefault();\n e.stopPropagation();\n }\n const newState = !this.state.open;\n this.setState({open: newState}, () => {\n if (this.props.onToggle) {\n this.props.onToggle(newState);\n }\n });\n };\n\n public render() {\n const {children} = this.props;\n\n const Animation = this.props.animationComponent;\n\n return (\n <div\n id={this.props.id}\n className={'MenuWrapper ' + this.props.className + (this.state.open ? ' MenuWrapper--open' : '')}\n onClick={this.toggle}\n ref={this.node}\n disabled={this.props.isDisabled}\n >\n {children ? Object.values(children)[0] : {}}\n <Animation show={this.state.open}>\n {children ? Object.values(children)[1] : {}}\n </Animation>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {PrimitiveType, FormatXMLElementFn} from 'intl-messageformat';\nimport React from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl} from 'react-intl';\n\nimport {AlertCircleOutlineIcon} from '@mattermost/compass-icons/components';\n\nimport './base_setting_item.scss';\n\ntype ExtendedMessageDescriptor = MessageDescriptor & {\n values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>>;\n};\n\nexport type BaseSettingItemProps = {\n title?: string;\n description?: string;\n error?: ExtendedMessageDescriptor;\n dataTestId?: string;\n};\n\ntype Props = BaseSettingItemProps & {\n content: JSX.Element;\n isContentInline?: boolean;\n className?: string;\n descriptionAboveContent?: boolean;\n}\n\nfunction BaseSettingItem({title, description, content, className, error, descriptionAboveContent = false, isContentInline = false, dataTestId}: Props): JSX.Element {\n const {formatMessage} = useIntl();\n\n const titleComponent = title && (\n <h4\n data-testid='mm-modal-generic-section-item__title'\n className='mm-modal-generic-section-item__title'\n >\n {title}\n </h4>\n );\n\n const descriptionComponent = description && (\n <p\n data-testid='mm-modal-generic-section-item__description'\n className='mm-modal-generic-section-item__description'\n >\n {description}\n </p>\n );\n\n const Error = error && (\n <div\n data-testid='mm-modal-generic-section-item__error'\n className='mm-modal-generic-section-item__error'\n >\n <AlertCircleOutlineIcon/>\n {formatMessage({id: error.id, defaultMessage: error.defaultMessage}, error.values)}\n </div>\n );\n\n return (\n <div\n data-testid={dataTestId}\n className={classNames('mm-modal-generic-section-item', className)}\n >\n {titleComponent}\n {descriptionAboveContent ? descriptionComponent : undefined}\n <div\n data-testid='mm-modal-generic-section-item__content'\n className={classNames('mm-modal-generic-section-item__content', {\n inline: isContentInline,\n })}\n >\n {content}\n </div>\n {descriptionAboveContent ? undefined : descriptionComponent}\n {Error}\n </div>\n );\n}\n\nexport default BaseSettingItem;\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ReactNode} from 'react';\nimport React from 'react';\n\nimport type {BaseSettingItemProps} from './base_setting_item';\nimport BaseSettingItem from './base_setting_item';\n\nexport type FieldsetCheckbox = {\n dataTestId?: string;\n name: string;\n}\n\ntype Props = BaseSettingItemProps & {\n inputFieldData: FieldsetCheckbox;\n inputFieldValue: boolean;\n\n /**\n * The title of the checkbox input field, pass in FormattedMessage component for styling compatibility\n */\n inputFieldTitle: ReactNode;\n handleChange: (e: boolean) => void;\n className?: string;\n descriptionAboveContent?: boolean;\n}\n\nexport default function CheckboxSettingItem({\n title,\n description,\n inputFieldData,\n inputFieldValue,\n inputFieldTitle,\n handleChange,\n className,\n dataTestId,\n descriptionAboveContent = false,\n}: Props) {\n const content = (\n <fieldset\n key={inputFieldData.name}\n className='mm-modal-generic-section-item__fieldset-checkbox-ctr'\n >\n <label className='mm-modal-generic-section-item__fieldset-checkbox'>\n <input\n className='mm-modal-generic-section-item__input-checkbox'\n data-testid={inputFieldData.dataTestId}\n type='checkbox'\n name={inputFieldData.name}\n checked={inputFieldValue}\n onChange={(e) => handleChange(e.target.checked)}\n />\n {inputFieldTitle}\n </label>\n </fieldset>\n );\n\n return (\n <BaseSettingItem\n content={content}\n title={title}\n description={description}\n dataTestId={dataTestId}\n className={className}\n descriptionAboveContent={descriptionAboveContent}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\n\nimport './modal_section.scss';\n\ntype Props = {\n title?: ReactNode;\n description?: ReactNode;\n content: JSX.Element;\n titleSuffix?: JSX.Element;\n};\n\nfunction ModalSection({\n title,\n description,\n content,\n titleSuffix,\n}: Props) {\n const titleComponent = title && (\n <h4 className='modalSectionTitle'>\n {title}\n {titleSuffix}\n </h4>\n );\n\n const descriptionComponent = description && (\n <p className='modalSectionDescription'>\n {description}\n </p>\n );\n\n return (\n <section className='mm-modal-generic-section'>\n {(title || description) && (\n <div className='modalSectionHeader'>\n {titleComponent}\n {descriptionComponent}\n </div>\n )}\n <div className='modalSectionContent'>\n {content}\n </div>\n </section>\n );\n}\n\nexport default ModalSection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Popover as BSPopover} from 'react-bootstrap';\nimport type {Sizes as BSSizes} from 'react-bootstrap';\n\nconst SizeMap = {xs: 'xsmall', sm: 'small', md: 'medium', lg: 'large'};\nexport type Sizes = 'xs' | 'sm' | 'md' | 'lg';\n\ninterface Props {\n id?: string;\n children?: React.ReactNode;\n popoverStyle?: 'info';\n popoverSize?: Sizes;\n title?: React.ReactNode;\n placement?: 'bottom' | 'top' | 'right' | 'left';\n className?: string;\n style?: React.CSSProperties;\n onMouseOut?: React.MouseEventHandler<BSPopover>; // didn't find a better way to satisfy typing, so for now we have a slight 'bootstrap leakage'\n onMouseOver?: React.MouseEventHandler<BSPopover>;\n}\n\nconst Popover = React.forwardRef<BSPopover, Props>(({\n placement = 'right',\n popoverSize = 'sm',\n children,\n popoverStyle = 'info',\n title,\n id,\n onMouseOut,\n onMouseOver,\n className,\n style,\n}, ref?) => {\n return (\n <BSPopover\n id={id}\n style={style}\n className={className}\n bsStyle={popoverStyle}\n placement={placement}\n bsClass='popover'\n title={title}\n bsSize={popoverSize && SizeMap[popoverSize] as BSSizes} // map our sizes to bootstrap\n onMouseOut={onMouseOut}\n onMouseOver={onMouseOver}\n ref={ref}\n >\n {children}\n </BSPopover>\n );\n});\n\nPopover.displayName = 'Popover';\n\nexport default React.memo(Popover);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport './separator.scss';\n\ntype Props = {\n children?: ReactNode;\n};\n\nconst BasicSeparator = ({children}: Props) => {\n return (\n <div\n data-testid='basicSeparator'\n className='Separator BasicSeparator'\n >\n <hr className='separator__hr'/>\n {children && (\n <div className='separator__text'>\n {children}\n </div>\n )}\n </div>\n );\n};\n\nexport default React.memo(BasicSeparator);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChangeEvent} from 'react';\nimport React from 'react';\n\nimport Setting from './setting';\n\ntype Props = {\n id: string;\n label: React.ReactNode;\n labelClassName?: string;\n helpText?: React.ReactNode;\n placeholder: string;\n value: boolean;\n disabled?: boolean;\n inputClassName?: string;\n onChange(name: string, value: any): void; // value is any since onChange is a common func for inputs and checkboxes\n autoFocus?: boolean;\n}\n\nconst BoolSetting = ({\n id,\n label,\n labelClassName = '',\n helpText,\n placeholder,\n value,\n disabled,\n inputClassName = '',\n onChange,\n autoFocus,\n}: Props) => {\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n onChange(id, e.target.checked);\n };\n\n return (\n <Setting\n label={label}\n labelClassName={labelClassName}\n inputClassName={inputClassName}\n helpText={helpText}\n inputId={id}\n >\n <div className='checkbox'>\n <label>\n <input\n id={id}\n disabled={disabled}\n autoFocus={autoFocus}\n type='checkbox'\n checked={value}\n onChange={handleChange}\n />\n <span>{placeholder}</span>\n </label>\n </div>\n </Setting>\n );\n};\n\nexport default React.memo(BoolSetting);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n inputId?: string;\n label: React.ReactNode;\n labelClassName?: string;\n inputClassName?: string;\n children: React.ReactNode;\n helpText?: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nconst Setting: React.FC<Props> = ({\n inputId,\n label,\n labelClassName,\n inputClassName,\n children,\n footer,\n helpText,\n}: Props) => {\n return (\n <div\n data-testid={inputId}\n className='form-group'\n >\n {label && (\n <label\n data-testid={inputId + 'label'}\n className={'control-label ' + labelClassName}\n htmlFor={inputId}\n >\n {label}\n </label>\n )}\n <div className={inputClassName}>\n {children}\n <div\n data-testid={inputId + 'help-text'}\n className='help-text'\n >\n {helpText}\n </div>\n {footer}\n </div>\n </div>\n );\n};\n\nexport default Setting;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, ReactNode} from 'react';\n\nimport Setting from './setting';\n\nconst INPUT_TYPES = ['text', 'textarea', 'number', 'email', 'tel', 'url', 'password'] as const;\nexport type InputTypes = typeof INPUT_TYPES[number];\n\nexport type Props = {\n id: string;\n label: ReactNode;\n labelClassName?: string;\n placeholder?: string;\n value: string | number | string[];\n helpText?: ReactNode;\n footer?: ReactNode;\n inputClassName?: string;\n maxLength?: number;\n resizable?: boolean;\n onChange(id: string, value: any): void;\n disabled?: boolean;\n\n // This is a custom prop that is not part of the HTML input element type\n type?: InputTypes;\n autoFocus?: boolean;\n multiple?: boolean;\n}\n\nfunction TextSetting(props: Props) {\n const {labelClassName = '', inputClassName = '', maxLength = -1, resizable = true, type = 'text'} = props;\n\n function handleChange(event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) {\n if (props.type === 'number') {\n props.onChange(props.id, parseInt(event.target.value, 10));\n } else if (props.type === 'text' && props.multiple) {\n if (event.target.value === '') {\n props.onChange(props.id, []);\n } else {\n props.onChange(props.id, event.target.value.split(','));\n }\n } else {\n props.onChange(props.id, event.target.value);\n }\n }\n\n let input = null;\n if (type === 'textarea') {\n input = (\n <textarea\n id={props.id}\n data-testid={`${props.id}input`} // a lot of our e2e test rely on 'input' being in the test id if it's a text/textarea input\n className='form-control'\n autoFocus={props.autoFocus}\n dir='auto'\n rows={5}\n placeholder={props.placeholder}\n style={resizable === false ? {resize: 'none'} : undefined}\n value={props.value}\n maxLength={maxLength}\n onChange={handleChange}\n disabled={props.disabled}\n />\n );\n } else {\n const inputType = INPUT_TYPES.includes(type) ? type : 'text';\n\n // a lot of our e2e test rely on 'input' being in the test id if it's a text/textarea input\n const testId = inputType === 'text' ? `${props.id}input` : `${props.id}${inputType}`;\n\n input = (\n <input\n id={props.id}\n data-testid={testId}\n className='form-control'\n autoFocus={props.autoFocus}\n type={inputType}\n placeholder={props.placeholder}\n value={props.value}\n maxLength={maxLength}\n onChange={handleChange}\n disabled={props.disabled}\n />\n );\n }\n\n return (\n <Setting\n label={props.label}\n labelClassName={labelClassName}\n inputClassName={inputClassName}\n helpText={props.helpText}\n inputId={props.id}\n footer={props.footer}\n >\n {input}\n </Setting>\n );\n}\n\nexport default TextSetting;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport Tag from './tag';\nimport type {TagSize} from './tag';\n\ntype Props = {\n className?: string;\n size?: TagSize;\n}\n\nconst BotTag = ({className = '', size = 'xs'}: Props) => {\n const {formatMessage} = useIntl();\n return (\n <Tag\n uppercase={true}\n size={size}\n className={classNames('BotTag', className)}\n text={formatMessage({\n id: 'tag.default.bot',\n defaultMessage: 'BOT',\n })}\n />\n );\n};\n\nexport default BotTag;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport Tag from './tag';\nimport type {TagSize} from './tag';\n\ntype Props = {\n className?: string;\n size?: TagSize;\n};\n\nconst GuestTag = ({className = '', size = 'xs'}: Props) => {\n const {formatMessage} = useIntl();\n const shouldHideTag = useSelector((state: GlobalState) => getConfig(state).HideGuestTags === 'true');\n\n if (shouldHideTag) {\n return null;\n }\n\n return (\n <Tag\n className={classNames('GuestTag', className)}\n size={size}\n text={formatMessage({\n id: 'tag.default.guest',\n defaultMessage: 'GUEST',\n })}\n />\n );\n};\n\nexport default GuestTag;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo, useMemo} from 'react';\nimport type {MouseEventHandler} from 'react';\nimport styled, {css} from 'styled-components';\n\nimport glyphMap from '@mattermost/compass-icons/components';\nimport type {IconGlyphTypes} from '@mattermost/compass-icons/IconGlyphs';\n\nexport type TagVariant = 'info' | 'success' | 'warning' | 'danger' | 'dangerDim';\n\nexport type TagSize = 'xs' | 'sm' | 'md' | 'lg'\n\ntype Props = {\n text: React.ReactNode;\n uppercase?: boolean;\n icon?: IconGlyphTypes;\n variant?: TagVariant;\n size?: TagSize;\n onClick?: MouseEventHandler;\n className?: string;\n};\n\ntype TagWrapperProps = Required<Pick<Props, 'uppercase'>>;\n\nconst TagWrapper = styled.div<TagWrapperProps>`\n appearance: none;\n\n display: inline-flex;\n align-items: center;\n align-content: center;\n align-self: center;\n gap: 4px;\n max-width: 100%;\n margin: 0;\n overflow: hidden;\n\n border: none;\n border-radius: 4px;\n\n font-family: 'Open Sans', sans-serif;\n font-weight: 600;\n line-height: 16px;\n ${({uppercase}) => (\n uppercase ? css`\n letter-spacing: 0.02em;\n text-transform: uppercase;\n ` : css`\n text-transform: none;\n `\n )}\n\n &.Tag--xs {\n height: 16px;\n font-size: 10px;\n line-height: 12px;\n padding: 1px 4px;\n }\n\n &.Tag--sm {\n height: 20px;\n font-size: 12px;\n line-height: 16px;\n padding: 2px 5px;\n }\n\n &.Tag--md {\n height: 24px;\n font-size: 14px;\n line-height: 20px;\n padding: 2px 5px;\n }\n\n &.Tag--lg {\n height: 28px;\n font-size: 16px;\n line-height: 22px;\n padding: 2px 5px;\n }\n\n background: rgba(var(--semantic-color-general), 0.08);\n color: rgb(var(--semantic-color-general));\n\n &.Tag--info {\n background: rgba(var(--semantic-color-info), 1);\n color: rgb(255, 255, 255);\n }\n\n &.Tag--success {\n background: rgba(var(--semantic-color-success), 1);\n color: rgb(255, 255, 255);\n }\n\n &.Tag--warning {\n background: rgba(var(--semantic-color-warning), 1);\n color: rgb(255, 255, 255);\n }\n\n &.Tag--danger {\n background: rgba(var(--semantic-color-danger), 1);\n color: rgb(255, 255, 255);\n }\n\n &.Tag--dangerDim {\n background: rgba(var(--semantic-color-danger), 0.08);\n color: rgb(var(--semantic-color-danger));\n }\n\n ${({onClick}) => typeof onClick === 'function' && (\n css`\n &:hover,\n &:focus {\n background: rgba(var(--semantic-color-general), 0.08);\n cursor: pointer;\n }\n `\n )}\n\n`;\n\nconst TagText = styled.span`\n max-width: 100%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n`;\n\nconst Tag = ({\n variant,\n onClick,\n className,\n text,\n icon: iconName,\n size = 'xs',\n uppercase = false,\n ...rest\n}: Props) => {\n const Icon = iconName ? glyphMap[iconName] : null;\n const element = onClick ? 'button' : 'div';\n\n const iconSize = useMemo(() => {\n switch (size) {\n case 'lg':\n return 16;\n case 'md':\n return 14;\n case 'sm':\n return 12;\n case 'xs':\n default:\n return 10;\n }\n }, [size]);\n\n return (\n <TagWrapper\n {...rest}\n as={element}\n uppercase={uppercase}\n onClick={onClick}\n className={classNames('Tag', {[`Tag--${variant}`]: variant, [`Tag--${size}`]: size}, className)}\n >\n {Icon && <Icon size={iconSize}/>}\n <TagText>{text}</TagText>\n </TagWrapper>\n );\n};\n\nexport default memo(Tag);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo, forwardRef} from 'react';\nimport type {HTMLAttributes, RefObject, SyntheticEvent} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport BotDefaultIcon from 'images/bot_default_icon.png';\n\nimport './avatar.scss';\n\nexport type TAvatarSizeToken = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xl-custom-GM' | 'xl-custom-DM' | 'xxl';\n\nexport const getAvatarWidth = (size: TAvatarSizeToken) => {\n switch (size) {\n case 'xxs':\n return 16;\n case 'xs':\n return 20;\n case 'sm':\n return 24;\n case 'md':\n return 32;\n case 'lg':\n return 36;\n case 'xl':\n return 50;\n case 'xl-custom-GM':\n return 72;\n case 'xl-custom-DM':\n return 96;\n case 'xxl':\n return 128;\n }\n return 0;\n};\n\ntype Props = {\n url?: string;\n username?: string;\n size?: TAvatarSizeToken;\n text?: string;\n};\n\ntype Attrs = HTMLAttributes<HTMLElement>;\n\nconst isURLForUser = (url: string) => url.startsWith(Client4.getUsersRoute());\nconst replaceURLWithDefaultImageURL = (url: string) => url.replace(/\\?_=(\\w+)/, '/default');\n\nconst Avatar = forwardRef<HTMLElement, Props & Attrs>(({\n url,\n username,\n size = 'md',\n text,\n ...attrs\n}, ref) => {\n const {formatMessage} = useIntl();\n\n const classes = classNames(`Avatar Avatar-${size}`, attrs.className);\n\n if (text) {\n return (\n <div\n {...attrs}\n ref={ref as RefObject<HTMLDivElement>}\n className={classNames(classes, 'Avatar-plain')}\n data-content={text}\n />\n );\n }\n\n function handleOnError(e: SyntheticEvent<HTMLImageElement, Event>) {\n const fallbackSrc = (url && isURLForUser(url)) ? replaceURLWithDefaultImageURL(url) : BotDefaultIcon;\n\n if (e.currentTarget.src !== fallbackSrc) {\n e.currentTarget.src = fallbackSrc;\n }\n }\n\n return (\n <img\n {...attrs}\n ref={ref as RefObject<HTMLImageElement>}\n className={classes}\n alt={formatMessage({id: 'avatar.alt', defaultMessage: '{username} profile image'}, {\n username: username || 'user',\n })}\n src={url}\n loading='lazy'\n onError={handleOnError}\n />\n );\n});\n\nAvatar.displayName = 'Avatar';\n\nexport default memo(Avatar);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useMemo, useEffect} from 'react';\nimport type {ComponentProps, CSSProperties} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\nimport tinycolor from 'tinycolor2';\n\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getMissingProfilesByIds} from 'mattermost-redux/actions/users';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getUser as selectUser, makeDisplayNameGetter} from 'mattermost-redux/selectors/entities/users';\n\nimport ProfilePopover from 'components/profile_popover';\nimport Avatar from 'components/widgets/users/avatar';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {imageURLForUser} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport './avatars.scss';\n\ntype Props = {\n userIds: Array<UserProfile['id']>;\n totalUsers?: number;\n size?: ComponentProps<typeof Avatar>['size'];\n fetchMissingUsers?: boolean;\n};\n\nconst OTHERS_DISPLAY_LIMIT = 99;\n\nfunction countMeta<T>(\n items: T[],\n total = items.length,\n): [T[], T[], {overflowUnnamedCount: number; nonDisplayCount: number}] {\n const breakAt = Math.max(items.length, total) > 4 ? 3 : 4;\n\n const displayItems = items.slice(0, breakAt);\n const overflowItems = items.slice(breakAt);\n\n const overflowUnnamedCount = Math.max(total - displayItems.length - overflowItems.length, 0);\n const nonDisplayCount = overflowItems.length + overflowUnnamedCount;\n\n return [displayItems, overflowItems, {overflowUnnamedCount, nonDisplayCount}];\n}\n\nconst displayNameGetter = makeDisplayNameGetter();\n\nfunction UserAvatar({\n userId,\n ...props\n}: {\n userId: UserProfile['id'];\n} & ComponentProps<typeof Avatar>) {\n const user = useSelector((state: GlobalState) => selectUser(state, userId)) as UserProfile | undefined;\n const name = useSelector((state: GlobalState) => displayNameGetter(state, true)(user));\n\n const profilePictureURL = userId ? imageURLForUser(userId) : '';\n\n return (\n <ProfilePopover<HTMLButtonElement>\n triggerComponentAs='button'\n triggerComponentClass='style--none rounded-button'\n userId={userId}\n src={profilePictureURL}\n >\n <WithTooltip\n title={name}\n >\n <Avatar\n url={imageURLForUser(userId, user?.last_picture_update)}\n tabIndex={-1}\n {...props}\n />\n </WithTooltip>\n </ProfilePopover>\n );\n}\n\nfunction Avatars({\n size,\n userIds,\n totalUsers,\n fetchMissingUsers = true,\n}: Props) {\n const {formatMessage} = useIntl();\n const dispatch = useDispatch();\n const [displayUserIds, overflowUserIds, {overflowUnnamedCount, nonDisplayCount}] = countMeta(userIds, totalUsers);\n const overflowNames = useSelector((state: GlobalState) => {\n return overflowUserIds.map((userId) => displayNameGetter(state, true)(selectUser(state, userId))).join(', ');\n });\n\n const {centerChannelBg, centerChannelColor} = useSelector(getTheme);\n const avatarStyle: CSSProperties = useMemo(() => ({\n background: tinycolor.mix(centerChannelBg, centerChannelColor, 8).toRgbString(),\n }), [centerChannelBg, centerChannelColor]);\n\n useEffect(() => {\n if (fetchMissingUsers) {\n dispatch(getMissingProfilesByIds(userIds));\n }\n }, [fetchMissingUsers, userIds]);\n\n let overflowUsersTooltip = '';\n if (nonDisplayCount) {\n if (overflowUserIds.length) {\n overflowUsersTooltip = formatMessage(\n {\n id: 'avatars.overflowUsers',\n defaultMessage: '{overflowUnnamedCount, plural, =0 {{names}} =1 {{names} and one other} other {{names} and # others}}',\n },\n {\n overflowUnnamedCount,\n names: overflowNames,\n },\n );\n } else {\n overflowUsersTooltip = formatMessage(\n {\n id: 'avatars.overflowUnnamedOnly',\n defaultMessage: '{overflowUnnamedCount, plural, =1 {one other} other {# others}}',\n },\n {overflowUnnamedCount},\n );\n }\n }\n\n return (\n <div\n className={`Avatars Avatars___${size}`}\n >\n {displayUserIds.map((id) => (\n <UserAvatar\n style={avatarStyle}\n key={id}\n userId={id}\n size={size}\n />\n ))}\n {Boolean(nonDisplayCount) && (\n <WithTooltip\n title={overflowUsersTooltip}\n >\n <Avatar\n style={avatarStyle}\n size={size}\n tabIndex={0}\n text={nonDisplayCount > OTHERS_DISPLAY_LIMIT ? `${OTHERS_DISPLAY_LIMIT}+` : `+${nonDisplayCount}`}\n />\n </WithTooltip>\n )}\n </div>\n );\n}\n\nexport default memo(Avatars);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport type {ReactNode} from 'react';\nimport React, {memo} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl} from 'react-intl';\n\nimport RenderEmoji from 'components/emoji/render_emoji';\n\nimport {isMessageDescriptor} from 'utils/i18n';\n\nimport TooltipShortcut from './tooltip_shortcut';\nimport {type ShortcutDefinition} from './tooltip_shortcut';\n\nconst TOOLTIP_EMOTICON_SIZE = 16;\nconst TOOLTIP_EMOTICON_LARGE_SIZE = 48;\n\ninterface Props {\n title: string | ReactNode | MessageDescriptor;\n emoji?: string;\n isEmojiLarge?: boolean;\n hint?: string | ReactNode | MessageDescriptor;\n shortcut?: ShortcutDefinition;\n}\n\nfunction TooltipContent(props: Props) {\n const {formatMessage} = useIntl();\n\n let title = props.title;\n if (isMessageDescriptor(title)) {\n title = formatMessage(title);\n }\n\n let hint = props.hint;\n if (isMessageDescriptor(hint)) {\n hint = formatMessage(hint);\n }\n\n return (\n <div className='tooltipContent'>\n <span\n className={classNames('tooltipContentTitleContainer', {\n isEmojiLarge: props.isEmojiLarge,\n })}\n >\n {props.emoji && (\n <span className='tooltipContentEmoji'>\n <RenderEmoji\n emojiName={props.emoji}\n size={props.isEmojiLarge ? TOOLTIP_EMOTICON_LARGE_SIZE : TOOLTIP_EMOTICON_SIZE}\n />\n </span>\n )}\n <span className='tooltipContentTitle'>{title}</span>\n </span>\n {props.hint && (\n <span className='tooltipContentHint'>{hint}</span>\n )}\n {props.shortcut && (\n <span className='tooltipContentShortcut'>\n <TooltipShortcut shortcut={props.shortcut}/>\n </span>\n )}\n </div>\n );\n}\n\nexport default memo(TooltipContent);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Placement} from '@floating-ui/react';\nimport {\n useFloating,\n autoUpdate,\n offset,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n arrow,\n FloatingPortal,\n useTransitionStyles,\n FloatingArrow,\n flip,\n useMergeRefs,\n} from '@floating-ui/react';\nimport classNames from 'classnames';\nimport React, {useRef, useState, useMemo, cloneElement, isValidElement} from 'react';\nimport type {ReactElement, ReactNode} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {defineMessage} from 'react-intl';\n\nimport {OverlayArrow, OverlaysTimings, OverlayTransitionStyles, RootHtmlPortalId} from 'utils/constants';\n\nimport TooltipContent from './tooltip_content';\nimport type {ShortcutDefinition} from './tooltip_shortcut';\n\nimport './with_tooltip.scss';\n\n/**\n * Shortcut keys map to translations that can be used in the tooltip\n * when shortcut definition is provided\n */\nexport const ShortcutKeys = {\n alt: defineMessage({\n id: 'shortcuts.generic.alt',\n defaultMessage: 'Alt',\n }),\n cmd: '⌘',\n ctrl: defineMessage({\n id: 'shortcuts.generic.ctrl',\n defaultMessage: 'Ctrl',\n }),\n option: '⌥',\n shift: defineMessage({\n id: 'shortcuts.generic.shift',\n defaultMessage: 'Shift',\n }),\n};\n\ninterface Props {\n title: string | ReactNode | MessageDescriptor;\n emoji?: string;\n isEmojiLarge?: boolean;\n hint?: string | ReactNode | MessageDescriptor;\n shortcut?: ShortcutDefinition;\n\n /**\n * Whether the tooltip should be vertical or horizontal, by default it is vertical\n * This doesn't always guarantee the tooltip will be vertical, it just determines the initial placement and fallback placements\n */\n isVertical?: boolean;\n\n /**\n * If closing of the tooltip should be delayed,\n * Useful if tooltips contains links that need to be clicked\n */\n delayClose?: boolean;\n\n /**\n * Additional class name to be added to the tooltip container\n */\n className?: string;\n disabled?: boolean;\n\n /**\n * @deprecated Do not use this except for special cases\n * Callback when the tooltip appears\n */\n onOpen?: () => void;\n children: ReactElement;\n}\n\nexport default function WithTooltip({\n children,\n title,\n emoji,\n isEmojiLarge = false,\n hint,\n shortcut,\n isVertical = true,\n delayClose = false,\n className,\n onOpen,\n disabled,\n}: Props) {\n const [open, setOpen] = useState(false);\n\n const arrowRef = useRef(null);\n\n function handleChange(open: boolean) {\n setOpen(open);\n\n if (onOpen && open) {\n onOpen();\n }\n }\n\n const placements = useMemo<{initial: Placement; fallback: Placement[]}>(() => {\n let initial: Placement;\n let fallback: Placement[];\n if (isVertical) {\n initial = 'top';\n fallback = ['bottom', 'right', 'left'];\n } else {\n initial = 'right';\n fallback = ['left', 'top', 'bottom'];\n }\n return {initial, fallback};\n }, [isVertical]);\n\n const {refs: {setReference, setFloating}, floatingStyles, context: floatingContext} = useFloating({\n open: disabled ? false : open,\n onOpenChange: handleChange,\n whileElementsMounted: autoUpdate,\n placement: placements.initial,\n middleware: [\n offset(OverlayArrow.OFFSET),\n flip({\n fallbackPlacements: placements.fallback,\n }),\n arrow({\n element: arrowRef,\n }),\n ],\n });\n\n const {isMounted, styles: transitionStyles} = useTransitionStyles(floatingContext, TRANSITION_STYLE_PROPS);\n\n const hover = useHover(floatingContext, {\n restMs: OverlaysTimings.CURSOR_REST_TIME_BEFORE_OPEN,\n delay: {\n open: OverlaysTimings.CURSOR_MOUSEOVER_TO_OPEN,\n close: delayClose ? OverlaysTimings.CURSOR_MOUSEOUT_TO_CLOSE_WITH_DELAY : OverlaysTimings.CURSOR_MOUSEOUT_TO_CLOSE,\n },\n });\n const focus = useFocus(floatingContext);\n const dismiss = useDismiss(floatingContext);\n const role = useRole(floatingContext, {role: 'tooltip'});\n\n const {getReferenceProps, getFloatingProps} = useInteractions([hover, focus, dismiss, role]);\n\n if (!isValidElement(children)) {\n // eslint-disable-next-line no-console\n console.error('Children must be a valid React element for WithTooltip');\n }\n\n const mergedRefs = useMergeRefs([setReference, (children as any)?.ref]);\n\n const trigger = cloneElement(\n children,\n getReferenceProps({\n ref: mergedRefs,\n ...children.props,\n }),\n );\n\n return (\n <>\n {trigger}\n\n {isMounted && (\n <FloatingPortal id={RootHtmlPortalId}>\n <div\n ref={setFloating}\n className={classNames('tooltipContainer', className)}\n style={{...floatingStyles, ...transitionStyles}}\n {...getFloatingProps()}\n >\n <TooltipContent\n title={title}\n emoji={emoji}\n isEmojiLarge={isEmojiLarge}\n hint={hint}\n shortcut={shortcut}\n />\n <FloatingArrow\n ref={arrowRef}\n context={floatingContext}\n width={OverlayArrow.WIDTH}\n height={OverlayArrow.HEIGHT}\n />\n </div>\n </FloatingPortal>\n )}\n </>\n );\n}\n\nconst TRANSITION_STYLE_PROPS = {\n duration: {\n open: OverlaysTimings.FADE_IN_DURATION,\n close: OverlaysTimings.FADE_OUT_DURATION,\n },\n initial: OverlayTransitionStyles.START,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {defineMessage, FormattedMessage} from 'react-intl';\n\nimport {ShortcutKey, ShortcutKeyVariant} from 'components/shortcut_key';\n\nimport {isMessageDescriptor} from 'utils/i18n';\nimport {isMac} from 'utils/user_agent';\n\nexport const ShortcutKeys = {\n alt: defineMessage({\n id: 'shortcuts.generic.alt',\n defaultMessage: 'Alt',\n }),\n cmd: '⌘',\n ctrl: defineMessage({\n id: 'shortcuts.generic.ctrl',\n defaultMessage: 'Ctrl',\n }),\n option: '⌥',\n shift: defineMessage({\n id: 'shortcuts.generic.shift',\n defaultMessage: 'Shift',\n }),\n};\n\ntype ShortcutKeyDescriptor = string | MessageDescriptor;\n\nexport type ShortcutDefinition = {\n default: ShortcutKeyDescriptor[];\n mac?: ShortcutKeyDescriptor[];\n}\n\ntype Props = {\n shortcut: ShortcutDefinition;\n}\n\nfunction TooltipShortcut(props: Props) {\n let shortcut = props.shortcut.default;\n if (props.shortcut.mac && isMac()) {\n shortcut = props.shortcut.mac;\n }\n\n return (\n <>\n {shortcut.map((shortcutKey) => {\n let key;\n let content;\n if (isMessageDescriptor(shortcutKey)) {\n key = shortcutKey.id;\n content = <FormattedMessage {...shortcutKey}/>;\n } else {\n key = shortcutKey;\n content = shortcutKey;\n }\n\n return (\n <ShortcutKey\n key={key}\n variant={ShortcutKeyVariant.Tooltip}\n >\n {content}\n </ShortcutKey>\n );\n })}\n </>\n );\n}\n\nexport default memo(TooltipShortcut);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {LogFilter} from '@mattermost/types/admin';\nimport type {\n Channel,\n ChannelSearchOpts,\n} from '@mattermost/types/channels';\nimport type {Compliance} from '@mattermost/types/compliance';\nimport type {AdminConfig, AllowedIPRange} from '@mattermost/types/config';\nimport type {\n CreateDataRetentionCustomPolicy,\n DataRetentionCustomPolicies,\n GetDataRetentionCustomPoliciesRequest,\n PatchDataRetentionCustomPolicy,\n} from '@mattermost/types/data_retention';\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {GroupSearchOpts} from '@mattermost/types/groups';\nimport type {CompleteOnboardingRequest} from '@mattermost/types/setup';\nimport type {\n Team,\n TeamSearchOpts,\n} from '@mattermost/types/teams';\nimport type {DeepPartial} from '@mattermost/types/utilities';\n\nimport {AdminTypes} from 'mattermost-redux/action_types';\nimport {getServerLimits} from 'mattermost-redux/actions/limits';\nimport {Client4} from 'mattermost-redux/client';\nimport type {ActionFuncAsync} from 'mattermost-redux/types/actions';\n\nimport {logError} from './errors';\nimport {bindClientFunc, forceLogoutIfNecessary} from './helpers';\n\nimport {General} from '../constants';\n\nexport function getLogs({serverNames = [], logLevels = [], dateFrom, dateTo}: LogFilter) {\n const logFilter = {\n server_names: serverNames,\n log_levels: logLevels,\n date_from: dateFrom,\n date_to: dateTo,\n };\n return bindClientFunc({\n clientFunc: Client4.getLogs,\n onSuccess: [AdminTypes.RECEIVED_LOGS],\n params: [\n logFilter,\n ],\n });\n}\n\nexport function getPlainLogs(page = 0, perPage: number = General.LOGS_PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getPlainLogs,\n onSuccess: [AdminTypes.RECEIVED_PLAIN_LOGS],\n params: [\n page,\n perPage,\n ],\n });\n}\n\nexport function getAudits(page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getAudits,\n onSuccess: [AdminTypes.RECEIVED_AUDITS],\n params: [\n page,\n perPage,\n ],\n });\n}\n\nexport function getConfig() {\n return bindClientFunc({\n clientFunc: Client4.getConfig,\n onSuccess: [AdminTypes.RECEIVED_CONFIG],\n });\n}\n\nexport function patchConfig(config: DeepPartial<AdminConfig>) {\n return bindClientFunc({\n clientFunc: Client4.patchConfig,\n onSuccess: [AdminTypes.RECEIVED_CONFIG],\n params: [\n config,\n ],\n });\n}\n\nexport function reloadConfig() {\n return bindClientFunc({\n clientFunc: Client4.reloadConfig,\n });\n}\n\nexport function getEnvironmentConfig() {\n return bindClientFunc({\n clientFunc: Client4.getEnvironmentConfig,\n onSuccess: [AdminTypes.RECEIVED_ENVIRONMENT_CONFIG],\n });\n}\n\nexport function testEmail(config?: AdminConfig) {\n return bindClientFunc({\n clientFunc: Client4.testEmail,\n params: [\n config,\n ],\n });\n}\n\nexport function testSiteURL(siteURL: string) {\n return bindClientFunc({\n clientFunc: Client4.testSiteURL,\n params: [\n siteURL,\n ],\n });\n}\n\nexport function testS3Connection(config?: AdminConfig) {\n return bindClientFunc({\n clientFunc: Client4.testS3Connection,\n params: [\n config,\n ],\n });\n}\n\nexport function invalidateCaches() {\n return bindClientFunc({\n clientFunc: Client4.invalidateCaches,\n });\n}\n\nexport function recycleDatabase() {\n return bindClientFunc({\n clientFunc: Client4.recycleDatabase,\n });\n}\n\nexport function createComplianceReport(job: Partial<Compliance>) {\n return bindClientFunc({\n clientFunc: Client4.createComplianceReport,\n onRequest: AdminTypes.CREATE_COMPLIANCE_REQUEST,\n onSuccess: [AdminTypes.RECEIVED_COMPLIANCE_REPORT, AdminTypes.CREATE_COMPLIANCE_SUCCESS],\n onFailure: AdminTypes.CREATE_COMPLIANCE_FAILURE,\n params: [\n job,\n ],\n });\n}\n\nexport function getComplianceReport(reportId: string) {\n return bindClientFunc({\n clientFunc: Client4.getComplianceReport,\n onSuccess: [AdminTypes.RECEIVED_COMPLIANCE_REPORT],\n params: [\n reportId,\n ],\n });\n}\n\nexport function getComplianceReports(page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getComplianceReports,\n onSuccess: [AdminTypes.RECEIVED_COMPLIANCE_REPORTS],\n params: [\n page,\n perPage,\n ],\n });\n}\n\nexport function uploadBrandImage(imageData: File) {\n return bindClientFunc({\n clientFunc: Client4.uploadBrandImage,\n params: [\n imageData,\n ],\n });\n}\n\nexport function deleteBrandImage() {\n return bindClientFunc({\n clientFunc: Client4.deleteBrandImage,\n });\n}\n\nexport function getClusterStatus() {\n return bindClientFunc({\n clientFunc: Client4.getClusterStatus,\n onSuccess: [AdminTypes.RECEIVED_CLUSTER_STATUS],\n });\n}\n\nexport function testLdap() {\n return bindClientFunc({\n clientFunc: Client4.testLdap,\n });\n}\n\nexport function syncLdap() {\n return bindClientFunc({\n clientFunc: Client4.syncLdap,\n });\n}\n\nexport function getLdapGroups(page = 0, perPage: number = General.PAGE_SIZE_MAXIMUM, opts: GroupSearchOpts = {q: ''}) {\n return bindClientFunc({\n clientFunc: Client4.getLdapGroups,\n onSuccess: [AdminTypes.RECEIVED_LDAP_GROUPS],\n params: [\n page,\n perPage,\n opts,\n ],\n });\n}\n\nexport function linkLdapGroup(key: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.linkLdapGroup(key);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch({type: AdminTypes.LINK_LDAP_GROUP_FAILURE, error, data: key});\n dispatch(logError(error as ServerError));\n return {error};\n }\n\n dispatch({\n type: AdminTypes.LINKED_LDAP_GROUP,\n data: {\n primary_key: key,\n name: data.display_name,\n mattermost_group_id: data.id,\n has_syncables: false,\n },\n });\n\n return {data: true};\n };\n}\n\nexport function unlinkLdapGroup(key: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.unlinkLdapGroup(key);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch({type: AdminTypes.UNLINK_LDAP_GROUP_FAILURE, error, data: key});\n dispatch(logError(error as ServerError));\n return {error};\n }\n\n dispatch({\n type: AdminTypes.UNLINKED_LDAP_GROUP,\n data: key,\n });\n\n return {data: true};\n };\n}\n\nexport function getSamlCertificateStatus() {\n return bindClientFunc({\n clientFunc: Client4.getSamlCertificateStatus,\n onSuccess: [AdminTypes.RECEIVED_SAML_CERT_STATUS],\n });\n}\n\nexport function uploadPublicSamlCertificate(fileData: File) {\n return bindClientFunc({\n clientFunc: Client4.uploadPublicSamlCertificate,\n params: [\n fileData,\n ],\n });\n}\n\nexport function uploadPrivateSamlCertificate(fileData: File) {\n return bindClientFunc({\n clientFunc: Client4.uploadPrivateSamlCertificate,\n params: [\n fileData,\n ],\n });\n}\n\nexport function uploadPublicLdapCertificate(fileData: File) {\n return bindClientFunc({\n clientFunc: Client4.uploadPublicLdapCertificate,\n params: [\n fileData,\n ],\n });\n}\n\nexport function uploadPrivateLdapCertificate(fileData: File) {\n return bindClientFunc({\n clientFunc: Client4.uploadPrivateLdapCertificate,\n params: [\n fileData,\n ],\n });\n}\n\nexport function uploadIdpSamlCertificate(fileData: File) {\n return bindClientFunc({\n clientFunc: Client4.uploadIdpSamlCertificate,\n params: [\n fileData,\n ],\n });\n}\n\nexport function removePublicSamlCertificate() {\n return bindClientFunc({\n clientFunc: Client4.deletePublicSamlCertificate,\n });\n}\n\nexport function removePrivateSamlCertificate() {\n return bindClientFunc({\n clientFunc: Client4.deletePrivateSamlCertificate,\n });\n}\n\nexport function removePublicLdapCertificate() {\n return bindClientFunc({\n clientFunc: Client4.deletePublicLdapCertificate,\n });\n}\n\nexport function removePrivateLdapCertificate() {\n return bindClientFunc({\n clientFunc: Client4.deletePrivateLdapCertificate,\n });\n}\n\nexport function removeIdpSamlCertificate() {\n return bindClientFunc({\n clientFunc: Client4.deleteIdpSamlCertificate,\n });\n}\n\nexport function testElasticsearch(config?: AdminConfig) {\n return bindClientFunc({\n clientFunc: Client4.testElasticsearch,\n params: [\n config,\n ],\n });\n}\n\nexport function purgeElasticsearchIndexes(indexes?: string[]) {\n return bindClientFunc({\n clientFunc: Client4.purgeElasticsearchIndexes,\n params: [\n indexes,\n ],\n });\n}\n\nexport function uploadLicense(fileData: File) {\n return bindClientFunc({\n clientFunc: Client4.uploadLicense,\n params: [\n fileData,\n ],\n });\n}\n\nexport function removeLicense(): ActionFuncAsync<boolean> {\n return async (dispatch, getState) => {\n try {\n await Client4.removeLicense();\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(logError(error as ServerError));\n return {error: error as ServerError};\n }\n\n await dispatch(getServerLimits());\n\n return {data: true};\n };\n}\n\nexport function getPrevTrialLicense(): ActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getPrevTrialLicense();\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n return {error};\n }\n\n dispatch({type: AdminTypes.PREV_TRIAL_LICENSE_SUCCESS, data});\n return {data};\n };\n}\n\nexport function getAnalytics(name: string, teamId = ''): ActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getAnalytics(name, teamId);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(logError(error as ServerError));\n return {error};\n }\n\n if (teamId === '') {\n dispatch({type: AdminTypes.RECEIVED_SYSTEM_ANALYTICS, data, name});\n } else {\n dispatch({type: AdminTypes.RECEIVED_TEAM_ANALYTICS, data, name, teamId});\n }\n\n return {data};\n };\n}\n\nexport function getStandardAnalytics(teamId = '') {\n return getAnalytics('standard', teamId);\n}\n\nexport function getAdvancedAnalytics(teamId = '') {\n return getAnalytics('extra_counts', teamId);\n}\n\nexport function getPostsPerDayAnalytics(teamId = '') {\n return getAnalytics('post_counts_day', teamId);\n}\n\nexport function getBotPostsPerDayAnalytics(teamId = '') {\n return getAnalytics('bot_post_counts_day', teamId);\n}\n\nexport function getUsersPerDayAnalytics(teamId = '') {\n return getAnalytics('user_counts_with_posts_day', teamId);\n}\n\nexport function uploadPlugin(fileData: File, force = false): ActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.uploadPlugin(fileData, force);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(logError(error as ServerError));\n return {error};\n }\n\n return {data};\n };\n}\n\nexport function installPluginFromUrl(url: string, force = false): ActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.installPluginFromUrl(url, force);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(logError(error as ServerError));\n return {error};\n }\n\n return {data};\n };\n}\n\nexport function getPlugins() {\n return bindClientFunc({\n clientFunc: Client4.getPlugins,\n onSuccess: [AdminTypes.RECEIVED_PLUGINS],\n });\n}\n\nexport function getPluginStatuses() {\n return bindClientFunc({\n clientFunc: Client4.getPluginStatuses,\n onSuccess: [AdminTypes.RECEIVED_PLUGIN_STATUSES],\n });\n}\n\nexport function removePlugin(pluginId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.removePlugin(pluginId);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(logError(error as ServerError));\n return {error};\n }\n\n dispatch(batchActions([\n {type: AdminTypes.REMOVED_PLUGIN, data: pluginId},\n {type: AdminTypes.DISABLED_PLUGIN, data: pluginId},\n ]));\n\n return {data: true};\n };\n}\n\nexport function enablePlugin(pluginId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.enablePlugin(pluginId);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(logError(error as ServerError));\n return {error};\n }\n\n dispatch({type: AdminTypes.ENABLED_PLUGIN, data: pluginId});\n\n return {data: true};\n };\n}\n\nexport function disablePlugin(pluginId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: AdminTypes.DISABLE_PLUGIN_REQUEST, data: pluginId});\n\n try {\n await Client4.disablePlugin(pluginId);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(logError(error as ServerError));\n return {error};\n }\n\n dispatch({type: AdminTypes.DISABLED_PLUGIN, data: pluginId});\n\n return {data: true};\n };\n}\n\nexport function getSamlMetadataFromIdp(samlMetadataURL: string) {\n return bindClientFunc({\n clientFunc: Client4.getSamlMetadataFromIdp,\n onSuccess: AdminTypes.RECEIVED_SAML_METADATA_RESPONSE,\n params: [\n samlMetadataURL,\n ],\n });\n}\n\nexport function setSamlIdpCertificateFromMetadata(certData: string) {\n return bindClientFunc({\n clientFunc: Client4.setSamlIdpCertificateFromMetadata,\n params: [\n certData,\n ],\n });\n}\n\nexport function getDataRetentionCustomPolicies(page = 0, perPage = 10): ActionFuncAsync<GetDataRetentionCustomPoliciesRequest> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getDataRetentionCustomPolicies(page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(\n {\n type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICIES,\n error,\n },\n );\n return {error};\n }\n\n dispatch(\n {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICIES, data},\n );\n\n return {data};\n };\n}\n\nexport function getDataRetentionCustomPolicy(id: string): ActionFuncAsync<DataRetentionCustomPolicies> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getDataRetentionCustomPolicy(id);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(\n {\n type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY,\n error,\n },\n );\n return {error};\n }\n\n dispatch(\n {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY, data},\n );\n\n return {data};\n };\n}\n\nexport function deleteDataRetentionCustomPolicy(id: string): ActionFuncAsync<{id: string}> {\n return async (dispatch, getState) => {\n try {\n await Client4.deleteDataRetentionCustomPolicy(id);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(\n {\n type: AdminTypes.DELETE_DATA_RETENTION_CUSTOM_POLICY_FAILURE,\n error,\n },\n );\n return {error};\n }\n const data = {\n id,\n };\n dispatch(\n {type: AdminTypes.DELETE_DATA_RETENTION_CUSTOM_POLICY_SUCCESS, data},\n );\n\n return {data};\n };\n}\n\nexport function getDataRetentionCustomPolicyTeams(id: string, page = 0, perPage: number = General.TEAMS_CHUNK_SIZE): ActionFuncAsync<Team[]> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getDataRetentionCustomPolicyTeams(id, page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(\n {\n type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS,\n error,\n },\n );\n return {error};\n }\n\n dispatch(\n {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS, data},\n );\n\n return {data};\n };\n}\n\nexport function getDataRetentionCustomPolicyChannels(id: string, page = 0, perPage: number = General.TEAMS_CHUNK_SIZE): ActionFuncAsync<{channels: Channel[]; total_count: number}> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getDataRetentionCustomPolicyChannels(id, page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(\n {\n type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS,\n error,\n },\n );\n return {error};\n }\n\n dispatch(\n {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS, data},\n );\n\n return {data};\n };\n}\n\nexport function searchDataRetentionCustomPolicyTeams(id: string, term: string, opts: TeamSearchOpts): ActionFuncAsync<DataRetentionCustomPolicies> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.searchDataRetentionCustomPolicyTeams(id, term, opts);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(\n {\n type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SEARCH,\n error,\n },\n );\n return {error};\n }\n\n dispatch(\n {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SEARCH, data},\n );\n\n return {data};\n };\n}\n\nexport function searchDataRetentionCustomPolicyChannels(id: string, term: string, opts: ChannelSearchOpts): ActionFuncAsync<DataRetentionCustomPolicies> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.searchDataRetentionCustomPolicyChannels(id, term, opts);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(\n {\n type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SEARCH,\n error,\n },\n );\n return {error};\n }\n\n dispatch(\n {type: AdminTypes.RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SEARCH, data},\n );\n\n return {data};\n };\n}\n\nexport function createDataRetentionCustomPolicy(policy: CreateDataRetentionCustomPolicy): ActionFuncAsync<DataRetentionCustomPolicies> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.createDataRetentionPolicy(policy);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n return {error};\n }\n\n dispatch(\n {type: AdminTypes.CREATE_DATA_RETENTION_CUSTOM_POLICY_SUCCESS, data},\n );\n\n return {data};\n };\n}\n\nexport function updateDataRetentionCustomPolicy(id: string, policy: PatchDataRetentionCustomPolicy): ActionFuncAsync<DataRetentionCustomPolicies> {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.updateDataRetentionPolicy(id, policy);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n return {error};\n }\n\n dispatch(\n {type: AdminTypes.UPDATE_DATA_RETENTION_CUSTOM_POLICY_SUCCESS, data},\n );\n\n return {data};\n };\n}\n\nexport function addDataRetentionCustomPolicyTeams(id: string, teams: string[]) {\n return bindClientFunc({\n clientFunc: Client4.addDataRetentionPolicyTeams,\n onSuccess: AdminTypes.ADD_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SUCCESS,\n params: [\n id,\n teams,\n ],\n });\n}\n\nexport function removeDataRetentionCustomPolicyTeams(id: string, teams: string[]): ActionFuncAsync<{teams: string[]}> {\n return async (dispatch, getState) => {\n try {\n await Client4.removeDataRetentionPolicyTeams(id, teams);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(\n {\n type: AdminTypes.REMOVE_DATA_RETENTION_CUSTOM_POLICY_TEAMS_FAILURE,\n error,\n },\n );\n return {error};\n }\n const data = {\n teams,\n };\n dispatch(\n {type: AdminTypes.REMOVE_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SUCCESS, data},\n );\n\n return {data};\n };\n}\n\nexport function addDataRetentionCustomPolicyChannels(id: string, channels: string[]) {\n return bindClientFunc({\n clientFunc: Client4.addDataRetentionPolicyChannels,\n onSuccess: AdminTypes.ADD_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SUCCESS,\n params: [\n id,\n channels,\n ],\n });\n}\n\nexport function removeDataRetentionCustomPolicyChannels(id: string, channels: string[]): ActionFuncAsync<{channels: string[]}> {\n return async (dispatch, getState) => {\n try {\n await Client4.removeDataRetentionPolicyChannels(id, channels);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(\n {\n type: AdminTypes.REMOVE_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_FAILURE,\n error,\n },\n );\n return {error};\n }\n const data = {\n channels,\n };\n dispatch(\n {type: AdminTypes.REMOVE_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SUCCESS, data},\n );\n\n return {data};\n };\n}\n\nexport function completeSetup(completeSetup: CompleteOnboardingRequest) {\n return bindClientFunc({\n clientFunc: Client4.completeSetup,\n params: [completeSetup],\n });\n}\n\nexport function getAppliedSchemaMigrations() {\n return bindClientFunc({\n clientFunc: Client4.getAppliedSchemaMigrations,\n });\n}\n\nexport function getIPFilters() {\n return bindClientFunc({\n clientFunc: Client4.getIPFilters,\n params: [],\n });\n}\n\nexport function getCurrentIP() {\n return bindClientFunc({\n clientFunc: Client4.getCurrentIP,\n params: [],\n });\n}\n\nexport function applyIPFilters(ipFilters: AllowedIPRange[]) {\n return bindClientFunc({\n clientFunc: Client4.applyIPFilters,\n params: [ipFilters],\n });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AppBinding} from '@mattermost/types/apps';\n\nimport {AppsTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport {getChannel, getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport type {ActionFuncAsync} from 'mattermost-redux/types/actions';\n\nimport {bindClientFunc} from './helpers';\n\nexport function fetchAppBindings(channelID: string): ActionFuncAsync<true | AppBinding[]> {\n return async (dispatch, getState) => {\n if (!channelID) {\n return {data: true};\n }\n\n const state = getState();\n const channel = getChannel(state, channelID);\n const teamID = channel?.team_id || getCurrentTeamId(state);\n\n return dispatch(bindClientFunc({\n clientFunc: () => Client4.getAppsBindings(channelID, teamID),\n onSuccess: AppsTypes.RECEIVED_APP_BINDINGS,\n onFailure: AppsTypes.FAILED_TO_FETCH_APP_BINDINGS,\n }));\n };\n}\n\nexport function fetchRHSAppsBindings(channelID: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n\n const currentChannelID = getCurrentChannelId(state);\n const channel = getChannel(state, channelID);\n const teamID = channel?.team_id || getCurrentTeamId(state);\n\n if (channelID === currentChannelID) {\n const bindings = JSON.parse(JSON.stringify(state.entities.apps.main.bindings));\n return dispatch({\n data: bindings,\n type: AppsTypes.RECEIVED_APP_RHS_BINDINGS,\n });\n }\n\n return dispatch(bindClientFunc({\n clientFunc: () => Client4.getAppsBindings(channelID, teamID),\n onSuccess: AppsTypes.RECEIVED_APP_RHS_BINDINGS,\n onFailure: AppsTypes.FAILED_TO_FETCH_APP_BINDINGS,\n }));\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Address, CloudCustomerPatch} from '@mattermost/types/cloud';\n\nimport {CloudTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {bindClientFunc} from './helpers';\n\nexport function getCloudSubscription() {\n return bindClientFunc({\n clientFunc: Client4.getSubscription,\n onSuccess: [CloudTypes.RECEIVED_CLOUD_SUBSCRIPTION],\n onFailure: CloudTypes.CLOUD_SUBSCRIPTION_FAILED,\n onRequest: CloudTypes.CLOUD_SUBSCRIPTION_REQUEST,\n });\n}\n\nexport function getCloudProducts(includeLegacyProducts?: boolean) {\n return bindClientFunc({\n clientFunc: Client4.getCloudProducts,\n onSuccess: [CloudTypes.RECEIVED_CLOUD_PRODUCTS],\n onFailure: CloudTypes.CLOUD_PRODUCTS_FAILED,\n onRequest: CloudTypes.CLOUD_PRODUCTS_REQUEST,\n params: [includeLegacyProducts],\n });\n}\n\nexport function getCloudCustomer() {\n return bindClientFunc({\n clientFunc: Client4.getCloudCustomer,\n onSuccess: [CloudTypes.RECEIVED_CLOUD_CUSTOMER],\n onFailure: CloudTypes.CLOUD_CUSTOMER_FAILED,\n onRequest: CloudTypes.CLOUD_CUSTOMER_REQUEST,\n });\n}\n\nexport function getInvoices() {\n return bindClientFunc({\n clientFunc: Client4.getInvoices,\n onSuccess: [CloudTypes.RECEIVED_CLOUD_INVOICES],\n onFailure: CloudTypes.CLOUD_INVOICES_FAILED,\n onRequest: CloudTypes.CLOUD_INVOICES_REQUEST,\n });\n}\n\nexport function updateCloudCustomer(customerPatch: CloudCustomerPatch) {\n return bindClientFunc({\n clientFunc: Client4.updateCloudCustomer,\n onSuccess: [CloudTypes.RECEIVED_CLOUD_CUSTOMER],\n params: [customerPatch],\n });\n}\n\nexport function updateCloudCustomerAddress(address: Address) {\n return bindClientFunc({\n clientFunc: Client4.updateCloudCustomerAddress,\n onSuccess: [CloudTypes.RECEIVED_CLOUD_CUSTOMER],\n params: [address],\n });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AnyAction} from 'redux';\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {Command, CommandArgs, DialogSubmission, IncomingWebhook, IncomingWebhooksWithCount, OAuthApp, OutgoingOAuthConnection, OutgoingWebhook, SubmitDialogResponse} from '@mattermost/types/integrations';\n\nimport {IntegrationTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport type {ActionFuncAsync} from 'mattermost-redux/types/actions';\n\nimport {logError} from './errors';\nimport {bindClientFunc, forceLogoutIfNecessary} from './helpers';\n\nimport {General} from '../constants';\n\nexport function createIncomingHook(hook: IncomingWebhook) {\n return bindClientFunc({\n clientFunc: Client4.createIncomingWebhook,\n onSuccess: [IntegrationTypes.RECEIVED_INCOMING_HOOK],\n params: [\n hook,\n ],\n });\n}\n\nexport function getIncomingHook(hookId: string) {\n return bindClientFunc({\n clientFunc: Client4.getIncomingWebhook,\n onSuccess: [IntegrationTypes.RECEIVED_INCOMING_HOOK],\n params: [\n hookId,\n ],\n });\n}\n\nexport function getIncomingHooks(teamId = '', page = 0, perPage: number = General.PAGE_SIZE_DEFAULT, includeTotalCount = false): ActionFuncAsync<IncomingWebhook[] | IncomingWebhooksWithCount> {\n return async (dispatch, getState) => {\n let data;\n\n try {\n data = await Client4.getIncomingWebhooks(teamId, page, perPage, includeTotalCount);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const isWebhooksWithCount = isIncomingWebhooksWithCount(data);\n\n const actions: AnyAction[] = [{\n type: IntegrationTypes.RECEIVED_INCOMING_HOOKS,\n data: isWebhooksWithCount ? (data as IncomingWebhooksWithCount).incoming_webhooks : data,\n }];\n\n if (isWebhooksWithCount) {\n actions.push({\n type: IntegrationTypes.RECEIVED_INCOMING_HOOKS_TOTAL_COUNT,\n data: (data as IncomingWebhooksWithCount).total_count,\n });\n }\n\n dispatch(batchActions(actions));\n return {data};\n };\n}\n\nexport function isIncomingWebhooksWithCount(data: any): data is IncomingWebhooksWithCount {\n return typeof data.incoming_webhooks !== 'undefined' &&\n Array.isArray(data.incoming_webhooks) &&\n typeof data.total_count === 'number';\n}\n\nexport function removeIncomingHook(hookId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.removeIncomingWebhook(hookId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: IntegrationTypes.DELETED_INCOMING_HOOK,\n data: {id: hookId},\n },\n ]));\n\n return {data: true};\n };\n}\n\nexport function updateIncomingHook(hook: IncomingWebhook) {\n return bindClientFunc({\n clientFunc: Client4.updateIncomingWebhook,\n onSuccess: [IntegrationTypes.RECEIVED_INCOMING_HOOK],\n params: [\n hook,\n ],\n });\n}\n\nexport function createOutgoingHook(hook: OutgoingWebhook) {\n return bindClientFunc({\n clientFunc: Client4.createOutgoingWebhook,\n onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOK],\n params: [\n hook,\n ],\n });\n}\n\nexport function getOutgoingHook(hookId: string) {\n return bindClientFunc({\n clientFunc: Client4.getOutgoingWebhook,\n onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOK],\n params: [\n hookId,\n ],\n });\n}\n\nexport function getOutgoingHooks(channelId = '', teamId = '', page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getOutgoingWebhooks,\n onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOKS],\n params: [\n channelId,\n teamId,\n page,\n perPage,\n ],\n });\n}\n\nexport function removeOutgoingHook(hookId: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.removeOutgoingWebhook(hookId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: IntegrationTypes.DELETED_OUTGOING_HOOK,\n data: {id: hookId},\n },\n ]));\n\n return {data: true};\n };\n}\n\nexport function updateOutgoingHook(hook: OutgoingWebhook) {\n return bindClientFunc({\n clientFunc: Client4.updateOutgoingWebhook,\n onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOK],\n params: [\n hook,\n ],\n });\n}\n\nexport function regenOutgoingHookToken(hookId: string) {\n return bindClientFunc({\n clientFunc: Client4.regenOutgoingHookToken,\n onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_HOOK],\n params: [\n hookId,\n ],\n });\n}\n\nexport function getCommands(teamId: string) {\n return bindClientFunc({\n clientFunc: Client4.getCommandsList,\n onSuccess: [IntegrationTypes.RECEIVED_COMMANDS],\n params: [\n teamId,\n ],\n });\n}\n\nexport function getAutocompleteCommands(teamId: string, page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getAutocompleteCommandsList,\n onSuccess: [IntegrationTypes.RECEIVED_COMMANDS],\n params: [\n teamId,\n page,\n perPage,\n ],\n });\n}\n\nexport function getCustomTeamCommands(teamId: string) {\n return bindClientFunc({\n clientFunc: Client4.getCustomTeamCommands,\n onSuccess: [IntegrationTypes.RECEIVED_CUSTOM_TEAM_COMMANDS],\n params: [\n teamId,\n ],\n });\n}\n\nexport function addCommand(command: Command) {\n return bindClientFunc({\n clientFunc: Client4.addCommand,\n onSuccess: [IntegrationTypes.RECEIVED_COMMAND],\n params: [\n command,\n ],\n });\n}\n\nexport function editCommand(command: Command) {\n return bindClientFunc({\n clientFunc: Client4.editCommand,\n onSuccess: [IntegrationTypes.RECEIVED_COMMAND],\n params: [\n command,\n ],\n });\n}\n\nexport function executeCommand(command: string, args: CommandArgs) {\n return bindClientFunc({\n clientFunc: Client4.executeCommand,\n params: [\n command,\n args,\n ],\n });\n}\n\nexport function regenCommandToken(id: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n let res;\n try {\n res = await Client4.regenCommandToken(id);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: IntegrationTypes.RECEIVED_COMMAND_TOKEN,\n data: {\n id,\n token: res.token,\n },\n },\n ]));\n\n return {data: true};\n };\n}\n\nexport function deleteCommand(id: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.deleteCommand(id);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: IntegrationTypes.DELETED_COMMAND,\n data: {id},\n },\n ]));\n\n return {data: true};\n };\n}\n\nexport function addOAuthApp(app: OAuthApp) {\n return bindClientFunc({\n clientFunc: Client4.createOAuthApp,\n onSuccess: [IntegrationTypes.RECEIVED_OAUTH_APP],\n params: [\n app,\n ],\n });\n}\n\nexport function editOAuthApp(app: OAuthApp) {\n return bindClientFunc({\n clientFunc: Client4.editOAuthApp,\n onSuccess: IntegrationTypes.RECEIVED_OAUTH_APP,\n params: [\n app,\n ],\n });\n}\n\nexport function getOAuthApps(page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getOAuthApps,\n onSuccess: [IntegrationTypes.RECEIVED_OAUTH_APPS],\n params: [\n page,\n perPage,\n ],\n });\n}\n\nexport function getOutgoingOAuthConnections(teamId: string, page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getOutgoingOAuthConnections,\n onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_OAUTH_CONNECTIONS],\n params: [\n teamId,\n page,\n perPage,\n ],\n });\n}\n\nexport function getOutgoingOAuthConnectionsForAudience(teamId: string, audience: string, page = 0, perPage: number = General.PAGE_SIZE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getOutgoingOAuthConnectionsForAudience,\n onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_OAUTH_CONNECTIONS],\n params: [\n teamId,\n audience,\n page,\n perPage,\n ],\n });\n}\n\nexport function addOutgoingOAuthConnection(teamId: string, connection: OutgoingOAuthConnection) {\n return bindClientFunc({\n clientFunc: Client4.createOutgoingOAuthConnection,\n onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_OAUTH_CONNECTION],\n params: [\n teamId,\n connection,\n ],\n });\n}\n\nexport function editOutgoingOAuthConnection(teamId: string, connection: OutgoingOAuthConnection) {\n return bindClientFunc({\n clientFunc: Client4.editOutgoingOAuthConnection,\n onSuccess: IntegrationTypes.RECEIVED_OUTGOING_OAUTH_CONNECTION,\n params: [\n teamId,\n connection,\n ],\n });\n}\n\nexport function getOutgoingOAuthConnection(teamId: string, connectionId: string) {\n return bindClientFunc({\n clientFunc: Client4.getOutgoingOAuthConnection,\n onSuccess: [IntegrationTypes.RECEIVED_OUTGOING_OAUTH_CONNECTION],\n params: [\n teamId,\n connectionId,\n ],\n });\n}\n\nexport function validateOutgoingOAuthConnection(teamId: string, connection: OutgoingOAuthConnection) {\n return bindClientFunc({\n clientFunc: Client4.validateOutgoingOAuthConnection,\n params: [\n teamId,\n connection,\n ],\n });\n}\n\nexport function getAppsOAuthAppIDs() {\n return bindClientFunc({\n clientFunc: Client4.getAppsOAuthAppIDs,\n onSuccess: [IntegrationTypes.RECEIVED_APPS_OAUTH_APP_IDS],\n });\n}\n\nexport function getAppsBotIDs() {\n return bindClientFunc({\n clientFunc: Client4.getAppsBotIDs,\n onSuccess: [IntegrationTypes.RECEIVED_APPS_BOT_IDS],\n });\n}\n\nexport function getOAuthApp(appId: string) {\n return bindClientFunc({\n clientFunc: Client4.getOAuthApp,\n onSuccess: [IntegrationTypes.RECEIVED_OAUTH_APP],\n params: [\n appId,\n ],\n });\n}\n\nexport function getAuthorizedOAuthApps(): ActionFuncAsync<OAuthApp[]> {\n return async (dispatch, getState) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n\n let data;\n try {\n data = await Client4.getAuthorizedOAuthApps(currentUserId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n\n return {error};\n }\n\n return {data};\n };\n}\n\nexport function deauthorizeOAuthApp(clientId: string) {\n return bindClientFunc({\n clientFunc: Client4.deauthorizeOAuthApp,\n params: [clientId],\n });\n}\n\nexport function deleteOAuthApp(id: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.deleteOAuthApp(id);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: IntegrationTypes.DELETED_OAUTH_APP,\n data: {id},\n },\n ]));\n\n return {data: true};\n };\n}\n\nexport function regenOAuthAppSecret(appId: string) {\n return bindClientFunc({\n clientFunc: Client4.regenOAuthAppSecret,\n onSuccess: [IntegrationTypes.RECEIVED_OAUTH_APP],\n params: [\n appId,\n ],\n });\n}\n\nexport function deleteOutgoingOAuthConnection(id: string): ActionFuncAsync<boolean> {\n return async (dispatch, getState) => {\n try {\n await Client4.deleteOutgoingOAuthConnection(id);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: IntegrationTypes.DELETED_OUTGOING_OAUTH_CONNECTION,\n data: {id},\n });\n\n return {data: true};\n };\n}\n\nexport function submitInteractiveDialog(submission: DialogSubmission): ActionFuncAsync<SubmitDialogResponse> {\n return async (dispatch, getState) => {\n const state = getState();\n submission.channel_id = getCurrentChannelId(state);\n submission.team_id = getCurrentTeamId(state);\n\n let data;\n try {\n data = await Client4.submitInteractiveDialog(submission);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n return {data};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {JobType, JobTypeBase} from '@mattermost/types/jobs';\n\nimport {JobTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {bindClientFunc} from './helpers';\n\nimport {General} from '../constants';\n\nexport function createJob(job: JobTypeBase) {\n return bindClientFunc({\n clientFunc: Client4.createJob,\n onSuccess: JobTypes.RECEIVED_JOB,\n params: [\n job,\n ],\n });\n}\n\nexport function getJob(id: string) {\n return bindClientFunc({\n clientFunc: Client4.getJob,\n onSuccess: JobTypes.RECEIVED_JOB,\n params: [\n id,\n ],\n });\n}\n\nexport function getJobs(page = 0, perPage: number = General.JOBS_CHUNK_SIZE) {\n return bindClientFunc({\n clientFunc: Client4.getJobs,\n onSuccess: JobTypes.RECEIVED_JOBS,\n params: [\n page,\n perPage,\n ],\n });\n}\n\nexport function getJobsByType(type: JobType, page = 0, perPage: number = General.JOBS_CHUNK_SIZE) {\n return bindClientFunc({\n clientFunc: Client4.getJobsByType,\n onSuccess: [JobTypes.RECEIVED_JOBS, JobTypes.RECEIVED_JOBS_BY_TYPE],\n params: [\n type,\n page,\n perPage,\n ],\n });\n}\n\nexport function cancelJob(job: string) {\n return bindClientFunc({\n clientFunc: Client4.cancelJob,\n params: [\n job,\n ],\n });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getCurrentTimezoneFull} from 'mattermost-redux/selectors/entities/timezone';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport type {ActionFuncAsync} from 'mattermost-redux/types/actions';\n\nimport {updateMe} from './users';\n\nexport function autoUpdateTimezone(deviceTimezone: string): ActionFuncAsync {\n return async (dispatch, getState) => {\n const currentUser = getCurrentUser(getState());\n const currentTimezone = getCurrentTimezoneFull(getState());\n const newTimezoneExists = currentTimezone.automaticTimezone !== deviceTimezone;\n\n if (currentTimezone.useAutomaticTimezone && newTimezoneExists) {\n const timezone = {\n useAutomaticTimezone: 'true',\n automaticTimezone: deviceTimezone,\n manualTimezone: currentTimezone.manualTimezone,\n };\n\n const updatedUser = {\n ...currentUser,\n timezone,\n };\n\n dispatch(updateMe(updatedUser));\n }\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// SKUs\nexport const TrackProfessionalSKU = 'professional';\nexport const TrackEnterpriseSKU = 'enterprise';\n\n// Features\nexport const TrackGroupsFeature = 'custom_groups';\nexport const TrackPassiveKeywordsFeature = 'passive_keywords';\nexport const TrackScheduledPostsFeature = 'scheduled_posts';\n\n// Events\nexport const TrackInviteGroupEvent = 'invite_group_to_channel__add_member';\nexport const TrackPassiveKeywordsEvent = 'update_passive_keywords';\n\n// Categories\nexport const TrackActionCategory = 'action';\nexport const TrackMiscCategory = 'miscellaneous';\n\n// Properties\nexport const TrackPropertyUser = 'user_actual_id';\nexport const TrackPropertyUserAgent = 'user_agent';\n\nexport const eventSKUs: {[event: string]: string[]} = {\n [TrackInviteGroupEvent]: [TrackProfessionalSKU, TrackEnterpriseSKU],\n [TrackPassiveKeywordsEvent]: [TrackProfessionalSKU, TrackEnterpriseSKU],\n};\n\nexport const eventCategory: {[event: string]: string} = {\n [TrackInviteGroupEvent]: TrackActionCategory,\n [TrackPassiveKeywordsEvent]: TrackActionCategory,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AppBinding} from '@mattermost/types/apps';\nimport type {ClientConfig} from '@mattermost/types/config';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {AppBindingLocations} from 'mattermost-redux/constants/apps';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nexport const appsPluginIsEnabled = (state: GlobalState) => state.entities.apps.pluginEnabled;\n\nexport const appsFeatureFlagEnabled = createSelector(\n 'appsConfiguredAsEnabled',\n (state: GlobalState) => getConfig(state),\n (config: Partial<ClientConfig>) => {\n return config?.['FeatureFlagAppsEnabled' as keyof Partial<ClientConfig>] === 'true';\n },\n);\n\nexport const appsEnabled = createSelector(\n 'appsEnabled',\n appsFeatureFlagEnabled,\n appsPluginIsEnabled,\n (featureFlagEnabled: boolean, pluginEnabled: boolean) => {\n return featureFlagEnabled && pluginEnabled;\n },\n);\n\nexport const appBarEnabled = createSelector(\n 'appBarEnabled',\n (state: GlobalState) => getConfig(state),\n (config?: Partial<ClientConfig>) => {\n return config?.DisableAppBar === 'false';\n },\n);\n\nexport const makeAppBindingsSelector = (location: string) => {\n return createSelector(\n 'makeAppBindingsSelector',\n (state: GlobalState) => state.entities.apps.main.bindings,\n (state: GlobalState) => appsEnabled(state),\n (bindings: AppBinding[], areAppsEnabled: boolean) => {\n if (!areAppsEnabled || !bindings) {\n return [];\n }\n\n const headerBindings = bindings.filter((b) => b.location === location);\n return headerBindings.reduce((accum: AppBinding[], current: AppBinding) => accum.concat(current.bindings || []), []);\n },\n );\n};\n\nexport const getChannelHeaderAppBindings = createSelector(\n 'getChannelHeaderAppBindings',\n appBarEnabled,\n makeAppBindingsSelector(AppBindingLocations.CHANNEL_HEADER_ICON),\n (enabled: boolean, channelHeaderBindings: AppBinding[]) => {\n return enabled ? [] : channelHeaderBindings;\n },\n);\n\nexport const getAppBarAppBindings = createSelector(\n 'getAppBarAppBindings',\n appBarEnabled,\n makeAppBindingsSelector(AppBindingLocations.CHANNEL_HEADER_ICON),\n makeAppBindingsSelector(AppBindingLocations.APP_BAR),\n (enabled: boolean, channelHeaderBindings: AppBinding[], appBarBindings: AppBinding[]) => {\n if (!enabled) {\n return [];\n }\n\n const appIds = appBarBindings.map((b) => b.app_id);\n const backwardsCompatibleBindings = channelHeaderBindings.filter((b) => !appIds.includes(b.app_id));\n\n return appBarBindings.concat(backwardsCompatibleBindings);\n },\n);\n\nexport const makeRHSAppBindingSelector = (location: string) => {\n return createSelector(\n 'makeRHSAppBindingSelector',\n (state: GlobalState) => state.entities.apps.rhs.bindings,\n (state: GlobalState) => appsEnabled(state),\n (bindings: AppBinding[], areAppsEnabled: boolean) => {\n if (!areAppsEnabled || !bindings) {\n return [];\n }\n\n const headerBindings = bindings.filter((b) => b.location === location);\n return headerBindings.reduce((accum: AppBinding[], current: AppBinding) => accum.concat(current.bindings || []), []);\n },\n );\n};\n\nexport const getAppCommandForm = (state: GlobalState, location: string) => {\n return state.entities.apps.main.forms[location];\n};\n\nexport const getAppRHSCommandForm = (state: GlobalState, location: string) => {\n return state.entities.apps.rhs.forms[location];\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {\n Limits,\n Subscription,\n Product,\n CloudCustomer,\n CloudState,\n} from '@mattermost/types/cloud';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getLicense} from './general';\n\nexport function getCloudLimits(state: GlobalState): Limits {\n return state.entities.cloud.limits.limits;\n}\n\nexport function getCloudSubscription(state: GlobalState): Subscription | undefined {\n return state.entities.cloud.subscription;\n}\nexport function getCloudCustomer(state: GlobalState): CloudCustomer | undefined {\n return state.entities.cloud.customer;\n}\n\nexport function getCloudProducts(state: GlobalState): Record<string, Product> | undefined {\n return state.entities.cloud.products;\n}\n\nexport function getCloudLimitsLoaded(state: GlobalState): boolean {\n return state.entities.cloud.limits.limitsLoaded;\n}\n\nexport function getCloudErrors(state: GlobalState): CloudState['errors'] {\n return state.entities.cloud.errors;\n}\n\nexport function getCloudInvoices(state: GlobalState): CloudState['invoices'] {\n return state.entities.cloud.invoices;\n}\n\nexport function getSubscriptionProduct(state: GlobalState): Product | undefined {\n const subscription = getCloudSubscription(state);\n if (!subscription) {\n return undefined;\n }\n const products = getCloudProducts(state);\n if (!products) {\n return undefined;\n }\n\n return products[subscription.product_id];\n}\n\nexport function getSubscriptionProductName(state: GlobalState): string {\n return getSubscriptionProduct(state)?.name || '';\n}\n\nexport function checkHadPriorTrial(state: GlobalState): boolean {\n const subscription = getCloudSubscription(state);\n return Boolean(subscription?.is_free_trial === 'false' && subscription?.trial_end_at > 0);\n}\n\nexport function isCurrentLicenseCloud(state: GlobalState): boolean {\n const license = getLicense(state);\n return license?.Cloud === 'true';\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ClientLicense, ClientConfig} from '@mattermost/types/config';\nimport type {ScheduledPost, ScheduledPostsState} from '@mattermost/types/schedule_post';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\n\nconst emptyList: string[] = [];\n\nexport type ChannelScheduledPostIndicatorData = {\n scheduledPost?: ScheduledPost;\n count: number;\n}\n\nexport function makeGetScheduledPostsByTeam(): (state: GlobalState, teamId: string, includeDirectChannels: boolean) => ScheduledPost[] {\n return createSelector(\n 'makeGetScheduledPostsByTeam',\n (state: GlobalState) => state.entities.scheduledPosts.byId,\n (state: GlobalState, teamId: string, includeDirectChannels: boolean) => includeDirectChannels,\n (state: GlobalState, teamId: string) => state.entities.scheduledPosts.byTeamId[teamId] || emptyList,\n (state: GlobalState) => state.entities.scheduledPosts.byTeamId.directChannels || emptyList,\n (scheduledPostsById: ScheduledPostsState['byId'], includeDirectChannels: boolean, teamScheduledPostsIDs: string[], directChannelScheduledPostsIDs: string[]) => {\n const scheduledPosts: ScheduledPost[] = [];\n\n const extractor = (scheduledPostId: string) => {\n const scheduledPost = scheduledPostsById[scheduledPostId];\n if (scheduledPost) {\n scheduledPosts.push(scheduledPost);\n }\n };\n\n teamScheduledPostsIDs.forEach(extractor);\n\n if (includeDirectChannels) {\n directChannelScheduledPostsIDs.forEach(extractor);\n }\n\n // Most recently upcoming post shows up first.\n scheduledPosts.sort((a, b) => a.scheduled_at - b.scheduled_at || a.create_at - b.create_at);\n\n return scheduledPosts;\n },\n );\n}\n\nexport function getScheduledPostsByTeamCount(state: GlobalState, teamId: string, includeDirectChannels: boolean) {\n let count = state.entities.scheduledPosts.byTeamId[teamId]?.length || 0;\n if (includeDirectChannels) {\n count += (state.entities.scheduledPosts.byTeamId.directChannels?.length || 0);\n }\n\n return count;\n}\n\nexport function hasScheduledPostError(state: GlobalState, teamId: string) {\n return state.entities.scheduledPosts.errorsByTeamId[teamId]?.length > 0 || state.entities.scheduledPosts.errorsByTeamId.directChannels?.length > 0;\n}\n\nexport function showChannelOrThreadScheduledPostIndicator(state: GlobalState, channelOrThreadId: string): ChannelScheduledPostIndicatorData {\n const allChannelScheduledPosts = state.entities.scheduledPosts.byChannelOrThreadId[channelOrThreadId] || emptyList;\n const eligibleScheduledPosts = allChannelScheduledPosts.filter((scheduledPostId: string) => {\n const scheduledPost = state.entities.scheduledPosts.byId[scheduledPostId];\n return !scheduledPost?.error_code;\n });\n\n const data = {\n count: eligibleScheduledPosts.length,\n } as ChannelScheduledPostIndicatorData;\n\n if (data.count === 1) {\n const scheduledPostId = eligibleScheduledPosts[0];\n data.scheduledPost = state.entities.scheduledPosts.byId[scheduledPostId];\n }\n\n return data;\n}\n\nexport const isScheduledPostsEnabled: (a: GlobalState) => boolean = createSelector(\n 'isScheduledPostsEnabled',\n getConfig,\n getLicense,\n (config: Partial<ClientConfig>, license: ClientLicense): boolean => {\n return config.ScheduledPosts === 'true' && license.IsLicensed === 'true';\n },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {CloudUsage} from '@mattermost/types/cloud';\nimport type {GlobalState} from '@mattermost/types/store';\n\nexport function getUsage(state: GlobalState): CloudUsage {\n return state.entities.usage;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {UserProfile, UserProfileWithLastViewAt} from '@mattermost/types/users';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getMyChannelMemberships, getAllDmChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId, getUserStatuses} from 'mattermost-redux/selectors/entities/users';\nimport {getDirectChannelName} from 'mattermost-redux/utils/channel_utils';\n\nexport function makeAddLastViewAtToProfiles(): (state: GlobalState, profiles: UserProfile[]) => UserProfileWithLastViewAt[] {\n return createSelector(\n 'makeAddLastViewAtToProfiles',\n getCurrentUserId,\n getMyChannelMemberships,\n getAllDmChannels,\n getUserStatuses,\n (_: GlobalState, profiles: UserProfile[]) => profiles,\n (currentUserId, memberships, allDmChannels, userStatuses, profiles) => {\n const formattedProfiles: UserProfileWithLastViewAt[] = profiles.map((profile) => {\n const channelName = getDirectChannelName(currentUserId, profile.id);\n const channel = allDmChannels[channelName];\n const membership = channel ? memberships[channel.id] : null;\n const status = userStatuses[profile.id];\n\n return {\n ...profile,\n status,\n last_viewed_at: channel && membership ? membership.last_viewed_at : 0,\n };\n });\n\n return formattedProfiles;\n },\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {DialogElement} from '@mattermost/types/integrations';\n\ntype DialogError = {\n id: string;\n defaultMessage: string;\n values?: any;\n};\nexport function checkDialogElementForError(elem: DialogElement, value: any): DialogError | undefined | null {\n if ((!value && value !== 0) && !elem.optional) {\n return {\n id: 'interactive_dialog.error.required',\n defaultMessage: 'This field is required.',\n };\n }\n\n const type = elem.type;\n\n if (type === 'text' || type === 'textarea') {\n if (value && value.length < elem.min_length) {\n return {\n id: 'interactive_dialog.error.too_short',\n defaultMessage: 'Minimum input length is {minLength}.',\n values: {minLength: elem.min_length},\n };\n }\n\n if (elem.subtype === 'email') {\n if (value && !value.includes('@')) {\n return {\n id: 'interactive_dialog.error.bad_email',\n defaultMessage: 'Must be a valid email address.',\n };\n }\n }\n\n if (elem.subtype === 'number') {\n if (value && isNaN(value)) {\n return {\n id: 'interactive_dialog.error.bad_number',\n defaultMessage: 'Must be a number.',\n };\n }\n }\n\n if (elem.subtype === 'url') {\n if (value && !value.includes('http://') && !value.includes('https://')) {\n return {\n id: 'interactive_dialog.error.bad_url',\n defaultMessage: 'URL must include http:// or https://.',\n };\n }\n }\n } else if (type === 'radio') {\n const options = elem.options;\n\n if (typeof value !== 'undefined' && Array.isArray(options) && !options.some((e) => e.value === value)) {\n return {\n id: 'interactive_dialog.error.invalid_option',\n defaultMessage: 'Must be a valid option',\n };\n }\n }\n\n return null;\n}\n\n// If we're returned errors that don't match any of the elements we have,\n// ignore them and complete the dialog\n\nexport function checkIfErrorsMatchElements(errors: Record<string, string> = {}, elements: DialogElement[] = []) {\n for (const name in errors) {\n if (!Object.hasOwn(errors, name)) {\n continue;\n }\n for (const elem of elements) {\n if (elem.name === name) {\n return true;\n }\n }\n }\n\n return false;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {PluginManifest} from '@mattermost/types/plugins';\n\nimport {hideRHSPlugin as hideRHSPluginAction} from 'actions/views/rhs';\nimport {getPluggableId} from 'selectors/rhs';\n\nimport {ActionTypes} from 'utils/constants';\n\nimport type {GlobalState, ActionFunc} from 'types/store';\n\nexport const removeWebappPlugin = (manifest: PluginManifest): ActionFunc<boolean, GlobalState> => {\n return (dispatch) => {\n dispatch(hideRHSPlugin(manifest.id));\n dispatch({type: ActionTypes.REMOVED_WEBAPP_PLUGIN, data: manifest});\n return {data: true};\n };\n};\n\n// hideRHSPlugin closes the RHS if currently showing this plugin.\nconst hideRHSPlugin = (manifestId: string): ActionFunc<boolean, GlobalState> => {\n return (dispatch, getState) => {\n const state = getState();\n const rhsPlugins = state.plugins.components.RightHandSidebarComponent || [];\n const pluggableId = getPluggableId(state);\n const pluginComponent = rhsPlugins.find((element) => element.id === pluggableId && element.pluginId === manifestId);\n\n // Hide RHS if its showing this plugin\n if (pluginComponent) {\n dispatch(hideRHSPluginAction(pluggableId));\n }\n return {data: true};\n };\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport regeneratorRuntime from 'regenerator-runtime';\n\nimport type {PluginManifest} from '@mattermost/types/plugins';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getConfig, isPerformanceDebuggingEnabled} from 'mattermost-redux/selectors/entities/general';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {unregisterAdminConsolePlugin} from 'actions/admin_actions';\nimport {trackPluginInitialization} from 'actions/telemetry_actions';\nimport {unregisterPluginTranslationsSource} from 'actions/views/root';\nimport {unregisterAllPluginWebSocketEvents, unregisterPluginReconnectHandler} from 'actions/websocket_actions';\nimport store from 'stores/redux_store';\n\nimport PluginRegistry from 'plugins/registry';\nimport {ActionTypes} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\n\nimport type {GlobalState, ActionFuncAsync} from 'types/store';\n\nimport {removeWebappPlugin} from './actions';\n\n// Including the fullscreen modal css to make it available to the plugins\n// (without lazy loading). This should be removed in the future whenever we\n// have all plugins migrated to common components that can be reused there.\nimport 'components/widgets/modals/full_screen_modal.scss';\n\ninterface Plugin {\n initialize?: (registry: PluginRegistry, store: any) => void;\n uninitialize?: () => void;\n\n /**\n * @deprecated Define an uninitialize method instead.\n */\n deinitialize?: () => void;\n}\n\ninterface WindowWithPlugins extends Window {\n plugins: {\n [key: string]: Plugin;\n };\n registerPlugin: (id: string, plugin: Plugin) => void;\n regeneratorRuntime: typeof regeneratorRuntime;\n}\n\ndeclare let window: WindowWithPlugins;\n\n// Plugins may have been compiled with the regenerator runtime. Ensure this remains available\n// as a global export even though the webapp does not depend on same.\nwindow.regeneratorRuntime = regeneratorRuntime;\n\n// plugins records all active web app plugins by id.\nwindow.plugins = {};\n\n// registerPlugin, on the global window object, should be invoked by a plugin's web app bundle as\n// it is loaded.\n//\n// During the beta, plugins manipulated the global window.plugins data structure directly. This\n// remains possible, but is officially deprecated and may be removed in a future release.\nfunction registerPlugin(id: string, plugin: Plugin): void {\n const oldPlugin = window.plugins[id];\n if (oldPlugin && oldPlugin.uninitialize) {\n oldPlugin.uninitialize();\n }\n\n window.plugins[id] = plugin;\n}\nwindow.registerPlugin = registerPlugin;\n\nfunction arePluginsEnabled(state: GlobalState): boolean {\n if (getConfig(state).PluginsEnabled !== 'true') {\n return false;\n }\n\n if (\n isPerformanceDebuggingEnabled(state) &&\n getBool(state, Preferences.CATEGORY_PERFORMANCE_DEBUGGING, Preferences.NAME_DISABLE_CLIENT_PLUGINS)\n ) {\n return false;\n }\n\n return true;\n}\n\n// initializePlugins queries the server for all enabled plugins and loads each in turn.\nexport async function initializePlugins(): Promise<void> {\n if (!arePluginsEnabled(store.getState())) {\n return;\n }\n\n const {data, error} = await store.dispatch(getPlugins());\n if (error) {\n console.error(error); //eslint-disable-line no-console\n return;\n }\n\n if (data == null || data.length === 0) {\n return;\n }\n\n await Promise.all(data.map((m: PluginManifest) => {\n return loadPlugin(m).catch((loadErr: Error) => {\n console.error(loadErr.message); //eslint-disable-line no-console\n });\n }));\n\n trackPluginInitialization(data);\n}\n\n// getPlugins queries the server for all enabled plugins\nexport function getPlugins(): ActionFuncAsync {\n return async (dispatch) => {\n let plugins;\n try {\n plugins = await Client4.getWebappPlugins();\n } catch (error) {\n return {error};\n }\n\n dispatch({type: ActionTypes.RECEIVED_WEBAPP_PLUGINS, data: plugins});\n\n return {data: plugins};\n };\n}\n\n// loadedPlugins tracks which plugins have been added as script tags to the page\nconst loadedPlugins: { [key: string]: PluginManifest } = {};\n\n// describePlugin takes a manifest and spits out a string suitable for console.log messages.\nconst describePlugin = (manifest: PluginManifest): string => (\n 'plugin ' + manifest.id + ', version ' + manifest.version\n);\n\n// loadPlugin fetches the web app bundle described by the given manifest, waits for the bundle to\n// load, and then ensures the plugin has been initialized.\nexport function loadPlugin(manifest: PluginManifest): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!arePluginsEnabled(store.getState())) {\n return;\n }\n\n // Don't load it again if previously loaded\n const oldManifest = loadedPlugins[manifest.id];\n if (oldManifest && oldManifest.webapp?.bundle_path === manifest.webapp?.bundle_path) {\n resolve();\n return;\n }\n\n if (oldManifest) {\n // upgrading, perform cleanup\n store.dispatch(removeWebappPlugin(manifest));\n }\n\n function onLoad() {\n initializePlugin(manifest);\n console.log('Loaded ' + describePlugin(manifest)); //eslint-disable-line no-console\n resolve();\n }\n\n function onError() {\n reject(new Error('Unable to load bundle for ' + describePlugin(manifest)));\n }\n\n // Backwards compatibility for old plugins\n let bundlePath = manifest.webapp?.bundle_path;\n if (bundlePath && bundlePath.includes('/static/') && !bundlePath.includes('/static/plugins/')) {\n bundlePath = bundlePath.replace('/static/', '/static/plugins/');\n }\n\n console.log('Loading ' + describePlugin(manifest)); //eslint-disable-line no-console\n\n const script = document.createElement('script');\n script.id = 'plugin_' + manifest.id;\n script.type = 'text/javascript';\n script.src = getSiteURL() + bundlePath;\n script.defer = true;\n script.onload = onLoad;\n script.onerror = onError;\n\n document.getElementsByTagName('head')[0].appendChild(script);\n loadedPlugins[manifest.id] = manifest;\n });\n}\n\n// initializePlugin creates a registry specific to the plugin and invokes any initialize function\n// on the registered plugin class.\nfunction initializePlugin(manifest: PluginManifest): void {\n // Initialize the plugin\n const plugin = window.plugins[manifest.id];\n const registry = new PluginRegistry(manifest.id);\n if (plugin && plugin.initialize) {\n plugin.initialize(registry, store);\n }\n}\n\n// removePlugin triggers any uninitialize callback on the registered plugin, unregisters any\n// event handlers, and removes the plugin script from the DOM entirely. The plugin is responsible\n// for removing any of its registered components.\nexport function removePlugin(manifest: PluginManifest): void {\n if (!loadedPlugins[manifest.id]) {\n return;\n }\n console.log('Removing ' + describePlugin(manifest)); //eslint-disable-line no-console\n\n delete loadedPlugins[manifest.id];\n\n store.dispatch(removeWebappPlugin(manifest));\n\n const plugin = window.plugins[manifest.id];\n if (plugin && plugin.uninitialize) {\n plugin.uninitialize();\n\n // Support the deprecated deinitialize callback from the plugins beta.\n } else if (plugin && plugin.deinitialize) {\n plugin.deinitialize();\n }\n unregisterAllPluginWebSocketEvents(manifest.id);\n unregisterPluginReconnectHandler(manifest.id);\n store.dispatch(unregisterAdminConsolePlugin(manifest.id));\n unregisterPluginTranslationsSource(manifest.id);\n const script = document.getElementById('plugin_' + manifest.id);\n if (!script) {\n return;\n }\n script.parentNode?.removeChild(script);\n console.log('Removed ' + describePlugin(manifest)); //eslint-disable-line no-console\n}\n\n// loadPluginsIfNecessary synchronizes the current state of loaded plugins with that of the server,\n// loading any newly added plugins and unloading any removed ones.\nexport async function loadPluginsIfNecessary(): Promise<void> {\n if (!arePluginsEnabled(store.getState())) {\n return;\n }\n\n const oldManifests = store.getState().plugins.plugins as { [key: string]: PluginManifest };\n\n const {error} = await store.dispatch(getPlugins());\n if (error) {\n console.error(error); //eslint-disable-line no-console\n return;\n }\n\n const newManifests = store.getState().plugins.plugins as { [key: string]: PluginManifest };\n\n // Get new plugins and update existing plugins if version changed\n Object.values(newManifests).forEach((newManifest: PluginManifest) => {\n const oldManifest = oldManifests[newManifest.id];\n if (!oldManifest || oldManifest.version !== newManifest.version) {\n loadPlugin(newManifest).catch((loadErr: Error) => {\n console.error(loadErr.message); //eslint-disable-line no-console\n });\n }\n });\n\n // Remove old plugins\n Object.keys(oldManifests).forEach((id: string) => {\n if (!Object.hasOwn(newManifests, id)) {\n const oldManifest = oldManifests[id];\n removePlugin(oldManifest);\n }\n });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport styled from 'styled-components';\n\ntype Props = {\n children: React.ReactNode;\n pluginId?: string;\n}\n\ntype State = {\n hasError: boolean;\n}\n\nconst WrapperDiv = styled.div`\n align-items: center;\n display: flex;\n flex-direction: column;\n height: 100%;\n justify-content: center;\n width: 100%;\n\n #root > & {\n // prevent root layout error; fit into announcement area\n grid-area: announcement;\n display: flex;\n word-break: normal;\n flex-direction: row;\n gap: 10px;\n height: 40px;\n }\n`;\n\nexport default class PluggableErrorBoundary extends React.PureComponent<Props, State> {\n state = {\n hasError: false,\n };\n\n static getDerivedStateFromError() {\n return {\n hasError: true,\n };\n }\n\n clearErrorState = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n this.setState({hasError: false});\n };\n\n render() {\n if (this.state.hasError) {\n return (\n <WrapperDiv>\n <FormattedMessage\n id='pluggable.errorOccurred'\n defaultMessage='An error occurred in the {pluginId} plugin.'\n values={{\n pluginId: this.props.pluginId,\n }}\n />\n <br/>\n <a\n href='#'\n onClick={this.clearErrorState}\n >\n <FormattedMessage\n id='pluggable.errorRefresh'\n defaultMessage='Refresh?'\n values={{\n pluginId: this.props.pluginId,\n }}\n />\n </a>\n </WrapperDiv>\n );\n }\n\n return this.props.children;\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {WebSocketClient} from '@mattermost/client';\n\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport webSocketClient from 'client/web_websocket_client';\n\nimport type {GlobalState} from 'types/store';\nimport type {ProductComponent} from 'types/store/plugins';\n\nimport PluggableErrorBoundary from './error_boundary';\n\ntype Props = {\n\n /*\n * Override the component to be plugged\n */\n pluggableName: string;\n\n /*\n * Components for overriding provided by plugins\n */\n components: GlobalState['plugins']['components'];\n\n /*\n * Logged in user's theme\n */\n theme: Theme;\n\n /*\n * Id of the specific component to be plugged.\n */\n pluggableId?: string;\n\n /*\n * Name of the sub component to use. Defaults to 'component' if unspecified.\n *\n * Only supported when pluggableName is \"Product\".\n */\n subComponentName?: 'mainComponent' | 'publicComponent' | 'headerCentreComponent' | 'headerRightComponent';\n\n /*\n * Accept any other prop to pass onto the plugin component\n */\n [name: string]: any;\n}\n\ntype BaseChildProps = {\n theme: Theme;\n webSocketClient?: WebSocketClient;\n}\n\nexport default function Pluggable(props: Props): JSX.Element | null {\n const {\n components,\n pluggableId,\n pluggableName,\n subComponentName = '',\n theme,\n ...otherProps\n } = props;\n\n if (!pluggableName || !Object.hasOwn(components, pluggableName)) {\n return null;\n }\n\n let pluginComponents = components[pluggableName]!;\n\n if (pluggableId) {\n pluginComponents = pluginComponents.filter(\n (element) => element.id === pluggableId);\n }\n\n // Override the default component with any registered plugin's component\n // Select a specific component by pluginId if available\n let content;\n\n if (pluggableName === 'Product') {\n content = (pluginComponents as ProductComponent[]).map((pc) => {\n if (!subComponentName || !pc[subComponentName]) {\n return null;\n }\n\n const Component = pc[subComponentName]! as React.ComponentType<BaseChildProps>;\n\n return (\n <PluggableErrorBoundary\n key={pluggableName + pc.id}\n pluginId={pc.pluginId}\n >\n <Component\n {...otherProps}\n theme={theme}\n />\n </PluggableErrorBoundary>\n );\n });\n } else {\n content = pluginComponents.map((p) => {\n if (!p.component) {\n return null;\n }\n\n const Component = p.component as React.ComponentType<BaseChildProps>;\n\n return (\n <PluggableErrorBoundary\n key={pluggableName + p.id}\n pluginId={p.pluginId}\n >\n <Component\n {...otherProps}\n theme={theme}\n webSocketClient={webSocketClient}\n />\n </PluggableErrorBoundary>\n );\n });\n }\n\n return (\n <>\n {content}\n </>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport type {GlobalState} from 'types/store';\n\nimport Pluggable from './pluggable';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n components: state.plugins.components,\n theme: getTheme(state),\n };\n}\n\nexport default connect(mapStateToProps)(Pluggable);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport intersection from 'lodash/intersection';\nimport isPlainObject from 'lodash/isPlainObject';\nimport zipObject from 'lodash/zipObject';\n\n/**\n * Transform a function with multiple args into one that receives a normalized args object.\n * @param keyOrder the ordered keys/args for object-normalization and backwards-compatibility\n * @param func the normal method definition that receives the normalized args object\n * @returns func-invoker that supports ordered arguments or a single object argument\n * @remarks it's best to provide a type for {@link TArgs} which enables {@link keyOrder} type checking.\n * @example\n * const wrappedMethod = reArg(['a', 'b', 'c', 'd', 'e', 'f', 'g'], (props: TArgs) => {\n * // do stuff\n * const a = props.a;\n * const {b, c, d, e, f, g: z} = props;\n * });\n * // invoke via:\n * wrappedMethod({a, b, c, d, e, f, g});\n * // or:\n * wrappedMethod(a, b, c, d, e, f, g);\n */\nexport function reArg<TArgs extends Record<string, unknown>, TResult>(keyOrder: Array<keyof TArgs>, func: (args: TArgs) => TResult) {\n // Ordered-argument typing (`| any[]` bellow) could possibly be improved to support type checking when not invoking with via TArgs\n return (...args: [TArgs] | any[]) => {\n const isConfigObjectArg = args.length === 1 && isPlainObject(args[0]);\n\n // validate against key-name clashes if arg is an object\n const objKeys = isConfigObjectArg && Object.keys(args[0]);\n const keysMatch = objKeys && intersection(objKeys, keyOrder).length === objKeys.length;\n\n return func(isConfigObjectArg && keysMatch ? args[0] : zipObject(keyOrder, args));\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {isValidElementType} from 'react-is';\nimport type {Reducer} from 'redux';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {FileInfo} from '@mattermost/types/files';\nimport type {ProductScope} from '@mattermost/types/products';\n\nimport reducerRegistry from 'mattermost-redux/store/reducer_registry';\n\nimport {\n registerAdminConsolePlugin,\n unregisterAdminConsolePlugin,\n registerAdminConsoleCustomSetting,\n registerAdminConsoleCustomSection,\n} from 'actions/admin_actions';\nimport {showRHSPlugin, hideRHSPlugin, toggleRHSPlugin} from 'actions/views/rhs';\nimport {\n registerPluginTranslationsSource,\n} from 'actions/views/root';\nimport type {\n TranslationPluginFunction} from 'actions/views/root';\nimport {\n registerPluginWebSocketEvent,\n unregisterPluginWebSocketEvent,\n registerPluginReconnectHandler,\n unregisterPluginReconnectHandler,\n} from 'actions/websocket_actions.jsx';\nimport store from 'stores/redux_store';\n\nimport {ActionTypes} from 'utils/constants';\nimport {reArg} from 'utils/func';\nimport {generateId} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\nimport type {PluginComponent, PluginsState, ProductComponent, NeedsTeamComponent} from 'types/store/plugins';\n\nconst defaultShouldRender = () => true;\n\ntype DPluginComponentProp = {component: PluginComponent['component']};\nfunction dispatchPluginComponentAction(name: keyof PluginsState['components'], pluginId: string, component: PluginComponent['component'], id = generateId()) {\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name,\n data: {\n id,\n pluginId,\n component,\n },\n });\n\n return id;\n}\n\ntype ReactResolvable = React.ReactNode | React.ElementType;\nconst resolveReactElement = (element: ReactResolvable) => {\n if (\n element &&\n !React.isValidElement(element) &&\n isValidElementType(element) &&\n typeof element !== 'string'\n ) {\n // Allow element to be passed as the name of the component, instead of a React element.\n return React.createElement(element);\n }\n\n return element;\n};\n\nconst standardizeRoute = (route: string) => {\n let fixedRoute = route.trim();\n if (fixedRoute[0] === '/') {\n fixedRoute = fixedRoute.substring(1);\n }\n return fixedRoute;\n};\n\nexport default class PluginRegistry {\n id: string;\n constructor(id: string) {\n this.id = id;\n }\n\n supports = {\n globalAppBar: true,\n globalRhs: true,\n };\n\n // Register a component at the root of the channel view of the app.\n // Accepts a React component. Returns a unique identifier.\n registerRootComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('Root', this.id, component);\n });\n\n // Register a component in the user attributes section of the profile popover (hovercard), below the default user attributes.\n // Accepts a React component. Returns a unique identifier.\n registerPopoverUserAttributesComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('PopoverUserAttributes', this.id, component);\n });\n\n // Register a component in the user actions of the profile popover (hovercard), below the default actions.\n // Accepts a React component. Returns a unique identifier.\n registerPopoverUserActionsComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('PopoverUserActions', this.id, component);\n });\n\n // Register a component fixed to the top of the left-hand channel sidebar.\n // Accepts a React component. Returns a unique identifier.\n registerLeftSidebarHeaderComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('LeftSidebarHeader', this.id, component);\n });\n\n // Register a component fixed to the bottom of the team sidebar. Does not render if\n // user is only on one team and the team sidebar is not shown.\n // Accepts a React component. Returns a unique identifier.\n registerBottomTeamSidebarComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('BottomTeamSidebar', this.id, component);\n });\n\n // Register a component fixed to the bottom of the post message.\n // Accepts a React component. Returns a unique identifier.\n registerPostMessageAttachmentComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('PostMessageAttachment', this.id, component);\n });\n\n // Register components for search.\n // Accepts React components. Returns a unique identifier.\n registerSearchComponents = ({buttonComponent, suggestionsComponent, hintsComponent, action}: any) => {\n const id = generateId();\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'SearchButtons',\n data: {\n id,\n pluginId: this.id,\n component: buttonComponent,\n action,\n },\n });\n dispatchPluginComponentAction('SearchSuggestions', this.id, suggestionsComponent, id);\n dispatchPluginComponentAction('SearchHints', this.id, hintsComponent, id);\n return id;\n };\n\n // Register a component to show as a tooltip when a user hovers on a link in a post.\n // Accepts a React component. Returns a unique identifier.\n // The component will be passed the following props:\n // - href - The URL for this link\n // - show - A boolean used to signal that the user is currently hovering over this link. Use this value to initialize your component when this boolean is true for the first time, using `componentDidUpdate` or `useEffect`.\n registerLinkTooltipComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('LinkTooltip', this.id, component);\n });\n\n // Register a component fixed to the bottom of the create new channel modal and also registers a callback function to be called after\n // the channel has been succesfully created\n // Accepts a React component. Returns a unique identifier.\n registerActionAfterChannelCreation = reArg(['component', 'action'], ({component, action}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'CreateBoardFromTemplate',\n data: {\n id,\n pluginId: this.id,\n component,\n action,\n },\n });\n\n return id;\n });\n\n // Add a button to the channel header. If there are more than one buttons registered by any\n // plugin, a dropdown menu is created to contain all the plugin buttons.\n // Accepts the following:\n // - icon - React element to use as the button's icon\n // - action - a function called when the button is clicked, passed the channel and channel member as arguments\n // - dropdownText - string or React element shown for the dropdown button description\n // - tooltipText - string or React element shown for tooltip appear on hover\n registerChannelHeaderButtonAction = reArg([\n 'icon',\n 'action',\n 'dropdownText',\n 'tooltipText',\n ], ({\n icon,\n action,\n dropdownText,\n tooltipText,\n }: {\n icon: ReactResolvable;\n action: PluginComponent['action'];\n dropdownText: ReactResolvable;\n tooltipText: ReactResolvable;\n }) => {\n const id = generateId();\n\n const data = {\n id,\n pluginId: this.id,\n icon: resolveReactElement(icon),\n action,\n dropdownText: resolveReactElement(dropdownText),\n tooltipText: resolveReactElement(tooltipText),\n };\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'ChannelHeaderButton',\n data,\n });\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'MobileChannelHeaderButton',\n data,\n });\n\n return id;\n });\n\n // Add a button to the channel intro message.\n // Accepts the following:\n // - icon - React element to use as the button's icon\n // - action - a function called when the button is clicked, passed the channel and channel member as arguments\n // - text - a localized string or React element to use as the button's text\n registerChannelIntroButtonAction = reArg([\n 'icon',\n 'action',\n 'text',\n ], ({\n icon,\n action,\n text,\n }: {\n icon: ReactResolvable;\n action: PluginComponent['action'];\n text: ReactResolvable;\n }) => {\n const id = generateId();\n\n const data = {\n id,\n pluginId: this.id,\n icon: resolveReactElement(icon),\n action,\n text,\n };\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'ChannelIntroButton',\n data,\n });\n\n return id;\n });\n\n // Add a \"call button\" to the channel header. If there is more than one button registered by any\n // plugin, a dropdown menu is created to contain all the call plugin buttons.\n // Accepts the following:\n // - button - A React element to use as the main button to be displayed in case of a single registration.\n // - dropdownButton -A React element to use as the dropdown button to be displayed in case of multiple registrations.\n // - action - A function called when the button is clicked, passed the channel and channel member as arguments.\n // Returns an unique identifier\n // Minimum required version: 6.5\n registerCallButtonAction = reArg([\n 'button',\n 'dropdownButton',\n 'action',\n ], ({\n button,\n dropdownButton,\n action,\n }: {\n button: ReactResolvable;\n dropdownButton: ReactResolvable;\n action: (currentChannel: Channel, myCurrentChannelMembership: ChannelMembership) => void;\n }) => {\n const id = generateId();\n\n const data = {\n id,\n pluginId: this.id,\n button: resolveReactElement(button),\n dropdownButton: resolveReactElement(dropdownButton),\n action,\n };\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'CallButton',\n data,\n });\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'MobileChannelHeaderButton',\n data,\n });\n\n return id;\n });\n\n // Register a component to render a custom body for posts with a specific type.\n // Custom post types must be prefixed with 'custom_'.\n // Custom post types can also apply for ephemeral posts.\n // Accepts a string type and a component.\n // Returns a unique identifier.\n registerPostTypeComponent = reArg(['type', 'component'], ({type, component}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_POST_COMPONENT,\n data: {\n id,\n pluginId: this.id,\n type,\n component,\n },\n });\n\n return id;\n });\n\n // Register a component to render a custom body for post cards with a specific type.\n // Custom post types must be prefixed with 'custom_'.\n // Accepts a string type and a component.\n // Returns a unique identifier.\n registerPostCardTypeComponent = reArg(['type', 'component'], ({type, component}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_POST_CARD_COMPONENT,\n data: {\n id,\n pluginId: this.id,\n type,\n component,\n },\n });\n\n return id;\n });\n\n // Register a component to render a custom embed preview for post links.\n // Accepts the following:\n // - match - A function that receives the embed object and returns a\n // boolean indicating if the plugin is able to process it.\n // The embed object contains the embed `type`, the `url` of the post link\n // and in some cases, a `data` object with information related to the\n // link (the opengraph or the image details, for example).\n // - component - The component that renders the embed view for the link\n // - toggleable - A boolean indicating if the embed view should be collapsable\n // Returns a unique identifier.\n registerPostWillRenderEmbedComponent = reArg(['match', 'component', 'toggleable'], ({match, component, toggleable}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'PostWillRenderEmbedComponent',\n data: {\n id,\n pluginId: this.id,\n component,\n match,\n toggleable,\n },\n });\n\n return id;\n });\n\n // Register a main menu list item by providing some text and an action function.\n // Accepts the following:\n // - text - A string or React element to display in the menu\n // - action - A function to trigger when component is clicked on\n // - mobileIcon - A React element to display as the icon in the menu in mobile view\n // Returns a unique identifier.\n registerMainMenuAction = reArg([\n 'text',\n 'action',\n 'mobileIcon',\n ], ({\n text,\n action,\n mobileIcon,\n }: {\n text: ReactResolvable;\n action: PluginComponent['action'];\n mobileIcon: ReactResolvable;\n }) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'MainMenu',\n data: {\n id,\n pluginId: this.id,\n text: resolveReactElement(text),\n action,\n mobileIcon: resolveReactElement(mobileIcon),\n },\n });\n\n return id;\n });\n\n // Register a channel menu list item by providing some text and an action function.\n // Accepts the following:\n // - text - A string or React element to display in the menu\n // - action - A function that receives the channelId and is called when the menu items is clicked.\n // - shouldRender - A function that receives the state before the\n // component is about to render, allowing for conditional rendering.\n // Returns a unique identifier.\n registerChannelHeaderMenuAction = reArg([\n 'text',\n 'action',\n 'shouldRender',\n ], ({\n text,\n action,\n shouldRender = defaultShouldRender,\n }: {\n text: ReactResolvable;\n action: PluginComponent['action'];\n shouldRender?: (state: GlobalState) => boolean;\n }) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'ChannelHeader',\n data: {\n id,\n pluginId: this.id,\n text: resolveReactElement(text),\n action,\n shouldRender,\n },\n });\n\n return id;\n });\n\n // Register a files dropdown list item by providing some text and an action function.\n // Accepts the following:\n // - match - A function that receives the fileInfo and returns a boolean indicating if the plugin is able to process it.\n // - text - A string or React element to display in the menu\n // - action - A function that receives the fileInfo and is called when the menu items is clicked.\n // Returns a unique identifier.\n registerFileDropdownMenuAction = reArg([\n 'match',\n 'text',\n 'action',\n ], ({\n match,\n text,\n action,\n }: {\n match: (fileInfo: FileInfo) => boolean;\n text: ReactResolvable;\n action: PluginComponent['action'];\n }) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'FilesDropdown',\n data: {\n id,\n pluginId: this.id,\n match,\n text: resolveReactElement(text),\n action,\n },\n });\n\n return id;\n });\n\n // Register a user guide dropdown list item by providing some text and an action function.\n // Accepts the following:\n // - text - A string or React element to display in the menu\n // - action - A function that receives the fileInfo and is called when the menu items is clicked.\n // Returns a unique identifier.\n registerUserGuideDropdownMenuAction = reArg([\n 'text',\n 'action',\n ], ({\n text,\n action,\n }: {\n text: ReactResolvable;\n action: PluginComponent['action'];\n }) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'UserGuideDropdown',\n data: {\n id,\n pluginId: this.id,\n text: resolveReactElement(text),\n action,\n },\n });\n\n return id;\n });\n\n // Register a component to the add to the post message menu shown on hover.\n // Accepts a React component. Returns a unique identifier.\n registerPostActionComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('PostAction', this.id, component);\n });\n\n // Register a component to the add to the post text editor menu.\n // Accepts a React component. Returns a unique identifier.\n registerPostEditorActionComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('PostEditorAction', this.id, component);\n });\n\n // Register a component to the add to the code block header.\n // Accepts a React component. Returns a unique identifier.\n registerCodeBlockActionComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('CodeBlockAction', this.id, component);\n });\n\n // Register a component to the add to the new messages separator.\n // Accepts a React component. Returns a unique identifier.\n registerNewMessagesSeparatorActionComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('NewMessagesSeparatorAction', this.id, component);\n });\n\n // Register a post menu list item by providing some text and an action function.\n // Accepts the following:\n // - text - A string or React element to display in the menu\n // - action - A function to trigger when component is clicked on\n // - filter - A function whether to apply the plugin into the post' dropdown menu\n // Returns a unique identifier.\n registerPostDropdownMenuAction = reArg([\n 'text',\n 'action',\n 'filter',\n ], ({\n text,\n action,\n filter,\n }: {\n text: ReactResolvable;\n action: PluginComponent['action'];\n filter: PluginComponent['filter'];\n }) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'PostDropdownMenu',\n data: {\n id,\n pluginId: this.id,\n text: resolveReactElement(text),\n action,\n filter,\n },\n });\n\n return id;\n });\n\n // Register a post sub menu list item by providing some text and an action function.\n // Accepts the following:\n // - text - A string or React element to display in the menu\n // - action - A function to trigger when component is clicked on\n // - filter - A function whether to apply the plugin into the post' dropdown menu\n //\n // Returns a unique identifier for the root submenu, and a function to register submenu items.\n // At this time, only one level of nesting is allowed to avoid rendering issue in the RHS.\n registerPostDropdownSubMenuAction = reArg([\n 'text',\n 'action',\n 'filter',\n ], ({\n text,\n action,\n filter,\n }: {\n text: ReactResolvable;\n action: PluginComponent['action'];\n filter: PluginComponent['filter'];\n }) => {\n const id = generateId();\n\n const registerMenuItem = (\n pluginId: string,\n id: string,\n parentMenuId: string | null,\n innerText: ReactResolvable,\n innerAction: PluginComponent['action'],\n innerFilter: PluginComponent['filter'],\n ) => {\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'PostDropdownMenu',\n data: {\n id,\n parentMenuId,\n pluginId,\n text: resolveReactElement(innerText),\n subMenu: [],\n action: innerAction,\n filter: innerFilter,\n },\n });\n\n type TInnerParams = [\n innerText: ReactResolvable,\n innerAction: PluginComponent['action'],\n innerFilter: PluginComponent['filter'],\n ];\n\n return function registerSubMenuItem(...args: TInnerParams) {\n if (parentMenuId) {\n throw new Error('Submenus are currently limited to a single level.');\n }\n\n return registerMenuItem(pluginId, generateId(), id, ...args);\n };\n };\n\n return {id, rootRegisterMenuItem: registerMenuItem(this.id, id, null, text, action, filter)};\n });\n\n // Register a component at the bottom of the post dropdown menu.\n // Accepts a React component. Returns a unique identifier.\n registerPostDropdownMenuComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('PostDropdownMenuItem', this.id, component);\n });\n\n // Register a file upload method by providing some text, an icon, and an action function.\n // Accepts the following:\n // - icon - JSX element to use as the button's icon\n // - text - A string or JSX element to display in the file upload menu\n // - action - A function to trigger when the menu item is selected.\n // Returns a unique identifier.\n registerFileUploadMethod = reArg([\n 'icon',\n 'action',\n 'text',\n ], ({\n icon,\n action,\n text,\n }: {\n icon: ReactResolvable;\n action: PluginComponent['action'];\n text: ReactResolvable;\n }) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'FileUploadMethod',\n data: {\n id,\n pluginId: this.id,\n text,\n action,\n icon,\n },\n });\n\n return id;\n });\n\n // Register a hook to intercept file uploads before they take place.\n // Accepts a function to run before files get uploaded. Receives an array of\n // files and a function to upload files at a later time as arguments. Must\n // return an object that can contain two properties:\n // - message - An error message to display, leave blank or null to display no message\n // - files - Modified array of files to upload, set to null to reject all files\n // Returns a unique identifier.\n registerFilesWillUploadHook = reArg(['hook'], ({hook}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'FilesWillUploadHook',\n data: {\n id,\n pluginId: this.id,\n hook,\n },\n });\n\n return id;\n });\n\n // Unregister a component, action or hook using the unique identifier returned after registration.\n // Accepts a string id.\n // Returns undefined in all cases.\n unregisterComponent = reArg(['componentId'], ({componentId}: {componentId: string}) => {\n store.dispatch({\n type: ActionTypes.REMOVED_PLUGIN_COMPONENT,\n id: componentId,\n });\n });\n\n // Unregister a component that provided a custom body for posts with a specific type.\n // Accepts a string id.\n // Returns undefined in all cases.\n unregisterPostTypeComponent = reArg(['componentId'], ({componentId}: {componentId: string}) => {\n store.dispatch({\n type: ActionTypes.REMOVED_PLUGIN_POST_COMPONENT,\n id: componentId,\n });\n });\n\n // Register a reducer against the Redux store. It will be accessible in redux state\n // under \"state['plugins-<yourpluginid>']\"\n // Accepts a reducer. Returns undefined.\n registerReducer = reArg(['reducer'], ({reducer}: {reducer: Reducer}) => {\n reducerRegistry.register('plugins-' + this.id, reducer);\n });\n\n // Register a handler for WebSocket events.\n // Accepts the following:\n // - event - the event type, can be a regular server event or an event from plugins.\n // Plugin events will have \"custom_<pluginid>_\" prepended\n // - handler - a function to handle the event, receives the event message as an argument\n // Returns undefined.\n registerWebSocketEventHandler = reArg(['event', 'handler'], ({event, handler}) => {\n registerPluginWebSocketEvent(this.id, event, handler);\n });\n\n // Unregister a handler for a custom WebSocket event.\n // Accepts a string event type.\n // Returns undefined.\n unregisterWebSocketEventHandler = reArg(['event'], ({event}) => {\n unregisterPluginWebSocketEvent(this.id, event);\n });\n\n // Register a handler that will be called when the app reconnects to the\n // internet after previously disconnecting.\n // Accepts a function to handle the event. Returns undefined.\n registerReconnectHandler = reArg(['handler'], ({handler}) => {\n registerPluginReconnectHandler(this.id, handler);\n });\n\n // Unregister a previously registered reconnect handler.\n // Returns undefined.\n unregisterReconnectHandler() {\n unregisterPluginReconnectHandler(this.id);\n }\n\n // Register a hook that will be called when a message is posted by the user before it\n // is sent to the server. Accepts a function that receives the post as an argument.\n //\n // To reject a post, return an object containing an error such as\n // {error: {message: 'Rejected'}}\n // To modify or allow the post without modification, return an object containing the post\n // such as\n // {post: {...}}\n //\n // If the hook function is asynchronous, the message will not be sent to the server\n // until the hook returns.\n registerMessageWillBePostedHook = reArg(['hook'], ({hook}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'MessageWillBePosted',\n data: {\n id,\n pluginId: this.id,\n hook,\n },\n });\n\n return id;\n });\n\n // Register a hook that will be called when a slash command is posted by the user before it\n // is sent to the server. Accepts a function that receives the message (string) and the args\n // (object) as arguments.\n // The args object is:\n // {\n // channel_id: channelId,\n // team_id: teamId,\n // root_id: rootId,\n // }\n //\n // To reject a command, return an object containing an error:\n // {error: {message: 'Rejected'}}\n // To ignore a command, return an empty object (to prevent an error from being displayed):\n // {}\n // To modify or allow the command without modification, return an object containing the new message\n // and args. It is not likely that you will need to change the args, so return the object that was provided:\n // {message: {...}, args}\n //\n // If the hook function is asynchronous, the command will not be sent to the server\n // until the hook returns.\n registerSlashCommandWillBePostedHook = reArg(['hook'], ({hook}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'SlashCommandWillBePosted',\n data: {\n id,\n pluginId: this.id,\n hook,\n },\n });\n\n return id;\n });\n\n // Register a hook that will be called before a message is formatted into Markdown.\n // Accepts a function that receives the unmodified post and the message (potentially\n // already modified by other hooks) as arguments. This function must return a string\n // message that will be formatted.\n // Returns a unique identifier.\n registerMessageWillFormatHook = reArg(['hook'], ({hook}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'MessageWillFormat',\n data: {\n id,\n pluginId: this.id,\n hook,\n },\n });\n\n return id;\n });\n\n // Register a component to override file previews. Accepts a function to run before file is\n // previewed and a react component to be rendered as the file preview.\n // - override - A function to check whether preview needs to be overridden. Receives fileInfo and post as arguments.\n // Returns true is preview should be overridden and false otherwise.\n // - component - A react component to display instead of original preview. Receives fileInfo and post as props.\n // Returns a unique identifier.\n // Only one plugin can override a file preview at a time. If two plugins try to override the same file preview, the first plugin will perform the override and the second will not. Plugin precedence is ordered alphabetically by plugin ID.\n registerFilePreviewComponent = reArg(['override', 'component'], ({override, component}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'FilePreview',\n data: {\n id,\n pluginId: this.id,\n override,\n component,\n },\n });\n\n return id;\n });\n\n registerTranslations = reArg(['getTranslationsForLocale'], ({getTranslationsForLocale}: {getTranslationsForLocale: TranslationPluginFunction}) => {\n store.dispatch(registerPluginTranslationsSource(this.id, getTranslationsForLocale));\n });\n\n // Register a admin console definitions override function\n // Note that this is a low-level interface primarily meant for internal use, and is not subject\n // to semver guarantees. It may change in the future.\n // Accepts the following:\n // - func - A function that recieve the admin console config definitions and return a new\n // version of it, which is used for build the admin console.\n // Each plugin can register at most one admin console plugin function, with newer registrations\n // replacing older ones.\n registerAdminConsolePlugin = reArg(['func'], ({func}) => {\n store.dispatch(registerAdminConsolePlugin(this.id, func));\n });\n\n // Unregister a previously registered admin console definition override function.\n // Returns undefined.\n unregisterAdminConsolePlugin() {\n store.dispatch(unregisterAdminConsolePlugin(this.id));\n }\n\n // Register a custom React component to manage the plugin configuration for the given setting key.\n // Accepts the following:\n // - key - A key specified in the settings_schema.settings block of the plugin's manifest.\n // - component - A react component to render in place of the default handling.\n // - options - Object for the following available options to display the setting:\n // showTitle - Optional boolean that if true the display_name of the setting will be rendered\n // on the left column of the settings page and the registered component will be displayed on the\n // available space in the right column.\n registerAdminConsoleCustomSetting = reArg([\n 'key',\n 'component',\n 'options',\n ], ({\n key,\n component,\n options: {showTitle} = {showTitle: false},\n }: {\n key: string;\n component: PluginComponent['component'];\n options?: {showTitle: boolean};\n }) => {\n store.dispatch(registerAdminConsoleCustomSetting(this.id, key, component, {showTitle}));\n });\n\n // Register a custom React component to render as a section in the plugin configuration page.\n // Accepts the following:\n // - key - A key specified in the settings_schema.sections block of the plugin's manifest.\n // - component - A react component to render in place of the default handling.\n registerAdminConsoleCustomSection = reArg([\n 'key',\n 'component',\n ], ({\n key,\n component,\n }: {\n key: string;\n component: PluginComponent['component'];\n }) => {\n store.dispatch(registerAdminConsoleCustomSection(this.id, key, component));\n });\n\n // Register a Right-Hand Sidebar component by providing a title for the right hand component.\n // Accepts the following:\n // - component - A react component to display in the Right-Hand Sidebar.\n // - title - A string or JSX element to display as a title for the RHS.\n // Returns:\n // - id: a unique identifier\n // - showRHSPlugin: the action to dispatch that will open the RHS.\n // - hideRHSPlugin: the action to dispatch that will close the RHS\n // - toggleRHSPlugin: the action to dispatch that will toggle the RHS\n registerRightHandSidebarComponent = reArg(['component', 'title'], ({component, title}: {component: PluginComponent['component']; title: ReactResolvable}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'RightHandSidebarComponent',\n data: {\n id,\n pluginId: this.id,\n component,\n title: resolveReactElement(title),\n },\n });\n\n return {id, showRHSPlugin: showRHSPlugin(id), hideRHSPlugin: hideRHSPlugin(id), toggleRHSPlugin: toggleRHSPlugin(id)};\n });\n\n // Register a Needs Team component by providing a route past /:team/:pluginId/ to be displayed at.\n // Accepts the following:\n // - route - The route to be displayed at.\n // - component - A react component to display.\n // Returns:\n // - id: a unique identifier\n registerNeedsTeamRoute = reArg([\n 'route',\n 'component',\n ], ({\n route,\n component,\n }: {\n route: string;\n component: NeedsTeamComponent['component'];\n }) => {\n const id = generateId();\n let fixedRoute = standardizeRoute(route);\n fixedRoute = this.id + '/' + fixedRoute;\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'NeedsTeamComponent',\n data: {\n id,\n pluginId: this.id,\n component,\n route: fixedRoute,\n },\n });\n\n return id;\n });\n\n /**\n * Register a component to be displayed at a custom route under /plug/:pluginId\n * Accepts the following:\n * - route - The route to be displayed at.\n * - component - A react component to display.\n * @remarks you must specify a `grid-area` (recommended: `grid-area: center`) for `component` using CSS in order to be placed properly in the root layout\n * @returns a unique identifier\n */\n registerCustomRoute = reArg([\n 'route',\n 'component',\n ], ({\n route,\n component,\n }: {\n route: string;\n component: PluginComponent['component'];\n }) => {\n const id = generateId();\n let fixedRoute = standardizeRoute(route);\n fixedRoute = this.id + '/' + fixedRoute;\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'CustomRouteComponent',\n data: {\n id,\n pluginId: this.id,\n component,\n route: fixedRoute,\n },\n });\n\n return id;\n });\n\n /**\n * INTERNAL: Subject to change without notice.\n * Register a Product, consisting of a global header menu item, mainComponent, and other pluggables.\n * @remarks DANGER: Interferes with historic routes.\n * @see {@link ProductComponent}\n * @returns {string}\n */\n registerProduct = reArg([\n 'baseURL',\n 'switcherIcon',\n 'switcherText',\n 'switcherLinkURL',\n 'mainComponent',\n 'headerCentreComponent',\n 'headerRightComponent',\n 'showTeamSidebar',\n 'showAppBar',\n 'wrapped',\n 'publicComponent',\n ], ({\n baseURL,\n switcherIcon,\n switcherText,\n switcherLinkURL,\n mainComponent,\n headerCentreComponent = () => null,\n headerRightComponent = () => null,\n showTeamSidebar = false,\n showAppBar = false,\n wrapped = true,\n publicComponent,\n }: Omit<ProductComponent, 'id' | 'pluginId'>) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'Product',\n data: {\n id,\n pluginId: this.id,\n switcherIcon,\n switcherText: resolveReactElement(switcherText),\n baseURL: '/' + standardizeRoute(baseURL),\n switcherLinkURL: '/' + standardizeRoute(switcherLinkURL),\n mainComponent,\n headerCentreComponent,\n headerRightComponent,\n showTeamSidebar,\n showAppBar,\n wrapped,\n publicComponent,\n },\n });\n\n return id;\n });\n\n // Register a hook that will be called when a message is edited by the user before it\n // is sent to the server. Accepts a function that receives the post as an argument.\n //\n // To reject a post, return an object containing an error such as\n // {error: {message: 'Rejected'}}\n // To modify or allow the post without modification, return an object containing the post\n // such as\n // {post: {...}}\n //\n // If the hook function is asynchronous, the message will not be sent to the server\n // until the hook returns.\n registerMessageWillBeUpdatedHook = reArg(['hook'], ({hook}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'MessageWillBeUpdated',\n data: {\n id,\n pluginId: this.id,\n hook,\n },\n });\n\n return id;\n });\n\n // INTERNAL: Subject to change without notice.\n // Register a component to render in the LHS next to a channel's link label.\n // All parameters are required.\n // Returns a unique identifier.\n registerSidebarChannelLinkLabelComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('SidebarChannelLinkLabel', this.id, component);\n });\n\n // INTERNAL: Subject to change without notice.\n // Register a component to render in channel's center view, in place of a channel toast.\n // All parameters are required.\n // Returns a unique identifier.\n registerChannelToastComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('ChannelToast', this.id, component);\n });\n\n // INTERNAL: Subject to change without notice.\n // Register a global component at the root of the app that survives across product switches.\n // All parameters are required.\n // Returns a unique identifier.\n registerGlobalComponent = reArg(['component'], ({component}: DPluginComponentProp) => {\n return dispatchPluginComponentAction('Global', this.id, component);\n });\n\n /**\n * INTERNAL: Subject to change without notice.\n * Add an item to the App Bar.\n * @param {string} iconUrl resolvable URL to use as the button's icon.\n * @param {PluginComponent['action'] | undefined} action called when the button is clicked, passed the channel and channel member as arguments.\n * @param {React.ReactNode} tooltipText string or React element shown for tooltip appear on hover.\n * @param {null | string | Array<null | string>} supportedProductIds specifies one or multiple product identifier(s),\n * identifiers can either be the \"real\" product uuid, or a product's more commonly accessible plugin id, or '*' to match everything.\n * @param {PluginComponent['component'] | undefined} rhsComponent an optional corresponding RHS component. If provided, its toggler is automatically wired to the action.\n * @param {ReactResolvable | undefined} rhsTitle the corresponding RHS component's title.\n * @returns {string} unique identifier\n */\n registerAppBarComponent = reArg([\n 'iconUrl',\n 'action',\n 'tooltipText',\n 'supportedProductIds',\n 'rhsComponent',\n 'rhsTitle',\n ], ({\n iconUrl,\n action,\n tooltipText,\n supportedProductIds = null,\n rhsComponent,\n rhsTitle,\n }: {\n iconUrl: string;\n tooltipText: ReactResolvable;\n supportedProductIds: ProductScope;\n } & ({\n action: PluginComponent['action'];\n rhsComponent?: never;\n rhsTitle?: never;\n } | {\n action?: never;\n rhsComponent: PluginComponent;\n rhsTitle: ReactResolvable;\n })) => {\n const id = generateId();\n\n const registeredRhsComponent = rhsComponent && this.registerRightHandSidebarComponent({title: rhsTitle, component: rhsComponent});\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'AppBar',\n data: {\n id,\n pluginId: this.id,\n iconUrl,\n tooltipText: resolveReactElement(tooltipText),\n supportedProductIds,\n ...registeredRhsComponent ? {\n action: () => store.dispatch(registeredRhsComponent.toggleRHSPlugin),\n rhsComponentId: registeredRhsComponent.id,\n } : {\n action,\n },\n },\n });\n\n return registeredRhsComponent ? {id, rhsComponent: registeredRhsComponent} : id;\n });\n\n // INTERNAL: Subject to change without notice.\n // Register a handler to retrieve stats that will be displayed on the system console\n // Accepts the following:\n // - handler - Func to be called to retrieve the stats from plugin api. It must be type PluginSiteStatsHandler.\n // Returns undefined\n registerSiteStatisticsHandler = reArg(['handler'], ({handler}) => {\n const data = {\n pluginId: this.id,\n handler,\n };\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_STATS_HANDLER,\n data,\n });\n });\n\n // Register a hook to intercept desktop notifications before they occur.\n // Accepts a function to run before the desktop notification is triggered.\n // The function has the following signature:\n // (post: Post, msgProps: NewPostMessageProps, channel: Channel,\n // teamId: string, args: DesktopNotificationArgs) => Promise<{\n // error?: string;\n // args?: DesktopNotificationArgs;\n // }>)\n //\n // DesktopNotificationArgs is the following type:\n // export type DesktopNotificationArgs = {\n // title: string;\n // body: string;\n // silent: boolean;\n // soundName: string;\n // url: string;\n // notify: boolean;\n // };\n //\n // To stop a desktop notification and allow subsequent hooks to process the notification, return:\n // {args: {...args, notify: false}}\n // To enable a desktop notification and allow subsequent hooks to process the notification, return:\n // {args: {...args, notify: true}}\n // To stop a desktop notification and prevent subsequent hooks from processing the notification, return either:\n // {error: 'log this error'}, or {}\n // To allow subsequent hooks to process the notification, return:\n // {args}, or null or undefined (thanks js)\n //\n // The args returned by the hook will be used as the args for the next hook, until all hooks are\n // completed. The resulting args will be used as the arguments for the `notifyMe` function.\n //\n // Returns a unique identifier.\n registerDesktopNotificationHook = reArg(['hook'], ({hook}) => {\n const id = generateId();\n\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_COMPONENT,\n name: 'DesktopNotificationHooks',\n data: {\n id,\n pluginId: this.id,\n hook,\n },\n });\n\n return id;\n });\n\n // Register a schema for user settings. This will show in the user settings modals\n // and all values will be stored in the preferences with cateogry pp_${pluginId} and\n // the name of the setting.\n //\n // The settings definition can be found in /src/types/plugins/user_settings.ts\n //\n // Malformed settings will be filtered out.\n registerUserSettings = reArg(['setting'], ({setting}) => {\n const data = {\n pluginId: this.id,\n setting,\n };\n store.dispatch({\n type: ActionTypes.RECEIVED_PLUGIN_USER_SETTINGS,\n data,\n });\n });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport semver from 'semver';\n\nimport type {CallsConfig, UserSessionState} from '@mattermost/calls-common/lib/types';\n\nimport {suitePluginIds} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nconst CALLS_PLUGIN = `plugins-${suitePluginIds.calls}`;\n\nexport function isCallsEnabled(state: GlobalState, minVersion = '0.4.2') {\n return Boolean(state.plugins.plugins[suitePluginIds.calls] &&\n semver.gte(String(semver.clean(state.plugins.plugins[suitePluginIds.calls].version || '0.0.0')), minVersion));\n}\n\n// isCallsRingingEnabledOnServer is the flag for the ringing/notification feature in calls\nexport function isCallsRingingEnabledOnServer(state: GlobalState) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return Boolean(state[CALLS_PLUGIN]?.callsConfig?.EnableRinging);\n}\n\nexport function getSessionsInCalls(state: GlobalState): Record<string, Record<string, UserSessionState>> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return state[CALLS_PLUGIN]?.sessions || {};\n}\n\nexport function getCallsConfig(state: GlobalState): CallsConfig {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return state[CALLS_PLUGIN]?.callsConfig;\n}\n\nexport function getCallsChannelState(state: GlobalState, channelId: string): {enabled?: boolean} {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (!state[CALLS_PLUGIN] || !state[CALLS_PLUGIN].channels) {\n return {};\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return state[CALLS_PLUGIN].channels[channelId] || {};\n}\n\nexport function callsChannelExplicitlyEnabled(state: GlobalState, channelId: string) {\n return Boolean(getCallsChannelState(state, channelId).enabled);\n}\n\nexport function callsChannelExplicitlyDisabled(state: GlobalState, channelId: string) {\n const enabled = getCallsChannelState(state, channelId).enabled;\n return (typeof enabled !== 'undefined') && !enabled;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getCurrentTeamId, getTeamByName} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport localStorageStore from 'stores/local_storage_store';\n\n// getLastViewedChannelName combines data from the Redux store and localStorage to return the\n// previously selected channel name, returning the default channel if none exists.\n//\n// See LocalStorageStore for context.\nexport const getLastViewedChannelName = (state: GlobalState) => {\n const userId = getCurrentUserId(state);\n const teamId = getCurrentTeamId(state);\n\n return localStorageStore.getPreviousChannelName(userId, teamId);\n};\n\nexport const getPenultimateViewedChannelName = (state: GlobalState) => {\n const userId = getCurrentUserId(state);\n const teamId = getCurrentTeamId(state);\n\n return localStorageStore.getPenultimateChannelName(userId, teamId);\n};\n\n// getLastViewedChannelNameByTeamName combines data from the Redux store and localStorage to return\n// the url to the previously selected channel, returning the path to the default channel if none\n// exists.\n//\n// See LocalStorageStore for context.\nexport const getLastViewedChannelNameByTeamName = (state: GlobalState, teamName: string) => {\n const userId = getCurrentUserId(state);\n const team = getTeamByName(state, teamName);\n const teamId = team && team.id;\n\n return localStorageStore.getPreviousChannelName(userId, teamId || '');\n};\n\nexport const getLastViewedTypeByTeamName = (state: GlobalState, teamName: string) => {\n const userId = getCurrentUserId(state);\n const team = getTeamByName(state, teamName);\n const teamId = team && team.id;\n\n return localStorageStore.getPreviousViewedType(userId, teamId || '');\n};\n\nexport const getPreviousTeamId = (state: GlobalState) => {\n const userId = getCurrentUserId(state);\n\n return localStorageStore.getPreviousTeamId(userId);\n};\n\nexport const getPreviousTeamLastViewedType = (state: GlobalState) => {\n const previousTeamID = getPreviousTeamId(state);\n const userId = getCurrentUserId(state);\n\n return localStorageStore.getPreviousViewedType(userId, previousTeamID || '', state);\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {get as getString, getBool, makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser, isFirstAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {OnboardingTaskCategory, OnboardingTaskList} from 'components/onboarding_tasks';\n\nimport {RecommendedNextStepsLegacy, Preferences} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nexport function getFirstChannelName(state: GlobalState) {\n return getString(state, Preferences.AB_TEST_PREFERENCE_VALUE, RecommendedNextStepsLegacy.CREATE_FIRST_CHANNEL, '');\n}\n\nexport function getShowLaunchingWorkspace(state: GlobalState) {\n return state.views.modals.showLaunchingWorkspace;\n}\n\n// Legacy nextSteps section used to determine when to hide the onboarding to end users who have already completed/unfinished it\nexport type StepType = {\n id: string;\n\n // An array of all roles a user must have in order to see the step e.g. admins are both system_admin and system_user\n // so you would require ['system_admin','system_user'] to match.\n // to show step for all roles, leave the roles array blank.\n // for a step that must be shown only to the first admin, add the first_admin role to that step\n roles: string[];\n};\n\nexport const Steps: StepType[] = [\n {\n id: RecommendedNextStepsLegacy.COMPLETE_PROFILE,\n roles: [],\n },\n {\n id: RecommendedNextStepsLegacy.TEAM_SETUP,\n roles: ['first_admin'],\n },\n {\n id: RecommendedNextStepsLegacy.NOTIFICATION_SETUP,\n roles: ['system_user'],\n },\n {\n id: RecommendedNextStepsLegacy.PREFERENCES_SETUP,\n roles: ['system_user'],\n },\n {\n id: RecommendedNextStepsLegacy.INVITE_MEMBERS,\n roles: ['system_admin', 'system_user'],\n },\n {\n id: RecommendedNextStepsLegacy.DOWNLOAD_APPS,\n roles: [],\n },\n];\n\n// Filter the steps shown by checking if our user has any of the required roles for that step\nexport function isStepForUser(step: StepType, roles: string): boolean {\n const userRoles = roles?.split(' ');\n return (\n userRoles?.some((role) => step.roles.includes(role)) ||\n step.roles.length === 0\n );\n}\n\nconst getSteps = createSelector(\n 'getSteps',\n (state: GlobalState) => getCurrentUser(state),\n (state: GlobalState) => isFirstAdmin(state),\n (currentUser, firstAdmin) => {\n const roles = firstAdmin ? `first_admin ${currentUser?.roles}` : currentUser?.roles;\n return Steps.filter((step) => isStepForUser(step, roles));\n },\n);\n\nconst getNextStepsPreferences = makeGetCategory('getNextStepsPreferences', Preferences.RECOMMENDED_NEXT_STEPS);\nexport const getOnboardingTaskPreferences = makeGetCategory('getOnboardingTaskPreferences', OnboardingTaskCategory);\n\n// Loop through all Steps. For each step, check that\nexport const legacyNextStepsNotFinished = createSelector(\n 'legacyNextStepsNotFinished',\n getNextStepsPreferences,\n (state: GlobalState) => getCurrentUser(state),\n (state: GlobalState) => isFirstAdmin(state),\n (state: GlobalState) => getSteps(state),\n (stepPreferences, currentUser, firstAdmin, mySteps) => {\n const roles = firstAdmin ? `first_admin ${currentUser?.roles}` : currentUser?.roles;\n const checkPref = (step: StepType) => stepPreferences.some((pref) => (pref.name === step.id && pref.value === 'true') || !isStepForUser(step, roles));\n return !mySteps.every(checkPref);\n },\n);\n\n// Loop through all Steps. For each step, check that\nexport const hasLegacyNextStepsPreferences = createSelector(\n 'hasLegacyNextStepsPreferences',\n getNextStepsPreferences,\n (state: GlobalState) => getSteps(state),\n (stepPreferences, mySteps) => {\n const checkPref = (step: StepType) => stepPreferences.some((pref) => (pref.name === step.id));\n return mySteps.some(checkPref);\n },\n);\n\nexport const getShowTaskListBool = createSelector(\n 'getShowTaskListBool',\n getOnboardingTaskPreferences,\n getNextStepsPreferences,\n getIsMobileView,\n (state: GlobalState) => getBool(state, OnboardingTaskCategory, OnboardingTaskList.ONBOARDING_TASK_LIST_SHOW),\n (state: GlobalState) => hasLegacyNextStepsPreferences(state),\n (onboardingPreferences, legacyStepsPreferences, isMobileView, taskListStatus, hasAnyOfTheLegacyStepsPreferences) => {\n // conditions to validate scenario where users (initially first_admins) had already set any of the onboarding task list preferences values.\n // We check wether the preference value exists meaning the onboarding tasks list already started no matter what the state of the process is\n const hasUserStartedOnboardingTaskListProcess = onboardingPreferences?.some((pref) =>\n pref.name === OnboardingTaskList.ONBOARDING_TASK_LIST_SHOW || pref.name === OnboardingTaskList.ONBOARDING_TASK_LIST_OPEN);\n\n if (hasUserStartedOnboardingTaskListProcess) {\n return [(taskListStatus && !isMobileView), false];\n }\n\n // validate is a new user that must do the first time onboarding by checking that:\n // 1. has not preferences related to the new onboarding task list.\n // 2. has no legacy skip preference\n // 3. has no legacy steps preferences\n // 4. has completed legacy next steps (hide value for recommended_next_steps category set to false)\n\n // This condition verifies existing users hasn't finished nor skipped legacy next steps or there are still steps not completed\n const hasSkipLegacyStepsPreference = legacyStepsPreferences.some((pref) => (pref.name === RecommendedNextStepsLegacy.SKIP));\n const hideLegacyStepsSetToFalse = legacyStepsPreferences.some((pref) => (pref.name === RecommendedNextStepsLegacy.HIDE && pref.value === 'false'));\n const areFirstUserPrefs = !hasSkipLegacyStepsPreference && hideLegacyStepsSetToFalse && !hasAnyOfTheLegacyStepsPreferences;\n\n const completelyNewUserForOnboarding = !hasUserStartedOnboardingTaskListProcess && areFirstUserPrefs;\n\n if (completelyNewUserForOnboarding) {\n return [(!isMobileView), true];\n }\n\n // If none of the previous conditions matched, then it is an existing user with legacy prefs.\n // To determine if we show the new onboarding task list we need to validate:\n // has not skipped nor completed the legacy steps\n const hasSkippedLegacySteps = legacyStepsPreferences.some((pref) => (pref.name === RecommendedNextStepsLegacy.SKIP && pref.value === 'true'));\n const hasCompletedLegacySteps = legacyStepsPreferences.some((pref) => (pref.name === RecommendedNextStepsLegacy.HIDE && pref.value === 'true'));\n\n const existingUserHasntFinishedNorSkippedLegacyNextSteps = !hasSkippedLegacySteps && !hasCompletedLegacySteps;\n\n const showTaskList = existingUserHasntFinishedNorSkippedLegacyNextSteps && !isMobileView;\n const firstTimeOnboarding = existingUserHasntFinishedNorSkippedLegacyNextSteps;\n\n return [showTaskList, firstTimeOnboarding];\n },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AppBinding} from '@mattermost/types/apps';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {appBarEnabled, getAppBarAppBindings} from 'mattermost-redux/selectors/entities/apps';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\nimport {createShallowSelector} from 'mattermost-redux/utils/helpers';\n\nimport type {GlobalState} from 'types/store';\nimport type {FileDropdownPluginComponent, PluginComponent} from 'types/store/plugins';\n\nexport const getPluginUserSettings = createSelector(\n 'getPluginUserSettings',\n (state: GlobalState) => state.plugins.userSettings,\n (settings) => {\n return settings || {};\n },\n);\n\nexport const getFilesDropdownPluginMenuItems = createSelector(\n 'getFilesDropdownPluginMenuItems',\n (state: GlobalState) => state.plugins.components.FilesDropdown,\n (components) => {\n return (components || []) as unknown as FileDropdownPluginComponent[];\n },\n);\n\nexport const getUserGuideDropdownPluginMenuItems = createSelector(\n 'getUserGuideDropdownPluginMenuItems',\n (state: GlobalState) => state.plugins.components.UserGuideDropdown,\n (components) => {\n return components;\n },\n);\n\nexport const getChannelHeaderPluginComponents = createSelector(\n 'getChannelHeaderPluginComponents',\n (state: GlobalState) => appBarEnabled(state),\n (state: GlobalState) => state.plugins.components.ChannelHeaderButton,\n (state: GlobalState) => state.plugins.components.AppBar,\n (enabled, channelHeaderComponents = [], appBarComponents = []) => {\n if (!enabled || !appBarComponents.length) {\n return channelHeaderComponents as unknown as PluginComponent[];\n }\n\n // Remove channel header icons for plugins that have also registered an app bar component\n const appBarPluginIds = appBarComponents.map((appBarComponent) => appBarComponent.pluginId);\n return channelHeaderComponents.filter((channelHeaderComponent) => !appBarPluginIds.includes(channelHeaderComponent.pluginId));\n },\n);\n\nconst getChannelHeaderMenuPluginComponentsShouldRender = createSelector(\n 'getChannelHeaderMenuPluginComponentsShouldRender',\n (state: GlobalState) => state,\n (state: GlobalState) => state.plugins.components.ChannelHeader,\n (state, channelHeaderMenuComponents = []) => {\n return channelHeaderMenuComponents.map((component) => {\n if (typeof component.shouldRender === 'function') {\n return component.shouldRender(state);\n }\n\n return true;\n });\n },\n);\n\nexport const getChannelHeaderMenuPluginComponents = createShallowSelector(\n 'getChannelHeaderMenuPluginComponents',\n getChannelHeaderMenuPluginComponentsShouldRender,\n (state: GlobalState) => state.plugins.components.ChannelHeader,\n (componentShouldRender = [], channelHeaderMenuComponents = []) => {\n return channelHeaderMenuComponents.filter((component, idx) => componentShouldRender[idx]);\n },\n);\n\nexport const getChannelIntroPluginButtons = createSelector(\n 'getChannelIntroPluginButtons',\n (state: GlobalState) => state.plugins.components.ChannelIntroButton,\n (components = []) => {\n return components;\n },\n);\n\nexport const getAppBarPluginComponents = createSelector(\n 'getAppBarPluginComponents',\n (state: GlobalState) => state.plugins.components.AppBar,\n (components = []) => {\n return components;\n },\n);\n\nexport const shouldShowAppBar = createSelector(\n 'shouldShowAppBar',\n appBarEnabled,\n getAppBarAppBindings,\n getAppBarPluginComponents,\n getChannelHeaderPluginComponents,\n (enabled: boolean, bindings: AppBinding[], appBarComponents: PluginComponent[], channelHeaderComponents) => {\n return enabled && Boolean(bindings.length || appBarComponents.length || channelHeaderComponents.length);\n },\n);\n\nexport function showNewChannelWithBoardPulsatingDot(state: GlobalState): boolean {\n const pulsatingDotState = get(state, Preferences.APP_BAR, Preferences.NEW_CHANNEL_WITH_BOARD_TOUR_SHOWED, '');\n const showPulsatingDot = pulsatingDotState !== '' && JSON.parse(pulsatingDotState)[Preferences.NEW_CHANNEL_WITH_BOARD_TOUR_SHOWED] === false;\n return showPulsatingDot;\n}\n\nexport const getSearchPluginSuggestions = createSelector(\n 'getSearchPluginSuggestions',\n getLicense,\n (state: GlobalState) => state.plugins.components.SearchSuggestions,\n (license, components = []) => {\n if (license.IsLicensed !== 'true') {\n return [];\n }\n return components;\n },\n);\n\nexport const getSearchBoxHints = createSelector(\n 'getSearchBoxHints',\n getLicense,\n (state: GlobalState) => state.plugins.components.SearchHints,\n (license, components = []) => {\n if (license.IsLicensed !== 'true') {\n return [];\n }\n return components;\n },\n);\n\nexport const getSearchButtons = createSelector(\n 'getSearchButtons',\n getLicense,\n (state: GlobalState) => state.plugins.components.SearchButtons,\n (license, components = []) => {\n if (license.IsLicensed !== 'true') {\n return [];\n }\n return components;\n },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ProductIdentifier} from '@mattermost/types/products';\n\nimport {getCurrentProduct} from 'utils/products';\n\nimport type {GlobalState} from 'types/store';\nimport type {ProductComponent} from 'types/store/plugins';\n\nexport function selectCurrentProduct(state: GlobalState, pathname: string): ProductComponent | null {\n return getCurrentProduct(selectProducts(state), pathname);\n}\n\nexport function selectCurrentProductId(state: GlobalState, pathname: string): ProductIdentifier {\n return selectCurrentProduct(state, pathname)?.id ?? null;\n}\n\nexport const selectProducts = (state: GlobalState) => state.plugins.components.Product;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function getNavigationBlocked(state: GlobalState) {\n return state.views.admin.navigationBlock.blocked;\n}\n\nexport function showNavigationPrompt(state: GlobalState) {\n return state.views.admin.navigationBlock.showNavigationPrompt;\n}\n\nexport function getOnNavigationConfirmed(state: GlobalState) {\n return state.views.admin.navigationBlock.onNavigationConfirmed;\n}\n\nexport function getNeedsLoggedInLimitReachedCheck(state: GlobalState): boolean {\n return state.views.admin.needsLoggedInLimitReachedCheck;\n}\n\nexport function getAdminConsoleUserManagementTableProperties(state: GlobalState) {\n return state.views.admin.adminConsoleUserManagementTableProperties;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport const getLastPostsApiTimeForChannel = (state: GlobalState, channelId: string) => state.views.channel.lastGetPosts[channelId];\nexport const getToastStatus = (state: GlobalState) => state.views.channel.toastStatus;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function isModalOpen(state: GlobalState, modalId: string) {\n return Boolean(state.views.modals.modalState[modalId] && state.views.modals.modalState[modalId].open);\n}\nexport function isAnyModalOpen(state: GlobalState) {\n return Boolean(state.views.modals.modalState && findOpenModal(state));\n}\n\nfunction findOpenModal(state: GlobalState) {\n let isOpen = false;\n const modalStateObject = state.views.modals.modalState;\n for (const modal in modalStateObject) {\n if (modal && modalStateObject[modal].open) {\n isOpen = true;\n break;\n }\n }\n return isOpen;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport const getSocketStatus = (state: GlobalState) => state.websocket;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {getHistory} from 'utils/browser_history';\nimport {ErrorPageTypes, StoragePrefixes, LandingPreferenceTypes} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nclass BrowserStoreClass {\n private hasCheckedLocalStorage?: boolean;\n private localStorageSupported?: boolean;\n\n signalLogout() {\n if (this.isLocalStorageSupported()) {\n // PLT-1285 store an identifier in session storage so we can catch if the logout came from this tab on IE11\n const logoutId = Utils.generateId();\n\n Utils.removePrefixFromLocalStorage(StoragePrefixes.ANNOUNCEMENT);\n Utils.removePrefixFromLocalStorage(StoragePrefixes.DELINQUENCY);\n\n sessionStorage.setItem(StoragePrefixes.LOGOUT, logoutId);\n localStorage.setItem(StoragePrefixes.LOGOUT, logoutId);\n localStorage.removeItem(StoragePrefixes.LOGOUT);\n }\n }\n\n isSignallingLogout(logoutId: string) {\n return logoutId === sessionStorage.getItem(StoragePrefixes.LOGOUT);\n }\n\n signalLogin() {\n if (this.isLocalStorageSupported()) {\n // PLT-1285 store an identifier in session storage so we can catch if the logout came from this tab on IE11\n const loginId = Utils.generateId();\n\n sessionStorage.setItem(StoragePrefixes.LOGIN, loginId);\n localStorage.setItem(StoragePrefixes.LOGIN, loginId);\n localStorage.removeItem(StoragePrefixes.LOGIN);\n }\n }\n\n isSignallingLogin(loginId: string) {\n return loginId === sessionStorage.getItem(StoragePrefixes.LOGIN);\n }\n\n isLocalStorageSupported() {\n if (this.hasCheckedLocalStorage) {\n return this.localStorageSupported;\n }\n\n this.localStorageSupported = false;\n\n try {\n localStorage.setItem('__testLocal__', '1');\n if (localStorage.getItem('__testLocal__') === '1') {\n this.localStorageSupported = true;\n }\n localStorage.removeItem('__testLocal__');\n } catch (e) {\n this.localStorageSupported = false;\n }\n\n try {\n sessionStorage.setItem('__testSession__', '1');\n sessionStorage.removeItem('__testSession__');\n } catch (e) {\n // Session storage not usable, website is unusable\n getHistory().push('/error?type=' + ErrorPageTypes.LOCAL_STORAGE);\n }\n\n this.hasCheckedLocalStorage = true;\n\n return this.localStorageSupported;\n }\n\n hasSeenLandingPage() {\n return localStorage.getItem(StoragePrefixes.LANDING_PAGE_SEEN);\n }\n\n setLandingPageSeen(landingPageSeen: boolean) {\n localStorage.setItem(StoragePrefixes.LANDING_PAGE_SEEN, String(landingPageSeen));\n }\n\n getLandingPreference(siteUrl?: string) {\n return localStorage.getItem(StoragePrefixes.LANDING_PREFERENCE + String(siteUrl));\n }\n\n setLandingPreferenceToMattermostApp(siteUrl?: string) {\n localStorage.setItem(StoragePrefixes.LANDING_PREFERENCE + String(siteUrl), LandingPreferenceTypes.MATTERMOSTAPP);\n }\n\n setLandingPreferenceToBrowser(siteUrl?: string) {\n localStorage.setItem(StoragePrefixes.LANDING_PREFERENCE + String(siteUrl), LandingPreferenceTypes.BROWSER);\n }\n\n clearLandingPreference(siteUrl?: string) {\n localStorage.removeItem(StoragePrefixes.LANDING_PREFERENCE + String(siteUrl));\n }\n\n getHideNotificationPermissionRequestBanner() {\n return localStorage.getItem(StoragePrefixes.HIDE_NOTIFICATION_PERMISSION_REQUEST_BANNER) === 'true';\n }\n\n setHideNotificationPermissionRequestBanner() {\n localStorage.setItem(StoragePrefixes.HIDE_NOTIFICATION_PERMISSION_REQUEST_BANNER, 'true');\n }\n\n clearHideNotificationPermissionRequestBanner() {\n localStorage.removeItem(StoragePrefixes.HIDE_NOTIFICATION_PERMISSION_REQUEST_BANNER);\n }\n}\n\nconst BrowserStore = new BrowserStoreClass();\n\nexport default BrowserStore;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {FileInfo} from '@mattermost/types/files';\nimport type {PostPriority} from '@mattermost/types/posts';\nimport type {ScheduledPost} from '@mattermost/types/schedule_post';\n\nexport type DraftInfo = {\n id: string;\n type: 'channel' | 'thread';\n}\n\nexport type PostDraft = {\n message: string;\n message_source?: string;\n fileInfos: FileInfo[];\n file_ids?: string[];\n uploadsInProgress: string[];\n props?: any;\n caretPosition?: number;\n channelId: string;\n rootId: string;\n createAt: number;\n updateAt: number;\n show?: boolean;\n metadata?: {\n priority?: {\n priority: PostPriority|'';\n requested_ack?: boolean;\n persistent_notifications?: boolean;\n };\n files?: FileInfo[];\n };\n};\n\nexport function isPostDraftEmpty(draft: PostDraft): boolean {\n const hasMessage = draft.message.trim() !== '';\n const hasAttachment = draft.fileInfos?.length > 0;\n const hasUploadingFiles = draft.uploadsInProgress?.length > 0;\n\n return !hasMessage && !hasAttachment && !hasUploadingFiles;\n}\n\nexport function scheduledPostToPostDraft(scheduledPost: ScheduledPost): PostDraft {\n return {\n message: scheduledPost.message,\n fileInfos: scheduledPost.metadata?.files || [],\n uploadsInProgress: [],\n props: scheduledPost.props,\n channelId: scheduledPost.channel_id,\n rootId: scheduledPost.root_id,\n createAt: 0,\n updateAt: 0,\n metadata: {\n priority: scheduledPost.priority,\n },\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {SidebarSize} from 'components/resizable_sidebar/constants';\n\nexport type LhsViewState = {\n isOpen: boolean;\n\n size: SidebarSize;\n\n // Static pages (e.g. Threads, Insights, etc.)\n currentStaticPageId: string;\n}\n\nexport enum LhsItemType {\n None = 'none',\n Page = 'page',\n Channel = 'channel',\n}\n\nexport enum LhsPage {\n Drafts = 'drafts',\n Threads = 'threads',\n}\n\nexport type StaticPage = {\n id: string;\n isVisible: boolean;\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport Constants, {EventTypes, A11yClassNames, A11yAttributeNames, A11yCustomEventTypes, isA11yFocusEventDetail} from 'utils/constants';\nimport {isKeyPressed, cmdOrCtrlPressed} from 'utils/keyboard';\nimport {isDesktopApp, isMac} from 'utils/user_agent';\n\nconst listenerOptions = {\n capture: true,\n};\n\nexport default class A11yController {\n // Note that these collections are live which means that they'll be updated automatically\n regionHTMLCollection = this.getAllRegions();\n sectionHTMLCollection?: HTMLCollectionOf<HTMLElement>; // populated when region changes\n modalHTMLCollection = this.getAllModals();\n popupHTMLCollection = this.getAllPopups();\n\n activeRegion?: HTMLElement;\n activeSection?: HTMLElement;\n activeElement?: HTMLElement;\n\n mouseIsPressed = false;\n\n // The default behaviour is to only show a visible focus if the user is currently\n // in the middle of using the keyboard (i.e. the user is pressing a key on the keyboard).\n // This behaviour was introduced in https://github.com/mattermost/mattermost-webapp/pull/3922.\n // But we want to be able to manually focus elements with the custom focus event, even if\n // no keys are currently pressed, for components that manually handle focus such as\n // popovers and modals. So we need a distinction between these two actions.\n lastInputEventIsKeyDown = false;\n lastInputEventIsKeyboard = true;\n\n manualFocus = false;\n\n enterKeyIsPressed = false;\n f6KeyIsPressed = false;\n upArrowKeyIsPressed = false;\n downArrowKeyIsPressed = false;\n tabKeyIsPressed = false;\n tildeKeyIsPressed = false;\n lKeyIsPressed = false;\n escKeyIsPressed = false;\n windowIsFocused = true;\n originElement?: HTMLElement | null = null;\n\n // used to reset navigation whenever navigation within a region occurs (section or element)\n resetNavigation = false;\n\n constructor() {\n document.addEventListener(EventTypes.KEY_DOWN, this.handleKeyDown, listenerOptions);\n document.addEventListener(EventTypes.KEY_UP, this.handleKeyUp, listenerOptions);\n document.addEventListener(EventTypes.CLICK, this.handleMouseClick, listenerOptions);\n document.addEventListener(EventTypes.MOUSE_DOWN, this.handleMouseDown, listenerOptions);\n document.addEventListener(EventTypes.MOUSE_UP, this.handleMouseUp, listenerOptions);\n document.addEventListener(EventTypes.FOCUS, this.handleFocus, listenerOptions);\n document.addEventListener(A11yCustomEventTypes.FOCUS, this.handleA11yFocus, listenerOptions);\n window.addEventListener(EventTypes.BLUR, this.handleWindowBlur, listenerOptions);\n }\n\n destroy() {\n this.clearActiveRegion();\n this.clearCurrentFocus();\n\n document.removeEventListener(EventTypes.KEY_DOWN, this.handleKeyDown, listenerOptions);\n document.removeEventListener(EventTypes.KEY_UP, this.handleKeyUp, listenerOptions);\n document.removeEventListener(EventTypes.CLICK, this.handleMouseClick, listenerOptions);\n document.removeEventListener(EventTypes.MOUSE_DOWN, this.handleMouseDown, listenerOptions);\n document.removeEventListener(EventTypes.MOUSE_UP, this.handleMouseUp, listenerOptions);\n document.removeEventListener(EventTypes.FOCUS, this.handleFocus, listenerOptions);\n document.removeEventListener(A11yCustomEventTypes.FOCUS, this.handleA11yFocus, listenerOptions);\n window.removeEventListener(EventTypes.BLUR, this.handleWindowBlur, listenerOptions);\n }\n\n /**\n * Stores a reference to the provided DOM element as the \"origin element\".\n * The origin element is the element that triggered or last caused a certain\n * navigation or focus event. This allows restoring focus back to this element\n * once certain UI components (like RHS, panels, or menus) are closed.\n *\n * @param {HTMLElement} element - The DOM element to store as the origin element.\n */\n storeOriginElement(element: HTMLElement) {\n this.originElement = element;\n }\n\n /**\n * Resets the stored origin element reference back to null.\n * This is typically called after focus has been restored to the origin element,\n * indicating that the controller no longer needs to keep track of it.\n */\n resetOriginElement() {\n this.originElement = null;\n }\n\n // convenience getter/setters\n\n /**\n * Determines if keyboard navigation is currently in progress based on several criteria as follows:\n * 1. There must be defined regions and a single region must be active\n * 2. The last input event detected must be a keyboard event\n * 3. There must be no open modals and/or popups\n * 4. There must be an active element and it must support classList\n */\n get navigationInProgress() {\n if (!this.regions || !this.regions.length || !this.isElementValid(this.activeRegion)) {\n return false;\n }\n if (!this.lastInputEventIsKeyDown) {\n return false;\n }\n if (this.modalIsOpen || this.popupIsOpen) {\n return false;\n }\n if (!this.isElementValid(this.activeElement)) {\n return false;\n }\n return true;\n }\n\n /**\n * Returns an array of available regions sorted by A11yAttributeNames.SORT_ORDER\n */\n get regions() {\n let domElements = this.sortElementsByAttributeOrder(this.regionHTMLCollection);\n domElements = domElements.filter((element) => {\n return this.elementIsVisible(element);\n });\n return domElements;\n }\n\n /**\n * Returns an array of available sections sorted by A11yAttributeNames.SORT_ORDER and optionally reversed\n */\n get sections() {\n let domElements = this.sortElementsByAttributeOrder(this.sectionHTMLCollection!);\n domElements = domElements.filter((element) => {\n return this.elementIsVisible(element);\n });\n if (this.shouldReverseSections) {\n domElements.reverse();\n }\n return domElements;\n }\n\n /**\n * Returns the index of the active region\n */\n get activeRegionIndex() {\n if (!this.activeRegion) {\n return -1;\n }\n return this.regions.indexOf(this.activeRegion);\n }\n\n /**\n * Returns the index of the active section\n */\n get activeSectionIndex() {\n if (!this.activeSection) {\n return -1;\n }\n return this.sections.indexOf(this.activeSection);\n }\n\n /**\n * Returns whether the regions requires reverse section navigation\n */\n get shouldReverseSections() {\n if (!this.activeRegion) {\n return false;\n }\n return this.getOrderReverseAttribute(this.activeRegion);\n }\n\n /**\n * Returns the element that should currently have focus\n */\n get focusedElement() {\n let focusedElement;\n if (this.activeElement) {\n focusedElement = this.activeElement;\n } else if (this.activeSection) {\n focusedElement = this.activeSection;\n } else if (this.activeRegion) {\n focusedElement = this.activeRegion;\n }\n return focusedElement;\n }\n\n /**\n * Returnes whether an a11y-specific key is currently pressed\n */\n get a11yKeyIsPressed() {\n return this.f6KeyIsPressed ||\n this.upArrowKeyIsPressed ||\n this.downArrowKeyIsPressed ||\n this.tabKeyIsPressed ||\n this.tildeKeyIsPressed ||\n this.lKeyIsPressed ||\n this.escKeyIsPressed;\n }\n\n /**\n * Indicates if a modal window is currently open\n * - modals must have A11yClassNames.MODAL to be considered\n */\n get modalIsOpen() {\n return this.modalHTMLCollection.length > 0;\n }\n\n /**\n * Indicates if a popup/dropdown element is currently open\n * - popups/dropdowns must have A11yClassNames.POPUP to be considered\n */\n get popupIsOpen() {\n return this.popupHTMLCollection.length > 0;\n }\n\n /**\n * Indicates if the region should disallow the change of active sections and regions\n * This stops sections and regions from changing in the controller while this class is applied, such that another package can\n * utilize the a11y_controller to stop other keyboard events for accessibility reasons in favour of its own\n */\n get disableNavigation() {\n return this.activeRegion && this.activeRegion.getAttribute(A11yAttributeNames.DISABLE_NAVIGATION) === 'true';\n }\n\n // public methods\n\n /**\n * Determines the next region, sets it as active and updates the current focus\n */\n nextRegion() {\n const regions = this.regions;\n if (\n !regions ||\n !regions.length ||\n this.modalIsOpen ||\n this.popupIsOpen\n ) {\n return;\n }\n if (!this.disableNavigation) {\n let newRegion;\n if (\n !this.activeRegion ||\n this.activeRegionIndex === regions.length - 1 ||\n this.resetNavigation\n ) {\n newRegion = regions[0];\n } else {\n newRegion = regions[this.activeRegionIndex + 1];\n }\n this.setActiveRegion(newRegion);\n }\n this.setCurrentFocus();\n this.resetNavigation = false;\n }\n\n /**\n * Determines the previous region, sets it as active and updates the current focus\n */\n previousRegion() {\n const regions = this.regions;\n if (\n !regions ||\n !regions.length ||\n this.modalIsOpen ||\n this.popupIsOpen\n ) {\n return;\n }\n if (!this.disableNavigation) {\n let newRegion;\n if (!this.activeRegion || (this.activeRegionIndex !== 0 && this.resetNavigation)) {\n newRegion = regions[0];\n } else if (this.activeRegionIndex === 0) {\n newRegion = regions[regions.length - 1];\n } else {\n newRegion = regions[this.activeRegionIndex - 1];\n }\n this.setActiveRegion(newRegion);\n }\n this.setCurrentFocus();\n this.resetNavigation = false;\n }\n\n /**\n * Determines the next section, sets it as active and updates the current focus\n */\n nextSection() {\n const sections = this.sections;\n const shouldLoopNavigation = this.getLoopNavigationAttribute(this.activeRegion);\n if (\n this.modalIsOpen ||\n this.popupIsOpen ||\n !sections ||\n !sections.length ||\n (!shouldLoopNavigation && this.activeSectionIndex === sections.length - 1)\n ) {\n return;\n }\n if (!this.disableNavigation) {\n let newSection;\n if (this.activeSection && this.activeSectionIndex < sections.length - 1) {\n newSection = sections[this.activeSectionIndex + 1];\n } else {\n newSection = sections[0];\n }\n this.setActiveSection(newSection);\n }\n this.setCurrentFocus();\n this.resetNavigation = true;\n }\n\n /**\n * Determines the previous section, sets it as active and updates the current focus\n */\n previousSection() {\n const sections = this.sections;\n const shouldLoopNavigation = this.getLoopNavigationAttribute(this.activeRegion);\n if (\n this.modalIsOpen ||\n this.popupIsOpen ||\n !sections ||\n !sections.length ||\n (!shouldLoopNavigation && this.activeSectionIndex === 0)\n ) {\n return;\n }\n if (!this.disableNavigation) {\n let newSection;\n if (this.activeSection && this.activeSectionIndex > 0) {\n newSection = sections[this.activeSectionIndex - 1];\n } else if (this.activeSection && this.activeSectionIndex === 0) {\n newSection = sections[sections.length - 1];\n } else {\n newSection = sections[0];\n }\n this.setActiveSection(newSection);\n }\n this.setCurrentFocus();\n this.resetNavigation = true;\n }\n\n /**\n * Takes the provided dom element, finds it's parent section and region (if available),\n * sets them as active and updates the current focus\n * @param element - the DOM element to set as the active element\n * @param elementPath - array of element's dom branch or boolean to find section/region of element\n */\n nextElement(element: HTMLElement, elementPath: EventTarget[] | boolean = false) {\n function isPath(obj: unknown): obj is HTMLElement[] {\n return Array.isArray(obj);\n }\n\n let region;\n let section;\n if (isPath(elementPath)) {\n // is the current element in an active region?\n if (!this.activeRegion || elementPath.indexOf(this.activeRegion) < 0) {\n region = elementPath.find((pathElement) => {\n if (!pathElement.classList) {\n return false;\n }\n return pathElement.classList.contains(A11yClassNames.REGION);\n });\n }\n\n // is the current element in an active section?\n if (!this.activeSection || elementPath.indexOf(this.activeSection) < 0) {\n section = elementPath.find((pathElement) => {\n if (!pathElement.classList) {\n return false;\n }\n return pathElement.classList.contains(A11yClassNames.SECTION);\n });\n }\n } else if (elementPath && typeof element.closest === 'function') {\n region = element.closest(`.${A11yClassNames.REGION}`) as HTMLElement;\n section = element.closest(`.${A11yClassNames.SECTION}`) as HTMLElement;\n }\n if (region && this.activeRegion !== region) {\n this.setActiveRegion(region, false);\n }\n if (section && this.activeSection !== section) {\n this.setActiveSection(section);\n }\n this.setActiveElement(element);\n this.setCurrentFocus();\n this.resetNavigation = true;\n }\n\n restoreOriginFocus() {\n if (this.originElement && this.isElementValid(this.originElement)) {\n // Dispatch a focus event to manually focus this element\n document.dispatchEvent(\n new CustomEvent(A11yCustomEventTypes.FOCUS, {\n detail: {\n target: this.originElement,\n keyboardOnly: false,\n },\n }),\n );\n setTimeout(() => {\n this.originElement = null;\n }, 0);\n }\n }\n\n /**\n * Resets the a11y navigation controller, active region/section/element, clears focus and resets user interraction states\n */\n cancelNavigation() {\n this.clearActiveRegion();\n this.setCurrentFocus();\n this.resetInterractionStates();\n }\n\n // private methods\n\n /**\n * Sets the currently active region and stores a list of the regions sections\n * @param element - DOM element to set as the active region\n * @param {boolean} canFocusChild - whether to focus child section instead of provide region\n * @emits {A11yCustomEventTypes.ACTIVATE} - emitted on the provided DOM element once set to active\n */\n setActiveRegion(element: HTMLElement, canFocusChild = true) {\n if (!this.isElementValid(element, [this.activeRegion]) && !this.resetNavigation) {\n return;\n }\n\n // clear previous active region\n this.clearActiveRegion();\n\n // setup new active region\n this.activeRegion = element;\n this.activeRegion.addEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveRegionUpdate);\n this.activeRegion.dispatchEvent(new Event(A11yCustomEventTypes.ACTIVATE));\n\n // apply visual updates to active region\n this.updateActiveRegion();\n\n // retrieve all sections for the new active region\n this.sectionHTMLCollection = this.getAllSectionsForRegion(this.activeRegion);\n\n // should the visual focus start on a child section\n if (canFocusChild && this.getFocusChildAttribute(this.activeRegion) && this.sections && this.sections.length) {\n this.setActiveSection(this.sections[0]);\n }\n }\n\n /**\n * Sets the currently active section\n * @param element - DOM element to set as the active section\n * @emits {A11yCustomEventTypes.ACTIVATE} - emitted on the provided DOM element once set to active\n */\n setActiveSection(element: HTMLElement) {\n if (!this.isElementValid(element, [this.activeSection])) {\n return;\n }\n\n // clear previous active section\n this.clearActiveSection();\n\n // setup new active section\n this.activeSection = element;\n this.activeSection.addEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveSectionUpdate);\n this.activeSection.dispatchEvent(new Event(A11yCustomEventTypes.ACTIVATE));\n\n // apply visual updates to active section\n this.updateActiveSection();\n }\n\n /**\n * Sets the currently active element\n * @param element - DOM element to set as the active element\n * @emits {A11yCustomEventTypes.ACTIVATE} - emitted on the provided DOM element once set to active\n */\n setActiveElement(element: HTMLElement) {\n if (!this.isElementValid(element, [this.activeElement])) {\n return;\n }\n\n // clear previous active element\n this.clearActiveElement();\n\n // setup new active element\n this.activeElement = element;\n this.activeElement.addEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveElementUpdate);\n if (this.activeElement !== this.activeRegion && this.activeElement !== this.activeSection) {\n this.activeElement.dispatchEvent(new Event(A11yCustomEventTypes.ACTIVATE));\n }\n\n // apply visual updates to active element\n this.updateActiveElement();\n }\n\n /**\n * Updates the focus status of the element that should now have focus\n */\n setCurrentFocus() {\n this.clearCurrentFocus();\n if (!this.focusedElement) {\n return;\n }\n\n // set focus on the element that should have focus if needed\n if (document.activeElement !== this.focusedElement) {\n this.focusedElement.focus();\n }\n\n // apply visual updates to focused element\n this.udpateCurrentFocus();\n }\n\n /**\n * Updates the visual state of the active region and makes sure it is focusable\n */\n updateActiveRegion() {\n if (!this.activeRegion) {\n return;\n }\n this.activeRegion.classList.add(A11yClassNames.ACTIVE);\n\n // ensure active region element is focusable\n if (!this.activeRegion.getAttribute('tabindex')) {\n this.activeRegion.setAttribute('tabindex', '-1');\n }\n }\n\n /**\n * Updates the visual state of the active section and makes sure it is focusable\n */\n updateActiveSection() {\n if (!this.activeSection) {\n return;\n }\n this.activeSection.classList.add(A11yClassNames.ACTIVE);\n\n // ensure active section element is focusable\n if (!this.activeSection.getAttribute('tabindex')) {\n this.activeSection.setAttribute('tabindex', '-1');\n }\n }\n\n /**\n * Updates the visual state of the active element\n */\n updateActiveElement() {\n if (!this.activeElement) {\n return;\n }\n this.activeElement.classList.add(A11yClassNames.ACTIVE);\n }\n\n /**\n * Updates the visual state of the currently focused element\n */\n udpateCurrentFocus(forceUpdate = false) {\n if ((!this.focusedElement || !(this.a11yKeyIsPressed || this.manualFocus)) && !forceUpdate) {\n return;\n }\n this.focusedElement?.classList.add(A11yClassNames.FOCUSED);\n }\n\n /**\n * Clears all a11y-applied classes, events and the active region DOM element reference\n */\n clearActiveRegion() {\n if (this.activeRegion) {\n this.activeRegion.classList.remove(A11yClassNames.ACTIVE);\n this.activeRegion.dispatchEvent(new Event(A11yCustomEventTypes.DEACTIVATE));\n this.activeRegion.removeEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveRegionUpdate);\n this.activeRegion = undefined;\n }\n this.clearActiveSection();\n }\n\n /**\n * Clears all a11y-applied classes, events and the active section DOM element reference\n */\n clearActiveSection() {\n if (this.activeSection) {\n this.activeSection.classList.remove(A11yClassNames.ACTIVE);\n this.activeSection.dispatchEvent(new Event(A11yCustomEventTypes.DEACTIVATE));\n this.activeSection.removeEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveSectionUpdate);\n this.activeSection = undefined;\n }\n this.clearActiveElement();\n }\n\n /**\n * Clears all a11y-applied classes, events and the active DOM element reference\n */\n clearActiveElement() {\n if (this.activeElement) {\n if (this.activeElement !== this.activeRegion && this.activeElement !== this.activeSection) {\n this.activeElement.classList.remove(A11yClassNames.ACTIVE);\n this.activeElement.dispatchEvent(new Event(A11yCustomEventTypes.DEACTIVATE));\n }\n this.activeElement.removeEventListener(A11yCustomEventTypes.UPDATE, this.handleActiveElementUpdate);\n this.activeElement = undefined;\n }\n }\n\n /**\n * Clears all focused element classes and blurs the active element if requested\n */\n clearCurrentFocus(blurActiveElement = false) {\n Array.from(document.getElementsByClassName(A11yClassNames.FOCUSED)).forEach((element) => {\n element.classList.remove(A11yClassNames.FOCUSED);\n });\n if (blurActiveElement) {\n (document.activeElement as HTMLElement).blur();\n }\n }\n\n /**\n * Resets the state of all a11y-defined interraction methods\n */\n resetInterractionStates() {\n this.mouseIsPressed = false;\n this.f6KeyIsPressed = false;\n this.upArrowKeyIsPressed = false;\n this.downArrowKeyIsPressed = false;\n this.tabKeyIsPressed = false;\n this.tildeKeyIsPressed = false;\n this.enterKeyIsPressed = false;\n this.escKeyIsPressed = false;\n this.lKeyIsPressed = false;\n this.lastInputEventIsKeyDown = false;\n }\n\n // helper methods\n\n /**\n * Returns an HTMLCollection object of all defined regions\n * - use of HTMLCollection is intentional as this object auto updates to reflect DOM changes\n */\n getAllRegions() {\n return document.getElementsByClassName(A11yClassNames.REGION) as HTMLCollectionOf<HTMLElement>;\n }\n\n /**\n * Returns an HTMLCollection object of all defined sections for the currently active region\n * - use of HTMLCollection is intentional as this object auto updates to reflect DOM changes\n */\n getAllSectionsForRegion(region: HTMLElement) {\n if (!region) {\n return undefined;\n }\n return region.getElementsByClassName(A11yClassNames.SECTION) as HTMLCollectionOf<HTMLElement>;\n }\n\n /**\n * Sort a list of DOM elements by defined A11yAttributeNames.SORT_ORDER attribute\n * @param elements - list of elements to be sorted\n */\n sortElementsByAttributeOrder(elements: HTMLCollectionOf<HTMLElement>) {\n if (!elements || !elements.length) {\n return [];\n }\n return Array.from(elements).sort((elementA, elementB) => {\n const elementAOrder = parseInt(elementA.getAttribute(A11yAttributeNames.SORT_ORDER) || '', 10);\n const elementBOrder = parseInt(elementB.getAttribute(A11yAttributeNames.SORT_ORDER) || '', 10);\n\n if (isNaN(elementAOrder) && isNaN(elementBOrder)) {\n return 0;\n }\n if (isNaN(elementBOrder)) {\n return -1;\n }\n if (isNaN(elementAOrder)) {\n return 1;\n }\n\n return elementAOrder - elementBOrder;\n });\n }\n\n /**\n * Returns whether a DOM element is currently visible or not\n * @param element - the DOM element to check\n */\n elementIsVisible(element: HTMLElement) {\n return element &&\n element instanceof HTMLElement &&\n element.offsetParent;\n }\n\n /**\n * Retuns an HTMLCollection of all DOM elements that have the A11yClassNames.MODAL class\n */\n getAllModals() {\n return document.getElementsByClassName(A11yClassNames.MODAL) as HTMLCollectionOf<HTMLElement>;\n }\n\n /**\n * Retuns an HTMLCollection of all DOM elements that have the A11yClassNames.POPUP class\n */\n getAllPopups() {\n return document.getElementsByClassName(A11yClassNames.POPUP) as HTMLCollectionOf<HTMLElement>;\n }\n\n /**\n * Helper to retrieve the value of the A11yAttributeNames.LOOP_NAVIGATION attribute for the provided DOM element\n * @param element - the element to retrive the A11yAttributeNames.LOOP_NAVIGATION value from\n */\n getLoopNavigationAttribute(element: HTMLElement | undefined) {\n const attributeValue = element?.getAttribute(A11yAttributeNames.LOOP_NAVIGATION);\n if (attributeValue && attributeValue.toLowerCase() === 'false') {\n return false;\n }\n return true;\n }\n\n /**\n * Helper to retrieve the value of the A11yAttributeNames.ORDER_REVERSE attribute for the provided DOM element\n * @param element - the element to retrive the A11yAttributeNames.ORDER_REVERSE value from\n */\n getOrderReverseAttribute(element: HTMLElement) {\n const attributeValue = element.getAttribute(A11yAttributeNames.ORDER_REVERSE);\n if (attributeValue && attributeValue.toLowerCase() === 'true') {\n return true;\n }\n return false;\n }\n\n /**\n * Helper to retrieve the value of the A11yAttributeNames.FOCUS_CHILD attribute for the provided DOM element\n * @param element - the element to retrive the A11yAttributeNames.FOCUS_CHILD value from\n */\n getFocusChildAttribute(element: HTMLElement) {\n const attributeValue = element.getAttribute(A11yAttributeNames.FOCUS_CHILD);\n if (attributeValue && attributeValue.toLowerCase() === 'true') {\n return true;\n }\n return false;\n }\n\n /**\n * Helper method to verify if a provided DOM element is a valid element for a11y navigation\n * @param element - the DOM element to check\n * @param invalidElements - a list of invalid DOM elements to check against\n */\n isElementValid(element: HTMLElement | undefined, invalidElements: Array<HTMLElement | undefined> = []) {\n if (\n element &&\n element.classList &&\n !invalidElements.includes(element)\n ) {\n return true;\n }\n return false;\n }\n\n // event handling methods\n\n handleKeyDown = (event: Event) => {\n if (\n !(event instanceof KeyboardEvent) ||\n !event.target ||\n !(event.target instanceof HTMLElement)\n ) {\n return;\n }\n\n this.lastInputEventIsKeyboard = true;\n\n const modifierKeys = {\n ctrlIsPressed: event.ctrlKey,\n altIsPressed: event.altKey,\n shiftIsPressed: event.shiftKey,\n };\n switch (true) {\n case isKeyPressed(event, Constants.KeyCodes.TAB):\n this.lastInputEventIsKeyDown = true;\n if ((!isMac() && modifierKeys.altIsPressed) || cmdOrCtrlPressed(event)) {\n return;\n }\n this.tabKeyIsPressed = true;\n break;\n case isKeyPressed(event, Constants.KeyCodes.TILDE):\n this.lastInputEventIsKeyDown = true;\n if (!this.regions || !this.regions.length) {\n return;\n }\n\n // Check to make sure both aren't pressed because some older webkit browsers set CTRL and ALT when AltGr is pressed\n if (modifierKeys.ctrlIsPressed && !modifierKeys.altIsPressed) {\n this.tildeKeyIsPressed = true;\n event.preventDefault();\n if (modifierKeys.shiftIsPressed) {\n this.previousRegion();\n } else {\n this.nextRegion();\n }\n }\n break;\n case isKeyPressed(event, Constants.KeyCodes.F6):\n this.lastInputEventIsKeyDown = true;\n if (!isDesktopApp() && !cmdOrCtrlPressed(event)) {\n return;\n }\n this.f6KeyIsPressed = true;\n event.preventDefault();\n if (modifierKeys.shiftIsPressed) {\n this.previousRegion();\n } else {\n this.nextRegion();\n }\n break;\n case isKeyPressed(event, Constants.KeyCodes.UP):\n this.lastInputEventIsKeyDown = true;\n if (!this.navigationInProgress || !this.sections || !this.sections.length) {\n return;\n }\n this.upArrowKeyIsPressed = true;\n event.preventDefault();\n if (this.shouldReverseSections) {\n this.nextSection();\n } else {\n this.previousSection();\n }\n break;\n case isKeyPressed(event, Constants.KeyCodes.DOWN):\n this.lastInputEventIsKeyDown = true;\n if (!this.navigationInProgress || !this.sections || !this.sections.length) {\n return;\n }\n this.downArrowKeyIsPressed = true;\n event.preventDefault();\n if (this.shouldReverseSections) {\n this.previousSection();\n } else {\n this.nextSection();\n }\n break;\n case isKeyPressed(event, Constants.KeyCodes.ESCAPE):\n this.escKeyIsPressed = true;\n this.lastInputEventIsKeyDown = true;\n if (!this.navigationInProgress) {\n return;\n }\n event.preventDefault();\n this.cancelNavigation();\n break;\n case isKeyPressed(event, Constants.KeyCodes.ENTER):\n this.enterKeyIsPressed = true;\n break;\n case isKeyPressed(event, Constants.KeyCodes.SPACE):\n if (event.target.nodeName === 'BUTTON') {\n event.preventDefault();\n event.stopPropagation();\n event.target.click();\n }\n break;\n case isKeyPressed(event, Constants.KeyCodes.L):\n // For the Ctrl+Shift+L keyboard shortcut\n this.lastInputEventIsKeyDown = true;\n this.lKeyIsPressed = true;\n break;\n }\n };\n\n handleKeyUp = () => {\n this.resetInterractionStates();\n };\n\n handleMouseClick = (event: Event) => {\n // hitting enter on a <button> triggers a click event\n if (!this.enterKeyIsPressed) {\n this.lastInputEventIsKeyDown = false;\n }\n if (event.target === this.activeElement) {\n return;\n }\n this.cancelNavigation();\n };\n\n handleMouseDown = () => {\n this.mouseIsPressed = true;\n this.lastInputEventIsKeyboard = false;\n };\n\n handleMouseUp = () => {\n this.mouseIsPressed = false;\n };\n\n handleFocus = (event: Event) => {\n if (event.target instanceof HTMLElement) {\n // since the post-list (in which the EditPost component lives) has the attribute `data-a11y-child-focus` hitting\n // the UP-Key causes the a11y controller to go through the posts. This is unwanted behavior in a textarea, so we\n // decided to leave this fix in for now. If we find the need for a more sustainable fix we can certainly do\n // that, as well, but for now this is sufficient.\n // @see: https://github.com/mattermost/mattermost-webapp/pull/8882#discussion_r790905592\n if (this.lastInputEventIsKeyDown && this.windowIsFocused && event.target.id !== 'edit_textbox') {\n this.nextElement(event.target, event.composedPath() || true);\n }\n }\n\n // focus just came back to the app\n if (!this.windowIsFocused) {\n this.windowIsFocused = true;\n }\n };\n\n handleA11yFocus = (event: Event) => {\n if (!(event instanceof CustomEvent)) {\n return;\n }\n\n if (!isA11yFocusEventDetail(event.detail) || !event.detail.target) {\n return;\n }\n\n if (!event.detail.keyboardOnly || this.lastInputEventIsKeyboard) {\n this.manualFocus = true;\n this.nextElement(event.detail.target, true);\n this.manualFocus = false;\n } else {\n event.detail.target.focus();\n }\n };\n\n handleWindowBlur = (event: Event) => {\n if (event.target === window) {\n this.windowIsFocused = false;\n }\n };\n\n handleActiveRegionUpdate = () => {\n if (this.navigationInProgress) {\n this.updateActiveRegion();\n if (this.focusedElement === this.activeRegion) {\n this.udpateCurrentFocus(true);\n }\n }\n };\n\n handleActiveSectionUpdate = () => {\n if (this.navigationInProgress) {\n this.updateActiveSection();\n if (this.focusedElement === this.activeSection) {\n this.udpateCurrentFocus(true);\n }\n }\n };\n\n handleActiveElementUpdate = () => {\n if (this.navigationInProgress) {\n this.updateActiveElement();\n if (this.focusedElement === this.activeElement) {\n this.udpateCurrentFocus(true);\n }\n }\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport A11yController from 'utils/a11y_controller';\n\nconst a11yController = new A11yController();\nexport default a11yController;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AppCall, AppCallRequest, AppCallResponse, AppCallValues, AppContext, AppExpand, AppSelectOption} from '@mattermost/types/apps';\n\nimport {AppCallResponseTypes} from 'mattermost-redux/constants/apps';\n\nexport const appsPluginID = 'com.mattermost.apps';\n\nexport function createCallContext(\n appID: string,\n location?: string,\n channelID?: string,\n teamID?: string,\n postID?: string,\n rootID?: string,\n): AppContext {\n return {\n app_id: appID,\n location,\n channel_id: channelID,\n team_id: teamID,\n post_id: postID,\n root_id: rootID,\n };\n}\n\nexport function createCallRequest(\n call: AppCall,\n context: AppContext,\n defaultExpand: AppExpand = {},\n values?: AppCallValues,\n rawCommand?: string,\n): AppCallRequest {\n return {\n ...call,\n context,\n values,\n expand: {\n ...defaultExpand,\n ...call.expand,\n },\n raw_command: rawCommand,\n };\n}\n\nexport const makeCallErrorResponse = (errMessage: string): AppCallResponse<any> => {\n return {\n type: AppCallResponseTypes.ERROR,\n text: errMessage,\n };\n};\n\nexport const filterEmptyOptions = (option: AppSelectOption) => option.value && !option.value.match(/^[ \\t]+$/);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {CloudCustomer, InvoiceLineItem, Subscription} from '@mattermost/types/cloud';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {CloudLinks} from 'utils/constants';\n\nexport function buildInvoiceSummaryPropsFromLineItems(lineItems: InvoiceLineItem[]) {\n let fullCharges = lineItems.filter((item) => item.type === 'full');\n const partialCharges = lineItems.filter((item) => item.type === 'partial');\n if (!partialCharges.length && !fullCharges.length) {\n fullCharges = lineItems;\n }\n let hasMoreLineItems = 0;\n if (fullCharges.length > 5) {\n hasMoreLineItems = fullCharges.length - 5;\n fullCharges = fullCharges.slice(0, 5);\n }\n\n return {partialCharges, fullCharges, hasMore: hasMoreLineItems};\n}\n\nexport function isCustomerCardExpired(customer?: CloudCustomer): boolean {\n if (!customer) {\n return false;\n }\n\n const expiryYear = customer.payment_method.exp_year;\n\n // If not expiry year, or its 0, it's not expired (because it probably isn't set)\n if (!expiryYear) {\n return false;\n }\n\n // This works because we store the expiry month as the actual 1-12 base month, but Date uses a 0-11 base month\n // But credit cards expire at the end of their expiry month, so we can just use that number.\n const lastExpiryDate = new Date(expiryYear, customer.payment_method.exp_month, 1);\n return lastExpiryDate <= new Date();\n}\n\nexport function openExternalPricingLink() {\n trackEvent('cloud_admin', 'click_pricing_link');\n window.open(CloudLinks.PRICING, '_blank');\n}\n\nexport const FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS = 30;\n\nexport function daysUntil(end?: number, simulatedCurrentTimeMs?: number) {\n let now = new Date();\n\n if (simulatedCurrentTimeMs) {\n now = new Date(simulatedCurrentTimeMs);\n }\n\n const expiration = new Date(end || 0);\n const diff = expiration.getTime() - now.getTime();\n return Math.ceil(diff / (1000 * 3600 * 24));\n}\n\nexport function daysToExpiration(subscription?: Subscription): number {\n return daysUntil(subscription?.end_at, subscription?.simulated_current_time_ms);\n}\n\nexport function daysToCancellation(subscription?: Subscription): number {\n return daysUntil(subscription?.cancel_at, subscription?.simulated_current_time_ms);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Buffer} from 'buffer';\n\nimport {LicenseLinks} from './constants';\n\nconst baseZendeskFormURL = 'https://support.mattermost.com/hc/en-us/requests/new';\n\nexport enum ZendeskSupportForm {\n SELF_HOSTED_SUPPORT_FORM = '11184911962004',\n CLOUD_SUPPORT_FORM = '11184929555092',\n}\n\nexport enum ZendeskFormFieldIDs {\n CLOUD_WORKSPACE_URL = '5245314479252',\n SELF_HOSTED_ENVIRONMENT = '360026980452',\n BILLING_SALES_CATEGORY = '360031056451',\n EMAIL = 'anonymous_requester_email',\n SUBJECT = 'subject',\n DESCRIPTION = 'description'\n}\n\nexport type PrefillFieldFormFieldIDs = {\n id: ZendeskFormFieldIDs;\n val: string;\n}\n\nexport const buildZendeskSupportForm = (form: ZendeskSupportForm, formFieldIDs: PrefillFieldFormFieldIDs[]): string => {\n let formUrl = `${baseZendeskFormURL}?ticket_form_id=${form}`;\n\n formFieldIDs.forEach((formPrefill) => {\n formUrl = formUrl.concat(`&tf_${formPrefill.id}=${formPrefill.val}`);\n });\n\n if (form === ZendeskSupportForm.SELF_HOSTED_SUPPORT_FORM) {\n formUrl = formUrl.concat(`&tf_${ZendeskFormFieldIDs.SELF_HOSTED_ENVIRONMENT}=production`);\n }\n\n return formUrl;\n};\n\nexport const goToCloudSupportForm = (email: string, subject: string, description: string, workspaceURL: string) => {\n const form = ZendeskSupportForm.CLOUD_SUPPORT_FORM;\n let url = buildZendeskSupportForm(form, [\n {id: ZendeskFormFieldIDs.EMAIL, val: email},\n {id: ZendeskFormFieldIDs.SUBJECT, val: subject},\n {id: ZendeskFormFieldIDs.DESCRIPTION, val: description},\n ]);\n url = url.concat(`&tf_${ZendeskFormFieldIDs.CLOUD_WORKSPACE_URL}=${workspaceURL}`);\n window.open(url, '_blank');\n};\n\nexport const getCloudSupportLink = (email: string, subject: string, description: string, workspaceURL: string) => {\n const form = ZendeskSupportForm.CLOUD_SUPPORT_FORM;\n let url = buildZendeskSupportForm(form, [\n {id: ZendeskFormFieldIDs.EMAIL, val: email},\n {id: ZendeskFormFieldIDs.SUBJECT, val: subject},\n {id: ZendeskFormFieldIDs.DESCRIPTION, val: description},\n ]);\n url = url.concat(`&tf_${ZendeskFormFieldIDs.CLOUD_WORKSPACE_URL}=${workspaceURL}`);\n return url;\n};\n\nconst encodeString = (s: string) => {\n return Buffer.from(s).toString('base64');\n};\n\nexport const buildMMURL = (baseURL: string, firstName: string, lastName: string, companyName: string, businessEmail: string, source: string, medium: string) => {\n const mmURL = `${baseURL}?qk=${encodeString(firstName)}&qp=${encodeString(lastName)}&qw=${encodeString(companyName)}&qx=${encodeString(businessEmail)}&utm_source=${source}&utm_medium=${medium}`;\n return mmURL;\n};\n\nexport const goToMattermostContactSalesForm = (firstName: string, lastName: string, companyName: string, businessEmail: string, source: string, medium: string) => {\n const url = buildMMURL(LicenseLinks.CONTACT_SALES, firstName, lastName, companyName, businessEmail, source, medium);\n window.open(url, '_blank');\n};\n\nexport const getCloudContactSalesLink = (firstName: string, lastName: string, companyName: string, businessEmail: string, source: string, medium: string) => {\n const url = buildMMURL(LicenseLinks.CONTACT_SALES, firstName, lastName, companyName, businessEmail, source, medium);\n return url;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {DateTime} from 'luxon';\nimport moment, {type Moment} from 'moment-timezone';\nimport type {useIntl} from 'react-intl';\n\nconst shouldTruncate = new Map<Intl.RelativeTimeFormatUnit, boolean>([\n ['year', true],\n ['quarter', true],\n ['month', true],\n ['week', true],\n ['day', true],\n ['hour', false],\n ['minute', false],\n ['second', true],\n]);\n\nexport function isWithin(\n a: Date,\n b: Date,\n timeZone: string = new Intl.DateTimeFormat().resolvedOptions().timeZone,\n unit: Intl.RelativeTimeFormatUnit,\n threshold = 1,\n truncateEndpoints = shouldTruncate.get(unit) || false,\n): boolean {\n const diff = getDiff(a, b, timeZone, unit, truncateEndpoints);\n return threshold >= 0 ? diff <= threshold && diff >= 0 : diff >= threshold && diff <= 0;\n}\n\nexport function isEqual(\n a: Date,\n b: Date,\n timeZone: string = new Intl.DateTimeFormat().resolvedOptions().timeZone,\n unit: Intl.RelativeTimeFormatUnit,\n threshold = 1,\n truncateEndpoints = shouldTruncate.get(unit) || false,\n): boolean {\n return threshold === getDiff(a, b, timeZone, unit, truncateEndpoints);\n}\n\nexport function getDiff(\n a: Date,\n b: Date,\n timeZone: string = new Intl.DateTimeFormat().resolvedOptions().timeZone,\n unit: Intl.RelativeTimeFormatUnit,\n truncateEndpoints = shouldTruncate.get(unit) || false,\n): number {\n const momentA = moment.utc(a.getTime());\n const momentB = moment.utc(b.getTime());\n\n if (timeZone) {\n momentA.tz(timeZone);\n momentB.tz(timeZone);\n }\n\n return truncateEndpoints ? momentA.startOf(unit).diff(momentB.startOf(unit), unit) : momentA.diff(b, unit, true);\n}\n\nexport function isSameDay(a: Date, b: Date = new Date()): boolean {\n return a.getDate() === b.getDate() && isSameMonth(a, b);\n}\n\nexport function isWithinLastWeek(a: Date): boolean {\n return moment(a).isAfter(\n moment().subtract(6, 'days').startOf('day'),\n );\n}\n\nexport function isSameMonth(a: Date, b: Date = new Date()): boolean {\n return a.getMonth() === b.getMonth() && isSameYear(a, b);\n}\n\nexport function isSameYear(a: Date, b: Date = new Date()): boolean {\n return a.getFullYear() === b.getFullYear();\n}\n\nexport function isToday(date: Date): boolean {\n return isSameDay(date);\n}\n\nexport function isYesterday(date: Date): boolean {\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n\n return isSameDay(date, yesterday);\n}\n\nexport function toUTCUnix(date: Date): number {\n return Math.round(new Date(date.toISOString()).getTime() / 1000);\n}\n\nexport function relativeFormatDate(date: Moment, formatMessage: ReturnType<typeof useIntl>['formatMessage'], format?: string): string {\n const now = moment();\n const inputDate = moment(date);\n\n if (inputDate.isSame(now, 'day')) {\n return formatMessage({id: 'date_separator.today', defaultMessage: 'Today'});\n } else if (inputDate.isSame(now.clone().subtract(1, 'days'), 'day')) {\n return formatMessage({id: 'date_separator.yesterday', defaultMessage: 'Yesterday'});\n } else if (inputDate.isSame(now.clone().add(1, 'days'), 'day')) {\n return formatMessage({id: 'date_separator.tomorrow', defaultMessage: 'Tomorrow'});\n }\n\n if (format) {\n return DateTime.fromJSDate(date.toDate()).toFormat(format);\n }\n\n return DateTime.fromJSDate(date.toDate()).toLocaleString();\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport default class DelayedAction {\n private action: () => void;\n private timer: number;\n\n public constructor(action: () => void) {\n this.action = action;\n\n this.timer = -1;\n\n // bind fire since it doesn't get passed the correct this value with setTimeout\n this.fire = this.fire.bind(this);\n }\n\n public fire() {\n this.action();\n\n this.timer = -1;\n }\n\n public fireAfter(timeout: number) {\n if (this.timer >= 0) {\n window.clearTimeout(this.timer);\n }\n\n this.timer = window.setTimeout(this.fire, timeout);\n }\n\n public cancel() {\n window.clearTimeout(this.timer);\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport exif2css from 'exif2css';\n\nimport type {ClientConfig} from '@mattermost/types/config';\n\nimport Constants from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\n\nexport const FileSizes = {\n Bit: 1,\n Byte: 1 * 8,\n Kilobyte: 1 * 8 * 1024,\n Megabyte: 1 * 8 * 1024 * 1024,\n Gigabyte: 1 * 8 * 1024 * 1024 * 1024,\n};\n\nexport function canUploadFiles(config: Partial<ClientConfig>): boolean {\n const enableFileAttachments = isFileAttachmentsEnabled(config);\n const enableMobileFileUpload = isMobileFileUploadsEnabled(config);\n\n if (!enableFileAttachments) {\n return false;\n }\n\n if (UserAgent.isMobileApp()) {\n return enableMobileFileUpload;\n }\n\n return true;\n}\n\nexport function isFileAttachmentsEnabled(config: Partial<ClientConfig>): boolean {\n return config.EnableFileAttachments === 'true';\n}\n\nexport function isMobileFileUploadsEnabled(config: Partial<ClientConfig>): boolean {\n return config.EnableMobileFileUpload === 'true';\n}\n\nexport function isPublicLinksEnabled(config: Partial<ClientConfig>): boolean {\n return config.EnablePublicLink === 'true';\n}\n\nexport function canDownloadFiles(config: Partial<ClientConfig>): boolean {\n if (UserAgent.isMobileApp()) {\n return config.EnableMobileFileDownload === 'true';\n }\n\n return true;\n}\n\nexport function trimFilename(filename: string) {\n let trimmedFilename = filename;\n if (filename.length > Constants.MAX_FILENAME_LENGTH) {\n trimmedFilename = filename.substring(0, Math.min(Constants.MAX_FILENAME_LENGTH, filename.length)) + '...';\n }\n\n return trimmedFilename;\n}\n\nexport function getFileTypeFromMime(mimetype: string) {\n const mimeTypeSplitBySlash = mimetype.split('/');\n const mimeTypePrefix = mimeTypeSplitBySlash[0];\n const mimeTypeSuffix = mimeTypeSplitBySlash[1];\n\n if (mimeTypePrefix === 'video') {\n return 'video';\n } else if (mimeTypePrefix === 'audio') {\n return 'audio';\n } else if (mimeTypePrefix === 'image') {\n return 'image';\n }\n\n if (mimeTypeSuffix) {\n if (mimeTypeSuffix === 'pdf') {\n return 'pdf';\n } else if (mimeTypeSuffix.includes('vnd.ms-excel') || mimeTypeSuffix.includes('spreadsheetml') || mimeTypeSuffix.includes('vnd.sun.xml.calc') || mimeTypeSuffix.includes('opendocument.spreadsheet')) {\n return 'spreadsheet';\n } else if (mimeTypeSuffix.includes('vnd.ms-powerpoint') || mimeTypeSuffix.includes('presentationml') || mimeTypeSuffix.includes('vnd.sun.xml.impress') || mimeTypeSuffix.includes('opendocument.presentation')) {\n return 'presentation';\n } else if ((mimeTypeSuffix === 'msword') || mimeTypeSuffix.includes('vnd.ms-word') || mimeTypeSuffix.includes('officedocument.wordprocessingml') || mimeTypeSuffix.includes('application/x-mswrite')) {\n return 'word';\n }\n }\n\n return 'other';\n}\n\n// based on https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side/32490603#32490603\nexport function getExifOrientation(data: ArrayBufferLike) {\n const view = new DataView(data);\n\n if (view.getUint16(0, false) !== 0xFFD8) {\n return -2;\n }\n\n const length = view.byteLength;\n let offset = 2;\n\n while (offset < length) {\n const marker = view.getUint16(offset, false);\n offset += 2;\n\n if (marker === 0xFFE1) {\n if (view.getUint32(offset += 2, false) !== 0x45786966) {\n return -1;\n }\n\n const little = view.getUint16(offset += 6, false) === 0x4949;\n offset += view.getUint32(offset + 4, little);\n const tags = view.getUint16(offset, little);\n offset += 2;\n\n for (let i = 0; i < tags; i++) {\n if (view.getUint16(offset + (i * 12), little) === 0x0112) {\n return view.getUint16(offset + (i * 12) + 8, little);\n }\n }\n } else if ((marker & 0xFF00) === 0xFF00) {\n offset += view.getUint16(offset, false);\n } else {\n break;\n }\n }\n return -1;\n}\n\nexport function getOrientationStyles(orientation: number) {\n const {\n transform,\n 'transform-origin': transformOrigin,\n } = exif2css(orientation);\n return {transform, transformOrigin};\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, createIntl, createIntlCache, type IntlShape, type MessageDescriptor} from 'react-intl';\n\nimport {getCurrentLocale, getTranslations} from 'selectors/i18n';\nimport store from 'stores/redux_store';\n\nconst cache = createIntlCache();\n\n// getIntl returns an instance of IntlShape for the current locale.\n// Prefer `useIntl` and `FormattedMessage` and only use this selectively when\n// outside of React components.\nexport function getIntl(): IntlShape {\n const state = store.getState();\n const locale = getCurrentLocale(state);\n\n return createIntl({\n locale,\n messages: getTranslations(state, locale),\n }, cache);\n}\n\nexport function isMessageDescriptor(descriptor: unknown): descriptor is MessageDescriptor {\n return Boolean(descriptor && (descriptor as MessageDescriptor).id);\n}\n\nexport function formatAsString(formatMessage: IntlShape['formatMessage'], messageOrDescriptor: string | MessageDescriptor | undefined): string | undefined {\n if (!messageOrDescriptor) {\n return undefined;\n }\n\n if (isMessageDescriptor(messageOrDescriptor)) {\n return formatMessage(messageOrDescriptor);\n }\n\n return messageOrDescriptor;\n}\n\nexport function formatAsComponent(messageOrComponent: React.ReactNode | MessageDescriptor): React.ReactNode {\n if (isMessageDescriptor(messageOrComponent)) {\n return <FormattedMessage {...messageOrComponent}/>;\n }\n\n return messageOrComponent;\n}\n\nexport function getMonthLong(locale: string): 'short' | 'long' {\n if (locale === 'ko') {\n // Long and short are equivalent in Korean except long has a bug on IE11/Windows 7\n return 'short';\n }\n\n return 'long';\n}\n\n/**\n * @deprecated Use react-intl methods such as formatMessage, FormattedMessage, defineMessage, defineMessages.\n */\nexport function t(v: string): string {\n return v;\n}\n\nexport interface Message {\n id: string;\n defaultMessage: string;\n values?: Record<string, any>;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport moment from 'moment';\n\nimport type {Product} from '@mattermost/types/cloud';\nimport type {ClientLicense} from '@mattermost/types/config';\n\nimport {CloudProducts, LicenseSkus, SelfHostedProducts} from 'utils/constants';\n\nconst LICENSE_EXPIRY_NOTIFICATION = 1000 * 60 * 60 * 24 * 60; // 60 days\nconst LICENSE_GRACE_PERIOD = 1000 * 60 * 60 * 24 * 10; // 10 days\n\nexport function isLicenseExpiring(license: ClientLicense) {\n // Skip license expiration checks for cloud licenses\n if (license.IsLicensed !== 'true' || isCloudLicense(license)) {\n return false;\n }\n\n if (license.IsTrial === 'true') {\n return true;\n }\n\n const timeDiff = parseInt(license.ExpiresAt, 10) - Date.now();\n return timeDiff <= LICENSE_EXPIRY_NOTIFICATION;\n}\n\nexport function daysToLicenseExpire(license: ClientLicense) {\n if (license.IsLicensed !== 'true' || isCloudLicense(license)) {\n return undefined;\n }\n\n const endDate = new Date(parseInt(license?.ExpiresAt, 10));\n return moment(endDate).startOf('day').diff(moment().startOf('day'), 'days');\n}\n\nexport function isLicenseExpired(license: ClientLicense) {\n if (license.IsLicensed !== 'true' || isCloudLicense(license)) {\n return false;\n }\n\n const endDate = new Date(parseInt(license?.ExpiresAt, 10));\n const timeDiff = moment(endDate).startOf('day').diff(moment().startOf('day'), 'days');\n return timeDiff < 0;\n}\n\nexport function isLicensePastGracePeriod(license: ClientLicense) {\n if (license.IsLicensed !== 'true' || isCloudLicense(license)) {\n return false;\n }\n\n const timeDiff = Date.now() - parseInt(license.ExpiresAt, 10);\n return timeDiff > LICENSE_GRACE_PERIOD;\n}\n\nexport function isTrialLicense(license: ClientLicense) {\n if (license.IsLicensed !== 'true') {\n return false;\n }\n\n if (license.IsTrial === 'true') {\n return true;\n }\n\n // Currently all trial licenses are issued with a 30 day, 8 hours duration.\n // We're using this logic to detect a trial license until we add the right field in the license itself.\n const timeDiff = parseInt(license.ExpiresAt, 10) - parseInt(license.StartsAt, 10);\n\n // 30 days + 8 hours\n const trialLicenseDuration = (1000 * 60 * 60 * 24 * 30) + (1000 * 60 * 60 * 8);\n\n return timeDiff === trialLicenseDuration;\n}\n\nexport function isCloudLicense(license: ClientLicense) {\n return license?.Cloud === 'true';\n}\n\nexport function getIsStarterLicense(license: ClientLicense) {\n return license?.SkuShortName === LicenseSkus.Starter;\n}\n\nexport function getIsGovSku(license: ClientLicense) {\n return license?.IsGovSku === 'true';\n}\n\nexport function isEnterpriseOrE20License(license: ClientLicense) {\n return license?.SkuShortName === LicenseSkus.Enterprise || license?.SkuShortName === LicenseSkus.E20;\n}\n\nexport const isEnterpriseLicense = (license?: ClientLicense) => {\n switch (license?.SkuShortName) {\n case LicenseSkus.Enterprise:\n case LicenseSkus.E20:\n return true;\n }\n\n return false;\n};\n\nexport const isNonEnterpriseLicense = (license?: ClientLicense) => !isEnterpriseLicense(license);\n\nexport const licenseSKUWithFirstLetterCapitalized = (license: ClientLicense) => {\n const sku = license.SkuShortName;\n return sku.charAt(0).toUpperCase() + sku.slice(1);\n};\n\nexport function isEnterpriseOrCloudOrSKUStarterFree(license: ClientLicense, subscriptionProduct: Product | undefined, isEnterpriseReady: boolean) {\n const isCloud = license?.Cloud === 'true';\n const isCloudStarterFree = isCloud && subscriptionProduct?.sku === CloudProducts.STARTER;\n\n const isSelfHostedStarter = isEnterpriseReady && (license.IsLicensed === 'false');\n\n const isStarterSKULicense = license.IsLicensed === 'true' && license.SelfHostedProducts === SelfHostedProducts.STARTER;\n\n return isCloudStarterFree || isSelfHostedStarter || isStarterSKULicense;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {FormatNumberOptions} from 'react-intl';\n\nimport type {CloudUsage, Limits} from '@mattermost/types/cloud';\n\nimport {FileSizes} from './file_utils';\n\nexport function asGBString(bits: number, formatNumber: (b: number, options: FormatNumberOptions) => string): string {\n return `${formatNumber(bits / FileSizes.Gigabyte, {maximumFractionDigits: 1})}GB`;\n}\n\nexport function inK(num: number): string {\n return `${Math.floor(num / 1000)}K`;\n}\n\n// usage percent meaning 0-100 (for use in usage bar)\nexport function toUsagePercent(usage: number, limit: number): number {\n return Math.floor((usage / limit) * 100);\n}\n\n// These are to be used when we need values\n// even if network requests are failing for some reason.\n// Use as a fallback.\nexport const fallbackStarterLimits = {\n messages: {\n history: 10000,\n },\n files: {\n totalStorage: Number(FileSizes.Gigabyte),\n },\n teams: {\n active: 1,\n },\n};\n\n// A positive usage value means they are over the limit. This function simply tells you whether ANY LIMIT has been reached/surpassed.\nexport function anyUsageDeltaExceededLimit(deltas: CloudUsage) {\n let foundAPositive = false;\n\n // JSON.parse recursively moves through the object tree, passing the key and value post transformation\n // We can use the `reviver` argument to see if any of those arguments are numbers, and negative.\n JSON.parse(JSON.stringify(deltas), (key, value) => {\n if (typeof value === 'number' && value > 0) {\n foundAPositive = true;\n }\n });\n return foundAPositive;\n}\n\nexport function hasSomeLimits(limits: Limits): boolean {\n return Object.keys(limits).length > 0;\n}\n\nexport const limitThresholds = Object.freeze({\n ok: 0,\n warn: 50,\n danger: 66,\n reached: 100,\n exceeded: 100.000001,\n});\n\nexport const LimitTypes = {\n messageHistory: 'messageHistory',\n fileStorage: 'fileStorage',\n} as const;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport type MarkdownMode = 'bold' | 'italic' | 'link' | 'strike' | 'code' | 'heading' | 'quote' | 'ul' | 'ol'\n\nexport type ApplyMarkdownOptions = {\n markdownMode: MarkdownMode;\n selectionStart: number | null;\n selectionEnd: number | null;\n message: string;\n}\n\ntype ApplyMarkdownReturnValue = {\n selectionStart: number;\n selectionEnd: number;\n message: string;\n}\n\ntype ApplySpecificMarkdownOptions = ApplyMarkdownReturnValue & {\n delimiter?: string;\n delimiterStart?: string;\n delimiterEnd?: string;\n}\n\nexport type ApplyLinkMarkdownOptions = ApplySpecificMarkdownOptions & {\n url?: string;\n\n}\n\nexport function applyMarkdown(options: ApplyMarkdownOptions): ApplyMarkdownReturnValue {\n const {selectionEnd, selectionStart, message, markdownMode} = options;\n\n if (selectionStart === null || selectionEnd === null) {\n /**\n * in case we do not get the selectionStart or selectionEnd values\n * from the textbox we simply set it to be at the end of the message\n * string and return the message without changing it.\n *\n * This should never happen, so this just serves as an insurance fallback for very strange browser-bugs!\n */\n return {\n message,\n selectionStart: message.length,\n selectionEnd: message.length,\n };\n }\n\n let delimiter: string;\n\n /**\n * all options that need to be handled in a ver specific way have their own applyMarkdown (sub-)functions.\n * The rest just define their delimiters and return the basic applyMarkdownToSelection function.\n *\n * In a strange case where nothing works we throw an error.\n */\n switch (markdownMode) {\n case 'bold':\n return applyBoldMarkdown({selectionEnd, selectionStart, message});\n case 'italic':\n return applyItalicMarkdown({selectionEnd, selectionStart, message});\n case 'link':\n return applyLinkMarkdown({selectionEnd, selectionStart, message});\n case 'ol':\n return applyOlMarkdown({selectionEnd, selectionStart, message});\n case 'ul':\n delimiter = '- ';\n return applyMarkdownToSelectedLines({selectionEnd, selectionStart, message, delimiter});\n case 'heading':\n delimiter = '### ';\n return applyMarkdownToSelectedLines({selectionEnd, selectionStart, message, delimiter});\n case 'quote':\n delimiter = '> ';\n return applyMarkdownToSelectedLines({selectionEnd, selectionStart, message, delimiter});\n case 'strike':\n delimiter = '~~';\n return applyMarkdownToSelection({selectionEnd, selectionStart, message, delimiter});\n case 'code':\n return applyCodeMarkdown({selectionEnd, selectionStart, message});\n }\n\n throw Error('Unsupported markdown mode: ' + markdownMode);\n}\n\nconst getMultilineSuffix = (suffix: string): string => {\n if (suffix.startsWith('\\n')) {\n return '';\n }\n\n return suffix.indexOf('\\n') === -1 ? suffix : suffix.slice(0, suffix.indexOf('\\n'));\n};\n\nconst getNewSuffix = (suffix: string): string => {\n if (suffix.startsWith('\\n')) {\n return suffix;\n }\n\n return suffix.indexOf('\\n') === -1 ? '' : suffix.slice(suffix.indexOf('\\n'));\n};\n\nconst applyOlMarkdown = ({selectionEnd, selectionStart, message}: ApplySpecificMarkdownOptions) => {\n const prefix = message.slice(0, selectionStart);\n const selection = message.slice(selectionStart, selectionEnd);\n const suffix = message.slice(selectionEnd);\n\n const newPrefix = prefix.includes('\\n') ? prefix.slice(0, prefix.lastIndexOf('\\n')) : '';\n\n const multilineSuffix = getMultilineSuffix(suffix);\n const newSuffix = getNewSuffix(suffix);\n\n const delimiterLength = 3;\n const getDelimiter = (num?: number) => {\n getDelimiter.counter = num || getDelimiter.counter;\n return `${getDelimiter.counter++}. `;\n };\n getDelimiter.counter = 1;\n\n const multilinePrefix = prefix.includes('\\n') ? prefix.slice(prefix.lastIndexOf('\\n')) : prefix;\n let multilineSelection = multilinePrefix + selection + multilineSuffix;\n const isFirstLineSelected = !multilineSelection.startsWith('\\n');\n\n if (selection.startsWith('\\n')) {\n multilineSelection = prefix + selection + multilineSuffix;\n }\n\n const getHasCurrentMarkdown = (): boolean => {\n const linesQuantity = (multilineSelection.match(/\\n/g) || []).length;\n const newLinesWithDelimitersQuantity = (multilineSelection.match(/\\n\\d\\. /g) || []).length;\n\n if (newLinesWithDelimitersQuantity === linesQuantity && !isFirstLineSelected) {\n return true;\n }\n\n return linesQuantity === newLinesWithDelimitersQuantity && (/^\\d\\. /).test(multilineSelection);\n };\n\n let newValue: string;\n let newStart: number;\n let newEnd: number;\n\n if (getHasCurrentMarkdown()) {\n // clear first line from delimiter\n if (isFirstLineSelected) {\n multilineSelection = multilineSelection.slice(delimiterLength);\n }\n\n newValue = newPrefix + multilineSelection.replace(/\\n\\d\\. /g, '\\n') + newSuffix;\n let count = 0;\n\n if (isFirstLineSelected) {\n count++;\n }\n count += (multilineSelection.match(/\\n/g) || []).length;\n\n newStart = Math.max(selectionStart - delimiterLength, 0);\n newEnd = Math.max(selectionEnd - (delimiterLength * count), 0);\n } else {\n let count = 0;\n if (isFirstLineSelected) {\n multilineSelection = getDelimiter() + multilineSelection;\n count++;\n }\n const selectionArr = Array.from(multilineSelection);\n for (let i = 0; i < selectionArr.length; i++) {\n if (selectionArr[i] === '\\n') {\n selectionArr[i] = `\\n${getDelimiter()}`;\n }\n }\n multilineSelection = selectionArr.join('');\n newValue = newPrefix + multilineSelection + newSuffix;\n\n count += (multilineSelection.match(new RegExp('\\\\n', 'g')) || []).length;\n\n newStart = selectionStart + delimiterLength;\n newEnd = selectionEnd + (delimiterLength * count);\n }\n\n return {\n message: newValue,\n selectionStart: newStart,\n selectionEnd: newEnd,\n };\n};\n\nexport const applyMarkdownToSelectedLines = ({\n selectionEnd,\n selectionStart,\n message,\n delimiter,\n}: ApplySpecificMarkdownOptions) => {\n if (!delimiter) {\n /**\n * in case no delimiter is set return the values without changing anything\n */\n return {\n message,\n selectionStart,\n selectionEnd,\n };\n }\n\n const prefix = message.slice(0, selectionStart);\n const selection = message.slice(selectionStart, selectionEnd);\n const suffix = message.slice(selectionEnd);\n\n const newPrefix = prefix.includes('\\n') ? prefix.slice(0, prefix.lastIndexOf('\\n')) : '';\n const multilinePrefix = prefix.includes('\\n') ? prefix.slice(prefix.lastIndexOf('\\n')) : prefix;\n\n const multilineSuffix = getMultilineSuffix(suffix);\n const newSuffix = getNewSuffix(suffix);\n let multilineSelection: string = multilinePrefix + selection + multilineSuffix;\n\n const isFirstLineSelected = !multilineSelection.startsWith('\\n');\n\n if (selection.startsWith('\\n')) {\n multilineSelection = prefix + selection + multilineSuffix;\n }\n\n const getHasCurrentMarkdown = (): boolean => {\n const linesQuantity = (multilineSelection.match(/\\n/g) || []).length;\n const newLinesWithDelimitersQuantity = (multilineSelection.match(new RegExp(`\\n${delimiter}`, 'g')) || []).\n length;\n\n if (newLinesWithDelimitersQuantity === linesQuantity && !isFirstLineSelected) {\n return true;\n }\n\n return linesQuantity === newLinesWithDelimitersQuantity && multilineSelection.startsWith(delimiter);\n };\n\n let newValue: string;\n let newStart: number;\n let newEnd: number;\n\n if (getHasCurrentMarkdown()) {\n // clear first line from delimiter\n if (isFirstLineSelected) {\n multilineSelection = multilineSelection.slice(delimiter.length);\n }\n\n newValue = newPrefix + multilineSelection.replace(new RegExp(`\\n${delimiter}`, 'g'), '\\n') + newSuffix;\n let count = 0;\n if (isFirstLineSelected) {\n count++;\n }\n count += (multilineSelection.match(/\\n/g) || []).length;\n\n newStart = Math.max(selectionStart - delimiter.length, 0);\n newEnd = Math.max(selectionEnd - (delimiter.length * count), 0);\n } else {\n newValue = newPrefix + multilineSelection.replace(/\\n/g, `\\n${delimiter}`) + newSuffix;\n let count = 0;\n if (isFirstLineSelected) {\n newValue = delimiter + newValue;\n count++;\n }\n\n count += (multilineSelection.match(new RegExp('\\\\n', 'g')) || []).length;\n\n newStart = selectionStart + delimiter.length;\n newEnd = selectionEnd + (delimiter.length * count);\n }\n\n return {\n message: newValue,\n selectionStart: newStart,\n selectionEnd: newEnd,\n };\n};\n\nconst applyMarkdownToSelection = ({\n selectionEnd,\n selectionStart,\n message,\n delimiter,\n delimiterStart,\n delimiterEnd,\n}: ApplySpecificMarkdownOptions) => {\n const openingDelimiter = delimiterStart ?? delimiter;\n const closingDelimiter = delimiterEnd ?? delimiter;\n if (!openingDelimiter || !closingDelimiter) {\n /**\n * in case no delimiter is set return the values without changing anything\n */\n return {\n message,\n selectionStart,\n selectionEnd,\n };\n }\n\n // the part of the message that comes before the selection\n let prefix = message.slice(0, selectionStart);\n\n // the selected part of the message where the markdown needs to be added/removed\n let selection = message.slice(selectionStart, selectionEnd);\n\n // the part of the message that comes after the selection\n let suffix = message.slice(selectionEnd);\n\n // Does the selection have current hotkey's markdown?\n const hasCurrentMarkdown = prefix.endsWith(openingDelimiter) && suffix.startsWith(closingDelimiter);\n\n let newValue: string;\n let newStart = selectionStart;\n let newEnd = selectionEnd;\n\n if (selection.endsWith(' ')) {\n selection = selection.slice(0, -1);\n suffix = ` ${suffix}`;\n newEnd -= 1;\n }\n\n if (selection.startsWith(' ')) {\n selection = selection.slice(1);\n prefix = `${prefix} `;\n newStart += 1;\n }\n\n if (hasCurrentMarkdown) {\n // selection already has the markdown, so we remove it here\n newValue = prefix.slice(0, prefix.length - openingDelimiter.length) + selection + suffix.slice(closingDelimiter.length);\n newStart -= openingDelimiter.length;\n newEnd -= closingDelimiter.length;\n } else {\n // add markdown to the selection\n newValue = prefix + openingDelimiter + selection + closingDelimiter + suffix;\n newStart += openingDelimiter.length;\n newEnd += closingDelimiter.length;\n }\n\n return {\n message: newValue,\n selectionStart: newStart,\n selectionEnd: newEnd,\n };\n};\n\nfunction applyBoldMarkdown(options: ApplySpecificMarkdownOptions) {\n return applyBoldItalicMarkdown({...options, markdownMode: 'bold'});\n}\n\nfunction applyItalicMarkdown(options: ApplySpecificMarkdownOptions) {\n return applyBoldItalicMarkdown({...options, markdownMode: 'italic'});\n}\n\nfunction applyBoldItalicMarkdown({selectionEnd, selectionStart, message, markdownMode}: ApplySpecificMarkdownOptions & Pick<ApplyMarkdownOptions, 'markdownMode'>) {\n const BOLD_MD = '**';\n const ITALIC_MD = '*';\n\n const isForceItalic = markdownMode === 'italic';\n const isForceBold = markdownMode === 'bold';\n\n let prefix = message.slice(0, selectionStart);\n let selection = message.slice(selectionStart, selectionEnd);\n let suffix = message.slice(selectionEnd);\n\n let newValue: string;\n let newStart = selectionStart;\n let newEnd = selectionEnd;\n\n if (selection.endsWith(' ')) {\n selection = selection.slice(0, -1);\n suffix = ` ${suffix}`;\n newEnd -= 1;\n }\n\n if (selection.startsWith(' ')) {\n selection = selection.slice(1);\n prefix = `${prefix} `;\n newStart += 1;\n }\n\n // Is it italic hot key on existing bold markdown? i.e. italic on **haha**\n let isItalicFollowedByBold = false;\n let delimiter = '';\n\n if (isForceBold) {\n delimiter = BOLD_MD;\n } else if (isForceItalic) {\n delimiter = ITALIC_MD;\n isItalicFollowedByBold = prefix.endsWith(BOLD_MD) && suffix.startsWith(BOLD_MD);\n }\n\n // Does the selection have current hotkey's markdown?\n const hasCurrentMarkdown = prefix.endsWith(delimiter) && suffix.startsWith(delimiter);\n\n // Does current selection have both of the markdown around it? i.e. ***haha***\n const hasItalicAndBold = prefix.endsWith(BOLD_MD + ITALIC_MD) && suffix.startsWith(BOLD_MD + ITALIC_MD);\n\n if (hasItalicAndBold || (hasCurrentMarkdown && !isItalicFollowedByBold)) {\n // message already has the markdown; remove it\n newValue = prefix.slice(0, prefix.length - delimiter.length) + selection + suffix.slice(delimiter.length);\n newStart -= delimiter.length;\n newEnd -= delimiter.length;\n } else {\n // Add italic or bold markdown\n newValue = prefix + delimiter + selection + delimiter + suffix;\n newStart += delimiter.length;\n newEnd += delimiter.length;\n }\n\n return {\n message: newValue,\n selectionStart: newStart,\n selectionEnd: newEnd,\n };\n}\n\nexport const DEFAULT_PLACEHOLDER_URL = 'url';\n\nexport function applyLinkMarkdown({selectionEnd, selectionStart, message, url = DEFAULT_PLACEHOLDER_URL}: ApplyLinkMarkdownOptions) {\n // <prefix> <selection> <suffix>\n const prefix = message.slice(0, selectionStart);\n const selection = message.slice(selectionStart, selectionEnd);\n const suffix = message.slice(selectionEnd);\n\n const delimiterStart = '[';\n const delimiterEnd = `](${url})`;\n\n // Does the selection have link markdown?\n const hasMarkdown = prefix.endsWith(delimiterStart) && suffix.startsWith(delimiterEnd);\n\n let newValue: string;\n let newStart: number;\n let newEnd: number;\n\n // When url is to be selected in [...](url), selection cursors need to shift by this much.\n const urlShift = delimiterStart.length + 2; // ']'.length + ']('.length\n if (hasMarkdown) {\n // message already has the markdown; remove it\n newValue =\n prefix.slice(0, prefix.length - delimiterStart.length) +\n selection +\n suffix.slice(delimiterEnd.length);\n newStart = selectionStart - delimiterStart.length;\n newEnd = selectionEnd - delimiterStart.length;\n } else if (message.length === 0) {\n // no input; Add [|](url)\n newValue = delimiterStart + delimiterEnd;\n newStart = delimiterStart.length;\n newEnd = delimiterStart.length;\n } else if (selectionStart < selectionEnd) {\n // there is something selected; put markdown around it and preserve selection\n newValue = prefix + delimiterStart + selection + delimiterEnd + suffix;\n newStart = selectionEnd + urlShift;\n newEnd = newStart + url.length;\n } else {\n // nothing is selected\n const spaceBefore = prefix.charAt(prefix.length - 1) === ' ';\n const spaceAfter = suffix.charAt(0) === ' ';\n const cursorBeforeWord =\n (selectionStart !== 0 && spaceBefore && !spaceAfter) || (selectionStart === 0 && !spaceAfter);\n const cursorAfterWord =\n (selectionEnd !== message.length && spaceAfter && !spaceBefore) ||\n (selectionEnd === message.length && !spaceBefore);\n\n if (cursorBeforeWord) {\n // cursor before a word\n const word = message.slice(selectionStart, findWordEnd(message, selectionStart));\n\n newValue = prefix + delimiterStart + word + delimiterEnd + suffix.slice(word.length);\n newStart = selectionStart + word.length + urlShift;\n newEnd = newStart + urlShift;\n } else if (cursorAfterWord) {\n // cursor after a word\n const cursorAtEndOfLine = selectionStart === selectionEnd && selectionEnd === message.length;\n if (cursorAtEndOfLine) {\n // cursor at end of line\n newValue = message + ' ' + delimiterStart + delimiterEnd;\n newStart = selectionEnd + 1 + delimiterStart.length;\n newEnd = newStart;\n } else {\n // cursor not at end of line\n const word = message.slice(findWordStart(message, selectionStart), selectionStart);\n\n newValue =\n prefix.slice(0, prefix.length - word.length) + delimiterStart + word + delimiterEnd + suffix;\n newStart = selectionStart + urlShift;\n newEnd = newStart + urlShift;\n }\n } else {\n // cursor is in between a word\n const wordStart = findWordStart(message, selectionStart);\n const wordEnd = findWordEnd(message, selectionStart);\n const word = message.slice(wordStart, wordEnd);\n\n newValue = prefix.slice(0, wordStart) + delimiterStart + word + delimiterEnd + message.slice(wordEnd);\n newStart = wordEnd + urlShift;\n newEnd = newStart + urlShift;\n }\n }\n\n return {\n message: newValue,\n selectionStart: newStart,\n selectionEnd: newEnd,\n };\n}\n\nfunction applyCodeMarkdown({selectionEnd, selectionStart, message}: ApplySpecificMarkdownOptions) {\n if (isSelectionMultiline(message, selectionStart, selectionEnd)) {\n return applyMarkdownToSelection({selectionEnd, selectionStart, message, delimiterStart: '```\\n', delimiterEnd: '\\n```'});\n }\n return applyMarkdownToSelection({selectionEnd, selectionStart, message, delimiter: '`'});\n}\n\nfunction findWordEnd(text: string, start: number) {\n const wordEnd = text.indexOf(' ', start);\n return wordEnd === -1 ? text.length : wordEnd;\n}\n\nfunction findWordStart(text: string, start: number) {\n const wordStart = text.lastIndexOf(' ', start - 1) + 1;\n return wordStart === -1 ? 0 : wordStart;\n}\n\nfunction isSelectionMultiline(message: string, selectionStart: number, selectionEnd: number) {\n return message.slice(selectionStart, selectionEnd).includes('\\n');\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\n\ntype Props = {\n plan: string;\n}\n\nfunction AtPlanMention(props: Props) {\n const openPricingModal = useOpenPricingModal();\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n e.preventDefault();\n openPricingModal({trackingLocation: 'notify_admin_message_view'});\n };\n return (\n <a\n id='at_plan_mention'\n onClick={handleClick}\n >\n {props.plan}\n </a>\n\n );\n}\n\nexport default AtPlanMention;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {useHistory} from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getMissingProfilesByIds} from 'mattermost-redux/actions/users';\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {getUsers, getUserStatuses} from 'mattermost-redux/selectors/entities/users';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions';\nimport {closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport MemberList from 'components/channel_members_rhs/member_list';\n\nimport {ModalIdentifiers} from 'utils/constants';\nimport {mapFeatureIdToTranslation} from 'utils/notify_admin_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport './notification_from_members_modal.scss';\n\ntype Props = {\n feature: string;\n userIds: string[];\n}\n\nexport interface ChannelMember {\n user: UserProfile;\n membership?: ChannelMembership;\n status?: string;\n displayName: string;\n}\n\nenum ListItemType {\n Member = 'member',\n FirstSeparator = 'first-separator',\n Separator = 'separator',\n}\n\nexport interface ListItem {\n type: ListItemType;\n data: ChannelMember | JSX.Element;\n}\n\nconst MembersContainer = styled.div`\n flex: 1 1 auto;\n padding: 0 4px 16px;\n min-height: 500px;\n height: auto;\n width: 100%;\n overflow: auto;\n`;\n\nconst unknownUser: UserProfile = {id: 'unknown', username: 'unknown'} as UserProfile;\n\nfunction NotificationFromMembersModal(props: Props) {\n const dispatch = useDispatch();\n const history = useHistory();\n const {formatMessage} = useIntl();\n\n useEffect(() => {\n dispatch(getMissingProfilesByIds(props.userIds));\n }, [dispatch, props.userIds]);\n\n const channel = useSelector(getCurrentChannel);\n const teamUrl = useSelector(getCurrentRelativeTeamUrl);\n const userProfiles = useSelector(getUsers);\n const userStatuses = useSelector(getUserStatuses);\n const displaySetting = useSelector(getTeammateNameDisplaySetting);\n const show = useSelector((state: GlobalState) => isModalOpen(state, ModalIdentifiers.SUM_OF_MEMBERS_MODAL));\n\n const members: ListItem[] = props.userIds.map((userId: string) => {\n const user = userProfiles[userId];\n const status = userStatuses[userId];\n const displayName = displayUsername(user, displaySetting);\n return {\n type: ListItemType.Member,\n data: {\n user: user || unknownUser,\n displayName,\n status,\n },\n };\n });\n\n const openDirectMessage = useCallback(async (user: UserProfile) => {\n // we first prepare the DM channel...\n await dispatch(openDirectChannelToUserId(user.id));\n\n // ... and then redirect to it\n history.push(teamUrl + '/messages/@' + user.username);\n }, [openDirectChannelToUserId, history, teamUrl]);\n\n const handleOnClose = () => {\n dispatch(closeModal(ModalIdentifiers.SUM_OF_MEMBERS_MODAL));\n };\n\n const loadMore = () => {};\n\n if (!show) {\n return null;\n }\n\n if (!channel) {\n return null;\n }\n\n const modalTitle = formatMessage({id: 'postypes.custom_open_pricing_modal_post_renderer.membersThatRequested', defaultMessage: 'Members that requested '});\n\n const modalHeaderText = (\n <h1\n id='invitation_modal_title'\n className='modal-title'\n >\n {`${modalTitle}${mapFeatureIdToTranslation(props.feature, formatMessage)}`}\n </h1>\n );\n\n return (\n <GenericModal\n id='notificationFromMembersModal'\n className='NotificationFromMembersModal'\n backdrop={true}\n show={show}\n onExited={handleOnClose}\n aria-modal='true'\n modalHeaderText={modalHeaderText}\n >\n <MembersContainer>\n <MemberList\n channel={channel}\n members={members}\n searchTerms={''}\n editing={false}\n openDirectMessage={openDirectMessage}\n loadMore={loadMore}\n hasNextPage={false}\n isNextPageLoading={false}\n />\n </MembersContainer>\n </GenericModal>\n );\n}\n\nexport default NotificationFromMembersModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {MattermostFeatures} from './constants';\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function mapFeatureIdToTranslation(id: string, formatMessage: Function): string {\n switch (id) {\n case MattermostFeatures.GUEST_ACCOUNTS:\n return formatMessage({id: 'webapp.mattermost.feature.guest_accounts', defaultMessage: 'Guest Accounts'});\n case MattermostFeatures.CUSTOM_USER_GROUPS:\n return formatMessage({id: 'webapp.mattermost.feature.custom_user_groups', defaultMessage: 'Custom User groups'});\n case MattermostFeatures.CREATE_MULTIPLE_TEAMS:\n return formatMessage({id: 'webapp.mattermost.feature.create_multiple_teams', defaultMessage: 'Create Multiple Teams'});\n case MattermostFeatures.START_CALL:\n return formatMessage({id: 'webapp.mattermost.feature.start_call', defaultMessage: 'Start call'});\n case MattermostFeatures.PLAYBOOKS_RETRO:\n return formatMessage({id: 'webapp.mattermost.feature.playbooks_retro', defaultMessage: 'Playbooks Retrospective'});\n case MattermostFeatures.UNLIMITED_MESSAGES:\n return formatMessage({id: 'webapp.mattermost.feature.unlimited_messages', defaultMessage: 'Unlimited Messages'});\n case MattermostFeatures.UNLIMITED_FILE_STORAGE:\n return formatMessage({id: 'webapp.mattermost.feature.unlimited_file_storage', defaultMessage: 'Unlimited File Storage'});\n case MattermostFeatures.ALL_PROFESSIONAL_FEATURES:\n return formatMessage({id: 'webapp.mattermost.feature.all_professional', defaultMessage: 'All Professional features'});\n case MattermostFeatures.ALL_ENTERPRISE_FEATURES:\n return formatMessage({id: 'webapp.mattermost.feature.all_enterprise', defaultMessage: 'All Enterprise features'});\n case MattermostFeatures.UPGRADE_DOWNGRADED_WORKSPACE:\n return formatMessage({id: 'webapp.mattermost.feature.upgrade_downgraded_workspace', defaultMessage: 'Revert the workspace to a paid plan'});\n case MattermostFeatures.HIGHLIGHT_WITHOUT_NOTIFICATION:\n return formatMessage({id: 'webapp.mattermost.feature.highlight_without_notification', defaultMessage: 'Keywords Highlight Without Notification'});\n default:\n return '';\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useDispatch} from 'react-redux';\n\nimport {openModal} from 'actions/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport NotificationFromMembersModal from './notification_from_members_modal';\n\ntype Props = {\n postId: string;\n text: string;\n userIds: string[];\n messageMetadata: Record<string, string>;\n}\n\nfunction AtSumOfMembersMention(props: Props) {\n const dispatch = useDispatch();\n const handleOpen = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n e.preventDefault();\n dispatch(openModal({\n modalId: ModalIdentifiers.SUM_OF_MEMBERS_MODAL,\n dialogType: NotificationFromMembersModal,\n dialogProps: {\n userIds: props.userIds,\n feature: props.messageMetadata.requestedFeature,\n },\n }));\n };\n\n return (\n <>\n <a\n id={`${props.postId}_at_sum_of_members_mention`}\n onClick={handleOpen}\n >\n {props.text}\n </a>\n </>\n\n );\n}\n\nexport default AtSumOfMembersMention;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport CopyButton from 'components/copy_button';\n\nimport * as SyntaxHighlighting from 'utils/syntax_highlighting';\nimport * as TextFormatting from 'utils/text_formatting';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n code: string;\n language: string;\n searchedContent?: string;\n}\n\nconst CodeBlock: React.FC<Props> = ({code, language, searchedContent}: Props) => {\n const getUsedLanguage = useCallback(() => {\n let usedLanguage = language || '';\n usedLanguage = usedLanguage.toLowerCase();\n\n if (usedLanguage === 'texcode' || usedLanguage === 'latexcode') {\n usedLanguage = 'latex';\n }\n\n // treat html as xml to prevent injection attacks\n if (usedLanguage === 'html') {\n usedLanguage = 'xml';\n }\n\n return usedLanguage;\n }, [language]);\n\n const usedLanguage = getUsedLanguage();\n\n let className = 'post-code';\n if (!usedLanguage) {\n className += ' post-code--wrap';\n }\n\n let header: JSX.Element = <></>;\n let lineNumbers: JSX.Element = <></>;\n if (SyntaxHighlighting.canHighlight(usedLanguage)) {\n header = (\n <span className='post-code__language'>\n {SyntaxHighlighting.getLanguageName(usedLanguage)}\n </span>\n );\n lineNumbers = (\n <div className='post-code__line-numbers'>\n {SyntaxHighlighting.renderLineNumbers(code)}\n </div>\n );\n }\n\n // If we have to apply syntax highlighting AND highlighting of search terms, create two copies\n // of the code block, one with syntax highlighting applied and another with invisible text, but\n // search term highlighting and overlap them\n const [content, setContent] = useState(TextFormatting.sanitizeHtml(code));\n useEffect(() => {\n let shouldSetContent = true;\n\n SyntaxHighlighting.highlight(usedLanguage, code).then((content) => {\n // Ensure the component is still mounted and that usedLanguage and code haven't changed to prevent two\n // highlight calls from racing\n if (shouldSetContent) {\n setContent(content);\n }\n });\n\n return () => {\n shouldSetContent = false;\n };\n }, [usedLanguage, code]);\n\n let htmlContent = content;\n if (searchedContent) {\n htmlContent = searchedContent + content;\n }\n\n const codeBlockActions = useSelector((state: GlobalState) => state.plugins.components.CodeBlockAction);\n const pluginItems = codeBlockActions?.\n map((item) => {\n if (!item.component) {\n return null;\n }\n\n const Component = item.component as any;\n return (\n <Component\n key={item.id}\n code={code}\n />\n );\n });\n\n return (\n <div className={className}>\n <div className='post-code__overlay'>\n <CopyButton content={code}/>\n {pluginItems}\n {header}\n </div>\n <div className='hljs'>\n {lineNumbers}\n <code dangerouslySetInnerHTML={{__html: htmlContent}}/>\n </div>\n </div>\n );\n};\n\nexport default CodeBlock;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {KatexOptions} from 'katex';\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport CodeBlock from 'components/code_block/code_block';\n\ntype Katex = typeof import('katex');\n\ntype Props = {\n content: string;\n enableLatex?: boolean;\n};\n\nconst LatexBlock = ({\n content,\n enableLatex,\n}: Props) => {\n const [katex, setKatex] = useState<Katex | undefined>();\n\n useEffect(() => {\n import('katex').then((katex) => {\n setKatex(katex.default);\n });\n }, []);\n\n if (!enableLatex || katex === undefined) {\n return (\n <CodeBlock\n code={content}\n language='latex'\n />\n );\n }\n\n try {\n const katexOptions: KatexOptions = {\n throwOnError: false,\n displayMode: true,\n maxSize: 200,\n maxExpand: 100,\n fleqn: true,\n };\n\n const html = katex.renderToString(content, katexOptions);\n\n return (\n <div\n className='post-body--code tex'\n dangerouslySetInnerHTML={{__html: html}}\n data-testid='latex-enabled'\n />\n );\n } catch (e) {\n // This is never run because throwOnError is false\n return (\n <div\n className='post-body--code tex'\n data-testid='latex-error'\n >\n <FormattedMessage\n id='katex.error'\n defaultMessage={'Couldn\\'t compile your Latex code. Please review the syntax and try again.'}\n />\n </div>\n );\n }\n};\n\nexport default React.memo(LatexBlock);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport LatexBlock from './latex_block';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n return {\n enableLatex: config.EnableLatex === 'true',\n };\n}\n\nexport default connect(mapStateToProps)(LatexBlock);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {KatexOptions} from 'katex';\nimport React, {useState, useEffect} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ntype Katex = typeof import('katex');\n\ntype Props = {\n content: string;\n enableInlineLatex: boolean;\n};\n\nconst LatexInline = ({content, enableInlineLatex}: Props) => {\n const [katex, setKatex] = useState<Katex | undefined>(undefined);\n\n useEffect(() => {\n import('katex').then((katexModule) => {\n setKatex(katexModule.default);\n });\n }, []);\n\n if (!enableInlineLatex || katex === undefined) {\n return (\n <span\n className='post-body--code inline-tex'\n data-testid='latex-disabled'\n >\n {'$' + content + '$'}\n </span>\n );\n }\n\n try {\n const katexOptions: KatexOptions = {\n throwOnError: false,\n displayMode: false,\n maxSize: 200,\n maxExpand: 100,\n fleqn: true,\n };\n\n const html = katex.renderToString(content, katexOptions);\n\n return (\n <span\n className='post-body--code inline-tex'\n data-testid='latex-enabled'\n dangerouslySetInnerHTML={{__html: html}}\n />\n );\n } catch (e) {\n return (\n <span\n className='post-body--code inline-tex'\n data-testid='latex-error'\n >\n <FormattedMessage\n id='katex.error'\n defaultMessage='Could not compile your Latex code. Please review the syntax and try again.'\n />\n </span>\n );\n }\n};\n\nexport default React.memo(LatexInline);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport LatexInline from './latex_inline';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n return {\n enableInlineLatex: config.EnableLatex === 'true' && config.EnableInlineLatex === 'true',\n };\n}\n\nexport default connect(mapStateToProps)(LatexInline);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\n\nimport type {OwnProps, PropsFromRedux} from './index';\n\nimport './markdown_image_expand.scss';\n\ntype Props = OwnProps & PropsFromRedux;\n\nconst MarkdownImageExpand: React.FC<Props> = ({children, alt, isExpanded, postId, toggleInlineImageVisibility, onToggle, imageKey}: Props) => {\n useEffect(() => {\n if (onToggle) {\n onToggle(isExpanded);\n }\n }, [isExpanded]);\n\n const handleToggleButtonClick = () => {\n toggleInlineImageVisibility(postId, imageKey);\n };\n\n const wrapperClassName = `markdown-image-expand ${isExpanded ? 'markdown-image-expand--expanded' : ''}`;\n\n return (\n <div className={wrapperClassName}>\n {\n isExpanded &&\n <>\n <button\n className='markdown-image-expand__collapse-button'\n type='button'\n onClick={handleToggleButtonClick}\n >\n <span className='icon icon-menu-down'/>\n </button>\n {children}\n </>\n }\n\n {\n !isExpanded &&\n <button\n className='markdown-image-expand__expand-button'\n type='button'\n onClick={handleToggleButtonClick}\n >\n <span className='icon icon-menu-right markdown-image-expand__expand-icon'/>\n\n <span className='markdown-image-expand__alt-text'>\n {alt}\n </span>\n </button>\n }\n </div>\n );\n};\n\nexport default MarkdownImageExpand;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ReactNode} from 'react';\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {toggleInlineImageVisibility} from 'actions/post_actions';\nimport {isInlineImageVisible} from 'selectors/posts';\n\nimport type {GlobalState} from 'types/store';\n\nimport MarkdownImageExpand from './markdown_image_expand';\n\nexport type OwnProps = {\n postId: Post['id'];\n imageKey: string;\n alt: string;\n onToggle?: (visible: boolean) => void;\n children: ReactNode;\n}\n\nconst mapStateToProps = (state: GlobalState, {postId, imageKey}: OwnProps) => {\n return {\n isExpanded: isInlineImageVisible(state, postId, imageKey),\n };\n};\n\nconst mapDispatchToProps = {\n toggleInlineImageVisibility,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(MarkdownImageExpand);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport type {KeyboardEvent, MouseEvent} from 'react';\n\nimport type {Post, PostImage} from '@mattermost/types/posts';\n\nimport ExternalImage from 'components/external_image';\nimport ExternalLink from 'components/external_link';\nimport FilePreviewModal from 'components/file_preview_modal';\nimport MarkdownImageExpand from 'components/markdown_image_expand';\nimport SizeAwareImage from 'components/size_aware_image';\n\nimport brokenImageIcon from 'images/icons/brokenimage.png';\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\nexport type Props = {\n alt: string;\n imageMetadata?: PostImage;\n src: string;\n\n // height and width come from the Markdown renderer as either \"auto\" or a string containing a number.\n height: string;\n width: string;\n title: string;\n className: string;\n postId: Post['id'];\n imageIsLink: boolean;\n onImageLoaded?: ({height, width}: {height: number; width: number}) => void;\n onImageHeightChanged?: (isExpanded: boolean) => void;\n postType?: string;\n actions: {\n openModal: <P>(modalData: ModalData<P>) => void;\n };\n hideUtilities?: boolean;\n isUnsafeLinksPost: boolean;\n};\n\ntype State = {\n loadFailed: boolean;\n loaded: boolean;\n};\n\nexport default class MarkdownImage extends PureComponent<Props, State> {\n static defaultProps: Partial<Props> = {\n imageMetadata: {} as PostImage,\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n loadFailed: false,\n loaded: false,\n };\n }\n\n getHeight = () => {\n const {\n height,\n imageMetadata,\n width,\n } = this.props;\n\n if (!imageMetadata) {\n return 0;\n }\n\n if (!height) {\n return imageMetadata.height;\n }\n\n if (height === 'auto') {\n const widthNumber = parseInt(width, 10);\n\n return (imageMetadata.height / imageMetadata.width) * widthNumber;\n }\n\n return parseInt(height, 10);\n };\n\n getFileExtensionFromUrl = (url: string) => {\n const index = url.lastIndexOf('.');\n return index > 0 ? url.substring(index + 1) : null;\n };\n\n showModal = (e: KeyboardEvent<HTMLImageElement> | MouseEvent<HTMLElement>, link = '') => {\n const extension = this.getFileExtensionFromUrl(link);\n\n if (!this.props.imageIsLink && extension) {\n e.preventDefault();\n\n this.props.actions.openModal({\n modalId: ModalIdentifiers.FILE_PREVIEW_MODAL,\n dialogType: FilePreviewModal,\n dialogProps: {\n startIndex: 0,\n postId: this.props.postId,\n fileInfos: [{\n has_preview_image: false,\n link,\n extension: this.props?.imageMetadata?.format ?? extension,\n name: this.props.alt,\n }],\n },\n });\n }\n };\n\n handleLoadFail = () => {\n this.setState({loadFailed: true});\n };\n\n isHeaderChangeMessage = () => {\n return this.props.postType &&\n this.props.postType === Constants.PostTypes.HEADER_CHANGE;\n };\n\n componentDidUpdate(prevProps: Props) {\n this.onUpdated(prevProps.src);\n }\n\n onUpdated = (prevSrc: string) => {\n if (this.props.src && this.props.src !== prevSrc) {\n this.setState({loadFailed: false});\n }\n };\n\n handleImageLoaded = ({height, width}: {height: number; width: number}) => {\n this.setState({\n loaded: true,\n }, () => { // Call onImageLoaded prop only after state has already been set\n if (this.props.onImageLoaded) {\n this.props.onImageLoaded({height, width});\n }\n });\n };\n\n render() {\n const {imageMetadata, src, alt, imageIsLink} = this.props;\n if (src === '' || this.state.loadFailed) {\n let className = 'markdown-inline-img broken-image';\n if (this.isHeaderChangeMessage()) {\n className += ' broken-image--scaled-down';\n }\n\n return (\n <div style={{display: 'inline-block'}}>\n <img\n className={className}\n alt={alt}\n src={brokenImageIcon}\n />\n </div>\n );\n }\n if (this.props.isUnsafeLinksPost) {\n return <>{alt}</>;\n }\n return (\n <ExternalImage\n src={src}\n imageMetadata={imageMetadata}\n >\n {(safeSrc) => {\n if (!safeSrc) {\n return (\n <ExternalLink\n className='theme markdown__link'\n href={src}\n title={this.props.title}\n location='markdown_image'\n >\n {alt}\n </ExternalLink>\n );\n }\n\n const extension = this.getFileExtensionFromUrl(safeSrc);\n\n let className = '';\n if (this.state.loaded) {\n className = imageIsLink || !extension ? `${this.props.className} markdown-inline-img--hover markdown-inline-img--no-border` : `${this.props.className} markdown-inline-img--hover cursor--pointer a11y--active`;\n\n if (this.isHeaderChangeMessage()) {\n className += ' markdown-inline-img--scaled-down';\n }\n } else {\n const loadingClass = this.isHeaderChangeMessage() ? 'markdown-inline-img--scaled-down-loading' : 'markdown-inline-img--loading';\n className = `${this.props.className} ${loadingClass}`;\n }\n\n const {height, width, title, postId, onImageHeightChanged} = this.props;\n const hideUtilities = this.isHeaderChangeMessage() || this.props.hideUtilities;\n\n let imageElement = (\n <SizeAwareImage\n alt={alt}\n className={className}\n src={safeSrc}\n height={height === 'auto' ? undefined : height}\n width={width === 'auto' ? undefined : width}\n title={title}\n dimensions={imageMetadata}\n showLoader={false}\n onClick={this.showModal}\n hideUtilities={hideUtilities}\n onImageLoadFail={this.handleLoadFail}\n onImageLoaded={this.handleImageLoaded}\n />\n );\n\n const actualHeight = this.getHeight();\n if (actualHeight >= Constants.EXPANDABLE_INLINE_IMAGE_MIN_HEIGHT) {\n imageElement = (\n <MarkdownImageExpand\n alt={alt || safeSrc}\n postId={postId}\n imageKey={safeSrc}\n onToggle={onImageHeightChanged}\n >\n {imageElement}\n </MarkdownImageExpand>\n );\n }\n\n return imageElement;\n }}\n </ExternalImage>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport MarkdownImage from './markdown_image';\nimport type {Props} from './markdown_image';\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const post = getPost(state, ownProps.postId);\n const isUnsafeLinksPost = post?.props?.unsafe_links === 'true';\n\n return {\n isUnsafeLinksPost,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n openModal,\n }, dispatch),\n };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport default connector(MarkdownImage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {\n useFloating,\n autoUpdate,\n safePolygon,\n useHover,\n useDismiss,\n useInteractions,\n FloatingPortal,\n autoPlacement,\n inline,\n useTransitionStyles,\n FloatingOverlay,\n FloatingFocusManager,\n useFocus,\n} from '@floating-ui/react';\nimport React, {useState} from 'react';\nimport type {AnchorHTMLAttributes, ReactElement} from 'react';\n\nimport Pluggable from 'plugins/pluggable';\nimport {RootHtmlPortalId, OverlaysTimings, OverlayTransitionStyles} from 'utils/constants';\n\nimport './plugin_link_tooltip.scss';\n\ninterface Props {\n nodeAttributes: AnchorHTMLAttributes<HTMLAnchorElement>;\n children: ReactElement;\n}\n\n/**\n * A key drawback of this component is that it gets attached to all links in the app if any installed plugin\n * supports link previews. Ideally plugins should have provided a regex matcher upfront, allowing us to\n * conditionally render the component only when needed.\n */\nexport default function PluginLinkTooltip(props: Props) {\n const [isOpen, setOpen] = useState(false);\n\n const {refs: {setReference, setFloating}, floatingStyles, context: floatingContext} = useFloating({\n open: isOpen,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n inline(),\n autoPlacement({\n allowedPlacements: ['top', 'bottom'],\n }),\n ],\n });\n\n const {isMounted, styles: transitionStyles} = useTransitionStyles(floatingContext, TRANSITION_STYLE_PROPS);\n\n const hoverInteractions = useHover(floatingContext, HOVER_PROPS);\n const focusInteractions = useFocus(floatingContext);\n const dismissInteraction = useDismiss(floatingContext);\n\n const {getReferenceProps, getFloatingProps} = useInteractions([\n hoverInteractions,\n focusInteractions,\n dismissInteraction,\n ]);\n\n return (\n <>\n <a\n ref={setReference}\n {...props.nodeAttributes}\n {...getReferenceProps()}\n >\n {props.children}\n </a>\n\n {isMounted && (\n <FloatingPortal id={RootHtmlPortalId}>\n <FloatingOverlay className='plugin-link-tooltip-floating-overlay'>\n <FloatingFocusManager context={floatingContext}>\n <div\n ref={setFloating}\n style={{...floatingStyles, ...transitionStyles}}\n {...getFloatingProps()}\n >\n <Pluggable\n href={props.nodeAttributes.href}\n show={true}\n pluggableName='LinkTooltip'\n />\n </div>\n </FloatingFocusManager>\n </FloatingOverlay>\n </FloatingPortal>\n )}\n </>\n );\n}\n\nconst TRANSITION_STYLE_PROPS = {\n duration: {\n open: OverlaysTimings.FADE_IN_DURATION,\n close: OverlaysTimings.FADE_OUT_DURATION,\n },\n initial: OverlayTransitionStyles.START,\n};\n\nconst HOVER_PROPS = {\n restMs: OverlaysTimings.CURSOR_REST_TIME_BEFORE_OPEN,\n move: false,\n handleClose: safePolygon({\n requireIntent: false,\n blockPointerEvents: true,\n }),\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport WithTooltip from 'components/with_tooltip';\n\nexport interface Props {\n children: React.ReactNode;\n name: string;\n imageUrl: string;\n}\n\nconst PostEmoji = ({children, name, imageUrl}: Props) => {\n const emojiText = `:${name}:`;\n const backgroundImageUrl = `url(${imageUrl})`;\n\n if (!imageUrl) {\n return <>{children}</>;\n }\n\n return (\n <WithTooltip\n title={emojiText}\n emoji={name}\n isEmojiLarge={true}\n >\n <span\n className='emoticon'\n data-testid={`postEmoji.${emojiText}`}\n style={{backgroundImage: backgroundImageUrl}}\n >\n {children}\n </span>\n </WithTooltip>\n );\n};\n\nexport default React.memo(PostEmoji);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils';\n\nimport {getEmojiMap} from 'selectors/emojis';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostEmoji from './post_emoji';\n\ntype Props = {\n name: string;\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const emojiMap = getEmojiMap(state);\n const emoji = emojiMap.get(ownProps.name);\n\n return {\n imageUrl: emoji ? getEmojiImageUrl(emoji) : '',\n };\n}\n\nexport default connect(mapStateToProps)(PostEmoji);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {Parser, ProcessNodeDefinitions} from 'html-to-react';\nimport type {AllHTMLAttributes} from 'react';\nimport React from 'react';\n\nimport AtMention from 'components/at_mention';\nimport AtPlanMention from 'components/at_plan_mention';\nimport AtSumOfMembersMention from 'components/at_sum_members_mention';\nimport CodeBlock from 'components/code_block/code_block';\nimport LatexBlock from 'components/latex_block';\nimport LatexInline from 'components/latex_inline';\nimport MarkdownImage from 'components/markdown_image';\nimport PluginLinkTooltip from 'components/plugin_link_tooltip';\nimport PostEmoji from 'components/post_emoji';\nimport PostEditedIndicator from 'components/post_view/post_edited_indicator';\n\nexport type Options = Partial<{\n postId: string;\n editedAt: number;\n hasPluginTooltips: boolean;\n mentions: boolean;\n mentionHighlight: boolean;\n disableGroupHighlight: boolean;\n markdown: boolean;\n latex: boolean;\n inlinelatex: boolean;\n postType: string;\n imageProps: {[key: string]: any};\n atSumOfMembersMentions: boolean;\n userIds: string[];\n imagesMetadata: any;\n emoji: boolean;\n messageMetadata: any;\n images: boolean;\n atPlanMentions: boolean;\n channelId: string;\n\n /**\n * Whether or not the AtMention component should attempt to fetch at-mentioned users if none can be found for\n * something that looks like an at-mention. This defaults to false because the web app currently loads at-mentioned\n * users automatically for all posts.\n */\n fetchMissingUsers: boolean;\n}>\n\ntype ProcessingInstruction = {\n replaceChildren: boolean;\n shouldProcessNode: (node: any) => boolean;\n processNode: (node: any, children?: any, index?: number) => any;\n}\n\n/*\n * Converts HTML to React components using html-to-react.\n * The following options can be specified:\n * - mentions - If specified, mentions are replaced with the AtMention component. Defaults to true.\n * - mentionHighlight - If specified, mentions for the current user are highlighted. Defaults to true.\n * - disableGroupHighlight - If specified, group mentions are not displayed as blue links. Defaults to false.\n * - emoji - If specified, emoji text is replaced with the PostEmoji component. Defaults to true.\n * - images - If specified, markdown images are replaced with the image component. Defaults to true.\n * - imageProps - If specified, any extra props that should be passed into the image component.\n * - latex - If specified, latex is replaced with the LatexBlock component. Defaults to true.\n * - imagesMetadata - the dimensions of the image as retrieved from post.metadata.images.\n * - hasPluginTooltips - If specified, the LinkTooltip component is placed inside links. Defaults to false.\n * - channelId = If specified, to be passed along to ProfilePopover via AtMention\n */\nexport default function messageHtmlToComponent(html: string, options: Options = {}) {\n if (!html) {\n return null;\n }\n\n const parser = new (Parser as any)();\n const processNodeDefinitions = new (ProcessNodeDefinitions as any)();\n\n function isValidNode() {\n return true;\n }\n\n const processingInstructions: ProcessingInstruction[] = [\n\n // Workaround to fix MM-14931\n {\n replaceChildren: false,\n shouldProcessNode: (node: any) => node.type === 'tag' && node.name === 'input' && node.attribs.type === 'checkbox',\n processNode: (node: any) => {\n const attribs = node.attribs || {};\n node.attribs.checked = Boolean(attribs.checked);\n\n return React.createElement('input', {...node.attribs});\n },\n },\n {\n replaceChildren: false,\n shouldProcessNode: (node: any) => node.type === 'tag' && node.name === 'span' && node.attribs['data-edited-post-id'] && node.attribs['data-edited-post-id'] === options.postId,\n processNode: () => {\n return options.postId && options.editedAt && options.editedAt > 0 ? (\n <React.Fragment key={`edited-${options.postId}`}>\n {' '}\n <PostEditedIndicator\n postId={options.postId}\n editedAt={options.editedAt}\n />\n </React.Fragment>\n ) : null;\n },\n },\n ];\n\n if (options.hasPluginTooltips) {\n processingInstructions.push({\n replaceChildren: false,\n shouldProcessNode: (node: any) => node.type === 'tag' && node.name === 'a' && node.attribs.href,\n processNode: (node: any, children: any) => {\n return (\n <PluginLinkTooltip nodeAttributes={convertPropsToReactStandard(node.attribs)}>\n {children}\n </PluginLinkTooltip>\n );\n },\n });\n }\n\n if (!('mentions' in options) || options.mentions) {\n const mentionHighlight = 'mentionHighlight' in options ? options.mentionHighlight : true;\n const disableGroupHighlight = 'disableGroupHighlight' in options ? options.disableGroupHighlight === true : false;\n const mentionAttrib = 'data-mention';\n processingInstructions.push({\n replaceChildren: true,\n shouldProcessNode: (node) => node.attribs && node.attribs[mentionAttrib],\n processNode: (node: any, children: any) => {\n const mentionName = node.attribs[mentionAttrib];\n const callAtMention = (\n <AtMention\n mentionName={mentionName}\n disableHighlight={!mentionHighlight}\n disableGroupHighlight={disableGroupHighlight}\n channelId={options.channelId}\n fetchMissingUsers={options.fetchMissingUsers}\n >\n {children}\n </AtMention>\n );\n return callAtMention;\n },\n });\n }\n\n if (options.atSumOfMembersMentions) {\n const mentionAttrib = 'data-sum-of-members-mention';\n processingInstructions.push({\n replaceChildren: true,\n shouldProcessNode: (node: any) => node.attribs && node.attribs[mentionAttrib],\n processNode: (node: any) => {\n const mentionName = node.attribs[mentionAttrib];\n const sumOfMembersMention = (\n <AtSumOfMembersMention\n postId={options.postId || ''}\n userIds={options.userIds || []}\n messageMetadata={options.messageMetadata}\n text={mentionName}\n />);\n return sumOfMembersMention;\n },\n });\n }\n\n if (options.atPlanMentions) {\n const mentionAttrib = 'data-plan-mention';\n processingInstructions.push({\n replaceChildren: true,\n shouldProcessNode: (node: any) => node.attribs && node.attribs[mentionAttrib],\n processNode: (node: any) => {\n const mentionName = node.attribs[mentionAttrib];\n const sumOfMembersMention = (\n <AtPlanMention\n plan={mentionName}\n />);\n return sumOfMembersMention;\n },\n });\n }\n\n if (!('emoji' in options) || options.emoji) {\n const emojiAttrib = 'data-emoticon';\n processingInstructions.push({\n replaceChildren: true,\n shouldProcessNode: (node: any) => node.attribs && node.attribs[emojiAttrib],\n processNode: (node: any, children: any) => {\n const emojiName = node.attribs[emojiAttrib];\n\n return <PostEmoji name={emojiName}>{children}</PostEmoji>;\n },\n });\n }\n\n if (!('images' in options) || options.images) {\n processingInstructions.push({\n replaceChildren: false,\n shouldProcessNode: (node: any) => node.type === 'tag' && node.name === 'img',\n processNode: (node: any) => {\n const {\n class: className,\n ...attribs\n } = node.attribs;\n\n const imageIsLink = (parentNode: any) => {\n if (parentNode &&\n parentNode.type === 'tag' &&\n parentNode.name === 'a'\n ) {\n return true;\n }\n return false;\n };\n\n return (\n <MarkdownImage\n className={className}\n imageMetadata={options.imagesMetadata && options.imagesMetadata[attribs.src]}\n {...attribs}\n {...options.imageProps}\n postId={options.postId}\n imageIsLink={imageIsLink(node.parentNode)}\n postType={options.postType}\n />\n );\n },\n });\n }\n\n if (!('latex' in options) || options.latex) {\n processingInstructions.push({\n replaceChildren: false,\n shouldProcessNode: (node: any) => node.attribs && node.attribs['data-latex'],\n processNode: (node: any) => {\n return (\n <LatexBlock\n key={node.attribs['data-latex']}\n content={node.attribs['data-latex']}\n />\n );\n },\n });\n }\n\n if (!('inlinelatex' in options) || options.inlinelatex) {\n processingInstructions.push({\n replaceChildren: false,\n shouldProcessNode: (node) => node.attribs && node.attribs['data-inline-latex'],\n processNode: (node: any) => {\n return (\n <LatexInline content={node.attribs['data-inline-latex']}/>\n );\n },\n });\n }\n\n if (!('markdown' in options) || options.markdown) {\n processingInstructions.push({\n replaceChildren: false,\n shouldProcessNode: (node) => node.attribs && node.attribs['data-codeblock-code'],\n processNode: (node: any) => {\n return (\n <CodeBlock\n key={node.attribs['data-codeblock-code']}\n code={node.attribs['data-codeblock-code']}\n language={node.attribs['data-codeblock-language']}\n searchedContent={node.attribs['data-codeblock-searchedcontent']}\n />\n );\n },\n });\n }\n\n processingInstructions.push({\n replaceChildren: false,\n shouldProcessNode: () => true,\n processNode: processNodeDefinitions.processDefaultNode as (node: any, children?: any, index?: number) => any,\n });\n\n return parser.parseWithInstructions(html, isValidNode, processingInstructions);\n}\n\n/**\n * This function converts HTML attributes to React-specific props.\n * For example, it changes 'class' to 'className'. Note that this function\n * is not exhaustive and may not cover all HTML attributes. Add more cases as needed.\n */\nexport function convertPropsToReactStandard(propsToConvert: AllHTMLAttributes<HTMLElement>): Record<string, unknown> {\n const newProps: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(propsToConvert)) {\n switch (key) {\n case 'class':\n newProps.className = value;\n break;\n case 'for':\n newProps.htmlFor = value;\n break;\n case 'tabindex':\n newProps.tabIndex = value;\n break;\n case 'readonly':\n newProps.readOnly = value;\n break;\n default:\n newProps[key] = value;\n }\n }\n\n return newProps;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {OverActiveUserLimits} from './constants';\n\ntype CalculateOverageUsersActivatedArgs = {\n seatsPurchased: number;\n activeUsers: number;\n}\n\nexport const calculateOverageUserActivated = ({activeUsers, seatsPurchased}: CalculateOverageUsersActivatedArgs) => {\n const minimumOverSeats = Math.ceil(seatsPurchased * OverActiveUserLimits.MIN) + seatsPurchased;\n const maximumOverSeats = Math.ceil(seatsPurchased * OverActiveUserLimits.MAX) + seatsPurchased;\n const isBetween5PercerntAnd10PercentPurchasedSeats = minimumOverSeats <= activeUsers && activeUsers < maximumOverSeats;\n const isOver10PercerntPurchasedSeats = maximumOverSeats <= activeUsers;\n\n return {\n minimumOverSeats,\n maximumOverSeats,\n isBetween5PercerntAnd10PercentPurchasedSeats,\n isOver10PercerntPurchasedSeats,\n };\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/**\n * This is a wrapper around document.execCommand('insertText', false, text) to insert test into the focused element.\n * @param text The text to insert.\n */\nexport function execCommandInsertText(text: string) {\n document.execCommand('insertText', false, text);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {tables} from '@guyplusplus/turndown-plugin-gfm';\nimport TurndownService from 'turndown';\n\nconst turndownService = new TurndownService({emDelimiter: '*'}).remove('style');\nturndownService.use(tables);\n\nexport default turndownService;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport isNil from 'lodash/isNil';\n\nimport type {TextboxElement} from 'components/textbox';\n\nimport {Locations} from 'utils/constants';\nimport {execCommandInsertText} from 'utils/exec_commands';\nimport {DEFAULT_PLACEHOLDER_URL} from 'utils/markdown/apply_markdown';\nimport {splitMessageBasedOnCaretPosition, splitMessageBasedOnTextSelection} from 'utils/post_utils';\nimport turndownService from 'utils/turndown';\n\nexport function parseHtmlTable(html: string): HTMLTableElement | null {\n return new DOMParser().parseFromString(html, 'text/html').querySelector('table');\n}\n\nexport function getHtmlTable(clipboardData: DataTransfer): HTMLTableElement | null {\n // Check if clipboard data has html as one of its types\n if (Array.from(clipboardData.types).indexOf('text/html') === -1) {\n return null;\n }\n\n const html = clipboardData.getData('text/html');\n\n if (!(/<table/i).test(html)) {\n return null;\n }\n\n const table = parseHtmlTable(html);\n if (!table) {\n return null;\n }\n\n return table;\n}\n\nexport function hasHtmlLink(clipboardData: DataTransfer): boolean {\n return Array.from(clipboardData.types).includes('text/html') && (/<a/i).test(clipboardData.getData('text/html'));\n}\n\nexport function isGitHubCodeBlock(tableClassName: string): boolean {\n const result = (/\\b(js|blob|diff)-./).test(tableClassName);\n return result;\n}\n\nexport function isTextUrl(clipboardData: DataTransfer): boolean {\n const clipboardText = clipboardData.getData('text/plain');\n return clipboardText.startsWith('http://') || clipboardText.startsWith('https://');\n}\n\n/**\n * Checks if the clipboard data contains plain text from list of types.\n**/\nexport function hasPlainText(clipboardData: DataTransfer): boolean {\n if (Array.from(clipboardData.types).includes('text/plain')) {\n const clipboardText = clipboardData.getData('text/plain');\n\n return clipboardText.trim().length > 0;\n }\n return false;\n}\n\nfunction isTableWithoutHeaderRow(table: HTMLTableElement): boolean {\n return table.querySelectorAll('th').length === 0;\n}\n\n/**\n * Formats the given HTML clipboard data into a Markdown message.\n * @returns {Object} An object containing 'formattedMessage' and 'formattedMarkdown'.\n * @property {string} formattedMessage - The formatted message, including the formatted Markdown.\n * @property {string} formattedMarkdown - The resulting Markdown from the HTML clipboard data.\n */\nexport function formatMarkdownMessage(clipboardData: DataTransfer, message?: string, caretPosition?: number): {formattedMessage: string; formattedMarkdown: string} {\n const html = clipboardData.getData('text/html');\n\n let formattedMarkdown = turndownService.turndown(html).trim();\n\n const table = getHtmlTable(clipboardData);\n if (table && isTableWithoutHeaderRow(table)) {\n const newLineLimiter = '\\n';\n formattedMarkdown = `${formattedMarkdown}${newLineLimiter}`;\n }\n\n let formattedMessage: string;\n\n if (!message) {\n formattedMessage = formattedMarkdown;\n } else if (typeof caretPosition === 'undefined') {\n formattedMessage = `${message}\\n\\n${formattedMarkdown}`;\n } else {\n const newMessage = [message.slice(0, caretPosition) + '\\n', formattedMarkdown, message.slice(caretPosition)];\n formattedMessage = newMessage.join('');\n }\n\n return {formattedMessage, formattedMarkdown};\n}\n\ntype FormatGithubCodePasteParams = {\n message: string;\n clipboardData: DataTransfer;\n selectionStart: number | null;\n selectionEnd: number | null;\n};\n\n/**\n * Format the incoming github code paste into a markdown code block.\n * This function assumes that the clipboardData contains a code block.\n * @returns {Object} An object containing the 'formattedMessage' and 'formattedCodeBlock'.\n * @property {string} formattedMessage - The complete formatted message including the code block.\n * @property {string} formattedCodeBlock - The resulting code block from the clipboard data.\n*/\nexport function formatGithubCodePaste({message, clipboardData, selectionStart, selectionEnd}: FormatGithubCodePasteParams): {formattedMessage: string; formattedCodeBlock: string} {\n const isTextSelected = selectionStart !== selectionEnd;\n const {firstPiece, lastPiece} = isTextSelected ? splitMessageBasedOnTextSelection(selectionStart ?? message.length, selectionEnd ?? message.length, message) : splitMessageBasedOnCaretPosition(selectionStart ?? message.length, message);\n\n // Add new lines if content exists before or after the cursor.\n const requireStartLF = firstPiece === '' ? '' : '\\n';\n const requireEndLF = lastPiece === '' ? '' : '\\n';\n const clipboardText = clipboardData.getData('text/plain');\n const formattedCodeBlock = requireStartLF + '```\\n' + clipboardText + '\\n```' + requireEndLF;\n const formattedMessage = `${firstPiece}${formattedCodeBlock}${lastPiece}`;\n\n return {formattedMessage, formattedCodeBlock};\n}\n\ntype FormatMarkdownLinkMessage = {\n message: string;\n clipboardData: DataTransfer;\n selectionStart: number;\n selectionEnd: number;\n};\n\n/**\n * Formats the incoming link paste into a markdown link.\n * This function assumes that the clipboardData contains a link.\n * @returns The resulting markdown link from the clipboard data.\n */\nexport function formatMarkdownLinkMessage({message, clipboardData, selectionStart, selectionEnd}: FormatMarkdownLinkMessage) {\n const selectedText = message.slice(selectionStart, selectionEnd);\n const clipboardUrl = clipboardData.getData('text/plain');\n\n if (selectedText === DEFAULT_PLACEHOLDER_URL) {\n if (message.length > DEFAULT_PLACEHOLDER_URL.length) {\n const FORMATTED_LINK_URL_PREFIX = '](';\n const FORMATTED_LINK_URL_SUFFIX = ')';\n\n const textBefore = message.slice(selectionStart - FORMATTED_LINK_URL_PREFIX.length, selectionStart);\n const textAfter = message.slice(selectionEnd, selectionEnd + FORMATTED_LINK_URL_SUFFIX.length);\n\n // We check \"](\" \"url\" \")\" to see if user is trying to paste inside of a markdown link\n // and selection is on \"url\"\n if (textBefore === FORMATTED_LINK_URL_PREFIX && textAfter === FORMATTED_LINK_URL_SUFFIX) {\n return clipboardUrl;\n }\n }\n }\n\n const markdownLink = `[${selectedText}](${clipboardUrl})`;\n return markdownLink;\n}\n\nexport function pasteHandler(event: ClipboardEvent, location: string, message: string, isNonFormattedPaste: boolean, caretPosition?: number) {\n const {clipboardData, target} = event;\n\n const textboxId = location === Locations.RHS_COMMENT ? 'reply_textbox' : 'post_textbox';\n\n if (!clipboardData || !clipboardData.items || !target || (target as TextboxElement)?.id !== textboxId) {\n return;\n }\n\n if (isNonFormattedPaste) {\n return;\n }\n\n const {selectionStart, selectionEnd} = target as TextboxElement;\n\n const hasSelection = !isNil(selectionStart) && !isNil(selectionEnd) && selectionStart < selectionEnd;\n const hasTextUrl = isTextUrl(clipboardData);\n const hasHTMLLinks = hasHtmlLink(clipboardData);\n const htmlTable = getHtmlTable(clipboardData);\n const shouldApplyLinkMarkdown = hasSelection && hasTextUrl;\n const shouldApplyGithubCodeBlock = htmlTable && isGitHubCodeBlock(htmlTable.className);\n\n if (!htmlTable && !hasHTMLLinks && !shouldApplyLinkMarkdown) {\n return;\n }\n\n event.preventDefault();\n\n // execCommand's insertText' triggers a 'change' event, hence we need not set respective state explicitly.\n if (shouldApplyLinkMarkdown) {\n const formattedLink = formatMarkdownLinkMessage({selectionStart, selectionEnd, message, clipboardData});\n execCommandInsertText(formattedLink);\n } else if (shouldApplyGithubCodeBlock) {\n const {formattedCodeBlock} = formatGithubCodePaste({selectionStart, selectionEnd, message, clipboardData});\n execCommandInsertText(formattedCodeBlock);\n } else {\n const {formattedMarkdown} = formatMarkdownMessage(clipboardData, message, caretPosition);\n execCommandInsertText(formattedMarkdown);\n }\n}\n\nexport function createFileFromClipboardDataItem(item: DataTransferItem, fileNamePrefixIfNoName: string): File | null {\n const file = item.getAsFile();\n\n if (!file) {\n return null;\n }\n\n let ext = '';\n if (file.name && file.name.includes('.')) {\n ext = file.name.slice(file.name.lastIndexOf('.'));\n } else if (item.type.includes('/')) {\n ext = '.' + item.type.slice(item.type.lastIndexOf('/') + 1).toLowerCase();\n }\n\n let name = '';\n if (file.name) {\n name = file.name;\n } else {\n const now = new Date();\n const year = now.getFullYear();\n const month = now.getMonth() + 1;\n const date = now.getDate();\n const hour = now.getHours().toString().padStart(2, '0');\n const minute = now.getMinutes().toString().padStart(2, '0');\n\n name = `${fileNamePrefixIfNoName}${year}-${month}-${date} ${hour}-${minute}${ext}`;\n }\n\n return new File([file as Blob], name, {type: file.type});\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nexport const ID_PATH_PATTERN = '[a-z0-9]{26}';\n\n// This should cover:\n// - Team name (lowercase english characters, numbers or -)\n// - Two ids separated by __ (userID__userID)\nexport const TEAM_NAME_PATH_PATTERN = '[a-z0-9\\\\-_]+';\n\n// This should cover:\n// - Channel name\n// - Channel ID\n// - Group Channel Name (40 length UID)\n// - DM Name (userID__userID)\n// - Username prefixed by a @\n// - Username prefixed by a @, with colon and remote name e.g. @username:companyname\n// - User ID\n// - Email\nexport const IDENTIFIER_PATH_PATTERN = '[@a-zA-Z\\\\-_0-9][@a-zA-Z\\\\-_0-9.:]*';\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useSelector} from 'react-redux';\nimport {useLocation, matchPath} from 'react-router-dom';\n\nimport type {Product} from '@mattermost/types/cloud';\nimport type {ProductIdentifier, ProductScope} from '@mattermost/types/products';\n\nimport {selectProducts, selectCurrentProductId, selectCurrentProduct} from 'selectors/products';\n\nimport type {GlobalState} from 'types/store';\nimport type {ProductComponent} from 'types/store/plugins';\n\nimport {RecurringIntervals} from './constants';\n\nexport const getCurrentProductId = (\n products: ProductComponent[],\n pathname: string,\n): ProductIdentifier => {\n return getCurrentProduct(products, pathname)?.id ?? null;\n};\n\nexport const getCurrentProduct = (\n products: ProductComponent[],\n pathname: string,\n): ProductComponent | null => {\n return products?.find(({baseURL}) => matchPath(pathname, {path: baseURL, exact: false, strict: false})) ?? null;\n};\n\nexport const useProducts = (): ProductComponent[] | undefined => {\n return useSelector(selectProducts);\n};\n\nexport const useCurrentProductId = () => {\n const {pathname} = useLocation();\n return useSelector((state: GlobalState) => selectCurrentProductId(state, pathname));\n};\n\nexport const useCurrentProduct = () => {\n const {pathname} = useLocation();\n return useSelector((state: GlobalState) => selectCurrentProduct(state, pathname));\n};\n\nexport const inScope = (scope: ProductScope, productId: ProductIdentifier, pluginId?: string) => {\n if (scope === '*' || scope?.includes('*')) {\n return true;\n }\n if (Array.isArray(scope)) {\n return scope.includes(productId) || (pluginId !== undefined && scope.includes(pluginId));\n }\n return scope === productId || (pluginId !== undefined && scope === pluginId);\n};\n\nexport const isChannels = (productId: ProductIdentifier) => productId === null;\n\n// find a product based on its SKU an RecurringInterval\nexport const findProductBySkuAndInterval = (products: Record<string, Product>, sku: string, interval: string) => {\n return Object.values(products).find(((product) => {\n return product.sku === sku && product.recurring_interval === interval;\n }));\n};\n\nexport const findProductBySku = (products: Record<string, Product>, sku: string) => {\n return Object.values(products).find(((product) => {\n return product.sku === sku;\n }));\n};\n\nexport const findProductByID = (products: Record<string, Product>, id: string) => {\n return Object.values(products).find(((product) => {\n return product.id === id;\n }));\n};\n\nconst filterProductsRecord = (data: Record<string, Product>, predicate: (product: Product) => boolean): Record<string, Product> => {\n return Object.keys(data).reduce((acc: Record<string, Product>, current: string) => {\n if (predicate(data[current])) {\n acc[current] = data[current];\n }\n return acc;\n }, {});\n};\n\nexport const findOnlyYearlyProducts = (products: Record<string, Product>) => {\n return filterProductsRecord(products, (product: Product) => product.recurring_interval === RecurringIntervals.YEAR);\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ClientLicense} from '@mattermost/types/config';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport {ErrorPageTypes} from 'utils/constants';\n\nexport const notFoundParams = {\n type: ErrorPageTypes.PAGE_NOT_FOUND,\n};\n\nconst mfaPaths = ['/mfa/setup', '/mfa/confirm'];\n\nconst mfaAuthServices = ['', 'email', 'ldap'];\n\nexport type ConfigOption = {\n EnableMultifactorAuthentication?: string;\n EnforceMultifactorAuthentication?: string;\n GuestAccountsEnforceMultifactorAuthentication?: string;\n};\n\nexport function checkIfMFARequired(\n user: UserProfile | undefined,\n license: ClientLicense,\n config: ConfigOption,\n path: string,\n): boolean {\n if (\n license.MFA === 'true' &&\n config.EnableMultifactorAuthentication === 'true' &&\n config.EnforceMultifactorAuthentication === 'true' &&\n mfaPaths.indexOf(path) === -1\n ) {\n if (\n user &&\n isGuest(user.roles) &&\n config.GuestAccountsEnforceMultifactorAuthentication !== 'true'\n ) {\n return false;\n }\n if (\n user &&\n !user.mfa_active &&\n mfaAuthServices.indexOf(user.auth_service) !== -1\n ) {\n return true;\n }\n }\n return false;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {LicenseSkus} from 'utils/constants';\n\nexport const getSkuDisplayName = (skuShortName: string, isGovSku: boolean): string => {\n let skuName = '';\n switch (skuShortName) {\n case LicenseSkus.E20:\n skuName = 'Enterprise E20';\n break;\n case LicenseSkus.E10:\n skuName = 'Enterprise E10';\n break;\n case LicenseSkus.Professional:\n skuName = 'Professional';\n break;\n case LicenseSkus.Starter:\n skuName = 'Starter';\n break;\n default:\n skuName = 'Enterprise';\n break;\n }\n\n skuName += isGovSku ? ' Gov' : '';\n\n return skuName;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport hlJS from 'highlight.js/lib/core';\n\nimport * as TextFormatting from 'utils/text_formatting';\n\nimport Constants from './constants';\n\ntype LanguageObject = {\n [key: string]: {\n name: string;\n extensions: string[];\n aliases?: string[];\n };\n}\n\nconst HighlightedLanguages: LanguageObject = Constants.HighlightedLanguages;\n\nexport async function highlight(lang: string, code: string) {\n const language = getLanguageFromNameOrAlias(lang);\n\n if (language) {\n try {\n await registerLanguage(language);\n return hlJS.highlight(code, {language}).value;\n } catch (e) {\n // fall through if highlighting fails and handle below\n }\n }\n\n return TextFormatting.sanitizeHtml(code);\n}\n\nexport function renderLineNumbers(code: string) {\n const numberOfLines = code.split(/\\r\\n|\\n|\\r/g).length;\n const lineNumbers = [];\n for (let i = 0; i < numberOfLines; i++) {\n lineNumbers.push((i + 1).toString());\n }\n\n return lineNumbers.join('\\n');\n}\n\nexport function getLanguageFromFileExtension(extension: string): string | null {\n for (const key in HighlightedLanguages) {\n if (HighlightedLanguages[key].extensions.find((x: string) => x === extension)) {\n return key;\n }\n }\n\n return null;\n}\n\nexport function canHighlight(language: string): boolean {\n return Boolean(getLanguageFromNameOrAlias(language));\n}\n\nexport function getLanguageName(language: string): string {\n if (canHighlight(language)) {\n const name: string | undefined = getLanguageFromNameOrAlias(language);\n if (!name) {\n return '';\n }\n return HighlightedLanguages[name].name;\n }\n\n return '';\n}\n\nfunction getLanguageFromNameOrAlias(name: string) {\n const langName: string = name.toLowerCase();\n if (HighlightedLanguages[langName]) {\n return langName;\n }\n\n return Object.keys(HighlightedLanguages).find((key) => {\n const aliases = HighlightedLanguages[key].aliases;\n return aliases && aliases.find((a) => a === langName);\n });\n}\n\nasync function registerLanguage(languageName: string) {\n const languageImports: {\n [key: string]: any;\n } = {\n '1c': () => import('highlight.js/lib/languages/1c'),\n actionscript: () => import('highlight.js/lib/languages/actionscript'),\n applescript: () => import('highlight.js/lib/languages/applescript'),\n bash: () => import('highlight.js/lib/languages/bash'),\n clojure: () => import('highlight.js/lib/languages/clojure'),\n coffeescript: () => import('highlight.js/lib/languages/coffeescript'),\n cpp: () => import('highlight.js/lib/languages/cpp'),\n csharp: () => import('highlight.js/lib/languages/csharp'),\n css: () => import('highlight.js/lib/languages/css'),\n d: () => import('highlight.js/lib/languages/d'),\n dart: () => import('highlight.js/lib/languages/dart'),\n delphi: () => import('highlight.js/lib/languages/delphi'),\n diff: () => import('highlight.js/lib/languages/diff'),\n django: () => import('highlight.js/lib/languages/django'),\n dockerfile: () => import('highlight.js/lib/languages/dockerfile'),\n elixir: () => import('highlight.js/lib/languages/elixir'),\n erlang: () => import('highlight.js/lib/languages/erlang'),\n fortran: () => import('highlight.js/lib/languages/fortran'),\n fsharp: () => import('highlight.js/lib/languages/fsharp'),\n gcode: () => import('highlight.js/lib/languages/gcode'),\n go: () => import('highlight.js/lib/languages/go'),\n groovy: () => import('highlight.js/lib/languages/groovy'),\n handlebars: () => import('highlight.js/lib/languages/handlebars'),\n haskell: () => import('highlight.js/lib/languages/haskell'),\n haxe: () => import('highlight.js/lib/languages/haxe'),\n java: () => import('highlight.js/lib/languages/java'),\n javascript: () => import('highlight.js/lib/languages/javascript'),\n json: () => import('highlight.js/lib/languages/json'),\n julia: () => import('highlight.js/lib/languages/julia'),\n kotlin: () => import('highlight.js/lib/languages/kotlin'),\n latex: () => import('highlight.js/lib/languages/latex'),\n less: () => import('highlight.js/lib/languages/less'),\n lisp: () => import('highlight.js/lib/languages/lisp'),\n lua: () => import('highlight.js/lib/languages/lua'),\n makefile: () => import('highlight.js/lib/languages/makefile'),\n markdown: () => import('highlight.js/lib/languages/markdown'),\n matlab: () => import('highlight.js/lib/languages/matlab'),\n objectivec: () => import('highlight.js/lib/languages/objectivec'),\n ocaml: () => import('highlight.js/lib/languages/ocaml'),\n perl: () => import('highlight.js/lib/languages/perl'),\n pgsql: () => import('highlight.js/lib/languages/pgsql'),\n php: () => import('highlight.js/lib/languages/php'),\n plaintext: () => import('highlight.js/lib/languages/plaintext'),\n powershell: () => import('highlight.js/lib/languages/powershell'),\n puppet: () => import('highlight.js/lib/languages/puppet'),\n python: () => import('highlight.js/lib/languages/python'),\n r: () => import('highlight.js/lib/languages/r'),\n ruby: () => import('highlight.js/lib/languages/ruby'),\n rust: () => import('highlight.js/lib/languages/rust'),\n scala: () => import('highlight.js/lib/languages/scala'),\n scheme: () => import('highlight.js/lib/languages/scheme'),\n scss: () => import('highlight.js/lib/languages/scss'),\n smalltalk: () => import('highlight.js/lib/languages/smalltalk'),\n sql: () => import('highlight.js/lib/languages/sql'),\n stylus: () => import('highlight.js/lib/languages/stylus'),\n swift: () => import('highlight.js/lib/languages/swift'),\n typescript: () => import('highlight.js/lib/languages/typescript'),\n vbnet: () => import('highlight.js/lib/languages/vbnet'),\n vbscript: () => import('highlight.js/lib/languages/vbscript'),\n verilog: () => import('highlight.js/lib/languages/verilog'),\n vhdl: () => import('highlight.js/lib/languages/vhdl'),\n vtt: () => import('highlight.js/lib/languages/plaintext'),\n xml: () => import('highlight.js/lib/languages/xml'),\n yaml: () => import('highlight.js/lib/languages/yaml'),\n };\n\n if (!languageImports[languageName]) {\n return;\n }\n\n const language = (await languageImports[languageName]()).default;\n\n hlJS.registerLanguage(languageName, language);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Team} from '@mattermost/types/teams';\n\n// Use when sorting multiple teams by their `display_name` field\nfunction compareTeamsByDisplayName(locale: string, a: Team, b: Team) {\n if (a.display_name !== null) {\n if (a.display_name !== b.display_name) {\n return a.display_name.localeCompare(b.display_name, locale, {numeric: true});\n }\n }\n\n return a.name.localeCompare(b.name, locale, {numeric: true});\n}\n\n// Use to filter out teams that are deleted and without display_name, then sort by their `display_name` field\nexport function filterAndSortTeamsByDisplayName<T extends Team>(teams: T[], locale: string, teamsOrder = '') {\n if (!teams) {\n return [];\n }\n\n const teamsOrderList = teamsOrder.split(',');\n\n const customSortedTeams = teams.filter((team) => {\n if (team !== null) {\n return teamsOrderList.includes(team.id);\n }\n return false;\n }).sort((a, b) => {\n return teamsOrderList.indexOf(a.id) - teamsOrderList.indexOf(b.id);\n });\n\n const otherTeams = teams.filter((team) => {\n if (team !== null) {\n return !teamsOrderList.includes(team.id);\n }\n return false;\n }).sort((a, b) => {\n return compareTeamsByDisplayName(locale, a, b);\n });\n\n return [...customSortedTeams, ...otherTeams].filter((team) => {\n // TODO: Fix. Asserting type right now because do not want to affect in productino behavior.\n return team && (!team.delete_at as unknown as number) > 0 && team.display_name != null;\n });\n}\n\nexport function makeNewTeam(displayName: string, name: string): Team {\n return {\n id: '',\n create_at: 0,\n update_at: 0,\n delete_at: 0,\n display_name: displayName,\n name,\n description: '',\n email: '',\n type: 'O',\n company_name: '',\n allowed_domains: '',\n invite_id: '',\n allow_open_invite: false,\n scheme_id: '',\n group_constrained: false,\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {WebSocketClient} from '@mattermost/client';\n\nexport const WebSocketContext = React.createContext<WebSocketClient>(null!);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useContext, useEffect} from 'react';\n\nimport type {WebSocketClient, WebSocketMessage} from '@mattermost/client';\n\nimport {WebSocketContext} from './context';\n\nexport type UseWebSocketOptions = {\n handler: (msg: WebSocketMessage) => void;\n}\n\nexport function useWebSocket({handler}: UseWebSocketOptions) {\n const wsClient = useWebSocketClient();\n\n useEffect(() => {\n wsClient.addMessageListener(handler);\n\n return () => {\n wsClient.removeMessageListener(handler);\n };\n }, [wsClient, handler]);\n}\n\nexport function useWebSocketClient(): WebSocketClient {\n return useContext(WebSocketContext);\n}\n","\"use strict\";\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Locations = exports.Permission = void 0;\nexports.isAppBinding = isAppBinding;\nconst products_1 = require(\"./products\");\nconst utilities_1 = require(\"./utilities\");\nvar Permission;\n(function (Permission) {\n Permission[\"UserJoinedChannelNotification\"] = \"user_joined_channel_notification\";\n Permission[\"ActAsBot\"] = \"act_as_bot\";\n Permission[\"ActAsUser\"] = \"act_as_user\";\n Permission[\"PermissionActAsAdmin\"] = \"act_as_admin\";\n Permission[\"RemoteOAuth2\"] = \"remote_oauth2\";\n Permission[\"RemoteWebhooks\"] = \"remote_webhooks\";\n})(Permission || (exports.Permission = Permission = {}));\nvar Locations;\n(function (Locations) {\n Locations[\"PostMenu\"] = \"/post_menu\";\n Locations[\"ChannelHeader\"] = \"/channel_header\";\n Locations[\"Command\"] = \"/command\";\n Locations[\"InPost\"] = \"/in_post\";\n})(Locations || (exports.Locations = Locations = {}));\nfunction isAppBinding(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n const binding = obj;\n if (typeof binding.app_id !== 'string' || typeof binding.label !== 'string') {\n return false;\n }\n if (binding.location !== undefined && typeof binding.location !== 'string') {\n return false;\n }\n if (binding.supported_product_ids !== undefined && !(0, products_1.isProductScope)(binding.supported_product_ids)) {\n return false;\n }\n if (binding.icon !== undefined && typeof binding.icon !== 'string') {\n return false;\n }\n if (binding.hint !== undefined && typeof binding.hint !== 'string') {\n return false;\n }\n if (binding.description !== undefined && typeof binding.description !== 'string') {\n return false;\n }\n if (binding.role_id !== undefined && typeof binding.role_id !== 'string') {\n return false;\n }\n if (binding.depends_on_team !== undefined && typeof binding.depends_on_team !== 'boolean') {\n return false;\n }\n if (binding.depends_on_channel !== undefined && typeof binding.depends_on_channel !== 'boolean') {\n return false;\n }\n if (binding.depends_on_user !== undefined && typeof binding.depends_on_user !== 'boolean') {\n return false;\n }\n if (binding.depends_on_post !== undefined && typeof binding.depends_on_post !== 'boolean') {\n return false;\n }\n if (binding.bindings !== undefined && !(0, utilities_1.isArrayOf)(binding.bindings, isAppBinding)) {\n return false;\n }\n if (binding.form !== undefined && !isAppForm(binding.form)) {\n return false;\n }\n if (binding.submit !== undefined && !isAppCall(binding.submit)) {\n return false;\n }\n return true;\n}\nfunction isAppCall(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n const call = obj;\n if (typeof call.path !== 'string') {\n return false;\n }\n if (call.expand !== undefined && !isAppExpand(call.expand)) {\n return false;\n }\n // Here we're assuming that 'state' can be of any type, so no type check for 'state'\n return true;\n}\nfunction isAppExpand(v) {\n if (typeof v !== 'object' || v === null) {\n return false;\n }\n const expand = v;\n if (expand.app !== undefined && typeof expand.app !== 'string') {\n return false;\n }\n if (expand.acting_user !== undefined && typeof expand.acting_user !== 'string') {\n return false;\n }\n if (expand.acting_user_access_token !== undefined && typeof expand.acting_user_access_token !== 'string') {\n return false;\n }\n if (expand.channel !== undefined && typeof expand.channel !== 'string') {\n return false;\n }\n if (expand.config !== undefined && typeof expand.config !== 'string') {\n return false;\n }\n if (expand.mentioned !== undefined && typeof expand.mentioned !== 'string') {\n return false;\n }\n if (expand.parent_post !== undefined && typeof expand.parent_post !== 'string') {\n return false;\n }\n if (expand.post !== undefined && typeof expand.post !== 'string') {\n return false;\n }\n if (expand.root_post !== undefined && typeof expand.root_post !== 'string') {\n return false;\n }\n if (expand.team !== undefined && typeof expand.team !== 'string') {\n return false;\n }\n if (expand.user !== undefined && typeof expand.user !== 'string') {\n return false;\n }\n if (expand.locale !== undefined && typeof expand.locale !== 'string') {\n return false;\n }\n return true;\n}\nfunction isAppForm(v) {\n if (typeof v !== 'object' || v === null) {\n return false;\n }\n const form = v;\n if (form.title !== undefined && typeof form.title !== 'string') {\n return false;\n }\n if (form.header !== undefined && typeof form.header !== 'string') {\n return false;\n }\n if (form.footer !== undefined && typeof form.footer !== 'string') {\n return false;\n }\n if (form.icon !== undefined && typeof form.icon !== 'string') {\n return false;\n }\n if (form.submit_buttons !== undefined && typeof form.submit_buttons !== 'string') {\n return false;\n }\n if (form.cancel_button !== undefined && typeof form.cancel_button !== 'boolean') {\n return false;\n }\n if (form.submit_on_cancel !== undefined && typeof form.submit_on_cancel !== 'boolean') {\n return false;\n }\n if (form.fields !== undefined && !(0, utilities_1.isArrayOf)(form.fields, isAppField)) {\n return false;\n }\n if (form.source !== undefined && !isAppCall(form.source)) {\n return false;\n }\n if (form.submit !== undefined && !isAppCall(form.submit)) {\n return false;\n }\n if (form.depends_on !== undefined && !(0, utilities_1.isStringArray)(form.depends_on)) {\n return false;\n }\n return true;\n}\nfunction isAppFormValue(v) {\n if (typeof v === 'string') {\n return true;\n }\n if (typeof v === 'boolean') {\n return true;\n }\n if (v === null) {\n return true;\n }\n return isAppSelectOption(v);\n}\nfunction isAppSelectOption(v) {\n if (typeof v !== 'object' || v === null) {\n return false;\n }\n const option = v;\n if (typeof option.label !== 'string' || typeof option.value !== 'string') {\n return false;\n }\n if (option.icon_data !== undefined && typeof option.icon_data !== 'string') {\n return false;\n }\n return true;\n}\nfunction isAppField(v) {\n if (typeof v !== 'object' || v === null) {\n return false;\n }\n const field = v;\n if (typeof field.name !== 'string' || typeof field.type !== 'string') {\n return false;\n }\n if (field.is_required !== undefined && typeof field.is_required !== 'boolean') {\n return false;\n }\n if (field.readonly !== undefined && typeof field.readonly !== 'boolean') {\n return false;\n }\n if (field.value !== undefined && !isAppFormValue(field.value)) {\n return false;\n }\n if (field.description !== undefined && typeof field.description !== 'string') {\n return false;\n }\n if (field.label !== undefined && typeof field.label !== 'string') {\n return false;\n }\n if (field.hint !== undefined && typeof field.hint !== 'string') {\n return false;\n }\n if (field.position !== undefined && typeof field.position !== 'number') {\n return false;\n }\n if (field.modal_label !== undefined && typeof field.modal_label !== 'string') {\n return false;\n }\n if (field.refresh !== undefined && typeof field.refresh !== 'boolean') {\n return false;\n }\n if (field.options !== undefined && !(0, utilities_1.isArrayOf)(field.options, isAppSelectOption)) {\n return false;\n }\n if (field.multiselect !== undefined && typeof field.multiselect !== 'boolean') {\n return false;\n }\n if (field.lookup !== undefined && !isAppCall(field.lookup)) {\n return false;\n }\n if (field.subtype !== undefined && typeof field.subtype !== 'string') {\n return false;\n }\n if (field.min_length !== undefined && typeof field.min_length !== 'number') {\n return false;\n }\n if (field.max_length !== undefined && typeof field.max_length !== 'number') {\n return false;\n }\n return true;\n}\n","\"use strict\";\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isProductScope = isProductScope;\nconst utilities_1 = require(\"./utilities\");\nfunction isProductScope(v) {\n if (v === null || typeof v === 'string') {\n return true;\n }\n return (0, utilities_1.isArrayOf)(v, (e) => e === null || typeof v === 'string');\n}\n","\"use strict\";\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.scheduledPostFromPost = scheduledPostFromPost;\nexports.scheduledPostToPost = scheduledPostToPost;\nfunction scheduledPostFromPost(post, schedulingInfo) {\n return {\n id: '',\n scheduled_at: schedulingInfo.scheduled_at,\n create_at: 0,\n update_at: post.update_at,\n user_id: post.user_id,\n channel_id: post.channel_id,\n root_id: post.root_id,\n message: post.message,\n props: post.props,\n metadata: post.metadata,\n priority: post.metadata.priority,\n };\n}\nfunction scheduledPostToPost(scheduledPost) {\n const post = {\n edit_at: 0,\n hashtags: '',\n is_pinned: false,\n original_id: '',\n pending_post_id: '',\n reply_count: 0,\n type: '',\n id: scheduledPost.id,\n create_at: scheduledPost.create_at,\n update_at: scheduledPost.update_at,\n delete_at: 0,\n user_id: scheduledPost.user_id,\n channel_id: scheduledPost.channel_id,\n root_id: scheduledPost.root_id,\n message: scheduledPost.message,\n props: scheduledPost.props,\n metadata: {\n embeds: [],\n emojis: [],\n files: [],\n images: {},\n },\n };\n if (scheduledPost.metadata) {\n post.metadata = scheduledPost.metadata;\n }\n return post;\n}\n"],"names":["dispatch","store","async","reloadConfig","success","error","data","err","AdminActions","_objectSpread","id","server_error_id","adminResetMfa","userId","UserActions","getClusterStatus","ldapTest","invalidateAllCaches","recycleDatabaseConnection","getIPFilters","getCurrentIP","applyIPFilters","ipList","getOAuthAppInfo","clientId","bindClientFunc","clientFunc","Client4","params","allowOAuth2","_ref","responseType","redirectUri","state","scope","authorizeOAuthApp","emailToLdap","loginId","password","token","ldapId","ldapPassword","emailToOAuth","newType","oauthToEmail","currentService","email","follow_link","emitUserLoggedOutEvent","uploadBrandImage","brandImage","deleteBrandImage","uploadPublicSamlCertificate","file","uploadPrivateSamlCertificate","uploadPublicLdapCertificate","uploadPrivateLdapCertificate","uploadIdpSamlCertificate","removePublicSamlCertificate","removePrivateSamlCertificate","removePublicLdapCertificate","removePrivateLdapCertificate","removeIdpSamlCertificate","getStandardAnalytics","teamId","getAdvancedAnalytics","getBotPostsPerDayAnalytics","getPostsPerDayAnalytics","getUsersPerDayAnalytics","elasticsearchTest","config","testS3Connection","elasticsearchPurgeIndexes","indexes","rebuildChannelsIndex","undefined","job","type","JobTypes","ELASTICSEARCH_POST_INDEXING","index_posts","index_users","index_files","index_channels","sub_type","createJob","jobCreate","blevePurgeIndexes","purgeBleveIndexes","setNavigationBlocked","blocked","ActionTypes","SET_NAVIGATION_BLOCKED","deferNavigation","onNavigationConfirmed","DEFER_NAVIGATION","cancelNavigation","CANCEL_NAVIGATION","confirmNavigation","thunkDispatch","thunkGetState","callback","getOnNavigationConfirmed","CONFIRM_NAVIGATION","invalidateAllEmailInvites","TeamActions","testSmtp","registerAdminConsolePlugin","pluginId","reducer","storeDispatch","RECEIVED_ADMIN_CONSOLE_REDUCER","unregisterAdminConsolePlugin","REMOVED_ADMIN_CONSOLE_REDUCER","testSiteURL","siteURL","registerAdminConsoleCustomSetting","key","component","_ref2","showTitle","RECEIVED_ADMIN_CONSOLE_CUSTOM_COMPONENT","options","registerAdminConsoleCustomSection","RECEIVED_ADMIN_CONSOLE_CUSTOM_SECTION","getSamlMetadataFromIdp","samlMetadataURL","setSamlIdpCertificateFromMetadata","certData","upgradeToE0","trackEvent","upgradeToEnterprise","upgradeToE0Status","upgradeToEnterpriseStatus","restartServer","ping","getServerStatus","deviceId","requestTrialLicense","requestLicenseBody","page","from_page","e","message","status","status_code","Option","components","SelectChannelOption","props","item","channelName","display_name","purpose","icon","React","className","description","name","Object","assign","SelectUserOption","username","first_name","last_name","nickname","concat","Utils","Avatar","size","url","imageURLForUser","is_bot","BotTag","isGuest","roles","GuestTag","reactStyles","menuPortal","provided","zIndex","commonComponents","MultiValueLabel","label","commonProps","isClearable","openMenuOnFocus","classNamePrefix","menuPortalTarget","document","body","styles","AppsFormSelectField","constructor","super","_defineProperty","selectedOption","this","onChange","performLookup","field","userInput","actions","autocompleteUsers","toLowerCase","users","filter","user","map","teammateNameDisplay","displayUsername","value","icon_data","channelsSearchResults","autocompleteChannels","channel","refreshNonce","Math","random","toString","getDerivedStateFromProps","nextProps","prevState","renderDynamicSelect","placeholder","hint","AsyncSelect","loadOptions","loadDynamicOptions","defaultOptions","isMulti","multiselect","isDisabled","readonly","renderUserSelect","loadDynamicUserOptions","renderChannelSelect","loadDynamicChannelOptions","renderStaticSelect","ReactSelect","getAppFieldRenderer","AppFieldTypes","DYNAMIC_SELECT","STATIC_SELECT","USER","CHANNEL","render","helpText","selectComponent","_pt","isRequired","AppsFormField","arguments","selected","option","Array","isArray","selectedItem","errorText","displayName","modal_label","displayNameContent","is_required","helpTextContent","Markdown","TEXT","subtype","maxLength","max_length","textValue","TextSetting","autoFocus","disabled","resizable","handleSelected","BOOL","boolValue","BoolSetting","MARKDOWN","listComponent","ModalSuggestionList","connect","getTeammateNameDisplaySetting","bindActionCreators","markdownOptions","singleline","mentionHighlight","AppsFormHeader","propTypes","initFormValues","form","values","fields","forEach","f","defaultValue","AppsForm","_this","elements","fieldErrors","formError","hasErrors","keys","length","checkIfErrorsMatchElements","entries","intl","formatMessage","defaultMessage","setState","submitName","preventDefault","fieldsAsElements","element","checkDialogElementForError","FormattedMessage","submission","submitting","res","submit","_errorResponse$data","errorResponse","errorMessage","text","updateErrors","errors","handleHide","callResponse","updatedForm","AppCallResponseTypes","FORM","OK","NAVIGATE","_this$props$form$fiel","find","performLookupCall","errMsg","callResp","_callResp$data","_items","items","filterEmptyOptions","submitted","submit_on_cancel","show","_this$props$form$fiel2","refresh","loading","refreshOnSelect","then","_errorResponse$data2","errorMsg","renderModal","header","Boolean","bodyClassNames","Modal","dialogClassName","onHide","onExited","backdrop","role","onSubmit","handleSubmit","autoComplete","Header","closeButton","style","borderBottom","Title","componentClass","renderHeader","Body","Fade","in","LoadingSpinner","fontSize","renderBody","Footer","renderFooter","renderEmbedded","title","iconComponent","alt","width","height","src","renderElements","isEmbedded","submit_buttons","index","SuggestionList","submitText","submitButtons","SpinnerButton","spinning","spinningText","defineMessage","_field$options","buttons","o","onClick","optional","injectIntl","AppsFormContainer","makeErrorMsg","msg","details","makeCallErrorResponse","context","creq","createCallRequest","doAppSubmit","postEphemeralCallResponseForContext","makeErrMsg","source","selected_field","doAppFetchForm","lookup","query","doAppLookup","submitForm","handleBindingClick","binding","_form","callRequest","_form2","inCall","_res$form","call","track_as_submit","executeAppCall","ERROR","cleanForm","navigate_to_url","shouldOpenInNewTab","getSiteURL","window","open","navigateURL","startsWith","slice","getHistory","push","_res$form2","makeFetchBindings","location","channelId","getAppsBindings","b","reduce","accum","current","bindings","_unused","openAppsModal","openModal","modalId","ModalIdentifiers","APPS_MODAL","dialogType","dialogProps","postEphemeralCallResponseForPost","response","post","_response$app_metadat","sendEphemeralPost","channel_id","root_id","app_metadata","bot_user_id","postEphemeralCallResponseForChannel","channelID","_response$app_metadat2","_response$app_metadat3","post_id","postEphemeralCallResponseForCommandArgs","args","_response$app_metadat4","getInstallation","validateBusinessEmail","is_valid","getCloudLimits","CloudTypes","CLOUD_LIMITS_REQUEST","result","RECEIVED_CLOUD_LIMITS","CLOUD_LIMITS_FAILED","getMessagesUsage","getPostsUsage","RECEIVED_MESSAGES_USAGE","count","getFilesUsage","inBits","bytes","RECEIVED_FILES_USAGE","getTeamsUsage","RECEIVED_TEAMS_USAGE","active","cloudArchived","cloud_archived","retryFailedCloudFetches","getState","getCloudErrors","subscription","getCloudSubscription","products","getCloudProducts","customer","getCloudCustomer","invoices","getInvoices","limits","uploadFile","isBookmark","rootId","onProgress","onSuccess","onError","FileTypes","UPLOAD_FILES_REQUEST","getFilesRoute","xhr","XMLHttpRequest","client4Headers","getOptions","method","headers","client4Header","client4HeaderValue","setRequestHeader","formData","FormData","append","upload","onprogress","event","percent","floor","loaded","total","onload","readyState","JSON","parse","file_infos","fileInfo","client_ids","batchActions","RECEIVED_UPLOAD_FILES","UPLOAD_FILES_SUCCESS","localizeMessage","UPLOAD_FILES_FAILURE","clientIds","onerror","responseText","forceLogoutIfNecessary","uploadFailureAction","getLogErrorAction","send","SubMenuModal","setShow","useState","useIntl","useCallback","subMenuItems","useMemo","Menu","ItemSubMenu","subMenu","action","root","enforceFocus","MenuWrapper","openLeft","ariaLabel","emitChannelClickEvent","chan","getCurrentUserId","team_id","getCurrentTeamId","isRHSOpened","getIsRhsOpen","isPinnedPostsShowing","getRhsState","RHSStates","PIN","isChannelFilesShowing","CHANNEL_FILES","member","getMyChannelMember","currentChannelId","getCurrentChannelId","previousRhsState","getPreviousRhsState","getChannelStats","penultimate","LocalStorageStore","getPreviousChannelName","penultimateType","getPreviousViewedType","setPenultimateChannelName","setPreviousChannelName","PreviousViewedTypes","CHANNELS","setPreviousViewedType","setPenultimateViewedType","updateRhsState","loadProfilesForSidebar","ChannelTypes","SELECT_CHANNEL","SELECT_CHANNEL_WITH_MEMBER","setLastUnreadChannel","appsEnabled","fetchAppBindings","switchToChannel","messageCount","getChannelMessageCount","hadMentions","hadUnreads","crtEnabled","isCollapsedThreadsEnabled","unreadCount","calculateUnreadCount","mentions","showUnread","messages","SET_LAST_UNREAD_CHANNEL","clearLastUnreadChannel","updateNewMessagesAtInChannel","lastViewedAt","Date","now","UPDATE_CHANNEL_LAST_VIEWED_AT","last_viewed_at","emitCloseRightHandSide","closeRightHandSide","showMobileSubMenuModal","submenuModalData","MOBILE_SUBMENU","parentId","doDispatch","doGetState","timestamp","user_id","PostTypes","EPHEMERAL","create_at","update_at","handleNewPost","sendAddToChannelEphemeralPost","addedUsername","addedUserId","postRootId","EPHEMERAL_ADD_TO_CHANNEL","lastTimeTypingSent","emitLocalUserTypingEvent","parentPostId","actionDispatch","actionGetState","getConfig","isPerformanceDebuggingEnabled","getBool","Preferences","CATEGORY_PERFORMANCE_DEBUGGING","NAME_DISABLE_TYPING_MESSAGES","t","stats","getCurrentChannelStats","membersInChannel","member_count","timeBetweenUserTypingUpdatesMilliseconds","TimeBetweenUserTypingUpdatesMilliseconds","maxNotificationsPerChannel","MaxNotificationsPerChannel","EnableUserTypingMessages","WebSocketClient","userTyping","redirectTo","shouldSignalLogout","setWasLoggedIn","logout","BrowserStore","signalLogout","DesktopApp","clearHideNotificationPermissionRequestBanner","WebsocketActions","clearUserCookie","catch","toggleSideBarRightMenuAction","closeLhs","closeRhsMenu","emitBrowserFocus","focus","BROWSER_CHANGE_FOCUS","getTeamRedirectChannelIfIsAccesible","team","myMember","getMyTeamMember","teamChannels","getChannelsNameMapInTeam","fetchChannelsAndMembers","channelMember","getAllDirectChannels","directChannel","getChannelByNameAndTeamName","getRedirectChannelNameForTeam","historyPushWithQueryParams","path","queryParams","pathname","search","redirectUserToDefaultTeam","searchParams","getCurrentUser","shouldLoadUser","getTeamMemberships","onboardingFlowEnabled","getIsOnboardingFlowEnabled","loadMe","isUserFirstAdmin","isFirstAdmin","locale","getCurrentLocale","getPreviousTeamId","myTeams","getMyTeams","getActiveTeamsList","getTeam","delete_at","fetchTeamScheduledPosts","selectChannel","filterAndSortTeamsByDisplayName","myTeam","setAddChannelDropdown","ADD_CHANNEL_DROPDOWN_TOGGLE","setAddChannelCtaDropdown","ADD_CHANNEL_CTA_DROPDOWN_TOGGLE","goToLastViewedChannel","currentChannel","getCurrentChannel","channelsInTeam","getChannelsNameMapInCurrentTeam","getAllDirectChannelsNameMapInCurrentTeam","channels","channelToSwitchTo","getChannelByName","getLastViewedChannelName","switchToChannelById","getChannel","selectedTeamId","teamUrl","getRelativeTeamUrl","getCurrentRelativeTeamUrl","getUserByUsername","openDirectChannelToUserId","Constants","GM_CHANNEL","gmChannel","THREADS","joinChannelById","currentUserId","currentTeamId","joinChannel","leaveChannel","currentTeam","getCurrentTeam","isFavoriteChannel","unfavoriteChannel","isArchivedChannel","removePreviousChannel","leaveChannelRedux","prevChannelName","prevChannel","getMyChannelMemberships","selectedPost","getSelectedPost","getSelectedPostId","exists","getMyChannels","c","OPEN_CHANNEL","PRIVATE_CHANNEL","selectTeam","TeamTypes","LEAVE_TEAM","leaveDirectChannel","getTeamsList","previousChannel","penultimateChannel","getPenultimateChannelName","removePenultimateChannelName","autocompleteUsersInChannel","prefix","addLastViewAtToProfiles","makeAddLastViewAtToProfiles","out_of_channel","loadUnreads","prefetch","time","PREFETCH_POSTS_FOR_CHANNEL","RequestStatus","STARTED","PostActions","FAILURE","atLatestMessage","atOldestmessage","loadCustomStatusEmojisForPostList","posts","INCREASE_POST_VISIBILITY","amount","order","SUCCESS","next_post_id","RECEIVED_POSTS_FOR_CHANNEL_AT_TIME","prev_post_id","loadPostsAround","focusedPostId","Posts","POST_CHUNK_SIZE","loadLatestPosts","loadPosts","postId","POST_INCREASE_AMOUNT","LOADING_POSTS","PostRequestTypes","BEFORE_ID","moreToLoad","syncPostsInChannel","since","socketStatus","getSocketStatus","sinceTimeToGetPosts","lastPostsApiCallForChannel","getLastPostsApiTimeForChannel","lastDisconnectAt","prefetchChannelPosts","jitter","recentPostIdInChannel","getMostRecentPostIdInChannel","entities","postsInChannel","Promise","resolve","setTimeout","recentPost","getPost","scrollPostListToBottom","EventEmitter","emit","EventTypes","POST_LIST_SCROLL_TO_BOTTOM","markAsReadOnFocus","selectedThreadId","getSelectedThreadIdInCurrentTeam","selectedPostId","isManuallyUnread","markChannelAsRead","markThreadAsRead","updateToastStatus","UPDATE_TOAST_STATUS","deleteChannel","deleteChannelRedux","submitPost","draft","afterSubmit","schedulingInfo","file_ids","pending_post_id","metadata","Error","haveIChannelPermission","Permissions","USE_CHANNEL_MENTIONS","containsAtChannel","checkAllMentions","mentionHighlightDisabled","license","getLicense","useLDAPGroupMentions","IsLicensed","LDAPGroups","USE_GROUP_MENTIONS","useCustomGroupMentions","isCustomGroupsEnabled","groupsWithAllowReference","getAssociatedGroupsForReferenceByMention","groupsMentionedInText","disable_group_highlight","hookResult","runMessageWillBePostedHooks","_draft$fileInfos","scheduledPost","scheduledPostFromPost","fileInfos","files","createSchedulePostFromDraft","created","addMessageIntoHistory","ignoreSlash","isReaction","exec","emojis","getCustomEmojisByName","emojiMap","EmojiMap","has","latestPostId","getLatestInteractablePostId","indexOf","runSlashCommandWillBePostedHooks","cmdLength","cmd","substring","trim","commandsWithTelemetry","command","telemetry","frontendHandled","UserAgent","KEYBOARD_SHORTCUTS_MODAL","KeyboardShortcutsModal","GlobalActions","silentFailureReason","LEAVE_PRIVATE_CHANNEL_MODAL","LeaveChannelModal","DM_CHANNEL","category","getUserIdFromChannelName","CATEGORY_DIRECT_CHANNEL_SHOW","CATEGORY_GROUP_CHANNEL_SHOW","redirectChannel","savePreferences","USER_SETTINGS","UserSettingsModal","isContentProductSettings","haveICurrentTeamPermission","SYSCONSOLE_WRITE_PLUGINS","isMarketplaceEnabled","PLUGIN_MARKETPLACE","MarketplaceModal","openedFrom","getGlobalState","createErrorMessage","errMessage","parser","AppCommandParser","intlShim","isAppCommand","composeCommandSubmitCall","appResponse","executeCommand","hasGotoLocation","goto_location","isUrlSafe","trigger_id","IntegrationTypes","RECEIVED_DIALOG_TRIGGER_ID","substr","sendMessage","submitCommand","editLatestPost","lastPostId","getLatestPostToEdit","searchAssociatedGroupsForReference","opts","q","filter_allow_reference","per_page","include_member_count","include_channel_member_count","searchGroups","searchAssociatedGroupsForReferenceLocal","setLhsSize","sidebarSize","newSidebarSize","innerWidth","SMALL_SIDEBAR_BREAKPOINT","SidebarSize","SMALL","MEDIUM_SIDEBAR_BREAKPOINT","MEDIUM","LARGE_SIDEBAR_BREAKPOINT","LARGE","XLARGE","SET_LHS_SIZE","toggle","TOGGLE_LHS","OPEN_LHS","close","CLOSE_LHS","selectStaticPage","itemId","SELECT_STATIC_PAGE","selectLhsItem","LhsItemType","Channel","Page","None","switchToLhsStaticPage","dismissNotice","DISMISS_NOTICE","switchToChannels","DEFAULT_CHANNEL","openInvitationsModal","timeout","INVITATION","InvitationModal","setShowOnboardingCompleteProfileTour","SHOW_ONBOARDING_COMPLETE_PROFILE_TOUR","setShowOnboardingVisitConsoleTour","SHOW_ONBOARDING_VISIT_CONSOLE_TOUR","editPost","logError","AnnouncementBarTypes","ANNOUNCEMENT","forwardPost","relativePermaLink","getPermalinkURL","permaLink","haveICurrentChannelPermission","useChannelMentions","newPost","getTimestamp","selectAttachmentMenuAction","actionId","cookie","dataSource","SELECT_ATTACHMENT_MENU_ACTION","setProductMenuSwitcherOpen","SET_PRODUCT_SWITCHER_OPEN","pluginTranslationSources","registerPluginTranslationsSource","sourceFunction","immutableTranslations","getTranslations","translations","RECEIVED_TRANSLATIONS","unregisterPluginTranslationsSource","Reflect","deleteProperty","loadTranslations","en","pluginFunc","serverTranslations","console","setModalSearchTerm","term","SearchTypes","SET_MODAL_SEARCH","setPopoverSearchTerm","SET_POPOVER_SEARCH","setChannelMembersRhsSearchTerm","SET_CHANNEL_MEMBERS_RHS_SEARCH","setModalFilters","filters","SET_MODAL_FILTERS","setUserGridSearch","SET_USER_GRID_SEARCH","setUserGridFilters","SET_USER_GRID_FILTERS","setTeamListSearch","SET_TEAM_LIST_SEARCH","setChannelListSearch","SET_CHANNEL_LIST_SEARCH","setChannelListFilters","SET_CHANNEL_LIST_FILTERS","setStatusDropdown","STATUS_DROPDOWN_TOGGLE","removeNotVisibleUsers","knownUsers","fetchResult","getKnownUsers","Set","add","allUsers","getUsers","usersToRemove","x","userToRemove","UserTypes","PROFILE_NO_LONGER_VISIBLE","RemovedFromChannelModal","remover","ownProps","getUser","removerId","MAX_WEBSOCKET_FAILS","pluginEventHandlers","initialize","WebSocket","log","connUrl","WebsocketURL","URL","protocol","test","host","WebsocketSecurePort","WebsocketPort","getUrlVersion","addMessageListener","handleEvent","addFirstConnectListener","handleFirstConnect","addReconnectListener","reconnect","addMissedMessageListener","restart","addCloseListener","handleClose","removeMessageListener","removeFirstConnectListener","removeReconnectListener","removeMissedMessageListener","removeCloseListener","pluginReconnectHandlers","registerPluginReconnectHandler","handler","unregisterPluginReconnectHandler","getClientConfig","temporarilySetPageLoadContext","PageLoadContext","RECONNECT","GeneralTypes","WEBSOCKET_SUCCESS","mostRecentId","mostRecentPost","handleRefreshAppsBindings","fetchAllMyTeamsChannels","fetchAllMyChannelMembers","fetchMyCategories","getPosts","getIsUserStatusesConfigEnabled","StatusActions","teams","syncThreads","updateActiveChannel","updateActiveTeam","loadPluginsIfNecessary","websocket","checkForModifiedUsers","RESET_WS_ERROR_COUNT","clearErrors","newestThread","getNewestThreadInTeam","getCountsAndThreadsSince","last_reply_at","registerPluginWebSocketEvent","unregisterPluginWebSocketEvent","events","unregisterAllPluginWebSocketEvents","failCount","AnnouncementBarMessages","WEBSOCKET_PORT_ERROR","WEBSOCKET_FAILURE","INCREMENT_WS_ERROR_COUNT","SocketEvents","POSTED","EPHEMERAL_MESSAGE","handleNewPostEventDebounced","POST_EDITED","logPostEvents","receivedPost","batchFetchStatusesProfilesGroupsFromPosts","handlePostEditEvent","POST_DELETED","collapsedThreads","decrementThreadCounts","postDeleted","getThread","getTeamIdFromPost","fetchThread","getPostThread","rootPost","is_pinned","handlePostDeleteEvent","POST_UNREAD","POST_UNREAD_SUCCESS","broadcast","msgCount","msg_count","msgCountRoot","msg_count_root","mentionCount","mention_count","mentionCountRoot","mention_count_root","urgentMentionCount","urgent_mention_count","handlePostUnreadEvent","RECEIVED_PROFILE_NOT_IN_TEAM","REMOVE_MEMBER_FROM_TEAM","channelsPerTeam","getChannelsInTeam","REMOVE_MEMBER_FROM_CHANNEL","currentUser","global","members","getChannelMembersInChannels","isMember","some","handleLeaveTeamEvent","UPDATE_TEAM","UPDATED_TEAM","Cloud","handleUpdateTeamEvent","UPDATE_TEAM_SCHEME","DELETE_TEAM","deletedTeam","myMembers","teamMembers","teamMember","m","newTeamId","i","memberTeamId","RECEIVED_TEAM_DELETED","SELECT_TEAM","globalState","getCurrentTeamUrl","handleDeleteTeamEvent","ADDED_TO_TEAM","handleTeamAddedEvent","USER_ADDED","RECEIVED_PROFILE_IN_CHANNEL","EnableConfirmNotificationsToChannel","getChannelMemberCountsByGroup","fetchChannelAndAddToSidebar","isCurrentUserSystemAdmin","handleUserAddedEvent","USER_REMOVED","loadChannelsForCurrentUser","rhsChannelId","getSelectedChannelId","remover_id","loadUser","REMOVED_FROM_CHANNEL","LEAVE_CHANNEL","RECEIVED_PROFILE_NOT_IN_CHANNEL","haveISystemPermission","permission","VIEW_MEMBERS","haveITeamPermission","handleUserRemovedEvent","USER_UPDATED","customStatus","loadCustomEmojisIfNeeded","emoji","RECEIVED_ME","loadRolesIfNeeded","split","RECEIVED_PROFILE","handleUserUpdatedEvent","ROLE_ADDED","RoleTypes","RECEIVED_ROLE","handleRoleAddedEvent","ROLE_REMOVED","ROLE_DELETED","handleRoleRemovedEvent","CHANNEL_SCHEME_UPDATED","handleChannelSchemeUpdatedEvent","MEMBERROLE_UPDATED","memberData","newRoles","RECEIVED_MY_TEAM_MEMBER","handleUpdateMemberRoleEvent","ROLE_UPDATED","handleRoleUpdatedEvent","CHANNEL_CREATED","myDispatch","myGetState","getChannelAndMyMember","addChannelToInitialCategory","handleChannelCreatedEvent","CHANNEL_DELETED","viewArchivedChannels","ExperimentalViewArchivedChannels","RECEIVED_CHANNEL_DELETED","deleteAt","handleChannelDeletedEvent","CHANNEL_UNARCHIVED","RECEIVED_CHANNEL_UNARCHIVED","handleChannelUnarchivedEvent","CHANNEL_CONVERTED","RECEIVED_CHANNEL","General","handleChannelConvertedEvent","CHANNEL_UPDATED","existingChannel","GM_CONVERTED_TO_CHANNEL","replace","handleChannelUpdatedEvent","CHANNEL_MEMBER_UPDATED","RECEIVED_MY_CHANNEL_MEMBER","handleChannelMemberUpdatedEvent","CHANNEL_BOOKMARK_CREATED","bookmark","ChannelBookmarkTypes","RECEIVED_BOOKMARK","handleChannelBookmarkCreated","CHANNEL_BOOKMARK_UPDATED","updated","deleted","bookmarks","BOOKMARK_DELETED","handleChannelBookmarkUpdated","CHANNEL_BOOKMARK_DELETED","handleChannelBookmarkDeleted","CHANNEL_BOOKMARK_SORTED","RECEIVED_BOOKMARKS","handleChannelBookmarkSorted","DIRECT_ADDED","GROUP_ADDED","handleGroupAddedEvent","PREFERENCE_CHANGED","preference","PreferenceTypes","RECEIVED_PREFERENCES","addedNewDmUser","loadProfilesForDM","addedNewGmUser","loadProfilesForGM","handlePreferenceChangedEvent","PREFERENCES_CHANGED","preferences","findIndex","handlePreferencesChangedEvent","PREFERENCES_DELETED","DELETED_PREFERENCES","handlePreferencesDeletedEvent","STATUS_CHANGED","RECEIVED_STATUSES","handleStatusChangedEvent","HELLO","serverHostname","connectionId","setServerVersion","server_version","connection_id","SET_CONNECTION_ID","payload","server_hostname","SET_SERVER_HOSTNAME","handleHelloEvent","REACTION_ADDED","reaction","getCustomEmojiForReaction","emoji_name","RECEIVED_REACTION","handleReactionAddedEvent","REACTION_REMOVED","REACTION_DELETED","handleReactionRemovedEvent","EMOJI_ADDED","EmojiTypes","RECEIVED_CUSTOM_EMOJI","handleAddEmoji","MULTIPLE_CHANNELS_VIEWED","markMultipleChannelsAsRead","channel_times","handleMultipleChannelsViewedEvent","PLUGIN_ENABLED","manifest","RECEIVED_WEBAPP_PLUGIN","loadPlugin","handlePluginEnabled","PLUGIN_DISABLED","removePlugin","handlePluginDisabled","USER_ROLE_UPDATED","profiles","demoted","includes","PERMISSIONS_SYSTEM_ADMIN","handleUserRoleUpdated","CONFIG_CHANGED","CLIENT_CONFIG_RECEIVED","handleConfigChanged","LICENSE_CHANGED","CLIENT_LICENSE_RECEIVED","handleLicenseChanged","PLUGIN_STATUSES_CHANGED","AdminTypes","RECEIVED_PLUGIN_STATUSES","plugin_statuses","handlePluginStatusesChangedEvent","OPEN_DIALOG","dialog","RECEIVED_DIALOG","currentTriggerId","integrations","dialogTriggerId","INTERACTIVE_DIALOG","InteractiveDialog","handleOpenDialogEvent","RECEIVED_GROUP","group","GroupTypes","PATCHED_GROUP","handleGroupUpdatedEvent","GROUP_MEMBER_ADD","groupInfo","group_member","getGroup","group_id","ADD_MY_GROUP","fetchGroup","handleGroupAddedMemberEvent","GROUP_MEMBER_DELETED","REMOVE_MY_GROUP","handleGroupDeletedMemberEvent","RECEIVED_GROUP_ASSOCIATED_TO_TEAM","teamID","groups","handleGroupAssociatedToTeamEvent","RECEIVED_GROUP_NOT_ASSOCIATED_TO_TEAM","handleGroupNotAssociatedToTeamEvent","RECEIVED_GROUP_ASSOCIATED_TO_CHANNEL","handleGroupAssociatedToChannelEvent","RECEIVED_GROUP_NOT_ASSOCIATED_TO_CHANNEL","handleGroupNotAssociatedToChannelEvent","SIDEBAR_CATEGORY_CREATED","handleSidebarCategoryCreated","SIDEBAR_CATEGORY_UPDATED","handleSidebarCategoryUpdated","SIDEBAR_CATEGORY_DELETED","handleSidebarCategoryDeleted","SIDEBAR_CATEGORY_ORDER_UPDATED","receivedCategoryOrder","handleSidebarCategoryOrderUpdated","USER_ACTIVATION_STATUS_CHANGED","CLOUD_PAYMENT_STATUS_UPDATED","CLOUD_SUBSCRIPTION_CHANGED","RECEIVED_CLOUD_SUBSCRIPTION","handleCloudSubscriptionChanged","FIRST_ADMIN_VISIT_MARKETPLACE_STATUS_RECEIVED","receivedData","firstAdminVisitMarketplaceStatus","handleFirstAdminVisitMarketplaceStatusReceivedEvent","THREAD_FOLLOW_CHANGED","thread_id","reply_count","handleFollowChanged","handleThreadFollowChanged","THREAD_READ_CHANGED","_getThreads","_thread$unread_mentio","_thread$unread_replie","thread","getThreads","isThreadOpen","updateThreadLastOpened","handleReadChanged","prevUnreadMentions","unread_mentions","previous_unread_mentions","newUnreadMentions","prevUnreadReplies","unread_replies","previous_unread_replies","newUnreadReplies","handleAllThreadsInChannelMarkedRead","handleAllMarkedRead","handleThreadReadChanged","THREAD_UPDATED","threadData","is_following","isActive","isThreadManuallyUnread","updateThreadRead","handleThreadArrived","handleThreadUpdated","APPS_FRAMEWORK_REFRESH_BINDINGS","APPS_FRAMEWORK_PLUGIN_ENABLED","AppsTypes","APPS_PLUGIN_ENABLED","APPS_FRAMEWORK_PLUGIN_DISABLED","APPS_PLUGIN_DISABLED","POST_ACKNOWLEDGEMENT_ADDED","acknowledgement","CREATE_ACK_POST_SUCCESS","handlePostAcknowledgementAdded","POST_ACKNOWLEDGEMENT_REMOVED","DELETE_ACK_POST_SUCCESS","handlePostAcknowledgementRemoved","DRAFT_CREATED","DRAFT_UPDATED","transformServerDraft","setGlobalDraft","handleUpsertDraftEvent","DRAFT_DELETED","setGlobalItem","uploadsInProgress","handleDeleteDraftEvent","SCHEDULED_POST_CREATED","getTeamIdByChannelId","ScheduledPostTypes","SINGLE_SCHEDULED_POST_RECEIVED","handleCreateScheduledPostEvent","SCHEDULED_POST_UPDATED","handleUpdateScheduledPostEvent","SCHEDULED_POST_DELETED","handleDeleteScheduledPostEvent","PERSISTENT_NOTIFICATION_TRIGGERED","sendDesktopNotification","handlePersistentNotification","HOSTED_CUSTOMER_SIGNUP_PROGRESS_UPDATED","HostedCustomerTypes","RECEIVED_SELF_HOSTED_SIGNUP_PROGRESS","progress","handleHostedCustomerSignupProgressUpdated","pluginEvents","hasOwn","queue","triggered","should_ack","acknowledgePostedNotification","receivedNewPost","getPostThreads","handleNewPostEvents","clearTimeout","getIsManualStatusForUserId","set_online","UserStatuses","ONLINE","handleNewPostEvent","debouncePostEvent","_selectedThread","_selectedThread$post","general","SiteURL","currentURL","href","threadIdentifier","parts","endsWith","rhsPost","selectedThread","rootID","fetchRHSAppsBindings","AboutBuildModalCloud","companyName","Company","companyInfo","useSelector","cloud","subTitle","licensee","classNames","doHide","appTitle","SiteName","MattermostLogo","Version","linkServer","ExternalLink","linkDesktop","linkMobile","currentYear","getFullYear","BuildHash","BuildHashEnterprise","BuildDate","AboutBuildModal","learnMore","BuildEnterpriseReady","Nbsp","termsOfService","AboutLinks","TERMS_OF_SERVICE","privacyPolicy","PRIVACY_POLICY","buildnumber","BuildNumber","mmversion","connected","SchemaVersion","SQLDriverName","AddGroupsToTeamModal","addError","saving","groupIDs","v","skipCommit","onAddCallback","all","linkGroupSyncable","groupID","SyncableType","Team","auto_add","scheme_admin","handleResponse","userIds","loadingState","loadingGroups","prevPage","setGroupsLoadingState","getGroupsNotAssociatedToTeam","searchTerm","GROUPS_PER_PAGE","isSelected","onAdd","onMouseMove","rowSelected","ref","selectedItemRef","groupsAvatar","num","searchTimeoutId","componentDidMount","getAllGroupsAssociatedToTeam","componentDidUpdate","prevProps","SEARCH_TIMEOUT_MILLISECONDS","_this$props$currentTe","numRemainingText","buttonSubmitText","buttonSubmitLoadingText","groupsToShow","excludeGroups","hasGroup","og","_this$props$excludeGr","g","includeGroups","_this$props$includeGr","groupsOptionsToShow","handleExit","teamName","currentTeamName","MultiSelect","optionRenderer","renderOption","valueRenderer","renderValue","perPage","handlePageChange","handleInput","handleDelete","handleAdd","addValue","maxValues","placeholderText","_team$id","views","modalSearch","selectGroupsNotAssociatedToTeam","regex","RegExp","MultiSelectOption","userStatuses","ProfilePicture","getProfilePictureUrl","last_picture_update","displayEntireNameForUser","AddUserToGroupMultiSelect","addUserCallback","deleteUserCallback","loadingUsers","setUsersLoadingState","groupId","getProfilesNotInGroup","getProfiles","onSubmitCallback","searchProfiles","searchOptions","filterProfilesStartingWithTerm","excludeUsers","includeUsers","multilSelectKey","ariaLabelRenderer","renderAriaLabel","saveButtonPosition","valueWithImage","focusOnLoad","savingEnabled","backButtonClick","backButtonClass","backButtonText","loadStatusesForProfilesList","getProfilesNotInCurrentGroup","getUserStatuses","BlockableLink","to","restProps","_objectWithoutProperties","_excluded","handleClick","NavLink","getNavigationBlocked","SystemRolesSVG","viewBox","fill","xmlns","xmlnsXlink","cx","cy","r","transform","fillOpacity","d","stroke","strokeOpacity","strokeLinecap","strokeLinejoin","y","rx","strokeWidth","ry","maskUnits","mask","opacity","fillRule","clipRule","Moon","version","Container","styled","withConfig","Icon","RemoteUserHour","teammateTimezone","Timestamp","useRelative","useDate","userTimezone","useTime","hour","minute","ShortScheduledPostIndicator","scheduledPostData","scheduledPostLinkURL","a","chunks","Link","ScheduledPostIndicator","remoteUserHourDisplayed","isThread","Locations","RHS_COMMENT","showChannelOrThreadScheduledPostIndicator","_getCurrentTeam","scheduledPostText","dateTime","scheduled_at","ranges","SCHEDULED_POST_TIME_RANGES","useSemanticOutput","scheduledPostTimeFormat","DEFAULT_TIMEZONE","useAutomaticTimezone","automaticTimezone","manualTimezone","getDisplayName","makeGetDisplayName","teammateId","_getDirectChannel","getDirectChannel","teammate_id","teammateDisplayName","isDM","_getDirectChannel2","showDndWarning","getStatusForUserId","DND","setTimestamp","showIt","setShowIt","teammate","getTimezoneForUserProfile","userCurrentTimezone","getCurrentTimezone","useEffect","updateTime","timezone","teammateUserDate","DateTime","local","setZone","toMillis","currentHour","showIndicator","REMOTE_USERS_HOUR_LIMIT_END_OF_THE_DAY","REMOTE_USERS_HOUR_LIMIT_BEGINNING_OF_THE_DAY","interval","setInterval","clearInterval","isScheduledPostEnabledValue","isScheduledPostsEnabled","showRemoteUserHour","isSelfDM","isBot","currentUserTimesStamp","isScheduledPostEnabled","PostBoxIndicator","useTimePostBoxIndicator","RhsSuggestionList","position","setPosition","isMobile","getIsMobileView","input","inputRef","_input$getBoundingCli","newPosition","getBoundingClientRect","top","MOBILE_SUGGESTION_LIST_SPACE_RHS","SUGGESTION_LIST_SPACE_RHS","DoNotDisturbWarning","EditPostFooter","useDispatch","sendOnCtrlEnter","isSendOnCtrlEnter","ctrlSendKey","isMac","onSave","_props$onCancel","onCancel","unsetEditingPost","strong","_props$error","_props$error$message","_props$error$message$","isErrorInvalidSlashCommand","_props$submittedMessa","slashCommand","submittedMessage","getUsersTypingImpl","typing","userStoppedTyping","WebsocketEvents","STOP_TYPING","MsgTyping","userStartedTyping","useWebSocket","TYPING","parent_id","getTypingText","numUsers","typingUsers","last","pop","join","mapDispatchToProps","enabledUserStatuses","getMissingProfilesByIds","getStatusesByIds","fillInMissingInfo","parseInt","getTimeBetweenTypingEvents","getUsersTypingByChannelAndPost","createSelector","postError","errorClass","serverError","noArgumentHandleSubmit","isInEditMode","MessageSubmitError","MAP_WIDE_MODE_TO_CONTROLS_QUANTITY","wide","normal","narrow","min","Separator","FormattingBarSpacer","FormattingBarContainer","HiddenControlsContainer","FormattingBar","applyMarkdown","getCurrentSelection","getCurrentMessage","disableControls","additionalControls","showHiddenControls","setShowHiddenControls","formattingBarRef","useRef","controls","hiddenControls","wideMode","setWideMode","handleResize","debounce","_ref$current","clientWidth","useLayoutEffect","sizeObserver","ResizeObserver","observe","disconnect","useResponsiveFormattingBar","allControls","controlsLength","splitFormattingBarControls","useFormattingBarControls","HiddenControlsButtonAriaLabel","strategy","update","refs","setReference","setFloating","useFloating","onOpenChange","placement","middleware","offset","mainAxis","click","useClick","getReferenceProps","getClickReferenceProps","getFloatingProps","getClickFloatingProps","useInteractions","dismiss","useDismiss","getDismissReferenceProps","getDismissFloatingProps","hasHiddenControls","makeFormattingHandler","mode","start","end","markdownMode","selectionStart","selectionEnd","hiddenControlsContainerStyles","left","showSeparators","FormattingIcon","IconContainer","DotsHorizontalIcon","color","CSSTransition","memo","MessageWithMentionsFooter","InformationOutlineIcon","DATE_RANGES","RelativeRanges","USE_DATE_WEEKDAY_LONG","weekday","USE_TIME_HOUR_MINUTE_NUMERIC","USE_DATE_MONTH_DAY","month","day","RecentUsedCustomDate","handleOnSelect","nextMonday","tomorrow9amTime","recentlyUsedCustomDate","getPreference","scheduledPosts","SCHEDULED_POSTS","RECENTLY_USED_CUSTOM_TIME","recentlyUsedCustomDateVal","handleRecentlyUsedCustomTime","nowMillis","timeZone","isNaN","usedDate","fromMillis","minus","days","isTimestampWithinLast30Days","shouldShowRecentlyUsedCustomTime","dateOption","scheduledDate","weekNumber","weekYear","getDateOption","trailingElement","labels","trailingElements","CoreMenuOptions","trackFeatureEvent","TrackScheduledPostsFeature","TrackPropertyUser","TrackPropertyUserAgent","plus","set","second","millisecond","adjustedDays","deltaDays","getNextWeekday","timeComponent","valueOf","extraProps","teammateTimezoneString","scheduledTimeInTeammateTimezone","userCurrentTimestamp","zone","toFormat","getScheduledTimeInTeammateTimezone","teammateTimeDisplay","tomorrowClickHandler","optionTomorrow","nextMondayClickHandler","optionNextMonday","optionMonday","SendPostOptions","onSelect","scheduledAt","stopPropagation","handleSelectCustomTime","handleChooseCustomTime","SCHEDULED_POST_CUSTOM_TIME_MODAL","ScheduledPostCustomTimeModal","onConfirm","menuButtonTooltip","menuButton","class","children","ChevronDownIcon","menu","transformOrigin","horizontal","vertical","anchorOrigin","SendButton","sendNowKeyboardShortcutDescriptor","shortcutDefinition","default","mac","_shortcutDefinition$m","unshift","ShortcutKeys","ctrl","WithTooltip","shortcut","singleAction","tabIndex","SendIcon","ShowFormatting","buttonAriaLabel","iconAriaLabel","KeyboardShortcutSequence","KEYBOARD_SHORTCUTS","msgMarkdownPreview","hoistDescription","isInsideTooltip","EyeOutlineIcon","TexteditorActions","isScrollbarRendered","css","_ref3","ToggleFormattingBar","msgHideFormatting","msgShowFormatting","ChevronIcon","ChevronUpIcon","FormatLetterCaseIcon","KeyCodes","getShouldFocusRHS","rhs","shouldFocusRHS","holders","defineMessages","limited","filesAbove","fileAbove","zeroBytesFiles","zeroBytesFile","customStyles","right","bottom","FileUpload","PureComponent","containerSelector","overlaySelector","postType","centerChannelPostBeingEdited","rhsPostBeingEdited","DropOverlayIdCreateComment","DropOverlayIdRHS","DropOverlayIdEditPost","currentRootId","onFileUpload","requests","j","onUploadError","uploadFiles","sortedFiles","from","sort","localeCompare","numeric","willUploadHooks","pluginFilesWillUploadHooks","h","_h$hook","hook","pluginUploadFiles","uploadsRemaining","MAX_UPLOAD_FILES","fileCount","numUploads","tooLargeFiles","zeroFiles","maxFileSize","generateId","request","onUploadProgress","fileUploadSuccess","fileUploadFail","onUploadStart","tooLargeFilenames","max","filenames","filename","zeroFilenames","target","checkPluginHooksAndUploadFiles","clearFileInput","onFileUploadChange","canUploadFiles","dataTransfer","droppedFiles","webkitGetAsEntry","isDirectory","types","isUriDrop","overlay","querySelector","dragTimeout","DelayedAction","_overlay","classList","noop","dragsterActions","enter","detail","_overlay2","isFileTransfer","remove","leave","_overlay3","cancel","over","fireAfter","isTextDroppableEvent","drop","_overlay4","handleDrop","unbindDragsterEvents","defaults","settings","node","first","dragenter","enterEvent","CustomEvent","dispatchEvent","dragleave","leaveEvent","dragover","overEvent","dropEvent","addEventListener","unbindEvents","removeEventListener","dragster","targetElement","eventTarget","contains","clipboardData","hasPlainText","textarea","getTarget","containsEventTarget","fileClipboardItems","kind","fileNamePrefixIfNoName","fileList","fileClipboardItem","createFileFromClipboardDataItem","cmdOrCtrlPressed","shiftKey","isKeyPressed","U","_document$activeEleme","_document$activeEleme2","_document$activeEleme3","postTextbox","activeElement","commentTextbox","threadTextbox","_this$fileInput$curre","_this$fileInput$curre2","fileInput","abort","handleMaxUploadReached","menuOpen","_this$fileInput$curre3","getDragEventDefinition","registerDragEvents","pasteUpload","keyUpload","_this$unbindDragsterE","componentWillUnmount","_this$unbindDragsterE2","multiple","isMobileApp","accept","isIosChrome","bodyAction","pluginFileUploadMethods","filesUpload","simulateInputClick","onTouchEnd","PaperclipIcon","handleChange","handleLocalFileUploaded","openUp","wrappedComponent","forwardRef","MaxFileSize","editingPost","getEditingPostDetailsAndPost","isRHS","plugins","FileUploadMethod","FilesWillUploadHook","getFileCount","FileLimitStickyBanner","makeAsyncComponent","lazy","AdvancedTextEditor","_allAtMentions","isThreadView","storageKey","getChannelSelector","makeGetChannel","getDraftSelector","makeGetDraft","getFormattingBarPreferenceName","AdvancedTextEditorConst","EDIT","COMMENT","POST","channelDisplayName","channelType","isChannelShared","shared","draftFromStore","badConnection","system","websocketConnectionErrorCount","connectionErrorCount","maxPostSize","MaxPostSize","DEFAULT_CHARACTER_LIMIT","canUploadFilesAccordingToConfig","fullWidthTextBox","get","CATEGORY_DISPLAY_SETTINGS","CHANNEL_DISPLAY_MODE","CHANNEL_DISPLAY_MODE_DEFAULT","CHANNEL_DISPLAY_MODE_FULL_SCREEN","isFormattingBarHidden","preferenceName","ADVANCED_TEXT_EDITOR","selectedPostFocussedAt","getSelectedPostFocussedAt","canPost","CREATE_POST","showSendTutorialTip","enableTutorial","EnableTutorial","tutorialStep","getInt","TutorialTourName","ONBOARDING_TUTORIAL_STEP","tourStep","isCurrentUserGuestUser","OnboardingTourStepsForGuestUsers","SEND_MESSAGE","OnboardingTourSteps","postFileIds","getFilesIdsForPost","editorActionsRef","editorBodyRef","textboxRef","loggedInAriaLabelTimeout","saveDraftFrame","draftRef","storedDrafts","lastBlurAt","setDraft","caretPosition","setCaretPosition","setServerError","setPostError","showPreview","setShowPreview","isMessageLong","setIsMessageLong","renderScrollbar","setRenderScrollbar","keepEditorInFocus","setKeepEditorInFocus","readOnlyChannel","hasDraftMessage","showFormattingBar","enableSharedChannelsDMs","getFeatureFlagValue","isDMOrGMRemote","handleShowPreview","prev","emitTypingEvent","handleDraftChange","draftToChange","instant","saveDraft","StoragePrefixes","DRAFT","suffix","COMMENT_DRAFT","isPostDraftEmpty","removeDraft","updateDraft","SAVE_DRAFT_TIMEOUT","applyMarkdownUtil","_textboxRef$current","textbox","getInputBox","toggleAdvanceTextEditor","String","useOrientationHandler","lastOrientation","onOrientationChange","orientation","abs","screen","blur","pluginItems","usePluginItems","postEditorActions","PostEditorAction","getSelectedText","updateText","Component","focusTextbox","useTextboxFocus","rhsExpanded","getIsRhsExpanded","rhsOpen","keepFocus","postTextboxDisabled","focusTextboxIfNecessary","tagName","getElementsByClassName","shouldFocusMainTextbox","useDidUpdate","focusedRHS","attachmentPreview","fileUploadJSX","useUploadFiles","isPostBeingEdited","uploadsProgressPercent","setUploadsProgressPercent","fileUploadRef","handleFileUploadChange","getFileUploadTarget","handleUploadProgress","filePreviewInfo","handleFileUploadComplete","draftToUpdate","newFileInfos","sortFileInfos","clientIdsSet","modifiedDraft","handleUploadStart","updatedDraft","handleUploadError","uploadError","storedDraft","_modifiedDraft$upload","splice","removePreview","info","_fileUploadRef$curren","cancelUpload","FilePreview","onRemove","emojiPickerOffset","emojiPicker","enableEmojiPicker","toggleEmojiPicker","useEmojiPicker","shouldShowPreview","EnableEmojiPicker","enableGifPicker","EnableGifPicker","emojiPickerRef","showEmojiPicker","setShowEmojiPicker","hideEmojiPicker","getEmojiPickerRef","handleEmojiClick","emojiAlias","getEmojiName","newMessage","firstPiece","lastPiece","splitMessageBasedOnCaretPosition","newCaretPosition","handleGifClick","gif","EmojiPickerOverlay","onEmojiClick","onGifClick","topOffset","rightOffset","msgShowEmojiPicker","EmoticonHappyOutlineIcon","priorityLabels","additionalControl","priorityAdditionalControl","isValidPersistentNotifications","onSubmitCheck","prioritySubmitCheck","usePriority","useSubmit","handleCancel","createAt","updateAt","handleFileChangesOnSave","RECEIVED_FILES_FOR_POST","deletedFileIds","REMOVED_FILE","fileIds","handleSubmitWrapper","isEmptyPost","deletePostModalData","DELETE_POST","DeletePostModal","handleKeyDown","postMsgKeyPress","useKeyHandler","toggleShowPreview","ctrlSend","CATEGORY_ADVANCED_SETTINGS","codeBlockOnCtrlEnter","messageHistory","messagesHistory","timeoutId","messageHistoryIndex","lastChannelSwitchAt","isNonFormattedPaste","replyToLastPost","replyBox","getElementById","replyToLatestPostInChannel","onEditLatestPost","canEditNow","loadPrevMessage","loadNextMessage","allowSending","withClosedCodeBlock","ignoreKeyPress","postMessageOnKeyPress","ctrlOrMetaKeyPressed","ctrlKey","metaKey","ctrlEnterKeyCombo","Keyboard","ENTER","ctrlKeyCombo","altKey","ctrlAltCombo","shiftAltCombo","ctrlShiftCombo","V","nativeEvent","ESCAPE","upKeyOnly","UP","messageIsEmpty","allowHistoryNavigation","caretIsWithinCodeBlock","isWithinCodeBlock","DOWN","B","I","K","C","E","T","P","X","SEVEN","EIGHT","NINE","BACK_SLASH","emitShortcutReactToLastPostFrom","RHS_ROOT","CENTER","onPaste","pasteHandler","reactToLastMessage","noModalsAreOpen","A11yClassNames","MODAL","noPopupsDropdownsAreOpen","POPUP","documentKeyHandler","handleSubmitWithEvent","handlePostError","handleHeightChange","maxHeight","handleBlur","handleFocus","getCurrentValue","_textboxRef$current2","_textboxRef$current3","handleWidthChange","_textboxRef$current4","maxWidth","offsetWidth","handleMouseUpKeyUp","prefillMessage","shouldFocus","_textboxRef$current5","inputBox","_textboxRef$current6","actionOnGlobalItemsWithPrefix","_key","handleSubmitPostAndScheduledMessage","draftOnOpen","disableSendButton","sendButton","showFormatJSX","ShowFormat","createMessage","messageValue","message_source","textboxId","wasNotifiedOfLogIn","getWasNotifiedOfLogIn","loginSuccessfulLabel","setWasNotifiedOfLogIn","ariaLabelMessageInput","formattingBar","AutoHeightSwitcher","showSlot","slot1","slot2","shouldScrollIntoView","fileUploadOverlay","overlayType","direction","FileUploadOverlay","DropOverlayIdCreatePost","showFormattingSpacer","containsAtMentionsInMessage","allAtMentions","scroll","Textbox","hasLabels","suggestionList","onKeyPress","onKeyDown","onMouseUp","onKeyUp","onComposition","onHeightChange","onBlur","onFocus","emojiEnabled","characterLimit","preview","onWidthChange","SendMessageTour","MAP_MARKDOWN_MODE_TO_ICON","bold","FormatBoldIcon","italic","FormatItalicIcon","link","LinkVariantIcon","strike","FormatStrikethroughVariantIcon","code","CodeTagsIcon","heading","FormatHeaderIcon","quote","FormatQuoteOpenIcon","ul","FormatListBulletedIcon","ol","FormatListNumberedIcon","MAP_MARKDOWN_MODE_TO_ARIA_LABEL","MAP_MARKDOWN_MODE_TO_KEYBOARD_SHORTCUTS","msgMarkdownBold","msgMarkdownItalic","msgMarkdownLink","msgMarkdownStrike","msgMarkdownCode","msgMarkdownH3","msgMarkdownQuote","msgMarkdownUl","msgMarkdownOl","otherProps","PriorityLabels","canRemove","hasError","specialMentions","persistentNotifications","priority","requestedAck","PriorityLabel","HasSpecialMentions","HasNoMentions","DMUserTimezone","selectedTime","dmUserId","dmUser","dmUserName","getDisplayNameByUser","dmUserTime","initialTime","setErrorMessage","moment","tz","selectedDateTime","setSelectedDateTime","userTimezoneLabel","generateCurrentTimezoneLabel","handleOnConfirm","stringify","bodySuffix","toDate","timePickerInterval","testingEnabled","DateTimePickerModal","subheading","confirmButtonText","cancelButtonText","relativeDate","PersistNotificationConfirmModal","currentChannelTeammateUsername","confirmBtn","handleConfirm","getMentionCount","makeGetUserOrGroupMentionCountFromMessage","maxRecipients","getPersistentNotificationMaxRecipients","getPersistentNotificationIntervalMinutes","Number","GenericModal","autoFocusConfirmButton","autoCloseOnConfirmButton","compassDesign","handleEnterKeyPress","isDeleteModal","modalHeaderText","ItemButton","Wrapper","ToggleMain","Text","Description","ToggleWrapper","StyledCheckIcon","CheckIcon","Item","ToggleItem","toggled","Toggle","onToggle","toggleClassName","MenuItem","menuItem","UrgentIcon","AlertOutlineIcon","ImportantIcon","AlertCircleOutlineIcon","StandardIcon","MessageTextOutlineIcon","AcknowledgementIcon","CheckCircleOutlineIcon","PersistentNotificationsIcon","BellRingOutlineIcon","Picker","PostPriorityPicker","onApply","onClose","setPriority","setRequestedAck","requested_ack","setPersistentNotifications","persistent_notifications","postAcknowledgementsEnabled","isPostAcknowledgementsEnabled","persistentNotificationsEnabled","isPersistentNotificationsEnabled","makeOnSelectPriority","PostPriority","URGENT","handleAck","handlePersistentNotifications","MenuGroup","IMPORTANT","handleApply","PostPriorityPickerOverlay","pickerOpen","setPickerOpen","pickerX","pickerY","pickerStrategy","pickerContext","setPickerReference","setPickerFloating","whileElementsMounted","autoUpdate","flip","fallbackPlacements","shift","padding","getPickerFloatingProps","getPickerReferenceProps","useRole","messagePriority","control","FloatingPortal","FloatingFocusManager","modal","returnFocus","initialFocus","_draft$metadata","_draft$metadata4","isPostPriorityEnabled","isPostPriorityEnabledSelector","_getChannel","channelTeammateUsername","_getUser","hasPrioritySet","specialMentionsInText","hasSpecialMentions","mentionsMinusSpecialMentionsInText","handlePostPriorityApply","handlePostPriorityHide","handleRemovePriority","showPersistNotificationModal","PERSIST_NOTIFICATION_CONFIRM_MODAL","_draft$metadata2","hasRequestedPersistentNotifications","_priority","_priority2","_priority3","_draft$metadata3","NotifyConfirmModal","channelTimezoneCount","memberNotifyCount","notifyAllMessage","notifyAllTitle","atHereTimezones","atAllTimezones","totalMembers","timezones","atHere","atAll","mention","finalMention","notifyAllConfirm","ConfirmModalRedux","PostDeletedModal","afterOptimisticSubmit","skipCommands","getGroupMentions","useGroups","canUseLDAPGroupMentions","canUseCustomGroupMentions","channelMemberCountsByGroup","selectChannelMemberCountsByGroup","mentionGroups","GroupSource","Ldap","Custom","mappedValue","channel_member_count","NOTIFY_ALL_MEMBERS","channel_member_timezones_count","isDraftSubmitting","setErrorClass","isDirectOrGroup","isRootDeleted","enableConfirmNotificationsToChannel","channelMembersCount","_getAllChannelStats$c","_getAllChannelStats$c2","getAllChannelStats","userIsOutOfOffice","OUT_OF_OFFICE","showPostDeletedModal","POST_DELETED_MODAL","doSubmit","submittingDraft","createPostOptions","ignorePostError","ANIMATION_TIMEOUT","forceFocus","keepDraft","_response","handleFileChange","isServerError","setUpdatedFileIds","showNotifyAllModal","NOTIFY_CONFIRM_MODAL","submittingDraftParam","notificationsToChannel","k","getChannelTimezones","getStatusFromSlashCommand","resetStatusModalData","RESET_STATUS","ResetStatusModal","newStatus","trimEnd","editChannelHeaderModalData","EDIT_CHANNEL_HEADER","EditChannelHeaderModal","editChannelPurposeModalData","EDIT_CHANNEL_PURPOSE","EditChannelPurposeModal","AlertBanner","customIcon","variant","onDismiss","actionButtonLeft","actionButtonRight","closeBtnTooltip","footerMessage","hideIcon","bannerIcon","dismissButton","CloseIcon","AlertBanner__message","isVertical","incrementAnnouncementBarCount","TRACK_ANNOUNCEMENT_BAR","decrementAnnouncementBarCount","DISMISS_ANNOUNCEMENT_BAR","getAnnouncementBarCount","announcementBar","announcementBarState","announcementBarCount","Symbol","toPrimitive","TypeError","_toPrimitive","_toPropertyKey","defineProperty","enumerable","configurable","writable","AnnouncementBar","elm","messageRef","enable","scrollWidth","showTooltip","isStringContainingUrl","barClass","barStyle","backgroundColor","linkStyle","textColor","DEVELOPER","CRITICAL","ADVISOR","ADVISOR_ACK","GENERAL","showCloseButton","FormattedMarkdownMessage","barContent","announcementIcon","showLinkAsButton","onMouseEnter","enableToolTipIfNeeded","showCTA","modalButtonText","onButtonClick","ctaDisabled","ctaText","tooltipMsg","delayClose","_StyledDiv","showModal","isTallBanner","_styled","gridArea","DismissShowRange","cloudFreeCloseMoment","ToPaidPlanBannerDismissable","openPricingModal","useOpenPricingModal","isAdmin","product","selectSubscriptionProduct","currentProductStarter","sku","CloudProducts","STARTER","daysToCloudFreeEnd","diff","snoozePreferenceVal","TO_PAID_PLAN_NUDGE","CloudBanners","NUDGE_TO_PAID_PLAN_SNOOZED","snoozeInfo","snoozedForRange","range","GreaterThanEqual90","showBanner","BetweenNinetyAnd60","SixtyTo31","ThirtyTo11","dRange","Zero","TenTo1","date","format","announcementType","viewPlans","MAX_DAYS_BANNER","THREE_DAYS_BANNER","CloudTrialAnnouncementBar","daysLeftOnTrial","dismissValue","TrialPeriodDays","TRIAL_WARNING_THRESHOLD","TRIAL_1_DAY","TELEMETRY_CATEGORIES","CLOUD_ADMIN","CLOUD_TRIAL_BANNER","TRIAL","isFreeTrial","userIsAdmin","isCloud","dismissable","isDismissable","PRICING_MODAL","PricingModal","isEmpty","shouldShowBanner","_this$props$subscript","_this$props$currentUs","pref","trialMoreThan7DaysMsg","trialButton","trialLessThan7DaysMsg","userEndTrialHour","getLocaleDateFromUTC","trial_end_at","trialLastDaysMsg","bannerMessage","TRIAL_2_DAYS","TRIAL_0_DAYS","reverseTrialButton","getCloudTrialBannerPreferences","makeGetCategory","is_free_trial","getRemainingDaysFromFutureTimestamp","TRIAL_30_DAYS","getCloudTrialEndBannerPreferences","CLOUD_TRIAL_END_BANNER","downgraded","moreDetails","CloudTrialEndAnnouncementBar","useGetLimits","cloudSubscription","retrievedCloudSub","requestedSubscription","setRequestedSubscription","getCloudSubscriptionAction","useGetSubscription","subscriptionProduct","getSubscriptionProduct","HIDE","trialEnd","isSystemAdmin","trackingLocation","RenewalLink","openContactSales","useOpenSalesLink","btnText","handleLinkClick","telemetryInfo","customBtnText","localStoragePrefix","getDismissed","localStorage","getItem","TextDismissableBar","allowDismissal","onDismissal","dismissed","setDismissed","handleDismiss","setItem","_props$config","_props$config2","_props$config3","dismissExpiringLicense","LICENSE_EXPIRING","dismissExpiredLicense","SELF_HOSTED_LICENSE_EXPIRED","CONFIGURATION_BANNERS","ConfigurationBanners","LICENSE_EXPIRED","dismissExpiringTrialLicense","TRIAL_LICENSE_EXPIRING","renewLinkTelemetry","canViewSystemErrors","isLicensePastGracePeriod","isLicenseExpired","dismissedExpiredLicense","warningIcon","licenseSku","getSkuDisplayName","SkuShortName","IsGovSku","daysUntilLicenseExpires","daysToLicenseExpire","isTrialLicense","dismissedExpiringTrialLicense","purchaseLicense","PurchaseLink","buttonTextElement","alertIcon","announcementBarType","w","getViewportSize","viewportBasedMessage","MOBILE_SCREEN_WIDTH","isLicenseExpiring","dismissedExpiringLicense","_props$license","ExpiresAt","LICENSE_PAST_GRACE","SendEmailNotifications","EnablePreviewModeBanner","emailMessage","PREVIEW_MODE","_props$config4","linkSite","linkConsole","siteURLMessage","EnableSignUpWithGitLab","notice","hasBeenDismissed","ConfigurationBar","NotificationPermissionNeverGrantedBar","getHideNotificationPermissionRequestBanner","requestNotificationPermission","setHideNotificationPermissionRequestBanner","UnsupportedNotificationAnnouncementBar","NotificationPermissionBar","isLoggedIn","useDesktopAppNotificationPermission","isNotificationAPISupported","getNotificationPermission","NotificationPermissionNeverGranted","NotificationPermissionDenied","NotificationPermissionUnsupportedBar","OverageUsersBanner","admin","analytics","seatsPurchased","Users","isCurrentLicenseCloud","overagePreferences","getOverageBannerPreferences","activeUsers","StatTypes","TOTAL_USERS","isBetween5PercerntAnd10PercentPurchasedSeats","isOver10PercerntPurchasedSeats","calculateOverageUserActivated","prefixPreferences","prefixLicenseId","Id","overageByUsers","hasPermission","cta","trackEventFn","useExpandOverageUsersCheck","isWarningState","banner","isWarningBanner","adminHasDismissed","seats","OVERAGE_USERS_BANNER","PaymentAnnouncementBar","_useSelector","_subscription$last_in","requestedCustomer","setRequestedCustomer","selectCloudSubscription","selectCloudCustomer","isStarterFree","mostRecentPaymentFailed","last_invoice","isCustomerCardExpired","updatePaymentInfo","ConsolePages","PAYMENT_INFO","ShowStartTrialModal","isUserAdmin","openStartTrialFormModal","useOpenStartTrialFormModal","TRUE","isBenefitsModalOpened","isModalOpen","TRIAL_BENEFITS_MODAL","installationDate","InstallationDate","hadAdminDismissedModal","START_TRIAL_MODAL","TRIAL_MODAL_AUTO_SHOWN","prevTrialLicense","currentLicense","isLicensed","isPrevLicensed","isCurrentLicensed","totalUsers","useGetTotalUsersNoBots","isLicensedOrPreviousLicensed","handleOnClose","SELF_HOSTED_START_TRIAL_AUTO_MODAL","installationDatePlus6Hours","hasEnvMoreThan6Hours","getTime","hasEnvMoreThan10Users","LearnMoreActionButton","route","styleLink","telemetryId","telemetryCategory","history","useHistory","redirect","ThreeDaysLeftTrialCard","svgWrapperClassName","svgElement","buttonLabel","pageURL","CLOUD_THREE_DAYS_LEFT_MODAL","ThreeDaysLeftTrialModal","THREE_DAYS_LEFT_TRIAL_MODAL","usage","useGetUsage","steps","GuestAccessSvg","DocLinks","SETUP_SAML","MonitorImacLikeSVG","ONBOARD_LDAP","LICENSE","headerText","headerSubtitleText","content","rest","limitsOverpassed","WorkspaceLimitsPanel","showIcons","closeModal","ShowThreeDaysLeftTrialModal","THREE_DAYS_LEFT_TRIAL_MODAL_DISMISSED","trialEndDate","today","trialEndInThreeDaysOrLess","someLimitNeedsAttention","useGetHighestThresholdCloudLimit","getServerLimits","serverLimits","UsersLimitsAnnouncementBar","_serverLimits$maxUser","_serverLimits$activeU","handleCTAClick","maxUsersLimit","activeUserCount","shouldShowUserLimitsAnnouncementBar","ErrorCode","reloadPage","reload","VersionBar","buildHash","buildHashOnAppLoad","setBuildHashOnAppLoad","marginLeft","AnnouncementBarController","_this$props$config","_this$props$config$Ba","_this$props$license","_this$props$license2","adminConfiguredAnnouncementBar","EnableBanner","BannerText","BannerColor","BannerTextColor","AllowBannerDismissal","errorBar","latestError","dismissError","paymentAnnouncementBar","cloudTrialAnnouncementBar","cloudTrialEndAnnouncementBar","toPaidPlanNudgeBannerDismissable","autoStartTrialModal","AutoStartTrialModal","ConfigurationAnnouncementBar","warnMetricsStatus","withGetCloudSubscription","_state$entities$cloud","MANAGE_SYSTEM","displayable","getDisplayableErrors","dismissFirstError","bind","openSalesLink","eventID","Load","GroupMemberList","hide","searchState","nextPage","setNextPage","nextPageLoadState","setNextPageLoadState","DONE","currentDMLoading","setCurrentDMLoading","infiniteLoaderRef","variableSizeListRef","hasMounted","setHasMounted","resetloadMoreItemsCache","resetAfterIndex","isSearching","hasNextPage","itemCount","loadMoreItems","LOADING","getUsersInGroup","FAILED","maxListHeight","isUserLoaded","_members$index","_members$index$user","OFFLINE","_user$id","_user$id2","UserListItem","ProfilePopover","hideStatus","UserButton","StatusIcon","Username","Gap","DMContainer","DMButton","showDirectChannel","LoadingItem","UserList","LargeLoadingItem","LoadFailedItem","NoResultsItem","NoResultsIndicator","NoResultsVariant","ChannelSearch","titleValues","RetryButton","AutoSizer","InfiniteLoader","isItemLoaded","threshold","onItemsRendered","VariableSizeList","itemSize","ITEM_HEIGHT","sortProfileList","teammateNameDisplaySetting","groupMembers","profile","getProfilesSortedByDisplayName","getProfilesInGroupWithoutSorting","searchProfilesSortedByDisplayName","searchProfilesInGroupWithoutSorting","popoverSearch","UserGroupPopover","closeRef","setSearchState","doSearch","in_group_id","A11yCustomEventTypes","FOCUS","keyboardOnly","openGroupsModal","USER_GROUPS","UserGroupsModal","backButtonAction","openViewGroupModal","VIEW_USER_GROUP","ViewUserGroupModal","backButtonCallback","Heading","CloseButton","Subtitle","Dot","NoShrink","HeaderButton","SearchBar","MagnifyIcon","QuickInput","clearable","onClear","handleClear","UserGroupPopoverController","isOpen","setOpen","floatingStyles","floatingContext","autoPlacement","isMounted","transitionStyles","useTransitionStyles","duration","combinedFloatingStyles","clickInteractions","dismissInteraction","FloatingOverlay","lockScroll","AtMention","getUserOrGroupFromMentionName","mentionName","usersByUsername","groupsByName","disableGroupHighlight","fetchMissingUsers","getMissingMentionedUsers","userMentionNameSuffix","userDisplayName","highlightMention","disableHighlight","triggerComponentClass","groupMentionNameSuffix","groupDisplayName","getMissingProfilesByUsernames","getPotentialMentionsForName","getUsersByUsername","getAllGroupsForReferenceByName","AutocompleteSelector","onSelected","requestAnimationFrame","suggestionRef","focused","toggleFocus","providers","footer","labelClassName","inputClassName","listPosition","labelContent","SuggestionBox","setSuggestionRef","containerClass","onItemSelected","completeOnTab","renderNoResults","openOnFocus","openWhenEmpty","replaceAllInputOnSelect","container","overflow","reference","display","wordBreak","textOverflow","pointerEvents","whiteSpace","background","borderColor","textArea","overflowY","AutosizeTextarea","_referenceValue","onInput","n","hasOwnProperty","_objectWithoutPropertiesLoose","getOwnPropertySymbols","s","propertyIsEnumerable","referenceRef","setTextareaRef","textareaRef","recalculateHeight","scrollHeight","currentTextarea","getComputedStyle","recalculateWidth","_referenceRef$current","heightProps","rows","referenceValue","dir","displayNameGetter","makeDisplayNameGetter","GroupOption","addUserProfile","getProfilesByIdsAndUsernames","makeGetProfilesByIdsAndUsernames","allUserIds","member_ids","allUsernames","overflowNames","TrackGroupsFeature","TrackInviteGroupEvent","AccountMultipleOutlineIcon","number","ChevronRightIcon","TeamWarningBanner","guests","getCommaSeparatedUsernames","getGuestMessage","commaSeparatedUsernames","firstName","firstUser","others","guestsList","FormattedList","getMessage","usersList","UsernameSpan","UserMappingSpan","ChannelInviteModal","isUser","membersInTeam","guestsNotInTeam","usersNotInTeam","selectedUsers","profilesNotInCurrentTeam","excludedAndNotInTeamUserIds","getExcludedUsers","filteredDmUsers","profilesFromRecentDMs","dmUsers","filterOutDeletedAndExcludedAndNotInTeamUsers","filteredUsers","profilesNotInCurrentChannel","profilesInCurrentChannel","optionValues","filterGroupsMatchingTerm","sortUsersAndGroups","inviteError","getProfilesNotInChannel","group_constrained","getProfilesInChannel","u","addUsersToChannel","handleInviteError","not_in_channel_id","include_member_ids","promises","isGroupsEnabled","excludeUserIds","ProfilesInGroup","userMapping","closeMembersInviteModal","CHANNEL_INVITE","InviteModalLink","ToggleModalButton","inviteAsGuest","channelToInvite","initialValue","customNoOptionsMessage","InvitationModalLink","groupAndUserOptions","emailInvitationsEnabled","inviteGuestLink","canInviteGuests","getTeamStats","newValue","isEqual","getTeamMembersByIds","initialState","initialProps","getAllAssociatedGroupsForReference","makeGetAllAssociatedGroupsForReference","doGetProfilesNotInChannel","doGetProfilesInChannel","makeGetProfilesNotInChannel","makeGetProfilesInChannel","getProfilesNotInTeam","getMembersInTeam","getProfilesNotInCurrentChannel","getProfilesInCurrentChannel","getProfilesNotInCurrentTeam","getMembersInCurrentTeam","getRecentProfilesFromDMs","guestAccountsEnabled","EnableGuestAccounts","EnableEmailInvitations","INVITE_GUEST","ChannelMembersDropdown","canChangeMemberRoles","canRemoveMember","channelAdminLabel","channelMemberLabel","guestLabel","removing","setRemoving","handleRemoveFromChannel","removeChannelMember","handleMakeChannelAdmin","updateChannelMemberSchemeRole","handleMakeChannelMember","updateChannelMemberSchemeRoles","schemeAdmin","getChannelMember","isChannelAdmin","UserUtils","isDefaultChannel","currentRole","renderRole","remote_id","canMakeUserChannelMember","canMakeUserChannelAdmin","canRemoveUserFromChannel","removeFromChannelText","removeFromChannelTestId","removeMenu","ItemAction","isDangerous","makeAdminMenu","makeMemberMenu","DropdownIcon","MANAGE_CHANNEL_ROLES","canManageMembers","DisplayName","SendMessage","RoleChooser","SharedIcon","Member","editing","userProfileSrc","SharedChannelIndicator","withTooltip","CustomStatusEmoji","userID","emojiSize","spanStyle","flex","alignItems","emojiStyle","membership","openDirectMessage","ListItemType","MemberList","isNextPageLoading","searchTerms","loadMore","getItemSize","FirstSeparator","_ref4","list","CloudUsageModal","_props$primaryAction","theme","getTheme","messageToElement","secondaryAction","primaryAction","backdropClassName","ownLimits","needsTheme","CompassThemeProvider","LimitLine","limitName","UsagePercentBar","barWidth","limitStatus","_props$limits","_props$limits$message","_props$limits2","_props$limits2$messag","_props$limits3","_props$limits3$files","_props$limits4","_props$limits4$files","MAX_VALUE","actual","inK","limit","totalStorage","total_storage","asGBString","formatNumber","AutoHeightSlots","onTransitionEnd","wrapperRef","childRef","prevSlot","prevHeight","animate","setAnimate","setHeight","setOverflow","child","setChild","SLOT1","scrollIntoView","behavior","scrollMode","block","fixedStyles","transitionProperty","transitionDuration","transitionTimingFunction","Transition","onEnter","_prevHeight$current","offsetHeight","onEntering","onEntered","Carousel","dataSlides","infiniteSlide","onNextSlideClick","onPrevSlideClick","disableNextButton","btnsStyle","BtnStyle","BUTTON","actionButton","slideIndex","setSlideIndex","prevButtonDisabled","setPrevButtonDisabled","nextButtonDisabled","setNextButtonDisabled","nextSlide","isLastIndex","newSlideIndex","prevSlide","isFirstSlide","CHEVRON","CarouselButton","moveSlide","obj","moveDot","Destination","handleMoveSlide","NEXT","disabledClass","PREV","StyledChip","p","otherOption","emojiStyles","marginRight","Chip","leadingIcon","additionalMarkup","RenderEmoji","emojiName","WrappedComponent","CSWAvailabilityCheckTypes","useCWSAvailabilityCheck","cswAvailability","setCSWAvailability","Pending","isEnterpriseReady","cwsAvailabilityCheck","Available","Unavailable","NotApplicable","effect","deps","mounted","getExpandSeatsLink","cwsUrl","CWSURL","licenseId","invoice","delinquent_since","delinquentDate","expandableLink","_limits$messages","_limits$files","maybeMessageHistoryLimit","messageHistoryUsage","maybeFileStorageLimit","fileStorageUsage","highestLimit","_len","acc","maybeLimitType","refineToDefined","LimitTypes","fileStorage","curr","limitThresholds","warn","useIsLoggedIn","cloudLimits","cloudLimitsReceived","getCloudLimitsLoaded","requestedLimits","setRequestedLimits","getCloudLimitsAction","NotifyStatus","NotStarted","Started","Success","Failed","AlreadyComplete","useGetNotifyAdmin","notifyStatus","setStatus","notifyAdmin","requestData","trackingArgs","includeInactive","userCount","setUserCount","_data$total_users_cou","getFilteredUsersStats","include_bots","include_deleted","total_users_count","getTotalUsers","getUsage","requestedMessages","setRequestedMessages","historyLoaded","requestedStorage","setRequestedStorage","totalStorageLoaded","requestedTeamsUsage","setRequestedTeamsUsage","teamsLoaded","telemetryProps","CLOUD_PRICING","callerInfo","callerCTA","utmSource","customerEmail","lastName","utmMedium","contact_first_name","contact_last_name","contactSalesLink","buildMMURL","LicenseLinks","CONTACT_SALES","goToMattermostContactSalesForm","START_TRIAL_FORM_MODAL","StartTrialFormModal","desktopNotificationPermissionGlobalState","desktopNotificationPermission","setDesktopNotificationPermission","isDesktop","isDesktopApp","isSupported","requestDesktopNotificationPermission","Notification","requestPermission","GuestAccessSVG","_props$width","_props$height","clipPath","strokeMiterlimit","maskType","patternContentUnits","xlinkHref","Svg","attrs","SuccessSvg","defaultThresholds","BarBackground","ceil","isExceeded","thresholds","exceeded","BarForeground","ok","danger","getColor","compassTheme","base","lightTheme","noStyleReset","noDefaultStyle","noFontFaces","palette","primary","main","sidebarHeaderBg","contrast","sidebarHeaderTextColor","alert","dndIndicator","hover","badges","online","onlineIndicator","away","awayIndicator","dnd","ThemeProvider","wrappedOnCancel","checked","wrappedOnConfirm","ConfirmModal","CopyButton","isCopied","setIsCopied","timerRef","tooltipMessage","copied","isForText","copyText","copyCode","tooltipText","spanClassName","copyToClipboard","CreateUserGroupsModal","usersToAdd","mentionUpdatedManually","showUnknownError","mentionInputErrorText","nameInputErrorText","SPECIAL_MENTIONS","allow_reference","user_ids","createGroupWithUserIds","_data$error","_data$error2","goBack","Input","updateNameState","customMessage","ItemStatus","updateMentionState","createGroup","isSaveEnabled","marginTop","getCustomStatus","makeGetCustomStatus","customStatusExpired","isCustomStatusExpired","customStatusEnabled","isCustomStatusEnabled","emojiRef","statusEmoji","expires_at","CustomStatusDuration","DONT_CLEAR","ExpiryTime","isEmojiLarge","arePropsEqual","CustomStatusSuggestion","handleSuggestionClick","clearButton","showClearButton","onMouseLeave","hideClearButton","CustomStatusText","with_duration","CUSTOM_DATE_TIME","DATE_AND_TIME","durationValues","THIRTY_MINUTES","ONE_HOUR","FOUR_HOURS","TODAY","THIS_WEEK","ExpiryMenu","_expiryMenuItems3","handleDurationChange","expiryTime","menuItems","setMenuItems","expiryMenuItems","menuItemArray","_expiryMenuItems","_expiryMenuItems2","showPrefix","Group","defaultCustomStatusSuggestions","defaultDuration","CustomStatusModal","currentCustomStatus","recentCustomStatuses","getRecentCustomStatuses","customStatusControlRef","emojiButtonRef","isCurrentCustomStatusSet","setText","setEmoji","initialDuration","setDuration","isStatusSet","firstTimeModalOpened","showStatusDropdownPulsatingDot","inCustomEmojiPath","useRouteMatch","currentTime","getCurrentMomentForTimezone","initialCustomExpiryTime","getRoundedTime","customExpiryTime","setCustomExpiryTime","isInteracting","setIsInteracting","setCustomStatusInitialisationState","CUSTOM_STATUS_MODAL_VIEWED","loadCustomEmojisForRecentCustomStatuses","unsetCustomStatus","CUSTOM_STATUS","handleSetStatus","expiresAt","calculateExpiryTime","setCustomStatus","handleEnterKeyPressed","seconds","milliseconds","toISOString","endOf","handleClearStatus","getCustomStatusControlRef","handleRecentCustomStatusClear","removeRecentCustomStatus","customStatusEmoji","EmojiIcon","recentStatuses","areSelectedAndSetStatusSame","showSuggestions","disableSetStatus","showDateAndTimeField","suggestion","renderCustomStatusSuggestions","recentCustomStatusTexts","customStatusSuggestions","isConfirmDisabled","confirmButtonClassName","keyboardEscape","handleEmojiClose","selectedEmoji","short_name","calculateRightOffSet","DEFAULT_EMOJI_PICKER_RIGHT_OFFSET","leftOffset","defaultHorizontalPosition","handleEmojiExited","prevShow","inputComponent","MaxLengthInput","clearableWithoutValue","clearHandle","clearClassName","DateTimeInput","spanElement","customStatusTextComponent","defaultProps","CUSTOM_STATUS_TIME_PICKER_INTERVALS_IN_MINUTES","roundedTo","remainder","DateTimeInputContainer","timeOptions","setTimeOptions","isPopperOpen","setIsPopperOpen","timeButtonRef","handlePopperOpenState","setTimeAndOptions","startTime","startOf","isSame","nextDay","intervals","isBefore","utcOffset","getTimeInIntervals","handleTimeChange","focusTimeButton","inputIcon","IconButton","datePickerProps","defaultMonth","onDayClick","handleDayChange","modifiers","baseTime","isBeforeTime","hours","minutes","roundedTime","setHours","dayWithTimezone","before","showOutsideDays","DatePicker","relativeFormatDate","fromJSDate","toLocaleString","readOnly","inputPrefix","CUSTOM_STATUS_EXPIRY_RANGES","withinBrackets","currentMomentTime","timestampProps","clone","isAfter","year","loadedLocales","setLoadedLocales","enabled","outsidePress","getDatePickerLocalesForDateFns","iconLeft","iconRight","DayPicker","IconRight","IconLeft","bodyPrefix","initialRoundedTime","setDateTime","modalSubheaderText","classnames","deferComponentRender","PreRenderComponent","DeferredRenderWrapper","shouldRender","hoistStatics","permalinkPostId","deleteAndRemovePost","matchUrlForDMGM","matchPath","matchUrlForChannel","postid","channelUrl","_this$deletePostBtn","_this$deletePostBtn$c","deletePostBtn","commentWarning","remoteWarning","commentCount","SharedChannelPostDeleteWarning","handleEntered","getTitle","getPrompt","SectionNotice","withRouter","getReplyCount","makeGetCommentCountForPost","TIMESTAMP_PROPS","units","_","remote","timestampDateObject","cn","SyncIcon","scheduledDateTime","isTodayOrTomorrow","isToday","Tag","uppercase","baseStyles","border","boxShadow","cursor","indicatorSeparator","IndicatorsContainer","Control","isFocused","addon","textPrefix","legend","testId","required","setFocused","customInputLabel","setCustomInputLabel","ownValue","ownOnChange","validateInput","validationErrorMsg","onInputBlur","showLegend","isError","Input_fieldset___error","Input_fieldset___legend","Input_legend___focus","Input__focus","InputError","custom","setShowPreviewOnEditChannelHeaderModal","SET_SHOW_PREVIEW_ON_EDIT_CHANNEL_HEADER_MODAL","showPreviewOnEditChannelHeaderModal","shouldShowPreviewOnEditChannelHeaderModal","headerMaxLength","hideModal","newState","_this$state$header$tr","_this$state$header","patchChannel","editChannelHeaderTextboxRef","isUnhandledLineBreakKeyCombo","insertLineBreakFromKeyEvent","handleKeyPress","blurTextbox","handleSave","headerTitle","keyboard","handleModalKeyDown","handleEntering","bsClass","htmlFor","supportsCommands","suggestionListPosition","TextboxLinks","updatePreview","hasText","hasExceededCharacterLimit","previewMessageLink","renderError","mapStateToProps","_props$channel","requestStarted","_this$props$channel","_this$props$channel2","channelPurposeModal","ariaLabelForTitle","getEmojiMap","emojiFromMap","emojiImageUrl","getEmojiImageUrl","backgroundImage","backgroundSize","minHeight","minWidth","EmojiPickerCategory","categoryRowIndex","disable","_category$emojiIds$","_category$emojiIds","firstEmojiId","emojiIds","iconClassName","NavigationDirection","RECENT","SEARCH_RESULTS","emojiCategories","recent","searchResults","activities","objects","symbols","flags","RECENT_EMOJI_CATEGORY","CATEGORIES","Emoji","previousCategory","currentCategory","CATEGORY_HEADER_ROW","EMOJIS_ROW","isCategoryHeaderRow","row","isEmojiIdEqual","firstEmoji","secondEmoji","isSystemEmoji","unified","calculateCategoryRowIndex","categories","categoryName","categoryIndex","previousIndexSum","_currentCategory$emoj","_currentCategory$emoj2","emojisInCurrentCategory","splitEmojisToRows","rowIndexCounter","emojiRows","emojisIndividualRow","emojiRowIndexCounter","emojiIndex","emojiId","createEmojisPositions","categoryOrEmojiRows","emojisPositions2DArray","categoryOrEmojiRow","rowIndex","emojisOfARow","emojiItem","flat","createCategoryAndEmojiRows","allEmojis","userSkinTone","_categories$RECENT$em","_categories$RECENT","searchCategoryRow","recentEmojiIds","filteredEmojis","recentEmojisString","filteredEmojisWithRecent","aliases","short_names","recentEmojis","initialEmoji","skinTone","initialEmojiSkin","getSkin","emojiWithUpdatedSkinTone","convertEmojiSkinTone","updateSkinTone","convertEmojisToUserSkinTone","filteredRecentEmojis","sortedRecentEmojis","compareEmojis","filtertedEmojisMinusRecent","filteredEmojisUserSkinTone","emojiMatchesSkin","getFilteredEmojis","searchEmojisRows","searchEmojiRowsWithCategoryHeader","sortedEmojis","categoryOrEmojisRows","getEmojisByCategory","categoryRow","increasedRowIndexCounter","emojisPositions","EmojiPickerCategories","isFiltering","focusOnSearchInput","categoryNames","activeCategory","NextEmoji","PreviousEmoji","PreviousEmojiRow","NextEmojiRow","EmojiPickerCategoryRow","EmojiPickerItem","onMouseOver","throttledMouseOver","throttle","handleMouseOver","leading","trailing","itemClassName","emojiUnified","imgTrans","areEqual","EmojiPickerCategoryOrEmojiRow","cursorRowIndex","cursorEmojiId","onEmojiMouseOver","EmojiPickerCategorySection","emojiColumn","EmojiPickerCurrentResults","customEmojisEnabled","customEmojiPage","setActiveCategory","getCustomEmojis","incrementEmojiPickerPage","getItemKey","rowsData","emojiNamesArray","throttledScroll","scrollOffset","handleScroll","_categoryOrEmojisRows","_categoryOrEmojisRows2","approxRowsFromTop","closestCategory","handleIsItemLoaded","handleLoadMoreItems","FixedSizeList","layout","overscanCount","itemData","itemKey","onScroll","_ref5","EmojiPickerCustomEmojiButton","AnyTeamPermissionGate","permissions","CREATE_EMOJIS","EmojiPickerPreview","previewImage","EmojiPickerSearch","cursorCategoryIndex","cursorEmojiIndex","resetCursorPosition","_event$currentTarget$","_event$currentTarget","currentTarget","skinTones","EmojiPickerSkin","skinName","skin","pickerExtended","onSkinSelected","extended","closeButtonLabel","choices","spriteClassName","hideSkinTonePicker","collapsed","expandButtonLabel","showSkinTonePicker","EmojiPicker","_categoryOrEmojisRows3","handleFilterChange","handleEmojiPickerClose","onAddCustomEmojiClick","searchCustomEmojis","setUserSkinTone","getInitialActiveCategory","setCursor","setCategories","getInitialCategories","setAllEmojis","setCategoryOrEmojisRows","emojiPositions","setEmojiPositionsArray","searchInputRef","shouldRunCreateCategoryAndEmojiRows","throttledSearchCustomEmoji","newFilter","searchFocusAnimationFrame","_searchInputRef$curre","rootComponent","cancelAnimationFrame","updatedCategories","updatedAllEmojis","customEmojiMap","customEmojis","categoryEmojis","reverse","EmojiIndicesByCategory","EmojisJson","currentEmoji","currentEmojiId","getUpdatedCategoriesAndAllEmojis","updatedCategoryOrEmojisRows","updatedEmojiPositions","selectFirstEmoji","_searchInputRef$curre2","_infiniteLoaderRef$cu","_infiniteLoaderRef$cu2","_listRef","scrollToItem","_infiniteLoaderRef$cu3","_infiniteLoaderRef$cu4","_searchInputRef$curre3","getEmojiById","toUpperCase","cursorEmoji","handleCategoryClick","_infiniteLoaderRef$cu5","_infiniteLoaderRef$cu6","resetCursor","onAddCustomEmojiClickInner","cursorCategory","_emojisRowOfCursor$0$","_emojisRowOfCursor$","_emojisRowOfCursor$0$2","_emojisRowOfCursor$2","_emojisRowOfCursor$fi","_emojisRowOfCursor$fi2","emojisRowOfCursor","getCursorProperties","handleKeyboardEmojiNavigation","moveTo","newCursor","currentCursorsPositionIndex","emojiPosition","currentCursorIndexInEmojis","calculateNewCursorForRightOrLeftArrow","downTheRowCategoryName","firstEmojiIdDownTheRow","endingEmojisOfDifferentCategory","calculateNewCursorForDownArrow","upTheRowCategoryName","upTheRowCategorysEmojis","lastEmojiIdUpTheRow","startingEmojisOfDifferentCategory","calculateNewCursorForUpArrow","newCursorEmoji","handleEnterOnEmoji","clickedEmoji","cursorEmojiName","areSearchResultsEmpty","Search","mouseOverCursor","_getCurrentTeam$name","getCustomEmojisEnabled","emojiPickerCustomPage","getRecentEmojisNames","getUserSkinTone","EmojiPickerHeader","GifPicker","EmojiPickerTabs","onEmojiClose","rootPickerNodeRef","emojiTabVisible","createRef","pickerStyle","_this$props","Tabs","defaultActiveKey","justified","mountOnEnter","unmountOnExit","Tab","eventKey","tabClassName","GifIcon","getRootPickerNode","memoize","emojiTrigger","calculatedRightOffset","DEFAULT_EMOJI_PICKER_LEFT_OFFSET","spaceRequiredAbove","spaceRequiredBelow","targetBounds","innerHeight","horizontalPosition","popOverOverlayPosition","_this$props$placement","isMobileView","emojiPickerPosition","getPlacement","Overlay","rootClose","animation","_EmojiPickerOverlay","CENTER_SPACE_REQUIRED_ABOVE","CENTER_SPACE_REQUIRED_BELOW","ExternalImage","shouldRenderImage","enableSVGs","isSVGImage","imageMetadata","getImageSrc","hasImageProxy","EnableSVGs","HasImageProxy","FileThumbnail","disablePreview","extension","has_preview_image","hasPreviewImage","mimeType","mime_type","OTHER","getFileType","getFileTypeFromMime","IMAGE","THUMBNAIL_WIDTH","THUMBNAIL_HEIGHT","thumbnailUrl","getFileThumbnailUrl","isGIFImage","getFileUrl","SVG","getIconClassName","AttachmentIcon","FilenameOverlay","canDownload","compactDisplay","handleImageClick","iconClass","fileName","trimmedFilename","trimFilename","filenameOverlay","rel","getFileDownloadUrl","download","ArchivedTooltip","_useGetLimits$0$files","storageLimit","FileAttachment","setLoaded","loadFilesCalled","setLoadFilesCalled","keepOpen","setKeepOpen","setOpenUp","buttonRef","handleImageLoaded","loadFiles","archived","fileType","disableThumbnail","loadImage","onAttachmentClick","handleDropdownOpened","_props$handleFileDrop","handleFileDropdownOpened","setMenuPosition","_buttonRef$current","anchorRect","totalSpace","spaceOnTop","CHANNEL_HEADER_HEIGHT","spaceOnBottom","POST_AREA_HEIGHT","handleGetPublicLink","GET_PUBLIC_LINK_MODAL","GetPublicModal","fileId","fileThumbnail","fileDetail","fileActions","ariaLabelImage","ArchiveOutlineIcon","fileSizeToString","disableActions","renderFileMenuItems","enablePublicLink","pluginMenuItems","divider","defaultItems","match","stopPropagationOnToggle","canDownloadFiles","preventDownload","EnablePublicLink","getFilesDropdownPluginMenuItems","SingleImageView","_props$fileInfo","_props$fileInfo2","FILE_PREVIEW_MODAL","FilePreviewModal","startIndex","toggleEmbedVisibility","getFilePublicLink","dimensions","_props$fileInfo3","_props$fileInfo4","_props$fileInfo5","isInPermalink","fileURL","previewURL","getFilePreviewUrl","previewHeight","previewWidth","minPreviewClass","isEmbedVisible","fileHeader","fadeInClass","permalinkClass","styleIfSvgWithDimensions","imageContainerStyle","svgClass","SizeAwareImage","onImageLoaded","imageLoaded","showLoader","handleSmallImageContainer","hideUtilities","isRhsOpen","minHeightPlaceholder","selectFilesForPost","makeGetFilesForPost","getFilesForEditHistory","makeGetFilesForEditHistory","isEditHistory","indexClicked","sortedFileInfos","postFiles","isDeleted","disableDownload","FileProgressPreview","handleRemove","fileNameComponent","progressBar","percentTxt","toFixed","ProgressBar","_this$props$onRemove","previews","imageClassName","pluginFilePreviewComponents","DropOverlayIdThreads","DropOverlayIdCenterChannel","overlayClass","fileOverlayImage","CustomRenderer","marked","disableLinks","openInNewTab","paragraph","origMsg","markedUpMessage","breaks","sanitize","renderer","dangerouslySetInnerHTML","__html","GetLinkModal","copiedLink","textAreaRef","setSelectionRange","execCommand","copyLink","queryCommandSupported","linkText","copyLinkConfirm","SuccessIcon","GetPublicLinkModal","_Selectors$getFilePub","Selectors","useClickOutsideRef","onMouseDown","Node","useFirstAdminUser","useIsCurrentUserSystemAdmin","STATIC_CLASS_FOR_ANIMATION","LOADING_CLASS_FOR_ANIMATION","LOADING_COMPLETE_CLASS_FOR_ANIMATION","loadingScreenElement","loadingAnimationElement","initialLoadingScreenCSS","handleAnimationEndEvent","init","destroy","addAnimationEndListener","animationName","isLoading","removeAnimationEndListener","stop","pageType","measureAndReport","Measure","SplashScreen","startMark","canFail","page_type","WARNING","INFO","RadioSetting","Setting","inputId","DialogElement","defaultText","GenericUserProvider","GenericChannelProvider","autocompleteActiveChannels","MenuActionProvider","defaultOption","textSettingMaxLength","assertedValue","DialogIntroductionText","formattedMessage","gfm","_await$this$props$act","elem","callbackId","callback_id","cancelled","submitInteractiveDialog","notifyOnCancel","_e$default","introductionText","iconUrl","submitLabel","help_text","data_source","introduction_text","icon_url","submit_label","notify_on_cancel","sendMembersInvites","emails","sent","notSent","getTeamMember","reason","addUsersToTeam","userToAdd","memberWithError","invitesWithErrors","inviteWithError","SMTP","sendGuestsInvites","results","memberOfAll","memberOfAny","sendGuestInviteForUser","sendMembersInvitesToChannels","reduxSearchProfiles","searchChannels","reduxSearchChannels","_channelsByName$Const","getChannelsInCurrentTeam","townSquareDisplayName","DEFAULT_CHANNEL_UI_NAME","invitableChannels","MANAGE_PRIVATE_CHANNEL_MEMBERS","MANAGE_PUBLIC_CHANNEL_MEMBERS","canAddUsers","ADD_USER_TO_TEAM","roleForTrackFlow","getRoleForTrackFlow","regenerateTeamInviteId","modalMessages","msgHeader","msgInputHeader","filesHeader","browserHeader","msgCompHeader","browserInputHeader","msgMarkdownHeader","navHeader","msgSearchHeader","callsHeader","callsGlobalHeader","callsWidgetHeader","callsExpandedHeader","contentRef","isLinux","callsEnabled","isCallsEnabled","renderShortcutSequences","shortcuts","_contentRef$current","mainHeader","navPrev","navNext","navUnreadPrev","navUnreadNext","teamNavPrev","teamNavNext","teamNavSwitcher","navSwitcher","navDMMenu","navSettings","navMentions","navFocusCenter","navOpenCloseSidebar","navExpandSidebar","navOpenChannelInfo","navToggleUnreads","msgEdit","msgReply","msgLastReaction","msgReprintPrev","msgReprintNext","msgCompUsername","msgCompChannel","msgCompEmoji","msgSearchChannel","browserChannelPrev","browserChannelNext","browserFontIncrease","browserFontDecrease","browserHighlightPrev","browserHighlightNext","browserNewline","calls","widget","popout","_description","hideDescription","shortcutText","isMessageDescriptor","standard","normalizeShortcutDescriptor","splitShortcut","altKeys","ShortcutKey","ShortcutKeyVariant","Tooltip","ShortcutModal","renderAltKeys","shortcutKeys","callsKBShortcuts","callsJoinCall","callsMuteToggle","callsRaiseHandToggle","callsShareScreenToggle","callsParticipantsListToggle","callsLeaveCall","callsPushToTalk","msgPostPriority","StartTrialBtn","btnClass","renderAsButton","openTrialForm","startTrial","handleEmbargoError","trackingPage","button","confirmButtonClass","DEFAULT_NUM_PER_PAGE","ListModal","onPageChange","loadItems","totalCount","numPerPage","renderRows","LoadingScreen","renderRow","paginationRange","startCount","endCount","titleText","titleBarButtonText","titleBarButtonOnClick","searchPlaceholderText","onSearchInput","onPrev","onNext","LoadingImagePreview","progressView","centered","LoggedIn","hidden","updateTimeZone","userIsActive","idleTime","manual","userUpdateActiveStatus","getChannelURLAction","_targetElement$getAtt","targetsTagName","isTargetNotContentEditable","getAttribute","BACKSPACE","handleBeforeUnload","doesCookieContainsMMUserId","isCurrentChannelManuallyUnread","updateApproximateViewTime","WebSocketActions","isValidState","handleVisibilityChange","onFocusListener","onBlurListener","hasFocus","offUserActivity","onUserActivityUpdate","updateActiveStatus","offNotificationClicked","onNotificationClicked","clickNotification","cleanupDesktopListeners","isIos","isAndroid","rootEl","setAttribute","encodeURIComponent","handleBackSpace","mfaRequired","signalLogin","_this$cleanupDesktopL","Redirect","showTermsOfService","autoUpdateTimezone","getBrowserTimezone","isPermalinkURL","getChannelURL","shouldShowTermsOfService","checkIfMFARequired","LeaveTeamModal","leaveTeam","toggleSideBarRightMenu","numOfPrivateChannels","numOfPublicChannels","modalMessage","num_of_public_channels","num_of_private_channels","getNumOfPrivateChannels","getNumOfPublicChannels","TeamGroupsManageModal","showConfirmModal","pageNumber","getGroupsAssociatedToTeam","totalGroupCount","listModal","unlinkGroupSyncable","MANAGE_TEAM_GROUPS","ADD_GROUPS_TO_TEAM","isTeamAdmin","patchGroupSyncable","getMyTeamMembers","setTeamMemberStatus","onClickRemoveGroup","memberCount","titleButtonOnClick","handleDeleteConfirmed","handleDeleteCanceled","TeamMembersDropdown","me","handleDemote","updateTeamMemberSchemeRoles","getMyTeamUnreads","removeUserFromTeamAndGetStats","showDemoteModal","currentRoles","showMakeMember","showMakeAdmin","canRemoveFromTeam","makeDemoteModal","confirmButton","handleDemoteSubmit","handleDemoteCancel","menuRemove","handleRemoveFromTeam","menuMakeAdmin","handleMakeAdmin","menuMakeMember","handleMakeMember","updateUserActive","MemberListTeam","loadProfilesAndTeamMembers","getTeamMembers","DEFAULT_MAX_USERS_PER_TEAM","Teams","SORT_USERNAME_OPTION","exclude_deleted_users","loadComplete","PROFILE_CHUNK_SIZE","loadTeamMembersForProfilesList","membersLoaded","teamMembersDropdown","canManageTeamMembers","actionUserProps","usersToDisplay","SearchableUserList","usersPerPage","totalTeamMembers","focusOnMount","MANAGE_TEAM_ROLES","searchProfilesInCurrentTeam","getProfilesInCurrentTeam","getCurrentTeamStats","active_member_count","TeamMembersModal","onLoad","_this$props$currentTe2","teamDisplayName","TeamPermissionGate","handleInvitePeople","TEAM_MEMBERS","SaveChangesPanel","tabChangeError","panelClassName","saved","messageClassName","cancelButtonClassName","saveButtonClassName","DropdownIndicator","multiValue","borderRadius","multiValueLabel","fontFamily","fontWeight","lineHeight","letterSpacing","multiValueRemove","handleNewSelection","inputValue","setInputValue","handleTextEnter","selectValues","singleValue","CreatableSelect","menuIsOpen","onInputChange","AllowedDomainsSelect","allowedDomains","setAllowedDomains","setHasChanges","setSaveChangesPanelState","showAllowedDomains","setShowAllowedDomains","handleEnableAllowedDomains","updateAllowedDomains","domain","handleOnChangeDomains","allowedDomainsOptions","CheckboxSettingItem","inputFieldTitle","descriptionAboveContent","inputFieldData","inputFieldValue","SelectTextInput","OpenInviteDescriptionError","InviteSectionInput","_team$invite_id","canInviteTeamMembers","INVITE_USER","inviteId","setInviteId","invite_id","inviteIdError","setInviteIdError","handleRegenerateInviteId","inviteSectionInput","RefreshIcon","BaseSettingItem","OpenInvite","isGroupConstrained","allowOpenInvite","setAllowOpenInvite","groupConstrainedContent","generateAllowedDomainOptions","patchTeam","_team$allow_open_invi","collapseModal","hasChangeTabError","hasChanges","setHasChangeTabError","allowed_domains","allow_open_invite","saveChangesPanelState","handleAllowedDomainsSubmit","handleOpenInviteSubmit","updateOpenInvite","_team$allow_open_invi2","collapseModalHandler","handleSaveChanges","allowedDomainSuccess","openInviteSuccess","ModalSection","handleDescriptionChanges","clientError","updateDescription","descriptionSectionInput","containerClassName","MAX_TEAMDESCRIPTION_LENGTH","handleNameChanges","updateName","nameSectionInput","MAX_TEAMNAME_LENGTH","TeamPictureSection","onFileChange","selectInput","image","setImage","orientationStyles","setOrientationStyles","teamImageSource","imageURLForTeam","handleInputFile","previewBlob","createObjectURL","reader","FileReader","FileUtils","readAsArrayBuffer","setPicture","teamPictureSection","teamImage","imageStyles","backgroundRepeat","charAt","ACCEPT_STATIC_IMAGE","EditIcon","TrashCanOutlineIcon","ACCEPTED_TEAM_IMAGE_TYPES","Required","TeamNameRestrictions","MIN_TEAMNAME_LENGTH","TeamIconInvalidFileType","TeamIconTooLarge","TeamIconError","_config$MaxFileSize","removeTeamIcon","setTeamIcon","_team$display_name2","setName","setDescription","teamIconFile","setTeamIconFile","setLoading","imageClientError","setImageClientError","nameClientError","setNameClientError","handleNameDescriptionSubmit","handleTeamIconSubmit","nameDescriptionSuccess","_team$display_name","handleTeamIconRemove","updateTeamIcon","handleCollapseModal","modalSectionContent","TeamNameSection","TeamDescriptionSection","TeamSettings","activeTab","InfoTab","AccessTab","SettingsSidebar","TeamSettingsModal","canInviteUsers","setActiveTab","modalBodyRef","updateTab","tab","handleCollapse","el","ReactDOM","closest","tabs","uiName","iconTitle","fallback","TEAM_SETTINGS","LeaveTeamIcon","MainMenu","A","showFlaggedPosts","isMentionSearch","showMentions","_this$props$pluginMen","appDownloadLink","teamIsGroupConstrained","isLicensedForLDAPGroups","guestAccessEnabled","canInviteTeamMember","safeAppDownloadLink","makeUrlSafe","mobile","mobileIcon","someIntegrationEnabled","enableIncomingWebhooks","enableOutgoingWebhooks","enableCommands","enableOAuthServiceProvider","canManageSystemBots","showIntegrations","canManageIntegrations","teamsLimitReached","usageDeltaTeams","createTeamRestricted","invitePeopleModal","ItemToggleModalRedux","extraText","SystemPermissionGate","SYSCONSOLE_WRITE_BILLING","CloudTrial","SYSCONSOLE_WRITE_ABOUT_EDITION_AND_LICENSE","StartTrial","searchMentions","getFlagged","MANAGE_TEAM","REMOVE_USER_FROM_TEAM","invert","CREATE_TEAM","ItemLink","experimentalPrimaryTeam","moreTeamsToJoin","ItemExternalLink","helpLink","reportAProblemLink","ABOUT","siteName","handleEmitUserLoggedOutEvent","sibling","RestrictedIndicator","feature","MattermostFeatures","CREATE_MULTIPLE_TEAMS","minimumPlanRequiredForFeature","LicenseSkus","Professional","titleAdminPreTrial","messageAdminPreTrial","trialLength","FREEMIUM_TO_ENTERPRISE_TRIAL_LENGTH_DAYS","titleAdminPostTrial","messageAdminPostTrial","titleEndUser","messageEndUser","LearnAboutTeamsLink","teamType","AppDownloadLink","EnableCommands","EnableIncomingWebhooks","EnableOAuthServiceProvider","EnableOutgoingWebhooks","ExperimentalPrimaryTeam","HelpLink","ReportAProblemLink","canManageTeamIntegrations","MANAGE_SLASH_COMMANDS","MANAGE_OAUTH","MANAGE_INCOMING_WEBHOOKS","MANAGE_OUTGOING_WEBHOOKS","MANAGE_BOTS","MANAGE_OTHERS_BOTS","joinableTeams","getJoinableTeamIds","rhsState","isCloudLicense","MENTION","getChannelNamesMap","getChannelNameToDisplayNameMap","channelNamesMap","channelMentions","_getPost","autolinkedUrlSchemes","getAutolinkedUrlSchemes","enableFormatting","managedResourcePaths","getManagedResourcePaths","mentionKeys","getAllUserMentionKeys","minimumHashtagLength","MinimumHashtagLength","proxyImages","imagesMetadata","editedAt","highlightKeys","imageProps","hasPluginTooltips","messageMetadata","PostEditedIndicator","inputOptions","atMentions","htmlFormattedText","formatText","messageHtmlToComponent","atSumOfMembersMentions","atPlanMentions","CompassDesignProvider","defaultMuiTheme","useDefaultMuiTheme","_props$theme$centerCh","_props$theme","_props$theme$centerCh2","_props$theme2","createTheme","paper","centerChannelBg","alpha","centerChannelColor","MenuContext","createContext","addOnClosedListener","handleClosed","SubMenuContext","useMenuContextValue","onClosedListeners","listener","clear","MuiMenuStyled","MuiMenu","shouldForwardProp","prop","asSubMenu","MENU_OPEN_ANIMATION_DURATION","MENU_CLOSE_ANIMATION_DURATION","defaultAnchorOrigin","defaultTransformOrigin","_props$menu$ariaLabe2","_props$menu2","anchorElement","setAnchorElement","disableAutoFocusItem","setDisableAutoFocusItem","isMenuOpen","closeMenu","handleMenuModalClose","handleMenuButtonClick","_props$menu$ariaLabe","_props$menu","MenuModal","menuButtonId","menuId","menuAriaLabel","onModalClose","handleMenuButtonMouseDown","renderMenuButton","_props$menuButton$as","_props$menuButton","_props$menuButton$dis","_props$menuButton2","_props$menuButton$ari","_props$menuButton3","_props$menuButton$cla","_props$menuButton4","MenuButtonComponent","as","triggerElement","dateTestId","_props$menuButtonTool","_props$menuButtonTool2","_props$menuButton5","providerValue","Provider","anchorEl","onTransitionExited","SPACE","ariaHasPopupAttribute","ariaHasExpandedAttribute","MenuListProps","TransitionProps","exit","closeMenuModal","handleKeydown","MuiMenuList","currentElement","ariaHasPopup","leadingElement","isDestructive","isLabelsRowLayout","menuContext","useContext","subMenuContext","KEY_DOWN","keyboardEvent","CLICK","isCorrectKeyPressedOnMenuItem","isRoleCheckboxOrRadio","clonedEvent","cloneDeep","hasSecondaryLabel","Children","MenuItemStyled","disableRipple","disableTouchRipple","MuiMenuItem","isRegular","flexDirection","flexWrap","justifyContent","marginInlineEnd","alignSelf","textAlign","gap","marginInlineStart","SubMenu","forceOpenOnLeft","isSubMenuOpen","anyModalOpen","isAnyModalOpen","originOfAnchorAndTransform","openAtRight","openAtLeft","_anchorElement$getBou","_anchorElement$getBou2","_anchorElement$getBou3","_anchorElement$getBou4","windowWidth","anchorElementLeft","getOriginOfAnchorAndTransform","passedInTriggerButtonProps","RIGHT","sx","LEFT","paddingTop","paddingBottom","handleModalClose","MenuItemSeparator","Divider","MultiSelectList","select","setSelected","handleArrowPress","_this$props$selectedI","selectRef","listRef","elemTop","elemBottom","listTop","renderOutput","searchQuery","defaultOptionRenderer","optionControls","onAction","a11yActive","reactSelectRef","handleInputChange","submitImmediatelyOn","change","removedValue","innerProps","CloseCircleSolidIcon","profileImg","handleEnterPress","ACTIVATE","handleA11yActivateEvent","DEACTIVATE","handleA11yDeactivateEvent","formatAsComponent","nextButton","previousButton","noteTextContainer","optionsToDisplay","noteText","valueMap","pageStart","pageEnd","multiSelectList","memberOptions","nullComponent","paddedComponent","MultiValueRemove","onInputKeyDown","formatOptionLabel","formatAsString","getOptionValue","getOptionLabel","SaveButton","handleOnClick","savingMessage","SearchSVG","ChannelSearchSVG","x1","y1","x2","y2","MentionsSVG","SavedMessagesSVG","PinSVG","ChannelFilesSVG","UserGroupsSVG","iconMap","Files","Mentions","FlaggedPosts","PinnedPosts","ChannelFiles","ChannelFilesFiltered","UserGroups","UserGroupMembers","UserGroupsArchived","titleMap","subtitleMap","expanded","iconGraphic","subtitleValues","subtitle","NoResultsLayout","Vertical","titleClassName","subtitleClassName","Horizontal","Span","Button","notified","useNotifyAdmin","reqData","btnFormaText","successText","NotifyAdminCTA","notify","notifyRequestData","preTrial","OnboardingTaskCategory","OnboardingTasksName","CHANNELS_TOUR","INVITE_PEOPLE","DOWNLOAD_APP","COMPLETE_YOUR_PROFILE","VISIT_SYSTEM_CONSOLE","START_TRIAL","OnboardingTaskList","ONBOARDING_TASK_LIST_OPEN","ONBOARDING_TASK_LIST_SHOW","ONBOARDING_TASK_LIST_CLOSE","DECLINED_ONBOARDING_TASK_LIST","GenericTaskSteps","START","FINISHED","TaskNameMapToSteps","isShowOnboardingCompleteProfileTour","onboardingTasks","isShowOnboardingVisitConsoleTour","translate","VisitSystemConsoleTour","handleTask","useHandleOnBoardingTaskData","taskName","overlayPunchOut","useMeasurePunchouts","TourTip","step","pulsatingDotPlacement","pulsatingDotTranslate","singleTip","showOptOut","interactivePunchOut","CompleteYourProfileTour","SvgComponent","LearnMoreTrialModalStep","bottomLeftMessage","TrialBenefitsModalStepMore","LearnMoreTrialModal","launchedBy","embargoed","setEmbargoed","dismissAction","LEARN_MORE_TRIAL_MODAL","startTrialBtn","SELF_HOSTED_START_TRIAL_MODAL","SETUP_LDAP","handleOnPrevNextSlideClick","_steps","slideId","getSlides","useTasksListWithStatus","dataInDb","getOnboardingTaskPreferences","tasksList","useTasksList","isGuestUser","hadPrevCloudTrial","showStartTrialTask","getTaskDetails","useGetTaskDetails","svg","Channels","Handshake","Sunglasses","Phone","Gears","Security","task","_dataInDb$find","storeSavePreferences","taskCategory","trackEventSuffix","eventSuffix","telemetryTag","generateTelemetryTag","trackEventAction","useHandleOnBoardingTaskTrigger","useLocation","handleSaveData","inAdminConsole","inChannels","tourCategory","CHANNELS_AND_DIRECT_MESSAGES","TTNameMapToATStatusKey","AutoTourStatus","ENABLED","SELF_HOSTED_START_TRIAL_TASK_LIST","getAnalyticsCategory","overwrite","COUNTRIES","getData","CountrySelector","DropdownInput","getName","country","Gate","ChannelPermissionGate","isPlugin","getPlugins","marketplace","getListing","apps","getInstalledListing","listing","installed_version","installed","getInstalling","secureGetFromRecord","installing","getError","fetchListing","localOnly","getFilter","getMarketplacePlugins","RECEIVED_MARKETPLACE_PLUGINS","getMarketplaceApps","RECEIVED_MARKETPLACE_APPS","installPlugin","INSTALLING_MARKETPLACE_ITEM","marketplacePlugin","getPlugin","installMarketplacePlugin","INSTALLING_MARKETPLACE_ITEM_FAILED","INSTALLING_MARKETPLACE_ITEM_SUCCEEDED","installApp","app","AppBindingLocations","MARKETPLACE","createCallContext","acting_user","Label","tag","MarketplaceItem","descriptionRef","iconSource","PluginIcon","labelComponents","pluginDetailsInner","versionLabel","descriptionText","pluginDetails","error_text","homepageUrl","item_error","updateDetails","MarketplaceItemApp","app_id","closeMarketplaceModal","getItemButton","onInstall","LoadingWrapper","iconURL","UpdateVersion","releaseNotesUrl","UpdateDetails","installedVersion","isInstalling","onUpdate","isUpdate","semver","UpdateConfirmationModal","sameMajorVersion","MarketplaceItemPlugin","eventName","allowDetail","isDefaultMarketplace","plugin_id","showUpdateConfirmationModal","hideUpdateConfirmationModal","onConfigure","_this$props$pluginSta","iconData","pluginStatus","IsDefaultMarketplace","getPluginStatus","MarketplaceList","noResultsMessage","noResultsAction","pageItems","homepage_url","release_notes_url","getNoResultsMessage","ExternalBannerLink","WebMarketplaceBannerRoot","webMarketplaceBannerBackground","IconsContainer","WebMarketplaceBanner","ArrowRightIcon","pluginIconConfluence","pluginIconGiphy","pluginIconPagerDuty","MarketplaceTabs","installedListing","pluginStatuses","hasFirstAdminVisitedMarketplace","getFirstAdminVisitMarketplaceStatus","isStreamlinedMarketplaceEnabled","streamlinedMarketplaceEnabled","tabKey","setTabKey","setFilter","setPage","hasLoaded","setHasLoaded","doFetchListing","FILTER_MARKETPLACE_LISTING","filterListing","debouncedSearch","setFirstAdminVisitMarketplaceStatus","getPluginStatuses","doFetch","scrollListToTop","scrollTop","handleChangeTab","handleOnChange","handleOnClear","handleOnNextPage","handleOnPreviousPage","handleNoResultsButtonClick","getHeaderInput","inputSize","SIZE","useLegend","getFooterContent","FooterPagination","itemsPerPage","onNextPage","onPreviousPage","getAppendedContent","bodyPadding","bodyDivider","footerDivider","footerContent","appendedContent","headerInput","activeKey","removePostCloseRHSDeleteDraft","draftKey","getGlobalItem","removePost","editingPostDetailsAndPost","EDIT_DRAFT","LinkOnlyRenderer","RemoveMarkdown","outHref","getScheme","output","markdown","ActionButton","handleAction","actionExecuting","actionExecutingMessage","handleActionClick","hexColor","STATUS_COLORS","good","warning","errorTextColor","buttonBg","getStatusColors","ActionBtn","changeOpacity","handlePopupOpened","ActionMenu","_this$props$action","default_option","PostContext","Consumer","_ownProps$action","menuActions","MessageAttachment","attachment","thumb_url","handleHeightReceived","image_url","checkPostOverflow","checkOverflow","actionOptions","getActionOption","trackOption","metric","actionCookie","doPostActionWithCookie","handleCustomActions","extUrlOption","mailtoPayload","mail_recipient","mail_cc","mail_subject","mail_body","optionName","opt","fieldTables","headerCols","bodyCols","rowPos","lastWasLong","nrTables","short","currentRelativeTeamUrl","lastIndexOf","getFileExtensionFromUrl","onImageHeightChanged","preText","preTextClass","pretext","attachmentText","thumb","author","author_name","author_icon","author_link","title_link","ShowMore","isAttachmentText","imageUrl","handleHeightReceivedForImageUrl","footerIcon","footer_icon","footerIconMetadata","footerIconUrl","truncate","MAX_ATTACHMENT_FOOTER_LENGTH","omission","thumbMetadata","thumbUrl","handleHeightReceivedForThumbUrl","getFieldsTable","renderPostActions","useBorderStyle","borderLeftColor","hasContent","handleFormattedTextClick","EMPTY_METADATA","MessageAttachmentList","attachments","safeLink","ytRegex","YoutubeVideo","playing","videoId","getVideoId","videoTitle","_time$2$match","_time$","_time$3$match","_time$2","_time$4$match","_time$3","startSeconds","handleYoutubeTime","frameBorder","allowFullScreen","allow","referrerPolicy","youtubeReferrerPolicy","sandbox","images","secure_url","safeUrl","play","isYoutubeLink","googleDeveloperKey","GoogleDeveloperKey","getOpenGraphMetadataForUrl","YoutubeReferrerPolicy","ButtonBinding","IN_POST","executing","_binding$form","_binding$form2","SelectBinding","_this$props$binding$b","debug","usedLabels","usedValues","nOptions","_this$state$selected","EmbeddedBinding","embed","fillBindings","renderBindings","copiedBindings","cleanBinding","EmbeddedBindings","embeds","PostBodyAdditionalContent","getEmbedFromMetadata","postWillRenderEmbedComponents","pluginPostWillRenderEmbedComponents","toggleable","webSocketClient","PostImage","_this$props$post$prop","_this$props$post$prop2","isMessageAttachmentArray","PostAttachmentOpenGraph","PostMessagePreview","prependToggle","getEmbed","_this$props$post$prop3","_this$props$post$prop4","appEmbeds","isArrayOf","app_bindings","isAppBinding","validateBindings","isEmbedToggleable","renderToggle","renderEmbed","PostWillRenderEmbedComponent","MessageWithAdditionalContent","pluginPostTypes","hasPlugin","messageWrapper","PostMessageView","Info","Popover","Row","acknowledgedAt","isMe","lastPictureUpdate","PostAcknowledgementsUserPopover","PostAcknowledgements","authorId","hasReactions","showDivider","headingId","useId","isCurrentAuthor","ack","buttonDisabled","useHover","mouseOnly","delay","restMs","safePolygon","blockPointerEvents","buttonText","unacknowledgePost","acknowledgePost","AcknowledgementButton","getPostAcknowledgementsWithProfiles","makeGetPostAcknowledgementsWithProfiles","getHasReactions","CommentedOnFilesMessage","plusMore","selectFileInfosForPost","CommentedOn","_parentPostUser$id","parentPostUser","onCommentClick","makeCommentedOnMessage","_post$props","webhookMessage","parentPostUserId","parentUserProfile","UserProfile","stripMarkdown","enablePostUsernameOverride","FailedPostOptions","retryPost","postDetails","createPost","cancelPost","FlagIconFilled","PostPinnedOrFlagged","MessageInfoKey","PostPreHeader","messageKey","Pinned","showPinnedPosts","getPostStatus","isFlagged","isPinned","PinnedAndFlagged","Flagged","Neither","getMessageInfo","postStatus","skipFlagged","skipPinned","POST_TOOLTIP_RANGES","getTimeFormat","PostTime","eventTime","isPermalink","postTime","canAddReactions","ADD_REACTION","canRemoveReactions","REMOVE_REACTION","ReactionTooltip","currentUserReacted","onShow","reactions","otherUsersCount","names","reactionVerb","otherUsers","lastUser","tooltipTitle","tooltipHint","onOpen","getNamesOfUsers","makeGetProfilesForReactions","accumulator","Reaction","animating","displayNumber","reactedClass","removeReaction","addReaction","ids","reactionCount","reactedNumber","unreactedNumber","unreacted","reacted","readOnlyClass","emojiNameWithSpaces","ariaLabelEmoji","emojiIcon","loadMissingProfiles","reactionButtonRef","reactionCountRef","onAnimationEnd","handleAnimationEnded","didCurrentUserReact","AddReactionIcon","addAReaction","ReactionList","addReactionButtonRef","toggleReaction","emojiNames","_props$reactions","reactionsByName","Map","addReactionButton","addReactionClassName","getReactionsForPost","makeGetUniqueReactionsToPost","_channel$team_id","ThreadFooter","threadId","replyClick","getThreadOrSynthetic","makeGetThreadOrSynthetic","threadIsSynthetic","participants","totalReplies","lastReplyAt","isFollowing","participantIds","handleReply","selectPost","handleFollowing","setThreadFollow","newReplies","Avatars","prepend","FollowButton","THREADING_TIME","formatted","InfoSmallIcon","ActionsMenuIcon","dangerous","colorClass","PLUGGABLE_COMPONENT","ActionMenuClass","appBindings","fetchBindings","openMarketplaceData","_this$props$handleDro","_this$buttonRef$curre","buttonRect","visitMarketplaceTip","handleOpenMarketplace","_this$props$component","PostUtils","onClickAppBinding","marketPlace","canOpenMarketplace","renderDivider","hasApps","hasPluggables","hasPluginMenuItems","Pluggable","pluggableName","isSysAdmin","emptyBindings","getPostOptionBinding","centerBindingsSelector","makeAppBindingsSelector","POST_MENU_ITEM","rhsBindingsSelector","makeRHSAppBindingSelector","centerBindings","rhsBindings","SEARCH","makeGetPostOptionBinding","systemMessage","isSystemMessage","showBindings","isCombinedUserActivityPost","PostDropdownMenu","ActionsMenu","ReplyIcon","enableBackground","CommentIcon","searchStyle","extraClass","handleCommentClick","commentCountSpan","iconStyle","replyTitle","variantColorMap","NotificationWrapper","NotificationIcon","NotificationTitle","NotificationText","noTitle","area","NotificationBox","iconProps","makeSelectedChannelOption","FormattedOption","getDirectTeammate","userImageUrl","isPartOfOnlyOneTeam","GlobeIcon","LockOutlineIcon","_teammate$roles","marginBottom","deactivated","sharedIcon","componentType","isSingleValue","componentId","SingleValue","ForwardPostChannelSelect","currentBodyHeight","validChannelTypes","provider","SwitchChannelProvider","forceDispatch","bodyHeight","minMenuHeight","margin","focusShadow","borderWidth","indicatorsContainer","dropdownIndicator","transition","valueContainer","menuList","scrollbarColor","scrollbarWidth","backgroundClip","groupHeading","textTransform","getBaseStyles","isValidChannelType","getDefaultResults","fetchAndFormatRecentlyViewedChannels","callCount","handlePretextChanged","ForwardPostCommentInput","canForwardPost","comment","permaLinkLength","applyMarkdownMode","setCommentAsync","markdownLinkKey","alignWithTextbox","ForwardPostModal","_selectedChannel$deta","isPrivateConversation","setComment","setBodyHeight","setHasError","selectedChannel","setSelectedChannel","bodyRef","measuredRef","selectedChannelId","canPostInSelectedChannel","_selectedChannel$deta2","_selectedChannel$deta3","isDMChannel","hasChannelPermission","handleChannelSelect","messagePreviewTitle","previewMetaData","team_name","channel_display_name","channel_type","notification","notificationText","participant","channelToForward","MENTION_MORE_CHANNELS","postPreviewFooterMessage","preventClickAction","previewFooterMessage","preventActionOnPreview","MoveThreadModal","originalChannel","timeoutRef","isButtonClicked","setIsButtonClicked","moveThread","ChannelSelector","PostReminderCustomTimePicker","connector","addPostReminder","PostReminders","TWO_HOURS","TOMORROW","CUSTOM","PostReminderSubmenu","postReminderSubMenuItems","postReminder","tomorrow","FormattedDate","FormattedTime","timeStyle","hour12","isMilitaryTime","postReminderCustomTimePicker","POST_REMINDER_CUSTOM_TIME_PICKER","currentDate","endTime","toUTCUnix","handlePostReminderMenuClick","ClockOutlineIcon","trackDotMenuEvent","POST_INFO_MORE","SHORTCUT","shortcutKey","DotMenuClass","canEdit","unflagPost","TELEMETRY_LABELS","UNSAVE","flagPost","SAVE","handleAddReactionClick","COPY_LINK","COPY_TEXT","unpinPost","UNPIN","pinPost","markPostAsUnread","UNREAD","DELETE","canMove","MOVE_THREAD","moveThreadModalData","MOVE_THREAD_MODAL","canPostBeForwarded","FORWARD","forwardPostModalData","FORWARD_POST_MODAL","setEditingPost","isFollowingThread","isMentionedInRootPost","followingThread","FOLLOW","UNFOLLOW","_this$props$handleCom","_this$props2","REPLY","forceCloseMenu","isShiftKeyPressed","R","handleEditMenuItemActivated","F","handleSetThreadFollow","handleForwardMenuItemActivated","handleDeleteMenuItemActivated","W","handleMoveThreadMenuItemActivated","handlePinMenuItemActivated","S","handleFlagMenuItemActivated","handleMarkPostAsUnread","_this$props$handleDro2","_this$props3","editDisableAction","handleEditDisable","isReadOnly","canDelete","disableCanEditPostByTime","postEditTimeLimit","UNSET_POST_EDIT_TIME_LIMIT","timeLeft","_this$props$isFollowi","forwardPostItemText","unFollowThreadLabel","unFollowMessageLabel","followThreadLabel","followMessageLabel","removeFlag","saveFlag","unPinPost","handleMenuKeydown","handleMenuToggle","ReplyOutlineIcon","ArrowRightBoldOutlineIcon","EmoticonPlusOutlineIcon","handleAddReactionMenuItemActivated","followPostLabel","threadReplyCount","MessageMinusOutlineIcon","MessageCheckOutlineIcon","channelIsArchived","MarkAsUnreadIcon","PostReminderSubMenu","BookmarkIcon","BookmarkOutlineIcon","PinIcon","PinOutlineIcon","MessageArrowRightOutlineIcon","PencilOutlineIcon","ContentCopyIcon","canWrangler","makeCanWrangler","USE_MILITARY_TIME","currentUserMentionKeys","getCurrentUserMentionKeys","rootMessageMentionKeys","matchUserMentionTriggersWithMessageMentions","PostEditTimeLimit","DotMenu","PostFlagIcon","setA11yActive","handlePress","flagIcon","Event","UPDATE","FlagIcon","PostReaction","RHS_SPACE_REQUIRED_ABOVE","RHS_SPACE_REQUIRED_BELOW","getDotMenuRef","handleToggleEmoji","EmojiItem","onItemClick","PostRecentReactions","additional","defaultEmojis","ignore","l","toLocaleUpperCase","complementEmojis","dotMenuRef","showDotMenu","setShowDotMenu","showActionsMenu","setShowActionsMenu","locationToUse","isLastPost","shortcutReactToLastPostEmittedFrom","isPostHeaderVisible","NO_WHERE","collapsedThreadsEnabled","oneClickReactionsEnabled","isEphemeral","isPostEphemeral","isFromAutoResponder","fromAutoResponder","isPostDeleted","hoverLocal","showCommentIcon","hasReplies","isFirstReply","commentIconExtraClass","commentIcon","replyCount","showRecentlyUsedReactions","failed","showRecentReactions","postReaction","_document$getElementB","_document$getElementB2","showMoreReactions","isExpanded","SIDEBAR_MINIMUM_WIDTH","actionsMenu","shouldShowActionsMenu","_props$pluginActions","pluginActions","dotMenu","hasCRTFooter","canReply","handleJumpClick","PostHeaderCustomStatus","userCustomStatus","showUpdateStatusButton","showPostHeaderUpdateStatusButton","isCustomStatusSet","isConsecutivePost","colorizeUsernames","colorize","userProfile","botIndicator","colon","from_webhook","isFromWebhook","propOverrideName","ensureString","override_username","overwriteName","overwriteIcon","override_icon_url","disablePopover","previousPost","_post$metadata","_post$metadata$priori","previousPostId","consecutivePost","areConsecutivePostsBySameUser","isPostCommentMention","makeIsPostCommentMention","parentPost","EnablePostUsernameOverride","getShortcutReactToLastPostEmittedFrom","highlightedPostId","getHighlightedPostId","selectedCard","getSelectedPostCard","ONE_CLICK_REACTIONS_ENABLED","ONE_CLICK_REACTIONS_ENABLED_DEFAULT","getOneClickReactionEmojis","previousPostIsComment","memberships","isDMorGM","directTeammate","previewCollapsed","COLLAPSE_DISPLAY","COLLAPSE_DISPLAY_DEFAULT","previewEnabled","LINK_PREVIEW_DISPLAY","LINK_PREVIEW_DISPLAY_DEFAULT","postTypes","isPostFlagged","MESSAGE_DISPLAY","MESSAGE_DISPLAY_DEFAULT","MESSAGE_DISPLAY_COMPACT","COLORIZE_USERNAMES","COLORIZE_USERNAMES_DEFAULT","shouldHighlight","center","CHANNEL_DISPLAY_MODE_CENTERED","isSidebarExpanded","getIsPostBeingEditedInRHS","getIsPostBeingEdited","isFlaggedPosts","FLAG","isPinnedPosts","clickToReply","CLICK_TO_REPLY","CLICK_TO_REPLY_DEFAULT","isCommentMention","isCardOpen","shouldShowDotMenu","canDeletePost","PostAction","selectPostFromRightHandSideSearch","setRhsExpanded","selectPostCard","_props$team$id","_props$team","_props$currentTeam","_props$currentTeam3","_props$team2","_post$metadata2","_post$metadata2$prior","togglePostMenu","isSearchResultItem","matches","postRef","postHeaderRef","setHover","setA11y","dropdownOpened","setDropdownOpened","fileDropdownOpened","setFileDropdownOpened","fadeOutHighlight","setFadeOutHighlight","setAlt","hasReceivedA11yFocus","setHasReceivedA11yFocus","timer","PERMALINK_FADEOUT","handleAlt","handleA11yKeyboardFocus","TAB","_postRef$current","hasSameRoot","opened","handleMouseLeave","isEligibleForClick","makeIsEligibleForClick","handlePostClick","handleThreadClick","_props$currentTeam2","postClass","profilePic","visibleMessage","hideProfilePicture","hideProfileCase","PostProfilePicture","searchMatches","PostMessageContainer","slotBasedOnEditOrMessageView","SLOT2","threadFooter","currentPostDay","getDateForUnixTicks","getChannelName","isDirectMessage","isPartOfThread","showReactions","postAriaLabelDivTestId","showFileAttachments","DateSeparator","PostAriaLabelDiv","getTestId","idPrefix","getClassName","isMeMessage","checkIsMeMessage","hovered","ArchiveIcon","PostUserProfile","isPostPendingOrFailed","card","handleCardClick","PostOptions","getPostHeaderVisible","_postHeaderRef$curren","boundingRectOfPostInfo","isPostHeaderVisibleToUser","EditPost","AppEvents","FOCUS_EDIT_TEXTBOX","FileAttachmentListContainer","typeMessage","POST_TYPES","ADD_TO_CHANNEL","JOIN_CHANNEL","JOIN_LEAVE_CHANNEL","REMOVE_FROM_CHANNEL","ADD_TO_TEAM","JOIN_TEAM","REMOVE_FROM_TEAM","LastUsers","expand","formatOptions","actor","expandedLocale","usernames","lastIndex","renderMessage","firstUserMessage","otherUsersMessage","numOthers","selectedTypeMessage","actorMessage","postTypeMessage","one","one_you","two","many_expanded","CombinedSystemMessage","currentUsername","userProfiles","currentUserDisplayName","userIdsArray","getAllUsernames","someone","loadUserProfiles","renderFormattedMessage","actorId","getUsernamesByIds","secondUser","selectedPostTypeMessage","localeHolder","messageData","showJoinLeave","shouldShowJoinLeaveMessages","convertedByUserId","gmMembersDuringConversionIDs","isStringArray","convertedByUsername","convertedByUser","renderUsername","gmMembersUsernames","convertedBy","gmMembers","formatList","PostAddChannelMember","addChannelMember","generateAtMentions","_this$props$post","_this$props$post3","_this$props$post4","andSeparator","commaSeparator","_this$props$post2","idx","arr","firstUserName","lastUserName","noGroupsUsernames","outOfChannelMessagePart","outOfChannelAtMentions","outOfGroupsMessagePart","outOfGroupsAtMentions","outOfChannelMessage","outOfGroupsMessage","handleAddChannelMember","verifiedValue","renderFormattedText","renderJoinChannelMessage","renderAddToChannelMessage","systemMessageRenderers","removedUsername","HEADER_CHANGE","headerOptions","isChannelNamesMap","channel_mentions","oldHeader","old_header","newHeader","new_header","old","new","br","DISPLAYNAME_CHANGE","old_displayname","new_displayname","oldDisplayName","newDisplayName","CONVERT_CHANNEL","PURPOSE_CHANGE","oldPurpose","old_purpose","newPurpose","new_purpose","ME","channelMultipleMessages","channelOneMessage","dmMultipleMessages","dmOneMessage","fromAnotherChannel","PostMarkdown","_this$props$post2$pro","_this$props$pluginHoo","_this$props$options","_this$props$post3$pro","_this$props$post5","_this$props$post5$met","_this$props$post6","_this$props$post7","renderedSystemMessage","hideGuestTags","isUserCanManageMembers","_post$props2","_post$props3","REMINDER","targetTime","ensureNumber","target_time","localTime","reminderTime","reminderDate","renderReminderACKMessage","add_channel_member","not_in_channel_user_ids","not_in_groups_usernames","not_in_channel_usernames","addMemberProps","GUEST_JOIN_CHANNEL","renderGuestJoinChannelMessage","ADD_GUEST_TO_CHANNEL","renderAddGuestToChannelMessage","COMBINED_USER_ACTIVITY","isUserActivityProp","user_activity","GMConversionMessage","renderSystemMessage","renderedSystemBotMessage","renderReminderSystemBotMessage","WRANGLER","renderedWranglerMessage","_post$props4","_post$props5","TranslationID","movedThreadPermalink","MovedThreadPermalink","NumMessages","renderWranglerSystemMessage","pluginHooks","edit_at","isEnterpriseOrCloudOrSKUStarterFree","showPostEditedIndicator","getMentionKeysForPost","getMyGroupMentionKeysForChannel","getMyGroupMentionKeys","mentionKeysWithoutGroups","groupMentionKeys","MessageWillFormat","LinkTooltip","getHighlightWithoutNotificationKeys","HideGuestTags","here","fromWebhook","defaultURL","enablePostIconOverride","postProps","postIconOverrideURL","useUserIcon","use_user_icon","DEFAULT_WEBHOOK_LOGO","availabilityStatusOnPosts","profileSrc","getProfilePictureURL","getPostIconURL","overrideIconEmoji","override_icon_emoji","isEmoji","getStatus","_ownProps$post","_ownProps$post$props","EnablePostIconOverride","AVAILABILITY_STATUS_ON_POSTS","AVAILABILITY_STATUS_ON_POSTS_DEFAULT","overrideIconUrl","getAbsoluteUrl","generateCombinedPost","makeGenerateCombinedPost","combinedId","Post","BasicSeparator","PropTypes","FloatingTimestamp","isScrolling","isRhsPost","toastPresent","classes","scrolling","toastAdjustment","PostListUtils","combinedIds","getThreadToastStatus","getToastStatus","NotificationSeparator","NewMessageSeparator","newMessagesSeparatorActions","separatorId","PostList","usePostAriaLabel","isPointDefined","point","getDistanceBW2Points","point1","point2","sqrt","pow","DIMENSIONS_NEAREST_POINT_IMAGE","LARGE_IMAGE_RATIO","openGraphData","bestImageData","_openGraphData$images","_imagesMetadata$image","_imagesMetadata$image2","_image$type","frameCount","pivot","nearest","getBestImage","isPreviewRemoved","REMOVE_LINK_PREVIEW","enableLinkPreviews","patchedPost","PostAttachmentOpenGraphBody","sitename","site_name","PostAttachmentOpenGraphImage","imageCollapsed","large","getIsLargeImage","collapsedLabel","imageCollapseButton","MenuDownIcon","MenuRightIcon","arePreviewsCollapsed","EnableLinkPreviews","postOwner","isPostOwner","canEditPost","openShowEditHistory","formatDate","formatTime","editedDate","getDateForTimezone","isSameDay","isYesterday","isWithinLastWeek","editedText","formattedTime","relativeOrDate","viewHistoryText","postOwnerTooltipInfo","showPostEditHistory","editedIndicatorContent","editedIndicator","PostAttachmentContainer","getTeamAndPostIdFromLink","shouldFocusPostWithoutRedirect","_params$teamName","isTeamSameWithCurrentTeam","_params$postId","focusPost","skipRedirectReplyPermalink","_previewPost$props","_previewPost$metadata","currentTeamUrl","previewPost","avatar","fileAttachmentPreview","urlPreview","previewFooter","UserProfileComponent","overflowType","embedVisible","collapse","hasOverflow","renderDeletedPost","PluginComponent","isRHSOpen","isRHSExpanded","isCollapsed","overflowRef","isOverflow","textContainer","checkTextOverflow","collapsedMaxHeightStyle","collapseShowMoreClass","attachmentTextOverflow","showIcon","showText","toggleCollapse","START_TRANSITIONING_OUT","LAUNCHING_WORKSPACE_FULLSCREEN_Z_INDEX","LaunchingWorkspace","hasEntered","setHasEntered","fullscreen","onPageView","SHOW_LAUNCHING_WORKSPACE","bodyClass","loadingIcon","LogoSvg","Animations","PAGE_SLIDE","mapAnimationReasonToClass","transitionDirection","WizardSteps","Organization","Plugins","InviteMembers","Reasons","EnterFromBefore","EnterFromAfter","ExitToBefore","ExitToAfter","mapStepToNextName","mapStepToPrevious","mapStepToPageView","mapStepToSubmitFail","mapStepToSkipName","classPrefix","animationReason","PLUGIN_NAME_TO_ID_MAP","github","gitlab","jira","zoom","servicenow","emptyForm","deepFreeze","organization","inferredProtocol","urlSkipped","useCase","boards","playbooks","skipped","invites","StyledPlanLabel","bgColor","PlanLabel","isSelfHostedEnterpriseTrial","IsTrial","renderLastDaysOnTrial","firstSvg","secondSvg","CheckMarkSvg","BlankCardImage","ButtonCustomiserClasses","StyledDiv","BlankCard","HostedCustomerLinks","DOWNLOAD","_props$buttonDetails","_props$buttonDetails2","_props$buttonDetails3","_props$buttonDetails4","_props$buttonDetails5","_props$briefing$items","bottomClassName","bottom__round","contactSalesCTAClassName","contact_sales_cta__reduced","planBriefingContentClassName","planPriceRateSectionClassName","planLimitsCtaClassName","buildingImgClassName","planLabel","topColor","plan","planSummary","price","BuildingSvg","rate","planExtraInformation","customButtonDetails","buttonDetails","grayed","customClass","contactSalesCTA","planTrialDisclaimer","briefing","planAddonsInfo","TadaSvg","_i$items","sub","Content","currentProduct","selectCloudProducts","yearlyProducts","findOnlyYearlyProducts","currentSubscriptionIsMonthly","recurring_interval","RecurringIntervals","MONTH","isEnterprise","ENTERPRISE","isEnterpriseTrial","yearlyProfessionalProduct","findProductBySku","PROFESSIONAL","professionalPrice","price_per_seat","maximumFractionDigits","isProfessional","currentSubscriptionIsMonthlyProfessional","isPreTrial","isPostTrial","notifyAdminBtnTextEnterprise","notifyAdminOnEnterpriseFeatures","enterpriseNotifyRequestStatus","required_feature","ALL_ENTERPRISE_FEATURES","required_plan","Enterprise","trial_notification","adminProfessionalTierText","Card","special","enterpriseBtnDetails","trialBtnClass","green","StyledA","ContainerSpan","span","linkAgreement","SOFTWARE_SERVICES_LICENSE_AGREEMENT","linkPrivacy","SelfHostedContent","setProfessionalPrice","requested","setRequested","hasData","getConfigAction","useFetchAdminConfig","getPrevTrialLicense","professionalProduct","getSelfHostedProducts","prod","YEAR","fetchSelfHostedProducts","prevSelfHostedTrialLicense","isStarter","isPostSelfHostedEnterpriseTrial","starterBriefing","professionalBriefing","enterpriseBriefing","SELF_HOSTED_PURCHASING","CloudLinks","CLOUD_SIGNUP_PAGE","closePricingModal","StartTrialCaution","ContactSalesCTA","setShowModal","isCloudPurchaseModalOpen","CLOUD_PURCHASE","statusToIconMap","StatusIconNew","iconName","_props$size2","profileIconClass","_props$size","wrapperClass","RoundButton","newStatusIcon","statusClass","getAvatarWidth","ProfilePopoverAvatar","urlSrc","ProfilePopoverCustomAttributes","customAttributeValues","setCustomAttributeValues","customProfileAttributeFields","getCustomProfileAttributes","getCustomProfileAttributeFields","getUserCustomProfileAttributesValues","fetchValues","attributeSections","attribute","ProfilePopoverCustomStatus","currentUserTimezone","haveOverrideProp","getIsCustomStatusExpired","getIsCustomStatusEnabled","showCustomStatusModal","customStatusInputModalData","customStatusSet","showExpiryTime","canSetCustomStatus","customStatusContent","ProfilePopoverEmail","ProfilePopoverLastActive","lastActivityTimestamp","getLastActivityForUserId","enableLastActiveTime","displayLastActiveLabel","timestampUnits","getLastActiveTimestampUnits","botDescription","ProfilePopoverFullName","fullname","remoteId","SharedUserIndicator","positionSubstringed","MAX_POSITION_LENGTH","ProfilePopoverUserName","hasFullName","ProfilePopoverName","FullName","BotDescription","bot_description","UserName","Position","SearchChannelWithPermissionsSuggestion","SuggestionContainer","channelSearchSorter","wrappedA","wrappedB","aIsArchived","bIsArchived","getCurrentUserLocale","aDisplayName","bDisplayName","aStartsWith","bStartsWith","sortChannelsByTypeAndDisplayName","SearchChannelWithPermissionsProvider","channelSearchFunc","autocompleteChannelsForSearch","makeChannelSearchFilter","channelPrefix","channelPrefixLower","searchString","resultsCallback","startNewRequest","formatChannelsAndDispatch","fetchChannels","channelsAsync","channelsFromServer","shouldCancelDispatch","allChannels","completedChannels","channelFilter","newChannel","wrappedChannel","matchedPretext","terms","AddUserToChannelModal","suggestionProviders","disableDispatches","channelSearchBox","getTextbox","placeCaretAtEnd","submitError","selection","checkingForMembership","isUserMemberOfChannel","handleSubmitError","channelMembers","enableChannelProvider","targetUserIsMemberOfSelectedChannel","getFullName","help","setSearchBoxRef","didSelectChannel","delayInputUpdate","shouldDisableAddButton","ProfilePopoverAddToChannel","handleCloseModals","canManageAnyChannelMembersInCurrentTeam","getCanManageAnyChannelMembersInCurrentTeam","isInCurrentTeam","getIsInCurrentTeam","handleAddToChannel","ADD_USER_TO_CHANNEL","ProfilePopoverCallButton","pluginCallComponents","sidebarOpen","customButton","dmChannel","clickEnabled","setClickEnabled","prevSidebarOpen","CHANNEL_HEADER_BUTTON_DISABLE_TIMEOUT","clickHandler","_item$action","channelForCall","createDirectChannel","getDmChannel","handleStartCall","CallButton","getMyCurrentChannelMembership","isSidebarOpen","isUserInCall","sessionsInCall","getSessionsInCalls","session","getIsCallsEnabled","getDirectChannelName","shouldRenderButton","_dmChannel$id","_dmChannel$id2","callsChannelExplicitlyDisabled","getCallsConfig","DefaultEnabled","callsChannelExplicitlyEnabled","hasDMCall","startCallMessage","callButton","ProfilePopoverOtherUserRow","handleShowDirectChannel","ProfilePopoverCallButtonWrapper","ProfilePopoverOverrideDisclaimer","ProfilePopoverSelfUserRow","handleEditAccountSettings","TimeZoneDifference","profileUserTimezone","currentUserDate","profileUserDate","Duration","fromObject","timeOffset","toHuman","unitDisplay","signDisplay","ProfileTimezone","profileTimezone","getUserCurrentTimezone","profileTimezoneShort","offsetNameShort","ProfilePopoverTitle","getIsTeamAdmin","getIsChannelAdmin","roleTitle","channelIdProp","getDefaultChannelId","modals","enableCustomProfileAttributes","loadingDMChannel","setLoadingDMChannel","handleReturnFocus","previouslyFocused","modalState","getMembershipForEntities","ProfilePopoverTimezone","ProfilePopoverController","_props$triggerCompone","TRANSITION_STYLE_PROPS","TriggerComponent","triggerComponentAs","triggerComponentId","triggerComponentStyle","RootHtmlPortalId","OverlaysTimings","FADE_IN_DURATION","FADE_OUT_DURATION","initial","OverlayTransitionStyles","excess","forwardedRef","_this$input","_this$input2","updateInputFromProps","clearableTooltipText","inputElement","setInputRef","forwarded","auto_responder_message","offline","ooo","currentUserStatus","CATEGORY_AUTO_RESET_MANUAL_STATUS","autoResetStatus","statusIsManual","autoResetPrefNotSet","autoResetPref","_this$state$currentUs","userStatus","manualStatusTitle","manualStatusMessage","renderModalMessage","manualStatusButton","manualStatusCancel","manualStatusCheckbox","showCheckbox","checkboxText","initializeProducts","REMOTE_CONTAINERS","imports","load","Product","plugin","registry","PluginRegistry","initializeProduct","loadConfigAndMe","getLicenseConfig","isLoaded","isMeRequested","serverVersion","getServerVersion","RECEIVED_SERVER_VERSION","getMe","getMyPreferences","registerCustomPostRenderer","RECEIVED_PLUGIN_POST_COMPONENT","postTypeId","redirectToOnboardingOrDefaultTeam","_profilesResult$data","firstAdminSetupComplete","getFirstAdminSetupComplete","profilesResult","SYSTEM_ADMIN_ROLE","adminProfiles","checkIsFirstAdmin","handleLoginLogoutSignal","isNewLocalStorageEvent","storageArea","LOGOUT","LOGIN","reloadOnFocus","RudderTelemetryHandler","userRoles","properties","user_actual_role","getActualRoles","rudderAnalytics","ip","referrer","anonymousId","featureName","getEventCategory","skus","getSKUs","pageVisited","eventSKUs","eventCategory","TrackMiscCategory","SearchFileExtensionSuggestionContainer","ExtensionText","pdf","word","audio","video","presentation","spreadsheet","patch","SearchFileExtensionSuggestion","isSelection","optionClicked","labelName","getCompassIconClassName","globalExtensions","TEXT_TYPES","IMAGE_TYPES","AUDIO_TYPES","VIDEO_TYPES","PRESENTATION_TYPES","SPREADSHEET_TYPES","WORD_TYPES","CODE_TYPES","PDF_TYPES","PATCH_TYPES","SVG_TYPES","SearchFileExtensionProvider","captured","extensions","allowDividers","presentationType","SearchHintsContainer","SearchFilter","SearchHints","onSelectFilter","searchType","hasSelectedOption","isDate","searchHintOptions","searchFilesHintOptions","SearchBoxHints","setSearchTerms","providerResults","filterSelectedCallback","searchChangeCallback","changedValue","searchPluginHints","getSearchBoxHints","SearchDateSuggestion","pluginComponentInfo","ErrorBoundary","onChangeSearch","SearchInputContainer","ClearButton","SearchInput","searchPlaceholder","inputChangeCallback","clearSearch","updateSearchTerms","updateSearchType","SuggestionsHeader","SuggestionsBody","SearchSuggestions","suggestionsHeader","setSelectedOption","onSearch","onSuggestionSelected","runSearch","searchPluginSuggestions","getSearchPluginSuggestions","generateLabel","onRunSearch","SearchTypeSelectorContainer","SearchTypeItem","SearchTypeSelector","setSearchType","setMessagesSearchType","setFilesSearchType","searchPluginButtons","getSearchButtons","SearchBoxContainer","SearchBox","initialSearchTerms","initialSearchType","getCaretPosition","_inputRef$current","addSearchHint","newSearchTerms","_inputRef$current2","updateCaretPosition","_inputRef$current3","useSearchSuggestions","setProviderResults","setSuggestionsHeader","SearchDateProvider","SearchChannelProvider","SearchUserProvider","autocompleteUsersInTeam","partialSearchTerms","newposition","_inputRef$current4","updateSearchValue","escapedMatchedPretext","escapeRegex","extraSpace","totalItems","closeHandler","PopoverStyled","SearchTypeBadge","NewSearchContainer","NewSearch","currentChannelName","getCurrentChannelNameForSearchShortcut","getSearchTerms","getSearchType","pluginSearch","setCurrentChannel","searchBoxRef","searchButtonRef","isServerVersionGreaterThanOrEqualTo","getDesktopVersion","F6","isMacApp","capture","closeSearchBox","a11yController","resetOriginElement","openSearchBox","storeOriginElement","openSearchBoxOnKeyPress","showSearchResults","pluginData","clearSearchType","GlobalSearchNav","handleShortcut","M","Flex","alignment","UserGuideDropdown","menuActive","buttonActive","enableAskCommunityLink","askTheCommunityClick","openKeyboardShortcutsModal","buttonToggleState","inverted","compact","renderDropdownItems","EnableAskCommunityLink","getUserGuideDropdownPluginMenuItems","CenterControlsContainer","productId","isChannels","subComponentName","pluggableId","HistoryButtonsContainer","HistoryButtons","canGoBack","setCanGoBack","canGoForward","setCanGoForward","getTooltip","requestButtons","getBrowserHistoryStatus","updateButtons","enableBack","enableForward","onBrowserHistoryStatusUpdated","goForward","isSwitcherOpen","productMenu","switcherOpen","ProductBrandingContainer","ProductBranding","useCurrentProduct","switcherIcon","glyphMap","ProductChannelsIcon","switcherText","ProductBrandingTeamEditionContainer","StyledLogo","Logo","Badge","ProductBrandingTeamEdition","MenuItemTextContainer","ProductMenuItem","destination","tourTip","ProductIcon","ProductMenuList","isMessaging","enablePluginMarketplace","showVisitSystemConsoleTour","handleVisitConsoleClick","enableCustomUserGroups","ItemCloudLimit","SYSCONSOLE_READ_PERMISSIONS","ApplicationCogIcon","WebhookIncomingIcon","CUSTOM_USER_GROUPS","ViewGridPlusOutlineIcon","DownloadOutlineIcon","isCloudStarterFree","isCloudFreeTrial","isSelfHostedStarter","isSelfHostedFreeTrial","ProductMenuContainer","ProductMenuButton","ProductMenu","useProducts","menuRef","currentProductID","useCurrentProductId","handleOnBoardingTaskData","visitSystemConsoleTaskName","productItems","switcherLinkURL","listId","LeftControlsContainer","LeftControls","isStatusDropdownOpen","statusDropdown","DndCustomTimePicker","statusDropdownMessages","extra","StatusDropdown","dndEndTime","dnd_end_time","AWAY","utc","unix","dndCustomTimePicker","DND_CUSTOM_TIME_PICKER","getCurrentDateTimeForTimezone","profilePicture","_customStatus$text","_customStatus$text2","customStatusText","customStatusHelpText","pulsatingDot","showCustomStatusPulsatingDot","PulsatingDot","padded","formattedEndTime","_customStatus$text3","_customStatus$emoji","needsConfirm","isUserOutOfOffice","setOnline","showStatusChangeConfirmation","setDnd","setAway","setOffline","setCustomTimedDnd","selectedIndicator","dndSubMenuItems","isHeader","dndTimes","customStatusComponent","renderCustomStatus","menuAriaLabeltext","dndExtraText","renderDndExtraText","handleCustomStatusEmojiClick","renderProfilePicture","openProfileModal","CancelIcon","rightDecorator","AccountOutlineIcon","showCompleteYourProfileTour","handleCompleteYourProfileTask","ExitToAppIcon","getDndEndTimeForUserId","AtMentionsButton","UpgradeButton","PlanUpgradeButton","isCloudFree","SavedPostsButton","SettingsButton","RightControlsContainer","StyledCustomizeYourExperienceTour","StyledStatusDropdown","CUSTOMIZE_EXPERIENCE","showCustomizeTip","useShowOnboardingTutorialStep","CustomizeYourExperienceTour","GlobalHeaderContainer","GlobalHeader","CenterControls","RightControls","HFRoute","headerProps","setHeaderProps","customizeHeader","Route","onCustomizeHeader","HeaderFooterTemplate","HFTRoute","LoggedInHFTRoute","_excluded2","OnBoardingTaskList","LoggedInRoute","routeProps","TRANSITION_TIMEOUT","SidebarRightMenu","defaultSiteName","defaultTeamDisplayName","getIsRhsMenuOpen","SidebarMobileRightMenu","LuxonController","Settings","defaultLocale","defaultZone","elementIdentifiers","identifyElementRegion","identifier","parentElement","PerformanceReporter","client","desktopAPI","appVersion","prereleaseVersion","_prereleaseVersion$sp","visibilityState","maybeSendReport","platformLabel","userAgentLabel","desktopAppVersion","getAppVersion","getPrereleaseVersion","counters","histogramMeasures","observer","PerformanceObserver","handleObservations","observedEntryTypes","supportedEntryTypes","entryTypes","measurePageNavigation","onCLS","handleWebVital","onFCP","onINP","onLCP","reportTimeout","handleReportTimeout","nextTimeout","isDev","desktopOffListener","onReceiveMetrics","metrics","collectDesktopAppMetrics","performance","getEntriesByType","entry","ts","TTFB","responseStart","TTLB","responseEnd","DomInteractive","domInteractive","PageLoad","_this$desktopOffListe","getEntries","isPerformanceMeasure","handleMeasure","isPerformanceMark","handleMark","isPerformanceLongTask","handleLongTask","report","_entry$detail","_entry$detail2","_unused2","incrementCounter","_this$counters$get","_metric$attribution","selector","attribution","region","_metric$attribution2","interaction","interactionType","reportPeriodJitter","reportPeriodBase","canReportMetrics","EnableClientMetrics","sendReport","generateReport","counterMeasures","countersToMeasures","platform","agent","desktop_app_version","getReportStartEnd","histograms","measure","getClientMetricsRoute","sendBeacon","fetch","navigator","metricsMap","processName","process","cpu","memory","entryType","PerformanceReporterController","useStore","reporter","DesktopAppAPI","IntlProvider","setAcceptLanguage","loadTranslationsIfNecessary","localeInfo","I18n","setLocalizeFunction","handleLocaleChange","BaseIntlProvider","textComponent","wrapRichTextChunksInFragment","RootProvider","WebSocketContext","RootRedirect","isElegibleForFirstAdmingOnboarding","firstAdminCompletedSignup","areThereTeams","URLSearchParams","MemberListChannel","loadProfilesAndTeamMembersAndChannelMembers","getChannelMembers","in_channel_id","loadTeamMembersAndChannelMembersForProfilesList","totalChannelMembers","handleSearch","getUsersAndActionsToDisplay","getMembersInCurrentChannel","sortByUsername","searchProfilesInCurrentChannel","ChannelMembersModal","canManageChannelMembers","onAddNewMembersButton","previousTriggerId","subscribe","PluginTextbox","suggestionListStyle","require","ReactIntl","Redux","ReactRedux","ReactBootstrap","ReactRouterDom","Luxon","StyledComponents","html","openInteractiveDialog","WebappUtils","browserHistory","notificationSounds","ring","NotificationSounds","stopRing","sendDesktopNotificationToMe","notifyMe","openUserSettings","Components","BotBadge","ThreadViewer","ProductApi","useWebSocketClient","WebSocketProvider","closeRhs","selectRhsPost","selectPostById","getRhsSelectedPostId","MobileViewWatcher","WindowSizeObserver","ErrorPage","Login","AccessProblem","PasswordResetSendLink","PasswordResetForm","Signup","ShouldVerifyEmail","DoVerifyEmail","ClaimController","TermsOfService","LinkingLandingPage","AdminConsole","SelectTeam","Authorize","CreateTeam","Mfa","PreparingWorkspace","_StyledPluggable3","_styled3","_StyledPluggable2","_styled2","_templateObject","$_css","_StyledPluggable","TeamController","SystemNotice","CloudEffects","TeamSidebar","SidebarRight","ModalController","AppBar","ComponentLibrary","Root","rudderKey","serviceEnvironment","ServiceEnvironment","PRODUCTION","TEST","DEV","telemetryEnabled","rudderCfg","setCookieDomain","hostname","utmParams","captureUTMParams","setTelemetryHandler","initializePlugins","shouldMountAppRoutes","migrateRecentEmojis","loadRecentlyUsedCustomEmojis","showLandingPageIfNecessary","applyTheme","_window$location$host","enableDesktopLandingPage","isChromebook","isAndroidWeb","androidDownloadLink","isIosWeb","iosDownloadLink","hasSeenLandingPage","setLandingPageSeen","noAccounts","onConfigLoaded","shouldShowAppBar","rhsIsOpen","rhsIsExpanded","setUrl","setAuthHeader","setSystemEmojis","EmojiIndicesByAlias","deepEqual","setRootMeta","isConfigLoaded","setRudderConfig","SCHEDULED_POST_URL_SUFFIX","reactAppInitialized","InitialLoadingScreen","qs","campaign","delete","PAGE_LOAD","initiateMeRequests","measurePageLoadTelemetry","trackSelectorMetrics","handleLogoutLoginSignal","handleDropEvent","handleDragOverEvent","_this$props$products","_this$props$products2","_this$props$plugins","Switch","isDevModeEnabled","THEMES","denim","permalinkRedirectTeamName","showLaunchingWorkspace","publicComponent","baseURL","pluggable","wrapped","showTeamSidebar","TEAM_NAME_PATH_PATTERN","CustomRouteComponent","permalinkRedirectTeam","DiagnosticsEnabled","NoAccounts","DiagnosticId","IosAppDownloadLink","AndroidAppDownloadLink","EnableDesktopLandingPage","getShowLaunchingWorkspace","extraClasses","CustomStatus","extraInfo","actionProps","Action","actionIndex","statusProp","userCountID","userCountEmail","emailProp","emailStyle","createSafeId","displayFullAndNicknameForUser","containerRef","RowComponentType","rowComponentType","UserListRow","renderView","renderThumbHorizontal","renderThumbVertical","_this$scrollbarsRef$c","scrollbarsRef","scrollToTop","nextDisabled","nextTimeoutId","previousPage","filterRef","onTermChange","isSearch","renderCount","focusSearchBar","filterRow","noBuiltInFilters","renderFilterRow","Scrollbars","autoHide","autoHideTimeout","autoHideDuration","mfaEnabled","enableUserAccessTokens","experimentalEnableAuthenticationTransfer","doPasswordReset","doEmailReset","doManageTeams","doManageRoles","doManageTokens","SearchableUserListContainer","setTerm","SectionNoticeButton","buttonClass","trailingIcon","iconByType","welcome","primaryButton","secondaryButton","tertiaryButton","linkButton","onDismissClick","showDismiss","hasButtons","noText","sharedTooltipText","Contrast","TutorialTip","MIN_IMAGE_SIZE","_dimensions$width2","_dimensions$height4","isSmallImage","naturalWidth","naturalHeight","imageWidth","onImageLoadFail","_this$props$onClick","_this$props$onClick2","_fileInfo$extension","conditionalSVGStyleAttribute","onEnterKeyDown","handleError","handleLoad","copyLinkTooltipText","linkCopiedRecently","copyLinkToAsset","downloadTooltipText","isInternalImage","wideImageButtonsOffset","modifierCopyButton","modifierLargerWidth","leftStyle","wideSmallImageStyle","utilityButtonsWrapper","dimensionsAvailable","_dimensions$height","_dimensions$height2","_dimensions$height3","_dimensions$width","ratio","miniPreview","getFileMiniPreviewUrl","renderImageLoaderIfNeeded","verticalAlign","shouldShowImg","renderImageWithContainerIfNeeded","linkCopyInProgress","_this$props$src","startCopyTimer","_data$data","heightTimeout","renderImageOrFallback","AirgappedTrialActivationConfirmSvg","AirGappedModal","airGappedLink","IconMessage","formattedButtonText","formattedTertiaryButonText","formattedTitle","formattedSubtitle","formattedLinkText","buttonHandler","tertiaryButtonHandler","tertiaryBtn","withTestId","BackIcon","FullScreenModal","currentActiveElement","ignoreExit","overrideTargetEvent","handleKeypress","appear","ariaLabelledBy","onGoBack","ResultModal","primaryButtonText","primaryButtonHandler","contactSupportButtonVisible","resultType","openContactSupport","subject","getCloudSupportLink","goToCloudSupportForm","useOpenCloudZendeskSupportForm","isResultModalOpen","modalType","StartTrialFormModalResult","handleButtonClick","_props$onTryAgain","onTryAgain","START_TRIAL_FORM_MODAL_RESULT","LaptopAlertSvg","TrialBenefitsModal","TrialLoadStatus","ONE_TO_50","FIFTY_TO_100","ONE_HUNDRED_TO_500","FIVE_HUNDRED_TO_1000","ONE_THOUSAND_TO_2500","TWO_THOUSAND_FIVE_HUNDRED_AND_UP","OrgSize","setLoadStatus","setEmail","setCompanyName","orgSize","setOrgSize","setCountry","businessEmailError","setBusinessEmailError","cwsAvailability","didOnce","setDidOnce","handleValidateBusinessEmail","handleErrorModalTryAgain","isSubmitDisabled","agreement","privacypolicy","trialRequestBody","terms_accepted","receive_emails_accepted","contact_name","contact_email","company_name","company_country","company_size","EMBARGOED_COUNTRIES","trialJustStarted","StatusAwayAvatarIcon","StatusAwayIcon","StatusDndAvatarIcon","StatusDndIcon","StatusOfflineAvatarIcon","StatusOfflineIcon","StatusOnlineAvatarIcon","StatusOnlineIcon","ParseState","getCommandBindings","COMMAND","getRHSCommandBindings","ParsedCommand","formsCache","Start","commandBindings","_this$binding$binding","_this$binding$binding2","autocompleteMode","asError","done","incomplete","incompleteStart","Command","EndCommand","CommandSeparator","resolvedForm","_this$binding","fetched","getSubmittableForm","_this$field","StartParameter","flagEqualsUsed","escaped","Flag1","Flag","Rest","StartValue","ParameterSeparator","_f$label","flagName","FlagValueSeparator","QuotedValue","TickValue","MultiselectStart","NonspaceValue","EndValue","EndQuotedValue","EndTickedValue","MultiselectStartValue","MultiselectQuotedValue","MultiselectTickValue","MultiselectNonspaceValue","MultiselectEndValue","MultiselectEndQuotedValue","MultiselectEndTickedValue","MultiselectValueSeparator","MultiselectNextValue","_this2","rootPostID","_parsed$resolvedForm","parsed","matchBinding","parseForm","parserErrorMessage","addDefaultAndReadOnlyValues","missing","getMissingFields","missingStr","fieldName","composeCallRequest","expandOptions","_parsed$binding","getAppContext","Complete","Suggestion","Hint","IconData","Integrations","_parsed$resolvedForm2","_parsed$binding2","_parsed$binding2$form","_parsed$field","_parsed$field2","_parsed$resolvedForm3","_parsed$resolvedForm4","suggestions","getErrorSuggestion","getCommandSuggestions","argSuggestions","getParameterSuggestions","executableStates","modalStates","hasRequired","hasValue","execute","getExecuteSuggestion","getNoMatchingSuggestion","getOpenInModalSuggestion","decorateSuggestionComplete","COMMAND_SUGGESTION_ERROR","_parsed$resolvedForm5","commandValues","getOption","_f$options","setOptionError","selectUserByUsername","userName","dispatchResult","setUserError","selectChannelByName","setChannelError","choice","EXECUTE_CURRENT_COMMAND_ITEM_ID","OPEN_COMMAND_IN_MODAL_ITEM_ID","goBackSpace","complete","_callResponse$form","submittableForm","getAppRHSCommandForm","getAppCommandForm","fetchSubmittableForm","actionType","RECEIVED_APP_COMMAND_FORM","RECEIVED_APP_RHS_COMMAND_FORM","_parsed$binding3","_parsed$binding3$bind","_parsed$resolvedForm6","_parsed$resolvedForm7","positional","getValueSuggestions","getFlagNameSuggestions","_parsed$field3","getMultiselectValueSeparatorSuggestion","_parsed$resolvedForm8","_parsed$resolvedForm9","prevCharIndex","applicable","_parsed$binding4","delimiter","_parsed$binding5","getUserFieldSuggestions","getChannelFieldSuggestions","getBooleanSuggestions","getDynamicSelectSuggestions","getStaticSelectSuggestions","mentionSuggestions","inTextMentionSuggestions","_f$options2","_parsed$binding6","isMultiword","_parsed$field4","_callResponse$data","_items2","makeDynamicSelectSuggestionError","_parsed$binding7","getUserSuggestions","getChannelSuggestions","_parsed$field5","_parsed$field6","_parsed$binding8","_parsed$field7","_parsed$field8","_parsed$binding9","getStore","_parsed$resolvedForm10","_parsed$resolvedForm11","selectUser","COMMAND_SUGGESTION_CHANNEL","COMMAND_SUGGESTION_USER","separatedWords","incompleteLessLastWord","lastWord","usersAutocomplete","_usersAutocomplete$ou","_usersAutocomplete$ou2","notFoundSuggestions","getUserSuggestion","notFoundSuggestion","reduxStore","localizeAndFormatMessage","_command","_position","GenericChannelSuggestion","normalizedPretext","GenericUserSuggestion","getUsersRoute","searchUsersFunc","MenuActionSuggestion","displayAllOptions","filterOptions","filteredOptions","rect","latestHeight","_this$suggestionList","_this$suggestionList$","_this$suggestionList$2","listElement","getContent","inputBounds","calculateInputRect","newInputBounds","getChildHeight","modalBodyContainer","modalBounds","onModalScroll","updateModalBounds","cleared","updateInputBounds","updatePosition","modalBodyRect","onLoseVisibility","_objectDestructuringEmpty","renderDividers","preventClose","onItemHover","onCompleteWord","wrapperHeight","suggestionBoxAlgn","pixelsToMoveX","pixelsToMoveY","latestPrefix","latestComplete","resetRequest","SearchChannelSuggestion","teammateIsBot","nameObject","itemToName","itemToTerm","isAtSearch","ch","isDirectChannel","isGroupChannel","sortChannelsByTypeListAndDisplayName","channelNames","datePrefix","dates","DAY_PICKER_ICONS","handleEscape","datePickerFocused","setDatePickerFocused","handleDayClick","dayString","UTC","getMonth","getDate","onMonthChange","getCurrentDateForTimezone","SearchUserSuggestion","userSearchFunc","doAutocomplete","usernamePrefix","handleMouseMove","preventSuggestionListCloseFlag","relatedTarget","forceSuggestionsWhenBlur","handleEmitClearSuggestions","requiredCharacters","shouldSearchCompleteText","composing","caret","keepPretext","termWithoutMatched","overlap","findOverlap","fixedTerm","finish","openCommandInModal","replaceText","addTextAtCaret","appProvider","openAppsModalFromCommand","ke","KeyboardEvent","bubbles","cancelable","keyCode","handleCompleteWord","setSelectionByDelta","delta","selectionIndex","hasSuggestions","selectPrevious","selectNext","nonDebouncedPretextChanged","newComponents","newPretext","onSuggestionsReceived","firstComplete","handleReceivedSuggestions","handled","makeHandleReceivedSuggestionsAndComplete","triggerCharacter","char","pxToSubstract","debouncedPretextChanged","handleFocusIn","handleFocusOut","placementShift","suggestionReadOut","contextId","dateComponent","SuggestionListComponent","SuggestionDateComponent","setContainerRef","onCompositionStart","handleCompositionStart","onCompositionUpdate","handleCompositionUpdate","onCompositionEnd","handleCompositionEnd","ariaLiveRef","getListPosition","preventSuggestionListClose","setSelection","focusInputOnEscape","aLower","bLower","onSearchTypeSelected","spellCheck","_this$props$inputRef","_current$clientHeight","_current","inputHeight","clientHeight","POST_MODAL_PADDING","SUGGESTION_LIST_MAXHEIGHT","visibleContentHeight","contentTop","contentTopPadding","getComputedCssProperty","contentBottomPadding","itemRefs","itemTop","offsetTop","itemBottomMargin","itemBottom","currentLabel","currentItem","updateMaxHeight","isEmptyObject","removeLabel","announceLabel","_this$props$ariaLiveR","textContent","_this$props$ariaLiveR2","property","getPropertyValue","getTransform","prevItemType","mainClass","contentClass","searchProfilesMatchingWithTerm","makeSearchProfilesMatchingWithTerm","ThreadsChannel","isRealChannel","isFakeChannel","isFakeDirectChannel","SwitchChannelSuggestion","dmChannelTeammate","badge","notify_props","unreadMentions","hasDraft","showSlug","unread","ConnectedSwitchChannelSuggestion","getPostDraft","sortChannelsByRecencyAndTypeAndDisplayName","quickSwitchSorter","globalStore","getChannelsInAllTeams","getDirectAndGroupChannels","removeChannelsFromArchivedTeams","formattedData","fetchUsersAndChannels","usersAsync","RestrictDirectMessage","searchAllChannels","nonAdminSearch","usersFromServer","localChannelData","localUserData","localFormattedData","remoteChannelData","getGroupChannels","remoteUserData","remoteFormattedData","RECEIVED_PROFILES_LIST","combinedTerms","combinedItems","userWrappedChannel","getIntl","skipNotMember","localData","curState","splitPrefixBySpace","usersInChannels","getUserIdsInChannels","userSearchStrings","usersInChannel","userString","lowerCaseSearch","every","searchPrefix","allUnreadChannelIds","getAllTeamsUnreadChannelIds","allUnreadChannelIdsSet","ARCHIVED_CHANNEL","MENTION_PUBLIC_CHANNELS","MENTION_PRIVATE_CHANNELS","threadItem","getThreadsItem","MENTION_GROUPS","isGroupChannelManuallyVisible","isChannelMuted","activeTeams","recentChannels","wrappedRecentChannels","wrapChannels","MENTION_RECENT_CHANNELS","unreadChannels","getSortedAllTeamsUnreadChannels","unreadChannelsExclMuted","sortedUnreadChannels","MENTION_UNREAD","sortedUnreadChannelIDs","sortedRecentChannels","threadsItem","sortedChannels","countType","itemType","counts","getThreadCountsInCurrentTeam","total_unread_threads","total_unread_mentions","getTimestampFromPrefs","myPreferences","getPreferenceKey","prefValue","getLastViewedAt","CATEGORY_CHANNEL_APPROXIMATE_VIEW_TIME","CATEGORY_CHANNEL_OPEN_TIME","channelList","moreChannels","privateChannelsDivider","AtMentionSuggestion","itemname","isCurrentUser","youElement","countBadge","profilesInChannelOptions","regexForAtMention","AtMentionProvider","autocompleteGroups","priorityProfiles","lastCompletedWord","lastPrefixWithNoResults","setProps","MENTION_SPECIAL","getProfileSuggestions","profileSuggestions","usernameSuggestions","getSuggestionsSplitByMultiple","AUTOCOMPLETE_SPLIT_CHARACTERS","getSuggestionsSplitBy","getGroupSuggestions","groupSuggestions","groupnameSuggestions","normalizeString","normalize","filterProfile","prefixLower","filterGroup","getProfilesWithLastViewAtInChannel","profilesInChannel","localMembers","createFromProfile","MENTION_MEMBERS","filterPriorityProfiles","localGroups","createFromGroup","remoteMembers","remoteGroups","remoteNonMembers","MENTION_NONMEMBERS","priorityProfilesIds","localUserIds","orderUsers","localAndRemoteMembers","localGroupIds","localAndRemoteGroups","orderGroups","updateMatches","resultCallback","showLoadingIndicator","MENTION_MORE_MEMBERS","groupsData","groupDivider","memberDivider","moreMembersDivider","nonmemberDivider","specialDivider","ChannelMentionSuggestion","_item$channel","_item$channel3","channelIcon","_item$channel2","ChannelMentionProvider","delayChannelAutocomplete","lastPrefixTrimmed","words","wrappedChannelIds","wrappedChannels","nameWords","matched","wordMatched","MENTION_CHANNELS","_item$channel4","handleChannels","withError","wrappedMoreChannels","_el$channel","_item$channel5","myChannelsDivider","CommandSuggestion","symbolSpan","DockWindowIcon","CommandProvider","appCommandParser","setChannelContext","getSuggestions","handleMobile","handleWebapp","getCommandsList","appCommandSuggestions","getSuggestionsBase","auto_complete","trigger","auto_complete_hint","auto_complete_desc","getCommandAutocompleteSuggestionsList","shouldAddExecuteItem","commandsDivider","AppCommandProvider","composeFormFromCommand","EMOJI_CATEGORY_SUGGESTION_BLOCKLIST","suggestionTypeEmoji","EmoticonSuggestion","EmoticonProvider","partialName","emoticon","Emoticons","EnableCustomEmoji","autocompleteCustomEmojis","findAndSuggestEmojis","formatEmojis","_state$entities","_state$entities$prefe","_state$entities$prefe2","recentMatched","skintone","alias","matchedArray","hasSystemEmoji","sortEmojisHelper","emojisDivider","ALL","VISIBLE","visibility","HIDDEN","_this$props$onKeyDown","_this$props$onMouseUp","_this$props$onKeyUp","_this$props$onBlur","_this$props4","_this$message$current","checkMessageLength","_this$getInputBox","wrapper","updateSuggestions","_this$preview$current","textboxClassName","handleMouseUp","handleKeyUp","getStyle","editHeader","helpTextClass","previewLink","makeMapStateToProps","getProfilesForThread","makeGetProfilesForThread","_ownProps$rootId","getAssociatedGroupsForReference","DelayChannelAutocomplete","hasDot","allowTextOverflow","margin_top","NewRepliesBanner","hasNewReplies","onClickMessage","updateThreadToastStatus","Toast","showActions","getHasNewRepliesSince","getPostsForThread","makeGetPostsForThread","_state","_threadId","lastViewed","makeGetHasNewRepliesSince","lastViewedBottom","canShow","AdvancedCreateComment","CreateComment","threadIsLimited","getLimitedViews","threads","isFakeDeletedPost","FAKE_PARENT_DELETED","RootPostDivider","Reply","a11yIndex","onCardClick","PostComponent","ThreadViewerRow","isRootPost","CombinedUserActivityPost","virtListStyles","willChange","overflowAnchor","innerStyles","BASE_THREADING_TIME","ThreadViewerVirtualized","replyListIds","newMessagesSeparatorIndex","getNewMessagesIndex","scrollUpdateWasRequested","updatedState","userScrolledToBottom","scrollShortCircuit","scrollStopAction","SCROLL_DELAY","visibleTopItem","topRhsPostId","getLatestPostId","visibleStartIndex","visibleStopIndex","overscanStartIndex","overscanStopIndex","updateFloatingTimestamp","postIndex","scrollToItemCorrection","nearIndex","scrollToBottom","basePaddingClass","previousItemId","nextItemId","isDateLine","isStartOfNewMessages","lastPost","isCreateComment","getPreviousPostId","useRelativeTimestamp","isNewMessagesVisible","handleToastDismiss","handleToastClick","getInitialPostIndex","initRangeToRender","innerRef","handleScrollStop","measureRhsOpened","_prevProps$directTeam","selectedPostFocusedAt","scrollToHighlightedPost","canLoadMorePosts","DynamicSizeList","initScrollToIndex","innerListStyle","getInnerStyles","scrollToFailed","handleScrollToFailed","overscanCountBackward","overscanCountForward","correctScrollToBottom","renderToast","inputPlaceholder","getRepliesListWithSeparators","makePrepareReplyIdsForThreadViewer","getThreadLastViewedAt","makeGetThreadLastViewedAt","postIds","showDate","NewMessagesSeparatorAction","DeferredThreadViewerVirt","_this$props$selected","reconnected","rootPostId","userThread","enableWebSocketEventScope","updateActiveThread","_this$props$selected2","markThreadRead","onInit","_prevProps$selected","_this$props$userThrea","_prevProps$userThread","_this$props$channel3","_prevProps$channel","_prevProps$selected2","socketConnectionStatus","selectedChanged","_this$props$channel4","morePostsToFetch","_this$props$selected3","_this$props$userThrea2","_this$props$selected4","_this$props$selected5","placeContent","getPostIdsForThread","makeGetPostIdsForThread","FeatureFlagWebSocketEventScope","getNewestPostThread","TODAY_YESTERDAY","within","TODAY_TITLE_CASE","equals","YESTERDAY_TITLE_CASE","TOMORROW_TITLE_CASE","STANDARD_UNITS","Today","Yesterday","week","quarter","arg","arg2","SemanticTime","toLocal","toISO","includeOffset","supportsHourCycle","Intl","DateTimeFormat","resolvedOptions","hourCycle","is12HourTime","defaultRefreshIntervals","normalizeRangeDescriptor","unit","isUnitDescriptor","prevValue","formatParts","relative","relFormat","dateFormat","timeFormat","isRelative","formatRelative","formatDateTime","momentValue","momentDate","momentTime","relNearest","truncateEndpoints","getDiff","round","formatRelativeTime","capitalize","caps","autoRange","_units$map$find","isWithin","updateIntervalInSeconds","getFormats","isValidElementType","isSameYear","nextUpdate","maybeUpdate","_ref6","formatLabel","unparsed","formats","timeZoneName","_ownProps$userTimezon","getCurrentTimezoneFull","useMilitaryTime","_ownProps$hour","UnreadAboveIcon","jumpDirection","toastClass","toast__visible","toastActionClass","toast__pointer","UnreadBelowIcon","onText","offText","overrideTestId","dataTestId","ariaLabelElement","dialogName","modalData","SKIPPED","AutoStatusSuffix","DISABLED","ChannelsTour","ONBOARDING_TUTORIAL_STEP_FOR_GUESTS","CRT_TUTORIAL_STEP","CRT_THREAD_PANE_STEP","AUTO_TOUR_STATUS","CREATE_AND_JOIN_CHANNELS","CrtTutorialSteps","WELCOME_POPOVER","LIST_POPOVER","UNREAD_POPOVER","TTNameMapToTourSteps","COMPOSING","getLastStep","Steps","maxStep","candidateMaxStep","MIN_SAFE_INTEGER","optOut","seenBefore","ChannelsTourTip","imageURL","hideBackdrop","tippyBlueStyle","currentStep","tourSteps","handleOpen","handleNext","handlePrevious","handleSkip","handleJump","useGetTourSteps","isAutoTourEnabled","handleActions","useHandleNavigationAndExtraActions","handleSaveDataAndTrackEvent","stepValue","eventSource","autoTour","handleEventPropagationAndDefault","handleSavePreferences","nextStep","jumpStep","useTourTipManager","prevBtn","nextBtn","lastStep","nextStepActions","openLhs","nextUrl","lastStepActions","stepToShow","CreateAndJoinChannelsTour","OnboardingTourTip","InvitePeopleTour","FirstChannel","firstChannelName","ChannelsAndDirectMessagesTour","_channelsByName$Const2","channelsByName","offTopicDisplayName","OFFTOPIC_CHANNEL","OFFTOPIC_CHANNEL_UI_NAME","townSquare","offTopic","ChannelsImg","CustomImg","UsernameMention","ChipContainer","PrewrittenChips","channelTeammateId","_getDirectTeammate","chips","customChip","messageToPrefill","PersonWithChecklistSvg","TrialBenefitsModalStep","openInvitePeopleModal","useOpenInvitePeopleModal","trialJustStartedTitle","trialJustStartedDeclaration","trialExpirationDate","guestAccountsLink","GUEST_ACCOUNTS","autoComplianceReportsLink","COMPLIANCE_EXPORT","mobileSecureNotificationsLink","PUSH_NOTIFICATION_CENTER","invitePeople","trialJustStartedScreen","ADLDAPUpsellBanner","confirmed","setConfirmed","isAdminUser","prevCloudTrialed","checkHadPriorTrial","prevTrialed","isSelfHostedProfessional","isCloudProfessional","currentLicenseEndDate","confirmBanner","endDate","btn","UserGroupsFilter","selectedFilter","getGroups","allGroupsOnClick","myGroupsOnClick","archivedGroupsOnClick","filterLabel","UserGroupsList","groupPermissionsMap","loadMoreGroups","overflowState","setOverflowState","archiveGroup","restoreGroup","goToViewGroupModal","groupListItemIndex","can_delete","can_restore","getGroupListPermissions","UserGroupsModalHeader","goToCreateModal","USER_GROUPS_CREATE","canCreateCustomGroups","CREATE_CUSTOM_GROUP","setSearchTimeoutId","setSelectedFilter","groupsFull","setGroupsFull","setGroups","groupType","myGroupsPage","setMyGroupsPage","archivedGroupsPage","setArchivedGroupsPage","usePagingMeta","myGroups","archivedGroups","groupsParams","include_archived","groupsUserParams","filter_has_member","getGroupsByUserIdPaginated","filter_archived","newPage","noResultsType","getMyAllowReferencedGroups","makeGetMyAllowReferencedGroups","searchAllowReferencedGroups","searchMyAllowReferencedGroups","searchArchivedGroups","getArchivedGroups","cachedUserNameColors","isShared","userStyle","userColor","cacheKey","cachedColor","contrastRatio","userAndSalt","checker","ColorContrastChecker","colorHash","ColorHash","backgroundLuminance","hexToLuminance","tries","hex","cr","getContrastRatio","generateColor","userIsRemote","UserSettingsModalAsync","sendEmailNotifications","requireEmailVerification","RequireEmailVerification","adminMode","getUserSelector","userPreferences","getUserPreferencesSelector","pluginSettings","getPluginUserSettings","sendVerificationEmail","getUserPreferences","ViewUserGroupListItem","removeUserFromGroup","decrementMemberCount","removeUsersFromGroup","permissionToLeaveGroup","getGroupById","haveIGroupPermission","MANAGE_CUSTOM_GROUP_MEMBERS","AddUsersToGroupModal","setSaving","setUsersToAdd","setShowUnknownError","addUsersToGroup","not_in_group_id","titleValue","UpdateUserGroupModal","hasUpdated","setHasUpdated","setMention","setMentionInputErrorText","setNameInputErrorText","setMentionUpdatedManually","newMention","patchGroup","onSaveClick","onBackClick","ViewUserGroupHeaderSubMenu","isGroupMember","incrementMemberCount","goToEditGroupModal","EDIT_GROUP_MODAL","leaveGroup","joinGroup","permissionToEditGroup","permissionToJoinGroup","permissionToArchiveGroup","ViewUserGroupModalHeader","permissionToRestoreGroup","goToAddPeopleModal","ADD_USERS_TO_GROUP","showSubMenu","modalTitle","addPeopleButton","restoreGroupButton","isMyGroup","EDIT_CUSTOM_GROUP","DELETE_CUSTOM_GROUP","RESTORE_CUSTOM_GROUP","_props$group","startLoad","_this$divScrollRef$cu","_this$divScrollRef$cu2","_this$divScrollRef$cu3","divScrollRef","getGroupMembers","_prevProps$group","_this$props$group","_this$props$group2","setMemberCount","searchProfilesInGroup","getProfilesInGroup","inputSuffix","wrapperClassName","handleOnFocus","handleOnBlur","limitExceeded","CloseCircleIcon","generateInput","placeholderValue","MenuHeader","MenuCloudTrial","freeTrialEndDay","openTrialBenefitsModal","freeTrialContent","trialEndDay","openModalLink","noFreeTrialContent","MenuItemActionImpl","MenuItem__dangerous","MenuItemAction","LHSNearingLimitsModal","_limits$messages$hist","_limits$files$total_s","CLOUD_LIMITS","planName","fallbackStarterLimits","storage","MenuItemCloudLimit","usageRatio","callToAction","featureToNotifyOn","UNLIMITED_MESSAGES","UNLIMITED_FILE_STORAGE","reached","useWords","itemClass","MenuItemExternalLinkImpl","MenuItemExternalLink","MenuItemLinkImpl","MenuItemLink","MenuItemToggleModalReduxImpl","MenuItemToggleModalRedux","FreeVersionBadge","MenuStartTrial","UNSUPPORTED","SubMenuItem","isMobileViewHack","selectedValueText","styleSelectableItem","renderSelected","textProp","hasSubmenu","subMenuStyle","menuOffset","subMenuContent","hasDivider","aria","styleSelectableItemDiv","subMenuClass","prevWasDivider","isAtBeginning","attributes","childList","subtree","MutationObserver","hideUnneededDividers","handleMenuClick","_props$divider","FeatureRestrictedModal","customSecondaryButton","hasPriorTrial","FEATURE_RESTRICTED_MODAL","notifyAdminBtnText","notifyRequestStatus","showStartTrial","secondaryBtnMsg","secondaryBtnAction","trialBtn","highlight","linkEvaluation","single","useModal","tooltipMessageBlocked","ctaExtraContent","clickCallback","customSecondaryButtonInModal","getTooltipMessageBlocked","article","_s$charAt","replaceAll","handleClickCallback","MenuWrapperAnimation","closeOnBlur","addEventListeners","removeEventListeners","keyboardClose","Animation","animationComponent","isContentInline","titleComponent","descriptionComponent","inline","titleSuffix","SizeMap","xs","sm","md","lg","popoverSize","popoverStyle","onMouseOut","BSPopover","bsStyle","bsSize","INPUT_TYPES","resize","inputType","TagWrapper","TagText","iconSize","fallbackSrc","isURLForUser","replaceURLWithDefaultImageURL","BotDefaultIcon","UserAvatar","profilePictureURL","displayUserIds","overflowUserIds","overflowUnnamedCount","nonDisplayCount","breakAt","displayItems","overflowItems","countMeta","avatarStyle","tinycolor","mix","toRgbString","overflowUsersTooltip","TooltipContent","TooltipShortcut","arrowRef","placements","OverlayArrow","OFFSET","arrow","CURSOR_REST_TIME_BEFORE_OPEN","CURSOR_MOUSEOVER_TO_OPEN","CURSOR_MOUSEOUT_TO_CLOSE_WITH_DELAY","CURSOR_MOUSEOUT_TO_CLOSE","useFocus","isValidElement","mergedRefs","useMergeRefs","cloneElement","FloatingArrow","WIDTH","HEIGHT","getLogs","serverNames","logLevels","dateFrom","dateTo","logFilter","server_names","log_levels","date_from","date_to","RECEIVED_LOGS","getPlainLogs","LOGS_PAGE_SIZE_DEFAULT","RECEIVED_PLAIN_LOGS","getAudits","PAGE_SIZE_DEFAULT","RECEIVED_AUDITS","RECEIVED_CONFIG","patchConfig","getEnvironmentConfig","RECEIVED_ENVIRONMENT_CONFIG","testEmail","invalidateCaches","recycleDatabase","createComplianceReport","onRequest","CREATE_COMPLIANCE_REQUEST","RECEIVED_COMPLIANCE_REPORT","CREATE_COMPLIANCE_SUCCESS","onFailure","CREATE_COMPLIANCE_FAILURE","getComplianceReports","RECEIVED_COMPLIANCE_REPORTS","imageData","RECEIVED_CLUSTER_STATUS","testLdap","getLdapGroups","PAGE_SIZE_MAXIMUM","RECEIVED_LDAP_GROUPS","linkLdapGroup","LINK_LDAP_GROUP_FAILURE","LINKED_LDAP_GROUP","primary_key","mattermost_group_id","has_syncables","unlinkLdapGroup","UNLINK_LDAP_GROUP_FAILURE","UNLINKED_LDAP_GROUP","fileData","deletePublicSamlCertificate","deletePrivateSamlCertificate","deletePublicLdapCertificate","deletePrivateLdapCertificate","deleteIdpSamlCertificate","testElasticsearch","purgeElasticsearchIndexes","uploadLicense","removeLicense","PREV_TRIAL_LICENSE_SUCCESS","getAnalytics","RECEIVED_SYSTEM_ANALYTICS","RECEIVED_TEAM_ANALYTICS","uploadPlugin","force","installPluginFromUrl","RECEIVED_PLUGINS","REMOVED_PLUGIN","DISABLED_PLUGIN","enablePlugin","ENABLED_PLUGIN","disablePlugin","DISABLE_PLUGIN_REQUEST","RECEIVED_SAML_METADATA_RESPONSE","getDataRetentionCustomPolicies","RECEIVED_DATA_RETENTION_CUSTOM_POLICIES","getDataRetentionCustomPolicy","RECEIVED_DATA_RETENTION_CUSTOM_POLICY","deleteDataRetentionCustomPolicy","DELETE_DATA_RETENTION_CUSTOM_POLICY_FAILURE","DELETE_DATA_RETENTION_CUSTOM_POLICY_SUCCESS","getDataRetentionCustomPolicyTeams","TEAMS_CHUNK_SIZE","RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS","getDataRetentionCustomPolicyChannels","RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS","searchDataRetentionCustomPolicyTeams","RECEIVED_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SEARCH","searchDataRetentionCustomPolicyChannels","RECEIVED_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SEARCH","createDataRetentionCustomPolicy","policy","createDataRetentionPolicy","CREATE_DATA_RETENTION_CUSTOM_POLICY_SUCCESS","updateDataRetentionCustomPolicy","updateDataRetentionPolicy","UPDATE_DATA_RETENTION_CUSTOM_POLICY_SUCCESS","addDataRetentionCustomPolicyTeams","addDataRetentionPolicyTeams","ADD_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SUCCESS","removeDataRetentionCustomPolicyTeams","removeDataRetentionPolicyTeams","REMOVE_DATA_RETENTION_CUSTOM_POLICY_TEAMS_FAILURE","REMOVE_DATA_RETENTION_CUSTOM_POLICY_TEAMS_SUCCESS","addDataRetentionCustomPolicyChannels","addDataRetentionPolicyChannels","ADD_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SUCCESS","removeDataRetentionCustomPolicyChannels","removeDataRetentionPolicyChannels","REMOVE_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_FAILURE","REMOVE_DATA_RETENTION_CUSTOM_POLICY_CHANNELS_SUCCESS","getAppliedSchemaMigrations","ipFilters","RECEIVED_APP_BINDINGS","FAILED_TO_FETCH_APP_BINDINGS","currentChannelID","RECEIVED_APP_RHS_BINDINGS","getSubscription","CLOUD_SUBSCRIPTION_FAILED","CLOUD_SUBSCRIPTION_REQUEST","includeLegacyProducts","RECEIVED_CLOUD_PRODUCTS","CLOUD_PRODUCTS_FAILED","CLOUD_PRODUCTS_REQUEST","RECEIVED_CLOUD_CUSTOMER","CLOUD_CUSTOMER_FAILED","CLOUD_CUSTOMER_REQUEST","RECEIVED_CLOUD_INVOICES","CLOUD_INVOICES_FAILED","CLOUD_INVOICES_REQUEST","updateCloudCustomer","customerPatch","updateCloudCustomerAddress","address","createIncomingHook","createIncomingWebhook","RECEIVED_INCOMING_HOOK","getIncomingHook","hookId","getIncomingWebhook","getIncomingHooks","includeTotalCount","getIncomingWebhooks","isWebhooksWithCount","isIncomingWebhooksWithCount","RECEIVED_INCOMING_HOOKS","incoming_webhooks","RECEIVED_INCOMING_HOOKS_TOTAL_COUNT","total_count","removeIncomingHook","removeIncomingWebhook","DELETED_INCOMING_HOOK","updateIncomingHook","updateIncomingWebhook","createOutgoingHook","createOutgoingWebhook","RECEIVED_OUTGOING_HOOK","getOutgoingHook","getOutgoingWebhook","getOutgoingHooks","getOutgoingWebhooks","RECEIVED_OUTGOING_HOOKS","removeOutgoingHook","removeOutgoingWebhook","DELETED_OUTGOING_HOOK","updateOutgoingHook","updateOutgoingWebhook","regenOutgoingHookToken","getCustomTeamCommands","RECEIVED_CUSTOM_TEAM_COMMANDS","addCommand","RECEIVED_COMMAND","editCommand","regenCommandToken","RECEIVED_COMMAND_TOKEN","deleteCommand","DELETED_COMMAND","addOAuthApp","createOAuthApp","RECEIVED_OAUTH_APP","editOAuthApp","getOAuthApps","RECEIVED_OAUTH_APPS","getOutgoingOAuthConnections","RECEIVED_OUTGOING_OAUTH_CONNECTIONS","getOutgoingOAuthConnectionsForAudience","audience","addOutgoingOAuthConnection","connection","createOutgoingOAuthConnection","RECEIVED_OUTGOING_OAUTH_CONNECTION","editOutgoingOAuthConnection","getOutgoingOAuthConnection","validateOutgoingOAuthConnection","getAppsOAuthAppIDs","RECEIVED_APPS_OAUTH_APP_IDS","getAppsBotIDs","RECEIVED_APPS_BOT_IDS","getOAuthApp","appId","getAuthorizedOAuthApps","deauthorizeOAuthApp","deleteOAuthApp","DELETED_OAUTH_APP","regenOAuthAppSecret","deleteOutgoingOAuthConnection","DELETED_OUTGOING_OAUTH_CONNECTION","RECEIVED_JOB","getJobsByType","JOBS_CHUNK_SIZE","RECEIVED_JOBS","RECEIVED_JOBS_BY_TYPE","cancelJob","deviceTimezone","currentTimezone","newTimezoneExists","updatedUser","updateMe","TrackProfessionalSKU","TrackEnterpriseSKU","TrackPassiveKeywordsFeature","TrackPassiveKeywordsEvent","TrackActionCategory","appsFeatureFlagEnabled","pluginEnabled","featureFlagEnabled","appBarEnabled","DisableAppBar","areAppsEnabled","getChannelHeaderAppBindings","CHANNEL_HEADER_ICON","channelHeaderBindings","getAppBarAppBindings","APP_BAR","appBarBindings","appIds","backwardsCompatibleBindings","forms","limitsLoaded","getCloudInvoices","product_id","getSubscriptionProductName","_getSubscriptionProdu","emptyList","makeGetScheduledPostsByTeam","byId","includeDirectChannels","byTeamId","directChannels","scheduledPostsById","teamScheduledPostsIDs","directChannelScheduledPostsIDs","extractor","scheduledPostId","getScheduledPostsByTeamCount","_state$entities$sched","_state$entities$sched2","hasScheduledPostError","_state$entities$sched3","_state$entities$sched4","errorsByTeamId","channelOrThreadId","eligibleScheduledPosts","byChannelOrThreadId","error_code","ScheduledPosts","getAllDmChannels","allDmChannels","min_length","minLength","removeWebappPlugin","hideRHSPlugin","REMOVED_WEBAPP_PLUGIN","manifestId","rhsPlugins","RightHandSidebarComponent","getPluggableId","hideRHSPluginAction","arePluginsEnabled","PluginsEnabled","NAME_DISABLE_CLIENT_PLUGINS","loadErr","trackPluginInitialization","getWebappPlugins","RECEIVED_WEBAPP_PLUGINS","regeneratorRuntime","registerPlugin","oldPlugin","uninitialize","loadedPlugins","describePlugin","reject","_oldManifest$webapp","_manifest$webapp","_manifest$webapp2","oldManifest","webapp","bundle_path","bundlePath","script","createElement","defer","initializePlugin","getElementsByTagName","appendChild","_script$parentNode","deinitialize","parentNode","removeChild","oldManifests","newManifests","newManifest","WrapperDiv","PluggableErrorBoundary","getDerivedStateFromError","clearErrorState","pluginComponents","pc","reArg","keyOrder","func","isConfigObjectArg","isPlainObject","objKeys","keysMatch","intersection","zipObject","defaultShouldRender","dispatchPluginComponentAction","RECEIVED_PLUGIN_COMPONENT","resolveReactElement","standardizeRoute","fixedRoute","globalAppBar","globalRhs","_ref7","buttonComponent","suggestionsComponent","hintsComponent","_ref8","_ref9","_ref10","dropdownText","_ref11","_ref12","dropdownButton","_ref13","_ref14","RECEIVED_PLUGIN_POST_CARD_COMPONENT","_ref15","_ref16","_ref17","_ref18","_ref19","_ref20","_ref21","_ref22","_ref23","_ref24","_ref25","registerMenuItem","parentMenuId","innerText","innerAction","innerFilter","rootRegisterMenuItem","_ref26","_ref27","_ref28","_ref29","REMOVED_PLUGIN_COMPONENT","_ref30","REMOVED_PLUGIN_POST_COMPONENT","_ref31","reducerRegistry","register","_ref32","_ref33","_ref34","_ref35","_ref36","_ref37","_ref38","override","_ref39","getTranslationsForLocale","_ref40","_ref41","_ref42","_ref43","showRHSPlugin","toggleRHSPlugin","_ref44","_ref45","_ref46","mainComponent","headerCentreComponent","headerRightComponent","showAppBar","_ref47","_ref48","_ref49","_ref50","_ref51","supportedProductIds","rhsComponent","rhsTitle","registeredRhsComponent","registerRightHandSidebarComponent","rhsComponentId","_ref52","RECEIVED_PLUGIN_STATS_HANDLER","_ref53","_ref54","setting","RECEIVED_PLUGIN_USER_SETTINGS","unregisterReconnectHandler","CALLS_PLUGIN","suitePluginIds","minVersion","isCallsRingingEnabledOnServer","_state$CALLS_PLUGIN","_state$CALLS_PLUGIN$c","callsConfig","EnableRinging","_state$CALLS_PLUGIN2","sessions","_state$CALLS_PLUGIN3","getCallsChannelState","localStorageStore","getPenultimateViewedChannelName","getLastViewedChannelNameByTeamName","getTeamByName","getLastViewedTypeByTeamName","getPreviousTeamLastViewedType","previousTeamID","getFirstChannelName","getString","AB_TEST_PREFERENCE_VALUE","RecommendedNextStepsLegacy","CREATE_FIRST_CHANNEL","COMPLETE_PROFILE","TEAM_SETUP","NOTIFICATION_SETUP","PREFERENCES_SETUP","INVITE_MEMBERS","DOWNLOAD_APPS","isStepForUser","getSteps","firstAdmin","getNextStepsPreferences","RECOMMENDED_NEXT_STEPS","hasLegacyNextStepsPreferences","stepPreferences","mySteps","getShowTaskListBool","onboardingPreferences","legacyStepsPreferences","taskListStatus","hasAnyOfTheLegacyStepsPreferences","hasUserStartedOnboardingTaskListProcess","hasSkipLegacyStepsPreference","SKIP","hideLegacyStepsSetToFalse","hasSkippedLegacySteps","hasCompletedLegacySteps","existingUserHasntFinishedNorSkippedLegacyNextSteps","userSettings","FilesDropdown","getChannelHeaderPluginComponents","ChannelHeaderButton","channelHeaderComponents","appBarComponents","appBarPluginIds","appBarComponent","channelHeaderComponent","getChannelHeaderMenuPluginComponentsShouldRender","ChannelHeader","getChannelHeaderMenuPluginComponents","createShallowSelector","componentShouldRender","getChannelIntroPluginButtons","ChannelIntroButton","getAppBarPluginComponents","showNewChannelWithBoardPulsatingDot","pulsatingDotState","NEW_CHANNEL_WITH_BOARD_TOUR_SHOWED","SearchButtons","selectCurrentProduct","getCurrentProduct","selectProducts","selectCurrentProductId","_selectCurrentProduct","_selectCurrentProduct2","navigationBlock","showNavigationPrompt","getNeedsLoggedInLimitReachedCheck","needsLoggedInLimitReachedCheck","getAdminConsoleUserManagementTableProperties","adminConsoleUserManagementTableProperties","lastGetPosts","toastStatus","modalStateObject","findOpenModal","isLocalStorageSupported","logoutId","DELINQUENCY","sessionStorage","removeItem","isSignallingLogout","isSignallingLogin","hasCheckedLocalStorage","localStorageSupported","ErrorPageTypes","LOCAL_STORAGE","LANDING_PAGE_SEEN","landingPageSeen","getLandingPreference","siteUrl","LANDING_PREFERENCE","setLandingPreferenceToMattermostApp","LandingPreferenceTypes","MATTERMOSTAPP","setLandingPreferenceToBrowser","BROWSER","clearLandingPreference","HIDE_NOTIFICATION_PERMISSION_REQUEST_BANNER","_draft$uploadsInProgr","hasMessage","hasAttachment","hasUploadingFiles","scheduledPostToPostDraft","_scheduledPost$metada","LhsPage","listenerOptions","getAllRegions","getAllModals","getAllPopups","HTMLElement","lastInputEventIsKeyboard","modifierKeys","lastInputEventIsKeyDown","tabKeyIsPressed","TILDE","regions","tildeKeyIsPressed","previousRegion","nextRegion","f6KeyIsPressed","navigationInProgress","sections","upArrowKeyIsPressed","shouldReverseSections","nextSection","previousSection","downArrowKeyIsPressed","escKeyIsPressed","enterKeyIsPressed","nodeName","L","lKeyIsPressed","resetInterractionStates","mouseIsPressed","windowIsFocused","nextElement","composedPath","isA11yFocusEventDetail","manualFocus","updateActiveRegion","focusedElement","activeRegion","udpateCurrentFocus","updateActiveSection","activeSection","updateActiveElement","KEY_UP","handleMouseClick","MOUSE_DOWN","handleMouseDown","MOUSE_UP","handleA11yFocus","BLUR","handleWindowBlur","clearActiveRegion","clearCurrentFocus","originElement","isElementValid","modalIsOpen","popupIsOpen","domElements","sortElementsByAttributeOrder","regionHTMLCollection","elementIsVisible","sectionHTMLCollection","activeRegionIndex","activeSectionIndex","getOrderReverseAttribute","a11yKeyIsPressed","modalHTMLCollection","popupHTMLCollection","disableNavigation","A11yAttributeNames","DISABLE_NAVIGATION","newRegion","resetNavigation","setActiveRegion","setCurrentFocus","shouldLoopNavigation","getLoopNavigationAttribute","newSection","setActiveSection","section","elementPath","pathElement","REGION","SECTION","setActiveElement","restoreOriginFocus","canFocusChild","handleActiveRegionUpdate","getAllSectionsForRegion","getFocusChildAttribute","clearActiveSection","handleActiveSectionUpdate","clearActiveElement","handleActiveElementUpdate","ACTIVE","_this$focusedElement","forceUpdate","FOCUSED","blurActiveElement","elementA","elementB","elementAOrder","SORT_ORDER","elementBOrder","offsetParent","attributeValue","LOOP_NAVIGATION","ORDER_REVERSE","FOCUS_CHILD","invalidElements","appsPluginID","appID","postID","defaultExpand","rawCommand","raw_command","expiryYear","payment_method","exp_year","exp_month","ZendeskSupportForm","ZendeskFormFieldIDs","buildZendeskSupportForm","formFieldIDs","formUrl","formPrefill","val","SELF_HOSTED_SUPPORT_FORM","SELF_HOSTED_ENVIRONMENT","workspaceURL","CLOUD_SUPPORT_FORM","EMAIL","SUBJECT","DESCRIPTION","CLOUD_WORKSPACE_URL","encodeString","Buffer","businessEmail","medium","shouldTruncate","momentA","momentB","isSameMonth","subtract","yesterday","setDate","inputDate","fire","FileSizes","Bit","Byte","Kilobyte","Megabyte","Gigabyte","enableFileAttachments","isFileAttachmentsEnabled","enableMobileFileUpload","EnableMobileFileUpload","isMobileFileUploadsEnabled","EnableFileAttachments","isPublicLinksEnabled","EnableMobileFileDownload","MAX_FILENAME_LENGTH","mimetype","mimeTypeSplitBySlash","mimeTypePrefix","mimeTypeSuffix","getExifOrientation","view","DataView","getUint16","byteLength","marker","getUint32","little","tags","getOrientationStyles","exif2css","cache","createIntlCache","createIntl","descriptor","messageOrDescriptor","messageOrComponent","getMonthLong","LICENSE_EXPIRY_NOTIFICATION","LICENSE_GRACE_PERIOD","StartsAt","getIsStarterLicense","Starter","getIsGovSku","isEnterpriseOrE20License","E20","isEnterpriseLicense","isNonEnterpriseLicense","licenseSKUWithFirstLetterCapitalized","isStarterSKULicense","SelfHostedProducts","bits","hasSomeLimits","freeze","applyBoldItalicMarkdown","applyBoldMarkdown","applyItalicMarkdown","DEFAULT_PLACEHOLDER_URL","delimiterStart","delimiterEnd","newStart","newEnd","spaceBefore","spaceAfter","cursorBeforeWord","cursorAfterWord","findWordEnd","findWordStart","wordStart","wordEnd","applyLinkMarkdown","applyOlMarkdown","applyMarkdownToSelectedLines","applyMarkdownToSelection","isSelectionMultiline","applyCodeMarkdown","getMultilineSuffix","getNewSuffix","newPrefix","multilineSuffix","newSuffix","getDelimiter","counter","multilineSelection","isFirstLineSelected","getHasCurrentMarkdown","linesQuantity","newLinesWithDelimitersQuantity","selectionArr","multilinePrefix","openingDelimiter","closingDelimiter","hasCurrentMarkdown","BOLD_MD","isForceItalic","isForceBold","isItalicFollowedByBold","AtPlanMention","MembersContainer","unknownUser","NotificationFromMembersModal","displaySetting","SUM_OF_MEMBERS_MODAL","START_CALL","PLAYBOOKS_RETRO","ALL_PROFESSIONAL_FEATURES","UPGRADE_DOWNGRADED_WORKSPACE","HIGHLIGHT_WITHOUT_NOTIFICATION","mapFeatureIdToTranslation","AtSumOfMembersMention","requestedFeature","CodeBlock","language","searchedContent","getUsedLanguage","usedLanguage","lineNumbers","SyntaxHighlighting","setContent","TextFormatting","shouldSetContent","htmlContent","codeBlockActions","CodeBlockAction","LatexBlock","enableLatex","katex","setKatex","katexOptions","throwOnError","displayMode","maxSize","maxExpand","fleqn","renderToString","EnableLatex","LatexInline","enableInlineLatex","katexModule","EnableInlineLatex","toggleInlineImageVisibility","imageKey","isInlineImageVisible","handleToggleButtonClick","MarkdownImage","widthNumber","_this$props$imageMeta","_this$props$imageMeta2","imageIsLink","loadFailed","prevSrc","onUpdated","isHeaderChangeMessage","brokenImageIcon","isUnsafeLinksPost","safeSrc","loadingClass","imageElement","handleLoadFail","getHeight","EXPANDABLE_INLINE_IMAGE_MIN_HEIGHT","MarkdownImageExpand","unsafe_links","PluginLinkTooltip","allowedPlacements","hoverInteractions","HOVER_PROPS","focusInteractions","nodeAttributes","move","requireIntent","PostEmoji","emojiText","backgroundImageUrl","Parser","processNodeDefinitions","ProcessNodeDefinitions","processingInstructions","replaceChildren","shouldProcessNode","attribs","processNode","convertPropsToReactStandard","mentionAttrib","emojiAttrib","_node$attribs","latex","inlinelatex","processDefaultNode","parseWithInstructions","propsToConvert","newProps","minimumOverSeats","OverActiveUserLimits","MIN","maximumOverSeats","MAX","execCommandInsertText","turndownService","TurndownService","emDelimiter","use","tables","getHtmlTable","table","DOMParser","parseFromString","parseHtmlTable","hasHtmlLink","isGitHubCodeBlock","tableClassName","formatMarkdownMessage","formattedMarkdown","turndown","querySelectorAll","isTableWithoutHeaderRow","newLineLimiter","formatGithubCodePaste","isTextSelected","splitMessageBasedOnTextSelection","requireEndLF","formattedCodeBlock","hasSelection","isNil","hasTextUrl","clipboardText","isTextUrl","hasHTMLLinks","htmlTable","shouldApplyLinkMarkdown","shouldApplyGithubCodeBlock","formattedLink","selectedText","clipboardUrl","FORMATTED_LINK_URL_PREFIX","FORMATTED_LINK_URL_SUFFIX","textBefore","textAfter","formatMarkdownLinkMessage","getAsFile","ext","getHours","padStart","getMinutes","File","ID_PATH_PATTERN","IDENTIFIER_PATH_PATTERN","_products$find","exact","strict","inScope","predicate","filterProductsRecord","PAGE_NOT_FOUND","mfaPaths","mfaAuthServices","MFA","EnableMultifactorAuthentication","EnforceMultifactorAuthentication","GuestAccountsEnforceMultifactorAuthentication","mfa_active","auth_service","skuShortName","isGovSku","skuName","E10","HighlightedLanguages","lang","getLanguageFromNameOrAlias","languageName","languageImports","1c","actionscript","applescript","bash","clojure","coffeescript","cpp","csharp","dart","delphi","django","dockerfile","elixir","erlang","fortran","fsharp","gcode","go","groovy","handlebars","haskell","haxe","java","javascript","json","julia","kotlin","less","lisp","lua","makefile","matlab","objectivec","ocaml","perl","pgsql","php","plaintext","powershell","puppet","python","ruby","rust","scala","scheme","scss","smalltalk","sql","stylus","swift","typescript","vbnet","vbscript","verilog","vhdl","vtt","xml","yaml","hlJS","registerLanguage","renderLineNumbers","numberOfLines","getLanguageFromFileExtension","canHighlight","getLanguageName","langName","teamsOrderList","customSortedTeams","otherTeams","compareTeamsByDisplayName","makeNewTeam","scheme_id","wsClient","exports","supported_product_ids","products_1","isProductScope","role_id","depends_on_team","depends_on_channel","depends_on_user","depends_on_post","utilities_1","cancel_button","isAppField","isAppCall","depends_on","isAppForm","Permission","acting_user_access_token","mentioned","parent_post","root_post","isAppExpand","isAppSelectOption","isAppFormValue","hashtags","original_id"],"sourceRoot":""}