{"version":3,"file":"js/app.js","mappings":"UAAIA,E,mBCAJ,IAAIC,EAAM,CACT,+BAAgC,MAChC,+BAAgC,MAChC,yBAA0B,MAC1B,sBAAuB,MACvB,sBAAuB,MACvB,sBAAuB,MACvB,gBAAiB,MACjB,aAAc,MACd,kBAAmB,MACnB,uBAAwB,MACxB,0BAA2B,OAI5B,SAASC,EAAeC,GACvB,IAAIC,EAAKC,EAAsBF,GAC/B,OAAOG,EAAoBF,EAC5B,CACA,SAASC,EAAsBF,GAC9B,IAAIG,EAAoBC,EAAEN,EAAKE,GAAM,CACpC,IAAIK,EAAI,IAAIC,MAAM,uBAAyBN,EAAM,KAEjD,MADAK,EAAEE,KAAO,mBACHF,CACP,CACA,OAAOP,EAAIE,EACZ,CACAD,EAAeS,KAAO,WACrB,OAAOC,OAAOD,KAAKV,EACpB,EACAC,EAAeW,QAAUR,EACzBS,EAAOC,QAAUb,EACjBA,EAAeE,GAAK,K,2hCC/BPY,EAAuB,uBACvBC,EAAuB,uBAIvBC,EAAsB,sBAEtBC,EAAqB,qBACrBC,EAAqB,qBACrBC,EAAqB,qBAGrBC,EAAsB,sBACtBC,EAAsB,sBACtBC,EAAsB,sBAEtBC,EAAqB,qBACrBC,GAAqB,qBACrBC,GAAqB,qBACrBC,GAA2B,2BAG3BC,GAAe,eACfC,GAAe,eACfC,GAAc,cACdC,GAAc,cACdC,GAAc,cACdC,GAAc,cACdC,GAAc,cAEdC,GAAoB,oBAOpBC,GAAc,cACdC,GAAkB,kBAClBC,GAAkB,kBAClBC,GAAkB,kBAClBC,GAAkB,kBAClBC,GAAkB,kBAElBC,GAAmB,mBACnBC,GAAmB,mBAInBC,GAAe,eACfC,GAAmB,mBAEnBC,GAAoB,oBAEpBC,GAAgB,gBAEhBC,GAAkB,kBAElBC,GAAqB,qBACrBC,GAAyB,yBACzBC,GAAwB,wBAExBC,GAAc,cACdC,GAAoB,oBACpBC,GAAkB,2BAClBC,GAAmB,mBACnBC,GAA0B,0BAC1BC,GAAoB,oBACpBC,GAA2B,2BAE3BC,GAAmB,wBACnBC,GAAkB,uBAIlBC,GAA8B,8BAC9BC,GAA8B,8BAC9BC,GACX,qCAEWC,GAAgB,gBAChBC,GAAgB,gBAChBC,GAAsB,sBACtBC,GAAe,eAGfC,GAAwB,wBACxBC,GAAuB,uBAEvBC,GAAgB,gBAChBC,GAAe,eACfC,GAAqB,qBAGrBC,GAAmB,mBACnBC,GAAmB,mBACnBC,GAAkB,kBAClBC,GAAkB,kBAClBC,GAAkB,kBAClBC,GAAkB,kBAClBC,GAAoB,oBACpBC,GAAkB,kBAClBC,GAAkB,kBAClBC,GAA4B,4BAE5BC,GAAyB,yBACzBC,GAAwB,wBACxBC,GAAsB,sBAEtBC,GAAyB,yBAKzBC,GACX,kCAIWC,GAAiC,iCAGjCC,GAAwB,wBAGxBC,GAAuB,uBACvBC,GAAuB,uBACvBC,GAA6B,6BAC7BC,GAAyB,yBAEzBC,GAA0B,0BAC1BC,GAAyB,yBACzBC,GAAuB,uBAOvBC,GACX,kCACWC,GACX,kCAGWC,GACX,kCACWC,GACX,kCACWC,GAAe,eACfC,GAAmB,mBACnBC,GAAmB,mBAEnBC,GAAqB,qBACrBC,GAAqB,qBAIrBC,GAAmB,mBAGnBC,GAAiB,iBAGjBC,GAAgB,gBAChBC,GAAiB,iBACjBC,GAAmB,mBAEnBC,GAAgB,gBAGhBC,GAAkB,kBAClBC,GAAe,eAGfC,GAAqB,qBACrBC,GAAyB,yBAEzBC,GAAU,eACVC,GAAS,cACTC,GAAiB,sBACjBC,GAAc,mBAEdC,GAAe,eACfC,GAAgB,gBAEhBC,GAAc,mBACdC,GAAe,oBCvL5B,SAAe,SACTC,EAAKC,GACP,OAAO,SAAAC,GACL,IAAMC,EAASC,KAAKC,MACpBH,EAAS,CAAEI,KAAMhB,GAAoBiB,aAAc,CAAEP,IAAAA,EAAKC,MAAAA,EAAO1H,GAAI4H,IACtE,CACF,EANH,GAAe,YAQC,IAAL5H,EAAK,EAALA,GACP,MAAO,CAAE+H,KAAMf,GAAwBhH,GAAAA,EACxC,E,uDCsCI,SAASiI,GAAmBjI,GACjC,MAAO,GAAP,OAJO,gBAIP,YAA+BA,EAChC,CAaM,SAASkI,GAAelI,GAC7B,MAAO,aAAP,OAAoBA,EACrB,CAiBM,SAASmI,GAAqBC,GACnC,MAAO,GAAP,OAXO,gBAWP,YAA+BA,EAChC,CAqBM,SAASC,GAAkBC,GAChC,MAAO,GAAP,OA1GO,YA0GP,YAA2BA,EAAItI,GAA/B,mBACD,CAsBM,SAASuI,GAA+BC,GAC7C,MAAO,GAAP,OApDK,SAAwBA,GAC7B,MAAO,GAAP,OAPO,gBAOP,YAA+BA,EAAQJ,KACxC,CAkDWK,CAAeD,GAAzB,QACD,CAMM,SAASE,GAAWC,GACzB,MAAO,aAAP,OAAoBA,EAAI3I,GACzB,CA4DM,SAAS4I,GAAkBC,GAChC,MAAO,oBAAP,OAA2BA,EAAWT,KACvC,CAKM,SAASU,GAA8BD,GAC5C,MAAO,oBAAP,OAA2BA,EAAWT,KAAtC,iBACD,CAUM,SAASW,GAAmB/I,GACjC,MAAO,GAAP,OAJO,gBAIP,YAA+BA,EAChC,CAIM,SAASgJ,GAAeC,GAC7B,MAAO,iBAAP,OAAwBA,EAAQjJ,GACjC,CASM,SAASkJ,GAAkBV,GAChC,MAAO,qBAAP,OAA4BA,EAAQJ,KACrC,CAKM,SAASe,GAAoBX,GAClC,MAAO,sBAAP,OAA6BA,EAAQJ,KACtC,CCvPsB,IAAIgB,GAAAA,GAAAA,OAAc,YAAlC,IACMC,GAAa,IAAID,GAAAA,GAAAA,OAAc,eAC/BE,GAAa,IAAIF,GAAAA,GAAAA,OAAc,eAE/BG,IADO,IAAIH,GAAAA,GAAAA,OAAc,SACnB,IAAIA,GAAAA,GAAAA,OAAc,SACxBI,GAAwB,IAAIJ,GAAAA,GAAAA,OAAc,0BAC1CK,GAAU,IAAIL,GAAAA,GAAAA,OAAc,YAC5BM,GAAU,IAAIN,GAAAA,GAAAA,OAAc,YAC5BO,GAA2B,IAAIP,GAAAA,GAAAA,OAAc,YAC7CQ,GAAc,IAAIR,GAAAA,GAAAA,OAAc,gBAChCS,GAAU,IAAIT,GAAAA,GAAAA,OAAc,YAC5BU,GAAO,IAAIV,GAAAA,GAAAA,OAAc,SACzBW,GAAkB,IAAIX,GAAAA,GAAAA,OAAc,oBACpCY,GAAc,IAAIZ,GAAAA,GAAAA,OAAc,gBAE7CO,GAAyBM,OAAO,CAC9BzB,QAASkB,GACTQ,cAAe,CAACF,MAYlB,IAAMG,GAAe,IAAIf,GAAAA,GAAAA,OAAc,iBAAkB,CACvDgB,YATF,SAAsBC,GAKpB,MAAO,CADHA,EAFFpB,QAAWjJ,GAETqK,EADF/B,IAAOtI,GAGV,IAKDmK,GAAaF,OAAO,CAClBhB,QAASY,GACTvB,IAAKiB,KAGP,IAAMe,GAAM,IAAIlB,GAAAA,GAAAA,OAAc,QAC9BkB,GAAIL,OAAO,CACThB,QAASY,GACTvB,IAAKiB,KAKA,IAAMgB,GAAU,IAAInB,GAAAA,GAAAA,OAAc,WAAY,CACnDZ,QAASkB,GACTc,eAAgB,CAACL,IACjBM,iBAAkB,CAACV,MAGG,IAAIX,GAAAA,GAAAA,OAAc,mBAC1Ba,OAAO,CACrBjK,GAAI0J,K,ymHCpDC,IAAMgB,GAAb,gCACE,WAAYC,GAAU,wBACpB,wCACqBA,EAASC,OAD9B,YACwCD,EAASE,WADjD,cACiEF,EAASG,MAItEzK,MAAM0K,mBACR1K,MAAM0K,kBAAN,MAA8BL,GAGhC,EAAKM,KAAO,iBACZ,EAAKL,SAAWA,EAXI,CAYrB,CAbH,iBAAoCtK,QAgBvB4K,GAAb,gCACE,WAAYN,GAAU,wBACpB,wCACqBA,EAASC,OAD9B,YACwCD,EAASE,WADjD,cACiEF,EAASG,MAGtEzK,MAAM0K,mBACR1K,MAAM0K,kBAAN,MAA8BE,GAGhC,EAAKD,KAAO,WACZ,EAAKL,SAAWA,EAVI,CAWrB,CAZH,iBAA8BtK,QAejB6K,GAAb,gCACE,WAAYP,GAAU,wBACpB,wCACqBA,EAASC,OAD9B,YACwCD,EAASE,WADjD,cACiEF,EAASG,MAGtEzK,MAAM0K,mBACR1K,MAAM0K,kBAAN,MAA8BG,GAGhC,EAAKF,KAAO,eACZ,EAAKL,SAAWA,EAVI,CAWrB,CAZH,iBAAkCtK,QAcrB8K,GAAb,gCACE,WAAYR,GAAU,wBACpB,wCACqBA,EAASC,OAD9B,YACwCD,EAASE,WADjD,cACiEF,EAASG,MAGtEzK,MAAM0K,mBACR1K,MAAM0K,kBAAN,MAA8BI,GAGhC,EAAKH,KAAO,aACZ,EAAKL,SAAWA,EAVI,CAWrB,CAZH,iBAAgCtK,QAenB+K,GAAb,gCAQE,WAAYT,EAAZ,GAAyC,MAAjBU,EAAiB,EAAjBA,OAAQC,EAAS,EAATA,MAAS,kBACvC,wCACqBX,EAASC,OAD9B,YACwCD,EAASE,WADjD,cACiEF,EAASG,MAItEzK,MAAM0K,mBACR1K,MAAM0K,kBAAN,MAA8BK,GAGhC,EAAKJ,KAAO,sBACZ,EAAKL,SAAWA,EAChB,EAAKU,QAASE,EAAAA,GAAAA,cAAaF,GAC3B,EAAKG,aACHF,GAAS9K,OAAOiL,QAAQ,EAAKJ,QAAQxL,KAAI,0BAAE6L,EAAF,KAAKC,EAAL,qBAAeD,EAAf,aAAqBC,EAArB,IAA0B,GAd9B,CAexC,CAvBH,iBAAyCtL,Q,gUClDlC,SAAeuL,GAAtB,mC,oDAAO,WAAiCjB,GAAjC,mFACkB,KAAnBA,EAASC,OADR,sBAEG,IAAIO,GAAWR,GAFlB,UAKkB,KAAnBA,EAASC,OALR,sBAMG,IAAIM,GAAaP,GANpB,UASkB,KAAnBA,EAASC,OATR,6BAUOQ,GAVP,KAU2BT,EAV3B,SAU2CA,EAASkB,OAVpD,wDAakB,KAAnBlB,EAASC,OAbR,uBAcG,IAAIK,GAASN,GAdhB,aAiBDA,EAASC,QAAU,KAjBlB,uBAkBG,IAAIF,GAAeC,GAlBtB,6C,sBAsBP,IAAMmB,GAAe,WACnB,IAAMC,EAAU,CACdC,OAAQ,mBACR,eAAgB,mBAChB,iBAAkBC,OAAOC,aAO3B,OAJIC,aAAaC,QAAQ,gBACvBL,EAAQM,cAAR,iBAAkCF,aAAaC,QAAQ,gBAGlDL,CACR,EAOM,SAAeO,GAAtB,qC,oDAAO,WAAmBxB,EAAKyB,GAAxB,6FACDA,IACFzB,GAAO,IAAJ,OAAQ0B,KAAAA,WAAaC,EAAAA,GAAAA,gBAAeF,GAAc,CACnDG,YAAa,eAIjB5B,EAAM,IAAI6B,IAAI7B,EAAKmB,OAAOW,UAPrB,SASkBC,MAAM/B,EAAK,CAChCiB,QAASD,KACTgB,KAAM,SAXH,cASCnC,EATD,gBAcCiB,GAAkBjB,GAdnB,gCAgBEA,GAhBF,4C,sBAwBA,SAAeoC,GAAtB,qC,oDAAO,WAAmBjC,EAAKkC,GAAxB,6FACLlC,EAAM,IAAI6B,IAAI7B,EAAKmB,OAAOW,UADrB,SAGkBC,MAAM/B,EAAK,CAChCiB,QAASD,KACTmB,OAAQ,MACRH,KAAM,OACNI,KAAMC,KAAKC,UAAUJ,KAPlB,cAGCrC,EAHD,gBAUCiB,GAAkBjB,GAVnB,gCAYEA,GAZF,4C,sBAoBA,SAAe0C,GAAtB,qC,oDAAO,WAAoBvC,EAAKkC,GAAzB,6FACLlC,EAAM,IAAI6B,IAAI7B,EAAKmB,OAAOW,UADrB,SAGkBC,MAAM/B,EAAK,CAChCiB,QAASD,KACTmB,OAAQ,OACRH,KAAM,OACNI,KAAMC,KAAKC,UAAUJ,KAPlB,cAGCrC,EAHD,gBAUCiB,GAAkBjB,GAVnB,gCAYEA,GAZF,4C,sBAmBA,SAAe2C,GAAtB,mC,oDAAO,WAAmBC,GAAnB,+FACCzC,EAAM,IAAI6B,IAAIY,EAAWtB,OAAOW,SAASY,YAD1C,SAEkBX,MAAM/B,EAAK,CAChCiB,QAASD,KACTmB,OAAQ,SACRH,KAAM,SALH,cAECnC,EAFD,gBAQCiB,GAAkBjB,GARnB,gCAUEA,GAVF,4C,sVC3GA,SAAe8C,KAAtB,gC,oDAAO,mHACkBnB,GJkEhB,iBInEF,cACC3B,EADD,YAGE+C,GAAAA,GAHF,KAIHnC,GAAAA,aAJG,SAIgBZ,EAASkB,OAJzB,mDAKH,IAAIzC,GAAAA,GAAAA,MAAaM,IALd,oF,sBAeA,SAAeiE,GAAtB,mC,oDAAO,WAAgCvF,GAAhC,sGACkBkE,GAAInE,GAAqBC,IAD3C,cACCuC,EADD,YAGE+C,GAAAA,GAHF,KAIHnC,GAAAA,aAJG,SAIgBZ,EAASkB,OAJzB,mDAKHlC,GALG,oF,sBASA,SAAeiE,GAAtB,mC,oDAAO,WAA0BpF,GAA1B,+FACCwE,EAAU,CAAExE,SAASiE,EAAAA,GAAAA,gBAAejE,IADrC,SAEkBuE,GAAI5E,GAAqBK,EAAQJ,MAAO4E,GAF1D,cAECrC,EAFD,YAGE+C,GAAAA,GAHF,KAGYnC,GAAAA,aAHZ,SAG+BZ,EAASkB,OAHxC,mDAGiDnC,GAHjD,oF,sBAMA,SAAemE,GAAtB,mC,oDAAO,WAA2BrF,GAA3B,+FACCwE,EAAU,CAAExE,SAASiE,EAAAA,GAAAA,gBAAejE,IADrC,SAEkB6E,GJmChB,gBInCwCL,GAF1C,cAECrC,EAFD,YAGE+C,GAAAA,GAHF,KAGYnC,GAAAA,aAHZ,SAG+BZ,EAASkB,OAHxC,mDAGiDnC,GAHjD,oF,sBAMA,SAAeoE,GAAtB,mC,oDAAO,WAA0BC,GAA1B,sGACkBT,GAAInF,GAAqB4F,IAD3C,cACCpD,EADD,YAEE+C,GAAAA,GAFF,KAEYnC,GAAAA,aAFZ,SAE+BZ,EAASkB,OAFxC,mDAEiDnC,GAFjD,oF,sBAKA,SAAesE,GAAtB,mC,oDAAO,WAAqCD,GAArC,sGACkBhB,GAAI,GAAD,OACrB5E,GAAqB4F,GADA,qBADrB,cACCpD,EADD,YAIE+C,GAAAA,GAJF,KAIYnC,GAAAA,aAJZ,SAI+BZ,EAASkB,OAJxC,mDAIiDnC,GAJjD,oF,mhCCfA,SAASuE,GAAmB7F,GACjC,oDAAO,WAAMT,GAAN,6FACLA,EAAS,CAAEI,KAAMrD,KADZ,kBAImBiJ,GAAiBvF,GAJpC,OAIG4E,EAJH,OAKHrF,EAAS,CAAEI,KAAMpD,GAAiBqI,QAAAA,IAL/B,gDAOHrF,EAAS,CAAEI,KAAMnD,GAAmB0G,MAAK,OAPtC,yDAAP,OAAO,SAAP,UAAO,EAAP,yBAUD,CAoBM,SAAS4C,GAAc1F,EAAS2F,GACrC,OAAO,SAAAxG,GACL,OAAO2E,GL0BJ,SAA8B9D,EAAS2F,GAC5C,MAAO,mCAAP,OAA0C3F,EAAQxI,GAAlD,kBAA8DmO,EAC/D,CK5BcC,CAAqB5F,EAAS2F,IACtCE,MAAK,kBAAM1G,EArBlB,SAAgCwG,GAC9B,OAAOG,GAAA,oBAEM,QAATH,EAAkB,eAAiB,mBAFhC,kDAIL,UAEH,CAc0BI,CAAuBJ,GAAtC,IACLK,OAAM,kBAAM7G,EAbnB,SAA6BwG,GAC3B,OAAOG,GAAA,mDAEM,QAATH,EAAkB,eAAiB,mBAFhC,sDAIL,QAEH,CAM2BM,CAAoBN,GAAnC,GACV,CACF,CAoBM,SAASO,GAAT,GAA8C,IAArB1D,EAAqB,EAArBA,KAAM2D,EAAe,EAAfA,YACpC,oDAAO,WAAMhH,GAAN,+GAEoBkG,GAAY,CACjC7C,KAAAA,EACA2D,YAAAA,IAJC,cAEGhE,EAFH,OAMHhD,EAjBG2G,GAAkB,yBAA0B,YAkB/C3G,EAAS,CAAEI,KAAMtD,GAAiBuI,QAASrC,IAPxC,kBAQIA,GARJ,mCAUG,gBAAiBS,GAVpB,0CAWMzD,EAlBN2G,GACL,mDACA,YAKK,4EAAP,OAAO,SAAP,UAAO,EAAP,yBAiBD,CAaM,SAASM,GAAcpG,GAC5B,oDAAO,WAAMb,GAAN,+GAEoBiG,GAAWpF,GAF/B,cAEGmC,EAFH,OAGHhD,EAAS,CAAEI,KAAMlD,GAAiBmI,QAASrC,IAC3ChD,EAfG2G,GAAkB,+BAAgC,YAWlD,kBAKI3D,GALJ,sCAOHhD,EAAS,CAAEI,KAAMvD,KACjBmD,EAfG2G,GACL,mEACA,YAKK,8DAAP,OAAO,SAAP,UAAO,EAAP,yBAYD,CA0BM,SAASO,GAAoBrG,GAClC,OAAO,SAAAb,GAmBL,OAlBgBiG,GAAW,GAAD,MACrBpF,GADqB,IAExBsG,cAAetG,EAAQsG,gBAEtBT,MAAK,SAAA1D,GACJhD,EAAS,CACPI,KAAMlD,GACNmI,QAASrC,IAEXhD,EAlBC2G,GAAkB,0BAA2B,WAmB/C,IACAE,OAAM,WACL7G,EAAS,CACPI,KAAMvD,KAERmD,EApBC2G,GAAkB,gCAAiC,WAqBrD,GAGJ,CACF,CAUM,SAASS,GAAavG,GAC3B,IAAMwG,EAAiB,GAAH,MAAQxG,GAAR,IAAiByG,QAASzG,EAAQyG,SAEtD,OAAO,SAAAtH,GAgBL,OAfgBiG,GAAWoB,GACxBX,MAAK,SAAA1D,GACJhD,EAAS,CACPI,KAAMlD,GACNmI,QAASrC,IAEXhD,EAjBC2G,GAAkB,iCAAkC,WAkBtD,IACAE,OAAM,WACL7G,EAAS,CACPI,KAAMvD,KAERmD,EAnBC2G,GAAkB,kCAAmC,WAoBvD,GAGJ,CACF,C,uCClNYY,GAAY,MAAQ,SAAAC,GAC/B,IAAMC,EAAS,IAAIC,GAAAA,GAAO,UAAW,CACnCC,OAAQ,CAAEH,MAAAA,KAKZ,OAFAC,EAAOG,UAEAH,CACR,IAIYI,GAAc,SAAAL,GACzBD,GAAUC,GAAOM,aACjBP,GAAUQ,MAAMC,OAAOR,EACxB,E,k3CCDM,SAASS,GAAqBrD,GACnC,IAPsCsD,EAOhCP,EAAS,IAAIQ,iBAPmBD,EAOqBtD,EANpD/L,OAAOuP,YACZvP,OAAOiL,QAAQoE,GAAKG,QAAO,iCAAYrE,OAAZ,iBAM7B,MAAO,kBAAP,OAAyB2D,EAC1B,CAEM,SAASW,GAAYC,GAC1B,OAAO,SAAAC,GAAG,OAAID,GAAMC,EAAV,CACX,CAEM,SAASC,GAAwBC,GACtC,MACEA,EAAKC,WADCC,EAAR,EAAQA,aAAcC,EAAtB,EAAsBA,2BAA4BC,EAAlD,EAAkDA,qBAGlD,OACEjQ,OAAOD,KAAKgQ,QAAAA,EAAgB,CAAC,GAC1BP,QAAO,SAAAU,GAAG,MAAY,eAARA,CAAJ,IACVC,MAAK,SAAAC,GACJ,OAAOJ,EAA2BI,EACnC,KACFH,IACCF,aADmB,EACnBA,EAAcM,eAAe,yBAElC,CAWM,SAASC,GAAcC,EAAQC,EAAQC,EAAUC,GACtD,IAAMC,GACmC,IAXpC,SAAkCF,GACvC,QAAKA,GAEgB,UAAnB,GAAOA,IACiC,eAAxCzQ,OAAOD,KAAK0Q,GAAUG,OAAOC,QAC7B7Q,OAAO8Q,OAAOL,GAAUM,OAAM,SAAAC,GAAK,OAAIC,OAAOC,UAAUF,EAArB,GAEtC,CAIGG,CAAyBV,GACrBA,EACA,CAAEW,IAAKb,EAAOc,QAAQC,YAAaC,OAAQ,GAEjDhB,EAAOc,QAAQG,OAAOb,EAAtB,UAAyCH,GAAzC,OAAkDE,EAAU,GAAK,MAClE,CAcM,SAASe,GAAiBC,EAAkBZ,GACjD,OAAO9Q,OAAOuP,YACZvP,OAAOiL,QAAQyG,GAAkBrS,KAAI,YAAqB,cAAnBsS,EAAmB,KACxD,MAAO,CAACA,EAAO,CAAEC,QADuC,KACvB,GAAIZ,MAAOF,EAAOa,IACpD,IAEJ,CAQM,SAASE,GAAOC,EAAMC,GAC3B,OAAO,SAAAnS,GACLA,EAAEoS,iBACFpS,EAAEqS,kBACErS,EAAEsS,SAAWtS,EAAEuS,QACjB1G,OAAO2G,KAAKN,EAAMA,IAElBC,EAAQM,KAAKP,GACbrG,OAAO6G,SAAS,EAAG,GAEtB,CACF,CAEM,SAASC,GAAOT,EAAMC,GAC3BA,EAAQM,KAAKP,GACbrG,OAAO6G,SAAS,EAAG,EACpB,CAEM,SAASE,KACV/G,OAAOgH,eACThH,OAAOgH,eAAeC,SAEtBC,YAAW,kBAAMH,IAAN,GAAqB,IAEnC,CA6BM,SAASI,GAASC,GACvB,OAAO,IAAIxL,MAAK,IAAIA,MAAOyL,UAAY,KAAiBD,GAAQE,aACjE,CAQD,SAASC,GAAQhC,GACf,MAAoB,iBAATA,GACFiC,EAAAA,GAAAA,GAASjC,GAEXA,CACR,CAEM,SAASkC,GAAWC,EAAgBxF,GACzC,OAAKwF,GAGEC,EAAAA,GAAAA,GAAOJ,GAAQG,GAAiBxF,GAF9B,IAGV,CAEM,SAAS0F,GAAaF,GAC3B,OAAKA,GAIEG,EAAAA,GAAAA,GAAe,IAAIjM,KAAK8L,GAAiB,IAAI9L,MAH3C,IAIV,CAEM,SAASkM,GAASJ,EAAgBK,EAAiBC,GACxD,OAAKN,GAAmBK,EAGX,SAATC,GACKC,EAAAA,GAAAA,GAAiBV,GAAQG,GAAiBH,GAAQQ,KAEpDG,EAAAA,GAAAA,GACLX,GAAQG,GACRH,GAAQQ,IAPD,IASV,CAEM,SAASI,GAAUC,GACxB,OAAIA,EACKxM,KAAKC,MAAQuM,GAAQ,OACxBR,GAAaQ,IACbT,EAAAA,GAAAA,GAAO,IAAI/L,KAAKwM,GAAO,OAEtB,KACR,CAEM,SAASC,GAASC,GACvB,OAAOA,EAAI,WACJX,EAAAA,GAAAA,GAAO,IAAI/L,KAAK0M,GAAO,YADnB,cACmCC,EAAAA,GAAAA,GACxC,IAAI3M,KAAK0M,GACT,IAAI1M,KACJ,CACE4M,WAAW,IALR,KAQP,KACL,CASM,SAASC,GAAT,GAAiD,IAPnCC,EAAOC,EAOOjM,EAAqB,EAArBA,IAAKM,EAAgB,EAAhBA,QAASX,EAAO,EAAPA,IACvCtI,EAA+D2I,EAA/D3I,GAAI6U,EAA2DlM,EAA3DkM,WAAYC,EAA+CnM,EAA/CmM,SAAUC,EAAqCpM,EAArCoM,UAAWC,EAA0BrM,EAA1BqM,WAAYC,EAActM,EAAdsM,UACzD,MAAO,CACLC,KAAmB,KAAbJ,EACNf,UAXiBY,EAWKI,EAXEH,EAWSI,EAV/BL,GAASC,GAAOA,EAAMD,EAAQ,EACzBC,EAAMD,EAER,GAQLG,SAAAA,EACAE,WAAYA,EAAanB,GAAamB,GAAc,MACpDhV,GAAAA,EACA6U,WAAYA,EAAahB,GAAagB,GAAc,MACpDvM,IAAAA,EACA2M,UAAAA,EACAF,UAAWX,GAAUW,GACrBI,WAAYJ,EACZ9L,QAAAA,EAEH,CAEM,SAASmM,GAAUpE,GACxB,IACE,GAAI7D,KAAKkI,MAAMrE,GACb,OAAO,CAIV,CAFC,MAAO5Q,GACP,OAAO,CACR,CACF,CAWM,SAASkV,GAAW3M,GACzB,OAAO2F,GAAA,cAAyB3F,EAAI3I,GAA7B,uBAAsD,UAC9D,CAEM,SAASuV,GAAeC,EAAOC,GACpC,OAAOnH,GAAA,eACGkH,EADH,6BAC6BC,GAAgB,IAClD,UAEH,CASM,SAASC,GAAWC,EAAUC,EAAQC,EAAOrE,GAClD,OAAIvF,OAAO6J,KACF7J,OAAO6J,KAAK,QAASF,EAAQ,CAClCD,SAAAA,EACAE,MAAAA,EACArE,MAAAA,IAGG,IACR,CAYM,SAASuE,GAAYC,EAAKC,GAC/B,IACE,GAAID,GAAOE,KAAKF,GAAKG,UACnB,OAAIF,GAAQA,EAAKG,WACRC,KAAAA,SAAmBL,GAErB,GAAP,OAAUK,KAAAA,SAAmBL,GAAKM,MAAM,EAAG,GAAGC,eAA9C,OAA8DF,KAAAA,SAClDL,GACTM,MAAM,GAIZ,CAFC,MAAOhL,GACP,OAAO,CACR,CACD,OAAO,CACR,CAuBM,SAASkL,GAAkBC,EAAuBnO,GACvD,MAAO,sBAAP,OAA6BmO,EAAsBC,gBAAnD,YAAsED,EAAsBE,eAA5F,iBAAmHF,EAAsBG,iBAAzI,YAA6JtO,EAAIuO,mBAClK,CAEM,SAASC,GAAaC,EAAMC,GAOjC,OANWD,IAASC,IAEI,KAATD,IAAgBA,KACP,KAATC,IAAgBA,EAIhC,CAEM,IAAMC,GAAiB,SAACC,EAAS1F,GAClCA,IAAuD,IAA9C0F,EAAQrX,KAAI,SAAAM,GAAC,OAAIA,EAAEqR,KAAN,IAAa2F,QAAQ3F,IAC7C0F,EAAQrE,KAAK,CAAEuE,KAAM5F,EAAOA,MAAAA,GAE/B,EAEY6F,GAAe,SAACjX,EAAGkX,GAC9B,IAAQC,EAA0BnX,EAA1BmX,IAAK7E,EAAqBtS,EAArBsS,QAASC,EAAYvS,EAAZuS,SACjBD,GAAWC,IAAoB,MAAR4E,IAC1BnX,EAAEoS,iBACF8E,IAEH,EAEYE,GAAgB,SAACC,GAAD,IAAOC,EAAP,wDAAiB,EAAjB,OAAuBD,EAAKnB,MAAMoB,EAAlC,EAEhBC,GAAU,SAAAP,GAAI,OACxBA,GACCA,EACGb,cACAqB,QAAQ,iBAAkB,KAC1BA,QAAQ,aAAc,KAC3B,IANyB,EAQdC,GAAW,SAAA7B,GACtB,IAAM5N,EAAOuP,GAAQ3B,GAErB,SAAI5N,GAAQA,EAAK0P,OAAS,IACjB,mDAGV,E,gUC9VM,SAASC,KACd,OAAO,SAAApQ,GACDwE,aAAaC,QAAQ,eACvBzE,EAAS,CAAEI,KAAM/E,KACjBsJ,GRsIG,oBQtIuB,CAAE0L,IAAK7L,aAAaC,QAAQ,gBACnDiC,KADH,6CACQ,WAAM1D,GAAN,wGACeA,EAASkB,OADxB,OACEoM,EADF,OAEEC,GAAO3M,EAAAA,GAAAA,cAAa0M,EAAKE,OAC/BxQ,EAAS,CAAEI,KAAMjF,GAAoBoV,KAAAA,IACrCvQ,EAAS,CAAEI,KAAMjE,GAAeoU,KAAAA,IAJ5B,2CADR,uDAOG1J,OAAM,SAAAlD,GACL3D,EAAS,CACPI,KAAMhF,GACNuI,MAAAA,GAEH,KAEH3D,EAAS,CAAEI,KAAMlF,IAEpB,CACF,CAEM,SAASuV,GAAT,GAAoC,IAAnBC,EAAmB,EAAnBA,MAAOC,EAAY,EAAZA,SAC7B,OAAO,SAAA3Q,GAIL,OAHAA,EAAS,CAAEI,KVEW,eUDtBoE,aAAaoM,WAAW,cAEjBlL,GRkHF,aQlHuB,CAAEwE,QAAS,CAAEwG,MAAAA,EAAOC,SAAAA,KAC7CjK,KADI,6CACC,WAAM1D,GAAN,0GACeA,EAASkB,OADxB,cACEoM,EADF,OAEID,EAAgBC,EAAhBD,IAAKQ,EAAWP,EAAXO,OACbrM,aAAasM,QAAQ,aAAcT,GACnCrQ,EAAS,CAAEI,KAAMrF,GAAkByM,MAAO,CAAE6I,IAAAA,EAAKQ,OAAAA,KD+MhCxN,EC9MR,QD8McsE,EC9ML,CAAErC,OAAQ,UD+M9BhB,OAAO6J,MACF7J,OAAO6J,KAAK,QAAS9K,EAAM,CAAEsE,OAAAA,ICrN5B,kBAMG2I,GANH,iCDmNL,IAAkBjN,EAAMsE,CCnNnB,UADD,uDASJjB,MAAK,WACJ1G,EAASoQ,KACV,IACAvJ,OAAM,SAAAlD,GAEL,MADA3D,EAAS,CAAEI,KAAMtF,GAAc6I,MAAAA,IACzB,IAAIjL,MAAM,CAAEiY,SAAUhN,GAC7B,GACJ,CACF,CAEM,SAASoN,GAAOnG,GAA2B,IAAlBoG,EAAkB,uDAAL,IAC3C,OAAO,SAAAhR,GACL,IAAMwH,EAAQhD,aAAaC,QAAQ,cACnCoD,GAAYL,GACZhD,aAAaoM,WAAW,cACxBhG,EAAQM,KAAK8F,GACbhR,EAAS,CAAEI,KAAMpF,IAClB,CACF,CC5ED,UAKEiW,cAAeC,EAAQ,OACvBC,OAAQD,EAAQ,OAChBE,eAAgBF,EAAQ,OACxBG,IAAKH,EAAQ,KACbI,UAAWJ,EAAQ,MACnBK,QAASL,EAAQ,OACjBtJ,QAASsJ,EAAQ,MACjBM,IAAKN,EAAQ,OACbO,QAASP,EAAQ,OACjBQ,oBAAqBR,EAAQ,OAG7BS,QAAST,EAAQ,OACjBU,QAASV,EAAQ,OACjBW,uBAAwBX,EAAQ,OAChCY,YAAaZ,EAAQ,MACrBa,KAAMb,EAAQ,OACdc,cAAed,EAAQ,OAGvBe,SAAUf,EAAQ,OAClBgB,OAAQhB,EAAQ,OAChBiB,IAAKjB,EAAQ,OACbkB,MAAOlB,EAAQ,OACfmB,KAAMnB,EAAQ,MACdoB,IAAKpB,EAAQ,OACbqB,KAAMrB,EAAQ,OACdsB,OAAQtB,EAAQ,OAChBuB,KAAMvB,EAAQ,OACdwB,KAAMxB,EAAQ,OACdyB,MAAOzB,EAAQ,OACf0B,SAAU1B,EAAQ,OAClB2B,QAAS3B,EAAQ,OACjB4B,IAAK5B,EAAQ,OACb6B,OAAQ7B,EAAQ,OAGhB8B,IAAK9B,EAAQ,OACb+B,GAAI/B,EAAQ,OACZgC,MAAOhC,EAAQ,MACfiC,IAAKjC,EAAQ,OACbkC,UAAWlC,EAAQ,OACnBmC,IAAKnC,EAAQ,OACboC,IAAKpC,EAAQ,OACbqC,UAAWrC,EAAQ,OACnBsC,IAAKtC,EAAQ,OACbuC,OAAQvC,EAAQ,OAChBwC,eAAgBxC,EAAQ,MACxByC,YAAazC,EAAQ,OACrB0C,gBAAiB1C,EAAQ,OACzB2C,MAAO3C,EAAQ,OACf4C,IAAK5C,EAAQ,MACb6C,YAAa7C,EAAQ,OACrB8C,OAAQ9C,EAAQ,OAChB+C,SAAU/C,EAAQ,MAClBgD,IAAKhD,EAAQ,MACbiD,WAAYjD,EAAQ,OACpBkD,IAAKlD,EAAQ,OACbmD,KAAMnD,EAAQ,MACdoD,IAAKpD,EAAQ,OACbqD,QAASrD,EAAQ,OACjBsD,WAAYtD,EAAQ,MACpBuD,SAAUvD,EAAQ,OAClBwD,IAAKxD,EAAQ,OACbyD,aAAczD,EAAQ,OACtB0D,OAAQ1D,EAAQ,OAChB2D,KAAM3D,EAAQ,OACd4D,IAAK5D,EAAQ,OACb6D,QAAS7D,EAAQ,OAGjB8D,KAAM9D,EAAQ,MACd+D,cAAe/D,EAAQ,OACvBgE,QAAShE,EAAQ,OACjBiE,OAAQjE,EAAQ,MAChBkE,cAAelE,EAAQ,OACvBmE,aAAcnE,EAAQ,OACtBoE,MAAOpE,EAAQ,OACfqE,KAAMrE,EAAQ,OACdsE,MAAOtE,EAAQ,OACfuE,KAAMvE,EAAQ,OACdwE,MAAOxE,EAAQ,OAGfyE,UAAWzE,EAAQ,OACnB0E,QAAS1E,EAAQ,OACjB2E,KAAM3E,EAAQ,OACd4E,MAAO5E,EAAQ,OACf6E,IAAK7E,EAAQ,OACb8E,KAAM9E,EAAQ,MAId+E,UAAW/E,EAAQ,OACnBgF,QAAShF,EAAQ,OAIjBiF,QAASjF,EAAQ,OACjBkF,QAASlF,EAAQ,OACjBmF,OAAQnF,EAAQ,OAChBoF,OAAQpF,EAAQ,OAChBqF,MAAOrF,EAAQ,OACfsF,OAAQtF,EAAQ,OAChBuF,SAAUvF,EAAQ,OAClBwF,WAAYxF,EAAQ,OACpByF,QAASzF,EAAQ,OACjB0F,IAAK1F,EAAQ,OACb2F,KAAM3F,EAAQ,OACd4F,WAAY5F,EAAQ,OACpB6F,MAAO7F,EAAQ,OACf8F,SAAU9F,EAAQ,OAClB+F,QAAS/F,EAAQ,OACjBgG,YAAahG,EAAQ,OACrBiG,SAAUjG,EAAQ,OAClBkG,WAAYlG,EAAQ,OACpBmG,SAAUnG,EAAQ,OAClBoG,UAAWpG,EAAQ,MACnBqG,SAAUrG,EAAQ,OAIlBsG,WAAYtG,EAAQ,OACpBuG,MAAOvG,EAAQ,MACfwG,WAAYxG,EAAQ,OAGpByG,QAASzG,EAAQ,OACjB0G,WAAY1G,EAAQ,OAIpB2G,YAAa3G,EAAQ,MACrB4G,YAAa5G,EAAQ,MACrB6G,iBAAkB7G,EAAQ,OAC1B8G,OAAQ9G,EAAQ,OAEhB+G,SAAU/G,EAAQ,MAClBgH,kBAAmBhH,EAAQ,MAK3BiH,eAAgBjH,EAAQ,OACxBkH,aAAclH,EAAQ,OAMtBmH,OAAQnH,EAAQ,OAGhBoH,aAAcpH,EAAQ,MACtBqH,aAAcrH,EAAQ,MAEtBsH,WAAYtH,EAAQ,MACpBuH,KAAMvH,EAAQ,OAEdwH,aAAcxH,EAAQ,OACtByH,aAAczH,EAAQ,OAGtB0H,YAAa1H,EAAQ,OACrB2H,YAAa3H,EAAQ,OACrB4H,MAAO5H,EAAQ,OACf6H,SAAU7H,EAAQ,OAElB8H,SAAU9H,EAAQ,OAClB+H,YAAa/H,EAAQ,OACrBgI,YAAahI,EAAQ,OACrBiI,SAAUjI,EAAQ,OAClBkI,aAAclI,EAAQ,OACtBmI,MAAOnI,EAAQ,OACfoI,UAAWpI,EAAQ,MACnBqI,QAASrI,EAAQ,OACjBsI,OAAQtI,EAAQ,MAChBuI,OAAQvI,EAAQ,OAChBwI,MAAOxI,EAAQ,OACfyI,MAAOzI,EAAQ,OAGf0I,YAAa1I,EAAQ,MACrB2I,YAAa3I,EAAQ,MAErB4I,kBAAmB5I,EAAQ,OAC3B6I,SAAU7I,EAAQ,OAClB8I,kBAAmB9I,EAAQ,OAE3B+I,QAAS/I,EAAQ,OACjBgJ,QAAShJ,EAAQ,OACjBiJ,YAAajJ,EAAQ,OAErBkJ,MAAOlJ,EAAQ,MACfmJ,MAAOnJ,EAAQ,MACfoJ,MAAOpJ,EAAQ,OACfqJ,MAAOrJ,EAAQ,OAEfsJ,OAAQtJ,EAAQ,OAChBuJ,QAASvJ,EAAQ,OACjBwJ,KAAMxJ,EAAQ,OACdyJ,IAAKzJ,EAAQ,OACb0J,SAAU1J,EAAQ,OAClB2J,KAAM3J,EAAQ,OACd4J,IAAK5J,EAAQ,MAIb6J,kBAAmB7J,EAAQ,OAC3B8J,aAAc9J,EAAQ,OACtB+J,QAAS/J,EAAQ,MACjBgK,QAAShK,EAAQ,MACjBiK,OAAQjK,EAAQ,MAChBkK,QAASlK,EAAQ,OACjBmK,QAASnK,EAAQ,OACjBoK,QAASpK,EAAQ,OAKjBqK,WAAYrK,EAAQ,MACpBsK,WAAYtK,EAAQ,MACpBuK,QAASvK,EAAQ,OACjBwK,QAASxK,EAAQ,MAOjByK,SAAUzK,EAAQ,OAClB0K,SAAU1K,EAAQ,OAClB2K,IAAK3K,EAAQ,OAIb4K,YAAa5K,EAAQ,OACrB6K,YAAa7K,EAAQ,OAGrB8K,mBAAoB9K,EAAQ,OAC5B+K,kBAAmB/K,EAAQ,OAC3BgL,kBAAmBhL,EAAQ,OAC3BiL,YAAajL,EAAQ,OACrBkL,WAAYlL,EAAQ,OACpBmL,IAAKnL,EAAQ,OACboL,iBAAkBpL,EAAQ,OAC1BqL,KAAMrL,EAAQ,OACdsL,WAAYtL,EAAQ,OAGpBuL,KAAMvL,EAAQ,OACdwL,KAAMxL,EAAQ,OAGdyL,SAAUzL,EAAQ,OAClB0L,YAAa1L,EAAQ,OACrB2L,UAAW3L,EAAQ,OACnB4L,UAAW5L,EAAQ,OAGnB6L,UAAW7L,EAAQ,OAEnB8L,UAAW9L,EAAQ,OACnB+L,OAAQ/L,EAAQ,OAEhBgM,oBAAqBhM,EAAQ,OAE7BiM,SAAUjM,EAAQ,OAGlBkM,WAAYlM,EAAQ,MAIpBmM,UAAWnM,EAAQ,MACnBoM,OAAQpM,EAAQ,MAChBqM,KAAMrM,EAAQ,OACdsM,YAAatM,EAAQ,OACrBuM,eAAgBvM,EAAQ,OACxBwM,UAAWxM,EAAQ,OAEnByM,mBAAoBzM,EAAQ,MAC5B0M,qBAAsB1M,EAAQ,Q,yOCzOzB,SAAS2M,GAAYhd,GAC1B,MAAO,aAAP,OAAoBA,EAAQJ,KAC7B,CAsBM,SAASqd,GAAkBjd,GAChC,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,UACD,CAMM,SAASkd,GAAoBld,GAClC,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,YACD,CAMM,SAASmd,GAAiBnd,GAC/B,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,SACD,CAOM,SAASod,GAAgBpd,GAC9B,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,QACD,CAOM,SAASqd,GAAerd,EAASF,GACtC,MAAO,GAAP,OAAUsd,GAAgBpd,GAA1B,YAAsCF,EAAIF,KAC3C,CAOM,SAAS0d,GAAmBtd,EAASF,GAC1C,MAAO,GAAP,OAAUsd,GAAgBpd,GAA1B,YAAsCF,EAAIF,KAA1C,QACD,CAgBM,SAAS2d,GAAyBvd,EAASF,EAAKK,GACrD,MAAO,GAAP,OAAUid,GAAgBpd,GAA1B,YAAsCF,EAAIF,KAA1C,uBAA6DO,EAAI3I,GAClE,CAMM,SAASgmB,GAAkCxd,GAChD,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,QACD,CAOM,SAASyd,GAAoBzd,GAClC,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,YACD,CAMM,SAAS0d,GAA0B1d,EAAS2d,GACjD,MAAuB,WAAnB,GAAOA,GACF,GAAP,OAAUF,GAAoBzd,GAA9B,YAA0C2d,EAAQnmB,IAE7C,GAAP,OAAUimB,GAAoBzd,GAA9B,YAA0C2d,EAC3C,CAmCM,SAASC,GAAuB5d,GACrC,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,eACD,CAMM,SAAS6d,GAAsB7d,EAASK,GAC7C,MAAO,GAAP,OAAUud,GAAuB5d,GAAjC,YAA6CK,EAAWT,KACzD,CAsBM,SAASke,GAAY9d,EAASG,GACnC,MAAO,GAAP,OAAU6c,GAAYhd,GAAtB,iBAAuCG,EAAI3I,GAC5C,CAKM,SAASumB,GAAgB/d,GAC9B,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,QACD,CAMM,SAASge,GAAmBhe,EAASG,GAC1C,MAAO,GAAP,OAAU6c,GAAYhd,GAAtB,iBAAuCG,EAAI8d,OAC5C,CAMM,SAASC,GAAmBle,EAASG,GAC1C,MAAO,GAAP,OAAU6c,GAAYhd,GAAtB,iBAAuCG,EAAIge,OAC5C,CAMM,SAASC,GAAqBpe,EAASG,GAC5C,MAAO,GAAP,OAAU6c,GAAYhd,GAAtB,iBAAuCG,EAAIke,SAC5C,CAMM,SAASC,GAAkBte,GAChC,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,sBACD,CAMM,SAASue,GAAoBve,GAClC,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,YACD,CAEM,SAASwe,GAAmBxe,EAASS,GAC1C,MAAO,GAAP,OAAUuc,GAAYhd,GAAtB,qBAA2CS,EAAQb,KACpD,CA2BM,SAAS6e,GAAqBze,GACnC,MAAO,GAAP,OAAUgd,GAAYhd,GAAtB,aACD,C,mIC3TK0e,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJC,cAAe3f,EAAM4f,QAAQ,IAFC,IAMlC,SAASC,GAAT,GAAwD,IAA/BC,EAA+B,EAA/BA,SAAUC,EAAqB,EAArBA,KAAMC,EAAe,EAAfA,KAAMC,EAAS,EAATA,MACvCC,EAAUV,KAChB,OACE,gBAAC,KAAD,CACEW,WAAS,EACTC,eAAe,SACfC,UAAYJ,EAAuB,KAAfC,EAAQR,MAE5B,gBAAC,KAAD,CACEY,MAAI,EACJC,GAAI,GACJC,GAAKR,GAAgBD,EAAR,GAAoB,GACjCU,GAAKT,EAAQ,GAAQD,EAAO,GAAK,EACjCW,GAAKV,EAAQ,GAAQD,EAAO,EAAI,GAE/BD,GAIR,CAED,SAAea,EAAAA,KAAWd,ICpB1B,IAAML,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJkB,SAAU,EACVC,OAAQ,EACRC,UAAW,UAEbC,OAAQ,CACND,UAAW,UAEbpR,KAAM,CACJiQ,cAAe3f,EAAM4f,QAAQ,GAC7BkB,UAAW,UAXmB,IAelC,SAASE,GAAT,GAA0D,IAAxCV,EAAwC,EAAxCA,KAAMW,EAAkC,EAAlCA,KAAMC,EAA4B,EAA5BA,MAAOnB,EAAqB,EAArBA,KAAMC,EAAe,EAAfA,KAAMmB,EAAS,EAATA,MACzCjB,EAAUV,KAChB,OAAI0B,EAEA,uBAAKb,UAAWH,EAAQR,MACtB,uBAAKW,UAAWH,EAAQa,QACrBT,GACC,gBAAC,IAAD,CAAYD,UAAWH,EAAQxQ,MAC5BuR,GAAQ,UADX,IACuBX,GAGxBa,EAAQ,gBAACC,GAAA,EAAD,MAAuB,gBAACC,GAAA,EAAD,QAOtC,gBAAC,GAAD,CAAehB,UAAWH,EAAQR,KAAMK,KAAMA,EAAMC,KAAMA,GACxD,gBAAC,KAAD,CAAMK,UAAWH,EAAQa,QACvB,gBAAC,KAAD,KACGT,GACC,gBAAC,IAAD,CAAYD,UAAWH,EAAQxQ,MAC5BuR,GAAQ,UADX,IACuBX,GAGxBa,EAAQ,gBAACC,GAAA,EAAD,MAAuB,gBAACC,GAAA,EAAD,QAKzC,CAED,SAAeV,EAAAA,KAAWK,I,msBCrBnB,SAAeM,GAAtB,mC,oDAAO,WAAuB9Q,GAAvB,sGACkB5K,GAAI,GAAD,ObXnB,aaWmB,YAAsB4K,EAAKlY,KADhD,cACC2K,EADD,YAEE+C,GAAAA,GAFF,KAEYnC,GAAAA,aAFZ,SAE+BZ,EAASkB,OAFxC,mDAEiD/B,GAFjD,oF,sVCGP,SAASmf,GAAYjc,GACnB,MAAO,CAAEjF,KAAM/D,GAAcgJ,QAAAA,EAC9B,CAUD,SAASkc,KACP,OAAO5a,GAAkB,sBAAuB,QACjD,CAeM,SAAS6a,KAEd,OADAzT,GAAW,UAAW,uBACf,CAAE3N,KAAM7D,GAChB,CAaM,SAASklB,GAAclR,GAC5B,OAAO,SAAAvQ,GACL,OAAO0F,Gd+EF,qBc/E+B,CAClCgc,4BAA6BnR,EAAKoR,yBAClChR,SAAUJ,EAAKI,WAEdjK,KAJI,6CAIC,WAAM1D,GAAN,sGACeA,EAASkB,OADxB,OACEoM,EADF,OAEJtQ,EAAS,CACPI,KAAM,gCAERJ,EACEyQ,GAAM,CAAEC,MAAOJ,EAAKE,MAAME,MAAOC,SAAUJ,EAAKI,YAChDjK,MAAK,WACL1G,EAxBD2G,GAAkB,gCAAiC,QAyBnD,IATG,2CAJD,uDAeJE,OAAM,SAAAlD,GAKL,MAJA3D,EAAS,CACPI,KAAM,0BAERJ,EA3BC2G,GACL,qEACA,SA0BUhD,CACP,GACJ,CACF,CAEM,SAASie,GAAgBlR,EAAO9F,GACrC,OAAO,SAAA5K,GACL0F,GdwDK,uBcxD0B,CAC7BgL,MAAAA,IAEChK,MAAK,WAKJ,OAJA1G,EAAS,CACPI,KAAM,wBAERJ,EAwCC2G,GACL,4DACA,SAzCWiE,EAAQM,KAAK,kBACrB,IACArE,OAAM,WACL7G,EAAS,CACPI,KAAM,iBACNqK,QAAS,qCAEXzK,EAyBC2G,GACL,sEACA,SA1BG,GACJ,CACF,CAEM,SAASkb,GAAuBtR,GACrC,OAAO,SAAAvQ,GACL,OAAO0F,GdwCJ,SAAuC6K,GAC5C,MAAO,kCAAP,OAAyCA,EAAKlY,GAC/C,Cc1CeypB,CAA8BvR,IACvC7J,MAAK,SAAA1D,GACJhD,EAAS,CACPI,KAAM,2BAERJ,EA2BC2G,GACL,wDACA,QA5BG,IACAE,OAAM,SAAAkC,GACL/I,EAAS,CACPI,KAAM,iBACNqK,QAAS,qCAEXzK,EA2BC2G,GACL,+EACA,SA5BG,GACJ,CACF,CA8BM,SAASob,GAAWxR,GACzB,OAAO,SAAAvQ,GAEL,OADAA,EAnJJ,SAAsBuQ,GACpB,MAAO,CAAEnQ,KAAMlE,GAAeqU,KAAAA,EAC/B,CAiJYyR,CAAazR,ID7KnB,SAAiBA,GACtB,IAAQlY,EAAmBkY,EAAnBlY,GAAO4pB,EAAf,GAA2B1R,EAA3B,IACMlL,EAAU,CAAEkL,MAAMzL,EAAAA,GAAAA,gBAAemd,IAEvC,OAAO7c,Gb0BF,SAAyB/M,GAC9B,MAAO,GAAP,OAdO,aAcP,YAA4BA,EAC7B,Ca5BY6pB,CAAgB7pB,GAAKgN,GAC7BqB,KADI,6CACC,WAAM1D,GAAN,wGACeA,EAASkB,OADxB,cACEoM,EADF,OAEE6R,GAAcve,EAAAA,GAAAA,cAAa0M,EAAKE,OAFlC,kBAGG2R,GAHH,2CADD,uDAMJtb,OAAM,SAAAlD,GAAK,OAAIye,QAAQC,OAAO1e,EAAnB,GACf,CCmKU2e,CAAQ/R,GACZ7J,MAAK,SAAA1D,GACJhD,EAASshB,GAAYte,IACrBhD,EA1IC2G,GAAkB,yBAA0B,WA2I9C,IACAE,OAAM,SAAAlD,GAGL,OAFA3D,EAlJR,SAA2B2D,GACzB,MAAO,CAAEvD,KAAMhE,GAAqBuH,MAAAA,EACrC,CAgJgB4e,CAAkB5e,IAC3B3D,EAASuhB,MACFa,QAAQC,OAAO1e,EACvB,GACJ,CACF,CAEM,SAAS6e,GAAkBC,GAIhC,OAAO,SAAAziB,GAAQ,ODlLV,SAAqByiB,GAC1B,OAAO/c,GbmOA,oBanO2B+c,GAC/B/b,KADI,6CACC,WAAM1D,GAAN,sGACeA,EAASkB,OADxB,cACEoM,EADF,0BAEGvK,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,EAAKE,OAAQrO,KAFvC,2CADD,uDAKJ0E,OAAM,SAAAlD,GAAK,OAAIye,QAAQC,OAAO1e,EAAnB,GACf,CC4KG+e,CAAYD,GACT/b,MAAK,SAAArB,GAAO,OAAIrF,EAASshB,GAAYjc,GAAzB,IACZqB,MAAK,kBAAM1G,EAnJT2G,GAAkB,0BAA2B,WAmJ1C,IACLD,MAAK,kBAAM1G,EAASwhB,KAAf,IACL3a,OAAM,SAAAlD,GAGL,OAFA3D,EAASwhB,MACTxhB,EAASuhB,MACFa,QAAQC,OAAO1e,EACvB,GATU,CAUhB,CAgBM,SAASgf,GAActf,EAAMuf,GAClC,OAAO,SAAA5iB,GAIL,OAHAA,EAAS,CACPI,KhB9EwB,mBgBgFnBuE,Gd/CF,0Bc+C8B,CAAEtB,KAAAA,EAAMuf,MAAAA,IACxClc,KADI,6CACC,WAAM1D,GAAN,kGACSY,GAAAA,aADT,SAC4BZ,EAASkB,OADrC,mBACEoM,GADF,cAEJtQ,EAAS,CAAEI,KAAM1B,GAAoBmkB,SAAUvS,EAAKuS,WAFhD,2CADD,uDAKJhc,OAAM,SAAAlD,GACL3D,EAAS,CAAEI,KAAMzB,GAAoB0G,QAAS1B,GAC/C,GACJ,CACF,CCrID,SA1FA,WACE,IAAMiH,GAAUkY,EAAAA,EAAAA,MACV7d,GAAW8d,EAAAA,EAAAA,MACXpb,EAAS,IAAIQ,gBAAgBlD,EAAS+d,QACtCC,EAAoBtb,EAAOhD,IAAI,qBAC/Bue,EAASvb,EAAOhD,IAAI,UACpB3E,GAAWmjB,EAAAA,EAAAA,MAEjB,GAAyDC,EAAAA,EAAAA,KACvD,SAAAC,GAAK,OAAIA,EAAMC,UAAV,GAD6D,KAA5DC,EAAR,EAAQA,aAAcC,EAAtB,EAAsBA,aAAcC,EAApC,EAAoCA,iBAapC,OARAC,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,6BAClB,GAAE,KAEHF,EAAAA,EAAAA,YAAU,WACR1jB,ED0OG,SAAsBkjB,EAAQD,GACnC,OAAO,SAAAjjB,GACAkjB,GAAWD,GAGdjjB,EAAS,CAAEI,KAAM,oBAEjBsF,GdxFG,wBcwF6B,CAC9Bme,QAASX,EACTY,mBAAoBb,IAEnBvc,KAJH,6CAIQ,WAAM1D,GAAN,yGAAkBA,EAASkB,QAA3B,2CAJR,uDAKGwC,MAAK,SAAA4J,GACJtQ,EAAS,CACPI,KAAM,iBACNiF,SAASzB,EAAAA,GAAAA,cAAa0M,EAAKE,QAE9B,IACA3J,OAAM,SAAAlD,GAAK,OAAI3D,EAAS,CAAEI,KAAM,yBAA0BuD,MAAAA,GAA/C,KAfd3D,EAAS,CAAEI,KAAM,0BAiBpB,CACF,CC/PY2jB,CAAab,EAAQD,GAC/B,GAAE,CAACjjB,EAAUkjB,EAAQD,IAElBQ,GAAoBD,EAEpB,gBAAC,GAAD,KACE,gBAAC,KAAD,CAAMhd,MAAO,CAAEwd,UAAW,MAAOC,aAAc,QAC7C,gBAAC,KAAD,CACEL,MAAM,qBACNM,OACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,SAIN,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAYC,QAAQ,MAApB,qBACqB,IAClBb,EAAe,YAAcD,EAAe,UAAY,SAF3D,KAKA,2BACCC,GACC,gBAAC,IAAD,gFAKDC,GACC,2BACE,gBAAC,IAAD,oOAMA,6BAIN,gBAAC,KAAD,KACGD,GACC,gBAAC,KAAD,CAAQc,QAAS5Z,GAAO,YAAaE,IAArC,kBAID6Y,GACC,gCACE,gBAAC,KAAD,CACEa,QAAS,kBACPtkB,EAAS6hB,GAAuB,CAAExpB,GAAI6qB,IAD/B,GADX,oBAOA,gBAAC,KAAD,CACEqB,KAAK,uDACLC,OAAO,UAFT,uBAcP,gBAAC,GAAD,KACR,E,oxDC3FM,SAASC,GAAcpB,GAC5B,OAAOA,EAAMqB,KAAKC,eACnB,CAEM,SAASC,GAAkBvB,EAAOwB,GACvC,OAAOxB,EAAMyB,MAAMC,MAAMF,EAC1B,CAEM,SAASG,GAAiB3B,EAAO4B,GACtC,OAAO5B,EAAM6B,SAASC,YAAYF,EACnC,CAMM,SAASG,GAAmB/B,GACjC,OAAOA,EAAM6B,SAASvhB,KACvB,CAEM,SAAS0hB,GAAmBC,EAAYC,EAAMC,GACnD,MAAO,CACLP,UAAWK,EAAWL,UACtBQ,aAAcH,EAAWG,cAAgB,EACzCC,SAAUH,EAAKI,gBACfC,UAAW/sB,OAAOD,KAChB,KAAO4sB,GAAM,SAAAK,GACX,OAAyB,IAAlBA,EAAEC,WACV,KACD3V,OACF4V,SAAUR,EAAKQ,SAElB,CA0BM,SAASC,GAAW3C,GACzB,OAAOA,EAAMmC,KAAKT,KACnB,CAEM,SAASkB,GAAU5C,EAAO6C,GAC/B,IAAKA,EACH,OAAO,KAGT,IAAMvlB,EAAM9H,OAAO8Q,OAAO0Z,EAAMmC,KAAKT,OAAOoB,MAAK,YAAkB,IAAf9tB,EAAe,EAAfA,GAAIoI,EAAW,EAAXA,KACtD,OAAOpI,IAAO6tB,GAAczlB,IAASylB,CACtC,IAED,OAAKvlB,EAKE,SAAKA,GAAZ,IAAiBylB,WAAYzlB,EAAIylB,YAAc,KAJtC,IAKV,CAMM,SAASC,GAAehD,GAC7B,OAAO,IAAOA,EAAMiD,SAASvB,MAC9B,CAEM,SAASwB,GAAuBlD,GACrC,OAAO,SAAA7E,GACL,IAAM1b,EAAmB0b,EAAQ1b,iBAC7B0b,EAAQ1b,iBACL5K,KAAI,SAAAG,GACH,IAAM2I,EAAMqiB,EAAMmD,KAAKzB,MAAM1sB,GAC7B,GAAI2I,EAAK,CACP,IAAML,EAAM0iB,EAAMmC,KAAKT,MAAM/jB,EAAI6M,OACjC,OAAO,SAAK7M,GAAZ,IAAiBL,IAAAA,GAClB,CACD,OAAOK,CACR,IACAqH,OAAOoe,SACV,KACJ,OAAO,SAAKjI,GAAZ,IAAqB1b,iBAAAA,GACtB,CACF,CAEM,SAAS4jB,GAAgBrD,EAAO5Y,GACrC,OAAKA,GACAA,EAAQkc,QAKTC,MAAMC,QAAQpc,EAAQkc,QAAQ,IACzBlc,EAAQkc,QAAQzuB,KAAI,YAAwB,cAAtB4uB,EAAsB,KAAXjZ,EAAW,KACjD,MAAO,CACLvM,QAAS+hB,EAAM0D,SAAShC,MAAM+B,IAAc,CAAC,EAC7CnmB,IAAK0iB,EAAMmC,KAAKT,MAAMlX,IAAU,CAAC,EAEpC,IAIIpD,EAAQkc,QAhBM,EAiBtB,CAEM,SAASK,GAAc3D,GAC5B,OAAO,SAAA7E,GAAO,gBAAUA,GAAV,IAAmBmI,QAASD,GAAgBrD,EAAO7E,IAAnD,CACf,CAqBM,SAASyI,GAA2B5D,GACzC,OAAOA,EAAMmD,KAAK7iB,KACnB,CAEM,SAASujB,GAAmB7D,GACjC,OAAOA,EAAMiD,SAAS3iB,KACvB,CAEM,SAASwjB,GAAsB9D,GACpC,OAAOA,EAAMiD,SAASc,SACvB,CAEM,SAASC,GAAyBhE,GACvC,OAAOA,EAAMiD,SAASgB,UACvB,CAIM,SAASC,GAAelE,GAC7B,OAAOA,EAAMmE,cAAcC,QAC5B,CAEM,SAASC,GAAsBrE,GACpC,OAAOA,EAAMmE,cAAcJ,SAC5B,CAEM,SAASO,GAAqBtE,GACnC,OAAOA,EAAMmE,cAAcI,QAC5B,CAEM,SAASC,GAAkBxE,GAChC,OAAOA,EAAMmE,cAAc7jB,KAC5B,CAEM,SAASmkB,GAAoBzE,GAClC,OAAOA,EAAMmE,cAAczC,MAAMtb,MAAK,SAACse,EAAGC,GACxC,OAAOD,EAAE7a,WAAa8a,EAAE9a,WACpB,EACA6a,EAAE7a,WAAa8a,EAAE9a,YAChB,EACD,CACL,GACF,CAMM,SAAS+a,GAAW5E,GACzB,OAAO,IAAOA,EAAMmD,KAAKzB,MAC1B,CAEM,SAASmD,GAAqB7E,GACnC,OAAOA,EAAMmD,KAAKc,UACnB,CAEM,SAASa,GAAkB9E,GAChC,OAAOA,EAAMmD,KAAKY,SACnB,CAiCM,SAASgB,GAAe/E,GAC7B,OAAOxqB,OAAO8Q,OAAO0Z,EAAMgF,SAAStD,MACrC,CASM,SAASuD,GAAuBjF,EAAOkF,GAAY,MACxD,iBAAOlF,EAAMgF,SAASG,cAAcD,UAApC,aAAO,EAA0CE,SAClD,CAaM,SAASC,GAA6BrF,GAAO,MAClD,iBAAOA,EAAMgF,SAASM,eAAtB,aAAO,EAAwBC,eAChC,CAeM,SAASC,GAAexF,GAC7B,OAAOA,EAAM0D,SAAShC,KACvB,CAUM,SAAS+D,GAAkBzF,GAChC,OAAOA,EAAM0F,YAAYhE,KAC1B,CAIM,SAASiE,GAAc3F,GAC5B,OAAOA,EAAMgF,SAASM,QAAQM,SAAW,EAC1C,CAIM,SAASC,GAAe7F,GAC7B,OAAOA,EAAMmC,KAAK7hB,KACnB,CAQM,SAASwlB,GAAkB9F,GAChC,OALK,SAAqBA,GAC1B,OAAOA,EAAM7S,MAAMuU,KACpB,CAGQqE,CAAY/F,GAAOA,EAAMgG,KAAKC,cACtC,CAEM,SAASC,GAAWlG,GACzB,OAAOA,EAAMgG,IACd,CAEM,SAASG,GAAoBnG,GAClC,OAAOA,EAAMoG,cAAc1E,KAC5B,CAYM,SAAS2E,GAAerG,GAC7B,OAAOA,EAAM6B,SAASH,KACvB,CAEM,SAAS4E,GAAoBtG,GAClC,OAAOA,EAAMqB,KAAKkF,aACnB,CAWM,SAASC,GAAgBxG,GAQ9B,MAAO,CAAEyG,UAPSzG,EAAMyG,UAAU/E,MAC/B7sB,KAAI,SAAA6xB,GAAC,gBACDA,GADC,IAEJC,QAAS,IAAI9pB,KAAK6pB,EAAEC,UAFhB,IAILrb,MAAM,EAAG,GAEQsb,QADJ5G,EAAMyG,UAAU1C,UAEjC,C,oDC/WD,SAAS8C,GAAT,GAA4C,MAAjBjf,EAAiB,EAAjBA,KAAMkf,EAAW,EAAXA,QACzBvf,GAAUkY,EAAAA,EAAAA,MAEVsH,EAC4B,0BAAhCxf,SAAA,UAAAA,EAAS3F,gBAAT,eAAmBolB,UAErB,OACE,gBAAC,KAAD,CAAQpf,KAAMA,IAASmf,EAA4BD,QAASA,GAC1D,gBAAC,KAAD,qCACA,gBAAC,KAAD,KACE,gBAAC,IAAD,0GAGE,2BACA,2BAJF,gSAYF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQ7F,QAAS5Z,GAAO,WAAYE,GAAU0f,MAAM,WAApD,oBAGA,gBAAC,KAAD,CACEjyB,GAAG,cACHisB,QAAS6F,EACTG,MAAM,UACNC,UAAU,aAJZ,sBAWP,CAOD,SAAe7J,EAAAA,KAAWwJ,I,gBC+B1B,SAvEA,WACE,IAAMlqB,GAAWmjB,EAAAA,EAAAA,MAEXqH,GAAcpH,EAAAA,EAAAA,KAClB,SAAAC,GAAK,OAAIA,EAAM7S,MAAMuU,MAAM1B,EAAMgG,KAAKC,cAAjC,GADwB,KAK/B,OACE,gBAAC,GAAD,KACE,gBAAC,KAAD,CAAM9iB,MAAO,CAAEwd,UAAW,MAAOC,aAAc,QAC7C,gBAAC,KAAD,CACEL,MAAM,wBACNM,OACE,gBAACC,GAAA,EAAD,KACE,gBAAC,KAAD,SAIN,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAYE,QAAQ,aAClB,yBACE,uDACG,IAHP,gFAOA,2BAEA,gBAAC,IAAD,mGAEgC,IAC9B,0DAHF,KAKA,2BACA,gBAAC,IAAD,sCACqC,sDAAiC,IADtE,yDAIA,2BACA,gBAAC,IAAD,sBACqB,gDADrB,8RAQA,2BACA,gBAAC,IAAD,KACE,yKAOJ,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEA,QAAQ,YACRhsB,GAAG,yBACHisB,QAAS,kBAAMtkB,EAAS6hB,GAAuB2I,GAAtC,GAHX,+CAWT,E,8SC0ND,UAAeC,EAAAA,GAAAA,IAlQA,SAAA1qB,GAAK,MAAK,CACvB2qB,QAAS,CACPJ,MAAO,GAAF,OAAKvqB,EAAM4qB,QAAQD,QAAQE,MAA3B,gBAEPC,UAAW,CACTP,MAAO,GAAF,OAAKvqB,EAAM4qB,QAAQhnB,MAAMinB,MAAzB,gBAEPE,eAAgB,CACdC,WAAYhrB,EAAM4f,QAAQ,MAE5BqL,sBAAuB,CACrBV,MAAO,4BAETjK,KAAM,CACJ0K,WAAY,EACZrL,cAAe,EACf4K,MAAO,2BACP,kBAAmB,CACjBW,gBAAiB,8BAGrBC,aAAc,CACZD,gBAAiB,UACjBE,UAAW,yBACXJ,WAAYhrB,EAAM4f,QAAQ,KAC1BD,cAAe3f,EAAM4f,QAAQ,MAE/ByL,eAAgB,CACdd,MAAOvqB,EAAM4qB,QAAQU,QAAQC,MAE/BC,YAAa,CACXC,SAAU,WAEZC,SAAU,CACRC,SAAU,OACVC,YAAa5rB,EAAM4f,QAAQ,GAC3BsE,aAAclkB,EAAM4f,QAAQ,KAE9BiM,MAAO,CACLtB,MAAO,2BACPoB,SAAU,OACVC,YAAa5rB,EAAM4f,QAAQ,GAC3BsE,aAAc,GAEhB4H,QAAS,CACP7H,UAAWjkB,EAAM4f,QAAQ,IA7CT,GAkQc,CAAEmM,WAAW,GAA/C,EAjNA,SAAmBC,GACjB,IT+MuClrB,ES/MjC+J,GAAUkY,EAAAA,EAAAA,MAER7C,EACN8L,EADM9L,QAAS4K,EACfkB,EADelB,UAAWlG,EAC1BoH,EAD0BpH,gBAAiBqH,EAC3CD,EAD2CC,gBAAiBC,EAC5DF,EAD4DE,aAGxDC,EAAa,CACjB,CACE7zB,GAAI,QACJwnB,SAAU,CACR,CACExnB,GAAI,OACJ8zB,KAAM,gBAACC,GAAA,EAAD,MACN5H,OAAQvG,GAAgB+N,IAE1B,CACE3zB,GAAI,WACJ8zB,KAAM,gBAACE,GAAA,EAAD,MACN7H,OAAQpF,GAAoB4M,IAE9B,CACE3zB,GAAI,cACJ8zB,KAAM,gBAACG,GAAA,EAAD,MACN9H,OAAQ/F,GAAuBuN,KAGnCJ,MAAO,gBAACW,GAAA,EAAD,OAET,CACEl0B,GAAI,QACJwnB,SAAU,CACR,CACExnB,GAAI,QACJ8zB,KAAM,gBAACK,GAAA,EAAD,MACNhI,OAAQlG,GAAoB0N,IAE9B,CACE3zB,GAAI,mBACJ8zB,KAAM,gBAACM,GAAA,EAAD,MACNjI,OAAQ5F,GAAgBoN,IAE1B,CACE3zB,GAAI,iBACJ8zB,KAAM,gBAACO,GAAA,EAAD,MACNlI,QToK+B3jB,ESpKEmrB,ETqKlC,GAAP,OAAUnO,GAAYhd,GAAtB,cSlKI+qB,MAAO,gBAACe,GAAA,EAAD,OAET,CACEt0B,GAAI,SACJwnB,SAAU,CACR,CACExnB,GAAI,kBACJ8zB,KAAM,gBAACS,GAAA,EAAD,MACNpI,OAAQnG,GAAkC2N,IAE5C,CACE3zB,GAAI,oBACJ8zB,KAAM,gBAAC/H,GAAA,EAAD,MACNI,OAAQ1G,GAAkBkO,IAE5B,CACE3zB,GAAI,mBACJ8zB,KAAM,gBAACU,GAAA,EAAD,MACNrI,OAAQzG,GAAoBiO,IAE9B,CACE3zB,GAAI,YACJ8zB,KAAM,gBAACW,GAAA,EAAD,MACNtI,OAAQlF,GAAqB0M,KAGjCJ,MAAO,gBAACmB,GAAA,EAAD,QAILC,EAAe,CACnB,CACE30B,GAAI,UACJwnB,SAAU,CACR,CACExnB,GAAI,oBACJ8zB,KAAM,gBAACc,GAAA,EAAD,MACNzI,OThLD,aSkLD,CACEnsB,GAAI,iBACJ8zB,KAAM,gBAACG,GAAA,EAAD,MACN9H,OTzID,gBS2ID,CACEnsB,GAAI,gBACJ8zB,KAAM,gBAACe,GAAA,EAAD,MACNjf,OAAQ,kBAAM3J,OAAO2G,KAAK,2BAA4B,SAA9C,GAEV,CACE5S,GAAI,kBACJ8zB,KAAM,gBAACgB,GAAA,EAAD,MACNlf,OAAQ,kBAAM3J,OAAO2G,KAAK,+BAAgC,SAAlD,GAEV,CACE5S,GAAI,SACJ8zB,KAAM,gBAACiB,GAAA,EAAD,MACNnf,OAAQ,kBAAM3J,OAAO2G,KAAK,4BAA6B,SAA/C,GAEV,CACE5S,GAAI,cACJ8zB,KAAM,gBAACkB,GAAA,EAAD,MACNpf,OAAQ,kBAAM3J,OAAO2G,KAAK,4BAA6B,SAA/C,IAGZ2gB,MAAO,gBAAC0B,GAAA,EAAD,OAET,CACEj1B,GAAI,GAAF,OAAKiM,OAAOipB,OAAS,OAAS,GAA9B,mBAA2CjpB,OAAOC,aACpDsb,SAAU,CACR,CAAExnB,GAAIiM,OAAOW,SAASuoB,SAAUrB,KAAM,gBAACsB,GAAA,EAAD,MAAcjJ,OAAQ,MAE9DoH,MAAO,gBAAC8B,GAAA,EAAD,QAIX,OACE,gBAACC,GAAA,EAAD,CAAMC,gBAAc,EAACv1B,GAAG,cACrB2zB,EAAgB3zB,IACf6zB,EAAWh0B,KAAI,WAA0B21B,GAA1B,IAAGx1B,EAAH,EAAGA,GAAIwnB,EAAP,EAAOA,SAAU+L,EAAjB,EAAiBA,MAAjB,OACb,gBAAC,WAAD,CAAgBhc,IAAKvX,GACZ,IAANw1B,GAAW,gBAAC,IAAD,CAASzN,UAAWH,EAAQ4L,UACxC,gBAACiC,GAAA,EAAD,CAAUC,UAAQ,EAAC3N,UAAWH,EAAQ6K,gBACpC,gBAACkD,GAAA,EAAD,CAAc5N,UAAWH,EAAQ2L,OAAQA,GACzC,gBAACqC,GAAA,EAAD,CACEhO,QAAS,CACPoL,QAASpL,EAAQ+K,wBAGlB3yB,IAGJwnB,EAAS3nB,KAAI,gBAAOg2B,EAAP,EAAG71B,GAAa8zB,EAAhB,EAAgBA,KAAM3H,EAAtB,EAAsBA,OAAtB,OACZ,gBAACsJ,GAAA,EAAD,CACEz1B,GAAI61B,EACJte,IAAKse,EACLC,QAAM,EACN7J,QAAS5Z,GAAO8Z,EAAQ5Z,GACxBwV,WAAWgO,EAAAA,EAAAA,GACTnO,EAAQI,KACRsE,IAAoBuJ,GAAWjO,EAAQmL,eAC3B,qBAAZ8C,IACIjC,IAAiBpB,GAAa5K,EAAQyK,SACrCG,GAAa5K,EAAQ4K,aAG5B,gBAACmD,GAAA,EAAD,CAAc5N,UAAWH,EAAQwL,UAAWU,GAC5C,gBAAC8B,GAAA,EAAD,CACEhO,QAAS,CACPoL,QAASpL,EAAQsL,cAGlB2C,GApBO,IAbH,IAuChBlB,EAAa90B,KAAI,gBAAGG,EAAH,EAAGA,GAAIwnB,EAAP,EAAOA,SAAU+L,EAAjB,EAAiBA,MAAjB,OAChB,gBAAC,WAAD,CAAgBhc,IAAKvX,GAClB2zB,EAAgB3zB,IAAM,gBAAC,IAAD,CAAS+nB,UAAWH,EAAQ4L,UACnD,gBAACiC,GAAA,EAAD,CACEC,UAAQ,EACR3N,UAAWH,EAAQ6K,eACnBzyB,GAAE,mBAAcA,IAEhB,gBAAC21B,GAAA,EAAD,CAAc5N,UAAWH,EAAQ2L,OAAQA,GACzC,gBAACqC,GAAA,EAAD,CACEhO,QAAS,CACPoL,QAASpL,EAAQ+K,wBAGlB3yB,IAGJwnB,EAAS3nB,KAAI,gBAAOg2B,EAAP,EAAG71B,GAAa8zB,EAAhB,EAAgBA,KAAM3H,EAAtB,EAAsBA,OAAQvW,EAA9B,EAA8BA,OAAQ8f,EAAtC,EAAsCA,SAAtC,OACZ,gBAACD,GAAA,EAAD,CACEle,IAAKse,EACLC,QAAM,EACNJ,SAAUA,EACVzJ,QAASE,EAAS9Z,GAAO8Z,EAAQ5Z,GAAWqD,EAC5CmS,WAAWgO,EAAAA,EAAAA,GACTnO,EAAQI,KACRsE,IAAoBuJ,GAAWjO,EAAQmL,iBAGzC,gBAAC4C,GAAA,EAAD,CAAc5N,UAAWH,EAAQwL,UAAWU,GAC5C,gBAAC8B,GAAA,EAAD,CACEhO,QAAS,CACPoL,QAASpL,EAAQsL,cAGlB2C,GAjBO,IAjBA,IA0CvB,I,wRChRD,SAASG,GAAeC,GACtB,IAAMjpB,GAAUP,EAAAA,GAAAA,gBAAewpB,GAE/B,OAAO5oB,GpB6FF,SAA4B4oB,GACjC,MAAO,GAAP,OAlDO,gBAkDP,YAA+BA,EAAMj2B,GAArC,eACD,CoB/Fak2B,CAAmBD,GAAQjpB,GACpCqB,KADI,e,EAAA,G,EAAA,yBACC,WAAM1D,GAAN,4FAAkBY,GAAAA,aAAlB,SAAqCZ,EAASkB,OAA9C,sG,iLADD,uDAEJ2C,OAAM,SAAAlD,GAAK,OAAIye,QAAQC,OAAO1e,EAAnB,GACf,CAEM,SAAS6qB,GAAT,GAA2C,IAArBvJ,EAAqB,EAArBA,UAAWJ,EAAU,EAAVA,OACtC,OAAO,SAAA7kB,GAGL,OAFAA,EAjCJ,YAA+C,IAAvByiB,EAAuB,EAAvBA,YAAaoC,EAAU,EAAVA,OACnC,MAAO,CAAEzkB,KAAM5D,GAAeimB,YAAAA,EAAaoC,OAAAA,EAC5C,CA+BY4J,CAAa,CAAEp2B,GAAI4sB,EAAWJ,OAAAA,KAEhCwJ,GAAe,CAAEh2B,GAAI4sB,EAAWJ,OAAAA,IACpCne,MAAK,SAAA7F,GACJb,EAjCR,YAAkC,IAAXa,EAAW,EAAXA,QACrB,MAAO,CAAET,KAAM3D,GAAcoE,QAAAA,EAC9B,CA+BgB6tB,CAAY,CAAE7tB,QAAAA,KACvBb,EAzBC2G,GAAkB,4BAA6B,WA0BjD,IACAE,OAAM,SAAAlD,GACL3D,EAjCR,SAA0B2D,GACxB,MAAO,CAAEvD,KAAM1D,GAAoBiH,MAAAA,EACpC,CA+BgBgrB,CAAiBhrB,IAC1B3D,EAzBC2G,GACL,+CACA,UAwBG,GACJ,CACF,CAsBM,SAASioB,GAAkBC,GAChC,OAAO,SAAA7uB,GACL,OAnBJ,EAmB2B6uB,EAnBAnjB,EAAuB,EAAvBA,OAAQojB,EAAe,EAAfA,IAAKje,EAAU,EAAVA,OAC/B,IAAIuR,SAAQ,SAACtpB,EAASupB,GAC3B0M,OAAOC,KAAKC,YACV,CAAEvjB,OAAAA,EAAQojB,IAAAA,EAAKI,IAAKre,IACpB,SAAC5N,EAAQD,GACQ,MAAXC,EACFnK,EAAQkK,GAERqf,EAAOrf,EAEV,GAEJ,KAOqC0D,MAAK,SAAA+b,GAAW,OAClD0M,GAA8B1M,EAA9B0M,CAA2CnvB,EADO,IAnBxD,MAA2B0L,EAAQojB,EAAKje,CAsBrC,CACF,CAIM,SAASue,KACd,MAAO,CAAEhvB,KAAM,kBAChB,CAkBM,SAASivB,GAAS5kB,GACvB6kB,KAAKjsB,KAAO,WACZisB,KAAK7kB,QAAUA,GAAW,kBAC1B6kB,KAAKC,OAAQ,IAAI72B,OAAQ62B,KAC1B,C,0HCvFM,SAASC,KACd,OAAO,SAAAxvB,GAGL,OAFAA,EAbK,CAAEI,KvBuJmB,mBuBjIrBuE,GrB/BA,cqBgCJ+B,KADI,e,EAAA,G,EAAA,yBACC,WAAM1D,GAAN,kGACSY,GAAAA,aADT,SAC4BZ,EAASkB,OADrC,0BACEoM,GADF,gCAEGA,EAAKwU,OAFR,0C,iLADD,uDAKJje,OAAM,SAAAlD,GACL,OAAOye,QAAQC,OAAO1e,EACvB,IAbE+C,MAAK,SAAAoe,GAAK,OAAI9kB,EAbrB,SAAuB8kB,GACrB,MAAO,CAAE1kB,KAAMvB,GAAgBimB,MAAAA,EAChC,CAW6B2K,CAAc3K,GAA3B,IACVje,OAAM,SAAAlD,GAAK,OAAI3D,EAVtB,SAA0B2D,GACxB,MAAO,CAAEvD,KvBiJuB,qBuBjJGuD,MAAAA,EACpC,CAQ8B+rB,CAAiB/rB,GAA9B,GACf,CACF,CDgFD0rB,GAASM,UAAY92B,OAAO+2B,OAAOl3B,MAAMi3B,WACzCN,GAASM,UAAUE,YAAcR,G,s9DEhGjC,IAAM9P,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC+vB,UAAW,CACT9L,UAAWjkB,EAAM4f,QAAQ,GACzBsE,aAAclkB,EAAM4f,QAAQ,GAC5B+L,SAAU,KAEZqE,WAAY,CACV/L,WAAYjkB,EAAM4f,QAAQ,IAE5BhnB,KAAM,CACJq3B,WAAYjwB,EAAMkwB,WAAWC,SAC7B1E,SAAU,QAXoB,IAelC,SAAS2E,GAAT,GAaG,IAZDC,EAYC,EAZDA,MACAliB,EAWC,EAXDA,MACAmiB,EAUC,EAVDA,UACAC,EASC,EATDA,UAEAC,GAOC,EARDC,KAQC,EAPDD,QACAE,EAMC,EANDA,UAEAptB,GAIC,EALDqtB,QAKC,EAJDrtB,MACAhL,EAGC,EAHDA,GAGC,IAFDs4B,KAAQC,EAEP,EAFOA,QAASjtB,EAEhB,EAFgBA,MAAOmF,EAEvB,EAFuBA,qBAAsB+nB,EAE7C,EAF6CA,YAC3CC,EACF,SACK7Q,EAAUV,KAEhB,MAAwCwR,EAAAA,EAAAA,WAAS,GAAjD,GAAOC,EAAP,KAAqBC,EAArB,KAMMC,EAAwB,SAAAvtB,GAAK,uBAAI,GAAGwtB,OAAOxtB,aAAV,EAAUA,EAAO8G,gBAArB,aAAI,EAA2Bf,KAAK,IAApC,EAE3BG,EAAgBumB,EAAhBvmB,MAAOzJ,EAASgwB,EAAThwB,KAETgxB,EAAyB,WAAjB,GAAOvnB,GAEfwnB,EAAYD,EAAQ5rB,KAAKC,UAAUoE,GAASA,EAE5CynB,EACHT,IAAgB/nB,GAA0BnF,GAASitB,EAEtD,OACE,gBAACW,EAAA,EAAD,CAAQC,KAAMjB,EAAQkB,eAAe,OACzB,aAATrxB,EACC,gBAACsxB,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAYC,QAASv5B,GAAK6V,GAC1B,gBAAC2jB,GAAA,EAAD,IACEx5B,GAAIA,GAAMgL,EACV+c,UAAWH,EAAQ6P,UACnBO,UAAWA,EACX1sB,MAAO2tB,EACPQ,aACE,gBAAC,KAAD,CAAgBxoB,SAAS,OACvB,gBAACyoB,EAAA,EAAD,CACE,aAAW,6BACXzN,QA7BgB,WAC9B2M,GAAiBD,EAClB,GA6BgBA,EAAe,gBAACgB,GAAA,EAAD,MAAiB,gBAACC,GAAA,EAAD,SAInC7B,EACAU,EAhBN,CAiBE1wB,KAAM4wB,EAAe,OAAS,WAC9BnnB,MAAOwnB,EACPa,WAAY,CACV,aACmB,WAAjB,GAAOhkB,GAAqBkiB,EAAM/sB,KAAKuL,cAAgBV,EACzDikB,KAAM,cAGTb,GACC,gBAAC,KAAD,CAAgBlR,UAAWH,EAAQ8P,WAAYpsB,MAAO2tB,GACnD3tB,GAASutB,EAAsBL,KAKtC,gBAAC,IAAD,IACEx4B,GAAIA,GAAMgL,EACV+c,UAAWH,EAAQ6P,UACnB5hB,MAAOA,EACPmiB,UAAWA,EACX+B,OAAQ,SAAAC,GAAK,OAAIjC,EAAMgC,OAAOC,EAAjB,EACbtC,WACEuB,EAAY3tB,GAASutB,EAAsBL,QAAeyB,EAE5D3uB,MAAO2tB,EACPhB,UAAWc,GAASd,EACpBiC,WAAY,CACVtS,QAAS,CAAEmQ,MAAOK,GAAaxQ,EAAQtnB,OAEzCu5B,WAAY,CACV,aACmB,WAAjB,GAAOhkB,GAAqBkiB,EAAM/sB,KAAKuL,cAAgBV,IAEvDkiB,EACAU,EAnBN,CAoBE1wB,KAAMA,EACNyJ,MAAOwnB,KAKhB,CAED,SAAe3Q,EAAAA,KAAWyP,I,o9BClE1B,IAAM5Q,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCyyB,KAAM,CACJvH,gBAAiBlrB,EAAM4qB,QAAQkB,SAEjC4G,UAAW,CACTC,OAAQ,WAEVxO,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3C3nB,MAAO,CACL2mB,MAAO,OAXuB,IAe5BsI,GAAW,SAAC,GAAyB,IAAvBlnB,EAAuB,EAAvBA,OAAQojB,EAAe,EAAfA,IAAKI,EAAU,EAAVA,IACzBxrB,EAAS,CAAC,EAchB,OAbIgI,IACGqjB,OAAOC,KAAK6D,mBAAmBnnB,EAAOuE,QAAQ,MAAO,OACxDvM,EAAOgI,OAAS,wBAGhBwjB,IACGH,OAAOC,KAAK8D,eAAe5D,EAAIjf,QAAQ,MAAO,OACjDvM,EAAOwrB,IAAM,mBAGZH,OAAOC,KAAK+D,YAAYjE,KAC3BprB,EAAOorB,IAAM,sBAERprB,CACR,EAEKsvB,GAAY,CAChBC,KAAM,uBACN,mBAAoB,uBACpBC,WAAY,6BACZC,SAAU,2BACVC,IAAK,sBACL,cAAe,8BACfC,QAAS,4BAgQX,SA7PA,WACE,IAAMpT,EAAUV,KAChB,MAA8BwR,EAAAA,EAAAA,UAAS,UAAvC,GAAOuC,EAAP,KAAgBC,EAAhB,KACM3oB,GAAUkY,EAAAA,EAAAA,MACV9iB,GAAWmjB,EAAAA,EAAAA,MAEXqH,GAAcpH,EAAAA,EAAAA,IAAY+F,IAC1BqK,GAAepQ,EAAAA,EAAAA,IAAYsG,GAAD,KAE1B+J,GADW56B,OAAOD,KAAK46B,GAAct7B,KAAI,SAAAG,GAAE,OAAIm7B,EAAan7B,EAAjB,KACf,IAAIgQ,QAAO,SAAAwlB,GAAC,MAAmB,UAAfA,EAAE6F,QAAN,IACxC5O,GAAQ1B,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMyB,MAAMC,KAAhB,GAAN,KACnBqC,GAAaoD,EACbmJ,GAAsBvQ,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM7S,MAAMojB,YAAhB,IA2BvCC,EAAc,SAAAp7B,GAClB86B,EAAW96B,EAAE+rB,OAAOnhB,KACrB,EAqBD,IAfAqgB,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,mBACjB5jB,EAASwvB,KACV,GAAE,CAACxvB,KAEJ0jB,EAAAA,EAAAA,YAAU,WACR1jB,EAASoQ,KACV,GAAE,CAACujB,EAAqB3zB,KAEzB0jB,EAAAA,EAAAA,YAAU,WACRoQ,KAAAA,iBAAyBnQ,SAASoQ,cAAc,oBAAsB,IACtED,KAAAA,iBAAyBnQ,SAASoQ,cAAc,iBAAmB,IACnED,KAAAA,cAAsBnQ,SAASoQ,cAAc,iBAAmB,GACjE,IAEG3M,EACF,OAAO,4BAGT,IAzHF,EAA8B4M,EAAOC,EAAUC,EAASC,EAAOzjB,EAyHvD0jB,GAzHsBJ,GAA9B,EAyH0CxJ,GAzHZwJ,MAAOC,EAAmC,EAAnCA,SAAUC,EAAyB,EAAzBA,QAASC,EAAgB,EAAhBA,MAAOzjB,EAAS,EAATA,MACtD,CACL2jB,QAAmB,qBAAVF,EAA+B,KAAO,IAC/CA,MAAAA,EACAG,QAASN,EAAQ,kBAAH,OAAqBA,GAAU,GAC7ClF,IAAKkF,EAAQ,MAAQ,MACrBtjB,MAAAA,EACAwe,IAAK+E,GAAYC,EAAZ,UAAyBD,EAAzB,cAAuCC,GAAY,UACxDxoB,OAAQsoB,EAAQ,kBAAH,OAAqBA,GAAU,KAmHxCO,EAAYvB,GAAUoB,EAAaD,OAEzC,OACE,gBAAC,GAAD,KACE,gBAAC,KAAD,CAAM/T,UAAWH,EAAQ+O,KAAM32B,GAAG,gBAChC,gBAAC,KAAD,CACEurB,MAAM,UACN4Q,UAAWJ,EAAa1jB,MACxBwT,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAACuQ,GAAA,EAAD,SAIN,gBAAC,KAAD,CAAarU,UAAWH,EAAQuS,KAAMn6B,GAAG,wBACvC,gBAAC,IAAD,KACG+7B,EAAaE,QAAb,oCACgCF,EAAaC,QAD7C,KAEG,8DACHD,EAAaE,SACZ,4BACE,qBAAGlU,UAAWmU,IADhB,IAC+BH,EAAaE,QAD5C,eACiE,IAC9DF,EAAalF,IAFhB,OAON,gBAAC,KAAD,CAAa72B,GAAG,6BACd,gBAAC,IAAD,CAAYgsB,QAAQ,MAApB,mCACA,gBAACqQ,GAAA,EAAD,CAAOr8B,GAAG,yBACR,gBAACs8B,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,gBACA,gBAACA,GAAA,EAAD,aACA,gBAACA,GAAA,EAAD,eAEE,gBAAC,KAAD,CAASjR,MAAM,uEACb,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,gBAACqJ,GAAA,EAAD,uBAGJ,gBAACE,GAAA,EAAD,KACGtB,EAAav7B,KAAI,SAAA88B,GAAU,OAC1B,gBAACJ,GAAA,EAAD,CACEv8B,GAAI28B,EAAW38B,GACf48B,OAAK,EACLrlB,IAAKolB,EAAW38B,GAChB+nB,UAAWH,EAAQwS,UACnBnO,QAAS5Z,GAAOqT,GAAoBiX,GAAapqB,IAEjD,gBAACiqB,GAAA,EAAD,CAAWx8B,GAAG,gBAAgB28B,EAAW3xB,MACzC,gBAACwxB,GAAA,EAAD,CAAWx8B,GAAG,gBACXysB,EAAMkQ,EAAWnQ,QACdC,EAAMkQ,EAAWnQ,QAAQ3W,MACzB,MAEN,gBAAC2mB,GAAA,EAAD,CAAWx8B,GAAG,sBAAd,IAEGysB,EAAMkQ,EAAWnQ,QACdC,EAAMkQ,EAAWnQ,QAAQqQ,MAAQ,IACjC,MAEN,gBAACL,GAAA,EAAD,CAAWx8B,GAAG,8BACX6T,GAAa8oB,EAAWG,mBArBH,OA4BlC,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE98B,GAAG,oBACHisB,QAAS5Z,GbpPZ,YaoPmCE,IAFlC,iBAMA,gBAAC,KAAD,CACEvS,GAAG,sBACHisB,QAAS,kBAAMtkB,GT/LzB+N,GACE,UACA,oBS6LoDqmB,EAAaE,QT5LrD,WAAa,eAEpB,CAAEl0B,KAAM9D,KS0LI,GAER83B,EAAaE,QAAU,SAAW,MAJrC,WAQJ,gBAAC,KAAD,CACEj8B,GAAG,qBACH4S,KAAM0oB,EACNxJ,QAAS,kBAAMnqB,EAASwhB,KAAf,EACT4T,gBAAiB,CAAEC,SApHD,WACtB9B,EAAW,SACZ,IAoHK,gBAAC,MAAD,CACE+B,SApJO,SAAC,GAAyB,IAAvB5pB,EAAuB,EAAvBA,OAAQwjB,EAAe,EAAfA,IAAKJ,EAAU,EAAVA,IACvBzpB,EAAU,CACdqG,OAAQA,EAAOuE,QAAQ,KAAM,IAC7BY,OAAQqe,EAAIjf,QAAQ,KAAM,IAC1B6e,IAAAA,GAGF,OAAO,IAAI1M,SAAQ,SAAAtpB,GACjBkH,EAAS4uB,GAAkBvpB,IACxBqB,MAAK,WACJ5N,GACD,IACA+N,OAAM,SAAAlD,GACDA,aAAiB0rB,IACnBv2B,EAAQ,CACNy8B,YAAa,8BAGjBz8B,EAAQ,CACN08B,YAAa,8BAEhB,GACJ,GACF,EA8HO5C,SAAUA,GACV6C,OAAQ,gBACNC,EADM,EACNA,aACAC,EAFM,EAENA,WACAC,EAHM,EAGNA,QACA9sB,EAJM,EAINA,qBACA+sB,EALM,EAKNA,SACAlsB,EANM,EAMNA,OACAf,EAPM,EAONA,aAPM,OASN,2BACE,gBAAC,KAAD,KACGwrB,EAAaE,QAAU,SAAW,MADrC,YACqD,IACnD,yBAAIF,EAAa1jB,QAEnB,gBAAC,KAAD,KACE,gBAAC,KAAD,CACErN,KAAK,iBACLqI,OAAQ/B,EAAO+B,QAAU0oB,EAAa1oB,OACtCmF,OAAQlH,EAAOulB,KAAOkF,EAAalF,IACnCJ,IAAKnlB,EAAOmlB,KAAOsF,EAAatF,IAChCwE,QAASA,IAEX,wBAAMgC,SAAUI,EAAcr9B,GAAG,oBAC/B,gBAAC,KAAD,CAAM6nB,WAAS,EAACP,QAAS,EAAGQ,eAAe,iBACzC,gBAAC,KAAD,CAAME,MAAI,EAACC,GAAI,IACb,gBAAC,MAAD,CACEjd,KAAK,SACLgtB,WAAS,EACTniB,MAAM,cACN4nB,UAAW3F,GACX/vB,KAAK,MACL21B,YAAa3B,EAAa1oB,OAC1BsqB,QAASnC,KAGb,gBAAC,KAAD,CAAMxT,MAAI,EAACC,GAAI,GAAI2V,GAAI,GACrB,gBAAC,MAAD,CACE5yB,KAAK,MACLgtB,WAAS,EACTniB,MAAM,kBACN4nB,UAAW3F,GACX4F,YAAa3B,EAAalF,IAC1B8G,QAASnC,KAGb,gBAAC,KAAD,CAAMxT,MAAI,EAACC,GAAI,GAAI2V,GAAI,GACrB,gBAAC,MAAD,CACE5yB,KAAK,MACLgtB,WAAS,EACTniB,MAAM,MACN4nB,UAAW3F,GACX/vB,KAAK,MACL21B,YAAa3B,EAAatF,IAC1BkH,QAASnC,MAIdjrB,IAAiBE,GAChB,gBAAC,IAAD,CAAYsX,UAAWH,EAAQtc,OAC5BiF,EAAa2sB,aAAe3sB,EAAa4sB,YAAa,IACvD,2BAFF,8DAQN,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEn9B,GAAG,WACHisB,QAASoR,EACT3H,SACE4H,GAAcE,GAAaD,IAAY9sB,GAGxC6sB,EACC,qBAAGvV,UAAU,sCAEb,SA7EF,KAuFjB,E,i9DCxVM,SAAS8V,GAAe5lB,GAC7B,OAAOvK,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAO,IAAI7O,GAAAA,GAAAA,MAAaE,IACvD,CAEM,SAAew0B,GAAtB,mC,oDAAO,WAA8BC,GAA9B,6FACLA,EAAQv9B,OAAOuP,YAAYvP,OAAOiL,QAAQsyB,GAAO/tB,QAAO,+CADnD,SAEkB1D,GxBqLhB,mBwBrL0CyxB,GAF5C,cAECpzB,EAFD,YAIEkzB,GAJF,SAIuBlzB,EAASkB,OAJhC,wG,sBAOP,SAASmyB,GAAgB/lB,GACvB,MAAI,CAAC,WAAY,WAAY,SAAU,OAAOgmB,SAAShmB,EAAK2Y,SACnD,UAAKrlB,EAAAA,GAAAA,cAAa,KAAK0M,EAAM,UAApC,IAA8C/K,KAAM+K,EAAK/K,QAEpD3B,EAAAA,GAAAA,cAAa0M,EACrB,CAEM,SAAeimB,GAAtB,mC,oDAAO,WAA6Br1B,GAA7B,sGACkByD,GAAI1D,GAAkBC,IADxC,cACC8B,EADD,YAGE+C,GAAAA,GAHF,KAGYswB,GAHZ,SAGkCrzB,EAASkB,OAH3C,mDAGoDvC,GAHpD,oF,sBAMP,SAAS60B,GAASC,GAChB,MAAyB,iBAAXA,EAAsBjxB,KAAKkI,MAAM+oB,GAAWA,CAC3D,CAEM,SAAeC,GAAtB,qC,oDAAO,WAA6Bx1B,EAAYy1B,GAAzC,+FACCtxB,EAAU,CACdnE,WAAY,CACV+nB,QAAS/nB,EAAW+nB,QACpB1jB,KAAMixB,GAASt1B,EAAWqE,MAC1BqxB,QAAS11B,EAAW01B,QACpBC,YAAa31B,EAAW41B,WACxBzzB,KAAMnC,EAAWmC,KACjB0zB,WAAY71B,EAAW+jB,UACvBpB,QAAS3iB,EAAWgiB,QAEtBsB,OAAQmS,GAXL,SAckBvxB,GAAInE,GAAkBC,GAAamE,GAdrD,cAcCrC,EAdD,YAeE+C,GAAAA,GAfF,KAeYswB,GAfZ,SAekCrzB,EAASkB,OAf3C,mDAeoDvC,GAfpD,oF,sBAkBA,SAAeq1B,GAAtB,mC,oDAAO,WAAiC91B,GAAjC,gGACQyE,GAAI1E,GAAkBC,IAD9B,oF,sBAIA,SAAe+1B,GAAtB,mC,oDAAO,WAA8B/1B,GAA9B,+FACCmE,EAAU,CACdnE,WAAY,CACV+nB,QAAS/nB,EAAW+nB,QACpB1jB,KAAMixB,GAASt1B,EAAWqE,MAC1BqxB,QAAS11B,EAAW01B,QACpBC,YAAa31B,EAAW41B,WACxBzzB,KAAMnC,EAAWmC,KACjB0zB,WAAY71B,EAAW+jB,UACvBpB,QAAS3iB,EAAWgiB,SATnB,SAakBxd,GxB4HhB,mBwB5H2CL,GAb7C,cAaCrC,EAbD,YAcE+C,GAAAA,GAdF,KAcYswB,GAdZ,SAckCrzB,EAASkB,OAd3C,mDAcoDvC,GAdpD,oF,sBAiBA,SAAeu1B,GAAtB,qC,oDAAO,WAAuCh2B,EAAY+jB,GAAnD,sGACkB7f,GAAIjE,GAA8BD,GAAa,CACpE61B,WAAY9R,IAFT,cACCjiB,EADD,YAIE+C,GAAAA,GAJF,KAIYswB,GAJZ,SAIkCrzB,EAASkB,OAJ3C,mDAIoDvC,GAJpD,oF,sVCxDA,SAASw1B,GAAiBf,GAC/B,MAAO,CACLgB,QAASjB,GAAeC,GACxBiB,MAAO,CAAC79B,EAAqBC,EAAqBF,GAErD,CAGD,SAAS+9B,GAAkBjyB,GACzB,MAAO,CAAEjF,KAAMxG,GAAoByL,QAAAA,EACpC,CAyBD,SAASkyB,GAAkBlyB,GACzB,MAAO,CAAEjF,KAAMxG,GAAoByL,QAAAA,EACpC,CAED,SAASmyB,GAAuB7zB,GAC9B,MAAO,CAAEvD,KAAM1G,EAAoBiK,MAAAA,EACpC,CAoBD,SAAS8zB,GAAuB9zB,GAC9B,MAAO,CAAEvD,KAAMvG,GAA0B8J,MAAAA,EAC1C,CAEM,SAAS+zB,GAAiBx2B,GAC/B,oDAAO,WAAMlB,GAAN,sGACiB02B,GAAcx1B,GAD/B,cACCmE,EADD,gBAECrF,EAASu3B,GAAkBlyB,IAF5B,gCAGEA,GAHF,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAKD,CAEM,SAASsyB,GAAiBz2B,GAC/B,oDAAO,WAAMlB,GAAN,6FACLA,EAAS,CAAEI,K3BrFoB,sB2BqFOc,WAAAA,IADjC,SAEiB+1B,GAAe/1B,GAFhC,cAECmE,EAFD,gBAGCrF,EA5DD2G,GAAkB,sBAAuB,YAyDzC,uBAIC3G,EAASs3B,GAAkBjyB,IAJ5B,OAKL0I,GAAW,WAAY,UAAW7M,EAAW+nB,SALxC,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAOD,CAEM,SAAS2O,GAAiB12B,GAC/B,oDAAO,WAAMlB,GAAN,gGACCg3B,GAAkB91B,GADnB,OAGLlB,EAlEK2G,GAAkB,sBAAuB,YA+DzC,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAKD,CAEM,SAASkxB,GAAmB32B,EAAYsjB,GAC7C,oDAAO,WAAMxkB,GAAN,gGACC02B,GAAcx1B,EAAY,CAC9B42B,aAActT,EAAO9T,MACrBqnB,UAAWvT,EAAOtB,SAHf,OAKLljB,EArDK2G,GAAkB,oCAAqC,YAgDvD,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAOD,CCvHM,SAASqxB,GAAapoB,GAC3B,MAAO,CAAExP,KAAMtB,GAAe8Q,IAAAA,EAC/B,CAMM,SAASqoB,KACd,MAAO,CAAE73B,KAAMpB,GAChB,C,gBCRKugB,IAAYC,EAAAA,EAAAA,IAAW,iBAAO,CAClC0Y,KAAM,CACJC,QAAS,OACTC,YAAa,GACbC,MAAO,OACPlY,eAAgB,gBAElBmY,WAAY,CACVC,YAAa,GACbC,eAAgB,cAChB,UAAW,CACTvU,aAAc,KAXS,IA4C7B,SA5BA,YAAgE,IAAtCpE,EAAsC,EAAtCA,SAAsC,IAA5B4Y,kBAAAA,OAA4B,MAAR,KAAQ,EACxDxY,EAAUV,KASVmZ,EAAuBD,GAAqB,CAChDE,QAAS,EACT,IAAK,EACL,KAAM,EACN,KAAM,GAGR,OACE,gBAAC,KAAD,CACEC,eAAgBF,EAChBtY,UAAWH,EAAQiY,KACnBW,gBAAiB5Y,EAAQqY,YAExBzY,EAGN,E,giCCtBD,IAsDMiZ,IAAgBrO,EAAAA,GAAAA,IAAW,SAAA1qB,GAAK,MAAK,CACzCg5B,QAAS,CACPC,SAAU,KAFwB,GAAhBvO,CAIlBwO,EAAAA,IAEJ,SAASC,GAAanN,GACpB,SAAgCrL,EAAAA,SAAe,MAA/C,GAAOyY,EAAP,KAAiBC,EAAjB,KAMMC,EAAc,WAClBD,EAAY,KACb,EAGCE,EAeEvN,EAfFuN,QACAC,EAcExN,EAdFwN,QACAtZ,EAaE8L,EAbF9L,QACAuZ,EAYEzN,EAZFyN,cACA5J,EAWE7D,EAXF6D,OACA6J,EAUE1N,EAVF0N,OACAC,EASE3N,EATF2N,OACA1W,EAQE+I,EARF/I,OACA2W,EAOE5N,EAPF4N,WACAC,EAME7N,EANF6N,QACAC,EAKE9N,EALF8N,SACAC,EAIE/N,EAJF+N,cACAC,EAGEhO,EAHFgO,aACAC,EAEEjO,EAFFiO,gBACAjE,EACEhK,EADFgK,YAGIkE,EAAWJ,GAA2B,KAAfF,IAAsBlsB,GAAUksB,GAE7D,OACE,uBAAKvZ,UAAWH,EAAQia,cACtB,gBAACC,GAAA,EAAD,KACE,gBAACC,EAAA,EAAD,KACGpX,GACC,gBAAC8V,GAAD,CACElV,MACE4V,EACE,2BACE,yBAAIA,GACJ,2BACCE,GAGHA,EAGJW,sBAAuBX,GAEvB,gBAAC,IAAD,CACErhC,GAAG,SACH6V,MAAK,iBAAY0rB,EAAZ,KACLx5B,KAAK,OACLuD,MAAOs2B,EACP7Z,UAAWH,EAAQ+C,OACnBsX,SAAUtX,EACV+K,UAAW/K,EACX+S,YAAaA,EACbwE,OAAO,SACPhI,WAAY,CACViI,eACE,gBAAC,KAAD,CAAgBlxB,SAAS,SACvB,gBAACojB,GAAA,EAAD,CAAYpC,MAAO2P,EAAW,QAAU,aAG5CjE,QAAS8D,EACT1H,OAAQ2H,EACRU,UAAWT,GAEbnwB,MAAO8vB,GAAc,MAI3B,uBAAKvZ,UAAWH,EAAQya,OACxB,uBAAKta,WAAWgO,EAAAA,EAAAA,GAAKpL,EAAS/C,EAAQ0a,MAAQ1a,EAAQ2a,WACnDrB,GACC,gBAAChI,EAAA,EAAD,CAAQsJ,MAAI,GACV,gBAAC,KAAD,CACEza,UAAWH,EAAQsZ,QACnB,gBAAc,cACd,gBAAc,OACdjV,QA/EI,SAAA+N,GAClB+G,EAAY/G,EAAMyI,cACnB,EA8EeC,UAAW,gBAACC,GAAA,EAAD,OALb,WASA,gBAAC,KAAD,CACE3iC,GAAG,cACH+nB,UAAWH,EAAQgb,YACnB9B,SAAUA,EACV+B,aAAW,EACXjwB,KAAMwb,QAAQ0S,GACdhP,QAASkP,GAERE,EACD,2BACA,2BACA,gBAAC,KAAD,CAAQjV,QAAS+U,GAAjB,mBAILE,GAAW,gBAAChI,EAAA,EAAD,CAAQ4J,QAAM,GAAE5B,GAC3BD,KAIP,uBAAKlZ,UAAW9b,OAAO82B,aAAenb,EAAQob,SAAWpb,EAAQqb,OAC5D7B,GACD,gBAAC,KAAD,CACEphC,GAAG,cACHurB,MAAK,yCAAoCgW,IAEzC,gBAAC2B,GAAA,EAAD,CACEjR,MAAM,YACN,aAAW,MACXjyB,GAAE,iBAAYuhC,GACdtV,QAASmV,GAET,gBAAC+B,GAAA,EAAD,UAIH5L,GACD,gBAAC,KAAD,CAASv3B,GAAG,cAAcurB,MAAK,qBAAgBgW,IAC7C,gBAAC2B,GAAA,EAAD,CACEjR,MAAM,UACN,aAAW,MACXjyB,GAAE,cAASuhC,GACXtV,QAASsL,GAET,gBAAC6L,GAAA,EAAD,SAOb,CAaDvC,GAAawC,aAAe,CAC1BpC,QAAS,KACTtW,OAAQ,KACR4M,OAAQ,KACR+J,WAAY,KACZH,cAAe,KACfE,OAAQ,MAGV,UAAejP,EAAAA,GAAAA,IA5NA,SAAA1qB,GAAK,MAAK,CACvB0f,KAAM,CACJkB,SAAU,GAEZ+Z,KAAM,CACJA,KAAM,GAERnB,QAAS,CACPvV,UAAWjkB,EAAM4f,QAAQ,IAE3Bsb,YAAa,CACX,mBAAoB,CAClBU,QAAS57B,EAAM4f,QAAQ,KAG3B2b,IAAK,CACHhyB,SAAU,QACVqxB,MAAO56B,EAAM4f,QAAQ,GACrBic,OAAQ77B,EAAM4f,QAAQ,GACtBiB,OAAQ,IACR,QAAS,CACP2Z,OAAQx6B,EAAM4f,QAAQ,KAG1B0b,SAAU,CACR/xB,SAAU,QACVsX,OAAQ,IACR,QAAS,CACP2Z,OAAQx6B,EAAM4f,QAAQ,IAExBgb,MAAO56B,EAAM4f,QAAQ,IACrBic,OAAQ77B,EAAM4f,QAAQ,IAExBua,aAAc,CACZlW,WAAY,GACZ2H,aAAc,GACdyM,YAAa,GACbnU,aAAc,IAEhBjB,OAAQ,CACNtD,cAAe,GACf6Y,YAAa,IAEfqC,SAAU,CACRrC,YAAa,GACb7Y,cAAe,GACfqL,WAAY,GACZlK,UAAW,SAEb8Z,MAAO,CACL9Z,UAAW,SAlDK,GA4Nc,CAAEiL,WAAW,GAA/C,CAAuDoN,I,+UC3OhD,SAAe2C,GAAtB,mC,oDAAO,WAAuBh7B,GAAvB,sGACkB8D,G7BLhB,Y6BKmC,CAAEsgB,UAAWpkB,EAAQxI,KAD1D,cACC2K,EADD,YAEE+C,GAAAA,GAFF,KAEYnC,GAAAA,aAFZ,SAE+BZ,EAASkB,OAFxC,mDAEiD,IAAIzC,GAAAA,GAAAA,MAAaG,IAFlE,oF,sBAKA,SAAek6B,GAAtB,mC,oDAAO,WAA0BzjC,GAA1B,sGACkBsM,GAAIpE,GAAelI,IADrC,cACC2K,EADD,YAEE+C,GAAAA,GAFF,KAEYnC,GAAAA,aAFZ,SAE+BZ,EAASkB,OAFxC,mDAEiDtC,GAFjD,oF,sBAKA,SAAem6B,GAAtB,mC,oDAAO,WAAuBp7B,GAAvB,+FACC0E,EAAU,CAAE1E,KAAKmE,EAAAA,GAAAA,gBAAenE,IADjC,SAGkB+E,G7BjBhB,Y6BiBoCL,GAHtC,cAGCrC,EAHD,YAIE+C,GAAAA,GAJF,KAIYnC,GAAAA,aAJZ,SAI+BZ,EAASkB,OAJxC,mDAIiDtC,GAJjD,oF,sBAOA,SAAeo6B,GAAtB,mC,oDAAO,WAAsBr7B,GAAtB,+FACC0E,EAAU,CAAE1E,KAAKmE,EAAAA,GAAAA,gBAAenE,IADjC,SAGkByE,GAAI7E,GAAeI,EAAItI,IAAKgN,GAH9C,cAGCrC,EAHD,YAIE+C,GAAAA,GAJF,KAIYnC,GAAAA,aAJZ,SAI+BZ,EAASkB,OAJxC,mDAIiDtC,GAJjD,oF,mhCCIP,SAASq6B,GAAqB52B,GAC5B,MAAO,CAAEjF,KAAM,yBAA0BiF,QAAAA,EAC1C,CAuCM,SAAS62B,KACd,oDAAO,WAAMl8B,GAAN,6FACLA,EAAS,CAAEI,KAAM,sBADZ,SAEkBuE,G9BDlB,iB8BDA,cAEC3B,EAFD,YAGLhD,EAHK,SAKYgD,EAASkB,OALrB,yBAIH9D,KAAM,mBACNiF,QALG,iEAAP,OAAO,SAAP,UAAO,EAAP,yBAQD,CAEM,SAAS82B,GAAT,GAA0C,IAApBlT,EAAoB,EAApBA,QAASmT,EAAW,EAAXA,QAC9BC,EAAsBpT,EACtBqT,EAAyBF,EAC/B,oDAAO,WAAMp8B,GAAN,mGACLA,EAAS,CAAEI,KAAM,mBAAoB6oB,QAASA,EAAUmT,IAElDhG,EAAQ,CAAE/9B,GAAI4wB,EAASmT,QAAAA,GAHxB,SAQkBz3B,G9BpBlB,gB8BoByCyxB,GARzC,cAQCpzB,EARD,gBAScA,EAASkB,OATvB,YASCoM,EATD,QAWI2Y,QAAQtlB,MAXZ,0CAYI3D,EAAS,CACdI,KAAM,iBACNiF,QAAS,CACPhC,KAAMg5B,EACND,QAASE,EACT34B,MAAO2M,EAAK2Y,QAAQtlB,UAjBrB,eAqBC0B,GAAUzB,EAAAA,GAAAA,cAAa0M,GAAM,SAACV,EAAK2sB,GAAN,MACjC,CAAC,eAAgB,mBAAmBjG,SAAS1mB,GAAO2sB,EAAQ3sB,GAAOA,CADlC,IArB9B,kBAwBE5P,EAASw8B,GAAen3B,KAxB1B,4CAAP,OAAO,SAAP,UAAO,EAAP,yBA0BD,CAEM,SAASm3B,GAAen3B,GAC7B,MAAO,CAAEjF,KAAM,kBAAmBiF,QAAAA,EACnC,CAKM,SAASo3B,GAAU57B,GACxB,MAAO,CACLu2B,QAASyE,GAAQh7B,GACjBw2B,MAAO,CAACv9B,GAAcC,GhCrGE,gBgCuG3B,CAGM,SAAS2iC,GAAarkC,GAC3B,oDAAO,WAAM2H,GAAN,uFACLA,EAAS,CAAEI,KAAMjG,KADZ,cAIU6F,EAJV,KAImB28B,GAJnB,SAIoCb,GAAWzjC,GAJ/C,wJAMH2H,EAAS48B,GAAU,EAAD,KANf,+DAAP,OAAO,SAAP,UAAO,EAAP,yBAUD,CAED,SAASD,GAAWt3B,GAClB,MAAO,CAAEjF,KAAMhG,GAAaiL,QAAAA,EAC7B,CAMD,SAASu3B,GAAUj5B,GACjB,MAAO,CAAEvD,KAAMnG,GAAaoL,QAAS1B,EAAOA,OAAO,EACpD,CA2BM,SAASk5B,GAAWl8B,GACzB,IAAMm8B,EAAa,SAAKn8B,GAAR,IAAao8B,UAAWp8B,EAAIo8B,SAAUjX,aAAa,IAEnE,oDAAO,WAAM9lB,GAAN,+GAEmBg8B,GAAOc,GAF1B,cAEGz3B,EAFH,yBAGIrF,EAAS28B,GAAWt3B,KAHxB,yDAKIrF,EAAS48B,GAAU,EAAD,MALtB,yDAAP,OAAO,SAAP,UAAO,EAAP,yBAQD,CAoBD,SAASI,GAAar8B,GACpB,oDAAO,WAAMX,GAAN,yGAEGi9B,GAAUt8B,EAAVs8B,CAAej9B,GAFlB,sDAIHA,EArDG2G,GACL,gEACA,WA+CK,wDAAP,OAAO,SAAP,UAAO,EAAP,yBAOD,CAEM,SAASu2B,GAAU7kC,EAAIi8B,GAC5B,IAAM3zB,EAAM,CAAEtI,GAAAA,EAAIytB,aAAcwO,GAEhC,oDAAO,WAAMt0B,GAAN,yGAEGi9B,GAAUt8B,EAAVs8B,CAAej9B,GAFlB,sDAIHA,EAxEG2G,GACL,yDACA,WAkEK,wDAAP,OAAO,SAAP,UAAO,EAAP,yBAOD,CA6DM,SAASw2B,KACd,OAAO,SAAAn9B,GACLA,EAlJK,CAAEI,KAAM/F,IAmJd,CACF,CAEM,SAAS4iC,GAAUt8B,GACxB,oDAAO,WAAMX,GAAN,6FACLA,EAAS,CAAEI,KAAMjG,GAAawG,IAAAA,IADzB,SAEiBq7B,GAAOr7B,GAFxB,cAEC0E,EAFD,OAILrF,EAAS28B,GAAWt3B,IAJf,kBAMEA,GANF,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAQD,CAEM,SAAS+3B,GAAUz8B,GACxB,oDAAO,WAAMX,GAAN,sGACiB+7B,GAAQp7B,GADzB,cACC0E,EADD,OAELrF,EAAS,CAAEI,KAAMhG,GAAaiL,QAAAA,IAFzB,kBAIEA,GAJF,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAMD,CAEM,SAASg4B,GAAO18B,GACrB,oDAAO,WAAMX,GAAN,+GAGoB0F,G9BzMpB,kB8ByM4C,CAAErN,GAAIsI,EAAItI,KAHtD,cAGG2K,EAHH,YAIHhD,EAJG,KAIM2N,GAJN,SAIuB3K,EAASkB,OAJhC,wGAMHlE,EAAS4N,GAAejN,EAAItI,GAAI,KAAEwL,eAN/B,0DAAP,OAAO,SAAP,UAAO,EAAP,yBASD,C,sjCCtTD,IAAMy5B,GAAgB,MAAQ,SAAAC,GAC5B,OAAO,MAAS,WACd,IAAMC,EAA4B,UAAjBD,EAAQla,MACnBoa,EACmE,GAAvEF,EAAQG,SAASr1B,QAAO,gBAAGgqB,EAAH,EAAGA,MAAH,OAAgB,QAAQsL,KAAKtL,EAA7B,IAAqCliB,OAE3DqtB,GAAYC,GACdF,EAAQK,OAEX,GAAE,IACJ,IAED,SAASC,GAAWN,GAAwB,IAAfG,EAAe,uDAAJ,CAAC,EACjCI,EAAYjlC,OAAOiL,QAAQ45B,GAAUxlC,KAAI,0BAAE6lC,EAAF,KAAOC,EAAP,WAAqB,CAClED,EACAR,EAAQU,GAAGF,EAAKC,GAF6B,IAK/C,OAAO,WACLF,EAAUI,SAAQ,0BAAEH,EAAF,KAAOI,EAAP,YAAgBZ,EAAQa,IAAIL,EAAKI,EAAjC,GACnB,CACF,CAID,SAASE,GAAad,EAASv9B,GAqB7B,OApBAA,EAAS,CAAEI,KAAMlB,GAAiBo/B,YAAaf,EAAQgB,MAAOhB,QAAAA,IAE9DA,EACG7zB,OACA80B,QAAQ,MAAM,WAEbx+B,EAAS,CAAEI,KjC2Ha,iBiC3HSk+B,YAAaf,EAAQgB,MAAOhB,QAAAA,GAC9D,IACAiB,QAAQ,UAAU,SAAA76B,GACjB3D,EAAS,CAAEI,KAAMnB,GAAeq/B,YAAaf,EAAQgB,MAAO56B,MAAAA,GAC7D,IAEH45B,EAAQkB,SAAQ,SAAA96B,GACd3D,EAAS,CAAEI,KAAMnB,GAAeq/B,YAAaf,EAAQgB,MAAO56B,MAAAA,GAC7D,IAED45B,EAAQpT,SAAQ,WACdnqB,EAAS,CAAEI,KAAMjB,GAAcm/B,YAAaf,EAAQgB,OACrD,IAEMhB,CACR,CAEM,SAASmB,GAAYJ,GAA4B,IAAfZ,EAAe,uDAAJ,CAAC,EACnD,OAAO,SAAA19B,GACL,IAAMyH,EAASF,GAAU/C,aAAaC,QAAQ,eAExCk6B,EAAkBl3B,EAAOm3B,SAASzY,MACtC,qBAAGoY,QAAsBD,CAAzB,IAKF,GAAIK,EAAiB,CACnB,IAAME,EAAahB,GAAWc,EAAiBjB,GAC/C,OAAO,WACLmB,IACAvB,GAAcqB,EAAdrB,EACD,CACF,CACD,IAAMC,EAAU91B,EAAO81B,QAAQe,GAC/BD,GAAad,EAASv9B,GAGtB,IAAM6+B,EAAahB,GAAWN,EAASG,GAEvC,OAAO,WACLmB,IACAvB,GAAcC,EAAdD,EACD,CAGF,CACF,C,wCC/EK/d,IAAYC,EAAAA,EAAAA,IAAW,iBAAO,CAClCsf,MAAO,CACLpf,cAAe,OAFU,IAM7B,SAASqf,GAAT,GAWG,IAVDlf,EAUC,EAVDA,SACAmf,EASC,EATDA,OACAC,EAQC,EARDA,OACAC,EAOC,EAPDA,MACAC,EAMC,EANDA,KACAC,EAKC,EALDA,WACAC,EAIC,EAJDA,WACAC,EAGC,EAHDA,WACA52B,EAEC,EAFDA,KACAmtB,EACC,EADDA,SAEM5V,EAAUV,KAEVggB,EAAY72B,aAAH,EAAGA,EAAMC,WAGtB62B,EAIED,EAJFC,oBACAC,EAGEF,EAHFE,gBACA9J,EAEE4J,EAFF5J,WACA+J,EACEH,EADFG,wBAGIC,EAAa9J,GAAY0J,EAAU1J,SAEnCz1B,EAAOk/B,EAAa,SAAW,SAE/BvR,EACJ4H,GACAgK,GACAH,GACCC,IACEC,IACAj3B,GAAwBC,GAE7B,OAAIy2B,EAEA,wBAAM9mC,GAAG,gBACNwnB,EACD,gBAAC,KAAD,CAAS+D,MAAM,UACb,4BACE,gBAACmO,EAAA,EAAD,CAAYzN,QAAS0a,EAAQ5+B,KAAK,SAAS/H,GAAG,UAC5C,gBAACunC,GAAA,EAAD,SAIN,gBAAC,KAAD,CAAShc,MAAM,gBACb,4BACE,gBAACmO,EAAA,EAAD,CACE15B,GAAG,QACHisB,QAAS4a,EACT9+B,KAAK,SACL2tB,SAAU4H,GAAcgK,GAExB,gBAACE,GAAA,EAAD,SAIN,gBAAC,KAAD,CAASjc,MAAOyb,GAAc,QAC5B,4BACE,gBAACtN,EAAA,EAAD,CACEzN,QAAS2a,EACT5mC,GAAG,SACH01B,SAAUA,EACV3tB,KAAMA,GAELu1B,EAAa,gBAACxU,GAAA,EAAD,CAAkB2e,KAAM,KAAS,gBAACC,GAAA,EAAD,UASzD,gBAAC,KAAD,CAAa3f,UAAWH,EAAQ6e,MAAOzmC,GAAG,gBACvC2mC,GACC,gBAAC,KAAD,CAAQ5+B,KAAK,SAASkkB,QAAS0a,EAAQ3mC,GAAG,UACvC+mC,GAAc,UAGlBF,GACC,gBAAC,KAAD,CACE7mC,GAAG,QACHisB,QAAS4a,EACT9+B,KAAK,SACL2tB,SAAU4H,GAAcgK,GAJ1B,SASDV,GACC,gBAAC,KAAD,CAAQ5mC,GAAG,SAAS01B,SAAUA,EAAU3tB,KAAMA,EAAMkkB,QAAS2a,GAC1DtJ,EAAa,gBAACxU,GAAA,EAAD,CAAkB2e,KAAM,KAAST,GAAc,QAGhExf,EAGN,CAED,SAAea,EAAAA,KAAWqe,ICtH1B,IAAMxf,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJugB,eAAgB,OAChB1V,MAAOvqB,EAAM4qB,QAAQlb,KAAK4b,SAE5BsN,QAAS,CAAC,EACVtN,QAAS,CACPf,MAAOvqB,EAAM4qB,QAAQU,QAAQC,MAE/BqH,UAAW,CACTrI,MAAOvqB,EAAM4qB,QAAQgI,UAAUrH,MAEjC6C,OAAQ,CACN,UAAW,CACT6R,eAAgB,YAdY,IAmBlC,SAASC,GAAT,GAA+E,IAA/D1b,EAA+D,EAA/DA,KAAM9U,EAAyD,EAAzDA,KAAM0c,EAAmD,EAAnDA,KAAM7H,EAA6C,EAA7CA,QAAS6J,EAAoC,EAApCA,OAAQ7D,EAA4B,EAA5BA,MAAO4V,EAAqB,EAArBA,IAAK1b,EAAgB,EAAhBA,OAAQnhB,EAAQ,EAARA,KAC/D4c,EAAUV,KAEhB,OAAI4O,EACK,gBAAC,KAAD,MAIP,qBACE3J,OAAQA,GAAU,SAClB0b,IAAKA,GAAO,sBACZ3b,KAAMA,EACND,QAASA,EACTlE,WAAWgO,EAAAA,EAAAA,GAAKnO,EAAQR,KAAMQ,EAAQqK,IACtCjnB,KAAMA,GAELoM,EACAA,GAAQ0c,GAAQ,iCAChBA,EAGN,CAMD8T,GAAKvE,aAAe,CAClBjsB,KAAM,IAGR,SAAeiR,EAAAA,KAAWuf,I,4rCC/B1B,SAASE,GAAT,GAAwC,IAAjB98B,EAAiB,EAAjBA,KAAM+8B,EAAW,EAAXA,QAC3B,OAAK/8B,GAAS+8B,EAIZ,2BACE,2BACA,gBAACjc,GAAA,EAAD,CAAQkc,IAAKD,EAASE,IAAKj9B,IAC3B,2BACA,gBAAC,IAAD,KAAaA,IAPR,IAUV,CAID,IAmFMk9B,GACJ,0CAEE,gBAAC,KAAD,CACE3c,MAAM,wIAIN,gBAAC,KAAD,CAAU4H,SAAS,cAKzB,SAASgV,KAAuD,6DAAJ,CAAC,EAA1B/wB,EAA6B,EAA7BA,KAAS7K,EAAoB,SAC9D,OACE,2BACE,2BACA,gBAAC,GAAD,CAAM2f,KAAMtc,GAAqBrD,GAAc6K,KAAMA,IACrD,2BAGL,CAUD,SAASgxB,GAAT,GAaG,cAZDzU,EAYC,EAZDA,gBACA0U,EAWC,EAXDA,cACAC,EAUC,EAVDA,WACAC,EASC,EATDA,iBACAC,EAQC,EARDA,SACAC,EAOC,EAPDA,YACAC,EAMC,EANDA,aACAC,EAKC,EALDA,kBACAC,EAIC,EAJDA,oBACAC,EAGC,EAHDA,gBACAC,EAEC,EAFDA,YACAC,EACC,EADDA,iBAEMC,GAAUC,EAAAA,EAAAA,QAAO,MAEjB12B,GAAUkY,EAAAA,EAAAA,MAEV9iB,GAAWmjB,EAAAA,EAAAA,MAET9qB,GAAOkpC,EAAAA,EAAAA,MAAPlpC,GAEFmpC,EAA0B,SAC3Bd,GADwB,IAE3Bn7B,KAAM,SACDm7B,EAAcn7B,MADf,IAEFk8B,cAAeT,QAAAA,EAAF,UAAuBN,EAAcn7B,YAArC,aAAuB,EAAoBk8B,cACxDC,YAAaT,QAAAA,EAAF,UAAyBP,EAAcn7B,YAAvC,aAAyB,EAAoBm8B,YACxDC,MAAOR,QAAAA,EAAF,UAAiBT,EAAcn7B,YAA/B,aAAiB,EAAoBo8B,MAC1CC,QAASV,QAAAA,EAAF,UAAqBR,EAAcn7B,YAAnC,aAAqB,EAAoBq8B,QAChDC,SAAUT,QAAAA,EAAF,UAAsBV,EAAcn7B,YAApC,aAAsB,EAAoBs8B,aAIhDC,GAAaR,EAAAA,EAAAA,QAAOjpC,GAAM0pC,KAAK7gB,MAAM6gB,KAAKC,SAALD,KAAA,IAAgB,GAAM,MAE3DE,EAAgB,SAAAz3B,GAAK,OAAIu2B,EAAazK,SAAS9rB,EAA1B,EAErB03B,EACJnB,EAAa14B,QACX,SAAAmC,GAAK,MAAc,aAAVA,GAAkC,iBAAVA,CAA5B,IACL2F,OAAS,EAEP8uB,EAAM,e,EAAA,G,EAAA,yBAAG,WAAMt1B,GAAN,+FACPsE,EAAS5V,EAAKq/B,GAAmBC,GAD1B,kBAIU33B,EAASiO,EAAOtE,IAJ1B,cAILw4B,EAJK,OAKNxB,EAOHC,EAAiBuB,EAAO98B,QAAQ88B,QANhCv3B,EAAQM,KACN8gB,EACIvN,GAAuBuN,GxB9J5B,gBwBsJQ,mBAcJ,GAdI,qCAgBP,gBAAiBvoB,IAhBV,0CAiBF6G,GAAiB,KAAM5G,OAAQiG,IAjB7B,+F,iLAAH,sDAoCZ,OAbA+Z,EAAAA,EAAAA,YAAU,WACR,IAAM0e,EAAepiC,EACnB0+B,GAAY,eAAD,OAAgBoD,EAAWxN,SAAW,CAC/C+N,QAAS,SAAAviC,GAAG,OA7EpB,SAAmC2K,EAASq3B,EAAYp5B,GACtD,IAAMy5B,EAASjM,GAAezrB,GAC9B/B,EAAK45B,OAAM,WACT,KAAKH,EAAOI,SAASxZ,YAAY+Y,GAAYv8B,MAAM,SAACvB,EAAGD,GACrD2E,EAAK85B,OAAL,eAAoBz+B,GAAKC,EAC1B,GACF,GACF,CAuESy+B,CAA0B3iC,EAAKgiC,EAAWxN,QAAS+M,EAAQ/M,QADjD,KAKhB,OAAO,WACD8N,GAAcA,GACnB,CACF,GAAE,CAACpiC,IAGF,gBAAC,MAAD,CACEs1B,SAAU2J,EACVrM,SAAU,SAAAjpB,GAAM,OApML,SAACA,EAAQu4B,GACxB,IAAMx+B,EAAS,CAAC,EACR6B,EAAeoE,EAAfpE,KA8ER,OA9EuBoE,EAATtG,OAGZK,EAAOL,KAAO,YAGXkC,IACH7B,EAAO6B,KAAO,CAAEm9B,cAAc,IAG5Bn9B,IAASA,EAAKm9B,eAChBh/B,EAAO6B,KAAP,SACK7B,EAAO6B,MADZ,IAEEm9B,aAAc,iDAAF,OAAmDn9B,EAAKk8B,cAAxD,kDAIZl8B,IAASA,EAAKm9B,cAAdn9B,MAA8BA,GAAAA,EAAMo9B,cAEtCj/B,EAAO6B,KAAP,SACK7B,EAAO6B,MADZ,IAEEm9B,aAAc,oEAAF,OACDn9B,EAAKk8B,cADJ,uGAEkBl8B,EAAKk8B,cAFvB,+DAOZl8B,IAASA,EAAKq8B,UAChBl+B,EAAO6B,KAAP,SACK7B,EAAO6B,MADZ,IAEEq8B,QAAS,oCAITr8B,IAASA,EAAKo8B,QAChBj+B,EAAO6B,KAAP,SACK7B,EAAO6B,MADZ,IAEEo8B,MAAO,wBAIPp8B,IAASA,EAAKs8B,WAChBn+B,EAAO6B,KAAP,SACK7B,EAAO6B,MADZ,IAEEs8B,SAAU,4BAIVt8B,IAASA,EAAKm8B,cAChBh+B,EAAO6B,KAAP,SACK7B,EAAO6B,MADZ,IAEEm8B,YAAa,gCAIZQ,IACC38B,IAASA,EAAKq9B,WAChBl/B,EAAO6B,KAAP,SACK7B,EAAO6B,MADZ,IAEEq9B,SAAU,4BAGVr9B,IAASA,EAAKs9B,eAChBn/B,EAAO6B,KAAP,SACK7B,EAAO6B,MADZ,IAEEs9B,aAAc,iCAKhBt9B,IAASA,EAAKk8B,gBAChB/9B,EAAO6B,KAAP,SACK7B,EAAO6B,MADZ,IAEEk8B,cAAe,qCAIZ/9B,CACR,CAmHyBkvB,CAASjpB,EAAQu4B,EAArB,EAChBxB,cAAec,EACf/L,OAAQ,YAOF,MANJC,EAMI,EANJA,aACAhtB,EAKI,EALJA,KACAiB,EAII,EAJJA,OACAjG,EAGI,EAHJA,OACAkF,EAEI,EAFJA,aACAk6B,EACI,EADJA,YAEAzB,EAAQ/M,QAAU5rB,EAEdu5B,EAAc,oBACTt4B,EAAO,iBAEZs4B,EAAc,wBACTt4B,EAAO,qBAGhB,IAAco5B,EAAer/B,EAArB6B,KAER,EAWIoE,EAAOpE,MAAQ,CAAC,EAVlBs8B,EADF,EACEA,SACAF,EAFF,EAEEA,MACAC,EAHF,EAGEA,QACAF,EAJF,EAIEA,YACAD,EALF,EAKEA,cACAmB,EANF,EAMEA,SACAC,EAPF,EAOEA,aACAF,EARF,EAQEA,YACAt/B,EATF,EASEA,KACA+8B,EAVF,EAUEA,QAGI4C,IAAeL,EAEfM,EAAWD,EACf,gBAAC7C,GAAD,CAAaC,QAASA,EAAS/8B,KAAMA,IACnC,KAEJ,GAAIuF,aAAwBlQ,MAC1B,MAAMkQ,EAER,OACE,wBAAM0sB,SAAUI,EAAcwN,aAAa,OACzC,gBAAC,KAAD,KACE,2BACE,gBAAC,MAAD,CACE7/B,KAAK,OACLyyB,UAAW3F,GACXE,WAAS,EACTjwB,KAAK,OACL8N,MAAM,UAER,gBAAC,MAAD,CACEqiB,OAAQ0R,EAAc,iBACtB5+B,KAAK,qBACLyyB,UAAW3F,GACXE,WAAS,EACTjwB,KAAK,OACL8N,MAAM,mBAER,gBAAC,MAAD,CACEqiB,OAAQ0R,EAAc,cACtB5+B,KAAK,aACLgtB,WAAS,EACTniB,MAAOqyB,GACPzK,UAAW3F,GACX/vB,KAAK,OACL21B,YAAY,oDAEd,gBAAC,MAAD,CACExF,OAAQ0R,EAAc,WACtB5+B,KAAK,eACLyyB,UAAW3F,GACX/vB,KAAK,OACLiwB,WAAS,EACTniB,MAAM,sBAER,gBAAC,MAAD,CACEqiB,OAAQ0R,EAAc,SACtB5+B,KAAK,aACLyyB,UAAW3F,GACX/vB,KAAK,OACL8N,MAAM,QACNmiB,WAAS,IAEX,gBAAC,MAAD,CACEE,OAAQ0R,EAAc,YACtB5+B,KAAK,gBACLyyB,UAAW3F,GACX/vB,KAAK,OACL8N,MAAM,YACNmiB,WAAS,IAEX,gBAAC,MAAD,CACEE,OAAQ0R,EAAc,eACtB5+B,KAAK,mBACLyyB,UAAW3F,GACXE,WAAS,EACTjwB,KAAK,OACL8N,MAAM,gBACN6nB,YAAY,4BACZmN,aAAa,QAEf,gBAAC,MAAD,CACE3S,OAAQ0R,EAAc,YACtB5+B,KAAK,gBACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,YACNmiB,WAAS,EACT6S,aAAa,iBAEf,gBAAC,MAAD,CACE3S,OAAQ0R,EAAc,gBACtB5+B,KAAK,oBACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,gBACNmiB,WAAS,EACT6S,aAAa,iBAEf,gBAAC,MAAD,CACE3S,OAAQ0R,EAAc,YACtB5+B,KAAK,gBACLyyB,UAAW3F,GACX/vB,KAAK,OACL8N,MAAM,eACNmiB,WAAS,IAEX,gBAAC,MAAD,CACEE,OAAQ0R,EAAc,cACtB5+B,KAAK,kBACLyyB,UAAW3F,GACX/vB,KAAK,OACL8N,MAAM,cACNmiB,WAAS,IAEX,gBAAC,MAAD,CAAOhtB,KAAK,oBAAoByyB,UAAW3F,GAAWI,QAAM,IAC3D0S,IACGD,GAAcvB,GACd,gBAACjB,GAAD,CACEnoC,GAAIypC,EAAWxN,QACfrL,QAAStf,EAAOsf,QAChBka,SAAU1B,EACVhyB,KAAMqxB,QAAAA,EAAF,yBAAmCW,GACvCmB,SAAUA,EACVC,aAAcA,EACdlB,MAAOA,EACPC,QAASA,EACTC,SAAUA,EACVH,YAAaA,KAIpBqB,GACDA,EAAWL,cADV,UAEDI,EAAYv9B,YAFX,OAED,EAAkBm9B,aAChB,gBAAC,IAAD,CAAYpY,MAAM,SAASyY,EAAWL,cACpC,MAEN,gBAAC,GAAD,CACEzD,OAAQvJ,EACRsJ,OAAQ6B,EACRn4B,KAAMA,IAOb,GAGN,CAeD83B,GAAwB9E,aAAe,CACrCjsB,KAAM,KACN0zB,SAAU,KACVxB,MAAO,KACPiB,SAAU,KACVhB,QAAS,KACTC,SAAU,KACVgB,aAAc,KACdnB,YAAa,KACbrpC,GAAI,KACJ4wB,QAAS,MAQXkX,GAAYzE,aAAe,CACzBr4B,KAAM,GACN+8B,QAAS,IAkBXK,GAAO/E,aAAe,CACpBiF,YAAY,EACZC,iBAAkB,KAClBE,YAAa,KACbC,aAAc,GACdE,oBAAqB,KACrBC,gBAAiB,KACjBC,YAAa,KACbC,iBAAkB,KAClBJ,kBAAmB,MAGrB,Y,8cCxdA,IAAMoC,GAAc,CAClB7sB,MAAO,CACL8sB,WAAY,CACVjjC,KAAM,OACN8N,MAAO,cACP6nB,YAAa,OAEfvuB,MAAO,CAAEpH,KAAM,WAAY8N,MAAO,cAEpCyI,QAAS,CACP2sB,OAAQ,CAAEljC,KAAM,OAAQ8N,MAAO,WAC/Bq1B,SAAU,CAAEnjC,KAAM,OAAQ8N,MAAO,cAEnC+I,QAAS,CACPusB,QAAS,CAAEpjC,KAAM,OAAQ8N,MAAO,WAChCu1B,OAAQ,CAAErjC,KAAM,WAAY8N,MAAO,YAErCgJ,YAAa,CACXwsB,KAAM,CAAEtjC,KAAM,OAAQ8N,MAAO,4BAA6BoiB,WAAW,GACrE1gB,IAAK,CAAExP,KAAM,WAAY8N,MAAO,mBAAoBoiB,WAAW,GAC/DqT,GAAI,CAAEvjC,KAAM,OAAQ8N,MAAO,sBAAuBoiB,WAAW,IAE/DnZ,SAAU,CACRysB,QAAS,CAAExjC,KAAM,OAAQ8N,MAAO,YAChC21B,gBAAiB,CAAEzjC,KAAM,OAAQ8N,MAAO,oBACxC41B,MAAO,CAAE1jC,KAAM,OAAQ8N,MAAO,oBAC9B61B,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCu1B,OAAQ,CAAErjC,KAAM,WAAY8N,MAAO,YAErCuJ,MAAO,CACLssB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrC01B,QAAS,CACPxjC,KAAM,OACN8N,MAAO,WACP6nB,YAAa,iCAEfsN,WAAY,CACVjjC,KAAM,OACN8N,MAAO,cACP6nB,YAAa,MAEfuN,OAAQ,CACNljC,KAAM,OACN8N,MAAO,UACP6f,UAAU,EACViW,mBACE,8EAGN1rB,aCnDF,SAAsByT,GACpB,OACE,gBAAC,GAAD,MACMA,EADN,CAEEiV,kBAAkB,SAClBD,aAAc,CACZ,gBACA,aACA,UACA,QACA,WACA,cACA,WACA,eACA,WACA,cAEFD,YACE,uBACEzoC,GAAG,sBACHgoC,IAAK4D,GAAAA,mBACL3D,IAAI,sBACJ95B,MAAO,CAAE09B,OAAQ,UAGrBjD,oBAAoB,gDACpBC,gBAAgB,4CAChBE,iBAAiB,sCACjBD,YAAY,kGAGjB,EDqBC3mB,OAAQimB,GACR1mB,SAAU0mB,GACVxoB,SAAU,CAAE0qB,YAAa,CAAEviC,KAAM,WAAY8N,MAAO,sBACpDmK,OAAQ,CACNirB,OAAQ,CAAEljC,KAAM,OAAQ8N,MAAO,WAC/BwC,MAAO,CAAEtQ,KAAM,OAAQ8N,MAAO,SAC9ByC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,aAEvCuK,KAAM,CACJsrB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCi2B,QAAS,CAAE/jC,KAAM,OAAQ8N,MAAO,YAChCk2B,SAAU,CAAEhkC,KAAM,OAAQ8N,MAAO,wBAEnC8K,SAAU,CACRrO,KAAM,CAAEvK,KAAM,OAAQ8N,MAAO,QAC7ByqB,QAAS,CAAEv4B,KAAM,OAAQ8N,MAAO,kBAElC+K,YAAa,CACXvI,MAAO,CAAEtQ,KAAM,OAAQ8N,MAAO,SAC9ByC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCm2B,YAAa,CAAEjkC,KAAM,OAAQ8N,MAAO,gBACpCo2B,UAAW,CAAElkC,KAAM,WAAY8N,MAAO,eAExC0K,YAAa,CACX2rB,QAAS,CAAEnkC,KAAM,OAAQ8N,MAAO,YAChC61B,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCm1B,WAAY,CAAEjjC,KAAM,OAAQ8N,MAAO,cAAe6nB,YAAa,OAEjEtc,OAAQ,CACNsqB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCi2B,QAAS,CAAE/jC,KAAM,OAAQ8N,MAAO,aAElCmL,MAAO,CACL0qB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCy0B,YAAa,CAAEviC,KAAM,WAAY8N,MAAO,iBAE1CoL,UAAW,CACTkrB,OAAQ,CAAEpkC,KAAM,OAAQ8N,MAAO,iBAC/Bu1B,OAAQ,CAAErjC,KAAM,WAAY8N,MAAO,YAErCqL,QAAS,CACPkrB,OAAQ,CAAErkC,KAAM,OAAQ8N,MAAO,UAC/Bu1B,OAAQ,CAAErjC,KAAM,WAAY8N,MAAO,YAErC2L,YAAa,CACXkqB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCs2B,OAAQ,CAAEpkC,KAAM,OAAQ8N,MAAO,YAC/Bw2B,GAAI,CAAEtkC,KAAM,OAAQ8N,MAAO,kBAE7BwL,MAAO,CACLqqB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCy2B,SAAU,CAAEvkC,KAAM,OAAQ8N,MAAO,aACjC02B,cAAe,CAAExkC,KAAM,OAAQ8N,MAAO,kBACtC22B,OAAQ,CAAEzkC,KAAM,OAAQ8N,MAAO,cAEjC+L,QAAS,CACP8pB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrC42B,WAAY,CAAE1kC,KAAM,OAAQ8N,MAAO,gBAErCoM,MAAO,CACLkqB,OAAQ,CAAEpkC,KAAM,OAAQ8N,MAAO,cAC/B62B,SAAU,CAAE3kC,KAAM,OAAQ8N,MAAO,iBACjC82B,KAAM,CAAE5kC,KAAM,OAAQ8N,MAAO,QAC7B+2B,SAAU,CAAE7kC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,aAEvCkM,MAAO,CACL8qB,KAAM,CAAE9kC,KAAM,OAAQ8N,MAAO,YAC7B62B,SAAU,CAAE3kC,KAAM,OAAQ8N,MAAO,iBACjC82B,KAAM,CAAE5kC,KAAM,OAAQ8N,MAAO,QAC7BqC,KAAM,CAAEnQ,KAAM,OAAQ8N,MAAO,YAC7ByC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,aAEvCqM,MAAO,CACLkpB,OAAQ,CAAErjC,KAAM,OAAQ8N,MAAO,WAC/Bi3B,UAAW,CAAE/kC,KAAM,WAAY8N,MAAO,eAGxCiN,OAAQ,CACN4oB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,SACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrC+W,UAAW,CAAE7kB,KAAM,OAAQ8N,MAAO,cAClCg3B,KAAM,CAAE9kC,KAAM,OAAQ8N,MAAO,aAE/BmN,QAAS,CACP0oB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCo1B,OAAQ,CAAEljC,KAAM,OAAQ8N,MAAO,iBAEjCgN,QAAS,CACP6oB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCk3B,YAAa,CAAEhlC,KAAM,OAAQ8N,MAAO,iBAEtCqN,WAAY,CACV2pB,KAAM,CAAE9kC,KAAM,OAAQ8N,MAAO,YAC7B82B,KAAM,CAAE5kC,KAAM,OAAQ8N,MAAO,QAC7B62B,SAAU,CAAE3kC,KAAM,OAAQ8N,MAAO,YACjCqC,KAAM,CAAEnQ,KAAM,OAAQ8N,MAAO,QAC7ByC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCm3B,IAAK,CAAEjlC,KAAM,WAAY8N,MAAO,YAChCo3B,oBAAqB,CACnBllC,KAAM,WACN8N,MAAO,iCAET0B,IAAK,CAAExP,KAAM,WAAY8N,MAAO,sBAChCw1B,KAAM,CAAEtjC,KAAM,WAAY8N,MAAO,sBACjCy1B,GAAI,CAAEvjC,KAAM,WAAY8N,MAAO,mBAEjCuN,QAAS,CACPlL,KAAM,CAAEnQ,KAAM,OAAQ8N,MAAO,QAC7ByC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrC/K,IAAK,CAAE/C,KAAM,OAAQ8N,MAAO,YAC5Bq3B,UAAW,CAAEnlC,KAAM,WAAY8N,MAAO,oBAExCyN,SAAU,CACRupB,KAAM,CAAE9kC,KAAM,OAAQ8N,MAAO,YAC7Bm1B,WAAY,CAAEjjC,KAAM,OAAQ8N,MAAO,oBACnC1G,MAAO,CAAEpH,KAAM,WAAY8N,MAAO,cAEpC4N,YAAa,CACXioB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCi2B,QAAS,CAAE/jC,KAAM,OAAQ8N,MAAO,aAElCkO,WAAY,CACV2nB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjC02B,cAAe,CAAExkC,KAAM,OAAQ8N,MAAO,kBACtCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCy2B,SAAU,CAAEvkC,KAAM,OAAQ8N,MAAO,cAEnC4O,UAAW,CACTinB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCs3B,aAAc,CAAEplC,KAAM,OAAQ8N,MAAO,kBAEvCsO,WElMF,SAAoBuP,GAClB,OACE,gBAAC,GAAD,MACMA,EADN,CAEEiV,kBAAkB,aAClBD,aAAc,CACZ,gBACA,aACA,UACA,QACA,WACA,cACA,WACA,eACA,WACA,cAEFD,YACE,uBACEzoC,GAAG,yBACHgoC,IAAK4D,GAAAA,UACL3D,IAAI,yBACJ95B,MAAO,CAAE09B,OAAQ,UAGrBjD,oBAAoB,4CACpBC,gBAAgB,iEAChBE,iBAAiB,6DACjBD,YAAY,iFAGjB,EFoKCnkB,UAAW,CACTiI,UAAW,CAAE7kB,KAAM,OAAQ8N,MAAO,cAClCu1B,OAAQ,CAAErjC,KAAM,WAAY8N,MAAO,YAErC+O,OAAQ,CACNwoB,WAAY,CAAErlC,KAAM,OAAQ8N,MAAO,eACnCw3B,UAAW,CAAEtlC,KAAM,WAAY8N,MAAO,eAExCoP,OAAQ,CACNsmB,QAAS,CAAExjC,KAAM,OAAQ8N,MAAO,YAChC61B,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCy0B,YAAa,CAAEviC,KAAM,WAAY8N,MAAO,iBAE1CqP,KAAM,CACJimB,QAAS,CAAEpjC,KAAM,OAAQ8N,MAAO,WAChCw3B,UAAW,CAAEtlC,KAAM,WAAY8N,MAAO,aACtCm1B,WAAY,CAAEjjC,KAAM,OAAQ8N,MAAO,gBAErCwO,KAAM,CACJipB,SAAU,CAAEvlC,KAAM,OAAQ8N,MAAO,aACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrC+W,UAAW,CAAE7kB,KAAM,OAAQ8N,MAAO,cAClC03B,WAAY,CAAExlC,KAAM,OAAQ8N,MAAO,gBAErCqO,KAAM,CACJwnB,SAAU,CAAE3jC,KAAM,OAAQ8N,MAAO,YACjCyC,SAAU,CAAEvQ,KAAM,WAAY8N,MAAO,YACrCg3B,KAAM,CAAE9kC,KAAM,OAAQ8N,MAAO,QAC7B82B,KAAM,CAAE5kC,KAAM,OAAQ8N,MAAO,U,0QGhOjC,IAAM23B,GAAW,SAAAh8B,GAAK,OAAIA,CAAJ,EAQtB,kBAAekiB,GAAK,OAAI,gBAAC,MAAD,IAAOre,MAAOm4B,IAAc9Z,GAApD,E,s6CCqBA,IAAMxM,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC+lC,YAAa,CAAE7hB,aAAc,QAC7BtgB,MAAO,CAAE2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAFJ,IAK5BsH,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAMhB,GAJKiG,EAAOtG,OACVK,EAAOL,KAAO,YAGZsG,EAAOpE,MAA2B,aAAnBoE,EAAOsf,QAAwB,CAChD,IAAM8c,EAAQp8B,EAAOpE,KAAKoF,KAC1B,KACEo7B,GAAkB,IAATA,IAAcvgC,KAAKkI,MAAMq4B,EAKnC,CAJC,MAAOttC,GACPiL,EAAO6B,KAAO,CACZoF,KAAM,4CAET,CACF,MACC,IACwB,iBAAfhB,EAAOpE,MAAoBC,KAAKkI,MAAM/D,EAAOpE,KAIrD,CAHC,MAAO9M,GACPiL,EAAO6B,KACL,4DACH,CAEH,OAAO7B,CACR,EAED,SAASsiC,GAAT,GAKG,IAJDha,EAIC,EAJDA,gBACA6U,EAGC,EAHDA,SACAoF,EAEC,EAFDA,WACAvF,EACC,EADDA,cAEMzgB,EAAUV,KAEV3U,GAAUkY,EAAAA,EAAAA,MAEV9iB,GAAWmjB,EAAAA,EAAAA,MAET+iB,GAAmB3E,EAAAA,EAAAA,MAAnB2E,eAER,MAAsDnV,EAAAA,EAAAA,WAAS,GAA/D,GAAOoV,EAAP,KAA4BC,EAA5B,KAEA,MAAsCrV,EAAAA,EAAAA,WAAS,GAA/C,GAAOsV,EAAP,KAAoBC,EAApB,KAEMC,EAAaN,EACfptC,OAAOD,KAAKqtC,GAAYO,QAAO,SAACC,EAAKpjC,GACnC,IAAMmH,E,kWAAQ,IAAKy7B,EAAW5iC,IACxBkM,EACJ/E,EAAMk8B,YACNl8B,EAAMk8B,WAAWxuC,KAAI,SAAAyuC,GAAE,MAAK,CAAEtuC,GAAIsuC,EAAI98B,MAAO88B,EAAIl3B,KAAMk3B,EAAhC,IAEnBC,EAAY,QAAH,OAAWvjC,GAE1B,OAAOojC,EAAItV,OACT,uBAAKvhB,IAAKpF,EAAM0D,OACC,YAAd1D,EAAMpK,KACL,gBAAC,KAAD,CACE8N,MAAO1D,EAAM0D,MACb24B,QACE,gBAAC,MAAD,CAAOxjC,KAAMujC,IACV,SAAA7a,GAAK,OACJ,gBAAC,KAAD,CACE+a,QAAS/a,EAAMqE,MAAMvmB,MACrBywB,SAAUvO,EAAMqE,MAAMkK,SACtBj3B,KAAMujC,GAJJ,MAWZ,gBAAC,MAAD,CACEvjC,KAAMujC,EACN14B,MAAO1D,EAAM0D,MACb0B,IAAKpF,EAAM0D,MACXkS,UAAqB,SAAT/c,EAAmB,OAAW,GAC1CyyB,UAA0B,aAAftrB,EAAMpK,KAAsB+vB,GAAY4W,GAAAA,EACnD1W,WAAS,EACTjwB,KAAMoK,EAAMpK,KACZkwB,UAAW9lB,EAAM8lB,UACjB/gB,QAASA,EACTwe,SAAUvjB,EAAMujB,WAAaoY,EAC7BpQ,YAAavrB,EAAMurB,cAGtBvrB,EAAMujB,UACL,uBAAK3N,UAAWH,EAAQ6lB,aACtB,2BACA,gBAAC,KAAD,CACEe,QACE,gBAAC,KAAD,CACEC,QAASX,EACT7L,SAAU,kBACR8L,GAAwBD,EADhB,IAKdj4B,MAAK,gBAAW1D,EAAM0D,MAAjB,mBACH1D,EAAMw5B,oBAAsB,0BADzB,QAMX,2BACA,4BAGL,GAAE,IACH,KAEEzD,EACJ,0CAEE,gBAAC,KAAD,CACE3c,MAAM,wIAIN,gBAAC,KAAD,CAAU4H,SAAS,cAKnByT,EAAM,e,EAAA,G,EAAA,yBAAG,WAAMt1B,GAAN,sGAELsE,EAASi4B,EAAiBxO,GAAmBC,GAFxC,SAGL33B,EAASiO,EAAOtE,IAHX,cAKPqiB,EACFphB,EAAQM,KAAKuT,GAAuBuN,IAEpCphB,EAAQM,K7B1HP,gB6BkHQ,mBAUJ,GAVI,qCAYP,gBAAiBzH,IAZV,0CAaF6G,GAAiB,KAAM5G,OAAQiG,IAb7B,+F,iLAAH,sDAoBZ,OACE,gBAAC,MAAD,CACE2rB,SAAU2J,EACVrM,SAAUA,GACV8N,cAAeA,EACfjL,OAAQ,YAMF,IALJC,EAKI,EALJA,aACA5sB,EAII,EAJJA,qBACA43B,EAGI,EAHJA,cACAh4B,EAEI,EAFJA,KACAE,EACI,EADJA,aAEA,GAAIA,aAAwBlQ,MAC1B,MAAMkQ,EAGR,OACE,wBAAM0sB,SAAUI,EAAcwN,aAAa,OACzC,gBAAC,KAAD,KACE,gBAAC,MAAD,CACE7/B,KAAK,OACL6K,MAAM,OACNmiB,WAAS,EACTyF,UAAW3F,GACX/vB,KAAK,SAEP,2BAC2B,aAA1BsgC,EAAczX,SACb,2BACE,gBAAC,GAAD,CACE5lB,KAAK,aACLgtB,WAAS,EACTniB,MAAOqyB,EACPzK,UAAW3F,GACX/vB,KAAK,OACL21B,YAAY,oDAEd,4BAGHwQ,GACCA,GACA,2BACE,gBAAC,KAAD,CACEjiB,QAAS,kBAAMgiB,GAAgBD,EAAtB,EACThiB,QAAQ,WACR0W,UAAWsL,EAAc,gBAACpU,GAAA,EAAD,MAAoB,gBAACD,GAAA,EAAD,OAE5CqU,EAAc,OAAS,OAL1B,2BAOA,gBAAC9U,EAAA,EAAD,CAAQC,MAAO6U,EAAa5U,eAAe,OACzC,gBAAC,MAAD,CACEpuB,KAAK,OACL6K,MAAM,gBACNmiB,WAAS,EACTC,WAAS,EACTG,WAAS,EACTqF,UAAW3F,GACX/vB,KAAK,OACL21B,YAAY,YAEd,8BAILntB,aAAA,EAAAA,EAAco+B,cAAel+B,GAC5B,gBAAC,IAAD,CAAYsX,UAAWH,EAAQtc,OAC5BiF,aADH,EACGA,EAAco+B,aAIrB,gBAAC,GAAD,CACE/H,OAAQvJ,EACRwJ,MAAOx2B,EAAKw2B,MACZF,OAAQ6B,EACRn4B,KAAMA,IAER,gBAAC,KAAD,CAAYu+B,MAAO,SAAAxuC,GAAC,OAAIiX,GAAajX,EAAGi9B,EAApB,IAGzB,GAGN,CASDsQ,GAAetK,aAAe,CAC5BuK,WAAY,MAGd,Y,8oCCjPA,IAAM1mB,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCmnC,IAAK,CACH5c,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAE7BpH,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3C6b,OAAQ,CACNxL,QAAS,GAEXyL,KAAM,CACJhP,WAAYr4B,EAAM4f,QAAQ,KAE5B1R,OAAQ,CACNsqB,YAAa,GAdiB,IAkB5B3F,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAOhB,OANKiG,EAAO+G,QACVhN,EAAOgN,MAAQ,YAEZ/G,EAAOuZ,SACVxf,EAAOwf,OAAS,YAEXxf,CACR,EA2KD,SAzKA,YAAsE,IAA/BsoB,EAA+B,EAA/BA,gBAAiB9qB,EAAc,EAAdA,WAChD+e,EAAUV,KACV3U,GAAUkY,EAAAA,EAAAA,MACV9iB,GAAWmjB,EAAAA,EAAAA,MACjB,MAAkC4N,EAAAA,EAAAA,WAAS,GAA3C,GAAOsW,EAAP,KAAkBC,EAAlB,KAEMrI,EAAM,e,EAAA,G,EAAA,yBAAG,WAAMt1B,GAAN,uFACb29B,GAAa,GADA,kBAGLtnC,EAAS63B,GAAmB32B,EAAYyI,IAHnC,cAIPqiB,EACFphB,EAAQM,KAAKuT,GAAuBuN,IAEpCphB,EAAQM,K9B/BP,gB8BwBQ,mBASJ,GATI,qCAWP,gBAAiBzH,IAXV,0CAYF6G,GAAiB,KAAM5G,OAAQiG,IAZ7B,+F,iLAAH,sDAmBZ,OACE,gBAAC,KAAD,CAAM,aAAW,2BACf,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAkB49B,WAAY,gBAACC,GAAA,EAAD,OAC5B,gBAAC,KAAD,CACEpnB,UAAWH,EAAQknB,OACnBjjB,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAACujB,GAAA,EAAD,OAGJ7jB,MACE,gDACqB,IACnB,gBAAC,KAAD,CACExD,UAAWH,EAAQmnB,KACnBxjB,MAAM,2MAKN,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,iBAM7B,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAMtL,WAAS,GACb,gBAAC,KAAD,CAAMG,MAAI,EAACC,GAAI,IACb,gBAAC,IAAD,CAAYgK,MAAM,eAAlB,8GAEoD,iCAAa,IAFjE,oLAQF,gBAAC,KAAD,CAAMjK,MAAI,EAACC,GAAI,IACb,gBAAC,MAAD,CACEgV,SAAU2J,EACVrM,SAAUA,GACV8N,cAAe,CAAC,EAChBjL,OAAQ,YAMF,IALJ9rB,EAKI,EALJA,OACAf,EAII,EAJJA,aACA8sB,EAGI,EAHJA,aACAgS,EAEI,EAFJA,MACA5+B,EACI,EADJA,qBAEA,GAAIF,aAAwBlQ,MAAO,MAAMkQ,EAEzC,OACE,gCACE,wBAAM0sB,SAAUI,GACd,gBAAC,KAAD,CAAMxV,WAAS,GACb,gBAAC,KAAD,CAAMG,MAAI,EAACC,GAAI,GAAIC,GAAI,GACrB,gBAAC,MAAD,CACEuf,KAAK,QACL5xB,MAAM,kBACN7K,KAAK,QACLyyB,UAAW3F,GACX9L,QAAQ,WACR6N,WAAY,CACV,aAAc,sBAIpB,gBAAC,KAAD,CAAM7R,MAAI,GACR,gBAAC,MAAD,CACEyf,KAAK,QACL5xB,MAAM,qBACN7K,KAAK,SACLyyB,UAAW3F,GACX9L,QAAQ,WACR6N,WAAY,CACV,aAAc,6BAKtB,gBAAC,KAAD,CAAa9R,UAAWH,EAAQhS,QAC9B,gBAAC,KAAD,CACEoW,QAAQ,YACRiG,MAAM,UACNhG,QAAS,kBAAMgjB,GAAa,EAAnB,EACTvZ,UAAW2Z,IAAU5+B,EACrB,cAAY,sBALd,uBAUF,gBAAC,KAAD,CACEmC,KAAMo8B,EACNld,QAAS,kBAAMmd,GAAa,EAAnB,GAET,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAYjjB,QAAQ,MAApB,2CAEGnjB,EAAWmC,KAFd,kBAMF,gBAAC,KAAD,KACE,gBAAC,IAAD,saAYF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQihB,QAAS,kBAAMgjB,GAAa,EAAnB,GAAjB,qBAGA,gBAAC,KAAD,CACEjvC,GAAG,6BACHisB,QAASoR,EACTtV,UAAWH,EAAQinB,IACnB5c,MAAM,WAJR,mCAMmC,IAChC3gB,EAAO+G,MAPV,QAcX,QAQhB,E,0zCCvLD,IAAM6O,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC4nC,eAAgB,CACdC,UAAW,GACX5O,SAAU,IAEZ9U,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3C4b,IAAK,CACH5c,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAE7Buc,cAAe,CACbC,uBAAwB,EACxBC,wBAAyB,GAbK,IA6VlC,SAnTA,SAAwBhc,GACtB,IAAQC,EAAgDD,EAAhDC,gBAAiB6U,EAA+B9U,EAA/B8U,SAAUD,EAAqB7U,EAArB6U,iBAC7Bh2B,GAAUkY,EAAAA,EAAAA,MACV9iB,GAAWmjB,EAAAA,EAAAA,MACXlD,EAAUV,KACV5X,GAAS45B,EAAAA,EAAAA,MACf,MAA8CxQ,EAAAA,EAAAA,WAAS,GAAvD,GAAOiX,EAAP,KAAwBC,EAAxB,KACQ3e,GAAkBlG,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgG,IAAV,IAAnCC,cAEF4e,EAAqB,GAAH,WACnB9kB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgF,SAAStD,KAAnB,KADE,CAEtB,CAAE1hB,KAAM,YAAatK,OAAQ,UAC7B,CAAEsK,KAAM,2BAA4BtK,OAAQ,YAC5C,CAAEsK,KAAM,WAAYtK,OAAQ,OAC5B,CAAEA,OAAQ,aAAcsK,KAAM,cAC9B,CAAEA,KAAM,kBAAmBtK,OAAQ,iBAG7BmtC,EAAmBv+B,EAAnBu+B,eACF3d,EAAa5gB,EAAO4gB,YAAcwD,EAAMxD,WAExC4f,GAAUC,EAAAA,EAAAA,UACd,kBACEpc,EACI,CACE/C,QAASV,EACTrF,OAAQoG,EACRrE,UAAW+G,EAAgB3zB,IAE7B,CAAE4wB,QAASV,EAAYrF,OAAQoG,EAPrC,GAQA,CAAC0C,EAAiBzD,EAAYe,IAG1B+e,GAAgBjlB,EAAAA,EAAAA,KACpB,SAAAC,GAAK,OzBmLF,SAAwBA,EAAO6C,GACpC,OAAOrtB,OAAO8Q,OAAO0Z,EAAM0F,YAAYhE,OAAOoB,MAC5C,gBAAG1lB,EAAH,EAAGA,KAAMpI,EAAT,EAASA,GAAT,OAAkB6tB,IAAezlB,GAAQylB,IAAe7tB,CAAxD,GAEH,CyBvLYiwC,CAAejlB,EAAO6iB,EAA1B,GAD0B,KAK3BhlC,GAAaknC,EAAAA,EAAAA,UACjB,kBAAMC,GAAiBF,CAAvB,GACA,CAACE,EAAeF,IAKZlf,GAFS/nB,EAAP7I,GAEQ6vC,EAAmB/hB,MACjC,SAAA4B,GAAC,OAAIA,EAAEhvB,UAAWmI,aAAb,EAAaA,EAAY+nB,QAA7B,KAGG7B,GACJhE,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0F,YAAY3B,SAAtB,OACflmB,GAAc+nB,GAEZsf,GAAYrnC,aAAA,EAAAA,EAAYgkB,WAAY,GAEpCsjB,GAAcplB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM6B,SAASH,KAAnB,GAAN,KAEzBG,GAAWkjB,EAAAA,EAAAA,UACf,kBACE,IAAOI,GAAa/+B,MAAK,SAACse,EAAGC,GAC3B,OAAID,EAAE1kB,KAAKolC,cAAgBzgB,EAAE3kB,KAAKolC,cACzB,EAEL1gB,EAAE1kB,KAAKolC,cAAgBzgB,EAAE3kB,KAAKolC,eACxB,EAEH,CACR,KAAK,EATR,GAUA,CAACD,IAGG7kC,GAAQyf,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0F,YAAYplB,KAAtB,IAsBzB+kC,EAA0B,SAAAzjB,GAC9BjlB,EhB9DG,SAAiCkB,EAAY+jB,GAClD,oDAAO,WAAMjlB,GAAN,6FACLA,EAAS,CAAEI,KAAM5G,EAAqB0H,WAAAA,IADjC,kBAGmBg2B,GAAwBh2B,EAAY+jB,GAHvD,cAGG5f,EAHH,OAIHrF,EAASu3B,GAAkBlyB,IAC3BrF,EAlFG2G,GAAkB,6BAA8B,YA6EhD,kBAMItB,GANJ,kCAQC,gBAAiB5B,IACnBzD,EAASy3B,GAAuB,EAAD,KAC/Bz3B,EAzDC2G,GACL,+DACA,WAyDI3G,EAASw3B,GAAuB,EAAD,KAZ9B,0DAAP,OAAO,SAAP,UAAO,EAAP,yBAgBD,CgB6CYmR,CAAwBznC,EAAY+jB,GAC9C,EAcD,IAZAvB,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,2BACjB5jB,EAASg4B,GAAa,gBACtBh4B,EAASk8B,KACV,GAAE,CAACl8B,KAEJ0jB,EAAAA,EAAAA,YAAU,WACJwiB,GACFlmC,EhBlJC,SAAyBkB,GAC9B,MAAO,CACLk2B,QAASb,GAAcr1B,GACvBm2B,MAAO,CAAC79B,EAAqBI,G3BrCC,uB2BuCjC,CgB6IcgvC,CAAgB,CAAEnoC,KAAMylC,IAEpC,GAAE,CAAClmC,EAAUkmC,IAEVviC,EACF,MAAMA,EAGR,GAAIyjB,EACF,OAAO,gBAAC,GAAD,CAAQ/G,KAAK,eAGtB,IA5I6B5e,EA4IvBwkC,EAAa7C,GAAYliC,EAAW+nB,SACpC4f,EA5IQ,OADepnC,EA6IQwkC,GA3I5B,CACL,KACA,OACA,aACA,YACA,UACA,SACA,QAGG,CACL,KACA,OACA,aACA,YACA,UACA,UANF,UAOKptC,OAAOD,KAAK6I,GAAU,CAAC,GAAGvJ,KAAI,SAAA6L,GAAC,qBAAYA,EAAZ,MA4H9B+kC,EACJ,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAYllB,MAAM,oCAClB,gBAAC,KAAD,KACE,gBAAC,IAAD,uHAIA,2BACA,gBAAC,IAAD,uMAKA,gBAAC,IAAD,KACE,2DAEF,gBAAC,IAAD,wCACkC,wCADlC,IACqD,kCAAgB,IADrE,oBAIA,gBAAC,IAAD,KACE,+BAEE,2BAFF,0BAIE,2BAJF,cAME,2BANF,yBAQE,2BARF,mBAUE,2BAVF,oBAYE,2BAZF,QAcE,2BAdF,MAgBE,2BAhBF,MAoBF,gBAAC,IAAD,8FAEoB,6CAFpB,2CASAmlB,EACJ,gBAAC,KAAD,CAAQ99B,KAAM+8B,EAAiB7d,QAAS,kBAAM8d,GAAmB,EAAzB,GACtC,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY5jB,QAAQ,MAApB,uCACsC,yBAAInjB,EAAWmC,MAAU,IAD/D,gBAKF,gBAAC,KAAD,KACE,gBAAC,IAAD,0DACqD,IACnD,yCAFF,ySASF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQihB,QAAS,kBAAM2jB,GAAmB,EAAzB,GAAjB,qBAGA,gBAAC,KAAD,CACE5vC,GAAG,2BACHisB,QAlHa,WACf0H,EACFhsB,EAAS43B,GAAiB12B,IAAawF,MAAK,kBAC1CkE,EAAQM,KAAKuT,GAAuBuN,GADM,IAI5ChsB,EAAS43B,GAAiB12B,IAAawF,MAAK,kBAC1CkE,EAAQM,K/BpIP,e+BmIyC,GAI/C,EAyGOkV,UAAWH,EAAQinB,IACnB5c,MAAM,WAJR,8CAgBA0e,EACH/C,GAAcA,EAAWgD,kBACJ,mBAAfhD,EACHA,EACAD,GAEN,OACE,gBAAC,GAAD,CAAgBvN,kBAAmB,GACjC,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEyQ,qBAAsB,CAAEC,QAAQ,GAChCC,yBAA0B,CAAED,QAAQ,GACpCjlB,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAAC,KAAD,OAGJN,MAAO1iB,EAAWmC,MAAQ,iBAC1BmxB,UACE,uBACE6L,IAAK4D,GAAOhb,EAAQlwB,QACpBunC,IAAKrX,EAAQ5lB,KACb+c,UAAWH,EAAQ0nB,iBAGvB15B,OACE,gBAAC8jB,EAAA,EAAD,CAAYzN,QAAS,kBAAM2jB,GAAmB,EAAzB,GACnB,gBAACoB,GAAA,EAAD,SAIN,gBAACL,EAAD,CACE/C,WAAYA,EACZ4C,OAAQA,EACRnI,cAAex/B,EACf2/B,SA3Ka,WACfA,EACFA,IAEAj2B,EAAQ0+B,QAEX,EAsKO1I,iBAAkBsF,EAAiB,KAAOtF,EAC1C5U,gBAAiBA,IAElBka,GAAkB6C,GAEG,aAAvB7nC,EAAW+nB,SAA0B6f,EACtC,gBAAC,KAAD,CAAM1oB,UAAWH,EAAQ4nB,eACvB,gBAAC,KAAD,CACEjkB,MAAM,gBACN4Q,UACE0R,EACI,4EACA,yEAENhiB,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAACsX,GAAA,EAAD,SAIN,gBAAC,KAAD,KACE,gBAAC9G,GAAA,EAAD,CAAO,aAAW,uBAChB,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAU,aAAW,2BAA2BzC,KAAK,OACnD,gBAAC0C,GAAA,EAAD,gBACA,gBAACA,GAAA,EAAD,sBAGJ,gBAACE,GAAA,EAAD,KACG7P,EAAShtB,KAAI,SAAA6xB,GAAC,OACb,gBAAC6K,GAAA,EAAD,CACEhlB,IAAKma,EAAE1xB,GACP,uBAAe0xB,EAAE1mB,KAAKuL,cAAtB,QACAujB,KAAK,MACL8C,OAAK,GAEL,gBAACJ,GAAA,EAAD,KAAY9K,EAAE1mB,MACd,gBAACwxB,GAAA,EAAD,KACE,gBAAC,KAAD,CACE9G,UAAWmY,EACXY,QAASyB,EAAUjS,SAASvM,EAAE1xB,IAC9BiiC,SAAU,kBAAMoO,EAAwB3e,EAAE1xB,GAAhC,EACV65B,WAAY,CAAE,aAAc,uBAbrB,QAuBtBgU,GACC,gBAAC,GAAD,CACEla,gBAAiBA,EACjB9qB,WAAYA,IAKrB,E,0zCCrXD,IAAMqe,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCwpC,UAAW,CACTC,UAAW,eAAF,OAAiBzpC,EAAM4qB,QAAQ8e,KAAK,MAC7CC,aAAc,QAEhBC,gBAAiB,CACfxR,QAAS,QACTtX,UAAW,SACX,QAAS,CACP0Z,OAAQx6B,EAAM4f,QAAQ,KAG1BiqB,MAAO,CACLje,YAAa5rB,EAAM4f,QAAQ,GAC3BioB,UAAW,IAdmB,IAkBlC,SAASiC,GAAT,GAMG,IALD7d,EAKC,EALDA,gBACA8d,EAIC,EAJDA,KACAC,EAGC,EAHDA,OACAr/B,EAEC,EAFDA,OACAi2B,EACC,EADDA,WAEA,MAA8C5P,EAAAA,EAAAA,UAAS,CAAC,GAAxD,GAAOiZ,EAAP,KAAwBC,EAAxB,KACMr/B,GAAUkY,EAAAA,EAAAA,MACV7C,EAAUV,KACVvf,GAAWmjB,EAAAA,EAAAA,MAEX+mB,EAAe,GAAH,UACbrxC,OAAO8Q,QAAOyZ,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgF,SAAStD,KAAnB,GAAN,OADZ,CAEhB,CAAEhsB,OAAQ,aAAcsK,KAAM,gBAG1B8mC,EAAkB,IACtBD,EAAa7hC,QAAO,SAAAwd,GAAC,MAAiB,SAAbA,EAAE9sB,MAAN,IACrB,CAAC,SAAAqxC,GAAC,OAAIA,EAAE/mC,KAAKuL,aAAX,IAWEy7B,EAAkB,SAAAtiB,GhCsJnB,IAA2CkB,EgCrJ9Clb,GAAW,WAAY,WAAYga,EAAE1kB,MACjCs9B,EACFsJ,EAAmBliB,GACViE,EAAgB3zB,GACzBqS,GhCiJ4Cue,EgCjJKlB,EhCkJ9C,GAAP,OAAUtJ,GgClJ0BuN,GhCkJpC,YAA6C/C,EAAQlwB,OAArD,SgClJyD6R,GAErDF,EhCsJC,SAA2Bue,GAChC,MAAO,gBAAP,OAAuBA,EAAQlwB,OAA/B,OACD,CgCxJYuxC,CAAkBviB,GAAInd,EAEhC,EAMK2/B,EAAc,WAClBR,IACAE,EAAmB,CAAC,EACrB,EAOD,OALAvmB,EAAAA,EAAAA,YAAU,WACR1jB,EAASk8B,MACT+N,EAAmBD,EACpB,GAAE,CAAChqC,EAAUgqC,IAGZ,gBAAC,KAAD,CACEhR,SAAS,KACT/tB,KAAM6+B,EACN3f,QAASogB,EACTnqB,UAAWH,EAAQuqB,QAEnB,gBAAC,KAAD,KACGR,EAAgB3mC,KAAhB,yBACqB2mC,EAAgB3mC,KADrC,eAEG,sDAEN,gBAAC,KAAD,KACE,gBAAConC,GAAA,EAAD,6EAGA,gBAAC,KAAD,CAAMvqB,WAAS,EAACwqB,UAAU,MAAMvqB,eAAe,SAASR,QAAS,GAC9DqqB,EAAgB3mC,MACf,gBAAC,GAAD,CACEs9B,WAAYA,EACZ3U,gBAAiBA,EACjBzD,WAAYyhB,EAAgBjxC,OAC5B8nC,SAAU0J,EACV3J,iBArCa,WACvBqJ,EAAmB,CAAC,EACrB,KAsCSD,EAAgB3mC,MAAQ8mC,EAAgBh6B,OAAS,GACjD,gBAAC,KAAD,CAAMkQ,MAAI,EAACD,UAAWH,EAAQ0pB,iBA5DlB,CACpB,CAAE5wC,OAAQ,OAAQsK,KAAM,uBACxB,CAAEtK,OAAQ,SAAUsK,KAAM,aAC1B,CAAEtK,OAAQ,MAAOsK,KAAM,YACvB,CAAEtK,OAAQ,cAAesK,KAAM,mBAC/B,CAAEtK,OAAQ,WAAYsK,KAAM,6BAwDHnL,KAAI,SAAA6vB,GAAC,OAClB,gBAAC,KAAD,CACEnY,IAAKmY,EAAE1kB,KACPghB,QAAQ,WACRhsB,GAAE,cAAS0vB,EAAE1kB,MACbihB,QAAS,kBAAM+lB,EAAgBtiB,EAAtB,GAET,uBACEsY,IAAK4D,GAAOlc,EAAEhvB,QACdunC,IAAG,mBAAcvY,EAAEhvB,QACnBqnB,UAAWH,EAAQ2pB,QAErB,6BAAQ7hB,EAAE1kB,MAZM,IAepB,sBAAI+c,UAAWH,EAAQspB,YACtBY,EAAgBjyC,KAAI,SAAA6vB,GAAC,OACpB,gBAAC,KAAD,CACEnY,IAAKmY,EAAE1kB,KACPghB,QAAQ,WACRhsB,GAAE,cAAS0vB,EAAE1kB,MACbihB,QAAS,kBAAM+lB,EAAgBtiB,EAAtB,GAET,uBACEsY,IAAK4D,GAAOlc,EAAEhvB,QACdunC,IAAG,mBAAcvY,EAAEhvB,QACnBqnB,UAAWH,EAAQ2pB,QAErB,6BAAQ7hB,EAAE1kB,MAZQ,OAmB9B,2BAGL,CAUDwmC,GAAgBnO,aAAe,CAC7BiF,YAAY,GAGd,YClKA,SAASgK,GAAT,GAAqD,IAAhBb,EAAgB,EAAhBA,KAAMC,EAAU,EAAVA,OACnCn/B,GAAUkY,EAAAA,EAAAA,MAEhB,OACE,gBAAC,KAAD,CAAQ7X,KAAM6+B,EAAM3f,QAAS4f,GAC3B,gBAAC,KAAD,8DAGA,gBAAC,KAAD,KACE,gBAAC,IAAD,qOAOF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQzlB,QAASylB,EAAQxf,UAAU,aAAnC,SAGA,gBAAC,KAAD,CAAQjG,QAAS5Z,GjCahB,eiCb0CE,GAAU0f,MAAM,WAA3D,mBAMP,CAOD,SAAe5J,EAAAA,KAAWiqB,I,gBChCpBprB,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC6pC,MAAO,CACLhC,UAAW,GACX5O,SAAU,KAEZ9U,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MANX,IAUlC,SAASsf,GAAkB1pC,GACzB,IAAM2pC,EACJ,gBAAC,KAAD,aACQ,IACL3pC,EAAWqE,KAAK5B,MAAhB,UACMzC,EAAWqE,KAAKtC,OADtB,aACiC/B,EAAWqE,KAAK5B,OADjD,UAEMzC,EAAWqE,KAAKtC,OAFtB,MAML,OACE,gBAAC,KAAD,CAAS2gB,MAAOinB,GACd,gBAACC,GAAA,EAAD,CAAkBtkC,MAAO,CAAE8jB,MAAO,SAGvC,CAmDD,SAjDA,YAAgE,IAAtCppB,EAAsC,EAAtCA,WAAYooB,EAA0B,EAA1BA,cAAehF,EAAW,EAAXA,QAC7CrE,EAAUV,KAEVwrB,EAAqB7pC,EAAWgiB,QAAUoG,EAE1C0hB,EAAoB9pC,EAAW+B,OACnC,gBAAC2nC,GAAD,CAAmBrlC,KAAMrE,IACvB,KAEJ,OACE,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEgoC,qBAAsB,CAAEC,QAAQ,GAChCC,yBAA0B,CAAED,QAAQ,GACpCvlB,MAAO1iB,EAAWmC,KAClBmxB,UAAWtzB,EAAW+nB,QACtBqQ,QAAS0R,EACT9mB,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAACoI,GAAA,EAAD,SAIN,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAMpM,WAAS,EAACC,eAAe,UAC7B,gBAAC,KAAD,CAAME,MAAI,GACR,uBACEggB,IAAK4D,GAAO/iC,EAAW+nB,SACvBqX,IAAG,mBAAcp/B,EAAW+nB,SAC5B7I,UAAWH,EAAQ2pB,WAK3B,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQvxC,GAAG,OAAOisB,QAASA,EAASyJ,UAAWgd,GAC5CA,EAAqB,OAAS7pC,EAAW+pC,YAKnD,E,o9BC/DD,SAASC,GAAT,GAA8C,IAAnBlf,EAAmB,EAAnBA,gBACnBhsB,GAAWmjB,EAAAA,EAAAA,MAEXvY,GAAUkY,EAAAA,EAAAA,MAEV7d,GAAW6d,EAAAA,EAAAA,MAEjB,MAA4BiO,EAAAA,EAAAA,UAAS,IAArC,GAAO1oB,EAAP,KAAe8iC,EAAf,KAEA,MAA0Cpa,EAAAA,EAAAA,WAAS,GAAnD,GAAOqa,EAAP,KAAsBC,EAAtB,KAEA,MAAsDta,EAAAA,EAAAA,WAAS,GAA/D,GAAOua,EAAP,KAA4BC,EAA5B,KAEMtmB,EAAY+G,aAAH,EAAGA,EAAiB3zB,GAE7B0wB,GAAc3F,EAAAA,EAAAA,KAClB,SAAAC,GAAK,OACH,IAAQxqB,OAAO8Q,OAAO0Z,EAAM0F,YAAYhE,OAAQ,CAC9C,SAAAqlB,GAAC,OAAIA,EAAE/mC,KAAKuL,aAAX,GAFA,GADwB,KAQvB0a,GAAkBlG,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgG,IAAV,GAAN,KAA7BC,cAEFlC,GAAYhE,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0F,YAAY3B,SAAtB,IAkB7BokB,EAAc,WAClBH,GAAiB,GACjBE,GAAuB,EACxB,EAgBD,OAdA7nB,EAAAA,EAAAA,YAAU,WACR1jB,EAASm3B,GAAiB,CAAElS,UAAAA,IAC7B,GAAE,CAACjlB,EAAUilB,KAEdvB,EAAAA,EAAAA,YAAU,WnCzBH,iBmC0BDze,EAASA,SAASolB,UACpB1G,SAASC,MAAQ,0BACjB5jB,EAASg4B,GAAa,qBAEtBh4B,EAASg4B,GAAa,gBACtBrU,SAASC,MAAQ,uBAEpB,GAAE,CAAC5jB,EAAUiF,EAASA,SAASolB,WAG9B,uBAAKjK,UAAU,+BACb,gBAAC,GAAD,CACEwZ,QAAQ,aACRF,OAAO,8BACP1W,OAxCqB,SAAAvqB,GACzB0yC,EAAU1yC,EAAE+rB,OAAO3a,MAAM+E,cAC1B,EAuCK+qB,WAAYtxB,EAEZunB,OAnCgB,WACpByb,GAAiB,EAClB,EAkCK5R,OACEx0B,EAASA,SAASolB,SAASiM,SAAS,aAjChB,WAC1BiV,GAAuB,EACxB,IAkCG,gBAAC,GAAD,CACEzB,KAAMsB,EACNrB,OAAQyB,EACR9gC,OAAQU,GACR4gB,gBAAiBA,IAEnB,gBAAC,GAAD,CACE8d,KAAMwB,EACNvB,OAAQyB,IAETpkB,EACC,gBAAC,GAAD,CAAQ/G,KAAK,gBAEb,gBAAC,GAAD,KACG0I,EAAY1gB,QA1DA,SAAAnH,GACnB,OAAOA,EAAWmC,KAAKuL,cAAc0nB,SAASjuB,EAC/C,IAwDyCnQ,KAAI,SAAAkyC,GACpC,OACE,gBAAC,GAAD,CACEx6B,IAAKw6B,EAAE/xC,GACP6I,WAAYkpC,EACZ9lB,QAEM5Z,GADJua,EACWvG,GAAsBsN,EAAiBoe,InC0ErClpC,EmCzEakpC,EnC0EnC,gBAAP,OAAuBlpC,EAAWT,OmC3EoCmK,GAGxD0e,cAAeA,InCuExB,IAAwBpoB,CmCpEpB,KAKV,CAMDgqC,GAAgBxP,aAAe,CAC7B1P,gBAAiB,CAAE3zB,GAAI,OAGzB,YC5HO,SAASozC,GAAT,GAKJ,UAJD9nC,EAIC,EAJDA,MACAiH,EAGC,EAHDA,QACA8gC,EAEC,EAFDA,kBACAC,EACC,EADDA,iBAGMC,GACJjoC,aAAA,EAAAA,EAAOV,UACPU,SADA,UACAA,EAAOX,gBADP,aACA,EAAiBC,UACjBU,SAFA,UAEAA,EAAO0B,eAFP,iBAEA,EAAgBrC,gBAFhB,aAEA,EAA0BC,QAC5B,QAAQ,GACN,KAAKU,aAAiBL,GACtB,KAAkB,KAAbsoC,EACH,OACE,gBAACC,GAAD,CACEH,kBAAmBA,EACnBC,iBAAkBA,GAEjBG,IAIP,KAAKnoC,aAAiBJ,GACtB,KAAkB,KAAbqoC,EACH,OACE,gBAAC,KAAD,CACEG,GAAI,CACF1hB,SAAU,SACVhH,MAAO,CAAE2oB,KAAMphC,aAAF,EAAEA,EAAS3F,SAAUgnC,SAAS,MAKnD,KAAKtoC,aAAiBH,GACtB,KAAkB,KAAbooC,EACH,OACE,gBAACC,GAAD,CACEH,kBAAmBA,EACnBC,iBAAkBA,GAEjBO,IAIP,QACE,OACE,gBAACL,GAAD,CACEH,kBAAmBA,EACnBC,iBAAkBA,GAEjBQ,IAIV,CAED,IAAMA,GACJ,gCACE,gBAAC,IAAD,CAAY9nB,QAAQ,MAApB,OACA,2BACA,gBAAC,IAAD,CAAYA,QAAQ,MAApB,yBACA,2BACA,2BACA,gBAAC,IAAD,sJAOE6nB,GACJ,gCACE,gBAAC,IAAD,CAAY7nB,QAAQ,MAApB,OACA,2BACA,gBAAC,IAAD,CAAYA,QAAQ,MAApB,0CACA,2BACA,2BACA,gBAAC,IAAD,oLAGyB/f,OAAOW,SAASuoB,SAHzC,MAQEse,GACJ,gCACE,gBAAC,IAAD,CAAYznB,QAAQ,MAApB,OACA,2BACA,gBAAC,IAAD,CAAYA,QAAQ,MAApB,iDAGA,2BACA,gBAAC,IAAD,yGAEyB/f,OAAOW,SAASuoB,SAFzC,MAOE4e,GAA8B,CAClCxoB,MAAO,4BACPyoB,SAAU,sDACVC,UACE,gFAGST,GAAe,SAAC,GAAD,IAC1BH,EAD0B,EAC1BA,kBACAC,EAF0B,EAE1BA,iBACA9rB,EAH0B,EAG1BA,SAH0B,OAK1B,gBAAC,KAAD,CAAMK,WAAS,EAACC,eAAe,UAC7B,gBAAC,KAAD,CAAME,MAAI,EAACC,GAAI,GAAI2V,GAAI,GAAI1V,GAAI,EAAGC,GAAI,EAAGC,GAAI,GAC3C,gBAAC,KAAD,CAAMpoB,GAAG,iBACP,gBAAC,KAAD,KAAcwnB,GACd,gBAAC,KAAD,KACE,gBAAC,KAAD,CACExnB,GAAG,UACHiyB,MAAM,UACNhG,QAAS,WACHonB,GACFA,IAEF9gC,QAAQ2hC,MACT,GARH,WAYCZ,EACC,gBAAC,KAAD,CACErhB,MAAM,UACNhG,QAAS,kBAAMqnB,EAAiBS,GAAvB,GAFX,mBAME,QA7Bc,ECxC5B,UAAe3hB,EAAAA,GAAAA,GAvEA,CACbuE,KAAM,CACJtD,SAAU,KAEZ8gB,OAAQ,CACNrU,QAAS,eACToC,OAAQ,QACRkS,UAAW,cAEb7oB,MAAO,CACL4H,SAAU,IAEZkhB,IAAK,CACHzoB,aAAc,KA0DlB,EAtDA,SAAqB8H,GACnB,IAAQ9L,EAAY8L,EAAZ9L,QACA0sB,EAAwBroC,OAAxBqoC,oBAER,OACE,gBAAC,KAAD,CAAMzsB,WAAS,EAACC,eAAe,SAAS3Z,MAAO,CAAEm1B,QAAS,QACxD,gBAAC,KAAD,CAAMtb,MAAI,EAACC,GAAI,GAAI2V,GAAI,EAAG1V,GAAI,GAC5B,gBAAC,KAAD,CAAMH,UAAWH,EAAQ+O,MACvB,gBAAC,KAAD,KACE,gBAAC,IAAD,CACE5O,UAAWH,EAAQ2D,MACnB0G,MAAM,gBACNsiB,cAAY,GAHd,iCAOA,gBAAC,IAAD,CAAYvoB,QAAQ,KAAKyR,UAAU,MAAnC,2BAGA,gBAAC,IAAD,CAAY1V,UAAWH,EAAQysB,IAAKpiB,MAAM,iBAA1C,4IAKCqiB,GACC,gBAAC,IAAD,CAAYvsB,UAAWH,EAAQysB,IAAKpiB,MAAM,SAA1C,YACYqiB,GAGd,gBAAC,IAAD,CAAY7W,UAAU,KAAtB,oBACmB,0DADnB,2MAOF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQgK,KAAK,QAAQvb,KAAK,KAA1B,sBAGA,gBAAC,KAAD,CAAQub,KAAK,QAAQvb,KAAK,0BAA0BC,OAAO,UAA3D,sBAQX,I,gnBCrED,SAASqoB,GAAT,GAA6C,IAArBhtB,EAAqB,EAArBA,SAAaitB,EAAQ,SAC3C,GAAwC1pB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgG,IAAV,IAAjD0jB,EAAR,EAAQA,gBAAiBC,EAAzB,EAAyBA,WAEzB,GAAwB,OAApBD,EACF,OAAO,gBAAC,GAAD,CAAQ/rB,KAAK,iBAAiBX,KAAK,eAE5C,IAAM4sB,EAAYD,GAAc,IAAI9sC,KAAS,IAE7C,OACE,gBAAC,KAAD,MACM4sC,EADN,CAEErX,OAAQ,YAAkB,IAAfxwB,EAAe,EAAfA,SACT,OAAI8nC,IAAoBE,EACfptB,GAAY,KAGnB,gBAAC,KAAD,CACEksB,GAAI,CACF1hB,SAAU,SACVhH,MAAO,CAAE2oB,KAAM/mC,EAAUgnC,QAASc,GAAmBE,KAI5D,IAGN,CAED,SAAevsB,EAAAA,KAAWmsB,I,gUC1BnB,SAAeK,GAAtB,mC,oDAAO,WAA6BrsC,GAA7B,wGACkB8D,GAAIpD,GAAkBV,IADxC,cACCmC,EADD,gBAEcA,EAASkB,OAFvB,cAECoM,EAFD,0BAGE1M,EAAAA,GAAAA,cAAa0M,IAHf,4C,sBAMA,SAAe68B,KAAtB,gC,oDAAO,qHACkBxoC,GjD2NhB,qBiD5NF,cACC3B,EADD,gBAEcA,EAASkB,OAFvB,cAECoM,EAFD,0BAGE1M,EAAAA,GAAAA,cAAa0M,IAHf,4C,sBAMA,SAAe88B,GAAtB,mC,oDAAO,WAA+BvsC,GAA/B,wGACkB8D,GAAInD,GAAoBX,IAD1C,cACCmC,EADD,gBAEcA,EAASkB,OAFvB,cAECoM,EAFD,0BAGE1M,EAAAA,GAAAA,cAAa0M,IAHf,4C,sBCVA,SAAS+8B,GAAgBxsC,GAC9B,MAAO,CACLu2B,QAAS8V,GAAcrsC,GACvBw2B,MAAO,CAACh6B,GAAwBC,GAAuBC,IAE1D,C,uZCTM,SAAS+vC,GAAezsC,GAC7B,OAAO,IAAIuhB,SAAQ,SAAAtpB,GACjB6L,GnDmGK,oBmDnGoB,CAAEoyB,WAAYl2B,EAAQxI,KAAMqO,KAArD,6CACE,WAAM1D,GAAN,sGACqBA,EAASkB,OAD9B,OACQoM,EADR,OAEExX,GAAQiN,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAO,IAAI7O,GAAAA,GAAAA,MAAaC,MAFzD,2CADF,sDAMD,GACF,CCeM,SAAS6rC,GAAiB1sC,GAC/B,MAAO,CACLu2B,QAASkW,GAAezsC,GACxBw2B,MAAO,CAACp+B,EAAsBC,EtDjCE,wBsDmCnC,CAEM,SAASs0C,GAAiBC,GAC/B,OAAO,SAAAztC,GAEL,OADAA,EAAS,CAAEI,KtDpCqB,uBsDoCOqtC,WAAAA,IDtBpC,SAAwBA,GAE7B,OAAO/nC,GnDwFA,oBmDzFS,CAAEgoC,aAAa5oC,EAAAA,GAAAA,gBAAe2oC,KAE3C/mC,KADI,6CACC,WAAM1D,GAAN,sGACeA,EAASkB,OADxB,cACEoM,EADF,0BAEGvK,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAO5O,KAFjC,2CADD,uDAKJmF,OAAM,SAAAlD,GACL,OAAOye,QAAQC,OAAO1e,EACvB,GACJ,CCaUgqC,CAAeF,GACnB/mC,MAAK,SAAArB,GAAO,OAAIrF,EAfvB,SAA2BqF,GACzB,MAAO,CAAEjF,KtDvBwB,sBsDuBGiF,QAAAA,EACrC,CAa+BuoC,CAAkBvoC,GAA/B,IACZqB,MAAK,kBAAM1G,EAvBT2G,GAAkB,iCAAkC,WAuBjD,IACLE,OAAM,SAAAlD,GAAK,OAAI3D,EArBtB,SAAgC2D,GAC9B,MAAO,CAAEvD,KtDlBwB,sBsDkBGuD,MAAAA,EACrC,CAmB8BkqC,CAAuBlqC,GAApC,GACf,CACF,CAEM,SAASmqC,GAAiBL,GAC/B,OAAO,SAAAztC,GpD0EF,IAA8BqpB,EoDzEjC1jB,IpDyEiC0jB,EoDzERokB,EpD0EpB,GAAP,OAhBO,oBAgBP,YAAiCpkB,EAAKhxB,MoDzEjCqO,KACC1G,EAAS,CACPI,KAAMjH,EACN40C,aAAcN,EAAWp1C,MAG5BqO,KAAK1G,EAzCH2G,GAAkB,mCAAoC,SA0C5D,CACF,C,6/BCjBM,SAASqnC,GAAkBntC,GAChC,OAAO,SAAAb,GACL2E,GrDnBK,qBqDmBsB,CAAEoyB,WAAYl2B,EAAQxI,KAAMqO,KAAvD,6CACE,WAAM1D,GAAN,sGACqBA,EAASkB,OAD9B,OACQoM,EADR,OAEEtQ,EAAS,CACPI,KAAMzC,GACN2S,MAAMvK,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAO,CAClC29B,aAAc,CAAC5rC,QALrB,2CADF,sDAWD,CACF,CAEM,SAAS6rC,GAAkBC,GAChC,OAAO,SAAAnuC,GACL2F,GrDdG,SAA4BwoC,GACjC,MAAO,GAAP,OAtBO,qBAsBP,YAAmCA,EAAY91C,GAChD,CqDYO+1C,CAAmBD,IACpBznC,MAAK,SAAA1D,GACJhD,EAAS,CACPI,KAAMxC,GACNywC,cAAeF,EAAY91C,KAE7B2H,EA/BC2G,GAAkB,qCAAsC,QAgC1D,IACAE,OAAM,SAAAkC,GACL/I,EA9BC2G,GAAkB,qCAAsC,SA+B1D,GACJ,CACF,CAEM,SAAS2nC,GAAkB/9B,EAAM0U,EAAWkN,GACjD,OAAO,SAAAnyB,GACL2E,GrDzCG,SAA4B4L,GACjC,MAAO,GAAP,OAPO,aAOP,kBAAkCA,EAAKG,MACxC,CqDuCO69B,CAAmBh+B,IACpB7J,KADH,6CACQ,WAAM1D,GAAN,wGACeA,EAASkB,OADxB,cACEoM,EADF,OAEEjL,EAAU,CACd,CACEmpC,aAAc,CACZzX,WAAY9R,EACZpB,QAASvT,EAAKE,MAAMnY,GACpB85B,KAAAA,IAGJ7hB,EAAKE,OAVH,kBAYGnL,GAZH,2CADR,uDAeGwB,OAAM,SAAAkC,GAKL,OAJA/I,EAAS,CACPI,KAAMrC,KAERiC,EAvEC2G,GAAkB,mCAAoC,UAwEhDyb,QAAQC,OAAOtZ,EACvB,IACArC,MAAK,SAAArB,GACJK,GrD1EC,qBqD0E2BL,EAAQ,IACjCqB,KADH,6CACQ,WAAM1D,GAAN,sGACeA,EAASkB,OADxB,QACEoM,EADF,QAECk+B,aAAaj+B,KAAOlL,EAAQ,GACjCrF,EAAS,IACPI,KAAMvC,KACH+F,EAAAA,GAAAA,cAAa0M,KAElBtQ,EAvFH2G,GAAkB,mCAAoC,YAgF/C,2CADR,uDAUGE,OAAM,SAAAkC,GACL/I,EAlFH2G,GACL,8CACA,YAiFQ3G,EAAS,CACPI,KAAMtC,IAET,GACJ,GACJ,CACF,C,mnDCvGD,SAAS2wC,GAAT,GAMG,IALDC,EAKC,EALDA,SACAC,EAIC,EAJDA,aACAxc,EAGC,EAHDA,KACAsb,EAEC,EAFDA,WACGmB,EACF,SACD,MAAoC7d,EAAAA,EAAAA,WAAS,GAA7C,GAAO8d,EAAP,KAAmBC,EAAnB,KACA,MAAkC/d,EAAAA,EAAAA,WAAS,GAA3C,GAAOge,EAAP,KAAkBC,EAAlB,KACA,MAA8Cje,EAAAA,EAAAA,WAAS,GAAvD,GAAOiX,EAAP,KAAwBC,EAAxB,KAEQ5vC,EACNo1C,EADMp1C,GAAI6V,EACVu/B,EADUv/B,MAAO9N,EACjBqtC,EADiBrtC,KAAM2jC,EACvB0J,EADuB1J,SAAUpzB,EACjC88B,EADiC98B,SAAU8yB,EAC3CgK,EAD2ChK,OAAQv2B,EACnDugC,EADmDvgC,WAG/C+hC,EAAkB3mC,GAAYwmC,GAE9BI,EAAiB5mC,GAAY0mC,GAE7BG,EAAsB7mC,GAAY2/B,GAElCmH,EAAcP,EAClB,gBAAC,KAAD,CACE9gB,UAAWpd,EACXmvB,KAAK,QACLxb,QAAS,kBAAM2qB,EAAgBJ,EAAtB,EACTx2C,GAAG,cAJL,UASA,4BACG0rC,EADH,IACcpzB,GAIV0+B,EAAeN,EACnB,gBAAC,KAAD,CACEhhB,UAAW0V,EACX3D,KAAK,QACLxb,QAAS,kBAAM4qB,EAAeH,EAArB,EACT12C,GAAG,cAJL,UASA,4BAAOorC,GAGHsF,EACJ,gBAAC,KAAD,MACM6F,EADN,CAEE3jC,KAAM+8B,EACN7d,QAAS,kBAAMglB,EAAoBnH,EAA1B,IAET,gBAAC,KAAD,KACG2G,EAAe,EACZ,4DACA,8CAEN,gBAAC,KAAD,KACE,gBAAC,IAAD,KACGA,EAAe,EAAf,oLAGgBA,EAAe,EAAI,IAAM,GAHzC,uLASL,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQrqB,QAAS,kBAAM6qB,EAAoBnH,EAA1B,GAAjB,UAGA,gBAAC,KAAD,CACE3vC,GAAG,kBACHisB,QAAS,kBAAMoqB,EAASjB,EAAf,EACTppB,QAAQ,YACRiG,MAAM,aAJR,wBAYAglB,EAAYpiC,EAAahB,GAAagB,GAAc,cAE1D,OACE,gBAAC0nB,GAAA,EAAD,CACEhlB,IAAKvX,EACL48B,OAAK,EACL,aAAY/mB,QAAAA,EAAS,cACrB7V,GAAIA,QAAAA,EAAM,cACVgL,KAAM6K,QAAAA,EAAS,eAEd66B,EACD,gBAAClU,GAAA,EAAD,CAAWx8B,GAAG,QAAQ,aAAY6V,QAAAA,EAAS,kBACxCA,GAEH,gBAAC2mB,GAAA,EAAD,CAAWx8B,GAAG,QAAQ+H,GACtB,gBAACy0B,GAAA,EAAD,CAAWx8B,GAAG,UAAU,aAAYi3C,GACjCpjC,GAAagB,IAEhB,gBAAC2nB,GAAA,EAAD,CAAWzU,UAAU,cAAc/nB,GAAG,iBAC1B,UAAT+H,EAAmBgvC,EAAcC,GAEpC,gBAACxa,GAAA,EAAD,CAAWzU,UAAU,eACnB,gBAAC,KAAD,CACE/nB,GAAG,aACH01B,UAAWoE,IAAS95B,EACpBisB,QAAS,kBAAM6qB,EAAoBnH,EAA1B,EACT,aAAW,UAEX,gBAAC,KAAD,CAAkBxc,SAAS,cAKpC,CAODijB,GAAe/S,aAAe,CAC5BiT,aAAc,EACdlB,WAAY,CACVp1C,GAAI,KACJ+H,KAAM,MACN8N,MAAO,KACPyC,SAAU,KACV8yB,OAAQ,OAIZ,Y,ipDCxFA,IAAMlkB,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCmkB,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3CikB,cAAe,CACb,wCAAyC,CACvCjlB,MAAOvqB,EAAM4qB,QAAQD,QAAQY,MAE/B,2DAA4D,CAC1DL,gBAAiBlrB,EAAM4qB,QAAQD,QAAQ8kB,MAEzCC,aAAc1vC,EAAM4f,QAAQ,IAE9B+vB,QAAS,CACPD,aAAc1vC,EAAM4f,QAAQ,IAdE,IAgdlC,SA9bA,YAA6C,IAAnBqM,EAAmB,EAAnBA,gBAClBhsB,GAAWmjB,EAAAA,EAAAA,MACXxb,GAAS45B,EAAAA,EAAAA,MACT32B,GAAUkY,EAAAA,EAAAA,MACV7C,EAAUV,KAEhB,MAA0BwR,EAAAA,EAAAA,UAAS,CACjC1oB,OAAQ,GACRsnC,YAAa,KACbC,kBAAkB,EAClBzW,SAAU,OAJZ,GAAO9V,EAAP,KAAcwsB,EAAd,KAOM5qB,EAAYtd,EAAOsd,WAAa+G,EAAgB3zB,GAEhDkY,GAAO6S,EAAAA,EAAAA,IAAY+F,KAAsB,CAAC,EAEhD,GAAoB/F,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMysB,WAAV,IAA7B7lB,EAAR,EAAQA,QAEF6lB,EAAc,IAClB,KAAO1sB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMysB,YAAY/qB,KAAtB,KACxB,CAAC,SAAAgD,GAAC,OAAIA,EAAE7Z,MAAMU,aAAZ,IACFvG,QAAO,SAAA0nC,GAAE,OAAIA,EAAG9qB,YAAcA,CAArB,IAEL+qB,GAAmB5sB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM4qB,aAAalpB,KAAvB,IAEpCkpB,EAAep1C,OAAOD,KAAKo3C,GAAkB93C,KACjD,SAAAG,GAAE,OAAI23C,EAAiB33C,EAArB,IAEEysB,GAAQ1B,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMyB,MAAMC,KAAhB,IAEzBkrB,EAAmBhC,EAAa5lC,QACpC,SAAA6nC,GAAE,OAAKA,EAAG3/B,KAAKG,MAAM4lB,SAAS,cAA5B,IACFnmB,OAEIggC,GAAkB/sB,EAAAA,EAAAA,KACtB,SAAAC,GAAK,OAAIA,EAAM4qB,aAAamC,qBAAvB,IAEDC,EAAcvrB,EAAMkH,EAAgBnH,SAAW,CAAC,EAE9CsU,EAA4C9V,EAA5C8V,SAAUyW,EAAkCvsB,EAAlCusB,iBAAkBD,EAAgBtsB,EAAhBssB,YAE9BhB,EAAemB,EAAY3/B,OAM3BkpB,EAAc,WAClBwW,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBnX,SAAU,MAA/B,GACnB,EAEKoX,EAAY,WAChBV,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBV,kBAAkB,GAAvC,GACnB,EAaKY,EAAe,SAAA/C,GACnBztC,EAAS8tC,GAAiBL,GAC3B,EAoBKgD,EAAgB,SAAClgC,EAAM0U,EAAWkN,GACtCnyB,EAASsuC,GAAkB/9B,EAAM0U,EAAWkN,IAC5CkH,GACD,EAEKqX,EACJngC,EAAKogC,eACJ3kB,EAAgB0H,UAAY2c,EAAYO,UAAYX,GAEvDvsB,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,6BACjB5jB,EAASg4B,GAAa,sBACtBh4B,EAASwvB,KACV,GAAE,KAEH9L,EAAAA,EAAAA,YAAU,WACR1jB,EAASutC,GAAiBvhB,IAC1BhsB,EAASguC,GAAkBhiB,GAC5B,GAAE,CAACA,IAEJ,IA7BqBnrB,EA6BfgwC,EACJ,gBAAC,KAAD,CACE5lC,KAAM2kC,EACNzlB,QAASomB,EACT,aAAW,+BAEX,gBAAC,KAAD,sDACA,gBAAC,KAAD,KACE,gBAAC,IAAD,2MAKA,2BACA,gBAAC,IAAD,KACE,uFAGJ,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQjsB,QAASisB,GAAjB,qBACA,gBAAC,KAAD,CACElsB,QAAQ,YACR0J,UAAW/B,EAAgB0H,SAC3Br7B,GAAG,iBACHisB,QAAS,kBAzDftkB,EAASkH,GAyDsC8kB,SAxD/C6jB,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBV,kBAAkB,GAAvC,GAwDH,GAJX,kCAQE5jB,EAAgB0H,UAChB,2BACE,2BADF,qDASFod,EACJ,2BACE,2BACA,gBAAC,IAAD,iRASJ,OACE,gBAAC,GAAD,CAAehxB,MAAI,GACjB,gBAAC,KAAD,CAAM,aAAW,mBAAmBznB,GAAG,oBACrC,gBAAC,KAAD,CACEurB,MAAM,cACN4Q,UAAU,+CACVtQ,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAAC,KAAD,OAGJjW,OACE,gBAAC,KAAD,CACEmS,UAAWH,EAAQsvB,cACnB1I,QACE,gBAACkK,GAAA,EAAD,CACEjK,QAAS9a,EAAgB7kB,aACzBmzB,UAhGKz5B,EAgGkBmrB,EAhGP,WAC1BnrB,EAAQsG,cACVnH,EAASkH,GAAoBrG,IAC7BgvC,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBV,kBAAkB,GAAvC,KAElBC,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBV,kBAAkB,GAAvC,GAErB,GA0Fe/lC,MAAOmiB,EAAgB7kB,aACvBmjB,MAAM,UACNjyB,GAAG,0BAGP24C,eAAe,QACf9iC,MAAM,2BAIZ,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAYmW,QAAQ,MAApB,eACA,gBAAC,KAAD,CAAMnE,WAAS,EAACP,QAAS,GACvB,gBAAC,KAAD,CAAMU,MAAI,EAACC,GAAI,IACb,gBAACoR,GAAA,EAAD,CAAalrB,MAAO,CAAEwd,UAAW,IAC/B,gBAAC2N,GAAA,EAAD,kCACA,gBAACE,GAAA,EAAD,CACE9D,UAAW2iB,EACX/sC,MAAOwsC,EAAgBxsC,MACvBvD,KAAK,OACL8N,MAAM,oBACN7K,KAAK,aACLi3B,SAhIU,SAAA7hC,GACxBo3C,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBX,YAAal3C,EAAE+rB,OAAO3a,OAA3C,GACnB,EA+HeioB,aACE,gBAAC,KAAD,CAAgBxoB,SAAS,MAAM+a,QAAQ,UACrC,gBAAC0N,EAAA,EAAD,CACEzH,MAAM,UACNyD,UACG2iB,IACAf,IACCe,GACAngC,EAAKogC,gBACJhB,EAAYrZ,SAAS,eAE1BhS,QAvKF,SAAA+N,GAClBwd,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBnX,SAAU9G,EAAMyI,eAArC,GACnB,EAsKqB,YAAW3B,EAAW,cAAgB,KACtC,gBAAc,OACd,aAAW,oBACX9gC,GAAG,yBAEH,gBAAC44C,GAAA,EAAD,QAIN/e,WAAY,CACV,aAAc,uBAGlB,gBAAC,KAAD,CACE75B,GAAG,cACH8gC,SAAUA,EACVluB,KAAMwb,QAAQ0S,GACdhP,QAASkP,GAET,gBAAC6X,GAAA,EAAD,CACE74C,GAAG,gBACHisB,QACEosB,EACI,kBACED,EAAc,CAAE//B,MAAOi/B,GAAe1qB,EAAW,GADnD,EAEA,MANR,uBAWA,gBAACisB,GAAA,EAAD,CACE74C,GAAG,eACHisB,QACEosB,EACI,kBACED,EACE,CAAE//B,MAAOi/B,GACT1qB,EACA,QAJJ,EAMA,MAVR,mBAkBLkrB,EAAgBxsC,OACf,gBAAC,KAAD,CAAM0c,MAAI,EAACC,GAAI,IACb,gBAAC,IAAD,CAAY+D,QAAQ,QAAQ7d,MAAO,CAAE8jB,MAAO,QAC1C,gBAAC,KAAD,CAAWkB,SAAS,YADtB,IACoC2kB,EAAgBxsC,UAIrD0sC,EAAYO,UAAYX,IACzB,gBAAC,KAAD,CAAM5vB,MAAI,EAACC,GAAI,IACb,gBAAC,IAAD,CAAY+D,QAAQ,SAClB,gBAAC,KAAD,CAAWmH,SAAS,YADtB,mEAMFQ,EAAgB0H,UAChB2c,EAAYO,UAAYX,GACtB,gBAAC,KAAD,CAAM5vB,MAAI,EAACC,GAAI,IACb,gBAAC,IAAD,CAAY+D,QAAQ,SAClB,gBAAC,KAAD,CAAWmH,SAAS,YADtB,4DAOR,gBAACkJ,GAAA,EAAD,CAAO,aAAW,wBAAwBr8B,GAAG,mBAC3C,+BACGg4C,EAAYO,UAAY,EAAxB,UACMX,EADN,eAC6BI,EAAYO,UADzC,sCAEG,oEAEN,gBAACjc,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAU,aAAW,oCACnB,gBAACC,GAAA,EAAD,aACA,gBAACA,GAAA,EAAD,aACA,gBAACA,GAAA,EAAD,CAAWsc,MAAM,UAAjB,YAGJ,gBAACpc,GAAA,EAAD,KACGkZ,EAAa/1C,KAAI,SAAAk5C,GAAY,OAC5B,gBAACxc,GAAA,EAAD,CACEhlB,IAAKwhC,EAAa7gC,KAAKlY,GACvB,aAAY+4C,EAAa7gC,KAAKG,MAC9BrN,KAAM+tC,EAAa7gC,KAAKG,OAExB,gBAACmkB,GAAA,EAAD,KAAYuc,EAAa7gC,KAAKG,OAC9B,gBAACmkB,GAAA,EAAD,KAAYuc,EAAajf,MAAQ,gBACjC,gBAAC0C,GAAA,EAAD,CAAWsc,MAAM,UACf,gBAACpf,EAAA,EAAD,CACE+N,KAAK,QACL/R,UACG/B,EAAgB0H,UACjB0d,EAAa7gC,KAAKlY,KAAOkY,EAAKlY,IACR,UAAtB+4C,EAAajf,KAEf,aAAW,SACX95B,GAAG,SACHisB,QACE8sB,EAAa7gC,KAAKlY,KAAOkY,EAAKlY,GAC1B,kBAAM2H,EAASkuC,GAAkBkD,GAAjC,EACA,MAGN,gBAACC,GAAA,EAAD,QAxBsB,OAgCpC,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEztB,MAAM,8PAMN,gBAAC,KAAD,CACE,aAAW,cACXvrB,GAAG,kBACHksB,KAAI,gEAA2DyH,EAAgB3oB,MAC/EmhB,OAAO,SACPF,QAAS,kBAAMvW,GAAW,WAAY,UAAW,cAAxC,GALX,kBAYN,2BACA,gBAAC,KAAD,CAAM,aAAW,sBAAsB1V,GAAG,uBACxC,gBAAC,KAAD,CACEurB,MAAM,iBACN4Q,UAAU,gEACVtQ,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAACotB,GAAA,EAAD,OAGJrjC,OACE,gBAAC,KAAD,CACEmS,UAAWH,EAAQyvB,QACnB7I,QACE,gBAAC9U,EAAA,EAAD,CACE15B,GAAG,gCACHiyB,MAAM,YACNyD,UAAW/B,EAAgB0H,SAC3BpP,QACE0H,EAAgB0H,UAChBhpB,GAAOyU,GAAkB6M,GAAkBphB,IAG7C,gBAAC2mC,GAAA,EAAD,OAGJP,eAAe,QACf9iC,MAAM,iCAIZ,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAYmW,QAAQ,MAApB,mBACE4F,GAA4B,IAAjB0kB,GACX,gBAAC,KAAD,CAAMtuB,MAAI,EAACC,GAAI,IACZwwB,IAGH9kB,EAAgB0H,UAChB,gBAAC,KAAD,CAAMrT,MAAI,EAACC,GAAI,IACb,gBAAC,IAAD,kFAMJ,2BACA,gBAAC,IAAD,CACEjoB,GAAG,qBACHiiC,SAxViB,SAAA7hC,GACzBo3C,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhBjoC,OAAQ5P,EAAE+rB,OAAO3a,MAAM+E,eAFP,GAInB,EAoVSxO,KAAK,OACL8N,MAAM,sBACNgkB,WAAY,CACV,aAAc,yBAGlB,gBAACwC,GAAA,EAAD,CACE,aAAW,8BACXr8B,GAAG,+BAEH,gBAACs8B,GAAA,EAAD,CAAW,aAAW,sCACpB,gBAACC,GAAA,EAAD,CAAU,aAAW,0CACnB,gBAACC,GAAA,EAAD,cACA,gBAACA,GAAA,EAAD,kBACA,gBAACA,GAAA,EAAD,gBACA,gBAACA,GAAA,EAAD,CAAWzU,UAAU,eAArB,WACA,gBAACyU,GAAA,EAAD,CAAWzU,UAAU,eAArB,YAGJ,gBAAC2U,GAAA,EAAD,KACG+a,EAAYznC,QAtWJ,SAAAolC,GACnB,OAAOA,EAAWv/B,MAAMU,cAAc0nB,SAASjT,EAAMhb,OACtD,IAoW6CnQ,KAAI,SAAAu1C,GAAU,OAC9C,gBAAC,GAAD,CACE79B,IAAK69B,EAAWp1C,GAChBo1C,WAAYA,EACZkB,aAAcA,EACdD,SAAU8B,EACVre,KAAMnG,EAAgB0H,UANsB,IASxB,IAAvBoc,EAAY3/B,QACX,gBAAC,GAAD,CAAgBP,IAAK,EAAGuiB,KAAMnG,EAAgB0H,eAMvDmd,EAGN,E,4tBC7fD,IAAMtxB,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCyxC,YAAa,CACXxtB,UAAWjkB,EAAM4f,QAAQ,GACzBsE,aAAclkB,EAAM4f,QAAQ,GAC5B+L,SAAU,KAJoB,IAQlC,SAAS+lB,GAAT,GAYG,IAXDC,EAWC,EAXDA,SACAC,EAUC,EAVDA,WACA9xB,EASC,EATDA,SACAkQ,EAQC,EARDA,WACAK,EAOC,EAPDA,MACAliB,EAMC,EANDA,MAMC,IALDyiB,KAAQC,EAKP,EALOA,QAASjtB,EAKhB,EALgBA,MAAOktB,EAKvB,EALuBA,YAAa/nB,EAKpC,EALoCA,qBACrCyG,EAIC,EAJDA,QACAwmB,EAGC,EAHDA,YACA6b,EAEC,EAFDA,UACG9gB,EACF,SACK7Q,EAAUV,KAEV+R,EACHT,IAAgB/nB,GAA0BnF,GAASitB,EAElD8gB,GAAUpiC,GAAeC,EAAS6gB,EAAMvmB,OAE5C,IAAMgoC,EAAYtiC,GAA8B,IAAnBA,EAAQY,OAErC,OACE,gBAACuhB,GAAA,EAAD,CACEtR,UAAWH,EAAQuxB,YACnB7tC,MAAO2tB,EACPj5B,GAAE,UAAK+3B,EAAM/sB,KAAX,kBAEF,gBAACsuB,GAAA,EAAD,CAAYmgB,OAAQF,EAAWhgB,QAASxB,EAAM/sB,MAC3C6K,GAEH,gBAAC6jC,GAAA,EAAD,IACE15C,GAAG,eACH25C,aAAcJ,EACd7jB,SAAU8jB,EACV3f,WAAY,CACV7uB,KAAM+sB,EAAM/sB,KACZhL,GAAI+3B,EAAM/sB,KACV,aAAc+sB,EAAM/sB,OAElB+sB,EATN,CAUEkK,SAAUlK,EAAMkK,UACZxJ,GAEHiF,GACC,gBAACmb,GAAA,EAAD,CAAUrnC,MAAM,GAAGkkB,UAAW4jB,EAAYt5C,GAAI09B,GAC5C,0BAAKA,IAGRxmB,GACCA,EAAQrX,KAAI,SAAAyuC,GAAE,OACZ,gBAACuK,GAAA,EAAD,CAAU74C,GAAIsuC,EAAGtuC,GAAIwR,MAAO88B,EAAG98B,MAAO+F,IAAK+2B,EAAGtuC,IAC3CsuC,EAAGl3B,KAFM,IAKfoQ,GAEH,gBAAC,KAAD,KACGgyB,EAAY,MAAH,OAAS3jC,EAAT,cAA6B6hB,GAI9C,CAED,SAAerP,EAAAA,KAAW+wB,I,6kCCxD1B,IAAM7e,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAahB,OAZKiG,EAAOvJ,OACVsD,EAAOtD,KAAO,YAEXuJ,EAAOuE,QACVxK,EAAOwK,MAAQ,YAEZvE,EAAOo6B,UAA2B,SAAfp6B,EAAOvJ,OAC7BsD,EAAOqgC,SAAW,YAEfp6B,EAAOgH,UAA2B,SAAfhH,EAAOvJ,OAC7BsD,EAAOiN,SAAW,YAEbjN,CACR,EA+ND,SA7NA,YAAwE,IAA/CsoB,EAA+C,EAA/CA,gBAAiB4U,EAA8B,EAA9BA,iBAAkBC,EAAY,EAAZA,SAC1D,MAA8C9P,EAAAA,EAAAA,WAAS,GAAvD,GAAOkhB,EAAP,KAAwBC,EAAxB,KAEMvqC,GAAS45B,EAAAA,EAAAA,MAET32B,GAAUkY,EAAAA,EAAAA,MAEV9iB,GAAWmjB,EAAAA,EAAAA,MAEX8B,EAAYtd,EAAOsd,WAAa+G,EAAgB3zB,GAEhDqoC,EAAgB,CACpBzb,UAAAA,EACA4b,SAAAA,EACAD,iBAAAA,EACA5U,gBAAAA,GAOImmB,EAJc,KAClB/uB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMysB,YAAY/qB,KAAtB,KACjB1c,QAAO,SAAA0nC,GAAE,OAAIA,EAAG9qB,YAAcA,CAArB,IAEyB9U,OAE9BiiC,EAAkB,WACtBF,GAAmB,EACpB,EAEKG,EAAkB,WACtBH,GAAmB,EACpB,EAEKI,EAAe,SAAA75C,GACfooC,EACFA,IAEAn2B,GAAOoT,GAAkBkO,GAAkBphB,EAA3CF,CAAoDjS,EAEvD,EAkBK85C,EAAc,CAClB,CACEl6C,GAAI,MACJwR,MAAO,MACP4F,KAAM,0DAER,CACEpX,GAAI,QACJwR,MAAO,QACP4F,KAAM,uEAYV,OARAiU,EAAAA,EAAAA,YAAU,WACR1jB,EAASg4B,GAAa,qBACvB,GAAE,KAEHtU,EAAAA,EAAAA,YAAU,WACR1jB,EAASutC,GAAiBvhB,GAC3B,GAAE,CAACA,IAGF,gBAAC,MAAD,CACEsJ,SAvCW,SAAA3rB,GACb,OAAO,IAAIyY,SAAQ,SAAAtpB,GACjBkH,EAASwtC,GAAiB7jC,IACvBjD,MAAK,WACJ5N,EAAQ8R,EAAQM,KAAK4S,GAAkBkO,IACxC,IACAnlB,OAAM,SAAAlD,GACDA,EAAM6uC,iBACR15C,EAAQ,MAAG25C,GAAAA,GAAa9uC,EAAM6uC,mBAE9B15C,EAAQ,MAAG25C,GAAAA,GAAa9uC,GAE3B,GACJ,GACF,EA0BGivB,SAAUA,GACV8N,cAAeA,EACfjL,OAAQ,gBACNC,EADM,EACNA,aACAC,EAFM,EAENA,WACAC,EAHM,EAGNA,QACAjsB,EAJM,EAINA,OACA+2B,EALM,EAKNA,cALM,OAON,gBAAC,KAAD,CAAMxgB,WAAS,EAACC,eAAe,UAC7B,gBAAC,KAAD,CAAME,MAAI,EAACE,GAAI,EAAGC,GAAI,GACpB,gBAAC,KAAD,CAAMnoB,GAAG,wBACP,gBAAC,KAAD,CACEurB,MAAM,iCACN4Q,UAAU,oDAEZ,gBAAC,KAAD,MACIkM,EAAc1U,gBAAgB0H,UAC9B,gBAAC,IAAD,+EAKDgN,EAAc1U,gBAAgB0H,UACT,IAApBye,GACE,gBAAC,IAAD,KACE,yBACE,qCADF,sEAIA,wSASN,wBACE95C,GAAG,uBACHi9B,SACEoL,EAAc1U,gBAAgB0H,UAAYgC,GAG5C,2BACE,gBAAC,MAAD,CACEryB,KAAK,QACL6K,MAAM,QACN4nB,UAAW3F,GACX/vB,KAAK,OACL21B,YAAY,2BAEd,2BACA,gBAAC,MAAD,CACE1yB,KAAK,OACL6K,MAAM,YACN4nB,UAAW2b,GACXrxC,KAAK,SACLmP,QAASgjC,EACTxc,YAAY,qBAEG,UAAhBpsB,EAAOvJ,MACN,2BACE,gBAAC,MAAD,CACEiD,KAAK,WACL6K,MAAM,WACN4nB,UAAW3F,GACX/vB,KAAK,OACL21B,YAAY,YAEd,2BACA,gBAAC,MAAD,CACE1yB,KAAK,WACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,WACN6nB,YAAY,aAKpB,gBAAC,KAAD,CAAQ9qB,KAAMgnC,EAAiB9nB,QAASkoB,GACtC,gBAAC,KAAD,6EAIA,gBAAC,KAAD,KACE,gBAAC,IAAD,0UAUF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQ/tB,QAAS+tB,GAAjB,qBAGA,gBAAC,KAAD,CACEh6C,GAAG,kBACH01B,UAAW2S,EAAc1U,gBAAgB0H,SACzCpP,QACEoc,EAAc1U,gBAAgB0H,UAAYgC,GAJ9C,qBAaR,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQpR,QAASguB,GAAjB,UACA,gBAAC,KAAD,CACEjuB,QAAQ,YACRiG,MAAM,YACNjyB,GAAG,eACH01B,SACE4H,GACAC,IACC8K,EAAc1U,gBAAgB0H,SAEjCpP,QACqB,GAAnB6tB,EAAuBC,EAAkB1c,GAG1B,QAAhB/rB,EAAOvJ,KAAiB,WAAa,WAhI1C,GAyIb,E,kCCjQM,SAASsyC,GAAyB1vC,GACvC,MAAO,CACL2vC,QAAS7oC,OAAO9G,EAASoB,QAAQO,IAAI,aACrCiuC,MAAO9oC,OAAO9G,EAASoB,QAAQO,IAAI,UACnCkuC,WAAY/oC,OAAO9G,EAASoB,QAAQO,IAAI,gBAE3C,C,6/BCLM,SAASmuC,GAAgBxxC,GAC9B,OAAO,UACFsC,EAAAA,GAAAA,cAAa,KAAKtC,EAAS,CAAC,WAAY,gBAD7C,IAEEyxC,SAAUzxC,aAAF,EAAEA,EAASyxC,SACnBC,UAAW1xC,aAAF,EAAEA,EAAS0xC,WAEvB,CAEM,SAASC,GAAkB3xC,GAGhC,IAAMyxC,EAAWzxC,EAAQyxC,SAAWvtC,KAAKkI,MAAMpM,EAAQyxC,UAAY,KAC7DC,EAAY1xC,EAAQ0xC,UAAYxtC,KAAKkI,MAAMpM,EAAQ0xC,WAAa,KAEtE,OAAO,UACFluC,EAAAA,GAAAA,gBAAe,KAAKxD,EAAS,CAAC,WAAY,gBAD/C,IAEEyxC,SAAAA,EACAC,UAAAA,GAEH,CAKM,SAAeE,GAAtB,mC,oDAAO,WAA2BryC,GAA3B,sGAEG8D,G3D2LD,gB2D3LwB,CAAEsgB,UAAWpkB,EAAQxI,KAF/C,8BAGH6L,OAHG,cACCoM,EADD,0BAKEvK,EAAAA,GAAAA,IAAUuK,EAAKpY,IAAI46C,IAAkB,CAAC5wC,MALxC,4C,sBAWA,SAAeixC,GAAtB,mC,oDAAO,WAA8B96C,GAA9B,sGACqBsM,GAAIvD,GAAmB/I,IAD5C,8BACkD6L,OADlD,cACCoM,EADD,0BAGEvK,EAAAA,GAAAA,IAAU+sC,GAAgBxiC,GAAOpO,KAHnC,4C,sBAMA,SAAekxC,GAAtB,mC,oDAAO,WAA0B9xC,GAA1B,sGAEG8D,GAAI/D,GAAeC,GAAU,CAAEA,QAAS2xC,GAAkB3xC,KAF7D,8BAGH4C,OAHG,cACCoM,EADD,0BAIEvK,EAAAA,GAAAA,IAAU+sC,GAAgBxiC,GAAOpO,KAJnC,4C,sBAOA,SAAemxC,GAAtB,mC,oDAAO,WAA2B/xC,GAA3B,sGAEGoE,G3DmKD,gB2DnKyB,CAAEpE,QAAS2xC,GAAkB3xC,KAFxD,8BAGH4C,OAHG,cACCoM,EADD,0BAIEvK,EAAAA,GAAAA,IAAU+sC,GAAgBxiC,GAAOpO,KAJnC,4C,mhCC1BA,SAASoxC,GAAgB90B,GAAS,MACvC,OAAO,UACF5a,EAAAA,GAAAA,cAAa,KAAK4a,EAAS,CAAC,OAAQ,WAAY,UAAW,cADhE,IAEEjZ,KAAMiZ,EAAQjZ,KACdguC,SAAU/0B,EAAQ+0B,SAClBnvC,QAASoa,EAAQpa,QACjBuiB,QAAO,UAAEnI,EAAQmI,eAAV,aAAE,EAAiBzuB,KAAI,SAAAs7C,GAAE,MAAK,CACnC7yC,KAAKiD,EAAAA,GAAAA,cAAa4vC,EAAG7yC,KACrBW,QAASwxC,GAAgBU,EAAGlyC,SAFE,KAKnC,CAED,SAASmyC,GAAepuC,GACtB,MAAO,CAAEjF,KAAMtE,GAAiBuJ,QAAAA,EACjC,CAaD,SAASquC,GAAiBpjC,GACxB,OAAOvK,EAAAA,GAAAA,IAAUutC,GAAgBhjC,GAAO1N,GACzC,CAWD,SAAS+wC,GAAmBhwC,GAC1B,MAAO,CAAEvD,KAAM1E,GAAyBiI,MAAAA,EACzC,CAEM,SAASiwC,GAAiBv7C,GAC/B,oDAAO,WAAM2H,GAAN,+FACLA,EAAS,CAAEI,KAAM3E,GAAkBpD,GAAAA,IAD9B,kBAIoBsM,GAAIrE,GAAmBjI,IAJ3C,cAIG2K,EAJH,gBAKgBA,EAASkB,OALzB,OAKGoM,EALH,OAOHtQ,EAAS,CACPI,KAAMvE,GACNwJ,SAASU,EAAAA,GAAAA,IAAUutC,GAAgBhjC,GAAO1N,MATzC,2EAYI5C,EAAS2zC,GAAmB,EAAD,MAZ/B,0DAAP,OAAO,SAAP,UAAO,EAAP,yBAeD,CAEM,SAASE,GAAT,GAA6D,IAA5B5uB,EAA4B,EAA5BA,UAA4B,IAAjBqB,SAAAA,OAAiB,MAAN,GAAM,EAClE,oDAAO,WAAMtmB,GAAN,2FACkB,GAAnBsmB,EAASnW,OADR,wDAILnQ,EAAS,CACPI,KAAM,8BACNqP,KAAM6W,IANH,kBAUoB3hB,G5DrDpB,gB4DqD2C,CAC5CsgB,UAAAA,EACA6uB,WAAYxtB,EAASpuB,KAAI,SAAA2tB,GAAC,OAAIA,EAAExtB,EAAN,MAZzB,cAUG2K,EAVH,YAcc+C,GAAAA,GAdd,KAcwButC,GAdxB,UAc8CtwC,EAASkB,OAdvD,6CAcgE,CACjEoiB,SAAU,CAAC1jB,KADP2/B,GAdH,mBAiBHviC,EAAS,IAAEI,KAAM,+BAAkCmiC,IAjBhD,kDAmBHviC,EAAS,CAAEI,KAAM,qCAAsCuD,MAAK,OAnBzD,0DAAP,OAAO,SAAP,UAAO,EAAP,yBAsBD,CA8DM,SAASowC,GAAT,GAA4D,IAApC9uB,EAAoC,EAApCA,UAAW5c,EAAyB,EAAzBA,OAAQ2rC,EAAiB,EAAjBA,KAAMrB,EAAW,EAAXA,QACtD,oDAAO,WAAM3yC,GAAN,mGACLA,EAAS,CACPI,KAAMzE,GACN8T,KAAMwV,EACN5c,OAAAA,EACA2rC,KAAAA,EACArB,QAAAA,IAGIvc,EAAQ,CACZnR,UAAWA,EACX5c,OAAAA,EACA2rC,KAAAA,EACArB,QAAAA,GAbG,kBAiBoBhuC,G5DjJpB,gB4DiJ2CyxB,GAjB3C,cAiBGpzB,EAjBH,OAmBGskB,EAnBH,SAoBEorB,GAAyB1vC,IApB3B,IAqBDgxC,KAAAA,IArBC,KAyBcjuC,GAAAA,GAzBd,KAyBwButC,GAzBxB,UAyB8CtwC,EAASkB,OAzBvD,oDAyBgE,CACjEoiB,SAAU,CAAC1jB,KADP2/B,GAzBH,mBA6BHviC,EAAS,OACPI,KAAM7E,IACHgnC,GAFG,IAGNjb,WAAAA,KAhCC,kBAmCIib,GAnCJ,yCAqCHviC,EAAS,CACPI,KAAMxE,GACN+H,MAAO,KAAMX,SAASsN,KAAK3M,OAAS,KAAMX,WAvCzC,kBA0CI,IA1CJ,0DAAP,OAAO,SAAP,UAAO,EAAP,yBA6CD,CAeM,SAASixC,GAAcz1B,GAC5B,oDAAO,WAAMxe,GAAN,iGACLA,EAAS,CAAEI,K9DrKiB,mB8DqKOoe,QAAAA,IAER,iBAAhBA,EAAQjZ,OACjBiZ,EAAQjZ,KAAOC,KAAKkI,MAAM8Q,EAAQjZ,OAJ/B,SAOkBH,GAAI9E,GAAmBke,EAAQnmB,IAAK,CAAEmmB,QAAAA,IAPxD,cAOCxb,EAPD,gBAQcA,EAASkB,OARvB,cAQCoM,EARD,OASCjL,EATD,SAUAiuC,GAAgBhjC,IAVhB,IAWH4jC,wBAAwB,IAE1Bl0C,EAASyzC,GAAeC,GAAiBruC,KACzCrF,GA/M6B3H,WA+MEgN,EA/MFhN,GACxBsO,GAAA,kBAA6BtO,EAA7B,aAA4C,aAgM5C,kBAeEgN,GAfF,kCAjMT,IAAiChN,CAiMxB,UAAP,OAAO,SAAP,UAAO,EAAP,yBAiBD,C,oDAkBM,WAA8B+9B,GAA9B,gGACCzxB,G5DzNC,uB4DyN4ByxB,GAD9B,4C,sBAWP,SAAS+d,GAAiBC,GACxB,OAAOztC,GAAA,UACFytC,EADE,mBAEM,GAATA,EAAa,OAAS,SAFnB,kCAIL,UAEH,C,suCC7QM,SAAeC,GAAtB,mC,oDAAO,WAAuB1sC,GAAvB,0GACkBhD,G7DmHhB,Y6DnHmCgD,GADrC,cACC3E,EADD,gBAEcA,EAASkB,OAFvB,UAECoM,EAFD,OAGCiyB,GAAWx8B,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAO,CAAEkW,KAAM,CAAC7jB,OAEpDgF,EAAOqsC,KALN,kDAOEzR,GAPF,IAQDjb,WAAY,SACPorB,GAAyB1vC,IADpB,IAERgxC,KAAMrsC,EAAOqsC,UAVd,sCAcOzR,IAdP,6C,sBAiBA,SAAe+R,GAAtB,mC,oDAAO,WAAsBtzC,GAAtB,sGACkB2D,GAAI5D,GAAWC,IADjC,cACCgC,EADD,4BAEO+C,GAAAA,GAFP,KAEiBnC,GAAAA,aAFjB,SAEoCZ,EAASkB,OAF7C,mDAEsDvB,GAFtD,6G,sBASP,SAAS4xC,GAAaH,GACpB,OAAOztC,GAAA,UACFytC,EADE,eACmB,GAATA,EAAa,OAAS,SADhC,mBAEL,UAEH,CASM,SAASI,GAAU7zC,EAAK6d,GAE3B,IAAI7W,EADN,OAAI6W,GAGA7W,EADqB,WAAnB,GAAO6W,IACA1Z,EAAAA,GAAAA,gBAAe,CAAE+I,MAAOlN,EAAItI,GAAIiV,UAAWkR,EAAQnmB,MAEnDyM,EAAAA,GAAAA,gBAAe,CAAE+I,MAAOlN,EAAItI,GAAIiV,UAAWkR,IAGtD,6CAAO,WAAMxe,GAAN,iHAEoB0F,G7DiEtB,Y6DjE0CiC,GAFxC,cAEG3E,EAFH,gBAGgBA,EAASkB,OAHzB,cAGGoM,EAHH,OAIHtQ,EAAS2N,GAAW2C,IAJjB,kBAKIA,GALJ,2DAOItQ,EAAS4N,GAAejN,EAAItI,GAAI,KAAEwL,gBAPtC,0DAAP,OAAO,SAAP,UAAO,EAAP,2BAWKw5B,GAAO18B,EACf,CAiBM,SAAS8zC,GAAS9sC,GACvB,oDAAO,WAAM3H,GAAN,6FACLA,EAASiqB,MADJ,SAEiBoqB,GAAQ1sC,GAFzB,cAECtC,EAFD,yBAGErF,EAAS00C,GAAOrvC,KAHlB,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAKD,CAEM,SAASsvC,GAAQ3zC,GACtB,oDAAO,WAAMhB,GAAN,6FACLA,EAASiqB,MADJ,kBAGmBqqB,GAAOtzC,GAH1B,cAGGqE,EAHH,yBAIIrF,EAAS40C,GAAavvC,KAJ1B,yDAMIrF,EAAS60C,GAAU,EAAD,MANtB,yDAAP,OAAO,SAAP,UAAO,EAAP,yBASD,CAEM,SAASC,GAAT,EAA8BC,EAAY1sC,GAAQ,IAA5Bme,EAA4B,EAA5BA,KACrBnhB,GAAUU,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa4iB,GAAO,IAAI/kB,GAAAA,GAAAA,MAAakB,KAG/D,OAAIoyC,EAAa,GAAM1sC,GAAUA,EAAO2sC,QAC/B,CAAE50C,KAAMR,GAAayF,QAAAA,GAEvB,CAAEjF,KAAMP,GAAcwF,QAAAA,EAC9B,CAED,SAASwvC,GAAUlxC,GACjB,MAAO,CAAEvD,KAAMX,GAAakE,MAAAA,EAC7B,CAED,SAASsmB,KACP,MAAO,CAAE7pB,KAAMd,GAChB,CAED,SAASo1C,GAAOrvC,GACd,MAAO,CAAEjF,KAAMb,GAAQ8F,QAAAA,EACxB,CAED,SAASuvC,GAAavvC,GACpB,MAAO,CAAEjF,KAAMZ,GAAgB6F,QAAAA,EAChC,C,6/BChIM,SAAS4vC,GAAcp0C,GAC5B,MAAO,CACLu2B,QAAS8b,GAAYryC,GACrBw2B,MAAO,CAACz8B,GAAkBC,GhEwBE,oBgEtB/B,CAED,SAASq6C,GAAe5zC,GACtB,MAAO,CAAElB,KAAM1F,GAAiB4G,QAAAA,EACjC,CAGD,SAAS6zC,GAAe9vC,GACtB,MAAO,CAAEjF,KAAMzF,GAAiB0K,QAAAA,EACjC,CAED,SAAS+vC,GAAezxC,GACtB,MAAO,CAAEvD,KAAM5F,GAAiB6K,QAAS1B,EAC1C,CAKM,SAAS0xC,GAAah9C,GAC3B,oDAAO,WAAM2H,GAAN,uFACLA,EAASk1C,IADJ,cAIIl1C,EAJJ,KAIam1C,GAJb,SAIkChC,GAAe96C,GAJjD,mIAMG2H,EAASo1C,GAAe,EAAD,KAN1B,6EAAP,OAAO,SAAP,UAAO,EAAP,yBAUD,CAEM,SAASE,GAAch0C,GAC5B,oDAAO,WAAMtB,GAAN,6FACLA,EAAS,CAAEI,KAAM1F,GAAiB4G,QAAAA,IAD7B,SAGiB8xC,GAAW9xC,GAH5B,cAGC+D,EAHD,gBAICrF,EAASm1C,GAAe9vC,IAJzB,gCAKEA,GALF,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAOD,CAEM,SAASkwC,GAAcj0C,GAC5B,oDAAO,WAAMtB,GAAN,6FACLA,EAAS,CAAEI,KhE5BiB,mBgE4BOkB,QAAAA,IAD9B,SAGiB+xC,GAAY/xC,GAH7B,cAGC+D,EAHD,gBAICrF,EAASm1C,GAAe9vC,IAJzB,gCAKEA,GALF,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAOD,C,ujCC/CD,IAAMmwC,GAAkB7uC,GAElB4Y,IAAYC,EAAAA,EAAAA,IAAW,iBAAO,CAClCC,KAAM,CAAC,EACPg2B,KAAM,CACJxqB,gBAAiB,SAHQ,IAO7B,SAASyqB,GAAT,GAAkC,IAANC,EAAM,EAANA,GACpB31C,GAAWmjB,EAAAA,EAAAA,MACXxb,EACJguC,EAAGhuC,QAAUguC,EAAGhuC,OAAOwI,OAAS,EAAIwlC,EAAGhuC,OAAO+B,KAAK,MAAQ,OACvDksC,EAAOD,EAAGC,MAAQ,KAClBC,EAAWD,EACbA,EAAKE,KAAKztC,QAAO,SAAAwlB,GAAC,MAAgB,YAAZA,EAAEjK,KAAN,IAA2B1rB,KAAI,SAAA21B,GAAC,OAAIA,EAAE7mB,WAAN,IAClD,OAEEA,EAAc4uC,EAAOA,EAAK5uC,YAAc,OAE9C,OACE,gBAAC8mB,GAAA,EAAD,CAAUioB,gBAAc,GACtB,gBAAC9nB,GAAA,EAAD,CAAc+nB,SAAUL,EAAGK,SAAUC,mBAAiB,GACpD,uBAAKzvC,MAAO,CAAEm1B,QAAS,MAAO5Q,WAAY,IACxC,yBAAI4qB,EAAGtyC,MADT,KACoB,yBAAI2D,GACtB,2BACA,oCAHF,IAGkB,yBAAIW,IAErBkuC,EAAS39C,KAAI,SAAAg+C,GAAO,OACnB,gBAAC,KAAD,CACEzmC,KAAMymC,EACNC,OAAQ,kBACNn2C,EAASw1C,GAAgB,uBAAwB,WAD3C,GAIR,gBAAC,KAAD,CAAS5xB,MAAM,iBACb,gBAACkK,GAAA,EAAD,CAAUK,QAAM,GACd,2BAAkB,KAAZ+nB,EAAiB,OAASA,KATnB,KAiB5B,CAiID,SA/HA,YAOG,IANDjrC,EAMC,EANDA,KACAkf,EAKC,EALDA,QACAxgB,EAIC,EAJDA,OACAgf,EAGC,EAHDA,QACAytB,EAEC,EAFDA,kBACA/tB,EACC,EADDA,SAEA,MAAkD0I,EAAAA,EAAAA,UAAS,MAA3D,GAAOslB,EAAP,KAA0BC,EAA1B,KACMr2B,EAAUV,KAUVg3B,EAAa,WACjB,IAAMC,EAAYnuB,EAASme,QACzB,SAACC,EAAKxd,GAAN,OAAoBwd,EAAIxd,EAAQlwB,QAAUkwB,EAAQwtB,IAAMhQ,CAAxD,GACA,CAAC,GAGKxd,EAA4Btf,EAA5Bsf,QAASytB,EAAmB/sC,EAAnB+sC,eAKXC,EAFJH,EAAUvtB,KAAaytB,GAItBF,EAAUvtB,IAAY2tB,GAAIF,EAAgBF,EAAUvtB,KAAa,EAE9D4tB,EAAS,2CAAH,OACVH,EAAc,6BACYztB,EADZ,cACyBytB,EAAeI,UAChD,GAFQ,qBAGI7tB,GAHJ,wBAIOA,IAGjB8tB,EAAQ,0CAAH,OAA6C9tB,GAA7C,OACTytB,EAAiB,SAAH,OAAYA,GAAmB,IAGzCvzC,EAAMwzC,EAASE,EAASE,EAE9BzyC,OAAO2G,KAAK9H,EAAK,SAClB,EAEK6zC,EAAc,SAAA9uC,GAClB,OAAOA,EAAIhQ,KAAI,SAAA2tB,GAAC,OACd,uBAAKjW,IAAKiW,EAAExiB,MACV,gBAACyqB,GAAA,EAAD,CAAUK,QAAM,EAAC7J,QAAS,WA3CN,IAAA2yB,EAEtBX,EADED,KADoBY,EA2C8BpxB,GAzC/B,KAEAoxB,EAuCO,GACxB,gBAAChpB,GAAA,EAAD,CAAc5C,QAASxF,EAAExiB,OACxBgzC,IAAsBxwB,EAAI,gBAACqxB,GAAA,EAAD,MAAiB,gBAAC1P,GAAA,EAAD,OAE9C,gBAAC2P,GAAA,EAAD,CAAUC,GAAIf,IAAsBxwB,EAAGwxB,QAAQ,OAAOC,eAAa,GACjE,gBAAC5B,GAAD,CAAkBC,GAAI9vB,KAPZ,GAWjB,EAED,OACE,gBAAC0xB,EAAA,GAAD,CACEC,OAAO,QACPvsC,KAAMA,EACNkf,QAASA,EACT/J,UAAWH,EAAQR,MAEnB,gBAACkO,GAAA,EAAD,CACEvN,UAAWH,EAAQw1B,KACnBjhB,UACE,gBAACijB,GAAA,EAAD,KACG9tC,EAAOsf,QADV,IACoBtf,EAAO+sC,gBAAkBN,IAI9CzsC,EAAOsf,SACN,gBAAC6E,GAAA,EAAD,CAAUK,QAAM,EAAC7J,QAASiyB,GACxB,gBAACvoB,GAAA,EAAD,KACE,gBAAC0pB,GAAA,EAAD,OAEF,gBAACzpB,GAAA,EAAD,kCAIN,gBAACN,GAAA,EAAD,CACEvN,UAAWH,EAAQw1B,KACnBjhB,UAAW,gBAACijB,GAAA,EAAD,qCAEV9uB,aAAA,EAAAA,EAASgvB,aAAcX,EAAYruB,aAAD,EAACA,EAASgvB,aACnB,KAAxBhvB,SAAAA,EAASgvB,aACT,gBAAC7pB,GAAA,EAAD,CAAUK,QAAM,EAAC7J,QAASiyB,GACxB,gBAACvoB,GAAA,EAAD,KACE,gBAAC4pB,GAAA,EAAD,OAEF,gBAAC3pB,GAAA,EAAD,qCAEE,2BAFF,oCAIE,2BAJF,oCAUN,gBAACN,GAAA,EAAD,CACEvN,UAAWH,EAAQw1B,KACnBjhB,UAAW,gBAACijB,GAAA,EAAD,oCAEV9uB,aAAA,EAAAA,EAASkvB,SAAUb,EAAYruB,aAAD,EAACA,EAASkvB,SAIhD,E,sjCCzKD,IAAMC,GAAM5mC,EAAQ,OAGpB4mC,GAAIC,OAAOC,IACT,WACA,sEAGFF,GAAIC,OAAOE,aACT,8BACA,2FAGFH,GAAIC,OAAOE,aACT,0BACA,4FAGFH,GAAIC,OAAOE,aACT,6BACA,0FAGF,IAAMC,GAAYJ,GAAI5mC,QAAQ,0BACtBinC,GAAmBL,GAAI5mC,QAAQ,gBAA/BinC,eAEFC,GAAe,CACnB,CAAE//C,GAAI,QAASwR,MAAO,QAAS4F,KAAM,SACrC,CAAEpX,GAAI,SAAUwR,MAAO,SAAU4F,KAAM,UACvC,CAAEpX,GAAI,kBAAmBwR,MAAO,kBAAmB4F,KAAM,mBACzD,CAAEpX,GAAI,SAAUwR,MAAO,SAAU4F,KAAM,UACvC,CAAEpX,GAAI,SAAUwR,MAAO,SAAU4F,KAAM,UACvC,CAAEpX,GAAI,SAAUwR,MAAO,SAAU4F,KAAM,UACvC,CAAEpX,GAAI,UAAWwR,MAAO,UAAW4F,KAAM,WACzC,CAAEpX,GAAI,kBAAmBwR,MAAO,kBAAmB4F,KAAM,mBACzD,CAAEpX,GAAI,iBAAkBwR,MAAO,iBAAkB4F,KAAM,kBACvD,CAAEpX,GAAI,WAAYwR,MAAO,WAAY4F,KAAM,YAC3C,CAAEpX,GAAI,iBAAkBwR,MAAO,iBAAkB4F,KAAM,kBACvD,CAAEpX,GAAI,QAASwR,MAAO,QAAS4F,KAAM,WAGvC,SAAS4oC,GAAYjvC,GACnBA,EAAOc,QAAQouC,QAAQC,KAAK,aAAc,CACxC,CACEC,aAAc,OACdC,UAAW,EACXC,OAAO,IAGZ,CAkBD,IAmCMC,GAAiB,SAAChwB,EAASgZ,GAAV,OApBH,SAAAhZ,GAAW,MACrB+tB,EAAmB/tB,EAAnB+tB,eACFiB,EAAahvB,SAAH,UAAGA,EAASgvB,kBAAZ,aAAG,EAAqBxmB,OAAOxI,aAA5B,EAA4BA,EAASkvB,QACxD,OAAKnB,EAEE,GAAGvlB,OACRwmB,aADK,EACLA,EAAYz/C,KAAI,SAAAyuC,GAAE,2BAChBA,EAAGiP,YADa,iBAChB,EAASE,YADO,iBAChB,EACIztC,QAAO,SAAAuwC,GAAG,MAAkB,YAAdA,EAAIh1B,KAAR,WAFE,aAChB,EAEI1rB,KAAI,SAACg+C,EAAS2C,GACd,IAAMC,EAAU5C,EAAQ4C,SAAR,kBAA8BD,EAAQ,GACtD,MAAO,CACLlgD,KAAMu9C,EAAQlvC,YACd+xC,aAAc,GAAF,OAAKpS,EAAGtjC,KAAR,aAAiBy1C,GAEhC,GATa,KAHQ,EAe7B,CAGCE,CAAYrwB,GACTswB,OACA/gD,KAAI,SAAAg+C,GAAO,OAnCa,SAAAA,GAAW,UACtC,IAAKA,EAAS,MAAO,GAErB,IAAMgD,EAAY,UAAGhD,EAAQv9C,YAAX,iBAAG,EACjBwgD,MAAM,aADQ,iBAAG,EAEjBjhD,KAAI,SAAAkyC,GAAC,kBAASA,EAAT,WAFS,aAAG,EAGjB1gC,KAAK,MACH0vC,EACwB,OAA5BF,aAAA,EAAAA,EAAcvqC,OAAO,IAAauqC,EAAlC,UAAoDA,EAApD,KACF,MAAO,WAAP,OAAkBhD,aAAlB,EAAkBA,EAAS6C,aAA3B,aAA4CK,EAC7C,CAyBmBC,CAAqBnD,EAAzB,IACX1P,QAAO,SAACC,EAAK6S,GAAN,OAAkB7S,EAAItV,OAvCb,SAACooB,EAAa5X,GAAd,OACnB4X,EAAcpB,cAAH,EAAGA,GAAgBqB,iBAAiBD,EAAa5X,GAAS,IADlD,CAuCoB8X,CAAaH,EAAS3X,GAAnD,GAA4D,IACnEt5B,QAAO,SAAAixC,GAAO,OAAIA,CAAJ,GALI,EAavB,SAASI,GAAWtwC,EAAQuf,GAAS,QAC/BgxB,EACJA,EAlEF,SAAkBhxB,GAChB,IAAQgvB,EAAoDhvB,EAApDgvB,WAAYE,EAAwClvB,EAAxCkvB,OAAQ+B,EAAgCjxB,EAAhCixB,YAAalD,EAAmB/tB,EAAnB+tB,eAOzC,MAAO,CACLiB,WANcA,GAAc,GAO5BE,OANgBA,GAAUlvB,EAAQkxB,SAAW,GAO7CD,YANeA,QAAAA,EAAe,GAO9BlD,eANkBA,QAAAA,EAAkB,GAQvC,CAoDkBoD,CAASnxB,GAE1B,IAAMoxB,EAAmB,GACtB5oB,OADsB,UACfwoB,SADe,aACf,EAAgB9B,QACvB1mB,OAFsB,UAEfwoB,SAFe,aAEf,EAAgBhC,YACvBz/C,KAAI,SAAA2tB,GAAC,OAAIA,aAAJ,EAAIA,EAAGxiB,IAAP,IACLmjC,QAAO,SAACze,EAAGC,GAAJ,OAAYD,EAAEC,IAAK,EAAQD,CAA3B,GAA+B,CAAC,GAE1C3e,EAAOc,QAAQouC,QAAQC,KAAK,gBAAiB,CAC3C,CACEyB,QAAS,IACPC,SAAS,EACTzuC,YAAY,EACZ6X,OAAO,GACJ02B,MA0BT7B,GAAUgC,aArBc,CACtBC,eAAgB,SAAC1hD,EAAGyR,EAASwiC,EAAK0N,EAAQpc,GAAa,QAC/Cqc,EAAW,UAAGnwC,EAAQye,eAAX,aAAG,EAAiBgvB,WAClCz/C,KAAI,SAACM,EAAGqgD,GAAJ,MAAe,CAClBx1C,KAAM7K,EAAE6K,KACRwG,MAAOrR,EAAE6K,KACTi3C,MAAO,IAAOzB,EACdloB,KAAMn4B,EAAEo9C,MAAQp9C,EAAEo9C,KAAK5uC,YAJpB,IAMJmqB,OAPiB,UAQhBjnB,EAAQye,eARQ,aAQhB,EAAiBkvB,OAAO3/C,KAAI,SAACqiD,EAAG1B,GAAJ,MAAe,CACzCx1C,KAAMk3C,EAAEl3C,KACRwG,MAAO0wC,EAAEl3C,KACTi3C,MAAO,IAAOzB,EACdloB,KAAM4pB,EAAE3E,MAAQ2E,EAAE3E,KAAK5uC,YAJG,KAO5BqzC,GAAarc,EAAS,KAAMqc,EACjC,IAKH,IAO2B,EAzDDG,EAkDpBC,EAAetC,GAAeuC,WAAWC,WAEzCC,EAAcxxC,EAAOc,QAAQ2wC,MAAMC,IAGrCC,EAAuB,aAEvB5C,UAAAA,GAAgB6C,QAElBD,EAAoB,UADC5C,GAAe6C,MAAMJ,UACtB,aAAG,EAAoBjZ,OAGzC8Y,IA9DsBD,EA8DWC,EA7DrCtC,GAAe8C,WAAWT,GAC1BrC,GAAeuC,WAAWC,WAAa,KACvCxC,GAAe+C,eAAeP,WAAa,MA6D3C,IAAMQ,EAAWxC,GAAegB,EAAgBoB,GAC5CI,GAAUhD,GAAeiD,SAASD,EAAUJ,EACjD,C,4BCxLKx7B,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCs7C,QAAS,CACP/wB,MAAOvqB,EAAM4qB,QAAQ0wB,QAAQzwB,OAE/B0wB,UAAW,CACTrwB,gBAAiBlrB,EAAM4qB,QAAQ0wB,QAAQzwB,OAEzC2wB,OAAQ,CACNjxB,MAAOvqB,EAAM4qB,QAAQhnB,MAAMinB,OAE7B4wB,SAAU,CACRvwB,gBAAiBlrB,EAAM4qB,QAAQhnB,MAAMinB,OAEvC6wB,QAAS,CACPnxB,MAAOvqB,EAAM4qB,QAAQ8e,KAAK,MAE5BiS,UAAW,CACTzwB,gBAAiBlrB,EAAM4qB,QAAQ8e,KAAK,MAEtCkS,MAAO,CACLrxB,MAAOvqB,EAAM4qB,QAAQD,QAAQY,MAE/BswB,QAAS,CACP3wB,gBAAiBlrB,EAAM4qB,QAAQD,QAAQY,MAvBT,IA2BlC,SAASuwB,GAAT,GAAkE,IAA1C1uC,EAA0C,EAA1CA,SAAU+W,EAAgC,EAAhCA,OAAQsH,EAAwB,EAAxBA,SAAUswB,EAAc,EAAdA,WAC5C77B,EAAUV,KAChB,GAAI2E,EACF,OAAQ/W,GACN,KAAK,EACH,OACE,gBAACgX,GAAA,EAAD,CAAQ/D,UAAWH,EAAQq7B,WACzB,gBAACS,GAAA,EAAD,CAAiBvwB,SAAUA,KAGjC,KAAK,EACH,OACE,gBAACrH,GAAA,EAAD,CAAQ/D,UAAWH,EAAQu7B,UACzB,gBAAC,KAAD,CAAWhwB,SAAUA,KAG3B,KAAK,KACH,OAAO,gBAACrK,GAAA,EAAD,CAAkB2e,KAAMgc,GAAc,KAC/C,QACE,OACE,gBAAC33B,GAAA,EAAD,CAAQ/D,UAAWH,EAAQ27B,SACzB,gBAACI,GAAA,EAAD,CAAaxwB,SAAUA,KAKjC,OAAQre,GACN,KAAK,EACH,OACE,gBAAC4uC,GAAA,EAAD,CAAiB37B,UAAWH,EAAQo7B,QAAS7vB,SAAUA,IAE3D,KAAK,EACH,OAAO,gBAAC,KAAD,CAAWpL,UAAWH,EAAQs7B,OAAQ/vB,SAAUA,IACzD,KAAK,KACH,OACE,gBAACrK,GAAA,EAAD,CAAkBf,UAAWH,EAAQw7B,QAAS3b,KAAMgc,GAAc,KAEtE,QACE,OAAO,gBAACE,GAAA,EAAD,CAAa57B,UAAWH,EAAQ07B,MAAOnwB,SAAUA,IAE7D,CAODqwB,GAAangB,aAAe,CAC1BogB,WAAY,GACZ3uC,SAAU,MAGZ,SAAeuT,EAAAA,KAAWm7B,I,wCCnF1B,UACEI,SAAU,CACR9vB,KAAO,gBAAC+vB,GAAA,EAAD,CAAW1wB,SAAS,YAC3BlB,MAAO,WAET7f,QAAS,CACP0hB,KAAO,gBAAC,KAAD,CAAgBX,SAAS,YAChClB,MAAO,aAET3pB,IAAK,CACHwrB,KAAO,gBAACgwB,GAAA,EAAD,CAAU3wB,SAAS,YAC1BlB,MAAO,SAET8xB,KAAM,CACJjwB,KAAO,gBAAC2e,GAAA,EAAD,CAAkBtf,SAAS,YAClClB,MAAO,WAET+xB,QAAS,CACPlwB,KAAO,gBAAC2e,GAAA,EAAD,CAAkBtf,SAAS,YAClClB,MAAO,Y,onEC+BX,IAAMub,GAAW,SAAAh8B,GAAK,OAAIA,CAAJ,EAEhB0V,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJ0Y,QAAS,OACTmkB,SAAU,OACVn8B,eAAgB,eAChBo8B,WAAY,QAEd54C,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAE7B7gB,QAAS,CACPwgB,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3C3qB,IAAK,CACHsqB,gBAAiBlrB,EAAM4qB,QAAQ0wB,QAAQzwB,OAEzCwxB,KAAM,CACJnxB,gBAAiBlrB,EAAM4qB,QAAQhnB,MAAMinB,OAjBP,IAqB5BgI,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAkChB,OAjCKiG,EAAOvJ,OACVsD,EAAOtD,KAAO,YAEXuJ,EAAOtG,OACVK,EAAOL,KAAO,YAEXsG,EAAOopC,UAA4B,YAAhBppC,EAAOvJ,OAC7BsD,EAAOqvC,SAAW,YAEfppC,EAAOkE,OAA0B,QAAhBlE,EAAOvJ,MAAkC,SAAhBuJ,EAAOvJ,OACpDsD,EAAOmK,MAAQ,YAEZlE,EAAO4E,MAAwB,aAAhB5E,EAAOvJ,OACzBsD,EAAO6K,KAAO,YAGd5E,EAAO4E,MACS,aAAhB5E,EAAOvJ,OACNmO,KAAK5E,EAAO4E,MAAMC,YAEnB9K,EAAO6K,KAAO,6DAGXd,GAAU9D,EAAOopC,WACA,YAAhBppC,EAAOvJ,OACTsD,EAAOqvC,SAAW,gBAGjBtlC,GAAU9D,EAAOqpC,YACA,YAAhBrpC,EAAOvJ,MAAsBuJ,EAAOqpC,YACtCtvC,EAAOsvC,UAAY,gBAGhBtvC,CACR,EAEK84C,GAAiB,CACrB,CAAEnkD,GAAI,WAAYwR,MAAO,WAAY4F,KAAM,oBAC3C,CAAEpX,GAAI,MAAOwR,MAAO,MAAO4F,KAAM,QACjC,CAAEpX,GAAI,OAAQwR,MAAO,OAAQ4F,KAAM,gBACnC,CAAEpX,GAAI,UAAWwR,MAAO,UAAW4F,KAAM,mBAGrCgtC,GAAc,CAClBR,SAAU,oCACVt7C,IAAK,qCACLy7C,KAAM,kCACN3xC,QAAS,0CAGX,SAASiyC,GAAT,GAA4B,IACpBC,EAAQvuC,GADY,EAARqB,MAElB,OAAIktC,EAEA,gBAAC,IAAD,4BACmBA,EADnB,cAEE,gBAAC7nB,GAAA,EAAD,CAAUtJ,SAAS,YAClB,QACD,qBACEjH,KAAK,wBACLC,OAAO,SACP0b,IAAI,uBAHN,gBAOC,cAKL,gBAAC,IAAD,KACE,gBAACpL,GAAA,EAAD,CAAUtJ,SAAS,YADrB,OACsC,IACpC,qBAAGjH,KAAK,wBAAwBC,OAAO,SAAS0b,IAAI,uBAApD,gBAEK,IAJP,eAKe,IACb,yBACE,uCACG,IARP,mBAYH,CACD,SAAS0c,GAAT,GASG,IARD5wB,EAQC,EARDA,gBACA2U,EAOC,EAPDA,WACAE,EAMC,EANDA,SACAD,EAKC,EALDA,iBACA4J,EAIC,EAJDA,OACAlpC,EAGC,EAHDA,QACAsiB,EAEC,EAFDA,MACAi5B,EACC,EADDA,aAEA,MAAkC9rB,EAAAA,EAAAA,WAAS,GAA3C,GAAOsW,EAAP,KAAkBC,EAAlB,KACMtnC,GAAWmjB,EAAAA,EAAAA,MACXlD,EAAUV,KACV3U,GAAUkY,EAAAA,EAAAA,MAEVnf,GAAQyf,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0D,SAASpjB,KAAnB,IAC/B,GAAIA,EACF,MAAMA,EAGR,OAAiCyf,EAAAA,EAAAA,KAAY,SAAAC,GAC3C,IAAM0B,EAAQlsB,OAAO8Q,OAAO0Z,EAAMmC,KAAKT,OACvC,MAAO,CACLA,EACAA,EAAM1c,QAAO,SAAAy0C,GACX,OAAOA,EAAEh2B,YAAcxlB,EAAQjJ,KAAqB,IAAfykD,EAAE/f,QACxC,KAAK,CAAC,CAAE15B,KAAM,YAElB,GAR2C,KAA5C,UAAOmiB,EAAP,KAAau3B,EAAb,KAUMzK,EAAe,SAAA75C,GACfooC,EACFA,IAEAn2B,GAAO0U,GAAoB4M,GAAkBphB,EAA7CF,CAAsDjS,EAEzD,EAEKukD,EAAY,WAChB1V,GAAa,EACd,EAEKiJ,EAAY,WAChBjJ,GAAa,EACd,EAuBKrI,EAAM,6CAAG,WAAMt1B,GAAN,+GAEU3J,EAAS68C,EAAalzC,IAFhC,OAELw4B,EAFK,OAGNqI,EAGH5J,EAAiB,YAAauB,EAAOA,QAFrCv3B,EAAQM,KAAKkU,GAAoB4M,IAJxB,qDASP,gBAAiBvoB,IATV,0CAUF6G,GAAiB,KAAM5G,OAAQiG,IAV7B,gGAAH,sDAiBNszC,EAAsB,SAAA37C,GAC1BtB,EL5KG,SAAuBsB,GAC5B,oDAAO,WAAMtB,GAAN,uFACLA,EAAS,CAAEI,KAAMxF,GAAkB0G,QAAAA,IAD9B,cAIHtB,EAJG,KAKDm1C,GALC,SAMO/B,GAAW,SAAK9xC,GAAN,IAAejJ,GAAIiJ,EAAQjJ,GAAIu+B,SAAS,KANzD,wGAUH52B,EAASo1C,GAAe,EAAD,KAVpB,0DAAP,OAAO,SAAP,UAAO,EAAP,yBAaD,CK8JY8H,CAAc57C,IACvBsJ,EAAQM,KAAKkU,GAAoB4M,GAClC,EAEKmxB,GAAW/U,EAAAA,EAAAA,UACf,iBAAO,CACLgM,MAAO2I,EAAiB5sC,OACxBitC,MAAOL,EAAiB7kD,KAAI,SAAA6vB,GAAC,OAAIA,EAAE1kB,IAAN,IAAYqG,KAAK,MAFhD,GAIA,CAACqzC,IAGGM,GAAajV,EAAAA,EAAAA,UACjB,kBAAM5iB,EAAKttB,KAAI,SAAA4kD,GAAC,MAAK,CAAEzkD,GAAIykD,EAAEzkD,GAAIwR,MAAOizC,EAAEzkD,GAAIoX,KAAMqtC,EAAEz5C,KAAtC,GAAhB,GACA,CAACmiB,IAgBH,OAbA9B,EAAAA,EAAAA,YAAU,WACJsI,GACFhsB,EAASy8B,GAAUzQ,GAEtB,GAAE,CAACA,EAAiBhsB,KAErB0jB,EAAAA,EAAAA,YAAU,WACHid,IACHhd,SAASC,MAAQ,wBACjB5jB,EAASg4B,GAAa,aAEzB,GAAE,CAAC2I,EAAY3gC,IAGd,gBAAC,MAAD,CACEs1B,SAAU2J,EACVrM,SAAUA,GACV8N,cAAep/B,EACfg8C,SAAU,CACRC,OAAQ,WAAiBl6B,EAAjB,GAA4C,cAA1C7Y,EAA0C,KAAnCX,EAAmC,MAClD2zC,EADkD,EAAlBA,aACpBn6B,EAAO7Y,GAAO,kBAAMX,CAAN,GAC3B,GAEH4rB,OAAQ,YASF,MARJC,EAQI,EARJA,aACAhtB,EAOI,EAPJA,KACAI,EAMI,EANJA,qBACAa,EAKI,EALJA,OACAjG,EAII,EAJJA,OACAmF,EAGI,EAHJA,2BACA+nB,EAEI,EAFJA,QACAhoB,EACI,EADJA,aAEA,GAAIA,aAAwBlQ,MAAO,MAAMkQ,EACzC,OACE,gBAAC,GAAD,CAAeoX,MAAO2gB,EAAY5gB,KAAM4gB,GACtC,gBAAC,KAAD,CAAQ11B,KAAMo8B,EAAWld,QAASomB,GAChC,gBAAC,KAAD,4CACsC,yBAAI5mC,EAAOtG,MAAU,IAD3D,YAIA,gBAAC,KAAD,KACE,gBAAConC,GAAA,EAAD,8OAOF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQnmB,QAASisB,GAAjB,qBACA,gBAAC,KAAD,CACEl4C,GAAG,wBACHisB,QAAS,kBAAM24B,EAAoB37C,EAA1B,GAFX,+BAQJ,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE4nC,qBAAsB,CAAEC,QAAQ,GAChCC,yBAA0B,CAAED,QAAQ,GACpCjlB,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQtW,EAAOvJ,OAC/BuJ,EAAOvJ,KACNq9C,GAAa9zC,EAAOvJ,MAAM+rB,KAE1B,gBAAC,KAAD,OAINvI,MAAOA,EACP4Q,UACE2oB,EAAS/I,MAAQ,EAAjB,qBACkB+I,EAASC,MAD3B,KAEI,cAENnvC,OACE3M,EAAQjJ,IACN,gBAAC,KAAD,CACEurB,MACEm5B,EAAiB5sC,OAAS,EACtB,uDACA,UAGN,2BACE,gBAAC4hB,EAAA,EAAD,CACEzN,QAAS04B,EACTjvB,SAAUgvB,EAAiB5sC,OAAS,GAEpC,gBAACk5B,GAAA,EAAD,WAOZ,wBAAM/T,SAAUI,EAAcwN,aAAa,OACzC,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAMhjB,WAAS,EAACwqB,UAAU,UACxB,gBAAC,KAAD,CAAMrqB,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,OACLhL,GAAG,OACH6V,MAAM,QACNgkB,WAAY,CAAE,cAAe,iBAC7B7B,WAAS,EACTyF,UAAW3F,MAGf,gBAAC,KAAD,CAAM9P,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,OACL6K,MAAM,eACNmiB,WAAS,EACTyF,UAAW2b,GACX1hB,WAAU,oBAAK0sB,GAAY9yC,EAAOvJ,aAAxB,QAAiC,GAAjC,aACPsD,SAAAA,EAAQtD,MAARsD,MAAgBktB,GAAAA,EAASxwB,MACzBwI,SAAAA,EAAcxI,OACZyI,UAAAA,EAA4BzI,OAC3BsD,aAAA,EAAAA,EAAQtD,QAAQwI,aAAhB,EAAgBA,EAAcxI,MAC9B,KAENmP,QAASitC,KAEX,gBAAC,MAAD,CAAUn5C,KAAK,SACZ,SAAAwG,GAAK,OAxLH,SAACA,EAAOyzC,GAC/B,OAAQzzC,GACN,IAAK,WACHyzC,EAASC,OAAO,WAAY,MAC5BD,EAASC,OAAO,YAAa,MAC7BD,EAASC,OAAO,QAAS,MACzB,MAEF,IAAK,UACHD,EAASC,OAAO,OAAQ,MACxBD,EAASC,OAAO,QAAS,MACzB,MAEF,QACED,EAASC,OAAO,OAAQ,MACxBD,EAASC,OAAO,WAAY,MAC5BD,EAASC,OAAO,YAAa,MAGlC,CAqK+BG,CAAiB7zC,EAAOnB,EAAK40C,SAAjC,KAGV,gBAAC,KAAD,CAAMj9B,MAAI,GACS,aAAhB1W,EAAOvJ,MACN,gBAAC,MAAD,CACEiD,KAAK,OACLhL,GAAG,OACH6V,MAAM,kBACNmiB,WAAS,EACTyF,UAAW3F,GACX/vB,KAAK,OACLswB,SAAO,EACPqF,YAAY,cAGC,aAAhBpsB,EAAOvJ,MACN,gBAACs8C,GAAD,CAAUjtC,KAAM9F,EAAO4E,OAER,YAAhB5E,EAAOvJ,MACN,gBAAC,MAAD,CACE/H,GAAG,WACHgL,KAAK,WACLyyB,UAAW3F,GACXG,WAAS,EACTlwB,KAAK,OACLiwB,WAAS,EACTniB,MACE,iDAEE,gBAAC,KAAD,CACE0V,MAAM,uJAKN,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,cAIzBuK,YAAY,mBAGC,YAAhBpsB,EAAOvJ,MACN,gBAAC,MAAD,CACE/H,GAAG,YACHgL,KAAK,YACLyyB,UAAW3F,GACXG,WAAS,EACTlwB,KAAK,OACLiwB,WAAS,EACTshB,YAAU,EACVzjC,MACE,iDAEE,gBAAC,KAAD,CACE0V,MAAM,wLAMN,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,cAIzBuK,YAAY,8BACZroB,MAAOm4B,MAGO,QAAhBl8B,EAAOvJ,MAAkC,SAAhBuJ,EAAOvJ,OAChC,gBAAC,MAAD,CACEiD,KAAK,QACLhL,GAAG,QACHy9B,UAAW2b,GACXvjC,MAAM,MACNmiB,WAAS,EACT0F,YAAY,uBACZhG,WACGrsB,SAAAA,EAAQmK,OAARnK,MAAiBktB,GAAAA,EAAS/iB,OAC1BjF,SAAAA,EAAciF,QACZhF,UAAAA,EAA4BgF,QAC3BnK,aAAA,EAAAA,EAAQmK,SAASjF,aAAjB,EAAiBA,EAAciF,OAC/B,KAGLwvC,EAAWnlD,KAAI,SAAAyuC,GAAE,OAChB,gBAACuK,GAAA,EAAD,CAAU74C,GAAIsuC,EAAGtuC,GAAIuX,IAAK+2B,EAAGtuC,GAAIwR,MAAO88B,EAAG98B,OACxC88B,EAAGl3B,KAFU,OAQvB7G,aAAA,EAAAA,EAAco+B,cAAel+B,GAC5B,gBAAC,IAAD,CAAYsX,UAAWH,EAAQtc,OAC5BiF,aADH,EACGA,EAAco+B,cAKvB,gBAAC,GAAD,CACEhI,OAAQsT,EACRpT,MAAOx2B,EAAKw2B,MACZI,WAAY5J,EACZuJ,OAAQvJ,EACRhtB,KAAMA,OAIVi4B,GACA,gBAAC,KAAD,CAAYsG,MAAO,SAAAxuC,GAAC,OAAIiX,GAAajX,EAAGi9B,EAApB,IAI3B,GAGN,CAEM,SAASioB,GAAT,GAAsD,IAA5B3xB,EAA4B,EAA5BA,gBAAoB8gB,EAAQ,SAC3D,OACE,gBAAC8P,GAAD,MACM9P,EADN,CAEE9gB,gBAAiBA,EACjB1qB,QAAS,CAAE2jB,UAAW+G,EAAgB3zB,IACtCurB,MAAM,cACNi5B,aAActH,KAGnB,C,gBCxgBc,SAASqI,GAAwB7xB,GAC9C,IAAQgC,EAAiChC,EAAjCgC,SAAUzJ,EAAuByH,EAAvBzH,QAASu5B,EAAc9xB,EAAd8xB,UAK3B,OACE,gBAAC,KAAD,CACEj6B,MAAM,iFACNkS,UAAU,QAEV,gBAAC/D,EAAA,EAAD,CACEhE,SAAUA,EACVzD,MAAOuzB,EATQ,UADD,UAWd/d,KAAK,QACLxb,QAASA,GAET,gBAACw5B,GAAA,EAAD,OAIP,CCtBc,SAASC,GAAWhyB,GACjC,IACE9d,EAQE8d,EARF9d,OACAkrB,EAOEpN,EAPFoN,SACA6kB,EAMEjyB,EANFiyB,cACAC,EAKElyB,EALFkyB,YACAC,EAIEnyB,EAJFmyB,KACA/xB,EAGEJ,EAHFI,KACAhC,EAEE4B,EAFF5B,QACA5a,EACEwc,EADFxc,QAGF,OACE,4BACE,gBAAC,KAAD,CAASqU,MAAOs6B,GACd,gBAACnsB,EAAA,EAAD,CAAY,gBAAc,cAAczN,QAAS25B,GAC9C9xB,IAGL,gBAAC,KAAD,CACE9zB,GAAG,cACH8gC,SAAUA,EACV+B,aAAW,EACXjwB,KAAMwb,QAAQ0S,GACdhP,QAASA,GAER5a,EAAQrX,KAAI,SAAA2tB,GAAC,OACZ,gBAACqrB,GAAA,EAAD,CACE/iB,QAAM,EACNve,IAAKiW,EAAExtB,GACP01B,SAAUlI,EAAEhc,QAAUm0C,EACtB15B,QAAS,WAEP,OADA6F,IACOlc,EAAO4X,EAAEhc,MACjB,GAEAgc,EAAEpW,KAVO,KAgBrB,CC7CD,UACE,+CAAgD,CAC9C0uC,KAAM,gCAER,wBAAyB,CAAE5lB,YAAa,QACxC,wBAAyB,CACvBJ,QAAS,QACT7uB,SAAU,WACVopB,OAAQ,WAEV,8BAA+B,CAC7B0rB,QAAS,KACT90C,SAAU,WACV+0C,IAAK,IACLC,KAAM,SACN3jB,MAAO,QACPiB,OAAQ,IACRhb,QAAS,EACT29B,cAAe,QAEjB,oCAAqC,CACnCC,WAAY,uBAEd,0DAA2D,CACzD9rB,OAAQ,WAEV,qDAAsD,CAAEyF,QAAS,QACjE,yBAA0B,CAAEC,WAAY,OACxC,0BAA2B,CACzBC,MAAO,OACPpU,aAAc,GACd0X,QAAS,OAEX,uBAAwB,CAAErR,MAAO,WACjC,2FAA4F,CAC1FA,MAAO,WAET,gCAAiC,CAAEA,MAAO,WAC1C,iCAAkC,CAAEA,MAAO,WAC3C,gCAAiC,CAAEA,MAAO,WAC1C,sBAAuB,CACrBk0B,WAAY,OACZrzB,UAAW,oBACXszB,aAAc,OAEhB,iCAAkC,CAChCtmB,QAAS,eACTwD,QAAS,QACTrR,MAAO,OACPoI,OAAQ,WAEV,uCAAwC,CAAEpI,MAAO,QACjD,wCAAyC,CAAE8zB,QAAS,OACpD,6CAA8C,CAAEA,QAAS,cCrD3D,IACE,WAAY,CACVI,WAAY,OACZE,QAAS,GACT99B,OAAQ,EACR+9B,aAAc,aACdC,gBAAiB,aACjBC,UAAW,aACXC,kBAAmB,UACnBC,qBAAsB,UACtBvmB,eAAgB,eAElB,iBAAkB,CAChBwmB,iBAAkB,cAClBC,WAAY,eAEd,sBAAuB,CACrB/a,OAAQ,OACR3J,OAAQ,SACRiP,UAAW,mCACXE,aAAc,mCACdhX,OAAQ,aACR2F,MAAO,QAET,4BAA6B,CAC3BmR,UAAW,+BACXE,aAAc,gCAEhB,oBAAqB,CACnBrR,MAAO,OACPkC,OAAQ,SACR2kB,WAAY,mCACZC,YAAa,mCACbzsB,OAAQ,cAEV,0BAA2B,CACzBwsB,WAAY,+BACZC,YAAa,gCAEf,oBAAqB,CAAEzsB,OAAQ,eAC/B,0BAA2B,CAAE0sB,YAAa,gBC5B5C,IAAM7/B,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJ,uBAAwB,CACtB4Y,MAAO,SAGXgnB,OAAQ,CACN,oBAAqB,CACnB/0B,MAAOvqB,EAAM4qB,QAAQ20B,YAEvB,oBAAqB,CACnBh1B,MAAOvqB,EAAM4qB,QAAQU,QAAQC,KAC7Bi0B,OAAQ,OACR/zB,SAAU,WACVxH,WAAY,EACZC,cAAe,EACf+L,WAAYjwB,EAAMkwB,WAAWC,WAhBD,IAqBlC,SAASsvB,GAAT,GAYG,IAXDpvB,EAWC,EAXDA,MACAivB,EAUC,EAVDA,OACAnxC,EASC,EATDA,MACAqB,EAQC,EARDA,QACAwmB,EAOC,EAPDA,YACAxF,EAMC,EANDA,OACAkvB,EAKC,EALDA,WACA5/B,EAIC,EAJDA,SACA6xB,EAGC,EAHDA,SACApX,EAEC,EAFDA,SAEC,IADD3J,KAAQhtB,EACP,EADOA,MAAOmF,EACd,EADcA,qBAAsB+nB,EACpC,EADoCA,YAE/B5Q,EAAUV,KAEV2R,EAAwB,SAAAnoB,GAAG,uBAAI,GAAGooB,OAAOpoB,aAAV,EAAUA,EAAK0B,gBAAnB,aAAI,EAAyBf,KAAK,IAAlC,EAE3B4nB,EAAaT,IAAgB/nB,KAA2BnF,EAI9D,OAFI+tC,GAAUpiC,GAAeC,EAAS6gB,EAAMvmB,OAExCw1C,EAEA,gBAAC9tB,EAAA,EAAD,CAAQC,KAAMjB,GACZ,gBAACwhB,GAAA,EAAD,CACE2N,kBAAgB,EAChB1N,cAAY,EACZnoC,MAAOumB,EAAMvmB,MACbywB,SAAUA,GAAYlK,EAAMkK,SAC5Bla,UAAWH,EAAQo/B,QAElBtpB,GACC,gBAACmb,GAAA,EAAD,CAAUrnC,MAAM,IACd,0BAAKksB,IAGRxmB,EAAQrX,KAAI,SAAAyuC,GAAE,OACb,gBAACuK,GAAA,EAAD,CAAUrnC,MAAO88B,EAAG98B,MAAO+F,IAAK+2B,EAAG98B,OAChC88B,EAAGl3B,KAFO,IAKdoQ,IAOP,gBAAC0R,EAAA,EAAD,CAAQC,KAAMjB,GACZ,gBAAC,KAAD,CAAMlQ,MAAI,EAACD,UAAWH,EAAQR,MAC5B,gBAAC,KAAD,CACEmE,MAAO0N,EAAY3tB,GAASutB,EAAsBL,GAAe,IAEjE,gBAAC,IAAD,CACEuB,OAAQ,SAAAC,GAAK,OAAIjC,EAAMgC,OAAOC,EAAjB,EACbyN,KAAK,QACLzb,QAAQ,WACRs7B,OAAQpwC,EACRqwC,YAAa,CAAE5N,cAAc,GAC7B6N,gBAAiB,CAAE/N,QAAQ,GAC3BjoC,MAAOumB,EAAMvmB,MACbkmB,YACG0vB,GAAcnuB,EACX3tB,GAASutB,EAAsBL,QAC/ByB,EAEN3uB,MAAO2tB,EACPgJ,SAAUA,GAAYlK,EAAMkK,SAC5BpsB,MAAOA,GAEN6nB,GACC,gBAACmb,GAAA,EAAD,CAAUrnC,MAAM,IACd,0BAAKksB,IAGRxmB,GACCA,EAAQrX,KAAI,SAAAyuC,GAAE,OACZ,gBAACuK,GAAA,EAAD,CAAUthC,IAAK+2B,EAAG98B,MAAOA,MAAO88B,EAAG98B,OAChC88B,EAAGl3B,KAFM,OAU3B,CAED,SAAeiR,EAAAA,KAAW8+B,I,mzEC0H1B,IAAMM,GAAgB,SAAAC,GACpB,OAAOA,EACJt2C,MAAK,SAACse,EAAGC,GAAJ,OAAUD,EAAE5X,OAAS6X,EAAE7X,MAAvB,IACLjY,KAAI,SAAA8nD,GACH,IAAMC,EAAQD,EAAU7vC,OAAS,EAC7B9B,EAAM,GACV2xC,EAAU9hB,SAAQ,SAAAgiB,IAVxB,SAA2B7xC,GACzB,MAAO,gCAAgCsvB,KAAKtvB,EAC7C,CASW8xC,CAAkBD,IlEiIvB,SAAmB7xC,GACxB,MAAkB,iBAAPA,IAER+xC,MAAM/xC,KACN+xC,MAAMC,WAAWhyC,GAErB,CkErIkBiyC,CAAUJ,GAGnB7xC,GAAO,KAAJ,OAAS6xC,EAAT,MAFH7xC,GAAO,IAAJ,OAAQ6xC,EAAR,KAFH7xC,GAAO,IAAJ,OAAQ6xC,EAMd,IAED,IAAMK,EAAsB,MAAXlyC,EAAI,GAAaA,EAAIM,MAAM,GAAKN,EAC3CmyC,EAAYnyC,EAAImB,QAAQ,MAAQ,EAEtC,MAAO,CACLsvB,MAAOmhB,GAAS,EAAID,EAAUC,EAAQ,GAAK,OAC3Cr8B,MAAOo8B,EAAUC,GACjBQ,MAAO,aAAF,OAAepyC,GACpBxE,MAAO22C,EAAS,qBACED,EADF,2BAEEA,EAFF,MAInB,GACJ,EAED,SAASG,GAAa30B,GACpB,IAAQixB,EAAoDjxB,EAApDixB,UAAW2D,EAAyC50B,EAAzC40B,gBAAiBC,EAAwB70B,EAAxB60B,oBAC9BC,EAAW90B,EAAMrjB,KACjBo4C,EAAiB/0B,EAAMpiB,OAkC7B,OACE,gBAAC,MAAD,CACE2rB,SAlCiB,SAAA3rB,GACnB,IAAQo3C,EAA4Cp3C,EAA5Co3C,kBAAmBC,EAAyBr3C,EAAzBq3C,qBAC3BJ,EAAoBG,EAAmBC,EAAsBH,GAC7DF,GAAgB,EACjB,EA+BG/tB,SA7Ba,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAiBhB,OAhBKiG,EAAOo3C,kBAEDp3C,EAAOo3C,kBAAkBE,MAAM,gBACxCv9C,EAAOq9C,kBAAoB,0CAF3Br9C,EAAOq9C,kBAAoB,WAIxBp3C,EAAOq3C,qBAGT,uLAAuLrjB,KACtLh0B,EAAOq3C,wBAGTt9C,EAAOs9C,qBACL,gDAPFt9C,EAAOs9C,qBAAuB,WAUzBt9C,CACR,EAWGg9B,cATkB,CACpBqgB,kBAAmB,KACnBC,qBAAsB,MAQpBvrB,OAAQ,gBAAGC,EAAH,EAAGA,aAAchtB,EAAjB,EAAiBA,KAAjB,OACN,gCACE,wBAAM4sB,SAAUI,EAAcwN,aAAa,OACzC,gBAAC,KAAD,CAAQj4B,KAAM+xC,EAAW7yB,QAAS,kBAAMw2B,GAAgB,EAAtB,GAChC,gBAAC,KAAD,kCACA,gBAAC,KAAD,KACE,gBAAC,IAAD,+BACyB,mCADzB,SACgD,IAC9C,oDAFF,mCAGS,sCAHT,oFAMA,2BACA,gBAAC,IAAD,oMAKA,2BACA,gBAAC,MAAD,CACEt9C,KAAK,oBACLhL,GAAG,oBACH6V,MAAM,UACN6nB,YAAa+qB,aAAF,EAAEA,EAAgB73B,QAC7B6M,UAAW3F,KAnBf,KAsBE,gBAAC,MAAD,CACE9sB,KAAK,uBACLhL,GAAG,uBACH6V,MAAM,UACN6nB,YAAa+qB,aAAF,EAAEA,EAAgBpK,eAC7B5gB,UAAW3F,MAGf,gBAAC,GAAD,CACE6O,OAAQ,kBAAM2hB,GAAgB,EAAtB,EACRzhB,MAAOx2B,EAAKw2B,MACZI,WAAY5J,EACZuJ,OAAQvJ,EACRhtB,KAAMA,MAxCR,GAgDb,CAED,SAASw4C,GAAoBn1B,GAC3B,IAAQ5b,EAA0D4b,EAA1D5b,OAAQgxC,EAAkDp1B,EAAlDo1B,oBAAqBC,EAA6Br1B,EAA7Bq1B,YAAaC,EAAgBt1B,EAAhBs1B,YAClD,OACE,gCACE,gBAAC,KAAD,CAASz9B,MAAM,wBAAwBkS,UAAU,QAC/C,gBAAC/D,EAAA,EAAD,CACE15B,GAAG,mBACHiyB,MAAM,UACNwV,KAAK,QACLxb,QAAS88B,EACTrzB,SAC0B,OAAxBozB,GAAgCA,GAAuBhxC,EAAS,GAGlE,gBAACmxC,GAAA,EAAD,QAGJ,gBAAC,KAAD,CAAS19B,MAAM,4BAA4BkS,UAAU,QACnD,gBAAC/D,EAAA,EAAD,CACE15B,GAAG,mBACHiyB,MAAM,UACNwV,KAAK,QACLxb,QAAS+8B,EACTtzB,SAC0B,OAAxBozB,GACAhxC,EAAS,GACTgxC,EAAsB,GAGxB,gBAACI,EAAA,EAAD,QAKT,CAEM,SAASC,GAAoBz1B,GAClC,IAAQ01B,EAAqD11B,EAArD01B,aAAcj7C,EAAuCulB,EAAvCvlB,MAAOk7C,EAAgC31B,EAAhC21B,eAAgBp3B,EAAgByB,EAAhBzB,MAAOwV,EAAS/T,EAAT+T,KAE9CrX,GAAYrF,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OACjCiF,GAAuBjF,EAAOq+B,aAAR,EAAQA,EAAgB9xC,IADb,IAI7B+xC,GAAev+B,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OzDtIjC,SAAmCA,EAAOhgB,EAAM+4B,GAAS,YAC9D,OACE,UAAA/Y,EAAMgF,SAASM,eAAf,mBAAwBM,eAAxB,eAAiC2wB,eAAgBv2C,IACjD,UAAAggB,EAAMgF,SAASM,eAAf,mBAAwBM,eAAxB,eAAiCytB,kBAAmBta,CAEvD,CyDkIGwlB,CACEv+B,EACAq+B,aAFuB,EAEvBA,EAAgBr+C,KAChBq+C,aAHuB,EAGvBA,EAAgBtlB,QAJkB,IAQhCxT,GAAkBxF,EAAAA,EAAAA,IAAYsF,IAE9B9E,EAAQ+9B,EACV,6CADsB,uDAE0BD,aAF1B,EAE0BA,EAAgBr+C,KAF1C,YAEkDq+C,aAFlD,EAEkDA,EAAgBtlB,SAE5F,OACE,gCACG3T,GACC,gCACGk5B,GACC,gBAAC,KAAD,CAAS/9B,MAAOA,EAAOkS,UAAU,QAC/B,gBAAC/D,EAAA,EAAD,CACEzN,QAAS,kBAAMm9B,GAAa,EAAnB,EACTn3B,MAAOA,EACPwV,KAAMA,EACNt5B,MAAOA,GAEP,gBAACoxC,GAAA,EAAD,SAIJ+J,GACA,gBAAC,KAAD,CAAS/9B,MAAOA,EAAOkS,UAAU,QAC/B,gBAAC,KAAD,CACExR,QAAS,kBAAMm9B,GAAa,EAAnB,EACT3hB,KAAMA,EACNxV,MAAM,UACNu3B,QACE,gBAAC,GAAD,CAAc10C,SAAUyb,EAAkB,KAAO,SASlE,CAED,SAASk5B,GAAc/1B,GACrB,UAAgCgF,EAAAA,EAAAA,UAAS,MAAzC,GAAOoI,EAAP,KAAiBC,EAAjB,KAGEgf,EAKErsB,EALFqsB,aACA2J,EAIEh2B,EAJFg2B,kBACAN,EAGE11B,EAHF01B,aACA1hD,EAEEgsB,EAFFhsB,MACA2hD,EACE31B,EADF21B,eAOIroB,EAAc,WAClBD,EAAY,KACb,EAED,OACE,gCACE,gBAAC,KAAD,CAASxV,MAAM,iBACb,gBAACmO,EAAA,EAAD,CACEzH,MAAM,UACNwV,KAAK,QACL,gBAAc,cACdxb,QAfY,SAAA+N,GAClB+G,EAAY/G,EAAQA,EAAMyI,cAAgB,KAC3C,GAeO,gBAACknB,GAAA,EAAD,QAGJ,gBAAC,KAAD,CACE3pD,GAAG,cACH8gC,SAAUA,EACV+B,aAAW,EACXjwB,OAAQkuB,EACRhP,QAASkP,GAER+e,EAAalgD,KAAI,SAAA2tB,GAAC,OACjB,gBAACqrB,GAAA,EAAD,CACE/iB,QAAM,EACNve,IAAKiW,EAAExtB,GACP01B,SAAUlI,EAAEhc,QAAU9J,EACtBukB,QAAS,WAEP,OADA+U,IACO0oB,EAAkBl8B,EAAEhc,MAC5B,GAEAgc,EAAEpW,KAVY,KAcrB,gBAAC+xC,GAAD,CACEh7C,MAAO,CAAEmlB,YAAa,GACtBrB,MAAM,UACNwV,KAAK,QACL2hB,aAAcA,EACdC,eAAgBA,IAIvB,CAED,IAAMO,GAAW,SAAC,GAAuC,MAArChL,EAAqC,EAArCA,UAAWmH,EAA0B,EAA1BA,QAAS8D,EAAiB,EAAjBA,WAChCliD,GAAWmjB,EAAAA,EAAAA,MAEjB,OACE,gBAAC,KAAD,CACES,OAAOqzB,SAAA,UAAAA,EAAWrB,YAAX,eAAiB5uC,cAAe,6BAEvC,gBAAC,KAAD,CACEyI,KAAMyyC,EACN/L,OAAQ,kBACNn2C,EAASmiD,GAAiB,uBAAwB,WAD5C,GAIP/D,GAIR,EAEKgE,GAAqB,SAAC,GAA2B,IAAzBnL,EAAyB,EAAzBA,UAAWf,EAAc,EAAdA,QACjCkI,EACJ,gBAAC,KAAD,CAAQte,KAAK,QAAQxV,MAAM,WACxB2sB,EAAU5zC,MAIf,OACE,gBAAC4+C,GAAD,CACEhL,UAAWA,EACXmH,QAASA,EACT8D,WAAYhM,EAAQlvC,aAGzB,EAEKq7C,GAAuB,SAAC,GAAgC,IAA9BpL,EAA8B,EAA9BA,UAAW5+C,EAAmB,EAAnBA,GAAIw9C,EAAe,EAAfA,SAC7C,MAAgC9kB,EAAAA,EAAAA,UAAS,MAAzC,GAAOoI,EAAP,KAAiBC,EAAjB,KACMnuB,EAAOwb,QAAQ0S,GAMfE,EAAc,WAClBD,EAAY,KACb,EAEKkpB,EAAYzM,EAAS39C,KAAI,SAACg+C,EAASroB,GACvC,IAAMuwB,EACJ,gBAAClN,GAAA,EAAD,CAAUthC,IAAKsmC,EAAQ4C,QAASx0B,QAAS+U,EAAakpB,OAAK,GACxDtL,EAAU5zC,KADb,IACoB6yC,EAAQ4C,SAG9B,OACE,gBAACmJ,GAAD,CAAU7D,QAASA,EAAS8D,WAAYhM,EAAQlvC,YAAa4I,IAAKie,GAErE,IAED,OACE,gCACE,gBAAC,KAAD,CAASjK,MAAOqzB,EAAUrB,KAAK5uC,YAAa4I,IAAKqnC,EAAU5zC,MACzD,gBAAC,KAAD,CACEhL,GAAE,sBAAiBA,GACnB,YAAW4S,EAAO,aAAH,OAAgB5S,GAAO,KACtC,oCAA4BA,GAC5B,gBAAc,OACdisB,QA3BY,SAAA+N,GAClB+G,EAAY/G,EAAMyI,cACnB,EA0BOgF,KAAK,QACLxV,MAAM,WAEL2sB,EAAU5zC,OAGf,gBAAC,KAAD,CACEhL,GAAE,oBAAeA,GACjB8gC,SAAUA,EACVluB,KAAMA,EACNkf,QAASkP,GAERipB,GAIR,EAED,SAASE,GAAT,GAAoC,IAAX75B,EAAW,EAAXA,QACjBgvB,EAAahvB,aAAH,EAAGA,EAASgvB,WAC5B,OAAIhvB,GAAWgvB,EACNA,EAAWz/C,KAAI,SAAC++C,EAAW4B,GAChC,IAAMjD,EAAOqB,EAAUrB,MAAQ,KACzBC,EAAWD,EACbA,EAAKE,KAAKztC,QAAO,SAAAwlB,GAAC,MAAgB,YAAZA,EAAEjK,KAAN,IAClB,OACJ,OAAOiyB,EAAS1lC,OAAS,EACvB,gBAACkyC,GAAD,CACEzyC,IAAKipC,EACL5B,UAAWA,EACX4B,MAAOA,EACPhD,SAAUA,IAGZ,gBAACuM,GAAD,CACExyC,IAAKipC,EACL5B,UAAWA,EACXf,QAASL,EAAS,IAGvB,IAEI,IACR,CAED,SAAS4M,GAAyB12B,GAChC,IACE22B,EAQE32B,EARF22B,WACAC,EAOE52B,EAPF42B,iBACAjiB,EAME3U,EANF2U,cACA4R,EAKEvmB,EALFumB,aACA5pC,EAIEqjB,EAJFrjB,KACAgtB,EAGE3J,EAHF2J,aACAktB,EAEE72B,EAFF62B,eACAC,EACE92B,EADF82B,kBAGF,OACE,gBAAC,GAAD,CACE1jB,MAAI,EACJH,OAAQsT,EAAa5R,GACrBxB,MAAOx2B,EAAKw2B,MACZD,OAAQvJ,EACRG,SAAU+sB,EACVl6C,KAAMA,GAEN,gBAAC,KAAD,CAASkb,MAAOi/B,EAAmB/sB,UAAU,QAC3C,gBAAC/D,EAAA,EAAD,CAAYzN,QAASq+B,EAAkBtqD,GAAG,yBACvCqqD,EAAa,gBAACI,GAAA,EAAD,MAAyB,gBAACC,GAAA,EAAD,QAKhD,CAED,SAASC,GAAaj3B,GACpB,IACE9L,EAcE8L,EAdF9L,QACA+L,EAaED,EAbFC,gBACAwwB,EAYEzwB,EAZFywB,eACAyG,EAWEl3B,EAXFk3B,kBACAC,EAUEn3B,EAVFm3B,eACAR,EASE32B,EATF22B,WACAC,EAQE52B,EARF42B,iBACAjiB,EAOE3U,EAPF2U,cACA4R,EAMEvmB,EANFumB,aACA5pC,EAKEqjB,EALFrjB,KACAgtB,EAIE3J,EAJF2J,aACAktB,EAGE72B,EAHF62B,eACAC,EAEE92B,EAFF82B,kBACAjC,EACE70B,EADF60B,oBAGF,OACE,2BACE,gBAACuC,EAAA,EAAD,CAAQ74B,MAAM,UAAUhhB,SAAS,SAAS85C,UAAW,GACnD,gBAAC,KAAD,CACEljC,WAAS,EACTE,UAAWH,EAAQyE,KACnB/E,QAAS,EACT48B,WAAW,UAEX,gBAAC,MAAD,CACElkD,GAAG,OACHgL,KAAK,OACL6K,MAAM,OACNuxC,YAAU,EACV3pB,UAAW0pB,KAEb,gBAAC,GAAD,CACEjvB,QAASvE,EAAgBq3B,wBACzBhgD,KAAK,qBACL6K,MAAM,WACNuxC,YAAU,EACV3pB,UAAW0pB,KAEb,gBAAC,MAAD,CACEn8C,KAAK,YACL6K,MAAM,UACNqB,QAASitC,EACTp8C,KAAK,SACLq/C,YAAU,EACV3pB,UAAW0pB,KAEb,gBAAC,MAAD,CACEn8C,KAAK,eACL6K,MAAM,aACNqB,QAAS0zC,EACTltB,YAAY,OACZ31B,KAAK,SACLq/C,YAAU,EACV3pB,UAAW0pB,KAEb,gBAAC,MAAD,CACEn8C,KAAK,UACL6K,MAAM,UACN6nB,YAAY,gBACZxmB,QAAS2zC,EACT9iD,KAAK,SACLq/C,YAAU,EACV3pB,UAAW0pB,GACX9N,UAAQ,EACRpX,SAAU,SAAA7hC,GAAC,OACTmoD,EAAoBnoD,EAAE+rB,OAAO3a,MAAO,eAAgBnB,EAD3C,IAIb,wBAAM0X,UAAWH,EAAQya,OACzB,gBAAC+nB,GAAD,CACEC,WAAYA,EACZC,iBAAkBA,EAClBjiB,cAAeA,EACf4R,aAAcA,EACd5pC,KAAMA,EACNgtB,aAAcA,EACdktB,eAAgBA,EAChBC,kBAAmBA,MAM9B,CAED,SAASS,GAAT,GAOG,IANDZ,EAMC,EANDA,WACAC,EAKC,EALDA,iBACA1iC,EAIC,EAJDA,QACAlgB,EAGC,EAHDA,MACA8f,EAEC,EAFDA,SACG+uB,EACF,SACD,OAAI8T,EAEA,uBACErqD,GAAG,mBACH+nB,WAAWgO,EAAAA,EAAAA,GACTnO,EAAQsjC,cACRtjC,EAAQ7W,OACR6W,EAAQujC,YAGV,gBAACR,GAAD,IACEN,WAAYA,EACZC,iBAAkBA,EAClB1iC,QAASA,GACL2uB,IAEL/uB,GAKL,gBAAC,GAAD,CAAeC,MAAI,GACjB,gBAAC,KAAD,CAAMznB,GAAG,oBACP,gBAACorD,GAAD,IACEf,WAAYA,EACZC,iBAAkBA,EAClB1iC,QAASA,GACL2uB,IAEN,gBAAC,KAAD,KACE,gBAAC8U,GAAD,IACEhB,WAAYA,EACZ3iD,MAAOA,EACP4iD,iBAAkBA,EAClB1iC,QAASA,GACL2uB,MAIV,uBACExuB,WAAWgO,EAAAA,EAAAA,GACTnO,EAAQsjC,cACRtjC,EAAQ7W,OACR6W,EAAQ0jC,cAGT9jC,GAIR,CAED,SAAS4jC,GAAa13B,GACpB,IACE2U,EAQE3U,EARF2U,cACAgiB,EAOE32B,EAPF22B,WACAC,EAME52B,EANF42B,iBACArQ,EAKEvmB,EALFumB,aACAsQ,EAIE72B,EAJF62B,eACAC,EAGE92B,EAHF82B,kBACAn6C,EAEEqjB,EAFFrjB,KACAgtB,EACE3J,EADF2J,aAGF,OACE,gBAAC,KAAD,CACExR,OACE,gBAACC,GAAA,EAAD,KACE,gBAAC,KAAD,OAGJP,MAAO8c,EAAcr9B,KAAOq9B,EAAcr9B,KAAO,WACjDmxB,UACEkM,EAAc5a,YAAc,kBAAoB,oBAElD7X,OACE,gBAACw0C,GAAD,CACEC,WAAYA,EACZC,iBAAkBA,EAClBjiB,cAAeA,EACf4R,aAAcA,EACd5pC,KAAMA,EACNgtB,aAAcA,EACdktB,eAAgBA,EAChBC,kBAAmBA,KAK5B,CAEM,SAASe,GAAc73B,GAC5B,IAAQ+d,EAA4D/d,EAA5D+d,KAAM+Z,EAAsD93B,EAAtD83B,WAAY9Z,EAA0Che,EAA1Cge,OAAQ/d,EAAkCD,EAAlCC,gBAAiB83B,EAAiB/3B,EAAjB+3B,aACnD,OACE,gCACE,gBAAC,KAAD,CAAQ74C,KAAM6+B,EAAM3f,QAAS4f,EAAQ,cAAY,kBAC/C,gBAAC4T,GAAD,CACEnT,OAAQ,CACNV,KAAAA,EACAC,OAAAA,GAEFpJ,YAAU,EACVE,SAAUkJ,EACVnJ,iBAAkB,SAACgG,EAAW9f,GAC5BijB,IACA+Z,EAAald,EAAW9f,EACzB,EACDkF,gBAAiBA,EACjB5L,UAAWyjC,KAKpB,CAED,SAASH,GAAT,GAyBG,IAxBDhB,EAwBC,EAxBDA,WACAC,EAuBC,EAvBDA,iBACAj6C,EAsBC,EAtBDA,KACAm6C,EAqBC,EArBDA,kBACAxqD,EAoBC,EApBDA,GACAmkD,EAmBC,EAnBDA,eACAv8B,EAkBC,EAlBDA,QACA+L,EAiBC,EAjBDA,gBACA+3B,EAgBC,EAhBDA,iBACAC,EAeC,EAfDA,mBACAvC,EAcC,EAdDA,aACAM,EAaC,EAbDA,kBACAhiD,EAYC,EAZDA,MACAuB,EAWC,EAXDA,QACA2iD,EAUC,EAVDA,iBACAhB,EASC,EATDA,kBACAiB,EAQC,EARDA,YACAhB,EAOC,EAPDA,eACAiB,EAMC,EANDA,eACAC,EAKC,EALDA,WACAC,EAIC,EAJDA,cACAC,EAGC,EAHDA,aACA5C,EAEC,EAFDA,eACAd,EACC,EADDA,oBAEA,MAAgC7vB,EAAAA,EAAAA,UAAS,MAAzC,GAAOoI,EAAP,KAAiBC,EAAjB,KAUA,EACE1wB,EAAKC,WADCjF,EAAR,EAAQA,OAAQkF,EAAhB,EAAgBA,aAAcgoB,EAA9B,EAA8BA,QAASkS,EAAvC,EAAuCA,YAAan5B,EAApD,EAAoDA,OAEpD,OACE,gCACE,2BACE,gBAAC,IAAD,CAAY0a,QAAQ,MAApB,iBACA,gBAACkgC,GAAA,EAAD,CACEC,WAAS,EACTC,YAAY,WACZL,WAAYA,EACZ/rD,GAAG,sBAEH,gBAACqsD,GAAA,EAAD,CAAM90C,IAAK,GACT,gBAAC+0C,GAAA,EAAD,CAAYtsD,GAAG,SAASisB,QAAS,kBAAM+/B,EAAc,EAApB,GAC/B,gBAACO,GAAA,EAAD,CACEjhD,MACGtL,IACEqL,EAAOL,MACNK,EAAOwL,qBACNtG,aAAA,EAAAA,EAAcvF,SACZutB,SAAAA,EAASvtB,SACTy/B,SAAAA,EAAaz/B,QACduF,aAAA,EAAAA,EAAcvF,KAAKwG,SAAUF,EAAOtG,OACrCuF,aAAA,EAAAA,EAAcsG,uBACZ0hB,SAAAA,EAAS1hB,uBACT4zB,SAAAA,EAAa5zB,sBACdtG,aAAA,EAAAA,EAAcsG,mBAAmBrF,SAC/BF,EAAOuF,sBACb7W,KACEuQ,aAAA,EAAAA,EAAcvF,SACbutB,SAAAA,EAASvtB,SACTy/B,SAAAA,EAAaz/B,QACduF,aAAA,EAAAA,EAAcvF,KAAKwG,SAAUF,EAAOtG,OACnCuF,aAAA,EAAAA,EAAcsG,uBACZ0hB,SAAAA,EAAS1hB,uBACT4zB,SAAAA,EAAa5zB,sBACdtG,aAAA,EAAAA,EAAcsG,mBAAmBrF,SAC/BF,EAAOuF,qBAvBnB,yBA6BF,gBAAC21C,GAAA,EAAD,KACE,gBAAC,MAAD,CACExsD,GAAG,OACHgL,KAAK,OACLjD,KAAK,OACL8N,MAAM,OACN4nB,UAAW3F,KAEb,2BACA,gBAAC,KAAD,CACEvM,MAAM,0OAINkS,UAAU,QAEV,gBAAC,GAAD,CACEvF,QAASvE,EAAgBq3B,wBACzBhgD,KAAK,qBACLjD,KAAK,OACL8N,MAAM,mBACN4nB,UAAW3F,QAKnB,gBAACu0B,GAAA,EAAD,CAAM90C,IAAK,GACT,gBAAC+0C,GAAA,EAAD,CAAYtsD,GAAG,SAASisB,QAAS,kBAAM+/B,EAAc,EAApB,GAC/B,gBAACO,GAAA,EAAD,CACEjhD,MACGtL,IACEqL,EAAOojB,YACLle,aAAA,EAAAA,EAAcke,cACZ8J,SAAAA,EAAS9J,cACTgc,SAAAA,EAAahc,aACdle,aAAA,EAAAA,EAAcke,UAAUjd,SAAUF,EAAOmd,aAC7CzuB,IACAuQ,aADD,EACCA,EAAcke,cACb8J,SAAAA,EAAS9J,cACTgc,SAAAA,EAAahc,aACdle,aAAA,EAAAA,EAAcke,UAAUjd,SAAUF,EAAOmd,WAZ/C,wCAkBF,gBAAC+9B,GAAA,EAAD,KACE,gBAAC,MAAD,CACExhD,KAAK,YACL6K,MAAM,UACNqB,QAASitC,EACT1mB,UAAW2b,KAEb,gBAAC,KAAD,CACErxB,UAAWH,EAAQ6kC,UACnBzsD,GAAG,gBACHgL,KAAK,qBACLihB,QAASy/B,GAJX,eAOE,gBAAC,KAAD,OAEF,gBAACH,GAAD,CACE9Z,KAAMoa,EACNna,OAAQka,EACRj4B,gBAAiBA,EACjB63B,WAAY5jC,EAAQ8kC,UACpBjB,aAAcp7C,EAAK85B,WAIzB,gBAACkiB,GAAA,EAAD,CAAM90C,IAAK,GACT,gBAAC+0C,GAAA,EAAD,CAAYtsD,GAAG,SAASisB,QAAS,kBAAM+/B,EAAc,EAApB,GAC/B,gBAACO,GAAA,EAAD,CACEjhD,MACGtL,IACEqL,EAAOulB,SACNvlB,EAAOgzC,iBACN9tC,aAAA,EAAAA,EAAcqgB,YACZ2H,SAAAA,EAAS3H,YACT6Z,SAAAA,EAAa7Z,WACdrgB,aAAA,EAAAA,EAAcqgB,QAAQpf,SAAUF,EAAOsf,UACxCrgB,aAAA,EAAAA,EAAc8tC,mBACZ9lB,SAAAA,EAAS8lB,mBACT5T,SAAAA,EAAa4T,kBACd9tC,aAAA,EAAAA,EAAc8tC,eAAe7sC,SAC3BF,EAAO+sC,kBACbr+C,KACEuQ,aAAA,EAAAA,EAAcqgB,YACb2H,SAAAA,EAAS3H,YACT6Z,SAAAA,EAAa7Z,WACdrgB,aAAA,EAAAA,EAAcqgB,QAAQpf,SAAUF,EAAOsf,UACtCrgB,aAAA,EAAAA,EAAc8tC,mBACZ9lB,SAAAA,EAAS8lB,mBACT5T,SAAAA,EAAa4T,kBACd9tC,aAAA,EAAAA,EAAc8tC,eAAe7sC,SAC3BF,EAAO+sC,iBAvBnB,2BA6BF,gBAACmO,GAAA,EAAD,KACE,gBAAC,MAAD,CACExhD,KAAK,UACL6K,MAAM,UACN6nB,YAAY,gBACZxmB,QAAS2zC,EACTptB,UAAW2b,GACXC,UAAQ,EACRpX,SAAU,SAAA7hC,GAAC,OACTmoD,EAAoBnoD,EAAE+rB,OAAO3a,MAAO,eAAgBnB,EAD3C,IARf,KAaE,gBAAC,GAAD,CACErF,KAAK,iBACL6K,MAAM,UACNqB,QAAS40C,EAAex6C,EAAOsf,SAC/B2oB,WAAS,EACTD,YAAU,EACV5b,YAAY,uBACZD,UAAW2b,GACXC,UAAQ,MAId,gBAACgT,GAAA,EAAD,CAAM90C,IAAK,GACT,gBAAC+0C,GAAA,EAAD,CACEtsD,GAAG,SACHisB,QAAS,WACP+/B,EAAc,EACf,GAED,gBAACO,GAAA,EAAD,CACEjhD,MACGtL,IACEqL,EAAOshD,eACLp8C,aAAA,EAAAA,EAAco8C,iBACZp0B,SAAAA,EAASo0B,iBACTliB,SAAAA,EAAakiB,gBACdp8C,aAAA,EAAAA,EAAco8C,aAAan7C,SACzBF,EAAOq7C,gBACb3sD,IACAuQ,aADD,EACCA,EAAco8C,iBACbp0B,SAAAA,EAASo0B,iBACTliB,SAAAA,EAAakiB,gBACdp8C,aAAA,EAAAA,EAAco8C,aAAan7C,SAAUF,EAAOq7C,cAblD,+CAmBF,gBAACH,GAAA,EAAD,KACE,gBAAC,MAAD,CACExhD,KAAK,eACL6K,MAAM,aACNqB,QAAS0zC,EACTltB,YAAY,OACZ4b,YAAU,EACVC,WAAS,EACT9b,UAAW2b,QAKnB,gBAAC,KAAD,CAAMvxB,WAAS,EAACq8B,WAAW,UACzB,gBAAC,IAAD,CAAYl4B,QAAQ,MAApB,cAEE,gBAAC,KAAD,CAAST,MAAM,oJACb,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,wBAAMpL,UAAWH,EAAQya,OACzB,gBAAC8mB,GAAD,CACEC,aAAcA,EACdC,eAAgBA,IAElB,gBAAC9D,GAAD,CACEC,WAAS,EACT9vB,SAA4B,aAAlBzsB,aAAA,EAAAA,EAASlB,MACnBsiD,WAAYA,EACZp+B,QAAS,WACP0/B,IACAM,GACD,IAGH,gBAAC,KAAD,CAAS1gC,MAAOi/B,EAAmB/sB,UAAU,QAC3C,gBAAC/D,EAAA,EAAD,CAAYzN,QAASq+B,GAClBD,EAAa,gBAACI,GAAA,EAAD,MAAyB,gBAACC,GAAA,EAAD,QAG3C,gBAAChF,GAAD,CACEG,KAAK,gBACL/xB,KAAM,gBAAC61B,GAAA,EAAD,MACN7oB,SAAUA,EACVhP,QApPU,WAClBiP,EAAY,KACb,EAmPSnrB,OAAQ8zC,EACRxyC,QAAS6oC,GACT4F,cAAej+C,EACfk+C,YA5PU,SAAA5rB,GAClB+G,EAAY/G,EAAQA,EAAMyI,cAAgB,KAC3C,MAgQF,CAytBD,UAAerQ,EAAAA,GAAAA,IA3vDA,SAAA1qB,GAAK,MAAK,CACvBklD,gBAAiB,CACf,uBAAwB,CACtBh6B,gBAAiB,4BACjBF,WAAY,EACZwN,YAAa,GACb2sB,WAAY,IACZ15B,SAAU,GACVlB,MAAO,SAETtG,UAAW,EACXC,aAAc,GAEhBxE,KAAM,CACJ0Y,QAAS,OACTgtB,UAAW,SACXC,gBAAiB,OAAF,OAASnhB,GAAAA,UAAT,KACfohB,UAAW,eAEbC,gBAAiB,CACf,wBAAyB,CACvBh7B,MAAO,UAGXi7B,SAAU,CACRC,WAAY,oBACZntB,MAAO,OACPknB,OAAQ,kBACRL,WAAY,iBACZV,WAAY,GAAF,OAAKz+C,EAAM4qB,QAAQgI,UAAUrH,KAA7B,eACVhB,MAAOvqB,EAAM4qB,QAAQ20B,WACrB3jB,QAAS57B,EAAM4f,QAAQ,GACvBD,cAAe3f,EAAM4f,QAAQ,IAC7BoL,WAAYhrB,EAAM4f,QAAQ,IAC1B,qCAAsC,CACpC2K,MAAOvqB,EAAM4qB,QAAQ86B,gBAEvB,oBAAqB,CACnB/5B,SAAU,KAGdg6B,eAAgB,CACdxhB,OAAQ,mBAEVyhB,cAAe,CACbr7B,MAAO,WACPs7B,gBAAiB,iBACjBnZ,UAAW,gBACXjhB,SAAU,IAEZq6B,cAAe,CACb3hB,OAAQ,QAEVxJ,KAAM,CACJ/Z,SAAU,GAEZmlC,YAAa,CACXztB,MAAO,OACPmmB,WAAYz+C,EAAM4qB,QAAQgI,UAAUrH,KACpChB,MAAOvqB,EAAM4qB,QAAQ20B,WACrBtvB,WAAYjwB,EAAMkwB,WAAWC,SAC7ByL,QAAS57B,EAAM4f,QAAQ,GACvBD,cAAe3f,EAAM4f,QAAQ,IAC7BoL,WAAYhrB,EAAM4f,QAAQ,IAC1B,qCAAsC,CACpC2K,MAAOvqB,EAAM4qB,QAAQ86B,gBAEvB,oBAAqB,CACnB/5B,SAAU,KAGd/nB,MAAO,CACL2F,SAAU,WACVqxB,MAAO,EACP/Z,OAAQ,KACRqK,gBAAiBlrB,EAAM4qB,QAAQhnB,MAAMinB,MACrC+Q,QAAS57B,EAAM4f,QAAQ,GACvB8+B,aAAc,aACdzlB,SAAU,IACVnY,UAAW,UACXklC,YAAa,QAEfC,YAAa,CACX17B,MAAOvqB,EAAM4qB,QAAQU,QAAQC,MAE/BliB,OAAQ,CACN68C,SAAU,SACVzH,WAAYz+C,EAAM4qB,QAAQu7B,MAC1B,UAAW,OACT,QAAS,CACP58C,SAAU,uBAEZ,oBAAqB,CACnB2hB,gBAAiBlrB,EAAM4qB,QAAQw7B,SAC/BjiB,OAAQ,OACR7L,MAAO,SAEN+tB,IACAC,KAGP7C,UAAW,CACTjpB,OAAQ,QACR2J,OAAQ,sBAEVyf,YAAa,CACXppB,OAAQ,EACR2J,OAAQ,KAEV4gB,UAAW,CACT1sB,WAAY,GACZpU,UAAW,IAEbu/B,cAAe,CACbprB,QAAS,OACTmuB,SAAU,UAEZ5hC,KAAM,CACJiX,QAAS57B,EAAM4f,QAAQ,GACvBD,cAAe3f,EAAM4f,QAAQ,MAE/B4mC,eAAgB,CACdj8B,MAAO,mBAETk8B,YAAa,CACXpuB,WAAY,MACZpI,WAAYjwB,EAAMkwB,WAAWC,SAC7B1E,SAAU,MACVP,gBAAiBlrB,EAAM4qB,QAAQ8e,KAAK,KACpC9N,QAAS57B,EAAM4f,QAAQ,IACvB8+B,aAAc1+C,EAAM4f,QAAQ,IAE9BujB,aAAc,CACZ7K,MAAO,OACPD,WAAYr4B,EAAM4f,SAAS,GAC3BgM,YAAa5rB,EAAM4f,QAAQ,IAvIX,GA2vDc,CAChCmM,WAAW,EACXzoB,KAAM,OAFR,EAvtBA,SAAa0oB,GACX,IAAM06B,GAAanlB,EAAAA,EAAAA,UACbolB,GAAgBplB,EAAAA,EAAAA,UAChBqlB,GAAYrlB,EAAAA,EAAAA,UAGhBrhB,EA0BE8L,EA1BF9L,QACAkhC,EAyBEp1B,EAzBFo1B,oBACAY,EAwBEh2B,EAxBFg2B,kBACAX,EAuBEr1B,EAvBFq1B,YACAC,EAsBEt1B,EAtBFs1B,YACAuF,EAqBE76B,EArBF66B,gBACAnF,EAoBE11B,EApBF01B,aACAngD,EAmBEyqB,EAnBFzqB,QACAsJ,EAkBEmhB,EAlBFnhB,QACA2F,EAiBEwb,EAjBFxb,KACAyb,EAgBED,EAhBFC,gBACArD,EAeEoD,EAfFpD,QACArC,EAcEyF,EAdFzF,SACA5d,EAaEqjB,EAbFrjB,KACAgtB,EAYE3J,EAZF2J,aACAsuB,EAWEj4B,EAXFi4B,mBACA3rD,EAUE0zB,EAVF1zB,GACAqoC,EASE3U,EATF2U,cACA4R,EAQEvmB,EARFumB,aACAsQ,EAOE72B,EAPF62B,eACApG,EAMEzwB,EANFywB,eACAyG,EAKEl3B,EALFk3B,kBACAC,EAIEn3B,EAJFm3B,eACA2D,EAGE96B,EAHF86B,gBACA1C,EAEEp4B,EAFFo4B,eACAvD,EACE70B,EADF60B,oBAGF,MAAoC7vB,EAAAA,EAAAA,YAClC14B,GAA0B,QAArBkY,EAAKu2C,aADZ,GAAOpE,EAAP,KAAmBqE,EAAnB,KAIM9hC,EAAY+G,EAAgB3zB,GAElC,EAMIqQ,EAAKC,WALPgB,EADF,EACEA,OACAf,EAFF,EAEEA,aACAE,EAHF,EAGEA,qBACA02B,EAJF,EAIEA,oBACAC,EALF,EAKEA,gBAGF,MAA0B1O,EAAAA,EAAAA,UAAS,CACjCi2B,WAAY,GACZ5C,WAAY,EACZ6C,kBAAkB,EAClB/C,aAAa,IAJf,GAAO7gC,EAAP,KAAcwsB,EAAd,KAOM7vC,GAAWmjB,EAAAA,EAAAA,MAIX+jC,EAFe,IAAI/+C,gBAAgByC,EAAQ3F,SAAS+d,QAE/Bre,IAAI,SAEzB3D,GAAMoiB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmD,KAAKzB,MAAMmiC,IAAU,CAAC,CAAhC,GAAN,KAEjBC,IAAc/jC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmD,KAAKY,SAAf,IAE7Bja,GAAanM,EAAbmM,SAYF01C,GAAqBH,EAEvB,oCADA,qCAGJ,GAAoChiC,EAAAA,SAAc,kBAAM/W,CAAN,GAAc,CAACjB,IAAzDugB,GAAR,GAAQA,QAASytB,GAAjB,GAAiBA,eAEXgL,GAAiBhhC,EAAAA,SAAc,WAAM,MACnC0mC,EAAU,UAAGjD,EAAel7B,IAAS,UAA3B,aAAG,EAA4Bpf,MAE/C,OAAI6sC,GACK,CACL9mC,IAAK,GAAF,OAAKqZ,GAAL,YAAgBytB,IACnBrzC,KAAM4lB,GACNmT,QAASsa,IAEDA,IAAmB0Q,EAGtB,CACLx3C,IAAK,GAAF,OAAKqZ,GAAL,YAAgBm+B,GACnB/jD,KAAM4lB,GACNmT,QAASgrB,QALX,CAQH,GAAE,CAACn+B,GAASytB,GAAgByN,IAEvBkD,IAA2BjkC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OzDz+B7C,SAAiCA,EAAOkF,GAAY,MACzD,iBAAOlF,EAAMgF,SAASG,cAAcD,UAApC,aAAO,EAA0C++B,UAClD,CyDw+BGC,CAAwBlkC,EAAOq+B,cAAR,EAAQA,GAAgB9xC,IADC,IAI5C43C,IAA+BpkC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OzDj/BjD,SAAoCA,EAAOkF,GAAY,MAC5D,iBAAOlF,EAAMgF,SAASG,cAAcD,UAApC,aAAO,EAA0C9d,OAClD,CyDg/BGg9C,CAA2BpkC,EAAOq+B,cAAR,EAAQA,GAAgB9xC,IADE,IAIhD83C,IAA6BtkC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OzDz+B/C,SAAmCA,EAAOkF,GAAY,MAC3D,iBAAOlF,EAAMgF,SAASG,cAAcD,UAApC,aAAO,EAA0Co/B,YAClD,CyDw+BGC,CAA0BvkC,EAAOq+B,cAAR,EAAQA,GAAgB9xC,IADC,IAI9Ci4C,IAA0BzkC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAC/CiF,GAAuBjF,EAAOq+B,cAAR,EAAQA,GAAgB9xC,IADC,IAQ3Ck4C,KAJ0B1kC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OzDl+B5C,SAAgCA,EAAOkF,GAAY,MACxD,iBAAOlF,EAAMgF,SAASG,cAAcD,UAApC,aAAO,EAA0Cw/B,SAClD,CyDi+BGC,CAAuB3kC,EAAOq+B,cAAR,EAAQA,GAAgB9xC,IADC,IAI1B,SAAAq4C,GACrBpY,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhB4T,YAAa+D,GAFG,GAInB,GAgBD,SAASC,GAAT,GAAmC,IAAP75C,EAAO,EAAPA,IAC1B,GAAIA,EAAK,OACDjF,EAASu9C,SAAH,UAAGA,EAAWryB,eAAd,aAAG,EAAoBlrB,OACnCA,GAAUD,GAAcC,EAAQiF,EAAK,MAAM,EAC5C,CACF,CAED,IAAM85C,GAAyB,SAAAF,GAC7BpY,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhB2W,iBAAkBgB,GAFF,GAInB,EAED,SAASG,GAAiB/iD,GACxBrF,EAAS80C,GAAWzvC,GACrB,CAED,SAASgjD,GAAqBhjD,GAC5BrF,E3CxvCG,SAAwBqF,GAC7B,MAAO,CAAEjF,KAAM,oBAAqBiF,QAAAA,EACrC,C2CsvCYijD,CAAejjD,GACzB,CAED,SAASkjD,GAA0BljD,GACjCrF,E3CxvCG,SAA6BqF,GAClC,OAAO42B,GAAqB52B,EAC7B,C2CsvCYmjD,CAAoBnjD,GAC9B,CAED,IlEjgC+BmZ,GAAStd,GkEigClCunD,GAAY,SAAC3yB,EAAW4yB,GACxB5yB,EAAU/J,MAAM2O,MAAQ,KAAKguB,EAAWliD,MAAMma,SAAW,GACzDmV,EAAU/J,MAAM2O,MAAQ,KAAKguB,EAAWliD,MAAMma,SAAW,GAC7D2jC,IACD,EAEKA,GAAe,WAAM,gBACzBoC,SAAA,UAAAA,EAAepyB,eAAf,mBAAwBlrB,cAAxB,SAAgCu/C,SAChClC,SAAA,UAAAA,EAAYnyB,eAAZ,mBAAqBlrB,cAArB,SAA6Bu/C,SAC7BhC,SAAA,UAAAA,EAAWryB,eAAX,mBAAoBlrB,cAApB,SAA4Bu/C,QAC7B,EA8FD,OAhFAjlC,EAAAA,EAAAA,YAAU,WACR,IAAIklC,EASJ,OARI3jC,IACF2jC,EAAY5oD,EACV0+B,GAAY,QAAD,OAASzZ,GAAa,CAC/B4jC,IAAKT,GACL/lB,QAAS+lB,OAIR,kBAAOQ,EAAYA,SAAct2B,CAAjC,CACR,GAAE,CAACrN,EAAWjlB,KAEf0jB,EAAAA,EAAAA,YAAU,WACRlY,YAAW,WACT84C,IACD,GAAE,IACJ,GAAE,CAAC/zC,EAAKu2C,eAETpjC,EAAAA,EAAAA,YAAU,WACJwjC,IACFvS,GAAQ,CAAEt8C,GAAI6uD,GAAdvS,CAAuB30C,GAEvBwL,YAAW,WACT84C,IACD,GAAE,KAEHtkD,EACE0+B,GAAY,QAAD,OAASwoB,GAAS,CAC3B2B,IAAKX,MAIZ,GAAE,CAAChB,EAAOlnD,KAEX0jB,EAAAA,EAAAA,YAAU,WAAM,MACRta,EAASq9C,SAAH,UAAGA,EAAYnyB,eAAf,aAAG,EAAqBlrB,OAEhCA,GAAUuf,GACZ+wB,GAAWtwC,EAAQuf,EAEtB,GAAE,CAACA,KAEJjF,EAAAA,EAAAA,YAAU,WACR,OAAO1jB,EACL0+B,GAAY,WAAY,CACtBjW,UAAW4/B,GACX9M,OAAQgN,KAGb,GAAE,KAEH7kC,EAAAA,EAAAA,YAAU,W3Cp2CL,IAA0BrgB,EAAM+4B,E2Cq2C/BslB,UAAAA,GAAgBtlB,UAClBp8B,G3Ct2C2BqD,E2Cs2CDq+C,cAAD,EAACA,GAAgBr+C,K3Ct2CT+4B,E2Cs2CeslB,cAAvB,EAAuBA,GAAgBtlB,Q3Cr2C7D,CAAEh8B,KAAM,oBAAqBiF,QAAS,CAAEhC,KAAAA,EAAM+4B,QAAAA,M2Cs2CjDp8B,E3C/1CC,SAAwBqD,EAAM+4B,GACnC,oDAAO,WAAMp8B,GAAN,uFACLA,EAAS,CACPI,KAAM,qBACNiF,QAAS,CACPhC,KAAAA,EACA+4B,QAAAA,KALC,kBASU12B,G9B6BV,gB8B7BkC,CAAErC,KAAAA,EAAM+4B,QAAAA,IAT1C,iGAWIp8B,EAASi8B,GAAqB,EAAD,MAXjC,yDAAP,OAAO,SAAP,UAAO,EAAP,yBAcD,C2Cg1Cc6sB,CAAepH,cAAD,EAACA,GAAgBr+C,KAAMq+C,cAAvB,EAAuBA,GAAgBtlB,UAEjE,GAAE,CAACslB,cAAD,EAACA,GAAgBtlB,WAEpB1Y,EAAAA,EAAAA,YAAU,WAWR,OAVgC,IAA5BmkC,IACEnG,UAAAA,GAAgBtlB,SAClBp8B,EACEm8B,GAAW,CACTlT,QAASy4B,cAAF,EAAEA,GAAgBr+C,KACzB+4B,QAASslB,cAAF,EAAEA,GAAgBtlB,WAK1B,WACLp8B,EAAS,CAAEI,KAAM,mBAClB,CACF,GAAE,CACDynD,GACAnG,cAFC,EAEDA,GAAgBtlB,QAChBslB,cAHC,EAGDA,GAAgBr+C,KAChBrD,IAIA,gBAACsjD,GAAD,CACEZ,WAAYA,EACZC,iBAlNqB,WACvB3iD,EACE+hB,GAAW,SACNxR,GADK,IAERu2C,YAAapE,EAAa,SAAW,UAGzCqE,GAAerE,EAChB,EA2MGhiB,cAAeA,EACf4R,aAAcA,EACdsQ,eAAgBA,EAChBC,kBAAmBA,GACnBn6C,KAAMA,EACNgtB,aAAcA,EACdr9B,GAAIA,EACJmkD,eAAgBA,EAChBv8B,QAASA,EACT+L,gBAAiBA,EACjB+3B,iBA9JqB,WACvB+D,IAAe,EAChB,EA6JGK,uBAAwBA,GACxBlB,iBAAkB5jC,EAAM4jC,iBACxBhD,iBA7JqB,WACvB6D,IAAe,EAChB,EA4JG7E,kBAAmBA,EACnBiB,YAAa7gC,EAAM6gC,YACnBhB,eAAgBA,EAChBiB,eAAgBA,EAChBhD,oBAAqBA,EACrB7/C,QAASA,EACT0iD,mBAAoBA,EACpBvC,aAAcA,EACdM,kBAAmBA,EACnBhiD,MAAOwQ,EAAKxQ,MACZqkD,WAAY/gC,EAAM+gC,WAClBC,cArKkB,SAAA0E,GAAI,OACxBlZ,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhB8T,WAAY2E,GAFI,GADM,EAsKtBzE,aAAcA,GACd5C,eAAgBA,GAChBd,oBAAqBA,GAErB,gBAAC,MAAD,CAAiB6D,YAAY,cAC3B,gBAAC,MAAD,CACEuE,aAAc,gBAAGlzB,EAAH,EAAGA,UAAW4yB,EAAd,EAAcA,WAAd,OACZD,GAAU3yB,EAAW4yB,EADT,GAId,gBAAC,MAAD,CAAiBjE,YAAY,YAC3B,gBAAC,MAAD,CACErkC,UAAWH,EAAQslC,SACnB/+C,MAAO,CAAEksB,OAAQ,YAEjB,gBAAC,IAAD,CAAYtS,UAAWH,EAAQ0lC,eAA/B,gBAEGiB,EAAgBvuD,IACf,wBAAM+nB,UAAWH,EAAQ+lC,aAAzB,MACgBn2C,GAAc+2C,EAAgBvuD,IAD9C,YAMN,gBAAC,MAAD,CACEqiC,KAAMgoB,EAAa,IAAO,EAC1BsG,aAAc,gBAAGlzB,EAAH,EAAGA,UAAW4yB,EAAd,EAAcA,WAAd,OACZD,GAAU3yB,EAAW4yB,EADT,EAGdrlD,KAAK,YAEL,gBAAC,KAAD,CACE6c,WAAS,EACTwqB,UAAU,SACVtqB,UAAWH,EAAQ4lC,eAEnB,gBAAC,KAAD,CACExlC,MAAI,EACJD,UAAWH,EAAQya,KACnBxa,WAAS,EACTwqB,UAAU,UAEV,gBAAC,KAAD,CACErqB,MAAI,EACJD,UAAWH,EAAQ6lC,YACnB5lC,WAAS,EACTwqB,UAAU,cACVvqB,eAAe,aACfo8B,WAAW,SACX/1C,MAAO,CACL81C,SAAU,WAGZ,gBAAC4E,GAAD,CACE/wC,OAAQmW,EAASnW,OACjBgxC,oBAAqBA,EACrBC,YAAaA,EACbC,YAAaA,IAEf,gBAACzD,GAAD,CACE7vB,SAA4B,aAAlBzsB,aAAA,EAAAA,EAASlB,MACnBkkB,QAAS,WACP0/B,IACAM,IACD,IAEH,wBAAMlkC,UAAWH,EAAQya,OACzB,gBAAC,KAAD,CAAS9W,MAAM,gEACb,gBAACqlC,EAAA,GAAD,CACE/lB,cAAY,EACZgmB,eAAa,EACbC,aAAW,EACXC,eAAa,EACb75C,QAASuwC,IACPuJ,EAAAA,GAAAA,iBAAgBzC,aAAD,EAACA,EAAiBrhD,KAAM,CACrC+jD,SAAU,MACVC,YAAa,WAGjBC,QAAS,SAAAj6C,GAAO,OAAIA,EAAQuvB,KAAZ,EAChB2qB,cAAe,SAACl6C,EAAS8T,GAAV,OACb9T,EAAQlH,QAAO,SAAA7P,GACb,IAAQorB,EAAiBprB,EAAjBorB,MAAO68B,EAAUjoD,EAAVioD,MACPiJ,EAAermC,EAAfqmC,WACR,OACE9lC,EACGhV,cACA0nB,SAASozB,EAAW96C,gBACvB6xC,EACG7xC,cACA0nB,SAASozB,EAAW96C,cAE1B,GAZY,EAcfwR,UAAWH,EAAQijB,aACnBymB,eAAgB,SAAAC,GAAM,OAAIA,EAAOhmC,KAAX,EACtBimC,aAAc,SAAAD,GAAM,OAClB,gCACGA,EAAOhmC,MACR,wBAAMxD,UAAWH,EAAQumC,aACtBoD,EAAOnJ,OAJM,EAQpBnmB,SAAU,SAAC7hC,EAAGmxD,GACRA,IACa,UAAXnxD,EAAE2H,MAA+B,YAAX3H,EAAE2H,OAC1B0pD,UAAUC,UAAUC,UAAUJ,EAAO//C,OACrC7J,EACEmiD,GAAA,kBACayH,EAAO//C,MADpB,mBAEE,aAIT,EACDxR,GAAG,eACH4xD,cAAc,qCACdhqC,QAAS,CACPR,KAAMQ,EAAQiqC,OACdp4B,aAAc7R,EAAQqlC,iBAExBxlB,KAAK,QACLqqB,YAAa,SAAAxiD,GAAM,OACjB,gBAAC,IAAD,MACMA,EADN,CAEE4yB,OAAO,SACPxE,YAAY,qBACZxD,WAAU,IACRmtB,kBAAkB,GACf/3C,EAAO4qB,YAEZnS,UAAWH,EAAQglC,kBATJ,MAezB,gBAAC,KAAD,CAAM5kC,MAAI,EAACH,WAAS,EAACE,UAAWH,EAAQya,MACtC,gBAAC,MAAD,CACEyD,IAAKuoB,EACLrjD,KAAK,eACL8B,KAAK,OACLpF,MAAOwQ,EAAKxQ,MACZ8J,MAAOrE,KAAKC,WlEvxCD+Y,GkEyxCPooC,ElEzxCgB1lD,GkE0xChB+hD,EAAkB98B,MAChB,SAAA3tB,GAAC,OAAIA,EAAEH,MAAOsR,aAAT,EAASA,EAAQq7C,aAArB,IlE1xCpB,CACL10C,KAAMkO,GAAQjZ,MAAQ,KAetB6kD,cAAe,aAAF,OAAelpD,cAAf,EAAeA,GAAYuO,KAA3B,OkE6wCO,KACA,GAEFjJ,MAAO,CAAE2xB,QAAS,QAClBE,MAAM,OACN6L,OAAO,GACPmmB,iBAAiB,EACjBC,UAAQ,QAMlB,gBAAC,MAAD,CAAgBC,WAAW,EAAMnqC,UAAWH,EAAQslC,UAClD,gBAAC,IAAD,CAAYnlC,UAAWH,EAAQ0lC,eAA/B,aAEGh8C,EAAOuF,oBACN,wBAAMkR,UAAWH,EAAQ+lC,aAAzB,MACgBr8C,EAAOuF,mBADvB,OAMN,gBAAC,MAAD,CACE85C,aAAc,gBAAGlzB,EAAH,EAAGA,UAAW4yB,EAAd,EAAcA,WAAd,OACZD,GAAU3yB,EAAW4yB,EADT,EAGdhuB,KAAMgoB,EAAa,IAAO,EAC1Br/C,KAAK,aAEL,gBAAC,KAAD,CACE6c,WAAS,EACTwqB,UAAU,SACVtqB,UAAWH,EAAQ4lC,eAEnB,gBAAC,KAAD,CACExlC,MAAI,EACJD,UAAWH,EAAQya,KACnBxa,WAAS,EACTwqB,UAAU,UAEV,gBAAC,KAAD,CACErqB,MAAI,EACJD,UAAWH,EAAQ6lC,YACnB5lC,WAAS,EACTwqB,UAAU,cACVvqB,eAAe,aACfo8B,WAAW,UAEVmG,GACC,gBAACZ,GAAD,CACE1J,aAAcA,GACd2J,kBAAmBA,EACnBN,aAAcA,EACd1hD,MAAOwQ,EAAKxQ,MACZ2hD,eAAgBA,KAGpB,gBAACc,GAAD,CAAe75B,QAASA,IACxB,wBAAMvI,UAAWH,EAAQya,OACzB,wBAAMta,UAAWH,EAAQya,MAAzB,YACY/wB,EAAOsf,QADnB,IAEE,gBAAC,GAAD,CACE5lB,KAAK,iBACL6K,MAAM,UACNqB,QAAS40C,EAAex6C,EAAOsf,SAC/B8M,YAAY,SACZ31B,KAAK,SACLi/C,QAAM,EACNvpB,UAAW0pB,GACX9N,UAAQ,IAEV,gBAAC,KAAD,CAAS9tB,MAAM,6BACb,gBAACmO,EAAA,EAAD,CACE+N,KAAK,QACLxV,MAAM,UACNhG,QAAS,WACP6jC,IAAuB,EACxB,GAED,gBAACqC,GAAA,EAAD,CAAYh/B,SAAS,YAGxB67B,IACC,gBAAC,KAAD,CAASzjC,MAAO4jC,IACd,4BACE,gBAAC,GAAD,CAAcr6C,SAAU,KAAM2uC,WAAY,OAI/C4L,IACC,gBAAC,KAAD,CAAS9jC,MAAO4jC,IACd,4BACE,gBAAC,GAAD,CAAcr6C,SAAU,EAAGqe,SAAS,cAIzCq8B,IACC,gBAAC,KAAD,CAASjkC,MAAO4jC,IACd,4BACE,gBAAC,GAAD,CAAcr6C,SAAU,EAAGqe,SAAS,cAI1C,gBAACk1B,GAAD,CACE1D,UAAW35B,EAAM4jC,iBACjBtG,gBAAiBwH,GACjBz/C,KAAMA,EACNiB,OAAQA,EACRi3C,oBAAqBA,MAI3B,gBAAC,MAAD,CAAOv9C,KAAK,aAAa+c,UAAWH,EAAQya,OACzC,kBAAGtK,EAAH,EAAGA,MAAH,IAAUO,KAAQhtB,EAAlB,EAAkBA,MAAOktB,EAAzB,EAAyBA,YAAzB,OACC,gBAAC,KAAD,CAAMxQ,MAAI,EAACH,WAAS,EAACE,UAAWH,EAAQya,MACrC/2B,GACC,gBAACw2B,GAAA,EAAD,CAAOipB,UAAW,EAAGhjC,UAAWH,EAAQtc,OACtC,gBAAC,IAAD,CAAY0gB,QAAQ,SAClB,gBAAC,KAAD,CAAWmH,SAAS,YADtB,IACoC7nB,KAItCktB,IACCjoB,aAAA,EAAAA,EAAco+B,cACZl+B,IACH,gBAACqxB,GAAA,EAAD,CAAOipB,UAAW,EAAGhjC,UAAWH,EAAQtc,OACtC,gBAAC,IAAD,CAAY0gB,QAAQ,SAClB,gBAAC,KAAD,CAAWmH,SAAS,YAAa,KAChC,aAAG2F,OAAON,aAAV,EAAUA,EAAapmB,gBAAvB,eAAiCf,KAAK,QACrCd,aADD,EACCA,EAAco+B,cAItB,gBAAC,MAAD,CACE7I,IAAKsoB,EACLpjD,KAAK,oBACL8B,KAAK,aACLpF,MAAOwQ,EAAKxQ,MACZs4B,MAAM,OACN6L,OAAO,GACP19B,MAAO,CAAE2xB,QAAS,QAClBsyB,QAAS,EACTC,YAAa,CAAEC,gBAAiBC,KAChC/gD,MAAOumB,EAAMvmB,MACbywB,SAAUlK,EAAMkK,SAChBuwB,OAAQ,SAAAzhD,GACNivC,GAAYjvC,GAERuf,GACF+wB,GAAWtwC,EAAQuf,EAEtB,EACDmiC,WAAY,CACVC,2BAA2B,EAC3BC,0BAA0B,EAC1BC,gBAAgB,KA1CvB,SAqDb,gBAAC,MAAD,CACE7qC,UAAWH,EAAQylC,eACnBl/C,MAAO,CACLg4C,WAAY,UACZe,OAAQ,sBAGV,gBAAC,KAAD,CACEn/B,UAAWH,EAAQ6lC,YACnB5lC,WAAS,EACTC,eAAe,aACfo8B,WAAW,SACX/1C,MAAO,CACL81C,SAAU,WAGZ,wBACE91C,MAAO,CAAEwpB,WAAY,SAAUrE,YAAa,MAAOH,SAAU,KAD/D,YAKA,gBAAC,KAAD,CACE5H,MAAM,0DACNkS,UAAU,QAEV,gBAAC,KAAD,CACExL,MAAM,UACNwV,KAAK,QACL7f,QAAS,CAAE8N,SAAU9N,EAAQsmC,gBAC7Bx4B,SACEyR,GACCC,IAAoBh3B,GAAwBC,IAC7C7P,OAAOD,KAAKguD,GAAiBz2C,QAAU,GACvCg3C,KACCU,GAEHvjC,QAAS,YACgB,IAAnBs+B,EACFiE,KAEAn+C,EAAK85B,OAAO,cAAc,GAC1B9M,IAEH,EACDmsB,QAAS,gBAACqJ,GAAA,EAAD,OAnBX,eAwBF,wBAAM9qC,UAAWH,EAAQya,OACxBwsB,GACC,gBAAC,KAAD,CACEpnB,KAAK,QACLxV,MAAM,UACNyD,UAAWm5B,EACX5iC,QAAS5Z,GACPiU,GAAYqN,EAAiB,CAAE3zB,GAAI6uD,IACnCt8C,GAEFi3C,QAAS,gBAAC,GAAD,CAAc10C,SAAUA,MAEhC+5C,GAAS,OAtDhB,IA0DE,gBAAC,KAAD,CACEpnB,KAAK,QACLxV,MAAM,UACNhG,QAAS,WApfG,IAAM,IAC5BqiC,SAAA,UAAAA,EAAWryB,eAAX,mBAAoBlrB,cAApB,SAA4B+hD,SAAS,GAmflB,EACTtJ,QAAS,gBAACuJ,GAAA,EAAD,OAJX,gBAUJ,gBAAC,MAAD,CACEhrC,UAAU,cACVsa,KAAM,IACNsuB,aAAc,YAA+B,IAA5BlzB,EAA4B,EAA5BA,UAAW4yB,EAAiB,EAAjBA,WAC1BD,GAAU3yB,EAAW4yB,EACtB,GAED,gBAAC,KAAD,CAAMxoC,WAAS,EAACwqB,UAAU,SAAStqB,UAAWH,EAAQ4lC,eACpD,gBAAC,KAAD,CAAMxlC,MAAI,EAACH,WAAS,EAACE,UAAWH,EAAQya,MACtC,gBAAC,MAAD,CACEyD,IAAKwoB,EACL5mD,MAAOwQ,EAAKxQ,MACZoF,KAAK,OACLkzB,MAAM,OACN6L,OAAO,GACP19B,MAAO,CAAE2xB,QAAS,QAClBuyB,YAAa,CAAEC,gBAAiBC,KAChCP,iBAAiB,EACjBhnD,KAAK,SACLgoD,aAAW,EACXf,UAAQ,QAQvB,I,q2ECvhDD,SAvRA,YAAsC,IAAnBt+B,EAAmB,EAAnBA,gBACjB,MAAsD+E,EAAAA,EAAAA,UAAS,MAA/D,GAAOowB,EAAP,KAA4BmK,EAA5B,KACA,MAAoCv6B,EAAAA,EAAAA,WAAS,GAA7C,GAAOw6B,EAAP,KAAmBC,EAAnB,KACA,MAA0Bz6B,EAAAA,EAAAA,UAAS,MAAnC,GAAOptB,EAAP,KAAc8nD,EAAd,KAEM7gD,GAAUkY,EAAAA,EAAAA,MACV9iB,GAAWmjB,EAAAA,EAAAA,MACT9qB,GAAOkpC,EAAAA,EAAAA,MAAPlpC,GACF4sB,EAAY+G,EAAgB3zB,GAE5BkY,GAAO6S,EAAAA,EAAAA,IAAY+F,GAAD,KAClBuiC,GAAWtoC,EAAAA,EAAAA,IAAY8F,GAAD,KACtBP,GAAUvF,EAAAA,EAAAA,IAAY4F,GAAD,KACrB2iC,GAAiBvoC,EAAAA,EAAAA,IAAY0F,GAAD,KAC5BC,GAAcqf,EAAAA,EAAAA,UAClB,kBAAMvvC,OAAO8Q,OAAOgiD,EAApB,GACA,CAACA,IAEG5kC,GAAW3D,EAAAA,EAAAA,IAAYyF,GAAD,KACtBR,GAAWjF,EAAAA,EAAAA,IAAYgF,GAAD,KACtB9B,GAAWlD,EAAAA,EAAAA,IAAYiD,GAAD,KACtB1lB,GAAMyiB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAI4C,GAAU5C,EAAOhrB,EAArB,GAAN,KAEjBqoC,EAAgB//B,GAAO,CAC3BylB,WAAY,yBACZnB,UAAAA,GAGIu3B,GAAiBpU,EAAAA,EAAAA,UACrB,kBACEvvC,OAAO8Q,OAAOod,GACX7uB,KAAI,SAAA0zD,GAAC,MAAK,CAAEvzD,GAAIuzD,EAAEvzD,GAAIwR,MAAO+hD,EAAEvzD,GAAIoX,KAAMm8C,EAAEvoD,KAAtC,IACLoG,MAHL,GAIA,CAACsd,IAGH,MAA6CgK,EAAAA,EAAAA,UAASpwB,aAAD,EAACA,EAAKmmB,WAA3D,GAAO+kC,EAAP,KAA0BC,EAA1B,KAEMC,GAAkB3jB,EAAAA,EAAAA,UAAQ,WAC9B,OAAOrhB,EAAS8kC,EACjB,GAAE,CAACA,EAAmB9kC,IAEjB6/B,GAAkBxe,EAAAA,EAAAA,UACtB,kBAAM9hB,EAAS66B,IAAwB,CAAC,CAAxC,GACA,CAACA,EAAqB76B,IAGlB28B,GAAoB7a,EAAAA,EAAAA,UACxB,kBACErf,EACG7wB,KAAI,SAAAkyC,GACH,MAAO,CAAE/xC,GAAI+xC,EAAE/xC,GAAIwR,MAAOugC,EAAE/xC,GAAIoX,KAAM26B,EAAE/mC,KACzC,IACAoG,MALL,GAMA,CAACsf,IAGGm6B,GAAiB9a,EAAAA,EAAAA,UACrB,kBACE/f,EAASnwB,KAAI,SAAA6vB,GAAC,MAAK,CACjB1vB,GAAI0vB,EAAEhvB,OACN8Q,MAAOke,EAAEhvB,OACT0W,KAAMsY,EAAE1kB,KAHI,GADhB,GAMA,CAACglB,IAGG2jC,EAAiB,SAAAriD,GAAM,OAC3B0e,EACGhgB,QAAO,SAAA0f,GAAC,OAAIA,EAAEhvB,SAAW4Q,EAAOsf,OAAxB,IACR/wB,KAAI,SAAA6vB,GAAC,OAAIA,EAAEkkC,QAAN,IACLhT,OACAxvC,OACAyiD,SANwB,EAQvB/H,GAAiBgI,EAAAA,EAAAA,cACrB,SAAAljC,GACE,OAAOZ,EACJhgB,QAAO,SAAA0f,GAAC,OAAIA,EAAEhvB,SAAWkwB,CAAjB,IACR/wB,KAAI,SAAA6vB,GAAC,OAAIA,EAAEkkC,QAAN,IACLhT,OACA/gD,KAAI,SAAA8L,GAAC,MAAK,CAAE3L,GAAI2L,EAAG6F,MAAO7F,EAAGyL,KAAMzL,EAA9B,IACLyF,OACAyiD,SACJ,GACD,CAAC7jC,IAGGu4B,EAAsB,SAAC33B,EAASmT,EAAS1zB,GAAS,MAChD0+C,EAAU,UAAGjD,EAAel7B,GAAS,UAA3B,aAAG,EAA4Bpf,MACzCuiD,EAAyB,iBAAZhwB,EAA6BgrB,EAAahrB,EAE7D1zB,EAAK45B,OAAM,WACT55B,EAAK85B,OAAO,UAAWvZ,GACvBvgB,EAAK85B,OAAO,iBAAkB4pB,EAC/B,GACF,EAEKrK,EAAoB,SAAAhiD,GACxBC,EAAS+hB,GAAW,SAAKxR,GAAN,IAAYxQ,MAAAA,KAChC,EAEKuyC,EAAe,SAAA+Z,GAEnB,OADIX,GAAU1rD,EAASm9B,MACnBkvB,EAAWh0D,GACNqS,GAAOwT,GAAe8N,EAAiBrrB,GAAMiK,GAE/CF,GAAOuT,GAAgB+N,GAAkBphB,EACjD,EAEKw2C,EAAc,kBAAMkK,EAAuBnK,EAAsB,EAAnD,EAEdE,EAAc,kBAAMiK,EAAuBnK,EAAsB,EAAnD,EAEdyB,EAAiB,SAAAj5C,GAAM,OAC3BA,EAAOtG,OAASq9B,EAAcr9B,MAC9B8L,GAAaxF,EAAOuF,mBAAoBwxB,EAAcxxB,qBACtDC,GAAaxF,EAAO+sC,eAAgBhW,EAAcgW,iBAClD/sC,EAAOmd,YAAc4Z,EAAc5Z,WACnCnd,EAAOsf,UAAYyX,EAAczX,SACjCtf,EAAOyc,aAAesa,EAActa,YACpCzc,EAAOq7C,eAAiBtkB,EAAcskB,YAPX,EASvB6B,EAAe,6CAAG,WAAOyF,EAAY9tC,GAAnB,sGACDxe,EAASw0C,GAAU8X,EAAY9tC,IAD9B,OAChB+tC,EADgB,OAGtB3hD,EAAQM,KAAKkT,GAAyB4N,EAAiBsgC,EAAYC,IAH7C,2CAAH,wDAMfvI,GAAqBmI,EAAAA,EAAAA,cAAY,Wd/BlC,IAAoB/1B,EcgCnB21B,IAC2B,YAAzBA,EAAgB3rD,KAClBkrD,EAAuB,OAEvBtrD,GdpCmBo2B,EcqCN,CACTnR,UAAAA,EACA+uB,KAAM,EACNrB,QAAS,EACT7rB,UAAWilC,EAAgB1zD,IdxCrC,6CAAO,WAAM2H,GAAN,qGACLA,EAAS,CAAEI,KAAMzE,KADZ,kBAIoBgJ,G5DpGpB,gB4DoG2CyxB,GAJ3C,cAIGpzB,EAJH,OAKGskB,EALH,SAMEorB,GAAyB1vC,IAN3B,IAODgxC,KAAM,IAPL,SASwBhxC,EAASkB,OATjC,gBASKoiB,EATL,EASKA,SACFic,GAAWx8B,EAAAA,GAAAA,IACfugB,EAASpuB,KAAI,SAAAs0D,GAAC,OAAIlZ,GAAgBkZ,EAApB,IACd,IAAI/qD,GAAAA,GAAAA,MAAamB,KAGnB5C,EAAS,OACPI,KAAM5E,IACH+mC,GAFG,IAGNjb,WAAAA,KAGFtnB,GArHgBo0C,EAqHM9tB,EAASnW,OApH5BxJ,GAAA,gBACIytC,EADJ,4BACuC,IAAVA,EAAc,IAAM,GADjD,KAELA,EAAQ,EAAI,UAAY,aA6FnB,2EAuBIztC,GACL,iDACA,WAzBC,kCAhGT,IAAsBytC,CAgGb,wBAAP,OAAO,SAAP,UAAO,EAAP,4Bc2CMkX,EAAuB,IAG5B,GAAE,CAACtrD,EAAUilB,EAAW8mC,IAEnB9sB,EAAM,6CAAG,aAAkCv2B,GAAlC,qGAAS+jD,EAAT,EAASA,WAAe9iD,EAAxB,SACPsE,EAAS5V,EAAK4kC,GAAYG,GADnB,kBAIWnvB,EAAOtE,EAAPsE,CAAejO,GAJ1B,cAILqF,EAJK,OAKLqnD,EAASrnD,EAAQk9B,SAAS/c,KAAKngB,EAAQ88B,SAE1B,IAAfsqB,EACF5F,EAAgB6F,EAAQ9F,GAExBh8C,EAAQM,KAAKgT,GAAe8N,EAAiB0gC,IAVpC,mBAaJ,GAbI,uCAeP,gBAAejpD,IAfR,0CAgBF6G,GAAiB,KAAI5G,OAAQiG,IAhB3B,iEAqBQ,IAAf8iD,GAAqB/jD,EAAK85B,OAAO,cAAc,GArBxC,6EAAH,wDAuEZ,IAnBA9e,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,sBACjB5jB,EAASg4B,GAAa,QACvB,GAAE,CAACh4B,KAEJ0jB,EAAAA,EAAAA,YAAU,WACJrrB,GAAIqkC,GAAarkC,EAAbqkC,CAAiB18B,GAAU6G,OAAM,SAAAkC,GAAG,OAAI0iD,EAAS1iD,EAAb,GAC7C,GAAE,CAAC1Q,EAAI2H,KAER0jB,EAAAA,EAAAA,YAAU,WACR1jB,EAASm3B,GAAiB,CAAElS,UAAW+G,EAAgB3zB,MAEvD2H,EAASi1C,GAAcjpB,IAEvBhsB,EAASk8B,KACV,GAAE,CAAClQ,EAAiBhsB,KAErB0jB,EAAAA,EAAAA,YAAU,kBAAMsgC,GAAN,GAA4B,CAACA,IAEnCrgD,EAAO,MAAMA,EAEjB,OACE,gBAAC,MAAD,CACE2xB,SAAU2J,EACVrM,SAnDa,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAuBhB,OArBKiG,EAAOtG,OACVK,EAAOL,KACL,gFAECsG,EAAOmd,YACVpjB,EAAOojB,UAAY,sDAEhBnd,EAAOsf,UACVvlB,EAAOulB,QAAU,0DAECtf,EAAOuF,mBACvBvF,EAAOuF,mBAAmBM,QAAQ,MACjC,IACc,IACjB9L,EAAOwL,mBAAqB,0CAEzBvF,EAAOyc,aACV1iB,EAAO0iB,WACL,2DAGG1iB,CACR,EA2BGg9B,cAAeA,EACfjL,OAAQ,YAAkD,IAA/CC,EAA+C,EAA/CA,aAAc/rB,EAAiC,EAAjCA,OAAQjB,EAAyB,EAAzBA,KAAME,EAAmB,EAAnBA,aACrC,GAAIA,aAAwBlQ,MAAO,MAAMkQ,EACzC,OACE,gCACE,gBAAC,GAAD,CACEF,KAAMA,EACNk6C,eAAgBA,EAAej5C,GAC/B+rB,aAAcA,EACd1J,gBAAiBA,EACjBphB,QAASA,EACT2F,KAAMA,EACNlY,GAAIA,EACJqoC,cAAeA,EACfpa,SAAUA,EACV66B,oBAAqBA,EACrByF,gBAAiBA,EACjBvF,YAAaA,EACbD,YAAaA,EACb4C,mBAAoBA,EACpBr7B,QAASA,EACTo5B,kBAAmBA,EACnBzP,aAAcA,EACdmP,aAAc+J,EACdlqD,QAASyqD,EACTvP,eAAgBA,EAChByG,kBAAmBA,EACnBC,eAAgBA,EAChB2D,gBAAiB,kBAAMA,EAAgBlmD,EAAKimD,EAA3B,EACjBzC,eAAgBA,EAChBvD,oBAAqBA,IAEvB,gBAAC,MAAD,CAAUv9C,KAAK,cACZ,SAAAwG,GAAK,OAAIiiD,EAAgBjiD,EAApB,IAER,gBAAC,KAAD,CAAYo9B,MAAO,SAAAxuC,GAAC,OAAIiX,GAAajX,EAAGi9B,EAApB,IACpB,gBAAC,GAAD,CACEzqB,KAAMsgD,EACNphC,QAAS,kBAAMqhC,GAAc,EAApB,EACT7hD,OAAQA,EACRgf,QAASA,EACTN,SAAUA,EACV+tB,kBAAiB,kBAAa4V,EAAeriD,GAAQ,GAApC,OAIxB,GAGN,E,+nDClSD,IAsCMgjD,GAAAA,SAAAA,I,qdACW,SAAAl0D,GACb,MAA0B,EAAKszB,MAAvB6gC,EAAR,EAAQA,SAAUjsD,EAAlB,EAAkBA,IAClBlI,EAAEqS,kBACF8hD,EAASjsD,EAAItI,GAAIsI,EAAImlB,YACtB,I,qCAQD,WACE,MAAyCwJ,KAAKvD,MAAtCprB,EAAR,EAAQA,IAAKksD,EAAb,EAAaA,MAAO5sC,EAApB,EAAoBA,QAASqE,EAA7B,EAA6BA,QACrBpjB,EAAqCP,EAArCO,WAAYI,EAAyBX,EAAzBW,QAASwkB,EAAgBnlB,EAAhBmlB,YAEvBgnC,EACa,aAAjBxrD,EAAQlB,KAAsBgO,GAAY9M,EAAQiN,MAAQjN,EAAQ+B,KAE9D0pD,EAAcpsD,EAAIqsD,QACtB,gCAEE,gBAAC,KAAD,CAASppC,MAAM,qBACb,gBAACqpC,GAAA,EAAD,CAAY3iC,MAAM,WAAWkB,SAAS,cAI1C,GAGF,OACE,gBAAC,KAAD,CACEnzB,GAAE,WAAMw0D,GACRxpD,KAAM1C,EAAI0C,KACV+c,UAAY0F,EAA6B,GAAf7F,EAAQ+O,MAElC,gBAAC,KAAD,CACE/O,QAAS,CACPR,KAAMQ,EAAQitC,eACd9O,QAASn+B,EAAQktC,mBAEnBjpC,OACE+f,GAAOtjC,EAAIsoB,SACT,uBACEoX,IAAK4D,GAAOtjC,EAAIsoB,SAChBqX,IAAG,mBAAc3/B,EAAIsoB,SACrB7I,WAAWgO,EAAAA,EAAAA,GAAKnO,EAAQmtC,MAAOtnC,GAAe7F,EAAQme,OAGxD,gBAACja,GAAA,EAAD,KACE,gBAACkpC,GAAA,EAAD,CACEvtB,KAAK,UACLxV,MAAOxE,EAAc,UAAY,cAKzC7X,OACE,gBAAC,KAAD,CACE2V,MACEjjB,EAAImlB,YAAc,uBAAyB,uBAG7C,gBAACirB,GAAA,EAAD,CACEzmB,MAAM,UACNgQ,SAAUhL,KAAKg+B,aACfxmB,QAASnmC,EAAImlB,eAInBlC,MACE,gBAAC,IAAD,CAAYulB,QAAM,EAACyD,cAAY,GAC5BjsC,EAAI0C,KACJ0pD,GAGLv4B,UACE7zB,EAAI+1C,eAAJ,UACO/1C,EAAIsoB,QADX,YACsBtoB,EAAI+1C,gBAD1B,UAEO/1C,EAAIsoB,QAFX,aAKJ,gBAAC,KAAD,CAAa7I,UAAWH,EAAQstC,gBAC9B,gBAAC5/B,GAAA,EAAD,CAAM40B,OAAK,GACT,gBAACz0B,GAAA,EAAD,KACGxsB,EAAQlB,MACP,gBAAC4tB,GAAA,EAAD,KACE,wBAAM5N,UAAWH,EAAQutC,aACtB/P,GAAan8C,EAAQlB,MAAM+rB,OAIlC,gBAAC8B,GAAA,EAAD,CACEw/B,uBAAwB,CAAEtkB,QAAQ,GAClC9d,QAASyhC,KAGb,gBAACh/B,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,CACE5C,QAASnqB,EAAW7I,GAAK6I,EAAWmC,KAAO,eAG/C,gBAACyqB,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACE,gBAAC0/B,GAAA,EAAD,OAEF,gBAACz/B,GAAA,EAAD,CACE5C,QACE1qB,EAAIuO,mBAAqBvO,EAAIuO,mBAAqB,SAIxD,gBAAC4e,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACE,gBAAC2/B,GAAA,EAAD,OAEF,gBAAC1/B,GAAA,EAAD,CACE5C,QAAO,kBAAanf,GAAavL,EAAIitD,YACrCj7B,UAAS,kBAAazmB,GAAavL,EAAIuM,kBAK/C,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQ7U,GAAG,OAAOisB,QAASA,GAA3B,SAMP,M,kFAtIGqoC,CAAgBjsC,EAAAA,WA6ItB,UAAe+J,EAAAA,GAAAA,IAnLA,SAAA1qB,GAAK,YAAK,CACvBivB,KAAM,CACJ/D,gBAAiBlrB,EAAM4qB,QAAQ8e,KAAK,MAEtC7lB,MAAO,CACLK,aAAc,GACduH,SAAU,IAEZkhB,IAAK,CACHzoB,aAAc,IAEhBmpC,KAAM,CACJS,cAAe,MACfjmB,UAAW,GACX5O,SAAU,IAEZoF,KAAG,GACD/1B,OAAQ,QADP,cAEO,gBAFP,KAGD,iBAAkB,gBAHjB,GAKH6b,OAAQ,CACN4pC,eAAgB,WAElBN,YAAa,CACXhiC,SAAU,IAEZ+hC,eAAgB,CACdh1B,YAAa,GAEf20B,eAAgB,CACdjH,SAAU,UAEZkH,kBAAmB,CACjBlH,SAAU,UAlCM,GAmLpB,CAAkC0G,I,ipDCtFlC,SA1GA,YAAuC,IlEiHL9rD,EkEjHdmrB,EAAmB,EAAnBA,gBAClB,MAAsC+E,EAAAA,EAAAA,WAAS,GAA/C,GAAOg9B,EAAP,KAAoBC,EAApB,KAEA,MAA4Bj9B,EAAAA,EAAAA,UAAS,IAArC,GAAO1oB,EAAP,KAAe8iC,EAAf,KAEMnrC,GAAWmjB,EAAAA,EAAAA,MAEXvY,GAAUkY,EAAAA,EAAAA,MAEVmC,EAAY+G,EAAgB3zB,GAE5B41D,GAAW7qC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmC,KAAKT,KAAf,IAE5BmpC,EAAgB,IAAOD,GAAU5lD,QAAO,SAAAy0C,GAAC,OAAIA,EAAE/f,QAAN,IAEzCoxB,GAAe/qC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0D,SAAShC,KAAnB,IAEhCqpC,GAAkBhrC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0F,YAAYhE,KAAtB,IAEnCS,EAAO,IACX,IAAOyoC,GACP,CAAC,cAAe,SAAAnR,GAAC,OAAIA,EAAEz5C,KAAKuL,aAAX,GACjB,CAAC,SAEAvG,QAAO,SAAAy0C,GAAC,OAAIA,EAAE73B,YAAcA,CAApB,IACR/sB,KAAI,SAAA4kD,GAAC,gBAIDA,GAJC,IAKJx7C,QAAS6sD,EAAarR,EAAEh2B,YAAc,CAAC,EACvC5lB,WAAYktD,EAAgBtR,EAAEkI,eAAiB,CAAC,GAN5C,IASFqJ,EAAe7oC,EAAKnd,QAAO,SAAAy0C,GAAC,OAAIA,EAAE/f,WAAagxB,CAAnB,IAE1B3mC,GAAchE,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmC,IAAV,IAA/B4B,UAEFknC,EAAiBhmD,GAAY0lD,GAI7BV,EAAe,SAACz/C,EAAOymB,GAAR,OAAoBt0B,EAASk9B,GAAUrvB,EAAOymB,GAA9C,EAEfkc,EAAe,SAAA7vC,GAAG,OAAIX,E9C2QvB,SAAmBW,GACxB,oDAAO,WAAMX,GAAN,gGACC2F,GAAIpF,GAAeI,EAAItI,KADxB,OAEL2H,GAIsB6N,EAJHlN,EAAItI,GAKlB,CACL+H,KAAMlG,GACN2T,MAAAA,KATK,iCAMF,IAAmBA,CANjB,UAAP,OAAO,SAAP,UAAO,EAAP,yBAID,C8ChRsC0gD,CAAU5tD,GAAvB,EAIlB6tD,GAAUrC,EAAAA,EAAAA,cACd,SAAAxrD,GAAG,OAAI+J,GAAOwT,GAAe8N,EAAiBrrB,GAAMiK,EAAjD,GACH,CAACohB,EAAiBphB,IAgBpB,OAbA8Y,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,gBACjB5jB,EAASg4B,GAAa,QACvB,GAAE,CAACh4B,KAEJ0jB,EAAAA,EAAAA,YAAU,WACJsI,IACFhsB,EAASy8B,GAAUzQ,IACnBhsB,EAASm3B,GAAiB,CAAElS,UAAW+G,EAAgB3zB,MACvD2H,EAASi1C,GAAcjpB,IAE1B,GAAE,CAACA,EAAiBhsB,IAGnB,uBAAK3H,GAAG,uBACN,gBAAC,GAAD,CACEuhC,QAAQ,MACR5W,OA9BqB,SAAAvqB,GAAC,OAAI0yC,EAAU1yC,EAAE+rB,OAAO3a,MAAM+E,cAA7B,EA+BtB+qB,WAAYtxB,EACZqxB,OAAO,uBACP9J,OAAQllB,IlEwCkB7J,EkExCOmrB,ElEyChC,GAAP,OAAU/N,GAAgBpd,GAA1B,SkEzCyD+J,GACnD0uB,QACE,gBAAC,KAAD,CACEjhC,GAAG,qBACHisB,QAAS,kBAAMgqC,EAAeP,EAArB,EACThgC,SAAmC,IAAzBmgC,EAAc/9C,QAH1B,eAKW49C,EAAc,UAAY,WALrC,YASH3mC,GAA6B,IAAhB5B,EAAKrV,QAAgB,gBAAC,GAAD,CAAQkQ,KAAK,SAChD,gBAAC,GAAD,KACGguC,EAAahmD,QAxCC,SAAA1H,GAAG,OAAIA,EAAI0C,KAAKuL,cAAc0nB,SAASjuB,EAApC,IAwCiBnQ,KAAI,SAACyI,EAAKktB,GAAN,OACrC,gBAAC,GAAD,CACEltB,IAAKA,EACL+tC,SAAU8B,EACVoc,SAAUU,EACVhpC,QAASkqC,EAAQ7tD,GACjBiK,QAASA,EACTgF,IAAKjP,EAAItI,GACTw0D,MAAOh/B,GAR4B,KAc9C,E,6gBCtGD,SAAS4gC,KACP,OAAO9nD,GACL,yFACA,SAEH,CAED,SAAS+nD,KACP,OAAO/nD,GAAkB,kCAAmC,UAC7D,CAUM,SAASgoD,GAA2B9tD,GACzC,oDAAO,WAAMb,GAAN,iGACLA,EAAS,CAAEI,K/EuGb,kC+EvGoD6kB,UAAWpkB,EAAQxI,KADhE,kBAIoBsM,GAAI/D,GAA+BC,IAJvD,cAIGmC,EAJH,gBAKgBA,EAASkB,OALzB,cAKGoM,EALH,OAMGiyB,GAAWx8B,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAOzO,IAE/C7B,EAAS,CACPI,KAAMhC,GACNiH,QAASk9B,IAVR,kBAaIA,GAbJ,uCAeC,gBAAiBj/B,IAflB,0CAgBMtD,EApBN,CAAEI,KAAM/B,GAAiCgH,QAqBX,CAC3Bk9B,SAAU,CAAEqsB,uBAAwB,UAlBvC,6EAAP,OAAO,SAAP,UAAO,EAAP,yBA0BD,CAEM,SAASC,GACdhuD,EADK,GAUL,IAPEqiB,EAOF,EAPEA,OACAnU,EAMF,EANEA,gBACAC,EAKF,EALEA,eACAC,EAIF,EAJEA,iBACAgW,EAGF,EAHEA,UACA6pC,EAEF,EAFEA,kBAGF,oDAAO,WAAM9uD,GAAN,mGACCqF,EAAU,CACd0pD,wBAAyB,CACvBh4B,WAAY9R,EACZpB,QAASX,EACT8rC,iBAAkBjgD,EAClBkgD,gBAAiBjgD,EACjBkgD,kBAAmBjgD,EACnBkgD,mBAAoBL,IARnB,kBAaoBppD,GACrB9E,GAA+BC,GAC/BwE,GAfC,cAaGrC,EAbH,gBAiBgBA,EAASkB,OAjBzB,cAiBGoM,EAjBH,OAkBGiyB,GAAWx8B,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAOzO,IAC/C7B,EAAS,CACPI,KAAMjC,GACNkH,QAASk9B,IAEXviC,EAAS0uD,MAvBN,kBAwBI1rD,GAxBJ,wCA0BC,gBAAiBS,IACnBzD,EAASyuD,MA3BR,+DAAP,OAAO,SAAP,UAAO,EAAP,yBA+BD,CAEM,SAASW,GACdvuD,EADK,GAWL,IARExI,EAQF,EAREA,GACA6qB,EAOF,EAPEA,OACAnU,EAMF,EANEA,gBACAC,EAKF,EALEA,eACAC,EAIF,EAJEA,iBACAgW,EAGF,EAHEA,UACA6pC,EAEF,EAFEA,kBAGF,oDAAO,WAAM9uD,GAAN,mGACCqF,EAAU,CACd0pD,wBAAyB,CACvB12D,GAAAA,EACAwrB,QAASX,EACT6T,WAAY9R,EACZ+pC,iBAAkBjgD,EAClBkgD,gBAAiBjgD,EACjBkgD,kBAAmBjgD,EACnBkgD,mBAAoBL,IATnB,kBAcoB1pD,GACrBxE,GAA+BC,GAC/BwE,GAhBC,cAcGrC,EAdH,gBAkBgBA,EAASkB,OAlBzB,cAkBGoM,EAlBH,OAmBGiyB,GAAWx8B,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAOzO,IAC/C7B,EAAS,CACPI,KAAM/B,GACNgH,QAASk9B,IAEXviC,EAAS0uD,MAxBN,kBAyBI1rD,GAzBJ,wCA2BC,gBAAiBS,IACnBzD,EAASyuD,MA5BR,+DAAP,OAAO,SAAP,UAAO,EAAP,yBAgCD,C,+hCChID,IAAMlvC,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCsvD,eAAgB,CACdrrC,UAAWjkB,EAAM4f,QAAQ,GACzBgc,QAAS57B,EAAM4f,QAAQ,IAEzB6xB,YAAa,CACX/B,aAAc1vC,EAAM4f,QAAQ,GAC5B0Y,MAAO,KAETi3B,SAAU,CACR7f,aAAc1vC,EAAM4f,QAAQ,GAC5B0Y,MAAO,KAXuB,IAelC,SAASk3B,GAAT,GAOG,IANDC,EAMC,EANDA,YACAC,EAKC,EALDA,cACA5c,EAIC,EAJDA,WACA7c,EAGC,EAHDA,QACA5D,EAEC,EAFDA,OACAkI,EACC,EADDA,SAEA,MAAoCvJ,EAAAA,EAAAA,UAAS,IAA7C,GAAO2+B,EAAP,KAAmBC,EAAnB,KAEM1vC,EAAUV,KAEV+R,EACJo+B,EAAa7c,MAAiB6c,GAAcA,GAAc,GAEtD5hD,EAAe,iBAAH,OAAoB+kC,GAChC+c,EAAoB/c,EvEgErB,SAA0BhpC,GAC/B,IAAIgmD,EAAWhmD,EACf,GAAIA,GAAS,IAAM,CAIjB,IAHA,IAEIimD,EADEC,EAAYhuB,KAAKiuB,MAAM,UAAGnmD,GAAQsG,OAAS,GAExC8/C,EAAY,EAAGA,GAAa,IACnCH,EAAazP,YACI,IAAd0P,EAAkBlmD,EAAQ,KAAH,IAAG,IAAQkmD,GAAYlmD,GAAOqmD,YACpDD,MAGsB,UAAGH,GAAa7/C,QAAQ,kBAAmB,IAC/CE,QAAU,IAPM8/C,GAAa,GAWjDH,EAAa,GAAM,IAAGA,EAAaA,EAAWK,QAAQ,IAC1DN,EAAWC,EAfM,CAAC,GAAI,IAAK,IAAK,IAAK,KAeJC,EAClC,CACD,OAAOF,CACR,CuErFwCO,CAAiBvd,GAAc,IAChEwd,GAAqBX,GAAcp+B,EAEnCg/B,EAAkB,WAClBZ,GAAYC,EAAc,GAC/B,EAED,OACE,gCACE,gBAAC,KAAD,CACEzvC,WAAS,EACTP,QAAS,EACTQ,eAAe,WACfC,UAAWH,EAAQovC,gBAEnB,gBAAC,KAAD,CAAMhvC,MAAI,GACR,gBAAC,KAAD,CAAWpW,KAAG,GACZ,gBAACynB,GAAA,EAAD,CAAatR,UAAWH,EAAQuxB,aAC9B,gBAAC7f,GAAA,EAAD,CAAYC,QAAQ,iBAApB,YACA,gBAACmgB,GAAA,EAAD,CACEzX,SAAU,SAAA7hC,GACR6hC,EAAS,CAAEqY,QAASl6C,EAAE+rB,OAAO3a,MAAOmqC,KAAM,GAC3C,EACDnqC,MAAO4lD,EACPv9B,WAAY,CACV7uB,KAAM,gBACNhL,GAAI,kBAGN,gBAAC64C,GAAA,EAAD,CAAUrnC,MAAO,GAAjB,KACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,IAAjB,MACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,IAAjB,MACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,IAAjB,MACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,KAAjB,SAGJ,gBAAC,IAAD,CACEqE,MAAK,eAAUshD,EAAV,eAA4BI,GACjC75B,YAAW,UAAKy5B,GAChB3lD,MAAO6lD,EACPp1B,SAAU,SAAA7hC,GAAC,OAAIk3D,EAAcl3D,EAAE+rB,OAAO3a,MAA3B,EACX4wB,UAAW,SAAAhiC,GACK,UAAVA,EAAEmX,MACA8/C,IAAeW,GACjB/1B,EAAS,CAAE0Z,KAAM0b,IAEnBY,IAEH,EACD3sD,MAAO2tB,EACPvB,WAAYuB,EAAYxjB,OAAewkB,EACvClS,UAAWH,EAAQqvC,SACnBlvD,KAAK,SACLy/C,gBAAiB,CACf/N,QAAQ,GAEVvf,WAAY,CACVL,WAAY,CACVq+B,IAAK,EACLC,IAAK3d,GAEP7c,QAAAA,EACA5D,OAAAA,KAGJ,gBAAC,KAAD,CAASxO,MAAK,qBAAgB8rC,GAAc55B,UAAU,QACpD,gBAAC/D,EAAA,EAAD,CACEzN,QAAS,WACPgW,EAAS,CAAE0Z,KAAM0b,IACjBY,GACD,EACDviC,SAAUsiC,EACV,aAAW,aAEX,gBAACI,GAAA,EAAD,QAGJ,gBAAC1+B,EAAA,EAAD,CACEzN,QAAS,WACPgW,EAAS,CAAE0Z,KAAM,IACjBsc,GACD,EACDviC,SAA0B,IAAhByhC,EACV,aAAW,cAEX,gBAACkB,GAAA,EAAD,OAEF,gBAAC3+B,EAAA,EAAD,CACEzN,QAAS,WACPgW,EAAS,CAAE0Z,KAAMwb,EAAc,IAC/Bc,GACD,EACDviC,SAA0B,IAAhByhC,EACV,aAAW,iBAEX,gBAACmB,GAAA,EAAD,OAEF,gBAAC5+B,EAAA,EAAD,CACEzN,QAAS,WACPgW,EAAS,CAAE0Z,KAAMwb,EAAc,IAC/Bc,GACD,EACDviC,SAAUyhC,IAAgB3c,EAC1B,aAAW,aAEX,gBAAC+d,GAAA,EAAD,OAEF,gBAAC7+B,EAAA,EAAD,CACEzN,QAAS,WACPgW,EAAS,CAAE0Z,KAAMnB,IACjByd,GACD,EACDviC,SAAUyhC,IAAgB3c,EAC1B,aAAW,aAEX,gBAACge,GAAA,EAAD,UAOb,CAQDtB,GAAmB7zB,aAAe,CAChCmX,WAAY,GAGd,Y,++BCpLA,IAAMtzB,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJgwB,aAAc,EACdlX,YAAa,EACbxN,WAAY,EACZrL,cAAe,EACfuL,gBAAiBlrB,EAAM4qB,QAAQw7B,UAEjC2K,SAAU,CACRvR,OAAQ,GAEVwR,IAAK,CACH/sC,UAAW,GAZmB,IAgBlC,SAASgtC,GAAK5c,GACZ,OAAOA,EAAQ,EAAI,MAAQ,IAC5B,CAED,SAAS6c,GAAO7c,GACd,OAAc,IAAVA,EACK,GAEFA,EAAQ,EAAI,IAAM,EAC1B,CA4ED,SA1EoB,SAAAroB,GAClB,IAAQlrB,EAAqCkrB,EAArClrB,QAASqwD,EAA4BnlC,EAA5BmlC,YAAaC,EAAeplC,EAAfolC,WACxBlxC,EAAUV,KAChB,MAAkCwR,EAAAA,EAAAA,UAAS,CACzC6hB,MAAO,EACPpsB,KAAM,EACNF,SAAU,IAHZ,GAAO8qC,EAAP,KAAkBC,EAAlB,KAMA,MAAgCtgC,EAAAA,EAAAA,WAAS,GAAzC,GAAOugC,EAAP,KAAiBC,EAAjB,KAEMC,GAAYlwB,EAAAA,EAAAA,QAChB,MACE,kB1E2BC,SAAoBzgC,GACzB,OAAO8D,GL0BF,SAA+B9D,GACpC,MAAO,iBAAP,OAAwBA,EAAQJ,KAAhC,SACD,CK5BYgxD,CAAsB5wD,IAAU6F,KAApC,6CAAyC,WAAM1D,GAAN,sGAC3BA,EAASkB,OADkB,cACxCoM,EADwC,yBAEvCA,GAFuC,2CAAzC,sDAIR,C0E/BOohD,CAAW7wD,GACR6F,KAAK2qD,GACL3qD,MAAK,WACJ6qD,GAAY,EACb,GALL,GAMA,IACA,CACEI,UAAU,KAIR/e,EAA0Bwe,EAA1Bxe,MAAOpsB,EAAmB4qC,EAAnB5qC,KAAMF,EAAa8qC,EAAb9qC,UAErB5C,EAAAA,EAAAA,YAAU,WACJ7iB,EAAQxI,KAAOi5D,IACjBC,GAAY,GACZC,EAAUl9B,UAEb,GAAE,CAACzzB,EAAQxI,GAAI64D,IAEhB,IAOgBU,EAAOC,EAPjBC,EAAU,GAAH,OAAMtrC,EAAN,eAAiByqC,GAAOzqC,IAC/BurC,EAAc,GAAH,OAAMzrC,EAAN,mBAAyB2qC,GAAO3qC,IAEjD,IAAK8qC,GAAuB,IAAVxe,EAChB,OAAO,KAgBT,OACE,gBAAChe,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CACEsc,MAAM,SACN6gB,QAAS,EACT5xC,WAAWgO,EAAAA,EAAAA,GAAKnO,EAAQR,KAAM0xC,GAAclxC,EAAQ6wC,WAEpD,gBAAC,IAAD,CAAYzsC,QAAQ,YApBVutC,EAqBAprC,GArBOqrC,EAqBDvrC,GApBJ,GAAKsrC,EAAQ,EACpB,SAAP,OAAgBZ,GACdY,GADF,aAEME,EAFN,iBAEsBC,EAFtB,gCAIgB,IAAdF,EACK,SAAP,OAAgBb,GAAKY,GAArB,aAAgCE,EAAhC,gCAEK,SAAP,OAAgBd,GACda,GADF,aAEME,EAFN,iCAayB,GAAlBlxD,EAAQgkB,QACP,gBAAC,KAAD,CAASjB,MAAM,yFACb,gBAAC,KAAD,CAAU4H,SAAS,eAOhC,E,ipDCJD,IAAMjM,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCkyD,WAAY,CACVC,MAAO,SAETC,SAAU,CACRlnC,gBAAiBlrB,EAAM4qB,QAAQw7B,SAC/Bn2B,WAAYjwB,EAAMkwB,WAAWD,YAE/BoiC,QAAS,CACP5mC,SAAUzrB,EAAMkwB,WAAWoiC,QAAQ,KAErCC,iBAAkB,CAChB9mC,SAAUzrB,EAAMkwB,WAAWoiC,QAAQ,IACnC/nC,MAAOvqB,EAAM4qB,QAAQlb,KAAKkjB,WAE5BsL,GAAI,CACFhT,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3ClhB,OAAQ,CACNmoD,UAAW,UAnBmB,IAwvBlC,SAjuBA,YAAsC,IAAnBvmC,EAAmB,EAAnBA,gBACXy6B,GAAanlB,EAAAA,EAAAA,UACbthC,GAAWmjB,EAAAA,EAAAA,MACXxb,GAAS45B,EAAAA,EAAAA,MACT32B,GAAUkY,EAAAA,EAAAA,MACV7C,EAAUV,KACVxf,GAAQyyD,EAAAA,EAAAA,KAEd,MAA0BzhC,EAAAA,EAAAA,UAAS,CACjCsW,WAAW,EACXorB,qBAAqB,EACrBC,iBAAiB,EACjBC,YAAa,CAAC,EACdnD,YAAa,EACbC,cAAe,EACf5c,WAAY,IAPd,GAAOxvB,EAAP,KAAcwsB,EAAd,KAUA,MAAkC9e,EAAAA,EAAAA,UAAS7wB,KAAKC,OAAhD,GAAO+wD,EAAP,KAAoB0B,EAApB,KAEQv6D,EAAOsP,EAAPtP,GAEFsI,GAAMyiB,EAAAA,EAAAA,KAAY,SAAAC,GACtB,IAAMhD,EAAO4F,GAAU5C,EAAOhrB,IAAO,CAAC,EAUtC,OARIgoB,EAAKwyC,SACPxyC,EAAKwyC,OAAS,IACZxyC,EAAKwyC,OACL,CAAC,SAAAC,GAAE,OAAI,IAAI5yD,KAAK4yD,EAAGC,UAAhB,GACH,CAAC,UAIE1yC,CACR,GAZsB,KAcjB2yC,GAAU5vC,EAAAA,EAAAA,KACd,SAAAC,GAAK,OACHxqB,OAAO8Q,OAAO0Z,EAAM4qB,aAAalpB,OAAOyhB,QACtC,SAACC,EAAKyJ,GAAN,UAAC,MAAkBzJ,GAAnB,SAAyByJ,EAAG3/B,KAAKlY,GAAK63C,EAAG3/B,KAAKG,OAA9C,GACA,CAAC,EAHA,GADoB,KASrBuiD,GAAa7qB,EAAAA,EAAAA,UAAQ,WACzB,SAAUznC,EAAIuyD,QAAU,IAAI/sC,MAAK,mBAA6B,IAA7B,EAAGgtC,OAAH,GAClC,GAAE,CAACxyD,IAEEmO,GAAwBsU,EAAAA,EAAAA,KAC5B,SAAAC,GAAK,OAAIA,EAAMurC,uBAAuB7pC,MAAMiH,EAAgBq3B,wBAAvD,GADkC,KAKnC/kB,EAAc,QAAH,OAAWtS,EAAgB3zB,IAEtCiJ,GAAU8hB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0D,SAAShC,MAAMpkB,EAAImmB,UAA7B,IAC3BssC,GAAahwC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmC,KAAKT,MAAMzjB,aAAjB,EAAiBA,EAASuM,MAA9B,IAC9BwlD,EAAiBD,EAAaA,EAAW/vD,KAAO,GAEhDslB,GAAUvF,EAAAA,EAAAA,IAAY4F,IAEtB9nB,GAAakiB,EAAAA,EAAAA,KACjB,SAAAC,GAAK,OAAIA,EAAM0F,YAAYhE,MAAMpkB,EAAIqkD,aAAhC,GADuB,KAIxB9hC,GAASE,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgG,KAAKC,aAAf,IAC1BgqC,GAAYlwC,EAAAA,EAAAA,KAChB,SAAAC,GAAK,OAAK8F,GAAkB9F,IAAU,CAAEtjB,MAAO,mBAAoBA,KAA9D,GADsB,KAKvB4D,GAAQyf,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmC,KAAK7hB,KAAf,GAAN,KAEnB4vD,EACJ5yD,EAAI6yD,sBACJvnD,EAAAA,GAAAA,GAAO,IAAI/L,KAAKS,EAAI6yD,qBAAsB,SAwBtCjjB,EAAY,WAChBV,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhBjJ,WAAW,GAFK,GAInB,EAEKosB,EAAsB,WAC1B5jB,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhBmiB,qBAAqB,GAFL,GAInB,EAEKiB,EAAkB,WACtB7jB,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhBoiB,iBAAiB,GAFD,GAInB,EAsBD,SAAStK,EAAiB/iD,GACxB,IAAMwI,EAAQxI,EAAQmhB,KAAK,GAAGmtC,OAC9B3zD,EAAS08B,GAAa7uB,IACtB+kD,EAAW1yD,KAAKC,MACjB,CAED,IAeMyzD,EAAkB,SAAAC,GAGtB7zD,ElD3BG,SAAmBW,EAAKkzD,GAC7B,oDAAO,WAAM7zD,GAAN,mGACLA,EAAS,CACPI,KAAM,gBACNyN,MAAOlN,EAAItI,GACXw7D,cAAAA,IAEF7zD,EAxBK2G,GACL,0CACA,YAwBMtB,EAAU,CAAEhN,GAAIsI,EAAItI,GAAIy7D,gBAAiBD,GAR1C,kBAWoBnuD,G9BjKpB,GAAP,OA9GO,YA8GP,W8BiKyDL,GAXlD,cAWGrC,EAXH,gBAYgBA,EAASkB,OAZzB,cAYGoM,EAZH,OAaGyjD,GAAahuD,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAO1O,IAEjD5B,EAAS,CAAEI,KAAM,cAAe2zD,WAAAA,IAChC/zD,EA3BG2G,GAAkB,gCAAiC,YAWnD,kBAkBIotD,GAlBJ,kCAoBH/zD,EA3BG2G,GACL,+DACA,WAKK,0DAAP,OAAO,SAAP,UAAO,EAAP,yBAuBD,CkDGYqtD,CAAUrzD,EAAKkzD,IACxBjpD,EAAQM,KAAK+S,GAAgB+N,GAC9B,EAsDD,IApDAtI,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,yBACjB5jB,EAASg4B,GAAa,QACvB,GAAE,CAACh4B,KAEJ0jB,EAAAA,EAAAA,YAAU,WAER,OADAkvC,EAAW1yD,KAAKC,OACTH,EACL0+B,GAAYJ,EAAa,CACvBuqB,IAAKT,EACL/lB,QAAS+lB,IAGd,GAAE,CAAC9pB,EAAat+B,KAEjB0jB,EAAAA,EAAAA,YAAU,WACR1jB,EAASi1C,GAAcjpB,IACvBhsB,EAASm3B,GAAiB,CAAElS,UAAW+G,EAAgB3zB,MACvD2H,EAASguC,GAAkBhiB,GAC5B,GAAE,CAACA,EAAiBhsB,KAErB0jB,EAAAA,EAAAA,YAAU,WACJrrB,GAAI2H,EAAS08B,GAAarkC,GAC/B,GAAE,CAACA,EAAI2H,KAER0jB,EAAAA,EAAAA,YAAU,WACR1jB,EAAS2uD,GAA2B3iC,GACrC,GAAE,CAACA,EAAiBhsB,KAErB0jB,EAAAA,EAAAA,YAAU,WACJ/iB,EAAIsoB,SACNjpB,EACEm8B,GAAW,CAAElT,QAAStoB,EAAIsoB,QAASmT,QAASz7B,EAAI+1C,gBAAkB,KAEvE,GAAE,CAAC/1C,EAAIsoB,QAAStoB,EAAI+1C,eAAgB12C,KAErC0jB,EAAAA,EAAAA,YAAU,WAAM,MACRta,EAASq9C,SAAH,UAAGA,EAAYnyB,eAAf,aAAG,EAAqBlrB,OAEhCA,GACFswC,GAAWtwC,EAAQuf,EAEtB,GAAE,CAACA,KAEJjF,EAAAA,EAAAA,YAAU,WACJ/iB,EAAIkyD,QACNhjB,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhBuC,WAAY9Q,KAAKkyB,KAAKtzD,EAAIkyD,OAAO1iD,OAASkT,EAAMosC,gBAFhC,GAIrB,GAAE,CAACjqD,KAAKC,UAAU9E,EAAIkyD,UAEnBlvD,EAAO,MAAMA,EAEjB,IAAM21C,EAAU,CACd2C,SAAU7tC,GAAY9M,aAAD,EAACA,EAASiN,MAC/B9D,QAASjF,KAAKC,UAAUnE,aAAf,EAAeA,EAASyxC,UACjCpyC,IAAK,QAAF,OAAU0yD,EAAV,aACHjX,KAAM,QAAF,OAAUiX,EAAV,UACJpZ,QAAS,uBAAF,OAAyBt5C,EAAIuzD,UAAY,WAAa,WAC7DlH,QAAS,0BAAF,OAA4BrsD,EAAIqsD,QAAU,IAAM,OAAhD,YAMHmH,EACJ,gBAAC,KAAD,CAAQlpD,KAAMoY,EAAMovC,oBAAqBtoC,QAASspC,GAChD,gBAAC,KAAD,iDAC2C,yBAAI9yD,EAAI0C,MADnD,KAGA,gBAAC,KAAD,KACE,gBAAC,IAAD,kQAOF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQihB,QAASmvC,GAAjB,qBACA,gBAAC,KAAD,CAAQp7D,GAAG,qBAAqBisB,QAvGb,WACvBtkB,ElDnFG,SAAuBW,GAC5B,oDAAO,WAAMX,GAAN,6FACLA,EAAS,CAAEI,KAAM,uBADZ,kBAGoBuF,GAAIjF,GAAkBC,IAH1C,OAGGqC,EAHH,OAIHhD,EAAS,CACPI,KAAM,oBACNiF,QAASrC,EAASE,aAEpBlD,EAhCG2G,GAAkB,kCAAmC,YAiCxD3G,EAAS08B,GAAa/7B,EAAItI,KATvB,kDAWH2H,EAAS,CAAEI,KAAM,oBAAqBiF,QAAS,EAAF,KAC7CrF,EAhCG2G,GACL,oDACA,WAkBK,0DAAP,OAAO,SAAP,UAAO,EAAP,yBAeD,CkDmEYytD,CAAczzD,IACvBkvC,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBmiB,qBAAqB,GAA1C,GACnB,GAoGK,oCAOA4B,EACJ,gBAAC,KAAD,CAAQppD,KAAMoY,EAAMqvC,gBAAiBvoC,QAASupC,GAC5C,gBAAC,KAAD,qCACA,gBAAC,KAAD,KACE,gBAAC,IAAD,kEAGA,gBAAC,IAAD,KACE,4BAAOrwC,EAAMsvC,YAAY2B,YAE3B,gBAAC,IAAD,yCACA,2BACA,gBAAC,IAAD,4IAKF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQhwC,QAASovC,GAAjB,qBACA,gBAAC,KAAD,CAAQpvC,QAAS,kBAAMsvC,EAAgBvwC,EAAMsvC,YAAY4B,QAAxC,GACdlxC,EAAMsvC,YAAY2B,UAAlB,yBACqBjxC,EAAMsvC,YAAY2B,UAAU3lD,MAAM,EAAG,GAD1D,KAEG,WAMN6lD,EACJ,gBAAC,KAAD,CAAQvpD,KAAMoY,EAAMgkB,UAAWld,QAASomB,GACtC,gBAAC,KAAD,yCAA+C5vC,EAAI0C,KAAnD,KACA,gBAAC,KAAD,KACE,gBAAC,IAAD,2IAMF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQihB,QAASisB,GAAjB,qBACA,gBAAC,KAAD,CAAQl4C,GAAG,qBAAqBisB,QAjJhB,WACpBtkB,EAAS68B,GAAWl8B,IACpBiK,EAAQM,KAAK+S,GAAgB+N,GAC9B,GA8IK,4BAON,OACE,gBAAC,GAAD,CAAelM,MAAI,GACjB,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEoE,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWzf,EAAImlB,aAAe7F,EAAQge,IAC5C,gBAAC,KAAD,OAGJra,MACEjjB,EAAI0C,KAAJ,UACO1C,EAAI0C,MADX,OACkB1C,EAAI8zD,QAAU,aAAe,IAC3C,WAENjgC,UACE7zB,EAAIuO,oBAAsBJ,EACxB,gBAAC,GAAD,CACEyV,KAAM1V,GAAkBC,EAAuBnO,GAC/C8O,KAAM9O,EAAIuO,mBACVid,KAAM,gBAACuoC,GAAA,EAAD,CAAWlpC,SAAS,cAG5B,MAGJ0d,qBAAsB,CAAEC,QAAQ,GAChCC,yBAA0B,CAAED,QAAQ,GACpCl7B,OACE,4BACE,gBAAC,KAAD,CACE2V,MACEoI,EAAgB0H,SACZ,GACA,0FAGN,4BACE,gBAAC,KAAD,CACE9P,MACEjjB,EAAI8zD,QAAJ,iHAEMzoC,EAAgB1kB,OAAS,IAAM,OAFrC,iCAII,kHAGN,gBAAC,KAAD,CACE6kB,KAAM,gBAAC6F,GAAA,EAAD,MACN2iC,YAAa,gBAAC1iC,GAAA,EAAD,MACbqI,SAAU,kBACRt6B,ElD/OjB,SAAuB3H,EAAIi8B,GAEhC,OAAO0I,GADK,CAAE3kC,GAAAA,EAAIo8D,SAAUngC,GAE7B,CkD4OgCsgC,CAAcj0D,EAAItI,GAAIsI,EAAI8zD,SAD3B,EAGV3tB,SAAyB,IAAhBnmC,EAAI8zD,QACb1mC,UAAW/B,EAAgB0H,YAG/B,gBAAC,KAAD,CAAS9P,MAAOjjB,EAAIo8B,SAAW,UAAY,WACzC,gBAAChL,EAAA,EAAD,CACE15B,GAAG,4BACH01B,UAAW/B,EAAgB0H,SAC3BpP,QAAS3jB,EAAIo8B,SA/MX,WACpB/8B,EAAS68B,GAAWl8B,IACpBiK,EAAQM,KAAK+S,GAAgB+N,GAC9B,EAlFiB,WAChB6jB,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhBjJ,WAAW,GAFK,GAInB,GA2RoB1mC,EAAIo8B,SAAW,gBAAC83B,GAAA,EAAD,MAAoB,gBAACC,GAAA,EAAD,QAIxC,gBAAC,KAAD,CACElxC,MACEjjB,EAAIuzD,UACF,mDAEA,uSAUJ,gBAAC,KAAD,CACE5pC,MAAM,YACN6B,KAAM,gBAAC4oC,GAAA,EAAD,MACNJ,YAAa,gBAACrjB,GAAA,EAAD,MACbhX,SAAU,kBACRt6B,ElD7RjB,SAAyB3H,EAAIi8B,GAElC,OAAO0I,GADK,CAAE3kC,GAAAA,EAAI67D,WAAY5/B,GAE/B,CkD0RgC0gC,CAAgBr0D,EAAItI,GAAIsI,EAAIuzD,WAD7B,EAGVptB,SAA2B,IAAlBnmC,EAAIuzD,UACbnmC,UAAW/B,EAAgB0H,eAKjC/yB,EAAIo8B,UACJ,gBAAC,KAAD,CAASnZ,MAAM,QACb,gBAACmO,EAAA,EAAD,CACE15B,GAAG,OACHisB,QAAS5Z,GACPyT,GAAmB6N,EAAiBrrB,GACpCiK,IAGF,gBAACqqD,GAAA,EAAD,SAIJt0D,EAAIo8B,UACJ,gBAAC,KAAD,CACEnZ,MACEjjB,EAAImlB,YACA,0BACA,0BAGN,gBAACirB,GAAA,EAAD,CACEzmB,MAAM,UACNgQ,SAAU,kBACRt6B,EAASk9B,GAAUv8B,EAAItI,GAAIsI,EAAImlB,aADvB,EAGVghB,SAA6B,IAApBnmC,EAAImlB,kBAON,cAAlBxkB,aAAA,EAAAA,EAASlB,OACR,gBAAC,KAAD,KACGkB,GAA4B,aAAjBA,EAAQlB,MAClB,gBAAC,KAAD,CAAM8f,WAAS,EAACC,eAAe,WAAWo8B,WAAW,UACnD,gBAAC,KAAD,CAAMl8B,MAAI,EAACC,GAAI,GACb,gBAAC,IAAD,CAAY,aAAW,wBACrB,gBAAC40C,GAAA,EAAD,CAAU1pC,SAAS,YAAa,IAC/B7qB,EAAI6yD,oBACH,yDAC4B,qCAD5B,yCAGGD,EAHH,KAMA,kFAON,gBAAC,KAAD,CAAMlzC,MAAI,EAACC,GAAI,GACb,wBAAMF,UAAWH,EAAQgyC,YACtBtxD,EAAI6yD,qBACH,gBAAC,KAAD,CAAS5vC,MAAM,mBACb,gBAACmO,EAAA,EAAD,CACEzN,QApXI,WAC1BurB,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhBmiB,qBAAqB,GAFL,GAInB,EAgXuB1kC,SAAqC,MAA3BptB,EAAI6yD,qBAEd,gBAAC2B,GAAA,EAAD,QAIN,gBAAC,KAAD,CAASvxC,MAAM,oBACb,gBAACmO,EAAA,EAAD,CACEzN,QAAS,kBAAMtkB,EAASq9B,GAAO18B,GAAtB,EACT2pB,MAAM,WAEN,gBAAC8qC,GAAA,EAAD,YAShB,gBAAC1gC,GAAA,EAAD,KACE,gBAACK,GAAA,EAAD,KACE,gBAAC,GAAD,CACEl0B,QAASmrB,EACTklC,YAAaA,EACbC,YAAU,MAIhB,gBAAC,KAAD,CAAa/wC,UAAWH,EAAQkyC,UAC9B,gBAACkD,GAAA,EAAD,CAAqBh9B,MAAM,OAAO6L,OAAQ,KACxC,gBAACoxB,GAAA,EAAD,CACEhlD,KAAM3P,EAAMA,EAAI40D,MAAQ,GACxBh7B,OAAQ,CACN8jB,IAAK,GACL1jB,MAAO,GACPiB,OAAQ,EACR0iB,MAAO,KAGT,gBAACkX,GAAA,EAAD,CAAOC,QAAQ,SACf,gBAACC,GAAA,EAAD,MACA,gBAAC,KAAD,MACA,gBAACC,GAAA,EAAD,MACC1C,EACC,gBAAC2C,GAAA,EAAD,CACEx1D,KAAK,WACLy1D,QAAQ,IACRJ,QAAQ,UACRK,OAAQ/1D,EAAM4qB,QAAQgI,UAAUrH,KAChCyqC,KAAMh2D,EAAM4qB,QAAQgI,UAAUrH,KAC9B0qC,KAAK,EACLC,YAAa,IAEb,KACJ,gBAACL,GAAA,EAAD,CACEx1D,KAAK,WACLy1D,QAAQ,IACRJ,QAAQ,UACRK,OAAQ/1D,EAAM4qB,QAAQhnB,MAAM2nB,KAC5ByqC,KAAMh2D,EAAM4qB,QAAQhnB,MAAM2nB,KAC1B0qC,KAAK,EACLC,YAAa,IAEf,gBAACL,GAAA,EAAD,CACEx1D,KAAK,WACLy1D,QAAQ,IACRJ,QAAQ,UACRK,OAAQ/1D,EAAM4qB,QAAQU,QAAQC,KAC9ByqC,KAAMh2D,EAAM4qB,QAAQU,QAAQC,KAC5B0qC,KAAK,EACLC,YAAa,OAKrB,gBAACtoC,GAAA,EAAD,CAAM40B,OAAK,GACT,gBAACz0B,GAAA,EAAD,CACEK,QAAM,EACN7J,QAAS,SAAA7rB,GAAC,OACRiS,GAAO2U,GAAmB2M,EAAiB1qB,GAAUsJ,EAArDF,CAA8DjS,EADtD,GAIV,gBAACu1B,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,KACG3sB,aADH,EACGA,EAAS+B,KADZ,KACoBi2C,EAAQh4C,aAAD,EAACA,EAASlB,MADrC,MAIF,gBAAC0tB,GAAA,EAAD,CACEK,QAAM,EACNJ,UAAU7sB,aAAA,EAAAA,EAAYgiB,UAAWA,EACjCoB,QACEpjB,SAAAA,EAAYmC,KACRqH,GACEgU,GAAsBsN,EAAiB9qB,GACvC0J,GAEF,MAGN,gBAACojB,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,KACI/sB,SAAAA,EAAYmC,KAAb,UAEMnC,aAFN,EAEMA,EAAYmC,MAFlB,QAGKnC,aAAA,EAAAA,EAAYgiB,SAAUA,EAAtB,YACShiB,aADT,EACSA,EAAY+pC,UADrB,KAEI,IAJN,cAQR,gBAACnd,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACE,gBAAC2/B,GAAA,EAAD,OAEF,gBAAC1/B,GAAA,EAAD,gBAAuB/hB,GAAavL,EAAIuM,cAE1C,gBAAC4gB,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACE,gBAAC2/B,GAAA,EAAD,OAEF,gBAAC1/B,GAAA,EAAD,gBAAuB/hB,GAAavL,EAAIitD,aAE1C,gBAAC9/B,GAAA,EAAD,CACEK,QAAM,EACN7J,QAAS,kBACPhgB,OAAO2G,KAAP,iDAC4CtK,EAAIsoB,SAC9C,SAHK,GAOT,gBAAC+E,GAAA,EAAD,KACE,gBAACkoC,GAAA,EAAD,OAEF,gBAACjoC,GAAA,EAAD,iBACYttB,EAAIsoB,QADhB,IAC0BtoB,EAAI+1C,gBAAkB,WAGlD,gBAAC5oB,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACGrtB,EAAIuzD,UAAY,gBAAC5iB,GAAA,EAAD,MAAe,gBAACyjB,GAAA,EAAD,OAElC,gBAAC9mC,GAAA,EAAD,KAAeqrB,EAAQW,UAEzB,gBAACnsB,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACGrtB,EAAIqsD,QAAU,gBAACC,GAAA,EAAD,MAAiB,gBAACkJ,GAAA,EAAD,OAElC,gBAACloC,GAAA,EAAD,KACGqrB,EAAQ0T,SACPrsD,EAAIqsD,SACJ,gCAEE,gBAAC,KAAD,CAASppC,MAAM,4FACb,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,iBAa/B,gBAAC,MAAD,CACEq/B,OAAQ,SAAAzhD,GAAM,OAAIivC,GAAYjvC,EAAhB,EACd/F,KAAK,SACL+c,UAAU,UACVjb,KAAK,aACLulD,YAAa,CAAEC,gBAAiBC,KAChC7qD,MAAOuzD,GAAavzD,EAAM4qB,QAAQ87B,WAClCpuB,MAAM,OACN+9B,SAAU,EACVC,SAAU,IACV/L,UAAQ,EACRG,QAAS,EACT5gD,MAAOlJ,EAAIylB,WACX+X,IAAKsoB,IAEP,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAkBlf,WAAY,gBAACC,GAAA,EAAD,OAC5B,uBAAKpnB,UAAWH,EAAQ7V,QACtB,gBAAC,IAAD,CAAYgW,UAAWH,EAAQmyC,SAA/B,wBAIF,uBAAKhyC,UAAWH,EAAQ7V,QACtB,gBAAC,IAAD,CAAYgW,UAAWH,EAAQqyC,kBAA/B,uBAKJ,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAMpyC,WAAS,EAACwqB,UAAU,UACxB,gBAAC,KAAD,CAAMrqB,MAAI,GACR,gBAACqU,GAAA,EAAD,CAAOO,MAAM,QACX,gBAACN,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,kBACA,gBAACA,GAAA,EAAD,aACA,gBAACA,GAAA,EAAD,uBAEE,gBAAC,KAAD,CAASjR,MAAM,mGACb,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,gBAK3B,gBAACuJ,GAAA,EAAD,KACGp0B,EAAIkyD,QACHlyD,EAAIkyD,OACDlkD,OACE0U,EAAMmsC,YAAc,GAAKnsC,EAAMosC,cAChCpsC,EAAMmsC,YAAcnsC,EAAMosC,eAE3Bv3D,KAAI,SAAAO,GAAC,OACJ,gBAACm8B,GAAA,EAAD,CAAUK,MAAM,OAAO58B,GAAII,EAAEJ,GAAIuX,IAAKnX,EAAEJ,IACtC,gBAACw8B,GAAA,EAAD,KAAYp8B,EAAEs6D,WACd,gBAACl+B,GAAA,EAAD,KACmB,WAAhBp8B,EAAE69D,UACD,qCACS,qBAAGl2C,UAAU,mBAGtB,sCACU,qBAAGA,UAAU,kBAI3B,gBAACyU,GAAA,EAAD,KACGp8B,EAAE87D,QACD,gBAAC,KAAD,CAAQjwC,QAAS,kBA7lBvBquC,EA6lB6Cl6D,OA5lBnEo3C,GAAS,SAAAS,GAAS,gBACbA,GADa,IAEhBoiB,iBAAiB,EACjBC,YAAAA,GAHgB,IADI,IAAAA,CA6lBuB,GACdl6D,EAAE67D,WAGLtB,EAAQv6D,EAAEyqB,SApBZ,OA4BhB,gBAAC,KAAD,CAAM7C,MAAI,GACP1f,EAAIkyD,QACH,gBAAC,GAAD,CACEzyC,UAAWH,EAAQs2C,mBACnB9G,cAAepsC,EAAMosC,cACrB5c,WAAY9Q,KAAKkyB,KACftzD,EAAIkyD,OAASlyD,EAAIkyD,OAAO1iD,OAASkT,EAAMosC,cAAgB,GAEzDD,YAAansC,EAAMmsC,YACnBl1B,SArlBI,SAAAk8B,GACpB,IAAQhH,EAAgBnsC,EAAhBmsC,YACAxb,EAAkBwiB,EAAlBxiB,KAAMrB,EAAY6jB,EAAZ7jB,QAEVqB,IAASrB,EACPqB,EAAO,GAAKA,EAAO3wB,EAAMwvB,WAC3BhD,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBkf,YAAAA,GAArB,IAElB3f,GAAS,SAAAS,GAAS,gBAAUA,GAAV,IAAqBkf,YAAaxb,GAAlC,IAGpBnE,GAAS,SAAA4mB,GAAS,mBACbA,GACAD,GAFa,IAGhBhH,YAAa,EACbC,cAAe9c,QAAAA,EAAWtvB,EAAMosC,eAJhB,GAOrB,SA2kBI+E,EACAH,EACAF,EAGN,E,8KCn1BM,SAASuC,GAAgB71D,GAC9B,OAAO,IAAIuhB,SAAQ,SAACtpB,EAASupB,GAC3B1d,GjFCK,qBiFDsB,CAAEoyB,WAAYl2B,EAAQxI,KAC9CqO,KADH,e,EAAA,G,EAAA,yBACQ,WAAM1D,GAAN,wGACeA,EAASkB,OADxB,OACEoM,EADF,OAEEjL,GAAUU,EAAAA,GAAAA,KACdnC,EAAAA,GAAAA,cAAa0M,GACb,IAAI7O,GAAAA,GAAAA,MAAaQ,KAEnBnJ,EAAQuM,GANJ,0C,iLADR,uDASGwB,OAAM,SAAAlD,GACL0e,EAAO1e,EACR,GACJ,GACF,CCkJD,SAtIA,YAA+C,IAAnBqoB,EAAmB,EAAnBA,gBACpBhsB,GAAWmjB,EAAAA,EAAAA,MAEXwzC,GAAkBvzC,EAAAA,EAAAA,KACtB,SAAAC,GAAK,OAAIA,EAAM4qB,aAAalpB,KAAvB,GAD4B,KAK7BkpB,GAAe7F,EAAAA,EAAAA,UACnB,kBAAMvvC,OAAOD,KAAK+9D,GAAiBz+D,KAAI,SAAAG,GAAE,OAAIs+D,EAAgBt+D,EAApB,GAAzC,GACA,CAACs+D,IAGGC,GAAsBxzC,EAAAA,EAAAA,KAC1B,SAAAC,GAAK,OAAIA,EAAMwzC,aAAazvC,SAAvB,IAKDA,IAFchE,EAAAA,EAAAA,IAAY+F,GAAD,MAEGytC,EAE5BE,GAAkB1zC,EAAAA,EAAAA,KACtB,SAAAC,GAAK,OAAIA,EAAMwzC,aAAa9xC,KAAvB,GAD4B,KAK7B8xC,GAAezuB,EAAAA,EAAAA,UACnB,kBAAM,IAAQ,IAAO0uB,GAAkB,YAAa,MAApD,GACA,CAACA,IAeH,OAZApzC,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,qBACjB5jB,EAASg4B,GAAa,aACvB,GAAE,CAACh4B,KAEJ0jB,EAAAA,EAAAA,YAAU,WACJsI,IACFhsB,EAASguC,GAAkBhiB,IAC3BhsB,ECjEG,CACLo3B,QAASs/B,GDgEoB1qC,GC/D7BqL,MAAO,CACLr5B,GACAC,GACAC,MD8DH,GAAE,CAAC8tB,EAAiBhsB,IAEjBonB,EACK,gBAAC,GAAD,CAAQ/G,KAAK,cAIpB,gBAAC,GAAD,CAAeN,MAAI,GACjB,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE6D,MAAM,iCACN4Q,UAAWxI,EAAgB3oB,OAE7B,gBAAC,KAAD,KACE,gBAACqxB,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,gBACA,gBAACA,GAAA,EAAD,gBACA,gBAACA,GAAA,EAAD,eACA,gBAACA,GAAA,EAAD,aACA,gBAACA,GAAA,EAAD,aACA,gBAACA,GAAA,EAAD,iBACA,gBAACA,GAAA,EAAD,oBAGJ,gBAACE,GAAA,EAAD,KAC2B,IAAxB8hC,EAAa1mD,QACZ,gBAACykB,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAWm9B,QAAS,GAClB,gBAAC,IAAD,8EAOL6E,EAAa3+D,KAAI,SAAA2tB,GAChB,IAAMsoB,EAAcF,EAAa9nB,MAC/B,SAAA+pB,GAAE,OAAIA,EAAG3/B,KAAKlY,KAAOwtB,EAAE3C,MAArB,IAEJ,OACE,gBAAC0R,GAAA,EAAD,CAAUK,OAAK,EAACrlB,IAAKiW,EAAExtB,IACrB,gBAACw8B,GAAA,EAAD,KAAY3oB,GAAa2Z,EAAEypB,YAC3B,gBAACza,GAAA,EAAD,MACGkiC,EAAAA,GAAAA,GAAqB,IAAI72D,KAAK2lB,EAAEmxC,WAAY,IAAI92D,OAEnD,gBAAC20B,GAAA,EAAD,KACIsZ,GAAeA,EAAY59B,KAAKG,OAAU,OAE9C,gBAACmkB,GAAA,EAAD,KAAYhP,EAAExiB,MACd,gBAACwxB,GAAA,EAAD,K3EoHb,SAAqB9M,EAAGC,GAC7B,GAAI,GAAKD,EAAG,MAAO,UACnB,IACEkvC,EAAIjvC,GAAK,EAETuyB,EAAIxY,KAAKiuB,MAAMjuB,KAAKm1B,IAAInvC,GAAKga,KAAKm1B,IAH5B,OAIR,OAAO7W,YAAYt4B,EAAIga,KAAKo1B,IAJpB,KAI2B5c,IAAI4V,QAAQ8G,IAAM,IAF/C,CAAC,QAAS,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAEG1c,EAC9D,C2E3H+B6c,CAAYvxC,EAAEia,OAC1B,gBAACjL,GAAA,EAAD,KACE,gBAAC,KAAD,CAAQtQ,KAAMsB,EAAE1iB,KACd,gBAAC,KAAD,QAGJ,gBAAC0xB,GAAA,EAAD,KACE,gBAAC,KAAD,CAAiBplB,KAAMoW,EAAE1iB,KACvB,gBAAC,KAAD,CACE9K,GAAG,cACHurB,MAAK,oCAA8ByzC,EAAAA,GAAAA,GACjCxxC,EAAEyxC,YADC,MAIL,gBAACvlC,EAAA,EAAD,KACE,gBAAC,KAAD,UAOb,MAGL,2BACA,gBAAC,IAAD,CAAY1N,QAAQ,SAApB,yOAUT,E,qiDEvCD,SAhHMkzC,SAAAA,I,wYACJ,WACE,MASIjoC,KAAKvD,MARP+d,EADF,EACEA,KACA0tB,EAFF,EAEEA,cACAC,EAHF,EAGEA,aACAC,EAJF,EAIEA,aACA1rC,EALF,EAKEA,gBACA2rC,EANF,EAMEA,sBACAC,EAPF,EAOEA,yBACAztC,EARF,EAQEA,QAGI0tC,EAAUJ,EAAaviC,MAAQwiC,EAAaxiC,MAElD,OAAIyiC,EAEA,gBAAC,KAAD,CAAQ1sD,KAAM6+B,EAAM3f,QAASA,GAC3B,gBAAC,KAAD,qDAGA,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY2L,UAAU,KAAtB,wDAEE,2BACA,2BAHF,+IASF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQxR,QAAS6F,GAAjB,UAMJytC,EAEA,gBAAC,KAAD,CAAQ3sD,KAAM6+B,EAAM3f,QAASA,GAC3B,gBAAC,KAAD,0DAGA,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY2L,UAAU,KAAtB,0DAEE,2BACA,2BAHF,2JASF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQxR,QAAS6F,GAAjB,UAON,gBAAC,KAAD,CAAQlf,KAAM6+B,EAAM3f,QAASA,GAC3B,gBAAC,KAAD,gBAAsB0tC,EAAU,UAAY,aAC5C,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY/hC,UAAU,KAAtB,iBACiB2hC,EAAap0D,KAD9B,MACuCo0D,EAAaviC,MAAQ,IAD5D,WAEK,IACH,yBACGwiC,EAAar0D,KADhB,MACyBq0D,EAAaxiC,MAAQ,IAD9C,SAGC2iC,EAAO,6EAEJH,EAAa3xC,SAFT,2CAGJ2xC,EAAa/xC,gBAHT,0EAIU+xC,EAAaxiC,MAAQuiC,EAAaviC,OAAS,IAJrD,uCAKOwiC,EAAaxiC,MAAQ,IAL5B,uCAMJhpB,GAAa8f,EAAgBmJ,kBANzB,mKASJuiC,EAAa3xC,SATT,qCAUD2xC,EAAa3xC,SAAW,EAAI,IAAM,GAVjC,+BAWJ2xC,EAAa/xC,gBAXT,4DAYH+xC,EAAaxiC,MAAQ,IAZlB,8BAaDuiC,EAAaviC,MAAQwiC,EAAaxiC,OAAS,IAb1C,mDAiBZ,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQ5K,MAAM,UAAUhG,QAAS6F,GAAjC,UAGA,gBAAC,KAAD,CAAQG,MAAM,UAAUhG,QAASkzC,GAAjC,UACU,IACPK,EACG,+BACA,qCAKb,M,kFArGGN,CAA2BO,EAAAA,eCDjC,SAASC,GAAyBhsC,GAChC,IAAQ+d,EAAwD/d,EAAxD+d,KAAM3f,EAAkD4B,EAAlD5B,QAAS6tC,EAAyCjsC,EAAzCisC,WAAYC,EAA6BlsC,EAA7BksC,gBAAiBp3D,EAAYkrB,EAAZlrB,QAEpD,OACE,gBAAC,KAAD,CAAQoK,KAAM6+B,EAAM3f,QAASA,EAAS6O,SAAS,MAC7C,gBAAC,KAAD,qCACA,gBAAC,KAAD,KACE,gBAAC,IAAD,4CACsC,yBAAIn4B,EAAQwC,MADlD,IAEE,0BACE,2CACgB,+BADhB,kIAGqC,qCAHrC,cAKA,2CACgB,+BADhB,kDAEa,4CAFb,oGARJ,iNAmBF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQihB,QAAS6F,GAAjB,UACA,gBAAC,KAAD,CACEG,MAAM,YACNjG,QAAQ,YACRC,QAAS,kBAAM0zC,EAAWn3D,EAAjB,GAHX,iBAOA,gBAAC,KAAD,CACEypB,MAAM,UACNjG,QAAQ,YACRC,QAAS,kBAAM2zC,EAAgBp3D,EAAtB,GAHX,4BAUP,CAUD,SAAe6f,EAAAA,KAAWq3C,I,0HC9B1B,SAASG,GAAmBnsC,GAC1B,IAAQ+d,EAAoC/d,EAApC+d,KAAM3f,EAA8B4B,EAA9B5B,QAAStpB,EAAqBkrB,EAArBlrB,QAASof,EAAY8L,EAAZ9L,QAE1BjgB,GAAWmjB,EAAAA,EAAAA,MAaX8b,EAAM,e,EAAA,G,EAAA,yBAAG,sHACN,IAAI7c,SAAQ,SAAAtpB,GjFwFhB,IAAuBsN,EiFvFxBpG,GjFuFwBoG,EiFvFDvF,EAAQJ,KjFwFnC,6CAAO,WAAMT,GAAN,sGACkBmG,GAAWC,GAD7B,cACCpD,EADD,OAELhD,EAAS,CAAEI,KAAMjD,GAAiBkI,QAASrC,IAFtC,kBAGEA,GAHF,2CAAP,OAAO,SAAP,UAAO,EAAP,4BiFvFO0D,MAAK,SAAAyxD,GAAC,OAAIr/D,GAAJ,IACN+N,OAAM,SAAAsxD,G,UACLr/D,G,EAAQ,G,EACL25C,GAAAA,G,EACC,yE,gGAEL,GACJ,KAVY,0C,iLAAH,qDAaZ,OACE,gBAAC,KAAD,CAAQxnC,KAAM6+B,EAAM3f,QAASA,GAC3B,gBAAC,MAAD,CACEmL,SAAU2J,EACVrM,SA5BW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAOhB,OANKiG,EAAOyuD,cACV10D,EAAO00D,YAAc,YAEnBzuD,EAAOyuD,cAAgBv3D,EAAQwC,OACjCK,EAAO00D,YAAc,yCAEhB10D,CACR,EAoBK+xB,OAAQ,gBAAGC,EAAH,EAAGA,aAAc7E,EAAjB,EAAiBA,YAAawnC,EAA9B,EAA8BA,gBAAiB3vD,EAA/C,EAA+CA,KAA/C,OACN,gCACE,gBAAC,KAAD,KACG2vD,EACG,kCADY,gCAEax3D,EAAQwC,KAFrB,MAIlB,gBAAC,KAAD,KACGg1D,GACC,gCACE,gBAACtc,GAAA,EAAD,CAAa37B,UAAWH,EAAQq4C,QAChC,gBAAC7tB,GAAA,EAAD,KACG5pC,EAAQwC,KADX,2FAMJ,gBAACkuB,EAAA,EAAD,CAAQC,KAAM6mC,GACZ,gBAAC,IAAD,qLAKA,wBAAM/iC,SAAUI,EAAcr9B,GAAG,oBAC/B,gBAAC,MAAD,CACEgL,KAAK,cACL6K,MAAM,eACN4nB,UAAW3F,GACX/vB,KAAK,OACL21B,YAAal1B,EAAQwC,QAGxBwtB,GACC,uBAAKzQ,UAAWH,EAAQtc,OAAQktB,KAItC,gBAAC,KAAD,KACGwnC,EACC,gBAAC,KAAD,CAAQ/zC,QAAS6F,GAAjB,SAEA,gBAAC,GAAD,CACE6U,OAAQ7U,EACR+U,MAAOx2B,EAAKw2B,MACZD,OAAQvJ,EACRhtB,KAAMA,EACN22B,WAAW,YA9Cb,IAuDf,CASD,UAAe5U,EAAAA,GAAAA,IA/GA,SAAA1qB,GAAK,MAAK,CACvBq4D,YAAa,CACX9tC,MAAOvqB,EAAM4qB,QAAQU,QAAQC,KAC7B45B,WAAY,QAEdoT,MAAO,CACLhuC,MAAOvqB,EAAM4qB,QAAQ0wB,QAAQ/vB,MAE/B3nB,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MATX,GA+Gc,CAAEQ,WAAW,GAA/C,CACEpL,EAAAA,KAAWw3C,KChIb,IAAM34C,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCw4D,YAAa,CACX5sC,YAAa5rB,EAAM4f,QAAQ,GAC3ByY,WAAYr4B,EAAM4f,QAAQ,IAHI,IAO5B64C,IAAa/tC,EAAAA,GAAAA,GAAW,CAC5BhL,KAAM,CACJykB,OAAQ,EACR7L,MAAO,OAETogC,KAAM,CACJv0B,OAAQ,EACR7L,MAAO,GAETqgC,MAAO,CACLx0B,OAAQ,GACR7L,MAAO,GACPpN,gBAAiB,OACjBs0B,OAAQ,yBACRv7B,WAAY,EACZoU,YAAa,GACb,2BAA4B,CAC1BjN,UAAW,YAGfwtC,OAAQ,CAAC,EACTC,MAAO,CACL10B,OAAQ,GAEV20B,KAAM,CACJ30B,OAAQ,IAzBOzZ,CA2BhBquC,GAAAA,GAEGC,GAAQ,CACZ,CAAElvD,MAAO,EAAGqE,MAAO,QACnB,CAAErE,MAAO,EAAGqE,MAAO,QACnB,CAAErE,MAAO,EAAGqE,MAAO,WACnB,CAAErE,MAAO,EAAGqE,MAAO,UACnB,CAAErE,MAAO,EAAGqE,MAAO,eAGrB,SAAS8qD,GAAT,GAA0C,IAAhBl0C,EAAgB,EAAhBA,MAAOsL,EAAS,EAATA,MACzBnQ,EAAUV,KAChB,OACE,gBAAC,KAAD,CAAaU,QAASA,EAAQg5C,QAC5B,gBAACT,GAAD,CACE,aAAW,gBACXU,kBAAkB,MAClB3I,IAAK,EACLC,IAAK,EACLzH,KAAM,EACNgQ,MAAOA,GACPlvD,MAAOumB,EAAMvmB,MACbywB,SAAU,SAACjI,EAAOw9B,GAChBz/B,EAAMkK,SAASu1B,EAChB,EACDtqC,KAAMT,EAAMjb,QAInB,CAOD,SAAe6W,EAAAA,KAAWs4C,I,0HCxC1B,SAASG,GAA2BptC,GAClC,IAAQ+d,EAAoC/d,EAApC+d,KAAM3f,EAA8B4B,EAA9B5B,QAAStpB,EAAqBkrB,EAArBlrB,QAASof,EAAY8L,EAAZ9L,QAE1BjgB,GAAWmjB,EAAAA,EAAAA,MAaX8b,EAAM,e,EAAA,G,EAAA,yBAAG,sHACN,IAAI7c,SAAQ,SAAAtpB,GnF+FhB,IAAwBsN,EmF9FzBpG,GnF8FyBoG,EmF9FDvF,EAAQJ,KnF+FpC,6CAAO,WAAMT,GAAN,sGACkBqG,GAAsBD,GADxC,cACCpD,EADD,OAELhD,EAAS,CAAEI,KAAMhD,GAA2BiI,QAASrC,IAFhD,kBAGEA,GAHF,2CAAP,OAAO,SAAP,UAAO,EAAP,4BmF9FO0D,MAAK,SAAAyxD,GAAC,OAAIr/D,GAAJ,IACN+N,OAAM,SAAAsxD,G,UACLr/D,G,EAAQ,G,EACL25C,GAAAA,G,EACC,sH,gGAEL,GACJ,KAVY,0C,iLAAH,qDAaZ,OACE,gBAAC,KAAD,CAAQxnC,KAAM6+B,EAAM3f,QAASA,GAC3B,gBAAC,MAAD,CACEmL,SAAU2J,EACVrM,SA5BW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAOhB,OANKiG,EAAOyuD,cACV10D,EAAO00D,YAAc,YAEnBzuD,EAAOyuD,cAAgBv3D,EAAQwC,OACjCK,EAAO00D,YAAc,yCAEhB10D,CACR,EAoBK+xB,OAAQ,gBAAGC,EAAH,EAAGA,aAAc7E,EAAjB,EAAiBA,YAAawnC,EAA9B,EAA8BA,gBAAiB3vD,EAA/C,EAA+CA,KAA/C,OACN,gCACE,gBAAC,KAAD,KACG2vD,EACG,4BADY,gCAEax3D,EAAQwC,KAFrB,MAIlB,gBAAC,KAAD,KACGg1D,GACC,gCACE,gBAACtc,GAAA,EAAD,CAAa37B,UAAWH,EAAQq4C,QAChC,gBAAC7tB,GAAA,EAAD,wBACmB5pC,EAAQwC,KAD3B,uBAKJ,gBAACkuB,EAAA,EAAD,CAAQC,KAAM6mC,GACZ,gBAAC,IAAD,uDACkD,KAC/Ce,EAAAA,EAAAA,GAAoB,IAAIl5D,KAAKW,EAAQw4D,oBAFxC,mFAMA,wBAAM/jC,SAAUI,EAAcr9B,GAAG,oBAC/B,gBAAC,MAAD,CACEgL,KAAK,cACL6K,MAAM,eACN4nB,UAAW3F,GACX/vB,KAAK,OACL21B,YAAal1B,EAAQwC,QAGxBwtB,GACC,uBAAKzQ,UAAWH,EAAQtc,OAAQktB,KAItC,gBAAC,KAAD,KACGwnC,EACC,gBAAC,KAAD,CAAQ/zC,QAAS6F,GAAjB,SAEA,gBAAC,GAAD,CACE6U,OAAQ7U,EACR+U,MAAOx2B,EAAKw2B,MACZD,OAAQvJ,EACRhtB,KAAMA,EACN22B,WAAW,aA9Cb,IAuDf,CASD,UAAe5U,EAAAA,GAAAA,IA/GA,SAAA1qB,GAAK,MAAK,CACvBq4D,YAAa,CACX9tC,MAAOvqB,EAAM4qB,QAAQU,QAAQC,KAC7B45B,WAAY,QAEdoT,MAAO,CACLhuC,MAAOvqB,EAAM4qB,QAAQ0wB,QAAQ/vB,MAE/B3nB,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MATX,GA+Gc,CAAEQ,WAAW,GAA/C,CACEpL,EAAAA,KAAWy4C,K,8kCCzCb,IAAM55C,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCu5D,SAAU,CACRz4C,UAAW,UAEbpR,KAAM,CACJ4oB,MAAO,QAETkhC,KAAM,CACJv5B,eAAgB,QAElBw5B,MAAO,CACLt1B,OAAQ,GAEVmX,QAAS,CACP/wB,MAAOvqB,EAAM4qB,QAAQ0wB,QAAQ/vB,MAE/B3nB,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAE7BmuC,MAAO,CACLxuC,gBAAiBlrB,EAAM4qB,QAAQ8e,KAAK,KACpCzZ,WAAYjwB,EAAMkwB,WAAWD,YAE/B9L,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3C7qB,KAAM,CACJujB,UAAWjkB,EAAM4f,QAAQ,MAE3B+5C,QAAS,CACPpvC,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MA9BG,IAkC5BsH,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAKhB,OAJKiG,EAAOtG,OACVK,EAAOL,KAAO,YAEZ6M,GAASvG,EAAOtG,QAAOK,EAAOL,KAAO6M,GAASvG,EAAOtG,OAClDK,CACR,EAyzBD,SAvzBA,YAA8C,IAAnBsoB,EAAmB,EAAnBA,gBACnBphB,GAAUkY,EAAAA,EAAAA,MACV7C,EAAUV,KACVxf,GAAQyyD,EAAAA,EAAAA,KACRxyD,GAAWmjB,EAAAA,EAAAA,MACjB,MAA8C4N,EAAAA,EAAAA,WAAS,GAAvD,GAAO4oC,EAAP,KAAwBC,EAAxB,KACA,MAAgC7oC,EAAAA,EAAAA,UAAS,MAAzC,GAAOoI,EAAP,KAAiBC,EAAjB,KACA,MAA0CrI,EAAAA,EAAAA,WAAS,GAAnD,GAAO8oC,EAAP,KAAsBC,EAAtB,KACA,MAA8C/oC,EAAAA,EAAAA,WAAS,GAAvD,GAAOgpC,EAAP,KAAwBC,EAAxB,KACA,MAA8CjpC,EAAAA,EAAAA,WAAS,GAAvD,GAAOiX,EAAP,KAAwBC,EAAxB,KACA,MACElX,EAAAA,EAAAA,WAAS,GADX,GAAOkpC,EAAP,KAAuCC,EAAvC,KAEA,MAA8CnpC,EAAAA,EAAAA,WAAS,GAAvD,GAAOopC,EAAP,KAAwBC,EAAxB,KAEA,GAAkCh3C,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM6B,QAAV,IAA3CkC,EAAR,EAAQA,UAAWizC,EAAnB,EAAmBA,WAEbp1C,EAAY+G,EAAgB3zB,GAE5BiiE,EAAwBtuC,EAAgBnH,OAEtC6O,EAAa1H,EAAb0H,SAEFlO,GAAOpC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmC,KAAKT,OAAS,EAAxB,IAExBO,GAAalC,EAAAA,EAAAA,KACjB,SAAAC,GAAK,OAAIA,EAAM6B,SAASC,YAAYF,IAAc,CAAC,CAA9C,IAED0xC,GAAkBvzC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM4qB,aAAalpB,KAAvB,IACnCxiB,EAAgB1J,OAAOD,KAAK+9D,GAAiBz+D,KACjD,SAAAG,GAAE,OAAIs+D,EAAgBt+D,EAApB,IAGJ,MAA4C04B,EAAAA,EAAAA,UAAS,MAArD,GAAOwpC,EAAP,KAAuBC,EAAvB,KACM11C,GAAQ1B,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMyB,MAAMC,KAAhB,IACzB01C,EAAW31C,EAAMkH,EAAgB0uC,YACjCC,EAAe71C,EAAMy1C,GACrBlqB,EAAcvrB,EAAMkH,EAAgBnH,SAAW,CAAC,EAChDU,EAAOo1C,GAAgBtqB,EACvBuqB,EAA8B,YAAvBr1C,EAAKs1C,cAA8B,GAAK,IAC/CC,IAAe1yB,EAAAA,EAAAA,UACnB,kBAAM/iB,GAAmBC,EAAYC,EAAMC,EAA3C,GACA,CAACF,EAAYC,EAAMC,IAEbC,GAAiBq1C,GAAjBr1C,aAEFs1C,KACHH,EACCxuD,GACE,IAAIlM,KAAK8rB,EAAgBmJ,kBACzB,IAAIj1B,KACJ,SAEJ06D,GACAzK,QAAQ,GAEJ6K,GAAUD,GAAc,EACxBE,GAAQ11C,EAAKI,gBACbu1C,GAAaz1C,GAAes1C,GAC5BI,GAAW,CACf,CAAEt1C,EAAG,EAAGu1C,EAAG,GACX,CAAEv1C,EAAG,IAAKu1C,EAAGH,KAETI,GAAO,CACX,CAAEx1C,EAAG,EAAGu1C,EAAG,GACX,CAAEv1C,EAAiB,IAAdk1C,GAAmBK,EAAG31C,IAC3B,CAAEI,EAAG,IAAKu1C,EAAGF,GAAW/K,QAAQ,KAE5BmL,GAAOJ,GAAW/K,QAAQ,GAAa,GAAR8K,GAC/BM,GAAWD,GACbv7D,EAAM4qB,QAAQ0wB,QAAQzwB,MACtB7qB,EAAM4qB,QAAQhnB,MAAM2nB,KAClBkwC,GAAcN,GAAaD,GAE3B1qD,IAAO6S,EAAAA,EAAAA,IAAY+F,IAEnB8V,GAAM,e,EAAA,G,EAAA,yBAAG,WAAMt1B,GAAN,+GAEY3J,EAASiH,GAAc0C,IAFnC,OAEL3G,EAFK,OAGX4H,EAAQM,KAAK2S,GAAY7a,EAASu/B,SAASrd,SAASliB,EAASm/B,UAHlD,qDAKP,gBAAiB1+B,IALV,0CAMF6G,GAAiB,KAAM5G,OAAQiG,IAN7B,+F,iLAAH,sDAaN8xD,GAAe,GAAH,OAAMn3D,OAAOW,SAASy2D,SAAtB,aAAmCp3D,OAAOW,SAASuoB,SAAnD,WAEZmuC,GAAkB,WACtB3B,GAAmB,EACpB,EAEK4B,GAAa,SAAA/6D,GACjBb,EAASuG,GAAc1F,EAAS,SAChC86D,IACD,EAOKE,GAAkB,SAAAh7D,GACtBb,EAASuG,GAAc1F,EAAS,cAChC86D,IACD,EAEKG,GAAkB,WACL,UAAbpoC,GACFkmC,GAAmB,EAEtB,EAsCD,IAtBAl2C,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,4BACjB5jB,EAASg4B,GAAa,qBACtBh4B,EAASoQ,MACTpQ,EAASwvB,KACV,GAAE,CAACxvB,KAEJ0jB,EAAAA,EAAAA,YAAU,WACJsI,IACFhsB,EAASsG,GAAmB0lB,EAAgBvrB,OAC5CT,EAASqtC,GAAgBrhB,IAE5B,GAAE,CAACA,EAAiBhsB,KAErB0jB,EAAAA,EAAAA,YAAU,WACR1jB,EAAS2uD,GAA2B3iC,GACrC,GAAE,CAACA,EAAiBhsB,KAErB0jB,EAAAA,EAAAA,YAAU,WACJ42C,GAAuBE,EAAkBF,EAC9C,GAAE,CAACA,IAEAlzC,GAAaizC,IAAeM,EAC9B,OACE,gBAAC,KAAD,CAAMz6C,WAAS,EAACC,eAAe,UAC7B,gBAAC,KAAD,CAAMG,GAAI,GAAI2V,GAAI,EAAG5V,MAAI,GACvB,gBAAC,KAAD,CAAMD,UAAWH,EAAQq5C,UACvB,gBAAC,KAAD,KACGlyC,IAAcuzC,EACb,gBAAC,IAAD,CAAYt2C,QAAQ,aAApB,kCAIA,gBAAC,IAAD,oFAKF,2BACA,gBAACjD,GAAA,EAAD,UAQZ,IAAM26C,GACJ,gBAAC,KAAD,CAAQ9wD,KAAMkvD,EAAiBhwC,QAAS,kBAAMiwC,GAAmB,EAAzB,GACtC,gBAAC,KAAD,sCACA,gBAAC,KAAD,KACE,gBAAC,IAAD,kBACa,IACX,qBACE71C,KAAK,kCACLC,OAAO,QACP+0C,KAAK,uBAHP,eAMK,IARP,4UAeA,2BACA,gBAAC,IAAD,KACE,2DACiC,mCADjC,YAEK,IAHP,uTAUA,2BACA,gBAAC,IAAD,KACE,wGAMH7lC,GACC,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQpP,QAAS,kBAAM81C,GAAmB,EAAzB,GAAjB,OACA,gBAAC,KAAD,CACE/1C,QAAQ,YACRiG,MAAM,UACNyD,UAAW2F,EACXr7B,GAAG,iBACHisB,QAAS,kBA1GjBtkB,EAASoH,GA0GiC4kB,SAzG1CouC,GAAmB,EAyGF,GALX,yCAWF1mC,GACA,gBAAC,KAAD,KACE,gBAAC,IAAD,qEAGA,6BAMR,OACE,gBAAC,MAAD,CACE4B,SAAU2J,GACVrM,SAAUA,GACV8N,cAAe1U,EACfyJ,OAAQ,gBA5HS50B,EA6Hf6H,EADM,EACNA,KACAmtB,EAFM,EAENA,SACAF,EAHM,EAGNA,WACAD,EAJM,EAINA,aACA/rB,EALM,EAKNA,OAEA61B,EAPM,EAONA,oBACAC,EARM,EAQNA,gBACAC,EATM,EASNA,wBATM,OAWN,gBAAC,GAAD,CAAe5f,MAAI,GACjB,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE8D,MAAM,wBACN4Q,UACE,2BACGxI,EAAgB3oB,KADnB,IAEE,wBAAMmD,MAAO,CAAEglB,SAAU,KAAOQ,EAAgB3zB,KAGpD6rB,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAAC,KAAD,OAGJjW,OACE,2BACE,gBAAC,KAAD,CACE2V,OACG8P,GAAY1H,EAAgB1kB,OACzB,gEACA,IAGN,4BACE,gBAAC,KAAD,CACEsc,MACEoI,EAAgB1kB,OACZ,uCACA,uBAGN,gBAAC,KAAD,CACE6kB,KAAM,gBAAC6vC,GAAA,EAAD,MACNrH,YAAa,gBAACsH,GAAA,EAAD,MACb3xC,MAAM,UACNwc,QAAS9a,EAAgB1kB,OACzBymB,UAAW2F,GAAY1H,EAAgB1kB,OACvCgzB,UA7KHz5B,EA6K0BmrB,EA7Kf,WAC1BnrB,EAAQyG,QACVtH,EAASoH,GAAavG,IACtBu5D,GAAmB,IAEnBA,GAAmB,EAEtB,GAuKuBvwD,MAAOmiB,EAAgB1kB,YAK/B,gBAACyqB,EAAA,EAAD,CACE,YAAWoH,EAAW,cAAgB,KACtC,gBAAc,OACd7U,QAAS,SAAA+N,GAAK,OAAI+G,EAAY/G,EAAMyI,cAAtB,GAEd,gBAACohC,GAAA,EAAD,OAEF,gBAAC,KAAD,CACE7jE,GAAG,cACH8gC,SAAUA,EACVluB,KAAMwb,QAAQ0S,GACdhP,QAAS,kBAAMiP,EAAY,KAAlB,GAET,gBAAC8X,GAAA,EAAD,CACE5sB,QAAS5Z,GACP2T,GAAkC2N,GAClCphB,IAHJ,0BAQA,gBAACsmC,GAAA,EAAD,CACE5sB,QAAS5Z,GACPoT,GAAkBkO,GAClBphB,IAHJ,4BAQA,gBAAC,GAAD,CACE2Z,KAAI,mEAA8DyH,EAAgB3oB,KAA9E,aAAuF4hB,EAAvF,KACJxV,KACE,gBAAC,KAAD,CACE0sD,UAAU,SACVv4C,MAAM,kEAEN,gBAACstB,GAAA,EAAD,CACEnjB,UAAW2F,EACXr7B,GAAG,qBACHisB,QAAS,kBACPvW,GACE,WACA,UACA,qBAJK,GAHX,6BAoBd,gBAAC,KAAD,MACI2lB,GACA,gBAAC,IAAD,gFAKF,gBAAC,KAAD,CACExT,WAAS,EACTP,QAAS,EACT+qB,UAAU,MACVvqB,eAAe,UAEf,gBAAC,KAAD,CAAME,MAAI,EAACC,GAAI,IACb,gBAAC,MAAD,CACEwV,UAAW3F,GACX/P,UAAWH,EAAQxQ,KACnBvB,MAAM,eACN7V,GAAG,eACH+H,KAAK,OACL2tB,UAAW2F,EACXqC,YAAY,iCACZ1yB,KAAK,SAEP,gBAAC,KAAD,CACE+c,WAAWgO,EAAAA,EAAAA,GACTnO,EAAQxf,KACRurB,EAAgBvrB,OAASuP,GAAQrG,EAAOtG,OACtC4c,EAAQy5C,UAGZ,4BAAO1pD,GAAQrG,EAAOtG,OAAS,gBAAuB,IACtD,gBAAC,KAAD,CACEugB,MAAM,uPAMN,gBAACkR,GAAA,EAAD,CAAMtJ,SAAS,eAIrB,gBAAC,KAAD,CAAMnL,MAAI,EAACC,GAAI,IACb,gBAAC,KAAD,yBACoB,IAClB,gBAACyR,EAAA,EAAD,CACE+N,KAAK,QACLxb,QAAS,kBAAMw1C,GAAkBD,EAAxB,GAERA,EACC,gBAAC,KAAD,CAASj2C,MAAM,yBACb,gBAACoO,GAAA,EAAD,OAGF,gBAAC,KAAD,CAASpO,MAAM,yBACb,gBAACqO,GAAA,EAAD,QAGQ,IACd,gBAAC,KAAD,CACEkkB,OAAQ,kBAAMn2C,ElFjLzB2G,IAFuBy1D,EkFmL6B,alFjLpD,UAAqBA,EAArB,wBACF,2BADoD,YAFtD,IAA2BA,CkFmLJ,EACR3sD,KAAI,UAAKgsD,IAAL,OAAoBzvC,EAAgBqwC,UAExC,gBAAC,KAAD,CAASz4C,MAAM,0CACb,wBAAMpd,MAAO,CAAEksB,OAAQ,YACnBmnC,EAAD,UAEM4B,GAFN,mBACMA,IADN,OACqBzvC,EAAgBqwC,cAOhD,gBAAC,KAAD,CAAMh8C,MAAI,EAACC,GAAI,IACb,gBAAC,MAAD,CACEwV,UAAW3F,GACX/P,UAAWH,EAAQxQ,KACnBpX,GAAG,sBACH+H,KAAK,OACL2tB,UAAW2F,EACXqC,YAAY,uCACZ1yB,KAAK,cACL6K,MAAM,yBAGV,gBAAC,KAAD,CAAMmS,MAAI,EAACC,GAAI,GAAI2V,GAAI,GACrB,gBAAC,IAAD,sBACiBtsB,EAAO2yD,YAAa,IACnC,gBAAC,KAAD,CACE14C,MACEja,EAAO2yD,YAAc,EAArB,gBACa3yD,EAAO2yD,YADpB,0bAUF,gBAACxnC,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,gBAAC,MAAD,CAAOnoB,KAAK,gBACT,gBAAG+sB,EAAH,EAAGA,MAAH,OACC,gBAAC0oC,GAAA,EAAD,CACEvI,IAAK,EACLC,IAAK,GACLpwC,UAAWH,EAAQ9c,IACnB0G,MAAOC,OAAOsmB,EAAMvmB,OACpBywB,SAAU,SAACjI,EAAOw9B,GAChBz/B,EAAMkK,SAASu1B,EAChB,EACD9hC,UAAW2F,GAA8B,IAAlB/pB,EAAOkb,OAC9BxhB,KAAK,cACL6K,MAAM,eAXT,KAgBL,gBAAC,KAAD,CAAMmS,MAAI,EAACC,GAAI,GAAI2V,GAAI,GACrB,gBAAC,IAAD,iCAC4BtsB,EAAO4yD,sBADnC,IAC2D,IACzD,gBAAC,KAAD,CACE34C,MAAK,+FACUja,EAAO4yD,sBADjB,mGAIL,gBAACznC,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,gBAAC,MAAD,CAAOnoB,KAAK,0BACT,gBAAG+sB,EAAH,EAAGA,MAAH,OACC,gBAAC0oC,GAAA,EAAD,CACEI,kBAAkB,OAClB3I,IAAK,EACLC,IAAK,GACLpwC,UAAWH,EAAQ9c,IACnB9K,GAAG,6BACH01B,UAAW2F,EACX7pB,MAAOumB,EAAMvmB,MACbywB,SAAU,SAACjI,EAAOw9B,GAChBz/B,EAAMkK,SAASu1B,EAChB,EACDxsD,KAAK,wBACL6K,MAAM,0BAbT,OAoBT,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEoW,QAAS5b,EAAKw2B,MACd9+B,KAAK,SACL2tB,SAAU4H,GAAcE,GAH1B,SAOA,gBAAC,KAAD,CACE9H,UACG2F,GACDmC,GACA8kC,EAAatiE,KAAOg4C,EAAYh4C,IAChCmnC,GACCC,IAAoBC,EAEvBpb,QAASoR,GAERilC,EAAatiE,KAAOg4C,EAAYh4C,GAC7B,sBACA,kBAEN,gBAAC,KAAD,CAAQisB,QAAS,kBAAM01C,GAAmB,EAAzB,GAAjB,kBAEE,gBAAC,KAAD,CAAexuC,SAAS,WAE1B,gBAAC,KAAD,CACElH,QAAS,kBACP0H,EAAgBqtC,kBACZa,GAAkC,GAClCjyB,GAAmB,EAHhB,GAMRjc,EAAgBqtC,kBAAhB,2CAPH,KAWGrtC,EAAgBqtC,kBACf,gBAACz5B,GAAA,EAAD,CAAQpU,SAAS,UAEjB,gBAAC2pC,GAAA,EAAD,CAAe3pC,SAAS,aAKhC,2BACA,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE5H,MAAM,eACN4Q,UAAS,wBAAmB6b,EAAYniC,OACxCgW,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAAC,KAAD,SAIN,gBAAC,KAAD,KACE,gBAAC,IAAD,CACEG,QAAQ,KACRjE,UAAW46C,GAAU/6C,EAAQtc,MAAQ,MAFvC,yBAKGq3D,IAAW,KAEd,2BACA,gBAAC,IAAD,KACE,gBAAC,KAAD,CACE32C,QAAQ,YACRiG,MAAM,UACNhG,QAAS5Z,GAAOsT,GAAiBgO,GAAkBphB,IAHrD,6BAQF,2BACA,gBAAC,IAAD,iBACW,yBAAIkwD,GAAal1C,WAD5B,cAEGk1C,GAAal1C,UAAY,GAAgC,IAA3Bk1C,GAAal1C,UACxC,IACA,KAAM,IAJZ,UAKUk1C,GAAa/0C,SALvB,eAOA,gBAAC,IAAD,0BACoB,yBAAI+0C,GAAar1C,cADrC,MAC0D,IACvDq1C,GAAap1C,SAFhB,oBAIA,gBAAC,IAAD,iBAC0B,IAAdq1C,IAAmB5K,QAAQ,GADvC,oCAEa6K,GAAU,QAAU,OAAQ,IACtC9uD,GAAa8f,EAAgBmJ,kBAHhC,4BAIW+lC,GAAW/K,QAAQ,GAJ9B,UAMEmL,GAUA,gBAAC,IAAD,4CACuC,IACrC,0BAAmB,IAAdE,IAAmBrL,QAAQ,GAAhC,KAFF,mBATA,gBAAC,IAAD,uBACkB,IAChB,wBAAM/vC,UAAWH,EAAQtc,OACvB,gDACM,IAJV,qEAcDq3D,IACC,2BACE,2BACA,gBAAC,IAAD,CAAY32C,QAAQ,YAAYiG,MAAM,SAAtC,0IAQN,gBAAC+qC,GAAA,EAAD,CACEh9B,MAAM,OACN6L,OAAQ,IACR9jB,UAAWH,EAAQw5C,OAEnB,gBAAC+C,GAAA,EAAD,CACEjiC,OAAQ,CACN8jB,IAAK,GACL1jB,MAAO,GACPiB,OAAQ,GACR0iB,KAAM,IAERl+B,UAAWH,EAAQw5C,OAEnB,gBAACjE,GAAA,EAAD,CACEnyD,KAAK,iBACLiJ,KAAK,IACLlM,KAAK,SACLq1D,QAAQ,IACRgH,MAAI,IAEN,gBAAC/G,GAAA,EAAD,CACEt1D,KAAK,SACLq1D,QAAQ,IACRhR,YAAY,QACZphD,KAAK,OACLohC,OAAQ,CAAC,OAAQy2B,GAAaD,GAAQC,GAAaD,MAErD,gBAAC,KAAD,CAAcvoC,OAAQ,CAAEgqC,gBAAiB,SACzC,gBAAC/G,GAAA,EAAD,CAAQ9H,cAAc,MAAM1c,MAAM,OAAOjN,OAAQ,KACjD,gBAACy4B,GAAA,EAAD,CACEt5D,KAAI,sBAAiB43D,GAAjB,KACJ3qD,KAAM6qD,GACNpF,KAAMh2D,EAAM4qB,QAAQU,QAAQC,KAC5BsxC,KAAM,CAAE3G,YAAa,KAEvB,gBAAC0G,GAAA,EAAD,CACEt5D,KACE,wBAAM+c,UAAWk7C,GAAOr7C,EAAQo7B,QAAUp7B,EAAQtc,OAAlD,iBACiBu3D,GAAW/K,QAAQ,GADpC,KAIF7/C,KAAM+qD,GACNtF,KAAMwF,GACNqB,KAAM,CAAE3G,YAAa,OAI3B,gBAAC,KAAD,KACGjqC,EAAgBnH,SAAWmH,EAAgB0uC,YAC1C,gBAAC,IAAD,+CACyC,yBAAID,EAASvsD,OADtD,OAEYhC,GAAa8f,EAAgBmJ,kBAFzC,IAGE,2BAHF,sDAQJ,gBAAC,KAAD,CAAa/U,UAAWH,EAAQq5C,UAC9B,gBAAC,IAAD,CAAYj1C,QAAQ,MAApB,eACc,UAAbqP,GACC,gBAAC,IAAD,iDAIY,UAAbA,IAAyBnjB,GAAKyjB,OAC7B,gBAAC,IAAD,qEAIF,2BACA,gBAAC,MAAD,CAAO3wB,KAAK,SAASyyB,UAAWkjC,GAAgBl0C,MAAOA,IACvD,gBAAC,MAAD,CAAUzhB,KAAK,WACZ,SAAAwG,GAAK,OAAI2wD,EAAkB3wD,EAAtB,IAER,2BACwB,eAAvB8wD,EAAazsD,MACZ,2BACE,gBAAC,IAAD,wBACA,gBAAC,IAAD,gBACA,gBAAC,IAAD,mBACA,gBAAC,IAAD,gCAGF,2BACE,gBAAC,IAAD,SAAcysD,EAAazlC,MAAQ,KACnC,gBAAC,IAAD,KACGylC,EAAa50C,SADhB,cAEG40C,EAAa50C,SAAW,EAAI,IAAM,MAErC,gBAAC,IAAD,KACG40C,EAAah1C,gBADhB,SAEkC,WAA/Bg1C,EAAaE,cAA6B,KAAO,KAFpD,KAIA,gBAAC,IAAD,KACGF,EAAa/pB,UADhB,QAEG+pB,EAAa/pB,UAAY,EAAI,IAAM,QAK5C,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEtsB,QAAS5b,EAAKw2B,MACd9+B,KAAK,SACL2tB,SAAU4H,GAAcE,GAH1B,UAOEA,GAAmC,eAAvB8kC,EAAazsD,OACzB,gBAAC,KAAD,CACEmW,QAAQ,YACRiG,MAAM,UACN/F,KAAK,gCAHP,cAQsB,eAAvBo2C,EAAazsD,QAA2B2nB,GACvC,gBAAC,KAAD,CACExR,QAAQ,YACRiG,MAAM,UACNhG,QACG/T,GAAKyjB,MAEF8nC,GADApxD,G/En1Bf,W+Em1BqCE,GAG5BmjB,SACe,UAAb2F,GAAwBinC,EAAatiE,KAAOoiE,EAASpiE,IAGrDkY,GAAKyjB,MAAN,oBAEgB2mC,EAAazsD,OAF7B,OAGKysD,EAAatiE,KAAOoiE,EAASpiE,GAAK,WAAa,IAFjD,YAMPw9B,GACC,gBAAC,KAAD,CAAQ9H,UAAQ,EAAC1J,QAAQ,YAAYiG,MAAM,aAA3C,gBACgBqwC,EAAazsD,SAKnC,gBAAC,GAAD,CACE8pD,WAAY4D,GACZ3D,gBAAiB4D,GACjBh7D,QAASmrB,EACT8d,KAAMiwB,EACN5vC,QAAS,kBAAM6vC,GAAmB,EAAzB,IAEX,gBAAC,GAAD,CACEn5D,QAASmrB,EACT8d,KAAM9B,EACN7d,QAAS,kBAAM8d,GAAmB,EAAzB,IAEX,gBAAC,GAAD,CACEpnC,QAASmrB,EACT8d,KAAMmwB,EACN9vC,QAAS,kBAAM+vC,GAAkC,EAAxC,IAEX,gBAAC,GAAD,CACE2C,aAAcztC,GACdooC,cAAe,WAEb,OADAoC,GAAmB,GACZ55D,GrEn0BS88D,EqEo0BA,CACZ73C,UAAAA,EACAJ,OAAQlb,EAAOkb,QrEr0BxB,SAAA7kB,GACLA,EANK,CAAEI,KAAM,qBAObouB,GAAWsuC,EAAXtuC,CAA0BxuB,EAC3B,IAJI,IAAuB88D,CqEy0BjB,EACDhzB,KAAM6vB,EACNxvC,QAAS,kBAAMyvC,GAAmB,EAAzB,EACTlC,aAAciD,EACdlD,aAAcpnB,EACdrkB,gBAAiBA,EACjB2rC,sBACEgD,EAAa50C,SAAW+0C,GAAal1C,UAEvCgyC,yBACG+C,EAAatiE,GAAK,GAAKkK,EAAc4N,OAAS,GAC9CwqD,EAAatiE,GAAK,GAAKkK,EAAc4N,OAAS,IAGlD4rD,GAxjBG,GA6jBb,E,gqBCt7BD,SAASgB,GAAT,GAOG,IAND3sC,EAMC,EANDA,MAGAG,GAGC,EALDnwB,KAKC,EAJDowB,KAIC,EAHDD,QAGC,IAFDI,KAAQC,EAEP,EAFOA,QAASjtB,EAEhB,EAFgBA,MACdmtB,EACF,SACD,OACE,gBAACS,EAAA,EAAD,CAAQC,KAAMjB,GACZ,gBAAC,KAAD,IACER,WAAYa,GAAWjtB,EACvBA,MAAOitB,GAAWjtB,GACdysB,EAHN,CAIE0W,QAAS1W,EAAMvmB,MACfA,MAAOumB,EAAMvmB,OACTinB,IAIX,CAED,SAAepQ,EAAAA,KAAWq8C,I,0tDC2B1B,IAAMx9C,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCmkB,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3C6C,OAAQ,CACNoM,OAAQx6B,EAAM4f,QAAQ,IAExB2U,QAAS,CACPrJ,gBAAiBlrB,EAAM4qB,QAAQ8e,KAAK,MARN,IAY5B7W,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAOhB,OANKiG,EAAOqF,iBACVtL,EAAOsL,eAAiB,YAErBrF,EAAOsF,mBACVvL,EAAOuL,iBAAmB,YAErBvL,CACR,EAED,SAASqlC,GAAT,GAAuE,IAAhDyH,EAAgD,EAAhDA,aAAcD,EAAkC,EAAlCA,UAAWlJ,EAAuB,EAAvBA,UAActb,EAAS,SACrE,OACE,gBAAC,KAAD,MAAYA,EAAZ,CAAmB9gB,KAAMo8B,EAAWld,QAASomB,IAC3C,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAYlsB,QAAQ,MAApB,qEAIF,gBAAC,KAAD,KACE,gBAAC,IAAD,sKAMF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQC,QAASisB,GAAjB,qBACA,gBAAC,KAAD,CAAQl4C,GAAG,uBAAuBisB,QAASksB,GACxC,IADH,iCAOP,CAsZD,SApZA,YAAoD,IAAnBxkB,EAAmB,EAAnBA,gBACzB/L,EAAUV,KACV3U,GAAUkY,EAAAA,EAAAA,MACV9iB,GAAWmjB,EAAAA,EAAAA,MAEX8B,EAAY+G,EAAgB3zB,GAElC,MAAkC04B,EAAAA,EAAAA,WAAS,GAA3C,GAAOsW,EAAP,KAAkBC,EAAlB,KAEQhe,GAAkBlG,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgG,IAAV,IAAnCC,cAEFxa,GAAwBsU,EAAAA,EAAAA,KAAY,SAAAC,GACxC,OAAOxqB,OAAO8Q,OAAO0Z,EAAMurC,uBAAuB7pC,OAAOoB,MACvD,SAAA62C,GAAE,OAAIA,EAAG/3C,YAAcA,CAArB,GAEL,GAJwC,KAMzC,MAA0C7B,EAAAA,EAAAA,KAAY,SAAAC,GACpD,MAIIA,EAAMurC,uBAHDqO,EADT,EACEC,MACUC,EAFZ,EAEEt6C,SACgBu6C,EAHlB,EAGEC,eAGF,MAAO,CACL,IAAQxkE,OAAO8Q,OAAOszD,GAA8B,CAClD,qBAAG55D,KAAgBuL,aAAnB,IAEF/V,OAAO8Q,OAAOwzD,GACdC,EAEH,GAdoD,KAArD,GAAOF,EAAP,KAAcr6C,EAAd,KAAwBw6C,EAAxB,KAgBM38B,GAAgB0H,EAAAA,EAAAA,UACpB,kBACEt5B,GAAyB,CACvBoU,OAAQoG,EACRrE,UAAAA,EAHJ,GAKA,CAACnW,EAAuBwa,EAAerE,IAGnC1iB,GAAgB6gB,EAAAA,EAAAA,KAAY,SAAAC,GAChC,OAAOxqB,OAAO8Q,OAAO0Z,EAAM4qB,aAAalpB,MACzC,GAFgC,KAI3Bu4C,EACJxuD,GACAvM,EACG8F,QAAO,SAAA6nC,GACN,OAAOA,EAAG3/B,KAAKlY,KAAOyW,EAAsBoU,MAC7C,IACAhrB,KAAI,SAAAg4C,GAAE,OAAIA,EAAG3/B,KAAKG,KAAZ,IAAmB,GAExB2/B,GAAcjtB,EAAAA,EAAAA,KAClB,SAAAC,GAAK,OAAIA,EAAMyB,MAAMC,MAAMiH,EAAgBnH,OAAtC,GADwB,KAKzB04C,EAAoBltB,aAAH,EAAGA,EAAamtB,eAEjCC,GAA+B3uD,GACjCA,EAAsBoU,SAAWoG,EAG/BknB,EAAe,SAAA3vC,GACnBb,EddG,SAAqCa,GAC1C,oDAAO,WAAMb,GAAN,0GACkB2F,GAAI/E,GAA+BC,IADrD,cACCmC,EADD,gBAEcA,EAASkB,OAFvB,OAECoM,EAFD,OAGCiyB,GAAWx8B,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAOzO,IAE/C7B,EAAS,CACPI,KAAM9B,GACN+G,QAASk9B,IAEXviC,EAxIK2G,GAAkB,kCAAmC,SA+HrD,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAWD,CcEY+2D,CAA4B78D,IACrCymC,GAAa,EACd,EAWKrI,EAAM,e,EAAA,G,EAAA,yBAAG,WAAMt1B,GAAN,6FACPsE,EAASa,EAAwBsgD,GAA8BP,GADxD,kBAIL7uD,EAASiO,EAAO+d,EAAiBriB,IAJ5B,cAKX3J,EAASsG,GAAmB0lB,EAAgBvrB,OALjC,kBAMJT,EAAS2uD,GAA2B3iC,KANhC,qCAQP,gBAAiBvoB,IARV,0CASF6G,GAAiB,KAAM5G,OAAQiG,IAT7B,kC,EAAA,G,EAaR8oC,GAAAA,G,EAAa,qD,iGAbL,kC,SAAA,sB,iLAAH,uDAkBZ/uB,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,2BACjB5jB,EAASg4B,GAAa,oBACtBh4B,EAASwvB,KACV,GAAE,CAACxvB,KAEJ0jB,EAAAA,EAAAA,YAAU,WACJ65C,GAAmBv9D,G7EUlB,SAAAA,GAEL,OADAA,EAAS,CAAEI,KAAM7B,KACVoG,GdnCF,wBcoCF+B,KADI,6CACC,WAAM1D,GAAN,kGACSY,GAAAA,aADT,SAC4BZ,EAASkB,OADrC,mBACEoM,GADF,cAEJtQ,EAAS,CAAEI,KAAM5B,GAAkB0+D,MAAO5sD,EAAK4sD,QAF3C,2CADD,uDAKJr2D,OAAM,SAAAlD,GACL3D,EAAS,CAAEI,KAAM3B,GAAkB4G,QAAS1B,GAC7C,GACJ,G6EnBA,GAAE,CAAC3D,EAAUu9D,KAEd75C,EAAAA,EAAAA,YAAU,WACR1jB,EAASguC,GAAkBhiB,IAC3BhsB,EAAS2uD,GAA2B3iC,GACrC,GAAE,CAACA,EAAiBhsB,KAErB0jB,EAAAA,EAAAA,YAAU,WACR,IAAQ3U,EAAoC2xB,EAApC3xB,gBAAiBC,EAAmB0xB,EAAnB1xB,eACrBD,GAAmBC,GACrBhP,EAAS2iB,GAAc3T,EAAgBD,GAE1C,GAAE,CAAC/O,EAAU0gC,IAEd,IAAMi9B,EAAa,GAAH,OAAM7uD,aAAN,EAAMA,EAAuBC,gBAA7B,YAAgDD,aAAhD,EAAgDA,EAAuBE,gBAEvF,OACE,gBAAC,MAAD,CACEsmB,SAAU2J,EACVrM,SAAUA,GACV8N,cAAeA,EACf4c,SAAU,CACRC,OAAQ,WAAiBl6B,EAAjB,GAA4C,cAA1C7Y,EAA0C,KAAnCX,EAAmC,MAClD2zC,EADkD,EAAlBA,aACpBn6B,EAAO7Y,GAAO,kBAAMX,CAAN,GAC3B,GAEH4rB,OAAQ,gBACNC,EADM,EACNA,aACAC,EAFM,EAENA,WACAC,EAHM,EAGNA,QACAC,EAJM,EAINA,SACAntB,EALM,EAKNA,KACAmoB,EANM,EAMNA,YANM,OAQN,2BACE,gBAAC,GAAD,CACE+I,QAAQ,gBACRN,QACE,2BACE,gBAAC,KAAD,CACElZ,UAAWH,EAAQkO,OACnB7J,QAAS5Z,GjFxOlB,WiFwOwCE,IAE/B,gBAAC,KAAD,MAJF,sBAOCkE,GACC,gBAAC,KAAD,CACEsR,UAAWH,EAAQkO,OACnB7D,MAAM,UACNyD,UAAW/B,EAAgB0H,SAC3BpP,QAAS,kBAAMgjB,GAAa,EAAnB,GAJX,wBAYR,gBAAC,KAAD,CAAMpnB,WAAS,EAACC,eAAe,UAC7B,gBAAC,KAAD,CAAME,MAAI,EAACG,GAAI,EAAGD,GAAI,GACpB,gBAAC,KAAD,CAAMH,UAAWH,EAAQR,MACvB,gBAAC,KAAD,CACEyE,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,qBAAG9D,UAAU,yBAGjBwD,MAAM,kBACN4Q,UAAU,sCAEX1lB,GACC,gBAAC,KAAD,CAAasR,UAAWH,EAAQqU,SAC9B,gBAAC,IAAD,KACE,yCADF,IACuBgpC,GAEvB,gBAAC,IAAD,KACE,kCAAa,IACb,gBAAC,GAAD,CACE/4C,KAAI,iCAA4Bo5C,GAChCluD,KAAMkuD,EACNxxC,KAAM,gBAACuoC,GAAA,EAAD,CAAWlpC,SAAS,eAG9B,gBAAC,IAAD,KACE,oCADF,IACkB1c,EAAsBG,kBAExC,gBAAC,IAAD,KACE,wCAAmB,IAClBH,EAAsBggD,kBACrB,kCACK,gBAAC/S,GAAA,EAAD,CAAavwB,SAAS,UAAUlB,MAAM,aAG3C,mCACM,gBAAC,KAAD,CAAOkB,SAAS,UAAUlB,MAAM,YAI1C,gBAAC,IAAD,KACE,sDAAiC,IAChCxb,EAAsB8uD,UACrB,gBAAC,GAAD,CACEr5C,KAAI,iCAA4Bo5C,EAA5B,2BAAyD7uD,EAAsB8uD,WACnFnuD,KAAMX,EAAsB8uD,UAC5BzxC,KAAM,gBAACuoC,GAAA,EAAD,CAAWlpC,SAAS,cAG5B,cAGF1c,EAAsB8uD,WACtB,gBAAC,IAAD,CAAYtzC,MAAM,SAAlB,4QAWN,gBAAC,KAAD,MACIizC,GACA,2BACE,gBAAC,IAAD,CAAY/2D,MAAO,CAAE8jB,MAAO,QAC1B,yEAEF,2BACA,gBAAC,IAAD,gMAMA,2BACA,gBAAC,IAAD,eACU,IACR,qBAAG/F,KAAK,gCAAR,yBAEK,IAJP,qBASF84C,IAAmBhtB,IACnB,gBAAC,GAAD,CAAQhwB,KAAK,sBAAsBY,OAAK,IAEzCs8C,GAAsC,IAAjBL,EAAM/sD,SAAiBktD,GAC3C,2BACE,gBAAC,IAAD,CAAYh5C,QAAQ,aAApB,2IAKA,2BACA,gBAAC,KAAD,CAAQC,QAAS5Z,GAAO,WAAYE,IAApC,eAKH2yD,IAAsBF,GAAkBH,EAAM/sD,OAAS,GACtD,wBAAMmlB,SAAUI,GACd,gBAAC,KAAD,CAAMxV,WAAS,EAACwqB,UAAU,UACxB,gBAAC,KAAD,CAAMrqB,MAAI,GACR,gBAAC,IAAD,CAAYgE,QAAQ,MAApB,2CAIF,gBAAC,KAAD,CAAMhE,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,kBACL6K,MAAM,QACN4nB,UAAW3F,GACX/vB,KAAK,OACL2tB,UAAQ,KAGZ,gBAAC,KAAD,CAAM1N,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,iBACL6K,MAAM,OACN2vD,kBAAkB,QAClB/nC,UAAW2b,GACX1jB,UAAWwvC,IAAsBE,GAEhCP,GACCA,EAAMhlE,KAAI,SAAAyuC,GAAE,OACV,gBAACuK,GAAA,EAAD,CAAUrnC,MAAO88B,EAAGtjC,KAAMuM,IAAK+2B,EAAGtuC,IAC/BsuC,EAAGtjC,KAFI,KAMhB,gBAAC,MAAD,CAAUA,KAAK,mBACZ,SAAAwG,GAAK,OAtOP,SAACA,EAAOyzC,GAC/B,IAAMzE,EAAQqkB,EAAMY,WAAU,SAAAtR,GAAC,OAAIA,EAAEnpD,OAASwG,CAAf,IACzBk0D,EAAeb,EAAMrkB,GACvBklB,IACFzgB,EAASC,OAAO,kBAAmBwgB,EAAan7C,OAChD5iB,EAAS2iB,GAAc9Y,EAAOk0D,EAAan7C,QAE9C,CA+NmCo7C,CAAiBn0D,EAAOnB,EAAK40C,SAAjC,KAGV,gBAAC,KAAD,CAAMj9B,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,mBACL6K,MAAM,SACN4nB,UAAW2b,GACX1jB,UAAWwvC,IAAsBE,GAEhC56C,GACCA,EAAS3qB,KAAI,SAACyuC,EAAI9Y,GAAL,OACX,gBAACqjB,GAAA,EAAD,CAAUrnC,MAAO88B,EAAI/2B,IAAKie,GACvB8Y,EAFQ,MAOnB,gBAAC,KAAD,CAAMtmB,MAAI,GACR,gBAAC,KAAD,CACEnS,MAAM,uBACN1H,MAAO,CAAEwd,UAAW,GACpB6iB,QACE,gBAAC,MAAD,CACExjC,KAAK,oBACLyyB,UAAWinC,GACXhvC,UACGwvC,IAAsBE,OAMhC5sC,GACC,gBAAC,IAAD,CAAYrqB,MAAO,CAAE8jB,MAAO,QAC1B,2BACA,yBAAIuG,GACJ,2BAHF,uCAWT0sC,GAAqBL,EAAM/sD,OAAS,GACnC,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEiQ,UAAWH,EAAQkO,OACnBJ,UAAW/B,EAAgB0H,SAC3BpP,QAAS5Z,GAAOmT,GAAYmO,GAAkBphB,IAHhD,UAOA,gBAAC,KAAD,CACEwV,UAAWH,EAAQkO,OACnBJ,UAAW/B,EAAgB0H,UAAYmC,EACvCvR,QAAS5b,EAAKw2B,OAHhB,SAOA,gBAAC,KAAD,CACE9e,UAAWH,EAAQkO,OACnB91B,GAAG,eACH01B,SACE4H,GACAC,GACAC,IACC7J,EAAgB0H,SAEnBpP,QAASoR,GAERC,EACC,qBAAGvV,UAAU,sCAEZtR,EAAyB,oBAC1B,sBAKR,gBAACi6B,GAAD,CACEyH,aAAc,kBAAMA,EAAaxkB,EAAnB,EACdukB,UAAW,kBAAMjJ,GAAa,EAAnB,EACXD,UAAWA,OA7Pf,GAsQb,E,wFCndD,SAAS42B,GAAQlyC,GACf,IACE1zB,EAYE0zB,EAZF1zB,GACA8U,EAWE4e,EAXF5e,SACA7L,EAUEyqB,EAVFzqB,QACA8L,EASE2e,EATF3e,UACAC,EAQE0e,EARF1e,WACA1M,EAOEorB,EAPFprB,IACA2jB,EAMEyH,EANFzH,QACAhX,EAKEye,EALFze,UACA4wD,EAIEnyC,EAJFmyC,QACA9xD,EAGE2f,EAHF3f,SACA6T,EAEE8L,EAFF9L,QACAzS,EACEue,EADFve,WAQF,IAAM0W,EAAS,gBAAC,GAAD,CAAc/W,SAAUA,IAEjCgxD,EACJ,gBAAC,KAAD,CAASv6C,MAAM,iBACb,gBAACwxC,GAAA,EAAD,CACEh1C,UAAWH,EAAQm+C,KACnBjsC,KAAK,cACL,cAAY,QACZ,aAAW,uBAKXksC,GACH/wD,GAA+B,cAAlBhM,aAAA,EAAAA,EAASg9D,OAAwBh9D,GAAwB,MAAZ6L,EAEvD,KArBN,SAA0B1U,GACxBA,EAAEqS,kBACFozD,EAAQv9D,EAAK,CAAEtI,GAAIiV,GACpB,EAoBD,OACE,gBAACsnB,GAAA,EAAD,CACExU,UAAWH,EAAQwS,UACnBnO,QAASA,EACT9d,MAAO,CAAEqnD,cAAe,WACxB,2BAAmBx1D,EAAnB,QACA4R,IAAI,MACJ5R,GAAIA,GAEJ,gBAACw8B,GAAA,EAAD,KACE,gBAAC,KAAD,CAASjR,MAAOjX,GAASa,IACvB,4BAAOJ,KAGX,gBAACmkB,EAAA,EAAD,CAAQgtC,QAAM,EAACC,aAAa,MAC1B,gBAAC3pC,GAAA,EAAD,CAAW,aAAYx8B,GACrB,gBAAC,KAAD,CAASurB,MAAOvrB,GACd,4BAAOwX,GAAcxX,OAI3B,gBAACk5B,EAAA,EAAD,CAAQgtC,QAAM,EAACC,aAAa,MAC1B,gBAAC3pC,GAAA,EAAD,CAAWruB,MAAO,CAAEi4D,UAAW,aAAe,aAAYnxD,GACvDhM,EACC,gCACGm8C,GAAan8C,aAAD,EAACA,EAASlB,MAAM+rB,KAD/B,KACiD7qB,EAAQ+B,MAGzD,gCACE,gBAACq7D,GAAA,EAAD,CAAclzC,SAAS,YADzB,KAGGle,EACC,gCACE,4BAAOuC,GAAcvC,KAGvB,yCAKR,gBAACunB,GAAA,EAAD,CAAWruB,MAAO,CAAEi4D,UAAW,aAAe,aAAY99D,EAAI0C,MAC5D,gBAAC,KAAD,CAAsBmoB,SAAS,YADjC,KAEe7qB,EAAI0C,MAEnB,gBAACwxB,GAAA,EAAD,CACEruB,MAAO,CAAEm1B,QAAS,GAClB,aAA2B,QAAftuB,EAAuB,MAAvB,UAAkCjB,EAAlC,QAEZ,gBAACuyD,GAAA,EAAD,CACEv+C,UAAWH,EAAQ2+C,KACnB1wD,MAAsB,QAAfb,EAAuB,MAAvB,UAAkCjB,EAAlC,OACP8X,OAAQA,EACRi6C,WAAYA,EACZzvB,SAAU2vB,MAIhB,gBAAC9sC,EAAA,EAAD,CAAQstC,MAAI,EAACL,aAAa,MACxB,gBAAC3pC,GAAA,EAAD,KACE,gBAAC8pC,GAAA,EAAD,CACEtmE,GAAIA,EACJ+nB,UAAWH,EAAQ2+C,KACnB1wD,MAAOvN,EAAI0C,KACX6gB,OAAQA,EACRi6C,WAAYA,EACZzvB,SAAU2vB,MAMrB,CAiBDJ,GAAQviC,aAAe,CACrBpuB,UAAW,KACXH,SAAU,KACVK,WAAY,KACZlM,QAAS,MAGX,UAAempB,EAAAA,GAAAA,IApJA,SAAA1qB,GAAK,MAAK,CACvB6+D,KAAM,CACJrmC,YAAax4B,EAAM4f,QAAQ,GAC3B4a,OAAQx6B,EAAM4f,QAAQ,IAExB8S,UAAW,CACTC,OAAQ,WAEV0rC,KAAM,CACJ9zC,MAAOvqB,EAAM4qB,QAAQgI,UAAUrH,MATf,GAoJc,CAChCQ,WAAW,EACXzoB,KAAM,OAFR,CAGG46D,I,2rCC/FH,IAAM1+C,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC++D,QAAS,CACPh3B,uBAAwB,EACxBC,wBAAyB,GAE3Bg3B,UAAW,CACTxkC,OAAQ,GAEVykC,gBAAiB,CACfzkC,OAAQ,EACRuN,uBAAwB,EACxBC,wBAAyB,GAE3Bk3B,KAAM,CACJvsC,OAAQ,QAEVksC,KAAM,CACJrmC,YAAax4B,EAAM4f,QAAQ,GAC3B4a,OAAQx6B,EAAM4f,QAAQ,IACtB+S,OAAQ,QAEVxO,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3C4zC,OAAQ,CACN51D,SAAU,YAEZsa,MAAO,CACLwU,WAAYr4B,EAAM4f,QAAQ,GAC1B+a,KAAM,EACN1K,WAAYjwB,EAAMkwB,WAAWC,SAC7B1E,SAAU,QAEZ2zC,QAAS,CACP,iCAAkC,CAChC5iB,WAAY,SACZv4B,UAAWjkB,EAAM4f,QAAQ,GACzBsE,aAAclkB,EAAM4f,QAAQ,KAGhC+K,QAAS,CACPJ,MAAOvqB,EAAM4qB,QAAQD,QAAQY,KAC7BK,YAAa5rB,EAAM4f,QAAQ,IA1CG,IA8ClC,SAASy/C,GAAT,GAAwC,IAApB5gD,EAAoB,EAApBA,QAASyB,EAAW,EAAXA,QACnBszB,EAA+B/0B,EAA/B+0B,SAAU8rB,EAAqB7gD,EAArB6gD,MAAOzR,EAAcpvC,EAAdovC,UACzB,OAAIyR,GAAS9rB,EAET,gBAAC,KAAD,KACE,4BACE8rB,GAAS9rB,IACT,gBAAC,IAAD,KACE,gBAACyI,GAAA,EAAD,CAASxwB,SAAS,UAAUpL,UAAWH,EAAQyK,UADjD,gCAEgC3e,GAC5B6hD,EACA,YACC,IALL,eAMc,0BAAKyR,GAAS,qBAO7B,2BACR,CAED,IAAMC,GAAa5+C,EAAAA,YAAiB,SAAoBqL,EAAOoS,GAC7D,OAAO,gBAACohC,GAAA,EAAD,IAAO70B,UAAU,KAAKvM,IAAKA,GAASpS,GAC5C,IAED,SAASyzC,GAAT,GAA6C,IAAlBt3D,EAAkB,EAAlBA,IAAKu3D,EAAa,EAAbA,UACxBz/D,GAAWmjB,EAAAA,EAAAA,MACXqyB,EAAkB7uC,GACxB,OACE,gBAAC,KAAD,CACEtO,GAAG,4BACHurB,MAAK,uBAAkB67C,EAAlB,kBACL3pC,UAAU,QAEV,gBAAC,KAAD,CACErmB,KAAMjK,KAAKC,UAAUyC,EAAIu3D,GAAY,KAAM,GAC3CtpB,OAAQ,SAAC1mC,EAAM0yB,GACbniC,EACEw1C,EAAgB,UAAD,OACHiqB,EADG,kBAEbt9B,EAAS,UAAY,UAG1B,GAED,gBAACpQ,EAAA,EAAD,CAAYzN,QAAS,SAAA7rB,GAAC,OAAIA,EAAEqS,iBAAN,GACpB,gBAAC40D,GAAA,EAAD,CAAcl0C,SAAS,YAKhC,CAED,SAASm0C,GAAT,GAA0D,IAAtC10D,EAAsC,EAAtCA,KAAMpB,EAAgC,EAAhCA,MAAO9J,EAAyB,EAAzBA,MAAOoqB,EAAkB,EAAlBA,QAASvG,EAAS,EAATA,MACzC3D,EAAUV,KAEhB,OACE,gBAAC,KAAD,CACEmjC,YAAU,EACVz3C,KAAMA,EACNkf,QAASA,EACTy1C,oBAAqBN,IAErB,gBAACnc,EAAA,EAAD,CAAQ/iC,UAAWH,EAAQi/C,QACzB,gBAAC9kC,EAAA,EAAD,KACE,gBAACrI,EAAA,EAAD,CACE8tC,KAAK,QACLv1C,MAAM,UACNhG,QAAS6F,EACT,aAAW,SAEX,gBAAC21C,GAAA,EAAD,OAEF,gBAAC,IAAD,CAAYz7C,QAAQ,KAAKjE,UAAWH,EAAQ2D,OACzCA,GAEH,gBAAC,KAAD,CAAQ2G,WAAS,EAACD,MAAM,UAAUhG,QAAS6F,GAA3C,WAKJ,uBACE3jB,MAAO,CACLma,SAAU,EACVrX,SAAU,WACV46B,OAAQ,SAGV,gBAAC,MAAD,CACE/+B,KAAK,OACL46D,OAAK,EACLv5D,MAAO,CACL8C,SAAU,WACVg1C,KAAM,EACN3jB,MAAO,EACP0jB,IAAK,EACLziB,OAAQ,GAEV8uB,YAAa,CAAEC,gBAAiBC,KAChCvnD,KAAK,UACLtD,MAAOA,EACPs4B,MAAM,OACN6L,OAAO,OACPkyB,SAAU,EACV9L,UAAQ,EACRe,aAAW,EACXhB,iBAAiB,EACjBxgD,MAAOA,EAAQrE,KAAKC,UAAUoE,EAAO,KAAM,GAAK,gBAKzD,CA2cD,SAASm2D,GAAT,GAA2D,IAApCr/D,EAAoC,EAApCA,IAAKW,EAA+B,EAA/BA,QAASkd,EAAsB,EAAtBA,QAASyhD,EAAa,EAAbA,UAM5C,OACE,gBAACrrC,GAAA,EAAD,CAAU,uBAAej0B,EAAI0C,KAAnB,QAA+B8uB,KAAK,OAC5C,gBAAC0C,GAAA,EAAD,KACE,gBAACmG,GAAA,EAAD,CAAgBxP,SAAS,YAD3B,KAEelqB,EAAQ+B,MAEvB,gBAACwxB,GAAA,EAAD,KACE,4BAAOrvB,KAAKC,UAAUnE,EAAQyxC,YAEhC,gBAACle,GAAA,EAAD,KACE,gBAAC,KAAD,CAAQvQ,QAfd,SAA4B7rB,GAC1BA,EAAEqS,kBACFm1D,EAAUt/D,EAAK6d,EAChB,GAaQ7d,EAAI0C,KADP,IAEE,gBAAC+xD,GAAA,EAAD,QAKT,CAED,SAAS8K,GAAT,GAAiD,IAA5B16C,EAA4B,EAA5BA,KAAMhH,EAAsB,EAAtBA,QAASyhD,EAAa,EAAbA,UAClC,KAAgCv/C,EAAAA,SAAe,MAA/C,GAAOyY,EAAP,KAAiBC,EAAjB,KAMMC,EAAc,WAClBD,EAAY,KACb,EAOD,OACE,gBAACxE,GAAA,EAAD,CAAU,aAAW,oBAAoBzC,KAAK,OAC5C,gBAAC0C,GAAA,EAAD,CAAW,aAAW,MACpB,gBAAC6pC,GAAA,EAAD,CAAclzC,SAAS,YADzB,SAIA,gBAACqJ,GAAA,EAAD,KACE,4BAAO,eAET,gBAACA,GAAA,EAAD,KACE,gBAAC,KAAD,CACE,gBAAc,cACd,gBAAc,OACdvQ,QA1BY,SAAA+N,GAClB+G,EAAY/G,EAAMyI,cACnB,GAqBK,cAOA,gBAAC,KAAD,CACEziC,GAAG,cACH8gC,SAAUA,EACV+B,aAAW,EACXjwB,KAAMwb,QAAQ0S,GACdhP,QAASkP,GAER7T,EAAKttB,KAAI,SAAA4kD,GAAC,OACT,gBAAC5L,GAAA,EAAD,CAAUthC,IAAKktC,EAAEzkD,GAAIisB,QAAS,kBA9Bb3jB,EA8BsCm8C,EA7B/DzjB,SACA4mC,EAAUt/D,EAAK6d,GAFU,IAAA7d,CA8Ba,GAC3Bm8C,EAAEz5C,KADL,IAEE,gBAAC+xD,GAAA,EAAD,MAHO,MAUpB,CAED,SAthBA,YAA+C,IAAnBppC,EAAmB,EAAnBA,gBACpB/L,EAAUV,KACVxf,GAAQyyD,EAAAA,EAAAA,KACR5nD,GAAUkY,EAAAA,EAAAA,MACV9iB,GAAWmjB,EAAAA,EAAAA,MACXxb,GAAS45B,EAAAA,EAAAA,MAEf,MAAkCxQ,EAAAA,EAAAA,UAAS7wB,KAAKC,OAAhD,GAAO+wD,EAAP,KAAoB0B,EAApB,KACA,MAA8C7hC,EAAAA,EAAAA,WAAS,GAAvD,GAAOovC,EAAP,KAAwBC,EAAxB,KACA,MAA0CrvC,EAAAA,EAAAA,WAAS,GAAnD,GAAOsvC,EAAP,KAAsBC,EAAtB,KAEMhzD,EAAY3F,EAAOtP,GAEzB,MAA2B+qB,EAAAA,EAAAA,KACzB,SAAAC,GAAK,MAAI,CAACA,EAAMiD,SAASc,UAAW/D,EAAMiD,SAAS3iB,MAA9C,GAD+B,KAAtC,GAAOyjB,EAAP,KAAkBzjB,EAAlB,KAKA,GAAIA,EAAO,MAAMA,EAEjB,IAAMwjD,GAAc/jC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmD,KAAKY,SAAf,IAC/B5I,GAAU4E,EAAAA,EAAAA,KACd,SAAAC,GAAK,OAAIA,EAAMiD,SAASvB,MAAMzX,IAAc,CAAC,CAAxC,GADoB,KAIrByZ,GAAW3D,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0D,SAAShC,KAAnB,GAAN,KACtBkpC,GAAW7qC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmC,KAAKT,KAAf,GAAN,KACtBS,EAAO,IAAOyoC,GAEdsS,GAAgBn9C,EAAAA,EAAAA,KACpB,SAAAC,GAAK,O7EpHF,SAAsBA,EAAO5Y,GAClC,OAAKA,EAEE,IAAO4Y,EAAMmD,KAAKzB,OACtB1c,QAAO,qBAAGiF,YAA8B7C,EAAQpS,EAAzC,IACPoR,MAAK,SAACse,EAAGC,GAAJ,OAAUA,EAAE9a,WAAa6a,EAAE7a,UAA3B,IACLhV,KAAI,SAAA8I,GACH,IAAMM,EAAU+hB,EAAM0D,SAAShC,MAAM/jB,EAAIM,SAGzC,OAAIN,EAAIM,UAAYA,EACX,KAAKN,EAAK,WAEZ,SAAKA,GAAZ,IAAiBM,QAAAA,GAClB,IACApJ,KAAI,SAAA8I,GAAG,gBAAUA,GAAV,IAAeL,IAAK0iB,EAAMmC,KAAKT,MAAM/jB,EAAIL,MAAzC,IAdW,EAetB,C6EoGY6/D,CAAan9C,EAAO7E,EAAxB,GAD0B,KAK3BgI,EAAO+5C,EAAcroE,KAAI,SAAA8I,GAAG,OAChC+L,GAAiB,CACf/L,IAAAA,EACAM,QAASylB,EAAS/lB,EAAI8lB,WACtBnmB,IAAKstD,EAASjtD,EAAI6M,QAAU,CAAC,GAJC,IAa5B8Y,GALmBvD,EAAAA,EAAAA,KACvB,SAAAC,GAAK,OAAIqD,GAAgBrD,EAAO7E,EAA3B,GAD6B,KAKHnW,QAAO,gBAAG/G,EAAH,EAAGA,QAASX,EAAZ,EAAYA,IAAZ,OAAsBW,GAAWX,CAAjC,IAIlC2yD,IAFOlwC,EAAAA,EAAAA,IAAY+F,GAAD,MAAgC,CAAC,GAElCppB,MAoBjB0gE,EAAc,SAAC9/D,EAAK6d,GACxBo0C,EAAW1yD,KAAKC,OAChBH,EAASw0C,GAAU7zC,EAAK6d,GACzB,EAqCD,IAnCAkF,EAAAA,EAAAA,YAAU,WACR1jB,EAASg4B,GAAa,UACtBrU,SAASC,MAAQ,6BACjBgvC,EAAW1yD,KAAKC,MACjB,GAAE,CAACH,KAEJ0jB,EAAAA,EAAAA,YAAU,WACR,SAAS0kC,EAAiB/iD,GACxButD,EAAW1yD,KAAKC,OAChBH,EAAS80C,GAAWzvC,GACrB,CAEDrF,EAASy8B,GAAUzQ,IACnBhsB,EAASi1C,GAAcjpB,IACvB,IAAMoW,EAAepiC,EACnB0+B,GAAY,QAAD,OAAS1S,EAAgB3zB,IAAM,CACxCwwD,IAAKT,EACL/lB,QAAS+lB,KAIb,OAAO,WACDhmB,GACFA,GAEH,CACF,GAAE,CAACpW,EAAiBhsB,KAErB0jB,EAAAA,EAAAA,YAAU,WACJpW,GAAa0e,IACfhsB,EAAS4zC,GAAiBtmC,IAC1BtN,EAASy0C,GAAS,CAAEnnC,UAAAA,EAAW2X,UAAW+G,EAAgB3zB,MAE7D,GAAE,CAACiV,EAAW0e,EAAiBhsB,IAE5BonB,EACF,OAAO,gBAAC,GAAD,CAAQ/G,KAAK,UAAUP,MAAI,IAGpC,IAAM4gD,EAAU,SAAC72D,EAAOmiB,GACtB,OAAIniB,EAEA,gBAAC,MAAD,CACE6gD,YAAa,CAAEC,gBAAiBC,KAChCzlD,KAAK,OACL9B,KAAK,SACLtD,MAAOuzD,GAAavzD,EAAM4qB,QAAQ87B,WAClCpuB,MAAM,OACN+9B,SAAU,EACVC,SAAU,GACV/L,UAAQ,EACRe,aAAW,EACXhB,iBAAiB,EACjBxgD,MAAOrE,KAAKC,UAAUoE,EAAO,KAAM,KAKvC,gBAAC,IAAD,KACE,gBAACmyC,GAAA,EAAD,CAASxwB,SAAS,UAAUpL,UAAWH,EAAQyK,UAC7CsB,SAAAA,EAAiB20C,eAEf,4BADA,qFAIT,EAED,OACE,gBAAC,GAAD,CAAe7gD,MAAI,GACjB,gBAAC,KAAD,CAAMM,UAAWH,EAAQ6+C,SACvB,gBAAC,KAAD,CACEl7C,MACE,wBAAMvrB,GAAG,gBAAgB,aAAW,iBAApC,WACU,4BAAOmmB,EAAQnmB,KAG3Bm8B,UAAS,UAAKhW,EAAQlZ,OAAb,gCAA2CyG,GAClDyS,EAAQtR,WACR,aAEFgX,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAAC08C,GAAA,EAAD,OAGJ3yD,OACE,4BACE,gBAAC,KAAD,CAAS2V,MAAM,OAAOkS,UAAU,QAC9B,gBAAC/D,EAAA,EAAD,CACE15B,GAAG,eACHisB,QAAS,SAAA7rB,GAAC,OACRiS,GnF9Ob,SAAgC7J,EAAS2d,GAC9C,MAAO,GAAP,OAAUF,GAAoBzd,GAA9B,YAA0C2d,EAAQnmB,GAAlD,QACD,CmF6OqBwoE,CAAuB70C,EAAiBxN,GACxC5T,EAFFF,CAGEjS,EAJM,GAOV,gBAACw8D,GAAA,EAAD,CAAUzpC,SAAS,cAGtBhN,EAAQ+0B,WAAa,IAAQ/0B,EAAQ+0B,SAAU/0B,EAAQjZ,MACtD,gBAAC,KAAD,CACEqe,MAAM,yCACNkS,UAAU,QAEV,gBAAC/D,EAAA,EAAD,CAAYzN,QAAS,kBAAMtkB,EjC3JtC,SAAwBwe,GAS7B,OARAA,EAAQjZ,KAAOiZ,EAAQ+0B,SAEI,iBAAhB/0B,EAAQjZ,OACjBiZ,EAAQjZ,KAAOC,KAAKkI,MAAM8Q,EAAQjZ,OAGpCiZ,EAAQ6gD,MAAQ,wBAETprB,GAAcz1B,EACtB,CiCiJqDsiD,CAAetiD,GAA9B,GACnB,gBAACuiD,GAAA,EAAD,QAGF,KACJ,gBAAC,KAAD,CAASn9C,MAAM,mBAAmBkS,UAAU,QAC1C,gBAAC/D,EAAA,EAAD,CACE15B,GAAG,WACH01B,UAAWvP,EAAQQ,OACnBsF,QAAS,SAAA7rB,GAAC,OACRiS,GnFvPb,SAAuC7J,EAAS2d,GACrD,MAAO,GAAP,OAAUF,GAAoBzd,GAA9B,YAA0C2d,EAAQQ,OACnD,CmFsPqBgiD,CAA8Bh1C,EAAiBxN,GAC/C5T,EAFFF,CAGEjS,EAJM,GAOV,gBAACk4D,GAAA,EAAD,QAGJ,gBAAC,KAAD,CAAS/sC,MAAM,eAAekS,UAAU,QACtC,gBAAC/D,EAAA,EAAD,CACE15B,GAAG,OACH01B,UAAWvP,EAAQM,OACnBwF,QAAS,SAAA7rB,GAAC,OACRiS,GnFzQb,SAAuC7J,EAAS2d,GACrD,MAAO,GAAP,OAAUF,GAAoBzd,GAA9B,YAA0C2d,EAAQM,OACnD,CmFwQqBmiD,CAA8Bj1C,EAAiBxN,GAC/C5T,EAFFF,CAGEjS,EAJM,GAOV,gBAACm4D,GAAA,EAAD,WAMV,gBAACwO,GAAD,CAAU5gD,QAASA,EAASyB,QAASA,KAEvC,gBAAC,KAAD,CAAWmjC,UAAW,EAAGhjC,UAAWH,EAAQ8+C,WAC1C,gBAAC,KAAD,CACEx3B,WAAY,gBAACC,GAAA,EAAD,MACZpnB,UAAWH,EAAQk/C,SAEnB,gBAAC,IAAD,CAAY/+C,UAAWH,EAAQmyC,SAA/B,mBAEE,gBAAC,KAAD,CACExuC,MACE,sIAKFkS,UAAU,QAEV,gBAAChB,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,uBAAKhlB,MAAO,CAAEma,SAAU,KACxB,gBAAC6+C,GAAD,CAAiBt3D,IAAKsW,EAASihD,UAAW,YAC1C,gBAAC,KAAD,CAAS77C,MAAM,oCACb,gBAACmO,EAAA,EAAD,CAAYzN,QA5LE,SAAA7rB,GACtBA,EAAEqS,kBACFs1D,GAAmB,EACpB,EAyL+CtgC,KAAK,SACzC,gBAACijB,GAAA,EAAD,SAIN,gBAAC,KAAD,CAAkBv8C,MAAO,CAAEm1B,QAAS,IACjC+kC,EAAQliD,aAAD,EAACA,EAASpa,QAAS4nB,KAG/B,gBAAC,KAAD,CAAWo3B,UAAW,EAAGhjC,UAAWH,EAAQ++C,iBAC1C,gBAAC,KAAD,CACEz3B,WAAY,gBAACC,GAAA,EAAD,MACZpnB,UAAWH,EAAQk/C,SAEnB,gBAAC,IAAD,CAAY/+C,UAAWH,EAAQmyC,SAA/B,gBAEE,gBAAC,KAAD,CACExuC,MACE,qIAKFkS,UAAU,QAEV,gBAAChB,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,uBAAKhlB,MAAO,CAAEma,SAAU,MACvBnC,aAAA,EAAAA,EAASjZ,OACR,gCACE,gBAACi6D,GAAD,CAAiBt3D,IAAKsW,EAASihD,UAAU,SACzC,gBAAC,KAAD,CAAS77C,MAAM,gCAAgCkS,UAAU,QACvD,gBAAC/D,EAAA,EAAD,CAAYzN,QApNJ,SAAA7rB,GACpBA,EAAEqS,kBACFw1D,GAAiB,EAClB,EAiNiDxgC,KAAK,SACvC,gBAACijB,GAAA,EAAD,UAMV,gBAAC,KAAD,CAAkBv8C,OAAOgY,aAAA,EAAAA,EAASjZ,OAAQ,CAAEo2B,QAAS,IAClD+kC,EAAQliD,aAAD,EAACA,EAASjZ,KAAMymB,KAG5B,2BACA,gBAAC,KAAD,KACE,gBAAC,KAAD,KACE,gBAAC,IAAD,KACE,+CACA,gBAAC,KAAD,CACEpI,MACE,mKAIE,2BACA,2BALF,kHAUFkS,UAAU,QAEV,gBAAChB,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,gBAACkJ,GAAA,EAAD,CACEwsC,QAAS,EACTjsC,MAAO,EACP6K,KAAK,QACL,aAAW,2BAEX,gBAACnL,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAU,aAAW,+BAA+BzC,KAAK,OACvD,gBAAC0C,GAAA,EAAD,gBACA,gBAACA,GAAA,EAAD,iBACA,gBAACA,GAAA,EAAD,cAGJ,gBAACE,GAAA,EAAD,KACGpO,EAAQxW,OAAS,EAChBwW,EAAQzuB,KAAI,SAAA+oD,GAAK,OACf,gBAAC+e,GAAD,IACEpwD,IAAKqxC,EAAMtgD,IAAItI,IACX4oD,EAFN,CAGEziC,QAASA,EACTyhD,UAAW,SAACt/D,EAAK6d,GAAN,OACTxe,EAASw0C,GAAU7zC,EAAK6d,GADf,IALE,IAWjB,gBAACoW,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAWm9B,QAAS,GAClB,gBAAC,IAAD,KACE,0BACE,iGASV,gBAACkO,GAAD,CACEtwD,IAAI,SACJ4O,QAASA,EACTgH,KAAMA,EACNy6C,UAAW,SAACt/D,EAAK6d,GAAN,OAAkBxe,EAASw0C,GAAU7zC,EAAK6d,GAA1C,QAMrB,2BACA,gBAAC,KAAD,KACE,gBAAC,KAAD,KACE,gBAAC,IAAD,KACE,6CACA,gBAAC,KAAD,CACEoF,MACE,+GAKFkS,UAAU,QAEV,gBAAChB,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,gBAACkJ,GAAA,EAAD,CACEwsC,QAAS,EACTjsC,MAAO,EACP6K,KAAK,QACL,aAAW,yBAEX,gBAACnL,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAU,aAAW,8BACnB,gBAACC,GAAA,EAAD,mBACA,gBAACtD,EAAA,EAAD,CAAQgtC,QAAM,EAACC,aAAa,MAC1B,gBAAC3pC,GAAA,EAAD,gBAEF,gBAACtD,EAAA,EAAD,CAAQgtC,QAAM,EAACC,aAAa,MAC1B,gBAAC3pC,GAAA,EAAD,gBACA,gBAACA,GAAA,EAAD,aAEF,gBAACA,GAAA,EAAD,iBAGJ,gBAACE,GAAA,EAAD,KACE,gBAAC,GAAD,CACEl0B,QAASmrB,EACTklC,YAAaA,IAEd/J,GACC,gBAACvyB,GAAA,EAAD,CAAUxU,UAAWH,EAAQg/C,MAC3B,gBAACpqC,GAAA,EAAD,KACE,gBAACzT,GAAA,EAAD,OAEF,gBAACmQ,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,KACE,gBAACzT,GAAA,EAAD,OAEF,gBAACyT,GAAA,EAAD,KACE,gBAACzT,GAAA,EAAD,OAEF,gBAACyT,GAAA,EAAD,KACE,gBAACzT,GAAA,EAAD,QAGJ,gBAACyT,GAAA,EAAD,KACE,gBAAC8pC,GAAA,EAAD,CAAMv+C,UAAWH,EAAQ2+C,SAId,IAAhBp4C,EAAKrW,SAAiBg3C,GACrB,gBAACvyB,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAWm9B,QAAS,GAClB,gBAAC,IAAD,8CAILxrC,EAAKrW,OAAS,IACZg3C,GACD3gC,EAAKtuB,KAAI,SAAA8I,GAAG,OACV,gBAAC,GAAD,MACMA,EADN,CAEE4O,IAAK5O,EAAI3I,GACT6lE,QAASuC,EACTn8C,QAAS5Z,GAAOiU,GAAYqN,EAAiBhrB,GAAM4J,KAL3C,QAYtB,gBAAC+0D,GAAD,CACE/7C,MAAK,UAAKpF,EAAQnmB,GAAb,YACL4S,KAAMk1D,EACNh2C,QAhYkB,WACtBi2C,GAAmB,EACpB,EA+XKv2D,MAAO2U,EAAQpa,QACfrE,MAAOuzD,GAAavzD,EAAM4qB,QAAQ87B,aAEpC,gBAACkZ,GAAD,CACE/7C,MAAK,UAAKpF,EAAQnmB,GAAb,SACL4S,KAAMo1D,EACNl2C,QA9XgB,WACpBm2C,GAAiB,EAClB,EA6XKz2D,MAAO2U,EAAQjZ,KACfxF,MAAOuzD,GAAavzD,EAAM4qB,QAAQ87B,aAIzC,E,66EC9pBD,SAAS0a,GAAWC,GAClB,MAAO,CACLz5D,OAAQnC,KAAKC,UACX,CACEtC,IAAKi+D,EACL97D,OAAQ,OACRlB,QAAS,CAAC,EACVuD,OAAQ,CAAC,EACTxC,KAAM,OACNkkB,KAAM,CACJ0a,SAAU,UACVpzB,SAAU,gBAEZpL,KAAM,CACJo4B,KAAM,SAIV,KACA,GAEF36B,SAAU,KACVq+D,SAAS,EAEZ,CAED,SAASC,GAAT,GAAoE,IAAtCr2D,EAAsC,EAAtCA,KAAMkf,EAAgC,EAAhCA,QAASmpC,EAAuB,EAAvBA,UAAW8N,EAAY,EAAZA,SACtD,MAA0BrwC,EAAAA,EAAAA,UAASowC,GAAWC,IAA9C,GAAO/9C,EAAP,KAAcwsB,EAAd,MAEAnsB,EAAAA,EAAAA,YAAU,WACRmsB,EAASsxB,GAAWC,GACrB,GAAE,CAACA,IAEJ,IAAMrhE,GAAQyyD,EAAAA,EAAAA,KAMN7qD,EAA8B0b,EAA9B1b,OAAQ05D,EAAsBh+C,EAAtBg+C,QAASr+D,EAAaqgB,EAAbrgB,SAEzB,EAA+BA,GAAY,CAAC,EAApCC,EAAR,EAAQA,OAAQC,EAAhB,EAAgBA,WAEV0yB,GAAWnoB,GAAU9F,GAiC3B,OACE,gBAAC,KAAD,CAAQsD,KAAMA,EAAMkf,QAASA,EAAS6O,SAAS,MAC7C,gBAAC,KAAD,0BACA,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAYlD,UAAU,KAAtB,2JAIE,qBACEvR,KAAK,yDACLC,OAAO,SACP0b,IAAI,uBAHN,sBAJF,KAaA,2BACA,gBAAC,IAAD,KACE,mDAEF,gBAAC,MAAD,CACEwqB,YAAa,CAAEC,gBAAiBC,KAChCvnD,KAAK,SACL8B,KAAK,aACLib,UAAU,UACVrgB,MAAOuzD,GAAavzD,EAAM4qB,QAAQ87B,WAClCpuB,MAAM,OACN+9B,SAAU,EACVC,SAAU,IACVhL,aAAW,EACXhB,iBAAiB,EACjBxgD,MAAOlC,EACP2yB,SA1EmB,SAAAzwB,GACzBgmC,EAAS,SAAKxsB,GAAN,IAAa1b,OAAQkC,IAC9B,IA0EM+rB,EACC,gBAAC,IAAD,CAAYvR,QAAQ,YAAYiG,MAAM,SACpC,gBAACwgB,GAAA,EAAD,CAAkBtf,SAAS,YAD7B,8FAKA,2BAEF,2BACC61C,GACC,gBAAC,IAAD,KACE,kDAGHr+D,IAAaq+D,GACZ,2BACE,gBAAC,IAAD,KACE,sCAEF,gBAAC,MAAD,CACEx3D,MAAOrE,KAAKC,UAAU,CAAExC,OAAAA,EAAQC,WAAAA,GAAc,KAAM,GACpDkd,UAAU,UACVjb,KAAK,aACLkxD,SAAU,IACVhL,aAAW,EACXhB,iBAAiB,EACjBtqD,MAAOuzD,GAAavzD,EAAM4qB,QAAQ87B,WAClCpuB,MAAM,OACNiyB,UAAQ,MAKhB,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEhgC,MAAM,UACNhG,QAtGY,WAClBurB,EAASsxB,GAAWC,GACrB,EAqGOrzC,SAAU,IAAQ1K,EAAO89C,GAAWC,KAHtC,SAOA,gBAAC,KAAD,CACE92C,MAAM,YACNyD,UAAWpmB,GAAU05D,GAAWzrC,EAChCtR,QAAS,kBA1GM,EA0Gc9e,KAAKkI,MAAM/F,GA1GvBxE,EAAyC,EAAzCA,IAAKoC,EAAoC,EAApCA,KAAMnB,EAA8B,EAA9BA,QAAYm9D,EAAkB,SAChE1xB,EAAS,SAAKxsB,GAAN,IAAag+C,SAAS,UAC9Bn8D,MAAM/B,EAAD,GAAC,MACDo+D,GADA,IAEHn9D,QAAS,SACJA,GADE,IAELC,OAAQ,mBACR,eAAgB,qBAElBkB,KAAMC,KAAKC,UAAUF,MAEpBmB,KATH,6CASQ,WAAM1D,GAAN,gFACJ6sC,EAAS,SACJxsB,GADG,IAENrgB,SAAAA,EACAq+D,SAAS,KAJP,2CATR,uDAgBGx6D,MAhBH,6CAgBS,WAAM7D,GAAN,gFACL6sC,EAAS,SACJxsB,GADG,IAENrgB,SAAAA,EACAq+D,SAAS,KAJN,2CAhBT,uDAFoB,IAAC,EAAEl+D,EAAKoC,EAAMnB,EAAYm9D,CA0G/B,GAHX,SAME,gBAACC,GAAA,EAAD,QAKT,CASDF,GAAmB5lC,aAAe,CAChC43B,UAAW,MAGb,YClLe,SAASmO,GAAT,GAQZ,IAPDx2D,EAOC,EAPDA,KACAkf,EAMC,EANDA,QACAu3C,EAKC,EALDA,UACAzzD,EAIC,EAJDA,OACAmuD,EAGC,EAHDA,MACAuF,EAEC,EAFDA,YACAC,EACC,EADDA,WAEMC,EAAe5zD,EAAO6zD,OAAO,GAAGr5B,cAAgBx6B,EAAOU,MAAM,GAE7D3H,EAAc,CAClB+6D,OACE,gNAMFC,UAAW,CACTx7C,KAAM,+FACNy7C,SACE,4QAUAC,EAAoB,aAAVj0D,GAAkC,QAATmuD,EAEnC+F,EACJ,4WASIC,EACJ,+HAEoBn0D,EAFpB,mBAE4CmuD,EAF5C,yBAGGA,EAHH,wGAQF,OACE,gBAAC,KAAD,CAAQnxD,KAAMA,EAAMkf,QAASA,GAC3B,gBAAC,KAAD,KACG03C,EADH,IACkBzF,EADlB,qBAGA,gBAAC,KAAD,KACE,gBAACzuC,GAAA,EAAD,KACG90B,OAAOD,KAAK+oE,GACVt5D,QAAO,SAAAtE,GAAC,OAAK,CAAC,UAAW,OAAQ,aAAauyB,SAASvyB,EAA/C,IACR7L,KAAI,SAAA6L,GACH,OACE,gBAAC+pB,GAAA,EAAD,CAAUle,IAAK7L,GACb,gBAACkqB,GAAA,EAAD,KACGlqB,EADH,MAEE,4BAAO49D,EAAY59D,IAAM,QAIhC,KAEL,gBAAC0mC,GAAA,EAAD,KACE,mDACyB2xB,EADzB,OACoCnuD,EADpC,KAC6C,yBAAI2zD,GAAgB,KAEjE,gBAAC,KAAD,CAASh+C,MAAOs+C,EAAUC,EAAaC,GACrC,gBAACttC,GAAA,EAAD,CAAMtJ,SAAS,cAGnB,gBAACif,GAAA,EAAD,wBACmB2xB,EADnB,kCACyD,IACtDp1D,EAAYiH,GAAQmuD,IAAUp1D,EAAYiH,GAF7C,MAKF,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQqc,MAAM,UAAUhG,QAAS6F,GAAjC,UAGA,gBAAC,KAAD,CAAQG,MAAM,UAAUhG,QAASo9C,GAC9BG,EADH,IACkBzF,IAKzB,C,yrDCtGc,SAASiG,GAAWt2C,GACjC,IAAQ9L,EAAyC8L,EAAzC9L,QAASqiD,EAAgCv2C,EAAhCu2C,cAAelsC,EAAiBrK,EAAjBqK,MAAOmsC,EAAUx2C,EAAVw2C,MAEvC,MAAmDxxC,EAAAA,EAAAA,UAASqF,EAAMosC,WAAlE,GAAOC,EAAP,KAA0BC,EAA1B,KACA,MAA+C3xC,EAAAA,EAAAA,UAASqF,EAAM4e,SAA9D,GAAO2tB,EAAP,KAAwBC,EAAxB,KACA,MAAsC7xC,EAAAA,EAAAA,UAAS,CAAC,GAAhD,GAAO8xC,EAAP,KAAoBC,EAApB,MAEAp/C,EAAAA,EAAAA,YAAU,WACRo/C,EAAe,CAAC,GAChBJ,EAAsBtsC,EAAMosC,UAC7B,GAAE,CAACpsC,EAAMosC,aAEV9+C,EAAAA,EAAAA,YAAU,WACRo/C,EAAe,CAAC,GAChBF,EAAoBxsC,EAAM4e,QAC3B,GAAE,CAAC5e,EAAM4e,WAEVtxB,EAAAA,EAAAA,YAAU,WACJ++C,GAAsD,iBAAjCA,EAAkB58D,YACzCy8D,EAAc,IACZE,UAC+B,iBAAtBC,EACHA,EACAA,EAAkB72D,eACrBi3D,GAGR,GAAE,CAACJ,KAEJ/+C,EAAAA,EAAAA,YAAU,WACR,GAAoC,kBAAhCi/C,aAAA,EAAAA,EAAiB98D,YAA+B,CAClD,IAAM+G,EACuB,iBAApB+1D,GAAiCA,EAEpCA,EAAgB/2D,cADhB+2D,EAGNL,EAAc,IACZttB,QAASpoC,QAAAA,EAAQ,MACdi2D,GAEN,CACF,GAAE,CAACF,IAYJ,OACE,gCACE,gBAACjxC,GAAA,EAAD,CAAatR,UAAWH,EAAQuxB,aAC9B,gBAAC7f,GAAA,EAAD,mBACA,gBAACogB,GAAA,EAAD,CACEzX,SAAU,SAAA7hC,GACR,IAAQoR,EAAUpR,EAAE+rB,OAAZ3a,MACFmrC,EACJ5e,EAAM2sC,WAAa3sC,EAAMtP,WAAay7C,GAClC,IAAIriE,MAAO0L,cACX,KACN02D,EAAc,CACZU,UAAWn5D,EACX24D,UAAW/2D,GAAS5B,GACpBmrC,QAAAA,GAEH,EACDnrC,MAAOusB,EAAM4sC,WAEb,gBAAC9xB,GAAA,EAAD,CAAUrnC,MAAO,GAAjB,aACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,IAAjB,iBACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,IAAjB,iBACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,IAAjB,iBACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,KAAjB,eACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,KAAjB,gBACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,MAAjB,gBACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,MAAjB,iBACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAO,MAAjB,iBACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAM,SAASkkB,UAAQ,GAAjC,YAKJ,gBAAC,GAAAk1C,EAAD,CAAyBC,MAAOC,GAAAA,GAC9B,gBAAC,KAAD,CACEj1D,MAAM,gBACNkS,UAAWH,EAAQuxB,YACnB3nC,MAAO44D,EACPnoC,SAhDyB,SAAAzwB,GAC/Bi5D,EAAe,CAAEE,UAAW,WAC5BN,EAAsB74D,EACvB,EA8COoC,OAAO,sBACPm3D,iBAAe,EACfC,eAAa,IAEf,gBAAC,KAAD,CACEn1D,MAAM,iBACNo1D,WAAW,aACXljD,UAAWH,EAAQuxB,YACnB3nC,MAAO84D,EACProC,SArDuB,SAAAzwB,GAC7Bi5D,EAAe,CAAEE,UAAW,WAC5BJ,EAAoB/4D,EACrB,EAmDOoC,OAAO,sBACPo3D,eAAa,KAKtB,CClHc,SAASE,GAAUx3C,GAChC,IAAQimC,EAAYjmC,EAAZimC,QAER,OACE,gCACE,gBAACp9B,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAWm9B,QAASA,GAClB,gBAAC,IAAD,qDAOT,C,uCCJKzyC,IAAYC,EAAAA,EAAAA,IAAY,SAAAzf,GAAK,MAAK,CACtC6+D,KAAM,CACJxmC,WAAYr4B,EAAM4f,QAAQ,IAE5Bs/C,KAAM,CACJvsC,OAAQ,QALuB,IAgDnC,SAvCA,SAAqB3G,GACnB,IAAS4mB,EAAuB5mB,EAAvB4mB,QAAS6wB,EAAcz3C,EAAdy3C,UACZvjD,EAAUV,KAChB,OACE,gCACG,KAAMozB,EAAU,GAAG,SAAA9kB,GAAC,OACnB,gBAAC+G,GAAA,EAAD,CAAUxU,UAAWH,EAAQg/C,KAAMrvD,IAAKie,GACtC,gBAACgH,GAAA,EAAD,KACE,gBAACzT,GAAA,EAAD,OAEF,gBAACmQ,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,KACE,gBAACzT,GAAA,EAAD,QAGJ,gBAACmQ,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,CAAWruB,MAAO,CAAEm1B,QAAS,IAC3B,gBAACgjC,GAAA,EAAD,CAAMv+C,UAAWH,EAAQ2+C,SAG5B4E,GACC,gBAACjyC,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,CAAWruB,MAAO,CAAEm1B,QAAS,IAC3B,gBAACgjC,GAAA,EAAD,CAAMv+C,UAAWH,EAAQ2+C,SAI/B,gBAAC/pC,GAAA,EAAD,CAAWruB,MAAO,CAAEm1B,QAAS,IAC3B,gBAAC,KAAD,CAAQ5N,UAAQ,EAAC+R,KAAK,SAAtB,WAEE,gBAAC,KAAD,QAzBa,IAgC1B,ECzDc,SAAS2jC,GAAS13C,GAC/B,IAAQimC,EAAmBjmC,EAAnBimC,QAASruD,EAAUooB,EAAVpoB,MACjB,OACE,gCACE,gBAACixB,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAWm9B,QAASA,GAClB,gBAAC,IAAD,KACmB,iBAATruD,EACJA,EACA,gFAMf,CC4ID,UAAe8mB,EAAAA,GAAAA,IA5IA,SAAA1qB,GAAK,MAAK,CACvB6+D,KAAM,CACJrmC,YAAax4B,EAAM4f,QAAQ,GAC3B4a,OAAQx6B,EAAM4f,QAAQ,GACtB8+C,UAAW,YACXzlC,SAAU,QAEZ/O,QAAS,CACPsQ,OAAQx6B,EAAM4f,QAAQ,IAExB+jD,UAAW,CACT/nC,QAAS,EACT8iC,UAAW,aAEbhsC,UAAW,CACTC,OAAQ,WAEVvG,KAAM,CACJiM,WAAYr4B,EAAM4f,QAAQ,KAE5BgkD,WAAY,CACVppC,OAAQx6B,EAAM4f,QAAQ,KArBN,GA4Ic,CAChCmM,WAAW,EACXzoB,KAAM,OAFR,EAnHA,SAAqB0oB,GACnB,IAAMnhB,GAAUkY,EAAAA,EAAAA,MAGdwB,GAOEyH,EARF8gC,MAQE9gC,EAPFzH,SACAkwB,EAMEzoB,EANFyoB,UACAh2B,EAKEuN,EALFvN,QACAyB,EAIE8L,EAJF9L,QACA2jD,EAGE73C,EAHF63C,WACAC,EAEE93C,EAFF83C,qBACAhjE,EACEkrB,EADFlrB,QAGMxI,EAA8CmmB,EAA9CnmB,GAAI6U,EAA0CsR,EAA1CtR,WAAYpK,EAA8B0b,EAA9B1b,iBAAkB6jB,EAAYnI,EAAZmI,QAEpCm9C,EACJ,4BACGD,GAAwB,gBACJ,MAApB/gE,IAA6B+gE,GAC5B,gBAACziD,GAAA,EAAD,CAAgBhB,UAAWH,EAAQgK,UAEhB,MAApBnnB,IACE+gE,GACD/gE,EAAiB5K,KAAI,SAAA8I,GAAO,MAW1B,OACE,gBAAC,KAAD,CACE4O,IAAK5O,EAAI3I,GACTurB,MACE5iB,EAAIL,IAAJ,oCACiCK,EAAIL,IAAI0C,KADzC,KAEI,uBAGN,gBAACs7D,GAAA,EAAD,CACEv+C,UAAWH,EAAQ2+C,KACnBt6C,QAAStjB,EAAIL,KArBI,SAAAlI,GACrBA,EAAEqS,kBACF84D,EACmB,OAAjB5iE,EAAImM,SACAoR,GAA0B1d,EAAS2d,GACnCG,GAAY9d,EAASG,GACzB4J,EAJFg5D,CAKEnrE,EACH,EAcKyV,OAAO,UAAAlN,EAAIL,WAAJ,eAAS0C,OAAQ,mBACxB6gB,OAAQ,gBAAC,GAAD,CAAc/W,SAAUnM,EAAImM,aAI3C,KAID42D,EAAcp9C,EAChBA,EAAQzuB,KAAI,SAAA+oD,GAAS,YAMnB,OACE,gBAAC,KAAD,CACErxC,IAAG,UAAKvX,EAAL,sBAAW4oD,EAAMtgD,WAAjB,aAAW,EAAW0C,KAAtB,sBAA8B49C,EAAM3/C,eAApC,aAA8B,EAAejJ,IAChDurB,MAAK,wBAASq9B,EAAMtgD,WAAf,aAAS,EAAW0C,KAApB,0BAEL,gBAAC,KAAD,CACE+c,UAAWH,EAAQ0jD,WACnB7jC,KAAK,QACLzb,QAAQ,WACRC,QAdiB,SAAA7rB,GACrBA,EAAEqS,kBACF0pC,EAAUyM,EAAMtgD,IAAK6d,EACtB,GAOG,UAMGyiC,EAAMtgD,WANT,aAMG,EAAW0C,KACZ,gBAAC,KAAD,CAAsBmoB,SAAS,QAAQpL,UAAWH,EAAQkM,QAIjE,IACD,KAEJ,OACE,gBAACyI,GAAA,EAAD,CACEK,OAAK,EACL58B,GAAIA,EACJuX,IAAG,cAASvX,GACZ+nB,UAAWH,EAAQwS,UACnBnO,QAASA,EACT9d,MAAO,CAAEqnD,cAAe,YAExB,gBAACh5B,GAAA,EAAD,KACE,gBAAC,KAAD,CAASjR,MAAOjX,GAASO,IACvB,4BAAOT,GAAUS,MAGrB,gBAACqkB,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,KACE,gBAAC,KAAD,CAASjR,MAAOvrB,GACd,4BAAOwX,GAAcxX,OAI3B,gBAACw8B,GAAA,EAAD,CACEzU,UAAWH,EAAQyjD,UACnBl9D,MAAO,CAAEi4D,UAAW,cAEE,IAArBqF,EAAU3zD,OAAe,MAAQ2zD,GAEpC,gBAACvyC,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,CAAWzU,UAAWH,EAAQyjD,WAAYK,IAIjD,I,ipDCtFD,IAAMC,GAAgB,CACpBjB,UAAW,GACXj8C,UAAW,GACXm9C,aAAc,GACdzB,UAAW/2D,GAAS,KACpBupC,QAAS,KACTguB,UAAW,IACXrwB,QAAS,GACTqB,KAAM,GAGFz0B,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJ0Y,QAAS,OACTmkB,SAAU,OACV37B,SAAU,GAEZ+Z,KAAM,CACJ/Z,SAAU,GAEZzS,MAAO,CACL5E,SAAU,WACVmmC,aAAc,GACd,QAAS,CACPzrB,UAAW,EACX,WAAY,CAAC,EACb,UAAW,CACT4X,OAAQ,GAEVsoC,IAAK,CACH7lB,IAAK,KAIX7M,YAAa,CACXjX,OAAQx6B,EAAM4f,QAAQ,IAExBwkD,YAAa,CACXngD,UAAWjkB,EAAM4f,QAAQ,IAE3BykD,UAAW,CACThsC,WAAYr4B,EAAM4f,QAAQ,IAE5B0kD,WAAY,CACVrgD,UAAWjkB,EAAM4f,QAAQ,IAE3Bi/C,KAAM,CACJrmC,YAAax4B,EAAM4f,QAAQ,GAC3B4a,OAAQx6B,EAAM4f,QAAQ,KAExB2kD,YAAa,CACXrgD,aAAclkB,EAAM4f,QAAQ,IAxCE,IA4ClC,SAAS4kD,GAAcx4C,GACrB,IACEu2C,EAUEv2C,EAVFu2C,cACAriD,EASE8L,EATF9L,QACA9c,EAQE4oB,EARF5oB,IACA6oB,EAOED,EAPFC,gBACAw4C,EAMEz4C,EANFy4C,eACAp9C,EAKE2E,EALF3E,UACAq9C,EAIE14C,EAJF04C,iBACAC,EAGE34C,EAHF24C,cACAC,EAEE54C,EAFF44C,eACAC,EACE74C,EADF64C,cAEF,OACE,gCACE,gBAAC,KAAD,CAAShhD,MAAM,iBACb,gBAACmO,EAAA,EAAD,CACEzN,QAAS,WACPsgD,EAAc,IACdtC,EAAcqC,EACf,EACDvkD,UAAWH,EAAQkkD,aAEnB,gBAAC,KAAD,QAGJ,gBAAC,KAAD,CAAiB10D,KAAMtM,GACrB,gBAAC,KAAD,CAASygB,MAAM,0CACb,gBAACmO,EAAA,EAAD,CAAY15B,GAAG,mBAAmB+nB,UAAWH,EAAQkkD,aACnD,gBAAC,KAAD,SAIN,gBAAC,KAAD,CAASvgD,MAAM,sDACb,gBAACmO,EAAA,EAAD,CAAYzN,QAASmgD,EAAkBrkD,UAAWH,EAAQkkD,aACxD,gBAACU,GAAA,EAAD,QAGJ,gBAAC,KAAD,CACEjhD,MACEoI,EAAgB0H,SACZ,kDACA,kDAGN,wBAAMltB,MAAO,CAAE2xB,QAAS,iBACtB,gBAACpG,EAAA,EAAD,CACE15B,GAAG,gBACH+nB,UAAWH,EAAQkkD,YACnB7/C,QAASogD,EACT32C,UACI3G,GAAgC,IAAnBo9C,IAA0Bx4C,EAAgB0H,UAG3D,gBAAC5G,GAAA,EAAD,SAMX,CAED,SAASg4C,GAAuB/4C,GAC9B,IAAQ9L,EAA4C8L,EAA5C9L,QAASmW,EAAmCrK,EAAnCqK,MAAOksC,EAA4Bv2C,EAA5Bu2C,cAAev7C,EAAagF,EAAbhF,SACvC,OACE,gCACE,gBAAC2K,GAAA,EAAD,CAAatR,UAAWH,EAAQuxB,aAC9B,gBAAC7f,GAAA,EAAD,CAAYC,QAAQ,iBAAiBxR,UAAWH,EAAQ/R,OAAxD,oBAGA,gBAAC6jC,GAAA,EAAD,CACEzX,SAAU,SAAA7hC,GACR,IAAMquB,EAAYruB,EAAE+rB,OAAO3a,MACrBmrC,EAAU5e,EAAM4e,QAClB5e,EAAM4e,SACN,IAAI90C,MAAO0L,cACf02D,EAAc,CACZx7C,UAAAA,EACAkuB,QAAAA,EACAguB,UAAW,UAEd,EACDn5D,MAAOusB,EAAMtP,UACboL,WAAY,CACV7uB,KAAM,mBACNhL,GAAI,mBAGN,gBAAC64C,GAAA,EAAD,CAAUrnC,MAAM,IACd,4CAEDkd,EAAS7uB,KAAI,SAAA0zD,GAAC,OACb,gBAAC1a,GAAA,EAAD,CAAUthC,IAAKg8C,EAAEvzD,GAAIwR,MAAO+hD,EAAEvzD,IAC3BuzD,EAAEvoD,KAFQ,MASxB,CAED,SAAS0hE,GAAkBh5C,GACzB,IAAQ9L,EAAkC8L,EAAlC9L,QAASmW,EAAyBrK,EAAzBqK,MAAOksC,EAAkBv2C,EAAlBu2C,cACxB,OACE,gCACE,gBAAC5wC,GAAA,EAAD,CAAatR,UAAWH,EAAQuxB,aAC9B,gBAAC7f,GAAA,EAAD,CAAYC,QAAQ,aAAaxR,UAAWH,EAAQ/R,OAApD,gBAGA,gBAAC6jC,GAAA,EAAD,CACEizB,WAAS,EACT1qC,SAAU,SAAA7hC,GACR,IAAMsqE,EAAYtqE,EAAE+rB,OAAO3a,MACrBmrC,EAAU5e,EAAM4e,QAClB5e,EAAM4e,SACN,IAAI90C,MAAO0L,cACf02D,EAAc,CACZS,UAAAA,EACA/tB,QAAAA,EACAguB,UAAW,UAEd,EACDn5D,MAAOusB,EAAM2sC,UACb3yC,MAAO,gBAACyB,GAAA,EAAD,CAAOxuB,KAAK,MAAMhL,GAAG,gBAE5B,gBAAC64C,GAAA,EAAD,CAAUrnC,MAAM,IACd,4CAEF,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAM,QAAhB,uBACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAM,QAAhB,sBAKT,CAED,SAASo7D,GAAkBl5C,GACzB,IAAQ9L,EAA4C8L,EAA5C9L,QAASqiD,EAAmCv2C,EAAnCu2C,cAAelsC,EAAoBrK,EAApBqK,MAAOrP,EAAagF,EAAbhF,SACvC,OACE,gCACE,gBAAC+9C,GAAD,CACE7kD,QAASA,EACTqiD,cAAeA,EACflsC,MAAOA,EACPrP,SAAUA,IAEZ,gBAACg+C,GAAD,CACE9kD,QAASA,EACTqiD,cAAeA,EACflsC,MAAOA,EACPrP,SAAUA,IAIjB,CAED,SAASm+C,GAAUn5C,GACjB,IACEo5C,EAYEp5C,EAZFo5C,mBACA7C,EAWEv2C,EAXFu2C,cACAt2C,EAUED,EAVFC,gBACA1F,EASEyF,EATFzF,SACAc,EAQE2E,EARF3E,UACAq9C,EAOE14C,EAPF04C,iBACAC,EAME34C,EANF24C,cACAC,EAKE54C,EALF44C,eACA1kD,EAIE8L,EAJF9L,QACAmW,EAGErK,EAHFqK,MACArP,EAEEgF,EAFFhF,SACA5jB,EACE4oB,EADF5oB,IAGF,MAAoC4tB,EAAAA,EAAAA,UAAS,IAA7C,GAAO4I,EAAP,KAAmBirC,EAAnB,KAkBA,OACE,gCACE,gBAAC,GAAD,CACEhrC,QAAQ,UACRhK,OAAQ,kBAAMu1C,GAAmB,EAAzB,EACRniD,OAAQ,SAAAvqB,GACN,IAAQoR,EAAUpR,EAAE+rB,OAAZ3a,MACR+6D,EAAc/6D,EACf,EACDmwB,gBAzBe,SAAAvhC,GACnB,GAAkB,KAAdA,EAAE2sE,UACe,KAAfzrC,GAAqBlsB,GAAUksB,IAAa,CAC9C,IAAMqb,EAAU5e,EAAM4e,QAClB5e,EAAM4e,SACN,IAAI90C,MAAO0L,cACf02D,EAAc,CACZttB,QAAAA,EACAivB,aAActqC,EACdqa,KAAM,EACNgvB,UAAW,UAEd,CAEJ,EAYKrpC,WAAYA,EACZE,UAAQ,EACR9D,YAAW,kBACX2D,OAAM,ieAONH,QACE,4BACE,gBAAC8oC,GAAD,CACEpiD,QAASA,EACTqiD,cAAeA,EACflsC,MAAOA,IAET,gBAAC6uC,GAAD,CACEhlD,QAASA,EACTqiD,cAAeA,EACflsC,MAAOA,EACPrP,SAAUA,KAIhBuS,QACE,4BACE,gBAACirC,GAAD,CACEjC,cAAeA,EACfriD,QAASA,EACT9c,IAAKA,EACL6oB,gBAAiBA,EACjBw4C,eAAgBl+C,EAASnW,OACzBiX,UAAWA,EACXq9C,iBAAkBA,EAClBC,cAAeA,EACfC,eAAgBA,EAChBC,cAAeA,OAO5B,CA0RD,SAxRA,YAA2C,IAAnB54C,EAAmB,EAAnBA,gBACtB,MAA8C+E,EAAAA,EAAAA,WAAS,GAAvD,GAAOqhB,EAAP,KAAwB+yB,EAAxB,KACA,MAAoDp0C,EAAAA,EAAAA,WAAS,GAA7D,GAAOs0C,EAAP,KAA2BC,EAA3B,KACA,MAA0Dv0C,EAAAA,EAAAA,WAAS,GAAnE,GAAOw0C,EAAP,KAA8BC,EAA9B,KACA,MAAkCz0C,EAAAA,EAAAA,UAAS7wB,KAAKC,OAAhD,GAAO+wD,EAAP,KAAoB0B,EAApB,KACM5yD,GAAWmjB,EAAAA,EAAAA,MAEXvY,GAAUkY,EAAAA,EAAAA,MAEV7C,EAAUV,KAEhB,MAA6BkmD,EAAAA,EAAAA,IAAe,CAC1C1C,WAAW2C,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,IACpC7+C,WAAW4+C,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,IACpC1B,cAAcyB,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,IACvCnD,WAAWkD,EAAAA,EAAAA,IAAYC,EAAAA,GAAal6D,GAAS,MAC7CupC,SAAS0wB,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,MAClC3C,WAAW0C,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,OACpChzB,SAAS+yB,EAAAA,EAAAA,IAAYE,EAAAA,GAAa,IAClC5xB,MAAM0xB,EAAAA,EAAAA,IAAYE,EAAAA,GAAa,KARjC,GAAOC,EAAP,KAAiBC,EAAjB,KAWM1vC,GAAQgS,EAAAA,EAAAA,UAAQ,kBAAMy9B,CAAN,GAAgB,CAAChtE,OAAO8Q,OAAOk8D,GAAUn8D,SACzDub,EAAY+G,EAAgB3zB,GAG5Bi7D,GADOlwC,EAAAA,EAAAA,IAAY+F,IACFppB,MAEjBgmE,GAAwB3iD,EAAAA,EAAAA,IAAYmD,IACpCy/C,GAAsB5iD,EAAAA,EAAAA,IAAY4D,IAClCrjB,GAAQyf,EAAAA,EAAAA,IAAY8D,IACpB28C,GAAuBzgD,EAAAA,EAAAA,IAAY6D,IACnCG,GAAYhE,EAAAA,EAAAA,IAAY+D,IACxBG,GAAalE,EAAAA,EAAAA,IAAYiE,IACzB4+C,GAAc7iD,EAAAA,EAAAA,IAAYiD,IAE1BC,EAAW,IAAQ2/C,EAAa,aAAc,QACjD/tE,IAAI6tE,GACJ7tE,IAAI8tE,GAEDE,GAAc9iD,EAAAA,EAAAA,IAAYyF,IAE1B9B,EAAW,IAAQ,IAAOm/C,GAAc,CAAC,SAC5C79D,QAAO,SAAAujD,GAAC,MAAe,YAAXA,EAAExrD,IAAN,IACRiI,QAAO,SAAAujD,GAAC,OAAkB,MAAdA,EAAE7Y,QAAN,IAELozB,EAAuB,SAAA9gE,GAC3BrF,EzC7SG,WAAsC+0C,EAAY1sC,GAAQ,IAAhCie,EAAgC,EAAhCA,SACzBjhB,GAAUU,EAAAA,GAAAA,IACdugB,EAASpuB,KAAI,SAAAs0D,GAAC,OAAIlZ,GAAgB,SAAKkZ,GAAN,IAAS1pD,iBAAkB,KAA9C,IACd,IAAIrB,GAAAA,GAAAA,MAAamB,KAMbwjE,GACJ55D,EAAAA,GAAAA,GAAyB,IAAItM,KAAQ,IAAIA,KAAKomB,EAAS,GAAG+/C,cAC1D,IAEF,OAAmB,IAAftxB,IAAqB1sC,EAAO2sC,SAAWoxB,EAClC,CAAEhmE,KAAMvE,GAAkBwJ,QAAAA,GAE5B,CAAEjF,KAAM,KAChB,CyC4RYkmE,CAAejhE,EAAS+wB,EAAM4d,KAAM5d,GAC9C,EAEKgyB,EAAmB,SAAA/iD,GACvButD,EAAW1yD,KAAKC,OAChBH,EAAS80C,GAAWzvC,IACpB,IzC3W2BmZ,EyC2WrBlR,EAAYjI,EAAQmhB,KAAK,GAAG+/C,WAC9Bj5D,GACFtN,GzC7WyBwe,EyC6WD,CAAEnmB,GAAIiV,GzC5WlC,6CAAO,WAAMtN,GAAN,sGACkB2E,GAAIrE,GAAmBke,EAAQnmB,IAAK,CACzD8mE,SAAS,IAFN,cACCn8D,EADD,YAILhD,EAJK,KAIIyzC,GAJJ,KAImBC,GAJnB,SAI0C1wC,EAASkB,OAJnD,sHAAP,OAAO,SAAP,UAAO,EAAP,2ByC8WC,EAEKsiE,GAAqBra,EAAAA,EAAAA,cAAY,SAACxrD,EAAK6d,GAC3Co0C,EAAW1yD,KAAKC,OAChBH,EAASw0C,GAAU7zC,EAAK6d,GACzB,GAAE,IAEG8jD,EAAgB,SAAA9L,GACpBsP,GACE,SAAArP,GAAS,gBACJA,GACAD,EAFI,GAIT,UAEH,EAGKiQ,GAAeta,EAAAA,EAAAA,cAAY,WAC/BmZ,GAAsB,GACtBtlE,EACE2G,GACE,uDACA,YzCjLD,SAAP,4ByCoLI+/D,CAAe,CAAEzhD,UAAAA,EAAW5c,OAAQ,IAAE05D,OAAQ,OAAU3rC,IACzD,GAAE,CACDnR,EACAmR,EAAMosC,UACNpsC,EAAM4e,QACN5e,EAAMtP,UACNsP,EAAM2sC,UACN3sC,EAAM6tC,eAIF0C,EAAqB,kBAAMnB,GAAyB,EAA/B,EACrBoB,GAAkBza,EAAAA,EAAAA,cACtB,SAAA/1B,GzCtKG,IAAyB2c,EyCuK1B4zB,IACA3mE,GzCxK0B+yC,EyCyKR,CACd9tB,UAAWA,EACX5c,OAAQ+tB,GzC1KhB,6CAAO,WAAMp2B,GAAN,6FACLA,EAxBK2G,GAAA,+CAEL,SAqBK,kBAGoBjB,G5DnPpB,2B4DqPDZ,EAAAA,GAAAA,gBAAeiuC,IALd,cAGG/vC,EAHH,YAOHhD,EAPG,KAOMm0C,GAPN,SAO6BnxC,EAASkB,OAPtC,wGASHlE,EAhBG2G,GACL,uEACA,UAKK,0DAAP,OAAO,SAAP,UAAO,EAAP,2ByC6KG,GACD,CAACse,IAGG9hB,EAAM,CACVmB,OAAOW,SAASy2D,SAChB,GACAp3D,OAAOW,SAASigC,KAChB,QACAlZ,EAAgBqwC,SAChB3yD,KAAK,KA+CP,OA7CAga,EAAAA,EAAAA,YAAU,WACR1jB,EAASg4B,GAAa,UACtBrU,SAASC,MAAQ,gBAClB,GAAE,KAEHF,EAAAA,EAAAA,YAAU,WACR,GAAIuB,EAAW,CAGbjlB,EAASi1C,GAAcjpB,IAEvB,IAAM66C,EAAuB7mE,EAC3B0+B,GAAY,YAAD,OAAazZ,GAAa,CACnC4jC,IAAKsd,EACL9jC,QAAS8jC,KAIPW,EAAmB9mE,EACvB0+B,GAAY,QAAD,OAASzZ,GAAa,CAC/B4jC,IAAKT,EACL/lB,QAAS+lB,KAIb,OAAO,WACLye,IACAC,GACD,CACF,CACF,GAAE,CAAC7hD,KAEJvB,EAAAA,EAAAA,YAAU,WzCtSL,IAAmC/b,EyCuSlCsd,GACFjlB,GzCxSoC2H,EyCySR,CACxBsd,UAAAA,EACA5c,OAAQ+tB,EACR4d,KAAM5d,EAAM4d,KACZrB,QAASvc,EAAMuc,SzC5SvB,6CAAO,WAAM3yC,GAAN,0GAC0BA,EAAS+zC,GAAapsC,IADhD,OACCo/D,EADD,OAGL/mE,EACE6zC,GAAsB,CACpB5uB,UAAWtd,EAAOsd,UAClBqB,SAAUztB,OAAO8Q,OAAP,oBAAco9D,EAAiBxkC,gBAA/B,aAAc,EAA2Bjc,gBAAzC,QAAqD,CAAC,MAN/D,2CAAP,OAAO,SAAP,UAAO,EAAP,2ByCgTC,GAAE,CAACrB,EAAWzf,KAAKC,UAAU2wB,KAG5B,gCACE,gBAAC8uC,GAAD,CACEC,mBAAoB,kBAAMA,GAAmB,EAAzB,EACpB7C,cAAeA,EACft2C,gBAAiBA,EACjB1F,SAAUA,EACVc,UAAWA,EACXq9C,iBA5EqB,kBAAMe,GAAyB,EAA/B,EA6ErBd,cAhGkB,kBAAMY,GAAsB,EAA5B,EAiGlBX,eAAgBX,GAChB/jD,QAASA,EACTmW,MAAOA,EACPrP,SAAUA,EACV5jB,IAAKA,IAEP,gBAACg3B,GAAA,EAAD,CAAOipB,UAAW,EAAGhjC,UAAWH,EAAQqkD,aACtC,gBAAC5vC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,sBACA,gBAACtD,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,oBAEF,gBAACA,GAAA,EAAD,yBAEE,gBAAC,KAAD,CACEjR,MACE,sEACqD,IACnD,kCAFF,2LAKwB,mCALxB,6BAUF,gBAAC,KAAD,CAAU4H,SAAS,cAGvB,gBAAC+F,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,sBAEE,gBAAC,KAAD,CACEjR,MACE,gIAMF,gBAAC,KAAD,CAAU4H,SAAS,iBAM7B,gBAACuJ,GAAA,EAAD,KACE,gBAAC,GAAD,CAAal0B,QAASmrB,EAAiBklC,YAAaA,IACnD9pC,GAAa,gBAAC,GAAD,CAAaurB,QAASvc,EAAMuc,WACxCvrB,GACAd,EAASpuB,KAAI,SAACsmB,EAASqP,GAAV,OACX,gBAAC,GAAD,CACErP,QAASA,EACT8F,QAAS5Z,GACP6T,GAA0ByN,EAAiBxN,GAC3C5T,GAEFg5D,WAAYl5D,GACZkF,IAAK4O,EAAQnmB,GACbwrE,qBAAsBA,EACtBhX,MAAOh/B,EACP2mB,UAAWgyB,EACX3lE,QAASmrB,GAZA,MAeZ5E,GAAazjB,GAAS2iB,EAASnW,OAAS,IACzC,gBAACozD,GAAD,CAAWvR,QAAS,KAEpB,KAAQruD,IAAU,gBAAC8/D,GAAD,CAAU9/D,MAAOA,EAAOqjE,SAAU,MAG1D,gBAAC,GAAD,CACE5mD,UAAWH,EAAQs2C,mBACnB9G,cAAer5B,EAAMuc,QACrBE,WAAYvrB,EAAWurB,WACvB2c,YAAap5B,EAAM4d,KACnB1Z,SAAUgoC,KAGd,gBAAC,GAAD,CACEr3D,KAAMmnC,EACNjoB,QAAS,kBAAMg7C,GAAmB,EAAzB,EACT7R,UAAWA,EACX8N,SAAUj+D,IAEZ,gBAACs+D,GAAD,CACEx2D,KAAMs6D,EACNp7C,QAASw8C,EACTjF,UAAW,kBAAMkF,EAAgBxwC,EAAtB,EACXgmC,MAAM,WACNnuD,OAAO,YACP0zD,YAAavrC,EACbwrC,WAAYt6C,EAAWsrB,QAEzB,gBAAC6uB,GAAD,CACEx2D,KAAMo6D,EACNl7C,QAAS,kBAAMm7C,GAAsB,EAA5B,EACT5D,UAAW+E,EACXrK,MAAM,WACNnuD,OAAO,SACP0zD,YAAavrC,EACbwrC,WAAYt6C,EAAWsrB,QAI9B,E,mXCpmBD,IAAMrzB,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCs/D,MAAO,CACLhnC,MAAO,QAET4uC,YAAa,CACXh8C,gBAAiBlrB,EAAM4qB,QAAQhnB,MAAM2nB,KACrChB,MAAO,QACPzJ,UAAW,UAEbqD,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAVX,IA+PlC,SAjPA,YAA0C,IAAnBU,EAAmB,EAAnBA,gBACfhsB,GAAWmjB,EAAAA,EAAAA,MACXvY,GAAUkY,EAAAA,EAAAA,MACV7C,EAAUV,KACVxf,GAAQyyD,EAAAA,EAAAA,KAER0U,GAAa5lC,EAAAA,EAAAA,UAEPh0B,GAAci0B,EAAAA,EAAAA,MAAlBlpC,GAKFqoC,GAJUtd,EAAAA,EAAAA,KACd,SAAAC,GAAK,OAAIA,EAAMiD,SAASvB,MAAMzX,EAAzB,GADoB,KAMrBiD,GACJ6S,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM7S,MAAMuU,MAAM1B,EAAMgG,KAAKC,cAAjC,KAAoD,CAAC,EAClEpc,EAAawzB,EAAgBA,EAAcxzB,WAAa,KACxD5H,EAASo7B,EAAgBA,EAAcp7B,OAAS,KAChDguD,EAAY/iD,EAAKxQ,OAEvBonE,EAAAA,GAAAA,IAAW,wBAAwB,SAAA1uE,GAAK,QACtCA,EAAEoS,iBACFq8D,SAAA,UAAAA,EAAY5yC,eAAZ,mBAAqBlrB,cAArB,SAA6Bg+D,YAAY,OAC1C,KAED1jD,EAAAA,EAAAA,YAAU,WACR1jB,EAASg4B,GAAa,UACtBrU,SAASC,MAAQ,yBAClB,GAAE,CAAC5jB,KAEJ0jB,EAAAA,EAAAA,YAAU,WACR1jB,EAAS4zC,GAAiBtmC,GAC3B,GAAE,CAACA,EAAWtN,IAEf,IAAMi/B,EAAM,e,EAAA,G,EAAA,yBAAG,WAAMt1B,GAAN,+GAEUsqC,GAActqC,EAAdsqC,CAAsBj0C,GAFhC,OAELmiC,EAFK,OAGXv3B,EAAQM,KAAKqT,GAA0ByN,EAAiBmW,IAH7C,qDAKP,gBAAiB1+B,IALV,0CAMF6G,GAAiB,KAAM5G,OAAQiG,IAN7B,2E,iLAAH,sDAWN09D,EAAa,SAAA78D,GACjB,IAAMX,EACwB,UAA5B,GAAOW,EAAM4lB,MAAMvmB,OACfrE,KAAKC,UAAU+E,EAAM4lB,MAAMvmB,MAAO,KAAM,GACxCW,EAAM4lB,MAAMvmB,MAElB,OACE,uBACErD,MAAO,CACLma,SAAU,EACVrX,SAAU,WACV46B,OAAQ,SAGV,gBAAC,M,sHAAD,EACE/F,IAAK+oC,EACL9Q,SAAU,EACVjxD,KAAK,OACLulD,YAAa,CAAEC,gBAAiBC,KAChCvnD,KAAMmH,EAAM4lB,MAAM/sB,KAClBi3B,SAAU9vB,EAAM4lB,MAAMkK,SACtBtE,QAASxrB,EAAM4lB,MAAM4F,QACrBq0B,iBAAiB,EACjBI,QAAS,EACT1qD,MAAOuzD,GAAavzD,EAAM4qB,QAAQ87B,WAClC58C,MAAOA,GAAS,GAChBwuB,MAAM,OACN6L,OAAO,OACP19B,MAAO,CACL8C,SAAU,WACVg1C,KAAM,EACN3jB,MAAO,EACP0jB,IAAK,EACLziB,OAAQ,IAnBZ,WAqBW,0BAAMsrC,SAAN,UAAMA,EAAY5yC,eAAlB,iBAAM,EAAqBlrB,cAA3B,aAAM,EAA6Bu/C,QAAnC,KAIhB,EAED,OACE,gBAAC,MAAD,CACErzB,SAAU2J,EACVyB,cAAeA,EACf9N,SAAU,SAAAjpB,GACR,IAAMjG,EAAS,CAAC,EAChB,GAA0B,UAAtB,GAAOiG,EAAOpE,MAChB,IACEC,KAAKkI,MAAMlI,KAAKC,UAAUkE,EAAOpE,MAGlC,CAFC,MAAO9M,GACPiL,EAAO6B,KAAO,yBACf,MAED,IACEC,KAAKkI,MAAM/D,EAAOpE,KAGnB,CAFC,MAAO9M,GACPiL,EAAO6B,KAAO,yBACf,CAKH,OAHAiG,YAAW,WAAY,QACrB07D,SAAA,UAAAA,EAAY5yC,eAAZ,mBAAqBlrB,cAArB,SAA6Bu/C,QAC9B,GAAE,IACIjlD,CACR,EACD+xB,OAAQ,YAQF,IAPJC,EAOI,EAPJA,aACAC,EAMI,EANJA,WACAC,EAKI,EALJA,QACA9sB,EAII,EAJJA,qBACA+sB,EAGI,EAHJA,SACAntB,EAEI,EAFJA,KACAE,EACI,EADJA,aAEA,GAAIA,aAAwBlQ,MAC1B,MAAMkQ,EAGR,OACE,gBAAC,KAAD,CACEsX,WAAS,EACTwqB,UAAU,MACVvqB,eAAe,SACfo8B,WAAW,UACX/1C,MAAO,CAAE09B,OAAQ,SAEjB,gBAAC,KAAD,CAAM7jB,MAAI,EAACC,GAAI,GAAIC,GAAI,GAAIE,GAAI,GAC7B,gBAAC,KAAD,CAAMja,MAAO,CAAE09B,OAAQ,SACrB,uBACE19B,MAAO,CACL8gE,cAAe,SACfnvC,QAAS,OACT+L,OAAQ,SAGV,wBACE5O,SAAUI,EACVlvB,MAAO,CACL09B,OAAQ,OACR/L,QAAS,OACTmvC,cAAe,WAGjB,gBAAC,KAAD,CACEpjD,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACzB,gBAAC08C,GAAA,EAAD,OAGJh9C,MACE,4CACe,4BAAOtW,IAGxBknB,UAAS,UAAKlvB,EAAL,gCAAmCyG,GAC1CmB,EACA,aAEFe,OACE,4BACE,gBAAC,KAAD,CAAS2V,MAAM,SAASkS,UAAU,QAChC,gBAAC/D,EAAA,EAAD,CAAYzN,QAAS,kBAAM1Z,EAAQ0+B,QAAd,GACnB,gBAAC1J,GAAA,EAAD,QAGJ,gBAAC,KAAD,CACEhc,MAAM,4BACNkS,UAAU,QAEV,gBAAC/D,EAAA,EAAD,CAAYzN,QAAS5b,EAAKw2B,OACxB,gBAACW,GAAA,EAAD,QAGJ,gBAAC,KAAD,CAASjc,MAAM,OAAOkS,UAAU,QAC9B,gBAAC/D,EAAA,EAAD,CACEhE,SACE4H,GACAE,GACCD,IAAY9sB,EAEfzQ,GAAG,SACHisB,QAASoR,GAERC,EAAa,gBAACxU,GAAA,EAAD,MAAuB,gBAAC4e,GAAA,EAAD,WAM/C,gBAAC,KAAD,CACEwnC,iBAAe,EACf/gE,MAAO,CAAE+zB,OAAQ,EAAGlC,MAAO,QAC3BiC,SAAU,WACR9uB,YAAW,WAAY,QACrB07D,SAAA,UAAAA,EAAY5yC,eAAZ,mBAAqBlrB,cAArB,SAA6Bu/C,QAC9B,GAAE,IACJ,GAED,gBAAC,KAAD,CAAkBphB,WAAY,gBAACC,GAAA,EAAD,OAA9B,gBAEE,gBAAC,KAAD,CAAS5jB,MAAM,oGACb,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAapL,UAAWH,EAAQo/C,OAC9B,gBAAC,MAAD,CACEhnE,GAAG,eACHgL,KAAK,QACLjD,KAAK,WACL21B,YAAY,2BACZD,UAAW3F,GACXE,WAAS,OAKjB,gBAAC,MAAD,CAAOhtB,KAAK,OAAOyyB,UAAWuxC,KAE/BzxC,GACC,uBAAKxV,UAAWH,EAAQgnD,aAAxB,4BAMN,gBAAC,KAAD,CAAYhgC,MAAO,SAAAxuC,GAAC,OAAIiX,GAAajX,EAAGi9B,EAApB,KAI3B,GAGN,E,u5DCpOD,IAAMsuC,IAAa,OACjBn2D,MAAO,GACPwtC,QAAS,GACT4oB,aAAc,GACdzB,UAAW/2D,GAAS,KACpBupC,QAAS,KACTguB,UAAW,KANM,eAOH,IAPG,gBAQR,IARQ,aASX,GATW,IAYbzjD,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCw2D,mBAAoB,CAClBp+B,QAAS,eACTnU,UAAWjkB,EAAM4f,QAAQ,GACzBuyC,MAAO,oBAETmS,WAAY,CACVrgD,UAAWjkB,EAAM4f,QAAQ,IAE3B6xB,YAAa,CACXjX,OAAQx6B,EAAM4f,QAAQ,IAExBzR,MAAO,CACL5E,SAAU,WACVmmC,aAAc,GACd,QAAS,CACPzrB,UAAW,EACX,WAAY,CAAC,EACb,UAAW,CACT4X,OAAQ,GAEVsoC,IAAK,CACH7lB,IAAK,KAIXugB,KAAM,CACJrmC,YAAax4B,EAAM4f,QAAQ,GAC3B4a,OAAQx6B,EAAM4f,QAAQ,KAExBwkD,YAAa,CACXngD,UAAWjkB,EAAM4f,QAAQ,IAE3B2kD,YAAa,CACXrgD,aAAclkB,EAAM4f,QAAQ,IAlCE,IAsClC,SAAS4kD,GAAcx4C,GACrB,IACEu2C,EASEv2C,EATFu2C,cACAriD,EAQE8L,EARF9L,QACA+L,EAOED,EAPFC,gBACAxF,EAMEuF,EANFvF,KACAY,EAKE2E,EALF3E,UACAs9C,EAIE34C,EAJF24C,cACAC,EAGE54C,EAHF44C,eACA6C,EAEEz7C,EAFFy7C,iBACA5C,EACE74C,EADF64C,cAEF,OACE,gCACE,gBAAC,KAAD,CAAShhD,MAAM,gBAAgBkS,UAAU,QACvC,gBAAC/D,EAAA,EAAD,CACEzN,QAAS,WACPsgD,EAAc,IACdtC,EAAcqC,EACf,EACDvkD,UAAWH,EAAQkkD,aAEnB,gBAAC,KAAD,QAGJ,gBAAC,KAAD,CACEvgD,MAAM,6CACNkS,UAAU,QAEV,gBAAC/D,EAAA,EAAD,CAAYzN,QAASkjD,EAAkBpnD,UAAWH,EAAQkkD,aACxD,gBAAC,KAAD,QAGJ,gBAAC,KAAD,CACEvgD,MACEoI,EAAgB0H,SACZ,8CACA,iDAENoC,UAAU,QAEV,wBAAMtvB,MAAO,CAAE2xB,QAAS,iBACtB,gBAACpG,EAAA,EAAD,CACE15B,GAAG,gBACH+nB,UAAWH,EAAQkkD,YACnB7/C,QAASogD,EACT32C,UACI3G,GAA6B,IAAhBZ,EAAKrW,SAAkB6b,EAAgB0H,UAGxD,gBAAC,KAAD,SAMX,CAED,SAAS+zC,GAAU17C,GACjB,IAAQ9L,EAAwC8L,EAAxC9L,QAASmW,EAA+BrK,EAA/BqK,MAAOksC,EAAwBv2C,EAAxBu2C,cAAe98C,EAASuG,EAATvG,KACvC,OACE,gCACE,gBAACkM,GAAA,EAAD,CAAatR,UAAWH,EAAQuxB,aAC9B,gBAAC7f,GAAA,EAAD,CAAYC,QAAQ,iBAAiBxR,UAAWH,EAAQ/R,OAAxD,OAGA,gBAAC6jC,GAAA,EAAD,CACEzX,SAAU,SAAA7hC,GACR,IAAMoV,EAAQpV,EAAE+rB,OAAO3a,MACjBmrC,EAAU5e,EAAM4e,QAClB5e,EAAM4e,SACN,IAAI90C,MAAO0L,cACf02D,EAAc,CACZz0D,MAAAA,EACAmnC,QAAAA,EACAguB,UAAW,UAEd,EACDn5D,MAAOusB,EAAMvoB,OAEb,gBAACqjC,GAAA,EAAD,CAAUrnC,MAAM,IACd,kCAED2b,EAAKttB,KAAI,SAAA0zD,GAAC,OACT,gBAAC1a,GAAA,EAAD,CAAUthC,IAAKg8C,EAAEvzD,GAAIwR,MAAO+hD,EAAEvzD,IAC3BuzD,EAAEvoD,KAFI,MASpB,CAED,SAASqkE,GAAc37C,GACrB,IAAQ9L,EAAkC8L,EAAlC9L,QAASmW,EAAyBrK,EAAzBqK,MAAOksC,EAAkBv2C,EAAlBu2C,cACxB,OACE,gCACE,gBAAC5wC,GAAA,EAAD,CAAatR,UAAWH,EAAQuxB,aAC9B,gBAAC7f,GAAA,EAAD,CAAYC,QAAQ,aAAaxR,UAAWH,EAAQ/R,OAApD,UAGA,gBAAC6jC,GAAA,EAAD,CACEzX,SAAU,SAAA7hC,GACR,IAAM4iD,EAAU5iD,EAAE+rB,OAAO3a,MACnBmrC,EAAU5e,EAAM4e,QAClB5e,EAAM4e,SACN,IAAI90C,MAAO0L,cACf02D,EAAc,CACZjnB,QAAAA,EACArG,QAAAA,EACAguB,UAAW,UAEd,EACDn5D,MAAOusB,EAAMilB,SAEb,gBAACnK,GAAA,EAAD,CAAUrnC,MAAM,IAAhB,OACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAM,KAAhB,WACA,gBAACqnC,GAAA,EAAD,CAAUrnC,MAAM,KAAhB,aAKT,CAED,SAAS89D,GAAc57C,GACrB,IAAQ9L,EAAwC8L,EAAxC9L,QAASqiD,EAA+Bv2C,EAA/Bu2C,cAAelsC,EAAgBrK,EAAhBqK,MAAO5Q,EAASuG,EAATvG,KACvC,OACE,gCACE,gBAACiiD,GAAD,CACExnD,QAASA,EACTqiD,cAAeA,EACflsC,MAAOA,EACP5Q,KAAMA,IAER,gBAACkiD,GAAD,CACEznD,QAASA,EACTqiD,cAAeA,EACflsC,MAAOA,IAId,CAED,SAAS8uC,GAAUn5C,GACjB,IACEu2C,EAUEv2C,EAVFu2C,cACAt2C,EASED,EATFC,gBACAxF,EAQEuF,EARFvF,KACAY,EAOE2E,EAPF3E,UACAogD,EAMEz7C,EANFy7C,iBACA9C,EAKE34C,EALF24C,cACAC,EAIE54C,EAJF44C,eACA1kD,EAGE8L,EAHF9L,QACAmW,EAEErK,EAFFqK,MACA5Q,EACEuG,EADFvG,KAGF,MAAoCuL,EAAAA,EAAAA,UAAS,IAA7C,GAAO4I,EAAP,KAAmBirC,EAAnB,KAcA,OACE,gCACE,gBAAC,GAAD,CACEhrC,QAAQ,UACR5W,OAAQ,SAAAvqB,GACN,IAAQoR,EAAUpR,EAAE+rB,OAAZ3a,MACR+6D,EAAc/6D,EACf,EACDmwB,gBApBe,SAAAvhC,GACnB,GAAkB,KAAdA,EAAE2sE,QAAgB,CACpB,IAAMpwB,EAAU5e,EAAM4e,QAAU5e,EAAM4e,SAAU,IAAI90C,MAAO0L,cAC3D02D,EAAc,CACZttB,QAAAA,EACAivB,aAActqC,EACdqa,KAAM,EACNgvB,UAAW,UAEd,CACF,EAWKrpC,WAAYA,EACZD,OAAO,4NAIPH,QACE,4BACE,gBAAC8oC,GAAD,CACEpiD,QAASA,EACTqiD,cAAeA,EACflsC,MAAOA,IAET,gBAACuxC,GAAD,CACE1nD,QAASA,EACTqiD,cAAeA,EACflsC,MAAOA,EACP5Q,KAAMA,KAIZ8T,QACE,4BACE,gBAAC,GAAD,CACEgpC,cAAeA,EACfriD,QAASA,EACT+L,gBAAiBA,EACjBxF,KAAMA,EACNY,UAAWA,EACXogD,iBAAkBA,EAClB9C,cAAeA,EACfC,eAAgBA,EAChBC,cAAeA,OAO5B,CAsOD,SApOA,YAAuC,IAAnB54C,EAAmB,EAAnBA,gBAClB,MAAoD+E,EAAAA,EAAAA,WAAS,GAA7D,GAAOs0C,EAAP,KAA2BC,EAA3B,KACA,MAA0Dv0C,EAAAA,EAAAA,WAAS,GAAnE,GAAO62C,EAAP,KAA8BC,EAA9B,KACA,MAAkC92C,EAAAA,EAAAA,UAAS7wB,KAAKC,OAAhD,GAAO+wD,EAAP,KAAoB0B,EAApB,KACM5yD,GAAWmjB,EAAAA,EAAAA,MAEXlD,EAAUV,KAEV3U,GAAUkY,EAAAA,EAAAA,MAEhB,MAA0B2iD,EAAAA,EAAAA,IAAe,CACvC53D,OAAO63D,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,IAChCtqB,SAASqqB,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,IAClC1B,cAAcyB,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,IACvCnD,WAAWkD,EAAAA,EAAAA,IAAYC,EAAAA,GAAal6D,GAAS,MAC7CupC,SAAS0wB,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,MAClC3C,WAAW0C,EAAAA,EAAAA,IAAYC,EAAAA,GAAa,OACpChzB,SAAS+yB,EAAAA,EAAAA,IAAYE,EAAAA,GAAa,IAClC5xB,MAAM0xB,EAAAA,EAAAA,IAAYE,EAAAA,GAAa,KARjC,GAAOxvC,EAAP,KAAc0vC,EAAd,KAWM7gD,EAAY+G,EAAgB3zB,GAE5ByvE,GAAU1kD,EAAAA,EAAAA,IAAY6E,IACtBb,GAAYhE,EAAAA,EAAAA,IAAY+E,IACxBb,GAAalE,EAAAA,EAAAA,IAAY8E,IACzB6/C,GAAU3kD,EAAAA,EAAAA,IAAY4C,IACtBR,EAAO,IAAQ,IAAOuiD,GAAU,CAAC,SACjChhD,GAAW3D,EAAAA,EAAAA,IAAYyF,IAEvBrC,EAAO,IAAQshD,EAAS,aAAc,QAEzCz/D,QAAO,SAAAmkD,GAAC,OAAIA,EAAEvnC,WAAa+G,EAAgB3zB,EAAnC,IACRH,KAAI,SAAA8I,GAAG,OACN+L,GAAiB,CACfpM,IAAKonE,EAAQ/mE,EAAI6M,QAAU,CAAC,EAC5B7M,IAAAA,EACAM,QAASylB,EAAS/lB,EAAI8lB,YAJlB,IAQJ25C,GAActU,EAAAA,EAAAA,cAAY,SAACxrD,EAAK6d,GACpCo0C,EAAW1yD,KAAKC,OAChBH,EAASw0C,GAAU7zC,EAAK6d,GACzB,GAAE,IAEG8jD,GAAgBnW,EAAAA,EAAAA,cACpB,SAAAqK,GAAY,OACVsP,GACE,SAAArP,GAAS,gBACJA,GACAD,EAFI,GAIT,UANQ,GAQZ,IAMIwR,EAAqB,kBAAMH,GAAyB,EAA/B,EAErBI,GAAkB9b,EAAAA,EAAAA,cAAY,W1CtT/B,IAAoBpZ,E0CuTvBi1B,IACAhoE,G1CxTuB+yC,E0CwTH,CAAE9tB,UAAWA,EAAW5c,OAAQ+tB,G1CvTtD,6CAAO,WAAMp2B,GAAN,6FACLA,EA1CK2G,GAAA,2CAA8D,SAyC9D,kBAGoBjB,G7DyDpB,uB6DvDDZ,EAAAA,GAAAA,gBAAeiuC,IALd,cAGG/vC,EAHH,YAOHhD,EAPG,KAOMu0C,GAPN,SAOyBvxC,EAASkB,OAPlC,wGASHlE,EAvCG2G,GACL,sEACA,UA4BK,0DAAP,OAAO,SAAP,UAAO,EAAP,2B0CwTC,GAAE,CAACse,EAAWmR,IAET8xC,GAAoB9/B,EAAAA,EAAAA,UACxB,iBACE,CAAC,cAAD,OACgBnjB,GADhB,6BAEwBmR,EAAMosC,WAF9B,2BAGsBpsC,EAAM4e,SAAW,IAHvC,yBAIoB5e,EAAMvoB,OAJ1B,0BAKqBuoB,EAAMilB,SAL3B,gCAM2BjlB,EAAM6tC,cAC/B,sBACAv6D,KAAK,IATT,GAUA,CACEub,EACAmR,EAAMosC,UACNpsC,EAAM4e,QACN5e,EAAMvoB,MACNuoB,EAAMilB,QACNjlB,EAAM6tC,eAIJwC,GAAeta,EAAAA,EAAAA,cAAY,WAC/BmZ,GAAsB,GACtBtlE,EACE2G,GACE,uDACA,Y1CvRChC,G7DEF,SAA2Bg9D,GAChC,MAAO,qBAAP,OAA4BA,EAC7B,C6DJYwG,C0C0RED,GACZ,GAAE,CAACA,KAEJxkD,EAAAA,EAAAA,YAAU,WACR1jB,EAASg4B,GAAa,qBACtBrU,SAASC,MAAQ,sBAClB,GAAE,IAEH,IAAMwkC,EAAmB,SAAA/iD,GACvButD,EAAW1yD,KAAKC,OAChBH,EAAS80C,GAAWzvC,EAAS+wB,EAAM4d,KAAM5d,GAC1C,EA8BD,OA5BA1S,EAAAA,EAAAA,YAAU,WACR,GAAIuB,EAAW,CACbjlB,EAASy8B,GAAUzQ,IACnBhsB,EAASi1C,GAAcjpB,IAEvB,IAAMo8C,EAAUpoE,EACd0+B,GAAY,QAAD,OAASzZ,GAAa,CAC/B4jC,IAAKT,EACL/lB,QAAS+lB,KAGb,OAAO,kBAAMggB,GAAN,CACR,CACF,GAAE,CAACnjD,KAEJvB,EAAAA,EAAAA,YAAU,WACJuB,GACFjlB,EACEy0C,GAAS,CACPxvB,UAAWA,EACX5c,OAAQ+tB,EACR4d,KAAM5d,EAAM4d,KACZrB,QAASvc,EAAMuc,UAItB,GAAE,CAACntC,KAAKC,UAAU2wB,GAAQnR,EAAWmR,EAAMuc,QAASvc,EAAM4d,OAGzD,gCACE,gBAAC,GAAD,CACEsuB,cAAeA,EACft2C,gBAAiBA,EACjBxF,KAAMA,EACNY,UAAWA,EACXogD,iBArFqB,kBAAMK,GAAyB,EAA/B,EAsFrBnD,cAxFkB,kBAAMY,GAAsB,EAA5B,EAyFlBX,eAAgBX,GAChB/jD,QAASA,EACTmW,MAAOA,EACP5Q,KAAMA,IAER,gBAAC2U,GAAA,EAAD,CAAOipB,UAAW,EAAGhjC,UAAWH,EAAQqkD,aACtC,gBAAC5vC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,mBAEE,gBAAC,KAAD,CACEjR,MACE,kJAOF,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,gBAAC+F,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,gBAEF,gBAACtD,EAAA,EAAD,CAAQgtC,QAAM,GACZ,gBAAC1pC,GAAA,EAAD,gBACA,gBAACA,GAAA,EAAD,aAEF,gBAACA,GAAA,EAAD,wBAGJ,gBAACE,GAAA,EAAD,KACE,gBAAC,GAAD,CAAal0B,QAASmrB,EAAiBklC,YAAaA,IACnD9pC,GAAa,gBAAC,GAAD,CAAaurB,QAASvc,EAAMuc,QAAS6wB,WAAS,KAC1Dp8C,GACAZ,EAAKtuB,KAAI,SAAA8I,GAAG,OACV,gBAAC,GAAD,MACMA,EADN,CAEE4O,IAAK5O,EAAI3I,GACT6lE,QAASuC,EACTn8C,QAAS,SAAA7rB,GAAC,OACRiS,GAAOiU,GAAYqN,EAAiBhrB,GAAM4J,EAA1CF,CAAmDjS,EAD3C,IALF,KAUZ2uB,GAA6B,IAAhBZ,EAAKrW,QAAgB,gBAACozD,GAAD,CAAWvR,QAAS,MAG5D,gBAAC,GAAD,CACE5xC,UAAWH,EAAQs2C,mBACnB9G,cAAer5B,EAAMuc,QACrBE,WAAYvrB,EAAWurB,WACvB2c,YAAap5B,EAAM4d,KACnB1Z,SAAUgoC,KAId,gBAACb,GAAD,CACEx2D,KAAM28D,EACNz9C,QAAS69C,EACTtG,UAAW,kBAAMuG,EAAgB7xC,EAAtB,EACXgmC,MAAM,OACNnuD,OAAO,YACP0zD,YAAavrC,EACbwrC,WAAYt6C,EAAWsrB,QAEzB,gBAAC6uB,GAAD,CACEx2D,KAAMo6D,EACNl7C,QAAS,kBAAMm7C,GAAsB,EAA5B,EACT5D,UAAW+E,EACXrK,MAAM,OACNnuD,OAAO,SACP0zD,YAAavrC,EACbwrC,WAAYt6C,EAAWsrB,QAI9B,E,4/BCpfD,IAAMrzB,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCs7C,QAAS,CACPpwB,gBAAiBlrB,EAAM4qB,QAAQ0wB,QAAQ/vB,MAEzC+8C,QAAS,CACPp9C,gBAAiBlrB,EAAM4qB,QAAQhnB,MAAM2nB,MAEvCg9C,MAAO,CACLh+C,MAAOvqB,EAAM4qB,QAAQU,QAAQC,MARC,IAYlC,SAASi9C,GAAT,GAAsC,IAAnBv8C,EAAmB,EAAnBA,gBACX/L,EAAUV,KACVxf,GAAQyyD,EAAAA,EAAAA,KACR5nD,GAAUkY,EAAAA,EAAAA,MACV9iB,GAAWmjB,EAAAA,EAAAA,MACXwjC,GAAYrlB,EAAAA,EAAAA,UAEN4lB,GAAU3lB,EAAAA,EAAAA,MAAdlpC,GACF+uB,GAAYhE,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmD,KAAKY,SAAf,IAE7BksC,IADOlwC,EAAAA,EAAAA,IAAY+F,KAAsB,CAAC,GACzBppB,MACjBiB,GAAMoiB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmD,KAAKzB,MAAMmiC,IAAU,CAAC,CAAhC,GAAN,MAEvBigB,EAAAA,GAAAA,IAAW,wBAAwB,SAAA1uE,GAAK,QACtCA,EAAEoS,iBACF87C,SAAA,UAAAA,EAAWryB,eAAX,mBAAoBlrB,cAApB,SAA4Bg+D,YAAY,OACzC,IAED,IACEj6D,EAUEnM,EAVFmM,SACAG,EASEtM,EATFsM,UACA4R,EAQEle,EARFke,SACAg4C,EAOEl2D,EAPFk2D,IACA9pD,EAMEpM,EANFoM,UACAC,EAKErM,EALFqM,WACAyZ,EAIE9lB,EAJF8lB,UACA9H,EAGEhe,EAHFge,OACAF,EAEE9d,EAFF8d,OACAzmB,EACE2I,EADF3I,GAGImwE,EAAiB,4CAEjBC,EACJvR,GAAO9pD,EACHo7D,EACA,iDAEN,MAAgCz3C,EAAAA,EAAAA,UAAS03C,GAAzC,GAAOC,EAAP,KAAiBC,EAAjB,KAKA,IAAMhoE,GAAMyiB,EAAAA,EAAAA,KACV,SAAAC,GAAK,OAAI4C,GAAU5C,EAAOriB,EAAI6M,QAAU,CAAExV,GAAI2I,EAAI6M,MAA7C,GADgB,KAIjBlK,GAAQyf,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmD,KAAK7iB,KAAf,IACzBrC,GAAU8hB,EAAAA,EAAAA,KACd,SAAAC,GAAK,OAAIA,EAAM0D,SAAShC,MAAM+B,EAAzB,GADoB,KAIrB8hD,GAAaxlD,EAAAA,EAAAA,KACjB,SAAAC,GAAK,OAAIA,EAAM0D,SAAShC,MAAMpkB,EAAImmB,UAA7B,GADuB,KAIxB+hD,EACJ3pD,IACE5R,KACoB,cAAlBhM,aAAA,EAAAA,EAASlB,UACY,cAArBwoE,aAAA,EAAAA,EAAYxoE,OAEZi7C,EAAuB,IAAbluC,EAEhB,SAAS+6C,EAAT,GAAmC,IAAP75C,EAAO,EAAPA,IAC1B,GAAIA,EAAK,OACDjF,EAASu9C,SAAH,UAAGA,EAAWryB,eAAd,aAAG,EAAoBlrB,OACnCA,GAAUD,GAAcC,EAAQiF,EAAK,MAAM,EAC5C,CACF,CAED,SAAS+5C,EAAiB/iD,GACxBrF,EAAS80C,GAAWzvC,GACrB,CA2CD,IApCAqe,EAAAA,EAAAA,YAAU,WACR1jB,EAASg4B,GAAa,qBACtBrU,SAASC,MAAQ,wBAClB,GAAE,CAAC5jB,KAEJ0jB,EAAAA,EAAAA,YAAU,WACJsI,IACFhsB,EAASy8B,GAAUzQ,IACnBhsB,EAASi1C,GAAcjpB,IACvBhsB,EACE0+B,GAAY,QAAD,OAAS1S,EAAgB3zB,IAAM,CACxCgqC,QAAS+lB,KAIhB,GAAE,CAACp8B,EAAiBhsB,KAErB0jB,EAAAA,EAAAA,YAAU,WACJwjC,IACFlnD,EAAS20C,GAAQ,CAAEt8C,GAAI6uD,KACvBlnD,EACE0+B,GAAY,QAAD,OAASwoB,GAAS,CAC3B2B,IAAKX,KAIZ,GAAE,CAAChB,EAAOlnD,KAEX0jB,EAAAA,EAAAA,YAAU,WACJwzC,EACFyR,EAAYzR,EAAIxtD,KAAK,OACZ0D,GACTu7D,EAAYH,EAEf,GAAE,CAACtR,EAAK9pD,IAELga,EACF,OAAO,gBAAC,GAAD,CAAQ/G,KAAK,QAGtB,GAAI1c,EAAO,MAAMA,EAEjB,IAAMsK,EACJ,2BACE,gBAAC,KAAD,CAAS2V,MAAM,eAAekS,UAAU,QACtC,gBAAC/D,EAAA,EAAD,CACE15B,GAAG,WACH01B,UAAW/O,EACXsF,QAAS5Z,GAAOqU,GAAmBiN,EAAiBhrB,GAAM4J,IAE1D,gBAAC+lD,GAAA,EAAD,QAGJ,gBAAC,KAAD,CAAS/sC,MAAM,WAAWkS,UAAU,QAClC,gBAAC/D,EAAA,EAAD,CACE15B,GAAG,OACH01B,UAAWjP,EACXwF,QAAS5Z,GAAOmU,GAAmBmN,EAAiBhrB,GAAM4J,IAE1D,gBAACgmD,GAAA,EAAD,SAMR,OACE,gBAAC,KAAD,CACE1wC,WAAS,EACTwqB,UAAU,MACVvqB,eAAe,SACfo8B,WAAW,UACX/1C,MAAO,CAAE09B,OAAQ,SAEjB,gBAAC,KAAD,CAAM7jB,MAAI,EAACC,GAAI,GAAIC,GAAI,GAAIE,GAAI,GAC7B,gBAAC,KAAD,CAAMja,MAAO,CAAE09B,OAAQ,SACrB,uBACE19B,MAAO,CAAE8gE,cAAe,SAAUnvC,QAAS,OAAQ+L,OAAQ,SAE3D,gBAAC,KAAD,CACEtgB,MACE,mCACM,4BAAOvrB,IAGf6rB,OAAQ,gBAAC,GAAD,CAAc/W,SAAUA,EAAU+W,QAAM,IAChDsQ,UACe,OAAbrnB,EAAA,UACOkuC,EAAU,YAAc,SAD/B,eAC8CjvC,GACxCiB,EACAD,GAHN,+BAKUA,EAAY,cAAgB,UAExCa,OAAQA,IAEV,gBAAC,KAAD,CACEs5D,iBAAe,EACf/gE,MAAO,CAAE+zB,OAAQ,GACjBD,SAAU,WACR9uB,YAAW,WAAY,QACrBm7C,SAAA,UAAAA,EAAWryB,eAAX,mBAAoBlrB,cAApB,SAA4Bu/C,QAC7B,GAAE,IACJ,GAED,gBAAC,KAAD,CAAkBphB,WAAY,gBAACC,GAAA,EAAD,OAA9B,gBAEE,gBAAC,KAAD,CACE5jB,MACE,0KAOF,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,cAGvB,gBAAC,KAAD,CAAkBhlB,MAAO,CAAEm1B,QAAS,IAClC,gBAAChO,GAAA,EAAD,CAAM40B,OAAK,EAAC/7C,MAAO,CAAE6xB,MAAO,SAC1B,gBAACvK,GAAA,EAAD,CACEK,QAAM,EACN91B,GAAG,UACH01B,UAAWzsB,EACXgjB,QAAS,SAAA7rB,GAAC,OACRiS,GACE2U,GAAmB2M,EAAiB1qB,GACpCsJ,EAFFF,CAGEjS,EAJM,GAOV,gBAACu1B,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,KACG3sB,EAAUA,EAAQ+B,KAAO,qBAG7BiK,GACC,gBAAC,KAAD,CACEsW,MACGtW,EAEG,GADA,iGAGNwoB,UAAU,QAEV,2BACE,gBAAChI,GAAA,EAAD,CACEK,QAAM,EACN91B,GAAG,UACH01B,UAAWzgB,EACXgX,QAAS,SAAA7rB,GAAC,OACRiS,GACE6T,GACEyN,EACA1e,GAEF1C,EALFF,CAMEjS,EAPM,GAUV,gBAACu1B,GAAA,EAAD,KACE,gBAAC4yC,GAAA,EAAD,OAEF,gBAAC3yC,GAAA,EAAD,KACG3gB,EACC,uCACU,4BAAOuC,GAAcvC,KAG/B,qFAEU,gBAACwnB,GAAA,EAAD,CAAUtJ,SAAS,iBAQxCq9C,GACC,gBAAC,KAAD,CACEjlD,MACG1E,EAEG,GADA,6FAGN4W,UAAU,QAEV,2BACE,gBAAChI,GAAA,EAAD,CACEK,QAAM,EACN91B,GAAG,SACH01B,UAAW7O,EACXoF,QAAS5Z,GACPuU,GAAqB+M,EAAiBhrB,GACtC4J,IAGF,gBAACojB,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,KACG/O,EACC,yCACa,IACX,4BAAOrP,GAAcqP,KAGvB,wFAEU,gBAAC4V,GAAA,EAAD,CAAUtJ,SAAS,iBAQzC,gBAACsC,GAAA,EAAD,CACEK,QAAM,EACN91B,GAAG,MACHisB,QAAS5Z,GACPwT,GAAe8N,EAAiBrrB,GAChCiK,IAGF,gBAACojB,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,KAAettB,EAAI0C,OAErB,gBAACyqB,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,iBAEGliB,GAAWqB,EAAW,cAG3B,gBAAC0gB,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACE,gBAAC86C,GAAA,EAAD,OAEF,gBAAC76C,GAAA,EAAD,kBAEGliB,GAAWsB,EAAY,cAG5B,gBAACygB,GAAA,EAAD,KACE,gBAACE,GAAA,EAAD,KACE,gBAAC,GAAD,CACE7gB,SAAuB,OAAbA,EAAoBA,EAAW,UAG7C,gBAAC8gB,GAAA,EAAD,KACgB,OAAb9gB,EAAA,oBACgBA,GACb,kBAGN07D,GACA,gBAAC,KAAD,CACEE,sBAAoB,EACpBnlD,MACEtW,EACI,+CACA,mCAENwoB,UAAU,QAEV,gBAAChI,GAAA,EAAD,CAAUK,QAAM,EAAC7J,QAtRrC,WACEtkB,EAASw0C,GAAU7zC,EAAK2M,IACxB1C,EAAQM,KAAK0T,GAAgBoN,GAC9B,EAmR+D3zB,GAAG,SAC7C,gBAAC21B,GAAA,EAAD,CAAc5N,UAAWH,EAAQqoD,OAC/B,gBAAClT,GAAA,EAAD,OAEF,gBAACnnC,GAAA,EAAD,KACG3gB,EACC,8CACa,4BAAO3M,EAAItI,IADxB,gBACgD,IAC9C,4BAAOwX,GAAcvC,KAHf,iCAMkB3M,EAAItI,GANtB,eAexB,uBACEmO,MAAO,CACLma,SAAU,EACVrX,SAAU,aAGZ,gBAAC,MAAD,CACE60B,IAAKwoB,EACLngD,MAAO,CACL8C,SAAU,WACVg1C,KAAM,EACN3jB,MAAO,EACP0jB,IAAK,EACLziB,OAAQ,GAEVv4B,KAAK,SACL8B,KAAK,OACLpF,MAAOuzD,GAAavzD,EAAM4qB,QAAQ87B,WAClCpuB,MAAM,OACN6L,OAAO,OACPkyB,SAAU,EACV/K,aAAW,EACXf,UAAQ,EACRD,iBAAiB,EACjBxgD,MAAO6+D,EACPpuC,SAtWd,SAAkBu1B,GAChB8Y,EAAY9Y,EACb,EAqWanF,YAAa,CAAEC,gBAAiBC,KAChC50B,QAAS,0BAAM2wB,SAAN,UAAMA,EAAWryB,eAAjB,iBAAM,EAAoBlrB,cAA1B,aAAM,EAA4Bu/C,QAAlC,QAQxB,CAED,SAAejoC,EAAAA,KACb6nD,IACA,SAACS,EAAWC,GAAZ,OACG,IAAQD,EAAUh9C,gBAAiBi9C,EAAUj9C,gBADhD,I,mmBC/dK,SAAShJ,GAAT,GAA0C,IAAxBiC,EAAwB,EAAxBA,UAAc5c,EAAU,SACzCiI,EAAO,CACX2U,UAAAA,EACA5c,OAAAA,GAGF,OAAO,SAAArI,GASL,OARAA,EAAS,CACPI,KAAM,mBACNiF,QAAS,CACPoiB,SAAUpf,EAAOof,SACjB4P,MAAOhvB,EAAOgvB,SAIX3xB,GzGwIF,iByGxI0BZ,EAAAA,GAAAA,gBAAewL,IAC3C5J,KADI,e,EAAA,G,EAAA,yBACC,WAAM1D,GAAN,sGACuBA,EAASkB,OADhC,OACEglE,EADF,OAEJlpE,EAAS,CACPI,KAAM,iBACNiF,SAASzB,EAAAA,GAAAA,cAAaslE,KAJpB,0C,iLADD,uDAQJriE,OAAM,SAAAlD,GACL3D,EAAS,CAAEI,KAAM,gBAAiBiF,QAAS1B,GAC5C,GACJ,CACF,C,o9BC8BD,SA1DA,SAAwBooB,GACtB,IAAQ3E,EAAyC2E,EAAzC3E,UAAWQ,EAA8BmE,EAA9BnE,SAAUjkB,EAAoBooB,EAApBpoB,MAAO8jB,EAAasE,EAAbtE,SAC5B0hD,EAAkBvhD,EAAlBuhD,cAEFC,IAAaxhD,UAAAA,EAAUwhD,aACzBvwE,OAAO8Q,OAAOie,EAASwhD,YAAYpgE,MACjC,SAAAqgE,GAAc,OAAuB,IAAnBA,CAAJ,IAIdC,IAAa1hD,UAAAA,EAAU2hD,UACzB1wE,OAAO8Q,OAAOie,EAAS2hD,SAASvgE,MAC9B,SAAAqgE,GAAc,OAAuB,IAAnBA,CAAJ,IAIdG,EAAY5hD,SAAAA,EAAU2hD,QACxB1wE,OAAOiL,QAAQ8jB,EAAS2hD,SACrBlhE,QAAO,8CACPnQ,KAAI,0BAAE6L,EAAF,iBAAYA,CAAZ,IACP,GAEE0lE,GAAYL,IAAehiD,IAAczjB,EACzC8L,EAAQg6D,EAAY,mBAAwB9lE,GAAS,iBAC3D,EAAkCwlE,GAAiB,CAAC,EAA5CO,EAAR,EAAQA,OAAQtlE,EAAhB,EAAgBA,QAASulE,EAAzB,EAAyBA,KACnBC,EAAcF,GAAUtlE,GAAWulE,EAEzC,OAAIliD,EAEA,+BACGA,GAAYL,GAAa,oDACzBK,GAAY2hD,GACX,2BACE,gBAACjoD,GAAA,EAAD,CAAkB2e,KAAM,KACvB,KACA8pC,EACC,iDACqBxlE,GAAW,YAAJ,OAAgBA,EAAhB,MACzBslE,GAAU,WAAJ,OAAeA,EAAf,MACNC,GAAQ,SAAJ,OAAaA,GAAQ,KAG5B,mDAIJF,GAAY9lE,KAAW2lE,GAAc75D,EACtCg6D,GACCH,GADD,oDAE8CE,EAAU9/D,KACrD,MAHH,wEAQA,mFACR,E,2hECRD,IAAM6V,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJkB,SAAU,GAEZ6wB,YAAa,CACXjX,OAAQx6B,EAAM4f,QAAQ,IAExBkqD,WAAY,CACVl+C,YAAa5rB,EAAM4f,QAAQ,IAE7BiE,MAAO,IACLjD,SAAU,EACVwX,QAAS,QACRp4B,EAAM+pE,YAAYC,GAAG,MAAQ,CAC5B5xC,QAAS,UAGbnV,OAAQ,IACN1Z,SAAU,WACVm1C,aAAc1+C,EAAMiqE,MAAMvrB,aAC1BxzB,iBAAiBg/C,EAAAA,GAAAA,IAAMlqE,EAAM4qB,QAAQ8e,KAAK,KAAM,KAChD,UAAW,CACTxe,iBAAiBg/C,EAAAA,GAAAA,IAAMlqE,EAAM4qB,QAAQ8e,KAAK,KAAM,MAElDrR,WAAY,EACZC,MAAO,QACNt4B,EAAM+pE,YAAYC,GAAG,MAAQ,CAC5B3xC,WAAYr4B,EAAM4f,QAAQ,GAC1B0Y,MAAO,SAGX5F,UAAW,CACTC,OAAQ,WAEVw3C,WAAY,CACVvuC,QAAS57B,EAAM4f,QAAQ,EAAG,GAC1BukB,OAAQ,OACR56B,SAAU,WACVi1C,cAAe,OACfpmB,QAAS,OACTokB,WAAY,SACZp8B,eAAgB,UAElBgqD,UAAW,CACT7/C,MAAO,WAET8/C,WAAY,IACVzuC,QAAS57B,EAAM4f,QAAQ,EAAG,EAAG,EAAG,GAEhC4Y,YAAa,cAAF,OAAgBx4B,EAAM4f,QAAQ,GAA9B,OACXs/B,WAAYl/C,EAAMsqE,YAAYz6C,OAAO,SACrCyI,MAAO,QACNt4B,EAAM+pE,YAAYC,GAAG,MAAQ,CAC5B1xC,MAAO,OACP,UAAW,CACTA,MAAO,UAvDmB,IAyTlC,SA5PA,YAA4C,IAAnBrM,EAAmB,EAAnBA,gBACjBhsB,GAAWmjB,EAAAA,EAAAA,MACXvY,GAAUkY,EAAAA,EAAAA,MACV7C,EAAUV,KAEV0F,EAAY+G,EAAgB3zB,GAE5BiyE,EAAe,CACnB9H,UAAW/2D,GAAS,KACpBupC,SAAS,IAAI90C,MAAO0L,eAGtB,MAAoCmlB,EAAAA,EAAAA,UAASu5C,GAA7C,GAAOC,EAAP,KAAmBC,EAAnB,KACA,MAA0Bz5C,EAAAA,EAAAA,WAAS,iBAAM,CAAC,SAAU,OAAjB,IAAnC,GAAOsG,EAAP,KAAcozC,EAAd,KACA,MAAkC15C,EAAAA,EAAAA,UAAS,KAA3C,GAAOiyC,EAAP,KAAkB0H,EAAlB,KACA,MAA4B35C,EAAAA,EAAAA,UAAS,IAArC,GAAO1nB,EAAP,KAAeshE,EAAf,KACA,MAA0C55C,EAAAA,EAAAA,WAAS,GAAnD,GAAO65C,EAAP,KAAsBC,EAAtB,KAEMpjD,GAAWrE,EAAAA,EAAAA,IAAYmE,IACvBC,GAAgBpE,EAAAA,EAAAA,IAAY0E,IAC5BgjD,GAAiB1nD,EAAAA,EAAAA,IAAYuE,IAC7BojD,GAAkB3nD,EAAAA,EAAAA,IAAYsE,IAC9BsjD,GAAc5nD,EAAAA,EAAAA,IAAYyE,IAE1BojD,EACJ5zC,EAAMlnB,QAAU,GAAgB,KAAX9G,GAAiB0hE,GAAmBH,EAoC3D,SAASM,EAAoB7lE,GAC3B,OAAOrF,GF7I0BmrE,EE6II9lE,EF3IhC,CAAEjF,KAAM,0BAA2BiF,SAD1BzB,EAAAA,GAAAA,cAAaunE,MADxB,IAA8BA,CE8IlC,CAED,SAASC,EAAqB/lE,GAC5B,OAAOrF,GF5I2BmrE,EE4II9lE,EF1IjC,CAAEjF,KAAM,kBAAmBiF,SADlBzB,EAAAA,GAAAA,cAAaunE,MADxB,IAA+BA,CE6InC,EAzBDznD,EAAAA,EAAAA,YAAU,WACR,GAAI+D,EACF,OAAOznB,EACL0+B,GAAY,kBAAD,OAAmBjX,GAAY,CACxCohC,IAAKqiB,EACLzB,SAAU2B,IAIjB,GAAE,CAAC3jD,KAEJ/D,EAAAA,EAAAA,YAAU,WAGR,OAFA1jB,EAASg4B,GAAa,mBACtBrU,SAASC,MAAQ,0BACV,WACL5jB,EF7HG,CAAEI,KAAM,wBE8HZ,CACF,GAAE,CAACJ,IAUJ,IAAMqrE,EAAe,SAACpmD,EAAW5b,EAAQguB,EAAOkzC,GAC9CM,GAAiB,GACjB,IACMz0C,EAAQ,IACZnR,UAAAA,EACAwC,UAHgB6jD,EAAAA,GAAAA,KAIhBjiE,OAAAA,EACAguB,MAAAA,GACGkzC,GAELvqE,EAASgjB,GAAOoT,IAChB5qB,YAAW,WACTq/D,GAAiB,EAClB,GAAE,IACJ,EAED,OACE,gBAAC,GAAD,CAAe9qD,MAAI,GACjB,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE6D,MACE,8CAEE,gBAAC,KAAD,CACEA,MACE,6aAWF,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,YAIzBgJ,UAAU,2DAEZ,uBAAKhuB,MAAO,CAAE6xB,MAAO,SACnB,gBAACkzC,GAAA,EAAD,CAAKpzC,QAAQ,OAAOpO,EAAG,EAAGyhD,QAAQ,oBAChC,gBAACD,GAAA,EAAD,CAAKxhD,EAAG,EAAGpJ,SAAU,GACnB,gBAAC0hD,GAAD,CACEpiD,QAASA,EACTqiD,cArFY,SAAC,GAAiC,IAA/BU,EAA+B,EAA/BA,UAAcuH,EAAiB,SACtDvH,GACF0H,EAAa1H,GAGfwH,GAAc,SAAA/T,GAAS,gBAClBA,GACA8T,EAFkB,GAIxB,EA6Ean0C,MAAK,IAAI4sC,UAAAA,GAAcuH,GACvBhI,OAAK,KAGT,gBAACgJ,GAAA,EAAD,CAAKxhD,EAAG,GACN,gBAAC0hD,GAAA,EAAD,CACE5hE,MAAOwtB,EACPiD,SAjGa,SAAC7hC,EAAGizE,GAC7BjB,EAASiB,EACV,EAgGa,aAAW,uBAEX,gBAACC,GAAA,EAAD,CAAc9hE,MAAM,SAAS,aAAW,SAASsoB,KAAK,UACpD,gBAAC,KAAD,CAASvO,MAAM,gBACb,gBAAC,KAAD,CACE4H,SAAS,QACT,aAAW,wBAIjB,gBAACmgD,GAAA,EAAD,CACE9hE,MAAM,UACN,aAAW,UACXsoB,KAAK,UAEL,gBAAC,KAAD,CAASvO,MAAM,mBACb,gBAACgoD,GAAA,EAAD,CACEpgD,SAAS,QACT,aAAW,2BAIjB,gBAACmgD,GAAA,EAAD,CAAc9hE,MAAM,OAAO,aAAW,OAAOsoB,KAAK,UAChD,gBAAC,KAAD,CAASvO,MAAM,YACb,gBAAC,KAAD,CAAa4H,SAAS,QAAQ,aAAW,wBAOrD,uBAAKhlB,MAAO,CAAE6xB,MAAO,SACnB,gBAACkzC,GAAA,EAAD,CAAKpzC,QAAQ,OAAOhY,eAAe,SAAS4J,EAAG,GAC7C,gBAACwhD,GAAA,EAAD,CAAKxhD,EAAG,GACN,uBAAK3J,UAAWH,EAAQ+C,QACtB,uBAAK5C,UAAWH,EAAQiqD,YACtB,gBAACx9C,GAAA,EAAD,OAEF,gBAACm/C,GAAA,EAAD,CACE91C,YAAY,oBACZ1yB,KAAK,oBACL4c,QAAS,CACPR,KAAMQ,EAAQkqD,UACd/5C,MAAOnQ,EAAQmqD,YAEjBl4C,WAAY,CAAE,aAAc,SAAUC,KAAM,SAC5CtoB,MAAOR,EACPixB,SAAU,SAAA7hC,GAAC,OAAIkyE,EAAUlyE,EAAE+rB,OAAO3a,MAAvB,EACX4wB,UAAW,SAAAhiC,GACJwyE,GAAkC,UAAVxyE,EAAEmX,KAC7By7D,EAAapmD,EAAW5b,EAAQguB,EAAOkzC,EAE1C,EACDhgD,WAAS,IAEX,gBAAC,KAAD,CACElG,QAAQ,YACRhhB,KAAK,gBACLinB,MAAM,UACN9jB,MAAO,CAAEslE,oBAAqB,EAAGhkC,uBAAwB,GACzDxjB,QAAS,kBACP+mD,EAAapmD,EAAW5b,EAAQguB,EAAOkzC,EADhC,EAGTx8C,SAAUk9C,GARZ,cAgBR,gBAAC,KAAD,KACE,gBAACv2C,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,oBACA,gBAACA,GAAA,EAAD,mBACA,gBAACA,GAAA,EAAD,CAAWsc,MAAM,SAAjB,iBAGJ,gBAACpc,GAAA,EAAD,CAAW,aAAW,gBACnBvN,aADH,EACGA,EAAetvB,KAAI,SAAA+R,GAClB,IAAM8hE,EAAY,GAAH,OAAM9hE,EAAI+hE,MAAM/7D,QAC7B,UACA,WAFa,YAGVhG,EAAI7J,KAAK6P,QAAQ,SAAU,SAEhC,OACE,gBAAC2kB,GAAA,EAAD,CACEK,OAAK,EACL7U,UAAWH,EAAQwS,UACnB7iB,IAAK3F,EAAI5R,GACTisB,QAAS,SAAA7rB,GAAC,OACRiS,IjGvB2BuhE,EiGwBgBhiE,EjGvBxD,GAAP,OAAU4T,GiGuBoCmO,GjGvB9C,YACyB,YAAvBigD,EAAaD,MAAsB,WAAa,OADlD,YAEIC,EAAa5zE,KiGsBKuS,EAFFF,CAGEjS,GjG1BjB,IAA0CwzE,CiGsBnB,GAOV,gBAACp3C,GAAA,EAAD,MACG5oB,EAAAA,GAAAA,GAAO,IAAI/L,KAAK+J,EAAIiD,YAAa,aAEpC,gBAAC2nB,GAAA,EAAD,KACE,4BAAOk3C,IAET,gBAACl3C,GAAA,EAAD,CAAWsc,MAAM,SACf,gBAAC,KAAD,CAASvtB,MAAO3Z,EAAI5R,GAAI8jE,UAAU,OAChC,4BAAOtsD,GAAc5F,EAAI5R,OAKlC,KAEH,gBAAC,GAAD,CACEovB,SAAUA,EACVL,UAAW2jD,EACXnjD,SAAUkjD,EACVnnE,MAAOqnE,OAOpB,EC7PD,UAAevgD,EAAAA,GAAAA,IA7FA,SAAA1qB,GAAK,MAAK,CACvB6jB,MAAO,CACLK,aAAc,GACduH,SAAU,IAEZkhB,IAAK,CACHzoB,aAAc,IAEhB2lB,MAAO,CACL1F,OAAQ,IACRnZ,WAAY,UAEdmhD,UAAW,CACT1gD,SAAU,YAEZ4yB,QAAS,CACPrzB,WAAY,SACZrL,cAAe,SACf,SAAU,CACR++C,UAAW,eAGfxiB,SAAU,CACRhxB,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3C7gB,QAAS,CACPwgB,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,MAE3C3qB,IAAK,CACHsqB,gBAAiBlrB,EAAM4qB,QAAQ0wB,QAAQzwB,OAEzCwxB,KAAM,CACJnxB,gBAAiBlrB,EAAM4qB,QAAQhnB,MAAMinB,OAhCrB,GA6Fc,CAChCkB,WAAW,EACXzoB,KAAM,OAFR,EAzDA,SAAqB0oB,GACnB,IAAQzqB,EAAwDyqB,EAAxDzqB,QAAS6qE,EAA+CpgD,EAA/CogD,QAASlsD,EAAsC8L,EAAtC9L,QAASrV,EAA6BmhB,EAA7BnhB,QAASF,EAAoBqhB,EAApBrhB,OAAQ7J,EAAYkrB,EAAZlrB,QAC5CsrB,EAASsxB,GAAan8C,EAAQlB,MAA9B+rB,KACFigD,EAAYh+D,GAAY9M,EAAQiN,KAAM,CAAEE,YAAY,KAAW,GAE/D6qC,EAAU,CACd2C,SAAU,CACRmwB,EAAUC,OAAO,EAAGD,EAAU58D,QAAQ,KAAO,GAC7C48D,EAAUC,OAAOD,EAAU58D,QAAQ,KAAO,GAC1C,YAEF/E,QAAS,CACP,yBACAjF,KAAKC,UAAUnE,EAAQyxC,UAFhB,UAGJzxC,EAAQ0xC,UAAY,aAAe,IACtC,4BAAOxtC,KAAKC,UAAUnE,EAAQ0xC,aAEhCryC,IAAK,CAAC,QAASwrE,EAAS,iBACxB/vB,KAAM,CAAC,QAAS+vB,EAAS,eAG3B,OACE,gBAAC,KAAD,CAAM9zE,GAAE,UAAKiJ,EAAQjJ,GAAb,kBACN,gBAAC,KAAD,CACEurB,MAAOtiB,EAAQ+B,KACfmxB,UAAS,kBAAatoB,GAAa5K,EAAQssD,YAC3C1kB,qBAAsB,CAAEC,QAAQ,GAChCC,yBAA0B,CAAED,QAAQ,GACpCjlB,OAAQ,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQ3e,EAAQlB,OAAQ+rB,KAErD,gBAAC,KAAD,CAAa/L,UAAWH,EAAQm+B,SAC9B,gBAAC,IAAD,CAAYjN,MAAM,UACfmI,EAAQh4C,EAAQlB,MAAM,GACvB,4BAAOk5C,EAAQh4C,EAAQlB,MAAM,IAC5Bk5C,EAAQh4C,EAAQlB,MAAM,GACtBkB,EAAQ0xC,WAAasG,EAAQh4C,EAAQlB,MAAM,KAGhD,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE/H,GAAG,OACHisB,QAAS,SAAA7rB,GAAC,OACRiS,EAAO2U,GAAmBxe,EAASS,GAAUsJ,EAA7CF,CAAsDjS,EAD9C,GAFZ,SAWP,I,o9BCdD,SAzEA,YAA2C,IAAnBuzB,EAAmB,EAAnBA,gBACtB,MAA4B+E,EAAAA,EAAAA,UAAS,IAArC,GAAO1oB,EAAP,KAAe8iC,EAAf,KAEMnrC,GAAWmjB,EAAAA,EAAAA,MAEXvY,GAAUkY,EAAAA,EAAAA,MAEVmC,EAAY+G,EAAgB3zB,GAE5BmtB,GAAOpC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMmC,KAAKT,KAAf,IAExBopC,GAAe/qC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0D,SAAShC,KAAnB,IAEhCgC,EAAW,IAAQ,IAAOonC,GAAe,CAC7C,SAAAvC,GAAC,OAAIA,EAAEvoD,KAAKuL,aAAX,IACAvG,QAAO,SAAAujD,GAAC,OAAIA,EAAE3mC,YAAcA,CAApB,IAELmC,GAAYhE,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM0D,SAASK,SAAnB,IAsBnC,OAVA1D,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,oBACjB5jB,EAASg4B,GAAa,YACvB,GAAE,CAACh4B,KAEJ0jB,EAAAA,EAAAA,YAAU,WACR1jB,EAASi1C,GAAcjpB,IACvBhsB,EAASy8B,GAAUzQ,GACpB,GAAE,CAAC/G,EAAWjlB,IAGb,2BACE,gBAAC,GAAD,CACE45B,QAAQ,UACRF,OAAO,uCACP1W,OAzBqB,SAAAvqB,GAAC,OAAI0yC,EAAU1yC,EAAE+rB,OAAO3a,MAAM+E,cAA7B,EA0BtB+qB,WAAYtxB,EACZunB,OAAQ,SAAAn3B,GAAC,OAAIiS,GnG2OZ,GAAP,OAAUmT,GmG3OsCmO,GnG2OhD,iBmG3OkEphB,EAA/CF,CAAwDjS,EAA5D,IAEV2uB,EACC,gBAAC,GAAD,CAAQ/G,KAAK,aAEb,gBAAC,GAAD,KACG0G,EAAS1e,QA/BG,SAAA/G,GACnB,OACEA,EAAQ+B,KAAKuL,cAAc0nB,SAASjuB,IACnC/G,EAAQyxC,UACPvtC,KAAKC,UAAUnE,EAAQyxC,UAAUnkC,cAAc0nB,SAASjuB,EAE7D,IAyBsCnQ,KAAI,SAACoJ,EAASusB,GAAV,OACjC,gBAAC,GAAD,CACEvsB,QAASA,EACToJ,OAAQA,GACRE,QAASA,EACTgF,IAAKtO,EAAQjJ,GACb8zE,QAAS3mD,EAAKlkB,EAAQuM,OAAS2X,EAAKlkB,EAAQuM,OAAOxK,KAAO,KAC1DwpD,MAAOh/B,EACPhtB,QAASmrB,GARsB,KAe5C,ECuBD,SAnFA,YAA8C,IAAnBA,EAAmB,EAAnBA,gBACnBhsB,GAAWmjB,EAAAA,EAAAA,MAEXqH,GAAcpH,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAI8F,GAAkB9F,EAAtB,GAAN,KAEzBipD,GAAsBlpD,EAAAA,EAAAA,KAC1B,SAAAC,GAAK,OAAIA,EAAM6B,SAAS41C,YAAnB,GADgC,KAKjCA,GAAe1yB,EAAAA,EAAAA,UACnB,kBACEkkC,EACGjkE,QAAO,SAAAwd,GAAC,QAAMA,EAAEslD,OAAR,IACR1hE,MAAK,SAACse,EAAGC,GACR,OAAIA,EAAEukD,UAAYxkD,EAAEwkD,WACV,EAEH,CACR,KAAK,EARV,GASA,CAACD,IAGGllD,GAAaoD,EAUnB,OARA9G,EAAAA,EAAAA,YAAU,WACR1jB,E5DvBK,CACLo3B,QAASgW,G4DsBkBphB,G5DrB3BqL,MAAO,CpDkF4B,0BoDhFjC75B,GpDkF8B,yBgH9DjC,GAAE,CAACwC,EAAUgsB,KAEdtI,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,gBAClB,GAAE,IAECwD,EACK,gBAAC,GAAD,CAAQ/G,KAAK,iBAIpB,gBAAC,GAAD,CAAeP,MAAI,GACjB,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE8D,MAAM,6BACN4Q,UAAWxI,EAAgB3oB,OAE7B,gBAAC,KAAD,KACE,gBAACqxB,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,qBACA,gBAACA,GAAA,EAAD,mBACA,gBAACA,GAAA,EAAD,iBACA,gBAACA,GAAA,EAAD,aACA,gBAACA,GAAA,EAAD,iBAEE,gBAAC,KAAD,CAASjR,MAAM,8BACb,gBAAC,KAAD,CAAU4H,SAAS,gBAK3B,gBAACuJ,GAAA,EAAD,KACG+lC,EAAa5iE,KAAI,SAAA2tB,GAAC,OACjB,gBAAC+O,GAAA,EAAD,CAAUK,OAAK,EAACrlB,IAAKiW,EAAExtB,IACrB,gBAACw8B,GAAA,EAAD,KAAYhP,EAAE2mD,aACd,gBAAC33C,GAAA,EAAD,KAAYhP,EAAE0mD,WACd,gBAAC13C,GAAA,EAAD,KAAYhP,EAAES,UACd,gBAACuO,GAAA,EAAD,KAAYhP,EAAEW,MACd,gBAACqO,GAAA,EAAD,KACE,4BAAOrvB,KAAKC,UAAUogB,EAAEslD,WAPX,QAiBhC,E,o9BC9DD,IAAMsB,GAAc,CAClB,CAAC,yBAA0BC,IAC3B,CAAC,uBAAwBC,IACzB,CAAC,qCAAsCC,IACvC,CAAC,8BAA+B1hC,IAChC,CAAC,8CAA+C2hC,IAChD,CAAC,8CAA+CA,IAChD,CAAC,4BAA6BC,IAC9B,CAAC,uBAAwBC,IACzB,CAAC,2BAA4BC,IAC7B,CAAC,2BAA4BC,IAC7B,CAAC,gCAAiCD,IAClC,CAAC,2BAA4BE,IAC7B,CAAC,+BAAgCC,IACjC,CAAC,oCAAqCC,IACtC,CAAC,uBAAwBvrE,IACzB,CAAC,2BAA4B0mE,IAC7B,CAAC,2BAA4B8E,IAC7B,CAAC,2BAA4BC,IAC7B,CAAC,+BAAgC3vB,IACjC,CAAC,wC5CodI,SAAyB5xB,GAC9B,IAAM/rB,GAAWmjB,EAAAA,EAAAA,MACjB,MAA+B4N,EAAAA,EAAAA,WAAS,GAAxC,GAAOw8C,EAAP,KAAkBC,EAAlB,KACA,MAA0Bz8C,EAAAA,EAAAA,UAAS,MAAnC,GAAOptB,EAAP,KAAc8nD,EAAd,KAEQgiB,GAAgBlsC,EAAAA,EAAAA,MAAhBksC,YAEFnsE,GAAU8hB,EAAAA,EAAAA,KAAY,SAAAC,GAC1B,IAAMhD,EnDlPH,SAAqBgD,EAAO6C,GACjC,OAAOrtB,OAAO8Q,OAAO0Z,EAAM0D,SAAShC,OAAOoB,MACzC,gBAAG1lB,EAAH,EAAGA,KAAMpI,EAAT,EAASA,GAAT,OAAkB6tB,IAAezlB,GAAQylB,IAAe7tB,CAAxD,GAEH,CmD8OgBq1E,CAAYrqD,EAAOoqD,GAahC,OATIptD,IACEA,GAAQA,EAAK0yB,UAAqC,WAAzB,GAAO1yB,EAAK0yB,YACvC1yB,EAAK0yB,SAAWvtC,KAAKC,UAAU4a,EAAK0yB,WAElC1yB,GAAQA,EAAK2yB,WAAuC,WAA1B,GAAO3yB,EAAK2yB,aACxC3yB,EAAK2yB,UAAYxtC,KAAKC,UAAU4a,EAAK2yB,aAIlC3yB,CACR,GAf0B,KA+B3B,IAdAqD,EAAAA,EAAAA,YAAU,WACR,4BAAC,gGACMpiB,EADN,0CAGWtB,EAASq1C,GAAao4B,IAHjC,sDAKKhiB,EAAS,EAAD,IALb,uBAOK+hB,GAAU,GAPf,yEAAD,EAWD,GAAE,CAAClsE,EAASmsE,EAAaztE,KAErBsB,GAAWisE,EACd,KAAM,CAAEtqE,OAAQ,KAGlB,GAAIU,EACF,MAAMA,EAGR,OAAKrC,EAKH,gBAACs7C,GAAD,MACM7wB,EADN,CAEEzqB,QAASA,EACTsiB,MAAOtiB,EAAQ+B,KACfw5C,aAAcvH,MART,gBAAC,GAAD,CAAQj1B,KAAK,WAWvB,G4C7gBC,CAAC,wBAAyBstD,IAC1B,CAAC,yBAA0BC,IAC3B,CAAC,kBAAmBP,KAoFtB,SAjFA,WACE,IAAMrtE,GAAWmjB,EAAAA,EAAAA,MACXxf,GAAQyf,EAAAA,EAAAA,IAAYgC,IAElB3kB,GAAS8gC,EAAAA,EAAAA,MAAT9gC,KAEFmK,GAAUkY,EAAAA,EAAAA,MAEVkJ,GAAkB5I,EAAAA,EAAAA,KACtB,SAAAC,GAAK,O/FiSF,SAAqBA,EAAO6C,GACjC,OAAOrtB,OAAO8Q,OAAO0Z,EAAM6B,SAASH,OAAOoB,MACzC,gBAAG1lB,EAAH,EAAGA,KAAMpI,EAAT,EAASA,GAAT,OAAkB6tB,IAAezlB,GAAQylB,IAAe7tB,CAAxD,GAEH,C+FrSYw1E,CAAYxqD,EAAO5iB,EAAvB,GAD4B,KAK7BqtE,GAAmB1qD,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM6B,SAASkC,SAAnB,IAuB1C,IArBA1D,EAAAA,EAAAA,YAAU,WACJsI,IACFhsB,ErF1EG,CAAEI,KAAMrB,GAAgB8B,QqF0EJmrB,IACvBhsB,EAASqtC,GAAgBrhB,IACzBhsB,EAASy8B,GAAUzQ,IACnBhsB,EAASwvB,MAEZ,GAAE,CAAC/uB,EAAMurB,EAAiBhsB,KAE3B0jB,EAAAA,EAAAA,YAAU,WACHsI,GAAoB8hD,GACvB9tE,EAASsG,GAAmB7F,GAE/B,GAAE,CAACA,EAAMqtE,EAAkB9hD,EAAiBhsB,KAE7C0jB,EAAAA,EAAAA,YAAU,WACR,OAAO,WACL1jB,EAASi4B,KACV,CACF,GAAE,CAACx3B,EAAMT,IAEN2D,EAAO,MAAMA,EAEjB,OAAKqoB,EAKH,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEpc,IAAI,kBACJo8B,KAAK,uCACLD,GAAG,uCAEL,gBAAC,KAAD,CACEn8B,IAAI,mBACJo8B,KAAK,4CACLD,GAAG,uCAEL,gBAAC,KAAD,CACEn8B,IAAI,iBACJo8B,KAAK,0CACLD,GAAG,2CAEL,gBAAC,KAAD,CACEn8B,IAAI,oBACJo8B,KAAK,gCACLD,GAAG,8BAEJ0gC,GAAYv0E,KAAI,0BAAEyS,EAAF,KAAQojE,EAAR,YACf,gBAAC,KAAD,CACEC,OAAK,EACLp+D,IAAG,UAAKjF,EAAL,UACHA,KAAMA,EACN8qB,OAAQ,kBACN,gBAACs4C,EAAD,CAAWn+D,IAAKjF,EAAMqhB,gBAAiBA,GADjC,GALK,IAUjB,gBAAC,KAAD,CAAOpc,IAAI,YACT,gBAAC67B,GAAD,CAAgB9nC,MAAO,CAAEV,OAAQ,KAAO2H,QAASA,MApC9C,gBAAC,GAAD,CAAQyV,KAAK,UAAUN,MAAI,GAwCrC,E,gUCrIM,SAASkuD,GAAsBptE,GACpC,OAAO,IAAIuhB,SAAQ,SAACtpB,EAASupB,GAC3B1d,GhHGG,SAAgC9D,GACrC,MAAO,0BAAP,OAAiCA,EAAQxI,GAC1C,CgHLO61E,CAAuBrtE,IACxB6F,KADH,6CACQ,WAAM1D,GAAN,sGACeA,EAASkB,OADxB,OACEoM,EADF,OAEJxX,GAAQ8K,EAAAA,GAAAA,cAAa0M,IAFjB,2CADR,uDAKGzJ,OAAM,SAAAlD,GACL0e,EAAO1e,EACR,GACJ,GACF,C,gBCQK4b,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJkB,SAAU,GAEZ+Z,KAAM,CACJA,KAAM,GAERy3B,SAAU,CACRlnC,gBAAiBlrB,EAAM4qB,QAAQkB,QAC/BmE,WAAYjwB,EAAMkwB,WAAWD,WAC7BjF,WAAY,GACZrL,cAAe,GACf6Y,YAAa,GACbkX,aAAc,IAEhB0+B,WAAY,CACV91C,MAAO,IACP6L,OAAQ,OACR56B,SAAU,WACVk1C,WAAYz+C,EAAM4qB,QAAQgI,UAAUrH,MAnBN,IAuBlC,SAAS8iD,GAAT,GAOG,IANDvtE,EAMC,EANDA,QACA0kB,EAKC,EALDA,KACA7a,EAIC,EAJDA,OACA2jE,EAGC,EAHDA,SACA/oD,EAEC,EAFDA,WACAgpD,EACC,EADDA,mBAEMruD,EAAUV,KACVxf,GAAQyyD,EAAAA,EAAAA,KACR5nD,GAAUkY,EAAAA,EAAAA,MACV3f,EAAM,CACVmB,OAAOW,SAASy2D,SAChB,GACAp3D,OAAOW,SAASigC,KAChB,QACArkC,EAAQw7D,SACR3yD,KAAK,KACDyoB,EAAOtxB,EAAQ6yB,SAAW7yB,EAAQ6yB,SAAW,eAC7CjO,EAAeH,EAAaA,EAAWG,aAAe,EACtDC,EAAWH,EAAKI,gBAChB4oD,EACJ1tE,EAAQs0B,kBACP/oB,GAASvL,EAAQs0B,iBAAkBj1B,KAAKC,MAAO,QAAU,GAAM,IAE5D8yD,EAAapyD,EAAQ00D,MAAMvsD,MAAK,SAAAwlE,GAAI,OAAqB,IAAjBA,EAAKrb,OAAT,IAE1C,OACE,gBAAC,KAAD,CACE3sD,MAAO,CAAEioE,SAAU,cACnBp2E,GAAIwI,EAAQxI,GACZgL,KAAK,gBAEL,gBAAC,KAAD,CACEugB,MAAO/iB,EAAQwC,KACfmxB,UAAW3zB,EAAQmG,aAAe,MAClCiH,OACE,gBAAC,KAAD,CAAiBwB,KAAMtM,GACrB,gBAAC,KAAD,CAAS9K,GAAG,cAAcurB,MAAM,kBAC9B,gBAACmO,EAAA,EAAD,KACE,gBAAC,KAAD,WAMTs8C,EACC,uBAAKjuD,UAAWH,EAAQkyC,UACtB,gBAACkD,GAAA,EAAD,CAAqBh9B,MAAM,OAAO6L,OAAQ,KACxC,gBAACoxB,GAAA,EAAD,CACEhlD,KAAM+9D,EACN9zC,OAAQ,CACN8jB,IAAK,GACL1jB,MAAO,GACPiB,OAAQ,EACR0iB,KAAM,KAGR,gBAACkX,GAAA,EAAD,CAAOiH,MAAI,EAAChH,QAAQ,SACpB,gBAAC,KAAD,MACCxC,GACC,gBAAC2C,GAAA,EAAD,CACEx1D,KAAK,WACLq1D,QAAQ,UACRI,QAAQ,IACRC,OAAQ/1D,EAAM4qB,QAAQgI,UAAUrH,KAChCyqC,KAAMh2D,EAAM4qB,QAAQgI,UAAUrH,KAC9B0qC,KAAK,EACLC,YAAa,IAGjB,gBAACL,GAAA,EAAD,CACEx1D,KAAK,WACLq1D,QAAQ,UACRI,QAAQ,IACRC,OAAQ/1D,EAAM4qB,QAAQhnB,MAAM2nB,KAC5ByqC,KAAMh2D,EAAM4qB,QAAQhnB,MAAM2nB,KAC1B0qC,KAAK,EACLC,YAAa,IAEf,gBAACL,GAAA,EAAD,CACEx1D,KAAK,WACLq1D,QAAQ,UACRI,QAAQ,IACRC,OAAQ/1D,EAAM4qB,QAAQU,QAAQC,KAC9ByqC,KAAMh2D,EAAM4qB,QAAQU,QAAQC,KAC5B0qC,KAAK,EACLC,YAAa,OAMrB,gBAAC,GAAD,CAAQ51C,KAAK,aAAaY,OAAK,IAEjC,gBAAC,KAAD,KACGqtD,EACC,gBAAC,GAAD,CAAQjuD,KAAK,kBAAkBY,OAAK,IAEpC,2BACE,gBAAC,IAAD,KACGsE,EAAKrX,MADR,mBAEGhC,GAAarL,EAAQs0B,kBAFxB,IAE2C,4BAE3C,gBAAC/T,GAAA,EAAD,CACEiD,QAAQ,cACRxa,MAAQ4b,EAAeC,EAAY,IACnCgpD,YAAaH,IAEf,gBAAC,IAAD,KACG9oD,EAAe,IAAOA,EAAtB,UAAwCA,EAAe,IAAvD,KADH,MAGGC,EAAW,IAAOA,EAAlB,UAAgCA,EAAW,IAA3C,KAHH,WAQN,gBAAC,KAAD,KACE,gBAAC,KAAD,CACErtB,GAAG,eACHisB,QAAS5Z,EAAO4T,GAAoBzd,GAAU+J,IAFhD,QAMA,uBAAKwV,UAAWH,EAAQya,OACxB,gBAAC,KAAD,CAAQpW,QAAS5Z,EAAOoT,GAAkBjd,GAAU+J,IAClD,gBAAC,KAAD,MADF,IAESunB,IAKhB,CAWDi8C,GAAY1yC,aAAe,CACzBpW,WAAY,KACZ+oD,SAAU,KACV9oD,KAAM,CAAC,GAGT,SAAe7E,EAAAA,KAAW0tD,I,8DClL1B,SAASO,GAAT,GAAoD,IAA1B3xB,EAA0B,EAA1BA,UAAW4xB,EAAe,EAAfA,YAC7BhkE,GAAUkY,EAAAA,EAAAA,MAChB,OACE,gBAAC,KAAD,CAAM5C,WAAS,EAACC,eAAe,UAC7B,gBAAC,KAAD,CAAME,MAAI,EAACC,GAAI,GAAI2V,GAAI,EAAG1V,GAAI,GAC5B,gBAAC,KAAD,KACE,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY8D,QAAQ,MAApB,sBACA,2BACA,gBAAC,IAAD,qFAE4B,wCAF5B,yDAMF,gBAACsJ,GAAA,EAAD,KACGihD,EACC,gBAAC9gD,GAAA,EAAD,CAAUK,QAAM,EAAC7J,QAAS5Z,GxGrC/B,YwGqCsDE,IAAjD,IAEE,gBAACojB,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,uBACiB,qCADjB,0CAMF,gBAACH,GAAA,EAAD,CAAUK,QAAM,EAAC7J,QAAS04B,GAA1B,IAEE,gBAAChvB,GAAA,EAAD,KACE,gBAAC6gD,GAAA,EAAD,OAEF,gBAAC5gD,GAAA,EAAD,qBACe,oCADf,uBAKJ,gBAACH,GAAA,EAAD,CACEK,QAAM,EACN7J,QAAS,kBAAMhgB,OAAO2G,KAAK,2BAA4B,SAA9C,GAFX,IAKE,gBAAC+iB,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,iBACW,iCADX,6BAIF,gBAACH,GAAA,EAAD,CACEK,QAAM,EACN7J,QAAS,kBACPhgB,OAAO2G,KACL,8CACA,SAHK,GAFX,IAUE,gBAAC+iB,GAAA,EAAD,KACE,gBAAC8gD,GAAA,EAAD,OAEF,gBAAC7gD,GAAA,EAAD,sBACgB,4CADhB,4BAIF,gBAACH,GAAA,EAAD,CAAUK,QAAM,EAAC7J,QAAS,W3GwB/B,IAA4B,EACjC,UAAAX,SAASorD,eAAe,6BAAxB,SAA+CC,O2GzBX,GAA1B,IAEE,gBAAChhD,GAAA,EAAD,KACE,gBAACihD,GAAA,EAAD,OAEF,gBAAChhD,GAAA,EAAD,mBACa,+CADb,6CAMJ,gBAAC,KAAD,KACE,gBAAC,IAAD,4DAQX,CAOD0gD,GAAejzC,aAAe,CAC5BshB,WAAW,GAGb,Y,0HCzGA,IAAMpqB,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAMhB,OAJKiG,EAAOtG,OACVK,EAAOL,KAAO,YAEZ6M,GAASvG,EAAOtG,QAAOK,EAAOL,KAAO6M,GAASvG,EAAOtG,OAClDK,CACR,EAiGD,SA/FA,YAAoE,IAAzC2jC,EAAyC,EAAzCA,UAAWiL,EAA8B,EAA9BA,aAAc48B,EAAgB,EAAhBA,aAC5CjwC,EAAM,e,EAAA,G,EAAA,yBAAG,WAAMt1B,GAAN,yGAELulE,EAAavlE,GAFR,4DAIP,gBAAiBlG,IAJV,yCAKF6G,GAAiB,KAAM5G,OAAQiG,IAL7B,0E,iLAAH,sDAYZ,OACE,gBAAC,KAAD,CACEsB,KAAMo8B,EACNld,QAASmoB,EACT,kBAAgB,qBAEhB,gBAAC,MAAD,CACEhd,SAAU2J,EACVrM,SAAUA,GACV8N,cAAe,CAAEr9B,KAAM,IACvBoyB,OAAQ,gBACNI,EADM,EACNA,SACAF,EAFM,EAENA,WACAD,EAHM,EAGNA,aACA/rB,EAJM,EAINA,OACA61B,EALM,EAKNA,oBACAC,EANM,EAMNA,gBACAC,EAPM,EAONA,wBAPM,OASN,gCACE,gBAAC,KAAD,CAAarnC,GAAG,qBAAhB,sBACA,gBAAC,KAAD,KACE,gBAACoyC,GAAA,EAAD,gHAIA,gBAAC,MAAD,CACElgB,WAAS,EACTgQ,OAAO,QACPzE,UAAW3F,GACXjiB,MAAM,eACN7V,GAAG,OACH+H,KAAK,OACLiwB,WAAS,EACThtB,KAAK,SAENsG,EAAOtG,MACN,gBAAC,KAAD,KACE,4BAAO2M,GAAQrG,EAAOtG,OAAS,iBAGnC,gBAAC,MAAD,CACE0yB,YAAY,mCACZwE,OAAO,QACPzE,UAAW3F,GACXjiB,MAAM,cACN7V,GAAG,cACH+H,KAAK,OACLiwB,WAAS,EACThtB,KAAK,iBAGT,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQihB,QAASguB,EAAchoB,MAAM,WAArC,UAGA,gBAAC,KAAD,CACEhG,QAASoR,EACTpL,MAAM,UACNjyB,GAAG,qBACH01B,SACE4H,GACAE,GACA2J,GACCC,IAAoBC,GARzB,WA9CE,IAiEf,E,8kCCjGD,SAASyvC,KACP,IAAMnvE,GAAWmjB,EAAAA,EAAAA,MACjB,MAAkC4N,EAAAA,EAAAA,WAAS,GAA3C,GAAOsW,EAAP,KAAkBC,EAAlB,KACA,MAA4BvW,EAAAA,EAAAA,UAAS,IAArC,GAAO1oB,EAAP,KAAe8iC,EAAf,KACMvgC,GAAUkY,EAAAA,EAAAA,MAEV0Q,GAAepQ,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM6B,SAASH,KAAnB,GAAN,KAE1BG,GAAWkjB,EAAAA,EAAAA,UACf,kBAAM,IAAQ,IAAO5U,GAAe,CAAC,SAAAzJ,GAAC,OAAIA,EAAE1mB,KAAKuL,aAAX,GAAtC,GACA,CAAC4kB,IAGH,GAAkCpQ,EAAAA,EAAAA,KAChC,SAAAC,GAAK,OAAIA,EAAM6B,QAAV,GADsC,KAArCmpD,EAAR,EAAQA,SAAUlpD,EAAlB,EAAkBA,YAKZL,GAAQ1B,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMyB,MAAMC,KAAhB,GAAN,KAEnBqC,GAAYhE,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM6B,SAASkC,SAAnB,IAE7BstB,GAAStxB,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAM6B,SAASwvB,MAAnB,IAE1B45B,GAAqBlrD,EAAAA,EAAAA,KACzB,SAAAC,GAAK,OAAIA,EAAM6B,SAASkqD,cAAnB,IAGDpyB,EAAY,WAChB1V,GAAa,EACd,EAMK4nC,EAAY,e,EAAA,G,EAAA,yBAAG,6GAAS7rE,EAAT,EAASA,KAAM2D,EAAf,EAAeA,YAAf,SACbhH,EAAS+G,GAAc,CAAE1D,KAAAA,EAAM2D,YAAAA,KADlB,OAEnBsgC,GAAa,GAFM,0C,iLAAH,sDAgClB,OAfA5jB,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,oBACjB5jB,EAASg4B,GAAa,sBACtBh4B,EAASwvB,KACV,GAAE,CAACxvB,KAEJ0jB,EAAAA,EAAAA,YAAU,WACJwB,EAAS/U,OAAS,IACpBnQ,ElE5DG,CACLo3B,QAAS+V,KACT9V,MAAO,CAACh6B,GAAwBC,GAAuBC,MkE2DrD2nB,EAASgZ,SAAQ,SAAAr9B,GACfb,EChED,SAAiCa,GACtC,MAAO,CACLu2B,QAAS62C,GAAsBptE,GAC/Bw2B,MAAO,CvHoGT,kCuHlGI35B,GvHoGsC,gCuHhG3C,CDuDgB2xE,CAAwBxuE,GAClC,IAEJ,GAAE,CAACqkB,EAAUllB,IAGZ,2BACE,gBAAC,GAAD,CACE45B,QAAQ,UACR5W,OA/BqB,SAAAvqB,GACzB0yC,EAAU1yC,EAAE+rB,OAAO3a,MAAM+E,cAC1B,EA8BK+qB,WAAYtxB,EACZqxB,OAAO,2CACP9J,OAAQotB,IAGT51B,EACC,gBAAC,GAAD,CAAQ/G,KAAK,aAEb,gBAAC,GAAD,CAAgBD,UAAU,gBACvB8E,EAAS7c,QArCG,SAAAxH,GACnB,OACEA,EAAQwC,KAAKuL,cAAc0nB,SAASjuB,IACnCxH,EAAQmG,aACPnG,EAAQmG,YAAY4H,cAAc0nB,SAASjuB,EAEhD,IA+BsCnQ,KAAI,SAAA6xB,GAAC,OAClC,gBAAC,GAAD,CACEna,IAAKma,EAAE1xB,GACPwI,QAASkpB,EACTxE,KAAMT,EAAMiF,EAAElF,QACdna,OAAQA,GACR2jE,SAAUA,EAAStkD,EAAE1xB,IACrBitB,WAAYH,EAAY4E,EAAE1xB,IAC1Bi2E,mBAAoBA,GARY,KAavC55B,GAA8B,IAApBxvB,EAAS/U,QAClB,gBAAC,GAAD,CACE6sC,UAAWA,EACX4xB,aAAa,EACbhkE,QAASA,IAGb,gBAAC,GAAD,CACEy8B,UAAWA,EACXiL,aAxEY,WAChBhL,GAAa,EACd,EAuEK4nC,aAAcA,IAIrB,CAED,SAAexuD,EAAAA,KAAWyuD,I,gBExHpB5vD,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJg/B,aAAc,EACd1zB,WAAYhrB,EAAM4f,QAAQ,GAC1BD,cAAe3f,EAAM4f,QAAQ,IAE/B2vD,SAAU,CACRvkD,WAAY,GAEdwkD,YAAa,CACX7vD,cAAe,gBAEjB45C,SAAU,CACRz4C,UAAW,UAEb2R,KAAM,CACJ4yB,gBAAiB,OAAF,OAASnhB,GAAAA,QAAT,MAEjBurC,MAAO,CACL9vD,cAAe3f,EAAM4f,QAAQ,IAE/Bpa,KAAM,CACJma,cAAe3f,EAAM4f,QAAQ,IAE/B8vD,MAAO,CACL/vD,cAAe3f,EAAM4f,QAAQ,GAC7B+vD,WAAY,WA1BkB,IA0ElC,SA5CA,YAYG,IAXD7vD,EAWC,EAXDA,SACA2S,EAUC,EAVDA,KACAg9C,EASC,EATDA,MACAC,EAQC,EARDA,MACAnW,EAOC,EAPDA,SACA/zD,EAMC,EANDA,KACAua,EAKC,EALDA,KACAusB,EAIC,EAJDA,SACAh0C,EAGC,EAHDA,GACAi3E,EAEC,EAFDA,SACAC,EACC,EADDA,YAEMtvD,EAAUV,KAEVowD,EAAU,CACd1vD,EAAQR,KACR+S,GAAQvS,EAAQuS,KAChB8mC,GAAYr5C,EAAQq5C,SACpBgW,GAAYrvD,EAAQqvD,SACpBC,GAAetvD,EAAQsvD,aAGzB,OACE,uBAAKl3E,GAAIA,EAAI+nB,WAAWgO,EAAAA,EAAAA,GAAKuhD,IAC3B,gBAAC,KAAD,CAAW7vD,KAAMA,GACd0vD,GACC,uBAAKpvD,UAAWH,EAAQuvD,OACtB,gBAAC,IAAD,CAAYnrD,QAAQ,MAAMmrD,GAC1B,gBAAC,IAAD,CAAYnrD,QAAQ,aAAagoB,IAGpCxsB,GAAY,uBAAKO,UAAWH,EAAQ1a,MAAOsa,GAC3Cta,GAAQ,gBAAC,IAAD,CAAY6a,UAAWH,EAAQ1a,MAAOA,GAC9CkqE,GACC,gBAAC,IAAD,CAAYprD,QAAQ,KAAKjE,UAAWH,EAAQwvD,OACzCA,IAMZ,EC3DD,SAfA,WACE,IAAMzvE,GAAWmjB,EAAAA,EAAAA,MAOjB,OALAO,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,mBACjB5jB,EAASoQ,KACV,GAAE,CAACpQ,IAGF,gBAAC,GAAD,KACE,gBAAC,GAAD,CAAgB4uE,aAAW,IAGhC,E,4BCZKrvD,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJ,qBAAsB,CACpBkM,YAAa,EACb1H,cAAe,IAGnB2rD,KAAM,CACJtlD,MAAOvqB,EAAM4qB,QAAQilD,KAAKtkD,MAE5B+vB,QAAS,CACP/wB,MAAOvqB,EAAM4qB,QAAQ0wB,QAAQ/vB,MAE/BZ,QAAS,CACPJ,MAAOvqB,EAAM4qB,QAAQD,QAAQY,MAE/B3nB,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAjBG,IAqBlC,SAASukD,GAAT,GAAgE,IAA5CxvE,EAA4C,EAA5CA,aAAcikB,EAA8B,EAA9BA,QAAS6F,EAAqB,EAArBA,QAASkL,EAAY,EAAZA,SAC5CpV,EAAUV,KA2BhB,OACE,gBAAC,KAAD,CACEuwD,aAAc,CACZ,aAAczvE,EAAaP,KAE7BzH,GAAG,WACHuX,IAAKvP,EAAahI,GAClB03E,aAAc,CACZC,SAAU,SACVC,WAAY,QAEdhlE,OAAQ5K,EAAahI,GACrB63E,iBAAkB,IAClB/lD,QApBgB,SAACkI,EAAO89C,GACX,cAAXA,GAGJhmD,GACD,EAgBGiL,gBAAiB,CAAEC,SAAUA,GAC7B5qB,QACE,wBAAMpS,GAAG,aAAa+nB,UAAWH,EAAQR,MA1C/C,SAAmB1f,GACjB,OAAQA,GACN,IAAK,UACH,OAAO,gBAACg8C,GAAA,EAAD,CAAavwB,SAAS,QAAQpL,UAAWH,EAAQo7B,UAE1D,IAAK,OACH,OAAO,gBAAC6Z,GAAA,EAAD,CAAM1pC,SAAS,QAAQpL,UAAWH,EAAQ2vD,OAEnD,IAAK,UACH,OAAO,gBAAC5zB,GAAA,EAAD,CAASxwB,SAAS,QAAQpL,UAAWH,EAAQyK,UAEtD,IAAK,QACH,OAAO,gBAAC,KAAD,CAAOc,SAAS,QAAQpL,UAAWH,EAAQtc,QAEpD,QACE,OAAO,KAEZ,CA0BQysE,CAAU/vE,EAAaN,OACvBM,EAAaP,KAGlBmO,OAAQ,CACN,gBAAC8jB,EAAA,EAAD,CACEniB,IAAI,QACJvX,GAAG,YACH,aAAW,QACXiyB,MAAM,UACNhG,QAASA,GAET,gBAAC,KAAD,SAKT,CAED,SAAe5D,EAAAA,KAAWmvD,I,yHCtE1B,IAAMtwD,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJ0Y,QAAS,OACTmkB,SAAU,OACVC,WAAY,QAEd54C,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAPG,IAW5BsH,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAWhB,OAVKiG,EAAO0mE,kBACV3sE,EAAO2sE,gBACL,qDAEC1mE,EAAO+G,QACVhN,EAAOgN,MAAQ,YAEb/G,EAAO+G,QAAU/G,EAAO2mE,oBAC1B5sE,EAAOgN,MAAQ,2CAEVhN,CACR,EAyHD,SAvHA,WACE,IAAMkH,GAAUkY,EAAAA,EAAAA,MAEV9iB,GAAWmjB,EAAAA,EAAAA,MAEXlD,EAAUV,KAEVmhB,GAAgBtd,EAAAA,EAAAA,IAAY+F,GAAD,KAE3BonD,GAAkBntD,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgG,KAAKknD,eAAf,IAuBzC,OArBA7sD,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,uBAClB,GAAE,IAoBD,gBAAC,MAAD,CACE0R,SAnBW,SAAA3rB,GACb,OAAO,IAAIyY,SAAQ,SAAAtpB,GACjBkH,EAAS+hB,GAAWpY,IAASjD,MAC3B,WACE5N,EAAQ8R,EAAQM,K/GpDjB,Y+GqDA,IACD,SAAAvH,GACMA,EAAM6uC,iBACR15C,EAAQ,MAAG25C,GAAAA,GAAa9uC,EAAM6uC,mBAE9B15C,EAAQ,MAAG25C,GAAAA,GAAa9uC,GAE3B,GAEJ,GACF,EAKGivB,SAAUA,GACV8N,cAAeA,EACfjL,OAAQ,gBACNC,EADM,EACNA,aACAC,EAFM,EAENA,WACAE,EAHM,EAGNA,SACAD,EAJM,EAINA,QACA9sB,EALM,EAKNA,qBALM,OAON,gBAAC,KAAD,CACEoX,WAAS,EACTP,QAAS,EACTS,UAAWH,EAAQR,KACnBirB,UAAU,SACV6R,WAAW,UAEX,gBAAC,KAAD,CAAMl8B,MAAI,GACR,gBAAC,KAAD,CAAMD,UAAWH,EAAQ+O,MACvB,gBAAC,KAAD,CAAYpL,MAAM,iBAClB,wBAAM0R,SAAUI,GACd,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAMxV,WAAS,EAACP,QAAS,EAAG+qB,UAAU,OACpC,gBAAC,KAAD,CAAMrqB,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,QACLyyB,UAAW3F,GACX/vB,KAAK,QACL8N,MAAM,YACN6nB,YAAY,uBAGhB,gBAAC,KAAD,CAAM1V,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,oBACLyyB,UAAW3F,GACX/vB,KAAK,QACL8N,MAAM,oBACN6nB,YAAY,6BAIlB,gBAAC,MAAD,CACE1yB,KAAK,kBACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,mBACN6nB,YAAY,gCAEbw6C,IAAoB56C,EACnB,gBAAC,IAAD,CAAYvV,UAAWH,EAAQtc,OAC5B,IACA4sE,EAAiB,KAElB,MAEN,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQjsD,QAAS5Z,G/G5H1B,W+G4HgDE,IAAvC,UAGA,gBAAC,KAAD,CACEmjB,SACE4H,GACAE,GACCD,IAAY9sB,EAEf1I,KAAK,SACLkkB,QAASoR,GAERC,EACC,qBAAGvV,UAAU,sCAEb,yBArER,GAgFb,E,yHCjJD,IAAMb,IAAYC,EAAAA,EAAAA,IAAW,iBAAO,CAClCC,KAAM,CACJ0Y,QAAS,OACTmkB,SAAU,OACVC,WAAY,QAJa,IAQvB3pB,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAchB,OAbKiG,EAAO0mE,kBACV3sE,EAAO2sE,gBACL,qDAEC1mE,EAAOgH,WACVjN,EAAOiN,SAAW,YAEhBhH,EAAOgH,WAAahH,EAAO6mE,uBAC7B9sE,EAAOiN,SAAW,2CAEhBhH,EAAOgH,UAAYhH,EAAOgH,SAASR,OAAS,IAC9CzM,EAAOiN,SAAW,yBAEbjN,CACR,EAwHD,SAtHA,WACE,IAAMkH,GAAUkY,EAAAA,EAAAA,MAEV7C,EAAUV,KAEVvf,GAAWmjB,EAAAA,EAAAA,MAEXud,GAAgBtd,EAAAA,EAAAA,IAAY+F,GAAD,KAE3BonD,GAAkBntD,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgG,KAAKknD,eAAf,IAuBzC,OArBA7sD,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,0BAClB,GAAE,IAoBD,gBAAC,MAAD,CACE0R,SAnBW,SAAA3rB,GACb,OAAO,IAAIyY,SAAQ,SAAAtpB,GACjBkH,EAAS+hB,GAAWpY,IAASjD,MAC3B,WACE5N,EAAQ8R,EAAQM,KAAK,YACtB,IACD,SAAAvH,GACMA,EAAM6uC,iBACR15C,EAAQ,MAAG25C,GAAAA,GAAa9uC,EAAM6uC,mBAE9B15C,EAAQ,MAAG25C,GAAAA,GAAa9uC,GAE3B,GAEJ,GACF,EAKGivB,SAAUA,GACV8N,cAAeA,EACfjL,OAAQ,gBACNC,EADM,EACNA,aACA7E,EAFM,EAENA,YACA8E,EAHM,EAGNA,WACAE,EAJM,EAINA,SACAD,EALM,EAKNA,QACA9sB,EANM,EAMNA,qBANM,OAQN,gBAAC,KAAD,CACEoX,WAAS,EACTP,QAAS,EACTS,UAAWH,EAAQR,KACnBirB,UAAU,SACV6R,WAAW,UAEX,gBAAC,KAAD,CAAMl8B,MAAI,GACR,gBAAC,KAAD,CAAMD,UAAWH,EAAQ+O,MACvB,gBAAC,KAAD,CAAYpL,MAAM,oBAClB,wBAAM0R,SAAUI,GACd,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAMxV,WAAS,EAACP,QAAS,EAAG+qB,UAAU,UACpC,gBAAC,KAAD,CAAMrqB,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,kBACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,mBACN6nB,YAAY,kCAGhB,gBAAC,KAAD,CAAM1V,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,WACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,eACN6nB,YAAY,2BAGhB,gBAAC,KAAD,CAAM1V,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,uBACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,uBACN6nB,YAAY,iCAIlB,2BACClF,IAAgB8E,EACf,gBAAC,IAAD,CAAYrL,MAAM,SAASimD,GACzB,MAEN,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAQjsD,QAAS,kBAAM1Z,EAAQ0+B,QAAd,GAAjB,UACA,gBAAC,KAAD,CACEvb,SACE4H,GACAE,GACCD,IAAY9sB,EAEf1I,KAAK,SACLkkB,QAASoR,GAERC,EACC,qBAAGvV,UAAU,gCAEb,4BApER,GA+Eb,E,0HC5JM,SAASqwD,KACd,OAAO,IAAIruD,SAAQ,SAACtpB,EAASupB,GAC3B1d,G3HgNK,iB2H/MF+B,KADH,e,EAAA,G,EAAA,yBACQ,WAAM1D,GAAN,sGACeA,EAASkB,OADxB,OACEoM,EADF,OAEJxX,GAAQiN,EAAAA,GAAAA,KAAUnC,EAAAA,GAAAA,cAAa0M,GAAO,IAAI7O,GAAAA,GAAAA,MAAaK,MAFnD,0C,iLADR,uDAKG+E,OAAM,SAAAlD,GACL0e,EAAO1e,EACR,GACJ,GACF,C,uOCgBD,SA5BoC,SAAC,GAAD,IAAGysB,EAAH,EAAGA,MAAOsgD,EAAV,EAAUA,SAAV,OAClC,gBAACznB,EAAA,GAAD,CACE5wD,GAAG,mBACHs4E,UAAQ,EACRC,UAAQ,EACRrhE,QAASmhE,GAAYA,EAASx4E,KAAI,SAAA24E,GAAO,OAAIA,EAAQxtE,IAAZ,IACzCi3B,SAAU,SAACjI,EAAOu3B,GAAR,OAAmBx5B,GAASA,EAAMkK,SAASsvB,EAA3C,EACV//C,MAAOumB,GAASA,EAAMvmB,MAAQumB,EAAMvmB,MAAQ,GAC5Cq/C,eAAa,EACbiB,YAAa,SAAAxiD,GACX,OACE,gBAAC,IAAD,MACMA,EADN,CAEEuG,MAAM,qDACN6nB,YAAY,wBACZwE,OAAO,SACPl3B,KAAK,oBAGV,GAnB+B,E,mPC8BpC,SAASytE,GAAmB/kD,GAC1B,IAAQ+d,EAAiC/d,EAAjC+d,KAAM3f,EAA2B4B,EAA3B5B,QAAS5Z,EAAkBwb,EAAlBxb,KAAM0P,EAAY8L,EAAZ9L,QAEvBjgB,GAAWmjB,EAAAA,EAAAA,MACXvY,GAAUkY,EAAAA,EAAAA,MAQViuD,EAAkB,SAAAj4E,GAAO,OAC7BkH,E/GsPG,SAAoBuQ,GACzB,oDAAO,WAAMvQ,GAAN,sGACkBqhB,GAAQ9Q,GAD1B,cACCvN,EADD,OAELhD,EAAS,CAAEI,KhBpNa,egBoNOiF,QAASrC,IAFnC,kBAGEA,GAHF,2CAAP,OAAO,SAAP,UAAO,EAAP,yBAKD,C+G5PYguE,CAAW,CAAE34E,GAAIkY,EAAKlY,MAC5BqO,MAAK,SAAAyxD,GAAC,OAAIn4D,EAAS+Q,GAAOnG,EAAS,YAA7B,IACN/D,OAAM,SAAAsxD,GACLr/D,EAAQ,MACL25C,GAAAA,GACC,0EAEL,GAR0B,EAUzBxT,EAAM,e,EAAA,G,EAAA,yBAAG,WAAMt1B,GAAN,yGACN,IAAIyY,SAAQ,SAAAtpB,GAEjB4M,G7HuGG,a6HvGkB,CAAEwE,QADH,CAAEwG,MAAOH,EAAKG,MAAOC,SAAUhH,EAAOgH,YAEvDjK,MAAK,SAAA1D,GACAA,EAASiuE,IAAIF,EAAgBj4E,EAClC,IACA+N,OAAM,SAAAsxD,GACLr/D,EAAQ,MACL25C,GAAAA,GAAa,0CAEjB,GACJ,KAZY,0C,iLAAH,sDAeZ,OACE,gBAAC,KAAD,CAAQxnC,KAAM6+B,EAAM3f,QAASA,GAC3B,gBAAC,KAAD,uBACA,gBAAC,MAAD,CACEmL,SAAU2J,EACVrM,SApCW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAEhB,OADKiG,EAAOgH,WAAUjN,EAAOiN,SAAW,YACjCjN,CACR,EAiCK+xB,OAAQ,gBAAGC,EAAH,EAAGA,aAAc7E,EAAjB,EAAiBA,YAAawnC,EAA9B,EAA8BA,gBAAiB3vD,EAA/C,EAA+CA,KAA/C,OACN,gCACE,gBAAC,KAAD,KACE,gCACE,gBAAC,IAAD,2PAMA,2BACA,gBAAC,IAAD,yGAIA,wBAAM4sB,SAAUI,EAAcr9B,GAAG,uBAC/B,gBAAC,MAAD,CACEgL,KAAK,WACL6K,MAAM,WACN4nB,UAAW3F,GACX/vB,KAAK,cAGRywB,GACC,uBAAKzQ,UAAWH,EAAQtc,OAAQktB,KAItC,gBAAC,KAAD,KACGwnC,EACC,gBAAC,KAAD,CAAQ/zC,QAAS6F,GAAjB,SAEA,gBAAC,GAAD,CACE8U,OAAQvJ,EACRsJ,OAAQ7U,EACR+U,MAAOx2B,EAAKw2B,MACZx2B,KAAMA,EACN22B,WAAW,YArCb,IA8Cf,CASD,UAAe5U,EAAAA,GAAAA,IA/GA,SAAA1qB,GAAK,MAAK,CACvBq4D,YAAa,CACX9tC,MAAOvqB,EAAM4qB,QAAQU,QAAQC,KAC7B45B,WAAY,QAEdoT,MAAO,CACLhuC,MAAOvqB,EAAM4qB,QAAQ0wB,QAAQ/vB,MAE/B3nB,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MATX,GA+Gc,CAAEQ,WAAW,GAA/C,CACEpL,EAAAA,KAAWowD,K,ipDCzFb,IAAMvxD,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCyyB,KAAM,CACJvH,gBAAiBlrB,EAAM4qB,QAAQkB,SAEjC3H,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAUrH,KACzChB,MAAOvqB,EAAM4qB,QAAQumD,gBAAgBnxE,EAAM4qB,QAAQgI,UAAUrH,OAN/B,IAU5BsH,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAOhB,OANKiG,EAAOwnE,YACVztE,EAAOytE,UAAY,YAEhBxnE,EAAOynE,WACV1tE,EAAO0tE,SAAW,YAEb1tE,CACR,EAgXD,SA9WA,WACE,UAAgCqtB,EAAAA,EAAAA,UAAS,MAAzC,GAAOoI,EAAP,KAAiBC,EAAjB,KAEMxuB,GAAUkY,EAAAA,EAAAA,MAEV7C,EAAUV,KAEVvf,GAAWmjB,EAAAA,EAAAA,MAEX5S,GAAO6S,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAI8F,GAAkB9F,IAAU,CAAC,CAAjC,GAAN,KAExB,MAA8C0N,EAAAA,EAAAA,WAAS,GAAvD,GAAOiX,EAAP,KAAwBC,EAAxB,KAEMopC,EAAqB,CACzBluC,SAAU,SACVxB,MAAO,wCACPC,QAAS,0CACTC,SAAU,8CACVH,YAAa,8BACbrpC,GAAIkY,EAAKlY,GACT4wB,QAAS,UAGLyX,EAAgBnwB,EAEhB+gE,EAAoB5wC,GAAiBA,EAAc4wC,kBAYnD/8C,EAVY,CAChBtB,KAAM,uBACN,mBAAoB,uBACpBC,WAAY,6BACZC,SAAU,2BACVC,IAAK,sBACLm+C,WAAY,8BACZl+C,QAAS,4BAGiB9iB,EAAK4jB,OAE3Bq9C,EAAsB,CAC1B,CAAEn5E,GAAI,QAASwR,MAAO,QAAS4F,KAAM,SACrC,CAAEpX,GAAI,YAAawR,MAAO,YAAa4F,KAAM,cAGzCgiE,EAAqB,CACzB,CAAEp5E,GAAI,SAAUwR,MAAO,SAAU4F,KAAM,UACvC,CAAEpX,GAAI,MAAOwR,MAAO,MAAO4F,KAAM,QAG7BwuC,EAAc,SAAA5rB,GAClB+G,EAAY/G,EAAMyI,cACnB,EAEKzB,EAAc,WAClBD,EAAY,KACb,EAEKs4C,EAAc,SAAAj5E,GAClBA,EAAEqS,iBACH,EAEK6mE,EAAc,WAClB3xE,EAAS+hB,GAAW,SAAK2e,GAAN,IAAqB4wC,kBAAmB,MAC5D,EAmBKM,EACJ,4CAEE,gBAAC,KAAD,CAAShuD,MAAM,6DACb,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,cAKnBqmD,EACJ,2CAEE,gBAAC,KAAD,CAASjuD,MAAM,yGACb,gBAACkR,GAAA,EAAD,CAAUtJ,SAAS,eAKzB9H,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,wBAClB,GAAE,KAEHF,EAAAA,EAAAA,YAAU,WACR1jB,EAASoQ,KACV,GAAE,CAACpQ,EAAUuQ,KAEdmT,EAAAA,EAAAA,YAAU,WACR1jB,ECvKK,CACLo3B,QAASq5C,KACTp5C,MAAO,CjIoJqB,mBiIpJFz4B,GjImJE,qBgImB7B,GAAE,CAACoB,IAEJ,IAAM0wE,GAAWttD,EAAAA,EAAAA,KACf,SAAAC,GAAK,OACH,IAAQxqB,OAAO8Q,OAAO0Z,EAAMqtD,SAAS3rD,OAAQ,CAAC,SAAAgF,GAAC,OAAIA,EAAE1mB,KAAKuL,aAAX,GAD5C,GADqB,KAM5B,OACE,gCACE,gBAAC,MAAD,CACE0mB,SAxDS,SAAA3rB,GACb,OAAO,IAAIyY,SAAQ,SAAAtpB,GAAO,OACxBkH,EAAS+hB,GAAWpY,IAASjD,MAC3B,WACE5N,GACD,IACD,SAAA6K,GACMA,EAAM6uC,iBACR15C,EAAQ,MAAG25C,GAAAA,GAAa9uC,EAAM6uC,mBAE9B15C,EAAQ,MAAG25C,GAAAA,GAAa9uC,GAE3B,GAXqB,GAc3B,EA0CKivB,SAAUA,GACV8N,cAAeA,EACfnwB,KAAMA,EACNklB,OAAQ,gBpHhIqB7wB,EoHgIlB8wB,EAAH,EAAGA,aAAchtB,EAAjB,EAAiBA,KAAMitB,EAAvB,EAAuBA,WAAvB,OACN,gBAAC,GAAD,KACE,gBAAC,KAAD,CAAMvV,UAAWH,EAAQ+O,MACvB,gBAAC,KAAD,CACE9K,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACxB3T,EAAK4gE,WAAa5gE,EAAK6gE,SACpB7gE,EAAK4gE,UAAUrP,OAAO,GAAKvxD,EAAK6gE,SAAStP,OAAO,GAChD,KAGR7zD,OACE,2BACE,gBAAC8jB,EAAA,EAAD,CACE,YAAWoH,EAAW,cAAgB,KACtC,gBAAc,OACd7U,QAAS25B,GAET,gBAACie,GAAA,EAAD,OAEF,gBAAC,KAAD,CACE7jE,GAAG,cACH8gC,SAAUA,EACVluB,KAAMwb,QAAQ0S,GACdhP,QAASkP,GAET,gBAAC6X,GAAA,EAAD,CAAU5sB,QAAS5Z,GpH1LhC,gBoH0L0DE,IAA7C,gBAGA,gBAACsmC,GAAA,EAAD,CAAU5sB,QAAS5Z,GpHjMhC,mBoHiM6DE,IAAhD,mBAGC0mE,EACC,gBAAC,GAAD,CACE/sD,KpHrKjB,uBoHsKiB9U,KACE,gBAACyhC,GAAA,EAAD,CACE74C,GAAG,oBACH01B,SAAU4H,EACVrR,QAASqtD,GAHX,4BAUJ,gBAAC,GAAD,CACEptD,MpH/KW3f,EoH+KgBysE,EpH9K5CppE,GAAqBrD,IoH+KJ6K,KACE,gBAACyhC,GAAA,EAAD,CACE74C,GAAG,iBACH01B,SAAU4H,EACVrR,QAASotD,GAHX,uBAUN,gBAACxgC,GAAA,EAAD,CAAU5sB,QAAS5Z,GpHvNhC,WoHuNsDE,IAAzC,sBAGA,gBAAC,GAAD,CACE2Z,KAAK,kEACL9U,KACE,gBAAC,KAAD,CACE0sD,UAAU,SACVv4C,MAAM,+DAEN,gBAACstB,GAAA,EAAD,CACE74C,GAAG,iBACHisB,QAAS,SAAA+N,GACPA,EAAMxnB,iBACNo9B,GAAmB,EACpB,GALH,uBAeZrkB,MAAM,mBACN4Q,UACE,2BACGjkB,EAAKG,MADR,IAEE,wBAAMlK,MAAO,CAAEglB,SAAU,KAAOjb,EAAKlY,IAFvC,IAGGkY,EAAKuhE,mBAAqB,KACzB,gBAAC/1B,GAAA,EAAD,CAAiBzxB,MAAM,UAAUkB,SAAS,eAKlD,gBAAC,KAAD,CAAapL,UAAWH,EAAQuS,MAC9B,gBAAC,IAAD,yBAEGjiB,EAAKyjB,MAAQ,qBAAG5T,UAAWmU,IAAgB,QAE9C,gBAAC,IAAD,uBAEG+8C,EACC,gBAACv1B,GAAA,EAAD,CAAiBzxB,MAAM,UAAUkB,SAAS,YAE1C,kBAIN,gBAAC,KAAD,KACE,wBAAM8J,SAAUI,GACd,gBAAC,KAAD,CAAMxV,WAAS,EAACP,QAAS,EAAG+qB,UAAU,OACpC,gBAAC,KAAD,CAAMrqB,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,YACLyyB,UAAW3F,GACX/vB,KAAK,OACL8N,MAAM,gBAGV,gBAAC,KAAD,CAAMmS,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,WACLyyB,UAAW3F,GACX/vB,KAAK,OACL8N,MAAM,gBAIZ,gBAAC,KAAD,CAAMgS,WAAS,EAACP,QAAS,EAAG+qB,UAAU,OACpC,gBAAC,KAAD,CAAMrqB,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,eACLyyB,UAAW3F,GACX/vB,KAAK,OACL8N,MAAM,kBAGV,gBAAC,KAAD,CAAMmS,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,aACLyyB,UAAW3F,GACX/vB,KAAK,OACL8N,MAAM,2BAIZ,gBAAC,KAAD,CAAMgS,WAAS,EAACP,QAAS,EAAG+qB,UAAU,OACpC,gBAAC,KAAD,CAAMrqB,MAAI,EAACC,GAAI,GAAI2V,GAAI,GACrB,gBAAC,MAAD,CAAO5yB,KAAK,oBACT,gBAAG+sB,EAAH,EAAGA,MAAH,OACC,gBAAC,GAAD,CACEA,MAAOA,EACPsgD,SAAUA,GAHb,MASP,gBAAC,KAAD,CAAMxwD,WAAS,EAACP,QAAS,EAAG+qB,UAAU,OACpC,gBAAC,KAAD,CAAMrqB,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,iBACLyyB,UAAW2b,GACXrxC,KAAK,SACL8N,MAAO0jE,GAENJ,EAAoBt5E,KAAI,SAAAyuC,GAAE,OACzB,gBAACuK,GAAA,EAAD,CAAUthC,IAAK+2B,EAAGtuC,GAAIwR,MAAO88B,EAAG98B,OAC7B88B,EAAGl3B,KAFmB,MAO/B,gBAAC,KAAD,CAAM4Q,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,mBACLyyB,UAAW2b,GACXrxC,KAAK,SACL8N,MAAO2jE,GAEP,gBAAC3gC,GAAA,EAAD,CAAUthC,IAAI,IAAI/F,OAAK,GAAvB,2BAGA,gBAACqnC,GAAA,EAAD,CAAUthC,IAAI,IAAI/F,OAAO,GAAzB,qDAMN,gBAAC,KAAD,CAAMqW,WAAS,EAACP,QAAS,EAAG+qB,UAAU,OACpC,gBAAC,KAAD,CAAMrqB,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,cACLyyB,UAAW2b,GACXrxC,KAAK,SACL8N,MAAM,gBAELujE,EAAmBv5E,KAAI,SAAAyuC,GAAE,OACxB,gBAACuK,GAAA,EAAD,CAAUthC,IAAK+2B,EAAGtuC,GAAIwR,MAAO88B,EAAG98B,OAC7B88B,EAAGl3B,KAFkB,MAO9B,gBAAC,KAAD,CAAM4Q,MAAI,GACR,gBAAC,MAAD,CACEhd,KAAK,QACLyyB,UAAW2b,GACXrxC,KAAK,SACL8N,MAAM,SAELkqC,GAAalgD,KAAI,SAAAyuC,GAAE,OAClB,gBAACuK,GAAA,EAAD,CAAUthC,IAAK+2B,EAAGtuC,GAAIwR,MAAO88B,EAAG98B,OAC7B88B,EAAGl3B,KAFY,SAU9B,gBAAC,GAAD,CACEuvB,OAAQ,kBAAMp0B,EAAQ0+B,QAAd,EACRpK,MAAOx2B,EAAKw2B,MACZD,OAAQvJ,EACRhtB,KAAMA,KAlON,IAwOV,gBAAC,GAAD,CACE6H,KAAMA,EACNu5B,KAAM9B,EACN7d,QAAS,kBAAM8d,GAAmB,EAAzB,IAIhB,E,oDE/PD,UAAexd,EAAAA,GAAAA,IA3JA,SAAA1qB,GAAK,MAAK,CACvB2kB,KAAM,CACJ,MAAO,CACL0T,WAAYr4B,EAAM4f,QAAQ,KAG9BoyD,WAAY,CACV35C,WAAYr4B,EAAM4f,QAAQ,IAE5BqyD,YAAa,CACXrmD,YAAa5rB,EAAM4f,QAAQ,IAE7BsyD,SAAU,CACR,0BAA2B,CACzBvmD,SAAU,KAGdwmD,W,EAAW,G,EACRnyE,EAAM+pE,YAAYqI,KAAK,M,EAAQ,CAC9Bx2C,QAAS,G,0GAnBK,GA2Jc,CAChC7P,WAAW,EACXzoB,KAAM,OAFR,EAnIA,SAAkB0oB,GAChB,IACE1C,EAWE0C,EAXF1C,KACApJ,EAUE8L,EAVF9L,QACAoZ,EASEtN,EATFsN,YACA+4C,EAQErmD,EARFqmD,aACAC,EAOEtmD,EAPFsmD,WACAznE,EAMEmhB,EANFnhB,QACAF,EAKEqhB,EALFrhB,OACAzF,EAIE8mB,EAJF9mB,SACA8L,EAGEgb,EAHFhb,OACA9F,EAEE8gB,EAFF9gB,KACAqnE,EACEvmD,EADFumD,eAeF,OAXG,KAIYryD,EAAQiyD,UACVxnE,EAAO,WAAYE,GAM5Bye,EAAK0jB,gBAEL,4BACI9nC,EAASolB,SAASiM,StHvEnB,csHwEC,gBAAC,KAAD,CACEhM,MAAM,UACNhG,QAAS,kBAAM8tD,EtH1ElB,YsH0E+CxnE,EAAnC,EACTwV,UAAWH,EAAQ8xD,YAHrB,YAQF,gBAAChgD,EAAA,EAAD,CACE15B,GAAG,gBACH,YAAW4S,EAAO,cAAgB,KAClC,gBAAc,OACdqZ,QAAS+tD,EACT/nD,MAAM,WAEN,gBAACioD,GAAA,EAAD,OAEF,gBAAC,KAAD,CACEl6E,GAAG,cACH8gC,SAAUm5C,EACVvC,aAAc,CACZC,SAAU,MACVC,WAAY,SAEduC,gBAAiB,CACfxC,SAAU,MACVC,WAAY,SAEdhlE,KAAMA,EACNkf,QAASkP,EACTjZ,UAAWH,EAAQgyD,UAEnB,gBAAC/gC,GAAA,EAAD,CACE74C,GAAG,mBACHksB,KAAK,WACLD,QAAS,kBAAM8tD,EtH/FlB,WsH+F8CxnE,EAAlC,GAET,gBAACojB,GAAA,EAAD,KACE,gBAAC,KAAD,OAEF,gBAACC,GAAA,EAAD,CAAc5C,QAAQ,sBAExB,gBAAC6lB,GAAA,EAAD,CACE74C,GAAG,UACHksB,KAAK,WACLD,QAAS,kBAAM8tD,EtHrFlB,WsHqF8CxnE,EAAlC,GAET,gBAACojB,GAAA,EAAD,KACE,gBAAC8F,GAAA,EAAD,OAEF,gBAAC7F,GAAA,EAAD,CAAc5C,QAAQ,aAExB,gBAAC6lB,GAAA,EAAD,CAAU74C,GAAG,SAASksB,KAAK,IAAID,QAAS,kBAAMvT,EAAOnG,EAAb,GACtC,gBAACojB,GAAA,EAAD,KACE,gBAACykD,GAAA,EAAD,OAEF,gBAACxkD,GAAA,EAAD,CAAc5C,QAAQ,eAOH,IAAzBhC,EAAK0jB,gBAEL,uBAAK3sB,UAAWH,EAAQyE,MACtB,gBAAC,KAAD,CACEL,QAAQ,YACRiG,MAAM,YACNlK,UAAWH,EAAQiyD,UACnB3tD,KtH7ED,SsH8ECD,QAAS5Z,EtH9EV,SsH8E8BE,IAL/B,eAuBJ,gBAAC,IAAD,CACE0f,MAAM,UACNlK,UACEnb,EAASolB,SAASiM,StHpKjB,asHoK4CrW,EAAQ+xD,YAAc,MAHvE,oBASH,I,gUC3KM,SAAeU,GAAtB,mC,oDAAO,WAA0BC,GAA1B,sGACkBjtE,GAAK,uBAAwBitE,GAD/C,cACC3vE,EADD,gBAEQA,EAASkB,OAFjB,oF,sBAKA,SAAe0uE,KAAtB,gC,oDAAO,mHACkBjuE,GAAI,8BADtB,cACC3B,EADD,gBAEQA,EAASkB,OAFjB,oF,0+BCgNP,UAAeumB,EAAAA,GAAAA,IAjMA,SAAA1qB,GAAK,MAAK,CACvB0f,KAAM,CAAEkM,YAAa,GAAIyM,WAAY,IACrCkD,IAAK,CACHhyB,SAAU,QACVqxB,MAAO56B,EAAM4f,QAAQ,GACrBic,OAAQ77B,EAAM4f,QAAQ,GACtBiB,OAAQ,IACR2Z,OAAQx6B,EAAM4f,QAAQ,IAExBkzD,UAAW,CACTvoD,MAAOvqB,EAAM4qB,QAAQU,QAAQC,KAC7B45B,WAAY,QAEdoT,MAAO,CACLhuC,MAAOvqB,EAAM4qB,QAAQ0wB,QAAQ/vB,MAE/B3nB,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAjBX,GAiMc,CAAEQ,WAAW,GAA/C,EA5KA,YAAwD,IAA3B7L,EAA2B,EAA3BA,QAAS1P,EAAkB,EAAlBA,KAAMtL,EAAY,EAAZA,SAC1C,MAAkC8rB,EAAAA,EAAAA,UAAS,IAA3C,GAAkB+hD,GAAlB,WACA,MAAsC/hD,EAAAA,EAAAA,UAAS,IAA/C,GAAoBgiD,GAApB,WACA,MAAoChiD,EAAAA,EAAAA,WAAS,GAA7C,GAAOiiD,EAAP,KAAmBC,EAAnB,KAmDA,OAjDAvvD,EAAAA,EAAAA,YAAU,WACRtT,KACAwiE,KAAiBlsE,MAAK,SAAA1D,GACpB+vE,EACE/vE,EAAS9K,KAAI,SAAAg7E,GAAU,MAAK,CAC1B76E,GAAI66E,EAAW76E,GACfwR,MAAOqpE,EAAW7vE,KAClBoM,KAAMyjE,EAAW7vE,KAHI,IAM1B,GACF,GAAE,IAuCD,uBAAK+c,UAAWH,EAAQR,MACtB,gBAAC,KAAD,CAASmE,MAAM,kDACb,gBAAC,KAAD,CACEvrB,GAAG,uBACHgsB,QAAQ,YACRyb,KAAK,QACLxb,QAAS,kBAAM2uD,GAAeD,EAArB,GAJX,kBASF,gBAAC,KAAD,CACE/nE,KAAM+nE,EACN7oD,QAAS,kBAAM8oD,GAAc,EAApB,EACTj6C,SAAS,KACT,kBAAgB,yBAChB3I,WAAS,GAET,gBAAC,MAAD,CACEiF,SAxDO,SAAA3rB,GACb,OAAO,IAAIyY,SAAQ,SAAAtpB,GACjB45E,GAAW,CACTrvE,KAAMsG,EAAOtG,KACbqN,MAAO/G,EAAO+G,MACdyiE,YAAa,aACbC,QAASzpE,EAAO0pE,WAEf3sE,MAAK,SAAA1D,GAAQ,OAAIlK,EAAQg6E,EAAa9vE,EAASsN,KAAKV,KAAvC,IACb/I,OAAM,kBACL/N,G,EAAQ,G,EACL25C,GAAAA,G,EACC,0E,0GAHC,GAMV,GACF,EAyCO7f,SAvCS,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAchB,OAbKiG,EAAO+G,MAGT,4CAA4CitB,KAAKh0B,EAAO+G,SAEzDhN,EAAOgN,MAAQ,yBAJfhN,EAAOgN,MAAQ,WAMZ/G,EAAOtG,OACVK,EAAOL,KAAO,YAEXsG,EAAO0pE,WACV3vE,EAAO2vE,SAAW,YAEb3vE,CACR,EAwBO+xB,OAAQ,gBACNC,EADM,EACNA,aACA7E,EAFM,EAENA,YACAwnC,EAHM,EAGNA,gBACA3vD,EAJM,EAINA,KACAiB,EALM,EAKNA,OALM,OAON,gCACE,gBAAC,KAAD,KACG0uD,EACC,gCACE,gBAACtc,GAAA,EAAD,CAAiB37B,UAAWH,EAAQq4C,QACpC,gBAAC7tB,GAAA,EAAD,kCAKF,2BACE,gBAACA,GAAA,EAAD,qDAGA,wBAAMnV,SAAUI,EAAcr9B,GAAG,yBAC/B,gBAAC,KAAD,CAAM6nB,WAAS,GACb,gBAAC,KAAD,CAAMG,MAAI,EAACC,GAAI,GAAIC,GAAI,GACrB,gBAAC,MAAD,CACEld,KAAK,OACL6K,MAAM,OACN4nB,UAAW3F,GACX/vB,KAAK,OACL21B,YAAY,YACZhI,SAAUxd,GAAQ5G,EAAOtG,KACzBiwE,aACE/iE,EAAO,GAAH,OAAMA,EAAK4gE,UAAX,YAAwB5gE,EAAK6gE,UAAa,MAIpD,gBAAC,KAAD,CAAM/wD,MAAI,EAACC,GAAI,GAAIC,GAAI,GACrB,gBAAC,MAAD,CACEld,KAAK,QACL6K,MAAM,QACN4nB,UAAW3F,GACX/vB,KAAK,OACL21B,YAAY,qBACZhI,SAAUxd,GAAQ5G,EAAOtG,KACzBiwE,cAAc/iE,aAAA,EAAAA,EAAMG,QAAS,OAInC,gBAAC,MAAD,CACErN,KAAK,OACL6K,MAAM,OACN4nB,UAAW3F,GACX/vB,KAAK,OACLkzE,aAAcruE,EAASolB,UAAY,GACnC0L,YAAY,oDACZ1F,WAAS,IAEX,2BACA,gBAAC,MAAD,CACEhtB,KAAK,WACL6K,MAAM,mBACN4nB,UAAW3F,GACXG,WAAS,EACTijD,KAAM,EACNlvD,QAAQ,WACR0R,YAAY,uGACZ1F,WAAS,KAGZQ,GACC,uBAAKzQ,UAAWH,EAAQtc,OAAQktB,KAKxC,gBAAC,KAAD,KACGwnC,EACC,gBAAC,KAAD,CAAQ/zC,QAAS,kBAAM2uD,GAAc,EAApB,GAAjB,SAEA,gBAAC,GAAD,CACEj0C,OAAQ,kBAAMi0C,GAAc,EAApB,EAERh0C,OAAQvJ,EACRhtB,KAAMA,EACN22B,WAAW,YApFb,KA8FjB,I,o9BC0BD,UAAe5U,EAAAA,GAAAA,IArNA,SAAA1qB,GAAK,MAAK,CACvBu7B,IAAK,CACHhyB,SAAU,QACVqxB,MAAO56B,EAAM4f,QAAQ,GACrBic,OAAQ77B,EAAM4f,QAAQ,GACtBiB,OAAQ,IACR2Z,OAAQx6B,EAAM4f,QAAQ,IAExBkzD,UAAW,CACTvoD,MAAOvqB,EAAM4qB,QAAQU,QAAQC,KAC7B45B,WAAY,QAEdoT,MAAO,CACLhuC,MAAOvqB,EAAM4qB,QAAQ0wB,QAAQ/vB,MAE/B3nB,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAhBX,GAqNc,CAAEQ,WAAW,GAA/C,EAjMA,YAA8C,IAAjB7L,EAAiB,EAAjBA,QAAS1P,EAAQ,EAARA,KACpC,MAAkCwgB,EAAAA,EAAAA,UAAS,IAA3C,GAAO8hD,EAAP,KAAkBC,EAAlB,KACA,MAAsC/hD,EAAAA,EAAAA,UAAS,IAA/C,GAAOyiD,EAAP,KAAoBT,EAApB,KACA,MAAoChiD,EAAAA,EAAAA,WAAS,GAA7C,GAAOiiD,EAAP,KAAmBC,EAAnB,KAsDA,OApDAvvD,EAAAA,EAAAA,YAAU,WACRtT,KACAwiE,KAAiBlsE,MAAK,SAAA1D,GACpB+vE,EACE/vE,EAAS9K,KAAI,SAAAg7E,GAAU,MAAK,CAC1B76E,GAAI66E,EAAW76E,GACfwR,MAAOqpE,EAAW7vE,KAClBoM,KAAMyjE,EAAW7vE,KAHI,IAM1B,GACF,GAAE,IA0CD,2BACE,gBAAC,KAAD,CAASugB,MAAM,4BACb,gBAAC2X,GAAA,EAAD,CACEljC,GAAG,qBACH+nB,UAAWH,EAAQqb,IACnBhR,MAAM,UACNhG,QAAS,kBAAM2uD,GAAeD,EAArB,GAET,gBAAC,KAAD,QAGJ,gBAAC,KAAD,CACE/nE,KAAM+nE,EACN7oD,QAAS,kBAAM8oD,GAAc,EAApB,EACTj6C,SAAS,KACT,kBAAgB,yBAChB3I,WAAS,GAET,gBAAC,KAAD,6CACA,gBAAC,MAAD,CACEiF,SA5DO,SAAA3rB,GACb,OAAO,IAAIyY,SAAQ,SAAAtpB,GACjB45E,GAAW,CACTrvE,KAAMsG,EAAOtG,KACbqN,MAAO/G,EAAO+G,MACdyiE,YAAaxpE,EAAOwpE,YACpBC,QAASzpE,EAAOypE,UAEf1sE,MAAK,SAAA1D,GAAQ,OAAIlK,EAAQg6E,EAAa9vE,EAASsN,KAAKV,KAAvC,IACb/I,OAAM,kBACL/N,G,EAAQ,G,EACL25C,GAAAA,G,EACC,0E,0GAHC,GAMV,GACF,EA6CO7f,SA3CS,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAiBhB,OAhBKiG,EAAO+G,MAGT,4CAA4CitB,KAAKh0B,EAAO+G,SAEzDhN,EAAOgN,MAAQ,yBAJfhN,EAAOgN,MAAQ,WAMZ/G,EAAOtG,OACVK,EAAOL,KAAO,YAEXsG,EAAOwpE,cACVzvE,EAAOyvE,YAAc,YAElBxpE,EAAOypE,UACV1vE,EAAO0vE,QAAU,YAEZ1vE,CACR,EAyBO+xB,OAAQ,gBACNC,EADM,EACNA,aACA7E,EAFM,EAENA,YACAwnC,EAHM,EAGNA,gBACA3vD,EAJM,EAINA,KACAiB,EALM,EAKNA,OALM,OAON,gCACE,gBAAC,KAAD,KACG0uD,EACC,gCACE,gBAACtc,GAAA,EAAD,CAAiB37B,UAAWH,EAAQq4C,QACpC,gBAAC7tB,GAAA,EAAD,qEAEK,wBAAMrqB,UAAWH,EAAQ4yD,WAAYA,GAF1C,MAMF,2BACE,gBAACpoC,GAAA,EAAD,kEAC6D,IAC3D,gBAAC,GAAD,CACEngB,MAAM,UACN/F,KAAK,0BACL9U,KAAK,kBALT,wEAQoB,IAClB,gBAAC,GAAD,CACE6a,MAAM,UACN/F,KAAK,+BACL9U,KAAK,cAZT,0JAkBA,wBAAM6lB,SAAUI,EAAcr9B,GAAG,oBAC/B,gBAAC,KAAD,CAAM6nB,WAAS,GACb,gBAAC,KAAD,CAAMG,MAAI,EAACC,GAAI,GAAIC,GAAI,GACrB,gBAAC,MAAD,CACEld,KAAK,OACL6K,MAAM,OACN4nB,UAAW3F,GACX/vB,KAAK,OACL21B,YAAY,YACZhI,SAAUxd,GAAQ5G,EAAOtG,KACzBiwE,aACE/iE,EAAO,GAAH,OAAMA,EAAK4gE,UAAX,YAAwB5gE,EAAK6gE,UAAa,MAIpD,gBAAC,KAAD,CAAM/wD,MAAI,EAACC,GAAI,GAAIC,GAAI,GACrB,gBAAC,MAAD,CACEld,KAAK,QACL6K,MAAM,QACN4nB,UAAW3F,GACX/vB,KAAK,OACL21B,YAAY,qBACZhI,SAAUxd,GAAQ5G,EAAOtG,KACzBiwE,cAAc/iE,aAAA,EAAAA,EAAMG,QAAS,OAInC,gBAAC,MAAD,CACErN,KAAK,cACL6K,MAAM,eACN4nB,UAAW2b,GACXrxC,KAAK,SACLmP,QAASikE,EACTF,aAAa,kBACbv9C,YAAY,2BACZ1F,WAAS,IAEX,2BACA,gBAAC,MAAD,CACEhtB,KAAK,UACL6K,MAAM,kBACN4nB,UAAW3F,GACXG,WAAS,EACTijD,KAAM,EACNlvD,QAAQ,WACR0R,YAAY,6CACZ1F,WAAS,KAGZQ,GACC,uBAAKzQ,UAAWH,EAAQtc,OAAQktB,KAKxC,gBAAC,KAAD,KACGwnC,EACC,gBAAC,KAAD,CAAQ/zC,QAAS,kBAAM2uD,GAAc,EAApB,GAAjB,SAEA,gBAAC,GAAD,CACEj0C,OAAQ,kBAAMi0C,GAAc,EAApB,EACR/zC,MAAOx2B,EAAKw2B,MACZD,OAAQvJ,EACRhtB,KAAMA,EACN22B,WAAW,YArGb,KA+GjB,I,m1CCpOD,IAAM9f,IAAYC,EAAAA,EAAAA,IAAW,iBAAO,CAClCC,KAAM,CACJnW,SAAU,QACV+0C,IAAK,MACLz9B,OAAQ,eAEV24C,KAAM,CACJ7mC,OAAQ,UACRwyB,WAAY,QARa,IAsG7B,SA1FA,YAAiC,IAAVhiC,EAAU,EAAVA,OACfljB,GAAWmjB,EAAAA,EAAAA,MACXlD,EAAUV,KAChB,MAA4BwR,EAAAA,EAAAA,UAAS,IAArC,GAAO0iD,EAAP,KAAeC,EAAf,KA4CA,IAtCAhwD,EAAAA,EAAAA,YAAU,WACR,SAASiwD,EAAmBC,GACrB,IAAQA,EAAOH,EAAO,KACzBC,EAAU,GAAD,UAAKD,GAAL,CAAaG,IAEzB,CAED,SAASC,EAAT,GACE,GACO,WAFsC,EAAbC,UAG5BxvE,OAAOW,SAAS8uE,QAMrB,CAED,IAAMC,EAAqBh0E,EACzB0+B,GAAY,UAAD,OAAWxb,GAAU,CAC9B2lC,IAAK8qB,EACLM,MAAOJ,KAILK,EAA0Bl0E,EAC9B0+B,GAAY,aAAc,CACxBmqB,IAAK8qB,EACLM,MAAOJ,KAIX,OAAO,WACLG,IACAE,GACD,CACF,GAAE,CAACl0E,EAAUyzE,EAAQvwD,IAElBuwD,EAAOtjE,OAAS,EAAG,CACrB,MAA2BsjE,EAAO,GAA1BrzE,EAAR,EAAQA,KAAM+zE,EAAd,EAAcA,SACRC,EAAwB,YAATh0E,EAEfi0E,EACJ,gGACqE,IACnE,qBAAGj0D,UAAWH,EAAQs5C,KAAMj1C,QAjDZ,WACpBhgB,OAAOW,SAAS8uE,QACjB,GA+CK,WAEK,IAJP,4BASF,OACE,gBAAC,KAAD,CAAM7zD,WAAS,EAACC,eAAe,SAASC,UAAWH,EAAQR,MACzD,gBAAC,KAAD,CAAMY,MAAI,GACR,gBAACi0D,GAAA,EAAD,CACEC,SAAUH,EAAe,UAAYh0E,EACrCgjD,UAAW,EACXn1C,OACE,gBAAC8jB,EAAA,EAAD,CACE,aAAW,QACXzH,MAAM,UACNwV,KAAK,QACLxb,QAAS,WACPovD,EAAUD,EAAO9kE,MAAM,GACxB,GAED,gBAACmxD,GAAA,EAAD,CAAWt0C,SAAS,cAIvB4oD,EAAeC,EAAcF,IAKvC,CAED,OAAO,IACR,E,o+BCzFD,IAUMvhD,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAIhB,OAHKiG,EAAOgH,WACVjN,EAAOL,KAAO,YAETK,CACR,EA8GD,SAAegd,EAAAA,MACb+J,EAAAA,GAAAA,IA/Ha,SAAA1qB,GAAK,MAAK,CACvB4D,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAE7BkpD,YAAa,CACXlqD,MAAOvqB,EAAM4qB,QAAQD,QAAQY,KAC7BK,YAAa5rB,EAAM4f,QAAQ,IANX,GA+HC,CAAEmM,WAAW,GAAhCrB,EA3G6B,SAAC,GAAuC,IAArCxK,EAAqC,EAArCA,QAASw0D,EAA4B,EAA5BA,eAAgB/jE,EAAY,EAAZA,MACnDgkE,EAAY,KAEZ1nC,EAA8B,IAAjBynC,EAEnB,MAAoC1jD,EAAAA,EAAAA,UAAS,GAA7C,GAAO4jD,EAAP,KAAmBC,EAAnB,KACA,MAA8B7jD,EAAAA,EAAAA,UAAS,GAAvC,GAAO8jD,EAAP,KAAgBC,EAAhB,MAEApxD,EAAAA,EAAAA,YAAU,WACR,IAAMu4B,EAAW84B,aAAY,WAC3B,GAAI/nC,EAAY,CACd,IAAMgoC,EAbiB,SAAAhoC,GAAU,OAAIA,GAAa,IAAI9sC,MAAOyL,SAA5B,CAatBspE,CAAuBjoC,GAE9BgoC,EAAK,GAAG1wE,OAAOW,SAAS8uE,SAExBiB,EAbgB,IAclBF,EAAW,GACFE,EAAKN,GACdI,EAAW,EAEd,CACF,GAAE,KACH,OAAO,kBAAMI,cAAcj5B,EAApB,CACR,GAAE,CAACjP,EAAY0nC,EArBU,MAuB1B,IAAMr7C,EAAc,WAClBy7C,EAAW,GACXF,EAAcD,EAAa,EAC5B,EAEK30E,GAAWmjB,EAAAA,EAAAA,MAgBjB,OACE,gBAAC,KAAD,CAAQlY,KAAM0pE,EAAaE,EAAS1qD,QAASkP,GAC3C,gBAAC,KAAD,KACE,gBAAC87C,GAAA,EAAD,CAAgB/0D,UAAWH,EAAQu0D,YAAahpD,SAAS,YAD3D,gCAE+B4tC,EAAAA,EAAAA,GAAoB,IAAIl5D,KAAK8sC,IAF5D,KAIA,gBAAC,MAAD,CACE1X,SArBS,SAAA3rB,GACb,OAAO,IAAIyY,SAAQ,SAAAtpB,GACjBkH,EAASyQ,GAAM,CAAEC,MAAAA,EAAOC,SAAUhH,EAAOgH,YACtCjK,MAAK,WACJouE,EAAW,GACXF,EAAc,GACd97E,EAAQkH,E7HAX,SAAiCgtC,GACtC,OAAOrmC,GAAA,+CACmC,IAAIzG,KAC1C8sC,GACAooC,eACF,UAEH,C6HP0BC,CAAwBroC,IAC1C,IACAnmC,OAAM,SAAAlD,G,UACL7K,G,EAAQ,G,EAAG25C,GAAAA,G,EAAa9uC,E,gGACzB,GACJ,GACF,EAUKivB,SAAUA,GACV6C,OAAQ,gBAAGC,EAAH,EAAGA,aAAc7E,EAAjB,EAAiBA,YAAanoB,EAA9B,EAA8BA,KAA9B,OACN,gCACE,gBAAC,KAAD,KACE,gBAAC+hC,GAAA,EAAD,wMAMA,gBAACA,GAAA,EAAD,oFAIA,wBAAMnV,SAAUI,EAAcr9B,GAAG,uBAC/B,gBAAC,MAAD,CACEgL,KAAK,WACL6K,MAAM,WACN4nB,UAAW3F,GACX/vB,KAAK,WACL21B,YAAY,uBAEblF,GACC,uBAAKzQ,UAAWH,EAAQtc,OAAxB,oEAON,gBAAC,KAAD,KACE,gBAAC,GAAD,CACEq7B,OAAQ3F,EACR6F,MAAOx2B,EAAKw2B,MACZD,OAAQvJ,EACRhtB,KAAMA,EACN22B,WAAW,iBACXD,WAAW,aApCX,IA4Cf,K,w3DCzDD,IAAMk2C,GAAc,IAEd/1D,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJ0Y,QAAS,OACTgtB,UAAW,SACXC,gBAAiB,OAAF,OAASnhB,GAAAA,UAAT,KACfohB,UAAW,eAEb6Z,OAAQ,CACNt+C,OAAQ7gB,EAAM6gB,OAAO20D,OAAS,EAC9Bt2B,WAAYl/C,EAAMsqE,YAAYz6C,OAAO,CAAC,QAAS,UAAW,CACxD4lD,OAAQz1E,EAAMsqE,YAAYmL,OAAOC,MACjCrpE,SAAUrM,EAAMsqE,YAAYj+D,SAASspE,gBAEvCt9C,WAAYk9C,GACZ7lC,aAAc1vC,EAAM4f,QAAQ,IAE9B+a,KAAM,CACJvC,QAAS,OACTuC,KAAM,GAERi7C,YAAa,MACV51E,EAAM+pE,YAAYC,GAAG,MAAQ,CAC5B3xC,WAAYk9C,GACZj9C,MAAO,eAAF,OAAiBi9C,GAAjB,OACLr2B,WAAYl/C,EAAMsqE,YAAYz6C,OAAO,CAAC,QAAS,UAAW,CACxD4lD,OAAQz1E,EAAMsqE,YAAYmL,OAAOC,MACjCrpE,SAAUrM,EAAMsqE,YAAYj+D,SAASwpE,mBAI3CnZ,KAAM,CACJtkC,QAAS,QAEXo9C,OAAQ,CACNl9C,MAAOi9C,GACPO,WAAY,EACZrwB,WAAY,UAEd+F,WAAY,CACVlzB,MAAOi9C,GACPr2B,WAAYl/C,EAAMsqE,YAAYz6C,OAAO,QAAS,CAC5C4lD,OAAQz1E,EAAMsqE,YAAYmL,OAAOC,MACjCrpE,SAAUrM,EAAMsqE,YAAYj+D,SAASwpE,kBAGzCE,YAAa,CACX72B,WAAYl/C,EAAMsqE,YAAYz6C,OAAO,QAAS,CAC5C4lD,OAAQz1E,EAAMsqE,YAAYmL,OAAOC,MACjCrpE,SAAUrM,EAAMsqE,YAAYj+D,SAASspE,gBAEvCvwB,UAAW,SACX9sB,MAAOt4B,EAAM4f,QAAQ,GAAK,GAE5Bo2D,QAAS,IACPzrD,MAAO,QACP6N,QAAS,OACTokB,WAAY,SACZp8B,eAAgB,WAChBwb,QAAS57B,EAAM4f,QAAQ,EAAG,IAEvB5f,EAAMi2E,OAAOD,SAElB33B,QAAS,IACPz9B,SAAU,EACVqD,UAAW,GACX2X,QAAS57B,EAAM4f,QAAQ,GACvBqZ,SAAU,sBACTj5B,EAAM+pE,YAAYqI,KAAK,MAAQ,CAC9Bn5C,SAAU,SAGdi9C,kBAAmB,IACjBj9C,SAAU,gBAAF,OAAkBs8C,GAAlB,QACPv1E,EAAM+pE,YAAYqI,KAAK,MAAQ,CAC9Bn5C,SAAU,SAGd6wC,WAAY,CACVl+C,YAAa5rB,EAAM4f,QAAQ,IAE7B+K,QAAS,CACPO,gBAAiBlrB,EAAM4qB,QAAQD,QAAQE,MACvCN,MAAOvqB,EAAM4qB,QAAQlb,KAAK4b,SAE5BR,UAAW,CACTI,gBAAiBlrB,EAAM4qB,QAAQhnB,MAAMinB,MACrCN,MAAOvqB,EAAM4qB,QAAQlb,KAAK4b,SAE5B6+B,OAAQ,CACNlxB,SAAU,KAEZssB,gBAAiB,CACf,wBAAyB,CACvBh7B,MAAO,UAGX26B,gBAAiB,CACf,uBAAwB,CACtBh6B,gBAAiB,4BACjBF,WAAY,EACZwN,YAAa,GACb2sB,WAAY,IACZ15B,SAAU,GACVlB,MAAO,SAETtG,UAAW,EACXC,aAAc,GA1GgB,IA8G5BiyD,GAAiBx1D,EAAAA,MACrB,gBAAGmK,EAAH,EAAGA,UAAWsrD,EAAd,EAAcA,WAAYC,EAA1B,EAA0BA,cAA1B,OACE,gBAAC,IAAD,CAAY/xD,QAAQ,KAAKiG,MAAM,UAAU6e,QAAM,EAAC3iC,MAAO,CAAE+zB,OAAQ,KAC7D1P,GAAasrD,EAAa,KAC1B,gBAAC,KAAD,CACEvyD,MAAM,iGAGN,wBAAMpd,MAAO,CAAEglB,SAAU,GAAIP,gBAAiB,YAC3CJ,EACGurD,EADM,8BAE8B,IAAbD,EAFjB,QARpB,IAkBFD,GAAeG,UAAY,CACzBxrD,UAAWyrD,IAAAA,KAAAA,WACXH,WAAYG,IAAAA,OAAAA,WACZF,cAAeE,IAAAA,OAAAA,YAGjB,IAAMC,GAAyB71D,EAAAA,MAAW,gBAAG7f,EAAH,EAAGA,QAAH,OACxC,gBAAC,IAAD,CAAYwjB,QAAQ,KAAKiG,MAAM,UAAU6e,QAAM,EAAC3iC,MAAO,CAAE+zB,OAAQ,IAC9D15B,EAAQw4D,mBACP,gBAAC,KAAD,CAASz1C,MAAM,sGACb,wBAAMpd,MAAO,CAAEglB,SAAU,GAAIP,gBAAiB,YAA9C,iDACiD,KAC9CmuC,EAAAA,EAAAA,GAAoB,IAAIl5D,KAAKW,EAAQw4D,sBANN,IAa1Ckd,GAAuBF,UAAY,CACjCx1E,QAASy1E,IAAAA,OAAAA,YAgYX,SA7XA,WAAoB,UACZv2E,GAAQyyD,EAAAA,EAAAA,KAERvyC,EAAUV,KAEhB,MAAoCwR,EAAAA,EAAAA,WAAS,GAA7C,GAAOw6B,EAAP,KAAmBC,EAAnB,KACA,MAA8Cz6B,EAAAA,EAAAA,WAAS,GAAvD,GAAOylD,EAAP,KAAwBC,EAAxB,KACA,MAAoC1lD,EAAAA,EAAAA,WAAS,GAA7C,GAAO2lD,EAAP,KAAmBC,EAAnB,KACA,MAAsD5lD,EAAAA,EAAAA,WAAS,GAA/D,GAAO6lD,EAAP,KAA4BC,EAA5B,KACA,MAA4C9lD,EAAAA,EAAAA,UAAS,MAArD,GAAOuhD,EAAP,KAAuBwE,EAAvB,KAEMC,EAAsBpwE,GACtB3G,GAAWmjB,EAAAA,EAAAA,MACXvY,GAAUkY,EAAAA,EAAAA,MACV7d,GAAW8d,EAAAA,EAAAA,MACXylB,GAAcplB,EAAAA,EAAAA,IAAYsG,GAAD,KACzBxE,EAAW,IAAQ,IAAOsjB,GAAc,CAAC,SAAAze,GAAC,OAAIA,EAAE1mB,KAAKuL,aAAX,IAE1Cod,EAAe,UAAGwc,GADFplB,EAAAA,EAAAA,IAAYuG,YACb,QAAiC,CAAC,EAEjDrE,GAAalC,EAAAA,EAAAA,KACjB,SAAAC,GAAK,uBAAI2B,GAAiB3B,EAAO2I,EAAgB3zB,WAA5C,QAAmD,CAAC,CAApD,GADuB,KAKxBg4C,GAAcjtB,EAAAA,EAAAA,KAClB,SAAAC,GAAK,uBAAIuB,GAAkBvB,EAAO2I,EAAgBnH,eAA7C,QAAwD,CAAC,CAAzD,GADwB,KAKzBW,GAAOpC,EAAAA,EAAAA,KAAY,SAAAC,GAAK,uBAAI2C,GAAW3C,UAAf,QAAyB,EAAzB,GAAN,KAElBy3C,GAAe1yB,EAAAA,EAAAA,UACnB,kBAAM/iB,GAAmBC,EAAY+qB,EAAa7qB,EAAlD,GACA,CAACF,EAAY+qB,EAAa7qB,IAGtB6D,GAAOjG,EAAAA,EAAAA,IAAYmG,GAAD,KAClBE,IAAgBrG,EAAAA,EAAAA,IAAYoG,GAAD,KAC3BwtD,IAAoB5uC,EAAAA,EAAAA,UACxB,kBAAM,IAAO3e,IAAe,IAAM,CAAC,CAAnC,GACA,CAACA,KAEG9E,IAAkBvB,EAAAA,EAAAA,IAAYqB,IAC9BlU,IAAO6S,EAAAA,EAAAA,IAAY+F,GAAD,KAClB8tD,IAAmB7uC,EAAAA,EAAAA,UAAQ,kBAAM73B,cAAN,EAAMA,GAAM2mE,WAAZ,GAAyB,CAAC3mE,KACrDtF,GAAOwb,QAAQ6rD,GAEfznD,GACJiwC,EAAar1C,cAAgBq1C,EAAap1C,UAC1C,IAAIxlB,KAAK8rB,EAAgBmJ,kBAAkBxpB,UAAYzL,KAAKC,MAExDg2E,GACJrb,EAAap1C,SAAW,IACvBo1C,EAAar1C,aAAeq1C,EAAap1C,UAAUyqC,QAAQ,GAExDimB,GAAgBtb,EAAa71C,UAC/B,wBACA,oBAEEkyD,GACJ,gBAAC,GAAD,CACE9mC,YAAaA,EACbkb,WAAYA,EACZ1gC,UAAWA,GACXlG,gBAAiBA,GACjBqH,gBAAiBA,EACjBC,aAAckqD,GAAa,KAIzBiB,GAAmB,SAAAnvB,GACvBuD,EAAcvD,GACdwuB,EAAmBxuB,EACpB,EA4DD,OAhDAvkC,EAAAA,EAAAA,YAAU,WACRrY,KACI/G,OAAO6J,MAAM7J,OAAO6J,KAAK,MAAO,gBAAiB,gBACrDnO,EAASoQ,KACV,GAAE,CAACpQ,KAEJ0jB,EAAAA,EAAAA,YAAU,WACJ2F,EAAK0jB,iBAAqBx8B,IAC5BvQ,EjI5SG,CACLo3B,QAAStxB,KACTuxB,MAAO,CAAC16B,GAAkBC,GP8DE,qBwI8O7B,GAAE,CAACysB,EAAK0jB,gBAAiBx8B,GAAMvQ,KAEhC0jB,EAAAA,EAAAA,YAAU,WAEL,C5HjUE,WAIA,mBARA,uBAYA,mB4H8TD4S,SAASrxB,EAASolB,WAEhB9Z,IACFsmE,GAAwBtmE,GAAK2mE,YAGlC,GAAE,CAACD,GAAkBhyE,EAASolB,SAAU9Z,MAEzCmT,EAAAA,EAAAA,YAAU,WAEL,C5HhVE,WAIA,mBARA,uBAYA,mB4H6UD4S,SAASrxB,EAASolB,WAEhBhB,EAAKyoD,oBACPlnE,EAAQM,K5H5VP,uB4H+VN,GAAE,CAACme,EAAKyoD,mBAAoB7sE,EAASolB,SAAUzf,KAEhD8Y,EAAAA,EAAAA,YAAU,WACJgzD,GACFC,GAAc,EAEjB,GAAE,CAAC1xE,EAASolB,SAAUqsD,IAEnBpyE,OAAO+yE,iBACF,gBAAC,GAAD,MAIP,uBAAKj3D,UAAWH,EAAQR,MACtB,gBAAC,GAAD,CAAayD,OAAQ3S,cAAF,EAAEA,GAAMlY,KAC3B,gBAAC8qD,EAAA,EAAD,CACEC,UAAWn+C,EAASolB,SAASiM,SAAS,UAAY,EAAI,EACtDhtB,SAAS,QACT8W,WAAWgO,EAAAA,EAAAA,GACTnO,EAAQi/C,OADK,MAGVj/C,EAAQ01D,YAAcpqB,GAEzB4qB,GAAa,KAAQtrD,IAAa5K,EAAQyK,QAC1CsB,EAAgBqtC,mBAAqBp5C,EAAQ4K,UAC7CA,IAAa5K,EAAQ4K,YAGvB,gBAACuP,EAAA,EAAD,KACE,gBAAC7I,EAAA,EAAD,CAAQ+lD,QAAM,GACZ,gBAACvlD,EAAA,EAAD,CACEzH,MAAM,UACNjyB,GAAG,cACH,aAAW,cACXisB,QAAS,kBAAM8yD,IAAiB,EAAvB,EACTvX,KAAK,QACLz/C,WAAWgO,EAAAA,EAAAA,GAAKnO,EAAQ4pD,WAAT,MACZ5pD,EAAQw8C,KAAOlR,KAGlB,gBAACgsB,EAAA,EAAD,QAGJ,gBAAChmD,EAAA,EAAD,CAAQimD,MAAI,GACV,gBAACzlD,EAAA,EAAD,CACEzH,MAAM,UACNjyB,GAAG,gBACH,aAAW,cACXisB,QAAS,kBAAMqyD,GAAeD,EAArB,EACTt2D,UAAWH,EAAQ4pD,YAEnB,gBAAC0N,EAAA,EAAD,QAGJ,uBAAKn3D,UAAWH,EAAQya,MACtB,gBAACuuB,EAAA,GAAD,CACE5wD,GAAG,uBACHkX,QAAS2V,EACT+kC,cAAc,oBACdwtB,kBAAgB,EAChB9tB,eAAgB,SAAAC,GAAM,uBAAIA,EAAOvmD,YAAX,QAAmB,EAAnB,EACtBq0E,kBAAmB,SAAC9tB,EAAQ//C,GAAT,OACjB+/C,EAAO//C,QAAUA,EAAMA,KADN,EAGnBq/C,eAAa,EACb5uB,SAAU,SAAC7hC,EAAGoI,GACRA,GApHE,SAAAA,GAClBb,EAASi4B,MACT7sB,GAAOkT,GAAoBzd,GAAU+J,EACtC,CAiH0B+sE,CAAY92E,EAC1B,EACDi/B,KAAK,QACL83C,cAAY,EACZ33D,QAAS,CACPR,KAAMQ,EAAQiqC,OACdp4B,aAAc7R,EAAQqlC,iBAExBj1B,WAAS,EACTxmB,MAAOmiB,EACPm+B,YAAa,SAAAxiD,GAAM,OACjB,gBAAC,IAAD,MACMA,EADN,CAEE4yB,OAAO,SACPxE,YAAY,wBACZxD,WAAU,IACR2Q,aAAc,MACdwc,kBAAkB,GACf/3C,EAAO4qB,YAEZnS,UAAWH,EAAQglC,kBAVJ,IAcrB,gBAACixB,GAAD,CACErrD,UAAWA,GACXsrD,WAAYA,GACZC,cAAeA,KAEjB,gBAACG,GAAD,CAAwB11E,QAASmrB,KAEnC,gBAAC6rD,GAAD,CAAgBtnE,KAAMA,GAAM8Y,KAAMA,EAAMpkB,SAAUA,IAClD,4BACA,gBAAC,GAAD,CACEokB,KAAMA,EACN3e,OAAQA,GACR6F,KAAMA,GACNtF,KAAMA,GACNqnE,eAAgBA,EAChBj5C,YAAa,kBAAMy9C,EAAkB,KAAxB,EACbzE,WAAY,SAAA55E,GAAC,OAAIq+E,EAAkBr+E,EAAEqiC,cAAxB,EACbs3C,aAxJW,SAACznE,EAAMmtE,GAC1BhB,EAAkB,MAClB1rE,GAAOT,EAAMmtE,EACd,EAsJS/mE,OAAQ,SAAAgnE,GAAI,OAAI/3E,EAAS+Q,GAAOgnE,GAApB,EACZ9yE,SAAUA,EACV2F,QAASA,KAGb,gBAAC,GAAD,CACE6pE,eAAgBprD,EAAK2jB,WACrBt8B,MAAOH,cAAF,EAAEA,GAAMG,SAGjB,gBAAC6gB,EAAA,EAAD,CAAQ+lD,QAAM,GACZ,gBAAC,KAAD,CACE1zD,MAAM,GACNo0D,WAAY,IACZC,OAAQzB,EAAkB,KAAO,kBAAMhrB,GAAc,EAApB,EACjC0sB,WAAY,IACZ/tD,QACEqsD,EACI,KACA,WACOA,GACHhrB,GAAc,EAEjB,GAGP,gBAACjU,EAAA,GAAD,CACElzB,QAAQ,YACRjE,WAAWgO,EAAAA,EAAAA,GAAKnO,EAAQs1D,QAAT,UACZt1D,EAAQsrC,WAAaA,GADT,KAEZtrC,EAAQ61D,aAAevqB,GAFX,IAIftrC,QAAS,CACPimC,OAAO93B,EAAAA,EAAAA,IAAI,UACRnO,EAAQsrC,WAAaA,GADb,KAERtrC,EAAQ61D,aAAevqB,GAFf,MAMb,uBAAKnrC,UAAWH,EAAQ81D,SACtB,gBAAC,IAAD,CAAY1xD,QAAQ,aAApB,WACA,gBAAC0N,EAAA,EAAD,CACEzN,QAAS,kBAAM8yD,IAAiB,EAAvB,EACT9sD,MAAM,WAEN,gBAACi3B,EAAA,EAAD,QAGJ,gBAAC,IAAD,MACC41B,MAIP,gBAAC5/B,EAAA,GAAD,CACElzB,QAAQ,YACRjE,UAAWH,EAAQs1D,OACnB/9B,OAA4B,QAApBz3C,EAAM2qC,UAAsB,QAAU,OAC9Cz/B,KAAMyrE,EACNvsD,QAAS,kBAAMwsD,GAAeD,EAArB,EACTz2D,QAAS,CACPimC,MAAOjmC,EAAQk4D,aAEjBC,WAAY,CACVl9C,aAAa,IAGdi8C,IAEH,gBAAC,GAAD,CACElsE,KAAM2rE,EACNzsD,QAAS,kBAAM0sD,GAAuB,EAA7B,EACTjsE,QAASA,IAEVtG,OAAO82B,cACN,gBAAC,GAAD,CACEpP,gBAAiBA,EACjBzb,KAAMA,GACN8Y,KAAMA,IAGV,wBACEjJ,WAAWgO,EAAAA,EAAAA,GACTnO,EAAQm+B,QACRmN,GAActrC,EAAQg2D,oBAGxB,gBAAC,KAAD,CACEoC,SAAU,gBAAG10E,EAAH,EAAGA,MAAO20E,EAAV,EAAUA,WAAV,OACR,gBAAC7sC,GAAD,CACE9nC,MAAOA,EACPiH,QAASA,EACT8gC,kBAAmB4sC,EACnB3sC,iBAAkB4sC,EAAAA,IALZ,GASV,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEvK,OAAK,EACLrjE,K5HtiBL,mB4HuiBKmrB,UAAW0iD,KAEb,gBAAC,KAAD,CAAOxK,OAAK,EAACrjE,K5HriBhB,kB4HqiB2CmrB,UAAW2iD,KACnD,gBAAC,GAAD,CAAczK,OAAK,EAACrjE,K5HljBvB,wB4HmjBK,gBAAC,GAAD,OAEF,gBAAC,GAAD,CAAcqjE,OAAK,EAACrjE,K5H7jBvB,a4H8jBK,gBAAC,GAAD,OAEF,gBAAC,GAAD,CAAcqjE,OAAK,EAACrjE,K5HpjBvB,Y4HqjBK,gBAAC,GAAD,OAEF,gBAAC,GAAD,CAAcqjE,OAAK,EAACrjE,K5H3iBvB,oB4H4iBK,gBAAC,GAAD,OAEF,gBAAC,GAAD,CAAcqjE,OAAK,EAACrjE,K5H1iBvB,iB4H2iBK,gBAAC,GAAD,OAEF,gBAAC,GAAD,CAAcqjE,OAAK,EAACrjE,K5HziBvB,Y4H0iBK,gBAAC+tE,GAAD,OAGF,gBAAC,GAAD,CAAc1K,OAAK,EAACrjE,K5HjiBvB,gB4HkiBK,gBAAC,GAAD,OAEF,gBAAC,GAAD,CAAcqjE,OAAK,EAACrjE,K5H5ZvB,gC4H6ZK,gBAAC,GAAD,OAEF,gBAAC,GAAD,CAAcqjE,OAAK,EAACrjE,K5HnZvB,gC4HoZK,gBAAC,GAAD,OAEF,gBAAC,GAAD,CAAcA,K5HlZjB,mB4HmZK,gBAAC,GAAD,UAMR,gBAAC,GAAD,CACEtK,aAAc22E,GACd7sD,QAAS,kBAAMnqB,EAAS+2E,EAAoBC,IAAnC,EACT1yD,QAAS,kBAAMtkB,EAAS+2E,EAAoBC,IAAnC,IAIhB,ECphBD,UAAevsD,EAAAA,GAAAA,IAlEA,SAAA1qB,GAAK,MAAK,CACvBiO,SAAU,CACR+c,WAAYhrB,EAAM4f,QAAQ,IAE5B81B,KAAM,CACJlb,OAAQ,EACRhC,YAAa,EACbogD,UAAW,QAEbC,SAAU,CACR7tD,WAAYhrB,EAAM4f,QAAQ,IAC1BD,cAAe3f,EAAM4f,QAAQ,KAE/BytC,KAAM,CACJ/0B,MAAO,GACPpU,aAAclkB,EAAM4f,QAAQ,IAfZ,GAkEc,CAChCmM,WAAW,EACXzoB,KAAM,OAFR,EA/CA,SAAgB0oB,GACuBA,EAA7BrhB,OAAR,IAAgBuV,EAAqB8L,EAArB9L,QAEhB,OAFqC8L,EAAZnhB,QAGvB,gBAAC,GAAD,CAAS4nB,MAAI,GACX,gBAAC,KAAD,CAAMtS,WAAS,EAACC,eAAe,iBAC7B,gBAAC,KAAD,CAAME,MAAI,EAAC4V,GAAI,EAAG3V,GAAI,GAAIF,UAAWH,EAAQjS,UAC3C,uBACEqyB,IAAK4D,GAAAA,eACL3D,IAAI,SACJlgB,UAAWH,EAAQmtC,OAErB,gBAAC,IAAD,CAAY/oC,QAAQ,KAAKuoB,cAAY,GAArC,qDAGA,gBAAC,IAAD,CAAYvoB,QAAQ,YAAYyR,UAAU,OACxC,sBAAI1V,UAAWH,EAAQw1B,MACrB,0BACE,gBAAC,GAAD,CAAMlxB,KAAK,yBAAyB9U,KAAK,gBAE3C,0BACE,gBAAC,GAAD,CAAM8U,KAAK,2BAA2B9U,KAAK,mBAE7C,0BACE,gBAAC,GAAD,CAAM8U,KAAK,+BAA+B9U,KAAK,eAEjD,0BACE,gBAAC,GAAD,CACE8U,KAAK,4BACL9U,KAAK,cACL0c,KAAM,qBAAG/L,UAAU,yBASpC,I,umCCmJD,UAAeqK,EAAAA,GAAAA,IA1LA,SAAA1qB,GAAK,MAAK,CACvB84E,QAAS,CACPp6B,aAAc,eACdxzB,gBAAiB,UACjBX,MAAOvqB,EAAM4qB,QAAQ8e,KAAK,MAE5BqvC,MAAO,CACL7tD,gBAAiB,oBAEnB8tD,OAAQ,CACNvvC,UAAW,aAAF,OAAezpC,EAAM4qB,QAAQw7B,UACtCniC,WAAY,GAEdg1D,OAAQ,CACN/tD,gBAAiB,GAAF,OAAKlrB,EAAM4qB,QAAQw7B,SAAnB,eACf3c,UAAW,aAAF,OAAezpC,EAAM4qB,QAAQU,QAAQC,MAC9CtH,WAAY,GAEdi1D,YAAa,CACXhuD,gBAAiB,GAAF,OAAKlrB,EAAM4qB,QAAQw7B,SAAnB,gBAEjB+yB,YAAa,CACXv9C,QAAS,GAtBO,GA0Lc,CAChC7P,WAAW,EACXzoB,KAAM,OAFR,EAhKA,SAAiB0oB,GACf,IAAQ9L,EAA4C8L,EAA5C9L,QAASk5D,EAAmCptD,EAAnCotD,QAAS/4E,EAA0B2rB,EAA1B3rB,KAAMm1E,EAAoBxpD,EAApBwpD,OAAQprD,EAAY4B,EAAZ5B,QAChC6uD,EAAuC/4D,EAAvC+4D,OAAQF,EAA+B74D,EAA/B64D,MAAOC,EAAwB94D,EAAxB84D,OAAQE,EAAgBh5D,EAAhBg5D,YA2B/B,SAASG,EAAT,GAA8C,cAAtB3pE,EAAsB,KAAhB0c,EAAgB,KAAV7H,EAAU,KAC5C,MAAa,aAATlkB,EA1BN,SAA2BqP,EAAM0c,EAAM7H,GACrC,OACE,gBAACwJ,GAAA,EAAD,CAAUle,IAAKH,EAAM0e,QAAM,EAAC7J,QAASA,GAClC6H,GAAQ,gBAAC6B,GAAA,EAAD,KAAe7B,GACxB,gBAAC8B,GAAA,EAAD,CAAc5C,QAAS5b,IAG5B,CAoBU4pE,CAAkB5pE,EAAM0c,EAAM7H,GAlBzC,SAA0B7U,EAAM0c,EAAM7H,GACpC,OACE,gBAACwJ,GAAA,EAAD,CAAUle,IAAKH,EAAM0e,QAAM,EAAC7J,QAASA,GAClC6H,GACC,gBAAC6B,GAAA,EAAD,CAAcxnB,MAAO,CAAE8jB,MAAO,WAAakB,SAAS,WACjDW,GAGL,gBAAC8B,GAAA,EAAD,CACE5C,QAAS5b,EACTg+C,uBAAwB,CAAEnjC,MAAO,aAIxC,CAMQgvD,CAAiB7pE,EAAM0c,EAAM7H,EACrC,CAED,IAAM1Z,GAAUkY,EAAAA,EAAAA,MAEVy2D,EAAQ,CACZloE,IAAK,CAAC,eAAgB,gBAACm5C,GAAA,EAAD,MAAgB9/C,GAAO,OAAQE,IACrD4uE,IAAK,CAAC,cAAe,gBAACC,GAAA,EAAD,MAAwB/uE,GAAO,OAAQE,IAC5D8uE,MAAO,CAAC,WAAY,gBAAC,KAAD,MAAchvE,GAAO,SAAUE,IACnD+uE,WAAY,CACV,aACA,gBAACC,GAAA,EAAD,MACAlvE,GAAO,cAAeE,IAExBivE,KAAM,CAAC,kBAAmB,gBAACC,GAAA,EAAD,MAAcpvE,GAAO,QAASE,IACxDywC,QAAS,CACP,qBACA,gBAAC0+B,GAAA,EAAD,MACArvE,GAAO,aAAcE,IAEvBovE,QAAS,CAAC,UAAW,gBAAC,KAAD,MAAiBtvE,GAAO,WAAYE,IACzDqvE,QAAS,CAAC,UAAW,gBAACnmD,GAAA,EAAD,MAAiBppB,GAAO,WAAYE,IACzDgrC,KAAM,CACJ,gBACA,gBAACskC,GAAA,EAAD,MACA,kBAAM51E,OAAO2G,KAAK,2BAA4B,SAA9C,GAEFkvE,UAAW,CACT,kBACA,gBAACC,GAAA,EAAD,MACA,kBAAM91E,OAAO2G,KAAK,+BAAgC,SAAlD,GAEFovE,OAAQ,CACN,SACA,gBAACjtD,GAAA,EAAD,MACA,kBAAM9oB,OAAO2G,KAAK,4BAA6B,SAA/C,GAEFhI,OAAQ,CACN,cACA,gBAACoqB,GAAA,EAAD,MACA,kBAAM/oB,OAAO2G,KAAK,4BAA6B,SAA/C,GAEFqvE,KAAM,CACJ,kBACA,gBAACC,GAAA,EAAD,MACA,kBAAMj2E,OAAO2G,KAAK,+BAAgC,SAAlD,GAEFuvE,MAAO,CAAC,sBAAuB,gBAACC,GAAA,EAAD,MAAc/vE,GAAO,SAAUE,IAC9D8vE,SAAU,CACR,eACA,gBAACC,GAAA,EAAD,MACAjwE,GAAO,YAAaE,IAEtBgwE,KAAM,CAAC,WAAY,gBAACC,GAAA,EAAD,MAAgBnwE,GAAO,QAASE,IACnDkwE,QAAS,CAAC,cAAe,gBAACC,GAAA,EAAD,MAAarwE,GAAO,WAAYE,KAGrDowE,EAAK,CAAC,MAAO,MAAO,QAAS,cAC7BC,EAAK,CAAC,QAAS,UAAW,UAAW,QACrCC,EAAK,CAAC,OAAQ,YAAa,SAAU,UACrCC,EAAK,CAAC,OAAQ,OAAQ,UAAW,YAEvC,MAAa,aAAT/6E,EAEA,gBAACm3C,EAAA,GAAD,CAAQtsC,KAAMsqE,EAAQprD,QAASA,GAC7B,gBAACwD,GAAA,EAAD,CACEvN,UAAW04D,EACXtkD,UAAW,gBAACijB,GAAA,EAAD,kBAEVujC,EAAG9iF,KAAI,SAAA21B,GAAC,OAAIurD,EAAcG,EAAM1rD,GAAxB,KAEX,gBAAC,IAAD,CAASzN,UAAW64D,IACpB,gBAACtrD,GAAA,EAAD,CACEvN,UAAW04D,EACXtkD,UAAW,gBAACijB,GAAA,EAAD,mBAEVwjC,EAAG/iF,KAAI,SAAA21B,GAAC,OAAIurD,EAAcG,EAAM1rD,GAAxB,KAEX,gBAAC,IAAD,CAASzN,UAAW64D,IACpB,gBAACtrD,GAAA,EAAD,CAAMvN,UAAW04D,GAAQM,EAAcG,EAAMU,UAC7C,gBAAC,IAAD,CAAS75D,UAAW64D,IACpB,gBAACtrD,GAAA,EAAD,CAAMvN,UAAW04D,EAAOtkD,UAAW,gBAACijB,GAAA,EAAD,cAChCyjC,EAAGhjF,KAAI,SAAA21B,GAAC,OAAIurD,EAAcG,EAAM1rD,GAAxB,KAEX,gBAAC,IAAD,CAASzN,UAAW64D,IACpB,gBAACtrD,GAAA,EAAD,CACEvN,UAAW04D,EACXtkD,UAAW,gBAACijB,GAAA,EAAD,eAEV0jC,EAAGjjF,KAAI,SAAA21B,GAAC,OAAIurD,EAAcG,EAAM1rD,GAAxB,MAOf,gBAACsM,GAAA,EAAD,CAAO/Z,UAAWH,EAAQ44D,SACxB,gBAAC,KAAD,CAAM34D,WAAS,EAACE,UAAWH,EAAQi5D,aACjC,gBAAC,KAAD,CAAM34D,IAAE,EAACF,MAAI,EAACD,UAAuB,aAAZ+4D,EAAyBH,EAASD,GACzD,gBAACprD,GAAA,EAAD,CAAMvN,UAAWH,EAAQi5D,aACtB8B,EAAG9iF,KAAI,SAAA21B,GAAC,OAAIurD,EAAcG,EAAM1rD,GAAxB,MAGb,gBAAC,KAAD,CAAMtN,IAAE,EAACF,MAAI,EAACD,UAAuB,cAAZ+4D,EAA0BH,EAASD,GAC1D,gBAACprD,GAAA,EAAD,CAAMvN,UAAWH,EAAQi5D,aACtB+B,EAAG/iF,KAAI,SAAA21B,GAAC,OAAIurD,EAAcG,EAAM1rD,GAAxB,MAGb,gBAAC,KAAD,CAAMtN,IAAE,EAACF,MAAI,EAACD,UAAuB,SAAZ+4D,EAAqBH,EAASD,GACrD,gBAACprD,GAAA,EAAD,CAAMvN,UAAWH,EAAQi5D,aACtBgC,EAAGhjF,KAAI,SAAA21B,GAAC,OAAIurD,EAAcG,EAAM1rD,GAAxB,MAGb,gBAAC,KAAD,CAAMtN,IAAE,EAACF,MAAI,EAACD,UAAuB,UAAZ+4D,EAAsBH,EAASD,GACtD,gBAACprD,GAAA,EAAD,CAAMvN,UAAWH,EAAQi5D,aACtBiC,EAAGjjF,KAAI,SAAA21B,GAAC,OAAIurD,EAAcG,EAAM1rD,GAAxB,OAMpB,IC7MD,UAAeutD,EAAAA,EAAAA,KARK,SAAC,GAAyC,IAAvCv7D,EAAuC,EAAvCA,SAAsBwK,EAAiB,EAA7BplB,SAAYolB,SAK3C,OAJA3G,EAAAA,EAAAA,YAAU,WACRpf,OAAO6G,SAAS,EAAG,EACpB,GAAE,CAACkf,IAEGxK,GAAY,IACpB,I,2BCNc,SAASw7D,KA2HtB,QAFqC13D,SAAS23D,aAGrC,4BAEF,gBAAC,KAAD,CAAW3zE,OA7HH,CACb4zE,UAAW,CACT7vE,OAAQ,CACN7B,MAAO,GACP2xE,QAAS,CACPC,QAAQ,EACRC,WAAY,MAGhBpxD,MAAO,CACLzgB,MAAO,WAETmgE,MAAO,CACL5pE,KAAM,SACN01D,OAAQ,CACNz9B,MAAO,EACP/N,MAAO,WAETqxD,QAAS,CACPC,SAAU,GAEZC,MAAO,CACLx7C,IAAK,iBACLhI,MAAO,IACP6L,OAAQ,MAGZwa,QAAS,CACP70C,MAAO,GACPm4B,QAAQ,EACR85C,KAAM,CACJL,QAAQ,EACRM,MAAO,EACPC,YAAa,GACbC,MAAM,IAGVn8C,KAAM,CACJj2B,MAAO,EACPm4B,QAAQ,EACR85C,KAAM,CACJL,QAAQ,EACRM,MAAO,GACPG,SAAU,GACVD,MAAM,IAGVE,YAAa,CACXV,QAAQ,EACRW,SAAU,IACV9xD,MAAO,UACPo0B,QAAS,GACTrmB,MAAO,GAETgkD,KAAM,CACJZ,QAAQ,EACRM,MAAO,IACPrxC,UAAW,OACX1I,QAAQ,EACRs6C,UAAU,EACVC,SAAU,MACVC,QAAQ,EACRC,QAAS,CACPhB,QAAQ,EACRiB,QAAS,IACTC,QAAS,QAIfC,cAAe,CACbC,UAAW,SACXhqB,OAAQ,CACNiqB,QAAS,CACPrB,QAAQ,EACRt2E,KAAM,QAER43E,QAAS,CACPtB,QAAQ,EACRt2E,KAAM,QAERwjD,QAAQ,GAEVq0B,MAAO,CACLC,KAAM,CACJb,SAAU,IACVD,YAAa,CACXz9B,QAAS,IAGbw+B,OAAQ,CACNd,SAAU,IACVt8C,KAAM,GACN1zB,SAAU,EACVsyC,QAAS,EACTq9B,MAAO,GAEToB,QAAS,CACPf,SAAU,IACVhwE,SAAU,IAEZlB,KAAM,CACJkyE,aAAc,GAEhBC,OAAQ,CACND,aAAc,KAIpBE,eAAe,GAiBiB92E,MAdpB,CACZ8C,SAAU,WACVg1C,KAAM,EACN3jB,MAAO,EACP0jB,IAAK,EACLziB,OAAQ,EACRhb,QAAS,IASZ,C,yHC3HD,IAAMrB,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,YAAK,CACrC0f,MAAI,GACFnW,SAAU,WACVk1C,WAAYz+C,EAAM4qB,QAAQ4yD,OAAOj/B,MAF/B,6DAI8Cv+C,EAAM4qB,QAAQ4yD,OAAO5iD,MAJnE,aAI6E56B,EAAM4qB,QAAQ4yD,OAAOj/B,KAJlG,2DAMsCv+C,EAAM4qB,QAAQ4yD,OAAO5iD,MAN3D,aAMqE56B,EAAM4qB,QAAQ4yD,OAAOj/B,KAN1F,gEAO2Cv+C,EAAM4qB,QAAQ4yD,OAAO5iD,MAPhE,aAO0E56B,EAAM4qB,QAAQ4yD,OAAOj/B,KAP/F,uBAQS,2DART,oBASY,GATZ,qBAUav+C,EAAM4f,QAAQ,IAV3B,kBAWU5f,EAAM4f,QAAQ,IAXxB,mBAYW5f,EAAM4f,QAAQ,IAZzB,oBAaY5f,EAAM4f,QAAQ,IAb1B,iBAcS,UAdT,cAeM,GAfN,GAiBJ2L,KAAM,CACJ1K,OAAQ,GAEVgD,MAAO,CACL0G,MAAOvqB,EAAM4qB,QAAQ8e,KAAK,IAC1B/pB,cAAe3f,EAAM4f,QAAQ,IAE/B0sB,SAAU,CACRthB,WAAYhrB,EAAM4f,QAAQ,GAC1B2K,MAAOvqB,EAAM4qB,QAAQ8e,KAAK,KAE5B+zC,KAAM,CACJzyD,WAAYhrB,EAAM4f,QAAQ,GAC1B2K,MAAOvqB,EAAM4qB,QAAQ8e,KAAK,KAE5B2jB,KAAM,CACJp0B,SAAU,OACV4O,UAAW,SAnCmB,IAuClC,SAAS61C,GAAO1xD,GACd,IAAQlM,EAA8CkM,EAA9ClM,SAAU+D,EAAoCmI,EAApCnI,MAAOyoB,EAA6BtgB,EAA7BsgB,SAAU+gB,EAAmBrhC,EAAnBqhC,KAAMowB,EAAazxD,EAAbyxD,KAAMnlF,EAAO0zB,EAAP1zB,GACzC4nB,EAAUV,KAWhB,OACE,gBAAC4a,GAAA,EAAD,CAAO/Z,UAAWH,EAAQR,KAAMpnB,GAAIA,GACjC+0D,GACC,uBACE/sB,IAAK+sB,EACL9sB,IAAI,SACJuqB,OAhBkB,WACxB,IACEvmD,OAAOo5E,cAAc,IAAIC,MAAM,UAKhC,CAJC,SACA,IAAMC,EAAct5E,OAAOqf,SAASk6D,YAAY,YAChDD,EAAYE,YAAY,UAAU,GAAM,EAAOx5E,OAAQ,GACvDA,OAAOo5E,cAAcE,EACtB,CACF,EASOx9D,UAAWH,EAAQmtC,OAGtBxpC,GACC,gBAAC,IAAD,CAAYS,QAAQ,KAAKjE,UAAWH,EAAQ2D,OACzCA,GAGL,gBAAC,KAAD,CAAWxD,UAAWH,EAAQqL,MAC3B+gB,GACC,gBAAC,IAAD,CAAYhoB,QAAQ,KAAKjE,UAAWH,EAAQosB,UAC1C,6BAAQA,IAGXmxC,GACC,gBAAC,IAAD,CAAYn5D,QAAQ,KAAKjE,UAAWH,EAAQu9D,MACzCA,GAGJ39D,GAEH,gBAAC,GAAD,MAGL,CAED,SAAea,EAAAA,KAAW+8D,I,0HCnFnB,SAASM,GAAaC,GAC3B,OAAOr5E,G5IyHA,a4IzHwB,CAAEq5E,MAAAA,IAC9Bt3E,KADI,e,EAAA,G,EAAA,yBACC,WAAM1D,GAAN,4FACGY,GAAAA,aADH,SACsBZ,EAASkB,OAD/B,sG,iLADD,uDAIJ2C,OAAM,SAAAlD,GACL,OAAOye,QAAQC,OAAO1e,EACvB,GACJ,CCyBD,SA7BA,YAA4B,IAAR+B,EAAQ,EAARA,KAClB,OACE,gBAAC,KAAD,CAAM2a,MAAI,EAACC,GAAI,GAAI2V,GAAI,EAAG1V,GAAI,GAC5B,gBAAC,KAAD,CAAMloB,GAAIqN,EAAKke,OACb,gBAAC,KAAD,CACEA,MAAO,yBAAIle,EAAKke,OAChB4Q,UAAWzoB,GAAWrG,EAAKskB,QAAS,mBAEtC,gBAAC,KAAD,KACE,gBAAC,IAAD,KAAatkB,EAAKsB,YAAlB,QAEF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEsjB,MAAM,UACN/F,KAAM7e,EAAK6zD,KACX/0C,OAAO,SACP0b,IAAI,sBACJ5b,QAAS,kBAAMvW,GAAW,OAAQ,SAAUrI,EAAKke,MAAxC,GALX,2BAaT,GC1BiBpE,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC6pC,MAAO,CACL1F,OAAQ,KAEV+5C,MAAO,CACLtiD,QAAS57B,EAAM4f,QAAQ,GACvBkB,UAAW,SACXoD,cAAelkB,EAAM4f,QAAQ,IAE/Bi/C,KAAM,CACJrkC,OAAQx6B,EAAM4f,QAAQ,KAVQ,KCPhBH,EAAAA,EAAAA,IAAW,iBAAO,CAClC4tC,KAAM,CACJS,cAAe,SACfjmB,UAAW,MACX5O,SAAU,OACVuB,OAAQ,SAEV2jD,gBAAiB,CACfl6D,UAAW,OAEbm6D,YAAa,CACXtwB,cAAe,SACfjmB,UAAW,QACX5O,SAAU,MACVrN,YAAa,MACb1H,aAAc,OAfW,KCGXzE,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC01C,KAAM,CACJ,OAAQ,CACN/1B,cAAe3f,EAAM4f,QAAQ,KAGjCy+D,MAAO,CACLziD,QAAS57B,EAAM4f,QAAQ,GACvBu/B,WAAY,IARkB,I,0BCK5B3/B,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCs+E,SAAU,CACRpzD,gBAAiBlrB,EAAM4qB,QAAQU,QAAQT,OAEzCgf,MAAO,CACL1F,OAAQ,KAEVo6C,IAAK,CACHrzD,gBAAiBlrB,EAAM4qB,QAAQ8e,KAAK,KACpCnf,MAAOvqB,EAAM4qB,QAAQ8e,KAAK,MAE5B2jB,KAAM,CACJxlB,UAAW,MACX5O,SAAU,OACVuB,OAAQ,QACRszB,cAAe,UAEjBnqB,KAAM,CACJQ,OAAQ,MACR7L,MAAO,MACPrU,UAAW,MACX2H,YAAa,MACb1H,aAAc,OAtBgB,IAsIlC,SA5GA,WA+BE,OA9BgB1E,MACAuD,EAAAA,EAAAA,OACCK,EAAAA,EAAAA,OAwBjBO,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,wCAClB,GAAE,IAGD,2BACE,gBAAC,GAAD,CACEwpC,KAAMnpB,GAAAA,cACNoI,SACE,6CACkB,IAChB,gBAAC,KAAD,CAAU4P,SAAS,QAjCX,CAChB,qBACA,mBACA,uBACA,mBACA,qBACA,gBACA,4BACA,wBA0BqB/jD,KAAI,SAAA2tB,GAAC,OACd,wBAAMjW,IAAKiW,GACRA,EADH,IACM,gBAACk2B,GAAA,EAAD,CAAiBv1C,MAAO,CAAE8jB,MAAOi0D,GAAAA,EAAAA,QAFzB,KAMlB,2BACA,gBAAChtD,EAAA,EAAD,CAAQ4J,QAAM,EAAC1J,eAAe,OAA9B,oDAGA,gBAACF,EAAA,EAAD,CAAQsJ,MAAI,EAACpJ,eAAe,OAA5B,4BAKJ+rD,KACE,sCAEE,gBAAC,KAAD,CACE19C,KAAK,QACLzb,QAAQ,YACRiG,MAAM,UACN/F,KAAK,0BAJP,cAQA,gBAACgN,EAAA,EAAD,CAAQsJ,MAAI,GACV,2BADF,OACY,4BAEZ,gBAACtJ,EAAA,EAAD,CAAQ4J,QAAM,GAAd,UACA,gBAAC,KAAD,CACE2E,KAAK,QACLzb,QAAQ,YACRiG,MAAM,UACN/F,KAAK,mCAJP,WAdF,uBA0BJ,gBAAC,GAAD,CACE+0C,UAAQ,EACRmW,MACE,4BACE,oEADF,0BAEM,IACJ,gBAAC,GAAD,CACElrD,KAAK,yBACL9U,KAAK,wBACL6a,MAAM,YANV,wIAUW,IACT,gBAAC,GAAD,CACE/F,KAAK,yBACL9U,KAAK,eACL6a,MAAM,YAdV,OAsBT,E,UChHiB9K,EAAAA,EAAAA,IAAW,iBAAO,CAClC4tC,KAAM,CACJxlB,UAAW,MACX5O,SAAU,OACVuB,OAAQ,QACRszB,cAAe,UAEjB2wB,cAAe,CACbl1E,SAAU,WACVyhB,WAAY,UAEd0zD,YAAa,CACXn1E,SAAU,WACV+0C,IAAK,EACLC,KAAM,GAER1U,MAAO,CACL1F,OAAQ,KAjBiB,I,cCtBvB3kB,IAAYC,EAAAA,EAAAA,IAAW,iBAAO,CAClCoqB,MAAO,CACL1F,OAAQ,KAFiB,IAM7B,SAASw6C,GAAT,GAA6C,IAApBC,EAAoB,EAApBA,UAAW/6D,EAAS,EAATA,MAC5B3D,EAAUV,KAChB,OACE,2BACE,gBAAC,GAAD,CAASiT,MAAOmsD,EAAWnP,MAAO5rD,GAChC,gBAAC,KAAD,CAAMvrB,GAAG,gBACP,gBAAC,KAAD,CAAW+nB,UAAWH,EAAQ2pB,MAAOiyC,MAAO53C,GAAAA,cAC5C,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY2I,cAAY,EAACvoB,QAAQ,KAAKyR,UAAU,MAAhD,qEAGE,2BACA,qDAEF,gBAAC,IAAD,CAAYA,UAAU,QACpB,qBACEvR,KAAK,0BACLC,OAAO,SACP0b,IAAI,uBAHN,eADF,kgBAiBE,2BACA,2BAlBF,wWAyBE,0BACE,+GAIA,2BACA,qGAIA,2BACA,+JAKA,2BACA,kLA1CJ,gnBA4DF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE5V,MAAM,YACN9F,OAAO,SACPD,KAAK,iPACL2b,IAAI,uBAJN,SAQA,gBAAC,KAAD,CACE5V,MAAM,YACN/F,KAAK,oHACLC,OAAO,SACP0b,IAAI,uBAJN,iBAWN,gBAAC,GAAD,CAAS7nC,GAAG,QAAQm6B,KAAMmsD,GACxB,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEv+D,UAAWH,EAAQ2pB,MACnBiyC,MAAO53C,GAAAA,yBAET,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY2I,cAAY,EAACvoB,QAAQ,KAAKyR,UAAU,MAAhD,0EAGE,2BACA,iEAEF,gBAAC,IAAD,CAAYA,UAAU,KACpB,qBACEvR,KAAK,qCACLC,OAAO,SACP0b,IAAI,uBAHN,4BAMK,IAPP,0cAgBE,2BACA,2BACA,0CAlBF,2WAwBE,2BACA,2BACA,2CA1BF,qrBAuCF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE5V,MAAM,YACN9F,OAAO,SACPD,KAAK,2PACL2b,IAAI,uBAJN,SAQA,gBAAC,KAAD,CACE5V,MAAM,YACN/F,KAAK,2HACLC,OAAO,SACP0b,IAAI,uBAJN,iBAWN,gBAAC,GAAD,CAAS7nC,GAAG,SAASm6B,MAAOmsD,GAC1B,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAWv+D,UAAWH,EAAQ2pB,MAAOiyC,MAAO53C,GAAAA,UAC5C,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY2I,cAAY,EAACvoB,QAAQ,KAAKyR,UAAU,MAAhD,sFAGE,2BACA,8CAEF,gBAAC,IAAD,CAAYA,UAAU,KAAtB,wBACwB,IACtB,qBACEvR,KAAK,yBACLC,OAAO,SACP0b,IAAI,uBAHN,UAMK,IARP,sUAcE,2BACA,2BAfF,kdA0BF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE5V,MAAM,YACN9F,OAAO,SACPD,KAAK,wLACL2b,IAAI,uBAJN,YAWN,gBAAC,GAAD,CAAS1N,KAAMmsD,GACb,gBAAC,KAAD,CAAMtmF,GAAG,aACP,gBAAC,KAAD,CAAW+nB,UAAWH,EAAQ2pB,MAAOiyC,MAAO53C,GAAAA,gBAC5C,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY2I,cAAY,EAACvoB,QAAQ,KAAKyR,UAAU,MAAhD,8EAGE,2BACA,mDAEF,gBAAC,IAAD,CAAYA,UAAU,QACpB,qBACEvR,KAAK,8BACLC,OAAO,SACP0b,IAAI,uBAHN,YADF,iJAU6B,IAC3B,qBACE3b,KAAK,uJACLC,OAAO,SACP0b,IAAI,uBAHN,gCAXF,wGAoBE,2BACA,2BArBF,+NA0BE,0BACE,iHAIA,2BACA,oJAIA,2BACA,mIArCJ,yNAgDF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE5V,MAAM,YACN9F,OAAO,SACPD,KAAK,wLACL2b,IAAI,uBAJN,YAWN,gBAAC,GAAD,CAAS7nC,GAAG,YAAYm6B,MAAOmsD,GAC7B,gBAAC,KAAD,CAAMtmF,GAAG,aACP,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAYu0C,cAAY,EAACvoB,QAAQ,KAAKyR,UAAU,MAAhD,iFAGE,2BACA,yDAEF,gBAAC,IAAD,CAAYA,UAAU,QAAtB,gCACgC,IAC9B,qBACEvR,KAAK,8BACLC,OAAO,SACP0b,IAAI,uBAHN,aAMK,IARP,oHAWE,2BACA,2BAZF,wFAeE,0BACE,4FAGA,2BACA,gIAIA,2BACA,oIAzBJ,sJAmCF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE5V,MAAM,YACN9F,OAAO,SACPD,KAAK,wLACL2b,IAAI,uBAJN,YAWN,gBAAC,GAAD,CAAS7nC,GAAG,MAAMm6B,KAAMmsD,GACtB,gBAAC,KAAD,KACE,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY/xC,cAAY,EAACvoB,QAAQ,KAAKyR,UAAU,MAAhD,mGAGE,2BACA,6EAEF,gBAAC,IAAD,CAAYA,UAAU,KAAtB,iLAIE,2BACA,2BALF,mJAWF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACExL,MAAM,YACN9F,OAAO,SACPD,KAAK,wLACL2b,IAAI,uBAJN,YAWN,gBAAC,GAAD,CAAS7nC,GAAG,WAAWm6B,MAAOmsD,GAC5B,gBAAC,KAAD,KACE,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY/xC,cAAY,EAACvoB,QAAQ,KAAKyR,UAAU,MAAhD,8FAGE,2BACA,gDAEF,gBAAC,IAAD,CAAYA,UAAU,KAAtB,ucASE,2BACA,2BAVF,mkBAoBE,2BACA,2BArBF,udAgCF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACExL,MAAM,YACN9F,OAAO,SACPD,KAAK,wLACL2b,IAAI,uBAJN,YAWN,gBAAC,GAAD,CAAS7nC,GAAG,OAAOm6B,KAAMmsD,GACvB,gBAAC,KAAD,KACE,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY/xC,cAAY,EAACvoB,QAAQ,KAAKyR,UAAU,MAAhD,mEAEE,2BACA,6CAEF,gBAAC,IAAD,CAAYA,UAAU,KAAtB,iaAQE,2BACA,2BATF,4NAgBF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACExL,MAAM,YACN9F,OAAO,SACPD,KAAK,wLACL2b,IAAI,uBAJN,YAaX,CAED,SAAexf,EAAAA,KAAWg+D,KC9dRl/D,EAAAA,EAAAA,IAAW,iBAAO,CAClC4tC,KAAM,CACJxlB,UAAW,MACX5O,SAAU,OACVuB,OAAQ,MACRszB,cAAe,UALU,KCCXruC,EAAAA,EAAAA,IAAW,iBAAO,CAClC4tC,KAAM,CACJxlB,UAAW,MACX5O,SAAU,OACVuB,OAAQ,MACRszB,cAAe,UALU,I,0HC0BXruC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCm/D,OAAQ,CACN51D,SAAU,YAEZs1E,aAAc,CACZlkD,KAAM,GAERmkD,OAAQ,IACNxmD,MAAO,OACPD,WAAYr4B,EAAM4f,QAAQ,GAC1BgM,YAAa5rB,EAAM4f,QAAQ,IAC1B5f,EAAM+pE,YAAYC,GAAG,IAAMhqE,EAAM4f,QAAQ,IAAM,CAC9C0Y,MAAO,IACPD,WAAY,OACZzM,YAAa,SAGjBmzD,MAAO,CACL96D,UAAWjkB,EAAM4f,QAAQ,GACzByY,WAAYr4B,EAAM4f,QAAQ,GAC1BgM,YAAa5rB,EAAM4f,QAAQ,IAE7Bo/D,WAAY,CACV9zD,gBAAiBlrB,EAAM4qB,QAAQ8e,KAAK,MAEtCu1C,YAAa,CACX7mD,QAAS,OACThY,eAAgB,SAChBo8B,WAAY,WACZt4B,aAAclkB,EAAM4f,QAAQ,IAE9Bs/D,YAAa,MACVl/E,EAAM+pE,YAAYC,GAAG,MAAQ,CAC5BrqD,cAAe3f,EAAM4f,QAAQ,KAjCD,KCvBhBH,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJuE,UAAWjkB,EAAM4f,QAAQ,GACzBkB,UAAW,SACX,QAAS,CACP0Z,OAAQx6B,EAAM4f,QAAQ,KALM,I,0DCS5BJ,IAAYC,EAAAA,EAAAA,IAAW,iBAAO,CAClC2nB,OAAQ,CACNie,gBAAiB,OAAF,OAASnhB,GAAAA,QAAT,MAEjBmpB,KAAM,CACJxlB,UAAW,MACX5O,SAAU,OAEZugC,KAAM,CACJjvC,MAAO,QACPkB,SAAU,IAEZ0zD,YAAa,CACXh7C,OAAQ,MACR7L,MAAO,MACPD,WAAY,GAEd+mD,SAAU,CACRj7C,OAAQ,MACR7L,MAAO,MACPD,WAAY,EACZ/vB,OAAQ,gBArBiB,IAyB7B,SAASvG,GAAT,GAAuC,IAApB+uE,EAAoB,EAApBA,QAASx0B,EAAW,EAAXA,QACpBp8B,EAAUV,KAERlc,EAAuCwtE,EAAvCxtE,KAAM+7E,EAAiCvO,EAAjCuO,KAAMC,EAA2BxO,EAA3BwO,QAASC,EAAkBzO,EAAlByO,cAEvBlyB,EAAOnpB,GAAO,KAAU5gC,IAE9B,OACE,gBAAC,KAAD,CAAMk8E,QAAM,GACV,gBAAC,KAAD,CACEn/D,UAAWH,EAAQknB,OACnBvjB,MACE,gBAAC,GAAD,CACEW,KAAM86D,EACN76D,OAAO,SACP/U,KACE29C,EACE,uBAAK/sB,IAAK+sB,EAAM9sB,IAAKj9B,EAAM+c,UAAWH,EAAQmtC,OAE9C,2BACG/pD,GACC,4BACGA,EADH,IAEE,gBAAC,KAAD,CAAemoB,SAAS,gBASxC,gBAAC,KAAD,KACE,gBAAC,IAAD,KAAa4zD,IAEf,gBAAC,KAAD,KACI/iC,EA6BA,gBAAC,KAAD,CACE93B,KAAM86D,EACN76D,OAAO,SACPq9B,QAAS,gBAAC,KAAD,CAAer2B,SAAS,aAEhCnoB,GAjCH,gBAAC,KAAD,CACEugB,MAAK,qBAAgBvgB,EAAhB,sBACHi8E,EAAa,0BACUA,EADV,aAET,iDAGN,gBAAC,KAAD,CACE/6D,KAAI,iDACF+6D,GAAiB,QAEnB96D,OAAO,SACPuW,UACE,uBACEsF,IAAK4D,GAAAA,eACL3D,IAAI,iBACJlgB,UACEk/D,EAAgBr/D,EAAQi/D,YAAcj/D,EAAQk/D,YAKpD,wBAAM34E,MAAO,CAAEg5E,YAAa,eACzBF,EAAgB,SAAW,gBAgB3C,CAODx9E,GAAQ45B,aAAe,CACrB2gB,SAAS,ICnGW5xB,EAAAA,GAAAA,IAAW,iBAAO,CACtCsO,QAAS,CACPC,SAAU,IACVnY,UAAW,UAHkB,GAAX4J,CAKlBwO,EAAAA,KC0KWxO,EAAAA,GAAAA,IAvLA,SAAA1qB,GAAK,MAAK,CACvBsgB,KAAM,CACJgY,MAAO,WAET5Y,KAAM,CACJ++B,WAAYz+C,EAAM4qB,QAAQw7B,SAC1BzzB,OAAQ,UACRyF,QAAS,OACT,kBAAmB,gBACnB+L,OAAQ,KAEV/X,KAAM,CACJkM,MAAO,GACP6L,OAAQ,MAEV0F,MAAO,CACL1F,OAAQ,KAhBQ,GAuLc,CAChCpY,WAAW,EACXzoB,KAAM,OAFR,EAnKA,SAAmB0oB,GACjB,IAAQ9L,EAAY8L,EAAZ9L,QAEFjgB,GAAWmjB,EAAAA,EAAAA,OAEjBO,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,8BACjB5jB,Ed1BK,CACLo3B,QAAS2mD,GcyBe,CAAC,SdxBzB1mD,MAAO,CAACj+B,EAAoBC,EAAoBC,IcyBjD,GAAE,IAEH,IAAQwwB,GAAc1G,EAAAA,EAAAA,IAAYyG,IAA1BC,UA6BR,OACE,2BACE,gBAAC,GAAD,CAAQlG,MAAM,0BACd,gBAAC,GAAD,KACE,gBAAC,IAAD,CAAYS,QAAQ,MAApB,iGAIA,2BACA,gBAAC,IAAD,4XAQA,2BACA,2BACA,gBAAC,KAAD,CAAMnE,WAAS,EAACwqB,UAAU,MAAMvqB,eAAe,SAASR,QAAS,GA9CrD,CAChB,CACEtc,KAAM,yCACNF,IAAK,oDAEP,CACEE,KAAM,sCACNF,IAAK,iDAEP,CACEE,KAAM,yBACNF,IAAK,8CAEP,CACEE,KAAM,2BACNF,IAAK,6CAEP,CACEE,KAAM,6BACNF,IAAK,+CAEP,CACEE,KAAM,6BACNF,IAAK,8CAwBUjL,KAAI,SAAA2tB,GAAC,OACd,gBAAC,KAAD,CAAMjW,IAAKiW,EAAE1iB,IAAKkd,MAAI,EAAC4V,GAAI,EAAG1V,GAAI,EAAGH,UAAWH,EAAQI,MACtD,gBAAC,KAAD,CACEk/D,QAAM,EACNn/D,UAAWH,EAAQR,KACnB6E,QAAS,kBAAMhgB,OAAO2G,KAAK4a,EAAE1iB,IAAK0iB,EAAE1iB,IAA3B,GAET,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY2yB,UAAU,MAAMjQ,EAAExiB,MAC9B,gBAAC,IAAD,CAAYghB,QAAQ,YAAYiG,MAAM,iBAAtC,0BAIF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACElK,UAAWH,EAAQkM,KACnB0vD,MAAO53C,GAAAA,IACPrgB,MAAOiC,EAAExiB,SAjBH,KAwBlB,4BAEF,gBAAC,GAAD,CACEmvB,MAAI,EACJg9C,MAAM,gEAEN,gBAAC,KAAD,CAAMtvD,WAAS,EAACP,QAAS,GACtBmK,EAAU5xB,KAAI,SAAAwN,GAAI,OACjB,gBAAC,GAAD,CAAUkK,IAAKlK,EAAK+5E,KAAM/5E,KAAMA,GADf,MAKvB,gBAAC,GAAD,CACEi5E,WAAS,EACT/6D,MAAM,mDAER,gBAAC,GAAD,KACE,gBAAC,KAAD,CAAMvrB,GAAG,cACP,gBAAC,KAAD,CAAW+nB,UAAWH,EAAQ2pB,MAAOiyC,MAAO53C,GAAAA,UAC5C,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAY2I,cAAY,EAACvoB,QAAQ,KAAKyR,UAAU,MAAhD,8EAGE,2BACA,+DAEF,gBAAC,IAAD,CAAYA,UAAU,QACpB,yCACA,gkBAWA,qBAAG1V,UAAU,YAAb,sHAIA,2BACA,0CACA,2pBAeJ,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEkK,MAAM,YACN9F,OAAO,SACPD,KAAK,uKACL2b,IAAI,uBAJN,YAaX,KChMiB1gB,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC2/E,KAAM,CACJ1mD,SAAU,OACV4O,UAAW,QAEbhkB,MAAO,CACL0G,MAAOvqB,EAAM4qB,QAAQ8e,KAAK,MAE5Bk2C,IAAK,CACH9+D,UAAW,WATmB,KCGhBrB,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJsL,WAAYhrB,EAAM4f,QAAQ,GAC1BD,cAAe3f,EAAM4f,QAAQ,IAE/BigE,QAAS,CACPjkD,QAAS57B,EAAM4f,QAAQ,IANO,KCChBH,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC01C,KAAM,CACJ,OAAQ,CACN/1B,cAAe3f,EAAM4f,QAAQ,KAHD,KCChBH,EAAAA,EAAAA,IAAW,iBAAO,CAClCq8D,MAAO,CACL7iD,SAAU,OACVjO,WAAY,MACZrL,cAAe,OAJU,ICL7B,SAASmgE,KACP,OACE,2BACE,gBAAC,GAAD,CAAQj8D,MAAM,iBACd,gBAAC,GAAD,CACE4rD,MAAM,oBACNjqE,KACE,wNAG2D,IACzD,qBACEgf,KAAK,gDACLC,OAAO,SACP0b,IAAI,uBAHN,iDAOA,2BACA,2BAZF,+GAckD,IAChD,qBAAG3b,KAAK,2BAAR,oBAfF,qIAuBT,CAED,SAAe7D,EAAAA,KAAWm/D,IClCX,SAASC,GAAe/R,GAErC,QADoCpqD,SAAS23D,aAC1BuE,GACZ9R,CACR,C,SCkCD,SAhCA,WAME,OALArqD,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,mBACjB7V,GAAW,eAAgB,oBAC5B,GAAE,IAGD,uBAAKvH,MAAO,CAAEyd,aAAc,KAC1B,gBAAC,GAAD,CACE5rB,GAAG,iBACHurB,MAAM,oBACNyoB,SAAS,uCAEX,gBAAC,KAAD,CACEnsB,WAAS,EACTwqB,UAAU,MACVvqB,eAAe,SACfo8B,WAAW,MACX58B,QAAS,EACTnZ,MAAO,CAAEm1B,QAAS,QAElB,gBAAC,KAAD,CAAMtb,MAAI,EAACC,GAAI,GAAI2V,GAAI,EAAGxV,GAAI,EAAGpoB,GAAG,qBAClC,gBAAC,IAAD,CAAYgsB,QAAQ,MAApB,iIAQT,E,gBCXD,IAAM9E,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0Q,MAAO,CACLsa,WAAYhrB,EAAM4f,QAAQ,GAC1B0lC,UAAW,OACXD,gBAAiB,OAAF,OAAS26B,GAAAA,UAAT,MAEjB77D,OAAQ,CACN+G,gBAAiBlrB,EAAM4qB,QAAQgI,UAAU/H,OAE3CjnB,MAAO,CACL2mB,MAAOvqB,EAAM4qB,QAAQhnB,MAAM2nB,MAVG,IAc5BsH,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAOhB,OANKiG,EAAO+G,QACVhN,EAAOgN,MAAQ,YAEZ/G,EAAOgH,WACVjN,EAAOiN,SAAW,YAEbjN,CACR,EA0LD,SAxLA,WACE,IAAMkH,GAAUkY,EAAAA,EAAAA,MAEV9iB,GAAWmjB,EAAAA,EAAAA,MAEXlD,EAAUV,KAEVta,GAAW8d,EAAAA,EAAAA,MAETipB,GAAS/mC,EAASoe,OAAS,CAAE2oB,KAAM,CAAE3hB,SAAU,eAA/C2hB,KAEFg0C,EACJ/6E,EAASoe,OAASpe,EAASoe,MAAM2oB,MAAQ/mC,EAASoe,MAAM2oB,KAAK3hB,SAEzD4hB,EAAUhnC,EAASoe,OAASpe,EAASoe,MAAM4oB,QAE3Cg0C,GAAc78D,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgG,KAAK42D,WAAf,GAAN,KAsB/B,OAJAv8D,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,gBAClB,GAAE,IAGD,gBAAC,MAAD,CACE0R,SAtBW,SAAA3rB,GACb,OAAO,IAAIyY,SAAQ,SAAAtpB,GACjBkH,EAASyQ,GAAM9G,IACZjD,MAAK,WACJ5N,EAAQ8R,EAAQqF,QAAQ+7B,GACzB,IACAnlC,OAAM,SAAAlD,G,UACL7K,G,EAAQ,G,EAAG25C,GAAAA,G,EAAa9uC,E,gGACzB,GACJ,GACF,EAaGivB,SAAUA,GACV6C,OAAQ,YAAiD,IAA9CC,EAA8C,EAA9CA,aAAc7E,EAAgC,EAAhCA,YAAalnB,EAAmB,EAAnBA,OAAQjB,EAAW,EAAXA,KAC5C,MAAoB,kCAAhBu3E,EAEA,gBAAC,KAAD,CAAM//D,WAAS,EAACC,eAAe,SAASC,UAAWH,EAAQxP,OACzD,gBAAC,KAAD,CAAM4P,MAAI,EAACC,GAAI,GAAI2V,GAAI,EAAG1V,GAAI,GAC5B,gBAAC,KAAD,CAAM/Z,MAAO,CAAEwd,UAAW,MAAOC,aAAc,QAC7C,gBAAC,KAAD,CACEL,MAAM,6BACN4Q,UAAW,uDAAuB7qB,EAAO+G,OACzCwT,OACE,gBAACC,GAAA,EAAD,KACE,gBAAC,KAAD,SAIN,gBAAC,KAAD,KACE,gBAAC,IAAD,4MAOF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEI,KAAI,gEAA2D5a,EAAO+G,MAAlE,KACJ8T,OAAO,UAFT,uBAaQ,yCAAhBy7D,EAEA,gBAAC,KAAD,CAAM//D,WAAS,EAACC,eAAe,SAASC,UAAWH,EAAQxP,OACzD,gBAAC,KAAD,CAAM4P,MAAI,EAACC,GAAI,GAAI2V,GAAI,EAAG1V,GAAI,GAC5B,gBAAC,KAAD,CAAM/Z,MAAO,CAAEwd,UAAW,MAAOC,aAAc,QAC7C,gBAAC,KAAD,CACEL,MAAM,6BACN4Q,UAAW,uDAAuB7qB,EAAO+G,OACzCwT,OACE,gBAACC,GAAA,EAAD,KACE,gBAAC,KAAD,SAIN,gBAAC,KAAD,KACE,gBAAC,IAAD,8EAEe,IACb,qBACEI,KAAK,yBACLC,OAAO,SACP0b,IAAI,uBAHN,aAHF,kEAaF,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE3b,KAAI,iEAA4D5a,EAAO+G,MAAnE,KACJ8T,OAAO,UAFT,uBAcV,gBAAC,KAAD,CAAMtE,WAAS,EAACC,eAAe,SAASC,UAAWH,EAAQxP,OACzD,gBAAC,KAAD,CAAM4P,MAAI,GACR,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEuD,MAAOqoB,EAAU,yBAA2B,QAC5CzX,UAAWwrD,GAAY,6BACvB97D,OACE,gBAACC,GAAA,EAAD,CAAQ/D,UAAWH,EAAQiE,QACxB+nB,EAAU,gBAAC,KAAD,MAAmB,gBAACi0C,GAAA,EAAD,SAIpC,wBAAM7nF,GAAG,eAAei9B,SAAUI,GAChC,gBAAC,KAAD,KACE,gBAAC,MAAD,CACEryB,KAAK,QACLhL,GAAG,WACHy9B,UAAW3F,GACX/vB,KAAK,QACL8N,MAAM,QACNg1B,aAAa,aAEf,2BACA,gBAAC,MAAD,CACE7qC,GAAG,WACHgL,KAAK,WACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,WACNg1B,aAAa,qBAEdrS,GACC,gBAAC,IAAD,CAAYzQ,UAAWH,EAAQtc,OAC5Bs8E,IAIP,gBAAC,GAAD,CACEhhD,OAAQvJ,EACR4J,YAAU,EACVD,WAAW,QACX32B,KAAMA,GAEN,gBAAC,KAAD,CACEqlB,UAAWpkB,EAAO+G,MAClBtQ,KAAK,SACL/H,GAAG,oBACHisB,QAAS,kBA3IT5T,EA2I2B/G,EAAO+G,WA1IpD1Q,EAAS4hB,GAAgBlR,EAAO9F,IADd,IAAA8F,CA2IS,GAJX,wBAcb,GAGN,ECzND,IAAM6O,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCogF,eAAgB,CACd96B,UAAW,OACXD,gBAAiB,OAAF,OAAS26B,GAAAA,UAAT,MAHe,IAO5BntD,GAAW,SAAAjpB,GACf,IAAMjG,EAAS,CAAC,EAUhB,OATKiG,EAAOgH,WACVjN,EAAOiN,SAAW,YAEhBhH,EAAOgH,WAAahH,EAAO6mE,uBAC7B9sE,EAAOiN,SAAW,2CAEfhH,EAAOgY,2BACVje,EAAOie,yBAA2B,YAE7Bje,CACR,EAmHD,SAjHA,WACE,IAAM1D,GAAWmjB,EAAAA,EAAAA,MAEXlD,EAAUV,KAEV3U,GAAUkY,EAAAA,EAAAA,MAqBhB,OACE,gBAAC,MAAD,CACEwS,SArBW,SAAA3rB,GACb,OAAO,IAAIyY,SAAQ,SAAAtpB,GACjBkH,EAASyhB,GAAc9X,IACpBjD,MAAK,WACJ5N,GACD,IACA4N,MAAK,WACJ8E,YAAW,WACTZ,EAAQM,KAAK,YACd,GAAE,IACJ,IACArE,OAAM,W,UACL/N,G,EAAQ,G,EACL25C,GAAAA,G,EAAa,yC,gGAEjB,GACJ,GACF,EAKG7f,SAAUA,GACV6C,OAAQ,gBACNC,EADM,EACNA,aACAC,EAFM,EAENA,WACAE,EAHM,EAGNA,SACAD,EAJM,EAINA,QACA9sB,EALM,EAKNA,qBACA+nB,EANM,EAMNA,YANM,OAQN,gBAAC,KAAD,CACE3Q,WAAS,EACTC,eAAe,SACfC,UAAWH,EAAQkgE,gBAEnB,gBAAC,KAAD,CAAM9/D,MAAI,GACR,gBAAC,KAAD,CAAM7Z,MAAO,CAAEwd,UAAW,MAAOC,aAAc,QAC7C,gBAAC,KAAD,CACEL,MAAM,kBACN4Q,UAAU,yCAEZ,gBAAC,KAAD,KACE,gBAAC,IAAD,yCACA,wBAAMc,SAAUI,EAAcwN,aAAa,OACzC,gBAAC,MAAD,CACE7/B,KAAK,2BACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,iBACNmiB,WAAS,EACT6S,aAAa,iBAEf,2BACA,gBAAC,MAAD,CACE7/B,KAAK,WACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,eACNmiB,WAAS,EACT6S,aAAa,iBAEf,2BACA,gBAAC,MAAD,CACE7/B,KAAK,uBACLyyB,UAAW3F,GACX/vB,KAAK,WACL8N,MAAM,mBACNmiB,WAAS,EACT6S,aAAa,kBAGhBrS,GACC,2BACE,2BACA,gBAAC,IAAD,CAAYrqB,MAAO,CAAE8jB,MAAO,QACzBuG,KAKT,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEzwB,KAAK,SACLikB,QAAQ,YACRiG,MAAM,YACNyD,SACE4H,GAAcE,GAAaD,IAAY9sB,EAEzCwb,QAASoR,GAERC,EACC,qBAAGvV,UAAU,sCAEb,qBAvEN,GAiFb,ECxID,IAAMb,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrCiI,OAAQ,CACN+iB,WAAYhrB,EAAM4f,QAAQ,GAC1B4Y,YAAax4B,EAAM4f,QAAQ,GAC3B8vB,aAAc1vC,EAAM4f,QAAQ,GAC5B0lC,UAAW,OACXD,gBAAiB,OAAF,OAAS26B,GAAAA,UAAT,MANe,IA0ClC,SAhCA,YACEr8D,EAAAA,EAAAA,YAAU,WACRC,SAASC,MAAQ,2BAClB,GAAE,IAEH,IAAM3D,EAAUV,KAEhB,OACE,gBAAC,KAAD,CAAMW,WAAS,EAACC,eAAe,SAASC,UAAWH,EAAQjY,QACzD,gBAAC,KAAD,CAAMqY,MAAI,EAACC,GAAI,GAAI2V,GAAI,EAAG1V,GAAI,GAC5B,gBAAC,KAAD,KACE,gBAAC,KAAD,CACEqD,MAAM,8BACNM,OACE,gBAACC,GAAA,EAAD,KACE,gBAAC,KAAD,SAIN,gBAAC,KAAD,KACE,gBAAC,IAAD,kLAUX,E,2rCCMD,IAAM4yD,GAAsBpwE,GAEtB4Y,IAAYC,EAAAA,EAAAA,IAAW,SAAAzf,GAAK,MAAK,CACrC0f,KAAM,CACJkB,SAAU,EACVwkC,UAAW,UAEbzqB,KAAM,CACJ/Z,SAAU,GAEZkpD,WAAY,CACVzxC,YAAa,IAEfgoD,YAAa,CACXjoD,QAAS,UACT+L,OAAQ,OACRnZ,WAAY,EACZrL,cAAe,GAEjBw/C,OAAQ,CACNj0C,gBAAiBlrB,EAAM4qB,QAAQ6zB,WAAW0H,OAE5Cm6B,QAAS,CACPn8C,OAAQ,EACR7L,MAAO,OACPpN,gBAAiB,GAAF,OAAKlrB,EAAM4qB,QAAQw7B,SAAnB,gBAEjBm6B,QAAS,CACP3kD,QAAS,GAEXxP,KAAM,CACJiM,WAAY,GAEdmoD,WAAY,CACVnoD,WAAY,EACZ9N,MAAO,GAAF,OAAKvqB,EAAM4qB,QAAQU,QAAQC,KAA3B,gBAEP0tD,OAAQ,CACN/tD,gBAAiB,GAAF,OAAKlrB,EAAM4qB,QAAQw7B,SAAnB,eACfzc,aAAc,aAAF,OAAe3pC,EAAM4qB,QAAQU,QAAQC,MACjD5L,cAAe,OAEjB8gE,eAAgB,CACdz1D,WAAY,GACZyzB,WAAYz+C,EAAM4qB,QAAQ6zB,WAAW0H,OA1CP,IA8QlC,SAhOA,WACE,IAyDuBz2C,EAAMpX,EAAIurB,EAAOU,EAzDlCrf,GAAW8d,EAAAA,EAAAA,MAEXnY,GAAUkY,EAAAA,EAAAA,MAEV7C,EAAUV,KAEVvf,GAAWmjB,EAAAA,EAAAA,MAEjB,MAA4C4N,EAAAA,EAAAA,UAAS,MAArD,GAAOuhD,EAAP,KAAuBwE,EAAvB,KAEA,MAA8B/lD,EAAAA,EAAAA,UAAS,IAAvC,GAAOooD,EAAP,KAAgBsH,EAAhB,KAEA,MAA4B1vD,EAAAA,EAAAA,WAAS,GAArC,GAAOwkD,EAAP,KAAemL,EAAf,KAEA,MAAwC3vD,EAAAA,EAAAA,WAAS,GAAjD,GAAO4vD,EAAP,KAAqBC,EAArB,KAEMv3D,GAAOjG,EAAAA,EAAAA,KAAY,SAAAC,GAAK,OAAIA,EAAMgG,IAAV,GAAN,KAElB9Y,GAAO6S,EAAAA,EAAAA,KACX,SAAAC,GAAK,OAAIA,EAAM7S,MAAMuU,MAAM1B,EAAMgG,KAAKC,cAAjC,GADiB,KAKlBjpB,GAAe+iB,EAAAA,EAAAA,KACnB,SAAAC,GAAK,OAAIxqB,OAAO8Q,OAAO0Z,EAAMoG,cAAc1E,OAAO,IAAM,CAAC,CAApD,GADyB,KAS1BsU,EAAc,WAClBy9C,EAAkB,KACnB,EAiBKr1B,EAAe,SAAAwG,GACnBy4B,EAAUz4B,EACX,EAEKh9C,EAAOwb,QAAQ6rD,GAsCrB,OAZA5uD,EAAAA,EAAAA,YAAU,WACR1jB,EAASoQ,MACT/E,KACI/G,OAAO6J,MAAM7J,OAAO6J,KAAK,MAAO,gBAAiB,YACtD,GAAE,CAACnO,KAEJ0jB,EAAAA,EAAAA,YAAU,WACRk9D,GAAgB,GAChBH,EAAW,IACXC,GAAU,EACX,GAAE,CAACz7E,IAGF,uBAAKmb,UAAWH,EAAQR,MACtB,gBAAC,GAAD,MACA,gBAAC0jC,EAAA,EAAD,CAAQ75C,SAAS,QAAQ8W,UAAWH,EAAQi/C,OAAQ50C,MAAM,WACxD,gBAAC8P,EAAA,EAAD,KACE,gBAAC7I,EAAA,EAAD,CAAQimD,MAAI,GACV,gBAACzlD,EAAA,EAAD,CACE3R,UAAWH,EAAQ4pD,WACnBv/C,MAAM,UACN,aAAW,OACXhG,QAAS,kBAAMm9B,GAAc8zB,EAApB,GAET,gBAACgC,EAAA,EAAD,OAEF,gBAAC5pD,GAAA,EAAD,CAAMvN,UAAWH,EAAQmgE,aACvB,gBAACtyD,GAAA,EAAD,CAAUK,QAAM,EAAC7J,QAAS5Z,GAAO,IAAKE,IACpC,gBAACqjB,GAAA,EAAD,CACE5C,QAAQ,SACRjL,UAAWH,EAAQqgE,QACnB7yB,uBAAwB,CACtBnjC,MAAO,UACPjG,QAAS,KACT7d,MAAO,CAAEglB,SAAU,eAM7B,gBAAC+F,EAAA,EAAD,CAAQ+lD,QAAM,GACZ,gBAAC3pD,GAAA,EAAD,CAAMvN,UAAWH,EAAQmgE,cAjEZ3wE,EAkEI,YAlEEpX,EAkEW,KAlEPurB,GAkEa,EAlENU,EAkEY5Z,GAAO,IAAKE,GAhE5D,gBAACkjB,GAAA,EAAD,CACEK,QAAM,EACN7J,QAASA,EACTlE,UAAW+4D,IAAY9gF,EAAK4nB,EAAQ+4D,OAAS,MAE7C,gBAAC/qD,GAAA,EAAD,CACE5C,QAAS5b,EACT2Q,UAAWH,EAAQqgE,QACnB7yB,uBACE7pC,EAAQ,CAAE0G,MAAO,UAAWjG,QAAS,MAAS,CAAEiG,MAAO,aAG1DjyB,GACC,gBAACmvC,GAAA,EAAD,CACEhc,SAAS,QACTpL,UAAW+4D,IAAY9gF,EAAK4nB,EAAQsgE,WAAatgE,EAAQkM,WAoE3D,wBAAM/L,UAAWH,EAAQya,OACzB,gBAAC,GAAD,CACErR,KAAMA,EACN3e,OAAQA,GACRO,KAAMA,EACNqnE,eAAgBA,EAChBj5C,YAAaA,EACbg5C,WAzHS,SAAAhgD,GACjBykD,EAAkBzkD,EAAMyI,cACzB,EAwHSs3C,aAlHW,SAACznE,EAAMmtE,GAC1Bz+C,IACAjuB,GAAOT,EAAMmtE,EACd,EAgHS/mE,OAAQ,SAAA+mE,GAAI,OAAI93E,EAAS+Q,GAAO+mE,GAApB,EACZ7yE,SAAUA,EACV2F,QAASA,KAGb,gBAAC2mB,EAAA,EAAD,CAAQ+lD,QAAM,GACXqJ,GAAgB,gBAAC,GAAD,CAASxH,QAASA,EAAS/4E,KAAK,iBAGrD,gBAACmxB,EAAA,EAAD,CAAQimD,MAAI,GACV,gBAAC,GAAD,CACEp3E,KAAK,WACLm1E,OAAQA,EACRprD,QAAS,kBAAMs3B,GAAa,EAAnB,KAGb,uBAAKrhC,UAAWH,EAAQugE,gBACtB,gBAAC,KAAD,KAmBE,gBAAC,KAAD,CAAOxS,OAAK,EAACrjE,KAAK,UAAUmrB,UAAWgqD,GAAee,MACtD,gBAAC,KAAD,CAAO7S,OAAK,EAACrjE,KAAK,SAASmrB,UAAWgqD,GAAegB,MACrD,gBAAC,KAAD,CAAO9S,OAAK,EAACrjE,KAAK,kBAAkBmrB,UAAWirD,KAG/C,gBAAC,KAAD,CACE/S,OAAK,EACLrjE,KAAK,WACLmrB,UAAWkrD,KAEb,gBAAC,KAAD,CAAOhT,OAAK,EAACrjE,KAAK,IAAImrB,UAAWrI,KACjC,gBAAC,KAAD,CACEgI,OAAQ,SAAA1J,GAAK,OACX,uBAAKvlB,MAAO,CAAEm1B,QAAS,MAAO0pB,UAAW,SACvC,gBAAC5Z,GAAD,MACM1f,EADN,CAEEnhB,QAASA,EACTjH,MAAO,CAAEV,OAAQ,QALV,MAYlBqB,OAAO82B,cAAgB,gBAAC,GAAD,CAAmB7qB,KAAMA,IACjD,gBAAC,GAAD,CACElQ,aAAcA,EACd8pB,QAAS,kBAAMnqB,EAAS+2E,GAAoB12E,GAAnC,EACT+0B,gBAAiB,CAAEC,SAAUgE,GAC7B/U,QAAS,kBAAMtkB,EAAS+2E,GAAoB12E,GAAnC,IAEX,gBAAC,GAAD,CAAQqK,OAAQA,GAAQE,QAASA,IAGtC,ECrUD,SAASq2E,GAAah8E,GACpBX,OAAO6J,KAAK,SAAU7J,OAAO48E,kBAAmB,CAC9CC,UAAWl8E,EAASolB,UAEvB,CAED,SAAS+2D,GAAT,GAAkC,IAAZvhE,EAAY,EAAZA,SACdjV,GAAUkY,EAAAA,EAAAA,MAShB,OAPI2D,QAAQniB,OAAO48E,qBACjBx9D,EAAAA,EAAAA,YAAU,WAER,OADAu9D,GAAar2E,EAAQ3F,UACd2F,EAAQy2E,OAAOJ,GACvB,GAAE,CAACr2E,IAGCiV,CACR,CAEDuhE,GAAW/K,UAAY,CACrBx2D,SAAUy2D,IAAAA,MAGZ,YCpBA,GACE,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAoBgL,iBAAkBC,EAAAA,IACpC,gBAAC,GAAD,KACE,gBAAC,KAAD,KACE,gBAAC,KAAD,CACE3xE,IAAI,WACJjF,KAAK,+HACLmrB,UAAW0rD,KAEb,gBAAC,KAAD,CAAO5xE,IAAI,YAAYjF,KAAK,IAAImrB,UAAW2rD,S,wtBCZrD,IAAMC,GAAa,qBACbC,GAAW,qBAGX5hF,IAAQ6hF,E,SAAAA,GAAY,CACxBj3D,QAAS,CACP8e,KAAAA,GAAAA,EACArpC,KAAM,QACNm9E,OAAQ,CACNj/B,KAAM,UACN3jB,MAAO,QAETtP,QAAS,CACPT,MAAO,UACPU,KAAM,UACNkkB,KAAM,WAGR7c,UAAW,CACTrH,KAAM,UACNV,MAAO,WAETywB,QAAS,CACPzwB,MAAO2zD,GAAAA,EAAAA,KACPjzD,KAAMizD,GAAAA,EAAAA,MAER7zD,QAAS,CACPY,KAAMu2D,GAAAA,EAAAA,KACNj3D,MAAOi3D,GAAAA,EAAAA,MAET17B,SAAU1c,GAAAA,EAAAA,KACV6V,WAAY,4BACZmG,eAAgB,4BAChBgB,WAAY,mBAEdx2B,WAAY,CACVC,SAlCa,yBAmCbF,WAAY2xD,GACZG,GAAI,CAAE9xD,WAAY0xD,IAClBK,GAAI,CAAE/xD,WAAY0xD,IAClBM,GAAI,CAAEhyD,WAAY0xD,IAClBO,GAAI,CAAEjyD,WAAY0xD,IAClBQ,GAAI,CAAElyD,WAAY0xD,IAClBS,GAAI,CAAEnyD,WAAY0xD,IAClBU,UAAW,CAAEpyD,WAAY0xD,IACzBp1C,UAAW,CAAEtc,WAAY0xD,IACzBW,MAAO,CAAEryD,WAAY2xD,IACrBW,MAAO,CAAEtyD,WAAY2xD,IACrBxzD,OAAQ,CAAE6B,WAAY0xD,IACtB5oC,QAAS,CAAE9oB,WAAY0xD,IACvBa,SAAU,CAAEvyD,WAAY0xD,KAE1B31D,MAAO,CACLy2D,OAAQ,CACNC,eAAe,GAEjBC,UAAW,CACTC,oBAAoB,IAGxB3M,OAAQ,CACND,QAAS,CACP1wB,UAAW,OAKjB,SAAe,SACVtlD,IADL,IAEE6iF,UAAW,CACTC,eAAgB,CACd,UAAW,CACTC,KAAM,CACJ5+C,OAAQ,QAEV3+B,KAAM,CACJ2+B,OAAQ,QAEVvrC,KAAM,CACJq3B,WAAYjwB,GAAMkwB,WAAWC,SAC7BjF,gBAAiBlrB,GAAM4qB,QAAQ8e,KAAK,KACpC9N,QAAS57B,GAAM4f,QAAQ,IACvB8+B,aAAc1+C,GAAM4f,QAAQ,IAE9BojE,IAAK,CACH/yD,WAAYjwB,GAAMkwB,WAAWC,UAE/B,cAAe,CACbF,WAAYjwB,GAAMkwB,WAAWC,SAC7B,wBACE,WACF,iBACE,qBACF1E,SAAU,qBAOhBw3D,cAAe,CACb5kC,QAAS,CACP1yB,SAAU,IAGdu3D,UAAW,CACTC,gBAAiB,CACfj4D,gBAAiBlrB,GAAM4qB,QAAQgI,UAAUrH,OAG7Co3D,UAAW,CACTx0E,MAAO,CACLi1E,cAAe,QAEjBC,UAAW,CACTj4D,UAAW,OACX,WAAY,CACVA,UAAW,UAIjBk4D,QAAS,CACP5jE,KAAM,CACJ2Y,WAAYr4B,GAAM4f,QAAQ,IAE5B2jE,UAAW,CACTp/C,OAAQ,EACR4nC,oBAAqB,EACrByX,qBAAsB,EACtBt4D,gBAAiBlrB,GAAM4qB,QAAQktB,OAAOihC,QAG1C0J,OAAQ,CACN/iE,KAAM,IACJ0jE,cAAe,OACf5oD,OAAQ,SACR7O,SAAU,EACViQ,QAAS,GACR57B,GAAM+pE,YAAYC,GAAG,MAAQ,CAC5BpuC,QAAS,EACTjQ,SAAU,KAIhB83D,cAAe,CACb/jE,KAAM,CACJkc,QAAS57B,GAAM4f,QAAQ,KAG3B8jE,WAAY,CACV1qD,QAAS,CACPlY,UAAW,SACX2K,SAAU,QAGdk4D,WAAY,CACVjkE,KAAM,CACJwL,gBAAiB,YAGrB04D,gBAAiB,CACft4D,QAAS,IAIXu4D,gBAAiB,CACfnkE,KAAM,CACJ6K,MAAO,UACPqB,YAAa,EACb,QAAS,CACPH,SAAU,MAIhBq4D,UAAW,CACTpkE,KAAM,CACJ4Y,MAAO,GACP6L,OAAQ,Q,qbCtLhB,kBAAe4/C,GAAK,OAAI,SAAAC,GAAI,OAAI,SAAA91E,GAE9B,GAAqB,mBAAVA,EACTgsC,QAAQ+pC,MAAM,sBAAuB/1E,OAChC,CACL,IAAQ7N,EAAqB6N,EAArB7N,KAASiF,EAAjB,GAA6B4I,EAA7B,IACAgsC,QAAQ+pC,MAAM,iBAAkB5jF,EAAMiF,EACvC,CAED,OAAO0+E,EAAK91E,EAEb,CAX2B,CAA5B,E,8tFC6CA,SAASg2E,GAAS5gF,EAAM+4B,GACtB,MAAO,GAAP,OAAU/4B,EAAV,YAAkB+4B,EACnB,CA4ED,UAAe8nD,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAzHF,WAAmC,IAApB1B,EAAoB,uDAAZ,GAAIpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,IAAK,mBACH,OAAO6N,EAAO5I,SAAW,GAE3B,KAAKrK,GACH,MAAO,GAET,QACE,OAAOqoB,EAEZ,EA+GCsF,QA7GF,WAAqC,IAApBtF,EAAoB,uDAAZ,GAAIpV,EAAQ,uCACnC,OAAQA,EAAO7N,MACb,IAAK,mBACH,MAAO,CAAEwoB,iBAAiB,GAC5B,IAAK,kBACH,OAAO,SAAM3a,EAAO5I,SAAW,CAAC,GAAhC,IAAoCujB,iBAAiB,IAEvD,IAAK,kBACL,IAAK,iBACH,MAAO,CAAEA,iBAAiB,GAE5B,QACE,OAAO,SAAKvF,GAAZ,IAAmBuF,iBAAiB,IAEzC,EAgGCxB,UA9FF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,IAAK,mBACH,OAAO,EAET,IAAK,oBACH,OAAO,EAET,QACE,OAAOijB,EAEZ,EAoFCmF,cA9EF,WAA2C,4BAApBnF,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACnCxD,EAAO,oBACXwD,EAAO5I,eADI,iBACX,EAAgB1B,aADL,iBACX,EAAuBgmE,YADZ,aACX,EAA6BxwB,MAAM,eAAe,UADvC,kBAEXlrC,EAAO5I,eAFI,iBAEX,EAAgB1B,aAFL,aAEX,EAAuB8G,QAEzB,YAA0BwD,EAAO5I,eAAjC,QAA4C,CAAC,EAArChC,EAAR,EAAQA,KAAM+4B,EAAd,EAAcA,QAEd,IAAK/4B,IAAS+4B,EAAS,OAAO/Y,EAE9B,IAAMzT,EAAMq0E,GAAS5gF,EAAM+4B,GAE3B,OAAQnuB,EAAO7N,MACb,IAAK,oBAKH,OAJAijB,EAAMzT,GAAN,mBACMyT,EAAMzT,UADZ,QACoB,CAAC,GADrB,IAEEm4C,WAAW1kC,EAAMzT,KAAQyT,EAAMzT,GAAKm4C,YAE/B1kC,EAET,IAAK,qBACH,iBAAIA,EAAMzT,UAAV,OAAI,EAAY6Y,YAGhBpF,EAAMzT,GAAN,mBACMyT,EAAMzT,UADZ,QACoB,CAAC,GADrB,IAEE03C,YAAY,EACZ78C,QAAS,YAAF,OAAcwD,EAAO5I,QAAQhC,KAA7B,YAAqC4K,EAAO5I,QAAQ+2B,QAApD,mBACP+nD,cAAc,EACd17D,WAAW,EACXk/B,aAAc,QARPtkC,EAYX,IAAK,oBAQH,OAPAA,EAAMzT,GAAO,CACXnF,QAAS,YAAF,OAAcwD,EAAO5I,QAAQhC,KAA7B,YAAqC4K,EAAO5I,QAAQ+2B,QAApD,eACP3T,WAAW,EACXk/B,aAAc,KACdL,YAAY,EACZ68B,cAAc,GAET9gE,EAET,IAAK,yBAQH,OAPAA,EAAMzT,GAAO,CACXnF,QAASA,EACTk9C,aAAc15C,EAAO5I,QACrBiiD,YAAY,EACZ7+B,WAAW,EACX07D,cAAc,GAET9gE,EAET,IAAK,kBAMH,OALAA,EAAMzT,GAAN,mBACMyT,EAAMzT,UADZ,QACoB,CAAC,GADrB,IAEEu0E,cAAc,EACdC,SAAU,OAEL/gE,EAET,IAAK,iBAMH,OALAA,EAAMzT,GAAN,mBACMyT,EAAMzT,UADZ,QACoB,CAAC,GADrB,IAEEu0E,cAAc,EACdC,SAAUn2E,EAAO5I,UAEZge,EAET,QACE,OAAOA,EAEZ,I,6rBC9GD,IAAMinD,GAAe,CACnB9iE,MAAO,KACPwlC,WAAY,KACZD,gBAAiB,KACjB+kC,oBAAoB,EACpBxoD,cAAe,KACflC,WAAW,EACX64D,YAAa,MAGA,SAASoE,KAAmC,IAA9BhhE,EAA8B,uDAAtBinD,GAAcr8D,EAAQ,uCACzD,OAAQA,EAAO7N,MACb,KAAKrF,GACH,OAAO,SACFsoB,GADL,IAEE0pB,iBAAiB,EACjBC,WAAY/+B,EAAOzG,MAAMqJ,OACzBrJ,MAAOyG,EAAOzG,MAAM6I,IACpB4vE,YAAa,OAGjB,KAAKjlF,GACH,OAAO,SAAKsvE,IAAZ,IAA0Bv9B,iBAAiB,IAE7C,KAAKjyC,GACH,IAAQmI,EAAWgL,EAAOtK,MAAMX,SAAxBC,OAER,OACS,SAAKogB,GAAZ,GADa,MAAXpgB,EACF,CAAmBg9E,YAAa,iCAEnB,MAAXh9E,EACF,CAAmBg9E,YAAa,wCAElC,CAAmBA,YAAa,+BAElC,KAAK5jF,GACH,OAAO,SAAKgnB,GAAZ,IAAmB48D,YAAa,KAAM1P,gBAAiB,OAEzD,KAAKn0E,GACH,OAAO,SACFinB,GADL,IAEEktD,gBACE,mEAGN,IAAK,iBACH,OAAO,SAAKltD,GAAZ,IAAmB48D,YAAahyE,EAAOxD,UAEzC,KAAKpP,GACH,OAAO,SAAKgoB,GAAZ,IAAmB+D,WAAW,IAEhC,KAAKjsB,GACH,OAAO,SACFkoB,GADL,IAEE+D,WAAW,EACX2lB,iBAAiB,EACjBC,WAAY/+B,EAAOsC,KAAKy8B,WACxB1jB,cAAerb,EAAOsC,KAAKlY,GAC3By5E,mBAAoB7jE,EAAOsC,KAAKuhE,qBAGpC,IAAK,iBACH,OAAO,SAAKzuD,GAAZ,IAAmByuD,oBAAoB,IAEzC,KAAK12E,GACH,OAAO,SACFioB,GADL,IAEE+D,WAAW,EACX2lB,iBAAiB,EACjBzjB,cAAe,KACfwoD,oBAAoB,IAGxB,KAAK72E,GACH,OAAO,SAAKooB,GAAZ,IAAmB0pB,iBAAiB,EAAMvlC,MAAOyG,EAAO5I,QAAQmC,QAElE,KAAKtM,GACH,OAAO,SAAKmoB,GAAZ,IAAmB0pB,iBAAiB,EAAOvlC,MAAO,OAEpD,QACE,OAAO6b,EAEZ,CCjDD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAtCF,WAAiC,IAAlB1B,EAAkB,uDAAZ,CAAC,EAAGpV,EAAQ,uCAC/B,OAAQA,EAAO7N,MAEb,KAAKlH,EACH,OAAO+U,EAAO5I,QAAQk9B,SAASuN,aAAe,CAAC,EAEjD,KAAK32C,EACH,IAAI40C,EAAe9/B,EAAO8/B,aAEtBu2C,EAAW,KAAOjhE,GAAO,YAC3B,OAD0C,EAALhrB,KACvB01C,CACf,IAED,OAAOu2C,EAET,KAAKtpF,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EAiBQ4G,QAfT,WAAsC,IAArB5G,EAAqB,wDAARpV,EAAQ,uCACpC,OAAQA,EAAO7N,MACb,KAAKnH,EACH,OAAO,EAET,KAAKC,EACH,OAAO,EAET,QACE,OAAOmqB,EAGZ,ICRD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MA5BF,WAAmC,IAApB1B,EAAoB,uDAAZ,GAAIpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,KAAK/G,EACH,OAAK4U,EAAO5I,QAGL4I,EAAO5I,QAFLge,EAIX,KAAKroB,GACH,MAAO,GACT,QACE,OAAOqoB,EAEZ,EAgBC+D,UAdF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAKhH,EACH,OAAO,EACT,KAAKE,EACL,KAAKD,EACH,OAAO,EACT,QACE,OAAOgqB,EAEZ,I,ipDCbD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAjBF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MAEb,KAAKlB,GACH,OAAO,SAAKmkB,GAAZ,SAAoBpV,EAAOqwB,YAAcrwB,EAAOsvB,UAElD,KAAKp+B,GACH,OAAOtG,OAAOuP,YACZvP,OAAOiL,QAAQuf,GAAOhb,QAAO,0BAAEtE,EAAF,iBAAaA,IAAMkK,EAAOqwB,WAA1B,KAGjC,QACE,OAAOjb,EAEZ,ICoDD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAvDF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,KAAK3G,EACL,KAAKG,GACH,OAAOqU,EAAO5I,QAAQk9B,SAASxZ,aAAe,CAAC,EAEjD,KAAKpvB,GACH,OAAO,KAAO0pB,GAAO,qBAAGhrB,KAAgB4V,EAAO+2C,YAA1B,IAEvB,KAAKhmD,GACL,KAAKhE,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EAwCC1f,MAtCF,WAAsC,IAAvB0f,EAAuB,wDAARpV,EAAQ,uCACpC,OAAQA,EAAO7N,MACb,KAAK7G,EACH,OAAO0U,EAAO5I,QAEhB,KAAK3L,EACH,OAAOuU,EAAOtK,MAEhB,KAAK/J,GACL,KAAKH,EACL,KAAKE,GACL,KAAKqF,GACL,KAAKhE,GACH,OAAO,EAET,QACE,OAAOqoB,EAEZ,EAqBC+D,UAnBF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAK5G,EACH,OAAO,EACT,KAAKK,GAEL,KAAKD,GACL,KAAKH,EACL,KAAKuB,GACL,KAAKgE,GACL,KAAKD,GACH,OAAO,EACT,QACE,OAAOskB,EAEZ,I,wtBCsCD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MA1FF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,KAAKrG,GACL,KAAKK,GACH,OAAO,KAAM,CAAC,EAAGipB,EAAOpV,EAAO5I,QAAQk9B,SAAS/c,MAElD,KAAKtrB,GACH,IAAM2T,EAAUI,EAAVJ,MAEFy2E,EAAW,KAAOjhE,GAAO,SAAU,GACrC,OAD6C,EAANhrB,KACzBwV,CACf,IAED,OAAOy2E,EAET,KAAKtqF,GACH,IAAQ3B,EAAe4V,EAAf5V,GAAImqC,EAAWv0B,EAAXu0B,OAEZ,OAAO,KAAM,CAAC,EAAGnf,EAAV,MAAoBhrB,EAAKmqC,IAElC,KAAK3mC,GACH,OAAO,SAAKwnB,GAAUpV,EAAO5I,QAAQk9B,SAAS/c,MAEhD,KAAKjqB,GACH,OAAO,SAAK8nB,GAAUpV,EAAOs0B,SAAS/c,MAExC,IAAK,cAGL,IAAK,sBACH,OAAO,SAAKnC,GAAUpV,EAAO5I,QAAQk9B,SAAS/c,OAAUnC,EAE1D,KAAKrkB,GACL,KAAKhE,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EAoDC+D,UAlDF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAKrG,GACL,KAAKE,GACH,OAAO,EACT,KAAKH,GACH,OAAO,EAET,QACE,OAAOupB,EAEZ,EAwCCkhE,eAtCF,WAA+C,IAAvBlhE,EAAuB,wDAARpV,EAAQ,uCAC7C,OAAQA,EAAO7N,MACb,KAAKhG,GACL,KAAKH,GACH,OAAO,EACT,KAAKE,GACH,OAAO,EAET,QACE,OAAOkpB,EAEZ,EA4BC1f,MA1BF,WAAsC,IAAvB0f,EAAuB,wDAARpV,EAAQ,uCACpC,OAAQA,EAAO7N,MACb,KAAKnG,GACH,OAAOgU,EAAO5I,QAEhB,KAAKrL,GACL,KAAKE,GACL,KAAKE,GACL,KAAKN,GACL,KAAKC,GACL,KAAKiB,GACL,KAAKgE,GACL,KAAK3E,GACL,KAAKwB,GACL,KAAKN,GACH,OAAO,EAET,QACE,OAAO8nB,EAEZ,ICpBD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAvEF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MAGb,KAAKhC,GAGL,KAAKD,GAGL,KAAKE,GACH,OAAO4P,EAAO5I,QAAQk9B,SAASqsB,wBAA0B,CAAC,EAE5D,KAAKtwD,GAGL,KAAKtD,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EAkDC65C,MAhDF,WAAmC,IAApB75C,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,KAAK5B,GACH,OAAOyP,EAAOivD,MAEhB,KAAKz+D,GAGL,KAAKzD,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EAmCCR,SAjCF,WAAsC,IAApBQ,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACpC,OAAQA,EAAO7N,MACb,KAAK1B,GACH,OAAOuP,EAAO4U,SAEhB,KAAKlkB,GAGL,KAAK3D,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EAoBCg6C,eAlBF,WAA+C,IAAvBh6C,EAAuB,wDAARpV,EAAQ,uCAC7C,OAAQA,EAAO7N,MACb,KAAK7B,GACH,OAAO,EAET,KAAKC,GACL,KAAKC,GACH,OAAO,EAET,QACE,OAAO4kB,EAEZ,IC3DD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAAEv/D,gBApBjC,WAA+C,IAAtBtB,EAAsB,uDAAd,KAAMpV,EAAQ,uCAC7C,OAAQA,EAAO7N,OACRtB,GACImP,EAAO2B,IAEPyT,CAEZ,EAaiDuG,cAXlD,WAA6C,IAAtBvG,EAAsB,uDAAd,KAAMpV,EAAQ,uCAC3C,OAAQA,EAAO7N,MACb,KAAKrB,GACH,OAAOkP,EAAOpN,QAAQxI,GACxB,KAAK2G,GACH,OAAO,KACT,QACE,OAAOqkB,EAEZ,I,6rBCND,UAAe6gE,EAAAA,GAAAA,IAAgB,CAAEn/D,MAXjC,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,KAAKhB,GACH,OAAO,SAAKikB,GAAZ,SAAoBpV,EAAO5N,aAAahI,GAAK4V,EAAO5N,eACtD,KAAKhB,GACH,OAAO,KAAOgkB,GAAO,qBAAGhrB,KAAgB4V,EAAO5V,EAA1B,IACvB,QACE,OAAOgrB,EAEZ,I,6rBCiBD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MA1BF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,GAAQA,EAAO7N,OACRvB,GAAL,CACE,IAAIimB,EAAQ7W,EAAO6W,MAAM0hB,QAAO,SAAEC,EAAK1c,GACrC,OAAO,SAAK0c,GAAZ,SAAkB1c,EAAE1xB,GAAK0xB,GAC1B,GAAE,CAAC,GACJ,OAAO,SAAK1G,GAAUyB,EAAtB,CAGA,OAAOzB,CAEZ,EAgBCmhE,gBAdF,WAAgD,IAAvBnhE,EAAuB,wDAARpV,EAAQ,uCAC9C,OAAQA,EAAO7N,MACb,IAAK,mBACH,OAAO,EACT,IAAK,kBACL,IAAK,mBACH,OAAO,EACT,QACE,OAAOijB,EAEZ,ICRD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAhBF,WAAiC,IAAlB1B,EAAkB,uDAAZ,CAAC,EAAGpV,EAAQ,uCAC/B,OAAQA,EAAO7N,MACb,KAAKxB,GACH,OAAKqP,EAAO5I,QAAQk9B,SAASmuC,SAGlBziE,EAAO5I,QAAQk9B,SAASmuC,SAF1BrtD,EAIX,KAAKroB,GACH,MAAO,CAAC,EACV,QACE,OAAOqoB,EAEZ,ICwBD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAtCF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,KAAKnC,GACH,OAAOgQ,EAAO5I,QAAQk9B,SAASs0B,cAAgB,CAAC,EAElD,KAAK77D,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EA4BC1f,MA1BF,WAAsC,IAAvB0f,EAAuB,wDAARpV,EAAQ,uCACpC,OAAQA,EAAO7N,OACRlC,GACI+P,EAGAoV,CAEZ,EAmBC+D,UAjBF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAKpC,GACH,OAAO,EAET,KAAKC,GACL,KAAKC,GACH,OAAO,EAET,QACE,OAAOmlB,EAEZ,I,6rBCmID,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7BvgF,MAfF,WAA+C,IAAhC0f,EAAgC,iGAAfjjB,EAAe,EAAfA,KAAMuD,EAAS,EAATA,MACpC,OAAQvD,GACN,KAAKzD,GACL,KAAKK,GACH,OAAO,EAET,KAAKC,GACH,OAAO0G,EAET,QACE,OAAO0f,EAEZ,EAICg3C,WA7BF,WAA2C,IAAvBh3C,EAAuB,wDAARpV,EAAQ,uCACzC,OAAQA,EAAO7N,MACb,KAAK5D,GACH,OAAO,EAET,KAAKC,GACH,OAAO,EAET,QACE,OAAO4mB,EAEZ,EAmBC+D,UA3DF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAKzD,GACH,OAAO,EAET,KAAKC,GACL,KAAKF,GACL,KAAKD,GACH,OAAO,EAET,QACE,OAAO4mB,EAEZ,EA+CC0B,MAtJF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,KAAKxD,GACL,KAAKI,GACL,KAAKE,GACL,KAAKC,GACL,KAAKC,GACL,KAAKN,GACH,OAAO,KAAM,CAAC,EAAGumB,EAAOpV,EAAO5I,QAAQk9B,SAASrd,UAElD,KAAKzoB,GACH,OAAO,SAAK4mB,GAAZ,SAAoBpV,EAAOpN,QAAQxI,GAAK4V,EAAOpN,UAEjD,KAAK7F,GACH,MAAO,CAAC,EAEV,KAAKsD,GAMH,OALA+kB,EACEpV,EAAO5I,QAAQk9B,SAASqsB,uBACtB3gD,EAAO5I,QAAQ88B,QACfld,WACFo+B,wBAA0B,KACrBhgC,EAET,QACE,OAAOA,EAEZ,EA4HCqxB,OA9CF,WAAuC,IAAvBrxB,EAAuB,wDAARpV,EAAQ,uCACrC,OAAQA,EAAO7N,MACb,KAAKzD,GACL,KAAK3B,GACH,OAAO,EAET,KAAK4B,GACH,OAAO,EAET,QACE,OAAOymB,EAEZ,EAmCC+rD,eA5EF,WAA+C,IAAvB/rD,EAAuB,wDAARpV,EAAQ,uCAC7C,OAAQA,EAAO7N,MACb,KAAK/C,GACH,OAAO,EAET,KAAKC,GACL,KAAKC,GACH,OAAO,EAET,QACE,OAAO8lB,EAEZ,EAiECgrD,SA5HF,WAAsC,IAApBhrD,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACpC,OAAQA,EAAO7N,MACb,KAAK1C,GACH,OAAO,SAAK2lB,GAAZ,SAAoBpV,EAAO5I,QAAQ4f,UAAYhX,EAAO5I,QAAQkwD,QAEhE,KAAK93D,GACH,OAAO,SACF4lB,GACApV,EAAO5I,QAAQo/E,gBAAgBj+C,QAAO,SAACC,EAAK5Y,GAC7C,OAAO,SAAK4Y,GAAZ,SAAkB5Y,EAAE5I,UAAY4I,EAAE0nC,OACnC,GAAE,CAAC,IAER,QACE,OAAOlyC,EAEZ,EA8GC8B,YA5GF,WAAyC,IAApB9B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACvC,OAAQA,EAAO7N,MACb,KAAK9C,GACH,OAAO,SACF+lB,GACApV,EAAO5I,QAAQmhC,QAAO,SAACC,EAAK5Y,GAC7B,OAAO,SAAK4Y,GAAZ,SAAkB5Y,EAAE5I,UAAY4I,GACjC,GAAE,CAAC,IAGR,KAAK7yB,GACH,MAAO,CAAC,EACV,QACE,OAAOqoB,EAEZ,EA8FCy3C,aA5FF,WAA0C,IAApBz3C,EAAoB,uDAAZ,GAAIpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAK5C,GACH,OAAOyQ,EAAO5I,QAEhB,KAAKrG,GACL,KAAKhE,GACH,MAAO,GACT,QACE,OAAOqoB,EAEZ,I,6rBC9BD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MA/DF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MAEb,KAAKrD,GACH,MAAO,CAAC,EAEV,KAAKY,GACH,OAAO,MAAKsQ,EAAOqC,KAAKiyB,SAAS0L,cAEnC,KAAKpwC,GACH,OAAO,SAAKwlB,GAAZ,SAAoBpV,EAAOkgC,YAAY91C,GAAK4V,EAAOkgC,cAErD,KAAKvwC,GACH,IAAIywC,EAAgBpgC,EAAOogC,cACvBi2C,EAAW,KAAOjhE,GAAO,SAAU,GACrC,OAD6C,EAANhrB,KACzBg2C,CACf,IAED,OAAOi2C,EAET,KAAKtpF,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EAsCCqhE,uBApCF,WAAuD,IAAvBrhE,EAAuB,wDAARpV,EAAQ,uCACrD,OAAQA,EAAO7N,OACRvC,IAIIwlB,CAEZ,EA6BC+sB,sBA3BF,WAAmD,IAApB/sB,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjD,OAAQA,EAAO7N,MACb,KAAKvC,GACH,MAAO,CAAEw9C,SAAS,EAAM13C,MAAO,MAEjC,KAAK5F,GACH,MAAO,CACLs9C,SAAS,EACT13C,MACE,oIAGN,KAAK7F,GACH,MAAO,CACLu9C,SAAS,EACT13C,MACE,0FAGN,QACE,OAAO0f,EAEZ,I,+uBCwCD,IAAMshE,GAAoB,CACxB3wC,KAAM,EACNpB,MAAO,KACPD,QAAS,GACTE,WAAY,MAYd,UAAeqxC,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAxGF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCAC3B22E,EAAc/rF,OAAOD,KAAKyqB,GAEhC,OAAQpV,EAAO7N,MACb,KAAKvE,GACH,OAAO,SAAKwnB,GAAUpV,EAAO5I,QAAQk9B,SAASjc,UAEhD,KAAK/qB,GACH,OAAO0S,EAAOs0B,SAASjc,UAAY,CAAC,EAEtC,KAAKvqB,GACH,OAAO,KAAU,CAAC,EAAGsnB,EAAOpV,EAAOs0B,SAASjc,UAAU,SAACyB,EAAGC,GAAJ,OAC9C,OAANA,EAAaD,OAAIuK,CADmC,IAIxD,KAAK92B,GACH,OAAOyS,EAAOs0B,SAASjc,UAAY,CAAC,EAEtC,KAAKxqB,GACH,OAAO,SACFunB,GACA,KAAKpV,EAAO5I,QAAQk9B,SAASjc,SAAUs+D,IAG9C,KAAKtpF,GACH,OAAO,SAAK+nB,GAAZ,SAAoBpV,EAAOuQ,QAAQnmB,GAAK4V,EAAOuQ,UAEjD,KAAKxjB,GACL,KAAKgE,GACL,IAAK,iBAEH,MAAO,CAAC,EAKV,QACE,OAAOqkB,EAEZ,EAkEC+D,UAhEF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAK3E,GACL,KAAKE,GACH,OAAO,EAET,KAAKE,GACL,KAAKN,GACL,KAAKC,GACL,KAAKI,GACL,KAAKF,GACH,OAAO,EAET,QACE,OAAO2nB,EAEZ,EAiDCiE,WAZF,WAAuD,IAAnCjE,EAAmC,uDAA3BshE,GAAmB12E,EAAQ,uCACrD,OAAQA,EAAO7N,OACR7E,GACI0S,EAAOqZ,WAEPjE,CAEZ,EAMC1f,MAhDF,WAAsC,IAAvB0f,EAAuB,wDAARpV,EAAQ,uCACpC,OAAQA,EAAO7N,MACb,KAAK1E,GACL,KAAKE,GACH,OAAOqS,EAAOtK,MAEhB,KAAKrI,GACL,KAAKG,GACL,KAAKE,GACL,KAAKJ,GACL,KAAKyB,GACL,KAAKhC,GACL,KAAKa,GACL,KAAKC,GACL,KAAKiB,GACL,KAAK3C,GACL,KAAKoB,GACL,KAAKO,GACH,OAAO,EAET,QACE,OAAOsnB,EAEZ,I,6rBCpBD,IAAMshE,GAAoB,CACxB3wC,KAAM,EACNpB,MAAO,KACPD,QAAS,GACTE,WAAY,MA0Cd,UAAeqxC,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MA5GF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCAC3B22E,EAAc/rF,OAAOD,KAAKyqB,GAEhC,OAAQpV,EAAO7N,MACb,KAAK7E,GACH,OAAO,SAAK8nB,GAAUpV,EAAOs0B,SAAS/b,MAExC,KAAK3qB,GACH,OAAOwnB,EAET,KAAKtnB,GACH,OAAO,KAAU,CAAC,EAAGsnB,EAAOpV,EAAOs0B,SAASz/B,kBAAkB,SAACilB,EAAGC,GAAJ,OACtD,OAANA,EAAaD,OAAIuK,CAD2C,IAIhE,KAAK/yB,GACH,OAAO0O,EAAO5I,QAAQk9B,SAAS/b,MAAQ,GAEzC,KAAKhnB,GACL,KAAKG,GACH,OAAOsO,EAAO5I,QAAQk9B,SAAS/b,KAEjC,KAAK5mB,GACH,OAAO,SAAKyjB,GAAU,KAAKpV,EAAO5I,QAAQk9B,SAAS/b,KAAMo+D,IAE3D,KAAK/kF,GACH,OAAO,SAAKwjB,GAAUpV,EAAO5I,QAAQk9B,SAAS/b,MAIhD,KAAK9mB,GACH,OAAO,SAAK2jB,GAAU,KAAKpV,EAAO5I,QAAQk9B,SAAS/b,KAAMo+D,IAE3D,KAAK7nF,GAGL,KAAKiC,GACL,KAAKhE,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EAkEC+D,UAhEF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAKd,GACH,OAAO,EACT,KAAKG,GACL,KAAKD,GACL,KAAKD,GACH,OAAO,EACT,QACE,OAAO8jB,EAEZ,EAsDCiE,WA1CF,WAAuD,IAAnCjE,EAAmC,uDAA3BshE,GAAmB12E,EAAQ,uCACrD,OAAQA,EAAO7N,OACRb,IACC0O,EAAO5I,QAAQiiB,WACVrZ,EAAO5I,QAAQiiB,WAKjBjE,CAEZ,EAgCC1f,MA9BF,WAA+C,IAAhC0f,EAAgC,iGAAfjjB,EAAe,EAAfA,KAAMuD,EAAS,EAATA,MACpC,OAAQvD,GACN,KAAKpE,GACL,KAAKwD,GACL,KAAKD,GACL,KAAKD,GACL,KAAKtE,GACL,KAAK+B,GACL,KAAKlB,GACL,KAAKN,GACL,KAAKsE,GACL,KAAK9D,GACL,KAAK6D,GACL,KAAKD,GACL,KAAKD,GACH,OAAO,EAET,KAAKzD,GACL,KAAKwD,GACH,OAAOkE,EAET,QACE,OAAO0f,EAEZ,I,6rBCtCD,UAAe6gE,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAxEF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,KAAKvF,GACH,OAAOoT,EAAO5I,QAAQk9B,SAASxb,UAAY,CAAC,EAE9C,KAAKpsB,GACH,IAAQosB,EAAa9Y,EAAO5I,QAAQk9B,SAA5Bxb,SACR,OAAO,KAAM,CAAC,EAAG1D,EAAO0D,GAE1B,KAAKzsB,GACH,OAAO,KAAM,CAAC,EAAG+oB,EAAOpV,EAAO3M,SAEjC,KAAK7G,GACH,IAAIqsB,EAAY7Y,EAAO6Y,UAEnBw9D,EAAW,KAAOjhE,GAAO,SAAU,GACrC,OAD6C,EAANhrB,KACzByuB,CACf,IAED,OAAOw9D,EAET,KAAK/pF,GACH,IAAQlC,EAAe4V,EAAf5V,GAAImqC,EAAWv0B,EAAXu0B,OAEZ,OAAO,KAAM,CAAC,EAAGnf,EAAV,MAAoBhrB,EAAKmqC,IAElC,KAAK3mC,GACH,OAAOoS,EAAO5I,QAAQk9B,SAASxb,UAAY1D,EAE7C,IAAK,cAGL,IAAK,sBACH,OAAO,SAAKA,GAAUpV,EAAO5I,QAAQk9B,SAASxb,WAAc1D,EAE9D,KAAKrkB,GACL,KAAKhE,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EA+BC1f,MA7BF,WAAsC,IAAvB0f,EAAuB,wDAARpV,EAAQ,uCACpC,OAAQA,EAAO7N,MACb,KAAK5F,GACH,OAAOyT,EAAO5I,SAAW4I,EAAOtK,MAElC,KAAK/I,GACL,KAAKF,GACH,OAAO,EAET,QACE,OAAO2oB,EAEZ,EAkBC+D,UAhBF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAKxF,GACH,OAAO,EAET,KAAKI,GACL,KAAKH,GACL,KAAKkE,GACH,OAAO,EACT,QACE,OAAOskB,EAEZ,I,6rBCzCD,IAAMinD,GAAe,CACnBjC,SAAS,GA4BX,UAAe6b,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAjEF,WAAmC,IAApB1B,EAAoB,uDAAZ,CAAC,EAAGpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,KAAKjE,GACH,OAAO,SAAKknB,GAAZ,SAAoBpV,EAAOsC,KAAKlY,GAAK4V,EAAOsC,OAE9C,KAAKlU,GAGL,IAAK,iBACH,OAAO,SAAKgnB,GAAZ,SAAoBpV,EAAO5I,QAAQhN,GAAK4V,EAAO5I,UAEjD,KAAKrK,GACH,MAAO,CAAC,EAEV,QACE,OAAOqoB,EAEZ,EAiDC+D,UA/CF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,KAAKlE,GACH,OAAO,EAET,KAAKG,GAGL,KAAKD,GACH,OAAO,EAET,QACE,OAAOinB,EAEZ,EAkCCuQ,aAfF,WAA6C,IAAvBvQ,EAAuB,wDAARpV,EAAQ,uCAC3C,OAAQA,EAAO7N,MACb,KAAK9D,GACH,OAAO,EACT,KAAKC,GACH,OAAO,EAET,QACE,OAAO8mB,EAEZ,EAMCwhE,aA7BF,WAAoD,IAA9BxhE,EAA8B,uDAAtBinD,GAAcr8D,EAAQ,uCAClD,OAAQA,EAAO7N,MACb,IAAK,4BACH,OAAO,SAAKijB,GAAZ,IAAmBglD,SAAS,IAE9B,IAAK,4BACH,OAAOiC,GAET,QACE,OAAOjnD,EAEZ,I,+7CC9CD,SAASyhE,GAAuBlsF,EAAMqvD,GACpC,OAAOrvD,EAAK4tC,QAAO,SAACC,EAAK72B,GACvB,OAAO,SAAK62B,GAAZ,SAAkB72B,EAAMq4C,GACzB,GAAE,CAAC,EACL,CAED,IAAMqiB,GAAe,CAAElB,WAAY,CAAC,EAAGD,cAAe,KAAMI,QAAS,CAAC,GAkFtE,UAAe2a,EAAAA,GAAAA,IAAgB,CAC7Bn/D,MAtGF,WAAmC,IAApB1B,EAAoB,uDAAZ,GAAIpV,EAAQ,uCACjC,OAAQA,EAAO7N,MACb,IAAK,mBACL,IAAK,uBACH,MAAO,GAET,IAAK,0BACH,MAAO,GAAP,UAAWijB,GAAX,GAAqBpV,EAAO5I,QAAQ8lE,UACtC,QACE,OAAO9nD,EAEZ,EA4FCoE,SAxCF,WAAwC,IAAtBpE,EAAsB,uDAAd,KAAMpV,EAAQ,uCACtC,OAAQA,EAAO7N,MACb,IAAK,mBACH,OAAO6N,EAAO5I,QAAQoiB,SACxB,IAAK,uBACH,OAAO,KACT,QACE,OAAOpE,EAEZ,EAgCC+D,UA9BF,WAA0C,IAAvB/D,EAAuB,wDAARpV,EAAQ,uCACxC,OAAQA,EAAO7N,MACb,IAAK,mBACH,OAAO,EAET,IAAK,iBACL,IAAK,0BACL,IAAK,uBACH,OAAO,EAET,QACE,OAAOijB,EAEZ,EAkBCuE,SApFF,WAGE,IAFAvE,EAEA,uDAFQinD,GACRr8D,EACA,uCACA,OAAQA,EAAO7N,MACb,IAAK,mBACL,IAAK,uBACH,OAAOkqE,GAET,IAAK,iBACH,IAAM1xE,EAAOqV,EAAO5I,QAAQgyB,MAC5B,OAAO,SACFhU,GADL,IAEE8lD,cAAe,MAAK9lD,EAAM8lD,eAC1BC,WAAY,MAAK0b,GAAuBlsF,GAAM,MAGlD,IAAK,kBACH,IAAMwH,EAAO6N,EAAO5I,QAAQjF,KACtBmpE,EAAUt7D,EAAO5I,QAAQkkE,QAC/B,OAAO,SACFlmD,GADL,IAEE+lD,WAAY,SAAK/lD,EAAM+lD,YAAb,MAA+BhpE,GAAO,IAChDmpE,QAAS,SAAKlmD,EAAMkmD,SAAb,MAA4BnpE,EAAOmpE,MAG9C,IAAK,0BACH,IAAMwb,EAAY92E,EAAO5I,QAAQjF,KACjC,OAAO,SACFijB,GADL,IAEE+lD,WAAY,MAAK/lD,EAAM+lD,YACvBD,cAAe,SACV9lD,EAAM8lD,eACL4b,EAAY,MAAGA,EAAY92E,EAAO5I,QAAQ2/E,MAAMh4E,OAAU,CAAC,KAIrE,QACE,OAAOqW,EAEZ,EA6CC1f,MAjBF,WAAqC,IAAtB0f,EAAsB,uDAAd,KAAMpV,EAAQ,uCACnC,OAAQA,EAAO7N,MACb,IAAK,mBACL,IAAK,uBACH,OAAO,KACT,IAAK,gBACH,OAAO6N,EAAO5I,QAChB,QACE,OAAOge,EAEZ,I,6rBCrGc,SAAS4hE,KAOtB,IANA5hE,EAMA,uDANQ,CACNE,cAAc,EACdC,aAAc,KACdC,iBAAkB,MAEpBxV,EACA,uCACA,OAAQA,EAAO7N,MACb,IAAK,kBACH,OAAO,SAAKijB,GAAZ,IAAmBE,cAAc,IACnC,IAAK,yBACH,OAAO,SAAKF,GAAZ,IAAmBE,cAAc,EAAOE,kBAAkB,IAC5D,IAAK,iBACH,OAAO,SAAKJ,GAAZ,IAAmBE,cAAc,EAAOC,cAAc,IAExD,QACE,OAAOH,EAEZ,CCnBD/e,OAAO4gF,iBAAiB,WAAW,YAGrB,eAHkC,EAAVt1E,KAOlCtL,OAAOW,SAAS8uE,QAEnB,ICAD,IAAMoR,GAAsB5M,GAAAA,EAA2B,CACrD6M,kBAAmB,SAAAn3E,GAMjB,OALAsqE,GAAAA,GAAsB,SAAA52C,GACpBA,EAAM0jD,SAAS,kBAAmB,CAChCjlF,KAAM6N,EAAO7N,MAEhB,IACM,CAAEA,KAAM6N,EAAO7N,KAAMkQ,KAAM,WACnC,EACDg1E,iBAAkB,SAAAjiE,GA0BhB,MAtBkB,CAChBgF,SAAUhF,EAAMgF,SAChBgB,KAAMhG,EAAMgG,KACZS,UAAWzG,EAAMyG,UACjB8U,SAAUvb,EAAMub,SAChB7V,YAAa,WACb6lC,uBAAwB,WACxBppC,KAAM,WACNd,KAAMrB,EAAMqB,KACZ+E,cAAepG,EAAMoG,cACrB3E,MAAOzB,EAAMyB,MACb4rD,SAAUrtD,EAAMqtD,SAChB7Z,aAAc,WACd5oB,aAAc5qB,EAAM4qB,aACpB/oB,SAAU7B,EAAM6B,SAChBoB,SAAU,WACVE,KAAM,WACNO,SAAU,WACVvW,MAAO,WACP8S,WAAYD,EAAMC,WAIrB,EACDiiE,wBAAyB,SAAC5jD,EAAOte,GAC/B,IAAM9S,EAAO,KAAK8S,EAAM7S,MAAMuU,MAAM1B,EAAMgG,KAAKC,eAAgB,CAC7D,eACA,aACA,WACA,YACA,YACA,oBACA,UACA,QACA,WACA,QACA,UAGFqY,EAAM6jD,QAAQj1E,EACf,IAGGk1E,GAAYh/D,QAAQ3c,OAAOtF,aAAaC,QAAQ,WAEhDihF,GAAa,CAACC,GAAAA,ECnEL,WAEb,OAAO,SAAC5B,GACN,OAAO,SAAC91E,GAEFA,GACFgsC,QAAQ2rC,KAAK,+CAGf,IAAQxuD,EAA4BnpB,EAA5BmpB,QAASC,EAAmBppB,EAAnBopB,MAAUyV,EAA3B,GAAoC7+B,EAApC,IAEA,IAAKmpB,EACH,OAAO2sD,EAAK91E,GAGd,SAAkCopB,EAAlC,GAAOwuD,EAAP,KAAcC,EAAd,KAAuBC,EAAvB,KAIA,OAFAhC,EAAK,SAAKj3C,GAAN,IAAY1sC,KAAMylF,KAEfzuD,EAAQ1wB,MACb,SAAC1D,GAAD,OAAc+gF,EAAK,SAAKj3C,GAAN,IAAYznC,QAASrC,EAAU5C,KAAM0lF,IAAvD,IACA,SAACniF,GAAD,OAAWogF,EAAK,SAAKj3C,GAAN,IAAYznC,QAAS1B,EAAOvD,KAAM2lF,IAAjD,GAEH,CACF,CAEF,EFdM,WACL,OAAO,SAAAhC,GACL,OAAO,SAAA91E,GACL,OAAO81E,EAAK91E,EACb,CACF,CACF,GCmDGw3E,IACFC,GAAWx6E,KAAK86E,IAGlB,IAAMC,IAAWC,EAAAA,GAAAA,IACfC,GAAAA,GAAAA,WAAA,EAAmBT,IACnBP,GACA7gF,OAAO8hF,6BACH9hF,OAAO8hF,+BACP,SAAA7rC,GAAC,OAAIA,CAAJ,GAGD0qC,IAAUf,EAAAA,GAAAA,IAAgBmC,GE/EY,IAiCtCz7E,IAAU07E,EAAAA,EAAAA,MAEU,QAAtBhiF,OAAOiiF,YACThO,EAAAA,EAAY,CACViO,IAAKliF,OAAOmiF,WACZC,QAAS,WAAF,OAAapiF,OAAOC,aAC3BoiF,YAAariF,OAAOiiF,WACpBK,aAAc,CACZ,IAAIC,EAAAA,GAAAA,GAA4B,CAC9BC,uBAAwBvO,EAAAA,GAAoC3tE,IAC5Dm8E,eAAgB,CAAC,YAAa,cAAe,uBAMjDC,iBAAkB3mC,WAAW/7C,OAAO2iF,qBAAuB,IAI/D/1E,EAAAA,OAEAg2E,EAAAA,OACE,gBAAC,aAAD,KACE,gBAACC,EAAA,EAAD,CAAepnF,MAAOA,IACpB,gBAACqnF,EAAA,GAAD,MACA,gBAAC,KAAD,CAAUtD,OFsBKuD,EAAAA,GAAAA,IAAYpC,GAASgB,KEtBTqB,IAC3B,gBAAC,IAAD,CACEriF,SAAS,SACTsiF,WAAW,KACXC,SAAS,iBACTC,WAAW,YACXjhF,MAAO,CACLg4C,WAAYz+C,GAAAA,QAAAA,QAAAA,KACZiwB,WAAYjwB,GAAAA,WAAAA,WACZuqB,MAAOvqB,GAAAA,QAAAA,KAAAA,IACP2+C,QAAS,GACT99B,OAAQ,YAEV8mE,YAAa,CACXp9D,MAAOvqB,GAAAA,QAAAA,KAAAA,IACPy+C,WAAYz+C,GAAAA,QAAAA,UAAAA,KACZiwB,WAAYjwB,GAAAA,WAAAA,WACZ0+C,aAAc1+C,GAAAA,MAAAA,aACdyrB,SAAU,QAEZm8D,QAAS,KAnBX,2BAqB2B,IACzB,wBAAMnhF,MAAO,CAAEglB,SAAU,SAAzB,qGAGE,qBACEhlB,MAAO,CAAE8jB,MAAO,SAChBhG,QAAS,kBAAOhgB,OAAOW,SAASsf,KAAO,UAA9B,EACTA,KAAK,YAHP,0BAWRZ,SAASorD,eAAe,O,wvxFCjGtB6Y,EAA2B,CAAC,EAGhC,SAASrvF,EAAoBsvF,GAE5B,IAAIC,EAAeF,EAAyBC,GAC5C,QAAqBv1D,IAAjBw1D,EACH,OAAOA,EAAa9uF,QAGrB,IAAID,EAAS6uF,EAAyBC,GAAY,CACjDxvF,GAAIwvF,EACJnzC,QAAQ,EACR17C,QAAS,CAAC,GAUX,OANA+uF,EAAoBF,GAAUG,KAAKjvF,EAAOC,QAASD,EAAQA,EAAOC,QAAST,GAG3EQ,EAAO27C,QAAS,EAGT37C,EAAOC,OACf,CAGAT,EAAoB0vF,EAAIF,EC5BxBxvF,EAAoB2vF,KAAO,WAC1B,MAAM,IAAIxvF,MAAM,iCACjB,ExMFIT,EAAW,GACfM,EAAoB4vF,EAAI,CAAChmD,EAAQimD,EAAUzyC,EAAI0yC,KAC9C,IAAGD,EAAH,CAMA,IAAIE,EAAe19B,IACnB,IAAS/8B,EAAI,EAAGA,EAAI51B,EAASkY,OAAQ0d,IAAK,CAGzC,IAFA,IAAKu6D,EAAUzyC,EAAI0yC,GAAYpwF,EAAS41B,GACpC06D,GAAY,EACPzrC,EAAI,EAAGA,EAAIsrC,EAASj4E,OAAQ2sC,MACpB,EAAXurC,GAAsBC,GAAgBD,IAAaxvF,OAAOD,KAAKL,EAAoB4vF,GAAGv+E,OAAOgG,GAASrX,EAAoB4vF,EAAEv4E,GAAKw4E,EAAStrC,MAC9IsrC,EAASI,OAAO1rC,IAAK,IAErByrC,GAAY,EACTF,EAAWC,IAAcA,EAAeD,IAG7C,GAAGE,EAAW,CACbtwF,EAASuwF,OAAO36D,IAAK,GACrB,IAAI2+B,EAAI7W,SACErjB,IAANk6B,IAAiBrqB,EAASqqB,EAC/B,CACD,CACA,OAAOrqB,CAnBP,CAJCkmD,EAAWA,GAAY,EACvB,IAAI,IAAIx6D,EAAI51B,EAASkY,OAAQ0d,EAAI,GAAK51B,EAAS41B,EAAI,GAAG,GAAKw6D,EAAUx6D,IAAK51B,EAAS41B,GAAK51B,EAAS41B,EAAI,GACrG51B,EAAS41B,GAAK,CAACu6D,EAAUzyC,EAAI0yC,EAqBjB,EyMzBd9vF,EAAoBkwF,EAAK1vF,IACxB,IAAI2vF,EAAS3vF,GAAUA,EAAO4vF,WAC7B,IAAO5vF,EAAiB,QACxB,IAAM,EAEP,OADAR,EAAoB0+D,EAAEyxB,EAAQ,CAAE3gE,EAAG2gE,IAC5BA,CAAM,ECLdnwF,EAAoB0+D,EAAI,CAACj+D,EAAS4vF,KACjC,IAAI,IAAIh5E,KAAOg5E,EACXrwF,EAAoBC,EAAEowF,EAAYh5E,KAASrX,EAAoBC,EAAEQ,EAAS4W,IAC5E/W,OAAOgwF,eAAe7vF,EAAS4W,EAAK,CAAEk5E,YAAY,EAAMnkF,IAAKikF,EAAWh5E,IAE1E,ECHDrX,EAAoBE,EAAI,IAAO2pB,QAAQtpB,UCHvCP,EAAoBwwF,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAO15D,MAAQ,IAAI25D,SAAS,cAAb,EAGhB,CAFE,MAAOxwF,GACR,GAAsB,iBAAX6L,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxB/L,EAAoB2wF,IAAOnwF,KAC1BA,EAASF,OAAO+2B,OAAO72B,IACX8mB,WAAU9mB,EAAO8mB,SAAW,IACxChnB,OAAOgwF,eAAe9vF,EAAQ,UAAW,CACxC+vF,YAAY,EACZ9wC,IAAK,KACJ,MAAM,IAAIt/C,MAAM,0FAA4FK,EAAOV,GAAG,IAGjHU,GCTRR,EAAoBC,EAAI,CAAC0P,EAAKihF,IAAUtwF,OAAO82B,UAAUzmB,eAAe8+E,KAAK9/E,EAAKihF,GCClF5wF,EAAoBi0D,EAAKxzD,IACH,oBAAXowF,QAA0BA,OAAOC,aAC1CxwF,OAAOgwF,eAAe7vF,EAASowF,OAAOC,YAAa,CAAEx/E,MAAO,WAE7DhR,OAAOgwF,eAAe7vF,EAAS,aAAc,CAAE6Q,OAAO,GAAO,ECL9DtR,EAAoB+wF,IAAOvwF,IAC1BA,EAAOwwF,MAAQ,GACVxwF,EAAO8mB,WAAU9mB,EAAO8mB,SAAW,IACjC9mB,GCHRR,EAAoBwxB,EAAI,I,MCAxBxxB,EAAoByvB,EAAIrE,SAAS6lE,SAAWC,KAAKxkF,SAASsf,KAK1D,IAAImlE,EAAkB,CACrB,IAAK,GAaNnxF,EAAoB4vF,EAAErrC,EAAK6sC,GAA0C,IAA7BD,EAAgBC,GAGxD,IAAIC,EAAuB,CAACC,EAA4Bv5E,KACvD,IAGIu3E,EAAU8B,GAHTvB,EAAU0B,EAAaC,GAAWz5E,EAGhBud,EAAI,EAC3B,GAAGu6D,EAASp/E,MAAM3Q,GAAgC,IAAxBqxF,EAAgBrxF,KAAa,CACtD,IAAIwvF,KAAYiC,EACZvxF,EAAoBC,EAAEsxF,EAAajC,KACrCtvF,EAAoB0vF,EAAEJ,GAAYiC,EAAYjC,IAGhD,GAAGkC,EAAS,IAAI5nD,EAAS4nD,EAAQxxF,EAClC,CAEA,IADGsxF,GAA4BA,EAA2Bv5E,GACrDud,EAAIu6D,EAASj4E,OAAQ0d,IACzB87D,EAAUvB,EAASv6D,GAChBt1B,EAAoBC,EAAEkxF,EAAiBC,IAAYD,EAAgBC,IACrED,EAAgBC,GAAS,KAE1BD,EAAgBC,GAAW,EAE5B,OAAOpxF,EAAoB4vF,EAAEhmD,EAAO,EAGjC6nD,EAAqBP,KAAmB,aAAIA,KAAmB,cAAK,GACxEO,EAAmB9rD,QAAQ0rD,EAAqBK,KAAK,KAAM,IAC3DD,EAAmB9+E,KAAO0+E,EAAqBK,KAAK,KAAMD,EAAmB9+E,KAAK++E,KAAKD,G,KChDvFzxF,EAAoB2xF,QAAK53D,ECGzB,IAAI63D,EAAsB5xF,EAAoB4vF,OAAE71D,EAAW,CAAC,MAAM,IAAO/5B,EAAoB,SAC7F4xF,EAAsB5xF,EAAoB4vF,EAAEgC,E","sources":["webpack:///webpack/runtime/chunk loaded","webpack:///./favicons/ sync ^\\.\\/","webpack:///./js/constants/index.js","webpack:///./js/actions/Notifications.js","webpack:///./js/helpers/actionsPathHelpers.js","webpack:///./js/schemas/index.js","webpack:///./js/errors.js","webpack:///./js/clients/BaseClient.js","webpack:///./js/clients/ProjectClient.js","webpack:///./js/actions/ProjectActions.js","webpack:///./js/config/socket.js","webpack:///./js/helpers/index.js","webpack:///./js/actions/SessionActions.js","webpack:///./js/helpers/imagePaths.js","webpack:///./js/helpers/pathHelpers.js","webpack:///./js/components/OneCardHolder.js","webpack:///./js/components/Loader.js","webpack:///./js/clients/UserClient.js","webpack:///./js/actions/UserActions.js","webpack:///./js/components/ActivationPage.js","webpack:///./js/selectors/index.js","webpack:///./js/components/ActivationModal.js","webpack:///./js/components/ActivationRequired.js","webpack:///./js/components/AppDrawer.js","webpack:///./js/actions/BillingActions.js","webpack:///./js/actions/PlanActions.js","webpack:///./js/components/FormHelpers/TextInput.js","webpack:///./js/components/Billing.js","webpack:///./js/clients/CredentialClient.js","webpack:///./js/actions/CredentialActions.js","webpack:///./js/actions/MenuActions.js","webpack:///./js/components/MasonryWrapper.js","webpack:///./js/components/SectionFrame.js","webpack:///./js/clients/JobClient.js","webpack:///./js/actions/JobActions.js","webpack:///./js/actions/ChannelActions.js","webpack:///./js/components/FormActions.js","webpack:///./js/components/Link.js","webpack:///./js/components/Credentials/Oauth2.js","webpack:///./js/components/Credentials/BodySchemas.js","webpack:///./js/components/Credentials/GoogleSheets.js","webpack:///./js/components/Credentials/Sharepoint.js","webpack:///./js/components/CustomField.js","webpack:///./js/components/Credentials/CredentialForm.js","webpack:///./js/components/Credentials/CredentialOwnershipTransfer.js","webpack:///./js/components/Credentials/CredentialView.js","webpack:///./js/components/Credentials/CredentialModal.js","webpack:///./js/components/Credentials/CredentialAssignmentModal.js","webpack:///./js/components/Credentials/CredentialItem.js","webpack:///./js/components/Credentials/CredentialsList.js","webpack:///./js/components/ErrorView.js","webpack:///./js/components/Maintenance.js","webpack:///./js/components/PrivateRoute.js","webpack:///./js/clients/UsageCountClient.js","webpack:///./js/actions/UsageCountActions.js","webpack:///./js/clients/AuthMethodClient.js","webpack:///./js/actions/AuthMethodActions.js","webpack:///./js/actions/ProjectUserActions.js","webpack:///./js/components/AuthMethodItem.js","webpack:///./js/components/AccessSettings.js","webpack:///./js/components/FormHelpers/SelectInput.js","webpack:///./js/components/AuthMethodNew.js","webpack:///./js/helpers/pagination.js","webpack:///./js/clients/TriggerClient.js","webpack:///./js/actions/ReceiptActions.js","webpack:///./js/actions/RunActions.js","webpack:///./js/actions/TriggerActions.js","webpack:///./js/components/Jobs/DocumentationDrawer.js","webpack:///./js/components/CodeEditor.js","webpack:///./js/components/ExitCodeIcon.js","webpack:///./js/constants/triggerIcons.js","webpack:///./js/components/TriggerView.js","webpack:///./js/components/Jobs/GetSampleReceiptsButton.js","webpack:///./js/components/Jobs/IconPicker.js","webpack:///./js/components/Jobs/jsonExplorerStyles.js","webpack:///./js/components/Jobs/splitPaneStyles.js","webpack:///./js/components/Jobs/StudioInput.js","webpack:///./js/components/Jobs/IDE.js","webpack:///./js/components/Jobs/JobEdit.js","webpack:///./js/components/Jobs/JobItem.js","webpack:///./js/components/Jobs/JobsList.js","webpack:///./js/actions/ProjectRepoConnectionActions.js","webpack:///./js/components/PaginationControls.js","webpack:///./js/components/QueueStatus.js","webpack:///./js/components/Jobs/JobView.js","webpack:///./js/clients/ProjectFilesClient.js","webpack:///./js/components/ProjectFilesList.js","webpack:///./js/actions/ProjectFilesActions.js","webpack:///./js/components/ProjectSettings/ConfirmChangeModal.js","webpack:///./js/components/ProjectSettings/ExportProjectConfigModal.js","webpack:///./js/components/ProjectSettings/DeleteProjectModal.js","webpack:///./js/components/ProjectSettings/PlanChangeForm.js","webpack:///./js/components/ProjectSettings/CancelProjectDeletionModal.js","webpack:///./js/components/ProjectSettings.js","webpack:///./js/components/FormHelpers/CheckboxInput.js","webpack:///./js/components/ProjectSettings/ProjectRepoConnection.js","webpack:///./js/components/RunItem.js","webpack:///./js/components/ReceiptInspector.js","webpack:///./js/components/CreateMessageModal.js","webpack:///./js/components/ListViews/BulkModal.js","webpack:///./js/components/ListViews/DateFilter.js","webpack:///./js/components/ListViews/EmptyList.js","webpack:///./js/components/ListViews/LoadingRows.js","webpack:///./js/components/ListViews/RowError.js","webpack:///./js/components/ReceiptItem.js","webpack:///./js/components/ReceiptsList.js","webpack:///./js/components/ReceiptView.js","webpack:///./js/components/RunsList.js","webpack:///./js/components/RunView.js","webpack:///./js/actions/SearchActions.js","webpack:///./js/components/SearchProgress.js","webpack:///./js/components/SearchConsole.js","webpack:///./js/components/TriggerItem.js","webpack:///./js/components/TriggersList.js","webpack:///./js/components/UsageCountsList.js","webpack:///./js/components/ProjectScope.js","webpack:///./js/clients/ProjectRunStatsClient.js","webpack:///./js/components/ProjectItem.js","webpack:///./js/components/WelcomeMessage.js","webpack:///./js/components/NewProjectModal.js","webpack:///./js/components/ProjectsList.js","webpack:///./js/actions/ProjectRunStatsActions.js","webpack:///./js/marketing/Feature.js","webpack:///./js/components/SignupConfirm.js","webpack:///./js/components/Snackbar.js","webpack:///./js/components/UserChangeEmail.js","webpack:///./js/components/UserChangePassword.js","webpack:///./js/clients/ProductClient.js","webpack:///./js/components/StarredProductsAutocomplete.js","webpack:///./js/components/DeleteAccountModal.js","webpack:///./js/components/UserEdit.js","webpack:///./js/actions/ProductActions.js","webpack:///./js/components/UserMenu.js","webpack:///./js/clients/SupportTicketFormClient.js","webpack:///./js/components/FeedbackButton.js","webpack:///./js/components/SupportTicketForm.js","webpack:///./js/components/BannerAlert.js","webpack:///./js/components/SessionExpirationAlert.js","webpack:///./js/components/AppFrame.js","webpack:///./js/marketing/Footer.js","webpack:///./js/marketing/BigMenu.js","webpack:///./js/components/ScrollToTop.js","webpack:///./js/marketing/Particles.js","webpack:///./js/marketing/Banner.js","webpack:///./js/actions/BlogActions.js","webpack:///./js/marketing/BlogItem.js","webpack:///./js/marketing/Blog.js","webpack:///./js/marketing/ClientLogos.js","webpack:///./js/marketing/Compliance.js","webpack:///./js/marketing/Home.js","webpack:///./js/marketing/How.js","webpack:///./js/marketing/SocialStories.js","webpack:///./js/marketing/PartnerLogos.js","webpack:///./js/marketing/ImplementerLogos.js","webpack:///./js/marketing/Pricing.js","webpack:///./js/marketing/Careers.js","webpack:///./js/marketing/ProductItem.js","webpack:///./js/marketing/ProductsList.js","webpack:///./js/marketing/Solutions.js","webpack:///./js/marketing/Profile.js","webpack:///./js/marketing/Team.js","webpack:///./js/marketing/ThirdPartyList.js","webpack:///./js/marketing/Why.js","webpack:///./js/components/IEWarning.js","webpack:///./js/components/RequireBrowser.js","webpack:///./js/components/Signup.js","webpack:///./js/components/UserLogin.js","webpack:///./js/components/ResetPassword.js","webpack:///./js/components/AccountDeletionConfirmation.js","webpack:///./js/marketing/Marketing.js","webpack:///./js/config/googleAnalytics.js","webpack:///./js/config/routes.js","webpack:///./js/constants/theme.js","webpack:///./js/middleware/logger.js","webpack:///./js/reducers/Adaptors.js","webpack:///./js/reducers/Auth.js","webpack:///./js/reducers/AuthMethods.js","webpack:///./js/reducers/BlogPosts.js","webpack:///./js/reducers/Channels.js","webpack:///./js/reducers/Credentials.js","webpack:///./js/reducers/Jobs.js","webpack:///./js/reducers/ProjectRepoConnections.js","webpack:///./js/reducers/Menu.js","webpack:///./js/reducers/Notifications.js","webpack:///./js/reducers/Plans.js","webpack:///./js/reducers/Products.js","webpack:///./js/reducers/ProjectFiles.js","webpack:///./js/reducers/Projects.js","webpack:///./js/reducers/ProjectUsers.js","webpack:///./js/reducers/Receipts.js","webpack:///./js/reducers/Runs.js","webpack:///./js/reducers/Triggers.js","webpack:///./js/reducers/Users.js","webpack:///./js/reducers/SearchResults.js","webpack:///./js/reducers/Activation.js","webpack:///./js/session.js","webpack:///./js/redux/store.js","webpack:///./js/middleware/promise.js","webpack:///./js/app.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/amd define","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/global","webpack:///webpack/runtime/harmony module decorator","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/jsonp chunk loading","webpack:///webpack/runtime/nonce","webpack:///webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var map = {\n\t\"./android-chrome-192x192.png\": 99036,\n\t\"./android-chrome-512x512.png\": 41721,\n\t\"./apple-touch-icon.png\": 32116,\n\t\"./browserconfig.xml\": 65640,\n\t\"./favicon-16x16.png\": 73756,\n\t\"./favicon-32x32.png\": 83232,\n\t\"./favicon.ico\": 66732,\n\t\"./manifest\": 46058,\n\t\"./manifest.json\": 46058,\n\t\"./mstile-150x150.png\": 70079,\n\t\"./safari-pinned-tab.svg\": 81121\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 36111;","export const AUTH_METHODS_FAILURE = 'AUTH_METHODS_FAILURE';\nexport const AUTH_METHODS_REQUEST = 'AUTH_METHODS_REQUEST';\nexport const AUTH_METHODS_SUCCESS = 'AUTH_METHODS_SUCCESS';\nexport const CREATING_AUTH_METHOD = 'CREATING_AUTH_METHOD';\nexport const AUTH_METHOD_SUCCESS = 'AUTH_METHOD_SUCCESS';\nexport const AUTH_METHOD_INVALID = 'AUTH_METHOD_INVALID';\nexport const AUTH_METHOD_REMOVED = 'AUTH_METHOD_REMOVED';\n\nexport const BLOG_POSTS_REQUEST = 'BLOG_POSTS_REQUEST';\nexport const BLOG_POSTS_SUCCESS = 'BLOG_POSTS_SUCCESS';\nexport const BLOG_POSTS_FAILURE = 'BLOG_POSTS_FAILURE';\n\nexport const CREATING_CREDENTIAL = 'CREATING_CREDENTIAL';\nexport const CREDENTIALS_FAILURE = 'CREDENTIALS_FAILURE';\nexport const CREDENTIALS_REQUEST = 'CREDENTIALS_REQUEST';\nexport const CREDENTIALS_SUCCESS = 'CREDENTIALS_SUCCESS';\nexport const CREDENTIAL_FAILURE = 'CREDENTIALS_FAILURE';\nexport const CREDENTIAL_INVALID = 'CREDENTIAL_INVALID';\nexport const CREDENTIAL_REMOVED = 'CREDENTIAL_REMOVED';\nexport const CREDENTIAL_SUCCESS = 'CREDENTIAL_SUCCESS';\nexport const CREDENTIAL_SHARE_INVALID = 'CREDENTIAL_SHARE_INVALID';\n\nexport const JOBS_FAILURE = 'JOBS_FAILURE';\nexport const JOBS_REQUEST = 'JOBS_REQUEST';\nexport const JOBS_SUCCESS = 'JOBS_SUCCESS';\nexport const JOB_CHANGED = 'JOB_CHANGED';\nexport const JOB_FAILURE = 'JOB_FAILURE';\nexport const JOB_REMOVED = 'JOB_REMOVED';\nexport const JOB_REQUEST = 'JOB_REQUEST';\nexport const JOB_SUCCESS = 'JOB_SUCCESS';\nexport const JOB_INVALID = 'JOB_INVALID';\nexport const DISMISS_JOB_ERROR = 'DISMISS_JOB_ERROR';\n\nexport const FLOWS_SUCCESS = 'FLOWS_SUCCESS';\nexport const FLOWS_REQUEST = 'FLOWS_REQUEST';\nexport const FLOWS_FAILURE = 'FLOWS_FAILURE';\n\nexport const CREATING_TRIGGER = 'CREATING_TRIGGER';\nexport const NEW_TRIGGER = 'NEW_TRIGGER';\nexport const TRIGGER_CHANGED = 'TRIGGER_CHANGED';\nexport const TRIGGER_FAILURE = 'TRIGGER_FAILURE';\nexport const TRIGGER_REMOVED = 'TRIGGER_REMOVED';\nexport const TRIGGER_REQUEST = 'TRIGGER_REQUEST';\nexport const TRIGGER_SUCCESS = 'TRIGGER_SUCCESS';\nexport const TRIGGERS_FAILURE = 'TRIGGERS_FAILURE';\nexport const TRIGGERS_REQUEST = 'TRIGGERS_REQUEST';\nexport const TRIGGERS_SUCCESS = 'TRIGGERS_SUCCESS';\n\nexport const LOGGING_IN = 'LOGGING_IN';\nexport const LOGGING_OUT = 'LOGGING_OUT';\nexport const LOGIN_FAILED = 'LOGIN_FAILED';\nexport const LOGIN_SUCCESSFUL = 'LOGIN_SUCCESSFUL';\nexport const LOGOUT_FAILED = 'LOGOUT_FAILED';\nexport const LOGOUT_SUCCESSFUL = 'LOGOUT_SUCCESSFUL';\n\nexport const AUTHENTICATED = 'AUTHENTICATED';\nexport const AUTHENTICATING = 'AUTHENTICATING';\nexport const UNAUTHENTICATED = 'UNAUTHENTICATED';\n\nexport const CURRENT_USER_FOUND = 'CURRENT_USER_FOUND';\nexport const CURRENT_USER_NOT_FOUND = 'CURRENT_USER_NOT_FOUND';\nexport const FETCHING_CURRENT_USER = 'FETCHING_CURRENT_USER';\n\nexport const ADD_RECEIPT = 'ADD_RECEIPT';\nexport const RECEIPTS_RECEIVED = 'receipts/RECEIVED';\nexport const BODIES_RECEIVED = 'receipts/BODIES_RECEIVED';\nexport const FETCHING_RECEIPT = 'FETCHING_RECEIPT';\nexport const FETCHING_RECEIPT_FAILED = 'FETCHING_RECEIPT_FAILED';\nexport const FETCHING_RECEIPTS = 'FETCHING_RECEIPTS';\nexport const FETCHING_RECEIPTS_FAILED = 'FETCHING_RECEIPTS_FAILED';\nexport const RECEIPT_PROCESSED = 'RECEIPT_PROCESSED';\nexport const RECEIPT_RECEIVED = 'receipts/RECEIVED_ONE';\nexport const RECEIPT_UPDATED = 'receipts/UPDATED_ONE';\nexport const RECEIPT_FAILED = 'receipts/FAILED';\nexport const RECEIPTS_UPDATED = 'receipts/UPDATED';\nexport const UPDATING_RECEIPT = 'UPDATING_RECEIPT';\nexport const RECEIPT_JOB_STATES_RECEIVED = 'RECEIPT_JOB_STATES_RECEIVED';\nexport const FETCHING_RECEIPT_JOB_STATES = 'FETCHING_RECEIPT_JOB_STATES';\nexport const FETCHING_RECEIPT_JOB_STATES_FAILED =\n  'FETCHING_RECEIPT_JOB_STATES_FAILED';\n\nexport const UPDATING_USER = 'UPDATING_USER';\nexport const USER_RECEIVED = 'USER_RECEIVED';\nexport const USER_UPDATE_INVALID = 'USER_UPDATE_INVALID';\nexport const USER_UPDATED = 'USER_UPDATED';\nexport const USER_DELETED = 'USER_DELETED';\n\nexport const CARD_CHANGE_REQUESTED = 'CARD_CHANGE_REQUESTED';\nexport const CARD_CHANGE_FINISHED = 'CARD_CHANGE_FINISHED';\n\nexport const CHANGING_PLAN = 'CHANGING_PLAN';\nexport const PLAN_CHANGED = 'PLAN_CHANGED';\nexport const PLAN_CHANGE_FAILED = 'PLAN_CHANGE_FAILED';\n\nexport const PROJECTS_FAILURE = 'PROJECTS_FAILURE';\nexport const PROJECTS_REQUEST = 'PROJECTS_REQUEST';\nexport const PROJECTS_SUCCESS = 'PROJECTS_SUCCESS';\nexport const PROJECT_FAILURE = 'PROJECT_FAILURE';\nexport const PROJECT_CREATED = 'PROJECT_CREATED';\nexport const PROJECT_REQUEST = 'PROJECT_REQUEST';\nexport const PROJECT_SUCCESS = 'PROJECT_SUCCESS';\nexport const PROJECT_NOT_FOUND = 'PROJECT_NOT_FOUND';\nexport const PROJECT_UPDATED = 'PROJECT_UPDATED';\nexport const PROJECT_DELETED = 'PROJECT_DELETED';\nexport const PROJECT_DELETION_CANCELED = 'PROJECT_DELETION_CANCELED';\n\nexport const REQUESTED_USAGE_COUNTS = 'REQUESTED_USAGE_COUNTS';\nexport const RECEIVED_USAGE_COUNTS = 'RECEIVED_USAGE_COUNTS';\nexport const FAILED_USAGE_COUNTS = 'FAILED_USAGE_COUNTS';\nexport const REQUESTED_USAGE_HISTORY = 'REQUESTED_USAGE_HISTORY';\nexport const RECEIVED_USAGE_HISTORY = 'RECEIVED_USAGE_HISTORY';\nexport const FAILED_USAGE_HISTORY = 'FAILED_USAGE_HISTORY';\n\nexport const REQUESTED_RUN_STATS_FOR_PROJECTS =\n  'REQUESTED_RUN_STATS_FOR_PROJECTS';\nexport const RECEIVED_RUN_STATS_FOR_PROJECTS =\n  'RECEIVED_RUN_STATS_FOR_PROJECTS';\nexport const FAILED_RUN_STATS_FOR_PROJECTS = 'FAILED_RUN_STATS_FOR_PROJECTS';\nexport const REQUESTED_RUN_STATS_FOR_PROJECT =\n  'REQUESTED_RUN_STATS_FOR_PROJECT';\nexport const RECEIVED_RUN_STATS_FOR_PROJECT = 'RECEIVED_RUN_STATS_FOR_PROJECT';\nexport const FAILED_RUN_STATS_FOR_PROJECT = 'FAILED_RUN_STATS_FOR_PROJECT';\n\nexport const PROJECT_USERS_SUCCESS = 'PROJECT_USERS_SUCCESS';\nexport const PROJECT_USERS_FAILURE = 'PROJECT_USERS_FAILURE';\nexport const PROJECT_USERS_REQUEST = 'PROJECT_USERS_REQUEST';\nexport const PROJECT_USER_REMOVED = 'PROJECT_USER_REMOVED';\nexport const PROJECT_USER_CREATED = 'PROJECT_USER_CREATED';\nexport const PROJECT_USER_ALREADY_ADDED = 'PROJECT_USER_ALREADY_ADDED';\nexport const COLLAB_EMAIL_NOT_FOUND = 'COLLAB_EMAIL_NOT_FOUND';\n\nexport const REQUESTED_PROJECT_FILES = 'REQUESTED_PROJECT_FILES';\nexport const RECEIVED_PROJECT_FILES = 'RECEIVED_PROJECT_FILES';\nexport const FAILED_PROJECT_FILES = 'FAILED_PROJECT_FILES';\nexport const REQUESTED_DOWNLOAD = 'REQUESTED_DOWNLOAD';\nexport const RECEIVED_DOWNLOAD = 'RECEIVED_DOWNLOAD';\nexport const FAILED_DOWNLOAD = 'FAILED_DOWNLOAD';\n\nexport const PROJECT_REPO_CONNECTION_REQUEST =\n  'PROJECT_REPO_CONNECTION_REQUEST';\nexport const PROJECT_REPO_CONNECTION_CREATED =\n  'PROJECT_REPO_CONNECTION_CREATED';\nexport const PROJECT_REPO_CONNECTION_SUCCESS =\n  'PROJECT_REPO_CONNECTION_SUCCESS';\nexport const PROJECT_REPO_CONNECTION_FAILURE =\n  'PROJECT_REPO_CONNECTION_FAILURE';\nexport const PROJECT_REPO_CONNECTION_UPDATED =\n  'PROJECT_REPO_CONNECTION_UPDATED';\nexport const PROJECT_REPO_CONNECTION_REMOVED =\n  'PROJECT_REPO_CONNECTION_REMOVED';\nexport const REPO_REQUEST = 'REPO_REQUEST';\nexport const REPO_GET_SUCCESS = 'REPO_GET_SUCCESS';\nexport const REPO_GET_FAILURE = 'REPO_GET_FAILURE';\nexport const BRANCH_REQUEST = 'BRANCH_REQUEST';\nexport const BRANCH_GET_SUCCESS = 'BRANCH_GET_SUCCESS';\nexport const BRANCH_GET_FAILURE = 'BRANCH_GET_FAILURE';\n\nexport const PRODUCTS_FAILURE = 'PRODUCTS_FAILURE';\nexport const PRODUCTS_REQUEST = 'PRODUCTS_REQUEST';\nexport const PRODUCTS_SUCCESS = 'PRODUCTS_SUCCESS';\n\nexport const FETCHING_PLANS = 'FETCHING_PLANS';\nexport const PLANS_RECEIVED = 'PLANS_RECEIVED';\nexport const PLANS_FETCH_FAILED = 'PLANS_FETCH_FAILED';\n\nexport const SWITCHED_MENU = 'SWITCHED_MENU';\nexport const SCOPED_PROJECT = 'SCOPED_PROJECT';\nexport const UNSCOPED_PROJECT = 'UNSCOPED_PROJECT';\n\nexport const CHANNEL_ERROR = 'CHANNEL_ERROR';\nexport const CLOSED_CHANNEL = 'CLOSED_CHANNEL';\nexport const JOINED_CHANNEL = 'JOINED_CHANNEL';\nexport const JOINING_CHANNEL = 'JOINING_CHANNEL';\nexport const LEFT_CHANNEL = 'LEFT_CHANNEL';\nexport const LEAVING_CHANNEL = 'LEAVING_CHANNEL';\n\nexport const NOTIFICATION_ADDED = 'NOTIFICATION_ADDED';\nexport const NOTIFICATION_DISMISSED = 'NOTIFICATION_DISMISSED';\n\nexport const LOADING = 'runs/LOADING';\nexport const LOADED = 'runs/LOADED';\nexport const LOADED_DETAILS = 'runs/LOADED_DETAILS';\nexport const LOAD_FAILED = 'runs/LOAD_FAILED';\n\nexport const RUNS_UPDATED = 'runs/UPDATED';\nexport const RUNS_RECEIVED = 'runs/RECEIVED';\n\nexport const RUN_UPDATED = 'runs/UPDATED_ONE';\nexport const RUN_RECEIVED = 'runs/RECEIVED_ONE';\n","import {\n    NOTIFICATION_ADDED,\n    NOTIFICATION_DISMISSED\n} from '../constants';\n\nexport default {\n  add(msg, theme) {\n    return dispatch => {\n      const noteId = Date.now()\n      dispatch({ type: NOTIFICATION_ADDED, notification: { msg, theme, id: noteId } })\n    }\n  },\n\n  dismiss({id}) {\n    return { type: NOTIFICATION_DISMISSED, id }\n  }\n}\n","export function plansApiPath() {\n  return `/api/plans`;\n}\n\nexport function jobsApiPath() {\n  return `/api/jobs`;\n}\n\nexport function projectFilesApiPath() {\n  return `/api/project_files`;\n}\n\n/**\n * @param {import('../schemas/types').Project} project\n */\nexport function projectRunStatsApiPath(project) {\n  return `/api/project_run_stats/${project.id}`;\n}\n\nexport function projectsRunStatsApiPath() {\n  return `/api/project_run_stats`;\n}\n\nexport function projectUsersApiPath() {\n  return `/api/project_users`;\n}\n\nexport function usersApiPath() {\n  return `/api/users`;\n}\n\n/**\n * @param {import('../schemas/types').User} user\n */\nexport function userByEmailApiPath(user) {\n  return `${usersApiPath()}?email=${user.email}`;\n}\n\n/**\n * @param {import('../schemas/types').User} user\n */\nexport function userByIdApiPath(id) {\n  return `${usersApiPath()}/${id}`;\n}\n\nexport function projectUserApiPath(projectUser) {\n  return `${projectUsersApiPath()}/${projectUser.id}`;\n}\n\nexport function receiptsApiPath() {\n  return `/api/receipts`;\n}\n\nexport function receiptByIdApiPath(id) {\n  return `${receiptsApiPath()}/${id}`;\n}\n\nexport function receiptsExportApiPath() {\n  return `/api/export/receipts`;\n}\n\nexport function reprocessReceiptsApiPath() {\n  return `/api/receipts/reprocess`;\n}\n\n/**\n * @param {import('../schemas/types').Job} job\n */\nexport function jobByIdApiPath(id) {\n  return `/api/jobs/${id}`;\n}\n\nexport function adaptorsApiPath() {\n  return `/api/adaptors`;\n}\n\nexport function projectsApiPath() {\n  return `/api/projects`;\n}\n\n/**\n * @param {import('../schemas/types').Project} project\n */\nexport function projectApiPath(project) {\n  return `${projectsApiPath()}/${project.slug}`;\n}\n\nexport function projectBySlugApiPath(slug) {\n  return `${projectsApiPath()}/${slug}`;\n}\n\n/**\n * @param {import('../schemas/types').Project} project\n * @param {string} style\n */\nexport function exportProjectApiPath(project, style) {\n  return `/api/export/project/?project_id=${project.id}&style=${style}`;\n}\n\n/**\n * @param {import('../schemas/types').Project} project\n */\nexport function projectCheckQueuePath(project) {\n  return `/api/projects/${project.slug}/queue`;\n}\n\nexport function authMethodApiPath() {\n  return `/api/auth_methods`;\n}\n\nexport function clearJobStatePath(job) {\n  return `${jobsApiPath()}/${job.id}/clear_job_state`;\n}\n\nexport function revertJobStatePath(job) {\n  return `${jobsApiPath()}/revert`;\n}\n\nexport function startJobPath(job) {\n  return `/api/jobs/start`;\n}\n\nexport function deleteAuthMethodPath(auth) {\n  return `${authMethodApiPath()}/${auth.id}`;\n}\n\nexport function postChangePlanPath(attrs) {\n  return `${projectsApiPath()}/${attrs.id}/change_plan`;\n}\n\nexport function getBlogPostsPath() {\n  return `/api/blog/`;\n}\n\nexport function fetchProjectRepoConnectionPath(project) {\n  return `${projectApiPath(project)}/repo`;\n}\n\nexport function runsApiPath() {\n  return `/api/runs`;\n}\n\nexport function runApiPath(run) {\n  return `/api/runs/${run.id}`;\n}\n\nexport function reprocessRunsApiPath() {\n  return `/api/runs/reprocess`;\n}\n\nexport function exportRunsApiPath(queryString) {\n  return `/api/export/runs/?${queryString}`;\n}\n\nexport function searchesApiPath() {\n  return `/api/searches`;\n}\n\nexport function currentUserApiPath() {\n  return `/api/current_user`;\n}\n\nexport function loginApiPath() {\n  return `/api/login`;\n}\n\nexport function resetPasswordApiPath() {\n  return `api/reset_password`;\n}\n\nexport function recoverPasswordApiPath() {\n  return `api/recover_password`;\n}\n\n/**\n * @param {import('../schemas/types').User} user\n */\nexport function resendConfirmationLinkApiPath(user) {\n  return `/api/register/request_new_link/${user.id}`;\n}\n\nexport function fetchReposApiPath() {\n  return `/api/users/get_repos`;\n}\n\nexport function fetchBranchesApiPath() {\n  return `/api/users/get_branches`;\n}\n\nexport function userConfirmationApiPath() {\n  return `/api/register/confirm`;\n}\n\nexport function registerApiPath() {\n  return `/api/register`;\n}\n\nexport function credentialsApiPath() {\n  return `/api/credentials`;\n}\n\n/**\n * @param {import('../schemas/types').Credential} credential\n */\nexport function credentialApiPath(credential) {\n  return `/api/credentials/${credential.slug}`;\n}\n\n/**\n * @param {import('../schemas/types').Credential} credential\n */\nexport function credentialAccessToggleApiPath(credential) {\n  return `/api/credentials/${credential.slug}/toggle_access`;\n}\n\nexport function productsApiPath() {\n  return `/api/products`;\n}\n\nexport function triggersApiPath() {\n  return '/api/triggers';\n}\n\nexport function triggerByIdApiPath(id) {\n  return `${triggersApiPath()}/${id}`;\n}\n/**\n * @param {{ id: any; }} trigger\n */\nexport function triggerApiPath(trigger) {\n  return `/api/triggers/${trigger.id}`;\n}\n\nexport function usageCountsApiPath() {\n  return `/api/usage_counts`;\n}\n\n/**\n * @param {import('../schemas/types').Project} project\n */\nexport function usageCountApiPath(project) {\n  return `/api/usage_counts/${project.slug}`;\n}\n\n/**\n * @param {import('../schemas/types').Project} project\n */\nexport function usageHistoryApiPath(project) {\n  return `/api/usage_history/${project.slug}`;\n}\n\nexport function billingCardApiPath() {\n  return `/api/billing/card`;\n}\n","import { schema } from 'normalizr';\n\nexport const Adaptor = new schema.Entity('adaptors');\nexport const AuthMethod = new schema.Entity('authMethods');\nexport const Credential = new schema.Entity('credentials');\nexport const Flow = new schema.Entity('flows');\nexport const Job = new schema.Entity('jobs');\nexport const ProjectRepoConnection = new schema.Entity('projectRepoConnections');\nexport const Product = new schema.Entity('products');\nexport const Project = new schema.Entity('projects');\nexport const ProjectWithCollaborators = new schema.Entity('projects');\nexport const ProjectFile = new schema.Entity('projectFiles');\nexport const Trigger = new schema.Entity('triggers');\nexport const User = new schema.Entity('users');\nexport const ReceiptJobState = new schema.Entity('receiptJobStates');\nexport const ProjectUser = new schema.Entity('projectUsers');\n\nProjectWithCollaborators.define({\n  project: Project,\n  collaborators: [ProjectUser],\n});\n\n// Retuns a [trigger, job] ID pair for indexing ReceiptMatches\nfunction generatePair(receiptMatch) {\n  const {\n    trigger: { id: triggerId },\n    job: { id: jobId },\n  } = receiptMatch;\n  return [triggerId, jobId];\n}\n\nconst ReceiptMatch = new schema.Entity('receiptMatches', {\n  idAttribute: generatePair,\n});\nReceiptMatch.define({\n  trigger: Trigger,\n  job: Job,\n});\n\nconst Run = new schema.Entity('runs');\nRun.define({\n  trigger: Trigger,\n  job: Job,\n});\n\nexport { Run };\n\nexport const Receipt = new schema.Entity('receipts', {\n  project: Project,\n  receiptMatches: [ReceiptMatch],\n  receiptJobStates: [ReceiptJobState],\n});\n\nconst ProjectRunStats = new schema.Entity('projectRunStats');\nProjectRunStats.define({\n  id: Project,\n});\n","/* eslint-disable max-classes-per-file */\nimport { camelizeKeys } from 'humps';\n\nexport class RequestFailure extends Error {\n  constructor(response) {\n    super(\n      `Request failed: ${response.status} ${response.statusText} - ${response.url}`\n    );\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, RequestFailure);\n    }\n\n    this.name = 'RequestFailure';\n    this.response = response;\n  }\n}\n\nexport class NotFound extends Error {\n  constructor(response) {\n    super(\n      `Request failed: ${response.status} ${response.statusText} - ${response.url}`\n    );\n\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, NotFound);\n    }\n\n    this.name = 'NotFound';\n    this.response = response;\n  }\n}\n\nexport class Unauthorized extends Error {\n  constructor(response) {\n    super(\n      `Request failed: ${response.status} ${response.statusText} - ${response.url}`\n    );\n\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, Unauthorized);\n    }\n\n    this.name = 'Unauthorized';\n    this.response = response;\n  }\n}\nexport class BadRequest extends Error {\n  constructor(response) {\n    super(\n      `Request failed: ${response.status} ${response.statusText} - ${response.url}`\n    );\n\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, BadRequest);\n    }\n\n    this.name = 'BadRequest';\n    this.response = response;\n  }\n}\n\nexport class UnprocessableEntity extends Error {\n  /**\n   *\n   * @param {Response} response\n   * @param {{ errors: {string: string[]}}} object containing\n   * an errors key with an object containing a list of fields and their errors\n   * in an array.\n   */\n  constructor(response, { errors, error }) {\n    super(\n      `Request failed: ${response.status} ${response.statusText} - ${response.url}`\n    );\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, UnprocessableEntity);\n    }\n\n    this.name = 'UnprocessableEntity';\n    this.response = response;\n    this.errors = camelizeKeys(errors);\n    this.firstMessage =\n      error || Object.entries(this.errors).map(([k, v]) => `${k}: ${v}`)[0];\n  }\n}\n","import { decamelizeKeys } from 'humps';\nimport Qs from 'qs';\nimport {\n  UnprocessableEntity,\n  NotFound,\n  Unauthorized,\n  RequestFailure,\n  BadRequest,\n} from '../errors';\n\n/**\n * @param {Response} response\n */\nexport async function handleBadResponse(response) {\n  if (response.status == 400) {\n    throw new BadRequest(response);\n  }\n\n  if (response.status == 401) {\n    throw new Unauthorized(response);\n  }\n\n  if (response.status == 422) {\n    throw new UnprocessableEntity(response, await response.json());\n  }\n\n  if (response.status == 404) {\n    throw new NotFound(response);\n  }\n\n  if (response.status >= 400) {\n    throw new RequestFailure(response);\n  }\n}\n\nconst buildHeaders = () => {\n  const headers = {\n    accept: 'application/json',\n    'Content-Type': 'application/json',\n    'client-version': window.OFN_VERSION,\n  };\n\n  if (localStorage.getItem('auth_token')) {\n    headers.authorization = `Bearer ${localStorage.getItem('auth_token')}`;\n  }\n\n  return headers;\n};\n\n/**\n * @param {string} url\n * @param {object} [queryParams]\n * @returns Response\n */\nexport async function get(url, queryParams) {\n  if (queryParams) {\n    url += `?${Qs.stringify(decamelizeKeys(queryParams), {\n      arrayFormat: 'brackets',\n    })}`;\n  }\n\n  url = new URL(url, window.location);\n\n  const response = await fetch(url, {\n    headers: buildHeaders(),\n    mode: 'cors',\n  });\n\n  await handleBadResponse(response);\n\n  return response;\n}\n\n/**\n * @param {string} url\n * @param {object} payload\n * @returns Response\n */\nexport async function put(url, payload) {\n  url = new URL(url, window.location);\n\n  const response = await fetch(url, {\n    headers: buildHeaders(),\n    method: 'PUT',\n    mode: 'cors',\n    body: JSON.stringify(payload),\n  });\n\n  await handleBadResponse(response);\n\n  return response;\n}\n\n/**\n * @param {string} url\n * @param {object} payload\n * @returns Response\n */\nexport async function post(url, payload) {\n  url = new URL(url, window.location);\n\n  const response = await fetch(url, {\n    headers: buildHeaders(),\n    method: 'POST',\n    mode: 'cors',\n    body: JSON.stringify(payload),\n  });\n\n  await handleBadResponse(response);\n\n  return response;\n}\n\n/**\n * @param {string} url\n * @returns Response\n */\nexport async function del(urlString) {\n  const url = new URL(urlString, window.location.toString());\n  const response = await fetch(url, {\n    headers: buildHeaders(),\n    method: 'DELETE',\n    mode: 'cors',\n  });\n\n  await handleBadResponse(response);\n\n  return response;\n}\n","import { camelizeKeys, decamelizeKeys } from 'humps';\nimport { normalize, schema } from 'normalizr';\nimport {\n  projectApiPath,\n  projectBySlugApiPath,\n  projectsApiPath,\n} from '../helpers/actionsPathHelpers';\nimport { Project, ProjectWithCollaborators } from '../schemas';\nimport { get, put, post, del } from './BaseClient';\n\nexport async function getProjects() {\n  const response = await get(projectsApiPath());\n\n  return normalize(\n    camelizeKeys(await response.json()),\n    new schema.Array(Project)\n  );\n}\n\nexport async function getProject(project) {\n  const response = await get(projectApiPath(project));\n\n  return normalize(camelizeKeys(await response.json()), Project);\n}\n\nexport async function getProjectBySlug(slug) {\n  const response = await get(projectBySlugApiPath(slug));\n\n  return normalize(\n    camelizeKeys(await response.json()),\n    ProjectWithCollaborators\n  );\n}\n\nexport async function putProject(project) {\n  const payload = { project: decamelizeKeys(project) };\n  const response = await put(projectBySlugApiPath(project.slug), payload);\n  return normalize(camelizeKeys(await response.json()), Project);\n}\n\nexport async function postProject(project) {\n  const payload = { project: decamelizeKeys(project) };\n  const response = await post(projectsApiPath(), payload);\n  return normalize(camelizeKeys(await response.json()), Project);\n}\n\nexport async function delProject(projectSlug) {\n  const response = await del(projectBySlugApiPath(projectSlug));\n  return normalize(camelizeKeys(await response.json()), Project);\n}\n\nexport async function cancelProjectDeletion(projectSlug) {\n  const response = await put(\n    `${projectBySlugApiPath(projectSlug)}/cancel_deletion`\n  );\n  return normalize(camelizeKeys(await response.json()), Project);\n}\n","import {\n  cancelProjectDeletion,\n  delProject,\n  getProjectBySlug,\n  getProjects,\n  postProject,\n  putProject,\n} from '../clients/ProjectClient';\nimport {\n  PROJECTS_FAILURE,\n  PROJECTS_REQUEST,\n  PROJECTS_SUCCESS,\n  PROJECT_CREATED,\n  PROJECT_DELETED,\n  PROJECT_DELETION_CANCELED,\n  PROJECT_FAILURE,\n  PROJECT_NOT_FOUND,\n  PROJECT_REQUEST,\n  PROJECT_SUCCESS,\n  PROJECT_UPDATED,\n} from '../constants';\nimport Notifications from './Notifications';\nimport {\n  exportProjectApiPath,\n  projectCheckQueuePath,\n} from '../helpers/actionsPathHelpers';\nimport { UnprocessableEntity } from '../errors';\nimport { get } from '../clients/BaseClient';\n\nexport function fetchProjects() {\n  return {\n    promise: getProjects(),\n    types: [PROJECTS_REQUEST, PROJECTS_SUCCESS, PROJECTS_FAILURE],\n  };\n}\n\nexport function fetchProjectBySlug(slug) {\n  return async dispatch => {\n    dispatch({ type: PROJECT_REQUEST });\n\n    try {\n      const payload = await getProjectBySlug(slug);\n      dispatch({ type: PROJECT_SUCCESS, payload });\n    } catch (error) {\n      dispatch({ type: PROJECT_NOT_FOUND, error });\n    }\n  };\n}\n\nfunction projectExportRequested(style) {\n  return Notifications.add(\n    `Exporting ${\n      style == 'yaml' ? 'project.yaml' : 'microservice.zip'\n    }. Check your email for a secure download link.`,\n    'success'\n  );\n}\n\nfunction projectExportFailed(style) {\n  return Notifications.add(\n    `Failed to automatically build project as ${\n      style == 'yaml' ? 'project.yaml' : 'microservice.zip'\n    }. Please request an export via support@openfn.org.`,\n    'error'\n  );\n}\n\nexport function exportProject(project, style) {\n  return dispatch => {\n    return get(exportProjectApiPath(project, style))\n      .then(() => dispatch(projectExportRequested(style)))\n      .catch(() => dispatch(projectExportFailed(style)));\n  };\n}\n\nexport function checkQueue(project) {\n  return get(projectCheckQueuePath(project)).then(async response => {\n    const data = await response.json();\n    return data;\n  });\n}\n\nfunction createdProject() {\n  return Notifications.add('Created project space.', 'success');\n}\n\nfunction addProjectFailed() {\n  return Notifications.add(\n    'Project creation failed. Please try again later.',\n    'danger'\n  );\n}\n\nexport function createProject({ name, description }) {\n  return async dispatch => {\n    try {\n      const response = await postProject({\n        name,\n        description,\n      });\n      dispatch(createdProject());\n      dispatch({ type: PROJECT_CREATED, payload: response });\n      return response;\n    } catch (error) {\n      if (!(error instanceof UnprocessableEntity)) {\n        return dispatch(addProjectFailed());\n      }\n\n      throw error;\n    }\n  };\n}\n\nfunction updateSuccess() {\n  return Notifications.add('Project succesfully updated.', 'success');\n}\n\nfunction updateFailed() {\n  return Notifications.add(\n    'Project update failed. Please try again later or contact OpenFn.',\n    'warning'\n  );\n}\n\nexport function updateProject(project) {\n  return async dispatch => {\n    try {\n      const response = await putProject(project);\n      dispatch({ type: PROJECT_UPDATED, payload: response });\n      dispatch(updateSuccess());\n      return response;\n    } catch (error) {\n      dispatch({ type: PROJECT_FAILURE });\n      dispatch(updateFailed());\n      throw error;\n    }\n  };\n}\n\nexport function deleteProject(projectSlug) {\n  return async dispatch => {\n    const response = await delProject(projectSlug);\n    dispatch({ type: PROJECT_DELETED, payload: response });\n    return response;\n  };\n}\n\nexport function cancelDeletion(projectSlug) {\n  return async dispatch => {\n    const response = await cancelProjectDeletion(projectSlug);\n    dispatch({ type: PROJECT_DELETION_CANCELED, payload: response });\n    return response;\n  };\n}\n\nfunction toggleSupportAccessSuccess() {\n  return Notifications.add('Support access updated.', 'success');\n}\n\nfunction toggleSupportAccessFailed() {\n  return Notifications.add('Support access update failed.', 'warning');\n}\n\nexport function toggleSupportAccess(project) {\n  return dispatch => {\n    const promise = putProject({\n      ...project,\n      allowSupport: !project.allowSupport,\n    })\n      .then(response => {\n        dispatch({\n          type: PROJECT_UPDATED,\n          payload: response,\n        });\n        dispatch(toggleSupportAccessSuccess());\n      })\n      .catch(() => {\n        dispatch({\n          type: PROJECT_FAILURE,\n        });\n        dispatch(toggleSupportAccessFailed());\n      });\n\n    return promise;\n  };\n}\n\nfunction togglePublicSuccess() {\n  return Notifications.add('Public library status updated.', 'success');\n}\n\nfunction togglePublicFailed() {\n  return Notifications.add('Changing library status failed.', 'warning');\n}\n\nexport function togglePublic(project) {\n  const projectPayload = { ...project, public: !project.public };\n\n  return dispatch => {\n    const promise = putProject(projectPayload)\n      .then(response => {\n        dispatch({\n          type: PROJECT_UPDATED,\n          payload: response,\n        });\n        dispatch(togglePublicSuccess());\n      })\n      .catch(() => {\n        dispatch({\n          type: PROJECT_FAILURE,\n        });\n        dispatch(togglePublicFailed());\n      });\n\n    return promise;\n  };\n}\n","import { memoize } from 'lodash';\nimport { Socket } from 'phoenix';\n\n// memoized function to ensure all calls for a socket receive the\n// same instance every time. On first call, the socket is told to connect.\n// The `token` argument is the JWT token string.\nexport const getSocket = memoize(token => {\n  const socket = new Socket('/socket', {\n    params: { token },\n  });\n\n  socket.connect();\n\n  return socket;\n});\n\n// Disconnects a socket, and removes that corresponding\n// memoized instance from `getSocket`.\nexport const closeSocket = token => {\n  getSocket(token).disconnect();\n  getSocket.cache.delete(token);\n};\n","import cron from 'cron-validate';\nimport cronstrue from 'cronstrue';\nimport {\n  differenceInDays,\n  differenceInHours,\n  differenceInMilliseconds,\n  format,\n  formatRelative,\n  formatDistance,\n  parseISO,\n} from 'date-fns';\nimport { camelizeKeys } from 'humps';\nimport Notifications from '../actions/Notifications';\n\nexport function removeUndefinedProperty(obj) {\n  return Object.fromEntries(\n    Object.entries(obj).filter(([_, v]) => v !== undefined && v !== null)\n  );\n}\n\nexport function buildOauthConsentUrl(queryParams) {\n  const params = new URLSearchParams(removeUndefinedProperty(queryParams));\n  return `/oauth/consent?${params}`;\n}\n\nexport function toggleValue(func) {\n  return val => func(!val);\n}\n\nexport function allowSaveForSubmitError(form) {\n  const { submitErrors, dirtyFieldsSinceLastSubmit, dirtySinceLastSubmit } =\n    form.getState();\n\n  return (\n    Object.keys(submitErrors ?? {})\n      .filter(err => err !== 'otherError')\n      .some(fieldWithError => {\n        return dirtyFieldsSinceLastSubmit[fieldWithError];\n      }) ||\n    (dirtySinceLastSubmit &&\n      submitErrors?.hasOwnProperty('FINAL_FORM/form-error'))\n  );\n}\n\nexport function isValidAceEditorPosition(position) {\n  if (!position) return false;\n  return (\n    typeof position == 'object' &&\n    Object.keys(position).sort().join() === 'column,row' &&\n    Object.values(position).every(value => Number.isInteger(value))\n  );\n}\n\nexport function insertAceText(editor, string, position, noBreak) {\n  const insertPosition =\n    isValidAceEditorPosition(position) === true\n      ? position\n      : { row: editor.session.getLength(), column: 0 };\n\n  editor.session.insert(insertPosition, `${string}${noBreak ? '' : '\\n'}`);\n}\n\nexport function handlePhoenixError(error) {\n  if (error.response) return Promise.reject(camelizeKeys(error.response));\n  return Promise.reject(camelizeKeys(error));\n}\n\n/**\n * Given an error response from the server, where the errors are in an array;\n * construct a new object with the first error for each key and the value attached.\n * @param {{string: string[]}} submissionErrors\n * @param {{ [x: string]: any; }} values\n * @returns {{ [x: string]: {message: string, value: any}; }}\n */\nexport function createFormErrors(submissionErrors, values) {\n  return Object.fromEntries(\n    Object.entries(submissionErrors).map(([field, errors]) => {\n      return [field, { message: errors[0], value: values[field] }];\n    })\n  );\n}\n\n/**\n * Helper to make a bound redirect action.\n * Redux binds this to dispatch, however calling it for the first time\n * only binds the URL to the action, calling the resulting function\n * will dispatch it.\n */\nexport function linkTo(path, history) {\n  return e => {\n    e.preventDefault();\n    e.stopPropagation();\n    if (e.ctrlKey || e.metaKey) {\n      window.open(path, path);\n    } else {\n      history.push(path);\n      window.scrollTo(0, 0);\n    }\n  };\n}\n\nexport function pushTo(path, history) {\n  history.push(path);\n  window.scrollTo(0, 0);\n}\n\nexport function closeLoader() {\n  if (window.loading_screen) {\n    window.loading_screen.finish();\n  } else {\n    setTimeout(() => closeLoader(), 250);\n  }\n}\n\nexport function openTicketWidget() {\n  document.getElementById('new-support-ticket')?.click();\n}\n\nexport function abbreviateNumber(value) {\n  let newValue = value;\n  if (value >= 1000) {\n    const suffixes = ['', 'k', 'm', 'b', 't'];\n    const suffixNum = Math.floor(`${value}`.length / 3);\n    let shortValue;\n    for (let precision = 2; precision >= 1; precision -= 1) {\n      shortValue = parseFloat(\n        (suffixNum !== 0 ? value / 1000 ** suffixNum : value).toPrecision(\n          precision\n        )\n      );\n      const dotLessShortValue = `${shortValue}`.replace(/[^a-zA-Z 0-9]+/g, '');\n      if (dotLessShortValue.length <= 2) {\n        break;\n      }\n    }\n    if (shortValue % 1 !== 0) shortValue = shortValue.toFixed(1);\n    newValue = shortValue + suffixes[suffixNum];\n  }\n  return newValue;\n}\n\nexport function hoursAgo(number) {\n  return new Date(new Date().getTime() - 1000 * 60 * 60 * number).toISOString();\n}\n\nexport function dateRanger(date) {\n  const options = [1, 12, 24, 48, 168, 720, 2160, 4320, 8760];\n  const hours = differenceInHours(new Date(), new Date(date));\n  return options.indexOf(hours) < 0 ? 'custom' : hours;\n}\n\nfunction prepISO(value) {\n  if (typeof value == 'string') {\n    return parseISO(value);\n  }\n  return value;\n}\n\nexport function formatTime(databaseString, style) {\n  if (!databaseString) {\n    return null;\n  }\n  return format(prepISO(databaseString), style);\n}\n\nexport function calendarTime(databaseString) {\n  if (!databaseString) {\n    return null;\n  }\n\n  return formatRelative(new Date(databaseString), new Date());\n}\n\nexport function duration(databaseString, databaseString2, unit) {\n  if (!databaseString || !databaseString2) {\n    return null;\n  }\n  if (unit === 'days') {\n    return differenceInDays(prepISO(databaseString), prepISO(databaseString2));\n  }\n  return differenceInMilliseconds(\n    prepISO(databaseString),\n    prepISO(databaseString2)\n  );\n}\n\nexport function tableTime(time) {\n  if (time) {\n    return Date.now() - time <= 172800000\n      ? calendarTime(time)\n      : format(new Date(time), 'PPp');\n  }\n  return 'n/a';\n}\n\nexport function fullDate(date) {\n  return date\n    ? `${format(new Date(date), 'PPPPpppp')} (${formatDistance(\n        new Date(date),\n        new Date(),\n        {\n          addSuffix: true,\n        }\n      )})`\n    : 'n/a';\n}\n\nfunction runDuration(start, end) {\n  if (start && end && end - start > 0) {\n    return end - start;\n  }\n  return 0;\n}\n\nexport function RunItemPresenter({ run, trigger, job }) {\n  const { id, insertedAt, exitCode, startedAt, finishedAt, receiptId } = run;\n  return {\n    done: exitCode !== '',\n    duration: runDuration(startedAt, finishedAt),\n    exitCode,\n    finishedAt: finishedAt ? calendarTime(finishedAt) : 'n/a',\n    id,\n    insertedAt: insertedAt ? calendarTime(insertedAt) : 'n/a',\n    job,\n    receiptId,\n    startedAt: tableTime(startedAt),\n    startedRaw: startedAt,\n    trigger,\n  };\n}\n\nexport function validJson(string) {\n  try {\n    if (JSON.parse(string)) {\n      return true;\n    }\n  } catch (e) {\n    return false;\n  }\n}\n\nexport function formatBytes(a, b) {\n  if (0 == a) return '0 Bytes';\n  var c = 1024,\n    d = b || 2,\n    e = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n    f = Math.floor(Math.log(a) / Math.log(c));\n  return parseFloat((a / Math.pow(c, f)).toFixed(d)) + ' ' + e[f];\n}\n\nexport function runStarted(run) {\n  return Notifications.add(`Run ${run.id} has been enqueued.`, 'success');\n}\n\nexport function runStartFailed(jobId, errorMessage) {\n  return Notifications.add(\n    `Job #${jobId} couldn't start.\\n${errorMessage || ''}`,\n    'failure'\n  );\n}\n\nexport function ga4Event(name, params) {\n  if (window.gtag) {\n    return window.gtag('event', name, { params });\n  }\n  return null;\n}\n\nexport function clickEvent(category, action, label, value) {\n  if (window.gtag) {\n    return window.gtag('event', action, {\n      category,\n      label,\n      value,\n    });\n  }\n  return null;\n}\n\nexport function titleCase(str) {\n  return str.replace(/\\w\\S*/g, txt => {\n    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n  });\n}\n\nexport function isUpperCase(str) {\n  return str === str.toUpperCase();\n}\n\nexport function cronToHuman(str, opts) {\n  try {\n    if (str && cron(str).isValid()) {\n      if (opts && opts.capitalize) {\n        return cronstrue.toString(str);\n      }\n      return `${cronstrue.toString(str).slice(0, 1).toLowerCase()}${cronstrue\n        .toString(str)\n        .slice(1)}`;\n    }\n  } catch (error) {\n    return false;\n  }\n  return false;\n}\n\nexport function stateFromReceipt(receipt, credential) {\n  return {\n    data: receipt.body || null,\n    // TODO: hook this up to display the proper info, minus run.id of course.\n    // meta: {\n    //   last_success: null,\n    //   long_run: <FILL ME IN>,\n    //   no_console: <FILL ME IN>,\n    //   run: {\n    //     id: 'tbd',\n    //     job_id: <FILL ME IN>,\n    //     parent_id: null,\n    //     project_id: <FILL ME IN>,\n    //     receipt_id: <FILL ME IN>,\n    //     trigger_id: <FILL ME IN>,\n    //   },\n    // },\n    configuration: `secret://'${credential?.text}'`,\n  };\n}\n\nexport function githubAdaptorLink(projectRepoConnection, job) {\n  return `https://github.com/${projectRepoConnection.repositoryOwner}/${projectRepoConnection.repositoryName}/blob/${projectRepoConnection.repositoryBranch}/${job.pathInExternalRepo}`;\n}\n\nexport function equalOrFalsy(val1, val2) {\n  const c1 = val1 === val2;\n\n  const false1 = val1 === '' || !val1;\n  const false2 = val2 === '' || !val2;\n  const c2 = false1 && false2;\n\n  return c1 || c2;\n}\n\nexport const allowAnyOption = (options, value) => {\n  if (value && options.map(o => o.value).indexOf(value) === -1) {\n    options.push({ text: value, value });\n  }\n};\n\nexport const formSaveKeys = (e, saveAction) => {\n  const { key, ctrlKey, metaKey } = e;\n  if ((ctrlKey || metaKey) && key === 's') {\n    e.preventDefault();\n    saveAction();\n  }\n};\n\nexport const humanReadable = (uuid, nChars = -6) => uuid.slice(nChars);\n\nexport const slugify = text =>\n  (text &&\n    text\n      .toLowerCase()\n      .replace(/[^a-z-_\\.\\d]+/g, '-')\n      .replace(/^\\-+|\\-+$/g, '')) ||\n  null;\n\nexport const slugRule = str => {\n  const slug = slugify(str);\n\n  if (slug && slug.length < 5)\n    return 'Project slugs must contain at least 5 characters.';\n\n  return false;\n};\n\nexport function copiedToClipboard(thing) {\n  if (thing)\n    return Notifications.add(`${thing} copied to clipboard`, 'success');\n  return Notifications.add(`Text copied to clipboard`, 'success');\n}\n\nexport function isNumeric(str) {\n  if (typeof str != 'string') return false; // we only process strings!\n  return (\n    !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...\n    !isNaN(parseFloat(str))\n  ); // ...and ensure strings of whitespace fail\n}\n","import { camelizeKeys } from 'humps';\nimport { closeSocket } from '../config/socket';\nimport {\n  CURRENT_USER_FOUND,\n  CURRENT_USER_NOT_FOUND,\n  FETCHING_CURRENT_USER,\n  LOGGING_IN,\n  LOGIN_FAILED,\n  LOGIN_SUCCESSFUL,\n  LOGOUT_SUCCESSFUL,\n  UNAUTHENTICATED,\n  USER_RECEIVED,\n} from '../constants';\nimport { ga4Event } from '../helpers';\nimport {\n  currentUserApiPath,\n  loginApiPath,\n} from '../helpers/actionsPathHelpers';\nimport { get, post } from '../clients/BaseClient';\nimport Notifications from './Notifications';\n\nexport function getCurrentUser() {\n  return dispatch => {\n    if (localStorage.getItem('auth_token')) {\n      dispatch({ type: FETCHING_CURRENT_USER });\n      get(currentUserApiPath(), { jwt: localStorage.getItem('auth_token') })\n        .then(async response => {\n          const data = await response.json();\n          const user = camelizeKeys(data.users);\n          dispatch({ type: CURRENT_USER_FOUND, user });\n          dispatch({ type: USER_RECEIVED, user });\n        })\n        .catch(error => {\n          dispatch({\n            type: CURRENT_USER_NOT_FOUND,\n            error,\n          });\n        });\n    } else {\n      dispatch({ type: UNAUTHENTICATED });\n    }\n  };\n}\n\nexport function login({ email, password }) {\n  return dispatch => {\n    dispatch({ type: LOGGING_IN });\n    localStorage.removeItem('auth_token');\n\n    return post(loginApiPath(), { session: { email, password } })\n      .then(async response => {\n        const data = await response.json();\n        const { jwt, expiry } = data;\n        localStorage.setItem('auth_token', jwt);\n        dispatch({ type: LOGIN_SUCCESSFUL, token: { jwt, expiry } });\n        ga4Event('login', { method: 'native' });\n        return data;\n      })\n      .then(() => {\n        dispatch(getCurrentUser());\n      })\n      .catch(error => {\n        dispatch({ type: LOGIN_FAILED, error });\n        throw new Error({ password: error });\n      });\n  };\n}\n\nexport function logout(history, redirectTo = '/') {\n  return dispatch => {\n    const token = localStorage.getItem('auth_token');\n    closeSocket(token);\n    localStorage.removeItem('auth_token');\n    history.push(redirectTo);\n    dispatch({ type: LOGOUT_SUCCESSFUL });\n  };\n}\n\nexport function sessionExtensionSuccess(expiration) {\n  return Notifications.add(\n    `Your session has been extended until ${new Date(\n      expiration\n    ).toUTCString()}`,\n    'success'\n  );\n}\n","export default {\n  /* eslint-disable global-require */\n  // NOTE: Image paths must use lodash `camelCase(image.name)` to be found on\n  // ProductsList, ProductItem.\n  // OpenFn\n  textLogoWhite: require('../../static/images/text-logo-white.png'),\n  sqLogo: require('../../static/images/square-logo.png'),\n  sqLogoGradient: require('../../static/images/square-logo-gradient.png'),\n  how: require('../../static/images/how-website.png'),\n  bgPattern: require('../../static/images/bg-pattern.png'),\n  bgNoise: require('../../static/images/bg-noise.png'),\n  connect: require('../../static/images/connect.png'),\n  pdf: require('../../static/images/pdf.png'),\n  diagram: require('../../static/images/diagram.png'),\n  diagramHumanitarian: require('../../static/images/diagram-humanitarian.png'),\n\n  // Marketing images\n  airport: require('../../static/images/airport.jpeg'),\n  farmers: require('../../static/images/farmers.jpg'),\n  communityHealthWorkers: require('../../static/images/lwala-chws.jpg'),\n  miraclefeet: require('../../static/images/miraclefeet.jpg'),\n  lego: require('../../static/images/lego.jpeg'),\n  commcareDhis2: require('../../static/images/commcare-dhis2.png'),\n\n  // Team\n  aissatou: require('../../static/images/team/aissatou.jpg'),\n  aleksa: require('../../static/images/team/aleksa.jpg'),\n  ben: require('../../static/images/team/ben.jpeg'),\n  elias: require('../../static/images/team/elias.jpeg'),\n  isma: require('../../static/images/team/isma.jpeg'),\n  joe: require('../../static/images/team/joe.jpg'),\n  nick: require('../../static/images/team/nick.jpg'),\n  mtuchi: require('../../static/images/team/mtuchi.jpeg'),\n  rita: require('../../static/images/team/rita.jpg'),\n  rory: require('../../static/images/team/rory.jpg'),\n  roger: require('../../static/images/team/roger.jpg'),\n  santiago: require('../../static/images/team/santiago.jpg'),\n  santosh: require('../../static/images/team/santosh.jpg'),\n  stu: require('../../static/images/team/stu.jpg'),\n  taylor: require('../../static/images/team/taylor.jpeg'),\n\n  // Clients\n  ase: require('../../static/images/logos/ase.png'),\n  bt: require('../../static/images/logos/building-tomorrow.png'),\n  caris: require('../../static/images/logos/caris.png'),\n  cfk: require('../../static/images/logos/cfk.png'),\n  drinkwell: require('../../static/images/logos/drinkwell.png'),\n  fca: require('../../static/images/logos/fca.png'),\n  grs: require('../../static/images/logos/grs.jpg'),\n  ikapadata: require('../../static/images/logos/ikapadata.png'),\n  irc: require('../../static/images/logos/irc.png'),\n  keteka: require('../../static/images/logos/keteka.png'),\n  lastMileHealth: require('../../static/images/logos/lastMileHealth.png'),\n  livelyhoods: require('../../static/images/logos/livelyhoods.png'),\n  logicalOutcomes: require('../../static/images/logos/logicalOutcomes.png'),\n  lwala: require('../../static/images/logos/lwala-community-alliance.png'),\n  lwr: require('../../static/images/logos/lwr.png'),\n  miracleFeet: require('../../static/images/logos/miraclefeet.png'),\n  myagro: require('../../static/images/logos/myagro.png'),\n  nalibali: require('../../static/images/logos/nalibali.png'),\n  nrc: require('../../static/images/logos/nrc.png'),\n  popcouncil: require('../../static/images/logos/pop-council.png'),\n  psi: require('../../static/images/logos/psi.png'),\n  saep: require('../../static/images/logos/saep.png'),\n  sff: require('../../static/images/logos/sff.png'),\n  sinapis: require('../../static/images/logos/sinapis.png'),\n  skateistan: require('../../static/images/logos/skateistan.png'),\n  swissTPH: require('../../static/images/logos/swiss-tph.png'),\n  tns: require('../../static/images/logos/tns.png'),\n  unFoundation: require('../../static/images/logos/un-foundation.png'),\n  unicef: require('../../static/images/logos/unicef.png'),\n  vpuu: require('../../static/images/logos/vpuu.png'),\n  wcs: require('../../static/images/logos/wcs.png'),\n  xrunner: require('../../static/images/logos/xrunner.png'),\n\n  // Partners\n  dial: require('../../static/images/logos/dial.png'),\n  digitalSquare: require('../../static/images/logos/digital-square.png'),\n  poptech: require('../../static/images/logos/poptech.png'),\n  mulago: require('../../static/images/logos/mulago.png'),\n  salesforceOrg: require('../../static/images/logos/salesforce-org.png'),\n  echoinggreen: require('../../static/images/logos/echoing-green.png'),\n  dasra: require('../../static/images/logos/dasra.png'),\n  chai: require('../../static/images/logos/chai.png'),\n  chile: require('../../static/images/logos/chile.png'),\n  dsme: require('../../static/images/logos/dsme.png'),\n  ukAid: require('../../static/images/logos/uk-aid.png'),\n\n  // Implementers\n  adminCert: require('../../static/images/logos/admin-essentials-certificate.png'),\n  devCert: require('../../static/images/logos/dev-essentials-certificate.png'),\n  vera: require('../../static/images/logos/vera.png'),\n  ayder: require('../../static/images/logos/ayder.png'),\n  kkt: require('../../static/images/logos/kkt.png'),\n  os4h: require('../../static/images/logos/os4h.png'),\n\n  // Apps\n\n  ampImpact: require('../../static/images/logos/ampImpact.png'),\n  azureAd: require('../../static/images/logos/azureAD.png'),\n  // aidReports: require('../../static/images/logos/XXXX.png'),\n  // airwolf: require('../../static/images/logos/XXXX.png'),\n  // bambooIo: require('../../static/images/logos/XXXX.png'),\n  civiCrm: require('../../static/images/logos/civi-crm.png'),\n  collect: require('../../static/images/logos/collect.png'),\n  angaza: require('../../static/images/logos/angaza.png'),\n  arcGis: require('../../static/images/logos/arcgis.png'),\n  asana: require('../../static/images/logos/asana.png'),\n  bahmni: require('../../static/images/logos/bahmni.png'),\n  bambooHr: require('../../static/images/logos/bambooHr.png'),\n  baoSystems: require('../../static/images/logos/baosystems.png'),\n  beyonic: require('../../static/images/logos/beyonic.png'),\n  box: require('../../static/images/logos/box.png'),\n  brck: require('../../static/images/logos/brck.png'),\n  captricity: require('../../static/images/logos/captricity.png'),\n  carto: require('../../static/images/logos/cartodb.png'),\n  caleuche: require('../../static/images/logos/caleuche.png'),\n  cartodb: require('../../static/images/logos/cartodb.png'),\n  certificate: require('../../static/images/logos/certificate.png'),\n  commcare: require('../../static/images/logos/commcare.png'),\n  commCareHq: require('../../static/images/logos/commcare.png'),\n  commCare: require('../../static/images/logos/commcare.png'),\n  crisisNet: require('../../static/images/logos/crisis-net.png'),\n  crowdmap: require('../../static/images/logos/crowdmap.png'),\n  // dataWinners: require('../../static/images/logos/XXXX.png'),\n  // devAWhere: require('../../static/images/logos/XXXX.png'),\n  // devman: require('../../static/images/logos/XXXX.png'),\n  devResults: require('../../static/images/logos/devresults.png'),\n  dhis2: require('../../static/images/logos/dhis2-black.png'),\n  dhis2White: require('../../static/images/logos/dhis2-white.png'),\n  // DoForms: require('../../static/images/logos/XXXX.png'),\n  // DoView: require('../../static/images/logos/XXXX.png'),\n  dropbox: require('../../static/images/logos/dropbox.png'),\n  echoMobile: require('../../static/images/logos/echo-mobile.png'),\n  // emocha: require('../../static/images/logos/XXXX.png'),\n  // Endaga: require('../../static/images/logos/XXXX.png'),\n  // Eneza: require('../../static/images/logos/XXXX.png'),\n  engagespark: require('../../static/images/logos/engagespark.png'),\n  engageSpark: require('../../static/images/logos/engagespark.png'),\n  enketoSmartPaper: require('../../static/images/logos/enketo.png'),\n  eskuad: require('../../static/images/logos/eskuad.png'),\n  // EpiCollect: require('../../static/images/logos/XXXX.png'),\n  facebook: require('../../static/images/logos/fbmessenger.png'),\n  facebookMessenger: require('../../static/images/logos/fbmessenger.png'),\n  // FarmerLine: require('../../static/images/logos/XXXX.png'),\n  // Flow: require('../../static/images/logos/XXXX.png'),\n  // Formhub (Open Source): require('../../static/images/logos/XXXX.png'),\n  // Formstack: require('../../static/images/logos/XXXX.png'),\n  frontlineCloud: require('../../static/images/logos/frontline-cloud.png'),\n  frontlineSms: require('../../static/images/logos/frontline-cloud.png'),\n  // FrontlineSync: require('../../static/images/logos/XXXX.png'),\n  // Fulcrum: require('../../static/images/logos/XXXX.png'),\n  // Fulcrum: require('../../static/images/logos/XXXX.png'),\n  // GeoChat: require('../../static/images/logos/XXXX.png'),\n  // GeoODK: require('../../static/images/logos/XXXX.png'),\n  godata: require('../../static/images/logos/godata.png'),\n  // Google App Engine: require('../../static/images/logos/XXXX.png'),\n  // Google Charts: require('../../static/images/logos/XXXX.png'),\n  googlesheets: require('../../static/images/logos/google-sheets.png'),\n  googleSheets: require('../../static/images/logos/google-sheets.png'),\n  // Google Fusion Tables: require('../../static/images/logos/XXXX.png'),\n  googleMaps: require('../../static/images/logos/google-maps.png'),\n  http: require('../../static/images/logos/http.png'),\n  // Heroku: require('../../static/images/logos/XXXX.png'),\n  iFormBuilder: require('../../static/images/logos/iformbuilder.png'),\n  iformbuilder: require('../../static/images/logos/iformbuilder.png'),\n  // Jaspersoft: require('../../static/images/logos/XXXX.png'),\n  // Klipfolio: require('../../static/images/logos/XXXX.png'),\n  kobotoolbox: require('../../static/images/logos/kobo-toolbox.png'),\n  koBoToolbox: require('../../static/images/logos/kobo-toolbox.png'),\n  iHris: require('../../static/images/logos/ihris.png'),\n  humansis: require('../../static/images/logos/humansis.png'),\n  // KooKoo: require('../../static/images/logos/XXXX.png'),\n  keychain: require('../../static/images/logos/keys.png'),\n  khanacademy: require('../../static/images/logos/khan-academy.png'),\n  khanAcademy: require('../../static/images/logos/khan-academy.png'),\n  kopoKopo: require('../../static/images/logos/kopokopo.png'),\n  ibmMaximoEam: require('../../static/images/logos/maximo.png'),\n  magpi: require('../../static/images/logos/magpi.png'),\n  mailchimp: require('../../static/images/logos/mailchimp.png'),\n  mailgun: require('../../static/images/logos/mailgun.png'),\n  mapbox: require('../../static/images/logos/mapbox.png'),\n  maximo: require('../../static/images/logos/maximo.png'),\n  mogli: require('../../static/images/logos/mogli.png'),\n  mPesa: require('../../static/images/logos/mpesa.png'),\n  // Mapbox: require('../../static/images/logos/XXXX.png'),\n  // Martus: require('../../static/images/logos/XXXX.png'),\n  medicMobile: require('../../static/images/logos/medic-mobile.png'),\n  medicmobile: require('../../static/images/logos/medic-mobile.png'),\n  // Microsoft Data Gathering: require('../../static/images/logos/XXXX.png'),\n  microsoftDynamics: require('../../static/images/logos/microsoftdynamics.png'),\n  dynamics: require('../../static/images/logos/microsoftdynamics.png'),\n  mobenziResearcher: require('../../static/images/logos/mobenzi.png'),\n  // Mobiotrics: require('../../static/images/logos/XXXX.png'),\n  mongodb: require('../../static/images/logos/mongodb-sq.png'),\n  mongoDb: require('../../static/images/logos/mongodb.png'),\n  motechSuite: require('../../static/images/logos/motech.png'),\n  // mWater: require('../../static/images/logos/XXXX.png'),\n  mysql: require('../../static/images/logos/mysql.png'),\n  mySql: require('../../static/images/logos/mysql.png'),\n  mssql: require('../../static/images/logos/mssql.png'),\n  nexmo: require('../../static/images/logos/nexmo.png'),\n  // Nuntium: require('../../static/images/logos/XXXX.png'),\n  oauth2: require('../../static/images/logos/oauth2.png'),\n  oAuth20: require('../../static/images/logos/oauth2.png'),\n  odkX: require('../../static/images/logos/odk-x.png'),\n  odk: require('../../static/images/logos/odk.png'),\n  odkWhite: require('../../static/images/logos/odk-white.png'),\n  odoo: require('../../static/images/logos/odoo.png'),\n  ona: require('../../static/images/logos/ona.png'),\n  // OpenClinica Participate: require('../../static/images/logos/XXXX.png'),\n  // OpenClinica: require('../../static/images/logos/XXXX.png'),\n  // OpenEMIS: require('../../static/images/logos/XXXX.png'),\n  openConceptLabOcl: require('../../static/images/logos/ocl.png'),\n  openMrsWhite: require('../../static/images/logos/openmrs-white.png'),\n  openMrs: require('../../static/images/logos/open-mrs.png'),\n  openmrs: require('../../static/images/logos/open-mrs.png'),\n  openfn: require('../../static/images/logos/openfn.png'),\n  openHim: require('../../static/images/logos/openhim.png'),\n  openhim: require('../../static/images/logos/openhim.png'),\n  openSrp: require('../../static/images/logos/open-srp.png'),\n  // OpenXData: require('../../static/images/logos/XXXX.png'),\n  // Orbeon Forms: require('../../static/images/logos/XXXX.png'),\n  // Pendragon Forms: require('../../static/images/logos/XXXX.png'),\n  // Pentaho: require('../../static/images/logos/XXXX.png'),\n  postgresql: require('../../static/images/logos/postgresql.png'),\n  postgreSql: require('../../static/images/logos/postgresql.png'),\n  primero: require('../../static/images/logos/primero.png'),\n  progres: require('../../static/images/logos/progres.png'),\n  // Pollit: require('../../static/images/logos/XXXX.png'),\n  // PurcForms: require('../../static/images/logos/XXXX.png'),\n  // QlikView Desktop: require('../../static/images/logos/XXXX.png'),\n  // RafikiNet Management Platform: require('../../static/images/logos/XXXX.png'),\n  // RapidFTR: require('../../static/images/logos/XXXX.png'),\n  // RapidSMS: require('../../static/images/logos/XXXX.png'),\n  rapidpro: require('../../static/images/logos/rapidpro.png'),\n  rapidPro: require('../../static/images/logos/rapidpro.png'),\n  raw: require('../../static/images/logos/json.png'),\n  // REDCap: require('../../static/images/logos/XXXX.png'),\n  // Remindem: require('../../static/images/logos/XXXX.png'),\n  // Reporting Wheel: require('../../static/images/logos/XXXX.png'),\n  resourcemap: require('../../static/images/logos/resourcemap.png'),\n  resourceMap: require('../../static/images/logos/resourcemap.png'),\n  // Riff: require('../../static/images/logos/XXXX.png'),\n  // Roambi: require('../../static/images/logos/XXXX.png'),\n  salesforceForceCom: require('../../static/images/logos/salesforce.png'),\n  salesforceClassic: require('../../static/images/logos/salesforce.png'),\n  salesforceOffline: require('../../static/images/logos/salesforce.png'),\n  salesforce1: require('../../static/images/logos/salesforce.png'),\n  salesforce: require('../../static/images/logos/salesforce.png'),\n  sap: require('../../static/images/logos/sap.png'),\n  serenicNavigator: require('../../static/images/logos/serenic-navigator.png'),\n  sftp: require('../../static/images/logos/sftp.png'),\n  sharepoint: require('../../static/images/logos/microsoft-sq.png'),\n  // Seentags: require('../../static/images/logos/XXXX.png'),\n  // SimPrints: require('../../static/images/logos/XXXX.png'),\n  smap: require('../../static/images/logos/smap.png'),\n  smpp: require('../../static/images/logos/smpp.png'),\n  // SMS Magic: require('../../static/images/logos/XXXX.png'),\n  // SMSsync: require('../../static/images/logos/XXXX.png'),\n  statwing: require('../../static/images/logos/statwing.png'),\n  sumRandoVpn: require('../../static/images/logos/sum-rando.jpg'),\n  surveyCto: require('../../static/images/logos/survey-cto.png'),\n  surveycto: require('../../static/images/logos/survey-cto.png'),\n  // Swiftriver: require('../../static/images/logos/XXXX.png'),\n  // Tableau: require('../../static/images/logos/XXXX.png'),\n  taroWorks: require('../../static/images/logos/taroworks.png'),\n  // TeamReady: require('../../static/images/logos/XXXX.png'),\n  telerivet: require('../../static/images/logos/telerivet.png'),\n  twilio: require('../../static/images/logos/twilio.png'),\n  // TextIt: require('../../static/images/logos/XXXX.png'),\n  theSocialCollective: require('../../static/images/logos/the-social-collective.png'),\n  // TOCO: require('../../static/images/logos/XXXX.png'),\n  ushahidi: require('../../static/images/logos/ushahidi.png'),\n  // Vellum: require('../../static/images/logos/XXXX.png'),\n  // Verboice: require('../../static/images/logos/XXXX.png'),\n  votoMobile: require('../../static/images/logos/voto.png'),\n  // Vumi: require('../../static/images/logos/XXXX.png'),\n  // WhatsApp: require('../../static/images/logos/XXXX.png'),\n  // XLSForm: require('../../static/images/logos/XXXX.png'),\n  vtigerCrm: require('../../static/images/logos/vtiger.png'),\n  vtiger: require('../../static/images/logos/vtiger.png'),\n  zoho: require('../../static/images/logos/zoho.png'),\n  zohoReports: require('../../static/images/logos/zoho.png'),\n  microsoftAzure: require('../../static/images/logos/microsoftazure.png'),\n  microsoft: require('../../static/images/logos/microsoft-sq.png'),\n  // Google\n  googleSignInNormal: require('../../static/images/google/btn_google_signin_dark_normal_web@2x.png'),\n  googleSignInDisabled: require('../../static/images/google/btn_google_signin_dark_disabled_web@2x.png'),\n};\n","import { buildOauthConsentUrl } from '.';\n\nexport function projectsPath() {\n  return `/projects`;\n}\n\nexport function jobsPath() {\n  return `/jobs`;\n}\n\nexport function activationRequiredPath() {\n  return `/activation_required`;\n}\n\nexport function accountPath() {\n  return `/account`;\n}\n\nexport function signupActivatePath() {\n  return `/signup/activate`;\n}\n\nexport function signupConfirmPath() {\n  return `/signup/confirm`;\n}\n\nexport function changePasswordPath() {\n  return `/change_password`;\n}\n\nexport function changeEmailPath() {\n  return `/change_email`;\n}\n\nexport function billingPath() {\n  return `/billing`;\n}\n\nexport function messagesPath() {\n  return `/messages`;\n}\n\nexport function triggersPath() {\n  return `/triggers`;\n}\n\nexport function credentialsPath() {\n  return `/credentials`;\n}\n\n/**\n * Returns the path to a project using it's slug\n * @param {import(\"../schemas/types\").Project} project\n * @returns {string}\n */\nexport function projectPath(project) {\n  return `/projects/${project.slug}`;\n}\n\nexport function oauthGithubRevokePath() {\n  return `/oauth/github_revoke`;\n}\n\nexport function oauthUserConsentPath(queryParams) {\n  return buildOauthConsentUrl(queryParams);\n}\n\nexport function loginPath() {\n  return `/login`;\n}\n\nexport function signupPath() {\n  return `/signup`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @returns {string}\n */\nexport function projectAccessPath(project) {\n  return `${projectPath(project)}/access`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @returns {string}\n */\nexport function projectSettingsPath(project) {\n  return `${projectPath(project)}/settings`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @returns {string}\n */\nexport function projectUsagePath(project) {\n  return `${projectPath(project)}/usage`;\n}\n\n// Jobs\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @returns {string}\n */\nexport function projectJobsPath(project) {\n  return `${projectPath(project)}/jobs`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @param {import(\"../schemas/types\").Job} job\n * @returns {string}\n */\nexport function projectJobPath(project, job) {\n  return `${projectJobsPath(project)}/${job.slug}`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @param {import(\"../schemas/types\").Job} job\n * @returns {string}\n */\nexport function projectJobEditPath(project, job) {\n  return `${projectJobsPath(project)}/${job.slug}/edit`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @returns {string}\n */\nexport function projectNewJobPath(project) {\n  return `${projectJobsPath(project)}/new`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @param {import(\"../schemas/types\").Job} job\n * @param {import(\"../schemas/types\").Run} run\n * @returns {string}\n */\nexport function projectSaveAndRunJobPath(project, job, run) {\n  return `${projectJobsPath(project)}/${job.slug}/edit?runId=${run.id}`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @returns {string}\n */\nexport function projectProjectRepoConnectionsPath(project) {\n  return `${projectPath(project)}/repo`;\n}\n\n// Receipts\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @returns {string}\n */\nexport function projectReceiptsPath(project) {\n  return `${projectPath(project)}/messages`;\n}\n\nexport function projectReceiptEditPath(project, receipt) {\n  return `${projectReceiptsPath(project)}/${receipt.id}/edit`;\n}\n\nexport function projectReceiptInspectPath(project, receipt) {\n  if (typeof receipt === 'object') {\n    return `${projectReceiptsPath(project)}/${receipt.id}`;\n  }\n  return `${projectReceiptsPath(project)}/${receipt}`;\n}\n\nexport function projectNextReceiptInspectPath(project, receipt) {\n  return `${projectReceiptsPath(project)}/${receipt.nextId}`;\n}\n\nexport function projectPrevReceiptInspectPath(project, receipt) {\n  return `${projectReceiptsPath(project)}/${receipt.prevId}`;\n}\n\n// Credentials\n\nexport function credentialRoute() {\n  return `/credentials/:credentialSlug`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Credential} credential\n * @returns {string}\n */\nexport function credentialPath(credential) {\n  return `/credentials/${credential.slug}`;\n}\n\nexport function credentialViewRoute() {\n  return `/credentials/:adaptorKey/new`;\n}\n\nexport function projectScopeRoute() {\n  return `/projects/:slug`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n */\nexport function projectCredentialsPath(project) {\n  return `${projectPath(project)}/credentials`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @param {import(\"../schemas/types\").Credential} credential\n */\nexport function projectCredentialPath(project, credential) {\n  return `${projectCredentialsPath(project)}/${credential.slug}`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @param {{ module: string; }} adaptor\n */\nexport function projectNewCredentialPath(project, adaptor) {\n  return `${projectCredentialsPath(project)}/${adaptor.module}/new`;\n}\n\n/**\n * @param {{ module: string; }} adaptor\n */\nexport function newCredentialPath(adaptor) {\n  return `/credentials/${adaptor.module}/new`;\n}\n// Runs\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @param {import(\"../schemas/types\").Run} run\n */\nexport function runShowPath(project, run) {\n  return `${projectPath(project)}/runs/${run.id}`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n */\nexport function projectRunsPath(project) {\n  return `${projectPath(project)}/runs`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @param {import(\"../schemas/types\").Run} run\n */\nexport function projectNextRunPath(project, run) {\n  return `${projectPath(project)}/runs/${run.nextId}`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @param {import(\"../schemas/types\").Run} run\n */\nexport function projectPrevRunPath(project, run) {\n  return `${projectPath(project)}/runs/${run.prevId}`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n * @param {import(\"../schemas/types\").Run} run\n */\nexport function projectParentRunPath(project, run) {\n  return `${projectPath(project)}/runs/${run.parentId}`;\n}\n\n// AccessSettings\n/**\n * @param {import(\"../schemas/types\").Project} project\n */\nexport function newAuthMethodPath(project) {\n  return `${projectPath(project)}/authentication/new`;\n}\n\n// Triggers\n/**\n * @param {import(\"../schemas/types\").Project} project\n */\nexport function projectTriggersPath(project) {\n  return `${projectPath(project)}/triggers`;\n}\n\nexport function projectTriggerPath(project, trigger) {\n  return `${projectPath(project)}/triggers/${trigger.slug}`;\n}\n\n/**\n * @param {import(\"../schemas/types\").Project} project\n */\nexport function projectNewTriggerPath(project) {\n  return `${projectPath(project)}/triggers/new`;\n}\n\n// Search Console\n/**\n * @param {import(\"../schemas/types\").Project} project\n */\nexport function projectSearchConsolePath(project) {\n  return `${projectPath(project)}/search`;\n}\n\nexport function projectSearchResultPath(project, searchResult) {\n  return `${projectPath(project)}/${\n    searchResult.model === 'receipt' ? 'messages' : 'runs'\n  }/${searchResult.id}`;\n}\n\n// Downloads\n/**\n * @param {import(\"../schemas/types\").Project} project\n */\nexport function projectDownloadsPath(project) {\n  return `${projectPath(project)}/downloads`;\n}\n","import React from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    paddingBottom: theme.spacing(4),\n  },\n}));\n\nfunction OneCardHolder({ children, wide, full, noPad }) {\n  const classes = useStyles();\n  return (\n    <Grid\n      container\n      justifyContent=\"center\"\n      className={!noPad ? classes.root : null}\n    >\n      <Grid\n        item\n        xs={12}\n        md={(full && 12) || (wide ? 12 : 10)}\n        lg={(full && 12) || (wide ? 10 : 8)}\n        xl={(full && 12) || (wide ? 6 : 4)}\n      >\n        {children}\n      </Grid>\n    </Grid>\n  );\n}\n\nexport default React.memo(OneCardHolder);\n","import React from 'react';\nimport {\n  Card,\n  CardContent,\n  CircularProgress,\n  LinearProgress,\n  makeStyles,\n  Typography,\n} from '@material-ui/core';\nimport OneCardHolder from './OneCardHolder';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    flexGrow: 1,\n    zIndex: 5,\n    textAlign: 'center',\n  },\n  parent: {\n    textAlign: 'center',\n  },\n  text: {\n    paddingBottom: theme.spacing(2),\n    textAlign: 'center',\n  },\n}));\n\nfunction Loader({ item, verb, naked, wide, full, round }) {\n  const classes = useStyles();\n  if (naked) {\n    return (\n      <div className={classes.root}>\n        <div className={classes.parent}>\n          {item && (\n            <Typography className={classes.text}>\n              {verb || 'Loading'} {item}\n            </Typography>\n          )}\n          {round ? <CircularProgress /> : <LinearProgress />}\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <OneCardHolder className={classes.root} wide={wide} full={full}>\n      <Card className={classes.parent}>\n        <CardContent>\n          {item && (\n            <Typography className={classes.text}>\n              {verb || 'Loading'} {item}\n            </Typography>\n          )}\n          {round ? <CircularProgress /> : <LinearProgress />}\n        </CardContent>\n      </Card>\n    </OneCardHolder>\n  );\n}\n\nexport default React.memo(Loader);\n","import { camelizeKeys, decamelizeKeys } from 'humps';\nimport { normalize } from 'normalizr';\nimport {\n  billingCardApiPath,\n  registerApiPath,\n  userByIdApiPath,\n  usersApiPath,\n} from '../helpers/actionsPathHelpers';\nimport { User } from '../schemas';\nimport { del, post, put } from './BaseClient';\n\nexport function putUser(user) {\n  const { id, ...changes } = user;\n  const payload = { user: decamelizeKeys(changes) };\n\n  return put(userByIdApiPath(id), payload)\n    .then(async response => {\n      const data = await response.json();\n      const updatedUser = camelizeKeys(data.users);\n      return updatedUser;\n    })\n    .catch(error => Promise.reject(error));\n}\n\nexport function postNewCard(stripeToken) {\n  return post(billingCardApiPath(), stripeToken)\n    .then(async response => {\n      const data = await response.json();\n      return normalize(camelizeKeys(data.users), User);\n    })\n    .catch(error => Promise.reject(error));\n}\n\nexport async function postUserRegistration(registration) {\n  const payload = { user: decamelizeKeys(registration) };\n  return post(registerApiPath(), payload);\n}\n\nexport async function delUser(user) {\n  const response = await del(`${usersApiPath()}/${user.id}`);\n  return normalize(camelizeKeys(await response.json()), User);\n}\n","import { camelizeKeys } from 'humps';\nimport {\n  postNewCard,\n  putUser,\n  postUserRegistration,\n  delUser,\n} from '../clients/UserClient';\nimport {\n  BRANCH_GET_FAILURE,\n  BRANCH_GET_SUCCESS,\n  BRANCH_REQUEST,\n  CARD_CHANGE_FINISHED,\n  CARD_CHANGE_REQUESTED,\n  REPO_GET_FAILURE,\n  REPO_GET_SUCCESS,\n  REPO_REQUEST,\n  UPDATING_USER,\n  USER_DELETED,\n  USER_UPDATED,\n  USER_UPDATE_INVALID,\n} from '../constants';\nimport { clickEvent } from '../helpers';\nimport {\n  fetchBranchesApiPath,\n  fetchReposApiPath,\n  recoverPasswordApiPath,\n  resendConfirmationLinkApiPath,\n  resetPasswordApiPath,\n  userConfirmationApiPath,\n} from '../helpers/actionsPathHelpers';\n\nimport { UnprocessableEntity } from '../errors';\n\nimport Notifications from './Notifications';\nimport { login } from './SessionActions';\nimport { get, post } from '../clients/BaseClient';\n\nfunction updatingUser(user) {\n  return { type: UPDATING_USER, user };\n}\n\nfunction userUpdated(payload) {\n  return { type: USER_UPDATED, payload };\n}\n\nfunction userUpdateInvalid(error) {\n  return { type: USER_UPDATE_INVALID, error };\n}\n\nfunction userUpdateSuccess() {\n  return Notifications.add('User settings updated.', 'success');\n}\n\nfunction userUpdateFailed() {\n  return Notifications.add('User update failed.', 'error');\n}\n\nfunction cardChangedSuccess() {\n  return Notifications.add('Card change successful.', 'success');\n}\n\nexport function cardChangeRequested(isNewCard) {\n  clickEvent(\n    'Billing',\n    'Opened Card Modal',\n    isNewCard ? 'Add Card' : 'Change Card'\n  );\n  return { type: CARD_CHANGE_REQUESTED };\n}\n\nexport function cardChangeFinished() {\n  clickEvent('Billing', 'Changed Credit Card');\n  return { type: CARD_CHANGE_FINISHED };\n}\n\nfunction resetPassSuccess() {\n  return Notifications.add('Your password has been reset.', 'info');\n}\n\nfunction resetPassFailure() {\n  return Notifications.add(\n    \"That didn't work. Contact admin@openfn.org to reset your password.\",\n    'info'\n  );\n}\n\nexport function resetPassword(user) {\n  return dispatch => {\n    return post(resetPasswordApiPath(), {\n      hashed_password_reset_token: user.hashedPasswordResetToken,\n      password: user.password,\n    })\n      .then(async response => {\n        const data = await response.json();\n        dispatch({\n          type: 'PASSWORD_RESET_SUCCESSFULLY',\n        });\n        dispatch(\n          login({ email: data.users.email, password: user.password })\n        ).then(() => {\n          dispatch(resetPassSuccess());\n        });\n      })\n      .catch(error => {\n        dispatch({\n          type: 'PASSWORD_RESET_FAILED',\n        });\n        dispatch(resetPassFailure());\n        throw error;\n      });\n  };\n}\n\nexport function recoverPassword(email, history) {\n  return dispatch => {\n    post(recoverPasswordApiPath(), {\n      email,\n    })\n      .then(() => {\n        dispatch({\n          type: 'CREATED_RESET_TOKEN',\n        });\n        dispatch(recoveryTokenSuccess());\n        return history.push('/reset_password');\n      })\n      .catch(() => {\n        dispatch({\n          type: 'USER_NOT_FOUND',\n          message: \"We can't a user with that email.\",\n        });\n        dispatch(recoveryTokenFailure());\n      });\n  };\n}\n\nexport function resendConfirmationLink(user) {\n  return dispatch => {\n    return post(resendConfirmationLinkApiPath(user))\n      .then(response => {\n        dispatch({\n          type: 'RESENT_ACTIVATION_LINK',\n        });\n        dispatch(activationLinkSentSuccess());\n      })\n      .catch(err => {\n        dispatch({\n          type: 'USER_NOT_FOUND',\n          message: \"We can't a user with that email.\",\n        });\n        dispatch(activationLinkSentFailed());\n      });\n  };\n}\n\nfunction recoveryTokenFailure() {\n  return Notifications.add(\n    \"We can't find you! Contact admin@openfn.org to reset your password.\",\n    'error'\n  );\n}\n\nfunction recoveryTokenSuccess() {\n  return Notifications.add(\n    'A password recovery token has been sent to you via email.',\n    'info'\n  );\n}\n\nfunction activationLinkSentSuccess() {\n  return Notifications.add(\n    'A new activation link has been sent to you via email.',\n    'info'\n  );\n}\n\nfunction activationLinkSentFailed() {\n  return Notifications.add(\n    \"We can't find you! Contact admin@openfn.org to get your new activation link.\",\n    'error'\n  );\n}\n\nexport function updateUser(user) {\n  return dispatch => {\n    dispatch(updatingUser(user));\n    return putUser(user)\n      .then(response => {\n        dispatch(userUpdated(response));\n        dispatch(userUpdateSuccess());\n      })\n      .catch(error => {\n        dispatch(userUpdateInvalid(error));\n        dispatch(userUpdateFailed());\n        return Promise.reject(error);\n      });\n  };\n}\n\nexport function assignDefaultCard(stripeToken) {\n  // We don't respond to any 'card change' related events.\n  // And the card change API returns a 'user' view, so we use the existing\n  // user action creators.\n  return dispatch =>\n    postNewCard(stripeToken)\n      .then(payload => dispatch(userUpdated(payload)))\n      .then(() => dispatch(cardChangedSuccess()))\n      .then(() => dispatch(cardChangeFinished()))\n      .catch(error => {\n        dispatch(cardChangeFinished());\n        dispatch(userUpdateFailed(error));\n        return Promise.reject(error);\n      });\n}\n\nexport function fetchRepos() {\n  return dispatch => {\n    dispatch({ type: REPO_REQUEST });\n    return get(fetchReposApiPath())\n      .then(async response => {\n        const data = camelizeKeys(await response.json());\n        dispatch({ type: REPO_GET_SUCCESS, repos: data.repos });\n      })\n      .catch(error => {\n        dispatch({ type: REPO_GET_FAILURE, payload: error });\n      });\n  };\n}\n\nexport function fetchBranches(name, owner) {\n  return dispatch => {\n    dispatch({\n      type: BRANCH_REQUEST,\n    });\n    return get(fetchBranchesApiPath(), { name, owner })\n      .then(async response => {\n        const data = camelizeKeys(await response.json());\n        dispatch({ type: BRANCH_GET_SUCCESS, branches: data.branches });\n      })\n      .catch(error => {\n        dispatch({ type: BRANCH_GET_FAILURE, payload: error });\n      });\n  };\n}\n\nexport function registrationFailed(error) {\n  return { type: 'USER_REGISTRATION_FAILURE', error };\n}\n\nexport function registerUser(registration) {\n  return dispatch => {\n    dispatch({ type: 'REGISTERING_USER', registration });\n\n    // Note: we must clear auth_token before attempting a new registration\n    localStorage.removeItem('auth_token');\n\n    return postUserRegistration(registration)\n      .then(async response => {\n        const data = await response.json();\n        dispatch({ type: 'USER_REGISTRATION_SUCCESS', data });\n        return data;\n      })\n      .catch(error => {\n        if (!(error instanceof UnprocessableEntity)) {\n          dispatch(registrationFailed(error));\n        }\n\n        throw error;\n      });\n  };\n}\n\nexport function activateUser(userId, confirmationToken) {\n  return dispatch => {\n    if (!userId || !confirmationToken) {\n      dispatch({ type: 'USER_ACTIVATION_FAILED' });\n    } else {\n      dispatch({ type: 'ACTIVATING_USER' });\n\n      post(userConfirmationApiPath(), {\n        user_id: userId,\n        confirmation_token: confirmationToken,\n      })\n        .then(async response => response.json())\n        .then(data => {\n          dispatch({\n            type: 'USER_ACTIVATED',\n            payload: camelizeKeys(data.users),\n          });\n        })\n        .catch(error => dispatch({ type: 'USER_ACTIVATION_FAILED', error }));\n    }\n  };\n}\n\nexport function deleteUser(user) {\n  return async dispatch => {\n    const response = await delUser(user);\n    dispatch({ type: USER_DELETED, payload: response });\n    return response;\n  };\n}\n","import React, { useEffect } from 'react';\nimport {\n  Avatar,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Typography,\n} from '@material-ui/core';\nimport SecurityIcon from '@material-ui/icons/Security';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport { isEqual } from 'lodash';\nimport Loader from './Loader';\nimport OneCardHolder from './OneCardHolder';\nimport { linkTo } from '../helpers';\nimport { resendConfirmationLink, activateUser } from '../actions/UserActions';\n\nfunction ActivationPage() {\n  const history = useHistory();\n  const location = useLocation();\n  const params = new URLSearchParams(location.search);\n  const confirmationToken = params.get('confirmationToken');\n  const userId = params.get('userId');\n  const dispatch = useDispatch();\n\n  const { isActivating, hasActivated, activationFailed } = useSelector(\n    state => state.activation,\n    isEqual\n  );\n\n  useEffect(() => {\n    document.title = 'Email Verification - OpenFn';\n  }, []);\n\n  useEffect(() => {\n    dispatch(activateUser(userId, confirmationToken));\n  }, [dispatch, userId, confirmationToken]);\n\n  if (activationFailed || hasActivated) {\n    return (\n      <OneCardHolder>\n        <Card style={{ marginTop: '4em', marginBottom: '4em' }}>\n          <CardHeader\n            title=\"Email Verification\"\n            avatar={\n              <Avatar>\n                <SecurityIcon />\n              </Avatar>\n            }\n          />\n          <CardContent>\n            <Typography variant=\"h5\">\n              Email verification{' '}\n              {hasActivated ? 'succeeded' : isActivating ? 'pending' : 'failed'}\n              .\n            </Typography>\n            <br />\n            {hasActivated && (\n              <Typography>\n                Your email has been verified. Thanks for helping us keep OpenFn\n                secure.\n              </Typography>\n            )}\n            {activationFailed && (\n              <div>\n                <Typography>\n                  It looks like there is something not quite right about that\n                  link. If the button in your email isn't working, you can\n                  request a new verification link or contact support and\n                  we&apos;ll get your verified as quickly as possible.\n                </Typography>\n                <br />\n              </div>\n            )}\n          </CardContent>\n          <CardActions>\n            {hasActivated && (\n              <Button onClick={linkTo('/projects', history)}>\n                Go to projects\n              </Button>\n            )}\n            {activationFailed && (\n              <>\n                <Button\n                  onClick={() =>\n                    dispatch(resendConfirmationLink({ id: userId }))\n                  }\n                >\n                  Request new link\n                </Button>\n                <Button\n                  href=\"mailto:support@openfn.org?subject=Email verification\"\n                  target=\"_blank\"\n                >\n                  Contact support\n                </Button>\n              </>\n            )}\n          </CardActions>\n        </Card>\n      </OneCardHolder>\n    );\n  }\n\n  return <Loader />;\n}\n\nexport default ActivationPage;\n","import {\n  filter,\n  flow,\n  map,\n  omit,\n  partialRight,\n  pickBy,\n  reverse,\n  sortBy,\n  values,\n} from 'lodash';\n\nfunction selectInbox(id, state) {\n  return state.projects.items[id];\n}\n\nexport function selectMenuKey(state) {\n  return state.menu.selectedMenuKey;\n}\n\nexport function selectCurrentPlan(state, planId) {\n  return state.plans.items[planId];\n}\n\nexport function selectUsageCount(state, projectId) {\n  return state.projects.usageCounts[projectId];\n}\n\nexport function selectSelectedMenuKey(state) {\n  return state.menu.selectedMenuKey;\n}\n\nexport function selectProjectError(state) {\n  return state.projects.error;\n}\n\nexport function selectUsageDetails(usageCount, plan, jobs) {\n  return {\n    projectId: usageCount.projectId,\n    runsInPeriod: usageCount.runsInPeriod || 0,\n    runLimit: plan.submissionLimit,\n    jobsCount: Object.keys(\n      pickBy(jobs, x => {\n        return x.autoprocess === true;\n      })\n    ).length,\n    jobLimit: plan.jobLimit,\n  };\n}\n\nexport function selectUsageDetailsForProject(selectedProject) {\n  return state => {\n    const currentPlan = selectCurrentPlan(state, selectedProject.planId) ?? {};\n    const usageCount = selectUsageCount(state, selectedProject.id) ?? {};\n    const jobs = selectJobs(state);\n    return selectUsageDetails(usageCount, currentPlan, jobs);\n  };\n}\n\nexport function withInbox(receipts, state) {\n  return partialRight(map, r => {\n    return { ...r, project: selectInbox(r.projectId, state) };\n  })(receipts);\n}\n\nexport function submissionsForReceipt(receipt, state) {\n  return flow(\n    values,\n    partialRight(filter, s => s.receiptId === receipt.id),\n    partialRight(sortBy, s => s.insertedAtEpoch || 0),\n    reverse\n  )(state.submissions.items);\n}\n\nexport function selectJobs(state) {\n  return state.jobs.items;\n}\n\nexport function selectJob(state, identifier) {\n  if (!identifier) {\n    return null;\n  }\n\n  const job = Object.values(state.jobs.items).find(({ id, slug }) => {\n    return id === identifier || slug === identifier;\n  });\n\n  if (!job) {\n    return null;\n  }\n\n  // Ensure the expression is a string, as AceEditor can't handle nulls\n  return { ...job, expression: job.expression || '' };\n}\n\n// ===========================================================================\n//                              Receipt Selectors\n// ===========================================================================\n\nexport function selectReceipts(state) {\n  return values(state.receipts.items);\n}\n\nexport function attachReceiptJobStates(state) {\n  return receipt => {\n    const receiptJobStates = receipt.receiptJobStates\n      ? receipt.receiptJobStates\n          .map(id => {\n            const run = state.runs.items[id];\n            if (run) {\n              const job = state.jobs.items[run.jobId];\n              return { ...run, job };\n            }\n            return run;\n          })\n          .filter(Boolean)\n      : null;\n    return { ...receipt, receiptJobStates };\n  };\n}\n\nexport function assembleMatches(state, message) {\n  if (!message) return [];\n  if (!message.matches) return [];\n\n  // Only attempt to assembleMatches if they are already provided by a receipt update.\n  // The ready matches will have a match object at Array position 0.\n  // TODO: This feels dirty, talk to Stu one day!\n  if (Array.isArray(message.matches[0])) {\n    return message.matches.map(([triggerId, jobId]) => {\n      return {\n        trigger: state.triggers.items[triggerId] || {},\n        job: state.jobs.items[jobId] || {},\n      };\n    });\n  }\n\n  // If the matches have already been provided, just send them along!\n  return message.matches;\n}\n\nexport function attachMatches(state) {\n  return receipt => ({ ...receipt, matches: assembleMatches(state, receipt) });\n}\n\n// Finds all Runs for a given Receipt, and attaches the trigger and the job.\nexport function assembleRuns(state, message) {\n  if (!message) return [];\n\n  return values(state.runs.items)\n    .filter(({ receiptId }) => receiptId === message.id)\n    .sort((a, b) => b.insertedAt - a.insertedAt)\n    .map(run => {\n      const trigger = state.triggers.items[run.trigger];\n      // Drop the trigger key from Run if it can't be found in state.\n      // The absence of a trigger property signifies it doesn't exist in the state.\n      if (run.trigger && !trigger) {\n        return omit(run, 'trigger');\n      }\n      return { ...run, trigger };\n    })\n    .map(run => ({ ...run, job: state.jobs.items[run.job] }));\n}\n\nexport function selectReceiptJobStateError(state) {\n  return state.runs.error;\n}\n\nexport function selectReceiptError(state) {\n  return state.receipts.error;\n}\n\nexport function selectReceiptsLoading(state) {\n  return state.receipts.isLoading;\n}\n\nexport function selectReceiptsPagination(state) {\n  return state.receipts.pagination;\n}\n// ===========================================================================\n// Search\n// ===========================================================================\nexport function selectSearchId(state) {\n  return state.searchResults.searchId;\n}\n\nexport function selectSearchIsLoading(state) {\n  return state.searchResults.isLoading;\n}\n\nexport function selectSearchProgress(state) {\n  return state.searchResults.progress;\n}\n\nexport function selectSearchError(state) {\n  return state.searchResults.error;\n}\n\nexport function selectSearchResults(state) {\n  return state.searchResults.items.sort((a, b) => {\n    return a.insertedAt < b.insertedAt\n      ? 1\n      : a.insertedAt > b.insertedAt\n      ? -1\n      : 0;\n  });\n}\n\n// ===========================================================================\n// Runs\n// ===========================================================================\n\nexport function selectRuns(state) {\n  return values(state.runs.items);\n}\n\nexport function selectRunsPagination(state) {\n  return state.runs.pagination;\n}\n\nexport function selectRunsLoading(state) {\n  return state.runs.isLoading;\n}\n\n// ===========================================================================\n// Plans\n// ===========================================================================\n\nexport function planChangeDetails(state, changeDetails) {\n  let prevId;\n  let proposedId;\n\n  if (changeDetails) {\n    prevId = changeDetails.initial.planId;\n    proposedId = changeDetails.values.planId;\n  }\n\n  function getPlanById(id, state) {\n    return state.plans.items[id];\n  }\n\n  return {\n    changeRequested: state.plans.changeRequested,\n    previousPlan: getPlanById(prevId, state),\n    proposedPlan: getPlanById(proposedId, state),\n  };\n}\n\n// Adaptors\n// ========\n\nexport function selectAdaptor(state, fn) {\n  return state.adaptors.items.filter(fn)[0];\n}\n\nexport function selectAdaptors(state) {\n  return Object.values(state.adaptors.items);\n}\nexport function selectInstallStatusMessage(state, adaptorKey) {\n  return state.adaptors.onDemandItems[adaptorKey]?.message;\n}\n\nexport function selectInstallingAdaptor(state, adaptorKey) {\n  return state.adaptors.onDemandItems[adaptorKey]?.installing;\n}\n\nexport function selectAdaptorInstalled(state, adaptorKey) {\n  return state.adaptors.onDemandItems[adaptorKey]?.installed;\n}\n\nexport function selectAdaptorInstallError(state, adaptorKey) {\n  return state.adaptors.onDemandItems[adaptorKey]?.installError;\n}\n\nexport function selectAdaptorAstInstalled(state, name, version) {\n  return (\n    state.adaptors.helpers?.adaptor?.adaptorName === name &&\n    state.adaptors.helpers?.adaptor?.adaptorVersion === version\n  );\n}\n\nexport function selectAdaptorFetchingHelpers(state) {\n  return state.adaptors.helpers?.fetchingHelpers;\n}\n\nexport function selectAdaptorRequested(state, adaptorKey) {\n  return state.adaptors.onDemandItems[adaptorKey]?.requested;\n}\n\n// Triggers\n// ========\n\nexport function findTrigger(state, identifier) {\n  return Object.values(state.triggers.items).find(\n    ({ slug, id }) => identifier === slug || identifier === id\n  );\n}\n\nexport function selectTriggers(state) {\n  return state.triggers.items;\n}\n\n// Credentials\n// ==========\nexport function findCredential(state, identifier) {\n  return Object.values(state.credentials.items).find(\n    ({ slug, id }) => identifier === slug || identifier === id\n  );\n}\n\nexport function selectCredentials(state) {\n  return state.credentials.items;\n}\n\n// Helpers\n// =======\nexport function selectHelpers(state) {\n  return state.adaptors.helpers.adaptor || [];\n}\n\n// Jobs\n// =====\nexport function selectJobError(state) {\n  return state.jobs.error;\n}\n\n// Users\n// =====\nexport function selectUsers(state) {\n  return state.users.items;\n}\n\nexport function selectCurrentUser(state) {\n  return selectUsers(state)[state.auth.currentUserId];\n}\n\nexport function selectAuth(state) {\n  return state.auth;\n}\n\nexport function selectNotifications(state) {\n  return state.notifications.items;\n}\n\n// Projects\n// =======\nexport function selectCurrentProject(state, projectId) {\n  return (\n    state.projects.items[projectId] || {\n      name: 'Projects',\n    }\n  );\n}\n\nexport function selectProjects(state) {\n  return state.projects.items;\n}\n\nexport function selectScopedProject(state) {\n  return state.menu.scopedProject;\n}\n\nexport function findProject(state, identifier) {\n  return Object.values(state.projects.items).find(\n    ({ slug, id }) => identifier === slug || identifier === id\n  );\n}\n\n// BlogPosts\n// =========\n\nexport function selectBlogPosts(state) {\n  const blogPosts = state.blogPosts.items\n    .map(p => ({\n      ...p,\n      pubDate: new Date(p.pubDate),\n    }))\n    .slice(0, 6);\n  const loading = state.blogPosts.isLoading;\n  return { blogPosts, loading };\n}\n","import React from 'react';\nimport {\n  Button,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Typography,\n} from '@material-ui/core';\nimport PropTypes from 'prop-types';\nimport { useHistory } from 'react-router-dom';\nimport { linkTo } from '../helpers';\n\nfunction ActivationModal({ open, onClose }) {\n  const history = useHistory();\n\n  const onVerificationRequiredPage =\n    history?.location?.pathname === '/activation_required';\n\n  return (\n    <Dialog open={open && !onVerificationRequiredPage} onClose={onClose}>\n      <DialogTitle>Email confirmation required.</DialogTitle>\n      <DialogContent>\n        <Typography>\n          Please confirm your email address by clicking the link that was sent\n          to you by support@openfn.org.\n          <br />\n          <br />\n          If the email address associated with your Open Function account is not\n          valid, please change it on the account settings page. We may need to\n          send you critical information about your integrations. Accounts with\n          unconfirmed emails will not be able to access their projects after 2\n          days.\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={linkTo('/account', history)} color=\"primary\">\n          Account Settings\n        </Button>\n        <Button\n          id=\"acknowledge\"\n          onClick={onClose}\n          color=\"primary\"\n          autoFocus=\"autoFocus\"\n        >\n          OK, I understand.\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n}\n\nActivationModal.propTypes = {\n  open: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n};\n\nexport default React.memo(ActivationModal);\n","import React from 'react';\nimport Avatar from '@material-ui/core/Avatar';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Typography from '@material-ui/core/Typography';\nimport {\n  Security as SecurityIcon,\n  VerifiedUser as VerifiedUserIcon,\n} from '@material-ui/icons';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { isEqual } from 'lodash';\nimport { resendConfirmationLink } from '../actions/UserActions';\nimport OneCardHolder from './OneCardHolder';\n\nfunction ActivationRequired() {\n  const dispatch = useDispatch();\n\n  const currentUser = useSelector(\n    state => state.users.items[state.auth.currentUserId],\n    isEqual\n  );\n\n  return (\n    <OneCardHolder>\n      <Card style={{ marginTop: '4em', marginBottom: '4em' }}>\n        <CardHeader\n          title=\"Verification Required\"\n          avatar={\n            <Avatar>\n              <SecurityIcon />\n            </Avatar>\n          }\n        />\n        <CardContent>\n          <Typography variant=\"subtitle1\">\n            <b>\n              <em>Please check your email.</em>\n            </b>{' '}\n            We need to verify your account before you continue for one of three\n            reasons:\n          </Typography>\n          <br />\n\n          <Typography>\n            (1) Occasionally, we require re-verification for security reasons.\n            Usually it&apos;s because you{' '}\n            <b>haven&apos;t logged in for a while</b>.\n          </Typography>\n          <br />\n          <Typography>\n            (2) If you&apos;ve got access to a <b>project that requires MFA</b>{' '}\n            you will need to verify each login attempt via email.\n          </Typography>\n          <br />\n          <Typography>\n            (3) If you&apos;re <b>new to the platform</b>, we need to associate\n            your account with a valid email address. You should have received an\n            initial verification link in your &quot;Welcome to OpenFn&quot;\n            email. Please check for that email and click the link inside. If you\n            can&apos;t find your activation email, you can request a new one\n            below.\n          </Typography>\n          <br />\n          <Typography>\n            <em>\n              If you no longer have access to this email address, please contact\n              security@openfn.org and we can help you regain access to your\n              account.\n            </em>\n          </Typography>\n        </CardContent>\n        <CardActions>\n          <Button\n            variant=\"contained\"\n            id=\"send-verification-link\"\n            onClick={() => dispatch(resendConfirmationLink(currentUser))}\n          >\n            I didn&apos;t get an email, send another link.\n          </Button>\n        </CardActions>\n      </Card>\n    </OneCardHolder>\n  );\n}\n\nexport default ActivationRequired;\n","import Divider from '@material-ui/core/Divider';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Search as SearchIcon } from '@material-ui/icons';\nimport BuildIcon from '@material-ui/icons/Build';\nimport CloudDownloadIcon from '@material-ui/icons/CloudDownload';\nimport CodeIcon from '@material-ui/icons/Code';\nimport DashboardIcon from '@material-ui/icons/Dashboard';\nimport FingerprintIcon from '@material-ui/icons/Fingerprint';\nimport FlashOnIcon from '@material-ui/icons/FlashOn';\nimport HistoryIcon from '@material-ui/icons/History';\nimport HomeIcon from '@material-ui/icons/Home';\nimport InboxIcon from '@material-ui/icons/Inbox';\nimport InsertChartIcon from '@material-ui/icons/InsertChart';\nimport LibraryBooksIcon from '@material-ui/icons/LibraryBooks';\nimport LinearScaleIcon from '@material-ui/icons/LinearScale';\nimport ListAltIcon from '@material-ui/icons/ListAlt';\nimport PublicIcon from '@material-ui/icons/Public';\nimport QuestionAnswerIcon from '@material-ui/icons/QuestionAnswer';\nimport SecurityIcon from '@material-ui/icons/Security';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport SettingsEthernetIcon from '@material-ui/icons/SettingsEthernet';\nimport TuneIcon from '@material-ui/icons/Tune';\nimport VpnKeyIcon from '@material-ui/icons/VpnKey';\nimport clsx from 'clsx';\nimport React, { useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { linkTo } from '../helpers';\nimport {\n  credentialsPath,\n  projectAccessPath,\n  projectCredentialsPath,\n  projectDownloadsPath,\n  projectProjectRepoConnectionsPath,\n  projectJobsPath,\n  projectReceiptsPath,\n  projectRunsPath,\n  projectSearchConsolePath,\n  projectSettingsPath,\n  projectsPath,\n  projectTriggersPath,\n} from '../helpers/pathHelpers';\n\nconst styles = theme => ({\n  warning: {\n    color: `${theme.palette.warning.light} !important`,\n  },\n  overLimit: {\n    color: `${theme.palette.error.light} !important`,\n  },\n  categoryHeader: {\n    paddingTop: theme.spacing(1.5),\n  },\n  categoryHeaderPrimary: {\n    color: 'rgba(255, 255, 255, 0.7)',\n  },\n  item: {\n    paddingTop: 1,\n    paddingBottom: 1,\n    color: 'rgba(255, 255, 255, 0.7)',\n    '&:hover,&:focus': {\n      backgroundColor: 'rgba(255, 255, 255, 0.08)',\n    },\n  },\n  itemCategory: {\n    backgroundColor: '#232f3e',\n    boxShadow: '0 -1px 0 #404854 inset',\n    paddingTop: theme.spacing(1.5),\n    paddingBottom: theme.spacing(1.5),\n  },\n  itemActiveItem: {\n    color: theme.palette.primary.main,\n  },\n  itemPrimary: {\n    fontSize: 'inherit',\n  },\n  itemIcon: {\n    minWidth: 'auto',\n    marginRight: theme.spacing(3),\n    marginBottom: theme.spacing(0.5),\n  },\n  hIcon: {\n    color: 'rgba(255, 255, 255, 0.7)',\n    minWidth: 'auto',\n    marginRight: theme.spacing(3),\n    marginBottom: 1,\n  },\n  divider: {\n    marginTop: theme.spacing(2),\n  },\n});\n\nfunction AppDrawer(props) {\n  const history = useHistory();\n\n  const { classes, overLimit, selectedMenuKey, selectedProject, usageWarning } =\n    props;\n\n  const categories = [\n    {\n      id: 'Build',\n      children: [\n        {\n          id: 'Jobs',\n          icon: <SettingsEthernetIcon />,\n          target: projectJobsPath(selectedProject),\n        },\n        {\n          id: 'Triggers',\n          icon: <FlashOnIcon />,\n          target: projectTriggersPath(selectedProject),\n        },\n        {\n          id: 'Credentials',\n          icon: <VpnKeyIcon />,\n          target: projectCredentialsPath(selectedProject),\n        },\n      ],\n      hIcon: <BuildIcon />,\n    },\n    {\n      id: 'Audit',\n      children: [\n        {\n          id: 'Inbox',\n          icon: <InboxIcon />,\n          target: projectReceiptsPath(selectedProject),\n        },\n        {\n          id: 'Activity History',\n          icon: <HistoryIcon />,\n          target: projectRunsPath(selectedProject),\n        },\n        {\n          id: 'Search Console',\n          icon: <SearchIcon />,\n          target: projectSearchConsolePath(selectedProject),\n        },\n      ],\n      hIcon: <ListAltIcon />,\n    },\n    {\n      id: 'Manage',\n      children: [\n        {\n          id: 'Version Control',\n          icon: <LinearScaleIcon />,\n          target: projectProjectRepoConnectionsPath(selectedProject),\n        },\n        {\n          id: 'Access & Security',\n          icon: <SecurityIcon />,\n          target: projectAccessPath(selectedProject),\n        },\n        {\n          id: 'Project Settings',\n          icon: <TuneIcon />,\n          target: projectSettingsPath(selectedProject),\n        },\n        {\n          id: 'Downloads',\n          icon: <CloudDownloadIcon />,\n          target: projectDownloadsPath(selectedProject),\n        },\n      ],\n      hIcon: <SettingsIcon />,\n    },\n  ];\n\n  const generalLinks = [\n    {\n      id: 'General',\n      children: [\n        {\n          id: 'Project Dashboard',\n          icon: <DashboardIcon />,\n          target: projectsPath(),\n        },\n        {\n          id: 'My Credentials',\n          icon: <VpnKeyIcon />,\n          target: credentialsPath(),\n        },\n        {\n          id: 'Documentation',\n          icon: <LibraryBooksIcon />,\n          action: () => window.open('https://docs.openfn.org/', '_blank'),\n        },\n        {\n          id: 'Community Forum',\n          icon: <QuestionAnswerIcon />,\n          action: () => window.open('https://community.openfn.org', '_blank'),\n        },\n        {\n          id: 'GitHub',\n          icon: <CodeIcon />,\n          action: () => window.open('https://github.com/OpenFn', '_blank'),\n        },\n        {\n          id: 'Live Status',\n          icon: <InsertChartIcon />,\n          action: () => window.open('https://status.openfn.org', '_blank'),\n        },\n      ],\n      hIcon: <PublicIcon />,\n    },\n    {\n      id: `${window.IS_OTP ? 'OTP ' : ''}Version ${window.OFN_VERSION}`,\n      children: [\n        { id: window.location.hostname, icon: <HomeIcon />, target: '/' },\n      ],\n      hIcon: <FingerprintIcon />,\n    },\n  ];\n\n  return (\n    <List disablePadding id=\"app-drawer\">\n      {selectedProject.id &&\n        categories.map(({ id, children, hIcon }, i) => (\n          <React.Fragment key={id}>\n            {i !== 0 && <Divider className={classes.divider} />}\n            <ListItem disabled className={classes.categoryHeader}>\n              <ListItemIcon className={classes.hIcon}>{hIcon}</ListItemIcon>\n              <ListItemText\n                classes={{\n                  primary: classes.categoryHeaderPrimary,\n                }}\n              >\n                {id}\n              </ListItemText>\n            </ListItem>\n            {children.map(({ id: childId, icon, target }) => (\n              <ListItem\n                id={childId}\n                key={childId}\n                button\n                onClick={linkTo(target, history)}\n                className={clsx(\n                  classes.item,\n                  selectedMenuKey === childId && classes.itemActiveItem,\n                  childId === 'Project Settings' &&\n                    ((usageWarning && !overLimit && classes.warning) ||\n                      (overLimit && classes.overLimit))\n                )}\n              >\n                <ListItemIcon className={classes.itemIcon}>{icon}</ListItemIcon>\n                <ListItemText\n                  classes={{\n                    primary: classes.itemPrimary,\n                  }}\n                >\n                  {childId}\n                </ListItemText>\n              </ListItem>\n            ))}\n          </React.Fragment>\n        ))}\n      {generalLinks.map(({ id, children, hIcon }) => (\n        <React.Fragment key={id}>\n          {selectedProject.id && <Divider className={classes.divider} />}\n          <ListItem\n            disabled\n            className={classes.categoryHeader}\n            id={`category-${id}`}\n          >\n            <ListItemIcon className={classes.hIcon}>{hIcon}</ListItemIcon>\n            <ListItemText\n              classes={{\n                primary: classes.categoryHeaderPrimary,\n              }}\n            >\n              {id}\n            </ListItemText>\n          </ListItem>\n          {children.map(({ id: childId, icon, target, action, disabled }) => (\n            <ListItem\n              key={childId}\n              button\n              disabled={disabled}\n              onClick={target ? linkTo(target, history) : action}\n              className={clsx(\n                classes.item,\n                selectedMenuKey === childId && classes.itemActiveItem\n              )}\n            >\n              <ListItemIcon className={classes.itemIcon}>{icon}</ListItemIcon>\n              <ListItemText\n                classes={{\n                  primary: classes.itemPrimary,\n                }}\n              >\n                {childId}\n              </ListItemText>\n            </ListItem>\n          ))}\n        </React.Fragment>\n      ))}\n    </List>\n  );\n}\n\nexport default withStyles(styles, { withTheme: true })(AppDrawer);\n","import { camelizeKeys, decamelizeKeys } from 'humps';\nimport { CHANGING_PLAN, PLAN_CHANGED, PLAN_CHANGE_FAILED } from '../constants';\nimport { postChangePlanPath } from '../helpers/actionsPathHelpers';\nimport Notifications from './Notifications';\nimport * as UserActions from './UserActions';\nimport { post } from '../clients/BaseClient';\n\nfunction changingPlan({ stripeToken, planId }) {\n  return { type: CHANGING_PLAN, stripeToken, planId };\n}\n\nfunction planChanged({ project }) {\n  return { type: PLAN_CHANGED, project };\n}\n\nfunction planChangeFailed(error) {\n  return { type: PLAN_CHANGE_FAILED, error };\n}\n\nfunction planChangeSuccess() {\n  return Notifications.add('Plan succesfully changed.', 'success');\n}\n\nfunction planChangeFailure() {\n  return Notifications.add(\n    'Plan change failed. Please refresh the page.',\n    'danger'\n  );\n}\n\nfunction postChangePlan(attrs) {\n  const payload = decamelizeKeys(attrs);\n\n  return post(postChangePlanPath(attrs), payload)\n    .then(async response => camelizeKeys(await response.json()))\n    .catch(error => Promise.reject(error));\n}\n\nexport function changePlan({ projectId, planId }) {\n  return dispatch => {\n    dispatch(changingPlan({ id: projectId, planId }));\n\n    return postChangePlan({ id: projectId, planId })\n      .then(project => {\n        dispatch(planChanged({ project }));\n        dispatch(planChangeSuccess());\n      })\n      .catch(error => {\n        dispatch(planChangeFailed(error));\n        dispatch(planChangeFailure());\n      });\n  };\n}\n\n// Change Credit Card\n// ==================\n// Send number, cvc and expiry to Stripe.\nfunction createCardToken({ number, cvc, expiry }) {\n  return new Promise((resolve, reject) => {\n    Stripe.card.createToken(\n      { number, cvc, exp: expiry },\n      (status, response) => {\n        if (status === 200) {\n          resolve(response);\n        } else {\n          reject(response);\n        }\n      }\n    );\n  });\n}\n\n// Using the token we get from Stripe, we send that to the card change API\n// on UserActions.\nexport function changeDefaultCard(cardDetails) {\n  return dispatch => {\n    return createCardToken(cardDetails).then(stripeToken =>\n      UserActions.assignDefaultCard(stripeToken)(dispatch)\n    );\n  };\n}\n\n// Change Current Plan\n// ===================\nexport function changeRejected() {\n  return { type: 'CHANGE_REJECTED' };\n}\n\nexport function changeConfirmed() {\n  return { type: 'CHANGE_CONFIRMED' };\n}\n\n// confirmChange: { projectId, planID }\nexport function confirmChange(changeDetails) {\n  return dispatch => {\n    dispatch(changeConfirmed());\n    changePlan(changeDetails)(dispatch);\n  };\n}\n\n// TODO: start of a conversation around error handling.\n// We don't do much around this, and below is a piece of many approaches.\n// We definitely need for 'caught' promises to return a rejected promise,\n// in order for error handling to be dealt with at each desired point.\nexport function APIError(message) {\n  this.name = 'APIError';\n  this.message = message || 'Default Message';\n  this.stack = new Error().stack;\n}\nAPIError.prototype = Object.create(Error.prototype);\nAPIError.prototype.constructor = APIError;\n","import { camelizeKeys } from 'humps';\nimport {\n  FETCHING_PLANS,\n  PLANS_FETCH_FAILED,\n  PLANS_RECEIVED,\n} from '../constants';\nimport { plansApiPath } from '../helpers/actionsPathHelpers';\nimport { get } from '../clients/BaseClient';\n\nfunction fetchingPlans() {\n  return { type: FETCHING_PLANS };\n}\n\nfunction plansReceived(plans) {\n  return { type: PLANS_RECEIVED, plans };\n}\n\nfunction plansFetchFailed(error) {\n  return { type: PLANS_FETCH_FAILED, error };\n}\n\nexport function fetchPlans() {\n  return dispatch => {\n    dispatch(fetchingPlans());\n\n    return getPlans()\n      .then(plans => dispatch(plansReceived(plans)))\n      .catch(error => dispatch(plansFetchFailed(error)));\n  };\n}\n\nfunction getPlans() {\n  return get(plansApiPath())\n    .then(async response => {\n      const data = camelizeKeys(await response.json());\n      return data.plans;\n    })\n    .catch(error => {\n      return Promise.reject(error);\n    });\n}\n","import React, { useState } from 'react';\nimport {\n  FormControl,\n  FormHelperText,\n  Hidden,\n  IconButton,\n  Input,\n  InputAdornment,\n  InputLabel,\n  TextField,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Visibility, VisibilityOff } from '@material-ui/icons';\n\nconst useStyles = makeStyles(theme => ({\n  textField: {\n    marginTop: theme.spacing(2),\n    marginBottom: theme.spacing(2),\n    minWidth: 120,\n  },\n  helperText: {\n    marginTop: -theme.spacing(2),\n  },\n  code: {\n    fontFamily: theme.typography.codeFont,\n    fontSize: '110%',\n  },\n}));\n\nfunction TextInput({\n  input,\n  label,\n  fullWidth,\n  multiline,\n  area,\n  hidden,\n  monospace,\n  instant,\n  name,\n  id,\n  meta: { touched, error, dirtySinceLastSubmit, submitError },\n  ...custom\n}) {\n  const classes = useStyles();\n\n  const [showPassword, setShowPassword] = useState(false);\n\n  const handleClickShowPassword = () => {\n    setShowPassword(!showPassword);\n  };\n\n  const getSubmitErrorMessage = error => [].concat(error?.message)?.join(';');\n\n  const { value, type } = input;\n\n  const isRaw = typeof value === 'object';\n\n  const textValue = isRaw ? JSON.stringify(value) : value;\n\n  const showError =\n    (submitError && !dirtySinceLastSubmit) || (error && touched);\n\n  return (\n    <Hidden xsUp={hidden} implementation=\"css\">\n      {type === 'password' ? (\n        <FormControl>\n          <InputLabel htmlFor={id}>{label}</InputLabel>\n          <Input\n            id={id || name}\n            className={classes.textField}\n            fullWidth={fullWidth}\n            error={showError}\n            endAdornment={\n              <InputAdornment position=\"end\">\n                <IconButton\n                  aria-label=\"toggle password visibility\"\n                  onClick={handleClickShowPassword}\n                >\n                  {showPassword ? <Visibility /> : <VisibilityOff />}\n                </IconButton>\n              </InputAdornment>\n            }\n            {...input}\n            {...custom}\n            type={showPassword ? 'text' : 'password'}\n            value={textValue}\n            inputProps={{\n              'aria-label':\n                typeof label === 'object' ? input.name.toLowerCase() : label,\n              role: 'textbox',\n            }}\n          />\n          {showError && (\n            <FormHelperText className={classes.helperText} error={showError}>\n              {error || getSubmitErrorMessage(submitError)}\n            </FormHelperText>\n          )}\n        </FormControl>\n      ) : (\n        <TextField\n          id={id || name}\n          className={classes.textField}\n          label={label}\n          fullWidth={fullWidth}\n          onBlur={event => input.onBlur(event)}\n          helperText={\n            showError ? error || getSubmitErrorMessage(submitError) : undefined\n          }\n          error={showError}\n          multiline={isRaw || multiline}\n          InputProps={{\n            classes: { input: monospace && classes.code },\n          }}\n          inputProps={{\n            'aria-label':\n              typeof label === 'object' ? input.name.toLowerCase() : label,\n          }}\n          {...input}\n          {...custom}\n          type={type}\n          value={textValue}\n        />\n      )}\n    </Hidden>\n  );\n}\n\nexport default React.memo(TextInput);\n","import React, { useState, useEffect } from 'react';\nimport {\n  Avatar,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Grid,\n  Table,\n  TableBody,\n  TableHead,\n  TableCell,\n  TableRow,\n  Tooltip,\n  Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  CreditCard as CreditCardIcon,\n  Help as HelpIcon,\n} from '@material-ui/icons';\nimport { FORM_ERROR } from 'final-form';\nimport { isEqual } from 'lodash';\nimport Payment from 'payment';\nimport Cards from 'react-credit-cards';\nimport 'react-credit-cards/es/styles-compiled.css';\nimport { Field, Form } from 'react-final-form';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { APIError, changeDefaultCard } from '../actions/BillingActions';\nimport { fetchPlans } from '../actions/PlanActions';\nimport { getCurrentUser } from '../actions/SessionActions';\nimport {\n  cardChangeFinished,\n  cardChangeRequested,\n} from '../actions/UserActions';\nimport { calendarTime, linkTo } from '../helpers';\nimport { projectSettingsPath, projectsPath } from '../helpers/pathHelpers';\nimport { selectCurrentUser, selectProjects } from '../selectors';\nimport TextInput from './FormHelpers/TextInput';\nimport OneCardHolder from './OneCardHolder';\n\n// When a user already has card details, we put them in the placeholder\n// fields on the form. Since they are more for display purposes than changes.\nfunction createPlaceholders({ last4, expMonth, expYear, brand, email }) {\n  return {\n    article: brand === 'American Express' ? 'an' : 'a',\n    brand,\n    current: last4 ? `card ending in ${last4}` : '',\n    cvc: last4 ? 'XXX' : '123',\n    email,\n    exp: expMonth && expYear ? `${expMonth} / ${expYear}` : 'MM / YY',\n    number: last4 ? `XXXX XXXX XXXX ${last4}` : '',\n  };\n}\n\nconst useStyles = makeStyles(theme => ({\n  gray: {\n    backgroundColor: theme.palette.divider,\n  },\n  clickable: {\n    cursor: 'pointer',\n  },\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  error: {\n    color: 'red',\n  },\n}));\n\nconst validate = ({ number, cvc, exp }) => {\n  const errors = {};\n  if (number) {\n    if (!Stripe.card.validateCardNumber(number.replace(/\\s/g, ''))) {\n      errors.number = 'Invalid card number';\n    }\n  }\n  if (exp) {\n    if (!Stripe.card.validateExpiry(exp.replace(/\\s/g, ''))) {\n      errors.exp = 'Invalid expiry';\n    }\n  }\n  if (!Stripe.card.validateCVC(cvc)) {\n    errors.cvc = 'Invalid CVC number';\n  }\n  return errors;\n};\n\nconst cardIcons = {\n  Visa: 'fab fa-cc-visa fa-lg',\n  'American Express': 'fab fa-cc-amex fa-lg',\n  MasterCard: 'fab fa-cc-mastercard fa-lg',\n  Discover: 'fab fa-cc-discover fa-lg',\n  JCB: 'fab fa-cc-jcb fa-lg',\n  'Diners Club': 'fab fa-cc-diners-club fa-lg',\n  Unknown: 'fab fa-credit-card fa-lg',\n};\n\nfunction CreditCardForm() {\n  const classes = useStyles();\n  const [focused, setFocused] = useState('number');\n  const history = useHistory();\n  const dispatch = useDispatch();\n\n  const currentUser = useSelector(selectCurrentUser);\n  const projectItems = useSelector(selectProjects, isEqual);\n  const projects = Object.keys(projectItems).map(id => projectItems[id]);\n  const ownedInboxes = (projects || []).filter(i => i.userRole === 'owner');\n  const plans = useSelector(state => state.plans.items, isEqual);\n  const isLoading = !currentUser;\n  const showCardChangeModal = useSelector(state => state.users.changingCard);\n\n  const submit = ({ number, exp, cvc }) => {\n    const payload = {\n      number: number.replace(/ /g, ''),\n      expiry: exp.replace(/ /g, ''),\n      cvc,\n    };\n\n    return new Promise(resolve => {\n      dispatch(changeDefaultCard(payload))\n        .then(() => {\n          resolve();\n        })\n        .catch(error => {\n          if (error instanceof APIError) {\n            resolve({\n              openFnError: \"We couldn't process that.\",\n            });\n          }\n          resolve({\n            stripeError: \"Stripe didn't accept that.\",\n          });\n        });\n    });\n  };\n\n  const handleFocus = e => {\n    setFocused(e.target.name);\n  };\n\n  const handleModalExit = () => {\n    setFocused('number');\n  };\n\n  useEffect(() => {\n    document.title = 'Billing - OpenFn';\n    dispatch(fetchPlans());\n  }, [dispatch]);\n\n  useEffect(() => {\n    dispatch(getCurrentUser());\n  }, [showCardChangeModal, dispatch]);\n\n  useEffect(() => {\n    Payment.formatCardNumber(document.querySelector('[name=\"number\"]') || '');\n    Payment.formatCardExpiry(document.querySelector('[name=\"exp\"]') || '');\n    Payment.formatCardCVC(document.querySelector('[name=\"cvc\"]') || '');\n  });\n\n  if (isLoading) {\n    return <div />;\n  }\n\n  const placeholders = createPlaceholders(currentUser);\n\n  const cardStyle = cardIcons[placeholders.brand];\n\n  return (\n    <OneCardHolder>\n      <Card className={classes.card} id=\"billing-card\">\n        <CardHeader\n          title=\"Billing\"\n          subheader={placeholders.email}\n          avatar={\n            <Avatar className={classes.avatar}>\n              <CreditCardIcon />\n            </Avatar>\n          }\n        />\n        <CardContent className={classes.gray} id=\"billing-card-article\">\n          <Typography>\n            {placeholders.current\n              ? `This account is linked to ${placeholders.article} `\n              : 'There is no valid credit card associated with this account.'}\n            {placeholders.current && (\n              <span>\n                <i className={cardStyle} /> {placeholders.current}. It expires{' '}\n                {placeholders.exp}.\n              </span>\n            )}\n          </Typography>\n        </CardContent>\n        <CardContent id=\"billed-projects-container\">\n          <Typography variant=\"h6\">Projects billed to your account</Typography>\n          <Table id=\"billed-projects-table\">\n            <TableHead>\n              <TableRow>\n                <TableCell>Project</TableCell>\n                <TableCell>Plan</TableCell>\n                <TableCell>\n                  Amount&nbsp;\n                  <Tooltip title=\"List prices shown. Always refer to your invoices for exact charges.\">\n                    <HelpIcon fontSize=\"inherit\" />\n                  </Tooltip>\n                </TableCell>\n                <TableCell>Billing Date</TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {ownedInboxes.map(ownedInbox => (\n                <TableRow\n                  id={ownedInbox.id}\n                  hover\n                  key={ownedInbox.id}\n                  className={classes.clickable}\n                  onClick={linkTo(projectSettingsPath(ownedInbox), history)}\n                >\n                  <TableCell id=\"project-name\">{ownedInbox.name}</TableCell>\n                  <TableCell id=\"project-plan\">\n                    {plans[ownedInbox.planId]\n                      ? plans[ownedInbox.planId].label\n                      : null}\n                  </TableCell>\n                  <TableCell id=\"project-plan-price\">\n                    $\n                    {plans[ownedInbox.planId]\n                      ? plans[ownedInbox.planId].price / 100\n                      : null}\n                  </TableCell>\n                  <TableCell id=\"project-billing-period-end\">\n                    {calendarTime(ownedInbox.billingPeriodEnd)}\n                  </TableCell>\n                </TableRow>\n              ))}\n            </TableBody>\n          </Table>\n        </CardContent>\n        <CardActions>\n          <Button\n            id=\"projects-home-btn\"\n            onClick={linkTo(projectsPath(), history)}\n          >\n            Projects Home\n          </Button>\n          <Button\n            id=\"change-add-card-btn\"\n            onClick={() => dispatch(cardChangeRequested(placeholders.current))}\n          >\n            {placeholders.current ? 'Change' : 'Add'} Card\n          </Button>\n        </CardActions>\n      </Card>\n      <Dialog\n        id=\"change-card-dialog\"\n        open={showCardChangeModal}\n        onClose={() => dispatch(cardChangeFinished())}\n        TransitionProps={{ onExited: handleModalExit }}\n      >\n        <Form\n          onSubmit={submit}\n          validate={validate}\n          render={({\n            handleSubmit,\n            submitting,\n            invalid,\n            dirtySinceLastSubmit,\n            pristine,\n            values,\n            submitErrors,\n          }) => (\n            <div>\n              <DialogTitle>\n                {placeholders.current ? 'Change' : 'Add'} card for{' '}\n                <b>{placeholders.email}</b>\n              </DialogTitle>\n              <DialogContent>\n                <Cards\n                  name=\"My Credit Card\"\n                  number={values.number || placeholders.number}\n                  expiry={values.exp || placeholders.exp}\n                  cvc={values.cvc || placeholders.cvc}\n                  focused={focused}\n                />\n                <form onSubmit={handleSubmit} id=\"credit-card-form\">\n                  <Grid container spacing={2} justifyContent=\"space-between\">\n                    <Grid item xs={12}>\n                      <Field\n                        name=\"number\"\n                        fullWidth\n                        label=\"Card Number\"\n                        component={TextInput}\n                        type=\"tel\"\n                        placeholder={placeholders.number}\n                        onFocus={handleFocus}\n                      />\n                    </Grid>\n                    <Grid item xs={12} sm={6}>\n                      <Field\n                        name=\"exp\"\n                        fullWidth\n                        label=\"Expiration Date\"\n                        component={TextInput}\n                        placeholder={placeholders.exp}\n                        onFocus={handleFocus}\n                      />\n                    </Grid>\n                    <Grid item xs={12} sm={6}>\n                      <Field\n                        name=\"cvc\"\n                        fullWidth\n                        label=\"CVC\"\n                        component={TextInput}\n                        type=\"tel\"\n                        placeholder={placeholders.cvc}\n                        onFocus={handleFocus}\n                      />\n                    </Grid>\n                  </Grid>\n                  {submitErrors && !dirtySinceLastSubmit && (\n                    <Typography className={classes.error}>\n                      {submitErrors.openFnError || submitErrors.stripeError}{' '}\n                      <br />\n                      Please double check your card details or contact OpenFn.\n                    </Typography>\n                  )}\n                </form>\n              </DialogContent>\n              <DialogActions>\n                <Button\n                  id=\"save-btn\"\n                  onClick={handleSubmit}\n                  disabled={\n                    submitting || pristine || (invalid && !dirtySinceLastSubmit)\n                  }\n                >\n                  {submitting ? (\n                    <i className=\"fas fa-circle-notch fa-lg fa-spin\" />\n                  ) : (\n                    'Save'\n                  )}\n                </Button>\n              </DialogActions>\n            </div>\n          )}\n        />\n      </Dialog>\n    </OneCardHolder>\n  );\n}\n\nexport default CreditCardForm;\n","import { camelizeKeys } from 'humps';\nimport { omit } from 'lodash';\nimport { normalize, schema } from 'normalizr';\nimport {\n  credentialAccessToggleApiPath,\n  credentialApiPath,\n  credentialsApiPath,\n} from '../helpers/actionsPathHelpers';\nimport { Credential } from '../schemas';\nimport { del, get, post, put } from './BaseClient';\n\nexport function handleResponse(data) {\n  return normalize(camelizeKeys(data), new schema.Array(Credential));\n}\n\nexport async function getCredentials(query) {\n  query = Object.fromEntries(Object.entries(query).filter(([_k, v]) => v));\n  const response = await get(credentialsApiPath(), query);\n\n  return handleResponse(await response.json());\n}\n\nfunction handleRawBodies(data) {\n  if (['palantir', 'caleuche', 'sikuli', 'raw'].includes(data.adaptor)) {\n    return { ...camelizeKeys(omit(data, 'body')), body: data.body };\n  }\n  return camelizeKeys(data);\n}\n\nexport async function getCredential(credential) {\n  const response = await get(credentialApiPath(credential));\n\n  return normalize(handleRawBodies(await response.json()), Credential);\n}\n\nfunction prepBody(rawBody) {\n  return typeof rawBody == 'string' ? JSON.parse(rawBody) : rawBody;\n}\n\nexport async function putCredential(credential, transferTarget) {\n  const payload = {\n    credential: {\n      adaptor: credential.adaptor,\n      body: prepBody(credential.body),\n      deleted: credential.deleted,\n      external_id: credential.externalId,\n      name: credential.name,\n      project_id: credential.projectId,\n      user_id: credential.userId,\n    },\n    target: transferTarget,\n  };\n\n  const response = await put(credentialApiPath(credential), payload);\n  return normalize(handleRawBodies(await response.json()), Credential);\n}\n\nexport async function destroyCredential(credential) {\n  return await del(credentialApiPath(credential));\n}\n\nexport async function postCredential(credential) {\n  const payload = {\n    credential: {\n      adaptor: credential.adaptor,\n      body: prepBody(credential.body),\n      deleted: credential.deleted,\n      external_id: credential.externalId,\n      name: credential.name,\n      project_id: credential.projectId,\n      user_id: credential.userId,\n    },\n  };\n\n  const response = await post(credentialsApiPath(), payload);\n  return normalize(handleRawBodies(await response.json()), Credential);\n}\n\nexport async function changeProjectCredential(credential, projectId) {\n  const response = await put(credentialAccessToggleApiPath(credential), {\n    project_id: projectId,\n  });\n  return normalize(handleRawBodies(await response.json()), Credential);\n}\n","import {\n  changeProjectCredential,\n  destroyCredential,\n  getCredential,\n  getCredentials,\n  postCredential,\n  putCredential,\n} from '../clients/CredentialClient';\nimport {\n  CREATING_CREDENTIAL,\n  CREDENTIALS_FAILURE,\n  CREDENTIALS_REQUEST,\n  CREDENTIALS_SUCCESS,\n  CREDENTIAL_FAILURE,\n  CREDENTIAL_INVALID,\n  CREDENTIAL_SHARE_INVALID,\n  CREDENTIAL_SUCCESS,\n} from '../constants';\nimport { UnprocessableEntity } from '../errors';\nimport { clickEvent } from '../helpers';\nimport Notifications from './Notifications';\n\nexport function fetchCredentials(query) {\n  return {\n    promise: getCredentials(query),\n    types: [CREDENTIALS_REQUEST, CREDENTIALS_SUCCESS, CREDENTIALS_FAILURE],\n  };\n}\n\n// Relies on the custom API middleware defined in ../middleware/api.js.\nfunction credentialCreated(payload) {\n  return { type: CREDENTIAL_SUCCESS, payload };\n}\n\nfunction credentialCreateFailed(error) {\n  return { type: CREDENTIAL_INVALID, error };\n}\n\nfunction credentialCreateSuccess() {\n  return Notifications.add('Credential created.', 'success');\n}\n\nfunction credentialDeleteSuccess() {\n  return Notifications.add('Credential deleted.', 'success');\n}\n\nfunction credentialToggled() {\n  return Notifications.add('Credential access updated.', 'success');\n}\n\nexport function fetchCredential(credential) {\n  return {\n    promise: getCredential(credential),\n    types: [CREDENTIALS_REQUEST, CREDENTIAL_SUCCESS, CREDENTIAL_FAILURE],\n  };\n}\n\nfunction credentialSuccess(payload) {\n  return { type: CREDENTIAL_SUCCESS, payload };\n}\n\nfunction credentialUpdateFailed(error) {\n  return { type: CREDENTIAL_INVALID, error };\n}\n\nfunction credentialTransferSuccess() {\n  return Notifications.add('Credential ownership transferred.', 'success');\n}\n\nfunction credentialTransferFailed() {\n  return Notifications.add(\n    'Ownership could not be transferred. Check the recipient email and ID.',\n    'error'\n  );\n}\n\nfunction credentialShareFailed() {\n  return Notifications.add(\n    'Credential share failed. This external ID is already in use.',\n    'error'\n  );\n}\n\nfunction credentialShareInvalid(error) {\n  return { type: CREDENTIAL_SHARE_INVALID, error };\n}\n\nexport function updateCredential(credential) {\n  return async dispatch => {\n    const payload = await putCredential(credential);\n    await dispatch(credentialSuccess(payload));\n    return payload;\n  };\n}\n\nexport function createCredential(credential) {\n  return async dispatch => {\n    dispatch({ type: CREATING_CREDENTIAL, credential });\n    const payload = await postCredential(credential);\n    await dispatch(credentialCreateSuccess());\n    await dispatch(credentialCreated(payload));\n    clickEvent('Adaptors', 'Created', credential.adaptor);\n  };\n}\n\nexport function deleteCredential(credential) {\n  return async dispatch => {\n    await destroyCredential(credential);\n\n    dispatch(credentialDeleteSuccess());\n  };\n}\n\nexport function transferCredential(credential, target) {\n  return async dispatch => {\n    await putCredential(credential, {\n      target_email: target.email,\n      target_id: target.userId,\n    });\n    dispatch(credentialTransferSuccess());\n  };\n}\n\nexport function toggleProjectCredential(credential, projectId) {\n  return async dispatch => {\n    dispatch({ type: CREDENTIALS_REQUEST, credential });\n    try {\n      const payload = await changeProjectCredential(credential, projectId);\n      dispatch(credentialSuccess(payload));\n      dispatch(credentialToggled());\n      return payload;\n    } catch (error) {\n      if (error instanceof UnprocessableEntity) {\n        dispatch(credentialShareInvalid(error));\n        dispatch(credentialShareFailed());\n      } else {\n        dispatch(credentialUpdateFailed(error));\n      }\n    }\n  };\n}\n","import { SCOPED_PROJECT, SWITCHED_MENU, UNSCOPED_PROJECT } from '../constants';\n\nexport function switchedMenu(key) {\n  return { type: SWITCHED_MENU, key };\n}\n\nexport function scopedProject(project) {\n  return { type: SCOPED_PROJECT, project };\n}\n\nexport function unscopedProject() {\n  return { type: UNSCOPED_PROJECT };\n}\n","import React from 'react';\nimport Masonry from 'react-masonry-css';\nimport { makeStyles } from '@material-ui/core/styles';\n\nconst useStyles = makeStyles(() => ({\n  grid: {\n    display: 'flex',\n    marginLeft: -30 /* gutter size offset */,\n    width: 'auto',\n    justifyContent: 'space-around',\n  },\n  gridColumn: {\n    paddingLeft: 30,\n    backgroundClip: 'padding-box',\n    '& > div': {\n      marginBottom: 30,\n    },\n  },\n}));\n\nfunction MasonryWrapper({ children, columnBreakpoints = null }) {\n  const classes = useStyles();\n\n  // Material-UI Breakpoints\n  // xs: 0,\n  // sm: 600,\n  // md: 960,\n  // lg: 1280,\n  // xl: 1920,\n\n  const breakpointColumnsObj = columnBreakpoints || {\n    default: 4,\n    600: 1,\n    1280: 2,\n    1920: 3,\n  };\n\n  return (\n    <Masonry\n      breakpointCols={breakpointColumnsObj}\n      className={classes.grid}\n      columnClassName={classes.gridColumn}\n    >\n      {children}\n    </Masonry>\n  );\n}\n\nexport default MasonryWrapper;\n","import {\n  Button,\n  Fab,\n  Hidden,\n  InputAdornment,\n  Menu,\n  Paper,\n  TextField,\n  Toolbar,\n  Tooltip,\n  Typography,\n} from '@material-ui/core/';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n  Add as AddIcon,\n  FilterList as FilterListIcon,\n  Search as SearchIcon,\n  SupervisorAccount as SupervisorAccountIcon,\n} from '@material-ui/icons';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport { validJson } from '../helpers';\n\nconst styles = theme => ({\n  root: {\n    flexGrow: 1,\n  },\n  flex: {\n    flex: 1,\n  },\n  filters: {\n    marginTop: theme.spacing(2),\n  },\n  filtersMenu: {\n    '& .MuiMenu-paper': {\n      padding: theme.spacing(2),\n    },\n  },\n  fab: {\n    position: 'fixed',\n    right: theme.spacing(1),\n    bottom: theme.spacing(1),\n    zIndex: 1000,\n    '& > *': {\n      margin: theme.spacing(1),\n    },\n  },\n  fabShift: {\n    position: 'fixed',\n    zIndex: 1000,\n    '& > *': {\n      margin: theme.spacing(1),\n    },\n    right: theme.spacing(10),\n    bottom: theme.spacing(1),\n  },\n  sectionFrame: {\n    marginTop: -25,\n    marginRight: -25,\n    marginLeft: -35,\n    marginBottom: 25,\n  },\n  search: {\n    paddingBottom: 10,\n    paddingLeft: 10,\n  },\n  noSearch: {\n    paddingLeft: 10,\n    paddingBottom: 10,\n    paddingTop: 10,\n    textAlign: 'right',\n  },\n  right: {\n    textAlign: 'right',\n  },\n});\n\nconst SearchTooltip = withStyles(theme => ({\n  tooltip: {\n    maxWidth: 500,\n  },\n}))(Tooltip);\n\nfunction SectionFrame(props) {\n  const [anchorEl, setAnchorEl] = React.useState(null);\n\n  const handleClick = event => {\n    setAnchorEl(event.currentTarget);\n  };\n\n  const handleClose = () => {\n    setAnchorEl(null);\n  };\n\n  const {\n    actions,\n    filters,\n    classes,\n    searchHeading,\n    create,\n    assign,\n    helper,\n    search,\n    searchText,\n    section,\n    jsonOnly,\n    onSearchFocus,\n    onSearchBlur,\n    onSearchKeyDown,\n    placeholder,\n  } = props;\n\n  const hasError = jsonOnly && searchText !== '' && !validJson(searchText);\n\n  return (\n    <div className={classes.sectionFrame}>\n      <Paper>\n        <Toolbar>\n          {search && (\n            <SearchTooltip\n              title={\n                searchHeading ? (\n                  <div>\n                    <b>{searchHeading}</b>\n                    <br />\n                    {helper}\n                  </div>\n                ) : (\n                  helper\n                )\n              }\n              disableHoverListener={!helper}\n            >\n              <TextField\n                id=\"search\"\n                label={`Search ${section}s`}\n                type=\"text\"\n                error={hasError}\n                className={classes.search}\n                onChange={search}\n                disabled={!search}\n                placeholder={placeholder}\n                margin=\"normal\"\n                InputProps={{\n                  startAdornment: (\n                    <InputAdornment position=\"start\">\n                      <SearchIcon color={hasError ? 'error' : 'inherit'} />\n                    </InputAdornment>\n                  ),\n                  onFocus: onSearchFocus,\n                  onBlur: onSearchBlur,\n                  onKeyDown: onSearchKeyDown,\n                }}\n                value={searchText || ''}\n              />\n            </SearchTooltip>\n          )}\n          <div className={classes.flex} />\n          <div className={clsx(search ? classes.right : classes.noSearch)}>\n            {filters && (\n              <Hidden lgUp>\n                <Button\n                  className={classes.filters}\n                  aria-controls=\"simple-menu\"\n                  aria-haspopup=\"true\"\n                  onClick={handleClick}\n                  startIcon={<FilterListIcon />}\n                >\n                  Filters\n                </Button>\n                <Menu\n                  id=\"simple-menu\"\n                  className={classes.filtersMenu}\n                  anchorEl={anchorEl}\n                  keepMounted\n                  open={Boolean(anchorEl)}\n                  onClose={handleClose}\n                >\n                  {filters}\n                  <br />\n                  <br />\n                  <Button onClick={handleClose}>Close Filters</Button>\n                </Menu>\n              </Hidden>\n            )}\n            {filters && <Hidden mdDown>{filters}</Hidden>}\n            {actions}\n          </div>\n        </Toolbar>\n      </Paper>\n      <div className={window.JIRA_SUPPORT ? classes.fabShift : classes.fab}>\n        {!!assign && (\n          <Tooltip\n            id=\"tooltip-fab\"\n            title={`Grant this project access to a ${section}`}\n          >\n            <Fab\n              color=\"secondary\"\n              aria-label=\"add\"\n              id={`assign-${section}`}\n              onClick={assign}\n            >\n              <SupervisorAccountIcon />\n            </Fab>\n          </Tooltip>\n        )}\n        {!!create && (\n          <Tooltip id=\"tooltip-fab\" title={`Create new ${section}`}>\n            <Fab\n              color=\"primary\"\n              aria-label=\"add\"\n              id={`new-${section}`}\n              onClick={create}\n            >\n              <AddIcon />\n            </Fab>\n          </Tooltip>\n        )}\n      </div>\n    </div>\n  );\n}\n\nSectionFrame.propTypes = {\n  classes: PropTypes.object.isRequired,\n  actions: PropTypes.object,\n  section: PropTypes.string.isRequired,\n  search: PropTypes.func,\n  create: PropTypes.func,\n  helper: PropTypes.string,\n  searchText: PropTypes.string,\n  searchHeading: PropTypes.string,\n};\n\nSectionFrame.defaultProps = {\n  actions: null,\n  search: null,\n  create: null,\n  searchText: null,\n  searchHeading: null,\n  helper: null,\n};\n\nexport default withStyles(styles, { withTheme: true })(SectionFrame);\n","import { camelizeKeys, decamelizeKeys } from 'humps';\nimport { normalize, schema } from 'normalizr';\nimport { Job } from '../schemas';\nimport { get, put, post } from './BaseClient';\nimport { jobByIdApiPath, jobsApiPath } from '../helpers/actionsPathHelpers';\n\n/**\n * @param {import('../schemas/types').Project} project\n */\nexport async function getJobs(project) {\n  const response = await get(jobsApiPath(), { projectId: project.id });\n  return normalize(camelizeKeys(await response.json()), new schema.Array(Job));\n}\n\nexport async function getJobById(id) {\n  const response = await get(jobByIdApiPath(id));\n  return normalize(camelizeKeys(await response.json()), Job);\n}\n\nexport async function postJob(job) {\n  const payload = { job: decamelizeKeys(job) };\n\n  const response = await post(jobsApiPath(), payload);\n  return normalize(camelizeKeys(await response.json()), Job);\n}\n\nexport async function putJob(job) {\n  const payload = { job: decamelizeKeys(job) };\n\n  const response = await put(jobByIdApiPath(job.id), payload);\n  return normalize(camelizeKeys(await response.json()), Job);\n}\n","import { camelizeKeys } from 'humps';\nimport { normalize } from 'normalizr';\nimport { getJobById, getJobs, postJob, putJob } from '../clients/JobClient';\nimport {\n  DISMISS_JOB_ERROR,\n  JOBS_FAILURE,\n  JOBS_REQUEST,\n  JOBS_SUCCESS,\n  JOB_FAILURE,\n  JOB_REQUEST,\n  JOB_SUCCESS,\n  JOB_REMOVED,\n  JOB_CHANGED,\n} from '../constants';\nimport { runStarted, runStartFailed } from '../helpers';\nimport { Job } from '../schemas';\nimport Notifications from './Notifications';\nimport { del, get, post } from '../clients/BaseClient';\nimport {\n  adaptorsApiPath,\n  clearJobStatePath,\n  jobByIdApiPath,\n  revertJobStatePath,\n  startJobPath,\n} from '../helpers/actionsPathHelpers';\n\nexport function adaptorRequested(name, version) {\n  return { type: 'ADAPTOR_REQUESTED', payload: { name, version } };\n}\n\nfunction adaptorInstallFailed(payload) {\n  return { type: 'ADAPTOR_INSTALL_FAILED', payload };\n}\n\nexport function installAdaptor(name, version) {\n  return async dispatch => {\n    dispatch({\n      type: 'INSTALLING_ADAPTOR',\n      payload: {\n        name,\n        version,\n      },\n    });\n    try {\n      return await post(adaptorsApiPath(), { name, version });\n    } catch (error) {\n      return dispatch(adaptorInstallFailed(error));\n    }\n  };\n}\n\nexport function receiveAdaptor(payload) {\n  return { type: 'ADAPTOR_INSTALLED', payload };\n}\n\nexport function receiveAdaptorError(payload) {\n  return adaptorInstallFailed(payload);\n}\n\nfunction adaptorAstNotInstalled(payload) {\n  return { type: 'ADAPTOR_INSTALL_FAILED', payload };\n}\n\nexport function receiveAdaptorAstInstalled(payload) {\n  return { type: 'ADAPTOR_AST_NOT_INSTALLED', payload };\n}\n\nexport function receiveAdaptorAstNotInstalled(payload) {\n  return adaptorAstNotInstalled(payload);\n}\n\nexport function getAdaptors() {\n  return async dispatch => {\n    dispatch({ type: 'FETCHING_ADAPTORS' });\n    const response = await get(adaptorsApiPath());\n    dispatch({\n      type: 'ADAPTORS_SUCCESS',\n      payload: await response.json(),\n    });\n  };\n}\n\nexport function getHelpers({ adaptor, version }) {\n  const originalAdaptorName = adaptor;\n  const originalAdaptorVersion = version;\n  return async dispatch => {\n    dispatch({ type: 'FETCHING_HELPERS', adaptor: adaptor + version });\n\n    const query = { id: adaptor, version };\n\n    // TODO: revise how we query for helpers, we should be able to do a get\n    // request with a string id like: `language-salesforce@v2.0.2` or `@latest`\n    // and resolve the matching adaptor like that.\n    const response = await get(adaptorsApiPath(), query);\n    const data = await response.json();\n\n    if (data.adaptor.error)\n      return dispatch({\n        type: 'HELPERS_FAILED',\n        payload: {\n          name: originalAdaptorName,\n          version: originalAdaptorVersion,\n          error: data.adaptor.error,\n        },\n      });\n\n    const payload = camelizeKeys(data, (key, convert) =>\n      ['adaptor_name', 'adaptor_version'].includes(key) ? convert(key) : key\n    );\n    return dispatch(helpersSuccess(payload));\n  };\n}\n\nexport function helpersSuccess(payload) {\n  return { type: 'HELPERS_SUCCESS', payload };\n}\n\n/**\n * @param {import('../schemas/types').Project} project\n */\nexport function fetchJobs(project) {\n  return {\n    promise: getJobs(project),\n    types: [JOBS_REQUEST, JOBS_SUCCESS, JOBS_FAILURE],\n  };\n}\n\n// Relies on the custom API middleware defined in ../middleware/api.js.\nexport function fetchJobById(id) {\n  return async dispatch => {\n    dispatch({ type: JOB_REQUEST });\n\n    try {\n      return await dispatch(jobSuccess(await getJobById(id)));\n    } catch (error) {\n      dispatch(jobFailed(error));\n      throw error;\n    }\n  };\n}\n\nfunction jobSuccess(payload) {\n  return { type: JOB_SUCCESS, payload };\n}\n\nfunction jobErrorDismissed() {\n  return { type: DISMISS_JOB_ERROR };\n}\n\nfunction jobFailed(error) {\n  return { type: JOB_FAILURE, payload: error, error: true };\n}\n\nfunction cannotActivateJob() {\n  return Notifications.add(\n    'Cannot activate job. Your plan limit has been reached.',\n    'danger'\n  );\n}\n\nfunction cannotToggleOptions() {\n  return Notifications.add(\n    'Unable to edit administrative options. Check your privileges.',\n    'danger'\n  );\n}\n\nfunction clearJobStateSuccess() {\n  return Notifications.add('Successfully cleared job state.', 'success');\n}\n\nfunction clearJobStateFailure() {\n  return Notifications.add(\n    \"Couldn't clear job state. Please try again later.\",\n    'danger'\n  );\n}\n\nexport function archiveJob(job) {\n  const jobArchive = { ...job, archived: !job.archived, autoprocess: false };\n\n  return async dispatch => {\n    try {\n      const payload = await putJob(jobArchive);\n      return dispatch(jobSuccess(payload));\n    } catch (error) {\n      return dispatch(jobFailed(error));\n    }\n  };\n}\n\nexport function clearJobState(job) {\n  return async dispatch => {\n    dispatch({ type: 'CLEARING_JOB_STATE' });\n    try {\n      const response = await del(clearJobStatePath(job));\n      dispatch({\n        type: 'CLEARED_JOB_STATE',\n        payload: response.statusText,\n      });\n      dispatch(clearJobStateSuccess());\n      dispatch(fetchJobById(job.id));\n    } catch (error) {\n      dispatch({ type: 'JOB_STATE_FAILURE', payload: error });\n      dispatch(clearJobStateFailure());\n    }\n  };\n}\n\nfunction toggleOption(job) {\n  return async dispatch => {\n    try {\n      await updateJob(job)(dispatch);\n    } catch (error) {\n      dispatch(cannotToggleOptions());\n    }\n  };\n}\n\nexport function toggleJob(id, current) {\n  const job = { id, autoprocess: !current };\n\n  return async dispatch => {\n    try {\n      await updateJob(job)(dispatch);\n    } catch (error) {\n      dispatch(cannotActivateJob());\n    }\n  };\n}\n\nexport function toggleNoConsole(id, current) {\n  const job = { id, noConsole: !current };\n  return toggleOption(job);\n}\n\nexport function toggleTestMode(id, current) {\n  const job = { id, testMode: !current };\n  return toggleOption(job);\n}\n\nexport function togglePrivate(id, current) {\n  const job = { id, private: !current };\n  return toggleOption(job);\n}\n\nfunction revertingJob() {\n  return Notifications.add(\n    'Connecting to GitHub and reverting job.',\n    'success'\n  );\n}\n\nfunction revertJobSuccess() {\n  return Notifications.add('Job reverted to prior commit.', 'success');\n}\n\nfunction revertJobFailure() {\n  return Notifications.add(\n    \"Couldn't fetch job data from GitHub. Please try again later.\",\n    'danger'\n  );\n}\n\nexport function revertJob(job, githubEventId) {\n  return async dispatch => {\n    dispatch({\n      type: 'REVERTING_JOB',\n      jobId: job.id,\n      githubEventId,\n    });\n    dispatch(revertingJob());\n\n    const payload = { id: job.id, github_event_id: githubEventId };\n\n    try {\n      const response = await post(revertJobStatePath(job), payload);\n      const data = await response.json();\n      const updatedJob = normalize(camelizeKeys(data), Job);\n\n      dispatch({ type: 'JOB_UPDATED', updatedJob });\n      dispatch(revertJobSuccess());\n\n      return updatedJob;\n    } catch (error) {\n      dispatch(revertJobFailure());\n    }\n  };\n}\n\nexport function dismissJobError() {\n  return dispatch => {\n    dispatch(jobErrorDismissed());\n  };\n}\n\nexport function updateJob(job) {\n  return async dispatch => {\n    dispatch({ type: JOB_REQUEST, job });\n    const payload = await putJob(job);\n\n    dispatch(jobSuccess(payload));\n\n    return payload;\n  };\n}\n\nexport function createJob(job) {\n  return async dispatch => {\n    const payload = await postJob(job);\n    dispatch({ type: JOB_SUCCESS, payload });\n\n    return payload;\n  };\n}\n\nexport function runJob(job) {\n  return async dispatch => {\n    try {\n      // TODO: this should be POST /api/job/${id}/start\n      const response = await post(startJobPath(job), { id: job.id });\n      dispatch(runStarted(await response.json()));\n    } catch (e) {\n      dispatch(runStartFailed(job.id, e.firstMessage));\n    }\n  };\n}\n\nexport function deleteJob(job) {\n  return async dispatch => {\n    await del(jobByIdApiPath(job.id));\n    dispatch(removeJob(job.id));\n  };\n}\n\nexport function removeJob(jobId) {\n  return {\n    type: JOB_REMOVED,\n    jobId,\n  };\n}\n\nexport function changeJob(id, change) {\n  return {\n    type: JOB_CHANGED,\n    id,\n    change,\n  };\n}\n","import { debounce, memoize } from 'lodash';\nimport { getSocket } from '../config/socket';\nimport {\n  CHANNEL_ERROR,\n  JOINED_CHANNEL,\n  JOINING_CHANNEL,\n  LEFT_CHANNEL,\n} from '../constants';\n\n// Memoized function thats called every time a channel is no longer\n// needed. We wait 5s and check if there are any other bindings on it\n// before leaving the channel.\n// This was channels that are common between two routes will reuse the\n// same channel.\n// The `onClose` callback set by `setupChannel` dispatches `LEFT_CHANNEL`\n// which does the cleanup/removal from the Redux Store.\nconst leaveIfUnused = memoize(channel => {\n  return debounce(() => {\n    const canLeave = channel.state == 'joined';\n    const hasNoExtraBindings =\n      channel.bindings.filter(({ event }) => !/^phx_/.test(event)).length == 0;\n\n    if (canLeave && hasNoExtraBindings) {\n      channel.leave();\n    }\n  }, 5000);\n});\n\nfunction bindEvents(channel, bindings = {}) {\n  const eventRefs = Object.entries(bindings).map(([evt, callback]) => [\n    evt,\n    channel.on(evt, callback),\n  ]);\n\n  return function unbindChannel() {\n    eventRefs.forEach(([evt, ref]) => channel.off(evt, ref));\n  };\n}\n\n// IDEA: We might not actually need to tell Redux what channels we have\n// joined or left. We currently don't have any behaviour around this.\nfunction setupChannel(channel, dispatch) {\n  dispatch({ type: JOINING_CHANNEL, channelName: channel.topic, channel });\n\n  channel\n    .join()\n    .receive('ok', () => {\n      // Let the reducer know that the channel was joined successfully\n      dispatch({ type: JOINED_CHANNEL, channelName: channel.topic, channel });\n    })\n    .receive('ignore', error => {\n      dispatch({ type: CHANNEL_ERROR, channelName: channel.topic, error });\n    });\n\n  channel.onError(error => {\n    dispatch({ type: CHANNEL_ERROR, channelName: channel.topic, error });\n  });\n\n  channel.onClose(() => {\n    dispatch({ type: LEFT_CHANNEL, channelName: channel.topic });\n  });\n\n  return channel;\n}\n\nexport function joinChannel(channelName, bindings = {}) {\n  return dispatch => {\n    const socket = getSocket(localStorage.getItem('auth_token'));\n\n    const existingChannel = socket.channels.find(\n      ({ topic }) => topic === channelName\n    );\n\n    // Assuming its a new component wanting the same channel\n    // we don't call `.join()` again.\n    if (existingChannel) {\n      const unbindFunc = bindEvents(existingChannel, bindings);\n      return () => {\n        unbindFunc();\n        leaveIfUnused(existingChannel)();\n      };\n    }\n    const channel = socket.channel(channelName);\n    setupChannel(channel, dispatch);\n\n    // Bind the message callbacks to the channel.\n    const unbindFunc = bindEvents(channel, bindings);\n\n    return () => {\n      unbindFunc();\n      leaveIfUnused(channel)();\n    };\n\n    // new leave channel\n  };\n}\n\nexport function sendMessage(channelName, msg, payload) {\n  return (_dispatch, getState) => {\n    const { channels } = getState();\n\n    const channel = channels.items[channelName];\n\n    if (channel) {\n      return channel.push(msg, payload);\n    }\n\n    // eslint-disable-next-line no-console\n    console.warn(\n      `Tried to send message to unregistered channel: ${channelName}`\n    );\n\n    return null;\n  };\n}\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  Button,\n  CardActions,\n  CircularProgress,\n  IconButton,\n  Tooltip,\n} from '@material-ui/core';\nimport {\n  Cancel as CancelIcon,\n  Save as SaveIcon,\n  Undo as UndoIcon,\n} from '@material-ui/icons';\nimport { allowSaveForSubmitError } from '../helpers/index';\n\nconst useStyles = makeStyles(() => ({\n  group: {\n    paddingBottom: '1em',\n  },\n}));\n\nfunction FormActions({\n  children,\n  cancel,\n  submit,\n  reset,\n  mini,\n  cancelText,\n  submitText,\n  enterPress,\n  form,\n  pristine,\n}) {\n  const classes = useStyles();\n\n  const formState = form?.getState();\n\n  const {\n    hasValidationErrors,\n    hasSubmitErrors,\n    submitting,\n    modifiedSinceLastSubmit,\n  } = formState;\n\n  const isPristine = pristine || formState.pristine;\n\n  const type = enterPress ? 'submit' : 'button';\n\n  const disabled =\n    submitting ||\n    isPristine ||\n    hasValidationErrors ||\n    (hasSubmitErrors &&\n      !modifiedSinceLastSubmit &&\n      !allowSaveForSubmitError(form));\n\n  if (mini) {\n    return (\n      <span id=\"card-actions\">\n        {children}\n        <Tooltip title=\"Cancel\">\n          <span>\n            <IconButton onClick={cancel} type=\"button\" id=\"cancel\">\n              <CancelIcon />\n            </IconButton>\n          </span>\n        </Tooltip>\n        <Tooltip title=\"Undo changes\">\n          <span>\n            <IconButton\n              id=\"reset\"\n              onClick={reset}\n              type=\"button\"\n              disabled={submitting || isPristine}\n            >\n              <UndoIcon />\n            </IconButton>\n          </span>\n        </Tooltip>\n        <Tooltip title={submitText || 'Save'}>\n          <span>\n            <IconButton\n              onClick={submit}\n              id=\"submit\"\n              disabled={disabled}\n              type={type}\n            >\n              {submitting ? <CircularProgress size={20} /> : <SaveIcon />}\n            </IconButton>\n          </span>\n        </Tooltip>\n      </span>\n    );\n  }\n\n  return (\n    <CardActions className={classes.group} id=\"card-actions\">\n      {cancel && (\n        <Button type=\"button\" onClick={cancel} id=\"cancel\">\n          {cancelText || 'Cancel'}\n        </Button>\n      )}\n      {reset && (\n        <Button\n          id=\"reset\"\n          onClick={reset}\n          type=\"button\"\n          disabled={submitting || isPristine}\n        >\n          Reset\n        </Button>\n      )}\n      {submit && (\n        <Button id=\"submit\" disabled={disabled} type={type} onClick={submit}>\n          {submitting ? <CircularProgress size={20} /> : submitText || 'Save'}\n        </Button>\n      )}\n      {children}\n    </CardActions>\n  );\n}\n\nexport default React.memo(FormActions);\n","import React from 'react';\nimport clsx from 'clsx';\nimport { makeStyles, Button } from '@material-ui/core';\nimport PropTypes from 'prop-types';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    textDecoration: 'none',\n    color: theme.palette.text.primary,\n  },\n  default: {},\n  primary: {\n    color: theme.palette.primary.main,\n  },\n  secondary: {\n    color: theme.palette.secondary.main,\n  },\n  button: {\n    '&:hover': {\n      textDecoration: 'inherit',\n    },\n  },\n}));\n\nfunction Link({ href, text, icon, onClick, button, color, rel, target, name }) {\n  const classes = useStyles();\n\n  if (button) {\n    return <Button />;\n  }\n\n  return (\n    <a\n      target={target || '_blank'}\n      rel={rel || 'noopener noreferrer'}\n      href={href}\n      onClick={onClick}\n      className={clsx(classes.root, classes[color])}\n      name={name}\n    >\n      {text}\n      {text && icon && <span>&nbsp;</span>}\n      {icon}\n    </a>\n  );\n}\n\nLink.propTypes = {\n  text: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n};\n\nLink.defaultProps = {\n  text: '',\n};\n\nexport default React.memo(Link);\n","import React, { useEffect, useRef } from 'react';\nimport { CardContent, Avatar, Tooltip, Typography } from '@material-ui/core/';\nimport HelpIcon from '@material-ui/icons/Help';\nimport { each } from 'lodash';\nimport { Field, Form } from 'react-final-form';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { joinChannel } from '../../actions/ChannelActions';\nimport {\n  createCredential,\n  updateCredential,\n} from '../../actions/CredentialActions';\nimport { handleResponse } from '../../clients/CredentialClient';\nimport FormActions from '../FormActions';\nimport TextInput from '../FormHelpers/TextInput';\nimport Link from '../Link';\nimport {\n  credentialsPath,\n  projectCredentialsPath,\n} from '../../helpers/pathHelpers';\nimport { UnprocessableEntity } from '../../errors';\nimport { buildOauthConsentUrl, createFormErrors } from '../../helpers';\n\nfunction UserDetails({ name, picture }) {\n  if (!name || !picture) {\n    return null;\n  }\n  return (\n    <div>\n      <br />\n      <Avatar src={picture} alt={name} />\n      <br />\n      <Typography>{name}</Typography>\n    </div>\n  );\n}\n\n// In order to validate adaptor specific fields we will need to move this\n// to the parent component, and pass it via props as `validate`.\nconst validate = (values, skipValidationForSecrets) => {\n  const errors = {};\n  const { body, name } = values;\n\n  if (!name) {\n    errors.name = 'Required';\n  }\n\n  if (!body) {\n    errors.body = { refreshToken: true };\n  }\n\n  if (body && !body.refreshToken) {\n    errors.body = {\n      ...errors.body,\n      refreshToken: `Hrmmm. We didn't receive a refresh token from ${body.oAuthProvider}. Contact support if this problem persists.`,\n    };\n  }\n\n  if (body && !body.refreshToken && body?.accessToken) {\n    // const url = 'https://myaccount.google.com/permissions';\n    errors.body = {\n      ...errors.body,\n      refreshToken: `You have already granted OpenFn access to manage\n          your ${body.oAuthProvider}. If you no longer have the credential on OpenFn, please\n          revoke access from your ${body.oAuthProvider} \"Connected Applications\" page and\n          try again.`,\n    };\n  }\n\n  if (body && !body.authUrl) {\n    errors.body = {\n      ...errors.body,\n      authUrl: 'Authorization Url is required.',\n    };\n  }\n\n  if (body && !body.scope) {\n    errors.body = {\n      ...errors.body,\n      scope: 'Scope is required.',\n    };\n  }\n\n  if (body && !body.tokenUrl) {\n    errors.body = {\n      ...errors.body,\n      tokenUrl: 'Token URL is required.',\n    };\n  }\n\n  if (body && !body.userInfoUrl) {\n    errors.body = {\n      ...errors.body,\n      userInfoUrl: 'User Info URL is required.',\n    };\n  }\n\n  if (!skipValidationForSecrets) {\n    if (body && !body.clientId) {\n      errors.body = {\n        ...errors.body,\n        clientId: 'Client ID is required.',\n      };\n    }\n    if (body && !body.clientSecret) {\n      errors.body = {\n        ...errors.body,\n        clientSecret: 'Client Secret is required.',\n      };\n    }\n  }\n\n  if (body && !body.oAuthProvider) {\n    errors.body = {\n      ...errors.body,\n      oAuthProvider: 'oAuthProvider name is required.',\n    };\n  }\n\n  return errors;\n};\n\nconst ExternalIdLabel = (\n  <div>\n    External ID&nbsp;\n    <Tooltip\n      title=\"For use with 'keychain' credentials, the external ID is\n    the value through which credential will be selected by variable source\n    data.\"\n    >\n      <HelpIcon fontSize=\"inherit\" />\n    </Tooltip>\n  </div>\n);\n\nfunction SignInWithOauthProvider({ text, ...queryParams } = {}) {\n  return (\n    <div>\n      <br />\n      <Link href={buildOauthConsentUrl(queryParams)} text={text} />\n      <br />\n    </div>\n  );\n}\n\nfunction handleOauthServerResponse(message, channelKey, form) {\n  const result = handleResponse(message);\n  form.batch(() => {\n    each(result.entities.credentials[channelKey].body, (v, k) => {\n      form.change(`body.${k}`, v);\n    });\n  });\n}\nfunction Oauth2({\n  selectedProject,\n  initialValues,\n  fromWizard,\n  onSubmitComplete,\n  onCancel,\n  consentText,\n  hiddenFields,\n  oAuthProviderName,\n  providerUserInfoUrl,\n  providerAuthUrl,\n  accessScope,\n  providerTokenUrl,\n}) {\n  const formRef = useRef(null);\n\n  const history = useHistory();\n\n  const dispatch = useDispatch();\n\n  const { id } = useParams();\n\n  const credentialInitialValues = {\n    ...initialValues,\n    body: {\n      ...initialValues.body,\n      oAuthProvider: oAuthProviderName ?? initialValues.body?.oAuthProvider,\n      userInfoUrl: providerUserInfoUrl ?? initialValues.body?.userInfoUrl,\n      scope: accessScope ?? initialValues.body?.scope,\n      authUrl: providerAuthUrl ?? initialValues.body?.authUrl,\n      tokenUrl: providerTokenUrl ?? initialValues.body?.tokenUrl,\n    },\n  };\n\n  const channelKey = useRef(id || Math.round(Math.random() * 10 ** 14));\n\n  const fieldIsHidden = field => hiddenFields.includes(field);\n\n  const skipValidationForSecrets =\n    hiddenFields.filter(\n      field => field === 'clientId' || field === 'clientSecret'\n    ).length > 0;\n\n  const submit = async values => {\n    const action = id ? updateCredential : createCredential;\n\n    try {\n      const result = await dispatch(action(values));\n      if (!fromWizard) {\n        history.push(\n          selectedProject\n            ? projectCredentialsPath(selectedProject)\n            : credentialsPath()\n        );\n      } else {\n        onSubmitComplete(result.payload.result);\n      }\n      return true;\n    } catch (error) {\n      if (error instanceof UnprocessableEntity) {\n        return createFormErrors(error.errors, values);\n      }\n      return error;\n    }\n  };\n\n  useEffect(() => {\n    const leaveChannel = dispatch(\n      joinChannel(`credentials:${channelKey.current}`, {\n        updated: msg =>\n          handleOauthServerResponse(msg, channelKey.current, formRef.current),\n      })\n    );\n\n    return () => {\n      if (leaveChannel) leaveChannel();\n    };\n  }, [dispatch]);\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={values => validate(values, skipValidationForSecrets)}\n      initialValues={credentialInitialValues}\n      render={({\n        handleSubmit,\n        form,\n        values,\n        errors,\n        submitErrors,\n        dirtyFields,\n      }) => {\n        formRef.current = form;\n        // Remove clientId&clientSecret for well known providers\n        if (fieldIsHidden('clientId')) {\n          delete values['body.clientId'];\n        }\n        if (fieldIsHidden('clientSecret')) {\n          delete values['body.clientSecret'];\n        }\n\n        const { body: errorsBody } = errors;\n\n        const {\n          tokenUrl,\n          scope,\n          authUrl,\n          userInfoUrl,\n          oAuthProvider,\n          clientId,\n          clientSecret,\n          accessToken,\n          name,\n          picture,\n        } = values.body || {};\n\n        const hasConsent = !!accessToken;\n\n        const userInfo = hasConsent ? (\n          <UserDetails picture={picture} name={name} />\n        ) : null;\n\n        if (submitErrors instanceof Error) {\n          throw submitErrors;\n        }\n        return (\n          <form onSubmit={handleSubmit} autoComplete=\"off\">\n            <CardContent>\n              <div>\n                <Field\n                  name=\"name\"\n                  component={TextInput}\n                  fullWidth\n                  type=\"text\"\n                  label=\"Label\"\n                />\n                <Field\n                  hidden={fieldIsHidden('oAuthProvider')}\n                  name=\"body.oAuthProvider\"\n                  component={TextInput}\n                  fullWidth\n                  type=\"text\"\n                  label=\"oAuth Provider\"\n                />\n                <Field\n                  hidden={fieldIsHidden('externalId')}\n                  name=\"externalId\"\n                  fullWidth\n                  label={ExternalIdLabel}\n                  component={TextInput}\n                  type=\"text\"\n                  placeholder=\"Leave this blank unless accessing via keychains\"\n                />\n                <Field\n                  hidden={fieldIsHidden('authUrl')}\n                  name=\"body.authUrl\"\n                  component={TextInput}\n                  type=\"text\"\n                  fullWidth\n                  label=\"Authorization URL\"\n                />\n                <Field\n                  hidden={fieldIsHidden('scope')}\n                  name=\"body.scope\"\n                  component={TextInput}\n                  type=\"text\"\n                  label=\"Scope\"\n                  fullWidth\n                />\n                <Field\n                  hidden={fieldIsHidden('tokenUrl')}\n                  name=\"body.tokenUrl\"\n                  component={TextInput}\n                  type=\"text\"\n                  label=\"Token URL\"\n                  fullWidth\n                />\n                <Field\n                  hidden={fieldIsHidden('userInfoUrl')}\n                  name=\"body.userInfoUrl\"\n                  component={TextInput}\n                  fullWidth\n                  type=\"text\"\n                  label=\"User Info URL\"\n                  placeholder=\"Endpoint for user details\"\n                  autoComplete=\"off\"\n                />\n                <Field\n                  hidden={fieldIsHidden('clientId')}\n                  name=\"body.clientId\"\n                  component={TextInput}\n                  type=\"password\"\n                  label=\"Client ID\"\n                  fullWidth\n                  autoComplete=\"new-password\"\n                />\n                <Field\n                  hidden={fieldIsHidden('clientSecret')}\n                  name=\"body.clientSecret\"\n                  component={TextInput}\n                  type=\"password\"\n                  label=\"Client Secret\"\n                  fullWidth\n                  autoComplete=\"new-password\"\n                />\n                <Field\n                  hidden={fieldIsHidden('resource')}\n                  name=\"body.resource\"\n                  component={TextInput}\n                  type=\"text\"\n                  label=\"Resource URL\"\n                  fullWidth\n                />\n                <Field\n                  hidden={fieldIsHidden('apiVersion')}\n                  name=\"body.apiVersion\"\n                  component={TextInput}\n                  type=\"text\"\n                  label=\"API Version\"\n                  fullWidth\n                />\n                <Field name=\"body.refreshToken\" component={TextInput} hidden />\n                {userInfo ||\n                  (!hasConsent && oAuthProvider && (\n                    <SignInWithOauthProvider\n                      id={channelKey.current}\n                      adaptor={values.adaptor}\n                      provider={oAuthProvider}\n                      text={consentText ?? `Authorize with ${oAuthProvider}`}\n                      clientId={clientId}\n                      clientSecret={clientSecret}\n                      scope={scope}\n                      authUrl={authUrl}\n                      tokenUrl={tokenUrl}\n                      userInfoUrl={userInfoUrl}\n                    />\n                  ))}\n              </div>\n              {errorsBody &&\n              errorsBody.refreshToken &&\n              dirtyFields.body?.refreshToken ? (\n                <Typography color=\"error\">{errorsBody.refreshToken}</Typography>\n              ) : null}\n            </CardContent>\n            <FormActions\n              submit={handleSubmit}\n              cancel={onCancel}\n              form={form}\n              // pristine={\n              //   initialValues.body?.refreshToken === values.body?.refreshToken\n              // }\n            />\n          </form>\n        );\n      }}\n    />\n  );\n}\n\nSignInWithOauthProvider.propTypes = {\n  provider: PropTypes.string,\n  scope: PropTypes.string,\n  clientId: PropTypes.string,\n  authUrl: PropTypes.string,\n  tokenUrl: PropTypes.string,\n  clientSecret: PropTypes.string,\n  userInfoUrl: PropTypes.string,\n  id: PropTypes.any,\n  adaptor: PropTypes.string,\n  text: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n};\n\nSignInWithOauthProvider.defaultProps = {\n  text: null,\n  provider: null,\n  scope: null,\n  clientId: null,\n  authUrl: null,\n  tokenUrl: null,\n  clientSecret: null,\n  userInfoUrl: null,\n  id: null,\n  adaptor: null,\n};\n\nUserDetails.propTypes = {\n  name: PropTypes.string,\n  picture: PropTypes.string,\n};\n\nUserDetails.defaultProps = {\n  name: '',\n  picture: '',\n};\n\nOauth2.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n  initialValues: PropTypes.object.isRequired,\n  fromWizard: PropTypes.bool,\n  onSubmitComplete: PropTypes.func,\n  onCancel: PropTypes.func.isRequired,\n  consentText: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n  hiddenFields: PropTypes.array,\n  providerUserInfoUrl: PropTypes.string,\n  providerAuthUrl: PropTypes.string,\n  accessScope: PropTypes.string,\n  providerTokenUrl: PropTypes.string,\n  oAuthProviderName: PropTypes.string,\n};\n\nOauth2.defaultProps = {\n  fromWizard: false,\n  onSubmitComplete: null,\n  consentText: null,\n  hiddenFields: [],\n  providerUserInfoUrl: null,\n  providerAuthUrl: null,\n  accessScope: null,\n  providerTokenUrl: null,\n  oAuthProviderName: null,\n};\n\nexport default Oauth2;\n","import GoogleSheets from './GoogleSheets';\nimport Sharepoint from './Sharepoint';\nimport Oauth2 from './Oauth2';\n\nconst bodySchemas = {\n  asana: {\n    apiVersion: {\n      type: 'text',\n      label: 'API Version',\n      placeholder: '1.0',\n    },\n    token: { type: 'password', label: 'API Token' },\n  },\n  beyonic: {\n    apiUrl: { type: 'text', label: 'API Url' },\n    apiToken: { type: 'text', label: 'API Token' },\n  },\n  cartodb: {\n    account: { type: 'text', label: 'Account' },\n    apiKey: { type: 'password', label: 'API Key' },\n  },\n  certificate: {\n    cert: { type: 'text', label: 'Client Certificate (cert)', multiline: true },\n    key: { type: 'password', label: 'Client Key (key)', multiline: true },\n    ca: { type: 'text', label: 'CA Certificate (ca)', multiline: true },\n  },\n  commcare: {\n    hostUrl: { type: 'text', label: 'Host URL' },\n    applicationName: { type: 'text', label: 'Application Name' },\n    appId: { type: 'text', label: 'Application UUID' },\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    apiKey: { type: 'password', label: 'API Key' },\n  },\n  dhis2: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    hostUrl: {\n      type: 'text',\n      label: 'Host URL',\n      placeholder: 'https://play.dhis2.org/2.31.1',\n    },\n    apiVersion: {\n      type: 'text',\n      label: 'API Version',\n      placeholder: '35',\n    },\n    apiUrl: {\n      type: 'text',\n      label: 'API URL',\n      disabled: true,\n      deprecationMessage:\n        'For v1.1.1 and above, apiUrl will get automatically converted to hostUrl.',\n    },\n  },\n  googlesheets: GoogleSheets,\n  oauth2: Oauth2,\n  dynamics: Oauth2,\n  facebook: { accessToken: { type: 'password', label: 'Page Access Token' } },\n  godata: {\n    apiUrl: { type: 'text', label: 'API URL' },\n    email: { type: 'text', label: 'Email' },\n    password: { type: 'password', label: 'Password' },\n  },\n  http: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    baseUrl: { type: 'text', label: 'Base URL' },\n    authType: { type: 'text', label: 'Authentication Type' },\n  },\n  keychain: {\n    path: { type: 'text', label: 'Path' },\n    default: { type: 'text', label: 'Default Value' },\n  },\n  khanacademy: {\n    email: { type: 'text', label: 'Email' },\n    password: { type: 'password', label: 'Password' },\n    consumerKey: { type: 'text', label: 'Consumer Key' },\n    secretKey: { type: 'password', label: 'Secret Key' },\n  },\n  kobotoolbox: {\n    baseURL: { type: 'text', label: 'Base URL' },\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    apiVersion: { type: 'text', label: 'API Version', placeholder: 'v2' },\n  },\n  maximo: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    baseUrl: { type: 'text', label: 'Base URL' },\n  },\n  magpi: {\n    username: { type: 'text', label: 'Username' },\n    accessToken: { type: 'password', label: 'Access Token' },\n  },\n  mailchimp: {\n    server: { type: 'text', label: 'Server Prefix' },\n    apiKey: { type: 'password', label: 'API Key' },\n  },\n  mailgun: {\n    domain: { type: 'text', label: 'Domain' },\n    apiKey: { type: 'password', label: 'API Key' },\n  },\n  medicmobile: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    server: { type: 'text', label: 'Host URL' },\n    db: { type: 'text', label: 'Database Path' },\n  },\n  mogli: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    loginUrl: { type: 'text', label: 'Login URL' },\n    securityToken: { type: 'text', label: 'Security Token' },\n    secret: { type: 'text', label: 'API Token' },\n  },\n  mongodb: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    clusterUrl: { type: 'text', label: 'Cluster URL' },\n  },\n  mssql: {\n    server: { type: 'text', label: 'Server URL' },\n    database: { type: 'text', label: 'Database Name' },\n    port: { type: 'text', label: 'Port' },\n    userName: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n  },\n  mysql: {\n    host: { type: 'text', label: 'Host URL' },\n    database: { type: 'text', label: 'Database Name' },\n    port: { type: 'text', label: 'Port' },\n    user: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n  },\n  nexmo: {\n    apiKey: { type: 'text', label: 'API Key' },\n    apiSecret: { type: 'password', label: 'API Secret' },\n  },\n\n  openfn: {\n    username: { type: 'text', label: 'Email' },\n    password: { type: 'password', label: 'Password' },\n    projectId: { type: 'text', label: 'Project ID' },\n    host: { type: 'text', label: 'Host URL' },\n  },\n  openhim: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    apiUrl: { type: 'text', label: 'Instance URL' },\n  },\n  openmrs: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    instanceUrl: { type: 'text', label: 'Instance URL' },\n  },\n  postgresql: {\n    host: { type: 'text', label: 'Host URL' },\n    port: { type: 'text', label: 'Port' },\n    database: { type: 'text', label: 'Database' },\n    user: { type: 'text', label: 'User' },\n    password: { type: 'password', label: 'Password' },\n    ssl: { type: 'checkbox', label: 'Use SSL?' },\n    allowSelfSignedCert: {\n      type: 'checkbox',\n      label: 'Allow Self Signed Certificate',\n    },\n    key: { type: 'password', label: 'Client Private Key' },\n    cert: { type: 'password', label: 'Client Certificate' },\n    ca: { type: 'password', label: 'CA Certificate' },\n  },\n  primero: {\n    user: { type: 'text', label: 'User' },\n    password: { type: 'password', label: 'Password' },\n    url: { type: 'text', label: 'Host URL' },\n    basicAuth: { type: 'checkbox', label: 'Use Basic Auth?' },\n  },\n  rapidpro: {\n    host: { type: 'text', label: 'Host URL' },\n    apiVersion: { type: 'text', label: 'API Version (v2)' },\n    token: { type: 'password', label: 'API Token' },\n  },\n  resourcemap: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    baseUrl: { type: 'text', label: 'Base URL' },\n  },\n  salesforce: {\n    username: { type: 'text', label: 'Username' },\n    securityToken: { type: 'text', label: 'Security Token' },\n    password: { type: 'password', label: 'Password' },\n    loginUrl: { type: 'text', label: 'Login URL' },\n  },\n  surveycto: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    instanceName: { type: 'text', label: 'Instance Name' },\n  },\n  sharepoint: Sharepoint,\n  telerivet: {\n    projectId: { type: 'text', label: 'Project ID' },\n    apiKey: { type: 'password', label: 'API Key' },\n  },\n  twilio: {\n    accountSid: { type: 'text', label: 'Account SID' },\n    authToken: { type: 'password', label: 'Auth Token' },\n  },\n  vtiger: {\n    hostUrl: { type: 'text', label: 'Host URL' },\n    username: { type: 'text', label: 'Username' },\n    accessToken: { type: 'password', label: 'Access Token' },\n  },\n  zoho: {\n    account: { type: 'text', label: 'Account' },\n    authToken: { type: 'password', label: 'Authtoken' },\n    apiVersion: { type: 'text', label: 'API Version' },\n  },\n  smpp: {\n    systemId: { type: 'text', label: 'System ID' },\n    password: { type: 'password', label: 'Password' },\n    projectId: { type: 'text', label: 'Project ID' },\n    clientHost: { type: 'text', label: 'Client Host' },\n  },\n  sftp: {\n    username: { type: 'text', label: 'Username' },\n    password: { type: 'password', label: 'Password' },\n    host: { type: 'text', label: 'Host' },\n    port: { type: 'text', label: 'Port' },\n  },\n};\n\nexport { bodySchemas as default };\n","import React from 'react';\nimport Images from '../../helpers/imagePaths';\nimport Oauth2 from './Oauth2';\n\nfunction GoogleSheets(props) {\n  return (\n    <Oauth2\n      {...props}\n      oAuthProviderName=\"Google\"\n      hiddenFields={[\n        'oAuthProvider',\n        'externalId',\n        'authUrl',\n        'scope',\n        'tokenUrl',\n        'userInfoUrl',\n        'clientId',\n        'clientSecret',\n        'resource',\n        'apiVersion',\n      ]}\n      consentText={\n        <img\n          id=\"sign-in-with-google\"\n          src={Images.googleSignInNormal}\n          alt=\"Sign in with Google\"\n          style={{ height: '50px' }}\n        />\n      }\n      providerUserInfoUrl=\"https://www.googleapis.com/oauth2/v1/userinfo\"\n      providerAuthUrl=\"https://accounts.google.com/o/oauth2/auth\"\n      providerTokenUrl=\"https://oauth2.googleapis.com/token\"\n      accessScope=\"https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/userinfo.profile\"\n    />\n  );\n}\nexport default GoogleSheets;\n","import React from 'react';\nimport Images from '../../helpers/imagePaths';\nimport Oauth2 from './Oauth2';\n\nfunction Sharepoint(props) {\n  return (\n    <Oauth2\n      {...props}\n      oAuthProviderName=\"sharepoint\"\n      hiddenFields={[\n        'oAuthProvider',\n        'externalId',\n        'authUrl',\n        'scope',\n        'tokenUrl',\n        'userInfoUrl',\n        'clientId',\n        'clientSecret',\n        'resource',\n        'apiVersion'\n      ]}\n      consentText={\n        <img\n          id=\"sign-in-with-microsoft\"\n          src={Images.microsoft}\n          alt=\"Sign in with Microsoft\"\n          style={{ height: '50px' }}\n        />\n      }\n      providerUserInfoUrl=\"https://graph.microsoft.com/oidc/userinfo\"\n      providerAuthUrl=\"https://login.microsoftonline.com/common/oauth2/v2.0/authorize\"\n      providerTokenUrl=\"https://login.microsoftonline.com/common/oauth2/v2.0/token\"\n      accessScope=\"email openid profile Sites.Manage.All Sites.Read.All User.Read User.Read.All\"\n    />\n  );\n}\nexport default Sharepoint;\n","import React from 'react';\nimport { Field } from 'react-final-form';\n\nconst identity = value => value;\n\n/* This wraps react-final-form's <Field/> component.\n * The identity function ensures form values never get set to null,\n * but rather, empty strings.\n *\n * See https://github.com/final-form/react-final-form/issues/130\n */\nexport default props => <Field parse={identity} {...props} />;\n","import React, { useState } from 'react';\nimport {\n  CardContent,\n  Checkbox,\n  FormControlLabel,\n  Tooltip,\n  Button,\n  Typography,\n  Hidden,\n} from '@material-ui/core/';\nimport { makeStyles } from '@material-ui/core/styles';\nimport HelpIcon from '@material-ui/icons/Help';\nimport PropTypes from 'prop-types';\nimport { Field, Form } from 'react-final-form';\nimport { useDispatch } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { Visibility, VisibilityOff } from '@material-ui/icons';\nimport KeyBinding from 'react-keybinding-component';\nimport FieldWithBlank from '../CustomField';\nimport {\n  createCredential,\n  updateCredential,\n} from '../../actions/CredentialActions';\nimport { createFormErrors, formSaveKeys } from '../../helpers';\nimport FormActions from '../FormActions';\nimport TextInput from '../FormHelpers/TextInput';\nimport { UnprocessableEntity } from '../../errors';\nimport {\n  credentialsPath,\n  projectCredentialsPath,\n} from '../../helpers/pathHelpers';\n\nconst useStyles = makeStyles(theme => ({\n  deprecation: { marginBottom: '-2em' },\n  error: { color: theme.palette.error.main },\n}));\n\nconst validate = values => {\n  const errors = {};\n\n  if (!values.name) {\n    errors.name = 'Required';\n  }\n\n  if (values.body && values.adaptor === 'keychain') {\n    const array = values.body.path;\n    try {\n      array || array == '' ? JSON.parse(array) : null;\n    } catch (e) {\n      errors.body = {\n        path: 'Path list is an [\"a\", \"b\"] array of keys.',\n      };\n    }\n  } else {\n    try {\n      typeof values.body == 'string' && JSON.parse(values.body);\n    } catch (e) {\n      errors.body =\n        'Invalid JSON. Please ensure your keys are \"double-quoted\".';\n    }\n  }\n  return errors;\n};\n\nfunction CredentialForm({\n  selectedProject,\n  onCancel,\n  bodySchema,\n  initialValues,\n}) {\n  const classes = useStyles();\n\n  const history = useHistory();\n\n  const dispatch = useDispatch();\n\n  const { credentialSlug } = useParams();\n\n  const [deprecationOverride, setDeprecationOverride] = useState(false);\n\n  const [showRawJson, setShowRawJson] = useState(false);\n\n  const bodyFields = bodySchema\n    ? Object.keys(bodySchema).reduce((acc, name) => {\n        const field = { ...bodySchema[name] };\n        const options =\n          field.components &&\n          field.components.map(op => ({ id: op, value: op, text: op }));\n\n        const fieldName = `body.${name}`;\n\n        return acc.concat(\n          <div key={field.label}>\n            {field.type == 'checkbox' ? (\n              <FormControlLabel\n                label={field.label}\n                control={\n                  <Field name={fieldName}>\n                    {props => (\n                      <Checkbox\n                        checked={props.input.value}\n                        onChange={props.input.onChange}\n                        name={fieldName}\n                      />\n                    )}\n                  </Field>\n                }\n              />\n            ) : (\n              <Field\n                name={fieldName}\n                label={field.label}\n                key={field.label}\n                className={(name === 'path' && 'mono') || ''}\n                component={field.type !== 'checkbox' ? TextInput : Checkbox}\n                fullWidth\n                type={field.type}\n                multiline={field.multiline}\n                options={options}\n                disabled={field.disabled && !deprecationOverride}\n                placeholder={field.placeholder}\n              />\n            )}\n            {field.disabled && (\n              <div className={classes.deprecation}>\n                <br />\n                <FormControlLabel\n                  control={\n                    <Checkbox\n                      checked={deprecationOverride}\n                      onChange={() =>\n                        setDeprecationOverride(!deprecationOverride)\n                      }\n                    />\n                  }\n                  label={`Allow ${field.label} edit. (${\n                    field.deprecationMessage || 'see adaptor for details'\n                  })`}\n                />\n              </div>\n            )}\n            <br />\n            <br />\n          </div>\n        );\n      }, [])\n    : null;\n\n  const ExternalIdLabel = (\n    <div>\n      External ID&nbsp;\n      <Tooltip\n        title=\"For use with 'keychain' credentials, the external ID is\n      the value through which credential will be selected by variable source\n      data.\"\n      >\n        <HelpIcon fontSize=\"inherit\" />\n      </Tooltip>\n    </div>\n  );\n\n  const submit = async values => {\n    try {\n      const action = credentialSlug ? updateCredential : createCredential;\n      await dispatch(action(values));\n\n      if (selectedProject) {\n        history.push(projectCredentialsPath(selectedProject));\n      } else {\n        history.push(credentialsPath());\n      }\n      return true;\n    } catch (error) {\n      if (error instanceof UnprocessableEntity) {\n        return createFormErrors(error.errors, values);\n      }\n\n      return error;\n    }\n  };\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      initialValues={initialValues}\n      render={({\n        handleSubmit,\n        dirtySinceLastSubmit,\n        initialValues,\n        form,\n        submitErrors,\n      }) => {\n        if (submitErrors instanceof Error) {\n          throw submitErrors;\n        }\n\n        return (\n          <form onSubmit={handleSubmit} autoComplete=\"off\">\n            <CardContent>\n              <Field\n                name=\"name\"\n                label=\"Name\"\n                fullWidth\n                component={TextInput}\n                type=\"text\"\n              />\n              <br />\n              {initialValues.adaptor !== 'keychain' && (\n                <div>\n                  <FieldWithBlank\n                    name=\"externalId\"\n                    fullWidth\n                    label={ExternalIdLabel}\n                    component={TextInput}\n                    type=\"text\"\n                    placeholder=\"Leave this blank unless accessing via keychains\"\n                  />\n                  <br />\n                </div>\n              )}\n              {bodyFields}\n              {!bodyFields && (\n                <div>\n                  <Button\n                    onClick={() => setShowRawJson(!showRawJson)}\n                    variant=\"outlined\"\n                    startIcon={showRawJson ? <VisibilityOff /> : <Visibility />}\n                  >\n                    {showRawJson ? 'Hide' : 'Show'} Raw JSON Configuration\n                  </Button>\n                  <Hidden xsUp={!showRawJson} implementation=\"css\">\n                    <Field\n                      name=\"body\"\n                      label=\"Configuration\"\n                      fullWidth\n                      multiline\n                      monospace\n                      component={TextInput}\n                      type=\"text\"\n                      placeholder=\"{ ... }\"\n                    />\n                    <br />\n                  </Hidden>\n                </div>\n              )}\n              {submitErrors?.otherError && !dirtySinceLastSubmit && (\n                <Typography className={classes.error}>\n                  {submitErrors?.otherError}\n                </Typography>\n              )}\n            </CardContent>\n            <FormActions\n              submit={handleSubmit}\n              reset={form.reset}\n              cancel={onCancel}\n              form={form}\n            />\n            <KeyBinding onKey={e => formSaveKeys(e, handleSubmit)} />\n          </form>\n        );\n      }}\n    />\n  );\n}\n\nCredentialForm.propTypes = {\n  bodySchema: PropTypes.object,\n  onCancel: PropTypes.func.isRequired,\n  initialValues: PropTypes.object.isRequired,\n  selectedProject: PropTypes.object.isRequired,\n};\n\nCredentialForm.defaultProps = {\n  bodySchema: null,\n};\n\nexport default CredentialForm;\n","import React, { useState } from 'react';\nimport {\n  Avatar,\n  Accordion,\n  AccordionDetails,\n  AccordionSummary,\n  Button,\n  Card,\n  CardHeader,\n  CardActions,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Tooltip,\n  Typography,\n  Grid,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  AssignmentInd as AssignmentIndIcon,\n  Help as HelpIcon,\n  ExpandMore as ExpandMoreIcon,\n} from '@material-ui/icons/';\nimport { Field, Form } from 'react-final-form';\nimport { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { transferCredential } from '../../actions/CredentialActions';\nimport { UnprocessableEntity } from '../../errors';\nimport { createFormErrors } from '../../helpers';\nimport {\n  credentialsPath,\n  projectCredentialsPath,\n} from '../../helpers/pathHelpers';\nimport TextInput from '../FormHelpers/TextInput';\n\nconst useStyles = makeStyles(theme => ({\n  red: {\n    color: theme.palette.error.main,\n  },\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  header: {\n    padding: 0,\n  },\n  help: {\n    marginLeft: theme.spacing(0.5),\n  },\n  action: {\n    paddingLeft: 0,\n  },\n}));\n\nconst validate = values => {\n  const errors = {};\n  if (!values.email) {\n    errors.email = 'Required';\n  }\n  if (!values.userId) {\n    errors.userId = 'Required';\n  }\n  return errors;\n};\n\nfunction CredentialOwnershipTransfer({ selectedProject, credential }) {\n  const classes = useStyles();\n  const history = useHistory();\n  const dispatch = useDispatch();\n  const [modalShow, setModalShow] = useState(false);\n\n  const submit = async values => {\n    setModalShow(false);\n    try {\n      await dispatch(transferCredential(credential, values));\n      if (selectedProject) {\n        history.push(projectCredentialsPath(selectedProject));\n      } else {\n        history.push(credentialsPath());\n      }\n      return true;\n    } catch (error) {\n      if (error instanceof UnprocessableEntity) {\n        return createFormErrors(error.errors, values);\n      }\n\n      return error;\n    }\n  };\n\n  return (\n    <Card aria-label=\"ownership-transfer-card\">\n      <Accordion>\n        <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n          <CardHeader\n            className={classes.header}\n            avatar={\n              <Avatar className={classes.avatar}>\n                <AssignmentIndIcon />\n              </Avatar>\n            }\n            title={\n              <div>\n                Ownership Transfer{' '}\n                <Tooltip\n                  className={classes.help}\n                  title=\"Warning: Transferring credential ownership will allow the\n                recipient to view your username, email address, password, or\n                other sensitive information. You will lose access to the\n                credential immediately.\"\n                >\n                  <HelpIcon fontSize=\"inherit\" />\n                </Tooltip>\n              </div>\n            }\n          />\n        </AccordionSummary>\n        <AccordionDetails>\n          <Grid container>\n            <Grid item xs={12}>\n              <Typography color=\"textPrimary\">\n                Enter the email address and user number (this can be found on\n                the recipient&apos;s account setting page) of the <em>new</em>{' '}\n                credential owner. You will loose access to the credential\n                immediately. The new owner may be able to view or modify\n                personal or sensitive information stored on this credential.\n              </Typography>\n            </Grid>\n            <Grid item xs={12}>\n              <Form\n                onSubmit={submit}\n                validate={validate}\n                initialValues={{}}\n                render={({\n                  values,\n                  submitErrors,\n                  handleSubmit,\n                  valid,\n                  dirtySinceLastSubmit,\n                }) => {\n                  if (submitErrors instanceof Error) throw submitErrors;\n\n                  return (\n                    <>\n                      <form onSubmit={handleSubmit}>\n                        <Grid container>\n                          <Grid item xs={12} md={6}>\n                            <Field\n                              size=\"small\"\n                              label=\"Recipient Email\"\n                              name=\"email\"\n                              component={TextInput}\n                              variant=\"outlined\"\n                              inputProps={{\n                                'aria-label': 'Recipient Email',\n                              }}\n                            />\n                          </Grid>\n                          <Grid item>\n                            <Field\n                              size=\"small\"\n                              label=\"Recipient User No.\"\n                              name=\"userId\"\n                              component={TextInput}\n                              variant=\"outlined\"\n                              inputProps={{\n                                'aria-label': 'Recipient User Number',\n                              }}\n                            />\n                          </Grid>\n                        </Grid>\n                        <CardActions className={classes.action}>\n                          <Button\n                            variant=\"contained\"\n                            color=\"primary\"\n                            onClick={() => setModalShow(true)}\n                            disabled={!valid && !dirtySinceLastSubmit}\n                            data-testid=\"Transfer Ownership\"\n                          >\n                            Transfer Ownership\n                          </Button>\n                        </CardActions>\n                        <Dialog\n                          open={modalShow}\n                          onClose={() => setModalShow(false)}\n                        >\n                          <DialogTitle>\n                            <Typography variant=\"h6\">\n                              Are you sure you wish to transfer your &quot;\n                              {credential.name}\n                              &quot; credential?\n                            </Typography>\n                          </DialogTitle>\n                          <DialogContent>\n                            <Typography>\n                              If you proceed, you will not be able to regain\n                              access to this credential without the new owner.\n                              The new owner will be able to view and modify\n                              information stored on this credential, potentially\n                              including personal or sensitive data. You will\n                              still be able to use this credential for jobs in\n                              the projects to which it has been shared (see\n                              above list) until and unless the new owner revokes\n                              that project-level access.\n                            </Typography>\n                          </DialogContent>\n                          <DialogActions>\n                            <Button onClick={() => setModalShow(false)}>\n                              No, I&apos;m not sure.\n                            </Button>\n                            <Button\n                              id=\"transfer_credential_button\"\n                              onClick={handleSubmit}\n                              className={classes.red}\n                              color=\"inherit\"\n                            >\n                              Yes, transfer this credential to{' '}\n                              {values.email}.\n                            </Button>\n                          </DialogActions>\n                        </Dialog>\n                      </form>\n                    </>\n                  );\n                }}\n              />\n            </Grid>\n          </Grid>\n        </AccordionDetails>\n      </Accordion>\n    </Card>\n  );\n}\n\nexport default CredentialOwnershipTransfer;\n","import React, { useState, useEffect, useMemo } from 'react';\nimport {\n  Avatar,\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  Checkbox,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  IconButton,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  Delete as DeleteIcon,\n  SupervisorAccount as SupervisorAccountIcon,\n  VpnKey as VpnKeyIcon,\n} from '@material-ui/icons/';\nimport { isEqual, values } from 'lodash';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport {\n  deleteCredential,\n  fetchCredential,\n  toggleProjectCredential,\n} from '../../actions/CredentialActions';\nimport { getAdaptors } from '../../actions/JobActions';\nimport { switchedMenu } from '../../actions/MenuActions';\nimport { UnprocessableEntity } from '../../errors';\nimport Images from '../../helpers/imagePaths';\nimport {\n  credentialsPath,\n  projectCredentialsPath,\n} from '../../helpers/pathHelpers';\nimport Loader from '../Loader';\nimport bodySchemas from './BodySchemas';\nimport CredentialForm from './CredentialForm';\nimport CredentialOwnershipTranser from './CredentialOwnershipTransfer';\nimport MasonryWrapper from '../MasonryWrapper';\nimport { findCredential } from '../../selectors';\n\nconst useStyles = makeStyles(theme => ({\n  imageSubheader: {\n    maxHeight: 20,\n    maxWidth: 64,\n  },\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  red: {\n    color: theme.palette.error.main,\n  },\n  accessSection: {\n    borderBottomLeftRadius: 0,\n    borderBottomRightRadius: 0,\n  },\n}));\n\n// Prepend all the body fields for the adaptor with `body.`\n// So that redux form knows they are nested (or an object)\nfunction mapSchemaToFieldNames(schema) {\n  if (schema == null) {\n    return [\n      'id',\n      'name',\n      'externalId',\n      'projectId',\n      'adaptor',\n      'userId',\n      'body',\n    ];\n  }\n  return [\n    'id',\n    'name',\n    'externalId',\n    'projectId',\n    'adaptor',\n    'userId',\n    ...Object.keys(schema || {}).map(k => `body.${k}`),\n  ];\n}\n\nfunction CredentialView(props) {\n  const { selectedProject, onCancel, onSubmitComplete } = props;\n  const history = useHistory();\n  const dispatch = useDispatch();\n  const classes = useStyles();\n  const params = useParams();\n  const [deleteModalShow, setDeleteModalShow] = useState(false);\n  const { currentUserId } = useSelector(state => state.auth);\n\n  const credentialAdaptors = [\n    ...useSelector(state => state.adaptors.items),\n    { name: 'OAuth 2.0', module: 'oauth2' },\n    { name: 'Variable Auth (Keychain)', module: 'keychain' },\n    { name: 'Raw JSON', module: 'raw' },\n    { module: 'sharepoint', name: 'Sharepoint' },\n    { name: 'SSL Certificate', module: 'certificate' },\n  ];\n\n  const { credentialSlug } = params;\n  const adaptorKey = params.adaptorKey || props.adaptorKey;\n\n  const newCred = useMemo(\n    () =>\n      selectedProject\n        ? {\n            adaptor: adaptorKey,\n            userId: currentUserId,\n            projectId: selectedProject.id,\n          }\n        : { adaptor: adaptorKey, userId: currentUserId },\n    [selectedProject, adaptorKey, currentUserId]\n  );\n\n  const exisitingCred = useSelector(\n    state => findCredential(state, credentialSlug),\n    isEqual\n  );\n\n  const credential = useMemo(\n    () => exisitingCred || newCred,\n    [exisitingCred, newCred]\n  );\n\n  const { id } = credential;\n\n  const adaptor = credentialAdaptors.find(\n    a => a.module === credential?.adaptor\n  );\n\n  const isLoading =\n    useSelector(state => state.credentials.isLoading) ||\n    !(credential && adaptor);\n\n  const allowList = credential?.projects || [];\n\n  const allProjects = useSelector(state => state.projects.items, isEqual);\n\n  const projects = useMemo(\n    () =>\n      values(allProjects).sort((a, b) => {\n        if (a.name.toUpperCase() > b.name.toUpperCase()) {\n          return 1;\n        }\n        if (a.name.toUpperCase() < b.name.toUpperCase()) {\n          return -1;\n        }\n        return 0;\n      }) || [],\n    [allProjects]\n  );\n\n  const error = useSelector(state => state.credentials.error);\n\n  const handleCancel = () => {\n    if (onCancel) {\n      onCancel();\n    } else {\n      history.goBack();\n    }\n  };\n\n  const handleDelete = () => {\n    if (selectedProject) {\n      dispatch(deleteCredential(credential)).then(() =>\n        history.push(projectCredentialsPath(selectedProject))\n      );\n    } else {\n      dispatch(deleteCredential(credential)).then(() =>\n        history.push(credentialsPath())\n      );\n    }\n  };\n\n  const handleProjectCredential = projectId => {\n    dispatch(toggleProjectCredential(credential, projectId));\n  };\n\n  useEffect(() => {\n    document.title = 'Credential Edit - OpenFn';\n    dispatch(switchedMenu('Credentials'));\n    dispatch(getAdaptors());\n  }, [dispatch]);\n\n  useEffect(() => {\n    if (credentialSlug) {\n      dispatch(fetchCredential({ slug: credentialSlug }));\n    }\n  }, [dispatch, credentialSlug]);\n\n  if (error) {\n    throw error;\n  }\n\n  if (isLoading) {\n    return <Loader item=\"credential\" />;\n  }\n\n  const bodySchema = bodySchemas[credential.adaptor];\n  const fields = mapSchemaToFieldNames(bodySchema);\n\n  const KeychainHelper = (\n    <Card>\n      <CardHeader title=\"How to use keychain credentials\" />\n      <CardContent>\n        <Typography>\n          Keychains allow your jobs to make use of different credentials\n          depending on the data they receive in each run.\n        </Typography>\n        <br />\n        <Typography>\n          Provide an array of keys that will lead to the external ID of a\n          credential in this project to be used for a given run. For example, a\n          job using a keychain credential with the following path:\n        </Typography>\n        <Typography>\n          <pre>[&quot;form&quot;, &quot;special&quot;, &quot;user&quot;]</pre>\n        </Typography>\n        <Typography>\n          will select the credential with <b>external ID</b> <code>15</code>{' '}\n          given a message:\n        </Typography>\n        <Typography>\n          <pre>\n            &#123;\n            <br />\n            &nbsp;&nbsp;&quot;date&quot;: &quot;2018-01-16&quot;,\n            <br />\n            &nbsp;&nbsp;&quot;form&quot;: &#123;\n            <br />\n            &nbsp;&nbsp;&nbsp;&nbsp;&quot;patient_no&quot;: 007,\n            <br />\n            &nbsp;&nbsp;&nbsp;&nbsp;&quot;special&quot;: &#123;\n            <br />\n            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;user&quot;: 15\n            <br />\n            &nbsp;&nbsp;&nbsp;&nbsp;&#125;\n            <br />\n            &nbsp;&nbsp;&#125;\n            <br />\n            &#125;\n          </pre>\n        </Typography>\n        <Typography>\n          Finally, if a credential is not found given the id provided by your\n          message data, the <code>default value</code> will be used to identy a\n          credential.\n        </Typography>\n      </CardContent>\n    </Card>\n  );\n\n  const DeleteModal = (\n    <Dialog open={deleteModalShow} onClose={() => setDeleteModalShow(false)}>\n      <DialogTitle>\n        <Typography variant=\"h6\">\n          Are you sure you wish to delete the <b>{credential.name}</b>{' '}\n          credential?\n        </Typography>\n      </DialogTitle>\n      <DialogContent>\n        <Typography>\n          If you proceed, OpenFn will delete this credential{' '}\n          <em>immediately</em> for security reasons. You will not be able to\n          restore the credential once this is done, but you may create a new\n          credential with the same login information. If jobs are currently\n          using this credential, they may not run successfully until you add a\n          new credential and assign it to those jobs.\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={() => setDeleteModalShow(false)}>\n          No, I&apos;m not sure.\n        </Button>\n        <Button\n          id=\"delete_credential_button\"\n          onClick={handleDelete}\n          className={classes.red}\n          color=\"inherit\"\n        >\n          Yes, delete this credential immediately.\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n\n  // In the case of GoogleSheets, which has it's own component - we\n  // check if the schema is a function. If it is, then we just use that.\n  // Otherwise we pass the schema into the `CredentialForm` which generates\n  // the form for us.\n  const FormComponent =\n    (bodySchema && bodySchema.WrappedComponent) ||\n    typeof bodySchema === 'function'\n      ? bodySchema\n      : CredentialForm;\n\n  return (\n    <MasonryWrapper columnBreakpoints={2}>\n      <Card>\n        <CardHeader\n          titleTypographyProps={{ noWrap: true }}\n          subheaderTypographyProps={{ noWrap: true }}\n          avatar={\n            <Avatar className={classes.avatar}>\n              <VpnKeyIcon />\n            </Avatar>\n          }\n          title={credential.name || 'New Credential'}\n          subheader={\n            <img\n              src={Images[adaptor.module]}\n              alt={adaptor.name}\n              className={classes.imageSubheader}\n            />\n          }\n          action={\n            <IconButton onClick={() => setDeleteModalShow(true)}>\n              <DeleteIcon />\n            </IconButton>\n          }\n        />\n        <FormComponent\n          bodySchema={bodySchema}\n          fields={fields}\n          initialValues={credential}\n          onCancel={handleCancel}\n          onSubmitComplete={credentialSlug ? null : onSubmitComplete}\n          selectedProject={selectedProject}\n        />\n        {credentialSlug && DeleteModal}\n      </Card>\n      {credential.adaptor === 'keychain' && KeychainHelper}\n      <Card className={classes.accessSection}>\n        <CardHeader\n          title=\"Manage Access\"\n          subheader={\n            credentialSlug\n              ? 'Grant usage access for this credential to projects or transfer ownership.'\n              : 'After saving this credential you can grant your projects access to it.'\n          }\n          avatar={\n            <Avatar className={classes.avatar}>\n              <SupervisorAccountIcon />\n            </Avatar>\n          }\n        />\n        <CardContent>\n          <Table aria-label=\"manage access table\">\n            <TableHead>\n              <TableRow aria-label=\"manage access header row\" role=\"row\">\n                <TableCell>Project</TableCell>\n                <TableCell>Authorized?</TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {projects.map(p => (\n                <TableRow\n                  key={p.id}\n                  aria-label={`${p.name.toLowerCase()} row`}\n                  role=\"row\"\n                  hover\n                >\n                  <TableCell>{p.name}</TableCell>\n                  <TableCell>\n                    <Checkbox\n                      disabled={!credentialSlug}\n                      checked={allowList.includes(p.id)}\n                      onChange={() => handleProjectCredential(p.id)}\n                      inputProps={{ 'aria-label': 'primary checkbox' }}\n                    />\n                  </TableCell>\n                </TableRow>\n              ))}\n            </TableBody>\n          </Table>\n        </CardContent>\n      </Card>\n\n      {credentialSlug && (\n        <CredentialOwnershipTranser\n          selectedProject={selectedProject}\n          credential={credential}\n        />\n      )}\n    </MasonryWrapper>\n  );\n}\n\nexport default CredentialView;\n","import React, { useState, useEffect } from 'react';\nimport {\n  Button,\n  Dialog,\n  DialogContent,\n  DialogContentText,\n  DialogTitle,\n  Grid,\n} from '@material-ui/core/';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { isEqual, orderBy } from 'lodash';\nimport { useHistory } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { getAdaptors } from '../../actions/JobActions';\nimport { clickEvent } from '../../helpers';\nimport Images from '../../helpers/imagePaths';\nimport {\n  newCredentialPath,\n  projectNewCredentialPath,\n} from '../../helpers/pathHelpers';\nimport CredentialView from './CredentialView';\n\nconst useStyles = makeStyles(theme => ({\n  separator: {\n    borderTop: `1.5px solid ${theme.palette.grey[400]}`,\n    borderBottom: 'none',\n  },\n  buttonContainer: {\n    display: 'block',\n    textAlign: 'center',\n    '& > *': {\n      margin: theme.spacing(1),\n    },\n  },\n  media: {\n    marginRight: theme.spacing(1),\n    maxHeight: 20,\n  },\n}));\n\nfunction CredentialModal({\n  selectedProject,\n  show,\n  onHide,\n  linkTo,\n  fromWizard,\n}) {\n  const [selectedAdaptor, setSelectedAdaptor] = useState({});\n  const history = useHistory();\n  const classes = useStyles();\n  const dispatch = useDispatch();\n\n  const adaptorsList = [\n    ...Object.values(useSelector(state => state.adaptors.items, isEqual)),\n    { module: 'sharepoint', name: 'Sharepoint' },\n  ];\n\n  const credentialsList = orderBy(\n    adaptorsList.filter(x => x.module !== 'http'),\n    [c => c.name.toLowerCase()]\n  );\n\n  const gernericsList = [\n    { module: 'http', name: 'HTTP (Basic/Digest)' },\n    { module: 'oauth2', name: 'OAuth 2.0' },\n    { module: 'raw', name: 'Raw JSON' },\n    { module: 'certificate', name: 'SSL Certificate' },\n    { module: 'keychain', name: 'Variable Auth (Keychain)' },\n  ];\n\n  const onAdaptorSelect = a => {\n    clickEvent('Adaptors', 'Selected', a.name);\n    if (fromWizard) {\n      setSelectedAdaptor(a);\n    } else if (selectedProject.id) {\n      linkTo(projectNewCredentialPath(selectedProject, a), history);\n    } else {\n      linkTo(newCredentialPath(a), history);\n    }\n  };\n\n  const onSubmitComplete = () => {\n    setSelectedAdaptor({});\n  };\n\n  const onModalHide = () => {\n    onHide();\n    setSelectedAdaptor({});\n  };\n\n  useEffect(() => {\n    dispatch(getAdaptors());\n    setSelectedAdaptor(selectedAdaptor);\n  }, [dispatch, selectedAdaptor]);\n\n  return (\n    <Dialog\n      maxWidth=\"lg\"\n      open={show}\n      onClose={onModalHide}\n      className={classes.dialog}\n    >\n      <DialogTitle>\n        {selectedAdaptor.name\n          ? `Configure your ${selectedAdaptor.name} Credential`\n          : 'Which type of credential would you like to create?'}\n      </DialogTitle>\n      <DialogContent>\n        <DialogContentText>\n          Choose between generic or application-specific credential templates.\n        </DialogContentText>\n        <Grid container direction=\"row\" justifyContent=\"center\" spacing={2}>\n          {selectedAdaptor.name && (\n            <CredentialView\n              fromWizard={fromWizard}\n              selectedProject={selectedProject}\n              adaptorKey={selectedAdaptor.module}\n              onCancel={onModalHide}\n              onSubmitComplete={onSubmitComplete}\n            />\n          )}\n          {!selectedAdaptor.name && credentialsList.length > 0 && (\n            <Grid item className={classes.buttonContainer}>\n              {gernericsList.map(a => (\n                <Button\n                  key={a.name}\n                  variant=\"outlined\"\n                  id={`new-${a.name}`}\n                  onClick={() => onAdaptorSelect(a)}\n                >\n                  <img\n                    src={Images[a.module]}\n                    alt={`language-${a.module}`}\n                    className={classes.media}\n                  />\n                  <small>{a.name}</small>\n                </Button>\n              ))}\n              <hr className={classes.separator} />\n              {credentialsList.map(a => (\n                <Button\n                  key={a.name}\n                  variant=\"outlined\"\n                  id={`new-${a.name}`}\n                  onClick={() => onAdaptorSelect(a)}\n                >\n                  <img\n                    src={Images[a.module]}\n                    alt={`language-${a.module}`}\n                    className={classes.media}\n                  />\n                  <small>{a.name}</small>\n                </Button>\n              ))}\n            </Grid>\n          )}\n        </Grid>\n      </DialogContent>\n      <br />\n    </Dialog>\n  );\n}\n\nCredentialModal.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n  show: PropTypes.bool.isRequired,\n  onHide: PropTypes.func.isRequired,\n  linkTo: PropTypes.func.isRequired,\n  fromWizard: PropTypes.bool,\n};\n\nCredentialModal.defaultProps = {\n  fromWizard: false,\n};\n\nexport default CredentialModal;\n","import React from 'react';\nimport {\n  Button,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Typography,\n} from '@material-ui/core';\nimport { useHistory } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { linkTo } from '../../helpers';\nimport { credentialsPath } from '../../helpers/pathHelpers';\n\nfunction CredentialAssignmentModal({ show, onHide }) {\n  const history = useHistory();\n\n  return (\n    <Dialog open={show} onClose={onHide}>\n      <DialogTitle>\n        Grant this project access to one of your credentials.\n      </DialogTitle>\n      <DialogContent>\n        <Typography>\n          Instead of duplicating your credentials in multiple projects, click\n          &apos;My Credentials&apos; below and then select an existing\n          credential. From the edit page of the credential, you can assign it\n          for use in any of your projects.\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={onHide} autoFocus=\"autoFocus\">\n          Close\n        </Button>\n        <Button onClick={linkTo(credentialsPath(), history)} color=\"primary\">\n          My Credentials\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n}\n\nCredentialAssignmentModal.propTypes = {\n  show: PropTypes.bool.isRequired,\n  onHide: PropTypes.func.isRequired,\n};\n\nexport default React.memo(CredentialAssignmentModal);\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core';\nimport Avatar from '@material-ui/core/Avatar';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Grid from '@material-ui/core/Grid';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport VpnKeyIcon from '@material-ui/icons/VpnKey';\nimport PropTypes from 'prop-types';\nimport Images from '../../helpers/imagePaths';\n\nconst useStyles = makeStyles(theme => ({\n  media: {\n    maxHeight: 40,\n    maxWidth: 100,\n  },\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n}));\n\nfunction ErrorTokenRequest(credential) {\n  const errorText = (\n    <Tooltip>\n      Error{' '}\n      {credential.body.error\n        ? `${credential.body.status}: ${credential.body.error}`\n        : `${credential.body.status}.`}\n    </Tooltip>\n  );\n\n  return (\n    <Tooltip title={errorText}>\n      <ErrorOutlineIcon style={{ color: 'red' }} />\n    </Tooltip>\n  );\n}\n\nfunction CredentialItem({ credential, currentUserId, onClick }) {\n  const classes = useStyles();\n\n  const currentUserIsOwner = credential.userId == currentUserId;\n\n  const requestTokenError = credential.status ? (\n    <ErrorTokenRequest body={credential} />\n  ) : null;\n\n  return (\n    <Card>\n      <CardHeader\n        titleTypographyProps={{ noWrap: true }}\n        subheaderTypographyProps={{ noWrap: true }}\n        title={credential.name}\n        subheader={credential.adaptor}\n        actions={requestTokenError}\n        avatar={\n          <Avatar className={classes.avatar}>\n            <VpnKeyIcon />\n          </Avatar>\n        }\n      />\n      <CardContent>\n        <Grid container justifyContent=\"center\">\n          <Grid item>\n            <img\n              src={Images[credential.adaptor]}\n              alt={`language-${credential.adaptor}`}\n              className={classes.media}\n            />\n          </Grid>\n        </Grid>\n      </CardContent>\n      <CardActions>\n        <Button id=\"edit\" onClick={onClick} disabled={!currentUserIsOwner}>\n          {currentUserIsOwner ? 'Edit' : credential.userEmail}\n        </Button>\n      </CardActions>\n    </Card>\n  );\n}\n\nCredentialItem.propTypes = {\n  onClick: PropTypes.func.isRequired,\n  credential: PropTypes.object.isRequired,\n  currentUserId: PropTypes.number.isRequired,\n};\n\nexport default CredentialItem;\n","import React, { useEffect, useState } from 'react';\nimport { isEqual, orderBy } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { fetchCredentials } from '../../actions/CredentialActions';\nimport { switchedMenu } from '../../actions/MenuActions';\nimport { linkTo, pushTo } from '../../helpers';\nimport {\n  credentialPath,\n  credentialsPath,\n  projectCredentialPath,\n} from '../../helpers/pathHelpers';\nimport Loader from '../Loader';\nimport MasonryWrapper from '../MasonryWrapper';\nimport SectionFrame from '../SectionFrame';\nimport CredentialModal from './CredentialModal';\nimport CredentialAssignmentModal from './CredentialAssignmentModal';\nimport CredentialItem from './CredentialItem';\n\nfunction CredentialsList({ selectedProject }) {\n  const dispatch = useDispatch();\n\n  const history = useHistory();\n\n  const location = useHistory();\n\n  const [filter, setFilter] = useState('');\n\n  const [showCredModal, setShowCredModal] = useState(false);\n\n  const [showAssignmentModal, setShowAssignmentModal] = useState(false);\n\n  const projectId = selectedProject?.id;\n\n  const credentials = useSelector(\n    state =>\n      orderBy(Object.values(state.credentials.items), [\n        c => c.name.toLowerCase(),\n      ]),\n    isEqual\n  );\n\n  const { currentUserId } = useSelector(state => state.auth, isEqual);\n\n  const isLoading = useSelector(state => state.credentials.isLoading);\n\n  const handleFilterChange = e => {\n    setFilter(e.target.value.toLowerCase());\n  };\n\n  const includesText = credential => {\n    return credential.name.toLowerCase().includes(filter);\n  };\n\n  const openCredModal = () => {\n    setShowCredModal(true);\n  };\n\n  const openAssignmentModal = () => {\n    setShowAssignmentModal(true);\n  };\n\n  const closeModals = () => {\n    setShowCredModal(false);\n    setShowAssignmentModal(false);\n  };\n\n  useEffect(() => {\n    dispatch(fetchCredentials({ projectId }));\n  }, [dispatch, projectId]);\n\n  useEffect(() => {\n    if (location.location.pathname === credentialsPath()) {\n      document.title = 'My Credentials - OpenFn';\n      dispatch(switchedMenu('My Credentials'));\n    } else {\n      dispatch(switchedMenu('Credentials'));\n      document.title = 'Credentials - OpenFn';\n    }\n  }, [dispatch, location.location.pathname]);\n\n  return (\n    <div className=\"container-fluid credentials\">\n      <SectionFrame\n        section=\"credential\"\n        helper=\"Filter credentials by name.\"\n        search={handleFilterChange}\n        searchText={filter}\n        // create={location.pathname !== '/credentials' && this.openCredModal}\n        create={openCredModal}\n        assign={\n          location.location.pathname.includes('projects') && openAssignmentModal\n        }\n      />\n      <CredentialModal\n        show={showCredModal}\n        onHide={closeModals}\n        linkTo={pushTo}\n        selectedProject={selectedProject}\n      />\n      <CredentialAssignmentModal\n        show={showAssignmentModal}\n        onHide={closeModals}\n      />\n      {isLoading ? (\n        <Loader item=\"credentials\" />\n      ) : (\n        <MasonryWrapper>\n          {credentials.filter(includesText).map(c => {\n            return (\n              <CredentialItem\n                key={c.id}\n                credential={c}\n                onClick={\n                  projectId\n                    ? linkTo(projectCredentialPath(selectedProject, c), history)\n                    : linkTo(credentialPath(c), history)\n                }\n                currentUserId={currentUserId}\n              />\n            );\n          })}\n        </MasonryWrapper>\n      )}\n    </div>\n  );\n}\n\nCredentialsList.propTypes = {\n  selectedProject: PropTypes.object,\n};\n\nCredentialsList.defaultProps = {\n  selectedProject: { id: null },\n};\n\nexport default CredentialsList;\n","import React from 'react';\nimport { Redirect } from 'react-router-dom';\nimport {\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  Grid,\n  Typography,\n} from '@material-ui/core';\n\nimport { BadRequest, NotFound, Unauthorized } from '../errors';\n\nexport function ErrorPresenter({\n  error,\n  history,\n  resetErrorHandler,\n  showReportDialog,\n}) {\n  // TODO: remove this when all consumers can provide Error instances\n  const errorCode =\n    error?.status ||\n    error?.response?.status ||\n    error?.payload?.response?.status;\n  switch (true) {\n    case error instanceof NotFound:\n    case errorCode == 404:\n      return (\n        <ErrorDisplay\n          resetErrorHandler={resetErrorHandler}\n          showReportDialog={showReportDialog}\n        >\n          {fourOhFour}\n        </ErrorDisplay>\n      );\n\n    case error instanceof Unauthorized:\n    case errorCode == 401:\n      return (\n        <Redirect\n          to={{\n            pathname: '/login',\n            state: { from: history?.location, expired: true },\n          }}\n        />\n      );\n\n    case error instanceof BadRequest:\n    case errorCode == 400:\n      return (\n        <ErrorDisplay\n          resetErrorHandler={resetErrorHandler}\n          showReportDialog={showReportDialog}\n        >\n          {fourHundred}\n        </ErrorDisplay>\n      );\n\n    default:\n      return (\n        <ErrorDisplay\n          resetErrorHandler={resetErrorHandler}\n          showReportDialog={showReportDialog}\n        >\n          {fiveHundred}\n        </ErrorDisplay>\n      );\n  }\n}\n\nconst fiveHundred = (\n  <>\n    <Typography variant=\"h1\">500</Typography>\n    <br />\n    <Typography variant=\"h5\">Something went wrong.</Typography>\n    <br />\n    <br />\n    <Typography>\n      We&apos;ve been notified of the error and will investigate it immediately.\n      Please try refreshing the page, or navigate to another view in OpenFn.\n    </Typography>\n  </>\n);\n\nconst fourHundred = (\n  <>\n    <Typography variant=\"h1\">400</Typography>\n    <br />\n    <Typography variant=\"h5\">That request doesn't look quite right.</Typography>\n    <br />\n    <br />\n    <Typography>\n      We got the request, however there was an issue with it's shape or contents\n      and we're unable to fulfil it. You could try checking the URL, going back,\n      or navigating home to {window.location.hostname}.\n    </Typography>\n  </>\n);\n\nconst fourOhFour = (\n  <>\n    <Typography variant=\"h1\">404</Typography>\n    <br />\n    <Typography variant=\"h5\">\n      This is not the web page you are looking for.\n    </Typography>\n    <br />\n    <Typography>\n      There is nothing here for you. You could try checking the URL, going back,\n      or navigating home to {window.location.hostname}.\n    </Typography>\n  </>\n);\n\nconst sentryFeedbackDialogOptions = {\n  title: 'Submit additional details',\n  subtitle: 'Our team at OpenFn has been notified of this issue.',\n  subtitle2:\n    \"If you'd like to help with more details, please tell us what happened below.\",\n};\n\nexport const ErrorDisplay = ({\n  resetErrorHandler,\n  showReportDialog,\n  children,\n}) => (\n  <Grid container justifyContent=\"center\">\n    <Grid item xs={12} sm={10} md={8} lg={6} xl={4}>\n      <Card id=\"error-handler\">\n        <CardContent>{children}</CardContent>\n        <CardActions>\n          <Button\n            id=\"go-back\"\n            color=\"primary\"\n            onClick={() => {\n              if (resetErrorHandler) {\n                resetErrorHandler();\n              }\n              history.back();\n            }}\n          >\n            Go Back\n          </Button>\n          {showReportDialog ? (\n            <Button\n              color=\"primary\"\n              onClick={() => showReportDialog(sentryFeedbackDialogOptions)}\n            >\n              Submit feedback\n            </Button>\n          ) : null}\n        </CardActions>\n      </Card>\n    </Grid>\n  </Grid>\n);\n","import Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport Grid from '@material-ui/core/Grid';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nconst styles = {\n  card: {\n    minWidth: 275,\n  },\n  bullet: {\n    display: 'inline-block',\n    margin: '0 2px',\n    transform: 'scale(0.8)',\n  },\n  title: {\n    fontSize: 14,\n  },\n  pos: {\n    marginBottom: 12,\n  },\n};\n\nfunction Maintenance(props) {\n  const { classes } = props;\n  const { MAINTENANCE_MESSAGE } = window;\n\n  return (\n    <Grid container justifyContent=\"center\" style={{ padding: '1em' }}>\n      <Grid item xs={12} sm={6} md={4}>\n        <Card className={classes.card}>\n          <CardContent>\n            <Typography\n              className={classes.title}\n              color=\"textSecondary\"\n              gutterBottom\n            >\n              OpenFn.org - Maintenance Mode\n            </Typography>\n            <Typography variant=\"h5\" component=\"h2\">\n              Front-end Maintenenance\n            </Typography>\n            <Typography className={classes.pos} color=\"textSecondary\">\n              We&apos;re currently working on the user interface, which includes\n              the screens you use to interact with your jobs, triggers, and\n              credentials.\n            </Typography>\n            {MAINTENANCE_MESSAGE && (\n              <Typography className={classes.pos} color=\"error\">\n                Message: {MAINTENANCE_MESSAGE}\n              </Typography>\n            )}\n            <Typography component=\"p\">\n              Please note that <b>the back-end is still running</b> in full\n              working order. This means that your inbox will still receive new\n              messages, and all jobs (whether based on timers, inbound messages,\n              or flows) will still be run as they have been configured.\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button size=\"small\" href=\"/\">\n              Back to OpenFn.org\n            </Button>\n            <Button size=\"small\" href=\"mailto:admin@openfn.org\" target=\"_blank\">\n              Contact Support\n            </Button>\n          </CardActions>\n        </Card>\n      </Grid>\n    </Grid>\n  );\n}\n\nMaintenance.propTypes = {\n  classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(Maintenance);\n","import { isEqualWith } from 'lodash';\nimport React, { useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Redirect, Route, useLocation } from 'react-router-dom';\nimport Loader from './Loader';\n\nfunction PrivateRoute({ children, ...rest }) {\n  const { isAuthenticated, expiration } = useSelector(state => state.auth);\n\n  if (isAuthenticated === null)\n    return <Loader verb=\"Authenticating\" item=\"session...\" />;\n\n  const isExpired = expiration < +new Date() / 1000;\n\n  return (\n    <Route\n      {...rest}\n      render={({ location }) => {\n        if (isAuthenticated && !isExpired) {\n          return children || null;\n        }\n        return (\n          <Redirect\n            to={{\n              pathname: '/login',\n              state: { from: location, expired: isAuthenticated && isExpired },\n            }}\n          />\n        );\n      }}\n    />\n  );\n}\n\nexport default React.memo(PrivateRoute);\n","import { camelizeKeys } from 'humps';\nimport {\n  usageCountApiPath,\n  usageCountsApiPath,\n  usageHistoryApiPath,\n} from '../helpers/actionsPathHelpers';\nimport { get } from './BaseClient';\n\nexport async function getUsageCount(project) {\n  const response = await get(usageCountApiPath(project));\n  const data = await response.json();\n  return camelizeKeys(data);\n}\n\nexport async function getUsageCounts() {\n  const response = await get(usageCountsApiPath());\n  const data = await response.json();\n  return camelizeKeys(data);\n}\n\nexport async function getUsageHistory(project) {\n  const response = await get(usageHistoryApiPath(project));\n  const data = await response.json();\n  return camelizeKeys(data);\n}\n","import {\n    getUsageCount,\n    getUsageCounts,\n    getUsageHistory\n} from '../clients/UsageCountClient';\nimport {\n    FAILED_USAGE_COUNTS, FAILED_USAGE_HISTORY, RECEIVED_USAGE_COUNTS, RECEIVED_USAGE_HISTORY, REQUESTED_USAGE_COUNTS, REQUESTED_USAGE_HISTORY\n} from '../constants';\n\n\nexport function fetchUsageCount(project) {\n  return {\n    promise: getUsageCount(project),\n    types: [REQUESTED_USAGE_COUNTS, RECEIVED_USAGE_COUNTS, FAILED_USAGE_COUNTS],\n  };\n}\n\nexport function fetchUsageCounts() {\n  return {\n    promise: getUsageCounts(),\n    types: [REQUESTED_USAGE_COUNTS, RECEIVED_USAGE_COUNTS, FAILED_USAGE_COUNTS],\n  };\n}\n\nexport function fetchUsageHistory(project) {\n  return {\n    promise: getUsageHistory(project),\n    types: [\n      REQUESTED_USAGE_HISTORY,\n      RECEIVED_USAGE_HISTORY,\n      FAILED_USAGE_HISTORY,\n    ],\n  };\n}\n","import { camelizeKeys, decamelizeKeys } from 'humps';\nimport { normalize, schema } from 'normalizr';\nimport { authMethodApiPath } from '../helpers/actionsPathHelpers';\nimport { AuthMethod } from '../schemas';\nimport { get, post } from './BaseClient';\n\nexport function getAuthMethods(project) {\n  return new Promise(resolve => {\n    get(authMethodApiPath(), { project_id: project.id }).then(\n      async response => {\n        const data = await response.json();\n        resolve(normalize(camelizeKeys(data), new schema.Array(AuthMethod)));\n      }\n    );\n  });\n}\n\nexport function postAuthMethod(authMethod) {\n  const payload = { auth_method: decamelizeKeys(authMethod) };\n  return post(authMethodApiPath(), payload)\n    .then(async response => {\n      const data = await response.json();\n      return normalize(camelizeKeys(data), AuthMethod);\n    })\n    .catch(error => {\n      return Promise.reject(error);\n    });\n}\n","import { getAuthMethods, postAuthMethod } from '../clients/AuthMethodClient';\nimport {\n  AUTH_METHODS_FAILURE,\n  AUTH_METHODS_REQUEST,\n  AUTH_METHODS_SUCCESS,\n  AUTH_METHOD_INVALID,\n  AUTH_METHOD_REMOVED,\n  AUTH_METHOD_SUCCESS,\n  CREATING_AUTH_METHOD,\n} from '../constants';\nimport { deleteAuthMethodPath } from '../helpers/actionsPathHelpers';\nimport Notifications from './Notifications';\nimport { del } from '../clients/BaseClient';\n\nfunction authMethodRemovedSuccess() {\n  return Notifications.add('Auth method succesfully removed.', 'info');\n}\n\nfunction authMethodAddedSuccess() {\n  return Notifications.add('Auth method added succesfully.', 'success');\n}\n\nfunction authMethodCreateFailed(error) {\n  return { type: AUTH_METHOD_INVALID, error };\n}\n\nfunction authMethodCreated(payload) {\n  return { type: AUTH_METHOD_SUCCESS, payload };\n}\n\nexport function fetchAuthMethods(project) {\n  return {\n    promise: getAuthMethods(project),\n    types: [AUTH_METHODS_REQUEST, AUTH_METHODS_SUCCESS, AUTH_METHODS_FAILURE],\n  };\n}\n\nexport function createAuthMethod(authMethod) {\n  return dispatch => {\n    dispatch({ type: CREATING_AUTH_METHOD, authMethod });\n    return postAuthMethod(authMethod)\n      .then(payload => dispatch(authMethodCreated(payload)))\n      .then(() => dispatch(authMethodAddedSuccess()))\n      .catch(error => dispatch(authMethodCreateFailed(error)));\n  };\n}\n\nexport function deleteAuthMethod(authMethod) {\n  return dispatch => {\n    del(deleteAuthMethodPath(authMethod))\n      .then(\n        dispatch({\n          type: AUTH_METHOD_REMOVED,\n          authMethodId: authMethod.id,\n        })\n      )\n      .then(dispatch(authMethodRemovedSuccess()));\n  };\n}\n","import { camelizeKeys } from 'humps';\nimport { normalize } from 'normalizr';\nimport {\n  COLLAB_EMAIL_NOT_FOUND,\n  PROJECT_USERS_SUCCESS,\n  PROJECT_USER_ALREADY_ADDED,\n  PROJECT_USER_CREATED,\n  PROJECT_USER_REMOVED,\n} from '../constants';\nimport {\n  projectUserApiPath,\n  projectUsersApiPath,\n  userByEmailApiPath,\n} from '../helpers/actionsPathHelpers';\nimport { ProjectUser } from '../schemas';\nimport Notifications from './Notifications';\nimport { get, del, post } from '../clients/BaseClient';\n\nfunction collabAddedSuccess() {\n  return Notifications.add('Collaborator added successfully.', 'success');\n}\n\nfunction collabAddedFailure() {\n  return Notifications.add('Collaborator could not be added.', 'error');\n}\n\nfunction collabAlreadyAdded() {\n  return Notifications.add(\n    'It looks like this user already has access.',\n    'warning'\n  );\n}\n\nfunction collabRemovedSuccess() {\n  return Notifications.add('Collaborator successfully removed.', 'info');\n}\n\nfunction collabRemovedFailure() {\n  return Notifications.add('Collaborator could not be removed.', 'error');\n}\n\nexport function fetchProjectUsers(project) {\n  return dispatch => {\n    get(projectUsersApiPath(), { project_id: project.id }).then(\n      async response => {\n        const data = await response.json();\n        dispatch({\n          type: PROJECT_USERS_SUCCESS,\n          data: normalize(camelizeKeys(data), {\n            projectUsers: [ProjectUser],\n          }),\n        });\n      }\n    );\n  };\n}\n\nexport function deleteProjectUser(projectUser) {\n  return dispatch => {\n    del(projectUserApiPath(projectUser))\n      .then(response => {\n        dispatch({\n          type: PROJECT_USER_REMOVED,\n          projectUserId: projectUser.id,\n        });\n        dispatch(collabRemovedSuccess());\n      })\n      .catch(err => {\n        dispatch(collabRemovedFailure());\n      });\n  };\n}\n\nexport function createProjectUser(user, projectId, role) {\n  return dispatch => {\n    get(userByEmailApiPath(user))\n      .then(async response => {\n        const data = await response.json();\n        const payload = [\n          {\n            project_user: {\n              project_id: projectId,\n              user_id: data.users.id,\n              role,\n            },\n          },\n          data.users,\n        ];\n        return payload;\n      })\n      .catch(err => {\n        dispatch({\n          type: COLLAB_EMAIL_NOT_FOUND,\n        });\n        dispatch(collabAddedFailure());\n        return Promise.reject(err);\n      })\n      .then(payload => {\n        post(projectUsersApiPath(), payload[0])\n          .then(async response => {\n            const data = await response.json();\n            data.project_user.user = payload[1];\n            dispatch({\n              type: PROJECT_USER_CREATED,\n              ...camelizeKeys(data),\n            });\n            dispatch(collabAddedSuccess());\n          })\n          .catch(err => {\n            dispatch(collabAlreadyAdded());\n            dispatch({\n              type: PROJECT_USER_ALREADY_ADDED,\n            });\n          });\n      });\n  };\n}\n","import React, { useState } from 'react';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableRow from '@material-ui/core/TableRow';\nimport Typography from '@material-ui/core/Typography';\nimport RemoveCircleIcon from '@material-ui/icons/RemoveCircle';\nimport PropTypes from 'prop-types';\nimport { calendarTime, toggleValue } from '../helpers';\n\nfunction AuthMethodItem({\n  onDelete,\n  countMethods,\n  role,\n  authMethod,\n  ...otherProps\n}) {\n  const [passHidden, setPassHidden] = useState(true);\n  const [keyHidden, setKeyHidden] = useState(true);\n  const [deleteModalShow, setDeleteModalShow] = useState(false);\n\n  const { id, label, type, username, password, apiKey, insertedAt } =\n    authMethod;\n\n  const handlePassClick = toggleValue(setPassHidden);\n\n  const handleKeyClick = toggleValue(setKeyHidden);\n\n  const showHideDeleteModal = toggleValue(setDeleteModalShow);\n\n  const basicToggle = passHidden ? (\n    <Button\n      disabled={!password}\n      size=\"small\"\n      onClick={() => handlePassClick(passHidden)}\n      id=\"secret-btn\"\n    >\n      Reveal\n    </Button>\n  ) : (\n    <code>\n      {username}:{password}\n    </code>\n  );\n\n  const apiKeyToggle = keyHidden ? (\n    <Button\n      disabled={!apiKey}\n      size=\"small\"\n      onClick={() => handleKeyClick(keyHidden)}\n      id=\"secret-btn\"\n    >\n      Reveal\n    </Button>\n  ) : (\n    <code>{apiKey}</code>\n  );\n\n  const DeleteModal = (\n    <Dialog\n      {...otherProps}\n      open={deleteModalShow}\n      onClose={() => showHideDeleteModal(deleteModalShow)}\n    >\n      <DialogTitle>\n        {countMethods > 1\n          ? 'Are you sure you wish to delete this inbound auth method?'\n          : 'Allow unauthenticated posts to your inbox?'}\n      </DialogTitle>\n      <DialogContent>\n        <Typography>\n          {countMethods > 1\n            ? `Deleting an authentication method may break inbound integrations.\n              Clients may still send data to your inbox URL using your other\n              auth method${countMethods > 2 ? 's' : ''}.`\n            : `This is your last specified authentication method. If you remove\n              it, any client may send data to your inbox if they have your\n              secret inbox URL.`}\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={() => showHideDeleteModal(deleteModalShow)}>\n          Cancel\n        </Button>\n        <Button\n          id=\"delete-auth-btn\"\n          onClick={() => onDelete(authMethod)}\n          variant=\"contained\"\n          color=\"secondary\"\n        >\n          Delete auth method\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n\n  const createdAt = insertedAt ? calendarTime(insertedAt) : 'not created';\n\n  return (\n    <TableRow\n      key={id}\n      hover\n      aria-label={label ?? 'default_row'}\n      id={id ?? 'default_row'}\n      name={label ?? 'default_row'}\n    >\n      {DeleteModal}\n      <TableCell id=\"label\" aria-label={label ?? 'no auth method'}>\n        {label}\n      </TableCell>\n      <TableCell id=\"type\">{type}</TableCell>\n      <TableCell id=\"created\" aria-label={createdAt}>\n        {calendarTime(insertedAt)}\n      </TableCell>\n      <TableCell className=\"text-center\" id=\"secret-toggle\">\n        {type === 'basic' ? basicToggle : apiKeyToggle}\n      </TableCell>\n      <TableCell className=\"text-center\">\n        <Button\n          id=\"revoke-btn\"\n          disabled={!role || !id}\n          onClick={() => showHideDeleteModal(deleteModalShow)}\n          aria-label=\"revoke\"\n        >\n          <RemoveCircleIcon fontSize=\"inherit\" />\n        </Button>\n      </TableCell>\n    </TableRow>\n  );\n}\n\nAuthMethodItem.propTypes = {\n  authMethod: PropTypes.object,\n  countMethods: PropTypes.number,\n};\n\nAuthMethodItem.defaultProps = {\n  countMethods: 0,\n  authMethod: {\n    id: null,\n    type: '- -',\n    label: null,\n    password: null,\n    apiKey: null,\n  },\n};\n\nexport default AuthMethodItem;\n","import React, { useState, useEffect } from 'react';\nimport {\n  Avatar,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  FormControl,\n  FormControlLabel,\n  Grid,\n  IconButton,\n  Input,\n  InputAdornment,\n  InputLabel,\n  Menu,\n  MenuItem,\n  Switch,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  TextField,\n  Tooltip,\n  Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  EnhancedEncryption,\n  Error as ErrorIcon,\n  Lock as LockIcon,\n  PersonAdd as PersonAddIcon,\n  RemoveCircle as RemoveCircleIcon,\n  Security as SecurityIcon,\n} from '@material-ui/icons';\nimport { orderBy, values } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport {\n  deleteAuthMethod,\n  fetchAuthMethods,\n} from '../actions/AuthMethodActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport { fetchPlans } from '../actions/PlanActions';\nimport { toggleSupportAccess } from '../actions/ProjectActions';\nimport {\n  createProjectUser,\n  deleteProjectUser,\n  fetchProjectUsers,\n} from '../actions/ProjectUserActions';\nimport { linkTo, clickEvent } from '../helpers';\nimport { selectCurrentUser } from '../selectors';\nimport AuthMethodItem from './AuthMethodItem';\nimport OneCardHolder from './OneCardHolder';\nimport { newAuthMethodPath } from '../helpers/pathHelpers';\n\nconst useStyles = makeStyles(theme => ({\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  toggleSupport: {\n    '& .MuiSwitch-colorPrimary.Mui-checked': {\n      color: theme.palette.warning.main,\n    },\n    '& .MuiSwitch-colorPrimary.Mui-checked + .MuiSwitch-track': {\n      backgroundColor: theme.palette.warning.dark,\n    },\n    paddingRight: theme.spacing(2),\n  },\n  addAuth: {\n    paddingRight: theme.spacing(2),\n  },\n}));\n\nfunction AccessSettings({ selectedProject }) {\n  const dispatch = useDispatch();\n  const params = useParams();\n  const history = useHistory();\n  const classes = useStyles();\n\n  const [state, setState] = useState({\n    filter: '',\n    collabEmail: null,\n    showSupportModal: false,\n    anchorEl: null,\n  });\n\n  const projectId = params.projectId || selectedProject.id;\n\n  const user = useSelector(selectCurrentUser) || {};\n\n  const { loading } = useSelector(state => state.authMethods);\n\n  const authMethods = orderBy(\n    values(useSelector(state => state.authMethods.items)),\n    [a => a.label.toLowerCase()]\n  ).filter(am => am.projectId === projectId);\n\n  const projectUserItems = useSelector(state => state.projectUsers.items);\n\n  const projectUsers = Object.keys(projectUserItems).map(\n    id => projectUserItems[id]\n  );\n  const plans = useSelector(state => state.plans.items);\n\n  const projectUserCount = projectUsers.filter(\n    pu => !pu.user.email.includes('@openfn.org')\n  ).length;\n\n  const addCollabStatus = useSelector(\n    state => state.projectUsers.collaboratorAddStatus\n  );\n  const currentPlan = plans[selectedProject.planId] || {};\n\n  const { anchorEl, showSupportModal, collabEmail } = state;\n\n  const countMethods = authMethods.length;\n\n  const handleClick = event => {\n    setState(prevState => ({ ...prevState, anchorEl: event.currentTarget }));\n  };\n\n  const handleClose = () => {\n    setState(prevState => ({ ...prevState, anchorEl: null }));\n  };\n\n  const hideModal = () => {\n    setState(prevState => ({ ...prevState, showSupportModal: false }));\n  };\n\n  const handleFilterChange = e => {\n    setState(prevState => ({\n      ...prevState,\n      filter: e.target.value.toLowerCase(),\n    }));\n  };\n\n  const includesText = authMethod => {\n    return authMethod.label.toLowerCase().includes(state.filter);\n  };\n\n  const handleDelete = authMethod => {\n    dispatch(deleteAuthMethod(authMethod));\n  };\n\n  const handleChangeEmail = e => {\n    setState(prevState => ({ ...prevState, collabEmail: e.target.value }));\n  };\n\n  const handleToggleSupportAccess = project => {\n    dispatch(toggleSupportAccess(project));\n    setState(prevState => ({ ...prevState, showSupportModal: false }));\n  };\n\n  const handleToggle = project => () => {\n    if (project.allowSupport) {\n      dispatch(toggleSupportAccess(project));\n      setState(prevState => ({ ...prevState, showSupportModal: false }));\n    } else {\n      setState(prevState => ({ ...prevState, showSupportModal: true }));\n    }\n  };\n\n  const handleAddUser = (user, projectId, role) => {\n    dispatch(createProjectUser(user, projectId, role));\n    handleClose();\n  };\n\n  const canAddCollabs =\n    user.masterSupport ||\n    (selectedProject.userRole && currentPlan.userLimit > projectUserCount);\n\n  useEffect(() => {\n    document.title = 'Access & Security - OpenFn';\n    dispatch(switchedMenu('Access & Security'));\n    dispatch(fetchPlans());\n  }, []);\n\n  useEffect(() => {\n    dispatch(fetchAuthMethods(selectedProject));\n    dispatch(fetchProjectUsers(selectedProject));\n  }, [selectedProject]);\n\n  const SupportModal = (\n    <Dialog\n      open={showSupportModal}\n      onClose={hideModal}\n      aria-label=\"grant project access dialog\"\n    >\n      <DialogTitle>Grant Project Access to Open Function Support</DialogTitle>\n      <DialogContent>\n        <Typography>\n          If you grant access to Open Function Support, an expert from our\n          support team will be able to view and edit your jobs, triggers, and\n          message data. They will not be able to view your credentials.\n        </Typography>\n        <br />\n        <Typography>\n          <b>Are you sure you wish to grant access to OpenFn Support?</b>\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={hideModal}>No, I&apos;m not sure.</Button>\n        <Button\n          variant=\"contained\"\n          disabled={!selectedProject.userRole}\n          id=\"support_button\"\n          onClick={() => handleToggleSupportAccess(selectedProject)}\n        >\n          Yes, grant access to support.\n        </Button>\n        {!selectedProject.userRole && (\n          <div>\n            <br />\n            Only admins or owners can grant support access.\n          </div>\n        )}\n      </DialogActions>\n    </Dialog>\n  );\n\n  const NoAuthMethods = (\n    <div>\n      <br />\n      <Typography>\n        There are no additional inbound authentication methods specified for\n        this project inbox. To set up a data source, configure that source to\n        make a POST over HTTPS to your inbox URL. If your inbox URL is\n        compromised, you can request a new one from admin@openfn.org.\n      </Typography>\n    </div>\n  );\n\n  return (\n    <OneCardHolder wide>\n      <Card aria-label=\"user access card\" id=\"user-access-card\">\n        <CardHeader\n          title=\"User Access\"\n          subheader=\"Control which users can access this project.\"\n          avatar={\n            <Avatar className={classes.avatar}>\n              <SecurityIcon />\n            </Avatar>\n          }\n          action={\n            <FormControlLabel\n              className={classes.toggleSupport}\n              control={\n                <Switch\n                  checked={selectedProject.allowSupport}\n                  onChange={handleToggle(selectedProject)}\n                  value={selectedProject.allowSupport}\n                  color=\"primary\"\n                  id=\"support-access-switch\"\n                />\n              }\n              labelPlacement=\"start\"\n              label=\"Grant support access\"\n            />\n          }\n        />\n        <CardContent>\n          <Typography variant=\"h6\">User Access</Typography>\n          <Grid container spacing={2}>\n            <Grid item xs={12}>\n              <FormControl style={{ marginTop: 5 }}>\n                <InputLabel>Add collaborator by email</InputLabel>\n                <Input\n                  disabled={!canAddCollabs}\n                  error={addCollabStatus.error}\n                  type=\"text\"\n                  label=\"Add user by email\"\n                  name=\"user-email\"\n                  onChange={handleChangeEmail}\n                  endAdornment={\n                    <InputAdornment position=\"end\" variant=\"filled\">\n                      <IconButton\n                        color=\"primary\"\n                        disabled={\n                          !canAddCollabs ||\n                          !collabEmail ||\n                          (!canAddCollabs &&\n                            user.masterSupport &&\n                            !collabEmail.includes('@openfn.org'))\n                        }\n                        onClick={handleClick}\n                        aria-owns={anchorEl ? 'simple-menu' : null}\n                        aria-haspopup=\"true\"\n                        aria-label=\"add user by email\"\n                        id=\"add-user-by-email-btn\"\n                      >\n                        <PersonAddIcon />\n                      </IconButton>\n                    </InputAdornment>\n                  }\n                  inputProps={{\n                    'aria-label': 'Add user by email',\n                  }}\n                />\n                <Menu\n                  id=\"simple-menu\"\n                  anchorEl={anchorEl}\n                  open={Boolean(anchorEl)}\n                  onClose={handleClose}\n                >\n                  <MenuItem\n                    id=\"add-as-collab\"\n                    onClick={\n                      canAddCollabs\n                        ? () =>\n                            handleAddUser({ email: collabEmail }, projectId, '')\n                        : null\n                    }\n                  >\n                    Add as collaborator\n                  </MenuItem>\n                  <MenuItem\n                    id=\"add-as-admin\"\n                    onClick={\n                      canAddCollabs\n                        ? () =>\n                            handleAddUser(\n                              { email: collabEmail },\n                              projectId,\n                              'admin'\n                            )\n                        : null\n                    }\n                  >\n                    Add as admin\n                  </MenuItem>\n                </Menu>\n              </FormControl>\n            </Grid>\n            {addCollabStatus.error && (\n              <Grid item xs={12}>\n                <Typography variant=\"body2\" style={{ color: 'red' }}>\n                  <ErrorIcon fontSize=\"inherit\" /> {addCollabStatus.error}\n                </Typography>\n              </Grid>\n            )}\n            {!(currentPlan.userLimit > projectUserCount) && (\n              <Grid item xs={12}>\n                <Typography variant=\"body2\">\n                  <ErrorIcon fontSize=\"inherit\" /> This project&apos;s plan does\n                  not support any more collaborators.\n                </Typography>\n              </Grid>\n            )}\n            {!selectedProject.userRole &&\n              currentPlan.userLimit > projectUserCount && (\n                <Grid item xs={12}>\n                  <Typography variant=\"body2\">\n                    <ErrorIcon fontSize=\"inherit\" /> Only project owners and\n                    admins can add collaborators.\n                  </Typography>\n                </Grid>\n              )}\n          </Grid>\n          <Table aria-label=\"project collaborators\" id=\"project_collabs\">\n            <caption>\n              {currentPlan.userLimit > 1\n                ? `${projectUserCount} of ${currentPlan.userLimit} non-support collaborators in use.`\n                : \"This project's plan doesn't allow non-support collaboratoration.\"}\n            </caption>\n            <TableHead>\n              <TableRow aria-label=\"project collaborators header row\">\n                <TableCell>User</TableCell>\n                <TableCell>Role</TableCell>\n                <TableCell align=\"center\">Revoke</TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {projectUsers.map(collaborator => (\n                <TableRow\n                  key={collaborator.user.id}\n                  aria-label={collaborator.user.email}\n                  name={collaborator.user.email}\n                >\n                  <TableCell>{collaborator.user.email}</TableCell>\n                  <TableCell>{collaborator.role || 'collaborator'}</TableCell>\n                  <TableCell align=\"center\">\n                    <IconButton\n                      size=\"small\"\n                      disabled={\n                        !selectedProject.userRole ||\n                        collaborator.user.id === user.id ||\n                        collaborator.role === 'owner'\n                      }\n                      aria-label=\"revoke\"\n                      id=\"revoke\"\n                      onClick={\n                        collaborator.user.id !== user.id\n                          ? () => dispatch(deleteProjectUser(collaborator))\n                          : null\n                      }\n                    >\n                      <RemoveCircleIcon />\n                    </IconButton>\n                  </TableCell>\n                </TableRow>\n              ))}\n            </TableBody>\n          </Table>\n        </CardContent>\n        <CardActions>\n          <Tooltip\n            title=\"If you would like to require multi-factor\n                authentication for users with access to this project, write to\n                security@openfn.org. Note that this will block all users from\n                accessing this project until MFA has been configured for their\n                respective accounts.\"\n          >\n            <Button\n              aria-label=\"request mfa\"\n              id=\"request-mfa-btn\"\n              href={`mailto:security@openfn.org?subject=Requesting MFA for ${selectedProject.name}`}\n              target=\"_blank\"\n              onClick={() => clickEvent('Security', 'Contact', 'Request MFA')}\n            >\n              Request MFA\n            </Button>\n          </Tooltip>\n        </CardActions>\n      </Card>\n      <br />\n      <Card aria-label=\"inbox security card\" id=\"inbox-security-card\">\n        <CardHeader\n          title=\"Inbox Security\"\n          subheader=\"Control which systems can make HTTP requests to this project.\"\n          avatar={\n            <Avatar className={classes.avatar}>\n              <LockIcon />\n            </Avatar>\n          }\n          action={\n            <FormControlLabel\n              className={classes.addAuth}\n              control={\n                <IconButton\n                  id=\"add-new-security-protocol-btn\"\n                  color=\"secondary\"\n                  disabled={!selectedProject.userRole}\n                  onClick={\n                    selectedProject.userRole &&\n                    linkTo(newAuthMethodPath(selectedProject), history)\n                  }\n                >\n                  <EnhancedEncryption />\n                </IconButton>\n              }\n              labelPlacement=\"start\"\n              label=\"Add new security protocol \"\n            />\n          }\n        />\n        <CardContent>\n          <Typography variant=\"h6\">Inbox Security</Typography>\n          {!loading && countMethods === 0 && (\n            <Grid item xs={12}>\n              {NoAuthMethods}\n            </Grid>\n          )}\n          {!selectedProject.userRole && (\n            <Grid item xs={12}>\n              <Typography>\n                Only project owners and admins can add inbound authentication\n                protocols.\n              </Typography>\n            </Grid>\n          )}\n          <br />\n          <TextField\n            id=\"auth-method-filter\"\n            onChange={handleFilterChange}\n            type=\"text\"\n            label=\"Filter auth methods\"\n            inputProps={{\n              'aria-label': 'filter auth methods',\n            }}\n          />\n          <Table\n            aria-label=\"inbox security access table\"\n            id=\"inbox-security-access-table\"\n          >\n            <TableHead aria-label=\"inbox security access table header\">\n              <TableRow aria-label=\"inbox security access table header row\">\n                <TableCell>Label</TableCell>\n                <TableCell>Auth Type</TableCell>\n                <TableCell>Created</TableCell>\n                <TableCell className=\"text-center\">Secrets</TableCell>\n                <TableCell className=\"text-center\">Revoke</TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {authMethods.filter(includesText).map(authMethod => (\n                <AuthMethodItem\n                  key={authMethod.id}\n                  authMethod={authMethod}\n                  countMethods={countMethods}\n                  onDelete={handleDelete}\n                  role={selectedProject.userRole}\n                />\n              ))}\n              {authMethods.length === 0 && (\n                <AuthMethodItem key={0} role={selectedProject.userRole} />\n              )}\n            </TableBody>\n          </Table>\n        </CardContent>\n      </Card>\n      {SupportModal}\n    </OneCardHolder>\n  );\n}\n\nAccessSettings.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n};\n\nexport default AccessSettings;\n","import React from 'react';\nimport {\n  FormControl,\n  FormHelperText,\n  InputLabel,\n  makeStyles,\n  MenuItem,\n  Select,\n} from '@material-ui/core';\nimport { allowAnyOption } from '../../helpers';\n\nconst useStyles = makeStyles(theme => ({\n  formControl: {\n    marginTop: theme.spacing(2),\n    marginBottom: theme.spacing(2),\n    minWidth: 120,\n  },\n}));\n\nfunction SelectInput({\n  allowAny,\n  allowEmpty,\n  children,\n  helperText,\n  input,\n  label,\n  meta: { touched, error, submitError, dirtySinceLastSubmit },\n  options,\n  placeholder,\n  showEmpty,\n  ...custom\n}) {\n  const classes = useStyles();\n\n  const showError =\n    (submitError && !dirtySinceLastSubmit) || (error && touched);\n\n  if (allowAny) allowAnyOption(options, input.value);\n\n  const noOptions = options && options.length === 0;\n\n  return (\n    <FormControl\n      className={classes.formControl}\n      error={showError}\n      id={`${input.name}-form-control`}\n    >\n      <InputLabel shrink={showEmpty} htmlFor={input.name}>\n        {label}\n      </InputLabel>\n      <Select\n        id=\"select-input\"\n        displayEmpty={showEmpty}\n        disabled={noOptions}\n        inputProps={{\n          name: input.name,\n          id: input.name,\n          'aria-label': input.name,\n        }}\n        {...input}\n        onChange={input.onChange}\n        {...custom}\n      >\n        {placeholder && (\n          <MenuItem value=\"\" disabled={!allowEmpty} id={placeholder}>\n            <em>{placeholder}</em>\n          </MenuItem>\n        )}\n        {options &&\n          options.map(op => (\n            <MenuItem id={op.id} value={op.value} key={op.id}>\n              {op.text}\n            </MenuItem>\n          ))}\n        {children}\n      </Select>\n      <FormHelperText>\n        {noOptions ? `No ${label} available` : helperText}\n      </FormHelperText>\n    </FormControl>\n  );\n}\n\nexport default React.memo(SelectInput);\n","import React, { useState, useEffect } from 'react';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { FORM_ERROR } from 'final-form';\nimport { values } from 'lodash';\nimport { Field, Form } from 'react-final-form';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport {\n  createAuthMethod,\n  fetchAuthMethods,\n} from '../actions/AuthMethodActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport { linkTo } from '../helpers';\nimport SelectInput from './FormHelpers/SelectInput';\nimport TextInput from './FormHelpers/TextInput';\nimport { projectAccessPath } from '../helpers/pathHelpers';\n\nconst validate = values => {\n  const errors = {};\n  if (!values.type) {\n    errors.type = 'Required';\n  }\n  if (!values.label) {\n    errors.label = 'Required';\n  }\n  if (!values.username && values.type == 'basic') {\n    errors.username = 'Required';\n  }\n  if (!values.password && values.type == 'basic') {\n    errors.password = 'Required';\n  }\n  return errors;\n};\n\nfunction AuthMethodNew({ selectedProject, onSubmitComplete, onCancel }) {\n  const [createModalShow, setCreateModalShow] = useState(false);\n\n  const params = useParams();\n\n  const history = useHistory();\n\n  const dispatch = useDispatch();\n\n  const projectId = params.projectId || selectedProject.id;\n\n  const initialValues = {\n    projectId,\n    onCancel,\n    onSubmitComplete,\n    selectedProject,\n  };\n\n  const authMethods = values(\n    useSelector(state => state.authMethods.items)\n  ).filter(am => am.projectId === projectId);\n\n  const authMethodCount = authMethods.length;\n\n  const showCreateModal = () => {\n    setCreateModalShow(true);\n  };\n\n  const hideCreateModal = () => {\n    setCreateModalShow(false);\n  };\n\n  const handleCancel = e => {\n    if (onCancel) {\n      onCancel();\n    } else {\n      linkTo(projectAccessPath(selectedProject), history)(e);\n    }\n  };\n\n  const submit = values => {\n    return new Promise(resolve => {\n      dispatch(createAuthMethod(values))\n        .then(() => {\n          resolve(history.push(projectAccessPath(selectedProject)));\n        })\n        .catch(error => {\n          if (error.validationErrors) {\n            resolve({ [FORM_ERROR]: error.validationErrors });\n          } else {\n            resolve({ [FORM_ERROR]: error });\n          }\n        });\n    });\n  };\n\n  const typeOptions = [\n    {\n      id: 'key',\n      value: 'key',\n      text: \"API Key: A token to be sent in the 'x-api-key' header.\",\n    },\n    {\n      id: 'basic',\n      value: 'basic',\n      text: 'Basic Auth: A username:password combo to be sent using basic auth.',\n    },\n  ];\n\n  useEffect(() => {\n    dispatch(switchedMenu('Access & Security'));\n  }, []);\n\n  useEffect(() => {\n    dispatch(fetchAuthMethods(selectedProject));\n  }, [selectedProject]);\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      initialValues={initialValues}\n      render={({\n        handleSubmit,\n        submitting,\n        invalid,\n        values,\n        initialValues,\n      }) => (\n        <Grid container justifyContent=\"center\">\n          <Grid item md={6} lg={4}>\n            <Card id=\"new-auth-method-card\">\n              <CardHeader\n                title=\"Create new inbound auth method\"\n                subheader=\"For POST or GET requests made to this inbox URL\"\n              />\n              <CardContent>\n                {!initialValues.selectedProject.userRole && (\n                  <Typography>\n                    Only project owners and admins can add inbound\n                    authentication methods.\n                  </Typography>\n                )}\n                {initialValues.selectedProject.userRole &&\n                  authMethodCount === 0 && (\n                    <Typography>\n                      <p>\n                        <b>WARNING:</b> Requiring inbound authentication can\n                        block existing data sources.\n                      </p>\n                      <p>\n                        If you know what you are doing, select either basic or\n                        api-key authentication below. Please note that saving a\n                        basic auth method or generating an API key for this\n                        project will break existing inbound integrations that do\n                        not already contain the proper authentication.\n                      </p>\n                    </Typography>\n                  )}\n                <form\n                  id=\"new-auth-method-form\"\n                  onSubmit={\n                    initialValues.selectedProject.userRole && handleSubmit\n                  }\n                >\n                  <div>\n                    <Field\n                      name=\"label\"\n                      label=\"Label\"\n                      component={TextInput}\n                      type=\"text\"\n                      placeholder=\"A human-readable label\"\n                    />\n                    <br />\n                    <Field\n                      name=\"type\"\n                      label=\"Auth Type\"\n                      component={SelectInput}\n                      type=\"select\"\n                      options={typeOptions}\n                      placeholder=\"Select Auth Type\"\n                    />\n                    {values.type === 'basic' && (\n                      <div>\n                        <Field\n                          name=\"username\"\n                          label=\"Username\"\n                          component={TextInput}\n                          type=\"text\"\n                          placeholder=\"user123\"\n                        />\n                        <br />\n                        <Field\n                          name=\"password\"\n                          component={TextInput}\n                          type=\"password\"\n                          label=\"Password\"\n                          placeholder=\"shh456\"\n                        />\n                      </div>\n                    )}\n                  </div>\n                  <Dialog open={createModalShow} onClose={hideCreateModal}>\n                    <DialogTitle>\n                      Are you sure you wish to add inbound authentication to\n                      this project?\n                    </DialogTitle>\n                    <DialogContent>\n                      <Typography>\n                        By adding an inbound authentication method, you will\n                        block all HTTP posts made to this project inbox that do\n                        not contain the authentication specified here. This\n                        means that existing data sources which relied only on\n                        your secret inbox URL and do not contain the\n                        authentication you specified on this page will STOP\n                        WORKING.\n                      </Typography>\n                    </DialogContent>\n                    <DialogActions>\n                      <Button onClick={hideCreateModal}>\n                        No, I&apos;m not sure.\n                      </Button>\n                      <Button\n                        id=\"new_auth_method\"\n                        disabled={!initialValues.selectedProject.userRole}\n                        onClick={\n                          initialValues.selectedProject.userRole && handleSubmit\n                        }\n                      >\n                        Yes, proceed.\n                      </Button>\n                    </DialogActions>\n                  </Dialog>\n                </form>\n              </CardContent>\n              <CardActions>\n                <Button onClick={handleCancel}>Cancel</Button>\n                <Button\n                  variant=\"contained\"\n                  color=\"secondary\"\n                  id=\"save_trigger\"\n                  disabled={\n                    submitting ||\n                    invalid ||\n                    !initialValues.selectedProject.userRole\n                  }\n                  onClick={\n                    authMethodCount == 0 ? showCreateModal : handleSubmit\n                  }\n                >\n                  {values.type === 'key' ? 'Generate' : 'Save'}\n                </Button>\n              </CardActions>\n            </Card>\n          </Grid>\n        </Grid>\n      )}\n    />\n  );\n}\n\nexport default AuthMethodNew;\n","/**\n * Takes a Response object, like from a `fetch` request.\n * and pulls out the pagination headers for use in list pages.\n * @param {Response} response\n * @returns {{perPage: number, total: number, totalPages: number}}\n */\nexport function getPaginationFromHeaders(response) {\n  return {\n    perPage: Number(response.headers.get('per-page')),\n    total: Number(response.headers.get('total')),\n    totalPages: Number(response.headers.get('total-pages')),\n  };\n}\n","import { camelizeKeys, decamelizeKeys } from 'humps';\nimport { omit } from 'lodash';\nimport { normalize } from 'normalizr';\nimport { triggerApiPath, triggerByIdApiPath, triggersApiPath } from '../helpers/actionsPathHelpers';\nimport { Trigger } from '../schemas';\nimport { get, post, put } from './BaseClient';\n\nexport function camelizeTrigger(trigger) {\n  return {\n    ...camelizeKeys(omit(trigger, ['criteria', 'exclusion'])),\n    criteria: trigger?.criteria,\n    exclusion: trigger?.exclusion,\n  };\n}\n\nexport function decamelizeTrigger(trigger) {\n  // This takes the form text version of \"Criteria\" and parses it into JSON again.\n  // TODO: Eventually, we will want to abstract this form-version of JSONb.\n  const criteria = trigger.criteria ? JSON.parse(trigger.criteria) : null;\n  const exclusion = trigger.exclusion ? JSON.parse(trigger.exclusion) : null;\n\n  return {\n    ...decamelizeKeys(omit(trigger, ['criteria', 'exclusion'])),\n    criteria,\n    exclusion,\n  };\n}\n\n/**\n * @param {import('../schemas/types').Project} project\n */\nexport async function getTriggers(project) {\n  const data = await (\n    await get(triggersApiPath(), { projectId: project.id })\n  ).json();\n\n  return normalize(data.map(camelizeTrigger), [Trigger]);\n}\n\n/**\n * @param {string} id\n */\nexport async function getTriggerById(id) {\n  const data = await (await get(triggerByIdApiPath(id))).json();\n\n  return normalize(camelizeTrigger(data), Trigger);\n}\n\nexport async function putTrigger(trigger) {\n  const data = await (\n    await put(triggerApiPath(trigger), { trigger: decamelizeTrigger(trigger) })\n  ).json();\n  return normalize(camelizeTrigger(data), Trigger);\n}\n\nexport async function postTrigger(trigger) {\n  const data = await (\n    await post(triggersApiPath(), { trigger: decamelizeTrigger(trigger) })\n  ).json();\n  return normalize(camelizeTrigger(data), Trigger);\n}\n","import { differenceInMilliseconds } from 'date-fns';\nimport { camelizeKeys, decamelizeKeys } from 'humps';\nimport { omit } from 'lodash';\nimport { normalize, schema } from 'normalizr';\nimport {\n  ADD_RECEIPT,\n  BODIES_RECEIVED,\n  FETCHING_RECEIPT,\n  FETCHING_RECEIPTS,\n  FETCHING_RECEIPTS_FAILED,\n  FETCHING_RECEIPT_FAILED,\n  RECEIPTS_RECEIVED,\n  RECEIPT_FAILED,\n  RECEIPT_RECEIVED,\n  RECEIPT_UPDATED,\n  UPDATING_RECEIPT,\n} from '../constants';\nimport { Receipt } from '../schemas';\nimport Notifications from './Notifications';\nimport { get, put, post } from '../clients/BaseClient';\nimport { getPaginationFromHeaders } from '../helpers/pagination';\nimport { camelizeTrigger } from '../clients/TriggerClient';\nimport {\n  receiptByIdApiPath,\n  receiptsApiPath,\n  receiptsExportApiPath,\n  reprocessReceiptsApiPath,\n} from '../helpers/actionsPathHelpers';\n\nexport function camelizeReceipt(receipt) {\n  return {\n    ...camelizeKeys(omit(receipt, ['body', 'original', 'headers', 'matches'])),\n    body: receipt.body,\n    original: receipt.original,\n    headers: receipt.headers,\n    matches: receipt.matches?.map(rm => ({\n      job: camelizeKeys(rm.job),\n      trigger: camelizeTrigger(rm.trigger),\n    })),\n  };\n}\n\nfunction receiptUpdated(payload) {\n  return { type: RECEIPT_UPDATED, payload };\n}\n\nfunction receiptUpdatedSuccess({ id }) {\n  return Notifications.add(`Message ${id} updated.`, 'success');\n}\n\nfunction loadedBodies(count) {\n  return Notifications.add(\n    `Found ${count} matching message${count !== 1 ? 's' : ''}.`,\n    count > 0 ? 'success' : 'warning'\n  );\n}\n\nfunction normalizeReceipt(data) {\n  return normalize(camelizeReceipt(data), Receipt);\n}\n\nexport function refreshReceipt(receipt) {\n  return async dispatch => {\n    const response = await get(receiptByIdApiPath(receipt.id), {\n      summary: true,\n    });\n    dispatch(receiptUpdated(normalizeReceipt(await response.json())));\n  };\n}\n\nfunction fetchReceiptFailed(error) {\n  return { type: FETCHING_RECEIPT_FAILED, error };\n}\n\nexport function fetchReceiptById(id) {\n  return async dispatch => {\n    dispatch({ type: FETCHING_RECEIPT, id });\n\n    try {\n      const response = await get(receiptByIdApiPath(id));\n      const data = await response.json();\n\n      dispatch({\n        type: RECEIPT_RECEIVED,\n        payload: normalize(camelizeReceipt(data), Receipt),\n      });\n    } catch (error) {\n      return dispatch(fetchReceiptFailed(error));\n    }\n  };\n}\n\nexport function fetchReceiptJobStates({ projectId, receipts = [] }) {\n  return async dispatch => {\n    if (receipts.length == 0) {\n      return;\n    }\n    dispatch({\n      type: 'FETCHING_RECEIPT_JOB_STATES',\n      text: receipts,\n    });\n\n    try {\n      const response = await get(receiptsApiPath(), {\n        projectId,\n        receiptIds: receipts.map(x => x.id),\n      });\n      const entities = normalize(camelizeReceipt(await response.json()), {\n        receipts: [Receipt],\n      });\n      dispatch({ type: 'RECEIPT_JOB_STATES_RECEIVED', ...entities });\n    } catch (error) {\n      dispatch({ type: 'FETCHING_RECEIPT_JOB_STATES_FAILED', error });\n    }\n  };\n}\n\nexport function receiveReceipt({ receipts }, pageNumber, filter) {\n  const payload = normalize(\n    receipts.map(r => camelizeReceipt({ ...r, receiptJobStates: [] })),\n    new schema.Array(Receipt)\n  );\n\n  // NOTE: We only dispatch a new receipt to state if we're on the first page,\n  // there is no `endDate` filter applied, and the receipt arrived in the last\n  // ten seconds.\n  const newlyInserted =\n    differenceInMilliseconds(new Date(), new Date(receipts[0].inserted_at)) <\n    10000;\n\n  if (pageNumber === 1 && !filter.endDate && newlyInserted) {\n    return { type: RECEIPT_RECEIVED, payload };\n  }\n  return { type: null };\n}\n\nexport function clearReceipts() {\n  return dispatch => {\n    dispatch({ type: 'CLEAR_RECEIPTS' });\n  };\n}\n\n/**\n * @param {{projectId: string, triggerId: string, page?: number, perPage?: number}} query\n */\nexport function loadBodies(query) {\n  return async dispatch => {\n    dispatch({ type: FETCHING_RECEIPTS });\n\n    try {\n      const response = await get(receiptsApiPath(), query);\n      const pagination = {\n        ...getPaginationFromHeaders(response),\n        page: 1,\n      };\n      const { receipts } = await response.json();\n      const entities = normalize(\n        receipts.map(r => camelizeReceipt(r)),\n        new schema.Array(Receipt)\n      );\n\n      dispatch({\n        type: BODIES_RECEIVED,\n        ...entities,\n        pagination,\n      });\n\n      dispatch(loadedBodies(receipts.length));\n    } catch (_error) {\n      return Notifications.add(\n        'Failed to load messages. Please clear filters.',\n        'danger'\n      );\n    }\n  };\n}\n\nexport function loadReceipts({ projectId, filter, page, perPage }) {\n  return async dispatch => {\n    dispatch({\n      type: FETCHING_RECEIPTS,\n      text: projectId,\n      filter,\n      page,\n      perPage,\n    });\n\n    const query = {\n      projectId: projectId,\n      filter,\n      page,\n      perPage,\n    };\n\n    try {\n      const response = await get(receiptsApiPath(), query);\n\n      const pagination = {\n        ...getPaginationFromHeaders(response),\n        page,\n      };\n\n      // NOTE: We don't worry about camelizing here because there's no 'body'\n      const entities = normalize(camelizeReceipt(await response.json()), {\n        receipts: [Receipt],\n      });\n\n      dispatch({\n        type: RECEIPTS_RECEIVED,\n        ...entities,\n        pagination,\n      });\n\n      return entities;\n    } catch (error) {\n      dispatch({\n        type: FETCHING_RECEIPTS_FAILED,\n        error: error.response.data.error || error.response,\n      });\n\n      return [];\n    }\n  };\n}\n\nexport function fetchReceiptsAndJobStates(params) {\n  return async dispatch => {\n    const receiptsResponse = await dispatch(loadReceipts(params));\n\n    dispatch(\n      fetchReceiptJobStates({\n        projectId: params.projectId,\n        receipts: Object.values(receiptsResponse.entities?.receipts ?? {}),\n      })\n    );\n  };\n}\n\nexport function updateReceipt(receipt) {\n  return async dispatch => {\n    dispatch({ type: UPDATING_RECEIPT, receipt });\n\n    if (typeof receipt.body == 'string') {\n      receipt.body = JSON.parse(receipt.body);\n    }\n\n    const response = await put(receiptByIdApiPath(receipt.id), { receipt });\n    const data = await response.json();\n    const payload = {\n      ...camelizeReceipt(data),\n      loadedReceiptJobStates: true,\n    };\n    dispatch(receiptUpdated(normalizeReceipt(payload)));\n    dispatch(receiptUpdatedSuccess(payload));\n    return payload;\n  };\n}\n\nexport function restoreReceipt(receipt) {\n  receipt.body = receipt.original;\n\n  if (typeof receipt.body == 'string') {\n    receipt.body = JSON.parse(receipt.body);\n  }\n\n  receipt.notes = 'Restored to original.';\n\n  return updateReceipt(receipt);\n}\n\nexport function addReceipt(receipt) {\n  return { type: ADD_RECEIPT, receipt };\n}\n\nexport async function exportReceipts(query) {\n  await get(receiptsExportApiPath(), query);\n}\n\nfunction receiptRequestReceived() {\n  return Notifications.add(\n    `Request received; finding matching messages.`,\n    'info'\n  );\n}\n\nfunction receiptsEnqueued(count) {\n  return Notifications.add(\n    `${count} message${\n      count == 1 ? ' has' : 's have'\n    } been enqueued for processing.`,\n    'success'\n  );\n}\n\nfunction enqueuingFailed() {\n  return Notifications.add(\n    'Sorry, that message processing order failed. Please contact support.',\n    'error'\n  );\n}\n\nexport function processReceipts(criteria) {\n  return async dispatch => {\n    dispatch(receiptRequestReceived());\n    try {\n      const response = await post(\n        reprocessReceiptsApiPath(),\n        decamelizeKeys(criteria)\n      );\n      dispatch(receiptsEnqueued(await response.json()));\n    } catch (e) {\n      dispatch(enqueuingFailed());\n    }\n  };\n}\n","import { camelizeKeys, decamelizeKeys } from 'humps';\nimport { normalize, schema } from 'normalizr';\nimport {\n  LOADED,\n  LOADED_DETAILS,\n  LOADING,\n  LOAD_FAILED,\n  RUN_RECEIVED,\n  RUN_UPDATED,\n} from '../constants';\nimport { runStarted, runStartFailed } from '../helpers';\nimport { runJob } from './JobActions';\nimport Notifications from './Notifications';\nimport { get, post } from '../clients/BaseClient';\nimport { Run } from '../schemas';\nimport { getPaginationFromHeaders } from '../helpers/pagination';\nimport {\n  exportRunsApiPath,\n  reprocessRunsApiPath,\n  runApiPath,\n  runsApiPath,\n} from '../helpers/actionsPathHelpers';\n\nexport async function getRuns(params) {\n  const response = await get(runsApiPath(), params);\n  const data = await response.json();\n  const entities = normalize(camelizeKeys(data), { runs: [Run] });\n\n  if (params.page) {\n    return {\n      ...entities,\n      pagination: {\n        ...getPaginationFromHeaders(response),\n        page: params.page,\n      },\n    };\n  }\n  return { ...entities };\n}\n\nexport async function getRun(run) {\n  const response = await get(runApiPath(run));\n  return { ...normalize(camelizeKeys(await response.json()), Run) };\n}\n\nfunction runRequestReceived() {\n  return Notifications.add(`Request received; finding matching runs.`, 'info');\n}\n\nfunction runsEnqueued(count) {\n  return Notifications.add(\n    `${count} run${count == 1 ? ' has' : 's have'} been enqueued.`,\n    'success'\n  );\n}\n\nfunction enqueuingFailed() {\n  return Notifications.add(\n    'Sorry, that runs reprocessing order failed. Please contact support.',\n    'error'\n  );\n}\n\nexport function createRun(job, receipt) {\n  if (receipt) {\n    let params;\n    if (typeof receipt === 'object') {\n      params = decamelizeKeys({ jobId: job.id, receiptId: receipt.id });\n    } else {\n      params = decamelizeKeys({ jobId: job.id, receiptId: receipt });\n    }\n\n    return async dispatch => {\n      try {\n        const response = await post(runsApiPath(), params);\n        const data = await response.json();\n        dispatch(runStarted(data));\n        return data;\n      } catch (e) {\n        return dispatch(runStartFailed(job.id, e.firstMessage));\n      }\n    };\n  }\n  return runJob(job);\n}\n\nexport function createRuns(criteria) {\n  return async dispatch => {\n    dispatch(runRequestReceived());\n    try {\n      const response = await post(\n        reprocessRunsApiPath(),\n        decamelizeKeys(criteria)\n      );\n      dispatch(runsEnqueued(await response.json()));\n    } catch (e) {\n      dispatch(enqueuingFailed());\n    }\n  };\n}\n\nexport function loadRuns(params) {\n  return async dispatch => {\n    dispatch(loading());\n    const payload = await getRuns(params);\n    return dispatch(loaded(payload));\n  };\n}\n\nexport function loadRun(run) {\n  return async dispatch => {\n    dispatch(loading());\n    try {\n      const payload = await getRun(run);\n      return dispatch(loadedDetail(payload));\n    } catch (error) {\n      return dispatch(runFailed(error));\n    }\n  };\n}\n\nexport function receiveRun({ runs }, pageNumber, filter) {\n  const payload = normalize(camelizeKeys(runs), new schema.Array(Run));\n  // NOTE: We update existing runs if we're not on the first page or if there is\n  // an `endDate` filter applied. Otherwise, we dispatch a new run to state.\n  if (pageNumber > 1 || (filter && filter.endDate)) {\n    return { type: RUN_UPDATED, payload };\n  }\n  return { type: RUN_RECEIVED, payload };\n}\n\nfunction runFailed(error) {\n  return { type: LOAD_FAILED, error };\n}\n\nfunction loading() {\n  return { type: LOADING };\n}\n\nfunction loaded(payload) {\n  return { type: LOADED, payload };\n}\n\nfunction loadedDetail(payload) {\n  return { type: LOADED_DETAILS, payload };\n}\n\nexport function exportRuns(queryString) {\n  return get(exportRunsApiPath(queryString));\n}\n","import {\n  getTriggerById,\n  getTriggers,\n  postTrigger,\n  putTrigger,\n} from '../clients/TriggerClient';\nimport {\n  CREATING_TRIGGER,\n  TRIGGERS_FAILURE,\n  TRIGGERS_REQUEST,\n  TRIGGERS_SUCCESS,\n  TRIGGER_CHANGED,\n  TRIGGER_FAILURE,\n  TRIGGER_REQUEST,\n  TRIGGER_SUCCESS,\n} from '../constants';\n\nexport function fetchTriggers(project) {\n  return {\n    promise: getTriggers(project),\n    types: [TRIGGERS_REQUEST, TRIGGERS_SUCCESS, TRIGGERS_FAILURE],\n  };\n}\n\nfunction triggerRequest(trigger) {\n  return { type: TRIGGER_REQUEST, trigger };\n}\n\n// Relies on the custom API middleware defined in ../middleware/api.js.\nfunction triggerSuccess(payload) {\n  return { type: TRIGGER_SUCCESS, payload };\n}\n\nfunction triggerFailure(error) {\n  return { type: TRIGGER_FAILURE, payload: error };\n}\n\n/**\n * @param {string} id\n */\nexport function fetchTrigger(id) {\n  return async dispatch => {\n    dispatch(triggerRequest);\n\n    try {\n      return dispatch(triggerSuccess(await getTriggerById(id)));\n    } catch (error) {\n      await dispatch(triggerFailure(error));\n      throw error;\n    }\n  };\n}\n\nexport function updateTrigger(trigger) {\n  return async dispatch => {\n    dispatch({ type: TRIGGER_REQUEST, trigger });\n\n    const payload = await putTrigger(trigger);\n    await dispatch(triggerSuccess(payload));\n    return payload;\n  };\n}\n\nexport function createTrigger(trigger) {\n  return async dispatch => {\n    dispatch({ type: CREATING_TRIGGER, trigger });\n\n    const payload = await postTrigger(trigger);\n    await dispatch(triggerSuccess(payload));\n    return payload;\n  };\n}\n\nexport function changeTrigger(id, change) {\n  return { type: TRIGGER_CHANGED, id, change };\n}\n\nexport function deleteTrigger(trigger) {\n  return async dispatch => {\n    dispatch({ type: TRIGGERS_REQUEST, trigger });\n\n    try {\n      dispatch(\n        triggerSuccess(\n          await putTrigger({ ...trigger, id: trigger.id, deleted: true })\n        )\n      );\n    } catch (error) {\n      dispatch(triggerFailure(error));\n    }\n  };\n}\n","import React, { useState } from 'react';\nimport {\n  Collapse,\n  Drawer,\n  List,\n  ListItem,\n  ListItemIcon,\n  ListItemText,\n  ListSubheader,\n  Tooltip,\n} from '@material-ui/core/';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  Book as BookIcon,\n  ExpandLess,\n  ExpandMore,\n  GitHub as GitHubIcon,\n} from '@material-ui/icons';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport PropTypes from 'prop-types';\nimport { useDispatch } from 'react-redux';\nimport * as cmp from 'semver-compare';\nimport Notifications from '../../actions/Notifications';\n\nconst addNotification = Notifications.add;\n\nconst useStyles = makeStyles(() => ({\n  root: {},\n  list: {\n    backgroundColor: 'white',\n  },\n}));\n\nfunction ExpressionHelper({ fn }) {\n  const dispatch = useDispatch();\n  const params =\n    fn.params && fn.params.length > 0 ? fn.params.join(', ') : 'none';\n  const docs = fn.docs || null;\n  const examples = docs\n    ? docs.tags.filter(i => i.title === 'example').map(i => i.description)\n    : 'none';\n\n  const description = docs ? docs.description : 'none';\n\n  return (\n    <ListItem disableGutters>\n      <ListItemText onSelect={fn.onSelect} disableTypography>\n        <div style={{ padding: '1em', paddingTop: 0 }}>\n          <b>{fn.name}</b>: <i>{description}</i>\n          <br />\n          <b>params:</b> {<i>{params}</i>}\n        </div>\n        {examples.map(example => (\n          <CopyToClipboard\n            text={example}\n            onCopy={() =>\n              dispatch(addNotification('Copied to clipboard.', 'success'))\n            }\n          >\n            <Tooltip title=\"Click to copy\">\n              <ListItem button>\n                <pre>{example === '' ? 'none' : example}</pre>\n              </ListItem>\n            </Tooltip>\n          </CopyToClipboard>\n        ))}\n      </ListItemText>\n    </ListItem>\n  );\n}\n\nfunction DocumentationDrawer({\n  open,\n  onClose,\n  values,\n  helpers,\n  latestVersionText,\n  adaptors,\n}) {\n  const [selectedOperation, setSelectedOperation] = useState(null);\n  const classes = useStyles();\n\n  const onSelectOperation = operation => {\n    if (selectedOperation === operation) {\n      setSelectedOperation(null);\n    } else {\n      setSelectedOperation(operation);\n    }\n  };\n\n  const githubLink = () => {\n    const npmCutOff = adaptors.reduce(\n      (acc, adaptor) => ((acc[adaptor.module] = adaptor.npm), acc),\n      {}\n    );\n\n    const { adaptor, adaptorVersion } = values;\n\n    const hasNpmVersionAndThisVersionIsLatest =\n      npmCutOff[adaptor] && !adaptorVersion;\n\n    const useNpm =\n      hasNpmVersionAndThisVersionIsLatest ||\n      (npmCutOff[adaptor] && cmp(adaptorVersion, npmCutOff[adaptor]) >= 0);\n\n    const npmUrl = `https://github.com/OpenFn/adaptors/tree/${\n      adaptorVersion\n        ? `%40openfn/language-${adaptor}%40${adaptorVersion.substring(\n            1\n          )}/packages/${adaptor}`\n        : `main/packages/${adaptor}`\n    }`;\n\n    const ghUrl = `https://www.github.com/openfn/language-${adaptor}${\n      adaptorVersion ? `/tree/${adaptorVersion}` : ''\n    }`;\n\n    const url = useNpm ? npmUrl : ghUrl;\n\n    window.open(url, '_blank');\n  };\n\n  const produceDocs = obj => {\n    return obj.map(x => (\n      <div key={x.name}>\n        <ListItem button onClick={() => onSelectOperation(x)}>\n          <ListItemText primary={x.name} />\n          {selectedOperation === x ? <ExpandLess /> : <ExpandMore />}\n        </ListItem>\n        <Collapse in={selectedOperation === x} timeout=\"auto\" unmountOnExit>\n          <ExpressionHelper fn={x} />\n        </Collapse>\n      </div>\n    ));\n  };\n\n  return (\n    <Drawer\n      anchor=\"right\"\n      open={open}\n      onClose={onClose}\n      className={classes.root}\n    >\n      <List\n        className={classes.list}\n        subheader={\n          <ListSubheader>\n            {values.adaptor}@{values.adaptorVersion || latestVersionText}\n          </ListSubheader>\n        }\n      >\n        {values.adaptor && (\n          <ListItem button onClick={githubLink}>\n            <ListItemIcon>\n              <GitHubIcon />\n            </ListItemIcon>\n            <ListItemText>View source code & docs</ListItemText>\n          </ListItem>\n        )}\n      </List>\n      <List\n        className={classes.list}\n        subheader={<ListSubheader>Adaptor-specific functions</ListSubheader>}\n      >\n        {helpers?.operations && produceDocs(helpers?.operations)}\n        {!helpers?.operations === true && (\n          <ListItem button onClick={githubLink}>\n            <ListItemIcon>\n              <BookIcon />\n            </ListItemIcon>\n            <ListItemText>\n              Inline docs have not yet been\n              <br />\n              written for this adaptor version.\n              <br />\n              Why not submit a pull request?\n            </ListItemText>\n          </ListItem>\n        )}\n      </List>\n      <List\n        className={classes.list}\n        subheader={<ListSubheader>Common (shared) functions</ListSubheader>}\n      >\n        {helpers?.common && produceDocs(helpers?.common)}\n      </List>\n    </Drawer>\n  );\n}\n\nDocumentationDrawer.propTypes = {\n  open: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  values: PropTypes.object.isRequired,\n  helpers: PropTypes.object.isRequired,\n  latestVersionText: PropTypes.string.isRequired,\n};\n\nexport default DocumentationDrawer;\n","import ACE from 'react-ace';\nimport 'ace-builds/src-min-noconflict/ext-language_tools';\nimport 'ace-builds/src-min-noconflict/mode-elixir';\nimport 'ace-builds/src-min-noconflict/mode-javascript';\nimport 'ace-builds/src-min-noconflict/mode-json';\nimport 'ace-builds/src-min-noconflict/snippets/javascript';\nimport 'ace-builds/src-min-noconflict/theme-chaos';\nimport 'ace-builds/src-min-noconflict/theme-chrome';\nimport 'ace-builds/src-min-noconflict/theme-clouds_midnight';\nimport 'ace-builds/src-min-noconflict/theme-cobalt';\nimport 'ace-builds/src-min-noconflict/theme-github';\nimport 'ace-builds/src-min-noconflict/theme-kuroir';\nimport 'ace-builds/src-min-noconflict/theme-monokai';\nimport 'ace-builds/src-min-noconflict/theme-solarized_dark';\nimport 'ace-builds/src-min-noconflict/theme-solarized_light';\nimport 'ace-builds/src-min-noconflict/theme-tomorrow';\nimport 'ace-builds/src-min-noconflict/theme-tomorrow_night';\nimport 'ace-builds/src-min-noconflict/theme-xcode';\n\nconst ace = require('ace-builds/src-noconflict/ace');\n\n// TODO: serve the ace build via webpack for stability\nace.config.set(\n  'basePath',\n  'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-min-noconflict/'\n);\n\nace.config.setModuleUrl(\n  'ace/mode/ext-language_tools',\n  'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-min-noconflict/ext-language_tools.js'\n);\n\nace.config.setModuleUrl(\n  'ace/snippets/javascript',\n  'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-min-noconflict/snippets/javascript.js'\n);\n\nace.config.setModuleUrl(\n  'ace/mode/javascript_worker',\n  'https://cdn.jsdelivr.net/npm/ace-builds@1.4.12/src-min-noconflict/worker-javascript.js'\n);\n\nconst langTools = ace.require('ace/ext/language_tools');\nconst { snippetManager } = ace.require('ace/snippets');\n\nconst themeOptions = [\n  { id: 'chaos', value: 'chaos', text: 'Chaos' },\n  { id: 'chrome', value: 'chrome', text: 'Chrome' },\n  { id: 'clouds_midnight', value: 'clouds_midnight', text: 'Clouds Midnight' },\n  { id: 'cobalt', value: 'cobalt', text: 'Cobalt' },\n  { id: 'github', value: 'github', text: 'Github' },\n  { id: 'kuroir', value: 'kuroir', text: 'Kuroir' },\n  { id: 'monokai', value: 'monokai', text: 'Monokai' },\n  { id: 'solarized_light', value: 'solarized_light', text: 'Solarized Light' },\n  { id: 'solarized_dark', value: 'solarized_dark', text: 'Solarized Dark' },\n  { id: 'tomorrow', value: 'tomorrow', text: 'Tomorrow' },\n  { id: 'tomorrow_night', value: 'tomorrow_night', text: 'Tomorrow Night' },\n  { id: 'xcode', value: 'xcode', text: 'X Code' },\n];\n\nfunction setupEditor(editor) {\n  editor.session.$worker.send('setOptions', [\n    {\n      environments: 'node',\n      esversion: 9,\n      undef: true,\n    },\n  ]);\n}\n\nfunction validAst(helpers) {\n  const { operations, common, adaptorName, adaptorVersion } = helpers;\n\n  const safeOps = operations || [];\n  const safeComms = common || helpers.commons || [];\n  const safeName = adaptorName ?? '';\n  const safeVersion = adaptorVersion ?? '';\n\n  return {\n    operations: safeOps,\n    common: safeComms,\n    adaptorName: safeName,\n    adaptorVersion: safeVersion,\n  };\n}\n\nconst parseSnippet = (snippetText, scope) =>\n  snippetText ? snippetManager?.parseSnippetFile(snippetText, scope) : null;\n\nconst getSnippetForExample = example => {\n  if (!example) return '';\n\n  const codeWithTabs = example.code\n    ?.split('\\n')\n    ?.map(c => `\\t${c}`)\n    ?.join('\\n');\n  const cleanCode =\n    codeWithTabs?.slice(-1) === ';' ? codeWithTabs : `${codeWithTabs};`;\n  return `snippet ${example?.functionName}\\n${cleanCode}`;\n};\n\nconst getExamples = helpers => {\n  const { adaptorVersion } = helpers;\n  const operations = helpers?.operations?.concat(helpers?.common);\n  if (!adaptorVersion) return [];\n\n  return [].concat(\n    operations?.map(op =>\n      op.docs?.tags\n        ?.filter(tag => tag.title === 'example')\n        ?.map((example, index) => {\n          const caption = example.caption || `example ${index + 1}`;\n          return {\n            code: example.description,\n            functionName: `${op.name}: ${caption}`,\n          };\n        })\n    )\n  );\n};\n\nconst createSnippets = (helpers, scope) =>\n  getExamples(helpers)\n    .flat()\n    .map(example => getSnippetForExample(example))\n    .reduce((acc, snippet) => acc.concat(parseSnippet(snippet, scope)), [])\n    .filter(snippet => snippet);\n\nfunction unregisterSnippets(previousSnippets) {\n  snippetManager.unregister(previousSnippets);\n  snippetManager.snippetMap.javascript = null;\n  snippetManager.snippetNameMap.javascript = null;\n}\n\nfunction addGlobals(editor, helpers) {\n  let adaptorGlobals = null;\n  adaptorGlobals = validAst(helpers);\n\n  const adaptorFunctions = []\n    .concat(adaptorGlobals?.common)\n    .concat(adaptorGlobals?.operations)\n    .map(x => x?.name)\n    .reduce((a, b) => ((a[b] = false), a), {});\n\n  editor.session.$worker.send('changeOptions', [\n    {\n      globals: {\n        console: false,\n        setTimeout: false,\n        state: true,\n        ...adaptorFunctions,\n      },\n    },\n  ]);\n\n  const customCompleter = {\n    getCompletions: (e, session, pos, prefix, callback) => {\n      const completions = session.helpers?.operations\n        .map((o, index) => ({\n          name: o.name,\n          value: o.name,\n          score: 2000 + index,\n          meta: o.docs && o.docs.description,\n        }))\n        .concat(\n          session.helpers?.common.map((f, index) => ({\n            name: f.name,\n            value: f.name,\n            score: 1000 + index,\n            meta: f.docs && f.docs.description,\n          }))\n        );\n      if (completions) callback(null, completions);\n    },\n  };\n\n  langTools.addCompleter(customCompleter);\n\n  const prevSnippets = snippetManager.snippetMap.javascript;\n\n  const sessionMode = editor.session.$mode.$id;\n\n  let sessionSnippetFile = null;\n  let sessionSnippetsScope = 'javascript';\n\n  if (snippetManager?.files) {\n    sessionSnippetFile = snippetManager.files[sessionMode];\n    sessionSnippetsScope = sessionSnippetFile?.scope;\n  }\n\n  if (prevSnippets) unregisterSnippets(prevSnippets);\n\n  const snippets = createSnippets(adaptorGlobals, sessionSnippetsScope);\n  if (snippets) snippetManager.register(snippets, sessionSnippetsScope);\n}\n\nexport { ACE as AceEditor, themeOptions, setupEditor, addGlobals };\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Avatar, CircularProgress } from '@material-ui/core';\nimport {\n  CheckCircle as CheckCircleIcon,\n  Error as ErrorIcon,\n  Warning as WarningIcon,\n} from '@material-ui/icons';\nimport PropTypes from 'prop-types';\n\nconst useStyles = makeStyles(theme => ({\n  success: {\n    color: theme.palette.success.light,\n  },\n  avSuccess: {\n    backgroundColor: theme.palette.success.light,\n  },\n  failed: {\n    color: theme.palette.error.light,\n  },\n  avFailed: {\n    backgroundColor: theme.palette.error.light,\n  },\n  running: {\n    color: theme.palette.grey[700],\n  },\n  avRunning: {\n    backgroundColor: theme.palette.grey[700],\n  },\n  other: {\n    color: theme.palette.warning.main,\n  },\n  avOther: {\n    backgroundColor: theme.palette.warning.main,\n  },\n}));\n\nfunction ExitCodeIcon({ exitCode, avatar, fontSize, circleSize }) {\n  const classes = useStyles();\n  if (avatar) {\n    switch (exitCode) {\n      case 0:\n        return (\n          <Avatar className={classes.avSuccess}>\n            <CheckCircleIcon fontSize={fontSize} />\n          </Avatar>\n        );\n      case 1:\n        return (\n          <Avatar className={classes.avFailed}>\n            <ErrorIcon fontSize={fontSize} />\n          </Avatar>\n        );\n      case null:\n        return <CircularProgress size={circleSize || 32} />;\n      default:\n        return (\n          <Avatar className={classes.avOther}>\n            <WarningIcon fontSize={fontSize} />\n          </Avatar>\n        );\n    }\n  }\n  switch (exitCode) {\n    case 0:\n      return (\n        <CheckCircleIcon className={classes.success} fontSize={fontSize} />\n      );\n    case 1:\n      return <ErrorIcon className={classes.failed} fontSize={fontSize} />;\n    case null:\n      return (\n        <CircularProgress className={classes.running} size={circleSize || 22} />\n      );\n    default:\n      return <WarningIcon className={classes.other} fontSize={fontSize} />;\n  }\n}\n\nExitCodeIcon.propTypes = {\n  exitCode: PropTypes.number,\n  circleSize: PropTypes.number,\n};\n\nExitCodeIcon.defaultProps = {\n  circleSize: 22,\n  exitCode: null,\n};\n\nexport default React.memo(ExitCodeIcon);\n","import DoneIcon from '@material-ui/icons/Done';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport TimerIcon from '@material-ui/icons/Timer';\nimport React from 'react';\n\nexport default {\n  interval: {\n    icon: (<TimerIcon fontSize=\"inherit\" />),\n    color: 'primary',\n  },\n  message: {\n    icon: (<FilterListIcon fontSize=\"inherit\" />),\n    color: 'secondary',\n  },\n  job: {\n    icon: (<DoneIcon fontSize=\"inherit\" />),\n    color: 'error',\n  },\n  fail: {\n    icon: (<ErrorOutlineIcon fontSize=\"inherit\" />),\n    color: 'primary',\n  },\n  unknown: {\n    icon: (<ErrorOutlineIcon fontSize=\"inherit\" />),\n    color: 'primary',\n  },\n};\n","import {\n  Avatar,\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogContentText,\n  DialogTitle,\n  Grid,\n  IconButton,\n  MenuItem,\n  Tooltip,\n  Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  Delete as DeleteIcon,\n  FlashOn as FlashOnIcon,\n  Help as HelpIcon,\n} from '@material-ui/icons';\nimport { isEqual } from 'lodash';\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { Field, Form } from 'react-final-form';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport cron from 'cron-validate';\nimport KeyBinding from 'react-keybinding-component';\nimport { OnChange } from 'react-final-form-listeners';\nimport { fetchJobs } from '../actions/JobActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport {\n  createTrigger,\n  deleteTrigger,\n  fetchTrigger,\n  updateTrigger,\n} from '../actions/TriggerActions';\nimport triggerIcons from '../constants/triggerIcons';\nimport {\n  createFormErrors,\n  cronToHuman,\n  formSaveKeys,\n  linkTo,\n  validJson,\n} from '../helpers';\nimport FormActions from './FormActions';\nimport SelectInput from './FormHelpers/SelectInput';\nimport TextInput from './FormHelpers/TextInput';\nimport OneCardHolder from './OneCardHolder';\nimport { UnprocessableEntity } from '../errors';\nimport { projectTriggersPath } from '../helpers/pathHelpers';\nimport Loader from './Loader';\nimport {findTrigger} from '../selectors';\n\nconst identity = value => value;\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    display: 'flex',\n    flexWrap: 'wrap',\n    justifyContent: 'space-around',\n    alignItems: 'flex',\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n  message: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  job: {\n    backgroundColor: theme.palette.success.light,\n  },\n  fail: {\n    backgroundColor: theme.palette.error.light,\n  },\n}));\n\nconst validate = values => {\n  const errors = {};\n  if (!values.type) {\n    errors.type = 'Required';\n  }\n  if (!values.name) {\n    errors.name = 'Required';\n  }\n  if (!values.criteria && values.type === 'message') {\n    errors.criteria = 'Required';\n  }\n  if (!values.jobId && (values.type === 'job' || values.type === 'fail')) {\n    errors.jobId = 'Required';\n  }\n  if (!values.cron && values.type === 'interval') {\n    errors.cron = 'Required';\n  }\n  if (\n    values.cron &&\n    values.type === 'interval' &&\n    !cron(values.cron).isValid()\n  ) {\n    errors.cron = 'Use \"*/x\" or \"y-z/x\"; not \"y/x\" for a standard cron term.';\n  }\n  // this is handling bad JSON\n  if (!validJson(values.criteria)) {\n    if (values.type === 'message') {\n      errors.criteria = 'Invalid JSON';\n    }\n  }\n  if (!validJson(values.exclusion)) {\n    if (values.type === 'message' && values.exclusion) {\n      errors.exclusion = 'Invalid JSON';\n    }\n  }\n  return errors;\n};\n\nconst triggerOptions = [\n  { id: 'interval', value: 'interval', text: 'Cron (scheduled)' },\n  { id: 'job', value: 'job', text: 'Flow' },\n  { id: 'fail', value: 'fail', text: 'Fail (Catch)' },\n  { id: 'message', value: 'message', text: 'Message Filter' },\n];\n\nconst typeHelpers = {\n  interval: 'Job runs based on a cron schedule',\n  job: 'Job runs when another job succeeds',\n  fail: 'Job runs when another job fails',\n  message: 'Job runs when matching messages arrive',\n};\n\nfunction CronText({ text }) {\n  const hCron = cronToHuman(text);\n  if (hCron) {\n    return (\n      <Typography>\n        {`Run this job ${hCron} (UTC+0). `}\n        <HelpIcon fontSize=\"inherit\" />\n        {' See '}\n        <a\n          href=\"https://crontab.guru/\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          crontab.guru\n        </a>\n        {' for help.'}\n      </Typography>\n    );\n  }\n  return (\n    <Typography>\n      <HelpIcon fontSize=\"inherit\" /> Use{' '}\n      <a href=\"https://crontab.guru/\" target=\"_blank\" rel=\"noopener noreferrer\">\n        crontab.guru\n      </a>{' '}\n      to prepare a{' '}\n      <b>\n        <em>standard</em>\n      </b>{' '}\n      cron expression.\n    </Typography>\n  );\n}\nfunction TriggerView({\n  selectedProject,\n  fromWizard,\n  onCancel,\n  onSubmitComplete,\n  dialog,\n  trigger,\n  title,\n  submitAction,\n}) {\n  const [modalShow, setModalShow] = useState(false);\n  const dispatch = useDispatch();\n  const classes = useStyles();\n  const history = useHistory();\n\n  const error = useSelector(state => state.triggers.error);\n  if (error) {\n    throw error;\n  }\n\n  const [jobs, jobsUsingTrigger] = useSelector(state => {\n    const items = Object.values(state.jobs.items);\n    return [\n      items,\n      items.filter(j => {\n        return j.triggerId === trigger.id && j.archived !== true;\n      }) || [{ name: 'loading' }],\n    ];\n  }, isEqual);\n\n  const handleCancel = e => {\n    if (onCancel) {\n      onCancel();\n    } else {\n      linkTo(projectTriggersPath(selectedProject), history)(e);\n    }\n  };\n\n  const showModal = () => {\n    setModalShow(true);\n  };\n\n  const hideModal = () => {\n    setModalShow(false);\n  };\n\n  const handleTypeChange = (value, mutators) => {\n    switch (value) {\n      case 'interval':\n        mutators.modify('criteria', null);\n        mutators.modify('exclusion', null);\n        mutators.modify('jobId', null);\n        break;\n\n      case 'message':\n        mutators.modify('cron', null);\n        mutators.modify('jobId', null);\n        break;\n\n      default:\n        mutators.modify('cron', null);\n        mutators.modify('criteria', null);\n        mutators.modify('exclusion', null);\n        break;\n    }\n  };\n\n  const submit = async values => {\n    try {\n      const result = await dispatch(submitAction(values));\n      if (!dialog) {\n        history.push(projectTriggersPath(selectedProject));\n      } else {\n        onSubmitComplete('triggerId', result.result);\n      }\n    } catch (error) {\n      if (error instanceof UnprocessableEntity) {\n        return createFormErrors(error.errors, values);\n      }\n\n      return error;\n    }\n  };\n\n  const handleDeleteTrigger = trigger => {\n    dispatch(deleteTrigger(trigger));\n    history.push(projectTriggersPath(selectedProject));\n  };\n\n  const jobsList = useMemo(\n    () => ({\n      count: jobsUsingTrigger.length,\n      names: jobsUsingTrigger.map(a => a.name).join(', '),\n    }),\n    [jobsUsingTrigger]\n  );\n\n  const jobOptions = useMemo(\n    () => jobs.map(j => ({ id: j.id, value: j.id, text: j.name })),\n    [jobs]\n  );\n\n  useEffect(() => {\n    if (selectedProject) {\n      dispatch(fetchJobs(selectedProject));\n    }\n  }, [selectedProject, dispatch]);\n\n  useEffect(() => {\n    if (!fromWizard) {\n      document.title = 'Trigger Edit - OpenFn';\n      dispatch(switchedMenu('Triggers'));\n    }\n  }, [fromWizard, dispatch]);\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      initialValues={trigger}\n      mutators={{\n        modify: ([field, value], state, { changeValue }) => {\n          changeValue(state, field, () => value);\n        },\n      }}\n      render={({\n        handleSubmit,\n        form,\n        dirtySinceLastSubmit,\n        values,\n        errors,\n        dirtyFieldsSinceLastSubmit,\n        touched,\n        submitErrors,\n      }) => {\n        if (submitErrors instanceof Error) throw submitErrors;\n        return (\n          <OneCardHolder noPad={fromWizard} full={fromWizard}>\n            <Dialog open={modalShow} onClose={hideModal}>\n              <DialogTitle>\n                Are you sure you wish to delete the <b>{values.name}</b>{' '}\n                trigger?\n              </DialogTitle>\n              <DialogContent>\n                <DialogContentText>\n                  OpenFn will mark this trigger for deletion. You will not be\n                  able to access or edit the trigger once this is done. If those\n                  jobs are restored, they will not run succesfully until you add\n                  a new trigger and assign it to those jobs.\n                </DialogContentText>\n              </DialogContent>\n              <DialogActions>\n                <Button onClick={hideModal}>No, I&apos;m not sure.</Button>\n                <Button\n                  id=\"delete_trigger_button\"\n                  onClick={() => handleDeleteTrigger(trigger)}\n                >\n                  Yes, delete this trigger.\n                </Button>\n              </DialogActions>\n            </Dialog>\n            <Card>\n              <CardHeader\n                titleTypographyProps={{ noWrap: true }}\n                subheaderTypographyProps={{ noWrap: true }}\n                avatar={\n                  <Avatar className={classes[values.type]}>\n                    {values.type ? (\n                      triggerIcons[values.type].icon\n                    ) : (\n                      <FlashOnIcon />\n                    )}\n                  </Avatar>\n                }\n                title={title}\n                subheader={\n                  jobsList.count > 0\n                    ? `In use by: ${jobsList.names}.`\n                    : 'Not in use.'\n                }\n                action={\n                  trigger.id && (\n                    <Tooltip\n                      title={\n                        jobsUsingTrigger.length > 0\n                          ? \"You can't delete triggers that are currently in use.\"\n                          : 'Delete'\n                      }\n                    >\n                      <div>\n                        <IconButton\n                          onClick={showModal}\n                          disabled={jobsUsingTrigger.length > 0}\n                        >\n                          <DeleteIcon />\n                        </IconButton>\n                      </div>\n                    </Tooltip>\n                  )\n                }\n              />\n              <form onSubmit={handleSubmit} autoComplete=\"off\">\n                <CardContent>\n                  <Grid container direction=\"column\">\n                    <Grid item>\n                      <Field\n                        name=\"name\"\n                        id=\"name\"\n                        label=\"Label\"\n                        inputProps={{ 'data-testid': 'trigger-label' }}\n                        fullWidth\n                        component={TextInput}\n                      />\n                    </Grid>\n                    <Grid item>\n                      <Field\n                        name=\"type\"\n                        label=\"Trigger Type\"\n                        fullWidth\n                        component={SelectInput}\n                        helperText={`${typeHelpers[values.type] ?? ''}\\n${\n                          (errors?.type && touched?.type) ||\n                          (submitErrors?.type &&\n                            !dirtyFieldsSinceLastSubmit?.type)\n                            ? errors?.type || submitErrors?.type\n                            : ' '\n                        }`}\n                        options={triggerOptions}\n                      />\n                      <OnChange name=\"type\">\n                        {value => handleTypeChange(value, form.mutators)}\n                      </OnChange>\n                    </Grid>\n                    <Grid item>\n                      {values.type === 'interval' && (\n                        <Field\n                          name=\"cron\"\n                          id=\"cron\"\n                          label=\"Cron Expression\"\n                          fullWidth\n                          component={TextInput}\n                          type=\"code\"\n                          instant\n                          placeholder=\"* * * * *\"\n                        />\n                      )}\n                      {values.type === 'interval' && (\n                        <CronText text={values.cron} />\n                      )}\n                      {values.type === 'message' && (\n                        <Field\n                          id=\"criteria\"\n                          name=\"criteria\"\n                          component={TextInput}\n                          multiline\n                          type=\"code\"\n                          fullWidth\n                          label={\n                            <div>\n                              Inclusion Criteria&nbsp;\n                              <Tooltip\n                                title='Messages with bodies that contain\n                                this JSONB signature will be included in this\n                                trigger. Go to docs.openfn.org and search\n                                \"triggers\" to learn more.'\n                              >\n                                <HelpIcon fontSize=\"inherit\" />\n                              </Tooltip>\n                            </div>\n                          }\n                          placeholder='{\"formId\":123}'\n                        />\n                      )}\n                      {values.type === 'message' && (\n                        <Field\n                          id=\"exclusion\"\n                          name=\"exclusion\"\n                          component={TextInput}\n                          multiline\n                          type=\"code\"\n                          fullWidth\n                          allowEmpty\n                          label={\n                            <div>\n                              Exclusion Criteria&nbsp;\n                              <Tooltip\n                                title='Messages with bodies that contain this\n                                JSONB signature will be excluded, even if they\n                                match the above inclusion criteria. Go to\n                                docs.openfn.org and search \"triggers\" to learn\n                                more.'\n                              >\n                                <HelpIcon fontSize=\"inherit\" />\n                              </Tooltip>\n                            </div>\n                          }\n                          placeholder='{\"submission_type\": \"test\"}'\n                          parse={identity}\n                        />\n                      )}\n                      {(values.type === 'job' || values.type === 'fail') && (\n                        <Field\n                          name=\"jobId\"\n                          id=\"jobId\"\n                          component={SelectInput}\n                          label=\"Job\"\n                          fullWidth\n                          placeholder=\"Select parent job...\"\n                          helperText={\n                            (errors?.jobId && touched?.jobId) ||\n                            (submitErrors?.jobId &&\n                              !dirtyFieldsSinceLastSubmit?.jobId)\n                              ? errors?.jobId || submitErrors?.jobId\n                              : ' '\n                          }\n                        >\n                          {jobOptions.map(op => (\n                            <MenuItem id={op.id} key={op.id} value={op.value}>\n                              {op.text}\n                            </MenuItem>\n                          ))}\n                        </Field>\n                      )}\n                    </Grid>\n                    {submitErrors?.otherError && !dirtySinceLastSubmit && (\n                      <Typography className={classes.error}>\n                        {submitErrors?.otherError}\n                      </Typography>\n                    )}\n                  </Grid>\n                </CardContent>\n                <FormActions\n                  cancel={handleCancel}\n                  reset={form.reset}\n                  enterPress={handleSubmit}\n                  submit={handleSubmit}\n                  form={form}\n                />\n              </form>\n            </Card>\n            {!fromWizard && (\n              <KeyBinding onKey={e => formSaveKeys(e, handleSubmit)} />\n            )}\n          </OneCardHolder>\n        );\n      }}\n    />\n  );\n}\n\nexport function NewTriggerView({ selectedProject, ...rest }) {\n  return (\n    <TriggerView\n      {...rest}\n      selectedProject={selectedProject}\n      trigger={{ projectId: selectedProject.id }}\n      title=\"New Trigger\"\n      submitAction={createTrigger}\n    />\n  );\n}\n\nexport function EditTriggerView(props) {\n  const dispatch = useDispatch();\n  const [hasLoaded, setLoaded] = useState(false);\n  const [error, setError] = useState(null);\n\n  const { triggerSlug } = useParams();\n\n  const trigger = useSelector(state => {\n    const item = findTrigger(state, triggerSlug);\n\n    // This takes the JSON object and turns it into a string for the user to edit.\n    // TODO: Eventually, we will want to abstract this form-version of JSONb.\n    if (item) {\n      if (item && item.criteria && typeof item.criteria === 'object') {\n        item.criteria = JSON.stringify(item.criteria);\n      }\n      if (item && item.exclusion && typeof item.exclusion === 'object') {\n        item.exclusion = JSON.stringify(item.exclusion);\n      }\n    }\n\n    return item;\n  }, isEqual);\n\n  useEffect(() => {\n    (async () => {\n      if (!trigger) {\n        try {\n          await dispatch(fetchTrigger(triggerSlug));\n        } catch (error) {\n          setError(error);\n        } finally {\n          setLoaded(true);\n        }\n      }\n    })();\n  }, [trigger, triggerSlug, dispatch]);\n\n  if (!trigger && hasLoaded) {\n    throw { status: 404 };\n  }\n\n  if (error) {\n    throw error;\n  }\n\n  if (!trigger) {\n    return <Loader item=\"trigger\" />;\n  }\n\n  return (\n    <TriggerView\n      {...props}\n      trigger={trigger}\n      title={trigger.name}\n      submitAction={updateTrigger}\n    />\n  );\n}\n\nexport default TriggerView;\n","import { IconButton, Tooltip } from '@material-ui/core';\nimport { Refresh as RefreshIcon } from '@material-ui/icons';\nimport React from 'react';\n\nexport default function GetSampleReceiptsButton(props) {\n  const { disabled, onClick, onLightBg } = props;\n\n  const colorOnDark = 'primary';\n  const colorOnLight = 'default';\n\n  return (\n    <Tooltip\n      title=\"Search again for messages matching this trigger. (Limited to the last 90 days)\"\n      component=\"span\"\n    >\n      <IconButton\n        disabled={disabled}\n        color={onLightBg ? colorOnLight : colorOnDark}\n        size=\"small\"\n        onClick={onClick}\n      >\n        <RefreshIcon />\n      </IconButton>\n    </Tooltip>\n  );\n}\n","import { IconButton, Menu, MenuItem, Tooltip } from '@material-ui/core';\nimport React from 'react';\n\nexport default function IconPicker(props) {\n  const {\n    action,\n    anchorEl,\n    currentOption,\n    handleClick,\n    hint,\n    icon,\n    onClose,\n    options,\n  } = props;\n\n  return (\n    <span>\n      <Tooltip title={hint}>\n        <IconButton aria-controls=\"simple-menu\" onClick={handleClick}>\n          {icon}\n        </IconButton>\n      </Tooltip>\n      <Menu\n        id=\"simple-menu\"\n        anchorEl={anchorEl}\n        keepMounted\n        open={Boolean(anchorEl)}\n        onClose={onClose}\n      >\n        {options.map(x => (\n          <MenuItem\n            button\n            key={x.id}\n            disabled={x.value === currentOption}\n            onClick={() => {\n              onClose();\n              return action(x.value);\n            }}\n          >\n            {x.text}\n          </MenuItem>\n        ))}\n      </Menu>\n    </span>\n  );\n}\n","export default {\n  '.json-inspector,\\n.json-inspector__selection': {\n    font: '14px/1.4 Consolas, monospace',\n  },\n  '.json-inspector__leaf': { paddingLeft: '10px' },\n  '.json-inspector__line': {\n    display: 'block',\n    position: 'relative',\n    cursor: 'default',\n  },\n  '.json-inspector__line:after': {\n    content: \"''\",\n    position: 'absolute',\n    top: '0',\n    left: '-200px',\n    right: '-50px',\n    bottom: '0',\n    zIndex: -1,\n    pointerEvents: 'none',\n  },\n  '.json-inspector__line:hover:after': {\n    background: 'rgba(0, 0, 0, 0.06)',\n  },\n  '.json-inspector__leaf_composite > .json-inspector__line': {\n    cursor: 'pointer',\n  },\n  '.json-inspector__radio,\\n.json-inspector__flatpath': { display: 'none' },\n  '.json-inspector__value': { marginLeft: '5px' },\n  '.json-inspector__search': {\n    width: '100%',\n    marginBottom: 10,\n    padding: '2px',\n  },\n  '.json-inspector__key': { color: '#505050' },\n  '.json-inspector__value_helper,\\n.json-inspector__value_null,\\n.json-inspector__not-found': {\n    color: '#b0b0b0',\n  },\n  '.json-inspector__value_string': { color: '#798953' },\n  '.json-inspector__value_boolean': { color: '#75b5aa' },\n  '.json-inspector__value_number': { color: '#d28445' },\n  '.json-inspector__hl': {\n    background: '#ff0',\n    boxShadow: '0 -1px 0 2px #ff0',\n    borderRadius: '2px',\n  },\n  '.json-inspector__show-original': {\n    display: 'inline-block',\n    padding: '0 6px',\n    color: '#666',\n    cursor: 'pointer',\n  },\n  '.json-inspector__show-original:hover': { color: '#111' },\n  '.json-inspector__show-original:before': { content: \"'⥂'\" },\n  '.json-inspector__show-original:hover:after': { content: \"' expand'\" },\n};\n","export default {\n  '.Resizer': {\n    background: '#000',\n    opacity: 0.3,\n    zIndex: 1,\n    MozBoxSizing: 'border-box',\n    WebkitBoxSizing: 'border-box',\n    boxSizing: 'border-box',\n    MozBackgroundClip: 'padding',\n    WebkitBackgroundClip: 'padding',\n    backgroundClip: 'padding-box',\n  },\n  '.Resizer:hover': {\n    WebkitTransition: 'all 2s ease',\n    transition: 'all 2s ease',\n  },\n  '.Resizer.horizontal': {\n    height: '11px',\n    margin: '-5px 0',\n    borderTop: '5px solid rgba(255, 255, 255, 0)',\n    borderBottom: '5px solid rgba(255, 255, 255, 0)',\n    cursor: 'row-resize',\n    width: '100%',\n  },\n  '.Resizer.horizontal:hover': {\n    borderTop: '5px solid rgba(0, 0, 0, 0.5)',\n    borderBottom: '5px solid rgba(0, 0, 0, 0.5)',\n  },\n  '.Resizer.vertical': {\n    width: '11px',\n    margin: '0 -5px',\n    borderLeft: '5px solid rgba(255, 255, 255, 0)',\n    borderRight: '5px solid rgba(255, 255, 255, 0)',\n    cursor: 'col-resize',\n  },\n  '.Resizer.vertical:hover': {\n    borderLeft: '5px solid rgba(0, 0, 0, 0.5)',\n    borderRight: '5px solid rgba(0, 0, 0, 0.5)',\n  },\n  '.Resizer.disabled': { cursor: 'not-allowed' },\n  '.Resizer.disabled:hover': { borderColor: 'transparent' },\n};\n","import React from 'react';\nimport {\n  Grid,\n  Hidden,\n  makeStyles,\n  MenuItem,\n  Select,\n  TextField,\n  Tooltip,\n} from '@material-ui/core';\nimport { allowAnyOption } from '../../helpers';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    '& .MuiTextField-root': {\n      width: '20ch',\n    },\n  },\n  inline: {\n    '& .MuiSelect-icon': {\n      color: theme.palette.transWhite,\n    },\n    '& .MuiSelect-root': {\n      color: theme.palette.primary.main,\n      border: 'none',\n      fontSize: '0.875rem',\n      marginTop: -2,\n      marginBottom: -2,\n      fontFamily: theme.typography.codeFont,\n    },\n  },\n}));\n\nfunction StudioInput({\n  input,\n  inline,\n  label,\n  options,\n  placeholder,\n  hidden,\n  hoverError,\n  children,\n  allowAny,\n  onChange,\n  meta: { error, dirtySinceLastSubmit, submitError },\n}) {\n  const classes = useStyles();\n\n  const getSubmitErrorMessage = err => [].concat(err?.message)?.join(';');\n\n  const showError = (submitError && !dirtySinceLastSubmit) || !!error;\n\n  if (allowAny) allowAnyOption(options, input.value);\n\n  if (inline) {\n    return (\n      <Hidden xsUp={hidden}>\n        <Select\n          disableUnderline\n          displayEmpty\n          value={input.value}\n          onChange={onChange || input.onChange}\n          className={classes.inline}\n        >\n          {placeholder && (\n            <MenuItem value=\"\">\n              <em>{placeholder}</em>\n            </MenuItem>\n          )}\n          {options.map(op => (\n            <MenuItem value={op.value} key={op.value}>\n              {op.text}\n            </MenuItem>\n          ))}\n          {children}\n        </Select>\n      </Hidden>\n    );\n  }\n\n  return (\n    <Hidden xsUp={hidden}>\n      <Grid item className={classes.root}>\n        <Tooltip\n          title={showError ? error || getSubmitErrorMessage(submitError) : ''}\n        >\n          <TextField\n            onBlur={event => input.onBlur(event)}\n            size=\"small\"\n            variant=\"outlined\"\n            select={options}\n            SelectProps={{ displayEmpty: true }}\n            InputLabelProps={{ shrink: true }}\n            value={input.value}\n            helperText={\n              !hoverError && showError\n                ? error || getSubmitErrorMessage(submitError)\n                : undefined\n            }\n            error={showError}\n            onChange={onChange || input.onChange}\n            label={label}\n          >\n            {placeholder && (\n              <MenuItem value=\"\">\n                <em>{placeholder}</em>\n              </MenuItem>\n            )}\n            {options &&\n              options.map(op => (\n                <MenuItem key={op.value} value={op.value}>\n                  {op.text}\n                </MenuItem>\n              ))}\n          </TextField>\n        </Tooltip>\n      </Grid>\n    </Hidden>\n  );\n}\n\nexport default React.memo(StudioInput);\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n  AppBar,\n  Avatar,\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  Dialog,\n  DialogContent,\n  DialogTitle,\n  Grid,\n  IconButton,\n  Menu,\n  MenuItem,\n  Paper,\n  Step,\n  StepButton,\n  StepContent,\n  StepLabel,\n  Stepper,\n  TextField,\n  Tooltip,\n  Typography,\n} from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n  Book as BookIcon,\n  ChevronLeft,\n  ChevronRight,\n  ClearAll,\n  CloudQueue,\n  Error as ErrorIcon,\n  FlashOn as FlashOnIcon,\n  Fullscreen as FullscreenIcon,\n  FullscreenExit as FullscreenExitIcon,\n  Help as HelpIcon,\n  Palette as PaletteIcon,\n  SettingsEthernet as SettingsEthernetIcon,\n  SlowMotionVideo as SlowMotionVideoIcon,\n} from '@material-ui/icons';\nimport { Autocomplete } from '@material-ui/lab';\nimport { jsonKeyPathList } from 'json-key-path-list';\nimport clsx from 'clsx';\nimport { isEqual } from 'lodash';\n\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport { Field, Form } from 'react-final-form';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { ReflexContainer, ReflexElement, ReflexSplitter } from 'react-reflex';\nimport { joinChannel } from '../../actions/ChannelActions';\nimport {\n  adaptorRequested,\n  getHelpers,\n  installAdaptor,\n  receiveAdaptor,\n  receiveAdaptorError,\n} from '../../actions/JobActions';\nimport Notification from '../../actions/Notifications';\nimport { loadRun, receiveRun } from '../../actions/RunActions';\nimport { updateUser } from '../../actions/UserActions';\nimport {\n  allowSaveForSubmitError,\n  humanReadable,\n  insertAceText,\n  isNumeric,\n  linkTo,\n  stateFromReceipt,\n} from '../../helpers';\nimport { runShowPath } from '../../helpers/pathHelpers';\nimport {\n  selectAdaptorAstInstalled,\n  selectAdaptorFetchingHelpers,\n  selectAdaptorInstalled,\n  selectAdaptorInstallError,\n  selectAdaptorRequested,\n  selectInstallingAdaptor,\n  selectInstallStatusMessage,\n} from '../../selectors';\nimport {\n  AceEditor,\n  addGlobals,\n  setupEditor,\n  themeOptions,\n} from '../CodeEditor';\nimport FieldWithBlank from '../CustomField';\nimport ExitCodeIcon from '../ExitCodeIcon';\nimport FormActions from '../FormActions';\nimport SelectInput from '../FormHelpers/SelectInput';\nimport TextInput from '../FormHelpers/TextInput';\nimport OneCardHolder from '../OneCardHolder';\nimport { NewTriggerView } from '../TriggerView';\nimport GetSampleReceiptsButton from './GetSampleReceiptsButton';\nimport IconPicker from './IconPicker';\nimport jsonExplorerStyles from './jsonExplorerStyles';\nimport splitPaneStyles from './splitPaneStyles';\nimport StudioInput from './StudioInput';\n\nimport Images from '../../helpers/imagePaths';\n\nconst styles = theme => ({\n  pickerTextField: {\n    '& .MuiInputBase-root': {\n      backgroundColor: 'rgba(255, 255, 255, 0.05)',\n      paddingTop: 4,\n      paddingLeft: 10,\n      fontWeight: 500,\n      fontSize: 14,\n      color: 'white',\n    },\n    marginTop: 8,\n    marginBottom: 8,\n  },\n  root: {\n    display: 'flex',\n    overflowX: 'hidden',\n    backgroundImage: `url(${Images.bgPattern})`,\n    minHeight: 'calc(100vh)',\n  },\n  pickerAdornment: {\n    '& .MuiButtonBase-root': {\n      color: 'white',\n    },\n  },\n  splitter: {\n    whiteSpace: 'nowrap !important',\n    width: '12px',\n    border: 'none !important',\n    borderLeft: '1px !important',\n    background: `${theme.palette.secondary.main} !important`,\n    color: theme.palette.transWhite,\n    padding: theme.spacing(2),\n    paddingBottom: theme.spacing(0.5),\n    paddingTop: theme.spacing(0.5),\n    '& .MuiIconButton-root.Mui-disabled': {\n      color: theme.palette.transWhiteDark,\n    },\n    '& .MuiButton-root': {\n      minWidth: 32,\n    },\n  },\n  splitterBottom: {\n    height: 'auto !important',\n  },\n  splitterTitle: {\n    color: 'ffffffb3',\n    webkitTransform: 'rotate(90deg) ',\n    transform: 'rotate(90deg)',\n    fontSize: 12,\n  },\n  paneContainer: {\n    height: '100%',\n  },\n  flex: {\n    flexGrow: 1,\n  },\n  editorTitle: {\n    width: '100%',\n    background: theme.palette.secondary.main,\n    color: theme.palette.transWhite,\n    fontFamily: theme.typography.codeFont,\n    padding: theme.spacing(2),\n    paddingBottom: theme.spacing(0.5),\n    paddingTop: theme.spacing(0.5),\n    '& .MuiIconButton-root.Mui-disabled': {\n      color: theme.palette.transWhiteDark,\n    },\n    '& .MuiButton-root': {\n      minWidth: 32,\n    },\n  },\n  error: {\n    position: 'absolute',\n    right: 0,\n    zIndex: 9999,\n    backgroundColor: theme.palette.error.light,\n    padding: theme.spacing(2),\n    borderRadius: '0 0 0 20px',\n    maxWidth: 400,\n    textAlign: 'justify',\n    textJustify: 'auto',\n  },\n  primaryBlue: {\n    color: theme.palette.primary.main,\n  },\n  editor: {\n    overflow: 'hidden',\n    background: theme.palette.paper,\n    '@global': {\n      '.pane': {\n        position: 'relative !important',\n      },\n      '.receiptInspector': {\n        backgroundColor: theme.palette.offWhite,\n        height: '100%',\n        width: '100%',\n      },\n      ...jsonExplorerStyles,\n      ...splitPaneStyles,\n    },\n  },\n  bigEditor: {\n    margin: '-25px',\n    height: 'calc(100vh - 47px)',\n  },\n  smallEditor: {\n    margin: 0,\n    height: 400,\n  },\n  newButton: {\n    marginLeft: 25,\n    marginTop: 25,\n  },\n  flexContainer: {\n    display: 'flex',\n    flexFlow: 'column',\n  },\n  menu: {\n    padding: theme.spacing(2),\n    paddingBottom: theme.spacing(1.5),\n  },\n  disabledButton: {\n    color: 'grey !important',\n  },\n  optionExtra: {\n    marginLeft: '1em',\n    fontFamily: theme.typography.codeFont,\n    fontSize: '75%',\n    backgroundColor: theme.palette.grey[200],\n    padding: theme.spacing(0.5),\n    borderRadius: theme.spacing(1),\n  },\n  autoComplete: {\n    width: '100%',\n    marginLeft: theme.spacing(-2),\n    marginRight: theme.spacing(1),\n  },\n});\n\nfunction isDotableNodeName(str) {\n  return /^([a-zA-Z_$][a-zA-Z\\\\d_$]*)$/i.test(str);\n}\n\nconst createOptions = arrayOfPaths => {\n  return arrayOfPaths\n    .sort((a, b) => a.length - b.length)\n    .map(nodeArray => {\n      const depth = nodeArray.length - 1;\n      let str = '';\n      nodeArray.forEach(node => {\n        if (isDotableNodeName(node)) {\n          str += `.${node}`;\n        } else if (isNumeric(node)) {\n          str += `[${node}]`;\n        } else {\n          str += `['${node}']`;\n        }\n      });\n\n      const copyPath = str[0] === '.' ? str.slice(1) : str;\n      const hasQuotes = str.indexOf(\"'\") >= 0;\n\n      return {\n        group: depth >= 1 ? nodeArray[depth - 1] : 'data',\n        title: nodeArray[depth],\n        extra: `state.data${str}`,\n        value: hasQuotes\n          ? `dataValue(\"${copyPath}\")`\n          : `dataValue('${copyPath}')`,\n      };\n    });\n};\n\nfunction AdaptorModal(props) {\n  const { showModal, handleShowModal, handleAdaptorChange } = props;\n  const mainForm = props.form;\n  const mainFormValues = props.values;\n\n  const handleSubmit = values => {\n    const { customAdaptorName, customAdaptorVersion } = values;\n    handleAdaptorChange(customAdaptorName, customAdaptorVersion, mainForm);\n    handleShowModal(false);\n  };\n\n  const validate = values => {\n    const errors = {};\n    if (!values.customAdaptorName) {\n      errors.customAdaptorName = 'Required';\n    } else if (values.customAdaptorName.match(/language-/i)) {\n      errors.customAdaptorName = 'Enter only the \"xyz\" of \"language-xyz\"';\n    }\n    if (!values.customAdaptorVersion) {\n      errors.customAdaptorVersion = 'Required';\n    } else if (\n      !/^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/.test(\n        values.customAdaptorVersion\n      )\n    ) {\n      errors.customAdaptorVersion =\n        'Invalid adaptor version, use \"v1.2.3\" format';\n    }\n\n    return errors;\n  };\n\n  const initialValues = {\n    customAdaptorName: null,\n    customAdaptorVersion: null,\n  };\n\n  return (\n    <Form\n      onSubmit={handleSubmit}\n      validate={validate}\n      initialValues={initialValues}\n      render={({ handleSubmit, form }) => (\n        <>\n          <form onSubmit={handleSubmit} autoComplete=\"off\">\n            <Dialog open={showModal} onClose={() => handleShowModal(false)}>\n              <DialogTitle>Select Unreleased Adaptor</DialogTitle>\n              <DialogContent>\n                <Typography>\n                  Enter the adaptor name <code>xyz</code> as in{' '}\n                  <code>@openfn/language-xyz</code> and specify the version\n                  (e.g., <code>v1.2.3</code>) to request an adaptor from NPM\n                  that has not yet been released on the platform.\n                </Typography>\n                <br />\n                <Typography>\n                  Note that the install will take place the first time this job\n                  runs, the install may fail, and that inline documentation from\n                  the AST will not be available until the install is successful.\n                </Typography>\n                <br />\n                <Field\n                  name=\"customAdaptorName\"\n                  id=\"customAdaptorName\"\n                  label=\"Adaptor\"\n                  placeholder={mainFormValues?.adaptor}\n                  component={TextInput}\n                />\n                &nbsp;&nbsp;\n                <Field\n                  name=\"customAdaptorVersion\"\n                  id=\"customAdaptorVersion\"\n                  label=\"Version\"\n                  placeholder={mainFormValues?.adaptorVersion}\n                  component={TextInput}\n                />\n              </DialogContent>\n              <FormActions\n                cancel={() => handleShowModal(false)}\n                reset={form.reset}\n                enterPress={handleSubmit}\n                submit={handleSubmit}\n                form={form}\n              />\n            </Dialog>\n          </form>\n        </>\n      )}\n    />\n  );\n}\n\nfunction PrevAndNextReceipts(props) {\n  const { length, currentReceiptIndex, nextReceipt, prevReceipt } = props;\n  return (\n    <>\n      <Tooltip title=\"Next matching message\" component=\"span\">\n        <IconButton\n          id=\"next-receipt-btn\"\n          color=\"inherit\"\n          size=\"small\"\n          onClick={nextReceipt}\n          disabled={\n            currentReceiptIndex === null || currentReceiptIndex >= length - 1\n          }\n        >\n          <ChevronRight />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Previous matching message\" component=\"span\">\n        <IconButton\n          id=\"prev-receipt-btn\"\n          color=\"inherit\"\n          size=\"small\"\n          onClick={prevReceipt}\n          disabled={\n            currentReceiptIndex === null ||\n            length < 1 ||\n            currentReceiptIndex < 1\n          }\n        >\n          <ChevronLeft />\n        </IconButton>\n      </Tooltip>\n    </>\n  );\n}\n\nexport function DocumentationButton(props) {\n  const { toggleDrawer, style, currentAdaptor, color, size } = props;\n\n  const installed = useSelector(state =>\n    selectAdaptorInstalled(state, currentAdaptor?.key)\n  );\n\n  const astAvailable = useSelector(state =>\n    selectAdaptorAstInstalled(\n      state,\n      currentAdaptor?.name,\n      currentAdaptor?.version\n    )\n  );\n\n  const fetchingHelpers = useSelector(selectAdaptorFetchingHelpers);\n\n  const title = astAvailable\n    ? 'See in-line documentation for this adaptor'\n    : `In-line documentation not found for language-${currentAdaptor?.name}@${currentAdaptor?.version}`;\n\n  return (\n    <>\n      {installed && (\n        <>\n          {astAvailable && (\n            <Tooltip title={title} component=\"span\">\n              <IconButton\n                onClick={() => toggleDrawer(true)}\n                color={color}\n                size={size}\n                style={style}\n              >\n                <BookIcon />\n              </IconButton>\n            </Tooltip>\n          )}\n          {!astAvailable && (\n            <Tooltip title={title} component=\"span\">\n              <Button\n                onClick={() => toggleDrawer(true)}\n                size={size}\n                color=\"primary\"\n                endIcon={\n                  <ExitCodeIcon exitCode={fetchingHelpers ? null : 99} />\n                }\n              />\n            </Tooltip>\n          )}\n        </>\n      )}\n    </>\n  );\n}\n\nfunction OptionButtons(props) {\n  const [anchorEl, setAnchorEl] = useState(null);\n\n  const {\n    themeOptions,\n    handleThemeChange,\n    toggleDrawer,\n    theme,\n    currentAdaptor,\n  } = props;\n\n  const handleClick = event => {\n    setAnchorEl(event ? event.currentTarget : null);\n  };\n\n  const handleClose = () => {\n    setAnchorEl(null);\n  };\n\n  return (\n    <>\n      <Tooltip title=\"Color Palette\">\n        <IconButton\n          color=\"inherit\"\n          size=\"small\"\n          aria-controls=\"simple-menu\"\n          onClick={handleClick}\n        >\n          <PaletteIcon />\n        </IconButton>\n      </Tooltip>\n      <Menu\n        id=\"simple-menu\"\n        anchorEl={anchorEl}\n        keepMounted\n        open={!!anchorEl}\n        onClose={handleClose}\n      >\n        {themeOptions.map(x => (\n          <MenuItem\n            button\n            key={x.id}\n            disabled={x.value === theme}\n            onClick={() => {\n              handleClose();\n              return handleThemeChange(x.value);\n            }}\n          >\n            {x.text}\n          </MenuItem>\n        ))}\n      </Menu>\n      <DocumentationButton\n        style={{ marginRight: 5 }}\n        color=\"inherit\"\n        size=\"small\"\n        toggleDrawer={toggleDrawer}\n        currentAdaptor={currentAdaptor}\n      />\n    </>\n  );\n}\n\nconst Copiable = ({ operation, content, textToCopy }) => {\n  const dispatch = useDispatch();\n\n  return (\n    <Tooltip\n      title={operation?.docs?.description || 'Copy example to clipboard'}\n    >\n      <CopyToClipboard\n        text={textToCopy}\n        onCopy={() =>\n          dispatch(Notification.add('Copied to clipboard.', 'success'))\n        }\n      >\n        {content}\n      </CopyToClipboard>\n    </Tooltip>\n  );\n};\n\nconst SimpleHelperButton = ({ operation, example }) => {\n  const content = (\n    <Button size=\"small\" color=\"primary\">\n      {operation.name}\n    </Button>\n  );\n\n  return (\n    <Copiable\n      operation={operation}\n      content={content}\n      textToCopy={example.description}\n    />\n  );\n};\n\nconst DropDownHelperButton = ({ operation, id, examples }) => {\n  const [anchorEl, setAnchorEl] = useState(null);\n  const open = Boolean(anchorEl);\n\n  const handleClick = event => {\n    setAnchorEl(event.currentTarget);\n  };\n\n  const handleClose = () => {\n    setAnchorEl(null);\n  };\n\n  const menuItems = examples.map((example, i) => {\n    const content = (\n      <MenuItem key={example.caption} onClick={handleClose} dense>\n        {operation.name} {example.caption}\n      </MenuItem>\n    );\n    return (\n      <Copiable content={content} textToCopy={example.description} key={i} />\n    );\n  });\n\n  return (\n    <>\n      <Tooltip title={operation.docs.description} key={operation.name}>\n        <Button\n          id={`menu-button-${id}`}\n          aria-owns={open ? `fade-menu-${id}` : null}\n          aria-controls={`fade-menu-${id}`}\n          aria-haspopup=\"true\"\n          onClick={handleClick}\n          size=\"small\"\n          color=\"primary\"\n        >\n          {operation.name}\n        </Button>\n      </Tooltip>\n      <Menu\n        id={`fade-menu-${id}`}\n        anchorEl={anchorEl}\n        open={open}\n        onClose={handleClose}\n      >\n        {menuItems}\n      </Menu>\n    </>\n  );\n};\n\nfunction HelperButtons({ helpers }) {\n  const operations = helpers?.operations;\n  if (helpers && operations) {\n    return operations.map((operation, index) => {\n      const docs = operation.docs || null;\n      const examples = docs\n        ? docs.tags.filter(i => i.title === 'example')\n        : 'none';\n      return examples.length > 1 ? (\n        <DropDownHelperButton\n          key={index}\n          operation={operation}\n          index={index}\n          examples={examples}\n        />\n      ) : (\n        <SimpleHelperButton\n          key={index}\n          operation={operation}\n          example={examples[0]}\n        />\n      );\n    });\n  }\n  return null;\n}\n\nfunction FormActionsConfiguration(props) {\n  const {\n    fullScreen,\n    toggleScreenMode,\n    initialValues,\n    handleCancel,\n    form,\n    handleSubmit,\n    customPristine,\n    ToolTipScreenMode,\n  } = props;\n\n  return (\n    <FormActions\n      mini\n      cancel={handleCancel(initialValues)}\n      reset={form.reset}\n      submit={handleSubmit}\n      pristine={customPristine}\n      form={form}\n    >\n      <Tooltip title={ToolTipScreenMode} component=\"span\">\n        <IconButton onClick={toggleScreenMode} id=\"toggle-fullscreen-btn\">\n          {fullScreen ? <FullscreenExitIcon /> : <FullscreenIcon />}\n        </IconButton>\n      </Tooltip>\n    </FormActions>\n  );\n}\n\nfunction StudioHeader(props) {\n  const {\n    classes,\n    selectedProject,\n    triggerOptions,\n    credentialOptions,\n    adaptorOptions,\n    fullScreen,\n    toggleScreenMode,\n    initialValues,\n    handleCancel,\n    form,\n    handleSubmit,\n    customPristine,\n    ToolTipScreenMode,\n    handleAdaptorChange,\n  } = props;\n\n  return (\n    <div>\n      <AppBar color=\"inherit\" position=\"static\" elevation={0}>\n        <Grid\n          container\n          className={classes.menu}\n          spacing={1}\n          alignItems=\"center\"\n        >\n          <Field\n            id=\"name\"\n            name=\"name\"\n            label=\"Name\"\n            hoverError\n            component={StudioInput}\n          />\n          <FieldWithBlank\n            hidden={!selectedProject.projectRepoConnectionId}\n            name=\"pathInExternalRepo\"\n            label=\"Filepath\"\n            hoverError\n            component={StudioInput}\n          />\n          <Field\n            name=\"triggerId\"\n            label=\"Trigger\"\n            options={triggerOptions}\n            type=\"select\"\n            hoverError\n            component={StudioInput}\n          />\n          <Field\n            name=\"credentialId\"\n            label=\"Credential\"\n            options={credentialOptions}\n            placeholder=\"None\"\n            type=\"select\"\n            hoverError\n            component={StudioInput}\n          />\n          <Field\n            name=\"adaptor\"\n            label=\"Adaptor\"\n            placeholder=\"Select one...\"\n            options={adaptorOptions}\n            type=\"select\"\n            hoverError\n            component={StudioInput}\n            allowAny\n            onChange={e =>\n              handleAdaptorChange(e.target.value, 'highestKnown', form)\n            }\n          />\n          <span className={classes.flex} />\n          <FormActionsConfiguration\n            fullScreen={fullScreen}\n            toggleScreenMode={toggleScreenMode}\n            initialValues={initialValues}\n            handleCancel={handleCancel}\n            form={form}\n            handleSubmit={handleSubmit}\n            customPristine={customPristine}\n            ToolTipScreenMode={ToolTipScreenMode}\n          />\n        </Grid>\n      </AppBar>\n    </div>\n  );\n}\n\nfunction Wrapper({\n  fullScreen,\n  toggleScreenMode,\n  classes,\n  theme,\n  children,\n  ...otherProps\n}) {\n  if (fullScreen)\n    return (\n      <div\n        id=\"studio-container\"\n        className={clsx(\n          classes.flexContainer,\n          classes.editor,\n          classes.bigEditor\n        )}\n      >\n        <StudioHeader\n          fullScreen={fullScreen}\n          toggleScreenMode={toggleScreenMode}\n          classes={classes}\n          {...otherProps}\n        />\n        {children}\n      </div>\n    );\n\n  return (\n    <OneCardHolder wide>\n      <Card id=\"wizard-container\">\n        <WizardHeader\n          fullScreen={fullScreen}\n          toggleScreenMode={toggleScreenMode}\n          classes={classes}\n          {...otherProps}\n        />\n        <CardContent>\n          <Wizard\n            fullScreen={fullScreen}\n            theme={theme}\n            toggleScreenMode={toggleScreenMode}\n            classes={classes}\n            {...otherProps}\n          />\n        </CardContent>\n      </Card>\n      <div\n        className={clsx(\n          classes.flexContainer,\n          classes.editor,\n          classes.smallEditor\n        )}\n      >\n        {children}\n      </div>\n    </OneCardHolder>\n  );\n}\n\nfunction WizardHeader(props) {\n  const {\n    initialValues,\n    fullScreen,\n    toggleScreenMode,\n    handleCancel,\n    customPristine,\n    ToolTipScreenMode,\n    form,\n    handleSubmit,\n  } = props;\n\n  return (\n    <CardHeader\n      avatar={\n        <Avatar>\n          <SettingsEthernetIcon />\n        </Avatar>\n      }\n      title={initialValues.name ? initialValues.name : 'untitled'}\n      subheader={\n        initialValues.autoprocess ? 'Autprocess: On!' : 'Autoprocess: Off.'\n      }\n      action={\n        <FormActionsConfiguration\n          fullScreen={fullScreen}\n          toggleScreenMode={toggleScreenMode}\n          initialValues={initialValues}\n          handleCancel={handleCancel}\n          form={form}\n          handleSubmit={handleSubmit}\n          customPristine={customPristine}\n          ToolTipScreenMode={ToolTipScreenMode}\n        />\n      }\n    />\n  );\n}\n\nexport function TriggerDialog(props) {\n  const { show, modalClass, onHide, selectedProject, formOnChange } = props;\n  return (\n    <>\n      <Dialog open={show} onClose={onHide} data-testid=\"trigger-dialog\">\n        <NewTriggerView\n          dialog={{\n            show,\n            onHide,\n          }}\n          fromWizard\n          onCancel={onHide}\n          onSubmitComplete={(fieldName, triggerId) => {\n            onHide();\n            formOnChange(fieldName, triggerId);\n          }}\n          selectedProject={selectedProject}\n          className={modalClass}\n        />\n      </Dialog>\n    </>\n  );\n}\n\nfunction Wizard({\n  fullScreen,\n  toggleScreenMode,\n  form,\n  ToolTipScreenMode,\n  id,\n  triggerOptions,\n  classes,\n  selectedProject,\n  showTriggerModal,\n  loadSampleReceipts,\n  toggleDrawer,\n  handleThemeChange,\n  theme,\n  trigger,\n  hideTriggerModal,\n  credentialOptions,\n  triggerShow,\n  adaptorOptions,\n  versionOptions,\n  activeStep,\n  setActiveStep,\n  handleResize,\n  currentAdaptor,\n  handleAdaptorChange,\n}) {\n  const [anchorEl, setAnchorEl] = useState(null);\n\n  const handleClick = event => {\n    setAnchorEl(event ? event.currentTarget : null);\n  };\n\n  const handleClose = () => {\n    setAnchorEl(null);\n  };\n\n  const { errors, submitErrors, touched, dirtyFields, values } =\n    form.getState();\n  return (\n    <>\n      <div>\n        <Typography variant=\"h6\">Configuration</Typography>\n        <Stepper\n          nonLinear\n          orientation=\"vertical\"\n          activeStep={activeStep}\n          id=\"job-wizard-stepper\"\n        >\n          <Step key={1}>\n            <StepButton id=\"step-1\" onClick={() => setActiveStep(0)}>\n              <StepLabel\n                error={\n                  (id &&\n                    (errors.name ||\n                      errors.pathInExternalRepo ||\n                      (submitErrors?.name &&\n                        !touched?.name &&\n                        !dirtyFields?.name &&\n                        submitErrors?.name.value === values.name) ||\n                      (submitErrors?.pathInExternalRepo &&\n                        !touched?.pathInExternalRepo &&\n                        !dirtyFields?.pathInExternalRepo &&\n                        submitErrors?.pathInExternalRepo.value ===\n                          values.pathInExternalRepo))) ||\n                  (!id &&\n                    ((submitErrors?.name &&\n                      !touched?.name &&\n                      !dirtyFields?.name &&\n                      submitErrors?.name.value === values.name) ||\n                      (submitErrors?.pathInExternalRepo &&\n                        !touched?.pathInExternalRepo &&\n                        !dirtyFields?.pathInExternalRepo &&\n                        submitErrors?.pathInExternalRepo.value ===\n                          values.pathInExternalRepo)))\n                }\n              >\n                Give the job a name.\n              </StepLabel>\n            </StepButton>\n            <StepContent>\n              <Field\n                id=\"name\"\n                name=\"name\"\n                type=\"text\"\n                label=\"Name\"\n                component={TextInput}\n              />\n              <br />\n              <Tooltip\n                title=\"WARNING: When a GitHub filepath is specified, the\n    content and history of that file will completely overwrite\n    what is currently saved in OpenFn. Check your jobs into GitHub\n    version control BEFORE activating the version control sync.\"\n                component=\"span\"\n              >\n                <FieldWithBlank\n                  hidden={!selectedProject.projectRepoConnectionId}\n                  name=\"pathInExternalRepo\"\n                  type=\"text\"\n                  label=\"Filepath in repo\"\n                  component={TextInput}\n                />\n              </Tooltip>\n            </StepContent>\n          </Step>\n          <Step key={2}>\n            <StepButton id=\"step-2\" onClick={() => setActiveStep(1)}>\n              <StepLabel\n                error={\n                  (id &&\n                    (errors.triggerId ||\n                      (submitErrors?.triggerId &&\n                        !touched?.triggerId &&\n                        !dirtyFields?.triggerId &&\n                        submitErrors?.triggerId.value === values.triggerId))) ||\n                  (!id &&\n                    submitErrors?.triggerId &&\n                    !touched?.triggerId &&\n                    !dirtyFields?.triggerId &&\n                    submitErrors?.triggerId.value === values.triggerId)\n                }\n              >\n                Define what triggers its execution.\n              </StepLabel>\n            </StepButton>\n            <StepContent>\n              <Field\n                name=\"triggerId\"\n                label=\"Trigger\"\n                options={triggerOptions}\n                component={SelectInput}\n              />\n              <Button\n                className={classes.newButton}\n                id=\"trigger_modal\"\n                name=\"create_new_trigger\"\n                onClick={showTriggerModal}\n              >\n                Create New&nbsp;&nbsp;\n                <FlashOnIcon />\n              </Button>\n              <TriggerDialog\n                show={triggerShow}\n                onHide={hideTriggerModal}\n                selectedProject={selectedProject}\n                modalClass={classes.editModal}\n                formOnChange={form.change}\n              />\n            </StepContent>\n          </Step>\n          <Step key={3}>\n            <StepButton id=\"step-3\" onClick={() => setActiveStep(2)}>\n              <StepLabel\n                error={\n                  (id &&\n                    (errors.adaptor ||\n                      errors.adaptorVersion ||\n                      (submitErrors?.adaptor &&\n                        !touched?.adaptor &&\n                        !dirtyFields?.adaptor &&\n                        submitErrors?.adaptor.value === values.adaptor) ||\n                      (submitErrors?.adaptorVersion &&\n                        !touched?.adaptorVersion &&\n                        !dirtyFields?.adaptorVersion &&\n                        submitErrors?.adaptorVersion.value ===\n                          values.adaptorVersion))) ||\n                  (!id &&\n                    ((submitErrors?.adaptor &&\n                      !touched?.adaptor &&\n                      !dirtyFields?.adaptor &&\n                      submitErrors?.adaptor.value === values.adaptor) ||\n                      (submitErrors?.adaptorVersion &&\n                        !touched?.adaptorVersion &&\n                        !dirtyFields?.adaptorVersion &&\n                        submitErrors?.adaptorVersion.value ===\n                          values.adaptorVersion)))\n                }\n              >\n                Select an API adaptor.\n              </StepLabel>\n            </StepButton>\n            <StepContent>\n              <Field\n                name=\"adaptor\"\n                label=\"Adaptor\"\n                placeholder=\"Select one...\"\n                options={adaptorOptions}\n                component={SelectInput}\n                allowAny\n                onChange={e =>\n                  handleAdaptorChange(e.target.value, 'highestKnown', form)\n                }\n              />\n              &nbsp;&nbsp;\n              <FieldWithBlank\n                name=\"adaptorVersion\"\n                label=\"Version\"\n                options={versionOptions(values.adaptor)}\n                showEmpty\n                allowEmpty\n                placeholder=\"latest (auto-update)\"\n                component={SelectInput}\n                allowAny\n              />\n            </StepContent>\n          </Step>\n          <Step key={4}>\n            <StepButton\n              id=\"step-4\"\n              onClick={() => {\n                setActiveStep(3);\n              }}\n            >\n              <StepLabel\n                error={\n                  (id &&\n                    (errors.credentialId ||\n                      (submitErrors?.credentialId &&\n                        !touched?.credentialId &&\n                        !dirtyFields?.credentialId &&\n                        submitErrors?.credentialId.value ===\n                          values.credentialId))) ||\n                  (!id &&\n                    submitErrors?.credentialId &&\n                    !touched?.credentialId &&\n                    !dirtyFields?.credentialId &&\n                    submitErrors?.credentialId.value === values.credentialId)\n                }\n              >\n                Provide authentication details. (optional)\n              </StepLabel>\n            </StepButton>\n            <StepContent>\n              <Field\n                name=\"credentialId\"\n                label=\"Credential\"\n                options={credentialOptions}\n                placeholder=\"None\"\n                allowEmpty\n                showEmpty\n                component={SelectInput}\n              />\n            </StepContent>\n          </Step>\n        </Stepper>\n        <Grid container alignItems=\"center\">\n          <Typography variant=\"h6\">\n            Expression&nbsp;\n            <Tooltip title=\"This is your integration script. Operations (functions) in your job expression will be executed in order, each taking state and returning state.\">\n              <HelpIcon fontSize=\"inherit\" />\n            </Tooltip>\n          </Typography>\n          <span className={classes.flex} />\n          <DocumentationButton\n            toggleDrawer={toggleDrawer}\n            currentAdaptor={currentAdaptor}\n          />\n          <GetSampleReceiptsButton\n            onLightBg\n            disabled={trigger?.type !== 'message'}\n            fullScreen={fullScreen}\n            onClick={() => {\n              loadSampleReceipts();\n              handleResize();\n            }}\n          />\n\n          <Tooltip title={ToolTipScreenMode} component=\"span\">\n            <IconButton onClick={toggleScreenMode}>\n              {fullScreen ? <FullscreenExitIcon /> : <FullscreenIcon />}\n            </IconButton>\n          </Tooltip>\n          <IconPicker\n            hint=\"Color Palette\"\n            icon={<PaletteIcon />}\n            anchorEl={anchorEl}\n            onClose={handleClose}\n            action={handleThemeChange}\n            options={themeOptions}\n            currentOption={theme}\n            handleClick={handleClick}\n          />\n        </Grid>\n      </div>\n    </>\n  );\n}\n\nfunction IDE(props) {\n  const codeEditor = useRef();\n  const receiptViewer = useRef();\n  const logViewer = useRef();\n\n  const {\n    classes,\n    currentReceiptIndex,\n    handleThemeChange,\n    nextReceipt,\n    prevReceipt,\n    selectedReceipt,\n    toggleDrawer,\n    trigger,\n    history,\n    user,\n    selectedProject,\n    helpers,\n    receipts,\n    form,\n    handleSubmit,\n    loadSampleReceipts,\n    id,\n    initialValues,\n    handleCancel,\n    customPristine,\n    triggerOptions,\n    credentialOptions,\n    adaptorOptions,\n    handleCreateRun,\n    versionOptions,\n    handleAdaptorChange,\n  } = props;\n\n  const [fullScreen, setFullScreen] = useState(\n    id ? user.editorStyle === 'ide' : false\n  );\n\n  const projectId = selectedProject.id;\n\n  const {\n    values,\n    submitErrors,\n    dirtySinceLastSubmit,\n    hasValidationErrors,\n    hasSubmitErrors,\n  } = form.getState();\n\n  const [state, setState] = useState({\n    pathToNode: '',\n    activeStep: 0,\n    showAdaptorModal: false,\n    triggerShow: false,\n  });\n\n  const dispatch = useDispatch();\n\n  const searchParams = new URLSearchParams(history.location.search);\n\n  const runId = searchParams.get('runId');\n\n  const run = useSelector(state => state.runs.items[runId] || {}, isEqual);\n\n  const runsLoading = useSelector(state => state.runs.isLoading);\n\n  const { exitCode } = run;\n\n  const toggleScreenMode = () => {\n    dispatch(\n      updateUser({\n        ...user,\n        editorStyle: fullScreen ? 'wizard' : 'ide',\n      })\n    );\n    setFullScreen(!fullScreen);\n  };\n\n  const ToolTipScreenMode = !fullScreen\n    ? 'Enter full-screen job studio mode.'\n    : 'Exit full-screen job studio mode.';\n\n  const { adaptor, adaptorVersion } = React.useMemo(() => values, [form]);\n\n  const currentAdaptor = React.useMemo(() => {\n    const maxVersion = versionOptions(adaptor)[0]?.value;\n\n    if (adaptorVersion) {\n      return {\n        key: `${adaptor}-${adaptorVersion}`,\n        name: adaptor,\n        version: adaptorVersion,\n      };\n    } else if (!adaptorVersion && !maxVersion) {\n      return;\n    } else {\n      return {\n        key: `${adaptor}-${maxVersion}`,\n        name: adaptor,\n        version: maxVersion,\n      };\n    }\n  }, [adaptor, adaptorVersion, versionOptions]);\n\n  const installingCurrentAdaptor = useSelector(state =>\n    selectInstallingAdaptor(state, currentAdaptor?.key)\n  );\n\n  const currentAdaptorInstallMessage = useSelector(state =>\n    selectInstallStatusMessage(state, currentAdaptor?.key)\n  );\n\n  const currentAdaptorInstallError = useSelector(state =>\n    selectAdaptorInstallError(state, currentAdaptor?.key)\n  );\n\n  const currentAdaptorInstalled = useSelector(state =>\n    selectAdaptorInstalled(state, currentAdaptor?.key)\n  );\n\n  const currentAdaptorRequested = useSelector(state =>\n    selectAdaptorRequested(state, currentAdaptor?.key)\n  );\n\n  const setTriggerShow = bool => {\n    setState(prevState => ({\n      ...prevState,\n      triggerShow: bool,\n    }));\n  };\n\n  const showTriggerModal = () => {\n    setTriggerShow(true);\n  };\n\n  const hideTriggerModal = () => {\n    setTriggerShow(false);\n  };\n\n  const setActiveStep = step =>\n    setState(prevState => ({\n      ...prevState,\n      activeStep: step,\n    }));\n\n  function handleReceiveLog({ str }) {\n    if (str) {\n      const editor = logViewer?.current?.editor;\n      editor && insertAceText(editor, str, null, true);\n    }\n  }\n\n  const handleShowAdaptorModal = bool => {\n    setState(prevState => ({\n      ...prevState,\n      showAdaptorModal: bool,\n    }));\n  };\n\n  function handleReceiveRun(payload) {\n    dispatch(receiveRun(payload));\n  }\n\n  function handleReceiveAdaptor(payload) {\n    dispatch(receiveAdaptor(payload));\n  }\n\n  function handleReceiveAdaptorError(payload) {\n    dispatch(receiveAdaptorError(payload));\n  }\n\n  const setGrowth = (component, domElement) => {\n    if (component.props.flex <= 0.1) domElement.style.flexGrow = 0;\n    if (component.props.flex >= 0.9) domElement.style.flexGrow = 1;\n    handleResize();\n  };\n\n  const handleResize = () => {\n    receiptViewer?.current?.editor?.resize();\n    codeEditor?.current?.editor?.resize();\n    logViewer?.current?.editor?.resize();\n  };\n\n  const handleCopyPathToClipBoard = clipboardValue => {\n    setState(prevState => ({\n      ...prevState,\n      pathToNode: clipboardValue,\n    }));\n    return clipboardValue;\n  };\n\n  const handleClearLogs = () => {\n    logViewer?.current?.editor?.setValue('');\n  };\n\n  useEffect(() => {\n    let cleanupFn;\n    if (projectId) {\n      cleanupFn = dispatch(\n        joinChannel(`runs:${projectId}`, {\n          new: handleReceiveRun,\n          updated: handleReceiveRun,\n        })\n      );\n    }\n    return () => (cleanupFn ? cleanupFn() : undefined);\n  }, [projectId, dispatch]);\n\n  useEffect(() => {\n    setTimeout(() => {\n      handleResize();\n    }, 1000);\n  }, [user.editorStyle]);\n\n  useEffect(() => {\n    if (runId) {\n      loadRun({ id: runId })(dispatch);\n\n      setTimeout(() => {\n        handleResize();\n      }, 1000);\n\n      dispatch(\n        joinChannel(`logs:${runId}`, {\n          new: handleReceiveLog,\n        })\n      );\n    }\n  }, [runId, dispatch]);\n\n  useEffect(() => {\n    const editor = codeEditor?.current?.editor;\n\n    if (editor && helpers) {\n      addGlobals(editor, helpers);\n    }\n  }, [helpers]);\n\n  useEffect(() => {\n    return dispatch(\n      joinChannel('adaptors', {\n        installed: handleReceiveAdaptor,\n        failed: handleReceiveAdaptorError,\n      })\n    );\n  }, []);\n\n  useEffect(() => {\n    if (currentAdaptor?.version) {\n      dispatch(adaptorRequested(currentAdaptor?.name, currentAdaptor?.version));\n      dispatch(installAdaptor(currentAdaptor?.name, currentAdaptor?.version));\n    }\n  }, [currentAdaptor?.version]);\n\n  useEffect(() => {\n    if (currentAdaptorInstalled === true) {\n      if (currentAdaptor?.version) {\n        dispatch(\n          getHelpers({\n            adaptor: currentAdaptor?.name,\n            version: currentAdaptor?.version,\n          })\n        );\n      }\n    }\n    return () => {\n      dispatch({ type: 'HELPERS_CLEARED' });\n    };\n  }, [\n    currentAdaptorInstalled,\n    currentAdaptor?.version,\n    currentAdaptor?.name,\n    dispatch,\n  ]);\n\n  return (\n    <Wrapper\n      fullScreen={fullScreen}\n      toggleScreenMode={toggleScreenMode}\n      initialValues={initialValues}\n      handleCancel={handleCancel}\n      customPristine={customPristine}\n      ToolTipScreenMode={ToolTipScreenMode}\n      form={form}\n      handleSubmit={handleSubmit}\n      id={id}\n      triggerOptions={triggerOptions}\n      classes={classes}\n      selectedProject={selectedProject}\n      showTriggerModal={showTriggerModal}\n      handleShowAdaptorModal={handleShowAdaptorModal}\n      showAdaptorModal={state.showAdaptorModal}\n      hideTriggerModal={hideTriggerModal}\n      credentialOptions={credentialOptions}\n      triggerShow={state.triggerShow}\n      adaptorOptions={adaptorOptions}\n      versionOptions={versionOptions}\n      currentReceiptIndex={currentReceiptIndex}\n      trigger={trigger}\n      loadSampleReceipts={loadSampleReceipts}\n      toggleDrawer={toggleDrawer}\n      handleThemeChange={handleThemeChange}\n      theme={user.theme}\n      activeStep={state.activeStep}\n      setActiveStep={setActiveStep}\n      handleResize={handleResize}\n      currentAdaptor={currentAdaptor}\n      handleAdaptorChange={handleAdaptorChange}\n    >\n      <ReflexContainer orientation=\"horizontal\">\n        <ReflexElement\n          onStopResize={({ component, domElement }) =>\n            setGrowth(component, domElement)\n          }\n        >\n          <ReflexContainer orientation=\"vertical\">\n            <ReflexSplitter\n              className={classes.splitter}\n              style={{ cursor: 'initial' }}\n            >\n              <Typography className={classes.splitterTitle}>\n                Initial State\n                {selectedReceipt.id && (\n                  <span className={classes.primaryBlue}>\n                    &nbsp;&nbsp;({humanReadable(selectedReceipt.id)}.json)\n                  </span>\n                )}\n              </Typography>\n            </ReflexSplitter>\n            <ReflexElement\n              flex={fullScreen ? 0.25 : 0}\n              onStopResize={({ component, domElement }) =>\n                setGrowth(component, domElement)\n              }\n              name=\"leftPane\"\n            >\n              <Grid\n                container\n                direction=\"column\"\n                className={classes.paneContainer}\n              >\n                <Grid\n                  item\n                  className={classes.flex}\n                  container\n                  direction=\"column\"\n                >\n                  <Grid\n                    item\n                    className={classes.editorTitle}\n                    container\n                    direction=\"row-reverse\"\n                    justifyContent=\"flex-start\"\n                    alignItems=\"center\"\n                    style={{\n                      flexWrap: 'nowrap',\n                    }}\n                  >\n                    <PrevAndNextReceipts\n                      length={receipts.length}\n                      currentReceiptIndex={currentReceiptIndex}\n                      nextReceipt={nextReceipt}\n                      prevReceipt={prevReceipt}\n                    />\n                    <GetSampleReceiptsButton\n                      disabled={trigger?.type !== 'message'}\n                      onClick={() => {\n                        loadSampleReceipts();\n                        handleResize();\n                      }}\n                    />\n                    <span className={classes.flex} />\n                    <Tooltip title=\"Browse and copy paths to variables from this sample message.\">\n                      <Autocomplete\n                        autoComplete\n                        autoHighlight\n                        clearOnBlur\n                        clearOnEscape\n                        options={createOptions(\n                          jsonKeyPathList(selectedReceipt?.body, {\n                            nodeType: 'all',\n                            keyPathType: 'array',\n                          })\n                        )}\n                        groupBy={options => options.group}\n                        filterOptions={(options, state) =>\n                          options.filter(o => {\n                            const { title, extra } = o;\n                            const { inputValue } = state;\n                            return (\n                              title\n                                .toLowerCase()\n                                .includes(inputValue.toLowerCase()) ||\n                              extra\n                                .toLowerCase()\n                                .includes(inputValue.toLowerCase())\n                            );\n                          })\n                        }\n                        className={classes.autoComplete}\n                        getOptionLabel={option => option.title}\n                        renderOption={option => (\n                          <>\n                            {option.title}\n                            <span className={classes.optionExtra}>\n                              {option.extra}\n                            </span>\n                          </>\n                        )}\n                        onChange={(e, option) => {\n                          if (option)\n                            if (e.type === 'click' || e.type === 'keydown') {\n                              navigator.clipboard.writeText(option.value);\n                              dispatch(\n                                Notification.add(\n                                  `Copied \"${option.value}\" to clipboard.`,\n                                  'success'\n                                )\n                              );\n                            }\n                        }}\n                        id=\"state-search\"\n                        noOptionsText=\"Key not found in this sample state\"\n                        classes={{\n                          root: classes.picker,\n                          endAdornment: classes.pickerAdornment,\n                        }}\n                        size=\"small\"\n                        renderInput={params => (\n                          <TextField\n                            {...params}\n                            margin=\"normal\"\n                            placeholder=\"Use state variable\"\n                            InputProps={{\n                              disableUnderline: true,\n                              ...params.InputProps,\n                            }}\n                            className={classes.pickerTextField}\n                          />\n                        )}\n                      />\n                    </Tooltip>\n                  </Grid>\n                  <Grid item container className={classes.flex}>\n                    <AceEditor\n                      ref={receiptViewer}\n                      name=\"state-editor\"\n                      mode=\"json\"\n                      theme={user.theme}\n                      value={JSON.stringify(\n                        stateFromReceipt(\n                          selectedReceipt,\n                          credentialOptions.find(\n                            o => o.id === values?.credentialId\n                          )\n                        ),\n                        null,\n                        2\n                      )}\n                      style={{ display: 'flex' }}\n                      width=\"100%\"\n                      height=\"\"\n                      showPrintMargin={false}\n                      readOnly\n                    />\n                  </Grid>\n                </Grid>\n              </Grid>\n            </ReflexElement>\n            <ReflexSplitter propagate={true} className={classes.splitter}>\n              <Typography className={classes.splitterTitle}>\n                Expression\n                {values.pathInExternalRepo && (\n                  <span className={classes.primaryBlue}>\n                    &nbsp;&nbsp;({values.pathInExternalRepo})\n                  </span>\n                )}\n              </Typography>\n            </ReflexSplitter>\n            <ReflexElement\n              onStopResize={({ component, domElement }) =>\n                setGrowth(component, domElement)\n              }\n              flex={fullScreen ? 0.75 : 1}\n              name=\"rightPane\"\n            >\n              <Grid\n                container\n                direction=\"column\"\n                className={classes.paneContainer}\n              >\n                <Grid\n                  item\n                  className={classes.flex}\n                  container\n                  direction=\"column\"\n                >\n                  <Grid\n                    item\n                    className={classes.editorTitle}\n                    container\n                    direction=\"row-reverse\"\n                    justifyContent=\"flex-start\"\n                    alignItems=\"center\"\n                  >\n                    {fullScreen && (\n                      <OptionButtons\n                        themeOptions={themeOptions}\n                        handleThemeChange={handleThemeChange}\n                        toggleDrawer={toggleDrawer}\n                        theme={user.theme}\n                        currentAdaptor={currentAdaptor}\n                      />\n                    )}\n                    <HelperButtons helpers={helpers} />\n                    <span className={classes.flex} />\n                    <span className={classes.flex}>\n                      language-{values.adaptor}@\n                      <FieldWithBlank\n                        name=\"adaptorVersion\"\n                        label=\"Version\"\n                        options={versionOptions(values.adaptor)}\n                        placeholder=\"latest\"\n                        type=\"select\"\n                        inline\n                        component={StudioInput}\n                        allowAny\n                      />\n                      <Tooltip title=\"Select unreleased adaptor\">\n                        <IconButton\n                          size=\"small\"\n                          color=\"primary\"\n                          onClick={() => {\n                            handleShowAdaptorModal(true);\n                          }}\n                        >\n                          <CloudQueue fontSize=\"small\" />\n                        </IconButton>\n                      </Tooltip>\n                      {installingCurrentAdaptor && (\n                        <Tooltip title={currentAdaptorInstallMessage}>\n                          <span>\n                            <ExitCodeIcon exitCode={null} circleSize={12} />\n                          </span>\n                        </Tooltip>\n                      )}\n                      {currentAdaptorInstallError && (\n                        <Tooltip title={currentAdaptorInstallMessage}>\n                          <span>\n                            <ExitCodeIcon exitCode={1} fontSize=\"inherit\" />\n                          </span>\n                        </Tooltip>\n                      )}\n                      {currentAdaptorInstalled && (\n                        <Tooltip title={currentAdaptorInstallMessage}>\n                          <span>\n                            <ExitCodeIcon exitCode={0} fontSize=\"inherit\" />\n                          </span>\n                        </Tooltip>\n                      )}\n                      <AdaptorModal\n                        showModal={state.showAdaptorModal}\n                        handleShowModal={handleShowAdaptorModal}\n                        form={form}\n                        values={values}\n                        handleAdaptorChange={handleAdaptorChange}\n                      />\n                    </span>\n                  </Grid>\n                  <Field name=\"expression\" className={classes.flex}>\n                    {({ input, meta: { error, submitError } }) => (\n                      <Grid item container className={classes.flex}>\n                        {error && (\n                          <Paper elevation={2} className={classes.error}>\n                            <Typography variant=\"body1\">\n                              <ErrorIcon fontSize=\"inherit\" /> {error}\n                            </Typography>\n                          </Paper>\n                        )}\n                        {(submitError ||\n                          (submitErrors?.otherError &&\n                            !dirtySinceLastSubmit)) && (\n                          <Paper elevation={2} className={classes.error}>\n                            <Typography variant=\"body1\">\n                              <ErrorIcon fontSize=\"inherit\" />{' '}\n                              {[].concat(submitError?.message)?.join(';') ||\n                                submitErrors?.otherError}\n                            </Typography>\n                          </Paper>\n                        )}\n                        <AceEditor\n                          ref={codeEditor}\n                          name=\"expression-editor\"\n                          mode=\"javascript\"\n                          theme={user.theme}\n                          width=\"100%\"\n                          height=\"\"\n                          style={{ display: 'flex' }}\n                          tabSize={2}\n                          editorProps={{ $blockScrolling: Infinity }}\n                          value={input.value}\n                          onChange={input.onChange}\n                          onLoad={editor => {\n                            setupEditor(editor);\n\n                            if (helpers) {\n                              addGlobals(editor, helpers);\n                            }\n                          }}\n                          setOptions={{\n                            enableBasicAutocompletion: false,\n                            enableLiveAutocompletion: true,\n                            enableSnippets: true,\n                          }}\n                        />\n                      </Grid>\n                    )}\n                  </Field>\n                </Grid>\n              </Grid>\n            </ReflexElement>\n          </ReflexContainer>\n        </ReflexElement>\n        <ReflexSplitter\n          className={classes.splitterBottom}\n          style={{\n            background: '#18202c',\n            border: '1px solid #18202c',\n          }}\n        >\n          <Grid\n            className={classes.editorTitle}\n            container\n            justifyContent=\"flex-start\"\n            alignItems=\"center\"\n            style={{\n              flexWrap: 'nowrap',\n            }}\n          >\n            <span\n              style={{ fontFamily: 'Roboto', marginRight: '2em', fontSize: 12 }}\n            >\n              Run Logs\n            </span>\n            <Tooltip\n              title=\"Save this job and run it with the sample message above.\"\n              component=\"span\"\n            >\n              <Button\n                color=\"primary\"\n                size=\"small\"\n                classes={{ disabled: classes.disabledButton }}\n                disabled={\n                  hasValidationErrors ||\n                  (hasSubmitErrors && !allowSaveForSubmitError(form)) ||\n                  Object.keys(selectedReceipt).length <= 0 ||\n                  runsLoading ||\n                  !currentAdaptorInstalled\n                }\n                onClick={() => {\n                  if (customPristine === true) {\n                    handleCreateRun();\n                  } else {\n                    form.change('saveAndRun', true);\n                    handleSubmit();\n                  }\n                }}\n                endIcon={<SlowMotionVideoIcon />}\n              >\n                Save & Run\n              </Button>\n            </Tooltip>\n            <span className={classes.flex} />\n            {runId && (\n              <Button\n                size=\"small\"\n                color=\"primary\"\n                disabled={!runId}\n                onClick={linkTo(\n                  runShowPath(selectedProject, { id: runId }),\n                  history\n                )}\n                endIcon={<ExitCodeIcon exitCode={exitCode} />}\n              >\n                {runId || 'n/a'}\n              </Button>\n            )}\n            &nbsp;\n            <Button\n              size=\"small\"\n              color=\"primary\"\n              onClick={() => handleClearLogs()}\n              endIcon={<ClearAll />}\n            >\n              Clear Logs\n            </Button>\n          </Grid>\n        </ReflexSplitter>\n        <ReflexElement\n          className=\"bottom-pane\"\n          flex={0.15}\n          onStopResize={({ component, domElement }) => {\n            setGrowth(component, domElement);\n          }}\n        >\n          <Grid container direction=\"column\" className={classes.paneContainer}>\n            <Grid item container className={classes.flex}>\n              <AceEditor\n                ref={logViewer}\n                theme={user.theme}\n                mode=\"text\"\n                width=\"100%\"\n                height=\"\"\n                style={{ display: 'flex' }}\n                editorProps={{ $blockScrolling: Infinity }}\n                showPrintMargin={false}\n                name=\"output\"\n                wrapEnabled\n                readOnly\n              />\n            </Grid>\n          </Grid>\n        </ReflexElement>\n      </ReflexContainer>\n    </Wrapper>\n  );\n}\n\nexport default withStyles(styles, {\n  withTheme: true,\n  name: 'App',\n})(IDE);\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Form } from 'react-final-form';\nimport { OnChange } from 'react-final-form-listeners';\nimport PropTypes from 'prop-types';\nimport KeyBinding from 'react-keybinding-component';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { isEqual } from 'lodash';\nimport { fetchCredentials } from '../../actions/CredentialActions';\nimport {\n  createJob,\n  dismissJobError,\n  fetchJobById,\n  getAdaptors,\n  updateJob,\n} from '../../actions/JobActions';\nimport { switchedMenu } from '../../actions/MenuActions';\nimport { loadBodies } from '../../actions/ReceiptActions';\nimport { createRun } from '../../actions/RunActions';\nimport { fetchTriggers } from '../../actions/TriggerActions';\nimport { updateUser } from '../../actions/UserActions';\nimport {\n  createFormErrors,\n  equalOrFalsy,\n  formSaveKeys,\n  linkTo,\n} from '../../helpers';\nimport {\n  projectJobPath,\n  projectJobsPath,\n  projectSaveAndRunJobPath,\n} from '../../helpers/pathHelpers';\nimport {\n  selectAdaptors,\n  selectCredentials,\n  selectCurrentUser,\n  selectHelpers,\n  selectJob,\n  selectJobError,\n  selectReceipts,\n  selectTriggers,\n} from '../../selectors/index';\nimport DocumentationDrawer from './DocumentationDrawer';\nimport IDE from './IDE';\nimport { UnprocessableEntity } from '../../errors';\nimport 'react-reflex/styles.css';\n\nfunction JobEdit({ selectedProject }) {\n  const [currentReceiptIndex, setCurrentReceiptIndex] = useState(null);\n  const [drawerOpen, setDrawerOpen] = useState(false);\n  const [error, setError] = useState(null);\n\n  const history = useHistory();\n  const dispatch = useDispatch();\n  const { id } = useParams();\n  const projectId = selectedProject.id;\n\n  const user = useSelector(selectCurrentUser, isEqual);\n  const jobError = useSelector(selectJobError, isEqual);\n  const helpers = useSelector(selectHelpers, isEqual);\n  const allCredentials = useSelector(selectCredentials, isEqual);\n  const credentials = useMemo(\n    () => Object.values(allCredentials),\n    [allCredentials]\n  );\n  const triggers = useSelector(selectTriggers, isEqual);\n  const adaptors = useSelector(selectAdaptors, isEqual);\n  const receipts = useSelector(selectReceipts, isEqual);\n  const job = useSelector(state => selectJob(state, id), isEqual);\n\n  const initialValues = job || {\n    expression: '// Your job goes here.',\n    projectId,\n  };\n\n  const triggerOptions = useMemo(\n    () =>\n      Object.values(triggers)\n        .map(t => ({ id: t.id, value: t.id, text: t.name }))\n        .sort(),\n    [triggers]\n  );\n\n  const [selectedTriggerId, selectTriggerId] = useState(job?.triggerId);\n\n  const selectedTrigger = useMemo(() => {\n    return triggers[selectedTriggerId];\n  }, [selectedTriggerId, triggers]);\n\n  const selectedReceipt = useMemo(\n    () => receipts[currentReceiptIndex] || {},\n    [currentReceiptIndex, receipts]\n  );\n\n  const credentialOptions = useMemo(\n    () =>\n      credentials\n        .map(c => {\n          return { id: c.id, value: c.id, text: c.name };\n        })\n        .sort(),\n    [credentials]\n  );\n\n  const adaptorOptions = useMemo(\n    () =>\n      adaptors.map(a => ({\n        id: a.module,\n        value: a.module,\n        text: a.name,\n      })),\n    [adaptors]\n  );\n\n  const sortedVersions = values =>\n    adaptors\n      .filter(a => a.module === values.adaptor)\n      .map(a => a.versions)\n      .flat()\n      .sort()\n      .reverse();\n\n  const versionOptions = useCallback(\n    adaptor => {\n      return adaptors\n        .filter(a => a.module === adaptor)\n        .map(a => a.versions)\n        .flat()\n        .map(v => ({ id: v, value: v, text: v }))\n        .sort()\n        .reverse();\n    },\n    [adaptors]\n  );\n\n  const handleAdaptorChange = (adaptor, version, form) => {\n    const maxVersion = versionOptions(adaptor)[0]?.value;\n    const newVersion = version === 'highestKnown' ? maxVersion : version;\n\n    form.batch(() => {\n      form.change('adaptor', adaptor);\n      form.change('adaptorVersion', newVersion);\n    });\n  };\n\n  const handleThemeChange = theme => {\n    dispatch(updateUser({ ...user, theme }));\n  };\n\n  const handleCancel = initValues => {\n    if (jobError) dispatch(dismissJobError());\n    if (initValues.id) {\n      return linkTo(projectJobPath(selectedProject, job), history);\n    }\n    return linkTo(projectJobsPath(selectedProject), history);\n  };\n\n  const nextReceipt = () => setCurrentReceiptIndex(currentReceiptIndex + 1);\n\n  const prevReceipt = () => setCurrentReceiptIndex(currentReceiptIndex - 1);\n\n  const customPristine = values =>\n    values.name === initialValues.name &&\n    equalOrFalsy(values.pathInExternalRepo, initialValues.pathInExternalRepo) &&\n    equalOrFalsy(values.adaptorVersion, initialValues.adaptorVersion) &&\n    values.triggerId === initialValues.triggerId &&\n    values.adaptor === initialValues.adaptor &&\n    values.expression === initialValues.expression &&\n    values.credentialId === initialValues.credentialId;\n\n  const handleCreateRun = async (currentJob, receipt) => {\n    const newRun = await dispatch(createRun(currentJob, receipt));\n\n    history.push(projectSaveAndRunJobPath(selectedProject, currentJob, newRun));\n  };\n\n  const loadSampleReceipts = useCallback(() => {\n    if (selectedTrigger) {\n      if (selectedTrigger.type !== 'message') {\n        setCurrentReceiptIndex(null);\n      } else {\n        dispatch(\n          loadBodies({\n            projectId,\n            page: 1,\n            perPage: 5,\n            triggerId: selectedTrigger.id,\n          })\n        );\n        setCurrentReceiptIndex(0);\n      }\n    }\n  }, [dispatch, projectId, selectedTrigger]);\n\n  const submit = async ({ saveAndRun, ...values }, form) => {\n    const action = id ? updateJob : createJob;\n\n    try {\n      const payload = await action(values)(dispatch);\n      const newJob = payload.entities.jobs[payload.result];\n\n      if (saveAndRun === true) {\n        handleCreateRun(newJob, selectedReceipt);\n      } else {\n        history.push(projectJobPath(selectedProject, newJob));\n      }\n\n      return true;\n    } catch (err) {\n      if (err instanceof UnprocessableEntity) {\n        return createFormErrors(err.errors, values);\n      }\n\n      return err;\n    } finally {\n      if (saveAndRun === true) form.change('saveAndRun', false);\n    }\n  };\n\n  const validate = values => {\n    const errors = {};\n\n    if (!values.name) {\n      errors.name =\n        'Name required. This must be unique to the project and helps you ID your job.';\n    }\n    if (!values.triggerId) {\n      errors.triggerId = 'Trigger required. This controls when the job runs.';\n    }\n    if (!values.adaptor) {\n      errors.adaptor = 'Adaptor required. The HTTP adaptor is a good default.';\n    }\n    const whiteSpaces = values.pathInExternalRepo\n      ? values.pathInExternalRepo.indexOf(' ')\n      : -1;\n    if (whiteSpaces >= 0) {\n      errors.pathInExternalRepo = \"The Github filepath can't have spaces.\";\n    }\n    if (!values.expression) {\n      errors.expression =\n        \"Expression required. The job expression can't be blank.\";\n    }\n\n    return errors;\n  };\n\n  useEffect(() => {\n    document.title = 'Job Studio - OpenFn';\n    dispatch(switchedMenu('Jobs'));\n  }, [dispatch]);\n\n  useEffect(() => {\n    if (id) fetchJobById(id)(dispatch).catch(err => setError(err));\n  }, [id, dispatch]);\n\n  useEffect(() => {\n    dispatch(fetchCredentials({ projectId: selectedProject.id }));\n\n    dispatch(fetchTriggers(selectedProject));\n\n    dispatch(getAdaptors());\n  }, [selectedProject, dispatch]);\n\n  useEffect(() => loadSampleReceipts(), [loadSampleReceipts]);\n\n  if (error) throw error;\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      initialValues={initialValues}\n      render={({ handleSubmit, values, form, submitErrors }) => {\n        if (submitErrors instanceof Error) throw submitErrors;\n        return (\n          <>\n            <IDE\n              form={form}\n              customPristine={customPristine(values)}\n              handleSubmit={handleSubmit}\n              selectedProject={selectedProject}\n              history={history}\n              user={user}\n              id={id}\n              initialValues={initialValues}\n              receipts={receipts}\n              currentReceiptIndex={currentReceiptIndex}\n              selectedReceipt={selectedReceipt}\n              prevReceipt={prevReceipt}\n              nextReceipt={nextReceipt}\n              loadSampleReceipts={loadSampleReceipts}\n              helpers={helpers}\n              handleThemeChange={handleThemeChange}\n              handleCancel={handleCancel}\n              toggleDrawer={setDrawerOpen}\n              trigger={selectedTrigger}\n              triggerOptions={triggerOptions}\n              credentialOptions={credentialOptions}\n              adaptorOptions={adaptorOptions}\n              handleCreateRun={() => handleCreateRun(job, selectedReceipt)}\n              versionOptions={versionOptions}\n              handleAdaptorChange={handleAdaptorChange}\n            />\n            <OnChange name=\"triggerId\">\n              {value => selectTriggerId(value)}\n            </OnChange>\n            <KeyBinding onKey={e => formSaveKeys(e, handleSubmit)} />\n            <DocumentationDrawer\n              open={drawerOpen}\n              onClose={() => setDrawerOpen(false)}\n              values={values}\n              helpers={helpers}\n              adaptors={adaptors}\n              latestVersionText={`latest (${sortedVersions(values)[0]})`}\n            />\n          </>\n        );\n      }}\n    />\n  );\n}\n\nJobEdit.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n};\n\nexport default JobEdit;\n","import {\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  List,\n  ListItem,\n  ListItemIcon,\n  ListItemText,\n  Switch,\n  Tooltip,\n  Avatar,\n  Typography,\n} from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n  FolderShared as FolderSharedIcon,\n  Language,\n  Today as TodayIcon,\n  VpnKey as VpnKeyIcon,\n  WatchLater,\n} from '@material-ui/icons';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport triggerIcons from '../../constants/triggerIcons';\nimport { calendarTime, cronToHuman } from '../../helpers';\nimport Images from '../../helpers/imagePaths';\n\nconst styles = theme => ({\n  card: {\n    backgroundColor: theme.palette.grey[100],\n  },\n  title: {\n    marginBottom: 16,\n    fontSize: 14,\n  },\n  pos: {\n    marginBottom: 12,\n  },\n  logo: {\n    verticalAlign: 'top',\n    maxHeight: 35,\n    maxWidth: 35,\n  },\n  off: {\n    filter: 'gray' /* IE6-9 */,\n    filter: 'grayscale(1)' /* Microsoft Edge and Firefox 35+ */,\n    '-webkit-filter': 'grayscale(1)' /* Google Chrome, Safari 6+ & Opera 15+ */,\n  },\n  avatar: {\n    backgroundSize: 'contain',\n  },\n  triggerIcon: {\n    fontSize: 24,\n  },\n  jobCardContent: {\n    paddingLeft: 8,\n  },\n  cardHeaderRoot: {\n    overflow: 'hidden',\n  },\n  cardHeaderContent: {\n    overflow: 'hidden',\n  },\n});\n\nclass JobItem extends React.Component {\n  handleToggle = e => {\n    const { onToggle, job } = this.props;\n    e.stopPropagation();\n    onToggle(job.id, job.autoprocess);\n  };\n\n  // handleDelete = e => {\n  //   const { onDelete, job } = this.props;\n  //   e.preventDefault();\n  //   onDelete(job.id);\n  // };\n\n  render() {\n    const { job, order, classes, onClick } = this.props;\n    const { credential, trigger, autoprocess } = job;\n\n    const triggerDisplay =\n      trigger.type === 'interval' ? cronToHuman(trigger.cron) : trigger.name;\n\n    const longRunIcon = job.longRun ? (\n      <span>\n        &nbsp;\n        <Tooltip title=\"Long runs enabled\">\n          <WatchLater color=\"disabled\" fontSize=\"inherit\" />\n        </Tooltip>\n      </span>\n    ) : (\n      ''\n    );\n\n    return (\n      <Card\n        id={`j${order}`}\n        name={job.name}\n        className={!autoprocess ? classes.card : ''}\n      >\n        <CardHeader\n          classes={{\n            root: classes.cardHeaderRoot,\n            content: classes.cardHeaderContent,\n          }}\n          avatar={\n            Images[job.adaptor] ? (\n              <img\n                src={Images[job.adaptor]}\n                alt={`language-${job.adaptor}`}\n                className={clsx(classes.logo, !autoprocess && classes.off)}\n              />\n            ) : (\n              <Avatar>\n                <Language\n                  size=\"inherit\"\n                  color={autoprocess ? 'primary' : 'disabled'}\n                />\n              </Avatar>\n            )\n          }\n          action={\n            <Tooltip\n              title={\n                job.autoprocess ? 'Turn off autoprocess' : 'Turn on autoprocess'\n              }\n            >\n              <Switch\n                color=\"primary\"\n                onChange={this.handleToggle}\n                checked={job.autoprocess}\n              />\n            </Tooltip>\n          }\n          title={\n            <Typography noWrap gutterBottom>\n              {job.name}\n              {longRunIcon}\n            </Typography>\n          }\n          subheader={\n            job.adaptorVersion\n              ? `${job.adaptor}@${job.adaptorVersion}`\n              : `${job.adaptor}@latest`\n          }\n        />\n        <CardContent className={classes.jobCardContent}>\n          <List dense>\n            <ListItem>\n              {trigger.type && (\n                <ListItemIcon>\n                  <span className={classes.triggerIcon}>\n                    {triggerIcons[trigger.type].icon}\n                  </span>\n                </ListItemIcon>\n              )}\n              <ListItemText\n                primaryTypographyProps={{ noWrap: true }}\n                primary={triggerDisplay}\n              />\n            </ListItem>\n            <ListItem>\n              <ListItemIcon>\n                <VpnKeyIcon />\n              </ListItemIcon>\n              <ListItemText\n                primary={credential.id ? credential.name : '(no auth)'}\n              />\n            </ListItem>\n            <ListItem>\n              <ListItemIcon>\n                <FolderSharedIcon />\n              </ListItemIcon>\n              <ListItemText\n                primary={\n                  job.pathInExternalRepo ? job.pathInExternalRepo : 'n/a'\n                }\n              />\n            </ListItem>\n            <ListItem>\n              <ListItemIcon>\n                <TodayIcon />\n              </ListItemIcon>\n              <ListItemText\n                primary={`updated ${calendarTime(job.updatedAt)}`}\n                secondary={`created ${calendarTime(job.insertedAt)}`}\n              />\n            </ListItem>\n          </List>\n        </CardContent>\n        <CardActions>\n          <Button id=\"view\" onClick={onClick}>\n            View\n          </Button>\n        </CardActions>\n      </Card>\n    );\n  }\n}\n\nJobItem.propTypes = {\n  job: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(JobItem);\n","import Button from '@material-ui/core/Button';\nimport { orderBy, values } from 'lodash';\nimport PropTypes from 'prop-types';\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { fetchCredentials } from '../../actions/CredentialActions';\nimport { deleteJob, fetchJobs, toggleJob } from '../../actions/JobActions';\nimport { switchedMenu } from '../../actions/MenuActions';\nimport { fetchTriggers } from '../../actions/TriggerActions';\nimport { linkTo, toggleValue } from '../../helpers';\nimport Loader from '../Loader';\nimport SectionFrame from '../SectionFrame';\nimport JobItem from './JobItem';\nimport MasonryWrapper from '../MasonryWrapper';\nimport { projectJobPath, projectNewJobPath } from '../../helpers/pathHelpers';\n\nfunction JobsList({ selectedProject }) {\n  const [archiveShow, setArchiveShow] = useState(false);\n\n  const [filter, setFilter] = useState('');\n\n  const dispatch = useDispatch();\n\n  const history = useHistory();\n\n  const projectId = selectedProject.id;\n\n  const jobItems = useSelector(state => state.jobs.items);\n\n  const archivedCount = values(jobItems).filter(j => j.archived);\n\n  const triggerItems = useSelector(state => state.triggers.items);\n\n  const credentialItems = useSelector(state => state.credentials.items);\n\n  const jobs = orderBy(\n    values(jobItems),\n    ['autoprocess', j => j.name.toLowerCase()],\n    ['desc']\n  )\n    .filter(j => j.projectId === projectId)\n    .map(j => ({\n      // Change the job that you are going to use in the view\n      // by appending the filter and credential objects from the state.\n      // P.S. I haven't checked that the keys and state path are correct.\n      ...j,\n      trigger: triggerItems[j.triggerId] || {},\n      credential: credentialItems[j.credentialId] || {},\n    }));\n\n  const filteredJobs = jobs.filter(j => j.archived === archiveShow);\n\n  const { isLoading } = useSelector(state => state.jobs);\n\n  const toggleArchived = toggleValue(setArchiveShow);\n\n  const handleFilterChange = e => setFilter(e.target.value.toLowerCase());\n\n  const handleToggle = (jobId, current) => dispatch(toggleJob(jobId, current));\n\n  const handleDelete = job => dispatch(deleteJob(job));\n\n  const includesText = job => job.name.toLowerCase().includes(filter);\n\n  const gotoJob = useCallback(\n    job => linkTo(projectJobPath(selectedProject, job), history),\n    [selectedProject, history]\n  );\n\n  useEffect(() => {\n    document.title = 'Jobs - OpenFn';\n    dispatch(switchedMenu('Jobs'));\n  }, [dispatch]);\n\n  useEffect(() => {\n    if (selectedProject) {\n      dispatch(fetchJobs(selectedProject));\n      dispatch(fetchCredentials({ projectId: selectedProject.id }));\n      dispatch(fetchTriggers(selectedProject));\n    }\n  }, [selectedProject, dispatch]);\n\n  return (\n    <div id=\"jobs-list-container\">\n      <SectionFrame\n        section=\"job\"\n        search={handleFilterChange}\n        searchText={filter}\n        helper=\"Filter jobs by name.\"\n        create={linkTo(projectNewJobPath(selectedProject), history)}\n        actions={\n          <Button\n            id=\"show-hide-archived\"\n            onClick={() => toggleArchived(archiveShow)}\n            disabled={archivedCount.length === 0}\n          >\n            {`Show ${archiveShow ? 'current' : 'archived'} jobs`}\n          </Button>\n        }\n      />\n      {isLoading && jobs.length === 0 && <Loader item=\"jobs\" />}\n      <MasonryWrapper>\n        {filteredJobs.filter(includesText).map((job, i) => (\n          <JobItem\n            job={job}\n            onDelete={handleDelete}\n            onToggle={handleToggle}\n            onClick={gotoJob(job)}\n            history={history}\n            key={job.id}\n            order={i}\n          />\n        ))}\n      </MasonryWrapper>\n    </div>\n  );\n}\n\nJobsList.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n};\n\nexport default JobsList;\n","import { camelizeKeys } from 'humps';\nimport { normalize } from 'normalizr';\nimport {\n  PROJECT_REPO_CONNECTION_CREATED,\n  PROJECT_REPO_CONNECTION_REMOVED,\n  PROJECT_REPO_CONNECTION_REQUEST,\n  PROJECT_REPO_CONNECTION_SUCCESS,\n  PROJECT_REPO_CONNECTION_UPDATED,\n} from '../constants';\nimport { ProjectRepoConnection } from '../schemas';\nimport Notifications from './Notifications';\nimport { fetchProjectRepoConnectionPath } from '../helpers/actionsPathHelpers';\nimport { del, get, put, post } from '../clients/BaseClient';\nimport { NotFound, UnprocessableEntity } from '../errors';\n\nfunction addProjectRepoConnectionFailed() {\n  return Notifications.add(\n    \"Job source couldn't be saved. (Someone may have already created one for this project.)\",\n    'danger'\n  );\n}\n\nfunction projectRepoConnectionUpdatedSuccess() {\n  return Notifications.add('Job source succesfully updated.', 'success');\n}\n\nfunction projectRepoConnectionRemovedSuccess() {\n  return Notifications.add('Job source succesfully removed.', 'info');\n}\n\nfunction projectRepoConnectionUpdated(payload) {\n  return { type: PROJECT_REPO_CONNECTION_UPDATED, payload };\n}\n\nexport function fetchProjectRepoConnection(project) {\n  return async dispatch => {\n    dispatch({ type: PROJECT_REPO_CONNECTION_REQUEST, projectId: project.id });\n\n    try {\n      const response = await get(fetchProjectRepoConnectionPath(project));\n      const data = await response.json();\n      const entities = normalize(camelizeKeys(data), ProjectRepoConnection);\n\n      dispatch({\n        type: PROJECT_REPO_CONNECTION_SUCCESS,\n        payload: entities,\n      });\n\n      return entities;\n    } catch (error) {\n      if (error instanceof NotFound) {\n        return dispatch(\n          projectRepoConnectionUpdated({\n            entities: { projectRepoConnections: null },\n          })\n        );\n      }\n\n      throw error;\n    }\n  };\n}\n\nexport function createProjectRepoConnection(\n  project,\n  {\n    userId,\n    repositoryOwner,\n    repositoryName,\n    repositoryBranch,\n    projectId,\n    autodeployEnabled,\n  }\n) {\n  return async dispatch => {\n    const payload = {\n      project_repo_connection: {\n        project_id: projectId,\n        user_id: userId,\n        repository_owner: repositoryOwner,\n        repository_name: repositoryName,\n        repository_branch: repositoryBranch,\n        autodeploy_enabled: autodeployEnabled,\n      },\n    };\n\n    try {\n      const response = await post(\n        fetchProjectRepoConnectionPath(project),\n        payload\n      );\n      const data = await response.json();\n      const entities = normalize(camelizeKeys(data), ProjectRepoConnection);\n      dispatch({\n        type: PROJECT_REPO_CONNECTION_CREATED,\n        payload: entities,\n      });\n      dispatch(projectRepoConnectionUpdatedSuccess());\n      return response;\n    } catch (error) {\n      if (error instanceof UnprocessableEntity)\n        dispatch(addProjectRepoConnectionFailed());\n      throw error;\n    }\n  };\n}\n\nexport function updateProjectRepoConnection(\n  project,\n  {\n    id,\n    userId,\n    repositoryOwner,\n    repositoryName,\n    repositoryBranch,\n    projectId,\n    autodeployEnabled,\n  }\n) {\n  return async dispatch => {\n    const payload = {\n      project_repo_connection: {\n        id,\n        user_id: userId,\n        project_id: projectId,\n        repository_owner: repositoryOwner,\n        repository_name: repositoryName,\n        repository_branch: repositoryBranch,\n        autodeploy_enabled: autodeployEnabled,\n      },\n    };\n\n    try {\n      const response = await put(\n        fetchProjectRepoConnectionPath(project),\n        payload\n      );\n      const data = await response.json();\n      const entities = normalize(camelizeKeys(data), ProjectRepoConnection);\n      dispatch({\n        type: PROJECT_REPO_CONNECTION_UPDATED,\n        payload: entities,\n      });\n      dispatch(projectRepoConnectionUpdatedSuccess());\n      return response;\n    } catch (error) {\n      if (error instanceof UnprocessableEntity)\n        dispatch(addProjectRepoConnectionFailed());\n      throw error;\n    }\n  };\n}\n\nexport function deleteProjectRepoConnection(project) {\n  return async dispatch => {\n    const response = await del(fetchProjectRepoConnectionPath(project));\n    const data = await response.json();\n    const entities = normalize(camelizeKeys(data), ProjectRepoConnection);\n\n    dispatch({\n      type: PROJECT_REPO_CONNECTION_REMOVED,\n      payload: entities,\n    });\n    dispatch(projectRepoConnectionRemovedSuccess());\n  };\n}\n","import React, { useState } from 'react';\nimport {\n  Tooltip,\n  makeStyles,\n  FormControl,\n  FormGroup,\n  Grid,\n  IconButton,\n  InputLabel,\n  MenuItem,\n  Select,\n  TextField,\n} from '@material-ui/core';\nimport {\n  FirstPage as FirstPageIcon,\n  KeyboardArrowLeft,\n  KeyboardArrowRight,\n  KeyboardReturn,\n  LastPage as LastPageIcon,\n} from '@material-ui/icons';\nimport PropTypes from 'prop-types';\nimport { abbreviateNumber } from '../helpers';\n\nconst useStyles = makeStyles(theme => ({\n  paginationGrid: {\n    marginTop: theme.spacing(1),\n    padding: theme.spacing(1),\n  },\n  formControl: {\n    paddingRight: theme.spacing(1),\n    width: 100,\n  },\n  goToPage: {\n    paddingRight: theme.spacing(1),\n    width: 110,\n  },\n}));\n\nfunction PaginationControls({\n  currentPage,\n  numberPerPage,\n  totalPages,\n  onFocus,\n  onBlur,\n  onChange,\n}) {\n  const [targetPage, setTargetPage] = useState('');\n\n  const classes = useStyles();\n\n  const showError =\n    targetPage > totalPages || !!(targetPage && targetPage <= 0);\n\n  const errorMessage = `Range is 1 to ${totalPages}`;\n  const totalPagesDisplay = totalPages ? abbreviateNumber(totalPages) : '?';\n  const invalidTargetPage = !targetPage || showError;\n\n  const resetTargetPage = () => {\n    if (targetPage) setTargetPage('');\n  };\n\n  return (\n    <>\n      <Grid\n        container\n        spacing={3}\n        justifyContent=\"flex-end\"\n        className={classes.paginationGrid}\n      >\n        <Grid item>\n          <FormGroup row>\n            <FormControl className={classes.formControl}>\n              <InputLabel htmlFor=\"rows-per-page\">Per page</InputLabel>\n              <Select\n                onChange={e => {\n                  onChange({ perPage: e.target.value, page: 1 });\n                }}\n                value={numberPerPage}\n                inputProps={{\n                  name: 'Rows per page',\n                  id: 'rows-per-page',\n                }}\n              >\n                <MenuItem value={5}>5</MenuItem>\n                <MenuItem value={10}>10</MenuItem>\n                <MenuItem value={25}>25</MenuItem>\n                <MenuItem value={50}>50</MenuItem>\n                <MenuItem value={100}>100</MenuItem>\n              </Select>\n            </FormControl>\n            <TextField\n              label={`Page ${currentPage} of ${totalPagesDisplay}`}\n              placeholder={`${currentPage}`}\n              value={targetPage}\n              onChange={e => setTargetPage(e.target.value)}\n              onKeyDown={e => {\n                if (e.key === 'Enter') {\n                  if (targetPage && !invalidTargetPage) {\n                    onChange({ page: targetPage });\n                  }\n                  resetTargetPage();\n                }\n              }}\n              error={showError}\n              helperText={showError ? errorMessage : undefined}\n              className={classes.goToPage}\n              type=\"number\"\n              InputLabelProps={{\n                shrink: true,\n              }}\n              InputProps={{\n                inputProps: {\n                  min: 1,\n                  max: totalPages,\n                },\n                onFocus,\n                onBlur,\n              }}\n            />\n            <Tooltip title={`Go to page ${targetPage}`} component=\"span\">\n              <IconButton\n                onClick={() => {\n                  onChange({ page: targetPage });\n                  resetTargetPage();\n                }}\n                disabled={invalidTargetPage}\n                aria-label=\"GoTo Page\"\n              >\n                <KeyboardReturn />\n              </IconButton>\n            </Tooltip>\n            <IconButton\n              onClick={() => {\n                onChange({ page: 1 });\n                resetTargetPage();\n              }}\n              disabled={currentPage === 1}\n              aria-label=\"First Page\"\n            >\n              <FirstPageIcon />\n            </IconButton>\n            <IconButton\n              onClick={() => {\n                onChange({ page: currentPage - 1 });\n                resetTargetPage();\n              }}\n              disabled={currentPage === 1}\n              aria-label=\"Previous Page\"\n            >\n              <KeyboardArrowLeft />\n            </IconButton>\n            <IconButton\n              onClick={() => {\n                onChange({ page: currentPage + 1 });\n                resetTargetPage();\n              }}\n              disabled={currentPage === totalPages}\n              aria-label=\"Next Page\"\n            >\n              <KeyboardArrowRight />\n            </IconButton>\n            <IconButton\n              onClick={() => {\n                onChange({ page: totalPages });\n                resetTargetPage();\n              }}\n              disabled={currentPage === totalPages}\n              aria-label=\"Last Page\"\n            >\n              <LastPageIcon />\n            </IconButton>\n          </FormGroup>\n        </Grid>\n      </Grid>\n    </>\n  );\n}\n\nPaginationControls.propTypes = {\n  currentPage: PropTypes.number.isRequired,\n  numberPerPage: PropTypes.number.isRequired,\n  totalPages: PropTypes.number,\n};\n\nPaginationControls.defaultProps = {\n  totalPages: 1,\n};\n\nexport default PaginationControls;\n","import { TableRow, TableCell, Tooltip, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport HelpIcon from '@material-ui/icons/Help';\nimport clsx from 'clsx';\nimport { throttle } from 'lodash';\nimport React, { useEffect, useState, useRef } from 'react';\nimport { checkQueue } from '../actions/ProjectActions';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    paddingRight: 0,\n    paddingLeft: 0,\n    paddingTop: 4,\n    paddingBottom: 5,\n    backgroundColor: theme.palette.offWhite,\n  },\n  noBorder: {\n    border: 0,\n  },\n  bar: {\n    marginTop: 2,\n  },\n}));\n\nfunction être(count) {\n  return count > 1 ? 'are' : 'is';\n}\n\nfunction plural(count) {\n  if (count === 0) {\n    return '';\n  }\n  return count > 1 ? 's' : '';\n}\n\nconst QueueStatus = props => {\n  const { project, lastArrival, borderless } = props;\n  const classes = useStyles();\n  const [queueSize, setQueueSize] = useState({\n    total: 0,\n    runs: 0,\n    receipts: 0,\n  });\n\n  const [querying, setQuerying] = useState(false);\n\n  const throttled = useRef(\n    throttle(\n      () =>\n        checkQueue(project)\n          .then(setQueueSize)\n          .then(() => {\n            setQuerying(false);\n          }),\n      2000,\n      {\n        trailing: true,\n      }\n    )\n  );\n  const { total, runs, receipts } = queueSize;\n\n  useEffect(() => {\n    if (project.id && !querying) {\n      setQuerying(true);\n      throttled.current();\n    }\n  }, [project.id, lastArrival]);\n\n  const runText = `${runs} run${plural(runs)}`;\n  const receiptText = `${receipts} receipt${plural(receipts)}`;\n\n  if (!queueSize || total === 0) {\n    return null;\n  }\n\n  function phrase(nRuns, nReceipts) {\n    if (nReceipts > 0 && nRuns > 0) {\n      return `There ${être(\n        nRuns\n      )} ~${runText} and ~${receiptText} enqueued for this project. `;\n    }\n    if (nReceipts === 0) {\n      return `There ${être(nRuns)} ~${runText} enqueued for this project. `;\n    }\n    return `There ${être(\n      nReceipts\n    )} ~${receiptText} enqueued for this project. `;\n  }\n  return (\n    <TableRow>\n      <TableCell\n        align=\"center\"\n        colSpan={9}\n        className={clsx(classes.root, borderless && classes.noBorder)}\n      >\n        <Typography variant=\"caption\">\n          {phrase(runs, receipts)}\n          {project.planId == 1 && (\n            <Tooltip title=\"Projects on the free-forever plan share a queue; short delays in processing may occur\">\n              <HelpIcon fontSize=\"inherit\" />\n            </Tooltip>\n          )}\n        </Typography>\n      </TableCell>\n    </TableRow>\n  );\n};\n\nexport default QueueStatus;\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport {\n  Accordion,\n  AccordionDetails,\n  AccordionSummary,\n  Avatar,\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  Checkbox,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Grid,\n  IconButton,\n  List,\n  ListItem,\n  ListItemIcon,\n  ListItemText,\n  Switch,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  Tooltip,\n  Typography,\n} from '@material-ui/core';\nimport {\n  Archive as ArchiveIcon,\n  DeleteForever as DeleteForeverIcon,\n  Edit as EditIcon,\n  ExpandMore as ExpandMoreIcon,\n  FlashOn as FlashOnIcon,\n  Help as HelpIcon,\n  Info as InfoIcon,\n  Lock as LockIcon,\n  LockOpen as LockOpenIcon,\n  OpenInNew,\n  PlayCircleFilled as PlayCircleFilledIcon,\n  Power as PowerIcon,\n  Schedule,\n  SettingsEthernet as SettingsEthernetIcon,\n  Today as TodayIcon,\n  Unarchive as UnarchiveIcon,\n  Visibility,\n  VisibilityOff,\n  VpnKey as VpnKeyIcon,\n  WatchLater,\n} from '@material-ui/icons';\nimport { format } from 'date-fns';\nimport { orderBy, isEqual } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport {\n  Area,\n  AreaChart,\n  Legend,\n  ResponsiveContainer,\n  Tooltip as RechartTooltip,\n  XAxis,\n  YAxis,\n} from 'recharts';\nimport { joinChannel } from '../../actions/ChannelActions';\nimport { fetchCredentials } from '../../actions/CredentialActions';\nimport {\n  archiveJob,\n  clearJobState,\n  fetchJobById,\n  getHelpers,\n  revertJob,\n  runJob,\n  toggleJob,\n  toggleNoConsole,\n  togglePrivate,\n} from '../../actions/JobActions';\nimport { fetchProjectRepoConnection } from '../../actions/ProjectRepoConnectionActions';\nimport { switchedMenu } from '../../actions/MenuActions';\nimport { fetchProjectUsers } from '../../actions/ProjectUserActions';\nimport { fetchTriggers } from '../../actions/TriggerActions';\nimport {\n  calendarTime,\n  cronToHuman,\n  githubAdaptorLink,\n  linkTo,\n} from '../../helpers';\nimport {\n  projectCredentialPath,\n  projectJobEditPath,\n  projectJobsPath,\n  projectTriggerPath,\n} from '../../helpers/pathHelpers';\nimport { selectHelpers, selectCurrentUser, selectJob } from '../../selectors';\nimport { AceEditor, addGlobals, setupEditor } from '../CodeEditor';\nimport OneCardHolder from '../OneCardHolder';\nimport PaginationControls from '../PaginationControls';\nimport QueueStatus from '../QueueStatus';\nimport Link from '../Link';\n\nconst useStyles = makeStyles(theme => ({\n  floatRight: {\n    float: 'right',\n  },\n  recharts: {\n    backgroundColor: theme.palette.offWhite,\n    fontFamily: theme.typography.fontFamily,\n  },\n  heading: {\n    fontSize: theme.typography.pxToRem(15),\n  },\n  secondaryHeading: {\n    fontSize: theme.typography.pxToRem(15),\n    color: theme.palette.text.secondary,\n  },\n  on: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  column: {\n    flexBasis: '33.33%',\n  },\n}));\n\nfunction JobView({ selectedProject }) {\n  const codeEditor = useRef();\n  const dispatch = useDispatch();\n  const params = useParams();\n  const history = useHistory();\n  const classes = useStyles();\n  const theme = useTheme();\n\n  const [state, setState] = useState({\n    modalShow: false,\n    clearStateModalShow: false,\n    revertModalShow: false,\n    revertEvent: {},\n    currentPage: 1,\n    numberPerPage: 5,\n    totalPages: 1,\n  });\n\n  const [lastArrival, setArrival] = useState(Date.now());\n\n  const { id } = params;\n\n  const job = useSelector(state => {\n    const item = selectJob(state, id) || {};\n\n    if (item.events) {\n      item.events = orderBy(\n        item.events,\n        [je => new Date(je.timestamp)],\n        ['desc']\n      );\n    }\n\n    return item;\n  }, isEqual);\n\n  const editors = useSelector(\n    state =>\n      Object.values(state.projectUsers.items).reduce(\n        (acc, pu) => ({ ...acc, [pu.user.id]: pu.user.email }),\n        {}\n      ),\n    isEqual\n  );\n\n  const hasCrashes = useMemo(() => {\n    return !!(job.states || []).find(({ crashed }) => crashed !== 0);\n  }, [job]);\n\n  const projectRepoConnection = useSelector(\n    state => state.projectRepoConnections.items[selectedProject.projectRepoConnectionId],\n    isEqual\n  );\n\n  const channelName = `runs:${selectedProject.id}`;\n\n  const trigger = useSelector(state => state.triggers.items[job.triggerId]);\n  const triggerJob = useSelector(state => state.jobs.items[trigger?.jobId]);\n  const triggerJobName = triggerJob ? triggerJob.name : '';\n\n  const helpers = useSelector(selectHelpers);\n\n  const credential = useSelector(\n    state => state.credentials.items[job.credentialId],\n    isEqual\n  );\n  const userId = useSelector(state => state.auth.currentUserId);\n  const userTheme = useSelector(\n    state => (selectCurrentUser(state) || { theme: 'solarized_dark' }).theme,\n    isEqual\n  );\n\n  const error = useSelector(state => state.jobs.error, isEqual);\n\n  const lastSuccess =\n    job.jobStateUpdatedDate &&\n    format(new Date(job.jobStateUpdatedDate), 'PPPpp');\n\n  const showModal = () => {\n    setState(prevState => ({\n      ...prevState,\n      modalShow: true,\n    }));\n  };\n\n  const showClearStateModal = () => {\n    setState(prevState => ({\n      ...prevState,\n      clearStateModalShow: true,\n    }));\n  };\n\n  const showRevertModal = revertEvent => {\n    setState(prevState => ({\n      ...prevState,\n      revertModalShow: true,\n      revertEvent,\n    }));\n  };\n\n  const hideModal = () => {\n    setState(prevState => ({\n      ...prevState,\n      modalShow: false,\n    }));\n  };\n\n  const hideClearStateModal = () => {\n    setState(prevState => ({\n      ...prevState,\n      clearStateModalShow: false,\n    }));\n  };\n\n  const hideRevertModal = () => {\n    setState(prevState => ({\n      ...prevState,\n      revertModalShow: false,\n    }));\n  };\n\n  const filterChanged = filterParams => {\n    const { currentPage } = state;\n    const { page, perPage } = filterParams;\n\n    if (page && !perPage) {\n      if (page < 1 || page > state.totalPages) {\n        setState(prevState => ({ ...prevState, currentPage }));\n      } else {\n        setState(prevState => ({ ...prevState, currentPage: page }));\n      }\n    } else {\n      setState(prevQuery => ({\n        ...prevQuery,\n        ...filterParams,\n        currentPage: 1,\n        numberPerPage: perPage ?? state.numberPerPage,\n      }));\n    }\n  };\n\n  function handleReceiveRun(payload) {\n    const jobId = payload.runs[0].job_id;\n    dispatch(fetchJobById(jobId));\n    setArrival(Date.now());\n  }\n\n  const handleClearState = () => {\n    dispatch(clearJobState(job));\n    setState(prevState => ({ ...prevState, clearStateModalShow: false }));\n  };\n\n  const handleArchive = () => {\n    dispatch(archiveJob(job));\n    history.push(projectJobsPath(selectedProject));\n  };\n\n  const handleRestore = () => {\n    dispatch(archiveJob(job));\n    history.push(projectJobsPath(selectedProject));\n  };\n\n  const handleRevertJob = githubEventId => {\n    // The eventId here refers to a GithubEvent ID, _not_ to the auto-generated\n    // id of the JobEvent. See JobEventView for a detailed description.\n    dispatch(revertJob(job, githubEventId));\n    history.push(projectJobsPath(selectedProject));\n  };\n\n  useEffect(() => {\n    document.title = 'Job Inspector - OpenFn';\n    dispatch(switchedMenu('Jobs'));\n  }, [dispatch]);\n\n  useEffect(() => {\n    setArrival(Date.now());\n    return dispatch(\n      joinChannel(channelName, {\n        new: handleReceiveRun,\n        updated: handleReceiveRun,\n      })\n    );\n  }, [channelName, dispatch]);\n\n  useEffect(() => {\n    dispatch(fetchTriggers(selectedProject));\n    dispatch(fetchCredentials({ projectId: selectedProject.id }));\n    dispatch(fetchProjectUsers(selectedProject));\n  }, [selectedProject, dispatch]);\n\n  useEffect(() => {\n    if (id) dispatch(fetchJobById(id));\n  }, [id, dispatch]);\n\n  useEffect(() => {\n    dispatch(fetchProjectRepoConnection(selectedProject));\n  }, [selectedProject, dispatch]);\n\n  useEffect(() => {\n    if (job.adaptor)\n      dispatch(\n        getHelpers({ adaptor: job.adaptor, version: job.adaptorVersion || '' })\n      );\n  }, [job.adaptor, job.adaptorVersion, dispatch]);\n\n  useEffect(() => {\n    const editor = codeEditor?.current?.editor;\n\n    if (editor) {\n      addGlobals(editor, helpers);\n    }\n  }, [helpers]);\n\n  useEffect(() => {\n    if (job.events)\n      setState(prevState => ({\n        ...prevState,\n        totalPages: Math.ceil(job.events.length / state.numberPerPage),\n      }));\n  }, [JSON.stringify(job.events)]);\n\n  if (error) throw error;\n\n  const snippet = {\n    interval: cronToHuman(trigger?.cron),\n    message: JSON.stringify(trigger?.criteria),\n    job: `when ${triggerJobName} succeeds`,\n    fail: `when ${triggerJobName} fails`,\n    console: `console.log(...) is ${job.noConsole ? 'disabled' : 'enabled'}`,\n    longRun: `Long duration runs are ${job.longRun ? ' ' : 'not '}enabled`,\n    // testMode: `test mode (http request intercept) is ${\n    //   job.testMode ? 'enabled' : 'disabled'\n    // }`,\n  };\n\n  const ClearStateModal = (\n    <Dialog open={state.clearStateModalShow} onClose={hideClearStateModal}>\n      <DialogTitle>\n        Are you sure you wish to clear state for <b>{job.name}</b>?\n      </DialogTitle>\n      <DialogContent>\n        <Typography>\n          If you clear the state for this job, the next run will not have access\n          to any previous data. Any database cursors or lastDataReceived\n          variables that have been saved to state will vanish. The job will run\n          as if it is running for the very first time.\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={hideClearStateModal}>No, I&apos;m not sure.</Button>\n        <Button id=\"archive_job_button\" onClick={handleClearState}>\n          Yes, clear state for this job.\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n\n  const RevertModal = (\n    <Dialog open={state.revertModalShow} onClose={hideRevertModal}>\n      <DialogTitle>Revert to a previous commit?</DialogTitle>\n      <DialogContent>\n        <Typography>\n          This job expression will instantly be reverted to commit:\n        </Typography>\n        <Typography>\n          <code>{state.revertEvent.commitSha}</code>\n        </Typography>\n        <Typography>from your GitHub.com repository.</Typography>\n        <br />\n        <Typography>\n          No other jobs will be reverted. To instantly revert all jobs in this\n          project to a previous commit, resend the webhook from GitHub.\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={hideRevertModal}>No, I&apos;m not sure.</Button>\n        <Button onClick={() => handleRevertJob(state.revertEvent.eventId)}>\n          {state.revertEvent.commitSha\n            ? `Yes, revert to ${state.revertEvent.commitSha.slice(0, 7)}.`\n            : 'Error'}\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n\n  const ArchiveModal = (\n    <Dialog open={state.modalShow} onClose={hideModal}>\n      <DialogTitle>Are you sure you wish to archive {job.name}?</DialogTitle>\n      <DialogContent>\n        <Typography>\n          Once archived, the job won&apos;t appear in your jobs list and\n          messages will not appear to match against it until you restore the\n          job.\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={hideModal}>No, I&apos;m not sure.</Button>\n        <Button id=\"archive_job_button\" onClick={handleArchive}>\n          Yes, archive this job.\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n\n  return (\n    <OneCardHolder wide>\n      <Card>\n        <CardHeader\n          avatar={\n            <Avatar className={job.autoprocess && classes.on}>\n              <SettingsEthernetIcon />\n            </Avatar>\n          }\n          title={\n            job.name\n              ? `${job.name}${job.private ? ' (private)' : ''}`\n              : 'untitled'\n          }\n          subheader={\n            job.pathInExternalRepo && projectRepoConnection ? (\n              <Link\n                href={githubAdaptorLink(projectRepoConnection, job)}\n                text={job.pathInExternalRepo}\n                icon={<OpenInNew fontSize=\"inherit\" />}\n              />\n            ) : (\n              '- -'\n            )\n          }\n          titleTypographyProps={{ noWrap: true }}\n          subheaderTypographyProps={{ noWrap: true }}\n          action={\n            <span>\n              <Tooltip\n                title={\n                  selectedProject.userRole\n                    ? ''\n                    : 'Only administrators can modify library sharing, lock the console, or archive this job.'\n                }\n              >\n                <span>\n                  <Tooltip\n                    title={\n                      job.private\n                        ? `Click to inherit project sharing settings. (This is the default behaviour and your project is currently${\n                            selectedProject.public ? ' ' : 'NOT '\n                          }enrolled in the job library.)`\n                        : 'Click to make this job private. (Sharing will be blocked even if this project is enrolled in the job library.)'\n                    }\n                  >\n                    <Checkbox\n                      icon={<Visibility />}\n                      checkedIcon={<VisibilityOff />}\n                      onChange={() =>\n                        dispatch(togglePrivate(job.id, job.private))\n                      }\n                      checked={job.private === true}\n                      disabled={!selectedProject.userRole}\n                    />\n                  </Tooltip>\n                  <Tooltip title={job.archived ? 'Restore' : 'Archive'}>\n                    <IconButton\n                      id=\"archive-unarchive-job-btn\"\n                      disabled={!selectedProject.userRole}\n                      onClick={job.archived ? handleRestore : showModal}\n                    >\n                      {job.archived ? <UnarchiveIcon /> : <ArchiveIcon />}\n                    </IconButton>\n                  </Tooltip>\n\n                  <Tooltip\n                    title={\n                      job.noConsole ? (\n                        'Enable console.log(...) statements for this job.'\n                      ) : (\n                        <>\n                          Disable console.log(...) statements for this job to\n                          ensure that sloppy or malicious code written in the\n                          job expression does not expose sensitive data from the\n                          jobs state. E.g., `console.log(state.configuration)`\n                          or even `console.log(state.data.patientName)`.\n                        </>\n                      )\n                    }\n                  >\n                    <Checkbox\n                      color=\"secondary\"\n                      icon={<LockOpenIcon />}\n                      checkedIcon={<LockIcon />}\n                      onChange={() =>\n                        dispatch(toggleNoConsole(job.id, job.noConsole))\n                      }\n                      checked={job.noConsole === true}\n                      disabled={!selectedProject.userRole}\n                    />\n                  </Tooltip>\n                </span>\n              </Tooltip>\n              {!job.archived && (\n                <Tooltip title=\"Edit\">\n                  <IconButton\n                    id=\"edit\"\n                    onClick={linkTo(\n                      projectJobEditPath(selectedProject, job),\n                      history\n                    )}\n                  >\n                    <EditIcon />\n                  </IconButton>\n                </Tooltip>\n              )}\n              {!job.archived && (\n                <Tooltip\n                  title={\n                    job.autoprocess\n                      ? 'Turn off autoprocessing'\n                      : 'Turn on autoprocessing'\n                  }\n                >\n                  <Switch\n                    color=\"primary\"\n                    onChange={() =>\n                      dispatch(toggleJob(job.id, job.autoprocess))\n                    }\n                    checked={job.autoprocess === true}\n                  />\n                </Tooltip>\n              )}\n            </span>\n          }\n        />\n        {trigger?.type === 'interval' && (\n          <CardContent>\n            {trigger && trigger.type === 'interval' && (\n              <Grid container justifyContent=\"flex-end\" alignItems=\"center\">\n                <Grid item xs={9}>\n                  <Typography aria-label=\"next run state label\">\n                    <InfoIcon fontSize=\"inherit\" />{' '}\n                    {job.jobStateUpdatedDate ? (\n                      <span>\n                        The next run will inherit <code>state</code> from this\n                        job&apos;s last successful run:&nbsp;\n                        {lastSuccess}.\n                      </span>\n                    ) : (\n                      <span>\n                        There is no previously saved state for this job.\n                      </span>\n                    )}\n                  </Typography>\n                </Grid>\n\n                <Grid item xs={3}>\n                  <span className={classes.floatRight}>\n                    {job.jobStateUpdatedDate && (\n                      <Tooltip title=\"Clear job state\">\n                        <IconButton\n                          onClick={showClearStateModal}\n                          disabled={job.jobStateUpdatedDate == null}\n                        >\n                          <DeleteForeverIcon />\n                        </IconButton>\n                      </Tooltip>\n                    )}\n                    <Tooltip title=\"Run this job now\">\n                      <IconButton\n                        onClick={() => dispatch(runJob(job))}\n                        color=\"primary\"\n                      >\n                        <PlayCircleFilledIcon />\n                      </IconButton>\n                    </Tooltip>\n                  </span>\n                </Grid>\n              </Grid>\n            )}\n          </CardContent>\n        )}\n        <Table>\n          <TableBody>\n            <QueueStatus\n              project={selectedProject}\n              lastArrival={lastArrival}\n              borderless\n            />\n          </TableBody>\n        </Table>\n        <CardContent className={classes.recharts}>\n          <ResponsiveContainer width=\"100%\" height={200}>\n            <AreaChart\n              data={job ? job.stats : []}\n              margin={{\n                top: 20,\n                right: 30,\n                bottom: 0,\n                left: -10,\n              }}\n            >\n              <XAxis dataKey=\"date\" />\n              <YAxis />\n              <RechartTooltip />\n              <Legend />\n              {hasCrashes ? (\n                <Area\n                  type=\"monotone\"\n                  stackId=\"1\"\n                  dataKey=\"crashed\"\n                  stroke={theme.palette.secondary.main}\n                  fill={theme.palette.secondary.main}\n                  dot={false}\n                  strokeWidth={2}\n                />\n              ) : null}\n              <Area\n                type=\"monotone\"\n                stackId=\"1\"\n                dataKey=\"failure\"\n                stroke={theme.palette.error.main}\n                fill={theme.palette.error.main}\n                dot={false}\n                strokeWidth={2}\n              />\n              <Area\n                type=\"monotone\"\n                stackId=\"1\"\n                dataKey=\"success\"\n                stroke={theme.palette.primary.main}\n                fill={theme.palette.primary.main}\n                dot={false}\n                strokeWidth={2}\n              />\n            </AreaChart>\n          </ResponsiveContainer>\n        </CardContent>\n        <List dense>\n          <ListItem\n            button\n            onClick={e =>\n              linkTo(projectTriggerPath(selectedProject, trigger), history)(e)\n            }\n          >\n            <ListItemIcon>\n              <FlashOnIcon />\n            </ListItemIcon>\n            <ListItemText>\n              {trigger?.name} ({snippet[trigger?.type]})\n            </ListItemText>\n          </ListItem>\n          <ListItem\n            button\n            disabled={credential?.userId !== userId}\n            onClick={\n              credential?.name\n                ? linkTo(\n                    projectCredentialPath(selectedProject, credential),\n                    history\n                  )\n                : null\n            }\n          >\n            <ListItemIcon>\n              <VpnKeyIcon />\n            </ListItemIcon>\n            <ListItemText>\n              {!credential?.name\n                ? '(no auth)'\n                : `${credential?.name}${\n                    credential?.userId != userId\n                      ? ` (${credential?.userEmail})`\n                      : ''\n                  }`}\n            </ListItemText>\n          </ListItem>\n          <ListItem>\n            <ListItemIcon>\n              <TodayIcon />\n            </ListItemIcon>\n            <ListItemText>Created {calendarTime(job.insertedAt)}</ListItemText>\n          </ListItem>\n          <ListItem>\n            <ListItemIcon>\n              <TodayIcon />\n            </ListItemIcon>\n            <ListItemText>Updated {calendarTime(job.updatedAt)}</ListItemText>\n          </ListItem>\n          <ListItem\n            button\n            onClick={() =>\n              window.open(\n                `https://www.github.com/OpenFn/language-${job.adaptor}`,\n                '_blank'\n              )\n            }\n          >\n            <ListItemIcon>\n              <PowerIcon />\n            </ListItemIcon>\n            <ListItemText>\n              language-{job.adaptor}@{job.adaptorVersion || 'latest'}\n            </ListItemText>\n          </ListItem>\n          <ListItem>\n            <ListItemIcon>\n              {job.noConsole ? <LockIcon /> : <LockOpenIcon />}\n            </ListItemIcon>\n            <ListItemText>{snippet.console}</ListItemText>\n          </ListItem>\n          <ListItem>\n            <ListItemIcon>\n              {job.longRun ? <WatchLater /> : <Schedule />}\n            </ListItemIcon>\n            <ListItemText>\n              {snippet.longRun}\n              {!job.longRun && (\n                <span>\n                  &nbsp;\n                  <Tooltip title=\"Project administrators may request longer duration runs by contacting support@openfn.org\">\n                    <HelpIcon fontSize=\"inherit\" />\n                  </Tooltip>\n                </span>\n              )}\n            </ListItemText>\n          </ListItem>\n          {/* <ListItem>\n              <ListItemIcon>\n                {job.testMode ? <CancelScheduleSendIcon /> : <SendIcon />}\n              </ListItemIcon>\n              <ListItemText>{snippet.testMode}</ListItemText>\n            </ListItem> */}\n        </List>\n        <AceEditor\n          onLoad={editor => setupEditor(editor)}\n          name=\"editor\"\n          className=\"rounded\"\n          mode=\"javascript\"\n          editorProps={{ $blockScrolling: Infinity }}\n          theme={userTheme || theme.palette.codeEditor}\n          width=\"100%\"\n          minLines={3}\n          maxLines={1000}\n          readOnly\n          tabSize={2}\n          value={job.expression}\n          ref={codeEditor}\n        />\n        <Accordion>\n          <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n            <div className={classes.column}>\n              <Typography className={classes.heading}>\n                View Change History\n              </Typography>\n            </div>\n            <div className={classes.column}>\n              <Typography className={classes.secondaryHeading}>\n                Revert via Github\n              </Typography>\n            </div>\n          </AccordionSummary>\n          <AccordionDetails>\n            <Grid container direction=\"column\">\n              <Grid item>\n                <Table hover=\"true\">\n                  <TableHead>\n                    <TableRow>\n                      <TableCell>Timestamp</TableCell>\n                      <TableCell>Type</TableCell>\n                      <TableCell>\n                        Revert by SHA-1\n                        <Tooltip title=\"For jobs managed with GitHub, selecting a commit below will revert this job to its prior state.\">\n                          <HelpIcon fontSize=\"inherit\" />\n                        </Tooltip>\n                      </TableCell>\n                    </TableRow>\n                  </TableHead>\n                  <TableBody>\n                    {job.events &&\n                      job.events\n                        .slice(\n                          (state.currentPage - 1) * state.numberPerPage,\n                          state.currentPage * state.numberPerPage\n                        )\n                        .map(e => (\n                          <TableRow hover=\"true\" id={e.id} key={e.id}>\n                            <TableCell>{e.timestamp}</TableCell>\n                            <TableCell>\n                              {e.eventType === 'github' ? (\n                                <div>\n                                  GitHub <i className=\"fab fa-github\" />\n                                </div>\n                              ) : (\n                                <div>\n                                  Browser <i className=\"fas fa-edit\" />\n                                </div>\n                              )}\n                            </TableCell>\n                            <TableCell>\n                              {e.eventId ? (\n                                <Button onClick={() => showRevertModal(e)}>\n                                  {e.commitSha}\n                                </Button>\n                              ) : (\n                                editors[e.userId]\n                              )}\n                            </TableCell>\n                          </TableRow>\n                        ))}\n                  </TableBody>\n                </Table>\n              </Grid>\n              <Grid item>\n                {job.events && (\n                  <PaginationControls\n                    className={classes.paginationControls}\n                    numberPerPage={state.numberPerPage}\n                    totalPages={Math.ceil(\n                      job.events ? job.events.length / state.numberPerPage : 0\n                    )}\n                    currentPage={state.currentPage}\n                    onChange={filterChanged}\n                  />\n                )}\n              </Grid>\n            </Grid>\n          </AccordionDetails>\n        </Accordion>\n      </Card>\n      {ArchiveModal}\n      {RevertModal}\n      {ClearStateModal}\n    </OneCardHolder>\n  );\n}\n\nJobView.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n};\n\nexport default JobView;\n","import { camelizeKeys } from 'humps';\nimport { normalize, schema } from 'normalizr';\nimport { projectFilesApiPath } from '../helpers/actionsPathHelpers';\nimport { ProjectFile } from '../schemas';\nimport { get } from './BaseClient';\n\nexport function getProjectFiles(project) {\n  return new Promise((resolve, reject) => {\n    get(projectFilesApiPath(), { project_id: project.id })\n      .then(async response => {\n        const data = await response.json();\n        const payload = normalize(\n          camelizeKeys(data),\n          new schema.Array(ProjectFile)\n        );\n        resolve(payload);\n      })\n      .catch(error => {\n        reject(error);\n      });\n  });\n}\n","import React, { useEffect, useMemo } from 'react';\nimport {\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  IconButton,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  Tooltip,\n  Typography,\n} from '@material-ui/core';\nimport {\n  CloudDownload as CloudDownloadIcon,\n  Link as LinkIcon,\n} from '@material-ui/icons';\nimport { formatDistanceStrict, fromUnixTime } from 'date-fns';\nimport { isEqual, orderBy, values } from 'lodash';\nimport { useSelector, useDispatch } from 'react-redux';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport 'react-credit-cards/es/styles-compiled.css';\nimport PropTypes from 'prop-types';\nimport { switchedMenu } from '../actions/MenuActions';\nimport { fetchProjectFiles } from '../actions/ProjectFilesActions';\nimport { fetchProjectUsers } from '../actions/ProjectUserActions';\nimport { calendarTime, formatBytes } from '../helpers';\nimport { selectCurrentUser } from '../selectors';\nimport Loader from './Loader';\nimport OneCardHolder from './OneCardHolder';\n\nfunction ProjectFilesList({ selectedProject }) {\n  const dispatch = useDispatch();\n\n  const allProjectUsers = useSelector(\n    state => state.projectUsers.items,\n    isEqual\n  );\n\n  const projectUsers = useMemo(\n    () => Object.keys(allProjectUsers).map(id => allProjectUsers[id]),\n    [allProjectUsers]\n  );\n\n  const projectFilesLoading = useSelector(\n    state => state.projectFiles.isLoading\n  );\n\n  const currentUser = useSelector(selectCurrentUser, isEqual);\n\n  const isLoading = !currentUser || projectFilesLoading;\n\n  const allProjectFiles = useSelector(\n    state => state.projectFiles.items,\n    isEqual\n  );\n\n  const projectFiles = useMemo(\n    () => orderBy(values(allProjectFiles), 'expiresAt', 'asc'),\n    [allProjectFiles]\n  );\n\n  useEffect(() => {\n    document.title = 'Downloads - OpenFn';\n    dispatch(switchedMenu('Downloads'));\n  }, [dispatch]);\n\n  useEffect(() => {\n    if (selectedProject) {\n      dispatch(fetchProjectUsers(selectedProject));\n      dispatch(fetchProjectFiles(selectedProject));\n    }\n  }, [selectedProject, dispatch]);\n\n  if (isLoading) {\n    return <Loader item=\"downloads\" />;\n  }\n\n  return (\n    <OneCardHolder full>\n      <Card>\n        <CardHeader\n          title=\"Exported Activity and Archives\"\n          subheader={selectedProject.name}\n        />\n        <CardContent>\n          <Table>\n            <TableHead>\n              <TableRow>\n                <TableCell>Created</TableCell>\n                <TableCell>Expires</TableCell>\n                <TableCell>Author</TableCell>\n                <TableCell>Name</TableCell>\n                <TableCell>Size</TableCell>\n                <TableCell>Download</TableCell>\n                <TableCell>Copy Link</TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {projectFiles.length === 0 && (\n                <TableRow>\n                  <TableCell colSpan={7}>\n                    <Typography>\n                      No activity exports or archives have been created for this\n                      project.\n                    </Typography>\n                  </TableCell>\n                </TableRow>\n              )}\n              {projectFiles.map(x => {\n                const projectUser = projectUsers.find(\n                  pu => pu.user.id === x.userId\n                );\n                return (\n                  <TableRow hover key={x.id}>\n                    <TableCell>{calendarTime(x.createdAt)}</TableCell>\n                    <TableCell>\n                      {formatDistanceStrict(new Date(x.expiresAt), new Date())}\n                    </TableCell>\n                    <TableCell>\n                      {(projectUser && projectUser.user.email) || '- -'}\n                    </TableCell>\n                    <TableCell>{x.name}</TableCell>\n                    <TableCell>{formatBytes(x.size)}</TableCell>\n                    <TableCell>\n                      <Button href={x.url}>\n                        <CloudDownloadIcon />\n                      </Button>\n                    </TableCell>\n                    <TableCell>\n                      <CopyToClipboard text={x.url}>\n                        <Tooltip\n                          id=\"tooltip-fab\"\n                          title={`This link is valid until ${fromUnixTime(\n                            x.linkExpiry\n                          )}.`}\n                        >\n                          <IconButton>\n                            <LinkIcon />\n                          </IconButton>\n                        </Tooltip>\n                      </CopyToClipboard>\n                    </TableCell>\n                  </TableRow>\n                );\n              })}\n            </TableBody>\n          </Table>\n          <br />\n          <Typography variant=\"body2\">\n            N.B.: Exports are stored for 24 hours. Archives are stored for 1\n            year. All download links are signed and become invalid after 24\n            hours. Once the download link for an archive has expired, refresh\n            this page to generate a new one.\n          </Typography>\n        </CardContent>\n      </Card>\n    </OneCardHolder>\n  );\n}\n\nProjectFilesList.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n};\n\nexport default ProjectFilesList;\n","import { getProjectFiles } from '../clients/ProjectFilesClient';\nimport {\n    FAILED_PROJECT_FILES, RECEIVED_PROJECT_FILES, REQUESTED_PROJECT_FILES\n} from '../constants';\n\n\nexport function fetchProjectFiles(project) {\n  return {\n    promise: getProjectFiles(project),\n    types: [\n      REQUESTED_PROJECT_FILES,\n      RECEIVED_PROJECT_FILES,\n      FAILED_PROJECT_FILES,\n    ],\n  };\n}","import Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Typography from '@material-ui/core/Typography';\nimport PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport { calendarTime } from '../../helpers';\n\nclass ConfirmChangeModal extends PureComponent {\n  render() {\n    const {\n      show,\n      confirmChange,\n      previousPlan,\n      proposedPlan,\n      selectedProject,\n      blockDowngradeForJobs,\n      blockDowngradeForCollabs,\n      onClose,\n    } = this.props;\n\n    const upgrade = previousPlan.price < proposedPlan.price;\n\n    if (blockDowngradeForJobs) {\n      return (\n        <Dialog open={show} onClose={onClose}>\n          <DialogTitle>\n            Jobs must be deactivated before downgrading.\n          </DialogTitle>\n          <DialogContent>\n            <Typography component=\"p\">\n              You currently have too many active jobs to downgrade.\n              <br />\n              <br />\n              You must deactivate those jobs which you no longer need before you\n              can mark this project for a downgrade at the end of your billing\n              cycle.\n            </Typography>\n          </DialogContent>\n          <DialogActions>\n            <Button onClick={onClose}>Back</Button>\n          </DialogActions>\n        </Dialog>\n      );\n    }\n\n    if (blockDowngradeForCollabs) {\n      return (\n        <Dialog open={show} onClose={onClose}>\n          <DialogTitle>\n            Collaborators must be removed before downgrading.\n          </DialogTitle>\n          <DialogContent>\n            <Typography component=\"p\">\n              You currently have too many collaborators to downgrade.\n              <br />\n              <br />\n              You must remove those collaborators who are are no longer\n              necessary before you can mark this project for a downgrade at the\n              end of your billing cycle.\n            </Typography>\n          </DialogContent>\n          <DialogActions>\n            <Button onClick={onClose}>Back</Button>\n          </DialogActions>\n        </Dialog>\n      );\n    }\n\n    return (\n      <Dialog open={show} onClose={onClose}>\n        <DialogTitle>Confirm {upgrade ? 'Upgrade' : 'Downgrade'}</DialogTitle>\n        <DialogContent>\n          <Typography component=\"p\">\n            Changing from {previousPlan.name} (${previousPlan.price / 100}/mo.)\n            to{' '}\n            <b>\n              {proposedPlan.name} (${proposedPlan.price / 100}/mo.)\n            </b>\n            {upgrade\n              ? ` This project's limits will increase immediately to\n              ${proposedPlan.jobLimit} active jobs and\n              ${proposedPlan.submissionLimit} job runs. You will be billed the\n              difference ($${(proposedPlan.price - previousPlan.price) / 100})\n              today and $${proposedPlan.price / 100} starting on\n              ${calendarTime(selectedProject.billingPeriodEnd)}.`\n              : `This project will remain on its current plan until the end of its\n              billing cycle, at which point it will be limited to\n              ${proposedPlan.jobLimit} active\n              job${proposedPlan.jobLimit > 1 ? 's' : ''} and\n              ${proposedPlan.submissionLimit} job runs and you will be billed\n              $${proposedPlan.price / 100}\n              ($${(previousPlan.price - proposedPlan.price) / 100} less than\n              this month's bill).`}\n          </Typography>\n        </DialogContent>\n        <DialogActions>\n          <Button color=\"primary\" onClick={onClose}>\n            Cancel\n          </Button>\n          <Button color=\"primary\" onClick={confirmChange}>\n            Confirm{' '}\n            {upgrade\n              ? 'upgrade & charge credit card'\n              : 'downgrade for next billing cycle'}\n          </Button>\n        </DialogActions>\n      </Dialog>\n    );\n  }\n}\n\nConfirmChangeModal.propTypes = {\n  show: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  confirmChange: PropTypes.func.isRequired,\n  proposedPlan: PropTypes.object.isRequired,\n  previousPlan: PropTypes.object.isRequired,\n};\n\nexport default ConfirmChangeModal;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Typography from '@material-ui/core/Typography';\n\nfunction ExportProjectConfigModal(props) {\n  const { show, onClose, exportYaml, exportLightning, project } = props;\n\n  return (\n    <Dialog open={show} onClose={onClose} maxWidth=\"lg\">\n      <DialogTitle>Export Project Configuration</DialogTitle>\n      <DialogContent>\n        <Typography>\n          There are two options for exporting <b>{project.name}</b>.\n          <ul>\n            <li>\n              Exporting for <b>v1</b> will provide you with a YAML file that can\n              be used to run this project with OpenFn/engine,\n              OpenFn/microservice, or for use in <em>another</em> v1 space.\n            </li>\n            <li>\n              Exporting for <b>v2</b> will provide you with an Lightning\n              compatible <code>project.yaml</code> that you can use to deploy to\n              a Lightning server. Use this if you are migrating from v1 to v2.\n            </li>\n          </ul>\n          In either cases, your project export will be built asynchronously and\n          you will receive an email with download link when it is done. Your v1\n          project (here, on the platform) will not be modified in any way.\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={onClose}>Cancel</Button>\n        <Button\n          color=\"secondary\"\n          variant=\"contained\"\n          onClick={() => exportYaml(project)}\n        >\n          Export for v1\n        </Button>\n        <Button\n          color=\"primary\"\n          variant=\"contained\"\n          onClick={() => exportLightning(project)}\n        >\n          Export for v2 (migrate)\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n}\n\nExportProjectConfigModal.propTypes = {\n  show: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  exportYaml: PropTypes.func.isRequired,\n  exportLightning: PropTypes.func.isRequired,\n  project: PropTypes.object.isRequired,\n};\n\nexport default React.memo(ExportProjectConfigModal);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Typography,\n  Hidden,\n  Button,\n  DialogContentText,\n} from '@material-ui/core';\nimport { Field, Form } from 'react-final-form';\nimport { FORM_ERROR } from 'final-form';\nimport { CheckCircle } from '@material-ui/icons';\nimport { withStyles } from '@material-ui/core/styles';\nimport { useDispatch } from 'react-redux';\nimport TextInput from '../FormHelpers/TextInput';\nimport FormActions from '../FormActions';\nimport { deleteProject } from '../../actions/ProjectActions';\n\nconst styles = theme => ({\n  projectName: {\n    color: theme.palette.primary.main,\n    fontWeight: 'bold',\n  },\n  check: {\n    color: theme.palette.success.main,\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n});\n\nfunction DeleteProjectModal(props) {\n  const { show, onClose, project, classes } = props;\n\n  const dispatch = useDispatch();\n\n  const validate = values => {\n    const errors = {};\n    if (!values.projectName) {\n      errors.projectName = 'Required';\n    }\n    if (values.projectName !== project.name) {\n      errors.projectName = 'Please enter the name of your project';\n    }\n    return errors;\n  };\n\n  const submit = async () => {\n    return new Promise(resolve => {\n      dispatch(deleteProject(project.slug))\n        .then(_ => resolve())\n        .catch(_ => {\n          resolve({\n            [FORM_ERROR]:\n              'We encountered an error while deleting your project. Please try again.',\n          });\n        });\n    });\n  };\n\n  return (\n    <Dialog open={show} onClose={onClose}>\n      <Form\n        onSubmit={submit}\n        validate={validate}\n        render={({ handleSubmit, submitError, submitSucceeded, form }) => (\n          <>\n            <DialogTitle>\n              {submitSucceeded\n                ? 'Project scheduled for deletion.'\n                : `Do you want to delete ${project.name}?`}\n            </DialogTitle>\n            <DialogContent>\n              {submitSucceeded && (\n                <>\n                  <CheckCircle className={classes.check} />\n                  <DialogContentText>\n                    {project.name} has been successfully scheduled for deletion.\n                    We have sent you an email with details.\n                  </DialogContentText>\n                </>\n              )}\n              <Hidden xsUp={submitSucceeded}>\n                <Typography>\n                  Deleting a project will remove all associated jobs, triggers,\n                  messages, and runs. To delete this project please confirm your\n                  intent by typing the name of the project below.\n                </Typography>\n                <form onSubmit={handleSubmit} id=\"jira-ticket-form\">\n                  <Field\n                    name=\"projectName\"\n                    label=\"Project Name\"\n                    component={TextInput}\n                    type=\"text\"\n                    placeholder={project.name}\n                  />\n                </form>\n                {submitError && (\n                  <div className={classes.error}>{submitError}</div>\n                )}\n              </Hidden>\n            </DialogContent>\n            <DialogActions>\n              {submitSucceeded ? (\n                <Button onClick={onClose}>Close</Button>\n              ) : (\n                <FormActions\n                  cancel={onClose}\n                  reset={form.reset}\n                  submit={handleSubmit}\n                  form={form}\n                  submitText=\"Delete\"\n                />\n              )}\n            </DialogActions>\n          </>\n        )}\n      />\n    </Dialog>\n  );\n}\n\nDeleteProjectModal.propTypes = {\n  show: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  project: PropTypes.object.isRequired,\n  classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles, { withTheme: true })(\n  React.memo(DeleteProjectModal)\n);\n","import React from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport { makeStyles, CardContent, Slider } from '@material-ui/core';\nimport PropTypes from 'prop-types';\n\nconst useStyles = makeStyles(theme => ({\n  contentArea: {\n    marginRight: theme.spacing(1),\n    marginLeft: theme.spacing(1),\n  },\n}));\n\nconst PlanSlider = withStyles({\n  root: {\n    height: 8,\n    width: '90%',\n  },\n  mark: {\n    height: 8,\n    width: 2,\n  },\n  thumb: {\n    height: 24,\n    width: 24,\n    backgroundColor: '#fff',\n    border: '2px solid currentColor',\n    marginTop: -8,\n    marginLeft: -12,\n    '&:focus,&:hover,&$active': {\n      boxShadow: 'inherit',\n    },\n  },\n  active: {},\n  track: {\n    height: 8,\n  },\n  rail: {\n    height: 8,\n  },\n})(Slider);\n\nconst marks = [\n  { value: 1, label: 'Free' },\n  { value: 2, label: 'Solo' },\n  { value: 3, label: 'Startup' },\n  { value: 4, label: 'Growth' },\n  { value: 5, label: 'Enterprise' },\n];\n\nfunction PlanChangeForm({ plans, input }) {\n  const classes = useStyles();\n  return (\n    <CardContent classes={classes.slider}>\n      <PlanSlider\n        aria-label=\"pretto slider\"\n        valueLabelDisplay=\"off\"\n        min={1}\n        max={5}\n        step={1}\n        marks={marks}\n        value={input.value}\n        onChange={(event, newValue) => {\n          input.onChange(newValue);\n        }}\n        plan={plans.value}\n      />\n    </CardContent>\n  );\n}\n\nPlanChangeForm.propTypes = {\n  plans: PropTypes.object.isRequired,\n  input: PropTypes.object.isRequired,\n};\n\nexport default React.memo(PlanChangeForm);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Typography,\n  Hidden,\n  Button,\n  DialogContentText,\n} from '@material-ui/core';\nimport { Field, Form } from 'react-final-form';\nimport { FORM_ERROR } from 'final-form';\nimport { CheckCircle } from '@material-ui/icons';\nimport { withStyles } from '@material-ui/core/styles';\nimport { useDispatch } from 'react-redux';\nimport { formatDistanceToNow } from 'date-fns';\nimport TextInput from '../FormHelpers/TextInput';\nimport FormActions from '../FormActions';\nimport { cancelDeletion } from '../../actions/ProjectActions';\n\nconst styles = theme => ({\n  projectName: {\n    color: theme.palette.primary.main,\n    fontWeight: 'bold',\n  },\n  check: {\n    color: theme.palette.success.main,\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n});\n\nfunction CancelProjectDeletionModal(props) {\n  const { show, onClose, project, classes } = props;\n\n  const dispatch = useDispatch();\n\n  const validate = values => {\n    const errors = {};\n    if (!values.projectName) {\n      errors.projectName = 'Required';\n    }\n    if (values.projectName !== project.name) {\n      errors.projectName = 'Please enter the name of your project';\n    }\n    return errors;\n  };\n\n  const submit = async () => {\n    return new Promise(resolve => {\n      dispatch(cancelDeletion(project.slug))\n        .then(_ => resolve())\n        .catch(_ => {\n          resolve({\n            [FORM_ERROR]:\n              'We encountered an error while aborting the deletion of your project. Please try again or contact the administrator.',\n          });\n        });\n    });\n  };\n\n  return (\n    <Dialog open={show} onClose={onClose}>\n      <Form\n        onSubmit={submit}\n        validate={validate}\n        render={({ handleSubmit, submitError, submitSucceeded, form }) => (\n          <>\n            <DialogTitle>\n              {submitSucceeded\n                ? 'Project deletion aborted.'\n                : `Abort the deletion of ${project.name}?`}\n            </DialogTitle>\n            <DialogContent>\n              {submitSucceeded && (\n                <>\n                  <CheckCircle className={classes.check} />\n                  <DialogContentText>\n                    The deletion of {project.name} has been aborted.\n                  </DialogContentText>\n                </>\n              )}\n              <Hidden xsUp={submitSucceeded}>\n                <Typography>\n                  This project has been scheduled for deletion in{' '}\n                  {formatDistanceToNow(new Date(project.scheduledDeletion))}. To\n                  abort deletion please type the name of the project below and\n                  press submit.\n                </Typography>\n                <form onSubmit={handleSubmit} id=\"jira-ticket-form\">\n                  <Field\n                    name=\"projectName\"\n                    label=\"Project Name\"\n                    component={TextInput}\n                    type=\"text\"\n                    placeholder={project.name}\n                  />\n                </form>\n                {submitError && (\n                  <div className={classes.error}>{submitError}</div>\n                )}\n              </Hidden>\n            </DialogContent>\n            <DialogActions>\n              {submitSucceeded ? (\n                <Button onClick={onClose}>Close</Button>\n              ) : (\n                <FormActions\n                  cancel={onClose}\n                  reset={form.reset}\n                  submit={handleSubmit}\n                  form={form}\n                  submitText=\"Restore\"\n                />\n              )}\n            </DialogActions>\n          </>\n        )}\n      />\n    </Dialog>\n  );\n}\n\nCancelProjectDeletionModal.propTypes = {\n  show: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  project: PropTypes.object.isRequired,\n  classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles, { withTheme: true })(\n  React.memo(CancelProjectDeletionModal)\n);\n","import {\n  Avatar,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Checkbox,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  FormHelperText,\n  Grid,\n  IconButton,\n  LinearProgress,\n  Menu,\n  MenuItem,\n  Slider,\n  Tooltip,\n  Typography,\n} from '@material-ui/core';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport {\n  Cancel,\n  CloudDownload,\n  DeleteForever,\n  Help,\n  Help as HelpIcon,\n  LocalLibrary,\n  LocalLibraryOutlined,\n  MoreVert as MoreVertIcon,\n  SettingsSharp as SettingsIcon,\n  Visibility as VisibilityIcon,\n  VisibilityOff as VisibilityOffIcon,\n} from '@material-ui/icons';\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { Field, Form } from 'react-final-form';\nimport { OnChange } from 'react-final-form-listeners';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport {\n  Legend,\n  ResponsiveContainer,\n  Scatter,\n  ScatterChart,\n  Tooltip as ChartTooltip,\n  XAxis,\n  YAxis,\n} from 'recharts';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport clsx from 'clsx';\nimport { changeRejected, confirmChange } from '../actions/BillingActions';\nimport { fetchProjectRepoConnection } from '../actions/ProjectRepoConnectionActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport { fetchPlans } from '../actions/PlanActions';\nimport {\n  exportProject,\n  fetchProjectBySlug,\n  togglePublic,\n  updateProject,\n} from '../actions/ProjectActions';\nimport { getCurrentUser } from '../actions/SessionActions';\nimport { fetchUsageCount } from '../actions/UsageCountActions';\nimport {\n  calendarTime,\n  clickEvent,\n  copiedToClipboard,\n  createFormErrors,\n  duration,\n  linkTo,\n  slugify,\n  slugRule,\n} from '../helpers';\nimport {\n  billingPath,\n  projectAccessPath,\n  projectProjectRepoConnectionsPath,\n  projectPath,\n  projectUsagePath,\n} from '../helpers/pathHelpers';\nimport { selectCurrentUser, selectUsageDetails } from '../selectors';\nimport TextInput from './FormHelpers/TextInput';\nimport Link from './Link';\nimport OneCardHolder from './OneCardHolder';\nimport ConfirmChangeModal from './ProjectSettings/ConfirmChangeModal';\nimport ExportProjectConfigModal from './ProjectSettings/ExportProjectConfigModal';\nimport DeleteProjectModal from './ProjectSettings/DeleteProjectModal';\nimport PlanChangeForm from './ProjectSettings/PlanChangeForm';\nimport { UnprocessableEntity } from '../errors';\nimport CancelProjectDeletionModal from './ProjectSettings/CancelProjectDeletionModal';\n\nconst useStyles = makeStyles(theme => ({\n  centered: {\n    textAlign: 'center',\n  },\n  text: {\n    width: '100%',\n  },\n  link: {\n    textDecoration: 'none',\n  },\n  usage: {\n    height: 8,\n  },\n  success: {\n    color: theme.palette.success.main,\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n  chart: {\n    backgroundColor: theme.palette.grey[200],\n    fontFamily: theme.typography.fontFamily,\n  },\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  slug: {\n    marginTop: theme.spacing(1.5),\n  },\n  newSlug: {\n    color: theme.palette.error.main,\n  },\n}));\n\nconst validate = values => {\n  const errors = {};\n  if (!values.name) {\n    errors.name = 'Required';\n  }\n  if (slugRule(values.name)) errors.name = slugRule(values.name);\n  return errors;\n};\n\nfunction ProjectSettings({ selectedProject }) {\n  const history = useHistory();\n  const classes = useStyles();\n  const theme = useTheme();\n  const dispatch = useDispatch();\n  const [changeModalShow, setChangeModalShow] = useState(false);\n  const [anchorEl, setAnchorEl] = useState(null);\n  const [addressHidden, setAddressHidden] = useState(true);\n  const [exportModalShow, setExportModalShow] = useState(false);\n  const [deleteModalShow, setDeleteModalShow] = useState(false);\n  const [cancelProjectDeletionModalShow, setCancelProjectDeletionModalShow] =\n    useState(false);\n  const [showPublicModal, setShowPublicModal] = useState(false);\n\n  const { isLoading, isChanging } = useSelector(state => state.projects);\n\n  const projectId = selectedProject.id;\n\n  const selectedProjectPlanId = selectedProject.planId;\n\n  const { userRole } = selectedProject;\n\n  const jobs = useSelector(state => state.jobs.items || []);\n\n  const usageCount = useSelector(\n    state => state.projects.usageCounts[projectId] || {}\n  );\n  const allProjectUsers = useSelector(state => state.projectUsers.items);\n  const collaborators = Object.keys(allProjectUsers).map(\n    id => allProjectUsers[id]\n  );\n\n  const [selectedPlanId, setSelectedPlanId] = useState(null);\n  const plans = useSelector(state => state.plans.items);\n  const nextPlan = plans[selectedProject.nextPlanId];\n  const selectedPlan = plans[selectedPlanId];\n  const currentPlan = plans[selectedProject.planId] || {};\n  const plan = selectedPlan || currentPlan;\n  const days = plan.billingPeriod === 'monthly' ? 31 : 365;\n  const usageDetails = useMemo(\n    () => selectUsageDetails(usageCount, plan, jobs),\n    [usageCount, plan, jobs]\n  );\n  const { runsInPeriod } = usageDetails;\n\n  const percentDone = (\n    (days -\n      duration(\n        new Date(selectedProject.billingPeriodEnd),\n        new Date(),\n        'days'\n      )) /\n    days\n  ).toFixed(2);\n\n  const pastDue = percentDone > 1;\n  const limit = plan.submissionLimit;\n  const trajectory = runsInPeriod / percentDone;\n  const planLine = [\n    { x: 0, y: 0 },\n    { x: 100, y: limit },\n  ];\n  const pace = [\n    { x: 0, y: 0 },\n    { x: percentDone * 100, y: runsInPeriod },\n    { x: 100, y: trajectory.toFixed(0) },\n  ];\n  const safe = trajectory.toFixed(0) < limit * 0.9;\n  const paceFill = safe\n    ? theme.palette.success.light\n    : theme.palette.error.main;\n  const pacePercent = trajectory / limit;\n\n  const user = useSelector(selectCurrentUser);\n\n  const submit = async values => {\n    try {\n      const response = await dispatch(updateProject(values));\n      history.push(projectPath(response.entities.projects[response.result]));\n    } catch (error) {\n      if (error instanceof UnprocessableEntity) {\n        return createFormErrors(error.errors, values);\n      }\n\n      return error;\n    }\n  };\n\n  const baseInboxUrl = `${window.location.protocol}//${window.location.hostname}/inbox/`;\n\n  const hideExportModal = () => {\n    setExportModalShow(false);\n  };\n\n  const handleYaml = project => {\n    dispatch(exportProject(project, 'yaml'));\n    hideExportModal();\n  };\n\n  const handleZip = project => {\n    dispatch(exportProject(project, 'microservice'));\n    hideExportModal();\n  };\n\n  const handleLightning = project => {\n    dispatch(exportProject(project, 'lightning'));\n    hideExportModal();\n  };\n\n  const showChangeModal = () => {\n    if (userRole === 'owner') {\n      setChangeModalShow(true);\n    }\n  };\n\n  const handleTogglePublic = project => {\n    dispatch(togglePublic(project));\n    setShowPublicModal(false);\n  };\n\n  const handleToggle = project => () => {\n    if (project.public) {\n      dispatch(togglePublic(project));\n      setShowPublicModal(false);\n    } else {\n      setShowPublicModal(true);\n    }\n  };\n\n  useEffect(() => {\n    document.title = 'Project Settings - OpenFn';\n    dispatch(switchedMenu('Project Settings'));\n    dispatch(getCurrentUser());\n    dispatch(fetchPlans());\n  }, [dispatch]);\n\n  useEffect(() => {\n    if (selectedProject) {\n      dispatch(fetchProjectBySlug(selectedProject.slug));\n      dispatch(fetchUsageCount(selectedProject));\n    }\n  }, [selectedProject, dispatch]);\n\n  useEffect(() => {\n    dispatch(fetchProjectRepoConnection(selectedProject));\n  }, [selectedProject, dispatch]);\n\n  useEffect(() => {\n    if (selectedProjectPlanId) setSelectedPlanId(selectedProjectPlanId);\n  }, [selectedProjectPlanId]);\n\n  if (isLoading || isChanging || !selectedPlan) {\n    return (\n      <Grid container justifyContent=\"center\">\n        <Grid xs={12} sm={6} item>\n          <Card className={classes.centered}>\n            <CardContent>\n              {isLoading || !selectedPlan ? (\n                <Typography variant=\"subtitle1\">\n                  Loading project information...\n                </Typography>\n              ) : (\n                <Typography>\n                  We are securely communicating with our payment processor.\n                  Please sit tight.\n                </Typography>\n              )}\n              <br />\n              <LinearProgress />\n            </CardContent>\n          </Card>\n        </Grid>\n      </Grid>\n    );\n  }\n\n  const PublicModal = (\n    <Dialog open={showPublicModal} onClose={() => setShowPublicModal(false)}>\n      <DialogTitle>Contribute to the job library</DialogTitle>\n      <DialogContent>\n        <Typography>\n          The OpenFn{' '}\n          <a\n            href=\"https://docs.openfn.org/library\"\n            target=\"blank\"\n            link=\"noopener noreferrer\"\n          >\n            Job Library\n          </a>{' '}\n          is a project supported by the OpenFn community. It's a collection of\n          open-source job code from projects across ICT4D. You will always able\n          to browse the library so that writing jobs is faster and easier, but\n          by enabling library contributions for this project, jobs not marked as\n          \"private\" will also be published to the library.\n        </Typography>\n        <br />\n        <Typography>\n          <b>\n            Data from messages or runs are <em>NEVER</em> shared.\n          </b>{' '}\n          Your job expressions (which most OpenFn users already keep in public\n          repositories on GitHub) and other non-sensitive metadata (e.g.,\n          adaptor and version, created/updated dates) will be made searchable to\n          help other organizations and governments write jobs more quickly and\n          easily if you enable this setting.\n        </Typography>\n        <br />\n        <Typography>\n          <b>\n            Would you like to share job code for non-private jobs with the\n            community?\n          </b>\n        </Typography>\n      </DialogContent>\n      {userRole && (\n        <DialogActions>\n          <Button onClick={() => setShowPublicModal(false)}>No.</Button>\n          <Button\n            variant=\"contained\"\n            color=\"primary\"\n            disabled={!userRole}\n            id=\"support_button\"\n            onClick={() => handleTogglePublic(selectedProject)}\n          >\n            Yes, contribute to the job library.\n          </Button>\n        </DialogActions>\n      )}\n      {!userRole && (\n        <DialogContent>\n          <Typography>\n            Contact your project administrator; they can enable sharing.\n          </Typography>\n          <br />\n        </DialogContent>\n      )}\n    </Dialog>\n  );\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      initialValues={selectedProject}\n      render={({\n        form,\n        pristine,\n        submitting,\n        handleSubmit,\n        values,\n\n        hasValidationErrors,\n        hasSubmitErrors,\n        modifiedSinceLastSubmit,\n      }) => (\n        <OneCardHolder wide>\n          <Card>\n            <CardHeader\n              title=\"Project Configuration\"\n              subheader={\n                <div>\n                  {selectedProject.name}&nbsp;\n                  <code style={{ fontSize: 10 }}>{selectedProject.id}</code>\n                </div>\n              }\n              avatar={\n                <Avatar className={classes.avatar}>\n                  <SettingsIcon />\n                </Avatar>\n              }\n              action={\n                <div>\n                  <Tooltip\n                    title={\n                      !userRole && selectedProject.public\n                        ? 'Only administrators can withdraw from the OpenFn Job Library.'\n                        : ''\n                    }\n                  >\n                    <span>\n                      <Tooltip\n                        title={\n                          selectedProject.public\n                            ? 'Remove all jobs from the Job Library'\n                            : 'Job Library sharing'\n                        }\n                      >\n                        <Checkbox\n                          icon={<LocalLibraryOutlined />}\n                          checkedIcon={<LocalLibrary />}\n                          color=\"primary\"\n                          checked={selectedProject.public}\n                          disabled={!userRole && selectedProject.public}\n                          onChange={handleToggle(selectedProject)}\n                          value={selectedProject.public}\n                        />\n                      </Tooltip>\n                    </span>\n                  </Tooltip>\n                  <IconButton\n                    aria-owns={anchorEl ? 'simple-menu' : null}\n                    aria-haspopup=\"true\"\n                    onClick={event => setAnchorEl(event.currentTarget)}\n                  >\n                    <MoreVertIcon />\n                  </IconButton>\n                  <Menu\n                    id=\"simple-menu\"\n                    anchorEl={anchorEl}\n                    open={Boolean(anchorEl)}\n                    onClose={() => setAnchorEl(null)}\n                  >\n                    <MenuItem\n                      onClick={linkTo(\n                        projectProjectRepoConnectionsPath(selectedProject),\n                        history\n                      )}\n                    >\n                      Manage Version Control\n                    </MenuItem>\n                    <MenuItem\n                      onClick={linkTo(\n                        projectAccessPath(selectedProject),\n                        history\n                      )}\n                    >\n                      Manage Access & Security\n                    </MenuItem>\n                    <Link\n                      href={`mailto:billing@openfn.org?subject=Transfer ownership for ${selectedProject.name} (${projectId})`}\n                      text={\n                        <Tooltip\n                          placement=\"bottom\"\n                          title=\"Request to transfer ownership of this project to another user.\"\n                        >\n                          <MenuItem\n                            disabled={!userRole}\n                            id=\"transfer_ownership\"\n                            onClick={() =>\n                              clickEvent(\n                                'Security',\n                                'Contact',\n                                'Transfer Ownership'\n                              )\n                            }\n                          >\n                            Transfer Ownership\n                          </MenuItem>\n                        </Tooltip>\n                      }\n                    />\n                  </Menu>\n                </div>\n              }\n            />\n            <CardContent>\n              {!userRole && (\n                <Typography>\n                  Only owners and designated admins can update the project\n                  configuration.\n                </Typography>\n              )}\n              <Grid\n                container\n                spacing={3}\n                direction=\"row\"\n                justifyContent=\"center\"\n              >\n                <Grid item xs={12}>\n                  <Field\n                    component={TextInput}\n                    className={classes.text}\n                    label=\"Project Name\"\n                    id=\"project-name\"\n                    type=\"text\"\n                    disabled={!userRole}\n                    placeholder=\"Enter the name of the project.\"\n                    name=\"name\"\n                  />\n                  <FormHelperText\n                    className={clsx(\n                      classes.slug,\n                      selectedProject.slug !== slugify(values.name) &&\n                        classes.newSlug\n                    )}\n                  >\n                    <code>{slugify(values.name) || 'invalid slug'}</code>{' '}\n                    <Tooltip\n                      title=\"Changing your project name will update the\n                    URL and, after a 60-day deprecation period, will break\n                    bookmarks or old links to this project. It won't affect your\n                    inbox URL, but may impact users with lots of old run or\n                    message links saved offline.\"\n                    >\n                      <Help fontSize=\"inherit\" />\n                    </Tooltip>\n                  </FormHelperText>\n                </Grid>\n                <Grid item xs={12}>\n                  <FormHelperText>\n                    Unique Inbox URL:{' '}\n                    <IconButton\n                      size=\"small\"\n                      onClick={() => setAddressHidden(!addressHidden)}\n                    >\n                      {addressHidden ? (\n                        <Tooltip title=\"View unique inbox URL\">\n                          <VisibilityIcon />\n                        </Tooltip>\n                      ) : (\n                        <Tooltip title=\"Hide unique inbox URL\">\n                          <VisibilityOffIcon />\n                        </Tooltip>\n                      )}\n                    </IconButton>{' '}\n                    <CopyToClipboard\n                      onCopy={() => dispatch(copiedToClipboard('Inbox URL'))}\n                      text={`${baseInboxUrl}${selectedProject.address}`}\n                    >\n                      <Tooltip title=\"Copy unique inbox URL for this project\">\n                        <code style={{ cursor: 'pointer' }}>\n                          {!addressHidden\n                            ? `${baseInboxUrl}${selectedProject.address}`\n                            : `${baseInboxUrl}*****`}\n                        </code>\n                      </Tooltip>\n                    </CopyToClipboard>\n                  </FormHelperText>\n                </Grid>\n                <Grid item xs={12}>\n                  <Field\n                    component={TextInput}\n                    className={classes.text}\n                    id=\"project_description\"\n                    type=\"text\"\n                    disabled={!userRole}\n                    placeholder=\"Enter a description for the project.\"\n                    name=\"description\"\n                    label=\"Project Description\"\n                  />\n                </Grid>\n                <Grid item xs={12} sm={6}>\n                  <Typography>\n                    Concurrency @ {values.concurrency}{' '}\n                    <Tooltip\n                      title={\n                        values.concurrency > 1\n                          ? `Up to ${values.concurrency} runs will be executed\n                        simultaneously. Free plans share a single queue and may\n                        notice delays in run processing. Paid plans have\n                        dedicated queues and can adjust their concurrency.`\n                          : `At concurrency \"1\", runs will be processed\n                        one-at-a-time. Each subsequent run will be blocked until\n                        the previous run has completed.`\n                      }\n                    >\n                      <HelpIcon fontSize=\"inherit\" />\n                    </Tooltip>\n                  </Typography>\n                  <Field name=\"concurrency\">\n                    {({ input }) => (\n                      <Slider\n                        min={1}\n                        max={10}\n                        className={classes.url}\n                        value={Number(input.value)}\n                        onChange={(event, newValue) => {\n                          input.onChange(newValue);\n                        }}\n                        disabled={!userRole || values.planId === 1}\n                        name=\"concurrency\"\n                        label=\"Concurrency\"\n                      />\n                    )}\n                  </Field>\n                </Grid>\n                <Grid item xs={12} sm={6}>\n                  <Typography>\n                    Notification Threshold @ {values.notificationThreshold}%{' '}\n                    <Tooltip\n                      title={`Collaborators will receive an email notification\n                    when more than ${values.notificationThreshold}% of this project's allowed\n                    runs have been used in a given billing cycle.`}\n                    >\n                      <HelpIcon fontSize=\"inherit\" />\n                    </Tooltip>\n                  </Typography>\n                  <Field name=\"notificationThreshold\">\n                    {({ input }) => (\n                      <Slider\n                        valueLabelDisplay=\"auto\"\n                        min={1}\n                        max={99}\n                        className={classes.url}\n                        id=\"project_notification_level\"\n                        disabled={!userRole}\n                        value={input.value}\n                        onChange={(event, newValue) => {\n                          input.onChange(newValue);\n                        }}\n                        name=\"notificationThreshold\"\n                        label=\"Notification Level (%)\"\n                      />\n                    )}\n                  </Field>\n                </Grid>\n              </Grid>\n            </CardContent>\n            <CardActions>\n              <Button\n                onClick={form.reset}\n                type=\"button\"\n                disabled={submitting || pristine}\n              >\n                Reset\n              </Button>\n              <Button\n                disabled={\n                  !userRole ||\n                  pristine ||\n                  selectedPlan.id !== currentPlan.id ||\n                  hasValidationErrors ||\n                  (hasSubmitErrors && !modifiedSinceLastSubmit)\n                }\n                onClick={handleSubmit}\n              >\n                {selectedPlan.id !== currentPlan.id\n                  ? 'Plan Change Pending'\n                  : 'Update Project'}\n              </Button>\n              <Button onClick={() => setExportModalShow(true)}>\n                Export Config&nbsp;&nbsp;\n                <CloudDownload fontSize=\"small\" />\n              </Button>\n              <Button\n                onClick={() =>\n                  selectedProject.scheduledDeletion\n                    ? setCancelProjectDeletionModalShow(true)\n                    : setDeleteModalShow(true)\n                }\n              >\n                {selectedProject.scheduledDeletion\n                  ? `Cancel project deletion`\n                  : `Delete project`}\n                &nbsp;&nbsp;\n                {selectedProject.scheduledDeletion ? (\n                  <Cancel fontSize=\"small\" />\n                ) : (\n                  <DeleteForever fontSize=\"small\" />\n                )}\n              </Button>\n            </CardActions>\n          </Card>\n          <br />\n          <Card>\n            <CardHeader\n              title=\"Project Plan\"\n              subheader={`Currently on: ${currentPlan.label}`}\n              avatar={\n                <Avatar className={classes.avatar}>\n                  <SettingsIcon />\n                </Avatar>\n              }\n            />\n            <CardContent>\n              <Typography\n                variant=\"h6\"\n                className={pastDue ? classes.error : null}\n              >\n                Usage and Subscription\n                {pastDue && '*'}\n              </Typography>\n              <br />\n              <Typography>\n                <Button\n                  variant=\"contained\"\n                  color=\"primary\"\n                  onClick={linkTo(projectUsagePath(selectedProject), history)}\n                >\n                  Historical Project Usage\n                </Button>\n              </Typography>\n              <br />\n              <Typography>\n                You have <b>{usageDetails.jobsCount}</b> active job\n                {usageDetails.jobsCount > 1 || usageDetails.jobsCount === 0\n                  ? 's'\n                  : null}{' '}\n                out of {usageDetails.jobLimit} available.\n              </Typography>\n              <Typography>\n                You have executed <b>{usageDetails.runsInPeriod}</b> of{' '}\n                {usageDetails.runLimit} runs available.\n              </Typography>\n              <Typography>\n                You are {(percentDone * 100).toFixed(0)}% through your billing\n                cycle (it {pastDue ? 'ended' : 'ends'}{' '}\n                {calendarTime(selectedProject.billingPeriodEnd)}) and on pace to\n                execute {trajectory.toFixed(0)} runs.\n              </Typography>\n              {!safe ? (\n                <Typography>\n                  You may want to{' '}\n                  <span className={classes.error}>\n                    <b>consider upgrading</b>\n                  </span>{' '}\n                  to ensure that your integrations remain uninterrupted this\n                  cycle.\n                </Typography>\n              ) : (\n                <Typography>\n                  You are currently on pace to consume{' '}\n                  <b>{(pacePercent * 100).toFixed(2)}%</b> of your limit.\n                </Typography>\n              )}\n              {pastDue && (\n                <div>\n                  <br />\n                  <Typography variant=\"subtitle2\" color=\"error\">\n                    *Your billing cycle has not been reset. Please ensure that\n                    your billing card is valid and contact billing@openfn.org\n                    for assistance.\n                  </Typography>\n                </div>\n              )}\n            </CardContent>\n            <ResponsiveContainer\n              width=\"100%\"\n              height={160}\n              className={classes.chart}\n            >\n              <ScatterChart\n                margin={{\n                  top: 20,\n                  right: 40,\n                  bottom: 20,\n                  left: 40,\n                }}\n                className={classes.chart}\n              >\n                <XAxis\n                  name=\"place in cycle\"\n                  unit=\"%\"\n                  type=\"number\"\n                  dataKey=\"x\"\n                  hide\n                />\n                <YAxis\n                  type=\"number\"\n                  dataKey=\"y\"\n                  orientation=\"right\"\n                  name=\"runs\"\n                  domain={['auto', trajectory > limit ? trajectory : limit]}\n                />\n                <ChartTooltip cursor={{ strokeDasharray: '3 3' }} />\n                <Legend verticalAlign=\"top\" align=\"left\" height={36} />\n                <Scatter\n                  name={`Plan Limit (${limit})`}\n                  data={planLine}\n                  fill={theme.palette.primary.main}\n                  line={{ strokeWidth: 2 }}\n                />\n                <Scatter\n                  name={\n                    <span className={safe ? classes.success : classes.error}>\n                      Current Pace ({trajectory.toFixed(0)})\n                    </span>\n                  }\n                  data={pace}\n                  fill={paceFill}\n                  line={{ strokeWidth: 2 }}\n                />\n              </ScatterChart>\n            </ResponsiveContainer>\n            <CardContent>\n              {selectedProject.planId !== selectedProject.nextPlanId && (\n                <Typography>\n                  Downgrade pending: You are changing to <b>{nextPlan.label}</b>\n                  &nbsp;on {calendarTime(selectedProject.billingPeriodEnd)}.\n                  <br />\n                  Contact billing@openfn.org to cancel this change.\n                </Typography>\n              )}\n            </CardContent>\n            <CardContent className={classes.centered}>\n              <Typography variant=\"h6\">Change Plan</Typography>\n              {userRole !== 'owner' && (\n                <Typography>\n                  Only the project owner can change plans.\n                </Typography>\n              )}\n              {userRole === 'owner' && !user.last4 && (\n                <Typography>\n                  You must add a valid credit card before upgrading your plan.\n                </Typography>\n              )}\n              <br />\n              <Field name=\"planId\" component={PlanChangeForm} plans={plans} />\n              <OnChange name=\"planId\">\n                {value => setSelectedPlanId(value)}\n              </OnChange>\n              <br />\n              {selectedPlan.label === 'Enterprise' ? (\n                <div>\n                  <Typography>∞ jobs &bull; ∞ runs</Typography>\n                  <Typography>∞ users</Typography>\n                  <Typography>custom SLA</Typography>\n                  <Typography>local or cloud hosting</Typography>\n                </div>\n              ) : (\n                <div>\n                  <Typography>${selectedPlan.price / 100}</Typography>\n                  <Typography>\n                    {selectedPlan.jobLimit} active job\n                    {selectedPlan.jobLimit > 1 ? 's' : null}\n                  </Typography>\n                  <Typography>\n                    {selectedPlan.submissionLimit} runs/\n                    {selectedPlan.billingPeriod === 'annual' ? 'yr' : 'mo'}.\n                  </Typography>\n                  <Typography>\n                    {selectedPlan.userLimit} user\n                    {selectedPlan.userLimit > 1 ? 's' : null}\n                  </Typography>\n                </div>\n              )}\n            </CardContent>\n            <CardActions>\n              <Button\n                onClick={form.reset}\n                type=\"button\"\n                disabled={submitting || pristine}\n              >\n                Reset\n              </Button>\n              {!pristine && selectedPlan.label === 'Enterprise' && (\n                <Button\n                  variant=\"contained\"\n                  color=\"primary\"\n                  href=\"mailto:enterprise@openfn.org\"\n                >\n                  Contact Us\n                </Button>\n              )}\n              {selectedPlan.label !== 'Enterprise' && !pristine && (\n                <Button\n                  variant=\"contained\"\n                  color=\"primary\"\n                  onClick={\n                    !user.last4\n                      ? linkTo(billingPath(), history)\n                      : showChangeModal\n                  }\n                  disabled={\n                    userRole !== 'owner' || selectedPlan.id === nextPlan.id\n                  }\n                >\n                  {!user.last4\n                    ? 'Add Card'\n                    : `Change to ${selectedPlan.label}${\n                        selectedPlan.id === nextPlan.id ? ' pending' : ''\n                      }`}\n                </Button>\n              )}\n              {pristine && (\n                <Button disabled variant=\"contained\" color=\"secondary\">\n                  Currently on {selectedPlan.label}\n                </Button>\n              )}\n            </CardActions>\n          </Card>\n          <ExportProjectConfigModal\n            exportYaml={handleYaml}\n            exportLightning={handleLightning}\n            project={selectedProject}\n            show={exportModalShow}\n            onClose={() => setExportModalShow(false)}\n          />\n          <DeleteProjectModal\n            project={selectedProject}\n            show={deleteModalShow}\n            onClose={() => setDeleteModalShow(false)}\n          />\n          <CancelProjectDeletionModal\n            project={selectedProject}\n            show={cancelProjectDeletionModalShow}\n            onClose={() => setCancelProjectDeletionModalShow(false)}\n          />\n          <ConfirmChangeModal\n            rejectChange={changeRejected}\n            confirmChange={() => {\n              setChangeModalShow(false);\n              return dispatch(\n                confirmChange({\n                  projectId,\n                  planId: values.planId,\n                })\n              );\n            }}\n            show={changeModalShow}\n            onClose={() => setChangeModalShow(false)}\n            proposedPlan={selectedPlan}\n            previousPlan={currentPlan}\n            selectedProject={selectedProject}\n            blockDowngradeForJobs={\n              selectedPlan.jobLimit < usageDetails.jobsCount\n            }\n            blockDowngradeForCollabs={\n              (selectedPlan.id < 4 && collaborators.length > 2) ||\n              (selectedPlan.id < 3 && collaborators.length > 1)\n            }\n          />\n          {PublicModal}\n        </OneCardHolder>\n      )}\n    />\n  );\n}\n\nProjectSettings.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n};\n\nexport default ProjectSettings;\n","import React from 'react';\nimport { Checkbox, Hidden } from '@material-ui/core';\n\nfunction CheckboxInput({\n  input,\n  type,\n  area,\n  hidden,\n  meta: { touched, error },\n  ...custom\n}) {\n  return (\n    <Hidden xsUp={hidden}>\n      <Checkbox\n        helperText={touched && error}\n        error={touched && error}\n        {...input}\n        checked={input.value}\n        value={input.value}\n        {...custom}\n      />\n    </Hidden>\n  );\n}\n\nexport default React.memo(CheckboxInput);\n","import React, { useMemo, useState, useEffect } from 'react';\nimport {\n  Avatar,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  FormControlLabel,\n  Grid,\n  MenuItem,\n  Typography,\n  makeStyles,\n} from '@material-ui/core';\nimport {\n  CheckCircle,\n  Error,\n  OpenInNew,\n  Settings as SettingsIcon,\n} from '@material-ui/icons';\nimport { isEqual, orderBy } from 'lodash';\nimport { FORM_ERROR } from 'final-form';\nimport { Field, Form } from 'react-final-form';\nimport { OnChange } from 'react-final-form-listeners';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport {\n  createProjectRepoConnection,\n  deleteProjectRepoConnection,\n  fetchProjectRepoConnection,\n  updateProjectRepoConnection,\n} from '../../actions/ProjectRepoConnectionActions';\nimport { switchedMenu } from '../../actions/MenuActions';\nimport { fetchPlans } from '../../actions/PlanActions';\nimport { fetchProjectBySlug } from '../../actions/ProjectActions';\nimport { fetchProjectUsers } from '../../actions/ProjectUserActions';\nimport { fetchBranches, fetchRepos } from '../../actions/UserActions';\nimport { createFormErrors, linkTo } from '../../helpers';\nimport { accountPath, projectPath } from '../../helpers/pathHelpers';\nimport CheckboxInput from '../FormHelpers/CheckboxInput';\nimport SelectInput from '../FormHelpers/SelectInput';\nimport TextInput from '../FormHelpers/TextInput';\nimport Loader from '../Loader';\nimport SectionFrame from '../SectionFrame';\nimport { UnprocessableEntity } from '../../errors';\nimport Link from '../Link';\n\nconst useStyles = makeStyles(theme => ({\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  button: {\n    margin: theme.spacing(1),\n  },\n  current: {\n    backgroundColor: theme.palette.grey[200],\n  },\n}));\n\nconst validate = values => {\n  const errors = {};\n  if (!values.repositoryName) {\n    errors.repositoryName = 'Required';\n  }\n  if (!values.repositoryBranch) {\n    errors.repositoryBranch = 'Required';\n  }\n  return errors;\n};\n\nfunction DeleteModal({ handleDelete, hideModal, modalShow, ...props }) {\n  return (\n    <Dialog {...props} open={modalShow} onClose={hideModal}>\n      <DialogTitle>\n        <Typography variant=\"h6\">\n          Are you sure you wish to delete your version control connection?\n        </Typography>\n      </DialogTitle>\n      <DialogContent>\n        <Typography>\n          OpenFn will instantly delete this connection. You&apos;ll need to\n          create a new one later, updating your GitHub settings to include the\n          new endpoint and password.\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={hideModal}>No, I&apos;m not sure.</Button>\n        <Button id=\"delete_source_button\" onClick={handleDelete}>\n          {' '}\n          Yes, delete this connection.\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n}\n\nfunction ProjectRepoConnection({ selectedProject }) {\n  const classes = useStyles();\n  const history = useHistory();\n  const dispatch = useDispatch();\n\n  const projectId = selectedProject.id;\n\n  const [modalShow, setModalShow] = useState(false);\n\n  const { currentUserId } = useSelector(state => state.auth);\n\n  const projectRepoConnection = useSelector(state => {\n    return Object.values(state.projectRepoConnections.items).find(\n      js => js.projectId === projectId\n    );\n  }, isEqual);\n\n  const [repos, branches, isLoadingRepos] = useSelector(state => {\n    const {\n      repos: projectRepoConnectionsRepos,\n      branches: projectRepoConnectionsBranches,\n      isLoadingRepos: projectRepoConnectionsIsLoadingRepos,\n    } = state.projectRepoConnections;\n\n    return [\n      orderBy(Object.values(projectRepoConnectionsRepos), [\n        ({ name }) => name.toLowerCase(),\n      ]),\n      Object.values(projectRepoConnectionsBranches),\n      projectRepoConnectionsIsLoadingRepos,\n    ];\n  }, isEqual);\n\n  const initialValues = useMemo(\n    () =>\n      projectRepoConnection || {\n        userId: currentUserId,\n        projectId,\n      },\n    [projectRepoConnection, currentUserId, projectId]\n  );\n\n  const collaborators = useSelector(state => {\n    return Object.values(state.projectUsers.items);\n  }, isEqual);\n\n  const projectRepoConnectionOwner =\n    projectRepoConnection &&\n    collaborators\n      .filter(pu => {\n        return pu.user.id === projectRepoConnection.userId;\n      })\n      .map(pu => pu.user.email)[0];\n\n  const currentPlan = useSelector(\n    state => state.plans.items[selectedProject.planId],\n    isEqual\n  );\n\n  const enabledForProject = currentPlan?.versionControl;\n\n  const isProjectRepoConnectionOwner = projectRepoConnection\n    ? projectRepoConnection.userId === currentUserId\n    : true;\n\n  const handleDelete = project => {\n    dispatch(deleteProjectRepoConnection(project));\n    setModalShow(false);\n  };\n\n  const handleRepoChange = (value, mutators) => {\n    const index = repos.findIndex(r => r.name === value);\n    const selectedRepo = repos[index];\n    if (selectedRepo) {\n      mutators.modify('repositoryOwner', selectedRepo.owner);\n      dispatch(fetchBranches(value, selectedRepo.owner));\n    }\n  };\n\n  const submit = async values => {\n    const action = projectRepoConnection ? updateProjectRepoConnection : createProjectRepoConnection;\n\n    try {\n      await dispatch(action(selectedProject, values));\n      dispatch(fetchProjectBySlug(selectedProject.slug));\n      return dispatch(fetchProjectRepoConnection(selectedProject));\n    } catch (error) {\n      if (error instanceof UnprocessableEntity) {\n        return createFormErrors(error.errors, values);\n      }\n\n      return {\n        [FORM_ERROR]: 'We were unable to process this job source request.',\n      };\n    }\n  };\n\n  useEffect(() => {\n    document.title = 'Version Control - OpenFn';\n    dispatch(switchedMenu('Version Control'));\n    dispatch(fetchPlans());\n  }, [dispatch]);\n\n  useEffect(() => {\n    if (enabledForProject) dispatch(fetchRepos());\n  }, [dispatch, enabledForProject]);\n\n  useEffect(() => {\n    dispatch(fetchProjectUsers(selectedProject));\n    dispatch(fetchProjectRepoConnection(selectedProject));\n  }, [selectedProject, dispatch]);\n\n  useEffect(() => {\n    const { repositoryOwner, repositoryName } = initialValues;\n    if (repositoryOwner && repositoryName) {\n      dispatch(fetchBranches(repositoryName, repositoryOwner));\n    }\n  }, [dispatch, initialValues]);\n\n  const githubPath = `${projectRepoConnection?.repositoryOwner}/${projectRepoConnection?.repositoryName}`;\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      initialValues={initialValues}\n      mutators={{\n        modify: ([field, value], state, { changeValue }) => {\n          changeValue(state, field, () => value);\n        },\n      }}\n      render={({\n        handleSubmit,\n        submitting,\n        invalid,\n        pristine,\n        form,\n        submitError,\n      }) => (\n        <div>\n          <SectionFrame\n            section=\"External Repo\"\n            actions={\n              <div>\n                <Button\n                  className={classes.button}\n                  onClick={linkTo(accountPath(), history)}\n                >\n                  <SettingsIcon />\n                  &nbsp;&nbsp;Account Settings\n                </Button>\n                {projectRepoConnection && (\n                  <Button\n                    className={classes.button}\n                    color=\"primary\"\n                    disabled={!selectedProject.userRole}\n                    onClick={() => setModalShow(true)}\n                  >\n                    Delete Connection\n                  </Button>\n                )}\n              </div>\n            }\n          />\n          <Grid container justifyContent=\"center\">\n            <Grid item lg={4} md={9}>\n              <Card className={classes.root}>\n                <CardHeader\n                  avatar={\n                    <Avatar className={classes.avatar}>\n                      <i className=\"fab fa-github fa-lg\" />\n                    </Avatar>\n                  }\n                  title=\"Version Control\"\n                  subheader=\"via connected Github Repositories\"\n                />\n                {projectRepoConnection && (\n                  <CardContent className={classes.current}>\n                    <Typography>\n                      <b>Github User:</b> {projectRepoConnectionOwner}\n                    </Typography>\n                    <Typography>\n                      <b>Repo:</b>{' '}\n                      <Link\n                        href={`https://www.github.com/${githubPath}`}\n                        text={githubPath}\n                        icon={<OpenInNew fontSize=\"inherit\" />}\n                      />\n                    </Typography>\n                    <Typography>\n                      <b>Branch:</b> {projectRepoConnection.repositoryBranch}\n                    </Typography>\n                    <Typography>\n                      <b>Autodeploy:</b>{' '}\n                      {projectRepoConnection.autodeployEnabled ? (\n                        <span>\n                          On <CheckCircle fontSize=\"inherit\" color=\"primary\" />\n                        </span>\n                      ) : (\n                        <span>\n                          Off <Error fontSize=\"inherit\" color=\"error\" />\n                        </span>\n                      )}\n                    </Typography>\n                    <Typography>\n                      <b>Github-to-OpenFn Webhook:</b>{' '}\n                      {projectRepoConnection.webhookId ? (\n                        <Link\n                          href={`https://www.github.com/${githubPath}/settings/hooks/${projectRepoConnection.webhookId}`}\n                          text={projectRepoConnection.webhookId}\n                          icon={<OpenInNew fontSize=\"inherit\" />}\n                        />\n                      ) : (\n                        'not found'\n                      )}\n                    </Typography>\n                    {!projectRepoConnection.webhookId && (\n                      <Typography color=\"error\">\n                        We can&apos; find a webhook for this job source. If\n                        you&apos;ve just created it, try refreshing your page.\n                        If we don&apos;t hear back from Github in a minute, you\n                        may need to delete and recreate the connection to enable\n                        bi-directional syncs. Contact support@openfn.org for\n                        help.\n                      </Typography>\n                    )}\n                  </CardContent>\n                )}\n                <CardContent>\n                  {!enabledForProject && (\n                    <div>\n                      <Typography style={{ color: 'red' }}>\n                        <b>Your plan does not support version control.</b>\n                      </Typography>\n                      <br />\n                      <Typography>\n                        Want to track changes to your jobs with Git and GitHub,\n                        atomatically deploy udpates to selected jobs from a\n                        specific branch, or rollback to previous versions at the\n                        click of a button?\n                      </Typography>\n                      <br />\n                      <Typography>\n                        Contact{' '}\n                        <a href=\"mailto:enterprise@openfn.org\">\n                          enterprise@openfn.org\n                        </a>{' '}\n                        to get started.\n                      </Typography>\n                    </div>\n                  )}\n                  {(isLoadingRepos || !currentPlan) && (\n                    <Loader item=\"data from Github...\" naked />\n                  )}\n                  {enabledForProject && repos.length === 0 && !isLoadingRepos && (\n                    <div>\n                      <Typography variant=\"subtitle1\">\n                        We couldn&apos;t fetch any repos. Please ensure your\n                        OpenFn account is connected to a GitHub account with\n                        access to at least one repository.\n                      </Typography>\n                      <br />\n                      <Button onClick={linkTo('/account', history)}>\n                        My Account\n                      </Button>\n                    </div>\n                  )}\n                  {enabledForProject && !isLoadingRepos && repos.length > 0 && (\n                    <form onSubmit={handleSubmit}>\n                      <Grid container direction=\"column\">\n                        <Grid item>\n                          <Typography variant=\"h6\">\n                            Connect an existing GitHub repository.\n                          </Typography>\n                        </Grid>\n                        <Grid item>\n                          <Field\n                            name=\"repositoryOwner\"\n                            label=\"Owner\"\n                            component={TextInput}\n                            type=\"text\"\n                            disabled\n                          />\n                        </Grid>\n                        <Grid item>\n                          <Field\n                            name=\"repositoryName\"\n                            label=\"Name\"\n                            floatingLabelText=\"Notes\"\n                            component={SelectInput}\n                            disabled={!enabledForProject || !isProjectRepoConnectionOwner}\n                          >\n                            {repos &&\n                              repos.map(op => (\n                                <MenuItem value={op.name} key={op.id}>\n                                  {op.name}\n                                </MenuItem>\n                              ))}\n                          </Field>\n                          <OnChange name=\"repositoryName\">\n                            {value => handleRepoChange(value, form.mutators)}\n                          </OnChange>\n                        </Grid>\n                        <Grid item>\n                          <Field\n                            name=\"repositoryBranch\"\n                            label=\"Branch\"\n                            component={SelectInput}\n                            disabled={!enabledForProject || !isProjectRepoConnectionOwner}\n                          >\n                            {branches &&\n                              branches.map((op, i) => (\n                                <MenuItem value={op} key={i}>\n                                  {op}\n                                </MenuItem>\n                              ))}\n                          </Field>\n                        </Grid>\n                        <Grid item>\n                          <FormControlLabel\n                            label=\"Auto-Deploy Enabled?\"\n                            style={{ marginTop: 5 }}\n                            control={\n                              <Field\n                                name=\"autodeployEnabled\"\n                                component={CheckboxInput}\n                                disabled={\n                                  !enabledForProject || !isProjectRepoConnectionOwner\n                                }\n                              />\n                            }\n                          />\n                        </Grid>\n                        {submitError && (\n                          <Typography style={{ color: 'red' }}>\n                            <br />\n                            <b>{submitError}</b>\n                            <br />\n                            Please contact support for help.\n                          </Typography>\n                        )}\n                      </Grid>\n                    </form>\n                  )}\n                </CardContent>\n                {enabledForProject && repos.length > 0 && (\n                  <CardActions>\n                    <Button\n                      className={classes.button}\n                      disabled={!selectedProject.userRole}\n                      onClick={linkTo(projectPath(selectedProject), history)}\n                    >\n                      Cancel\n                    </Button>\n                    <Button\n                      className={classes.button}\n                      disabled={!selectedProject.userRole || pristine}\n                      onClick={form.reset}\n                    >\n                      Reset\n                    </Button>\n                    <Button\n                      className={classes.button}\n                      id=\"save_trigger\"\n                      disabled={\n                        submitting ||\n                        invalid ||\n                        pristine ||\n                        !selectedProject.userRole\n                      }\n                      onClick={handleSubmit}\n                    >\n                      {submitting ? (\n                        <i className=\"fas fa-circle-notch fa-lg fa-spin\" />\n                      ) : (\n                        (projectRepoConnection && 'Update Connection') ||\n                        'Create Connection'\n                      )}\n                    </Button>\n                  </CardActions>\n                )}\n                <DeleteModal\n                  handleDelete={() => handleDelete(selectedProject)}\n                  hideModal={() => setModalShow(false)}\n                  modalShow={modalShow}\n                />\n              </Card>\n            </Grid>\n          </Grid>\n        </div>\n      )}\n    />\n  );\n}\n\nDeleteModal.propTypes = {\n  handleDelete: PropTypes.func.isRequired,\n  hideModal: PropTypes.func.isRequired,\n  modalShow: PropTypes.bool.isRequired,\n};\nProjectRepoConnection.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n};\n\nexport default ProjectRepoConnection;\n","import { Chip, Hidden, TableCell, TableRow, Tooltip } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n  PlayCircleFilled as PlayCircleFilledIcon,\n  SettingsEthernet as SettingsEthernetIcon,\n  TouchApp as TouchAppIcon,\n} from '@material-ui/icons';\nimport { formatDistance } from 'date-fns';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport triggerIcons from '../constants/triggerIcons';\nimport { humanReadable, fullDate } from '../helpers';\nimport ExitCodeIcon from './ExitCodeIcon';\n\nconst styles = theme => ({\n  chip: {\n    paddingLeft: theme.spacing(1),\n    margin: theme.spacing(1),\n  },\n  clickable: {\n    cursor: 'pointer',\n  },\n  play: {\n    color: theme.palette.secondary.main,\n  },\n});\n\nfunction RunItem(props) {\n  const {\n    id,\n    exitCode,\n    trigger,\n    startedAt,\n    finishedAt,\n    job,\n    onClick,\n    receiptId,\n    onRetry,\n    duration,\n    classes,\n    startedRaw,\n  } = props;\n\n  function handleRetryClick(e) {\n    e.stopPropagation();\n    onRetry(job, { id: receiptId });\n  }\n\n  const avatar = <ExitCodeIcon exitCode={exitCode} />;\n\n  const deleteIcon = (\n    <Tooltip title=\"Run it again.\">\n      <PlayCircleFilledIcon\n        className={classes.play}\n        role=\"application\"\n        aria-hidden=\"false\"\n        aria-label=\"run it again icon\"\n      />\n    </Tooltip>\n  );\n\n  const retry =\n    (receiptId || trigger?.Type === 'interval' || !trigger) && exitCode != null\n      ? handleRetryClick\n      : null;\n\n  return (\n    <TableRow\n      className={classes.clickable}\n      onClick={onClick}\n      style={{ verticalAlign: 'initial' }}\n      aria-label={`run ${id} row`}\n      row=\"row\"\n      id={id}\n    >\n      <TableCell>\n        <Tooltip title={fullDate(startedRaw)}>\n          <span>{startedAt}</span>\n        </Tooltip>\n      </TableCell>\n      <Hidden xsDown initialWidth=\"lg\">\n        <TableCell aria-label={id}>\n          <Tooltip title={id}>\n            <code>{humanReadable(id)}</code>\n          </Tooltip>\n        </TableCell>\n      </Hidden>\n      <Hidden xsDown initialWidth=\"lg\">\n        <TableCell style={{ wordBreak: 'break-all' }} aria-label={receiptId}>\n          {trigger ? (\n            <>\n              {triggerIcons[trigger?.type].icon}&nbsp;&nbsp;{trigger.name}\n            </>\n          ) : (\n            <>\n              <TouchAppIcon fontSize=\"inherit\" />\n              &nbsp;&nbsp;\n              {receiptId ? (\n                <>\n                  <code>{humanReadable(receiptId)}</code>\n                </>\n              ) : (\n                <>- -</>\n              )}\n            </>\n          )}\n        </TableCell>\n        <TableCell style={{ wordBreak: 'break-all' }} aria-label={job.name}>\n          <SettingsEthernetIcon fontSize=\"inherit\" />\n          &nbsp;&nbsp;{job.name}\n        </TableCell>\n        <TableCell\n          style={{ padding: 0 }}\n          aria-label={finishedAt === 'n/a' ? '- -' : `${duration} ms`}\n        >\n          <Chip\n            className={classes.chip}\n            label={finishedAt === 'n/a' ? '- -' : `${duration} ms`}\n            avatar={avatar}\n            deleteIcon={deleteIcon}\n            onDelete={retry}\n          />\n        </TableCell>\n      </Hidden>\n      <Hidden smUp initialWidth=\"lg\">\n        <TableCell>\n          <Chip\n            id={id}\n            className={classes.chip}\n            label={job.name}\n            avatar={avatar}\n            deleteIcon={deleteIcon}\n            onDelete={retry}\n          />\n        </TableCell>\n      </Hidden>\n    </TableRow>\n  );\n}\n\nRunItem.propTypes = {\n  id: PropTypes.string.isRequired,\n  exitCode: PropTypes.number,\n  trigger: PropTypes.object,\n  startedAt: PropTypes.string.isRequired,\n  finishedAt: PropTypes.string.isRequired,\n  startedRaw: PropTypes.number,\n  job: PropTypes.object.isRequired,\n  onClick: PropTypes.func.isRequired,\n  receiptId: PropTypes.string,\n  onRetry: PropTypes.func.isRequired,\n  duration: PropTypes.number.isRequired,\n  classes: PropTypes.object.isRequired,\n};\n\nRunItem.defaultProps = {\n  receiptId: null,\n  exitCode: null,\n  startedRaw: null,\n  trigger: null,\n};\n\nexport default withStyles(styles, {\n  withTheme: true,\n  name: 'App',\n})(RunItem);\n","import {\n  Accordion,\n  AccordionDetails,\n  AccordionSummary,\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  Chip,\n  Hidden,\n  IconButton,\n  LinearProgress,\n  Menu,\n  MenuItem,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  Dialog,\n  AppBar,\n  Toolbar,\n  Typography,\n} from '@material-ui/core';\nimport Avatar from '@material-ui/core/Avatar';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport {\n  FileCopy as FileCopyIcon,\n  Fullscreen,\n  Help as HelpIcon,\n  Close as CloseIcon,\n  TouchApp as TouchAppIcon,\n  Edit as EditIcon,\n  ExpandMore as ExpandMoreIcon,\n  FilterList as FilterListIcon,\n  KeyboardArrowLeft,\n  KeyboardArrowRight,\n  Mail as MailIcon,\n  PlayCircleFilled as PlayCircleFilledIcon,\n  Restore as RestorePageIcon,\n  Warning,\n} from '@material-ui/icons';\nimport { isEqual, values } from 'lodash';\nimport React, { useState, useEffect, useMemo } from 'react';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport Slide from '@material-ui/core/Slide';\nimport { joinChannel } from '../actions/ChannelActions';\nimport { fetchJobs } from '../actions/JobActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport Notifications from '../actions/Notifications';\nimport { fetchReceiptById, restoreReceipt } from '../actions/ReceiptActions';\nimport { createRun, loadRuns, receiveRun } from '../actions/RunActions';\nimport { fetchTriggers } from '../actions/TriggerActions';\nimport { formatTime, linkTo, RunItemPresenter } from '../helpers';\nimport {\n  projectNextReceiptInspectPath,\n  projectPrevReceiptInspectPath,\n  projectReceiptEditPath,\n  runShowPath,\n} from '../helpers/pathHelpers';\nimport { assembleMatches, assembleRuns, selectCurrentUser } from '../selectors';\nimport { AceEditor } from './CodeEditor';\nimport Loader from './Loader';\nimport OneCardHolder from './OneCardHolder';\nimport QueueStatus from './QueueStatus';\nimport RunItem from './RunItem';\n\nconst useStyles = makeStyles(theme => ({\n  topCard: {\n    borderBottomLeftRadius: 0,\n    borderBottomRightRadius: 0,\n  },\n  expansion: {\n    margin: 0,\n  },\n  expansionBottom: {\n    margin: 0,\n    borderBottomLeftRadius: 4,\n    borderBottomRightRadius: 4,\n  },\n  wait: {\n    cursor: 'wait',\n  },\n  chip: {\n    paddingLeft: theme.spacing(1),\n    margin: theme.spacing(0.5),\n    cursor: 'wait',\n  },\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  appBar: {\n    position: 'relative',\n  },\n  title: {\n    marginLeft: theme.spacing(2),\n    flex: 1,\n    fontFamily: theme.typography.codeFont,\n    fontSize: '1rem',\n  },\n  summary: {\n    '& .MuiAccordionSummary-content': {\n      alignItems: 'center',\n      marginTop: theme.spacing(1),\n      marginBottom: theme.spacing(1),\n    },\n  },\n  warning: {\n    color: theme.palette.warning.main,\n    marginRight: theme.spacing(1),\n  },\n}));\n\nfunction Warnings({ receipt, classes }) {\n  const { original, notes, updatedAt } = receipt;\n  if (notes || original) {\n    return (\n      <CardContent>\n        <br />\n        {(notes || original) && (\n          <Typography>\n            <Warning fontSize=\"inherit\" className={classes.warning} />\n            This message was modified on {formatTime(\n              updatedAt,\n              'PPPPpppp'\n            )}{' '}\n            with notes: <em>{notes || '(none provided)'}</em>\n          </Typography>\n        )}\n      </CardContent>\n    );\n  }\n\n  return <div />;\n}\n\nconst Transition = React.forwardRef(function Transition(props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />;\n});\n\nfunction CopyBlockButton({ obj, attribute }) {\n  const dispatch = useDispatch();\n  const addNotification = Notifications.add;\n  return (\n    <Tooltip\n      id=\"copy-message-to-clipboard\"\n      title={`Copy message ${attribute} to clipboard.`}\n      component=\"span\"\n    >\n      <CopyToClipboard\n        text={JSON.stringify(obj[attribute], null, 2)}\n        onCopy={(text, result) => {\n          dispatch(\n            addNotification(\n              `Copied ${attribute} to clipboard.`,\n              result ? 'success' : 'failed'\n            )\n          );\n        }}\n      >\n        <IconButton onClick={e => e.stopPropagation()}>\n          <FileCopyIcon fontSize=\"small\" />\n        </IconButton>\n      </CopyToClipboard>\n    </Tooltip>\n  );\n}\n\nfunction AceModal({ open, value, theme, onClose, title }) {\n  const classes = useStyles();\n\n  return (\n    <Dialog\n      fullScreen\n      open={open}\n      onClose={onClose}\n      TransitionComponent={Transition}\n    >\n      <AppBar className={classes.appBar}>\n        <Toolbar>\n          <IconButton\n            edge=\"start\"\n            color=\"inherit\"\n            onClick={onClose}\n            aria-label=\"close\"\n          >\n            <CloseIcon />\n          </IconButton>\n          <Typography variant=\"h6\" className={classes.title}>\n            {title}\n          </Typography>\n          <Button autoFocus color=\"inherit\" onClick={onClose}>\n            Close\n          </Button>\n        </Toolbar>\n      </AppBar>\n      <div\n        style={{\n          flexGrow: 1,\n          position: 'relative',\n          height: '100%',\n        }}\n      >\n        <AceEditor\n          mode=\"json\"\n          focus\n          style={{\n            position: 'absolute',\n            left: 0,\n            right: 0,\n            top: 0,\n            bottom: 0,\n          }}\n          editorProps={{ $blockScrolling: Infinity }}\n          name=\"headers\"\n          theme={theme}\n          width=\"100%\"\n          height=\"100%\"\n          minLines={3}\n          readOnly\n          wrapEnabled\n          showPrintMargin={false}\n          value={value ? JSON.stringify(value, null, 2) : 'loading...'}\n        />\n      </div>\n    </Dialog>\n  );\n}\n\nfunction ReceiptInspector({ selectedProject }) {\n  const classes = useStyles();\n  const theme = useTheme();\n  const history = useHistory();\n  const dispatch = useDispatch();\n  const params = useParams();\n\n  const [lastArrival, setArrival] = useState(Date.now());\n  const [headerModalShow, setHeaderModalShow] = useState(false);\n  const [bodyModalShow, setBodyModalShow] = useState(false);\n\n  const receiptId = params.id;\n\n  const [isLoading, error] = useSelector(\n    state => [state.receipts.isLoading, state.receipts.error],\n    isEqual\n  );\n\n  if (error) throw error;\n\n  const runsLoading = useSelector(state => state.runs.isLoading);\n  const receipt = useSelector(\n    state => state.receipts.items[receiptId] || {},\n    isEqual\n  );\n  const triggers = useSelector(state => state.triggers.items, isEqual);\n  const jobItems = useSelector(state => state.jobs.items, isEqual);\n  const jobs = values(jobItems);\n\n  const assembledRuns = useSelector(\n    state => assembleRuns(state, receipt),\n    isEqual\n  );\n\n  const runs = assembledRuns.map(run =>\n    RunItemPresenter({\n      run,\n      trigger: triggers[run.triggerId],\n      job: jobItems[run.jobId] || {},\n    })\n  );\n\n  const assembledMatches = useSelector(\n    state => assembleMatches(state, receipt),\n    isEqual\n  );\n\n  const matches = assembledMatches.filter(({ trigger, job }) => trigger && job);\n\n  const user = useSelector(selectCurrentUser, isEqual) || {};\n\n  const userTheme = user.theme;\n\n  const showHeaderModal = e => {\n    e.stopPropagation();\n    setHeaderModalShow(true);\n  };\n\n  const hideHeaderModal = () => {\n    setHeaderModalShow(false);\n  };\n\n  const showBodyModal = e => {\n    e.stopPropagation();\n    setBodyModalShow(true);\n  };\n\n  const hideBodyModal = () => {\n    setBodyModalShow(false);\n  };\n\n  const handleRetry = (job, receipt) => {\n    setArrival(Date.now());\n    dispatch(createRun(job, receipt));\n  };\n\n  useEffect(() => {\n    dispatch(switchedMenu('Inbox'));\n    document.title = 'Message Inspector - OpenFn';\n    setArrival(Date.now());\n  }, [dispatch]);\n\n  useEffect(() => {\n    function handleReceiveRun(payload) {\n      setArrival(Date.now());\n      dispatch(receiveRun(payload));\n    }\n\n    dispatch(fetchJobs(selectedProject));\n    dispatch(fetchTriggers(selectedProject));\n    const leaveChannel = dispatch(\n      joinChannel(`runs:${selectedProject.id}`, {\n        new: handleReceiveRun,\n        updated: handleReceiveRun,\n      })\n    );\n\n    return () => {\n      if (leaveChannel) {\n        leaveChannel();\n      }\n    };\n  }, [selectedProject, dispatch]);\n\n  useEffect(() => {\n    if (receiptId && selectedProject) {\n      dispatch(fetchReceiptById(receiptId));\n      dispatch(loadRuns({ receiptId, projectId: selectedProject.id }));\n    }\n  }, [receiptId, selectedProject, dispatch]);\n\n  if (isLoading) {\n    return <Loader item=\"message\" wide />;\n  }\n\n  const JsonAce = (value, selectedProject) => {\n    if (value) {\n      return (\n        <AceEditor\n          editorProps={{ $blockScrolling: Infinity }}\n          mode=\"json\"\n          name=\"editor\"\n          theme={userTheme || theme.palette.codeEditor}\n          width=\"100%\"\n          minLines={3}\n          maxLines={15}\n          readOnly\n          wrapEnabled\n          showPrintMargin={false}\n          value={JSON.stringify(value, null, 2)}\n        />\n      );\n    }\n    return (\n      <Typography>\n        <Warning fontSize=\"inherit\" className={classes.warning} />\n        {!selectedProject?.retainReceipts\n          ? 'This project does not retain message bodies; the data was purged after processing.'\n          : 'Message still processing.'}\n      </Typography>\n    );\n  };\n\n  return (\n    <OneCardHolder wide>\n      <Card className={classes.topCard}>\n        <CardHeader\n          title={\n            <span id=\"message-title\" aria-label=\"message title\">\n              Message <code>{receipt.id}</code>\n            </span>\n          }\n          subheader={`${receipt.method} request received on ${formatTime(\n            receipt.insertedAt,\n            'PPPPpppp'\n          )}`}\n          avatar={\n            <Avatar className={classes.avatar}>\n              <MailIcon />\n            </Avatar>\n          }\n          action={\n            <span>\n              <Tooltip title=\"Edit\" component=\"span\">\n                <IconButton\n                  id=\"view_receipt\"\n                  onClick={e =>\n                    linkTo(\n                      projectReceiptEditPath(selectedProject, receipt),\n                      history\n                    )(e)\n                  }\n                >\n                  <EditIcon fontSize=\"inherit\" />\n                </IconButton>\n              </Tooltip>\n              {receipt.original && !isEqual(receipt.original, receipt.body) ? (\n                <Tooltip\n                  title=\"Restore message body to original state\"\n                  component=\"span\"\n                >\n                  <IconButton onClick={() => dispatch(restoreReceipt(receipt))}>\n                    <RestorePageIcon />\n                  </IconButton>\n                </Tooltip>\n              ) : null}\n              <Tooltip title=\"Previous message\" component=\"span\">\n                <IconButton\n                  id=\"previous\"\n                  disabled={!receipt.prevId}\n                  onClick={e =>\n                    linkTo(\n                      projectPrevReceiptInspectPath(selectedProject, receipt),\n                      history\n                    )(e)\n                  }\n                >\n                  <KeyboardArrowLeft />\n                </IconButton>\n              </Tooltip>\n              <Tooltip title=\"Next message\" component=\"span\">\n                <IconButton\n                  id=\"next\"\n                  disabled={!receipt.nextId}\n                  onClick={e =>\n                    linkTo(\n                      projectNextReceiptInspectPath(selectedProject, receipt),\n                      history\n                    )(e)\n                  }\n                >\n                  <KeyboardArrowRight />\n                </IconButton>\n              </Tooltip>\n            </span>\n          }\n        />\n        <Warnings receipt={receipt} classes={classes} />\n      </Card>\n      <Accordion elevation={2} className={classes.expansion}>\n        <AccordionSummary\n          expandIcon={<ExpandMoreIcon />}\n          className={classes.summary}\n        >\n          <Typography className={classes.heading}>\n            Message Headers&nbsp;\n            <Tooltip\n              title={\n                <>\n                  The &apos;user-agent&apos; and &apos;x-forwarded-for&apos;\n                  fields can help to identify the origin of the HTTP request.\n                </>\n              }\n              component=\"span\"\n            >\n              <HelpIcon fontSize=\"inherit\" />\n            </Tooltip>\n          </Typography>\n          <div style={{ flexGrow: 1 }} />\n          <CopyBlockButton obj={receipt} attribute={'headers'} />\n          <Tooltip title=\"View headers in fullscreen modal\">\n            <IconButton onClick={showHeaderModal} size=\"small\">\n              <Fullscreen />\n            </IconButton>\n          </Tooltip>\n        </AccordionSummary>\n        <AccordionDetails style={{ padding: 0 }}>\n          {JsonAce(receipt?.headers, selectedProject)}\n        </AccordionDetails>\n      </Accordion>\n      <Accordion elevation={2} className={classes.expansionBottom}>\n        <AccordionSummary\n          expandIcon={<ExpandMoreIcon />}\n          className={classes.summary}\n        >\n          <Typography className={classes.heading}>\n            Message Body&nbsp;\n            <Tooltip\n              title={\n                <>\n                  A JSON object made from the request body (in either XML or\n                  JSON) and the request query parameters\n                </>\n              }\n              component=\"span\"\n            >\n              <HelpIcon fontSize=\"inherit\" />\n            </Tooltip>\n          </Typography>\n          <div style={{ flexGrow: 1 }} />\n          {receipt?.body && (\n            <>\n              <CopyBlockButton obj={receipt} attribute=\"body\" />\n              <Tooltip title=\"View body in fullscreen modal\" component=\"span\">\n                <IconButton onClick={showBodyModal} size=\"small\">\n                  <Fullscreen />\n                </IconButton>\n              </Tooltip>\n            </>\n          )}\n        </AccordionSummary>\n        <AccordionDetails style={receipt?.body && { padding: 0 }}>\n          {JsonAce(receipt?.body, selectedProject)}\n        </AccordionDetails>\n      </Accordion>\n      <br />\n      <Card>\n        <CardContent>\n          <Typography>\n            <b>Current potential&nbsp;</b>\n            <Tooltip\n              title={\n                <>\n                  This section displays a list of jobs which could be executed\n                  against this message, based on their triggers and the message\n                  body.\n                  <br />\n                  <br />\n                  You can also run any job in the project using this message as\n                  its initial state.data by clicking &quot;Other Jobs&quot;.\n                </>\n              }\n              component=\"span\"\n            >\n              <HelpIcon fontSize=\"inherit\" />\n            </Tooltip>\n          </Typography>\n          <Table\n            striped={+true}\n            hover={+true}\n            size=\"small\"\n            aria-label=\"current potential table\"\n          >\n            <TableHead>\n              <TableRow aria-label=\"current potential header row\" role=\"row\">\n                <TableCell>Trigger</TableCell>\n                <TableCell>Criteria</TableCell>\n                <TableCell>Job</TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {matches.length > 0 ? (\n                matches.map(match => (\n                  <JobMatchRow\n                    key={match.job.id}\n                    {...match}\n                    receipt={receipt}\n                    onTrigger={(job, receipt) =>\n                      dispatch(createRun(job, receipt))\n                    }\n                  />\n                ))\n              ) : (\n                <TableRow>\n                  <TableCell colSpan={3}>\n                    <Typography>\n                      <em>\n                        <small>\n                          This message doesn&apos;t match the current trigger\n                          for any jobs.\n                        </small>\n                      </em>\n                    </Typography>\n                  </TableCell>\n                </TableRow>\n              )}\n              <ManualRow\n                key=\"manual\"\n                receipt={receipt}\n                jobs={jobs}\n                onTrigger={(job, receipt) => dispatch(createRun(job, receipt))}\n              />\n            </TableBody>\n          </Table>\n        </CardContent>\n      </Card>\n      <br />\n      <Card>\n        <CardContent>\n          <Typography>\n            <b>Associated Runs&nbsp;</b>\n            <Tooltip\n              title={\n                <>\n                  A list of runs which used the body of this message for their\n                  initial state.\n                </>\n              }\n              component=\"span\"\n            >\n              <HelpIcon fontSize=\"inherit\" />\n            </Tooltip>\n          </Typography>\n          <Table\n            striped={+true}\n            hover={+true}\n            size=\"small\"\n            aria-label=\"associated runs table\"\n          >\n            <TableHead>\n              <TableRow aria-label=\"associated runs header row\">\n                <TableCell>Start Time</TableCell>\n                <Hidden xsDown initialWidth=\"lg\">\n                  <TableCell>Run ID</TableCell>\n                </Hidden>\n                <Hidden xsDown initialWidth=\"lg\">\n                  <TableCell>Trigger</TableCell>\n                  <TableCell>Job</TableCell>\n                </Hidden>\n                <TableCell>Status</TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              <QueueStatus\n                project={selectedProject}\n                lastArrival={lastArrival}\n              />\n              {runsLoading && (\n                <TableRow className={classes.wait}>\n                  <TableCell>\n                    <LinearProgress />\n                  </TableCell>\n                  <Hidden xsDown>\n                    <TableCell>\n                      <LinearProgress />\n                    </TableCell>\n                    <TableCell>\n                      <LinearProgress />\n                    </TableCell>\n                    <TableCell>\n                      <LinearProgress />\n                    </TableCell>\n                  </Hidden>\n                  <TableCell>\n                    <Chip className={classes.chip} />\n                  </TableCell>\n                </TableRow>\n              )}\n              {runs.length === 0 && !runsLoading && (\n                <TableRow>\n                  <TableCell colSpan={5}>\n                    <Typography>No jobs have run with this message.</Typography>\n                  </TableCell>\n                </TableRow>\n              )}\n              {runs.length > 0 &&\n                !runsLoading &&\n                runs.map(run => (\n                  <RunItem\n                    {...run}\n                    key={run.id}\n                    onRetry={handleRetry}\n                    onClick={linkTo(runShowPath(selectedProject, run), history)}\n                  />\n                ))}\n            </TableBody>\n          </Table>\n        </CardContent>\n      </Card>\n      <AceModal\n        title={`${receipt.id} headers`}\n        open={headerModalShow}\n        onClose={hideHeaderModal}\n        value={receipt.headers}\n        theme={userTheme || theme.palette.codeEditor}\n      />\n      <AceModal\n        title={`${receipt.id} body`}\n        open={bodyModalShow}\n        onClose={hideBodyModal}\n        value={receipt.body}\n        theme={userTheme || theme.palette.codeEditor}\n      />\n    </OneCardHolder>\n  );\n}\n\nfunction JobMatchRow({ job, trigger, receipt, onTrigger }) {\n  function handleTriggerClick(e) {\n    e.stopPropagation();\n    onTrigger(job, receipt);\n  }\n\n  return (\n    <TableRow aria-label={`${job.name} row`} role=\"row\">\n      <TableCell>\n        <FilterListIcon fontSize=\"inherit\" />\n        &nbsp;&nbsp;{trigger.name}\n      </TableCell>\n      <TableCell>\n        <code>{JSON.stringify(trigger.criteria)}</code>\n      </TableCell>\n      <TableCell>\n        <Button onClick={handleTriggerClick}>\n          {job.name}&nbsp;\n          <PlayCircleFilledIcon />\n        </Button>\n      </TableCell>\n    </TableRow>\n  );\n}\n\nfunction ManualRow({ jobs, receipt, onTrigger }) {\n  const [anchorEl, setAnchorEl] = React.useState(null);\n\n  const handleClick = event => {\n    setAnchorEl(event.currentTarget);\n  };\n\n  const handleClose = () => {\n    setAnchorEl(null);\n  };\n\n  const handleTriggerClick = job => {\n    handleClose();\n    onTrigger(job, receipt);\n  };\n\n  return (\n    <TableRow aria-label=\"any other job row\" role=\"row\">\n      <TableCell aria-label=\"--\">\n        <TouchAppIcon fontSize=\"inherit\" />\n        &nbsp;&nbsp;- -\n      </TableCell>\n      <TableCell>\n        <code>{'{ ...any }'}</code>\n      </TableCell>\n      <TableCell>\n        <Button\n          aria-controls=\"simple-menu\"\n          aria-haspopup=\"true\"\n          onClick={handleClick}\n        >\n          Other Jobs\n        </Button>\n        <Menu\n          id=\"simple-menu\"\n          anchorEl={anchorEl}\n          keepMounted\n          open={Boolean(anchorEl)}\n          onClose={handleClose}\n        >\n          {jobs.map(j => (\n            <MenuItem key={j.id} onClick={() => handleTriggerClick(j)}>\n              {j.name}&nbsp;\n              <PlayCircleFilledIcon />\n            </MenuItem>\n          ))}\n        </Menu>\n      </TableCell>\n    </TableRow>\n  );\n}\n\nexport default ReceiptInspector;\n","import React, { useState, useEffect } from 'react';\nimport {\n  Button,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Typography,\n} from '@material-ui/core';\nimport { useTheme } from '@material-ui/core/styles';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport SendIcon from '@material-ui/icons/Send';\nimport { isEqual } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { validJson } from '../helpers';\nimport { AceEditor } from './CodeEditor';\n\nfunction resetState(inboxUrl) {\n  return {\n    params: JSON.stringify(\n      {\n        url: inboxUrl,\n        method: 'post',\n        headers: {},\n        params: {},\n        mode: 'cors',\n        auth: {\n          username: 'janedoe',\n          password: 's00pers3cret',\n        },\n        body: {\n          test: 'data',\n        },\n        // timeout: 5000,\n      },\n      null,\n      2\n    ),\n    response: null,\n    sending: false,\n  };\n}\n\nfunction CreateMessageModal({ open, onClose, userTheme, inboxUrl }) {\n  const [state, setState] = useState(resetState(inboxUrl));\n\n  useEffect(() => {\n    setState(resetState(inboxUrl));\n  }, [inboxUrl]);\n\n  const theme = useTheme();\n\n  const handleParamsChange = value => {\n    setState({ ...state, params: value });\n  };\n\n  const { params, sending, response } = state;\n\n  const { status, statusText } = response || {};\n\n  const invalid = !validJson(params);\n\n  const handleClear = () => {\n    setState(resetState(inboxUrl));\n  };\n\n  const handleRequest = ({ url, body, headers, ...otherParams }) => {\n    setState({ ...state, sending: true });\n    fetch(url, {\n      ...otherParams,\n      headers: {\n        ...headers,\n        accept: 'application/json',\n        'content-type': 'application/json',\n      },\n      body: JSON.stringify(body),\n    })\n      .then(async response => {\n        setState({\n          ...state,\n          response,\n          sending: false,\n        });\n      })\n      .catch(async response => {\n        setState({\n          ...state,\n          response,\n          sending: false,\n        });\n      });\n  };\n\n  return (\n    <Dialog open={open} onClose={onClose} maxWidth=\"lg\">\n      <DialogTitle>Send HTTP Request</DialogTitle>\n      <DialogContent>\n        <Typography component=\"p\">\n          Make an HTTP request using your browser and the Javascript global\n          `fetch` method. See the full set of available options for your request\n          object on the &nbsp;\n          <a\n            href=\"https://developer.mozilla.org/en-US/docs/Web/API/fetch\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            documentation page\n          </a>\n          .\n        </Typography>\n        <br />\n        <Typography>\n          <b>Request configuration</b>\n        </Typography>\n        <AceEditor\n          editorProps={{ $blockScrolling: Infinity }}\n          name=\"editor\"\n          mode=\"javascript\"\n          className=\"rounded\"\n          theme={userTheme || theme.palette.codeEditor}\n          width=\"100%\"\n          minLines={3}\n          maxLines={10000}\n          wrapEnabled\n          showPrintMargin={false}\n          value={params}\n          onChange={handleParamsChange}\n        />\n        {invalid ? (\n          <Typography variant=\"subtitle1\" color=\"error\">\n            <ErrorOutlineIcon fontSize=\"inherit\" /> That doesn&apos;t seem to be\n            valid JSON. Please fix your request parameters before submitting.\n          </Typography>\n        ) : (\n          <br />\n        )}\n        <br />\n        {sending && (\n          <Typography>\n            <b>Awaiting response...</b>\n          </Typography>\n        )}\n        {response && !sending && (\n          <div>\n            <Typography>\n              <b>Response</b>\n            </Typography>\n            <AceEditor\n              value={JSON.stringify({ status, statusText }, null, 2)}\n              className=\"rounded\"\n              mode=\"javascript\"\n              maxLines={10000}\n              wrapEnabled\n              showPrintMargin={false}\n              theme={userTheme || theme.palette.codeEditor}\n              width=\"100%\"\n              readOnly\n            />\n          </div>\n        )}\n      </DialogContent>\n      <DialogActions>\n        <Button\n          color=\"primary\"\n          onClick={handleClear}\n          disabled={isEqual(state, resetState(inboxUrl))}\n        >\n          Reset\n        </Button>\n        <Button\n          color=\"secondary\"\n          disabled={!params || sending || invalid}\n          onClick={() => handleRequest(JSON.parse(params))}\n        >\n          Send &nbsp;\n          <SendIcon />\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n}\n\nCreateMessageModal.propTypes = {\n  open: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  userTheme: PropTypes.string,\n  inboxUrl: PropTypes.string.isRequired,\n};\n\nCreateMessageModal.defaultProps = {\n  userTheme: null,\n};\n\nexport default CreateMessageModal;\n","import {\n  Button,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogContentText,\n  DialogTitle,\n  List,\n  ListItem,\n  ListItemText,\n  Tooltip,\n} from '@material-ui/core';\nimport { Help } from '@material-ui/icons';\nimport React from 'react';\n\nexport default function BulkModal({\n  open,\n  onClose,\n  onConfirm,\n  action,\n  thing,\n  queryString,\n  totalItems,\n}) {\n  const properAction = action.charAt(0).toUpperCase() + action.slice(1);\n\n  const description = {\n    export: (\n      <>\n        exported and uploaded to an encrypted cloud storage bucket. When the\n        export is complete, you will receive a download link via email that will\n        be valid for the next 24 hours\n      </>\n    ),\n    reprocess: {\n      runs: <>enqueued and executed sequentially. This may take some time</>,\n      messages: (\n        <>\n          enqueued and processed sequentially. They will trigger all jobs with\n          matching filters that are set to autoprocess. (I.e., the app will\n          behave as if these messages had just arrived and route them per\n          usual.) This may take some time\n        </>\n      ),\n    },\n  };\n\n  const noFlows = action == 'reprocess' && thing == 'runs';\n\n  const noFlowText = (\n    <>\n      The number sent for reprocessing may be lower than this, as it will not\n      include runs that were initiated by flow or catch triggers. However,\n      related active jobs with flow or catch triggers will be executed in\n      sequence once their parent runs have completed—i.e., flow and catch\n      triggers will be respected and evaluated per usual.\n    </>\n  );\n\n  const estimateText = (\n    <>\n      This estimate is based on your last query—likely moments ago, right before\n      you entered this {action} dialog. If new {thing} appear or if existing\n      {thing} get updated before you click \"confirm\", the total returned by this\n      query may be slightly different.\n    </>\n  );\n\n  return (\n    <Dialog open={open} onClose={onClose}>\n      <DialogTitle>\n        {properAction} {thing} with this query?\n      </DialogTitle>\n      <DialogContent>\n        <List>\n          {Object.keys(queryString)\n            .filter(k => !['perPage', 'page', 'dateRange'].includes(k))\n            .map(k => {\n              return (\n                <ListItem key={k}>\n                  <ListItemText>\n                    {k}:&nbsp;&nbsp;\n                    <code>{queryString[k] || 'any'}</code>\n                  </ListItemText>\n                </ListItem>\n              );\n            })}\n        </List>\n        <DialogContentText>\n          <em>\n            Approximate number of {thing} to {action}: <b>{totalItems}</b>{' '}\n          </em>\n          <Tooltip title={noFlows ? noFlowText : estimateText}>\n            <Help fontSize=\"inherit\" />\n          </Tooltip>\n        </DialogContentText>\n        <DialogContentText>\n          If you proceed, {thing} returned by this query will be{' '}\n          {description[action][thing] || description[action]}.\n        </DialogContentText>\n      </DialogContent>\n      <DialogActions>\n        <Button color=\"primary\" onClick={onClose}>\n          Cancel\n        </Button>\n        <Button color=\"primary\" onClick={onConfirm}>\n          {properAction} {thing}\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n}\n","import DateFnsUtils from '@date-io/date-fns';\nimport { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core';\nimport {\n  KeyboardDateTimePicker,\n  MuiPickersUtilsProvider,\n} from '@material-ui/pickers';\nimport React, { useEffect, useState } from 'react';\nimport { hoursAgo } from '../../helpers';\n\nexport default function DateFilter(props) {\n  const { classes, filterChanged, query, noNow } = props;\n\n  const [selectedStartDate, handleStartDateChange] = useState(query.startDate);\n  const [selectedEndDate, handleEndDateChange] = useState(query.endDate);\n  const [rangeChange, setRangeChange] = useState({});\n\n  useEffect(() => {\n    setRangeChange({});\n    handleStartDateChange(query.startDate);\n  }, [query.startDate]);\n\n  useEffect(() => {\n    setRangeChange({});\n    handleEndDateChange(query.endDate);\n  }, [query.endDate]);\n\n  useEffect(() => {\n    if (selectedStartDate && selectedStartDate.toString() !== 'Invalid Date') {\n      filterChanged({\n        startDate:\n          typeof selectedStartDate === 'string'\n            ? selectedStartDate\n            : selectedStartDate.toISOString(),\n        ...rangeChange,\n      });\n    }\n  }, [selectedStartDate]);\n\n  useEffect(() => {\n    if (selectedEndDate?.toString() !== 'Invalid Date') {\n      const date =\n        typeof selectedEndDate === 'string' || !selectedEndDate\n          ? selectedEndDate\n          : selectedEndDate.toISOString();\n\n      filterChanged({\n        endDate: date ?? null,\n        ...rangeChange,\n      });\n    }\n  }, [selectedEndDate]);\n\n  const customStartChangeHandler = value => {\n    setRangeChange({ dateRange: 'custom' });\n    handleStartDateChange(value);\n  };\n\n  const customEndChangeHandler = value => {\n    setRangeChange({ dateRange: 'custom' });\n    handleEndDateChange(value);\n  };\n\n  return (\n    <>\n      <FormControl className={classes.formControl}>\n        <InputLabel>Date Range</InputLabel>\n        <Select\n          onChange={e => {\n            const { value } = e.target;\n            const endDate =\n              query.jobStates || query.triggerId || noNow\n                ? new Date().toISOString()\n                : null;\n            filterChanged({\n              dateRange: value,\n              startDate: hoursAgo(value),\n              endDate,\n            });\n          }}\n          value={query.dateRange}\n        >\n          <MenuItem value={1}>Last hour</MenuItem>\n          <MenuItem value={12}>Last 12 hours</MenuItem>\n          <MenuItem value={24}>Last 24 hours</MenuItem>\n          <MenuItem value={48}>Last 48 hours</MenuItem>\n          <MenuItem value={168}>Last 7 days</MenuItem>\n          <MenuItem value={720}>Last 30 days</MenuItem>\n          <MenuItem value={2160}>Last 90 days</MenuItem>\n          <MenuItem value={4320}>Last 180 days</MenuItem>\n          <MenuItem value={8760}>Last 365 days</MenuItem>\n          <MenuItem value=\"custom\" disabled>\n            Custom\n          </MenuItem>\n        </Select>\n      </FormControl>\n      <MuiPickersUtilsProvider utils={DateFnsUtils}>\n        <KeyboardDateTimePicker\n          label=\"Created after\"\n          className={classes.formControl}\n          value={selectedStartDate}\n          onChange={customStartChangeHandler}\n          format=\"yyyy-MM-dd HH:mm:ss\"\n          showTodayButton\n          disableFuture\n        />\n        <KeyboardDateTimePicker\n          label=\"Created before\"\n          emptyLabel=\"Now (live)\"\n          className={classes.formControl}\n          value={selectedEndDate}\n          onChange={customEndChangeHandler}\n          format=\"yyyy-MM-dd HH:mm:ss\"\n          disableFuture\n        />\n      </MuiPickersUtilsProvider>\n    </>\n  );\n}\n","import { TableCell, TableRow, Typography } from '@material-ui/core';\nimport React from 'react';\n\nexport default function EmptyList(props) {\n  const { colSpan } = props;\n\n  return (\n    <>\n      <TableRow>\n        <TableCell colSpan={colSpan}>\n          <Typography>\n            Move along... there&apos;s nothing to see here.\n          </Typography>\n        </TableCell>\n      </TableRow>\n    </>\n  );\n}\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { times } from 'lodash';\nimport {\n  Button,\n  Chip,\n  Hidden,\n  LinearProgress,\n  TableCell,\n  TableRow,\n} from '@material-ui/core';\nimport PlayCircleFilledIcon from '@material-ui/icons/PlayCircleFilled';\n\nconst useStyles = makeStyles( theme => ({\n  chip: {\n    marginLeft: theme.spacing(2),\n  },\n  wait: {\n    cursor: 'wait',\n  },\n}));\n\nfunction LoadingRows(props) {\n  const {  perPage, extraChip } = props;\n  const classes = useStyles();\n  return (\n    <>\n      {times(perPage + 1, i => (\n        <TableRow className={classes.wait} key={i}>\n          <TableCell>\n            <LinearProgress />\n          </TableCell>\n          <Hidden xsDown>\n            <TableCell>\n              <LinearProgress />\n            </TableCell>\n          </Hidden>\n          <Hidden xsDown>\n            <TableCell style={{ padding: 0 }}>\n              <Chip className={classes.chip} />\n            </TableCell>\n          </Hidden>\n          {extraChip && (\n            <Hidden xsDown>\n              <TableCell style={{ padding: 0 }}>\n                <Chip className={classes.chip} />\n              </TableCell>\n            </Hidden>\n          )}\n          <TableCell style={{ padding: 0 }}>\n            <Button disabled size=\"small\">\n              loading&nbsp;\n              <PlayCircleFilledIcon />\n            </Button>\n          </TableCell>\n        </TableRow>\n      ))}\n    </>\n  );\n}\n\nexport default LoadingRows;\n","import { TableCell, TableRow, Typography } from '@material-ui/core';\nimport React from 'react';\nexport default function RowError(props) {\n  const { colSpan, error } = props;\n  return (\n    <>\n      <TableRow>\n        <TableCell colSpan={colSpan}>\n          <Typography>\n            {typeof error == 'string'\n              ? error\n              : \"Sorry, that's an error. Please refresh your page or check your parameters.\"}\n          </Typography>\n        </TableCell>\n      </TableRow>\n    </>\n  );\n}\n","import {\n  Button,\n  Chip,\n  Hidden,\n  LinearProgress,\n  TableCell,\n  TableRow,\n  Tooltip,\n} from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport PlayCircleFilledIcon from '@material-ui/icons/PlayCircleFilled';\nimport React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { fullDate, humanReadable, tableTime } from '../helpers';\nimport { projectReceiptInspectPath, runShowPath } from '../helpers/pathHelpers';\nimport ExitCodeIcon from './ExitCodeIcon';\n\nconst styles = theme => ({\n  chip: {\n    paddingLeft: theme.spacing(1),\n    margin: theme.spacing(1),\n    wordBreak: 'break-all',\n    maxWidth: '25em',\n  },\n  loading: {\n    margin: theme.spacing(2),\n  },\n  chipArray: {\n    padding: 0,\n    wordBreak: 'break-all',\n  },\n  clickable: {\n    cursor: 'pointer',\n  },\n  icon: {\n    marginLeft: theme.spacing(0.5),\n  },\n  playButton: {\n    margin: theme.spacing(0.5),\n  },\n});\n\nfunction ReceiptItem(props) {\n  const history = useHistory();\n  const {\n    order,\n    onClick,\n    createRun,\n    receipt,\n    classes,\n    onRunClick,\n    receiptJobStateError,\n    project,\n  } = props;\n\n  const { id, insertedAt, receiptJobStates, matches } = receipt;\n\n  const rjsLabels = (\n    <span>\n      {receiptJobStateError && 'error loading'}\n      {receiptJobStates == null && !receiptJobStateError && (\n        <LinearProgress className={classes.loading} />\n      )}\n      {receiptJobStates != null &&\n        !receiptJobStateError &&\n        receiptJobStates.map(run => {\n          const handleRunClick = e => {\n            e.stopPropagation();\n            onRunClick(\n              run.exitCode === null\n                ? projectReceiptInspectPath(project, receipt)\n                : runShowPath(project, run),\n              history\n            )(e);\n          };\n\n          return (\n            <Tooltip\n              key={run.id}\n              title={\n                run.job\n                  ? `View last related run for ${run.job.name}.`\n                  : 'Loading job info...'\n              }\n            >\n              <Chip\n                className={classes.chip}\n                onClick={run.job && handleRunClick}\n                label={run.job?.name || 'Loading job info'}\n                avatar={<ExitCodeIcon exitCode={run.exitCode} />}\n              />\n            </Tooltip>\n          );\n        })}\n    </span>\n  );\n\n  const matchLabels = matches\n    ? matches.map(match => {\n        const handleJobClick = e => {\n          e.stopPropagation();\n          createRun(match.job, receipt);\n        };\n\n        return (\n          <Tooltip\n            key={`${id}-${match.job?.name}-${match.trigger?.id}`}\n            title={`Run ${match.job?.name} on this message now.`}\n          >\n            <Button\n              className={classes.playButton}\n              size=\"small\"\n              variant=\"outlined\"\n              onClick={handleJobClick}\n            >\n              {match.job?.name}\n              <PlayCircleFilledIcon fontSize=\"small\" className={classes.icon} />\n            </Button>\n          </Tooltip>\n        );\n      })\n    : null;\n\n  return (\n    <TableRow\n      hover\n      id={id}\n      key={`row-${id}`}\n      className={classes.clickable}\n      onClick={onClick}\n      style={{ verticalAlign: 'initial' }}\n    >\n      <TableCell>\n        <Tooltip title={fullDate(insertedAt)}>\n          <span>{tableTime(insertedAt)}</span>\n        </Tooltip>\n      </TableCell>\n      <Hidden xsDown>\n        <TableCell>\n          <Tooltip title={id}>\n            <code>{humanReadable(id)}</code>\n          </Tooltip>\n        </TableCell>\n      </Hidden>\n      <TableCell\n        className={classes.chipArray}\n        style={{ wordBreak: 'break-all' }}\n      >\n        {rjsLabels.length === 0 ? '- -' : rjsLabels}\n      </TableCell>\n      <Hidden xsDown>\n        <TableCell className={classes.chipArray}>{matchLabels}</TableCell>\n      </Hidden>\n    </TableRow>\n  );\n}\n\nexport default withStyles(styles, {\n  withTheme: true,\n  name: 'App',\n})(ReceiptItem);\n","import {\n  FormControl,\n  Hidden,\n  IconButton,\n  Input,\n  InputLabel,\n  MenuItem,\n  Paper,\n  Select,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  Tooltip,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ClearIcon from '@material-ui/icons/HighlightOff';\nimport CloudDownloadIcon from '@material-ui/icons/CloudDownload';\nimport HelpIcon from '@material-ui/icons/Help';\nimport LinkIcon from '@material-ui/icons/Link';\nimport PlaylistPlayIcon from '@material-ui/icons/PlaylistPlay';\nimport { isEmpty, orderBy, values } from 'lodash';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport {\n  NumberParam,\n  StringParam,\n  useQueryParams,\n  withDefault,\n} from 'use-query-params';\nimport { joinChannel } from '../actions/ChannelActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport Notifications from '../actions/Notifications';\nimport {\n  exportReceipts,\n  fetchReceiptsAndJobStates,\n  processReceipts,\n  receiveReceipt,\n  refreshReceipt,\n} from '../actions/ReceiptActions';\nimport { createRun, receiveRun } from '../actions/RunActions';\nimport { fetchTriggers } from '../actions/TriggerActions';\nimport { hoursAgo, linkTo, validJson } from '../helpers';\nimport { projectReceiptInspectPath } from '../helpers/pathHelpers';\nimport {\n  attachMatches,\n  attachReceiptJobStates,\n  selectCurrentUser,\n  selectReceiptError,\n  selectReceiptJobStateError,\n  selectReceipts,\n  selectReceiptsLoading,\n  selectReceiptsPagination,\n  selectTriggers,\n} from '../selectors';\nimport CreateMessageModal from './CreateMessageModal';\nimport BulkModal from './ListViews/BulkModal';\nimport DateFilter from './ListViews/DateFilter';\nimport EmptyList from './ListViews/EmptyList';\nimport LoadingRows from './ListViews/LoadingRows';\nimport RowError from './ListViews/RowError';\nimport PaginationControls from './PaginationControls';\nimport QueueStatus from './QueueStatus';\nimport ReceiptItem from './ReceiptItem';\nimport SectionFrame from './SectionFrame';\n\nconst defaultFilter = {\n  jobStates: '',\n  triggerId: '',\n  searchString: '',\n  startDate: hoursAgo(720),\n  endDate: null,\n  dateRange: 720,\n  perPage: 10,\n  page: 1,\n};\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    display: 'flex',\n    flexWrap: 'wrap',\n    flexGrow: 1,\n  },\n  flex: {\n    flexGrow: 1,\n  },\n  label: {\n    position: 'relative',\n    paddingRight: 25,\n    '&+div': {\n      marginTop: 0,\n      '&:before': {},\n      '&:after': {\n        bottom: 5,\n      },\n      svg: {\n        top: 0,\n      },\n    },\n  },\n  formControl: {\n    margin: theme.spacing(1),\n  },\n  selectEmpty: {\n    marginTop: theme.spacing(2),\n  },\n  rightIcon: {\n    marginLeft: theme.spacing(1),\n  },\n  belowTable: {\n    marginTop: theme.spacing(2),\n  },\n  chip: {\n    paddingLeft: theme.spacing(1),\n    margin: theme.spacing(0.5),\n  },\n  bottomSpace: {\n    marginBottom: theme.spacing(6),\n  },\n}));\n\nfunction ActionButtons(props) {\n  const {\n    filterChanged,\n    classes,\n    url,\n    selectedProject,\n    receiptsLength,\n    isLoading,\n    onReprocessClick,\n    onExportClick,\n    defaultFilters,\n    setSearchText,\n  } = props;\n  return (\n    <>\n      <Tooltip title=\"Clear filters\">\n        <IconButton\n          onClick={() => {\n            setSearchText('');\n            filterChanged(defaultFilters);\n          }}\n          className={classes.selectEmpty}\n        >\n          <ClearIcon />\n        </IconButton>\n      </Tooltip>\n      <CopyToClipboard text={url}>\n        <Tooltip title=\"Copy the 'inbox URL' for this project.\">\n          <IconButton id=\"inbox_url_button\" className={classes.selectEmpty}>\n            <LinkIcon />\n          </IconButton>\n        </Tooltip>\n      </CopyToClipboard>\n      <Tooltip title=\"Reprocess all messages matching the current query.\">\n        <IconButton onClick={onReprocessClick} className={classes.selectEmpty}>\n          <PlaylistPlayIcon />\n        </IconButton>\n      </Tooltip>\n      <Tooltip\n        title={\n          selectedProject.userRole\n            ? 'Export all messages matching this query to CSV.'\n            : 'Only admins and owners can create CSV exports.'\n        }\n      >\n        <span style={{ display: 'inline-block' }}>\n          <IconButton\n            id=\"export_button\"\n            className={classes.selectEmpty}\n            onClick={onExportClick}\n            disabled={\n              (!isLoading && receiptsLength === 0) || !selectedProject.userRole\n            }\n          >\n            <CloudDownloadIcon />\n          </IconButton>\n        </span>\n      </Tooltip>\n    </>\n  );\n}\n\nfunction MatchingTriggersFilter(props) {\n  const { classes, query, filterChanged, triggers } = props;\n  return (\n    <>\n      <FormControl className={classes.formControl}>\n        <InputLabel htmlFor=\"trigger-filter\" className={classes.label}>\n          Matching Trigger\n        </InputLabel>\n        <Select\n          onChange={e => {\n            const triggerId = e.target.value;\n            const endDate = query.endDate\n              ? query.endDate\n              : new Date().toISOString();\n            filterChanged({\n              triggerId,\n              endDate,\n              dateRange: 'custom',\n            });\n          }}\n          value={query.triggerId}\n          inputProps={{\n            name: 'Matching Trigger',\n            id: 'trigger-filter',\n          }}\n        >\n          <MenuItem value=\"\">\n            <em>No constraint</em>\n          </MenuItem>\n          {triggers.map(t => (\n            <MenuItem key={t.id} value={t.id}>\n              {t.name}\n            </MenuItem>\n          ))}\n        </Select>\n      </FormControl>\n    </>\n  );\n}\n\nfunction RelatedRunsFilter(props) {\n  const { classes, query, filterChanged } = props;\n  return (\n    <>\n      <FormControl className={classes.formControl}>\n        <InputLabel htmlFor=\"age-helper\" className={classes.label}>\n          Related Runs\n        </InputLabel>\n        <Select\n          autoWidth\n          onChange={e => {\n            const jobStates = e.target.value;\n            const endDate = query.endDate\n              ? query.endDate\n              : new Date().toISOString();\n            filterChanged({\n              jobStates,\n              endDate,\n              dateRange: 'custom',\n            });\n          }}\n          value={query.jobStates}\n          input={<Input name=\"age\" id=\"age-helper\" />}\n        >\n          <MenuItem value=\"\">\n            <em>No constraint</em>\n          </MenuItem>\n          <MenuItem value=\"fail\">Last run/job failed</MenuItem>\n          <MenuItem value=\"none\">Without any runs</MenuItem>\n        </Select>\n      </FormControl>\n    </>\n  );\n}\n\nfunction ReceiptsFilterBar(props) {\n  const { classes, filterChanged, query, triggers } = props;\n  return (\n    <>\n      <MatchingTriggersFilter\n        classes={classes}\n        filterChanged={filterChanged}\n        query={query}\n        triggers={triggers}\n      />\n      <RelatedRunsFilter\n        classes={classes}\n        filterChanged={filterChanged}\n        query={query}\n        triggers={triggers}\n      />\n    </>\n  );\n}\n\nfunction FilterBar(props) {\n  const {\n    setShowCreateModal,\n    filterChanged,\n    selectedProject,\n    receipts,\n    isLoading,\n    onReprocessClick,\n    onExportClick,\n    defaultFilters,\n    classes,\n    query,\n    triggers,\n    url,\n  } = props;\n\n  const [searchText, setSearchText] = useState('');\n\n  const onEnterPress = e => {\n    if (e.keyCode === 13) {\n      if (searchText === '' || validJson(searchText)) {\n        const endDate = query.endDate\n          ? query.endDate\n          : new Date().toISOString();\n        filterChanged({\n          endDate,\n          searchString: searchText,\n          page: 1,\n          dateRange: 'custom',\n        });\n      }\n    }\n  };\n\n  return (\n    <>\n      <SectionFrame\n        section=\"message\"\n        create={() => setShowCreateModal(true)}\n        search={e => {\n          const { value } = e.target;\n          setSearchText(value);\n        }}\n        onSearchKeyDown={onEnterPress}\n        searchText={searchText}\n        jsonOnly\n        placeholder={`{\"a\": {\"b\": 1}}`}\n        helper={`Enter valid JSON and press enter. Like trigger criteria,\n          message body searches uses exact JSON paths. Enter {\"meta\":\n          {\"country\": \"Peru\"}} to find messages WHERE body @> '{\"meta\":\n          {\"country\": \"Peru\"}}' or {\"form\": {}} to find all messages with a form\n          key whose value is an object. For large inboxes, unfiltered searches\n          may take up to 15 seconds. Consider using the 'Search Console' to find\n          specific messages.`}\n        filters={\n          <span>\n            <DateFilter\n              classes={classes}\n              filterChanged={filterChanged}\n              query={query}\n            />\n            <ReceiptsFilterBar\n              classes={classes}\n              filterChanged={filterChanged}\n              query={query}\n              triggers={triggers}\n            />\n          </span>\n        }\n        actions={\n          <span>\n            <ActionButtons\n              filterChanged={filterChanged}\n              classes={classes}\n              url={url}\n              selectedProject={selectedProject}\n              receiptsLength={receipts.length}\n              isLoading={isLoading}\n              onReprocessClick={onReprocessClick}\n              onExportClick={onExportClick}\n              defaultFilters={defaultFilters}\n              setSearchText={setSearchText}\n            />\n          </span>\n        }\n      />\n    </>\n  );\n}\n\nfunction ReceiptsList({ selectedProject }) {\n  const [showCreateModal, setShowCreateModal] = useState(false);\n  const [exportModalVisible, setExportModalVisible] = useState(false);\n  const [reprocessModalVisible, setReprocessModalVisible] = useState(false);\n  const [lastArrival, setArrival] = useState(Date.now());\n  const dispatch = useDispatch();\n\n  const history = useHistory();\n\n  const classes = useStyles();\n\n  const [queryObj, setQuery] = useQueryParams({\n    jobStates: withDefault(StringParam, ''),\n    triggerId: withDefault(StringParam, ''),\n    searchString: withDefault(StringParam, ''),\n    startDate: withDefault(StringParam, hoursAgo(720)),\n    endDate: withDefault(StringParam, null),\n    dateRange: withDefault(StringParam, '720'),\n    perPage: withDefault(NumberParam, 10),\n    page: withDefault(NumberParam, 1),\n  });\n\n  const query = useMemo(() => queryObj, [Object.values(queryObj).join()]);\n  const projectId = selectedProject.id;\n\n  const user = useSelector(selectCurrentUser);\n  const userTheme = user.theme;\n\n  const receiptsWithJobStates = useSelector(attachReceiptJobStates);\n  const receiptsWithMatches = useSelector(attachMatches);\n  const error = useSelector(selectReceiptError);\n  const receiptJobStateError = useSelector(selectReceiptJobStateError);\n  const isLoading = useSelector(selectReceiptsLoading);\n  const pagination = useSelector(selectReceiptsPagination);\n  const allReceipts = useSelector(selectReceipts);\n\n  const receipts = orderBy(allReceipts, 'insertedAt', 'desc')\n    .map(receiptsWithJobStates)\n    .map(receiptsWithMatches);\n\n  const allTriggers = useSelector(selectTriggers);\n\n  const triggers = orderBy(values(allTriggers), ['name'])\n    .filter(t => t.type === 'message')\n    .filter(t => t.criteria != null);\n\n  const handleReceiveReceipt = payload => {\n    dispatch(receiveReceipt(payload, query.page, query));\n  };\n\n  const handleReceiveRun = payload => {\n    setArrival(Date.now());\n    dispatch(receiveRun(payload));\n    const receiptId = payload.runs[0].receipt_id;\n    if (receiptId) {\n      dispatch(refreshReceipt({ id: receiptId }));\n    }\n  };\n\n  const handleReprocessOne = useCallback((job, receipt) => {\n    setArrival(Date.now());\n    dispatch(createRun(job, receipt));\n  }, []);\n\n  const filterChanged = filterParams => {\n    setQuery(\n      prevQuery => ({\n        ...prevQuery,\n        ...filterParams,\n      }),\n      'replace'\n    );\n  };\n\n  const showExportModal = () => setExportModalVisible(true);\n  const acceptExport = useCallback(() => {\n    setExportModalVisible(false);\n    dispatch(\n      Notifications.add(\n        'Your export order has been submitted for processing.',\n        'success'\n      )\n    );\n    exportReceipts({ projectId, filter: { export: 'csv', ...query } });\n  }, [\n    projectId,\n    query.startDate,\n    query.endDate,\n    query.triggerId,\n    query.jobStates,\n    query.searchString,\n  ]);\n\n  const showReprocessModal = () => setReprocessModalVisible(true);\n  const hideReprocessModal = () => setReprocessModalVisible(false);\n  const acceptReprocess = useCallback(\n    query => {\n      hideReprocessModal();\n      dispatch(\n        processReceipts({\n          projectId: projectId,\n          filter: query,\n        })\n      );\n    },\n    [projectId]\n  );\n\n  const url = [\n    window.location.protocol,\n    '',\n    window.location.host,\n    'inbox',\n    selectedProject.address,\n  ].join('/');\n\n  useEffect(() => {\n    dispatch(switchedMenu('Inbox'));\n    document.title = 'Inbox - OpenFn';\n  }, []);\n\n  useEffect(() => {\n    if (projectId) {\n      // ProjectScope makes sure the jobs have been loaded right?\n      // dispatch(fetchJobs({ projectId }));\n      dispatch(fetchTriggers(selectedProject));\n\n      const leaveReceiptsChannel = dispatch(\n        joinChannel(`receipts:${projectId}`, {\n          new: handleReceiveReceipt,\n          updated: handleReceiveReceipt,\n        })\n      );\n\n      const leaveRunsChannel = dispatch(\n        joinChannel(`runs:${projectId}`, {\n          new: handleReceiveRun,\n          updated: handleReceiveRun,\n        })\n      );\n\n      return () => {\n        leaveReceiptsChannel();\n        leaveRunsChannel();\n      };\n    }\n  }, [projectId]);\n\n  useEffect(() => {\n    if (projectId) {\n      dispatch(\n        fetchReceiptsAndJobStates({\n          projectId,\n          filter: query,\n          page: query.page,\n          perPage: query.perPage,\n        })\n      );\n    }\n  }, [projectId, JSON.stringify(query)]);\n\n  return (\n    <>\n      <FilterBar\n        setShowCreateModal={() => setShowCreateModal(true)}\n        filterChanged={filterChanged}\n        selectedProject={selectedProject}\n        receipts={receipts}\n        isLoading={isLoading}\n        onReprocessClick={showReprocessModal}\n        onExportClick={showExportModal}\n        defaultFilters={defaultFilter}\n        classes={classes}\n        query={query}\n        triggers={triggers}\n        url={url}\n      />\n      <Paper elevation={2} className={classes.bottomSpace}>\n        <Table>\n          <TableHead>\n            <TableRow>\n              <TableCell>Date Received</TableCell>\n              <Hidden xsDown>\n                <TableCell>Message ID</TableCell>\n              </Hidden>\n              <TableCell>\n                Last Run per Job&nbsp;\n                <Tooltip\n                  title={\n                    <div>\n                      These &quot;job-state&quot; chips each link to the{' '}\n                      <em>last</em> run for each job, per receipt. This provides\n                      a useful view of \"whether or not a particular message has\n                      eventually been handled properly\" for some projects where\n                      reprocessing messages <em>until</em> they succeed is\n                      common.\n                    </div>\n                  }\n                >\n                  <HelpIcon fontSize=\"inherit\" />\n                </Tooltip>\n              </TableCell>\n              <Hidden xsDown>\n                <TableCell>\n                  Matching Jobs&nbsp;\n                  <Tooltip\n                    title={\n                      <div>\n                        Each row contains the jobs whose triggers which match\n                        that message. Click on one to start a run.\n                      </div>\n                    }\n                  >\n                    <HelpIcon fontSize=\"inherit\" />\n                  </Tooltip>\n                </TableCell>\n              </Hidden>\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            <QueueStatus project={selectedProject} lastArrival={lastArrival} />\n            {isLoading && <LoadingRows perPage={query.perPage} />}\n            {!isLoading &&\n              receipts.map((receipt, i) => (\n                <ReceiptItem\n                  receipt={receipt}\n                  onClick={linkTo(\n                    projectReceiptInspectPath(selectedProject, receipt),\n                    history\n                  )}\n                  onRunClick={linkTo}\n                  key={receipt.id}\n                  receiptJobStateError={receiptJobStateError}\n                  order={i}\n                  createRun={handleReprocessOne}\n                  project={selectedProject}\n                />\n              ))}\n            {!(isLoading || error || receipts.length > 0) && (\n              <EmptyList colSpan={4} />\n            )}\n            {!isEmpty(error) && <RowError error={error} colsSpan={4} />}\n          </TableBody>\n        </Table>\n        <PaginationControls\n          className={classes.paginationControls}\n          numberPerPage={query.perPage}\n          totalPages={pagination.totalPages}\n          currentPage={query.page}\n          onChange={filterChanged}\n        />\n      </Paper>\n      <CreateMessageModal\n        open={showCreateModal}\n        onClose={() => setShowCreateModal(false)}\n        userTheme={userTheme}\n        inboxUrl={url}\n      />\n      <BulkModal\n        open={reprocessModalVisible}\n        onClose={hideReprocessModal}\n        onConfirm={() => acceptReprocess(query)}\n        thing=\"messages\"\n        action=\"reprocess\"\n        queryString={query}\n        totalItems={pagination.total}\n      />\n      <BulkModal\n        open={exportModalVisible}\n        onClose={() => setExportModalVisible(false)}\n        onConfirm={acceptExport}\n        thing=\"messages\"\n        action=\"export\"\n        queryString={query}\n        totalItems={pagination.total}\n      />\n    </>\n  );\n}\n\nexport default ReceiptsList;\n","import {\n  Avatar,\n  Card,\n  CardContent,\n  CardHeader,\n  CircularProgress,\n  IconButton,\n  Tooltip,\n  Grid,\n  AccordionDetails,\n  AccordionSummary,\n  Accordion,\n} from '@material-ui/core/';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport {\n  Cancel as CancelIcon,\n  ExpandMore,\n  Help as HelpIcon,\n  Mail as MailIcon,\n  Save as SaveIcon,\n  Undo as UndoIcon,\n} from '@material-ui/icons';\nimport React, { useEffect, useRef } from 'react';\nimport { Field, Form } from 'react-final-form';\nimport KeyBinding from 'react-keybinding-component';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { switchedMenu } from '../actions/MenuActions';\nimport { fetchReceiptById, updateReceipt } from '../actions/ReceiptActions';\nimport { UnprocessableEntity } from '../errors';\nimport { createFormErrors, formatTime, formSaveKeys } from '../helpers';\nimport { AceEditor } from './CodeEditor';\nimport TextInput from './FormHelpers/TextInput';\nimport { projectReceiptInspectPath } from '../helpers/pathHelpers';\nimport { isEqual } from 'lodash';\n\nconst useStyles = makeStyles(theme => ({\n  notes: {\n    width: '100%',\n  },\n  invalidBody: {\n    backgroundColor: theme.palette.error.main,\n    color: 'white',\n    textAlign: 'center',\n  },\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n}));\n\nfunction ReceiptView({ selectedProject }) {\n  const dispatch = useDispatch();\n  const history = useHistory();\n  const classes = useStyles();\n  const theme = useTheme();\n\n  const jsonEditor = useRef();\n\n  const { id: receiptId } = useParams();\n  const receipt = useSelector(\n    state => state.receipts.items[receiptId],\n    isEqual\n  );\n  const initialValues = receipt;\n\n  const user =\n    useSelector(state => state.users.items[state.auth.currentUserId]) || {};\n  const insertedAt = initialValues ? initialValues.insertedAt : null;\n  const method = initialValues ? initialValues.method : null;\n  const userTheme = user.theme;\n\n  useHotkeys('/, command+f, ctrl+f', e => {\n    e.preventDefault();\n    jsonEditor?.current?.editor?.execCommand('find');\n  });\n\n  useEffect(() => {\n    dispatch(switchedMenu('Inbox'));\n    document.title = 'Message Editor - OpenFn';\n  }, [dispatch]);\n\n  useEffect(() => {\n    dispatch(fetchReceiptById(receiptId));\n  }, [receiptId, dispatch]);\n\n  const submit = async values => {\n    try {\n      const result = await updateReceipt(values)(dispatch);\n      history.push(projectReceiptInspectPath(selectedProject, result));\n    } catch (error) {\n      if (error instanceof UnprocessableEntity)\n        return createFormErrors(error.errors, values);\n      throw error;\n    }\n  };\n\n  const bodyEditor = field => {\n    const value =\n      typeof field.input.value == 'object'\n        ? JSON.stringify(field.input.value, null, 2)\n        : field.input.value;\n\n    return (\n      <div\n        style={{\n          flexGrow: 1,\n          position: 'relative',\n          height: '100%',\n        }}\n      >\n        <AceEditor\n          ref={jsonEditor}\n          minLines={5}\n          mode=\"json\"\n          editorProps={{ $blockScrolling: Infinity }}\n          name={field.input.name}\n          onChange={field.input.onChange}\n          onFocus={field.input.onFocus}\n          showPrintMargin={false}\n          tabSize={2}\n          theme={userTheme || theme.palette.codeEditor}\n          value={value || ''}\n          width=\"100%\"\n          height=\"100%\"\n          style={{\n            position: 'absolute',\n            left: 0,\n            right: 0,\n            top: 0,\n            bottom: 0,\n          }}\n          onFocus={() => jsonEditor?.current?.editor?.resize()}\n        />\n      </div>\n    );\n  };\n\n  return (\n    <Form\n      onSubmit={submit}\n      initialValues={initialValues}\n      validate={values => {\n        const errors = {};\n        if (typeof values.body == 'object') {\n          try {\n            JSON.parse(JSON.stringify(values.body));\n          } catch (e) {\n            errors.body = 'This is not valid JSON.';\n          }\n        } else {\n          try {\n            JSON.parse(values.body);\n          } catch (e) {\n            errors.body = 'This is not valid JSON.';\n          }\n        }\n        setTimeout(function () {\n          jsonEditor?.current?.editor?.resize();\n        }, 10);\n        return errors;\n      }}\n      render={({\n        handleSubmit,\n        submitting,\n        invalid,\n        dirtySinceLastSubmit,\n        pristine,\n        form,\n        submitErrors,\n      }) => {\n        if (submitErrors instanceof Error) {\n          throw submitErrors;\n        }\n\n        return (\n          <Grid\n            container\n            direction=\"row\"\n            justifyContent=\"center\"\n            alignItems=\"stretch\"\n            style={{ height: '100%' }}\n          >\n            <Grid item xs={12} md={10} xl={8}>\n              <Card style={{ height: '100%' }}>\n                <div\n                  style={{\n                    flexDirection: 'column',\n                    display: 'flex',\n                    height: '100%',\n                  }}\n                >\n                  <form\n                    onSubmit={handleSubmit}\n                    style={{\n                      height: '100%',\n                      display: 'flex',\n                      flexDirection: 'column',\n                    }}\n                  >\n                    <CardHeader\n                      avatar={\n                        <Avatar className={classes.avatar}>\n                          <MailIcon />\n                        </Avatar>\n                      }\n                      title={\n                        <span>\n                          Edit message <code>{receiptId}</code>\n                        </span>\n                      }\n                      subheader={`${method} request received on ${formatTime(\n                        insertedAt,\n                        'PPPPpppp'\n                      )}`}\n                      action={\n                        <span>\n                          <Tooltip title=\"Cancel\" component=\"span\">\n                            <IconButton onClick={() => history.goBack()}>\n                              <CancelIcon />\n                            </IconButton>\n                          </Tooltip>\n                          <Tooltip\n                            title=\"Reset to last saved state\"\n                            component=\"span\"\n                          >\n                            <IconButton onClick={form.reset}>\n                              <UndoIcon />\n                            </IconButton>\n                          </Tooltip>\n                          <Tooltip title=\"Save\" component=\"span\">\n                            <IconButton\n                              disabled={\n                                submitting ||\n                                pristine ||\n                                (invalid && !dirtySinceLastSubmit)\n                              }\n                              id=\"submit\"\n                              onClick={handleSubmit}\n                            >\n                              {submitting ? <CircularProgress /> : <SaveIcon />}\n                            </IconButton>\n                          </Tooltip>\n                        </span>\n                      }\n                    />\n                    <Accordion\n                      defaultExpanded\n                      style={{ margin: 0, width: '100%' }}\n                      onChange={() => {\n                        setTimeout(function () {\n                          jsonEditor?.current?.editor?.resize();\n                        }, 250);\n                      }}\n                    >\n                      <AccordionSummary expandIcon={<ExpandMore />}>\n                        Change Notes&nbsp;\n                        <Tooltip title=\"Describe the change you're making to the message body, in brief. The original will be preserved.\">\n                          <HelpIcon fontSize=\"inherit\" />\n                        </Tooltip>\n                      </AccordionSummary>\n                      <AccordionDetails>\n                        <CardContent className={classes.notes}>\n                          <Field\n                            id=\"change_notes\"\n                            name=\"notes\"\n                            type=\"textarea\"\n                            placeholder=\"Describe your changes...\"\n                            component={TextInput}\n                            fullWidth\n                          />\n                        </CardContent>\n                      </AccordionDetails>\n                    </Accordion>\n                    <Field name=\"body\" component={bodyEditor} />\n                  </form>\n                  {invalid && (\n                    <div className={classes.invalidBody}>\n                      That's not valid JSON.\n                    </div>\n                  )}\n                </div>\n              </Card>\n              <KeyBinding onKey={e => formSaveKeys(e, handleSubmit)} />\n            </Grid>\n          </Grid>\n        );\n      }}\n    />\n  );\n}\n\nexport default ReceiptView;\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n  FormControl,\n  Hidden,\n  IconButton,\n  InputLabel,\n  MenuItem,\n  Paper,\n  Select,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  Tooltip,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  HighlightOff as HighlightOffIcon,\n  CloudDownload as CloudDownloadIcon,\n  Help as HelpIcon,\n  PlaylistPlay as PlaylistPlayIcon,\n} from '@material-ui/icons';\nimport { orderBy, values } from 'lodash';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport {\n  NumberParam,\n  StringParam,\n  useQueryParams,\n  withDefault,\n} from 'use-query-params';\nimport { joinChannel } from '../actions/ChannelActions';\nimport { fetchJobs } from '../actions/JobActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport Notifications from '../actions/Notifications';\nimport {\n  createRun,\n  createRuns,\n  exportRuns,\n  loadRuns,\n  receiveRun,\n} from '../actions/RunActions';\nimport { fetchTriggers } from '../actions/TriggerActions';\nimport { hoursAgo, linkTo, RunItemPresenter } from '../helpers';\nimport { runShowPath } from '../helpers/pathHelpers';\nimport {\n  selectJobs,\n  selectRuns,\n  selectRunsLoading,\n  selectRunsPagination,\n  selectTriggers,\n} from '../selectors';\nimport BulkModal from './ListViews/BulkModal';\nimport DateFilter from './ListViews/DateFilter';\nimport EmptyList from './ListViews/EmptyList';\nimport LoadingRows from './ListViews/LoadingRows';\nimport PaginationControls from './PaginationControls';\nimport QueueStatus from './QueueStatus';\nimport RunItem from './RunItem';\nimport SectionFrame from './SectionFrame';\n\nconst defaultFilter = {\n  jobId: '',\n  success: '',\n  searchString: '',\n  startDate: hoursAgo(720),\n  endDate: null,\n  dateRange: 720,\n  searchString: '',\n  perPage: 10,\n  page: 1,\n};\n\nconst useStyles = makeStyles(theme => ({\n  paginationControls: {\n    display: 'inline-block',\n    marginTop: theme.spacing(2),\n    float: 'right !important',\n  },\n  belowTable: {\n    marginTop: theme.spacing(2),\n  },\n  formControl: {\n    margin: theme.spacing(1),\n  },\n  label: {\n    position: 'relative',\n    paddingRight: 25,\n    '&+div': {\n      marginTop: 0,\n      '&:before': {},\n      '&:after': {\n        bottom: 5,\n      },\n      svg: {\n        top: 0,\n      },\n    },\n  },\n  chip: {\n    paddingLeft: theme.spacing(1),\n    margin: theme.spacing(0.5),\n  },\n  selectEmpty: {\n    marginTop: theme.spacing(2),\n  },\n  bottomSpace: {\n    marginBottom: theme.spacing(6),\n  },\n}));\n\nfunction ActionButtons(props) {\n  const {\n    filterChanged,\n    classes,\n    selectedProject,\n    runs,\n    isLoading,\n    onExportClick,\n    defaultFilters,\n    onBulkRetryClick,\n    setSearchText,\n  } = props;\n  return (\n    <>\n      <Tooltip title=\"Clear filters\" component=\"span\">\n        <IconButton\n          onClick={() => {\n            setSearchText('');\n            filterChanged(defaultFilters);\n          }}\n          className={classes.selectEmpty}\n        >\n          <HighlightOffIcon />\n        </IconButton>\n      </Tooltip>\n      <Tooltip\n        title=\"Retry all runs matching the current query.\"\n        component=\"span\"\n      >\n        <IconButton onClick={onBulkRetryClick} className={classes.selectEmpty}>\n          <PlaylistPlayIcon />\n        </IconButton>\n      </Tooltip>\n      <Tooltip\n        title={\n          selectedProject.userRole\n            ? 'Export all runs matching this query to CSV.'\n            : 'Only admins and owners can create CSV exports.'\n        }\n        component=\"span\"\n      >\n        <span style={{ display: 'inline-block' }}>\n          <IconButton\n            id=\"export_button\"\n            className={classes.selectEmpty}\n            onClick={onExportClick}\n            disabled={\n              (!isLoading && runs.length === 0) || !selectedProject.userRole\n            }\n          >\n            <CloudDownloadIcon />\n          </IconButton>\n        </span>\n      </Tooltip>\n    </>\n  );\n}\n\nfunction JobFilter(props) {\n  const { classes, query, filterChanged, jobs } = props;\n  return (\n    <>\n      <FormControl className={classes.formControl}>\n        <InputLabel htmlFor=\"trigger-filter\" className={classes.label}>\n          Job\n        </InputLabel>\n        <Select\n          onChange={e => {\n            const jobId = e.target.value;\n            const endDate = query.endDate\n              ? query.endDate\n              : new Date().toISOString();\n            filterChanged({\n              jobId,\n              endDate,\n              dateRange: 'custom',\n            });\n          }}\n          value={query.jobId}\n        >\n          <MenuItem value=\"\">\n            <em>Any</em>\n          </MenuItem>\n          {jobs.map(t => (\n            <MenuItem key={t.id} value={t.id}>\n              {t.name}\n            </MenuItem>\n          ))}\n        </Select>\n      </FormControl>\n    </>\n  );\n}\n\nfunction SuccessFilter(props) {\n  const { classes, query, filterChanged } = props;\n  return (\n    <>\n      <FormControl className={classes.formControl}>\n        <InputLabel htmlFor=\"age-helper\" className={classes.label}>\n          Status\n        </InputLabel>\n        <Select\n          onChange={e => {\n            const success = e.target.value;\n            const endDate = query.endDate\n              ? query.endDate\n              : new Date().toISOString();\n            filterChanged({\n              success,\n              endDate,\n              dateRange: 'custom',\n            });\n          }}\n          value={query.success}\n        >\n          <MenuItem value=\"\">Any</MenuItem>\n          <MenuItem value=\"0\">Success</MenuItem>\n          <MenuItem value=\"1\">Failure</MenuItem>\n        </Select>\n      </FormControl>\n    </>\n  );\n}\n\nfunction RunsFilterBar(props) {\n  const { classes, filterChanged, query, jobs } = props;\n  return (\n    <>\n      <JobFilter\n        classes={classes}\n        filterChanged={filterChanged}\n        query={query}\n        jobs={jobs}\n      />\n      <SuccessFilter\n        classes={classes}\n        filterChanged={filterChanged}\n        query={query}\n      />\n    </>\n  );\n}\n\nfunction FilterBar(props) {\n  const {\n    filterChanged,\n    selectedProject,\n    runs,\n    isLoading,\n    onBulkRetryClick,\n    onExportClick,\n    defaultFilters,\n    classes,\n    query,\n    jobs,\n  } = props;\n\n  const [searchText, setSearchText] = useState('');\n\n  const onEnterPress = e => {\n    if (e.keyCode === 13) {\n      const endDate = query.endDate ? query.endDate : new Date().toISOString();\n      filterChanged({\n        endDate,\n        searchString: searchText,\n        page: 1,\n        dateRange: 'custom',\n      });\n    }\n  };\n\n  return (\n    <>\n      <SectionFrame\n        section=\"Run Log\"\n        search={e => {\n          const { value } = e.target;\n          setSearchText(value);\n        }}\n        onSearchKeyDown={onEnterPress}\n        searchText={searchText}\n        helper=\"Type a string and press enter. This is a 'tsvector' search with\n          prefix matching. If you've got a lot of data, it could take up to 15\n          seconds or even time out. Consider using the 'Search Console' to find\n          specific runs.\"\n        filters={\n          <span>\n            <DateFilter\n              classes={classes}\n              filterChanged={filterChanged}\n              query={query}\n            />\n            <RunsFilterBar\n              classes={classes}\n              filterChanged={filterChanged}\n              query={query}\n              jobs={jobs}\n            />\n          </span>\n        }\n        actions={\n          <span>\n            <ActionButtons\n              filterChanged={filterChanged}\n              classes={classes}\n              selectedProject={selectedProject}\n              runs={runs}\n              isLoading={isLoading}\n              onBulkRetryClick={onBulkRetryClick}\n              onExportClick={onExportClick}\n              defaultFilters={defaultFilters}\n              setSearchText={setSearchText}\n            />\n          </span>\n        }\n      />\n    </>\n  );\n}\n\nfunction RunsList({ selectedProject }) {\n  const [exportModalVisible, setExportModalVisible] = useState(false);\n  const [bulkRetryModalVisible, setBulkRetryModalVisible] = useState(false);\n  const [lastArrival, setArrival] = useState(Date.now());\n  const dispatch = useDispatch();\n\n  const classes = useStyles();\n\n  const history = useHistory();\n\n  const [query, setQuery] = useQueryParams({\n    jobId: withDefault(StringParam, ''),\n    success: withDefault(StringParam, ''),\n    searchString: withDefault(StringParam, ''),\n    startDate: withDefault(StringParam, hoursAgo(720)),\n    endDate: withDefault(StringParam, null),\n    dateRange: withDefault(StringParam, '720'),\n    perPage: withDefault(NumberParam, 10),\n    page: withDefault(NumberParam, 1),\n  });\n\n  const projectId = selectedProject.id;\n\n  const allRuns = useSelector(selectRuns);\n  const isLoading = useSelector(selectRunsLoading);\n  const pagination = useSelector(selectRunsPagination);\n  const allJobs = useSelector(selectJobs);\n  const jobs = orderBy(values(allJobs), ['name']);\n  const triggers = useSelector(selectTriggers);\n\n  const runs = orderBy(allRuns, 'insertedAt', 'desc')\n    // TODO: This is ugly, but helps us only display receipt_job_states on ReceiptsList\n    .filter(r => r.projectId == selectedProject.id)\n    .map(run =>\n      RunItemPresenter({\n        job: allJobs[run.jobId] || {},\n        run,\n        trigger: triggers[run.triggerId],\n      })\n    );\n\n  const handleRetry = useCallback((job, receipt) => {\n    setArrival(Date.now());\n    dispatch(createRun(job, receipt));\n  }, []);\n\n  const filterChanged = useCallback(\n    filterParams =>\n      setQuery(\n        prevQuery => ({\n          ...prevQuery,\n          ...filterParams,\n        }),\n        'replace'\n      ),\n    []\n  );\n\n  const showExportModal = () => setExportModalVisible(true);\n\n  const showBulkRetryModal = () => setBulkRetryModalVisible(true);\n  const hideBulkRetryModal = () => setBulkRetryModalVisible(false);\n\n  const acceptBulkRetry = useCallback(() => {\n    hideBulkRetryModal();\n    dispatch(createRuns({ projectId: projectId, filter: query }));\n  }, [projectId, query]);\n\n  const exportQueryString = useMemo(\n    () =>\n      [\n        `project_id=${projectId}`,\n        `filter[start_date]=${query.startDate}`,\n        `filter[end_date]=${query.endDate || ''}`,\n        `filter[job_id]=${query.jobId}`,\n        `filter[success]=${query.success}`,\n        `filter[search_string]=${query.searchString}`,\n        'filter[export]=csv',\n      ].join('&'),\n    [\n      projectId,\n      query.startDate,\n      query.endDate,\n      query.jobId,\n      query.success,\n      query.searchString,\n    ]\n  );\n\n  const acceptExport = useCallback(() => {\n    setExportModalVisible(false);\n    dispatch(\n      Notifications.add(\n        'Your export order has been submitted for processing.',\n        'success'\n      )\n    );\n    exportRuns(exportQueryString);\n  }, [exportQueryString]);\n\n  useEffect(() => {\n    dispatch(switchedMenu('Activity History'));\n    document.title = 'Run History - OpenFn';\n  }, []);\n\n  const handleReceiveRun = payload => {\n    setArrival(Date.now());\n    dispatch(receiveRun(payload, query.page, query));\n  };\n\n  useEffect(() => {\n    if (projectId) {\n      dispatch(fetchJobs(selectedProject));\n      dispatch(fetchTriggers(selectedProject));\n\n      const cleanup = dispatch(\n        joinChannel(`runs:${projectId}`, {\n          new: handleReceiveRun,\n          updated: handleReceiveRun,\n        })\n      );\n      return () => cleanup();\n    }\n  }, [projectId]);\n\n  useEffect(() => {\n    if (projectId) {\n      dispatch(\n        loadRuns({\n          projectId: projectId,\n          filter: query,\n          page: query.page,\n          perPage: query.perPage,\n        })\n      );\n    }\n  }, [JSON.stringify(query), projectId, query.perPage, query.page]);\n\n  return (\n    <>\n      <FilterBar\n        filterChanged={filterChanged}\n        selectedProject={selectedProject}\n        runs={runs}\n        isLoading={isLoading}\n        onBulkRetryClick={showBulkRetryModal}\n        onExportClick={showExportModal}\n        defaultFilters={defaultFilter}\n        classes={classes}\n        query={query}\n        jobs={jobs}\n      />\n      <Paper elevation={2} className={classes.bottomSpace}>\n        <Table>\n          <TableHead>\n            <TableRow>\n              <TableCell>\n                Start Time&nbsp;\n                <Tooltip\n                  title={\n                    <div>\n                      Runs in this table are sorted by their creation time,\n                      which may differ from when they started executing your\n                      code.\n                    </div>\n                  }\n                >\n                  <HelpIcon fontSize=\"inherit\" />\n                </Tooltip>\n              </TableCell>\n              <Hidden xsDown>\n                <TableCell>Run ID</TableCell>\n              </Hidden>\n              <Hidden xsDown>\n                <TableCell>Trigger</TableCell>\n                <TableCell>Job</TableCell>\n              </Hidden>\n              <TableCell>Status/Action</TableCell>\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            <QueueStatus project={selectedProject} lastArrival={lastArrival} />\n            {isLoading && <LoadingRows perPage={query.perPage} extraChip />}\n            {!isLoading &&\n              runs.map(run => (\n                <RunItem\n                  {...run}\n                  key={run.id}\n                  onRetry={handleRetry}\n                  onClick={e =>\n                    linkTo(runShowPath(selectedProject, run), history)(e)\n                  }\n                />\n              ))}\n            {!isLoading && runs.length === 0 && <EmptyList colSpan={6} />}\n          </TableBody>\n        </Table>\n        <PaginationControls\n          className={classes.paginationControls}\n          numberPerPage={query.perPage}\n          totalPages={pagination.totalPages}\n          currentPage={query.page}\n          onChange={filterChanged}\n        />\n      </Paper>\n\n      <BulkModal\n        open={bulkRetryModalVisible}\n        onClose={hideBulkRetryModal}\n        onConfirm={() => acceptBulkRetry(query)}\n        thing=\"runs\"\n        action=\"reprocess\"\n        queryString={query}\n        totalItems={pagination.total}\n      />\n      <BulkModal\n        open={exportModalVisible}\n        onClose={() => setExportModalVisible(false)}\n        onConfirm={acceptExport}\n        thing=\"runs\"\n        action=\"export\"\n        queryString={query}\n        totalItems={pagination.total}\n      />\n    </>\n  );\n}\n\nexport default RunsList;\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n  Card,\n  CardHeader,\n  Grid,\n  IconButton,\n  List,\n  ListItem,\n  ListItemIcon,\n  ListItemText,\n  Tooltip,\n  Accordion,\n  AccordionSummary,\n  AccordionDetails,\n} from '@material-ui/core';\nimport {\n  ExpandMore,\n  FlashOn as FlashOnIcon,\n  Help as HelpIcon,\n  History,\n  KeyboardArrowLeft as KeyboardArrowLeftIcon,\n  KeyboardArrowRight as KeyboardArrowRightIcon,\n  Mail as MailIcon,\n  PlayCircleFilled as PlayCircleFilledIcon,\n  SettingsEthernet as SettingsEthernetIcon,\n  Timer as TimerIcon,\n  TimerOff as TimerOffIcon,\n} from '@material-ui/icons';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport { isEqual } from 'lodash';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { joinChannel } from '../actions/ChannelActions';\nimport { fetchJobs } from '../actions/JobActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport { createRun, loadRun, receiveRun } from '../actions/RunActions';\nimport { fetchTriggers } from '../actions/TriggerActions';\nimport {\n  duration,\n  formatTime,\n  humanReadable,\n  insertAceText,\n  linkTo,\n} from '../helpers';\nimport {\n  projectJobPath,\n  projectNextRunPath,\n  projectParentRunPath,\n  projectPrevRunPath,\n  projectReceiptInspectPath,\n  projectRunsPath,\n  projectTriggerPath,\n} from '../helpers/pathHelpers';\nimport { AceEditor } from './CodeEditor';\nimport ExitCodeIcon from './ExitCodeIcon';\nimport Loader from './Loader';\nimport { selectCurrentUser, selectJob } from '../selectors/index';\n\nconst useStyles = makeStyles(theme => ({\n  success: {\n    backgroundColor: theme.palette.success.main,\n  },\n  failure: {\n    backgroundColor: theme.palette.error.main,\n  },\n  rerun: {\n    color: theme.palette.primary.main,\n  },\n}));\n\nfunction RunView({ selectedProject }) {\n  const classes = useStyles();\n  const theme = useTheme();\n  const history = useHistory();\n  const dispatch = useDispatch();\n  const logViewer = useRef();\n\n  const { id: runId } = useParams();\n  const isLoading = useSelector(state => state.runs.isLoading);\n  const user = useSelector(selectCurrentUser) || {};\n  const userTheme = user.theme;\n  const run = useSelector(state => state.runs.items[runId] || {}, isEqual);\n\n  useHotkeys('/, command+f, ctrl+f', e => {\n    e.preventDefault();\n    logViewer?.current?.editor?.execCommand('find');\n  });\n\n  const {\n    exitCode,\n    receiptId,\n    parentId,\n    log,\n    startedAt,\n    finishedAt,\n    triggerId,\n    prevId,\n    nextId,\n    id,\n  } = run;\n\n  const runStartedText = 'Run started; streaming new logs only...\\n';\n\n  const initialLogState =\n    log || startedAt\n      ? runStartedText\n      : 'Run queued; logs will stream once started...\\n';\n\n  const [logState, setLogState] = useState(initialLogState);\n\n  function onChange(newValue) {\n    setLogState(newValue);\n  }\n  const job = useSelector(\n    state => selectJob(state, run.jobId) || { id: run.jobId },\n    isEqual\n  );\n  const error = useSelector(state => state.runs.error);\n  const trigger = useSelector(\n    state => state.triggers.items[triggerId],\n    isEqual\n  );\n  const jobTrigger = useSelector(\n    state => state.triggers.items[job.triggerId],\n    isEqual\n  );\n  const isFlow =\n    parentId ||\n    (!receiptId &&\n      !(trigger?.type === 'interval') &&\n      !(jobTrigger?.type === 'interval'));\n\n  const success = exitCode === 0;\n\n  function handleReceiveLog({ str }) {\n    if (str) {\n      const editor = logViewer?.current?.editor;\n      editor && insertAceText(editor, str, null, true);\n    }\n  }\n\n  function handleReceiveRun(payload) {\n    dispatch(receiveRun(payload));\n  }\n\n  function handleRetryClick() {\n    dispatch(createRun(job, receiptId));\n    history.push(projectRunsPath(selectedProject));\n  }\n\n  useEffect(() => {\n    dispatch(switchedMenu('Activity History'));\n    document.title = 'Run Inspector - OpenFn';\n  }, [dispatch]);\n\n  useEffect(() => {\n    if (selectedProject) {\n      dispatch(fetchJobs(selectedProject));\n      dispatch(fetchTriggers(selectedProject));\n      dispatch(\n        joinChannel(`runs:${selectedProject.id}`, {\n          updated: handleReceiveRun,\n        })\n      );\n    }\n  }, [selectedProject, dispatch]);\n\n  useEffect(() => {\n    if (runId) {\n      dispatch(loadRun({ id: runId }));\n      dispatch(\n        joinChannel(`logs:${runId}`, {\n          new: handleReceiveLog,\n        })\n      );\n    }\n  }, [runId, dispatch]);\n\n  useEffect(() => {\n    if (log) {\n      setLogState(log.join('\\n'));\n    } else if (startedAt) {\n      setLogState(runStartedText);\n    }\n  }, [log, startedAt]);\n\n  if (isLoading) {\n    return <Loader item=\"run\" />;\n  }\n\n  if (error) throw error;\n\n  const action = (\n    <div>\n      <Tooltip title=\"Previous run\" component=\"span\">\n        <IconButton\n          id=\"previous\"\n          disabled={!prevId}\n          onClick={linkTo(projectPrevRunPath(selectedProject, run), history)}\n        >\n          <KeyboardArrowLeftIcon />\n        </IconButton>\n      </Tooltip>\n      <Tooltip title=\"Next run\" component=\"span\">\n        <IconButton\n          id=\"next\"\n          disabled={!nextId}\n          onClick={linkTo(projectNextRunPath(selectedProject, run), history)}\n        >\n          <KeyboardArrowRightIcon />\n        </IconButton>\n      </Tooltip>\n    </div>\n  );\n\n  return (\n    <Grid\n      container\n      direction=\"row\"\n      justifyContent=\"center\"\n      alignItems=\"stretch\"\n      style={{ height: '100%' }}\n    >\n      <Grid item xs={12} md={10} xl={8}>\n        <Card style={{ height: '100%' }}>\n          <div\n            style={{ flexDirection: 'column', display: 'flex', height: '100%' }}\n          >\n            <CardHeader\n              title={\n                <span>\n                  Run <code>{id}</code>\n                </span>\n              }\n              avatar={<ExitCodeIcon exitCode={exitCode} avatar />}\n              subheader={\n                exitCode !== null\n                  ? `${success ? 'Succeeded' : 'Failed'} in ${duration(\n                      finishedAt,\n                      startedAt\n                    )} milliseconds.`\n                  : `is ${startedAt ? 'in progress' : 'queued'}`\n              }\n              action={action}\n            />\n            <Accordion\n              defaultExpanded\n              style={{ margin: 0 }}\n              onChange={() => {\n                setTimeout(function () {\n                  logViewer?.current?.editor?.resize();\n                }, 250);\n              }}\n            >\n              <AccordionSummary expandIcon={<ExpandMore />}>\n                Run Metadata&nbsp;\n                <Tooltip\n                  title={\n                    <>\n                      Related artifacts, as well as start and end times and exit\n                      codes are available here. Collapse this panel for more\n                      space to view logs.\n                    </>\n                  }\n                >\n                  <HelpIcon fontSize=\"inherit\" />\n                </Tooltip>\n              </AccordionSummary>\n              <AccordionDetails style={{ padding: 0 }}>\n                <List dense style={{ width: '100%' }}>\n                  <ListItem\n                    button\n                    id=\"trigger\"\n                    disabled={!trigger}\n                    onClick={e =>\n                      linkTo(\n                        projectTriggerPath(selectedProject, trigger),\n                        history\n                      )(e)\n                    }\n                  >\n                    <ListItemIcon>\n                      <FlashOnIcon />\n                    </ListItemIcon>\n                    <ListItemText>\n                      {trigger ? trigger.name : 'started manually'}\n                    </ListItemText>\n                  </ListItem>\n                  {receiptId && (\n                    <Tooltip\n                      title={\n                        !receiptId\n                          ? \"Messages are stored in accordance with the retention policy determined by this project's plan.\"\n                          : ''\n                      }\n                      component=\"span\"\n                    >\n                      <div>\n                        <ListItem\n                          button\n                          id=\"receipt\"\n                          disabled={!receiptId}\n                          onClick={e =>\n                            linkTo(\n                              projectReceiptInspectPath(\n                                selectedProject,\n                                receiptId\n                              ),\n                              history\n                            )(e)\n                          }\n                        >\n                          <ListItemIcon>\n                            <MailIcon />\n                          </ListItemIcon>\n                          <ListItemText>\n                            {receiptId ? (\n                              <span>\n                                Message <code>{humanReadable(receiptId)}</code>\n                              </span>\n                            ) : (\n                              <span>\n                                The message that triggered this run no longer\n                                exists. <HelpIcon fontSize=\"inherit\" />\n                              </span>\n                            )}\n                          </ListItemText>\n                        </ListItem>\n                      </div>\n                    </Tooltip>\n                  )}\n                  {isFlow && (\n                    <Tooltip\n                      title={\n                        !parentId\n                          ? \"Runs are stored in accordance with the retention policy determined by this project's plan.\"\n                          : ''\n                      }\n                      component=\"span\"\n                    >\n                      <div>\n                        <ListItem\n                          button\n                          id=\"parent\"\n                          disabled={!parentId}\n                          onClick={linkTo(\n                            projectParentRunPath(selectedProject, run),\n                            history\n                          )}\n                        >\n                          <ListItemIcon>\n                            <History />\n                          </ListItemIcon>\n                          <ListItemText>\n                            {parentId ? (\n                              <span>\n                                Parent run{' '}\n                                <code>{humanReadable(parentId)}</code>\n                              </span>\n                            ) : (\n                              <span>\n                                The parent run that triggered this run no longer\n                                exists. <HelpIcon fontSize=\"inherit\" />\n                              </span>\n                            )}\n                          </ListItemText>\n                        </ListItem>\n                      </div>\n                    </Tooltip>\n                  )}\n                  <ListItem\n                    button\n                    id=\"job\"\n                    onClick={linkTo(\n                      projectJobPath(selectedProject, job),\n                      history\n                    )}\n                  >\n                    <ListItemIcon>\n                      <SettingsEthernetIcon />\n                    </ListItemIcon>\n                    <ListItemText>{job.name}</ListItemText>\n                  </ListItem>\n                  <ListItem>\n                    <ListItemIcon>\n                      <TimerIcon />\n                    </ListItemIcon>\n                    <ListItemText>\n                      Started:&nbsp;\n                      {formatTime(startedAt, 'PPPPpppp')}\n                    </ListItemText>\n                  </ListItem>\n                  <ListItem>\n                    <ListItemIcon>\n                      <TimerOffIcon />\n                    </ListItemIcon>\n                    <ListItemText>\n                      Finished:&nbsp;\n                      {formatTime(finishedAt, 'PPPPpppp')}\n                    </ListItemText>\n                  </ListItem>\n                  <ListItem>\n                    <ListItemIcon>\n                      <ExitCodeIcon\n                        exitCode={exitCode !== null ? exitCode : 'none'}\n                      />\n                    </ListItemIcon>\n                    <ListItemText>\n                      {exitCode !== null\n                        ? `Exit code ${exitCode}`\n                        : 'No exit code'}\n                    </ListItemText>\n                  </ListItem>\n                  {!isFlow && (\n                    <Tooltip\n                      disableFocusListener\n                      title={\n                        receiptId\n                          ? 'Execute a new run with this job and message.'\n                          : 'Run this time-triggered job now.'\n                      }\n                      component=\"span\"\n                    >\n                      <ListItem button onClick={handleRetryClick} id=\"retry\">\n                        <ListItemIcon className={classes.rerun}>\n                          <PlayCircleFilledIcon />\n                        </ListItemIcon>\n                        <ListItemText>\n                          {receiptId ? (\n                            <>\n                              Re-run job <code>{job.id}</code> with message{' '}\n                              <code>{humanReadable(receiptId)}</code>\n                            </>\n                          ) : (\n                            `Run time-triggered job ${job.id} now.`\n                          )}\n                        </ListItemText>\n                      </ListItem>\n                    </Tooltip>\n                  )}\n                </List>\n              </AccordionDetails>\n            </Accordion>\n            <div\n              style={{\n                flexGrow: 1,\n                position: 'relative',\n              }}\n            >\n              <AceEditor\n                ref={logViewer}\n                style={{\n                  position: 'absolute',\n                  left: 0,\n                  right: 0,\n                  top: 0,\n                  bottom: 0,\n                }}\n                name=\"editor\"\n                mode=\"text\"\n                theme={userTheme || theme.palette.codeEditor}\n                width=\"100%\"\n                height=\"100%\"\n                minLines={3}\n                wrapEnabled\n                readOnly\n                showPrintMargin={false}\n                value={logState}\n                onChange={onChange}\n                editorProps={{ $blockScrolling: Infinity }}\n                onFocus={() => logViewer?.current?.editor?.resize()}\n              />\n            </div>\n          </div>\n        </Card>\n      </Grid>\n    </Grid>\n  );\n}\n\nexport default React.memo(\n  RunView,\n  (prevProps, nextProps) =>\n    !isEqual(prevProps.selectedProject, nextProps.selectedProject)\n);\n","import { camelizeKeys, decamelizeKeys } from 'humps';\nimport { post } from '../clients/BaseClient';\nimport { searchesApiPath } from '../helpers/actionsPathHelpers';\n\nexport function search({ projectId, ...filter }) {\n  const data = {\n    projectId,\n    filter,\n  };\n\n  return dispatch => {\n    dispatch({\n      type: 'SEARCH_REQUESTED',\n      payload: {\n        searchId: filter.searchId,\n        types: filter.types,\n      },\n    });\n\n    return post(searchesApiPath(), decamelizeKeys(data))\n      .then(async response => {\n        const responseData = await response.json();\n        dispatch({\n          type: 'SEARCH_STARTED',\n          payload: camelizeKeys(responseData),\n        });\n      })\n      .catch(error => {\n        dispatch({ type: 'SEARCH_FAILED', payload: error });\n      });\n  };\n}\n\nexport function receiveSearchResults(results) {\n  const payload = camelizeKeys(results);\n  return { type: 'SEARCH_RESULTS_RECEIVED', payload };\n}\n\nexport function receiveSearchFinished(results) {\n  const payload = camelizeKeys(results);\n  return { type: 'SEARCH_FINISHED', payload };\n}\n\nexport function clearSearch() {\n  return { type: 'CLEAR_SEARCH_RESULTS' };\n}\n","import React from 'react';\nimport { CircularProgress } from '@material-ui/core';\n\nfunction SearchProgress(props) {\n  const { isLoading, progress, error, searchId } = props;\n  const { searchedRange } = progress;\n\n  const inProgress = progress?.inProgress\n    ? Object.values(progress.inProgress).some(\n        typeInProgress => typeInProgress === true\n      )\n    : false;\n\n  const wasLimited = progress?.limited\n    ? Object.values(progress.limited).some(\n        typeInProgress => typeInProgress === true\n      )\n    : false;\n\n  const limitedOn = progress?.limited\n    ? Object.entries(progress.limited)\n        .filter(([k, v]) => v)\n        .map(([k, v]) => k)\n    : [];\n\n  const finished = !inProgress && !isLoading && !error;\n  const text = (finished && 'Search finished.') || (error && 'Search failed.');\n  const { bodies, headers, logs } = searchedRange || {};\n  const hasProgress = bodies || headers || logs;\n\n  if (searchId) {\n    return (\n      <caption>\n        {searchId && isLoading && <div>Preparing the search.</div>}\n        {searchId && inProgress && (\n          <div>\n            <CircularProgress size={16} />\n            {'  '}\n            {hasProgress ? (\n              <span>\n                Searched through: {headers && `headers: ${headers}, `}\n                {bodies && `bodies: ${bodies}, `}\n                {logs && `logs: ${logs}`}{' '}\n              </span>\n            ) : (\n              <span>Search initiated.</span>\n            )}\n          </div>\n        )}\n        {(finished || error) && !wasLimited && text}\n        {finished &&\n          wasLimited &&\n          `This search returned too many results (on ${limitedOn.join(\n            ', '\n          )}) and has been truncated. Please apply more restrictive conditions.`}\n      </caption>\n    );\n  }\n  return <caption>Enter a string and press enter to begin a search.</caption>;\n}\n\nexport default SearchProgress;\n","import React, { useEffect, useState } from 'react';\nimport {\n  Box,\n  Button,\n  Card,\n  CardContent,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  Tooltip,\n  CardHeader,\n} from '@material-ui/core';\nimport InputBase from '@material-ui/core/InputBase';\nimport { alpha, makeStyles } from '@material-ui/core/styles';\nimport {\n  History as HistoryIcon,\n  Inbox as InboxIcon,\n  Search as SearchIcon,\n  Help as HelpIcon,\n  Subject,\n} from '@material-ui/icons';\n\nimport ToggleButton from '@material-ui/lab/ToggleButton';\nimport ToggleButtonGroup from '@material-ui/lab/ToggleButtonGroup';\nimport { format } from 'date-fns';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useHistory } from 'react-router-dom';\nimport { joinChannel } from '../actions/ChannelActions';\nimport {\n  receiveSearchResults,\n  search,\n  receiveSearchFinished,\n  clearSearch,\n} from '../actions/SearchActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport { hoursAgo, humanReadable, linkTo } from '../helpers';\nimport {\n  selectSearchId,\n  selectSearchResults,\n  selectSearchProgress,\n  selectSearchIsLoading,\n  selectSearchError,\n} from '../selectors/index';\nimport DateFilter from './ListViews/DateFilter';\nimport OneCardHolder from './OneCardHolder';\nimport SearchProgress from './SearchProgress';\nimport { projectSearchResultPath } from '../helpers/pathHelpers';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    flexGrow: 1,\n  },\n  formControl: {\n    margin: theme.spacing(1),\n  },\n  menuButton: {\n    marginRight: theme.spacing(2),\n  },\n  title: {\n    flexGrow: 1,\n    display: 'none',\n    [theme.breakpoints.up('sm')]: {\n      display: 'block',\n    },\n  },\n  search: {\n    position: 'relative',\n    borderRadius: theme.shape.borderRadius,\n    backgroundColor: alpha(theme.palette.grey[400], 0.15),\n    '&:hover': {\n      backgroundColor: alpha(theme.palette.grey[400], 0.25),\n    },\n    marginLeft: 0,\n    width: '100%',\n    [theme.breakpoints.up('sm')]: {\n      marginLeft: theme.spacing(1),\n      width: 'auto',\n    },\n  },\n  clickable: {\n    cursor: 'pointer',\n  },\n  searchIcon: {\n    padding: theme.spacing(0, 2),\n    height: '100%',\n    position: 'absolute',\n    pointerEvents: 'none',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  inputRoot: {\n    color: 'inherit',\n  },\n  inputInput: {\n    padding: theme.spacing(1, 1, 1, 0),\n    // vertical padding + font size from searchIcon\n    paddingLeft: `calc(1em + ${theme.spacing(4)}px)`,\n    transition: theme.transitions.create('width'),\n    width: '100%',\n    [theme.breakpoints.up('sm')]: {\n      width: '20ch',\n      '&:focus': {\n        width: '40ch',\n      },\n    },\n  },\n}));\n\nfunction SearchConsole({ selectedProject }) {\n  const dispatch = useDispatch();\n  const history = useHistory();\n  const classes = useStyles();\n\n  const projectId = selectedProject.id;\n\n  const initialState = {\n    startDate: hoursAgo(168),\n    endDate: new Date().toISOString(),\n  };\n\n  const [dateFilter, setDateFilter] = useState(initialState);\n  const [types, setTypes] = useState(() => ['bodies', 'logs']);\n  const [dateRange, setDateRange] = useState(168);\n  const [string, setString] = useState('');\n  const [disableSearch, setDisableSearch] = useState(false);\n\n  const searchId = useSelector(selectSearchId);\n  const searchResults = useSelector(selectSearchResults);\n  const searchProgress = useSelector(selectSearchProgress);\n  const searchIsLoading = useSelector(selectSearchIsLoading);\n  const searchError = useSelector(selectSearchError);\n\n  const disabledSearchButton =\n    types.length <= 0 || string === '' || searchIsLoading || disableSearch;\n\n  const handleTypesChanged = (e, newTypes) => {\n    setTypes(newTypes);\n  };\n\n  const dateFilterChanged = ({ dateRange, ...dateFilter }) => {\n    if (dateRange) {\n      setDateRange(dateRange);\n    }\n\n    setDateFilter(prevQuery => ({\n      ...prevQuery,\n      ...dateFilter,\n    }));\n  };\n\n  useEffect(() => {\n    if (searchId) {\n      return dispatch(\n        joinChannel(`search_results:${searchId}`, {\n          new: handleReceiveResult,\n          finished: handleSearchFinished,\n        })\n      );\n    }\n  }, [searchId]);\n\n  useEffect(() => {\n    dispatch(switchedMenu('Search Console'));\n    document.title = 'Search Console - OpenFn';\n    return () => {\n      dispatch(clearSearch());\n    };\n  }, [dispatch]);\n\n  function handleReceiveResult(payload) {\n    return dispatch(receiveSearchResults(payload));\n  }\n\n  function handleSearchFinished(payload) {\n    return dispatch(receiveSearchFinished(payload));\n  }\n\n  const handleSearch = (projectId, string, types, dateFilter) => {\n    setDisableSearch(true);\n    const searchRef = uuidv4();\n    const query = {\n      projectId,\n      searchId: searchRef,\n      string,\n      types,\n      ...dateFilter,\n    };\n    dispatch(search(query));\n    setTimeout(() => {\n      setDisableSearch(false);\n    }, 2000);\n  };\n\n  return (\n    <OneCardHolder full>\n      <Card>\n        <CardHeader\n          title={\n            <span>\n              Search Console&nbsp;\n              <Tooltip\n                title={\n                  <>\n                    The search console provides users with the ability to\n                    perform targeted full-string searches. These searches are\n                    computationally expensive to perform and may take several\n                    seconds or even minutes to return all results. Results will\n                    be streamed back in chunks as the search finishes each\n                    24-hour period included in the range and will be limited to\n                    a total of ten records per resource per search.\n                  </>\n                }\n              >\n                <HelpIcon fontSize=\"small\" />\n              </Tooltip>\n            </span>\n          }\n          subheader=\"Targeted full text-search with partial string matching\"\n        />\n        <div style={{ width: '100%' }}>\n          <Box display=\"flex\" p={1} bgcolor=\"background.paper\">\n            <Box p={1} flexGrow={1}>\n              <DateFilter\n                classes={classes}\n                filterChanged={dateFilterChanged}\n                query={{ dateRange, ...dateFilter }}\n                noNow\n              />\n            </Box>\n            <Box p={1}>\n              <ToggleButtonGroup\n                value={types}\n                onChange={handleTypesChanged}\n                aria-label=\"search result types\"\n              >\n                <ToggleButton value=\"bodies\" aria-label=\"bodies\" role=\"button\">\n                  <Tooltip title=\"Message Body\">\n                    <InboxIcon\n                      fontSize=\"small\"\n                      aria-label=\"message body icon\"\n                    />\n                  </Tooltip>\n                </ToggleButton>\n                <ToggleButton\n                  value=\"headers\"\n                  aria-label=\"headers\"\n                  role=\"button\"\n                >\n                  <Tooltip title=\"Message Headers\">\n                    <Subject\n                      fontSize=\"small\"\n                      aria-label=\"message headers icon\"\n                    />\n                  </Tooltip>\n                </ToggleButton>\n                <ToggleButton value=\"logs\" aria-label=\"logs\" role=\"button\">\n                  <Tooltip title=\"Run Logs\">\n                    <HistoryIcon fontSize=\"small\" aria-label=\"run logs icon\" />\n                  </Tooltip>\n                </ToggleButton>\n              </ToggleButtonGroup>\n            </Box>\n          </Box>\n        </div>\n        <div style={{ width: '100%' }}>\n          <Box display=\"flex\" justifyContent=\"center\" p={1}>\n            <Box p={1}>\n              <div className={classes.search}>\n                <div className={classes.searchIcon}>\n                  <SearchIcon />\n                </div>\n                <InputBase\n                  placeholder=\"Enter a string...\"\n                  name=\"search-text-field\"\n                  classes={{\n                    root: classes.inputRoot,\n                    input: classes.inputInput,\n                  }}\n                  inputProps={{ 'aria-label': 'search', role: 'input' }}\n                  value={string}\n                  onChange={e => setString(e.target.value)}\n                  onKeyDown={e => {\n                    if (!disabledSearchButton && e.key === 'Enter') {\n                      handleSearch(projectId, string, types, dateFilter);\n                    }\n                  }}\n                  autoFocus\n                />\n                <Button\n                  variant=\"contained\"\n                  name=\"search-button\"\n                  color=\"primary\"\n                  style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0 }}\n                  onClick={() =>\n                    handleSearch(projectId, string, types, dateFilter)\n                  }\n                  disabled={disabledSearchButton}\n                >\n                  Search\n                </Button>\n              </div>\n            </Box>\n          </Box>\n        </div>\n        <CardContent>\n          <Table>\n            <TableHead>\n              <TableRow>\n                <TableCell>Inserted At</TableCell>\n                <TableCell>Match Type</TableCell>\n                <TableCell align=\"right\">Resource Id</TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody aria-label=\"results list\">\n              {searchResults?.map(row => {\n                const matchType = `${row.model.replace(\n                  'receipt',\n                  'message'\n                )}.${row.type.replace('bodies', 'body')}`;\n\n                return (\n                  <TableRow\n                    hover\n                    className={classes.clickable}\n                    key={row.id}\n                    onClick={e =>\n                      linkTo(\n                        projectSearchResultPath(selectedProject, row),\n                        history\n                      )(e)\n                    }\n                  >\n                    <TableCell>\n                      {format(new Date(row.insertedAt), 'PPPPpppp')}\n                    </TableCell>\n                    <TableCell>\n                      <code>{matchType}</code>\n                    </TableCell>\n                    <TableCell align=\"right\">\n                      <Tooltip title={row.id} placement=\"top\">\n                        <code>{humanReadable(row.id)}</code>\n                      </Tooltip>\n                    </TableCell>\n                  </TableRow>\n                );\n              })}\n            </TableBody>\n            <SearchProgress\n              searchId={searchId}\n              isLoading={searchIsLoading}\n              progress={searchProgress}\n              error={searchError}\n            />\n          </Table>\n        </CardContent>\n      </Card>\n    </OneCardHolder>\n  );\n}\n\nexport default SearchConsole;\n","import {\n  Avatar,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Typography,\n} from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport triggerIcons from '../constants/triggerIcons';\nimport { calendarTime, cronToHuman } from '../helpers';\nimport { projectTriggerPath } from '../helpers/pathHelpers';\n\nconst styles = theme => ({\n  title: {\n    marginBottom: 16,\n    fontSize: 14,\n  },\n  pos: {\n    marginBottom: 12,\n  },\n  media: {\n    height: 200,\n    paddingTop: '56.25%', // 16:9\n  },\n  smallIcon: {\n    fontSize: '0.875rem',\n  },\n  content: {\n    paddingTop: '0.6rem',\n    paddingBottom: '0.6rem',\n    '& code': {\n      wordBreak: 'break-word',\n    },\n  },\n  interval: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  message: {\n    backgroundColor: theme.palette.secondary.main,\n  },\n  job: {\n    backgroundColor: theme.palette.success.light,\n  },\n  fail: {\n    backgroundColor: theme.palette.error.light,\n  },\n});\n\nfunction TriggerItem(props) {\n  const { trigger, jobName, classes, history, linkTo, project } = props;\n  const { icon } = triggerIcons[trigger.type];\n  const humanCron = cronToHuman(trigger.cron, { capitalize: true }) || '';\n\n  const snippet = {\n    interval: [\n      humanCron.substr(0, humanCron.indexOf(' ') + 1),\n      humanCron.substr(humanCron.indexOf(' ') + 1),\n      ' (UTC+0)',\n    ],\n    message: [\n      'When messages include ',\n      JSON.stringify(trigger.criteria),\n      `${trigger.exclusion ? ', but not ' : ''}`,\n      <code>{JSON.stringify(trigger.exclusion)}</code>,\n    ],\n    job: ['When ', jobName, ' runs succeed'],\n    fail: ['When ', jobName, ' runs fail'],\n  };\n\n  return (\n    <Card id={`${trigger.id}-trigger-card`}>\n      <CardHeader\n        title={trigger.name}\n        subheader={`updated ${calendarTime(trigger.updatedAt)}`}\n        titleTypographyProps={{ noWrap: true }}\n        subheaderTypographyProps={{ noWrap: true }}\n        avatar={<Avatar className={classes[trigger.type]}>{icon}</Avatar>}\n      />\n      <CardContent className={classes.content}>\n        <Typography align=\"center\">\n          {snippet[trigger.type][0]}\n          <code>{snippet[trigger.type][1]}</code>\n          {snippet[trigger.type][2]}\n          {trigger.exclusion && snippet[trigger.type][3]}\n        </Typography>\n      </CardContent>\n      <CardActions>\n        <Button\n          id=\"edit\"\n          onClick={e =>\n            linkTo(projectTriggerPath(project, trigger), history)(e)\n          }\n        >\n          Edit\n        </Button>\n      </CardActions>\n    </Card>\n  );\n}\n\nTriggerItem.propTypes = {\n  trigger: PropTypes.object.isRequired,\n  linkTo: PropTypes.func.isRequired,\n};\n\nexport default withStyles(styles, {\n  withTheme: true,\n  name: 'App',\n})(TriggerItem);\n","import React, { useState, useEffect } from 'react';\nimport { orderBy, values } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { fetchJobs } from '../actions/JobActions';\nimport { switchedMenu } from '../actions/MenuActions';\nimport { fetchTriggers } from '../actions/TriggerActions';\nimport { linkTo } from '../helpers';\nimport Loader from './Loader';\nimport MasonryWrapper from './MasonryWrapper';\nimport SectionFrame from './SectionFrame';\nimport TriggerItem from './TriggerItem';\nimport { projectNewTriggerPath } from '../helpers/pathHelpers';\n\nfunction TriggersList({ selectedProject }) {\n  const [filter, setFilter] = useState('');\n\n  const dispatch = useDispatch();\n\n  const history = useHistory();\n\n  const projectId = selectedProject.id;\n\n  const jobs = useSelector(state => state.jobs.items);\n\n  const triggerItems = useSelector(state => state.triggers.items);\n\n  const triggers = orderBy(values(triggerItems), [\n    t => t.name.toLowerCase(),\n  ]).filter(t => t.projectId === projectId);\n\n  const isLoading = useSelector(state => state.triggers.isLoading);\n\n  const handleFilterChange = e => setFilter(e.target.value.toLowerCase());\n\n  const includesText = trigger => {\n    return (\n      trigger.name.toLowerCase().includes(filter) ||\n      (trigger.criteria &&\n        JSON.stringify(trigger.criteria).toLowerCase().includes(filter))\n    );\n  };\n\n  useEffect(() => {\n    document.title = 'Triggers - OpenFn';\n    dispatch(switchedMenu('Triggers'));\n  }, [dispatch]);\n\n  useEffect(() => {\n    dispatch(fetchTriggers(selectedProject));\n    dispatch(fetchJobs(selectedProject));\n  }, [projectId, dispatch]);\n\n  return (\n    <div>\n      <SectionFrame\n        section=\"trigger\"\n        helper=\"Filter triggers by name or criteria.\"\n        search={handleFilterChange}\n        searchText={filter}\n        create={e => linkTo(projectNewTriggerPath(selectedProject), history)(e)}\n      />\n      {isLoading ? (\n        <Loader item=\"triggers\" />\n      ) : (\n        <MasonryWrapper>\n          {triggers.filter(includesText).map((trigger, i) => (\n            <TriggerItem\n              trigger={trigger}\n              linkTo={linkTo}\n              history={history}\n              key={trigger.id}\n              jobName={jobs[trigger.jobId] ? jobs[trigger.jobId].name : null}\n              order={i}\n              project={selectedProject}\n            />\n          ))}\n        </MasonryWrapper>\n      )}\n    </div>\n  );\n}\n\nTriggersList.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n};\n\nexport default TriggersList;\n","import React, { useEffect, useMemo } from 'react';\nimport {\n  Card,\n  CardContent,\n  CardHeader,\n  Table,\n  TableBody,\n  TableCell,\n  TableHead,\n  TableRow,\n  Tooltip,\n} from '@material-ui/core';\nimport HelpIcon from '@material-ui/icons/Help';\nimport 'react-credit-cards/es/styles-compiled.css';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { isEqual } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { fetchUsageHistory } from '../actions/UsageCountActions';\nimport { selectCurrentUser } from '../selectors';\nimport Loader from './Loader';\nimport OneCardHolder from './OneCardHolder';\n\nfunction UsageCountsList({ selectedProject }) {\n  const dispatch = useDispatch();\n\n  const currentUser = useSelector(state => selectCurrentUser(state), isEqual);\n\n  const projectUsageDetails = useSelector(\n    state => state.projects.usageDetails,\n    isEqual\n  );\n\n  const usageDetails = useMemo(\n    () =>\n      projectUsageDetails\n        .filter(x => !!x.results)\n        .sort((a, b) => {\n          if (b.periodEnd < a.periodEnd) {\n            return -1;\n          }\n          return 1;\n        }) || [],\n    [projectUsageDetails]\n  );\n\n  const isLoading = !currentUser;\n\n  useEffect(() => {\n    dispatch(fetchUsageHistory(selectedProject));\n  }, [dispatch, selectedProject]);\n\n  useEffect(() => {\n    document.title = 'Usage - OpenFn';\n  }, []);\n\n  if (isLoading) {\n    return <Loader item=\"usage counts\" />;\n  }\n\n  return (\n    <OneCardHolder wide>\n      <Card>\n        <CardHeader\n          title=\"Historical Usage Snapshots\"\n          subheader={selectedProject.name}\n        />\n        <CardContent>\n          <Table>\n            <TableHead>\n              <TableRow>\n                <TableCell>Period Start</TableCell>\n                <TableCell>Period End</TableCell>\n                <TableCell>Messages</TableCell>\n                <TableCell>Runs</TableCell>\n                <TableCell>\n                  Results &nbsp;\n                  <Tooltip title=\"Runs grouped by exit code.\">\n                    <HelpIcon fontSize=\"inherit\" />\n                  </Tooltip>\n                </TableCell>\n              </TableRow>\n            </TableHead>\n            <TableBody>\n              {usageDetails.map(x => (\n                <TableRow hover key={x.id}>\n                  <TableCell>{x.periodStart}</TableCell>\n                  <TableCell>{x.periodEnd}</TableCell>\n                  <TableCell>{x.receipts}</TableCell>\n                  <TableCell>{x.runs}</TableCell>\n                  <TableCell>\n                    <code>{JSON.stringify(x.results)}</code>\n                  </TableCell>\n                </TableRow>\n              ))}\n            </TableBody>\n          </Table>\n        </CardContent>\n      </Card>\n    </OneCardHolder>\n  );\n}\n\nUsageCountsList.propTypes = {\n  selectedProject: PropTypes.object.isRequired,\n};\nexport default UsageCountsList;\n","import { isEqual } from 'lodash';\nimport React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n  Redirect,\n  Route,\n  Switch,\n  useHistory,\n  useParams,\n} from 'react-router-dom';\nimport { fetchJobs } from '../actions/JobActions';\nimport { scopedProject, unscopedProject } from '../actions/MenuActions';\nimport { fetchPlans } from '../actions/PlanActions';\nimport { fetchProjectBySlug } from '../actions/ProjectActions';\nimport { fetchUsageCount } from '../actions/UsageCountActions';\nimport { findProject, selectProjectError } from '../selectors';\nimport AccessSettings from './AccessSettings';\nimport AuthMethodNew from './AuthMethodNew';\nimport CredentialsList from './Credentials/CredentialsList';\nimport CredentialView from './Credentials/CredentialView';\nimport { ErrorPresenter } from './ErrorView';\nimport JobEdit from './Jobs/JobEdit';\nimport JobsList from './Jobs/JobsList';\nimport JobView from './Jobs/JobView';\nimport Loader from './Loader';\nimport ProjectFilesList from './ProjectFilesList';\nimport ProjectSettings from './ProjectSettings';\nimport ProjectRepoConnection from './ProjectSettings/ProjectRepoConnection';\nimport ReceiptInspector from './ReceiptInspector';\nimport ReceiptsList from './ReceiptsList';\nimport ReceiptView from './ReceiptView';\nimport RunsList from './RunsList';\nimport RunView from './RunView';\nimport SearchConsole from './SearchConsole';\nimport TriggersList from './TriggersList';\nimport { EditTriggerView, NewTriggerView } from './TriggerView';\nimport UsageCountsList from './UsageCountsList';\n\nconst childRoutes = [\n  ['/projects/:slug/access', AccessSettings],\n  ['/projects/:slug/runs', RunsList],\n  ['/projects/:slug/authentication/new', AuthMethodNew],\n  ['/projects/:slug/credentials', CredentialsList],\n  ['/projects/:slug/credentials/:credentialSlug', CredentialView],\n  ['/projects/:slug/credentials/:adaptorKey/new', CredentialView],\n  ['/projects/:slug/downloads', ProjectFilesList],\n  ['/projects/:slug/jobs', JobsList],\n  ['/projects/:slug/jobs/new', JobEdit],\n  ['/projects/:slug/jobs/:id', JobView],\n  ['/projects/:slug/jobs/:id/edit', JobEdit],\n  ['/projects/:slug/messages', ReceiptsList],\n  ['/projects/:slug/messages/:id', ReceiptInspector],\n  ['/projects/:slug/messages/:id/edit', ReceiptView],\n  ['/projects/:slug/repo', ProjectRepoConnection],\n  ['/projects/:slug/runs/:id', RunView],\n  ['/projects/:slug/settings', ProjectSettings],\n  ['/projects/:slug/triggers', TriggersList],\n  ['/projects/:slug/triggers/new', NewTriggerView],\n  ['/projects/:slug/triggers/:triggerSlug', EditTriggerView],\n  ['/projects/:slug/usage', UsageCountsList],\n  ['/projects/:slug/search', SearchConsole],\n  ['/projects/:slug', ProjectSettings],\n];\n\nfunction ProjectScope() {\n  const dispatch = useDispatch();\n  const error = useSelector(selectProjectError);\n\n  const { slug } = useParams();\n\n  const history = useHistory();\n\n  const selectedProject = useSelector(\n    state => findProject(state, slug),\n    isEqual\n  );\n\n  const projectsInFlight = useSelector(state => state.projects.isLoading);\n\n  useEffect(() => {\n    if (selectedProject) {\n      dispatch(scopedProject(selectedProject));\n      dispatch(fetchUsageCount(selectedProject));\n      dispatch(fetchJobs(selectedProject));\n      dispatch(fetchPlans());\n    }\n  }, [slug, selectedProject, dispatch]);\n\n  useEffect(() => {\n    if (!selectedProject && !projectsInFlight) {\n      dispatch(fetchProjectBySlug(slug));\n    }\n  }, [slug, projectsInFlight, selectedProject, dispatch]);\n\n  useEffect(() => {\n    return () => {\n      dispatch(unscopedProject());\n    };\n  }, [slug, dispatch]);\n\n  if (error) throw error;\n\n  if (!selectedProject) {\n    return <Loader item=\"project\" full />;\n  }\n\n  return (\n    <Switch>\n      <Redirect\n        key=\"studio-redirect\"\n        from=\"/projects/:projectId/jobs/:id/studio\"\n        to=\"/projects/:projectId/jobs/:id/edit\"\n      />\n      <Redirect\n        key=\"inspect-redirect\"\n        from=\"/projects/:projectId/messages/:id/inspect\"\n        to=\"/projects/:projectId/messages/:id/\"\n      />\n      <Redirect\n        key=\"power-redirect\"\n        from=\"/projects/:projectId/messages/:id/power\"\n        to=\"/projects/:projectId/messages/:id/edit\"\n      />\n      <Redirect\n        key=\"activity-redirect\"\n        from=\"/projects/:projectId/activity\"\n        to=\"/projects/:projectId/runs\"\n      />\n      {childRoutes.map(([path, Component]) => (\n        <Route\n          exact\n          key={`${path}-route`}\n          path={path}\n          render={() => (\n            <Component key={path} selectedProject={selectedProject} />\n          )}\n        />\n      ))}\n      <Route key=\"no-match\">\n        <ErrorPresenter error={{ status: 404 }} history={history} />\n      </Route>\n    </Switch>\n  );\n}\n\nexport default ProjectScope;\n","import { camelizeKeys } from 'humps';\nimport {\n  projectRunStatsApiPath,\n  projectsRunStatsApiPath,\n} from '../helpers/actionsPathHelpers';\nimport { get } from './BaseClient';\n\n/**\n * @param {Project} project\n */\nexport function getRunStatsForProject(project) {\n  return new Promise((resolve, reject) => {\n    get(projectRunStatsApiPath(project))\n      .then(async response => {\n        const data = await response.json();\n        resolve(camelizeKeys(data));\n      })\n      .catch(error => {\n        reject(error);\n      });\n  });\n}\n\nexport function getRunStatsForProjects() {\n  return new Promise((resolve, reject) => {\n    get(projectsRunStatsApiPath())\n      .then(async response => {\n        const data = await response.json();\n        resolve(camelizeKeys(data));\n      })\n      .catch(error => {\n        reject(error);\n      });\n  });\n}\n","import {\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  IconButton,\n  LinearProgress,\n  Tooltip,\n  Typography,\n} from '@material-ui/core';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport LinkIcon from '@material-ui/icons/Link';\nimport SupervisorAccountIcon from '@material-ui/icons/SupervisorAccount';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport { useHistory } from 'react-router-dom';\nimport {\n  Area,\n  AreaChart,\n  ResponsiveContainer,\n  Tooltip as RechartTooltip,\n  XAxis,\n} from 'recharts';\nimport { calendarTime, duration } from '../helpers';\nimport { projectAccessPath, projectReceiptsPath } from '../helpers/pathHelpers';\nimport Loader from './Loader';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    flexGrow: 1,\n  },\n  flex: {\n    flex: 1,\n  },\n  recharts: {\n    backgroundColor: theme.palette.divider,\n    fontFamily: theme.typography.fontFamily,\n    paddingTop: 15,\n    paddingBottom: 15,\n    paddingLeft: 10,\n    paddingRight: 10,\n  },\n  dateMarker: {\n    width: '3',\n    height: '100%',\n    position: 'absolute',\n    background: theme.palette.secondary.main,\n  },\n}));\n\nfunction ProjectItem({\n  project,\n  plan,\n  linkTo,\n  runStats,\n  usageCount,\n  usageCountsLoading,\n}) {\n  const classes = useStyles();\n  const theme = useTheme();\n  const history = useHistory();\n  const url = [\n    window.location.protocol,\n    '',\n    window.location.host,\n    'inbox',\n    project.address,\n  ].join('/');\n  const role = project.userRole ? project.userRole : 'collaborator';\n  const runsInPeriod = usageCount ? usageCount.runsInPeriod : 0;\n  const runLimit = plan.submissionLimit;\n  const placeInCycle =\n    project.billingPeriodEnd &&\n    (duration(project.billingPeriodEnd, Date.now(), 'days') / 31) * 100;\n\n  const hasCrashes = project.stats.some(stat => stat.crashed !== 0);\n\n  return (\n    <Card\n      style={{ wordWrap: 'break-word' }}\n      id={project.id}\n      name=\"project-item\"\n    >\n      <CardHeader\n        title={project.name}\n        subheader={project.description || '- -'}\n        action={\n          <CopyToClipboard text={url}>\n            <Tooltip id=\"tooltip-fab\" title=\"Copy inbox URL\">\n              <IconButton>\n                <LinkIcon />\n              </IconButton>\n            </Tooltip>\n          </CopyToClipboard>\n        }\n      />\n      {runStats ? (\n        <div className={classes.recharts}>\n          <ResponsiveContainer width=\"100%\" height={100}>\n            <AreaChart\n              data={runStats}\n              margin={{\n                top: 20,\n                right: 15,\n                bottom: 0,\n                left: 15,\n              }}\n            >\n              <XAxis hide dataKey=\"date\" />\n              <RechartTooltip />\n              {hasCrashes && (\n                <Area\n                  type=\"monotone\"\n                  dataKey=\"crashed\"\n                  stackId=\"1\"\n                  stroke={theme.palette.secondary.main}\n                  fill={theme.palette.secondary.main}\n                  dot={false}\n                  strokeWidth={2}\n                />\n              )}\n              <Area\n                type=\"monotone\"\n                dataKey=\"failure\"\n                stackId=\"1\"\n                stroke={theme.palette.error.main}\n                fill={theme.palette.error.main}\n                dot={false}\n                strokeWidth={2}\n              />\n              <Area\n                type=\"monotone\"\n                dataKey=\"success\"\n                stackId=\"1\"\n                stroke={theme.palette.primary.main}\n                fill={theme.palette.primary.main}\n                dot={false}\n                strokeWidth={2}\n              />\n            </AreaChart>\n          </ResponsiveContainer>\n        </div>\n      ) : (\n        <Loader item=\"statistics\" naked />\n      )}\n      <CardContent>\n        {usageCountsLoading ? (\n          <Loader item=\"billing details\" naked />\n        ) : (\n          <div>\n            <Typography>\n              {plan.label} plan resets on&nbsp;\n              {calendarTime(project.billingPeriodEnd)} <br />\n            </Typography>\n            <LinearProgress\n              variant=\"determinate\"\n              value={(runsInPeriod / runLimit) * 100}\n              valueBuffer={placeInCycle}\n            />\n            <Typography>\n              {runsInPeriod < 1000 ? runsInPeriod : `${runsInPeriod / 1000}k`}\n              &nbsp;/&nbsp;\n              {runLimit < 1000 ? runLimit : `${runLimit / 1000}k`} runs\n            </Typography>\n          </div>\n        )}\n      </CardContent>\n      <CardActions>\n        <Button\n          id=\"goto-project\"\n          onClick={linkTo(projectReceiptsPath(project), history)}\n        >\n          View\n        </Button>\n        <div className={classes.flex} />\n        <Button onClick={linkTo(projectAccessPath(project), history)}>\n          <SupervisorAccountIcon />\n          &nbsp;{role}\n        </Button>\n      </CardActions>\n    </Card>\n  );\n}\n\nProjectItem.propTypes = {\n  linkTo: PropTypes.func.isRequired,\n  project: PropTypes.object.isRequired,\n  usageCountsLoading: PropTypes.bool.isRequired,\n  usageCount: PropTypes.object,\n  runStats: PropTypes.array,\n  plan: PropTypes.object,\n};\n\nProjectItem.defaultProps = {\n  usageCount: null,\n  runStats: null,\n  plan: {},\n};\n\nexport default React.memo(ProjectItem);\n","import React from 'react';\nimport {\n  Grid,\n  Card,\n  CardContent,\n  List,\n  ListItem,\n  ListItemIcon,\n  ListItemText,\n  Typography,\n} from '@material-ui/core';\nimport {\n  AddCircle,\n  LibraryBooks,\n  YouTube,\n  Chat,\n  Dashboard,\n} from '@material-ui/icons';\nimport PropTypes from 'prop-types';\nimport { useHistory } from 'react-router-dom';\nimport { linkTo, openTicketWidget } from '../helpers';\nimport { projectsPath } from '../helpers/pathHelpers';\n\nfunction WelcomeMessage({ showModal, hasProjects }) {\n  const history = useHistory();\n  return (\n    <Grid container justifyContent=\"center\">\n      <Grid item xs={12} sm={9} md={6}>\n        <Card>\n          <CardContent>\n            <Typography variant=\"h2\">Welcome to OpenFn.</Typography>\n            <br />\n            <Typography>\n              It&apos;s nice to see you on the platform. Below, we&apos;ve\n              outlined some recommended <em>next steps</em> that our clients\n              have found helpful for onboarding.\n            </Typography>\n          </CardContent>\n          <List>\n            {hasProjects ? (\n              <ListItem button onClick={linkTo(projectsPath(), history)}>\n                &nbsp;\n                <ListItemIcon>\n                  <Dashboard />\n                </ListItemIcon>\n                <ListItemText>\n                  Check out your <b>projects</b> in the dashboard to connect\n                  apps now\n                </ListItemText>\n              </ListItem>\n            ) : (\n              <ListItem button onClick={showModal}>\n                &nbsp;\n                <ListItemIcon>\n                  <AddCircle />\n                </ListItemIcon>\n                <ListItemText>\n                  Create a new <b>project</b> by clicking here.\n                </ListItemText>\n              </ListItem>\n            )}\n            <ListItem\n              button\n              onClick={() => window.open('https://docs.openfn.org/', '_blank')}\n            >\n              &nbsp;\n              <ListItemIcon>\n                <LibraryBooks />\n              </ListItemIcon>\n              <ListItemText>\n                Read the <b>docs</b> for guides and how-to&apos;s\n              </ListItemText>\n            </ListItem>\n            <ListItem\n              button\n              onClick={() =>\n                window.open(\n                  'https://www.youtube.com/watch?v=mo4IfBy8wfU',\n                  '_blank'\n                )\n              }\n            >\n              &nbsp;\n              <ListItemIcon>\n                <YouTube />\n              </ListItemIcon>\n              <ListItemText>\n                Watch a short <b>Explainer video</b> on our YouTube channel\n              </ListItemText>\n            </ListItem>\n            <ListItem button onClick={() => openTicketWidget()}>\n              &nbsp;\n              <ListItemIcon>\n                <Chat />\n              </ListItemIcon>\n              <ListItemText>\n                Talk to an <b>integration expert</b> to get setup help or plan\n                your project\n              </ListItemText>\n            </ListItem>\n          </List>\n          <CardContent>\n            <Typography>\n              Happy integrating from the whole team at OpenFn!\n            </Typography>\n          </CardContent>\n        </Card>\n      </Grid>\n    </Grid>\n  );\n}\n\nWelcomeMessage.propTypes = {\n  showModal: PropTypes.bool,\n  hasProjects: PropTypes.bool.isRequired,\n};\n\nWelcomeMessage.defaultProps = {\n  showModal: false,\n};\n\nexport default WelcomeMessage;\n","import React from 'react';\nimport {\n  FormHelperText,\n  DialogTitle,\n  DialogContent,\n  DialogContentText,\n  DialogActions,\n  Dialog,\n  Button,\n} from '@material-ui/core';\nimport PropTypes from 'prop-types';\nimport { Field, Form } from 'react-final-form';\nimport { UnprocessableEntity } from '../errors';\nimport { createFormErrors, slugify, slugRule } from '../helpers';\nimport TextInput from './FormHelpers/TextInput';\n\nconst validate = values => {\n  const errors = {};\n\n  if (!values.name) {\n    errors.name = 'Required';\n  }\n  if (slugRule(values.name)) errors.name = slugRule(values.name);\n  return errors;\n};\n\nfunction NewProjectModal({ modalShow, handleCancel, handleCreate }) {\n  const submit = async values => {\n    try {\n      await handleCreate(values);\n    } catch (error) {\n      if (error instanceof UnprocessableEntity) {\n        return createFormErrors(error.errors, values);\n      }\n\n      throw error;\n    }\n  };\n\n  return (\n    <Dialog\n      open={modalShow}\n      onClose={handleCancel}\n      aria-labelledby=\"form-dialog-title\"\n    >\n      <Form\n        onSubmit={submit}\n        validate={validate}\n        initialValues={{ name: '' }}\n        render={({\n          pristine,\n          submitting,\n          handleSubmit,\n          values,\n          hasValidationErrors,\n          hasSubmitErrors,\n          modifiedSinceLastSubmit,\n        }) => (\n          <>\n            <DialogTitle id=\"form-dialog-title\">Create new project</DialogTitle>\n            <DialogContent>\n              <DialogContentText>\n                Project spaces allow you to organize your integrations and\n                selectively share them with different teams.\n              </DialogContentText>\n              <Field\n                autoFocus\n                margin=\"dense\"\n                component={TextInput}\n                label=\"Project Name\"\n                id=\"name\"\n                type=\"text\"\n                fullWidth\n                name=\"name\"\n              />\n              {values.name && (\n                <FormHelperText>\n                  <code>{slugify(values.name) || 'invalid slug'}</code>\n                </FormHelperText>\n              )}\n              <Field\n                placeholder=\"Not required, but oh so helpful.\"\n                margin=\"dense\"\n                component={TextInput}\n                label=\"Description\"\n                id=\"description\"\n                type=\"text\"\n                fullWidth\n                name=\"description\"\n              />\n            </DialogContent>\n            <DialogActions>\n              <Button onClick={handleCancel} color=\"primary\">\n                Cancel\n              </Button>\n              <Button\n                onClick={handleSubmit}\n                color=\"primary\"\n                id=\"create-project-btn\"\n                disabled={\n                  submitting ||\n                  pristine ||\n                  hasValidationErrors ||\n                  (hasSubmitErrors && !modifiedSinceLastSubmit)\n                }\n              >\n                Create\n              </Button>\n            </DialogActions>\n          </>\n        )}\n      />\n    </Dialog>\n  );\n}\n\nNewProjectModal.propTypes = {\n  modalShow: PropTypes.bool.isRequired,\n  handleCancel: PropTypes.func.isRequired,\n  handleCreate: PropTypes.func.isRequired,\n};\nexport default NewProjectModal;\n","import { orderBy, values, isEqual } from 'lodash';\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { switchedMenu } from '../actions/MenuActions';\nimport { fetchPlans } from '../actions/PlanActions';\nimport { createProject } from '../actions/ProjectActions';\nimport { fetchRunStatsForProject } from '../actions/ProjectRunStatsActions';\nimport { fetchUsageCounts } from '../actions/UsageCountActions';\nimport { linkTo } from '../helpers';\nimport Loader from './Loader';\nimport MasonryWrapper from './MasonryWrapper';\nimport ProjectItem from './ProjectItem';\nimport SectionFrame from './SectionFrame';\nimport WelcomeMessage from './WelcomeMessage';\nimport NewProjectModal from './NewProjectModal';\nimport { useHistory } from 'react-router-dom';\n\nfunction ProjectsList() {\n  const dispatch = useDispatch();\n  const [modalShow, setModalShow] = useState(false);\n  const [filter, setFilter] = useState('');\n  const history = useHistory();\n\n  const projectItems = useSelector(state => state.projects.items, isEqual);\n\n  const projects = useMemo(\n    () => orderBy(values(projectItems), [p => p.name.toLowerCase()]),\n    [projectItems]\n  );\n\n  const { runStats, usageCounts } = useSelector(\n    state => state.projects,\n    isEqual\n  );\n\n  const plans = useSelector(state => state.plans.items, isEqual);\n\n  const isLoading = useSelector(state => state.projects.isLoading);\n\n  const loaded = useSelector(state => state.projects.loaded);\n\n  const usageCountsLoading = useSelector(\n    state => state.projects.loadingDetails\n  );\n\n  const showModal = () => {\n    setModalShow(true);\n  };\n\n  const hideModal = () => {\n    setModalShow(false);\n  };\n\n  const handleCreate = async ({ name, description }) => {\n    await dispatch(createProject({ name, description }));\n    setModalShow(false);\n  };\n\n  const handleFilterChange = e => {\n    setFilter(e.target.value.toLowerCase());\n  };\n\n  const includesText = project => {\n    return (\n      project.name.toLowerCase().includes(filter) ||\n      (project.description &&\n        project.description.toLowerCase().includes(filter))\n    );\n  };\n\n  useEffect(() => {\n    document.title = 'Projects - OpenFn';\n    dispatch(switchedMenu('Project Dashboard'));\n    dispatch(fetchPlans());\n  }, [dispatch]);\n\n  useEffect(() => {\n    if (projects.length > 0) {\n      dispatch(fetchUsageCounts());\n      projects.forEach(project => {\n        dispatch(fetchRunStatsForProject(project));\n      });\n    }\n  }, [projects, dispatch]);\n\n  return (\n    <div>\n      <SectionFrame\n        section=\"project\"\n        search={handleFilterChange}\n        searchText={filter}\n        helper=\"Search projects by title or description.\"\n        create={showModal}\n      />\n\n      {isLoading ? (\n        <Loader item=\"projects\" />\n      ) : (\n        <MasonryWrapper className=\"MuiGrid-item\">\n          {projects.filter(includesText).map(p => (\n            <ProjectItem\n              key={p.id}\n              project={p}\n              plan={plans[p.planId]}\n              linkTo={linkTo}\n              runStats={runStats[p.id]}\n              usageCount={usageCounts[p.id]}\n              usageCountsLoading={usageCountsLoading}\n            />\n          ))}\n        </MasonryWrapper>\n      )}\n      {loaded && projects.length === 0 && (\n        <WelcomeMessage\n          showModal={showModal}\n          hasProjects={false}\n          history={history}\n        />\n      )}\n      <NewProjectModal\n        modalShow={modalShow}\n        handleCancel={hideModal}\n        handleCreate={handleCreate}\n      />\n    </div>\n  );\n}\n\nexport default React.memo(ProjectsList);\n","import {\n  getRunStatsForProject,\n  getRunStatsForProjects,\n} from '../clients/ProjectRunStatsClient';\nimport {\n  FAILED_RUN_STATS_FOR_PROJECT,\n  FAILED_RUN_STATS_FOR_PROJECTS,\n  RECEIVED_RUN_STATS_FOR_PROJECT,\n  RECEIVED_RUN_STATS_FOR_PROJECTS,\n  REQUESTED_RUN_STATS_FOR_PROJECT,\n  REQUESTED_RUN_STATS_FOR_PROJECTS,\n} from '../constants';\n\n/**\n * @param {import(\"../helpers/pathHelpers\").Project} project\n */\nexport function fetchRunStatsForProject(project) {\n  return {\n    promise: getRunStatsForProject(project),\n    types: [\n      REQUESTED_RUN_STATS_FOR_PROJECT,\n      RECEIVED_RUN_STATS_FOR_PROJECT,\n      FAILED_RUN_STATS_FOR_PROJECT,\n    ],\n  };\n}\n\nexport function fetchRunStatsForProjects() {\n  return {\n    promise: getRunStatsForProjects(),\n    types: [\n      REQUESTED_RUN_STATS_FOR_PROJECTS,\n      RECEIVED_RUN_STATS_FOR_PROJECTS,\n      FAILED_RUN_STATS_FOR_PROJECTS,\n    ],\n  };\n}\n","import React, { PureComponent } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport clsx from 'clsx';\nimport Typography from '@material-ui/core/Typography';\nimport Container from '@material-ui/core/Container';\nimport Images from '../helpers/imagePaths';\nimport { makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    borderRadius: 0,\n    paddingTop: theme.spacing(8),\n    paddingBottom: theme.spacing(4),\n  },\n  noTopPad: {\n    paddingTop: 0,\n  },\n  noBottomPad: {\n    paddingBottom: '0 !important',\n  },\n  centered: {\n    textAlign: 'center',\n  },\n  gray: {\n    backgroundImage: `url(${Images.bgNoise})`,\n  },\n  intro: {\n    paddingBottom: theme.spacing(4),\n  },\n  body: {\n    paddingBottom: theme.spacing(4),\n  },\n  outro: {\n    paddingBottom: theme.spacing(4),\n    lineHeight: 'inherit',\n  },\n}));\n\nfunction Feature({\n  children,\n  gray,\n  intro,\n  outro,\n  centered,\n  body,\n  wide,\n  subtitle,\n  id,\n  noTopPad,\n  noBottomPad,\n}) {\n  const classes = useStyles();\n\n  const styling = [\n    classes.root,\n    gray && classes.gray,\n    centered && classes.centered,\n    noTopPad && classes.noTopPad,\n    noBottomPad && classes.noBottomPad,\n  ];\n\n  return (\n    <div id={id} className={clsx(styling)}>\n      <Container wide={wide}>\n        {intro && (\n          <div className={classes.intro}>\n            <Typography variant=\"h4\">{intro}</Typography>\n            <Typography variant=\"subtitle1\">{subtitle}</Typography>\n          </div>\n        )}\n        {children && <div className={classes.body}>{children}</div>}\n        {body && <Typography className={classes.body}>{body}</Typography>}\n        {outro && (\n          <Typography variant=\"h5\" className={classes.outro}>\n            {outro}\n          </Typography>\n        )}\n      </Container>\n    </div>\n  );\n}\n\nexport default Feature;\n","import React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { getCurrentUser } from '../actions/SessionActions';\nimport Feature from '../marketing/Feature';\nimport WelcomeMessage from './WelcomeMessage';\n\nfunction SignupConfirm() {\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    document.title = 'Welcome - OpenFn';\n    dispatch(getCurrentUser());\n  }, [dispatch]);\n\n  return (\n    <Feature>\n      <WelcomeMessage hasProjects />\n    </Feature>\n  );\n}\n\nexport default SignupConfirm;\n","import React from 'react';\nimport IconButton from '@material-ui/core/IconButton';\nimport MaterialSnackbar from '@material-ui/core/Snackbar';\nimport { CheckCircle, Error, Info, Warning } from '@material-ui/icons';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    '& .MuiSvgIcon-root': {\n      marginRight: 5,\n      marginBottom: -4,\n    },\n  },\n  info: {\n    color: theme.palette.info.main,\n  },\n  success: {\n    color: theme.palette.success.main,\n  },\n  warning: {\n    color: theme.palette.warning.main,\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n}));\n\nfunction Snackbar({ notification, onClick, onClose, onExited }) {\n  const classes = useStyles();\n  function alertIcon(theme) {\n    switch (theme) {\n      case 'success':\n        return <CheckCircle fontSize=\"small\" className={classes.success} />;\n\n      case 'info':\n        return <Info fontSize=\"small\" className={classes.info} />;\n\n      case 'warning':\n        return <Warning fontSize=\"small\" className={classes.warning} />;\n\n      case 'error':\n        return <Error fontSize=\"small\" className={classes.error} />;\n\n      default:\n        return null;\n    }\n  }\n\n  const handleClose = (event, reason) => {\n    if (reason === 'clickaway') {\n      return;\n    }\n    onClose();\n  };\n\n  return (\n    <MaterialSnackbar\n      ContentProps={{\n        'aria-label': notification.msg,\n      }}\n      id=\"snackbar\"\n      key={notification.id}\n      anchorOrigin={{\n        vertical: 'bottom',\n        horizontal: 'left',\n      }}\n      open={!!notification.id}\n      autoHideDuration={6000}\n      onClose={handleClose}\n      TransitionProps={{ onExited: onExited }}\n      message={\n        <span id=\"message-id\" className={classes.root}>\n          {alertIcon(notification.theme)}\n          {notification.msg}\n        </span>\n      }\n      action={[\n        <IconButton\n          key=\"close\"\n          id=\"close-btn\"\n          aria-label=\"Close\"\n          color=\"inherit\"\n          onClick={onClick}\n        >\n          <CloseIcon />\n        </IconButton>,\n      ]}\n    />\n  );\n}\n\nexport default React.memo(Snackbar);\n","import React, { useEffect } from 'react';\nimport {\n  makeStyles,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Grid,\n  Typography,\n} from '@material-ui/core';\nimport { FORM_ERROR } from 'final-form';\nimport { Field, Form } from 'react-final-form';\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { isEqual } from 'lodash';\nimport { updateUser } from '../actions/UserActions';\nimport { linkTo } from '../helpers';\nimport { accountPath } from '../helpers/pathHelpers';\nimport { selectCurrentUser } from '../selectors';\nimport TextInput from './FormHelpers/TextInput';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    display: 'flex',\n    flexWrap: 'wrap',\n    alignItems: 'flex',\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n}));\n\nconst validate = values => {\n  const errors = {};\n  if (!values.currentPassword) {\n    errors.currentPassword =\n      'For security, please enter your current password.';\n  }\n  if (!values.email) {\n    errors.email = 'Required';\n  }\n  if (values.email !== values.emailConfirmation) {\n    errors.email = 'New mail and confirmation do not match.';\n  }\n  return errors;\n};\n\nfunction UserChangeEmail() {\n  const history = useHistory();\n\n  const dispatch = useDispatch();\n\n  const classes = useStyles();\n\n  const initialValues = useSelector(selectCurrentUser, isEqual);\n\n  const passwordMessage = useSelector(state => state.auth.passwordMessage);\n\n  useEffect(() => {\n    document.title = 'Change Email - OpenFn';\n  }, []);\n\n  const submit = values => {\n    return new Promise(resolve => {\n      dispatch(updateUser(values)).then(\n        () => {\n          resolve(history.push(accountPath()));\n        },\n        error => {\n          if (error.validationErrors) {\n            resolve({ [FORM_ERROR]: error.validationErrors });\n          } else {\n            resolve({ [FORM_ERROR]: error });\n          }\n        }\n      );\n    });\n  };\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      initialValues={initialValues}\n      render={({\n        handleSubmit,\n        submitting,\n        pristine,\n        invalid,\n        dirtySinceLastSubmit,\n      }) => (\n        <Grid\n          container\n          spacing={3}\n          className={classes.root}\n          direction=\"column\"\n          alignItems=\"center\"\n        >\n          <Grid item>\n            <Card className={classes.card}>\n              <CardHeader title=\"Change Email\" />\n              <form onSubmit={handleSubmit}>\n                <CardContent>\n                  <Grid container spacing={1} direction=\"row\">\n                    <Grid item>\n                      <Field\n                        name=\"email\"\n                        component={TextInput}\n                        type=\"email\"\n                        label=\"New Email\"\n                        placeholder=\"Enter a new email\"\n                      />\n                    </Grid>\n                    <Grid item>\n                      <Field\n                        name=\"emailConfirmation\"\n                        component={TextInput}\n                        type=\"email\"\n                        label=\"Confirm New Email\"\n                        placeholder=\"Confirm your new email\"\n                      />\n                    </Grid>\n                  </Grid>\n                  <Field\n                    name=\"currentPassword\"\n                    component={TextInput}\n                    type=\"password\"\n                    label=\"Current Password\"\n                    placeholder=\"Enter your current password\"\n                  />\n                  {passwordMessage && !submitting ? (\n                    <Typography className={classes.error}>\n                      {' '}\n                      {passwordMessage}{' '}\n                    </Typography>\n                  ) : null}\n                </CardContent>\n                <CardActions>\n                  <Button onClick={linkTo(accountPath(), history)}>\n                    Cancel\n                  </Button>\n                  <Button\n                    disabled={\n                      submitting ||\n                      pristine ||\n                      (invalid && !dirtySinceLastSubmit)\n                    }\n                    type=\"submit\"\n                    onClick={handleSubmit}\n                  >\n                    {submitting ? (\n                      <i className=\"fas fa-circle-notch fa-lg fa-spin\" />\n                    ) : (\n                      'Change Your Email'\n                    )}\n                  </Button>\n                </CardActions>\n              </form>\n            </Card>\n          </Grid>\n        </Grid>\n      )}\n    />\n  );\n}\n\nexport default UserChangeEmail;\n","import React, { useEffect } from 'react';\nimport {\n  makeStyles,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Grid,\n  Typography,\n} from '@material-ui/core';\nimport { FORM_ERROR } from 'final-form';\nimport { isEqual } from 'lodash';\nimport { Field, Form } from 'react-final-form';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { updateUser } from '../actions/UserActions';\nimport { selectCurrentUser } from '../selectors';\nimport TextInput from './FormHelpers/TextInput';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    display: 'flex',\n    flexWrap: 'wrap',\n    alignItems: 'flex',\n  },\n}));\n\nconst validate = values => {\n  const errors = {};\n  if (!values.currentPassword) {\n    errors.currentPassword =\n      'For security, please enter your current password.';\n  }\n  if (!values.password) {\n    errors.password = 'Required';\n  }\n  if (values.password !== values.passwordConfirmation) {\n    errors.password = 'Password and confirmation do not match.';\n  }\n  if (values.password && values.password.length < 8) {\n    errors.password = 'Minimum 12 characters';\n  }\n  return errors;\n};\n\nfunction UserChangePassword() {\n  const history = useHistory();\n\n  const classes = useStyles();\n\n  const dispatch = useDispatch();\n\n  const initialValues = useSelector(selectCurrentUser, isEqual);\n\n  const passwordMessage = useSelector(state => state.auth.passwordMessage);\n\n  useEffect(() => {\n    document.title = 'Change Password - OpenFn';\n  }, []);\n\n  const submit = values => {\n    return new Promise(resolve => {\n      dispatch(updateUser(values)).then(\n        () => {\n          resolve(history.push('/account'));\n        },\n        error => {\n          if (error.validationErrors) {\n            resolve({ [FORM_ERROR]: error.validationErrors });\n          } else {\n            resolve({ [FORM_ERROR]: error });\n          }\n        }\n      );\n    });\n  };\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      initialValues={initialValues}\n      render={({\n        handleSubmit,\n        submitError,\n        submitting,\n        pristine,\n        invalid,\n        dirtySinceLastSubmit,\n      }) => (\n        <Grid\n          container\n          spacing={3}\n          className={classes.root}\n          direction=\"column\"\n          alignItems=\"center\"\n        >\n          <Grid item>\n            <Card className={classes.card}>\n              <CardHeader title=\"Change Password\" />\n              <form onSubmit={handleSubmit}>\n                <CardContent>\n                  <Grid container spacing={1} direction=\"column\">\n                    <Grid item>\n                      <Field\n                        name=\"currentPassword\"\n                        component={TextInput}\n                        type=\"password\"\n                        label=\"Current Password\"\n                        placeholder=\"Enter your current password.\"\n                      />\n                    </Grid>\n                    <Grid item>\n                      <Field\n                        name=\"password\"\n                        component={TextInput}\n                        type=\"password\"\n                        label=\"New Password\"\n                        placeholder=\"Enter a new password.\"\n                      />\n                    </Grid>\n                    <Grid item>\n                      <Field\n                        name=\"passwordConfirmation\"\n                        component={TextInput}\n                        type=\"password\"\n                        label=\"Confirm New Password\"\n                        placeholder=\"Confirm your new password.\"\n                      />\n                    </Grid>\n                  </Grid>\n                  <br />\n                  {submitError && !submitting ? (\n                    <Typography color=\"error\">{passwordMessage}</Typography>\n                  ) : null}\n                </CardContent>\n                <CardActions>\n                  <Button onClick={() => history.goBack()}>Cancel</Button>\n                  <Button\n                    disabled={\n                      submitting ||\n                      pristine ||\n                      (invalid && !dirtySinceLastSubmit)\n                    }\n                    type=\"submit\"\n                    onClick={handleSubmit}\n                  >\n                    {submitting ? (\n                      <i className=\"fas fa-circle-notch fa-spin\" />\n                    ) : (\n                      'Change Your Password'\n                    )}\n                  </Button>\n                </CardActions>\n              </form>\n            </Card>\n          </Grid>\n        </Grid>\n      )}\n    />\n  );\n}\n\nexport default UserChangePassword;\n","import { camelizeKeys } from 'humps';\nimport { normalize, schema } from 'normalizr';\nimport { productsApiPath } from '../helpers/actionsPathHelpers';\nimport { Product } from '../schemas';\nimport { get } from './BaseClient';\n\nexport function getProducts() {\n  return new Promise((resolve, reject) => {\n    get(productsApiPath())\n      .then(async response => {\n        const data = await response.json();\n        resolve(normalize(camelizeKeys(data), new schema.Array(Product)));\n      })\n      .catch(error => {\n        reject(error);\n      });\n  });\n}\n","import React from 'react';\nimport { PropTypes } from 'prop-types';\nimport { TextField } from '@material-ui/core';\nimport { Autocomplete } from '@material-ui/lab';\n\nconst StarredProductsAutocomplete = ({ input, products }) => (\n  <Autocomplete\n    id=\"starred-products\"\n    freeSolo\n    multiple\n    options={products && products.map(product => product.name)}\n    onChange={(event, option) => input && input.onChange(option)}\n    value={input && input.value ? input.value : []}\n    autoHighlight\n    renderInput={params => {\n      return (\n        <TextField\n          {...params}\n          label=\"What systems do you want to automate or integrate?\"\n          placeholder=\"DHIS2, CommCare, etc.\"\n          margin=\"normal\"\n          name=\"starredProducts\"\n        />\n      );\n    }}\n  />\n);\n\nStarredProductsAutocomplete.propTypes = {\n  input: PropTypes.object.isRequired,\n  products: PropTypes.array.isRequired,\n};\n\nexport default StarredProductsAutocomplete;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Typography,\n  Button,\n} from '@material-ui/core';\nimport { Field, Form } from 'react-final-form';\nimport { FORM_ERROR } from 'final-form';\nimport { useHistory } from 'react-router-dom';\nimport { withStyles } from '@material-ui/core/styles';\nimport { useDispatch } from 'react-redux';\nimport TextInput from './FormHelpers/TextInput';\nimport FormActions from './FormActions';\nimport { logout } from '../actions/SessionActions';\nimport { post } from '../clients/BaseClient';\nimport { loginApiPath } from '../helpers/actionsPathHelpers';\nimport { deleteUser } from '../actions/UserActions';\n\nconst styles = theme => ({\n  projectName: {\n    color: theme.palette.primary.main,\n    fontWeight: 'bold',\n  },\n  check: {\n    color: theme.palette.success.main,\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n});\n\nfunction DeleteAccountModal(props) {\n  const { show, onClose, user, classes } = props;\n\n  const dispatch = useDispatch();\n  const history = useHistory();\n\n  const validate = values => {\n    const errors = {};\n    if (!values.password) errors.password = 'Required';\n    return errors;\n  };\n\n  const performDeletion = resolve =>\n    dispatch(deleteUser({ id: user.id }))\n      .then(_ => dispatch(logout(history, '/goodbye')))\n      .catch(_ => {\n        resolve({\n          [FORM_ERROR]:\n            'We encountered an error while deleting your project. Please try again.',\n        });\n      });\n\n  const submit = async values => {\n    return new Promise(resolve => {\n      const credentials = { email: user.email, password: values.password };\n      post(loginApiPath(), { session: credentials })\n        .then(response => {\n          if (response.ok) performDeletion(resolve);\n        })\n        .catch(_ => {\n          resolve({\n            [FORM_ERROR]: 'The password you entered is incorrect.',\n          });\n        });\n    });\n  };\n\n  return (\n    <Dialog open={show} onClose={onClose}>\n      <DialogTitle>Delete Account</DialogTitle>\n      <Form\n        onSubmit={submit}\n        validate={validate}\n        render={({ handleSubmit, submitError, submitSucceeded, form }) => (\n          <>\n            <DialogContent>\n              <>\n                <Typography>\n                  Deleting your account is an irreversible action. It leads to\n                  the loss of all your user and credential data. After a short\n                  grace period, you will not be able to recover any personal\n                  information or secrets from your user or related credentials.\n                </Typography>\n                <br />\n                <Typography>\n                  If you want to delete your account, please confirm by\n                  providing your password in the form below.\n                </Typography>\n                <form onSubmit={handleSubmit} id=\"delete-account-form\">\n                  <Field\n                    name=\"password\"\n                    label=\"Password\"\n                    component={TextInput}\n                    type=\"password\"\n                  />\n                </form>\n                {submitError && (\n                  <div className={classes.error}>{submitError}</div>\n                )}\n              </>\n            </DialogContent>\n            <DialogActions>\n              {submitSucceeded ? (\n                <Button onClick={onClose}>Close</Button>\n              ) : (\n                <FormActions\n                  submit={handleSubmit}\n                  cancel={onClose}\n                  reset={form.reset}\n                  form={form}\n                  submitText=\"Delete\"\n                />\n              )}\n            </DialogActions>\n          </>\n        )}\n      />\n    </Dialog>\n  );\n}\n\nDeleteAccountModal.propTypes = {\n  show: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  user: PropTypes.object.isRequired,\n  classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles, { withTheme: true })(\n  React.memo(DeleteAccountModal)\n);\n","import React, { useEffect, useState } from 'react';\nimport {\n  Avatar,\n  Card,\n  CardContent,\n  CardHeader,\n  Grid,\n  IconButton,\n  Menu,\n  MenuItem,\n  Tooltip,\n  Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  CheckCircle as CheckCircleIcon,\n  Help as HelpIcon,\n  MoreVert as MoreVertIcon,\n} from '@material-ui/icons';\nimport { FORM_ERROR } from 'final-form';\nimport { Field, Form } from 'react-final-form';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { isEqual, orderBy } from 'lodash';\nimport { getCurrentUser } from '../actions/SessionActions';\nimport { updateUser } from '../actions/UserActions';\nimport { linkTo } from '../helpers';\nimport {\n  billingPath,\n  changeEmailPath,\n  changePasswordPath,\n  oauthGithubRevokePath,\n  oauthUserConsentPath,\n} from '../helpers/pathHelpers';\nimport { selectCurrentUser } from '../selectors';\nimport { themeOptions } from './CodeEditor';\nimport FormActions from './FormActions';\nimport SelectInput from './FormHelpers/SelectInput';\nimport TextInput from './FormHelpers/TextInput';\nimport Link from './Link';\nimport OneCardHolder from './OneCardHolder';\nimport { fetchProducts } from '../actions/ProductActions';\nimport StarredProductsAutocomplete from './StarredProductsAutocomplete';\nimport DeleteAccountModal from './DeleteAccountModal';\n\nconst useStyles = makeStyles(theme => ({\n  gray: {\n    backgroundColor: theme.palette.divider,\n  },\n  avatar: {\n    backgroundColor: theme.palette.secondary.main,\n    color: theme.palette.getContrastText(theme.palette.secondary.main),\n  },\n}));\n\nconst validate = values => {\n  const errors = {};\n  if (!values.firstName) {\n    errors.firstName = 'Required';\n  }\n  if (!values.lastName) {\n    errors.lastName = 'Required';\n  }\n  return errors;\n};\n\nfunction UserEdit() {\n  const [anchorEl, setAnchorEl] = useState(null);\n\n  const history = useHistory();\n\n  const classes = useStyles();\n\n  const dispatch = useDispatch();\n\n  const user = useSelector(state => selectCurrentUser(state) || {}, isEqual);\n\n  const [deleteModalShow, setDeleteModalShow] = useState(false);\n\n  const oAuthConsentParams = {\n    provider: 'Github',\n    scope: 'user repo public_repo admin:repo_hook',\n    authUrl: 'http://github.com/login/oauth/authorize',\n    tokenUrl: 'https://github.com/login/oauth/access_token',\n    userInfoUrl: 'https://api.github.com/user',\n    id: user.id,\n    adaptor: 'github',\n  };\n\n  const initialValues = user;\n\n  const githubAccessToken = initialValues && initialValues.githubAccessToken;\n\n  const cardIcons = {\n    Visa: 'fab fa-cc-visa fa-lg',\n    'American Express': 'fab fa-cc-amex fa-lg',\n    MasterCard: 'fab fa-cc-mastercard fa-lg',\n    Discover: 'fab fa-cc-discover fa-lg',\n    JCB: 'fab fa-cc-jcb fa-lg',\n    DinersClub: 'fab fa-cc-diners-club fa-lg',\n    Unknown: 'fab fa-credit-card fa-lg',\n  };\n\n  const cardStyle = cardIcons[user.brand];\n\n  const notificationOptions = [\n    { id: 'never', value: 'never', text: 'Never' },\n    { id: 'each_time', value: 'each_time', text: 'Each Time' },\n  ];\n\n  const editorStyleOptions = [\n    { id: 'wizard', value: 'wizard', text: 'Wizard' },\n    { id: 'ide', value: 'ide', text: 'IDE' },\n  ];\n\n  const handleClick = event => {\n    setAnchorEl(event.currentTarget);\n  };\n\n  const handleClose = () => {\n    setAnchorEl(null);\n  };\n\n  const handleToken = e => {\n    e.stopPropagation();\n  };\n\n  const removeToken = () => {\n    dispatch(updateUser({ ...initialValues, githubAccessToken: '' }));\n  };\n\n  const submit = values => {\n    return new Promise(resolve =>\n      dispatch(updateUser(values)).then(\n        () => {\n          resolve();\n        },\n        error => {\n          if (error.validationErrors) {\n            resolve({ [FORM_ERROR]: error.validationErrors });\n          } else {\n            resolve({ [FORM_ERROR]: error });\n          }\n        }\n      )\n    );\n  };\n\n  const notificationLabel = (\n    <div>\n      Notifications&nbsp;\n      <Tooltip title=\"Would you like to be notified via email when a run fails?\">\n        <HelpIcon fontSize=\"inherit\" />\n      </Tooltip>\n    </div>\n  );\n\n  const emailLabel = (\n    <div>\n      Other emails&nbsp;\n      <Tooltip title=\"Would you like OpenFn to contact you with occasional offers, news, research or funding opportunities?\">\n        <HelpIcon fontSize=\"inherit\" />\n      </Tooltip>\n    </div>\n  );\n\n  useEffect(() => {\n    document.title = 'User Settings - OpenFn';\n  }, []);\n\n  useEffect(() => {\n    dispatch(getCurrentUser());\n  }, [dispatch, user]);\n\n  useEffect(() => {\n    dispatch(fetchProducts());\n  }, [dispatch]);\n\n  const products = useSelector(\n    state =>\n      orderBy(Object.values(state.products.items), [p => p.name.toLowerCase()]),\n    isEqual\n  );\n\n  return (\n    <>\n      <Form\n        onSubmit={submit}\n        validate={validate}\n        initialValues={initialValues}\n        user={user}\n        render={({ handleSubmit, form, submitting }) => (\n          <OneCardHolder>\n            <Card className={classes.card}>\n              <CardHeader\n                avatar={\n                  <Avatar className={classes.avatar}>\n                    {user.firstName && user.lastName\n                      ? user.firstName.charAt(0) + user.lastName.charAt(0)\n                      : '?'}\n                  </Avatar>\n                }\n                action={\n                  <div>\n                    <IconButton\n                      aria-owns={anchorEl ? 'simple-menu' : null}\n                      aria-haspopup=\"true\"\n                      onClick={handleClick}\n                    >\n                      <MoreVertIcon />\n                    </IconButton>\n                    <Menu\n                      id=\"simple-menu\"\n                      anchorEl={anchorEl}\n                      open={Boolean(anchorEl)}\n                      onClose={handleClose}\n                    >\n                      <MenuItem onClick={linkTo(changeEmailPath(), history)}>\n                        Change Email\n                      </MenuItem>\n                      <MenuItem onClick={linkTo(changePasswordPath(), history)}>\n                        Change Password\n                      </MenuItem>\n                      {githubAccessToken ? (\n                        <Link\n                          href={oauthGithubRevokePath()}\n                          text={\n                            <MenuItem\n                              id=\"github_disconnect\"\n                              disabled={submitting}\n                              onClick={removeToken}\n                            >\n                              Disconnect from GitHub\n                            </MenuItem>\n                          }\n                        />\n                      ) : (\n                        <Link\n                          href={oauthUserConsentPath(oAuthConsentParams)}\n                          text={\n                            <MenuItem\n                              id=\"github_connect\"\n                              disabled={submitting}\n                              onClick={handleToken}\n                            >\n                              Connect to GitHub\n                            </MenuItem>\n                          }\n                        />\n                      )}\n                      <MenuItem onClick={linkTo(billingPath(), history)}>\n                        Billing Management\n                      </MenuItem>\n                      <Link\n                        href=\"mailto:support@openfn.org?subject=Permanently delete my account\"\n                        text={\n                          <Tooltip\n                            placement=\"bottom\"\n                            title=\"Permanently delete your account and associated credentials.\"\n                          >\n                            <MenuItem\n                              id=\"delete_account\"\n                              onClick={event => {\n                                event.preventDefault();\n                                setDeleteModalShow(true);\n                              }}\n                            >\n                              Delete Account\n                            </MenuItem>\n                          </Tooltip>\n                        }\n                      />\n                    </Menu>\n                  </div>\n                }\n                title=\"Account Settings\"\n                subheader={\n                  <div>\n                    {user.email}&nbsp;\n                    <code style={{ fontSize: 10 }}>{user.id}</code>&nbsp;\n                    {user.requiresActivation ? null : (\n                      <CheckCircleIcon color=\"primary\" fontSize=\"inherit\" />\n                    )}\n                  </div>\n                }\n              />\n              <CardContent className={classes.gray}>\n                <Typography>\n                  Billing method:&nbsp;&nbsp;\n                  {user.last4 ? <i className={cardStyle} /> : 'None'}\n                </Typography>\n                <Typography>\n                  Github OAuth:&nbsp;&nbsp;\n                  {githubAccessToken ? (\n                    <CheckCircleIcon color=\"primary\" fontSize=\"inherit\" />\n                  ) : (\n                    'Not connected'\n                  )}\n                </Typography>\n              </CardContent>\n              <CardContent>\n                <form onSubmit={handleSubmit}>\n                  <Grid container spacing={3} direction=\"row\">\n                    <Grid item>\n                      <Field\n                        name=\"firstName\"\n                        component={TextInput}\n                        type=\"text\"\n                        label=\"First Name\"\n                      />\n                    </Grid>\n                    <Grid item>\n                      <Field\n                        name=\"lastName\"\n                        component={TextInput}\n                        type=\"text\"\n                        label=\"Last Name\"\n                      />\n                    </Grid>\n                  </Grid>\n                  <Grid container spacing={3} direction=\"row\">\n                    <Grid item>\n                      <Field\n                        name=\"organization\"\n                        component={TextInput}\n                        type=\"text\"\n                        label=\"Organization\"\n                      />\n                    </Grid>\n                    <Grid item>\n                      <Field\n                        name=\"orgWebsite\"\n                        component={TextInput}\n                        type=\"text\"\n                        label=\"Organization Website\"\n                      />\n                    </Grid>\n                  </Grid>\n                  <Grid container spacing={3} direction=\"row\">\n                    <Grid item xs={12} sm={9}>\n                      <Field name=\"starredProducts\">\n                        {({ input }) => (\n                          <StarredProductsAutocomplete\n                            input={input}\n                            products={products}\n                          />\n                        )}\n                      </Field>\n                    </Grid>\n                  </Grid>\n                  <Grid container spacing={3} direction=\"row\">\n                    <Grid item>\n                      <Field\n                        name=\"emailFrequency\"\n                        component={SelectInput}\n                        type=\"select\"\n                        label={notificationLabel}\n                      >\n                        {notificationOptions.map(op => (\n                          <MenuItem key={op.id} value={op.value}>\n                            {op.text}\n                          </MenuItem>\n                        ))}\n                      </Field>\n                    </Grid>\n                    <Grid item>\n                      <Field\n                        name=\"allowOtherEmails\"\n                        component={SelectInput}\n                        type=\"select\"\n                        label={emailLabel}\n                      >\n                        <MenuItem key=\"1\" value>\n                          Allow occasional emails\n                        </MenuItem>\n                        <MenuItem key=\"0\" value={false}>\n                          Unsubscribe from all non-project notifications\n                        </MenuItem>\n                      </Field>\n                    </Grid>\n                  </Grid>\n                  <Grid container spacing={3} direction=\"row\">\n                    <Grid item>\n                      <Field\n                        name=\"editorStyle\"\n                        component={SelectInput}\n                        type=\"select\"\n                        label=\"Editor Style\"\n                      >\n                        {editorStyleOptions.map(op => (\n                          <MenuItem key={op.id} value={op.value}>\n                            {op.text}\n                          </MenuItem>\n                        ))}\n                      </Field>\n                    </Grid>\n                    <Grid item>\n                      <Field\n                        name=\"theme\"\n                        component={SelectInput}\n                        type=\"select\"\n                        label=\"Theme\"\n                      >\n                        {themeOptions.map(op => (\n                          <MenuItem key={op.id} value={op.value}>\n                            {op.text}\n                          </MenuItem>\n                        ))}\n                      </Field>\n                    </Grid>\n                  </Grid>\n                </form>\n              </CardContent>\n              <FormActions\n                cancel={() => history.goBack()}\n                reset={form.reset}\n                submit={handleSubmit}\n                form={form}\n              />\n            </Card>\n          </OneCardHolder>\n        )}\n      />\n      <DeleteAccountModal\n        user={user}\n        show={deleteModalShow}\n        onClose={() => setDeleteModalShow(false)}\n      />\n    </>\n  );\n}\n\nexport default UserEdit;\n","import { getProducts } from '../clients/ProductClient';\nimport {\n  PRODUCTS_FAILURE,\n  PRODUCTS_REQUEST,\n  PRODUCTS_SUCCESS,\n} from '../constants';\n\nexport function fetchProducts() {\n  return {\n    promise: getProducts(),\n    types: [PRODUCTS_REQUEST, PRODUCTS_SUCCESS, PRODUCTS_FAILURE],\n  };\n}\n","import Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport AccountCircleIcon from '@material-ui/icons/AccountCircle';\nimport ExitToAppIcon from '@material-ui/icons/ExitToApp';\nimport PaymentIcon from '@material-ui/icons/Payment';\nimport SettingsIcon from '@material-ui/icons/SettingsSharp';\nimport React from 'react';\nimport {\n  accountPath,\n  billingPath,\n  loginPath,\n  projectsPath,\n} from '../helpers/pathHelpers';\n\nconst styles = theme => ({\n  menu: {\n    '& a': {\n      marginLeft: theme.spacing(1),\n    },\n  },\n  leftMargin: {\n    marginLeft: theme.spacing(1),\n  },\n  rightMargin: {\n    marginRight: theme.spacing(2),\n  },\n  userMenu: {\n    '& .MuiListItemIcon-root': {\n      minWidth: 36,\n    },\n  },\n  topButton: {\n    [theme.breakpoints.down('sm')]: {\n      padding: 3,\n    },\n  },\n});\n\nfunction UserMenu(props) {\n  const {\n    auth,\n    classes,\n    handleClose,\n    handleLinkTo,\n    handleMenu,\n    history,\n    linkTo,\n    location,\n    logout,\n    open,\n    userMenuAnchor,\n  } = props;\n\n  const HiringButton = (\n    <Button\n      variant=\"contained\"\n      color=\"primary\"\n      href=\"/careers\"\n      className={classes.topButton}\n      onClick={linkTo('/careers', history)}\n    >\n      Careers\n    </Button>\n  );\n\n  if (auth.isAuthenticated) {\n    return (\n      <div>\n        {!location.pathname.includes(projectsPath()) && (\n          <Button\n            color=\"inherit\"\n            onClick={() => handleLinkTo(projectsPath(), history)}\n            className={classes.leftMargin}\n          >\n            Projects\n          </Button>\n        )}\n        <IconButton\n          id=\"user-menu-btn\"\n          aria-owns={open ? 'menu-appbar' : null}\n          aria-haspopup=\"true\"\n          onClick={handleMenu}\n          color=\"inherit\"\n        >\n          <AccountCircleIcon />\n        </IconButton>\n        <Menu\n          id=\"menu-appbar\"\n          anchorEl={userMenuAnchor}\n          anchorOrigin={{\n            vertical: 'top',\n            horizontal: 'right',\n          }}\n          transformOrigin={{\n            vertical: 'top',\n            horizontal: 'right',\n          }}\n          open={open}\n          onClose={handleClose}\n          className={classes.userMenu}\n        >\n          <MenuItem\n            id=\"account-settings\"\n            href=\"/account\"\n            onClick={() => handleLinkTo(accountPath(), history)}\n          >\n            <ListItemIcon>\n              <SettingsIcon />\n            </ListItemIcon>\n            <ListItemText primary=\"Account Settings\" />\n          </MenuItem>\n          <MenuItem\n            id=\"billing\"\n            href=\"/billing\"\n            onClick={() => handleLinkTo(billingPath(), history)}\n          >\n            <ListItemIcon>\n              <PaymentIcon />\n            </ListItemIcon>\n            <ListItemText primary=\"Billing\" />\n          </MenuItem>\n          <MenuItem id=\"logout\" href=\"#\" onClick={() => logout(history)}>\n            <ListItemIcon>\n              <ExitToAppIcon />\n            </ListItemIcon>\n            <ListItemText primary=\"Logout\" />\n          </MenuItem>\n        </Menu>\n      </div>\n    );\n  }\n\n  if (auth.isAuthenticated === false) {\n    return (\n      <div className={classes.menu}>\n        <Button\n          variant=\"contained\"\n          color=\"secondary\"\n          className={classes.topButton}\n          href={loginPath()}\n          onClick={linkTo(loginPath(), history)}\n        >\n          Login (v1)\n        </Button>\n        {/* <Button\n          variant=\"contained\"\n          color=\"secondary\"\n          className={classes.topButton}\n          href={signupPath()}\n          onClick={linkTo(signupPath(), history)}\n        >\n          Sign Up\n        </Button> */}\n      </div>\n    );\n  }\n\n  return (\n    <Typography\n      color=\"inherit\"\n      className={\n        location.pathname.includes(projectsPath()) ? classes.rightMargin : null\n      }\n    >\n      Authenticating...\n    </Typography>\n  );\n}\n\nexport default withStyles(styles, {\n  withTheme: true,\n  name: 'App',\n})(UserMenu);\n","import { get, post } from './BaseClient';\n\nexport async function postTicket(ticket) {\n  const response = await post('/api/support_tickets', ticket);\n  return await response.json();\n}\n\nexport async function getTicketTypes() {\n  const response = await get('/api/support_tickets/types');\n  return await response.json();\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n  Button,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogContentText,\n  Grid,\n  Tooltip,\n} from '@material-ui/core';\nimport {\n  CheckCircle as CheckCircleIcon,\n  //   Help as ContactSupportIcon,\n} from '@material-ui/icons';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Field, Form } from 'react-final-form';\nimport { FORM_ERROR } from 'final-form';\nimport { postTicket, getTicketTypes } from '../clients/SupportTicketFormClient';\nimport TextInput from './FormHelpers/TextInput';\nimport { getCurrentUser } from '../actions/SessionActions';\nimport FormActions from './FormActions';\n\nconst styles = theme => ({\n  root: { marginRight: 10, marginLeft: 10 },\n  fab: {\n    position: 'fixed',\n    right: theme.spacing(1),\n    bottom: theme.spacing(1),\n    zIndex: 1000,\n    margin: theme.spacing(1),\n  },\n  ticketKey: {\n    color: theme.palette.primary.main,\n    fontWeight: 'bold',\n  },\n  check: {\n    color: theme.palette.success.main,\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n});\n\nfunction SupportTicketForm({ classes, user, location }) {\n  const [ticketKey, setTicketKey] = useState('');\n  const [ticketTypes, setTicketTypes] = useState([]);\n  const [openDialog, setOpenDialog] = useState(false);\n\n  useEffect(() => {\n    getCurrentUser();\n    getTicketTypes().then(response => {\n      setTicketTypes(\n        response.map(ticketType => ({\n          id: ticketType.id,\n          value: ticketType.name,\n          text: ticketType.name,\n        }))\n      );\n    });\n  }, []);\n\n  const submit = values => {\n    return new Promise(resolve => {\n      postTicket({\n        name: values.name,\n        email: values.email,\n        requestType: 'Bug Report',\n        details: values.feedback,\n      })\n        .then(response => resolve(setTicketKey(response.data.key)))\n        .catch(() =>\n          resolve({\n            [FORM_ERROR]:\n              'We encountered an error while submitting your ticket. Please try again.',\n          })\n        );\n    });\n  };\n\n  const validate = values => {\n    const errors = {};\n    if (!values.email) {\n      errors.email = 'Required';\n    } else if (\n      !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(values.email)\n    ) {\n      errors.email = 'Invalid email address';\n    }\n    if (!values.name) {\n      errors.name = 'Required';\n    }\n    if (!values.feedback) {\n      errors.feedback = 'Required';\n    }\n    return errors;\n  };\n\n  return (\n    <div className={classes.root}>\n      <Tooltip title=\"Give us your feedback and help improve OpenFn.\">\n        <Button\n          id=\"new-product-feedback\"\n          variant=\"contained\"\n          size=\"small\"\n          onClick={() => setOpenDialog(!openDialog)}\n        >\n          Send feedback\n        </Button>\n      </Tooltip>\n      <Dialog\n        open={openDialog}\n        onClose={() => setOpenDialog(false)}\n        maxWidth=\"sm\"\n        aria-labelledby=\"max-width-dialog-title\"\n        fullWidth\n      >\n        <Form\n          onSubmit={submit}\n          validate={validate}\n          render={({\n            handleSubmit,\n            submitError,\n            submitSucceeded,\n            form,\n            values,\n          }) => (\n            <>\n              <DialogContent>\n                {submitSucceeded ? (\n                  <>\n                    <CheckCircleIcon className={classes.check} />\n                    <DialogContentText>\n                      Thank you for your help!\n                    </DialogContentText>\n                  </>\n                ) : (\n                  <div>\n                    <DialogContentText>\n                      Submit your feedback to help improve OpenFn.\n                    </DialogContentText>\n                    <form onSubmit={handleSubmit} id=\"product-feedback-form\">\n                      <Grid container>\n                        <Grid item xs={12} md={6}>\n                          <Field\n                            name=\"name\"\n                            label=\"Name\"\n                            component={TextInput}\n                            type=\"text\"\n                            placeholder=\"Your name\"\n                            disabled={user && values.name}\n                            defaultValue={\n                              user ? `${user.firstName} ${user.lastName}` : ''\n                            }\n                          />\n                        </Grid>\n                        <Grid item xs={12} md={6}>\n                          <Field\n                            name=\"email\"\n                            label=\"Email\"\n                            component={TextInput}\n                            type=\"text\"\n                            placeholder=\"Your email address\"\n                            disabled={user && values.name}\n                            defaultValue={user?.email || ''}\n                          />\n                        </Grid>\n                      </Grid>\n                      <Field\n                        name=\"page\"\n                        label=\"Page\"\n                        component={TextInput}\n                        type=\"text\"\n                        defaultValue={location.pathname || ''}\n                        placeholder=\"Tell us which page you're submitting feedback for\"\n                        fullWidth\n                      />\n                      <br />\n                      <Field\n                        name=\"feedback\"\n                        label=\"Product feedback\"\n                        component={TextInput}\n                        multiline\n                        rows={4}\n                        variant=\"outlined\"\n                        placeholder=\"Please provide as much detail as possible. What's frustrating you ? What are you trying to achieve ?\"\n                        fullWidth\n                      />\n                    </form>\n                    {submitError && (\n                      <div className={classes.error}>{submitError}</div>\n                    )}\n                  </div>\n                )}\n              </DialogContent>\n              <DialogActions>\n                {submitSucceeded ? (\n                  <Button onClick={() => setOpenDialog(false)}>Close</Button>\n                ) : (\n                  <FormActions\n                    cancel={() => setOpenDialog(false)}\n                    // reset={form.reset}\n                    submit={handleSubmit}\n                    form={form}\n                    submitText=\"Submit\"\n                  />\n                )}\n              </DialogActions>\n            </>\n          )}\n        />\n      </Dialog>\n    </div>\n  );\n}\n\nexport default withStyles(styles, { withTheme: true })(SupportTicketForm);\n","import React, { useState, useEffect } from 'react';\nimport {\n  Button,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogContentText,\n  DialogTitle,\n  Fab,\n  Grid,\n  Tooltip,\n} from '@material-ui/core';\nimport {\n  CheckCircle as CheckCircleIcon,\n  Help as ContactSupportIcon,\n} from '@material-ui/icons';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Field, Form } from 'react-final-form';\nimport { FORM_ERROR } from 'final-form';\nimport { postTicket, getTicketTypes } from '../clients/SupportTicketFormClient';\nimport TextInput from './FormHelpers/TextInput';\nimport SelectInput from './FormHelpers/SelectInput';\nimport { getCurrentUser } from '../actions/SessionActions';\nimport FormActions from './FormActions';\nimport Link from './Link';\n\nconst styles = theme => ({\n  fab: {\n    position: 'fixed',\n    right: theme.spacing(1),\n    bottom: theme.spacing(1),\n    zIndex: 1000,\n    margin: theme.spacing(1),\n  },\n  ticketKey: {\n    color: theme.palette.primary.main,\n    fontWeight: 'bold',\n  },\n  check: {\n    color: theme.palette.success.main,\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n});\n\nfunction SupportTicketForm({ classes, user }) {\n  const [ticketKey, setTicketKey] = useState('');\n  const [ticketTypes, setTicketTypes] = useState([]);\n  const [openDialog, setOpenDialog] = useState(false);\n\n  useEffect(() => {\n    getCurrentUser();\n    getTicketTypes().then(response => {\n      setTicketTypes(\n        response.map(ticketType => ({\n          id: ticketType.id,\n          value: ticketType.name,\n          text: ticketType.name,\n        }))\n      );\n    });\n  }, []);\n\n  const submit = values => {\n    return new Promise(resolve => {\n      postTicket({\n        name: values.name,\n        email: values.email,\n        requestType: values.requestType,\n        details: values.details,\n      })\n        .then(response => resolve(setTicketKey(response.data.key)))\n        .catch(() =>\n          resolve({\n            [FORM_ERROR]:\n              'We encountered an error while submitting your ticket. Please try again.',\n          })\n        );\n    });\n  };\n\n  const validate = values => {\n    const errors = {};\n    if (!values.email) {\n      errors.email = 'Required';\n    } else if (\n      !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(values.email)\n    ) {\n      errors.email = 'Invalid email address';\n    }\n    if (!values.name) {\n      errors.name = 'Required';\n    }\n    if (!values.requestType) {\n      errors.requestType = 'Required';\n    }\n    if (!values.details) {\n      errors.details = 'Required';\n    }\n    return errors;\n  };\n\n  return (\n    <div>\n      <Tooltip title=\"Open new support ticket.\">\n        <Fab\n          id=\"new-support-ticket\"\n          className={classes.fab}\n          color=\"primary\"\n          onClick={() => setOpenDialog(!openDialog)}\n        >\n          <ContactSupportIcon />\n        </Fab>\n      </Tooltip>\n      <Dialog\n        open={openDialog}\n        onClose={() => setOpenDialog(false)}\n        maxWidth=\"sm\"\n        aria-labelledby=\"max-width-dialog-title\"\n        fullWidth\n      >\n        <DialogTitle>Get in touch with the team at OpenFn</DialogTitle>\n        <Form\n          onSubmit={submit}\n          validate={validate}\n          render={({\n            handleSubmit,\n            submitError,\n            submitSucceeded,\n            form,\n            values,\n          }) => (\n            <>\n              <DialogContent>\n                {submitSucceeded ? (\n                  <>\n                    <CheckCircleIcon className={classes.check} />\n                    <DialogContentText>\n                      Your ticket has been successfully created. The ticket key\n                      is <span className={classes.ticketKey}>{ticketKey}</span>.\n                    </DialogContentText>\n                  </>\n                ) : (\n                  <div>\n                    <DialogContentText>\n                      For documentation, guides, how-to manuals, etc., check out{' '}\n                      <Link\n                        color=\"primary\"\n                        href=\"https://docs.openfn.org\"\n                        text=\"the docs site\"\n                      />\n                      . For help with general questions or to request new\n                      features, head to{' '}\n                      <Link\n                        color=\"primary\"\n                        href=\"https://community.openfn.org\"\n                        text=\"the forum\"\n                      />\n                      . To arrange a consultation, access direct project\n                      support, or report a bug please open an issue with our\n                      services team by filling out the form below.\n                    </DialogContentText>\n                    <form onSubmit={handleSubmit} id=\"jira-ticket-form\">\n                      <Grid container>\n                        <Grid item xs={12} md={6}>\n                          <Field\n                            name=\"name\"\n                            label=\"Name\"\n                            component={TextInput}\n                            type=\"text\"\n                            placeholder=\"Your name\"\n                            disabled={user && values.name}\n                            defaultValue={\n                              user ? `${user.firstName} ${user.lastName}` : ''\n                            }\n                          />\n                        </Grid>\n                        <Grid item xs={12} md={6}>\n                          <Field\n                            name=\"email\"\n                            label=\"Email\"\n                            component={TextInput}\n                            type=\"text\"\n                            placeholder=\"Your email address\"\n                            disabled={user && values.name}\n                            defaultValue={user?.email || ''}\n                          />\n                        </Grid>\n                      </Grid>\n                      <Field\n                        name=\"requestType\"\n                        label=\"Request Type\"\n                        component={SelectInput}\n                        type=\"select\"\n                        options={ticketTypes}\n                        defaultValue=\"General Inquiry\"\n                        placeholder=\"Select your request type\"\n                        fullWidth\n                      />\n                      <br />\n                      <Field\n                        name=\"details\"\n                        label=\"Request Details\"\n                        component={TextInput}\n                        multiline\n                        rows={4}\n                        variant=\"outlined\"\n                        placeholder=\"Please provide as much detail as possible.\"\n                        fullWidth\n                      />\n                    </form>\n                    {submitError && (\n                      <div className={classes.error}>{submitError}</div>\n                    )}\n                  </div>\n                )}\n              </DialogContent>\n              <DialogActions>\n                {submitSucceeded ? (\n                  <Button onClick={() => setOpenDialog(false)}>Close</Button>\n                ) : (\n                  <FormActions\n                    cancel={() => setOpenDialog(false)}\n                    reset={form.reset}\n                    submit={handleSubmit}\n                    form={form}\n                    submitText=\"Submit\"\n                  />\n                )}\n              </DialogActions>\n            </>\n          )}\n        />\n      </Dialog>\n    </div>\n  );\n}\n\nexport default withStyles(styles, { withTheme: true })(SupportTicketForm);\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport { Grid, IconButton } from '@material-ui/core';\nimport { Close as CloseIcon } from '@material-ui/icons';\nimport { isEqual } from 'lodash';\nimport { joinChannel } from '../actions/ChannelActions';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    position: 'fixed',\n    top: '1em',\n    zIndex: 9999999999999,\n  },\n  link: {\n    cursor: 'pointer',\n    fontWeight: 'bold',\n  },\n}));\n\nfunction BannerAlert({ userId }) {\n  const dispatch = useDispatch();\n  const classes = useStyles();\n  const [alerts, setAlerts] = useState([]);\n\n  const handleRefresh = () => {\n    window.location.reload();\n  };\n\n  useEffect(() => {\n    function handleReceiveAlert(alert) {\n      if (!isEqual(alert, alerts[0])) {\n        setAlerts([...alerts, alert]);\n      }\n    }\n\n    function handleReceiveDirective({ directive }) {\n      switch (directive) {\n        case 'reload':\n          window.location.reload();\n          break;\n\n        default:\n          break;\n      }\n    }\n\n    const leaveAlertsChannel = dispatch(\n      joinChannel(`alerts:${userId}`, {\n        new: handleReceiveAlert,\n        force: handleReceiveDirective,\n      })\n    );\n\n    const leaveAllBrowsersChannel = dispatch(\n      joinChannel(`alerts:all`, {\n        new: handleReceiveAlert,\n        force: handleReceiveDirective,\n      })\n    );\n\n    return () => {\n      leaveAlertsChannel();\n      leaveAllBrowsersChannel();\n    };\n  }, [dispatch, alerts, userId]);\n\n  if (alerts.length > 0) {\n    const { type, contents } = alerts[0];\n    const needsUpgrade = type === 'upgrade';\n\n    const upgradeHtml = (\n      <>\n        There&apos;s a new version of OpenFn. Please save your changes and{' '}\n        <a className={classes.link} onClick={handleRefresh}>\n          refresh\n        </a>{' '}\n        this page when possible.\n      </>\n    );\n\n    return (\n      <Grid container justifyContent=\"center\" className={classes.root}>\n        <Grid item>\n          <Alert\n            severity={needsUpgrade ? 'warning' : type}\n            elevation={4}\n            action={\n              <IconButton\n                aria-label=\"close\"\n                color=\"inherit\"\n                size=\"small\"\n                onClick={() => {\n                  setAlerts(alerts.slice(1));\n                }}\n              >\n                <CloseIcon fontSize=\"inherit\" />\n              </IconButton>\n            }\n          >\n            {needsUpgrade ? upgradeHtml : contents}\n          </Alert>\n        </Grid>\n      </Grid>\n    );\n  }\n\n  return null;\n}\n\nexport default BannerAlert;\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { formatDistanceToNow } from 'date-fns';\nimport {\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogContentText,\n  DialogTitle,\n} from '@material-ui/core';\n\nimport { WarningRounded } from '@material-ui/icons';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Field, Form } from 'react-final-form';\nimport { FORM_ERROR } from 'final-form';\nimport { useDispatch } from 'react-redux';\nimport TextInput from './FormHelpers/TextInput';\nimport { login, sessionExtensionSuccess } from '../actions/SessionActions';\nimport FormActions from './FormActions';\n\nconst styles = theme => ({\n  error: {\n    color: theme.palette.error.main,\n  },\n  warningIcon: {\n    color: theme.palette.warning.main,\n    marginRight: theme.spacing(1),\n  },\n});\n\nconst validate = values => {\n  const errors = {};\n  if (!values.password) {\n    errors.name = 'Required';\n  }\n  return errors;\n};\n\nconst calculateRemainingTime = expiration => expiration - new Date().getTime();\n\nconst SessionExpirationAlert = ({ classes, unixExpiration, email }) => {\n  const threshold = 30 * 60 * 1000;\n  const overrideThreshold = 60 * 1000;\n  const expiration = unixExpiration * 1000;\n\n  const [dismissals, setDismissals] = useState(0);\n  const [urgency, setUrgency] = useState(0);\n\n  useEffect(() => {\n    const interval = setInterval(() => {\n      if (expiration) {\n        const rt = calculateRemainingTime(expiration);\n\n        if (rt < 0) window.location.reload();\n\n        if (rt < overrideThreshold) {\n          setUrgency(2);\n        } else if (rt < threshold) {\n          setUrgency(1);\n        }\n      }\n    }, 5 * 1000 /* every 5 seconds */);\n    return () => clearInterval(interval);\n  }, [expiration, threshold, overrideThreshold]);\n\n  const handleClose = () => {\n    setUrgency(0);\n    setDismissals(dismissals + 1);\n  };\n\n  const dispatch = useDispatch();\n\n  const submit = values => {\n    return new Promise(resolve => {\n      dispatch(login({ email, password: values.password }))\n        .then(() => {\n          setUrgency(0);\n          setDismissals(0);\n          resolve(dispatch(sessionExtensionSuccess(expiration)));\n        })\n        .catch(error => {\n          resolve({ [FORM_ERROR]: error });\n        });\n    });\n  };\n\n  return (\n    <Dialog open={dismissals < urgency} onClose={handleClose}>\n      <DialogTitle>\n        <WarningRounded className={classes.warningIcon} fontSize=\"inherit\" />\n        Your session will expire in {formatDistanceToNow(new Date(expiration))}.\n      </DialogTitle>\n      <Form\n        onSubmit={submit}\n        validate={validate}\n        render={({ handleSubmit, submitError, form }) => (\n          <>\n            <DialogContent>\n              <DialogContentText>\n                For security reasons, you will be redirected to the login page\n                once your session expires. If you are currently filling out a\n                form or working on a job, those unsaved changes will be\n                discarded.\n              </DialogContentText>\n              <DialogContentText>\n                Enter your password and click &quot;Extend Session&quot; to keep\n                this session active.\n              </DialogContentText>\n              <form onSubmit={handleSubmit} id=\"extend-session-form\">\n                <Field\n                  name=\"password\"\n                  label=\"Password\"\n                  component={TextInput}\n                  type=\"password\"\n                  placeholder=\"Type your password\"\n                />\n                {submitError && (\n                  <div className={classes.error}>\n                    Impossible to extend your session. Please check your\n                    password.\n                  </div>\n                )}\n              </form>\n            </DialogContent>\n            <DialogActions>\n              <FormActions\n                cancel={handleClose}\n                reset={form.reset}\n                submit={handleSubmit}\n                form={form}\n                submitText=\"Extend Session\"\n                cancelText=\"Dismiss\"\n              />\n            </DialogActions>\n          </>\n        )}\n      />\n    </Dialog>\n  );\n};\n\nSessionExpirationAlert.propTypes = {\n  email: PropTypes.string.isRequired,\n  unixExpiration: PropTypes.number.isRequired,\n};\n\nexport default React.memo(\n  withStyles(styles, { withTheme: true })(SessionExpirationAlert)\n);\n","import React, { useEffect, useState, useMemo } from 'react';\nimport {\n  AppBar,\n  Divider,\n  Drawer,\n  Hidden,\n  Button,\n  IconButton,\n  Toolbar,\n  Tooltip,\n  Typography,\n  TextField,\n} from '@material-ui/core';\nimport { Autocomplete } from '@material-ui/lab';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport {\n  ChevronLeft as ChevronLeftIcon,\n  Menu as MenuIcon,\n} from '@material-ui/icons';\nimport clsx from 'clsx';\nimport { isEqual, orderBy, values } from 'lodash';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Route, Switch, useHistory, useLocation } from 'react-router-dom';\nimport * as Sentry from '@sentry/react';\nimport PropTypes from 'prop-types';\nimport { formatDistanceToNow } from 'date-fns';\nimport Notifications from '../actions/Notifications';\nimport { fetchProjects } from '../actions/ProjectActions';\nimport { getCurrentUser, logout } from '../actions/SessionActions';\nimport { closeLoader, linkTo, pushTo } from '../helpers';\nimport Images from '../helpers/imagePaths';\nimport {\n  accountPath,\n  activationRequiredPath,\n  billingPath,\n  changeEmailPath,\n  changePasswordPath,\n  credentialRoute,\n  credentialsPath,\n  credentialViewRoute,\n  projectReceiptsPath,\n  projectScopeRoute,\n  projectsPath,\n  signupActivatePath,\n  signupConfirmPath,\n} from '../helpers/pathHelpers';\nimport ActivationPage from './ActivationPage';\nimport {\n  selectAuth,\n  selectCurrentPlan,\n  selectCurrentUser,\n  selectJobs,\n  selectMenuKey,\n  selectNotifications,\n  selectProjects,\n  selectScopedProject,\n  selectUsageCount,\n  selectUsageDetails,\n} from '../selectors';\nimport ActivationModal from './ActivationModal';\nimport ActivationRequired from './ActivationRequired';\nimport AppDrawer from './AppDrawer';\nimport Billing from './Billing';\nimport CredentialsList from './Credentials/CredentialsList';\nimport CredentialView from './Credentials/CredentialView';\nimport { ErrorPresenter } from './ErrorView';\nimport Maintenance from './Maintenance';\nimport PrivateRoute from './PrivateRoute';\nimport ProjectScope from './ProjectScope';\nimport ProjectsList from './ProjectsList';\nimport SignupConfirm from './SignupConfirm';\nimport Snackbar from './Snackbar';\nimport UserChangeEmail from './UserChangeEmail';\nimport UserChangePassword from './UserChangePassword';\nimport UserEdit from './UserEdit';\nimport UserMenu from './UserMenu';\nimport FeedbackButton from './FeedbackButton';\nimport SupportTicketForm from './SupportTicketForm';\nimport { unscopedProject } from '../actions/MenuActions';\nimport BannerAlert from './BannerAlert';\nimport SessionExpirationAlert from './SessionExpirationAlert';\n\nconst drawerWidth = 240;\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    display: 'flex',\n    overflowX: 'hidden',\n    backgroundImage: `url(${Images.bgPattern})`,\n    minHeight: 'calc(100vh)',\n  },\n  appBar: {\n    zIndex: theme.zIndex.drawer + 1,\n    transition: theme.transitions.create(['width', 'margin'], {\n      easing: theme.transitions.easing.sharp,\n      duration: theme.transitions.duration.leavingScreen,\n    }),\n    marginLeft: drawerWidth,\n    paddingRight: theme.spacing(1),\n  },\n  flex: {\n    display: 'flex',\n    flex: 1,\n  },\n  appBarShift: {\n    [theme.breakpoints.up('md')]: {\n      marginLeft: drawerWidth,\n      width: `calc(100% - ${drawerWidth}px)`,\n      transition: theme.transitions.create(['width', 'margin'], {\n        easing: theme.transitions.easing.sharp,\n        duration: theme.transitions.duration.enteringScreen,\n      }),\n    },\n  },\n  hide: {\n    display: 'none',\n  },\n  drawer: {\n    width: drawerWidth,\n    flexShrink: 0,\n    whiteSpace: 'nowrap',\n  },\n  drawerOpen: {\n    width: drawerWidth,\n    transition: theme.transitions.create('width', {\n      easing: theme.transitions.easing.sharp,\n      duration: theme.transitions.duration.enteringScreen,\n    }),\n  },\n  drawerClose: {\n    transition: theme.transitions.create('width', {\n      easing: theme.transitions.easing.sharp,\n      duration: theme.transitions.duration.leavingScreen,\n    }),\n    overflowX: 'hidden',\n    width: theme.spacing(7) + 1,\n  },\n  toolbar: {\n    color: 'white',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'flex-end',\n    padding: theme.spacing(0, 1),\n    // necessary for content to be below app bar\n    ...theme.mixins.toolbar,\n  },\n  content: {\n    flexGrow: 1,\n    marginTop: 48,\n    padding: theme.spacing(3),\n    maxWidth: `calc(100vw - 57px)`,\n    [theme.breakpoints.down('sm')]: {\n      maxWidth: '100%',\n    },\n  },\n  contentWithDrawer: {\n    maxWidth: `calc(100vw - ${drawerWidth}px)`,\n    [theme.breakpoints.down('sm')]: {\n      maxWidth: '100%',\n    },\n  },\n  menuButton: {\n    marginRight: theme.spacing(2),\n  },\n  warning: {\n    backgroundColor: theme.palette.warning.light,\n    color: theme.palette.text.primary,\n  },\n  overLimit: {\n    backgroundColor: theme.palette.error.light,\n    color: theme.palette.text.primary,\n  },\n  picker: {\n    maxWidth: 300,\n  },\n  pickerAdornment: {\n    '& .MuiButtonBase-root': {\n      color: 'white',\n    },\n  },\n  pickerTextField: {\n    '& .MuiInputBase-root': {\n      backgroundColor: 'rgba(255, 255, 255, 0.05)',\n      paddingTop: 4,\n      paddingLeft: 10,\n      fontWeight: 500,\n      fontSize: 14,\n      color: 'white',\n    },\n    marginTop: 8,\n    marginBottom: 8,\n  },\n}));\n\nconst UpgradeWarning = React.memo(\n  ({ overLimit, percentage, haltedMessage }) => (\n    <Typography variant=\"h6\" color=\"inherit\" noWrap style={{ margin: 5 }}>\n      {(overLimit || percentage > 0.8) && (\n        <Tooltip\n          title=\"Upgrade your project or check your payment method to\n        ensure integrations are not interrupted.\"\n        >\n          <code style={{ fontSize: 14, backgroundColor: 'inherit' }}>\n            {overLimit\n              ? haltedMessage\n              : `(Run Limit Warning: ${percentage * 100}%)`}\n          </code>\n        </Tooltip>\n      )}\n    </Typography>\n  )\n);\n\nUpgradeWarning.propTypes = {\n  overLimit: PropTypes.bool.isRequired,\n  percentage: PropTypes.number.isRequired,\n  haltedMessage: PropTypes.string.isRequired,\n};\n\nconst ProjectDeletionWarning = React.memo(({ project }) => (\n  <Typography variant=\"h6\" color=\"inherit\" noWrap style={{ margin: 5 }}>\n    {project.scheduledDeletion && (\n      <Tooltip title=\"This project will soon be deleted. You cancel it's deletion by going to the project settings page.\">\n        <code style={{ fontSize: 14, backgroundColor: 'inherit' }}>\n          This project is scheduled to be deleted within{' '}\n          {formatDistanceToNow(new Date(project.scheduledDeletion))}\n        </code>\n      </Tooltip>\n    )}\n  </Typography>\n));\n\nProjectDeletionWarning.propTypes = {\n  project: PropTypes.object.isRequired,\n};\n\nfunction AppFrame() {\n  const theme = useTheme();\n\n  const classes = useStyles();\n\n  const [drawerOpen, setDrawerOpen] = useState(true);\n  const [drawerPermanent, setDrawerPermanent] = useState(true);\n  const [mobileOpen, setMobileOpen] = useState(false);\n  const [showActivationModal, setShowActivationModal] = useState(false);\n  const [userMenuAnchor, setUserMenuAnchor] = useState(null);\n\n  const dismissNotification = Notifications.dismiss;\n  const dispatch = useDispatch();\n  const history = useHistory();\n  const location = useLocation();\n  const allProjects = useSelector(selectProjects, isEqual);\n  const projects = orderBy(values(allProjects), [p => p.name.toLowerCase()]);\n  const scopedProject = useSelector(selectScopedProject);\n  const selectedProject = allProjects[scopedProject] ?? {};\n\n  const usageCount = useSelector(\n    state => selectUsageCount(state, selectedProject.id) ?? {},\n    isEqual\n  );\n\n  const currentPlan = useSelector(\n    state => selectCurrentPlan(state, selectedProject.planId) ?? {},\n    isEqual\n  );\n\n  const jobs = useSelector(state => selectJobs(state) ?? [], isEqual);\n\n  const usageDetails = useMemo(\n    () => selectUsageDetails(usageCount, currentPlan, jobs),\n    [usageCount, currentPlan, jobs]\n  );\n\n  const auth = useSelector(selectAuth, isEqual);\n  const notifications = useSelector(selectNotifications, isEqual);\n  const firstNotification = useMemo(\n    () => values(notifications)[0] || {},\n    [notifications]\n  );\n  const selectedMenuKey = useSelector(selectMenuKey);\n  const user = useSelector(selectCurrentUser, isEqual);\n  const userConfirmation = useMemo(() => user?.confirmedAt, [user]);\n  const open = Boolean(userMenuAnchor);\n\n  const overLimit =\n    usageDetails.runsInPeriod >= usageDetails.runLimit ||\n    new Date(selectedProject.billingPeriodEnd).getTime() < Date.now();\n\n  const percentage =\n    usageDetails.runLimit > 0 &&\n    (usageDetails.runsInPeriod / usageDetails.runLimit).toFixed(2);\n\n  const haltedMessage = usageDetails.projectId\n    ? '(Run Limit Exceeded!)'\n    : '(Billing Failed!)';\n\n  const FullDrawer = (\n    <AppDrawer\n      currentPlan={currentPlan}\n      drawerOpen={drawerOpen}\n      overLimit={overLimit}\n      selectedMenuKey={selectedMenuKey}\n      selectedProject={selectedProject}\n      usageWarning={percentage > 0.8}\n    />\n  );\n\n  const handleDrawerOpen = bool => {\n    setDrawerOpen(bool);\n    setDrawerPermanent(bool);\n  };\n\n  const pickProject = project => {\n    dispatch(unscopedProject());\n    pushTo(projectReceiptsPath(project), history);\n  };\n\n  const handleLinkTo = (path, hist) => {\n    setUserMenuAnchor(null);\n    pushTo(path, hist);\n  };\n\n  useEffect(() => {\n    closeLoader();\n    if (window.gtag) window.gtag('set', 'content_group', 'platform-app');\n    dispatch(getCurrentUser());\n  }, [dispatch]);\n\n  useEffect(() => {\n    if (auth.isAuthenticated && !!user) {\n      dispatch(fetchProjects());\n    }\n  }, [auth.isAuthenticated, user, dispatch]);\n\n  useEffect(() => {\n    if (\n      ![\n        accountPath(),\n        signupActivatePath(),\n        activationRequiredPath(),\n        signupConfirmPath(),\n      ].includes(location.pathname)\n    ) {\n      if (user) {\n        setShowActivationModal(!user.confirmedAt);\n      }\n    }\n  }, [userConfirmation, location.pathname, user]);\n\n  useEffect(() => {\n    if (\n      ![\n        accountPath(),\n        signupActivatePath(),\n        activationRequiredPath(),\n        signupConfirmPath(),\n      ].includes(location.pathname)\n    ) {\n      if (auth.requiresActivation) {\n        history.push(activationRequiredPath());\n      }\n    }\n  }, [auth.requiresActivation, location.pathname, history]);\n\n  useEffect(() => {\n    if (mobileOpen) {\n      setMobileOpen(false);\n    }\n  }, [location.pathname, mobileOpen]);\n\n  if (window.SOFT_MAINTENANCE) {\n    return <Maintenance />;\n  }\n\n  return (\n    <div className={classes.root}>\n      <BannerAlert userId={user?.id} />\n      <AppBar\n        elevation={location.pathname.includes('studio') ? 0 : 4}\n        position=\"fixed\"\n        className={clsx(\n          classes.appBar,\n          {\n            [classes.appBarShift]: drawerOpen,\n          },\n          percentage > 0.8 && !overLimit && classes.warning,\n          selectedProject.scheduledDeletion && classes.overLimit,\n          overLimit && classes.overLimit\n        )}\n      >\n        <Toolbar>\n          <Hidden smDown>\n            <IconButton\n              color=\"inherit\"\n              id=\"open-drawer\"\n              aria-label=\"open drawer\"\n              onClick={() => handleDrawerOpen(true)}\n              edge=\"start\"\n              className={clsx(classes.menuButton, {\n                [classes.hide]: drawerOpen,\n              })}\n            >\n              <MenuIcon />\n            </IconButton>\n          </Hidden>\n          <Hidden mdUp>\n            <IconButton\n              color=\"inherit\"\n              id=\"toggle-drawer\"\n              aria-label=\"open drawer\"\n              onClick={() => setMobileOpen(!mobileOpen)}\n              className={classes.menuButton}\n            >\n              <MenuIcon />\n            </IconButton>\n          </Hidden>\n          <div className={classes.flex}>\n            <Autocomplete\n              id=\"project-picker-combo\"\n              options={projects}\n              noOptionsText=\"No projects found\"\n              disableClearable\n              getOptionLabel={option => option.name ?? ''}\n              getOptionSelected={(option, value) =>\n                option.value === value.value\n              }\n              autoHighlight\n              onChange={(e, project) => {\n                if (project) pickProject(project);\n              }}\n              size=\"small\"\n              blurOnSelect\n              classes={{\n                root: classes.picker,\n                endAdornment: classes.pickerAdornment,\n              }}\n              fullWidth\n              value={selectedProject}\n              renderInput={params => (\n                <TextField\n                  {...params}\n                  margin=\"normal\"\n                  placeholder=\"Go to project by name\"\n                  InputProps={{\n                    autoComplete: 'off',\n                    disableUnderline: true,\n                    ...params.InputProps,\n                  }}\n                  className={classes.pickerTextField}\n                />\n              )}\n            />\n            <UpgradeWarning\n              overLimit={overLimit}\n              percentage={percentage}\n              haltedMessage={haltedMessage}\n            />\n            <ProjectDeletionWarning project={selectedProject} />\n          </div>\n          <FeedbackButton user={user} auth={auth} location={location} />\n          <div />\n          <UserMenu\n            auth={auth}\n            linkTo={linkTo}\n            user={user}\n            open={open}\n            userMenuAnchor={userMenuAnchor}\n            handleClose={() => setUserMenuAnchor(null)}\n            handleMenu={e => setUserMenuAnchor(e.currentTarget)}\n            handleLinkTo={handleLinkTo}\n            logout={args => dispatch(logout(args))}\n            location={location}\n            history={history}\n          />\n        </Toolbar>\n        <SessionExpirationAlert\n          unixExpiration={auth.expiration}\n          email={user?.email}\n        />\n      </AppBar>\n      <Hidden smDown>\n        <Tooltip\n          title=\"\"\n          enterDelay={600}\n          onOpen={drawerPermanent ? null : () => setDrawerOpen(true)}\n          leaveDelay={150}\n          onClose={\n            drawerPermanent\n              ? null\n              : () => {\n                  if (!drawerPermanent) {\n                    setDrawerOpen(false);\n                  }\n                }\n          }\n        >\n          <Drawer\n            variant=\"permanent\"\n            className={clsx(classes.drawer, {\n              [classes.drawerOpen]: drawerOpen,\n              [classes.drawerClose]: !drawerOpen,\n            })}\n            classes={{\n              paper: clsx({\n                [classes.drawerOpen]: drawerOpen,\n                [classes.drawerClose]: !drawerOpen,\n              }),\n            }}\n          >\n            <div className={classes.toolbar}>\n              <Typography variant=\"subtitle1\">OpenFn&nbsp;</Typography>\n              <IconButton\n                onClick={() => handleDrawerOpen(false)}\n                color=\"inherit\"\n              >\n                <ChevronLeftIcon />\n              </IconButton>\n            </div>\n            <Divider />\n            {FullDrawer}\n          </Drawer>\n        </Tooltip>\n      </Hidden>\n      <Drawer\n        variant=\"temporary\"\n        className={classes.drawer}\n        anchor={theme.direction === 'rtl' ? 'right' : 'left'}\n        open={mobileOpen}\n        onClose={() => setMobileOpen(!mobileOpen)}\n        classes={{\n          paper: classes.drawerPaper,\n        }}\n        ModalProps={{\n          keepMounted: true,\n        }}\n      >\n        {FullDrawer}\n      </Drawer>\n      <ActivationModal\n        open={showActivationModal}\n        onClose={() => setShowActivationModal(false)}\n        history={history}\n      />\n      {window.JIRA_SUPPORT && (\n        <SupportTicketForm\n          selectedProject={selectedProject}\n          user={user}\n          auth={auth}\n        />\n      )}\n      <main\n        className={clsx(\n          classes.content,\n          drawerOpen && classes.contentWithDrawer\n        )}\n      >\n        <Sentry.ErrorBoundary\n          fallback={({ error, resetError }) => (\n            <ErrorPresenter\n              error={error}\n              history={history}\n              resetErrorHandler={resetError}\n              showReportDialog={Sentry.showReportDialog}\n            />\n          )}\n        >\n          <Switch>\n            <Route\n              exact\n              path={signupActivatePath()}\n              component={ActivationPage}\n            />\n            <Route exact path={signupConfirmPath()} component={SignupConfirm} />\n            <PrivateRoute exact path={activationRequiredPath()}>\n              <ActivationRequired />\n            </PrivateRoute>\n            <PrivateRoute exact path={projectsPath()}>\n              <ProjectsList />\n            </PrivateRoute>\n            <PrivateRoute exact path={accountPath()}>\n              <UserEdit />\n            </PrivateRoute>\n            <PrivateRoute exact path={changePasswordPath()}>\n              <UserChangePassword />\n            </PrivateRoute>\n            <PrivateRoute exact path={changeEmailPath()}>\n              <UserChangeEmail />\n            </PrivateRoute>\n            <PrivateRoute exact path={billingPath()}>\n              <Billing />\n            </PrivateRoute>\n\n            <PrivateRoute exact path={credentialsPath()}>\n              <CredentialsList />\n            </PrivateRoute>\n            <PrivateRoute exact path={credentialRoute()}>\n              <CredentialView />\n            </PrivateRoute>\n            <PrivateRoute exact path={credentialViewRoute()}>\n              <CredentialView />\n            </PrivateRoute>\n            <PrivateRoute path={projectScopeRoute()}>\n              <ProjectScope />\n            </PrivateRoute>\n          </Switch>\n        </Sentry.ErrorBoundary>\n      </main>\n\n      <Snackbar\n        notification={firstNotification}\n        onClose={() => dispatch(dismissNotification(firstNotification))}\n        onClick={() => dispatch(dismissNotification(firstNotification))}\n      />\n    </div>\n  );\n}\n\nexport default AppFrame;\n","import { Grid, Typography } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n  Book as BookIcon,\n  Facebook as FacebookIcon,\n  LinkedIn as LinkedInIcon,\n  RssFeed as RssFeedIcon,\n  Twitter as TwitterIcon,\n  YouTube as YouTubeIcon,\n} from '@material-ui/icons';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport Link from '../components/Link';\nimport { clickEvent } from '../helpers';\nimport Feature from './Feature';\nimport Images from '../helpers/imagePaths';\n\nconst styles = theme => ({\n  category: {\n    paddingTop: theme.spacing(4),\n  },\n  list: {\n    margin: 0,\n    paddingLeft: 0,\n    listStyle: 'none',\n  },\n  listItem: {\n    paddingTop: theme.spacing(0.5),\n    paddingBottom: theme.spacing(0.5),\n  },\n  logo: {\n    width: 40,\n    marginBottom: theme.spacing(1),\n  },\n});\n\nfunction Footer(props) {\n  const { linkTo, classes, history } = props;\n\n  return (\n    <Feature gray>\n      <Grid container justifyContent=\"space-between\">\n        <Grid item sm={6} xs={12} className={classes.category}>\n          <img\n            src={Images.sqLogoGradient}\n            alt=\"OpenFn\"\n            className={classes.logo}\n          />\n          <Typography variant=\"h6\" gutterBottom>\n            Open Function Group, a public benefit corporation\n          </Typography>\n          <Typography variant=\"subtitle1\" component=\"div\">\n            <ul className={classes.list}>\n              <li>\n                <Link href=\"https://www.openfn.org\" text=\"OpenFn.org\" />\n              </li>\n              <li>\n                <Link href=\"https://docs.openfn.org/\" text=\"Documentation\" />\n              </li>\n              <li>\n                <Link href=\"https://community.openfn.org\" text=\"Community\" />\n              </li>\n              <li>\n                <Link\n                  href=\"https://github.com/OpenFn\"\n                  text=\"Source Code\"\n                  icon={<i className=\"fab fa-github\" />}\n                />\n              </li>\n            </ul>\n          </Typography>\n        </Grid>\n      </Grid>\n    </Feature>\n  );\n}\n\nFooter.propTypes = {\n  linkTo: PropTypes.func.isRequired,\n  classes: PropTypes.object.isRequired,\n  history: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles, {\n  withTheme: true,\n  name: 'App',\n})(Footer);\n","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n  Grid,\n  Paper,\n  List,\n  ListItem,\n  ListItemText,\n  ListItemIcon,\n  Divider,\n  ListSubheader,\n  Drawer,\n} from '@material-ui/core';\nimport {\n  Security,\n  AccountBalance,\n  Business,\n  Explore,\n  CloudQueue,\n  AssignmentTurnedIn,\n} from '@material-ui/icons';\nimport ChromeReaderModeIcon from '@material-ui/icons/ChromeReaderMode';\nimport ForumIcon from '@material-ui/icons/Forum';\nimport ViewCarouselIcon from '@material-ui/icons/ViewCarousel';\nimport CodeIcon from '@material-ui/icons/Code';\nimport PeopleIcon from '@material-ui/icons/People';\nimport NavigationIcon from '@material-ui/icons/Navigation';\nimport InsertChartIcon from '@material-ui/icons/InsertChart';\nimport RssFeedIcon from '@material-ui/icons/RssFeed';\nimport PaymentIcon from '@material-ui/icons/Payment';\nimport ClientsIcon from '@material-ui/icons/SupervisedUserCircle';\nimport AppsIcon from '@material-ui/icons/Apps';\nimport { linkTo } from '../helpers';\n\nconst styles = theme => ({\n  bigMenu: {\n    borderRadius: '0 !important',\n    backgroundColor: 'inherit',\n    color: theme.palette.grey[800],\n  },\n  white: {\n    backgroundColor: 'white !important',\n  },\n  normal: {\n    borderTop: `2px solid ${theme.palette.offWhite}`,\n    marginTop: -2,\n  },\n  darken: {\n    backgroundColor: `${theme.palette.offWhite} !important`,\n    borderTop: `2px solid ${theme.palette.primary.main}`,\n    marginTop: -2,\n  },\n  vertDivider: {\n    backgroundColor: `${theme.palette.offWhite} !important`,\n  },\n  subMenuList: {\n    padding: 0,\n  },\n});\n\nfunction BigMenu(props) {\n  const { classes, subMenu, type, drawer, onClose } = props;\n  const { darken, white, normal, vertDivider } = classes;\n\n  function sideLinkGenerator(text, icon, onClick) {\n    return (\n      <ListItem key={text} button onClick={onClick}>\n        {icon && <ListItemIcon>{icon}</ListItemIcon>}\n        <ListItemText primary={text} />\n      </ListItem>\n    );\n  }\n\n  function subLinkGenerator(text, icon, onClick) {\n    return (\n      <ListItem key={text} button onClick={onClick}>\n        {icon && (\n          <ListItemIcon style={{ color: 'inherit' }} fontSize=\"inherit\">\n            {icon}\n          </ListItemIcon>\n        )}\n        <ListItemText\n          primary={text}\n          primaryTypographyProps={{ color: 'inherit' }}\n        />\n      </ListItem>\n    );\n  }\n\n  function linkGenerator([text, icon, onClick]) {\n    if (type === 'vertical') {\n      return sideLinkGenerator(text, icon, onClick);\n    }\n    return subLinkGenerator(text, icon, onClick);\n  }\n\n  const history = useHistory();\n\n  const links = {\n    how: ['How it works', <CloudQueue />, linkTo('/how', history)],\n    why: ['Why OpenFn?', <AssignmentTurnedIn />, linkTo('/why', history)],\n    trust: ['Security', <Security />, linkTo('/trust', history)],\n    compliance: [\n      'Compliance',\n      <AccountBalance />,\n      linkTo('/compliance', history),\n    ],\n    apps: ['Apps & Adaptors', <AppsIcon />, linkTo('/apps', history)],\n    success: [\n      'Solution Overviews',\n      <ViewCarouselIcon />,\n      linkTo('/solutions', history),\n    ],\n    clients: ['Clients', <ClientsIcon />, linkTo('/clients', history)],\n    pricing: ['Pricing', <PaymentIcon />, linkTo('/pricing', history)],\n    docs: [\n      'Documentation',\n      <ChromeReaderModeIcon />,\n      () => window.open('https://docs.openfn.org/', '_blank'),\n    ],\n    community: [\n      'Community Forum',\n      <ForumIcon />,\n      () => window.open('https://community.openfn.org', '_blank'),\n    ],\n    github: [\n      'Github',\n      <CodeIcon />,\n      () => window.open('https://github.com/OpenFn', '_blank'),\n    ],\n    status: [\n      'Live Status',\n      <InsertChartIcon />,\n      () => window.open('https://status.openfn.org', '_blank'),\n    ],\n    blog: [\n      'The OpenFn Blog',\n      <RssFeedIcon />,\n      () => window.open('https://docs.openfn.org/blog', '_blank'),\n    ],\n    about: ['Open Function Group', <Business />, linkTo('/about', history)],\n    partners: [\n      'Our Partners',\n      <NavigationIcon />,\n      linkTo('/partners', history),\n    ],\n    team: ['Our Team', <PeopleIcon />, linkTo('/team', history)],\n    mission: ['Our Mission', <Explore />, linkTo('/mission', history)],\n  };\n\n  const g1 = ['how', 'why', 'trust', 'compliance'];\n  const g2 = ['about', 'success', 'clients', 'apps'];\n  const g3 = ['docs', 'community', 'github', 'status'];\n  const g4 = ['team', 'blog', 'mission', 'partners'];\n\n  if (type === 'vertical') {\n    return (\n      <Drawer open={drawer} onClose={onClose}>\n        <List\n          className={white}\n          subheader={<ListSubheader>Platform</ListSubheader>}\n        >\n          {g1.map(i => linkGenerator(links[i]))}\n        </List>\n        <Divider className={vertDivider} />\n        <List\n          className={white}\n          subheader={<ListSubheader>Solutions</ListSubheader>}\n        >\n          {g2.map(i => linkGenerator(links[i]))}\n        </List>\n        <Divider className={vertDivider} />\n        <List className={white}>{linkGenerator(links.pricing)}</List>\n        <Divider className={vertDivider} />\n        <List className={white} subheader={<ListSubheader>Help</ListSubheader>}>\n          {g3.map(i => linkGenerator(links[i]))}\n        </List>\n        <Divider className={vertDivider} />\n        <List\n          className={white}\n          subheader={<ListSubheader>About</ListSubheader>}\n        >\n          {g4.map(i => linkGenerator(links[i]))}\n        </List>\n      </Drawer>\n    );\n  }\n\n  return (\n    <Paper className={classes.bigMenu}>\n      <Grid container className={classes.subMenuList}>\n        <Grid md item className={subMenu === 'platform' ? darken : normal}>\n          <List className={classes.subMenuList}>\n            {g1.map(i => linkGenerator(links[i]))}\n          </List>\n        </Grid>\n        <Grid md item className={subMenu === 'solutions' ? darken : normal}>\n          <List className={classes.subMenuList}>\n            {g2.map(i => linkGenerator(links[i]))}\n          </List>\n        </Grid>\n        <Grid md item className={subMenu === 'help' ? darken : normal}>\n          <List className={classes.subMenuList}>\n            {g3.map(i => linkGenerator(links[i]))}\n          </List>\n        </Grid>\n        <Grid md item className={subMenu === 'about' ? darken : normal}>\n          <List className={classes.subMenuList}>\n            {g4.map(i => linkGenerator(links[i]))}\n          </List>\n        </Grid>\n      </Grid>\n    </Paper>\n  );\n}\n\nBigMenu.propTypes = {\n  classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles, {\n  withTheme: true,\n  name: 'App',\n})(BigMenu);\n","import { useEffect } from 'react';\nimport { withRouter } from 'react-router-dom';\n\nconst ScrollToTop = ({ children, location: { pathname } }) => {\n  useEffect(() => {\n    window.scrollTo(0, 0);\n  }, [pathname]);\n\n  return children || null;\n};\n\nexport default withRouter(ScrollToTop);\n","import React from 'react';\nimport Particles from 'react-particles-js';\n\nexport default function Dots() {\n  const params = {\n    particles: {\n      number: {\n        value: 60,\n        density: {\n          enable: true,\n          value_area: 800,\n        },\n      },\n      color: {\n        value: '#ffffff',\n      },\n      shape: {\n        type: 'circle',\n        stroke: {\n          width: 0,\n          color: '#000000',\n        },\n        polygon: {\n          nb_sides: 5,\n        },\n        image: {\n          src: 'img/github.svg',\n          width: 100,\n          height: 100,\n        },\n      },\n      opacity: {\n        value: 0.5,\n        random: false,\n        anim: {\n          enable: false,\n          speed: 1,\n          opacity_min: 0.1,\n          sync: false,\n        },\n      },\n      size: {\n        value: 3,\n        random: true,\n        anim: {\n          enable: false,\n          speed: 40,\n          size_min: 0.1,\n          sync: false,\n        },\n      },\n      line_linked: {\n        enable: true,\n        distance: 150,\n        color: '#ffffff',\n        opacity: 0.4,\n        width: 1,\n      },\n      move: {\n        enable: true,\n        speed: 1.5,\n        direction: 'none',\n        random: false,\n        straight: false,\n        out_mode: 'out',\n        bounce: false,\n        attract: {\n          enable: false,\n          rotateX: 600,\n          rotateY: 1200,\n        },\n      },\n    },\n    interactivity: {\n      detect_on: 'canvas',\n      events: {\n        onhover: {\n          enable: true,\n          mode: 'grab',\n        },\n        onclick: {\n          enable: true,\n          mode: 'push',\n        },\n        resize: true,\n      },\n      modes: {\n        grab: {\n          distance: 200,\n          line_linked: {\n            opacity: 1,\n          },\n        },\n        bubble: {\n          distance: 400,\n          size: 40,\n          duration: 2,\n          opacity: 8,\n          speed: 3,\n        },\n        repulse: {\n          distance: 200,\n          duration: 0.4,\n        },\n        push: {\n          particles_nb: 4,\n        },\n        remove: {\n          particles_nb: 2,\n        },\n      },\n    },\n    retina_detect: true,\n  };\n\n  const style = {\n    position: 'absolute',\n    left: 0,\n    right: 0,\n    top: 0,\n    bottom: 0,\n    zIndex: -1,\n  };\n\n  const isIE = /*@cc_on!@*/ false || !!document.documentMode;\n\n  if (isIE) {\n    return <div />;\n  }\n  return <Particles params={params} style={style} />;\n}\n","import React from 'react';\nimport { Container } from '@material-ui/core';\nimport Paper from '@material-ui/core/Paper';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Particles from './Particles';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    position: 'relative',\n    background: theme.palette.banner.left,\n    /* fallback for old browsers */\n    background: `-webkit-linear-gradient(to left, ${theme.palette.banner.right}, ${theme.palette.banner.left})`,\n    /* Chrome 10-25, Safari 5.1-6 */\n    background: `linear-gradient(to left, ${theme.palette.banner.right}, ${theme.palette.banner.left})`,\n    backgroundImage: `linear-gradient(to left, ${theme.palette.banner.right}, ${theme.palette.banner.left})`,\n    boxShadow: '0 5px 10px rgba(0,0,0,0.19), 0 3px 3px rgba(0,0,0,0.23)',\n    borderRadius: 0,\n    paddingBottom: theme.spacing(8),\n    paddingTop: theme.spacing(8),\n    paddingLeft: theme.spacing(1),\n    paddingRight: theme.spacing(1),\n    textAlign: 'center',\n    zIndex: 0,\n  },\n  main: {\n    zIndex: 1,\n  },\n  title: {\n    color: theme.palette.grey['50'],\n    paddingBottom: theme.spacing(2),\n  },\n  subtitle: {\n    paddingTop: theme.spacing(2),\n    color: theme.palette.grey['50'],\n  },\n  more: {\n    paddingTop: theme.spacing(4),\n    color: theme.palette.grey['50'],\n  },\n  logo: {\n    maxWidth: '100%',\n    maxHeight: '200px',\n  },\n}));\n\nfunction Banner(props) {\n  const { children, title, subtitle, logo, more, id } = props;\n  const classes = useStyles();\n  const handleImageLoaded = () => {\n    try {\n      window.dispatchEvent(new Event('resize'));\n    } catch {\n      const resizeEvent = window.document.createEvent('UIEvents');\n      resizeEvent.initUIEvent('resize', true, false, window, 0);\n      window.dispatchEvent(resizeEvent);\n    }\n  };\n\n  return (\n    <Paper className={classes.root} id={id}>\n      {logo && (\n        <img\n          src={logo}\n          alt=\"OpenFn\"\n          onLoad={handleImageLoaded}\n          className={classes.logo}\n        />\n      )}\n      {title && (\n        <Typography variant=\"h2\" className={classes.title}>\n          {title}\n        </Typography>\n      )}\n      <Container className={classes.main}>\n        {subtitle && (\n          <Typography variant=\"h4\" className={classes.subtitle}>\n            <small>{subtitle}</small>\n          </Typography>\n        )}\n        {more && (\n          <Typography variant=\"h6\" className={classes.more}>\n            {more}\n          </Typography>\n        )}\n        {children}\n      </Container>\n      <Particles />\n    </Paper>\n  );\n}\n\nexport default React.memo(Banner);\n","import { camelizeKeys } from 'humps';\nimport {\n  BLOG_POSTS_FAILURE,\n  BLOG_POSTS_REQUEST,\n  BLOG_POSTS_SUCCESS,\n} from '../constants';\nimport { getBlogPostsPath } from '../helpers/actionsPathHelpers';\nimport { get } from '../clients/BaseClient';\n\nexport function getBlogPosts(roots) {\n  return get(getBlogPostsPath(), { roots })\n    .then(async response => {\n      return camelizeKeys(await response.json());\n    })\n    .catch(error => {\n      return Promise.reject(error);\n    });\n}\n\nexport function fetchBlogPosts(roots) {\n  return {\n    promise: getBlogPosts(roots),\n    types: [BLOG_POSTS_REQUEST, BLOG_POSTS_SUCCESS, BLOG_POSTS_FAILURE],\n  };\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Grid,\n  Typography,\n} from '@material-ui/core';\nimport { clickEvent, formatTime } from '../helpers';\n\nfunction BlogItem({ post }) {\n  return (\n    <Grid item xs={12} sm={6} md={4}>\n      <Card id={post.title}>\n        <CardHeader\n          title={<b>{post.title}</b>}\n          subheader={formatTime(post.pubDate, 'MMMM do, yyyy')}\n        />\n        <CardContent>\n          <Typography>{post.description}...</Typography>\n        </CardContent>\n        <CardActions>\n          <Button\n            color=\"primary\"\n            href={post.link}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() => clickEvent('Docs', 'Browse', post.title)}\n          >\n            Click here to read on\n          </Button>\n        </CardActions>\n      </Card>\n    </Grid>\n  );\n}\n\nBlogItem.propTypes = { post: PropTypes.object.isRequired };\n\nexport default BlogItem;\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Typography, Grid } from '@material-ui/core';\nimport { isEqual } from 'lodash';\nimport Banner from './Banner';\nimport Feature from './Feature';\nimport { clickEvent } from '../helpers';\nimport { fetchBlogPosts } from '../actions/BlogActions';\nimport BlogItem from './BlogItem';\nimport Loader from '../components/Loader';\n\nconst useStyles = makeStyles(theme => ({\n  media: {\n    height: 300,\n  },\n  chips: {\n    padding: theme.spacing(1),\n    textAlign: 'center',\n    marginBottom: -theme.spacing(1),\n  },\n  chip: {\n    margin: theme.spacing(0.5),\n  },\n}));\n\nfunction Blog() {\n  const classes = useStyles();\n\n  const dispatch = useDispatch();\n\n  const blogPosts = useSelector(state => state.blogPosts.items || [], isEqual)\n    .map(p => ({\n      ...p,\n      pubDate: new Date(p.pubDate),\n    }))\n    .sort((a, b) => b.pubDate - a.pubDate);\n\n  const loading = useSelector(state => state.blogPosts.isLoading);\n\n  useEffect(() => {\n    document.title = 'Blog - OpenFn';\n    // dispatch(fetchBlogPosts(['blog']));\n  }, [dispatch]);\n\n  return (\n    <div>\n      <Banner title=\"The OpenFn Blog\" />\n      <Feature intro=\"We help to scale the world's most innovative social impact interventions.\">\n        <Typography>\n          Open Function Group helps scale high-impact social sector\n          interventions via data integration, automation, and agile,\n          interoperable, enterprise-grade systems design. We care deeply about\n          what we do and we share case studies, in depth interviews with our\n          customers, and learnings that we&apos;ve extracted from dozens upon\n          dozens of live, at-scale, automation and data integration projects\n          around the social sector on our blogs.\n        </Typography>\n        <br />\n        <br />\n        <Typography>\n          Check us out on{' '}\n          <a\n            href=\"https://docs.openfn.org/blog\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            docs.openfn.org/blog\n          </a>\n          , read on, or reach out to our team at{' '}\n          <a\n            href=\"mailto:blog@openfn.org\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() => clickEvent('Impact', 'Contact', 'Non-profits')}\n          >\n            blog@openfn.org\n          </a>{' '}\n          if you&apos;re working on data integration, interoperability, process\n          automation, or federated systems design in the ICT4D sector and\n          you&apos;d like to collaborate on a new post.\n        </Typography>\n        {!loading && blogPosts.length === 0 && (\n          <Typography>\n            <br />\n            Sorry, it looks like we&apos;re having trouble fetching our recent\n            posts. Please head over to our official blogs on Medium{' '}\n            <a\n              href=\"https://docs.openfn.org/blog\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              docs.openfn.org/blog\n            </a>{' '}\n            and{' '}\n            <a\n              href=\"https://medium.com/@taylordowns2000\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              @taylordowns2000\n            </a>\n            .\n          </Typography>\n        )}\n      </Feature>\n      <Feature noTopPad>\n        <Grid container spacing={4}>\n          {loading && <Loader item=\"blog posts\" className={classes.loader} />}\n          {blogPosts.map(post => (\n            <BlogItem post={post} key={post.link} />\n          ))}\n          {!loading && (\n            <Grid item>\n              <Typography>\n                The excerpts here were pulled from{' '}\n                <a\n                  href=\"https://docs.openfn.org/blog\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  docs.openfn.org/blog\n                </a>{' '}\n                and{' '}\n                <a\n                  href=\"https://medium.com/@taylordowns2000\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  @taylordowns2000\n                </a>\n                on Medium. Be sure to follow us there for updates.\n              </Typography>\n            </Grid>\n          )}\n        </Grid>\n      </Feature>\n    </div>\n  );\n}\n\nexport default Blog;\n","import React, { useCallback } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Link from '../components/Link';\nimport Images from '../helpers/imagePaths';\n\nconst useStyles = makeStyles(() => ({\n  logo: {\n    verticalAlign: 'middle',\n    maxHeight: '5em',\n    maxWidth: '11em',\n    margin: '3.5em',\n  },\n  signupContainer: {\n    marginTop: '2em',\n  },\n  signupLogos: {\n    verticalAlign: 'middle',\n    maxHeight: '3.5em',\n    maxWidth: '7em',\n    marginRight: '2em',\n    marginBottom: '3em',\n  },\n}));\n\nfunction ClientLogos({ shortList, signup }) {\n  const classes = useStyles();\n\n  const logo = useCallback(\n    (href, src, alt) => {\n      return (\n        <Link\n          name=\"client-logo\"\n          href={href}\n          text={\n            <img\n              className={signup ? classes.signupLogos : classes.logo}\n              src={Images[src]}\n              alt={alt}\n            />\n          }\n        />\n      );\n    },\n    [signup, classes.signupLogos, classes.logo]\n  );\n\n  // prettier-ignore\n  return (\n    <div className={signup && classes.signupContainer} id=\"client-logos\">\n      {logo('https://www.unicef.org/', 'unicef', 'UNICEF')}\n      {logo('https://www.rescue.org/', 'irc', 'The International Rescue Committee (IRC)')}\n      {logo('http://www.popcouncil.org/', 'popcouncil', 'Population Council')}\n      {logo('https://lastmilehealth.org/', 'lastMileHealth', 'Last Mile Health')}\n      {logo('https://www.swisstph.ch/', 'swissTPH', 'The Swiss Tropical and Public Health Institute (Swiss TPH)')}\n      {logo('https://www.wcs.org/', 'wcs', 'Wildlife Conservation Society')}\n      {logo('https://www.psi.org/', 'psi', 'Population Services International (PSI)')}\n      {logo('https://www.miraclefeet.org/', 'miracleFeet', 'MiracleFeet')}\n      {logo('http://lwalacommunityalliance.org/', 'lwala', 'Lwala Community Alliance')}\n      {logo('https://www.myagro.org/', 'myagro', 'MyAgro')}\n      {logo('https://www.carolinaforkibera.org/', 'cfk', 'Carolina for Kibera')}\n      {logo('http://www.technoserve.org/', 'tns', 'TechnoServe')}\n      {logo('https://www.livelyhoods.org/', 'livelyhoods', 'LivelyHoods')}\n      {logo('https://www.logicaloutcomes.net/', 'logicalOutcomes', 'Logical Outcomes')}\n      {logo('https://skateistan.org/', 'skateistan', 'Skateistan')}\n      {!shortList && (\n        <span>\n          {logo('http://www.carisfoundation.org/', 'caris', 'Caris Foundation')}\n          {logo('https://nalibali.org/', 'nalibali', \"Nal'iBali\")}\n          {logo('https://www.buildingtomorrow.org/', 'bt', 'Building Tomorrow')}\n          {logo('https://www.kirkonulkomaanapu.fi/en/', 'fca', 'Finn Church Aid')}\n          {logo('https://lwr.org/', 'lwr', 'Lutheran World Relief')}\n          {logo('http://vpuu.org.za/', 'vpuu', 'VPUU')}\n          {logo('http://sinapis.org/', 'sinapis', 'Sinapis')}\n          {logo('https://www.keteka.com/', 'keteka', 'Keteka')}\n          {logo('https://www.grassrootsoccer.org/', 'grs', 'Grassroot Soccer')}\n          {logo('http://xrunner-venture.org/', 'xrunner', 'X-Runner')}\n          {logo('http://www.ase.org.za/', 'ase', 'ASE')}\n          {logo('https://www.segalfamilyfoundation.org/', 'sff', 'SFF')}\n          {logo('http://www.saep.org/', 'saep', 'SAEP')}\n          {logo('https://www.nrc.no/', 'nrc', 'Norweigian Refugee Council')}\n          {logo('http://ikapadata.com/', 'ikapadata', 'iKapa Data')}\n        </span>\n      )}\n    </div>\n  );\n}\n\nexport default React.memo(ClientLogos);\n","import React, { useEffect } from 'react';\nimport { makeStyles } from '@material-ui/core';\nimport { Link } from 'react-router-dom';\nimport Typography from '@material-ui/core/Typography';\nimport Banner from './Banner';\nimport Feature from './Feature';\nimport { clickEvent } from '../helpers';\n\nconst useStyles = makeStyles(theme => ({\n  list: {\n    '& li': {\n      paddingBottom: theme.spacing(2),\n    },\n  },\n  quote: {\n    padding: theme.spacing(6),\n    borderLeft: 10,\n  },\n}));\n\nfunction Compliance() {\n  const classes = useStyles();\n  useEffect(() => {\n    document.title = 'Compliance - OpenFn';\n  }, []);\n\n  return (\n    <div>\n      <Banner title=\"Compliance\" />\n      <Feature\n        intro=\"How We Think about Compliance at OFG\"\n        subtitle=\"Last Updated: October 1, 2019\"\n        body={\n          <div>\n            <em>BEFORE READING ON</em>, please note that the information\n            provided below should not be considered legal advice. You should\n            work with a lawyer or professional counsel to ensure that you’re\n            adhering to the laws and regulations that may apply to you. That\n            said, we hope that this will prove useful and urge you to read our\n            related sections about{' '}\n            <Link to=\"/trust\" href=\"/trust\">\n              Trust\n            </Link>{' '}\n            and our{' '}\n            <Link to=\"/external-services\" href=\"/external-services\">\n              External Service Providers\n            </Link>\n            , as well as our{' '}\n            <Link to=\"/privacy\" href=\"/privacy\">\n              Privacy Policy\n            </Link>{' '}\n            and the{' '}\n            <Link to=\"/terms\" href=\"/terms\">\n              Terms and Conditions\n            </Link>{' '}\n            for the OpenFn SaaS product.\n          </div>\n        }\n      />\n      <Feature id=\"gdpr-in-a-nutshell\" gray intro=\"The GDPR in a Nutshell\">\n        <Typography>\n          We follow the lead set by the landmark GDPR. While nobody likes the\n          popups, the GDPR is a tremendous piece of multi-national legislation\n          that’s aimed at protecting us (that’s you, our customers, and us, as\n          we use websites and services regulated by the GDPR as well). We not\n          only adhere to the letter of the law, but strive to embody the spirit\n          of the GDPR.{' '}\n          <a\n            href=\"https://www.sanity.io/blog/a-rough-guide-to-running-a-gdpr-compliant-saas-business\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            Sanity.io\n          </a>\n          , fellow software-as-a-service providers, offer a beautiful\n          articulation of this spirit:\n          <ol className={classes.list}>\n            <li>\n              Collect as little as necessary, keep it for as short as necessary,\n              and share it with as few as necessary.\n            </li>\n            <li>\n              Be transparent about what it will be used for, explain it in clear\n              and simple terms, and only use it for the stated purpose.\n            </li>\n            <li>\n              Allow the individual to choose what to share, to retrieve all of\n              their data, to correct it, and to permanently delete it.\n            </li>\n            <li>\n              Keep it secure, and notify the individual and the authorities as\n              soon as possible in the case of a security breach or data leak.\n            </li>\n          </ol>\n        </Typography>\n        <Typography>\n          By working with these basic principles in mind, Open Function Group\n          orients its compliance strategy first practically, and then drills\n          down to ensure compliance with individual—and more\n          technical—regulations.\n        </Typography>\n      </Feature>\n      <Feature\n        id=\"openfn-response-to-gdpr\"\n        intro=\"A simple, numbered response to the GDPR.\"\n      >\n        <Typography>\n          Here, we explain exactly how each of the central concepts of the GDPR\n          (from the section above) applies to OpenFn:\n          <ol className={classes.list}>\n            <li>\n              We don’t use your data to do anything but deliver our service to\n              you and expand the number of organizations or governments we can\n              serve by understanding platform usage at a high-level. Beyond\n              that, no information that isn’t <em>essential</em> to this\n              offering is required from our users and we select all of our{' '}\n              <Link to=\"/external-services\" href=\"/external-services\">\n                external service providers\n              </Link>{' '}\n              very carefully.\n            </li>\n            <li>\n              Here’s what information we collect:\n              <ol type=\"a\" className={classes.list}>\n                <li style={{ paddingTop: '1em' }}>\n                  We collect limited personal information (your name and email)\n                  so we can communicate more effectively with you.\n                </li>\n                <li>\n                  We collect limited company information (organization website\n                  and name) so we can better understand which organizations are\n                  using OpenFn—we&apos;re primarily serving the non-profit,\n                  government, and social sector.\n                </li>\n                <li>\n                  We collect credit card information via a secure payment\n                  processor so that we can bill you for your usage.\n                </li>\n                <li>\n                  We collect limited amounts of browsing data to understand (in\n                  an anonymous way) who’s using our website and how—including\n                  what pages they visit and how long they spend on each page.\n                </li>\n                <li>\n                  We safely store your <b>project data</b> so you can use the\n                  service itself. Be sure to read the section below on your role\n                  as a data controller to understand the implications of this:\n                  <ol type=\"a\">\n                    <br />\n                    <li>\n                      We store your{' '}\n                      <a\n                        href=\"https://docs.openfn.org/documentation/platform#inbox\"\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                      >\n                        messages\n                      </a>{' '}\n                      (inbound events) and{' '}\n                      <a\n                        href=\"https://docs.openfn.org/documentation/platform#activity\"\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                      >\n                        run logs\n                      </a>{' '}\n                      so that you can verify the status of individual\n                      transactions and reprocess data. On free plans this\n                      information is kept for 90 days, and our{' '}\n                      <Link to=\"/pricing\" href=\"/pricing\">\n                        paid plans\n                      </Link>{' '}\n                      come with longer retention options. You can ask to shorten\n                      your data retention at any time.\n                    </li>\n                    <li>\n                      We store your credential data so that your jobs can\n                      interact with services which require authentication. These\n                      credentials can only be accessed by you, and are loaded\n                      into your private runtime for job execution. You can\n                      delete these credentials at any time and they will be\n                      purged from the system.\n                    </li>\n                    <li>\n                      The other things that you create and store on OpenFn\n                      (jobs, triggers, authentication methods, etc.) are kept as\n                      long as your account is active, but can be removed either\n                      through the interface or by request.\n                    </li>\n                  </ol>\n                </li>\n                <li>\n                  Both full data exports and complete account purges can be\n                  requested at any time in writing, and we plan to introduce a\n                  safe and automated way to achieve these objectives through the\n                  interface.\n                </li>\n                <li>\n                  While we haven’t had a security issue to date, we have\n                  internal policies governing how we audit our systems, protect\n                  client data, and how we will respond in the event of a\n                  security breach. In the event of a breach, the authorities and\n                  all customers will be notified within 72 hours.\n                </li>\n              </ol>\n            </li>\n          </ol>\n          That’s the gist of our policy stance as the “data controller”. For the\n          sake of full-transparency,{' '}\n          <Link to=\"/external-services\" href=\"/external-services\">\n            here is a list\n          </Link>{' '}\n          of every single third-party provider we interact with while handling\n          your data and why. Read on to understand how, by using OpenFn, you’re\n          also taking on “data controller” role, with OpenFn as the “data\n          processor”.\n        </Typography>\n      </Feature>\n      <Feature\n        id=\"controller-vs-processor\"\n        gray\n        intro=\"Data Controllers vs. Processors\"\n      >\n        <Typography>\n          Article 4 of the GDPR defines a data controller as “the natural or\n          legal person, public authority, agency or other body which, alone or\n          jointly with others, determines the purposes and means of the\n          processing of personal data”. The data processor is a “natural or\n          legal person, public authority, agency or other body which processes\n          personal data on behalf of the controller”. Put simply, data\n          controllers are legally responsible for data and order certain things\n          to be done with it. Processors are (in most cases) services or\n          companies that carry out tasks with data based on the instructions of\n          the controller.\n          <br />\n          <br />\n          This is crucial to understand:\n        </Typography>\n        <Typography className={classes.quote}>\n          <em>\n            When you use OpenFn to process some information related to your\n            patients, your students, or your community development programs,{' '}\n            <b>you are the data controller</b> in the eyes of the GDPR and\n            OpenFn is the processor.\n          </em>\n        </Typography>\n        <Typography>\n          We are, of course, acting as a controller for different data when we\n          gather data customer information and make decisions on how to use and\n          store that data. (The first section of this document outlines our\n          policies as a data controller.) So, what should <em>you</em> consider\n          as a data controller? You should absolutely talk to your lawyers and\n          ensure that you’re not using OpenFn in any way that’s in violation of\n          the GDPR, but for a cliff-notes version, make sure to understand our\n          position as a controller in section X, and keep these additional\n          things in mind:\n          <ol className={classes.list}>\n            <li>\n              You’re using OpenFn to connect to, receive or extract data from,\n              and load data into lots of different applications. The first thing\n              you’ll want to do is make sure you’re only connecting OpenFn with\n              applications that you’ve vetted and can maintain GDPR compliance\n              with.\n            </li>\n            <li>\n              The next step is to limit the amount of data that you’re pushing\n              or pulling into OpenFn, ensuring that you only use and process\n              what’s absolutely necessary. In this case, think of yourselves the\n              way we do, with respect to the GDPR: “Collect as little as\n              necessary, keep it for as short as necessary, and share it with as\n              few as necessary.”\n            </li>\n            <li>\n              When you’re done with OpenFn, make sure to delete your account.\n              While we’ll automatically purge old activity data, leaving a job\n              turned “on” might mean that even if your project is on the free\n              usage tier, OpenFn could continue to connect to and process\n              information from your various connected applications—only as\n              you’ve directed it to, of course.\n            </li>\n          </ol>\n          By acting as a data controller and deciding how potentially sensitive\n          information is handled carries with it a real legal responsibility.\n          Open Function Group recommends that you work with a lawyer to ensure\n          that your organization is fully compliant with the GDPR. You can read\n          the full regulation{' '}\n          <a\n            href=\"https://eur-lex.europa.eu/eli/reg/2016/679/oj\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            here\n          </a>\n          .\n        </Typography>\n      </Feature>\n      <Feature id=\"data-storage\" intro=\"Data Storage on OpenFn\">\n        <Typography>\n          OpenFn is a middleware provider rather than a data storage system. We\n          move information from system A to system B, and integrations can be\n          setup to be compliant with GDPR, HIPAA, and other policies. To make\n          auditing and reprocessing easy, OpenFn temporarily stores message data\n          and run history, but we&apos;re not the single source of truth nor the\n          final resting point for these data. When organizations choose to use\n          our hosted OpenFn platform at OpenFn.org, no data processed by OpenFn\n          is stored locally and our platform runs on the Google Cloud Platform\n          (GCP).{' '}\n          <Link to=\"/external-services\" href=\"/external-services\">\n            Read more\n          </Link>{' '}\n          about GCP and our external services.\n          <br />\n          <br />\n          For organizations with data residency concerns, Open Function Group\n          also offers local and in-country cloud deployment options for the\n          OpenFn platform so that organizations have complete control over where\n          any data is stored.\n          <br />\n          <br />\n          To facilitate integration monitoring and troubleshooting, OpenFn\n          temporarily stores message data and run logs for 90 days by default.\n          This period can be shortened if desired, and both full data exports\n          and complete account purges can be requested at any time in writing.\n          If desired, users may also enquire about disabling this feature\n          entirely with support from OFG to ensure that OpenFn never keeps data\n          (once processed) from connected systems.\n          <br />\n          <br />\n          We strive for transparency and professionalism at OpenFn. If anything\n          here is unclear, if you have any questions, or if you&apos;d simply\n          like to talk to us about the GDPR or other hosting options, please\n          don&apos;t hesitate to contact us by emailing{' '}\n          <Link\n            to=\"mailto:trust@openfn.org\"\n            href=\"mailto:trust@openfn.org\"\n            onClick={() =>\n              clickEvent('Compliance', 'Contact', 'trust@openfn.org')\n            }\n          >\n            trust@openfn.org\n          </Link>\n          .\n        </Typography>\n      </Feature>\n    </div>\n  );\n}\n\nexport default React.memo(Compliance);\n","import { Button, Hidden } from '@material-ui/core';\nimport green from '@material-ui/core/colors/green';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { CheckCircle as CheckCircleIcon } from '@material-ui/icons';\nimport TextLoop from '@quantfive/react-text-loop';\nimport React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport Link from '../components/Link';\nimport Images from '../helpers/imagePaths';\nimport Banner from './Banner';\nimport Feature from './Feature';\n\nconst useStyles = makeStyles(theme => ({\n  selected: {\n    backgroundColor: theme.palette.primary.light,\n  },\n  media: {\n    height: 200,\n  },\n  blm: {\n    backgroundColor: theme.palette.grey[900],\n    color: theme.palette.grey[100],\n  },\n  logo: {\n    maxHeight: '6em',\n    maxWidth: '10em',\n    margin: '2.5em',\n    verticalAlign: 'middle',\n  },\n  cert: {\n    height: '4em',\n    width: '4em',\n    marginTop: '2em',\n    marginRight: '2em',\n    marginBottom: '2em',\n  },\n}));\n\nfunction Home() {\n  const classes = useStyles();\n  const history = useHistory();\n  const dispatch = useDispatch();\n\n  const solutions = [\n    'process automation',\n    'interoperability',\n    'secure data exchange',\n    'data integration',\n    'workflow execution',\n    'data cleaning',\n    'legacy system integration',\n    'nightly system syncs',\n    // 'data warehousing',\n    // 'task automation',\n    // 'single-view analytics',\n    // 'automated reporting',\n    // 'case referrals',\n    // 'automated alerts',\n    // 'payments integration',\n    // 'survey integration',\n    // 'analytics integration',\n    // 'ERP integration',\n    // 'SMS/IVR integration',\n  ];\n\n  useEffect(() => {\n    document.title = 'OpenFn - Automation & Data Integration';\n  }, []);\n\n  return (\n    <div>\n      <Banner\n        logo={Images.textLogoWhite}\n        subtitle={\n          <div>\n            OpenFn delivers{' '}\n            <TextLoop interval=\"1000\">\n              {solutions.map(x => (\n                <span key={x}>\n                  {x} <CheckCircleIcon style={{ color: green[300] }} />\n                </span>\n              ))}\n            </TextLoop>\n            <br />\n            <Hidden mdDown implementation=\"css\">\n              for governments and social-impact organizations.\n            </Hidden>\n            <Hidden lgUp implementation=\"css\">\n              for governments & NGOs.\n            </Hidden>\n          </div>\n        }\n        more={\n          <div>\n            Visit &nbsp;&nbsp;\n            <Button\n              size=\"large\"\n              variant=\"contained\"\n              color=\"primary\"\n              href=\"https://www.openfn.org\"\n            >\n              OpenFn.org\n            </Button>\n            <Hidden lgUp>\n              <br /> or <br />\n            </Hidden>\n            <Hidden mdDown>&nbsp;&nbsp;or&nbsp;&nbsp;</Hidden>\n            <Button\n              size=\"large\"\n              variant=\"contained\"\n              color=\"primary\"\n              href=\"https://www.openfn.org/register\"\n            >\n              Sign Up\n            </Button>\n            &nbsp;&nbsp;today for free.\n          </div>\n        }\n      />\n      <Feature\n        centered\n        outro={\n          <span>\n            <b>This is OpenFn v1, our legacy platform.</b> You may be looking\n            for{' '}\n            <Link\n              href=\"https://app.openfn.org\"\n              text=\"OpenFn v2 (Lightning)\"\n              color=\"primary\"\n            />\n            , the newest version of our leading digital public good for workflow\n            automation. It&apos;s fully open source and provides lots of\n            powerful{' '}\n            <Link\n              href=\"https://app.openfn.org\"\n              text=\"new features\"\n              color=\"primary\"\n            />\n            .\n          </span>\n        }\n      />\n    </div>\n  );\n}\n\nexport default Home;\n","import React, { useEffect } from 'react';\nimport {\n  Accordion,\n  AccordionDetails,\n  AccordionSummary,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  CardMedia,\n  Divider,\n  Grid,\n  Typography,\n  makeStyles,\n} from '@material-ui/core';\nimport {\n  Code as CodeIcon,\n  ExpandMore as ExpandMoreIcon,\n  FlashOn as FlashOnIcon,\n  History as HistoryIcon,\n  Looks3 as Looks3Icon,\n  LooksOne as LooksOneIcon,\n  LooksTwo as LooksTwoIcon,\n} from '@material-ui/icons';\nimport ReactPlayer from 'react-player/lazy';\nimport { Link, useHistory } from 'react-router-dom';\nimport { planTypes } from '../constants/plans';\nimport { clickEvent, linkTo, pushTo, openTicketWidget } from '../helpers';\nimport Images from '../helpers/imagePaths';\nimport Banner from './Banner';\nimport Feature from './Feature';\n\nconst useStyles = makeStyles(() => ({\n  logo: {\n    maxHeight: '6em',\n    maxWidth: '10em',\n    margin: '2.5em',\n    verticalAlign: 'middle',\n  },\n  playerWrapper: {\n    position: 'relative',\n    paddingTop: '56.25%' /* Player ratio: 100 / (1280 / 720) */,\n  },\n  reactPlayer: {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n  },\n  media: {\n    height: 300,\n  },\n}));\n\nfunction How() {\n  const history = useHistory();\n  const classes = useStyles();\n\n  useEffect(() => {\n    document.title = 'How it works - OpenFn';\n  }, []);\n\n  const steps = [\n    {\n      icon: (\n        <span>\n          A form submission from\n          <br />\n          <img\n            src={Images.koBoToolbox}\n            style={{ height: 40 }}\n            alt=\"Kobo form submission\"\n          />\n        </span>\n      ),\n      text: 'Someone on your team submits a form with important beneficiary data in KoboToolbox. (Or ODK, Ona.io, CommCare, Primero, Go.Data, etc.) It gets forwarded to your OpenFn \"inbox\".',\n    },\n    {\n      icon: (\n        <span>\n          <FlashOnIcon fontSize=\"large\" />\n          <br />\n          matches a trigger\n        </span>\n      ),\n      text: 'Data in that form submission matches a \"filter\" trigger. A trigger is what initiates a job, and can be based on a filter (like this one), a schedule (e.g., every other day at 9am), or the successful or failed run of another job',\n    },\n    {\n      icon: (\n        <span>\n          <CodeIcon fontSize=\"large\" />\n          <br />\n          runs a job\n        </span>\n      ),\n      text: (\n        <div>\n          All active jobs using that trigger start to process the incoming data.\n          In this case, the job will:\n          <br />\n          <br />\n          <LooksOneIcon /> Reformat the Kobo submission data so it adheres to\n          the FHIR HL-7 patient standard. <LooksTwoIcon /> Check to see if the\n          patient already exists in dhis2 as a tracked entity instance. And\n          finally <Looks3Icon /> either update the existing record in dhis2 or\n          create a new one, based on an external ID from Kobo.\n        </div>\n      ),\n    },\n\n    {\n      icon: (\n        <span>\n          performs updates in\n          <br />\n          <img src={Images.dhis2} style={{ height: 40 }} alt=\"dhis2\" />\n        </span>\n      ),\n      text: \"The necessary actions are performed using the DHIS2 api, and if any subsequent jobs need to be executed based on DHIS2's response, they will be initiated now.\",\n    },\n    {\n      icon: (\n        <span>\n          <HistoryIcon fontSize=\"large\" />\n          <br />\n          and reports back to you.\n        </span>\n      ),\n      text: 'Every part of the process is meticulously recorded and, if your requirements allow the storage of data after processing, each run can be inspected or even re-processed in the future.',\n    },\n  ];\n\n  const faqs = [\n    {\n      q: 'Can OpenFn integrate with my app?',\n      a: (\n        <span>\n          Yes, OpenFn can integrate with any application. If your technology has\n          a REST endpoint or webhooks service, it will likely work right out of\n          the box. This covers most web applications (e.g., CommCare, Kobo, ODK,\n          DHIS2, Salesforce, MS Dynamics, MPesa, etc.). OpenFn can also\n          integrate with most databases, like Postgres, MySql, and Mongo, custom\n          applications, legacy government systems, and can even parse CSV\n          files–so long as these can be accessed from an online location. Read\n          more about{' '}\n          <a\n            target=\"_blank\"\n            href=\"https://docs.openfn.org/documentation/source-apps\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'Can OpenFn integrate with my app? Connecting Source Apps'\n              )\n            }\n          >\n            connecting source applications\n          </a>\n          , or check out the{' '}\n          <Link\n            to=\"/apps\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'Can OpenFn integrate with my app? Apps Page'\n              )\n            }\n          >\n            Apps page\n          </Link>{' '}\n          for applications widely implemented.\n          <br />\n          <br />\n          We offer pre-built connectors (called “language-packages” or API\n          “adaptors”) for our users’ most popular apps to make the integration\n          setup quicker and more user-friendly when connecting with these tools.\n          For example, users can implement{' '}\n          <a\n            href=\"https://github.com/OpenFn/language-http\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'Can OpenFn integrate with my app? Language-http'\n              )\n            }\n          >\n            language-http\n          </a>{' '}\n          to send basic HTTP requests to any web application, or implement{' '}\n          <a\n            href=\"https://github.com/OpenFn/language-dhis2\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'Can OpenFn integrate with my app? Language-dhis2'\n              )\n            }\n          >\n            language-dhis2\n          </a>{' '}\n          to automatically handle DHIS2 authentication and access helper\n          functions like fetchData()to export DHIS2 datasets.\n        </span>\n      ),\n    },\n    {\n      q: 'Does OpenFn support two-way syncing?',\n      a: (\n        <span>\n          Yes, OpenFn can support two-way syncing of applications. Utilizing{' '}\n          <a\n            href=\"https://docs.openfn.org/documentation/platform#flow-triggers\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'Does OpenFn support two-way syncing? Flow Triggers'\n              )\n            }\n          >\n            Flow Triggers\n          </a>\n          , OpenFn jobs can be chained together to facilitate real-time two-way\n          data sync, multi-step automation and data cleaning processes, and\n          complex branching logic. Users can also implement bi-directional data\n          syncs, as well as complex Saga Patterns to implement a transaction\n          that spans multiple applications by configuring webhooks in their\n          endpoint applications and performing updates in both systems when\n          events take place in either.\n        </span>\n      ),\n    },\n    {\n      q: 'Do I need to know how to code?',\n      a: (\n        <span>\n          No, but it helps to have written a formula in MS Excel! Many OpenFn\n          users are familiar with data, not development, and quickly get\n          comfortable with OpenFn jobs.\n          <br />\n          <br />\n          If your project is leveraging an OpenFn adaptor (e.g..,\n          <a\n            href=\"https://github.com/OpenFn/language-dhis2\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'Do I need to know how to code? Language-dhis2'\n              )\n            }\n          >\n            language-dhis2\n          </a>\n          ), you have access to pre-built helper functions (e.g., fetchData(),\n          update()) so that you don’t need to write custom code, and rather can\n          use{' '}\n          <a\n            href=\"https://docs.openfn.org/\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'Do I need to know how to code? OpenFn Docs'\n              )\n            }\n          >\n            OpenFn documentation\n          </a>{' '}\n          or existing job scripts to write your own job. See{' '}\n          <a\n            href=\"https://github.com/OpenFn\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'Do I need to know how to code? OpenFn Github'\n              )\n            }\n          >\n            OpenFn Github\n          </a>{' '}\n          for inspiration and open-source job code shared by OpenFn users.\n          You’ll notice that these functions work in the same way that functions\n          do in Excel… “sum(A1, A2, A3)”\n          <br />\n          <br />\n          Jobs can be written and extended using raw Javascript for advanced\n          data cleaning and manipulation. Therefore, you may want to implement\n          Javascript to achieve specific requirements or to extend existing{' '}\n          <a\n            href=\"https://github.com/search?q=org%3AOpenFn+language&unscoped_q=language\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'Do I need to know how to code? OpenFn language-packages'\n              )\n            }\n          >\n            OpenFn language-packages\n          </a>\n          , which are open-source!\n        </span>\n      ),\n    },\n    {\n      q: 'Is my data secure?',\n      a: (\n        <div>\n          Yes, OpenFn prioritizes security, stability, and scalability (\n          <Link\n            to=\"/trust\"\n            onClick={() =>\n              clickEvent('How', 'Browse', 'Is my Data Secure? Trust')\n            }\n          >\n            what we call S³\n          </Link>\n          ) above all else, and many of our users implement OpenFn to comply\n          with GDPR, HIPAA, and other policies. Read more on our{' '}\n          <Link\n            to=\"/trust\"\n            onClick={() =>\n              clickEvent('How', 'Browse', 'Is my Data Secure? Trust')\n            }\n          >\n            Trust\n          </Link>\n          ,{' '}\n          <Link\n            to=\"/compliance\"\n            onClick={() =>\n              clickEvent('How', 'Browse', 'Is my Data Secure? Compliance')\n            }\n          >\n            Compliance\n          </Link>\n          , and{' '}\n          <Link\n            to=\"/privacy\"\n            onClick={() =>\n              clickEvent('How', 'Browse', 'Is my Data Secure? Privacy')\n            }\n          >\n            Privacy\n          </Link>{' '}\n          pages.\n          <br />\n          <br />\n          OpenFn.org runs on the Google Cloud Platform, an infrastructure\n          protected by more than 500 top experts in information, application,\n          and network security. For organizations with specific compliance and\n          data governance requirements, OpenFn can also be deployed on\n          designated local- or cloud-infrastructure.\n        </div>\n      ),\n    },\n    {\n      q: 'What is a job?',\n      a: (\n        <div>\n          OpenFn automation centers around jobs, which define the specific\n          series of tasks or database actions OpenFn should perform. They can be\n          set to be activated (triggered) at certain time intervals or when data\n          matching specified criteria is received. You can think of jobs as a\n          set of instructions you might give a data entry staff member (e.g.,\n          create a new Patient record in OpenMRS when a form containing a newly\n          registered client is received from CommCare, export data to DHIS2\n          every week on Friday 11pm, send SMS with payment confirmation number\n          when payment confirmation message is received etc.).\n          <br />\n          <br />\n          Jobs are fully configurable and reusable. They can also be chained\n          together to create multi-step automation flows, two-way syncs. and to\n          keep data consistent between multiple applications (using multi-app\n          Saga patterns). You can read more on two-way synching below.\n        </div>\n      ),\n    },\n    {\n      q: 'What is a run?',\n      a: (\n        <div>\n          A run is each individual execution of a job. Imagine that a job is\n          configured to create a new patient in OpenMRS whenever a case is\n          opened in CommCare. Over the next week, if 5 cases are opened in\n          CommCare, you’ll see 5 different runs of this one job in OpenFn. If 4\n          runs are successful and one has failed, you’ll see 4 new patients in\n          OpenMRS, and your system administrator will have been notified that\n          one of those patients couldn’t be created (or whatever more robust\n          error-handling you’ve set up will take place.)\n          <br />\n          <br />\n          Note that there’s not always a 1-to-1 mapping between runs and the\n          real-world things you’re working with. I might define a job that gets\n          all updated event data from DHIS2 for the last 2 weeks and publishes\n          it to a public map using CartoDB. This job will be triggered at\n          specified time intervals, every 2 weeks in this case, and after a\n          month, we’ll only see 2 runs in OpenFn (that’s one run every two\n          weeks). Each run will have succeeded or failed, and each one might\n          have processed thousands of events from DHIS2.\n          <br />\n          <br />\n          For one last example, a single form submission in Open Data Kit might\n          trigger a job that creates new contacts and attendance records in\n          Salesforce. In this case, you’ll find a run for each ODK form\n          submission, but each run will create lots of different records in\n          Salesforce—specifically, at least one contact and N number of\n          attendance records, corresponding to the number of items in your ODK\n          form’s “attendance repeat group”.\n        </div>\n      ),\n    },\n    {\n      q: 'What if I have more questions?',\n      a: (\n        <div>\n          Open Function Group is a team of ICT4D and integration specialists,\n          waiting to help you get started. Click the chat icon in the bottom\n          right hand corner of this page to talk now, post a question in our{' '}\n          <a\n            href=\"https://community.openfn.org\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Browse',\n                'What if I have more questions? Community Forum'\n              )\n            }\n          >\n            Community Forum\n          </a>\n          , or email our team at{' '}\n          <a\n            href=\"mailto:admin@openfn.org\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            onClick={() =>\n              clickEvent(\n                'How',\n                'Contact',\n                'What if I have more questions? Email'\n              )\n            }\n          >\n            admin@openfn.org\n          </a>\n          .\n        </div>\n      ),\n    },\n  ];\n\n  return (\n    <div>\n      <Banner\n        title=\"How it works.\"\n        subtitle=\"How do I scale my intervention? (And other FAQs.)\"\n      />\n      <Feature gray id=\"ict4d-connected\" centered>\n        <Grid container justifyContent=\"center\">\n          <Grid item xs={12} sm={9} lg={6}>\n            <Typography variant=\"h5\">\n              Automation means less &quot;admin&quot; and more impact.\n            </Typography>\n            <br />\n            <br />\n            <div className={classes.playerWrapper}>\n              <ReactPlayer\n                controls\n                className={classes.reactPlayer}\n                url=\"https://youtu.be/e2V88NoLQco\"\n                width=\"100%\"\n                height=\"100%\"\n              />\n            </div>\n            <br />\n            <br />\n            <Button\n              size=\"large\"\n              color=\"primary\"\n              variant=\"contained\"\n              href=\"/signup\"\n              onClick={() => pushTo('/signup', history)}\n            >\n              Sign Up\n            </Button>\n            &nbsp;&nbsp;or&nbsp;&nbsp;\n            <Button\n              size=\"large\"\n              color=\"primary\"\n              variant=\"contained\"\n              onClick={() => openTicketWidget()}\n            >\n              Talk to us\n            </Button>\n          </Grid>\n        </Grid>\n      </Feature>\n      <Feature centered>\n        <Grid container justifyContent=\"center\" alignItems=\"center\" spacing={4}>\n          <Grid item xs={12}>\n            <Typography variant=\"h5\">\n              OpenFn automation is built around <code>jobs</code>, which define\n              the specific series of tasks OpenFn should perform. See below for\n              an illustrated example of a simple job OpenFn completes every time\n              a new survey form is submitted in Kobo Toolbox.\n            </Typography>\n          </Grid>\n          {steps.map((step, i) => (\n            <Grid\n              container\n              item\n              xs={12}\n              justifyContent=\"center\"\n              alignItems=\"center\"\n              spacing={4}\n            >\n              {i !== 0 && (\n                <Grid item xs={12}>\n                  <Divider />\n                </Grid>\n              )}\n              <Grid item xs={12} sm={6} md={4}>\n                <Typography variant=\"h5\">{step.icon}</Typography>\n              </Grid>\n              <Grid item xs={12} sm={6} md={4}>\n                <Typography>{step.text}</Typography>\n              </Grid>\n            </Grid>\n          ))}\n          <Grid item xs={12}>\n            <Typography>\n              <br />\n              <br />\n              To get started&nbsp;&nbsp;\n              <Button\n                size=\"large\"\n                color=\"primary\"\n                variant=\"contained\"\n                href=\"/signup\"\n                onClick={() => pushTo('/signup', history)}\n              >\n                Sign Up\n              </Button>\n              &nbsp;&nbsp;for free now.\n            </Typography>\n          </Grid>\n        </Grid>\n      </Feature>\n      <Feature\n        id=\"common-tools\"\n        gray\n        centered\n        intro=\"Connect anything.\"\n        outro=\"With solutions from supply-chain management to public health\n          monitoring, Open Function moves information that makes leading\n          organizations better, faster, and more data-driven.\"\n      >\n        <img className={classes.logo} src={Images.commcare} alt=\"CommCare\" />\n        <img className={classes.logo} src={Images.dhis2} alt=\"DHIS2\" />\n        <img\n          className={classes.logo}\n          src={Images.salesforce}\n          alt=\"Salesforce\"\n        />\n        <img className={classes.logo} src={Images.odk} alt=\"ODK\" />\n        <img className={classes.logo} src={Images.ampImpact} alt=\"Amp Impact\" />\n        <img className={classes.logo} src={Images.openMrs} alt=\"OpenMRS\" />\n        <img\n          className={classes.logo}\n          src={Images.koBoToolbox}\n          alt=\"Kobo Toolbox\"\n        />\n        <img\n          className={classes.logo}\n          src={Images.googleSheets}\n          alt=\"Google Sheets\"\n        />\n        <img\n          className={classes.logo}\n          src={Images.postgresql}\n          alt=\"PostgreSQL\"\n        />\n        <img className={classes.logo} src={Images.mysql} alt=\"mySQL\" />\n        <img className={classes.logo} src={Images.surveycto} alt=\"SurveyCTO\" />\n        <img\n          className={classes.logo}\n          src={Images.medicMobile}\n          alt=\"MedicMobile\"\n        />\n        <img className={classes.logo} src={Images.mPesa} alt=\"MPESA\" />\n        <img className={classes.logo} src={Images.openHim} alt=\"OpenHIM\" />\n        <img className={classes.logo} src={Images.iHris} alt=\"iHRIS\" />\n        <img className={classes.logo} src={Images.ona} alt=\"Ona\" />\n        <br />\n        <br />\n        <br />\n        <Button\n          size=\"large\"\n          variant=\"contained\"\n          color=\"primary\"\n          href=\"/apps#\"\n          onClick={linkTo('/apps#', history)}\n        >\n          See more apps\n        </Button>\n      </Feature>\n      <Feature\n        centered\n        intro=\"Need more automation ideas?\"\n        outro={\n          <div>\n            <Button\n              variant=\"contained\"\n              color=\"secondary\"\n              size=\"large\"\n              onClick={linkTo('/solutions', history)}\n            >\n              Solution Overviews\n            </Button>\n            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n            <Button\n              variant=\"contained\"\n              color=\"secondary\"\n              size=\"large\"\n              onClick={linkTo('/signup', history)}\n            >\n              Sign Up\n            </Button>\n          </div>\n        }\n      >\n        <div>\n          <Card>\n            <CardMedia className={classes.media} image={Images.miraclefeet} />\n          </Card>\n          <br />\n          <br />\n          <Typography variant=\"h5\">\n            Whether it&apos;s task automation, data integration, data cleaning,\n            data warehousing, data validation, legacy systems syncing,\n            interoperability, or data sharing/reporting, you can make it happen\n            automatically and save time and money. That means better data gets\n            into the hands of decision makers, faster.\n          </Typography>\n        </div>\n      </Feature>\n      <Feature\n        gray\n        intro=\"Frequently Asked Questions (FAQs)\"\n        id=\"faqs\"\n        outro={\n          <div style={{ textAlign: 'center' }}>\n            Visit&nbsp;&nbsp;\n            <Button\n              color=\"primary\"\n              size=\"large\"\n              variant=\"contained\"\n              href=\"https://docs.openfn.org\"\n              target=\"_blank\"\n              onClick={() =>\n                clickEvent('How', 'Browse', 'More Questions (How, FAQs)')\n              }\n            >\n              docs.openfn.org\n            </Button>\n            &nbsp;&nbsp;for more FAQs.\n          </div>\n        }\n      >\n        <Grid container justifyContent=\"center\" spacing={4}>\n          <Grid item xs={12}>\n            {faqs.map((faq, i) => (\n              <Accordion id={i}>\n                <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n                  <Typography>{faq.q}</Typography>\n                </AccordionSummary>\n                <AccordionDetails>\n                  <Typography>{faq.a}</Typography>\n                </AccordionDetails>\n              </Accordion>\n            ))}\n          </Grid>\n        </Grid>\n      </Feature>\n      <Feature\n        centered\n        intro=\"Flexible plans that are right for your organization\"\n      >\n        <div>\n          <Grid\n            container\n            spacing={5}\n            alignItems=\"flex-end\"\n            justifyContent=\"center\"\n          >\n            {planTypes.map(plan => (\n              <Grid item key={plan.title} xs={6} sm={3}>\n                <Card>\n                  <CardHeader\n                    title={plan.title}\n                    titleTypographyProps={{ align: 'center' }}\n                    subheaderTypographyProps={{ align: 'center' }}\n                  />\n                  <CardContent>\n                    <div className={classes.cardPricing}>\n                      <Typography variant=\"h4\" color=\"textPrimary\">\n                        {plan.price}/mo.\n                      </Typography>\n                    </div>\n                    {plan.description.map(line => (\n                      <Typography\n                        variant=\"subtitle1\"\n                        align=\"center\"\n                        key={line}\n                        style={{ paddingTop: 5, paddingBottom: 5 }}\n                      >\n                        {line}\n                      </Typography>\n                    ))}\n                  </CardContent>\n                  <CardActions className={classes.cardActions}>\n                    <Button\n                      fullWidth\n                      variant=\"contained\"\n                      onClick={\n                        plan.title === 'Paid Plans'\n                          ? linkTo('/pricing#plans', history)\n                          : linkTo('/signup', history)\n                      }\n                      color={plan.buttonColor}\n                    >\n                      {plan.buttonText}\n                    </Button>\n                  </CardActions>\n                </Card>\n              </Grid>\n            ))}\n          </Grid>\n        </div>\n      </Feature>\n    </div>\n  );\n}\n\nexport default How;\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardMedia from '@material-ui/core/CardMedia';\nimport Typography from '@material-ui/core/Typography';\nimport Images from '../helpers/imagePaths';\nimport Feature from './Feature';\n\nconst useStyles = makeStyles(() => ({\n  media: {\n    height: 300,\n  },\n}));\n\nfunction SocialStories({ alternate, title }) {\n  const classes = useStyles();\n  return (\n    <div>\n      <Feature gray={!alternate} intro={title}>\n        <Card id=\"miracle-feet\">\n          <CardMedia className={classes.media} image={Images.miraclefeet} />\n          <CardContent>\n            <Typography gutterBottom variant=\"h5\" component=\"h2\">\n              Healthcare systems integration boosts treatment quality &amp;\n              outcomes\n              <br />\n              <small>MiracleFeet, Global</small>\n            </Typography>\n            <Typography component=\"span\">\n              <a\n                href=\"http://miraclefeet.org/\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                MiracleFeet\n              </a>\n              &nbsp; is a global health organization leveraging technology to\n              improve treatment quality and outcomes for children born with\n              clubfoot in low- and middle-income countries. Clubfoot is one of\n              the most common birth defects in the world – affecting one out of\n              every 800 children worldwide. MiracleFeet aims to combat these\n              odds and increase access to clubfoot treatment through\n              partnerships with local healthcare providers, offering\n              organizational, technical, and financial support to clinics in 26\n              different countries.\n              <br />\n              <br />\n              Using the OpenFn integration platform, MiracleFeet was able to\n              connect its data systems to automatically send information\n              collected via the CommCare mobile app to its central Salesforce\n              database – relaying data from field-based health workers to\n              program staff and clinic providers in real-time. This\n              OpenFn-powered integrated solution allows MiracleFeet to:\n              <ul>\n                <li>\n                  Aggregate information collected via mobile across clinics in\n                  one central database\n                </li>\n                <br />\n                <li>\n                  Access and analyze information collected in the field in near\n                  real-time\n                </li>\n                <br />\n                <li>\n                  Share data analyses and key metrics with other MiracleFeet\n                  staff, clubfoot partner organizations, and other external\n                  stakeholders\n                </li>\n                <br />\n                <li>\n                  Easily scale and expand its CAST rollout to other countries,\n                  by supporting easy setup of additional CommCare-to-Salesforce\n                  connections using OpenFn\n                </li>\n              </ul>\n              MiracleFeet kicked off its global rollout of its CAST application\n              last year, and will have implemented CAST to support clubfoot\n              treatment in 180+ clinics across 26 countries by April 2019. As\n              MiracleFeet expands its deployment of CAST to additional\n              countries, OpenFn will continue to seamlessly funnel data from\n              CommCare to Salesforce – allowing MiracleFeet to analyze clubfoot\n              treatment quality and outcomes more quickly. MiracleFeet can also\n              easily adjust and expand its OpenFn integration to match new\n              versions of CAST as the design of the solution evolves according\n              to the needs of its partner healthcare providers.\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button\n              color=\"secondary\"\n              target=\"_blank\"\n              href=\"https://twitter.com/intent/tweet?text=Check%20out%20how%20@openfn%20connects%20key%20systems%20for%20@miraclefeet%20#ICT4D%20https://medium.com/@taylordowns2000/healthcare-systems-integration-boosts-treatment-quality-outcomes-2e2f088b2205\"\n              rel=\"noopener noreferrer\"\n            >\n              Share\n            </Button>\n            <Button\n              color=\"secondary\"\n              href=\"https://medium.com/@taylordowns2000/healthcare-systems-integration-boosts-treatment-quality-outcomes-2e2f088b2205\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              Learn More\n            </Button>\n          </CardActions>\n        </Card>\n      </Feature>\n      <Feature id=\"lwala\" gray={alternate}>\n        <Card>\n          <CardMedia\n            className={classes.media}\n            image={Images.communityHealthWorkers}\n          />\n          <CardContent>\n            <Typography gutterBottom variant=\"h5\" component=\"h2\">\n              Building a real-time decision support tool for community health\n              workers\n              <br />\n              <small>Lwala Community Alliance, Kenya</small>\n            </Typography>\n            <Typography component=\"p\">\n              <a\n                href=\"http://lwalacommunityalliance.org/\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                Lwala Community Alliance\n              </a>{' '}\n              is a community-led innovator operating in rural western Kenya. As\n              part of its holistic approach, Lwala supports an extensive network\n              of Community Health Workers (CHWs) who track, screen, treat and\n              refer every pregnant mother and child under 5. The longitudinal\n              data collected by CHWs supports their provision of healthcare at\n              the household, allowing them to provide care tailored to each\n              family and identify and manage urgent cases as quickly as\n              possible.\n              <br />\n              <br />\n              <b>The Problem: </b> Lwala wanted to incorporate a mobile data\n              collection system to reduce the lag time required for data entry\n              from paper forms and to make their data more reliable and timely\n              for CHWs. That said, Lwala didn’t have a way to automatically\n              connect data collected via CommCare, the mobile data collection\n              tool they identified, with their central Salesforce database.\n              <br />\n              <br />\n              <b>The Solution: </b> Lwala uses Open Function to automatically\n              pass data to and from CommCare and Salesforce. Mother and child\n              health data collected by CHWs in the field via mobile phone is now\n              automatically reflected in Lwala’s central database where it can\n              be easily analyzed by Lwala M&E staff. Crucial updates made from\n              within the database are now also automatically synced to CHW’s\n              mobile phones, ensuring they have the most up-to-date information\n              possible. This saves the organization about 205 hours/quarter in\n              data entry time and has reduced crucial time lags between data\n              collection, analysis, and action. It has also made CHWs’ jobs\n              easier by getting them the crucial information they need, faster.\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button\n              color=\"secondary\"\n              target=\"_blank\"\n              href=\"https://twitter.com/intent/tweet?text=Check%20out%20how%20@openfn%20connects%20key%20systems%20for%20@LwalaCommunity%20#ICT4D%20https://medium.com/@taylordowns2000/building-a-real-time-decision-support-tool-for-community-health-workers-75ef8a4ba520\"\n              rel=\"noopener noreferrer\"\n            >\n              Share\n            </Button>\n            <Button\n              color=\"secondary\"\n              href=\"https://medium.com/@taylordowns2000/building-a-real-time-decision-support-tool-for-community-health-workers-75ef8a4ba520\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              Learn More\n            </Button>\n          </CardActions>\n        </Card>\n      </Feature>\n      <Feature id=\"myagro\" gray={!alternate}>\n        <Card>\n          <CardMedia className={classes.media} image={Images.farmers} />\n          <CardContent>\n            <Typography gutterBottom variant=\"h5\" component=\"h2\">\n              Helping small-scale farmers out of poverty with Telerivet,\n              CommCare, and Salesforce\n              <br />\n              <small>myAgro, Mali</small>\n            </Typography>\n            <Typography component=\"p\">\n              To help farmers save,{' '}\n              <a\n                href=\"http://www.myagro.org/\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                myAgro\n              </a>{' '}\n              uses a voucher and SMS based deposit system. In the past, SMS\n              messages containing voucher codes and farmer codes needed to be\n              manually matched against a database of vouchers before credit was\n              allocated to a farmers account and a reply message was sent. The\n              shipment of vouchers around Mali and Senegal was tracked on paper.\n              <br />\n              <br />\n              By integrating Telerivet and Salesforce.com MyAgro has now\n              processed 160,000 SMS messages automatically. They provide instant\n              confirmation to farmers and cut out the chance of human error in\n              the saving allocation step, increasing confidence. They&apos;re\n              now in the process of setting up a supply chain management\n              integration that will connect CommCareHQ and Salesforce.com to\n              allow staff to track all vouchers with a barcode scanning system\n              based on Android phones.\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button\n              color=\"secondary\"\n              target=\"_blank\"\n              href=\"https://twitter.com/intent/tweet?text=Check%20out%20how%20@openfn%20drives%20key%20efficienct%20at%20leading%20social%20change%organizations%20#ICT4D%20https://www.openfn.org/impact\"\n              rel=\"noopener noreferrer\"\n            >\n              Share\n            </Button>\n          </CardActions>\n        </Card>\n      </Feature>\n      <Feature gray={alternate}>\n        <Card id=\"swiss-tph\">\n          <CardMedia className={classes.media} image={Images.commcareDhis2} />\n          <CardContent>\n            <Typography gutterBottom variant=\"h5\" component=\"h2\">\n              National DHIS2 health incident reporting, in-country integration\n              deployment\n              <br />\n              <small>SwissTPH, Nigeria</small>\n            </Typography>\n            <Typography component=\"span\">\n              <a\n                href=\"https://www.swisstph.ch/en/\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                SwissTPH\n              </a>\n              &nbsp; is a global health intitute focusing on infectious and\n              non-communicable diseases, environment, health systems and\n              interventions. Through the{' '}\n              <a\n                href=\"https://www.swisstph.ch/en/projects/project-detail/project-action/detail/project-controller/Projects/project/implementation-of-almanach-in-the-icrc/\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                'ALMANACH' health initiative\n              </a>\n              , SwissTPH helps healthcare providers to better screen, diagnose,\n              and treat sick children in Nigeria.\n              <br />\n              <br />\n              Using the OpenFn integration platform, SwissTPH connects its\n              CommCare mobile data collection app with a national DHIS2\n              reporting system for real-time reporting on key health indicators.\n              This automated reporting solution:\n              <ul>\n                <li>\n                  Enables real-time monitoring of child diagnoses across health\n                  facilities in Nigeria\n                </li>\n                <br />\n                <li>\n                  Automatically delivers 300 beneficiary case updates daily and\n                  logs events with 100 individual “data elements” in DHIS2\n                </li>\n                <br />\n                <li>\n                  Runs on Switzerland-based cloud servers to ensure compliance\n                  with SwissTPH’s data residency concerns\n                </li>\n              </ul>\n              As SwissTPH expands the ALMANACH implementation in Nigeria, the\n              OpenFn solution will continue to seamlessly scale alongside the\n              project and deliver critical health updates to enhance analysis of\n              disease patterns.\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button\n              color=\"secondary\"\n              target=\"_blank\"\n              href=\"https://twitter.com/intent/tweet?text=Check%20out%20how%20@openfn%20drives%20key%20efficiency%20at%20leading%20social%20change%organizations%20#ICT4D%20https://www.openfn.org/impact\"\n              rel=\"noopener noreferrer\"\n            >\n              Share\n            </Button>\n          </CardActions>\n        </Card>\n      </Feature>\n      <Feature id=\"ikapadata\" gray={!alternate}>\n        <Card id=\"ikapadata\">\n          <CardContent>\n            <Typography gutterBottom variant=\"h5\" component=\"h2\">\n              Automating real-time data monitoring and cleaning for a census in\n              South Africa\n              <br />\n              <small>iKapaData, South Africa</small>\n            </Typography>\n            <Typography component=\"span\">\n              For a census in South Africa,{' '}\n              <a\n                href=\"https://www.swisstph.ch/en/\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                iKapaData\n              </a>{' '}\n              was collecting household data using SurveyCTO, and wanted to\n              analyze the dataset across multiple reporting tools.\n              <br />\n              <br />\n              iKapaData set up automated data cleaning and reporting pipelines\n              using OpenFn, which:\n              <ul>\n                <li>\n                  Automatically extract data from SurveyCTO on a scheduled basis\n                </li>\n                <br />\n                <li>\n                  Transform the data to the appropriate reporting formats to\n                  prepare for data & geo-spatial analysis\n                </li>\n                <br />\n                <li>\n                  Upload key results to Zoho Analytics and adds locations to a\n                  map on CartoDB to show locations visited\n                </li>\n              </ul>\n              Through automation, OpenFn delivered real-time census monitoring\n              and saved the iKapaData team hours typically spent on data\n              cleaning and sharing.\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button\n              color=\"secondary\"\n              target=\"_blank\"\n              href=\"https://twitter.com/intent/tweet?text=Check%20out%20how%20@openfn%20drives%20key%20efficiency%20at%20leading%20social%20change%organizations%20#ICT4D%20https://www.openfn.org/impact\"\n              rel=\"noopener noreferrer\"\n            >\n              Share\n            </Button>\n          </CardActions>\n        </Card>\n      </Feature>\n      <Feature id=\"ase\" gray={alternate}>\n        <Card>\n          <CardContent>\n            <Typography gutterBottom variant=\"h5\" component=\"h2\">\n              A data warehouse and analytics platfrom enabling world class\n              education at a fraction of the cost\n              <br />\n              <small>African School For Excellence, South Africa</small>\n            </Typography>\n            <Typography component=\"p\">\n              ASE uses Google, Khan Academy, EdAdmin, and a custom built\n              surveying app to track their student&apos;s progress. The data set\n              is rich, but diverse and couldn&apos;t easily be analyzed.\n              <br />\n              <br />\n              By setting up a PostgreSQL database and connecting these varied\n              sources via OpenFn, we&apos;re giving ASE access to student data\n              like never before.\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button\n              color=\"secondary\"\n              target=\"_blank\"\n              href=\"https://twitter.com/intent/tweet?text=Check%20out%20how%20@openfn%20drives%20key%20efficienct%20at%20leading%20social%20change%organizations%20#ICT4D%20https://www.openfn.org/impact\"\n              rel=\"noopener noreferrer\"\n            >\n              Share\n            </Button>\n          </CardActions>\n        </Card>\n      </Feature>\n      <Feature id=\"x-runner\" gray={!alternate}>\n        <Card>\n          <CardContent>\n            <Typography gutterBottom variant=\"h5\" component=\"h2\">\n              NFC tags, Open Data Kit, and Salesforce for better sanitation for\n              low-income urban families\n              <br />\n              <small>x-runner, Peru</small>\n            </Typography>\n            <Typography component=\"p\">\n              x-runner is a social enterprise that provides a reliable, safe,\n              and sustainable sanitation service to low-income urban families in\n              Lima, Peru who cannot have toilets. They offer a complete\n              sanitation value chain by linking a hygenic and waterless toilet\n              for at-home use with a weekly &quot;waste&quot; pick-up service\n              and an ecological treatment of the feces. Every customer household\n              can also access their high-quality customer and technical\n              assistance service.\n              <br />\n              <br />\n              To monitor the waste collection activities and the correct use of\n              the toilet, the team uses ODK Collect, ODK Aggregate, OpenFn and\n              Salesforce to gather and manage data during the waste pick-up\n              turns. Each waste container collected has an NFC tag attached on\n              the lid, containing a unique identifier corresponding to each\n              customer. When the waste service operator receives a container, he\n              fills an ODK Collect form regarding the state of the fecal content\n              in the container. The operator uses a smartphone to scan the NFC\n              tag and to enter information about the container content.\n              <br />\n              <br />\n              After the service, the completed forms are synced to\n              x-runner&apos;s ODK Aggregate database. OpenFn moves data from\n              Aggregte&apos;s platform to Salesforce. x-runner management uses\n              the Salesforce platform to verify that customers containers have\n              been fully collected and to identify any further problems with the\n              containers. Standard reports in Salesforce help to easily identify\n              these issues and x-runner staff can immediately address them\n              through various mitigation options.\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button\n              color=\"secondary\"\n              target=\"_blank\"\n              href=\"https://twitter.com/intent/tweet?text=Check%20out%20how%20@openfn%20drives%20key%20efficienct%20at%20leading%20social%20change%organizations%20#ICT4D%20https://www.openfn.org/impact\"\n              rel=\"noopener noreferrer\"\n            >\n              Share\n            </Button>\n          </CardActions>\n        </Card>\n      </Feature>\n      <Feature id=\"kgvk\" gray={alternate}>\n        <Card>\n          <CardContent>\n            <Typography gutterBottom variant=\"h5\" component=\"h2\">\n              Household surveys with instant analysis using ODK and Salesforce\n              <br />\n              <small>KGVK, India</small>\n            </Typography>\n            <Typography component=\"p\">\n              KGVK administers an in-depth household survey to tens of thousands\n              of beneficiaries around Jharkand each year. The survey is a key\n              part of their &quot;Total Village Management&quot; intervention,\n              allowing them to assess village needs across education, access to\n              financial services, healthcare, and agriculture. In the past, it\n              took KGVK months to digitize and analyze these data before sharing\n              static reports with key staff.\n              <br />\n              <br />\n              Now, using our ODK to Salesforce.com integration, KGVK is able to\n              access dynamic dashboards in near-real time—allowing their roles\n              in the communities they serve to be adjusted according to the\n              needs of those people.\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button\n              color=\"secondary\"\n              target=\"_blank\"\n              href=\"https://twitter.com/intent/tweet?text=Check%20out%20how%20@openfn%20drives%20key%20efficienct%20at%20leading%20social%20change%organizations%20#ICT4D%20https://www.openfn.org/impact\"\n              rel=\"noopener noreferrer\"\n            >\n              Share\n            </Button>\n          </CardActions>\n        </Card>\n      </Feature>\n    </div>\n  );\n}\n\nexport default React.memo(SocialStories);\n","import { makeStyles } from '@material-ui/core';\nimport React from 'react';\nimport Images from '../helpers/imagePaths';\n\nconst useStyles = makeStyles(() => ({\n  logo: {\n    maxHeight: '6em',\n    maxWidth: '11em',\n    margin: '4em',\n    verticalAlign: 'middle',\n  },\n}));\n\nfunction PartnerLogos() {\n  const classes = useStyles();\n\n  function logo(src, alt) {\n    return <img className={classes.logo} src={Images[src]} alt={alt} />;\n  }\n\n  return (\n    <div>\n      {logo('dial', 'The Digital Impact Alliance')}\n      {logo('digitalSquare', 'Digital Square')}\n      {logo('chai', 'Clinton Health Access Initiative')}\n      {logo('unFoundation', 'United Nations Foundation')}\n      {logo('ukAid', 'UK Aid')}\n      {logo('mulago', 'Mulago')}\n      {logo('dsme', 'Digital Solutions for Malaria Elimination')}\n      {logo('echoinggreen', 'Echoing Green')}\n      {logo('poptech', 'PopTech')}\n      {logo('chile', 'Start-Up Chile')}\n      {logo('salesforceOrg', 'Salesforce Foundation')}\n      {logo('dasra', 'Dasra')}\n    </div>\n  );\n}\n\nexport default React.memo(PartnerLogos);\n","import { makeStyles } from '@material-ui/core';\nimport React from 'react';\nimport Link from '../components/Link';\nimport Images from '../helpers/imagePaths';\n\nconst useStyles = makeStyles(() => ({\n  logo: {\n    maxHeight: '6em',\n    maxWidth: '11em',\n    margin: '4em',\n    verticalAlign: 'middle',\n  },\n}));\n\nfunction ImplementerLogos() {\n  const classes = useStyles();\n\n  function logo(href, src, alt, regions) {\n    return (\n      <Link\n        name=\"client-logo\"\n        href={href}\n        text={<img className={classes.logo} src={Images[src]} alt={alt} />}\n      />\n    );\n  }\n\n  return (\n    <div>\n      {logo(\n        'https://www.verasolutions.org/',\n        'vera',\n        'Vera Solutions',\n        'Global'\n      )}\n      {logo(\n        'https://www.opensolutions.health/',\n        'os4h',\n        'Open Solutions for Health',\n        'Caribbean'\n      )}\n      {logo('mailto:contact@koekoetech.com', 'kkt', 'KKT', 'Southeast Asia')}\n      {logo(\n        'https://ayder.info/index.php/services/ict',\n        'ayder',\n        'Ayder Hospital College of Health Sciences, Digital Health Research and Development Center',\n        'Ethiopia'\n      )}\n    </div>\n  );\n}\n\nexport default React.memo(ImplementerLogos);\n","import {\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogTitle,\n  Grid,\n  Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  AllInclusive as AllInclusiveIcon,\n  Code as CodeIcon,\n  CloudCircle as CloudCircleIcon,\n  CloudOff as CloudOffIcon,\n  Language as LanguageIcon,\n  SupervisedUserCircle as SupervisedUserCircleIcon,\n} from '@material-ui/icons';\nimport { formatDistanceStrict } from 'date-fns';\nimport React, { useEffect, useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { plans as tiers } from '../constants/plans';\nimport { clickEvent, linkTo } from '../helpers';\nimport Banner from './Banner';\nimport Feature from './Feature';\nimport Link from '../components/Link';\n\nconst useStyles = makeStyles(theme => ({\n  appBar: {\n    position: 'relative',\n  },\n  toolbarTitle: {\n    flex: 1,\n  },\n  layout: {\n    width: 'auto',\n    marginLeft: theme.spacing(3),\n    marginRight: theme.spacing(3),\n    [theme.breakpoints.up(900 + theme.spacing(6))]: {\n      width: 900,\n      marginLeft: 'auto',\n      marginRight: 'auto',\n    },\n  },\n  local: {\n    marginTop: theme.spacing(2),\n    marginLeft: theme.spacing(3),\n    marginRight: theme.spacing(3),\n  },\n  cardHeader: {\n    backgroundColor: theme.palette.grey[200],\n  },\n  cardPricing: {\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'baseline',\n    marginBottom: theme.spacing(2),\n  },\n  cardActions: {\n    [theme.breakpoints.up('sm')]: {\n      paddingBottom: theme.spacing(2),\n    },\n  },\n}));\n\nfunction Pricing() {\n  const [modalShow, setModalShow] = useState(false);\n\n  const history = useHistory();\n\n  const classes = useStyles();\n\n  const showModal = () => {\n    setModalShow(true);\n  };\n\n  const hideModal = () => {\n    setModalShow(false);\n  };\n\n  const discountModal = (\n    <Dialog open={modalShow} onClose={hideModal}>\n      <DialogTitle>\n        Non-profits and governments get discounts on products & services\n      </DialogTitle>\n      <DialogContent>\n        <Typography>\n          OpenFn&apos;s technology drives efficiency across all sectors, but we\n          came from the non-profit world and our hearts will always be in\n          social-impact. If you are a government, non-profit or social\n          enterprise, create a free account and email us for a discount before\n          upgrading to a paid plan or migrating to v2, &quot;Lightning&quot;.\n          <br />\n          <br />\n          OpenFn also provides an initial integration consultation for free and\n          can help you configure your first jobs.\n        </Typography>\n      </DialogContent>\n      <DialogActions>\n        <Button onClick={linkTo('/signup', history)}>\n          Create Free Account\n        </Button>\n        <Button\n          href=\"mailto:nonprofit@openfn.org\"\n          onClick={() => clickEvent('Contact', 'Non-profit Contact (Pricing)')}\n        >\n          Email to apply\n        </Button>\n      </DialogActions>\n    </Dialog>\n  );\n\n  const years = formatDistanceStrict(new Date(2014, 6, 1), new Date());\n\n  useEffect(() => {\n    document.title = 'Products & Pricing - OpenFn';\n  }, []);\n\n  return (\n    <div>\n      <Banner\n        title=\"Pricing\"\n        subtitle={\n          <div>\n            Products &amp; services to meet your needs,\n            <br />\n            plus a total solution ownership enterprise offering.\n          </div>\n        }\n        more={\n          <Button\n            onClick={linkTo('/signup', history)}\n            color=\"primary\"\n            variant=\"contained\"\n          >\n            Sign up for free\n          </Button>\n        }\n      />\n      {discountModal}\n      <Feature centered intro=\"Understand our offerings.\">\n        <Grid container spacing={3} justifyContent=\"center\">\n          <Grid item xs={12} md={3}>\n            <Typography variant=\"h2\">\n              <CloudCircleIcon fontSize=\"inherit\" />\n            </Typography>\n            <Typography variant=\"h4\">SaaS</Typography>\n            <br />\n            <Typography>\n              Whether deployed locally or as a hosted\n              integration-platform-as-a-service (iPaaS), use the sector&apos;s\n              leading integration management solution and configure it to your\n              own specifications.\n            </Typography>\n          </Grid>\n          <Grid item xs={12} md={3}>\n            <Typography variant=\"h2\">\n              <CodeIcon fontSize=\"inherit\" />\n            </Typography>\n            <Typography variant=\"h4\">Open Source</Typography>\n            <br />\n            <Typography>\n              Leverage the OpenFn Integration Toolkit, documentation, community,\n              and job library to jump start your custom integration project.\n            </Typography>\n          </Grid>\n          <Grid item xs={12} md={3}>\n            <Typography variant=\"h2\">\n              <SupervisedUserCircleIcon fontSize=\"inherit\" />\n            </Typography>\n            <Typography variant=\"h4\">Direct Services</Typography>\n            <br />\n            <Typography>\n              Our interoperability specialists help make sense of your systems,\n              design your integrations, configure OpenFn, handle local\n              deployments if necessary, and train your team to succeed with\n              integration projects over the long-term.\n            </Typography>\n          </Grid>\n        </Grid>\n      </Feature>\n      <Feature\n        id=\"local\"\n        gray\n        centered\n        intro=\"Be empowered.\"\n        outro={\n          <div>\n            Yes, Open Function can do that.\n            <br />\n            <br />\n            <Button\n              color=\"secondary\"\n              size=\"large\"\n              variant=\"contained\"\n              href=\"mailto:enterprise@openfn.org?subject=Local Deployment of OpenFn\"\n              target=\"_blank\"\n              onClick={() =>\n                clickEvent('Contact', 'Enterprise Contact (Pricing)')\n              }\n            >\n              Enterprise contact\n            </Button>\n          </div>\n        }\n      >\n        <Grid container spacing={3}>\n          <Grid item xs={12}>\n            <Typography variant=\"h5\">\n              Want total solution ownership, running OpenFn on{' '}\n              <em>your own servers</em> with a multi-year, unlimited-use\n              license?\n            </Typography>\n          </Grid>\n          <Grid item xs={12}>\n            <Typography variant=\"h2\">\n              <AllInclusiveIcon fontSize=\"inherit\" className={classes.local} />\n              <LanguageIcon fontSize=\"inherit\" className={classes.local} />\n              <CloudOffIcon fontSize=\"inherit\" className={classes.local} />\n            </Typography>\n          </Grid>\n        </Grid>\n      </Feature>\n      <Feature\n        id=\"plans\"\n        intro={\n          <em>\n            OpenFn Lightning (the &quot;v2&quot;) is coming soon. <br />\n            Learn more{' '}\n            <Link\n              href=\"https://docs.openfn.org/documentation/about-lightning\"\n              text=\"here\"\n              color=\"primary\"\n            />{' '}\n            and{' '}\n            <Link\n              href=\"mailto:sales@openfn.org\"\n              text=\"contact us\"\n              color=\"primary\"\n            />{' '}\n            for pricing.\n          </em>\n        }\n        centered\n      >\n        <Grid container spacing={3}>\n          <Grid item xs={12}>\n            <Typography variant=\"h5\" color=\"grey\">\n              v1 legacy Pricing\n            </Typography>\n          </Grid>\n        </Grid>\n        <Grid container spacing={5} alignItems=\"flex-end\">\n          {tiers.map(tier => (\n            <Grid\n              item\n              key={tier.title}\n              xs={12}\n              sm={tier.title === 'Enterprise' ? 12 : 6}\n              md\n            >\n              <Card>\n                <CardHeader\n                  title={tier.title}\n                  subheader={tier.subheader}\n                  titleTypographyProps={{ align: 'center' }}\n                  subheaderTypographyProps={{ align: 'center' }}\n                  className={classes.cardHeader}\n                />\n                <CardContent>\n                  <div className={classes.cardPricing}>\n                    <Typography component=\"h2\" variant=\"h3\" color=\"textPrimary\">\n                      {tier.price && `$${tier.price}`}\n                    </Typography>\n                    <Typography variant=\"h6\" color=\"textSecondary\">\n                      {tier.alt ? (\n                        <div>\n                          {tier.alt}\n                          <br />\n                          on-premise/cloud\n                        </div>\n                      ) : (\n                        '/mo'\n                      )}\n                    </Typography>\n                  </div>\n                  {tier.description.map(line => (\n                    <Typography variant=\"subtitle1\" align=\"center\" key={line}>\n                      {line}\n                    </Typography>\n                  ))}\n                </CardContent>\n                <CardActions className={classes.cardActions}>\n                  <Button\n                    fullWidth\n                    variant=\"contained\"\n                    onClick={\n                      tier.title === 'Enterprise'\n                        ? () =>\n                            clickEvent('Contact', 'Open Source Help (Pricing)')\n                        : linkTo('/signup', history)\n                    }\n                    href={\n                      tier.title === 'Enterprise'\n                        ? 'mailto:enterprise@openfn.org'\n                        : null\n                    }\n                    color={tier.buttonColor}\n                  >\n                    {tier.buttonText}\n                  </Button>\n                </CardActions>\n              </Card>\n            </Grid>\n          ))}\n          <Grid item xs={12}>\n            <br />\n            <Typography variant=\"h5\">\n              <em>Priority Support</em> packages & turn-key integration\n              management are available for purchase alongside all plans.\n            </Typography>\n            <br />\n            <br />\n            <Button\n              color=\"primary\"\n              size=\"large\"\n              variant=\"contained\"\n              href=\"mailto:support@openfn.org?subject=Priority support\"\n              target=\"_blank\"\n              onClick={() =>\n                clickEvent('Contact', 'Priority Support (Pricing)')\n              }\n            >\n              Contact support\n            </Button>\n          </Grid>\n        </Grid>\n      </Feature>\n      <Feature\n        id=\"discount\"\n        gray\n        centered\n        intro=\"Are you a government, NGO, or impact-first organization?\"\n        outro={\n          <div>\n            Contact our team for discounted pricing that aligns with our new\n            OpenFn Lightning offering.\n            <br />\n            <br />\n            <Button\n              color=\"secondary\"\n              size=\"large\"\n              variant=\"contained\"\n              onClick={showModal}\n            >\n              Learn more\n            </Button>\n          </div>\n        }\n      />\n      <Feature\n        centered\n        id=\"open-source\"\n        intro=\"Explore our open-source offering.\"\n        outro={\n          <Button\n            color=\"primary\"\n            size=\"large\"\n            variant=\"contained\"\n            href=\"https://community.openfn.org\"\n            target=\"_blank\"\n            onClick={() => clickEvent('Contact', 'Community (Pricing)')}\n          >\n            Get help with open-source\n          </Button>\n        }\n      >\n        <div>\n          <Typography variant=\"h5\">\n            The OpenFn{' '}\n            <Link\n              href=\"https://docs.openfn.org/documentation/getting-started/integration-toolkit\"\n              text=\"Integration Toolkit\"\n              color=\"primary\"\n            />{' '}\n            is a digital public good, providing the powerful tools at the heart\n            of our iPaaS as free and open-source software.\n          </Typography>\n          <br />\n          <Typography>\n            For the last {years}, Open Function Group has been investing in{' '}\n            <em>both</em> our proprietary web application and a powerful set of\n            completely free and open-source (FOSS) data integration tools. Check\n            out the{' '}\n            <Link\n              href=\"https://docs.openfn.org/documentation/deploy/diy\"\n              text=\"DIY\"\n              color=\"primary\"\n            />{' '}\n            section of the OpenFn for information about building DIY integration\n            services with these tools. Batch synchronization jobs, data\n            cleaning, or multi-step automation can be run by hand, right from\n            your command prompt. When used in conjunction with cron or a simple\n            webserver, you can manage complex integrations from any Linux,\n            Windows, or Mac machine. You can build your own language-packages,\n            or use and contribute to those maintained by our community as\n            they&apos;re all open-source.\n          </Typography>\n          <br />\n          <Typography variant=\"h6\">\n            Why is providing a FOSS alternative important to us?\n          </Typography>\n          <br />\n          <Typography>\n            This FOSS integration software forms the &quot;core&quot; of the\n            platform and helps to ensure that our pricing is fair: if the value\n            added by our high-availability hosting &amp; enterprise-grade\n            features are less than the cost of building your own service, you\n            can always run every single OpenFn job on your own machines without\n            paying us a cent. This provides organizations with critical{' '}\n            <b>lock-in protection</b> and ensures that the time and money they\n            invest in setting up integration flows on OpenFn will not be lost if\n            they decide to shift to their own internal solution.\n          </Typography>\n        </div>\n      </Feature>\n    </div>\n  );\n}\n\nexport default Pricing;\n","import React, { useEffect } from 'react';\nimport { Button, makeStyles } from '@material-ui/core';\nimport Banner from './Banner';\nimport Feature from './Feature';\nimport { AceEditor } from '../components/CodeEditor';\nimport Link from '../components/Link';\nimport { clickEvent } from '../helpers';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    marginTop: theme.spacing(2),\n    textAlign: 'center',\n    '& > *': {\n      margin: theme.spacing(1),\n    },\n  },\n}));\n\nfunction Careers() {\n  useEffect(() => {\n    document.title = 'Careers - OpenFn';\n  }, []);\n\n  const classes = useStyles();\n\n  return (\n    <div>\n      <Banner title=\"Careers\" subtitle=\"Working at Open Function Group\" />\n      <Feature\n        intro=\"Why work at OpenFn?\"\n        body={\n          <div>\n            <p>\n              OpenFn helps some of the world&apos;s most promising health and\n              humanitarian interventions scale through workflow automation, data\n              integration, and interoperability. (Check out our{' '}\n              <Link\n                color=\"primary\"\n                href=\"https://docs.openfn.org/blog\"\n                text=\"blog\"\n                onClick={() => clickEvent('Careers', 'Docs')}\n              />{' '}\n              to learn more about what we do and who we work with.) While\n              technology is at the heart of our approach, our team needs\n              passionate, experienced, talented people to achieve our mission.\n            </p>\n            <p>\n              If you are interested in improving and strengthening digital\n              systems for underserved populations in lower and middle income\n              countries, come build a career at OpenFn. We are seeking\n              experienced professionals who identify with the following:\n            </p>\n            <ul>\n              <li>\n                You believe that rising inequality is a bad thing and that\n                technology can be a force for social justice\n              </li>\n              <li>\n                You think open source is important and that governments should\n                own the solutions that serve their citizens\n              </li>\n\n              <li>\n                You value being held accountable for results and working out in\n                the open—feedback, critical collaboration, and high quality\n                standards get you excited\n              </li>\n\n              <li>\n                You bring real technical experience in software development,\n                technology consulting, product design, data management, or\n                related fields\n              </li>\n\n              <li>\n                You want to join a small, mission-driven team to solve hard\n                problems in close collaboration with a global network of\n                government and non-profit partners\n              </li>\n            </ul>\n            <p>\n              If this sounds like you, let us know. We are actively hiring for a\n              number of positions, but also accept career inquiries via{' '}\n              <Link\n                color=\"primary\"\n                href=\"mailto:jobs@openfn.org\"\n                text=\"jobs@openfn.org\"\n                onClick={() =>\n                  clickEvent('Careers', 'Contact', 'General Inquiry')\n                }\n              />{' '}\n              and look forward to hearing from you.\n            </p>\n            <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                size=\"large\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent('Careers', 'Download JD', 'Head of Sales')\n                }\n                href=\"https://docs.google.com/document/d/1qUfq6CIugtJhlEG0AyP-4dIUU5k5shqFaQA00S0eZtY/export?format=pdf\"\n              >\n                Head of Sales\n              </Button>\n            </div>\n            <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                size=\"large\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent(\n                    'Careers',\n                    'Download JD',\n                    'Senior IT Implementation Consultant'\n                  )\n                }\n                href=\"https://docs.google.com/document/d/1IxX9TKa99O2Yu7Y6ZuIyI_TMIWUhdruRvgT4ccNfYmk/export?format=pdf\"\n              >\n                Senior IT Implementation Consultant\n              </Button>\n            </div>\n            {/* <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent(\n                    'Careers',\n                    'Download JD',\n                    'Principal Elixir Engineer'\n                  )\n                }\n                href=\"https://docs.google.com/document/d/1TKPKibL0hIYk46q6meT5kjyBYK7fUQ_Wsvc2bRrUFSI/export?format=pdf\"\n              >\n                Principal Elixir Engineer\n              </Button>\n            </div> */}\n            <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                size=\"large\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent(\n                    'Careers',\n                    'Download JD',\n                    'Senior Javascript Engineer'\n                  )\n                }\n                href=\"https://docs.google.com/document/d/1uRHNRVW3kp3KFSRnm6j26kCSRPZhp2P_L5jBoXOZxSI/export?format=pdf\"\n              >\n                Senior JavaScript/TypeScript Engineer\n              </Button>\n            </div>\n            {/* <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent('Careers', 'Download JD', 'ML Engineer')\n                }\n                href=\"https://docs.google.com/document/d/1KGGqoFKtBuxqByrmkbQKFuQJbWAgolETr1GB0rDG-yk/export?format=pdf\"\n              >\n                ML Engineer\n              </Button>\n            </div> */}\n          </div>\n        }\n      />\n      <Feature\n        gray\n        noBottomPad\n        intro=\"Engineering Track\"\n        body={\n          <div>\n            <b>\n              In product engineering at OpenFn, we&apos;re trying to unlock the\n              potential of the &quot;Technology for Development&quot; sector by\n              building open-source automation, data integration and\n              interoperability tools.\n            </b>{' '}\n            Do you want to work with technologies on the cutting edge of cloud\n            computing and web development, on a sector-leading iPaaS, and an\n            impressive array of open-source workflow automation, ETL, and data\n            processing technologies? Do you wish that <em>less</em> Silicon\n            Valley brainpower was wasted making marginal improvements to already\n            comfortable lives?\n            <br />\n            <br />\n            <AceEditor\n              mode=\"elixir\"\n              width=\"100%\"\n              minLines={1}\n              maxLines={20}\n              theme=\"monokai\"\n              style={{ display: 'flex' }}\n              tabSize={2}\n              value={[\n                '@doc \"\"\"',\n                'should_apply/1 takes a map with keyed responses and returns a boolean which',\n                'suggests whether or not you should apply.',\n                '\"\"\"',\n                '@spec should_apply(map) :: boolean',\n                'def should_apply(responses) do',\n                '  responses',\n                '  |> Map.get(:yours)',\n                '  |> case do',\n                '    \"Yes, to BOTH!\" -> true',\n                '    _other -> false',\n                '  end',\n                'end',\n              ].join('\\n')}\n              readOnly\n            />\n            <AceEditor\n              mode=\"javascript\"\n              width=\"100%\"\n              minLines={1}\n              maxLines={20}\n              theme=\"solarized_dark\"\n              style={{ display: 'flex' }}\n              tabSize={2}\n              value={[\n                '// Or if Javascript is more your style...',\n                \"responses.yours === 'Yes, to BOTH!'\",\n                \"  ? 'You should apply.'\",\n                \"  : 'No hard feelings.';\",\n              ].join('\\n')}\n              readOnly\n            />\n            <br />\n            You&apos;ll gain experience with some of the most in-demand web\n            technologies in the world. From Elixir (with the latest Phoenix\n            LiveView) to Tailwind to a modern NodeJs and Typescript job\n            execution runtime, there is a lot of fun stuff here. Our hosted\n            service all runs on Google Kubernetes Engine and our DPG (which can\n            be deployed anywhere in the world) relies on devops tooling built in\n            Terraform and Ansible.\n            <br />\n            <br />\n            <b>\n              We are interested in fast learners with strong opinions, weakly\n              held, who care about what they&apos;re building.\n            </b>\n            {/* <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent(\n                    'Careers',\n                    'Download JD',\n                    'Principal Elixir Engineer'\n                  )\n                }\n                href=\"https://docs.google.com/document/d/1TKPKibL0hIYk46q6meT5kjyBYK7fUQ_Wsvc2bRrUFSI/export?format=pdf\"\n              >\n                Principal Elixir Engineer\n              </Button>\n            </div> */}\n            <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent(\n                    'Careers',\n                    'Download JD',\n                    'Senior Javascript Engineer'\n                  )\n                }\n                href=\"https://docs.google.com/document/d/1uRHNRVW3kp3KFSRnm6j26kCSRPZhp2P_L5jBoXOZxSI/export?format=pdf\"\n              >\n                Senior JavaScript/TypeScript Engineer\n              </Button>\n            </div>\n            {/* <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent('Careers', 'Download JD', 'ML Engineer')\n                }\n                href=\"https://docs.google.com/document/d/1KGGqoFKtBuxqByrmkbQKFuQJbWAgolETr1GB0rDG-yk/export?format=pdf\"\n              >\n                ML Engineer\n              </Button>\n            </div> */}\n          </div>\n        }\n      />\n      <Feature\n        intro=\"Delivery Track\"\n        noBottomPad\n        body={\n          <div>\n            <b>\n              Do you want to help scale the world&apos;s most promising health\n              and humanitarian interventions by harnessing automation, data\n              integration, and interoperability?\n            </b>{' '}\n            Open Function Group helps innovative NGO and government programs\n            achieve scale via data integration, automation, and interoperability\n            solutions. To date, our solutions have been implemented in 40+\n            countries by leading social sector organizations, including UNICEF,\n            Wildlife Conservation Society, the IRC, The Population Council,\n            Lwala Community Alliance, myAgro, Vera Solutions, Dimagi, and many\n            more. Since 2014, we have focused primarily on developing our core\n            product—the OpenFn integration platform—and have implemented\n            projects targeting public health, environmental protection,\n            humanitarian response, and poverty alleviation. We are now scaling\n            our impact by consulting with larger NGOs and governments to\n            implement integration and interoperability solutions.\n            <br />\n            <br />\n            <b>\n              We are interested in experienced professionals with strong track\n              records in project delivery, technology consulting, and customer\n              success for b2b product companies.\n            </b>\n            <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                size=\"large\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent('Careers', 'Download JD', 'Head of Sales')\n                }\n                href=\"https://docs.google.com/document/d/1qUfq6CIugtJhlEG0AyP-4dIUU5k5shqFaQA00S0eZtY/export?format=pdf\"\n              >\n                Head of Sales\n              </Button>\n            </div>\n            <div className={classes.root}>\n              <Button\n                color=\"primary\"\n                variant=\"contained\"\n                size=\"large\"\n                className={classes.button}\n                onClick={() =>\n                  clickEvent(\n                    'Careers',\n                    'Download JD',\n                    'Senior IT Implementation Consultant'\n                  )\n                }\n                href=\"https://docs.google.com/document/d/1IxX9TKa99O2Yu7Y6ZuIyI_TMIWUhdruRvgT4ccNfYmk/export?format=pdf\"\n              >\n                Senior IT Implementation Consultant\n              </Button>\n            </div>\n          </div>\n        }\n      />\n    </div>\n  );\n}\n\nexport default React.memo(Careers);\n","import React from 'react';\nimport {\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Typography,\n  makeStyles,\n  Tooltip,\n} from '@material-ui/core';\nimport { ExitToApp as ExitToAppIcon } from '@material-ui/icons';\nimport { camelCase } from 'lodash';\nimport PropTypes from 'prop-types';\nimport Images from '../helpers/imagePaths';\nimport Link from '../components/Link';\n\nconst useStyles = makeStyles(() => ({\n  header: {\n    backgroundImage: `url(${Images.bgNoise})`,\n  },\n  logo: {\n    maxHeight: '2em',\n    maxWidth: '6em',\n  },\n  link: {\n    color: 'black',\n    fontSize: 16,\n  },\n  adaptorIcon: {\n    height: '1em',\n    width: '1em',\n    marginLeft: 5,\n  },\n  httpIcon: {\n    height: '1em',\n    width: '1em',\n    marginLeft: 5,\n    filter: `grayscale(1)`,\n  },\n}));\n\nfunction Product({ product, unknown }) {\n  const classes = useStyles();\n\n  const { name, desc, website, customAdaptor } = product;\n\n  const logo = Images[camelCase(name)];\n\n  return (\n    <Card raised>\n      <CardHeader\n        className={classes.header}\n        title={\n          <Link\n            href={website}\n            target=\"_blank\"\n            text={\n              logo ? (\n                <img src={logo} alt={name} className={classes.logo} />\n              ) : (\n                <div>\n                  {name && (\n                    <span>\n                      {name}&nbsp;\n                      <ExitToAppIcon fontSize=\"small\" />\n                    </span>\n                  )}\n                </div>\n              )\n            }\n          />\n        }\n      />\n      <CardContent>\n        <Typography>{desc}</Typography>\n      </CardContent>\n      <CardActions>\n        {!unknown ? (\n          <Tooltip\n            title={`Connect to ${name} using our ${\n              customAdaptor\n                ? `custom language-${customAdaptor} adaptor.`\n                : 'universal HTTP and direct database adaptors.'\n            }`}\n          >\n            <Button\n              href={`https://www.github.com/openfn/language-${\n                customAdaptor || 'http'\n              }`}\n              target=\"_blank\"\n              startIcon={\n                <img\n                  src={Images.sqLogoGradient}\n                  alt=\"OpenFn Adaptor\"\n                  className={\n                    customAdaptor ? classes.adaptorIcon : classes.httpIcon\n                  }\n                />\n              }\n            >\n              <span style={{ fontVariant: 'small-caps' }}>\n                {customAdaptor ? 'native' : 'universal'}\n              </span>\n            </Button>\n          </Tooltip>\n        ) : (\n          <Button\n            href={website}\n            target=\"_blank\"\n            endIcon={<ExitToAppIcon fontSize=\"inherit\" />}\n          >\n            {name}\n          </Button>\n        )}\n      </CardActions>\n    </Card>\n  );\n}\n\nProduct.propTypes = {\n  product: PropTypes.object.isRequired,\n  unknown: PropTypes.bool,\n};\n\nProduct.defaultProps = {\n  unknown: false,\n};\n\nexport default React.memo(Product);\n","import React, { useEffect, useState } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport { camelCase, isEqual, orderBy, uniqBy } from 'lodash';\nimport {\n  Checkbox,\n  FormControlLabel,\n  Grid,\n  Button,\n  FormGroup,\n  Typography,\n  TextField,\n  Tooltip,\n  InputAdornment,\n} from '@material-ui/core';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n  ExitToApp as ExitToAppIcon,\n  SearchOutlined as SearchIcon,\n} from '@material-ui/icons';\nimport Banner from './Banner';\nimport Feature from './Feature';\nimport { fetchProducts } from '../actions/ProductActions';\nimport ProductItem from './ProductItem';\nimport Loader from '../components/Loader';\nimport MasonryWrapper from '../components/MasonryWrapper';\nimport { getAdaptors } from '../actions/JobActions';\n\nconst SearchTooltip = withStyles(() => ({\n  tooltip: {\n    maxWidth: 600,\n    textAlign: 'center',\n  },\n}))(Tooltip);\n\nfunction ProductsList() {\n  const [filter, setFilter] = useState('');\n  const [onlyNative, setOnlyNative] = useState(false);\n\n  const handleChange = _event => {\n    setOnlyNative(!onlyNative);\n  };\n\n  const dispatch = useDispatch();\n\n  const makeSearchStrings = str => [\n    str,\n    str.toLowerCase(),\n    camelCase(str),\n    camelCase(str).toLowerCase(),\n  ];\n\n  const adaptors = useSelector(state =>\n    Object.values(state.adaptors.items)\n  ).map(a => ({\n    ...a,\n    strings: [\n      ...new Set([\n        ...makeSearchStrings(a.name),\n        ...makeSearchStrings(a.module),\n      ]),\n    ],\n  }));\n\n  const customAdaptor = productNames => {\n    const match = adaptors.find(a =>\n      productNames.some(name => a.strings.includes(name))\n    );\n\n    if (match) return match.module;\n\n    return undefined;\n  };\n\n  const products = useSelector(state => Object.values(state.products.items))\n    .map(p => ({\n      ...p,\n      strings: [...new Set([...makeSearchStrings(p.name)])],\n    }))\n    .map(p => ({\n      ...p,\n      customAdaptor: customAdaptor(p.strings),\n    }));\n\n  const cards = orderBy(\n    [\n      ...products,\n      ...adaptors\n        .filter(a => !products.some(p => a.module === p.customAdaptor))\n        .map(a => ({\n          name: a.name,\n          strings: a.strings,\n          desc: `A custom OpenFn adaptor has been built for \"${a.name}\", but we don't yet have a product marketing description on this list. Check out the adaptor for details.`,\n          customAdaptor: a.module,\n          website: `https://www.github.com/openfn/language-${a.module}`,\n        })),\n    ],\n    [c => c.name.toLowerCase()]\n  );\n  const handleFilterChange = e => {\n    setFilter(e.target.value.toLowerCase());\n  };\n\n  function includesText(card) {\n    return (\n      card.strings.includes(filter.trim()) ||\n      card.strings.includes(camelCase(filter)) ||\n      card.website.toLowerCase().includes(filter.trim()) ||\n      card.desc.toLowerCase().includes(filter.trim())\n    );\n  }\n\n  const displayList = cards.filter(includesText).filter(x => {\n    if (!onlyNative) return true;\n    return x.customAdaptor;\n  });\n\n  const filterHasExactMatch =\n    displayList.some(c => c.strings.includes(filter.trim())) ||\n    displayList.some(c => c.strings.includes(camelCase(filter)));\n\n  useEffect(() => {\n    document.title = 'Connected Applications - OpenFn';\n    dispatch(fetchProducts());\n    dispatch(getAdaptors());\n  }, [dispatch]);\n\n  const showUnknown =\n    products.length !== 0 && filter !== '' && !filterHasExactMatch;\n\n  return (\n    <div>\n      <Banner\n        title=\"Apps & Adaptors\"\n        subtitle={\n          <div>\n            Connect <em className=\"white\">anything.</em> Native adaptors for key\n            ICT4D apps, DPGs and databases.\n            <br />\n            Universal adaptors for everything else. Here are just a few\n            suggestions.\n          </div>\n        }\n      />\n      <Feature gray>\n        <Grid\n          container\n          justifyContent=\"center\"\n          style={{ display: 'flex' }}\n          spacing={3}\n        >\n          <Grid item xs={12}>\n            <SearchTooltip\n              placement=\"top\"\n              title={\n                <div>\n                  <Typography variant=\"h6\">Search suggested apps</Typography>\n                  <Typography>\n                    Out of the box, OpenFn can integrate with any web\n                    application. To get your creative juices flowing, here are a\n                    few examples from the ICT4D community.\n                  </Typography>\n                </div>\n              }\n            >\n              <TextField\n                id=\"search\"\n                fullWidth\n                label=\"Search suggested applications\"\n                type=\"search\"\n                onChange={handleFilterChange}\n                margin=\"normal\"\n                InputProps={{\n                  startAdornment: (\n                    <InputAdornment position=\"start\">\n                      <SearchIcon />\n                    </InputAdornment>\n                  ),\n                }}\n                value={filter || ''}\n              />\n            </SearchTooltip>\n          </Grid>\n          <Grid item xs={12} style={{ display: 'contents' }}>\n            <FormGroup row>\n              <Tooltip title=\"Browse, use, and contribute to the full list of open-source OpenFn adaptors\">\n                <Button\n                  href=\"https://github.com/orgs/OpenFn/repositories?q=language-&type=public&language=&sort=\"\n                  target=\"_blank\"\n                  color=\"primary\"\n                  variant=\"contained\"\n                  size=\"small\"\n                  endIcon={<ExitToAppIcon fontSize=\"inherit\" />}\n                  style={{ marginRight: '2em' }}\n                >\n                  See More OpenFn Adaptors\n                </Button>\n              </Tooltip>\n              <Tooltip title=\"Only show apps with native adaptors that have been pre-loaded on the OpenFn.org SaaS\">\n                <FormControlLabel\n                  control={\n                    <Checkbox\n                      checked={onlyNative}\n                      onChange={() => handleChange()}\n                      name=\"nativeAdaptorsOnly\"\n                      color=\"primary\"\n                    />\n                  }\n                  label=\"Show apps with pre-loaded, custom adaptors\"\n                />\n              </Tooltip>\n            </FormGroup>\n          </Grid>\n        </Grid>\n      </Feature>\n      <Feature>\n        {products.length === 0 && <Loader item=\"example applications\" />}\n        <MasonryWrapper>\n          {displayList.map(product => (\n            <ProductItem product={product} key={product.id} />\n          ))}\n          {showUnknown && (\n            <ProductItem\n              unknown\n              key=\"unknown\"\n              product={{\n                name: `${filter}`,\n                website: `https://www.google.com/search?q=${filter}+REST+API`,\n                desc: onlyNative\n                  ? 'You can likely connect via a universal OpenFn adaptors, but right now this list is filtered to only show apps with custom-built, pre-loaded adaptors on the OpenFn SaaS.'\n                  : `Trying to connect with ${filter}? For ease of integration with\n                    OpenFn, check to make sure that ${filter} has an API by\n                    following clicking the link button on this card.`,\n              }}\n            />\n          )}\n        </MasonryWrapper>\n      </Feature>\n    </div>\n  );\n}\n\nexport default ProductsList;\n","import React, { useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Grid from '@material-ui/core/Grid';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardMedia from '@material-ui/core/CardMedia';\nimport Typography from '@material-ui/core/Typography';\nimport Images from '../helpers/imagePaths';\nimport Banner from './Banner';\nimport Feature from './Feature';\nimport SocialStories from './SocialStories';\nimport { fetchBlogPosts } from '../actions/BlogActions';\nimport BlogItem from './BlogItem';\nimport { selectBlogPosts } from '../selectors';\n\nconst styles = theme => ({\n  item: {\n    width: 'inherit',\n  },\n  root: {\n    background: theme.palette.offWhite,\n    cursor: 'pointer',\n    display: 'flex',\n    'justify-content': 'space-between',\n    height: 100,\n  },\n  icon: {\n    width: 100 / 2,\n    height: 123 / 2,\n  },\n  media: {\n    height: 300,\n  },\n});\n\nfunction Solutions(props) {\n  const { classes } = props;\n\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    document.title = 'Solution Overviews - OpenFn';\n    dispatch(fetchBlogPosts(['blog']));\n  }, []);\n\n  const { blogPosts } = useSelector(selectBlogPosts);\n\n  const solutions = [\n    {\n      name: 'Business Process & Workflow Automation',\n      url: 'https://solutions.openfn.org/workflow-automation',\n    },\n    {\n      name: 'Data Integration & Interoperability',\n      url: 'https://solutions.openfn.org/data-integration',\n    },\n    {\n      name: 'Data Cleaning Pipeline',\n      url: 'https://solutions.openfn.org/data-cleaning',\n    },\n    {\n      name: 'Data Sharing & Reporting',\n      url: 'https://solutions.openfn.org/data-sharing',\n    },\n    {\n      name: 'Data Warehouse & Analytics',\n      url: 'https://solutions.openfn.org/data-warehouse',\n    },\n    {\n      name: 'Legacy Systems Integration',\n      url: 'https://solutions.openfn.org/systems-sync',\n    },\n  ];\n\n  return (\n    <div>\n      <Banner title=\"Solutions. Delivered.\" />\n      <Feature>\n        <Typography variant=\"h4\">\n          Quick, shareable explanations of the most powerful solutions we\n          deliver for the ICT4D sector.\n        </Typography>\n        <br />\n        <Typography>\n          Whether it&apos;s task automation, data integration, data cleaning,\n          data warehousing, data validation, legacy systems syncing,\n          interoperability, or data sharing/reporting, you can make it happen\n          automatically and save time and money. That means better data gets\n          into the hands of decision makers, faster. Download and share\n          overviews of some of OpenFn&apos;s most common solutions.\n        </Typography>\n        <br />\n        <br />\n        <Grid container direction=\"row\" justifyContent=\"center\" spacing={2}>\n          {solutions.map(x => (\n            <Grid key={x.url} item sm={6} md={4} className={classes.item}>\n              <Card\n                raised\n                className={classes.root}\n                onClick={() => window.open(x.url, x.url)}\n              >\n                <CardContent>\n                  <Typography component=\"h6\">{x.name}</Typography>\n                  <Typography variant=\"subtitle1\" color=\"textSecondary\">\n                    Solutions from OpenFn\n                  </Typography>\n                </CardContent>\n                <CardContent>\n                  <CardMedia\n                    className={classes.icon}\n                    image={Images.pdf}\n                    title={x.name}\n                  />\n                </CardContent>\n              </Card>\n            </Grid>\n          ))}\n        </Grid>\n        <br />\n      </Feature>\n      <Feature\n        gray\n        intro=\"Read the latest cases studies from the blog and our clients.\"\n      >\n        <Grid container spacing={4}>\n          {blogPosts.map(post => (\n            <BlogItem key={post.guid} post={post} />\n          ))}\n        </Grid>\n      </Feature>\n      <SocialStories\n        alternate\n        title=\"Or read on to explore selected case studies...\"\n      />\n      <Feature>\n        <Card id=\"ibm-maximo\">\n          <CardMedia className={classes.media} image={Images.airport} />\n          <CardContent>\n            <Typography gutterBottom variant=\"h5\" component=\"h2\">\n              Helping an airport soar: Synchronizing asset data between the\n              tarmac and HQ\n              <br />\n              <small>An international airport, USA</small>\n            </Typography>\n            <Typography component=\"span\">\n              <h4>The Problem</h4>\n              <p>\n                An international American airport that serves 18 million\n                passengers and 180,000 aircraft operations annually manages an\n                extensive network of assets, including heavy machinery, across a\n                large area with intermittent network coverage. To comply with\n                FAA requirements, the airport conducts regular walk-downs in\n                which field staff rigorously document each asset and flag and\n                photograph required repairs. The airport uses IBM Maximo EAM to\n                manage assets and schedule repairs at HQ and CommCare to capture\n                asset and work order data offline on the tarmac.\n              </p>\n              <p className=\"emphasis\">\n                They relied on a manual process to transfer data between the two\n                tools, wasting time and money and risking errors.\n              </p>\n              <br />\n              <h4>The Solution</h4>\n              <p>\n                The airport uses OpenFn to integrate the two tools. This\n                integrated asset management system saves time, money, and\n                prevents errors by reducing manual, paper-based data transfer\n                between systems. It also enables field and HQ staff to each use\n                the tool that suits them best. On the tarmac, field staff use an\n                intuitive mobile tool to receive new maintenance orders from HQ,\n                document assets, and report and photograph required maintenance.\n                Updates to assets and required maintenance are automatically\n                pushed up to HQ staff who can then use a leading industry tool\n                to store asset data, schedule maintenance, and perform\n                performance analysis.\n              </p>\n            </Typography>\n          </CardContent>\n          <CardActions>\n            <Button\n              color=\"secondary\"\n              target=\"_blank\"\n              href=\"https://twitter.com/intent/tweet?text=Check%20out%20how%20@openfn%20connects%20key%20systems%20for%20an%20international%20airport%20https://www.openfn.org/solutions\"\n              rel=\"noopener noreferrer\"\n            >\n              Share\n            </Button>\n          </CardActions>\n        </Card>\n      </Feature>\n    </div>\n  );\n}\n\nSolutions.propTypes = {\n  classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles, {\n  withTheme: true,\n  name: 'App',\n})(Solutions);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Grid, Typography, makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n  face: {\n    maxWidth: '100%',\n    maxHeight: '100%',\n  },\n  title: {\n    color: theme.palette.grey[500],\n  },\n  bio: {\n    textAlign: 'justify',\n  },\n}));\n\nfunction Profile({ name, title, bio, image, id }) {\n  const classes = useStyles();\n  return (\n    <div id={id}>\n      <Grid container spacing={4}>\n        <Grid item xs={12} sm={3}>\n          <img src={image} alt={name} className={classes.face} />\n        </Grid>\n        <Grid item xs={12} sm={9}>\n          <Typography variant=\"h4\">\n            {name}\n            &nbsp;\n            <small className={classes.title}>{title}</small>\n          </Typography>\n          <br />\n          <Typography className={classes.bio}>{bio}</Typography>\n        </Grid>\n      </Grid>\n    </div>\n  );\n}\n\nProfile.propTypes = {\n  name: PropTypes.string.isRequired,\n  bio: PropTypes.object.isRequired,\n  title: PropTypes.string.isRequired,\n  image: PropTypes.string.isRequired,\n};\n\nexport default Profile;\n","import React, { useEffect } from 'react';\nimport { Container, Grid, makeStyles } from '@material-ui/core';\nimport Link from '../components/Link';\nimport Images from '../helpers/imagePaths';\nimport Banner from './Banner';\nimport Profile from './Profile';\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    paddingTop: theme.spacing(2),\n    paddingBottom: theme.spacing(8),\n  },\n  profile: {\n    padding: theme.spacing(6),\n  },\n}));\n\nfunction Team() {\n  const classes = useStyles();\n  useEffect(() => {\n    document.title = 'Team - OpenFn';\n  }, []);\n\n  return (\n    <span>\n      <Banner title=\"Our Team\" />\n      <Container className={classes.root}>\n        <br />\n        <br />\n        <Grid container justifyContent=\"center\" spacing={6}>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"aissatou\"\n              name=\"Aissatou Diallo\"\n              title=\"Implementation Consultant\"\n              bio={\n                <span>\n                  Aissatou supports Open Function Group partners with solution\n                  design and implementation.\n                  <br />\n                  <br />\n                  Before joining OpenFn, she was a Senior Consultant at IBM\n                  working directly with federal clients in Washington, DC. In\n                  this role, she supported the integration and modernization of\n                  key government applications through requirements gathering and\n                  analysis, as well as functional and performance testing.\n                  <br />\n                  <br />\n                  She holds a B.A in Computer Science and a Minor in African\n                  Studies from Georgetown University. She is currently also a\n                  graduate student at Indiana University&apos;s Kelley School of\n                  Business, pursuing an MS in Information Technology Management.\n                  Aissatou is based in Conakry.\n                </span>\n              }\n              image={Images.aissatou}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"aleksa\"\n              name=\"Aleksa Krolls\"\n              title=\"Chief Customer Officer, Co-founder\"\n              bio={\n                <span>\n                  Aleksa oversees adoption, implementation, and customer success\n                  at Open Function Group. She works closely with our strategic\n                  partners and implementing consultants to help define business\n                  requirements and to design and implement workflow automation\n                  solutions with a focus on security, local capacity building,\n                  and planning for scale—ultimately ensuring the long-term\n                  impact of OpenFn implementations.\n                  <br />\n                  <br />\n                  She has helped dozens of social impact organizations navigate\n                  the technology for development/ICT4D landscape, and has direct\n                  experience implementing technologies including Salesforce,\n                  Kobo Toolbox, Open Data Kit, CommCare, TaroWorks, Telerivet\n                  SMS, PowerBI, MPESA, and more. Prior to OpenFn, Aleksa worked\n                  at Vera Solutions from the Cape Town and Mumbai hubs, managing\n                  a global portfolio of support projects and consulting with\n                  more than 50 organizations on technology selection and\n                  implementation success strategies. While based in Riga, she\n                  conducted data management training sessions for small\n                  businesses in Latvia and South Africa. Before her consulting\n                  career, Aleksa was an early team member of the{' '}\n                  <Link\n                    color=\"primary\"\n                    text=\"Red Cross Universal App Program\"\n                    href=\"https://preparecenter.org/toolkit/universal-app-program-toolkit/\"\n                  />{' '}\n                  and supported 40 country teams to implement mobile technology\n                  for first aid and disaster preparedness education. She holds a\n                  BS in Foreign Service from Georgetown University, and is based\n                  in Riga, Latvia. Follow her on twitter{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://twitter.com/aleksa_krolls\"\n                    text=\"@aleksa_krolls\"\n                  />\n                  .\n                </span>\n              }\n              image={Images.aleksa}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"ben\"\n              name=\"Benedictus Yevu\"\n              title=\"Software Engineer\"\n              bio={\n                <span>\n                  Benedictus is an Elixir/Phoenix engineer whose primary focus\n                  is OpenFn Lightning.\n                  <br />\n                  <br />\n                  He has been building and maintaining robust Elixir/Erlang OTP\n                  systems since 2016 and is passionate about creating solutions\n                  that truly fit the needs they&apos;re meant to address. He has\n                  extensive experience in React and Phoenix LiveView, and from\n                  the the front-end to the back-end he&apos;s always committed\n                  to great user <em>and developer!</em> experience.\n                  <br />\n                  <br />\n                  Bachelor of Science in Computer Science from Kwame Nkrumah\n                  University of Science And Technology, Kumasi, Ghana (Completed\n                  in Nov 2019).\n                  <br />\n                  <br />\n                  He is based in Accra, Ghana.\n                </span>\n              }\n              image={Images.ben}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"elias\"\n              name=\"Elias W. BA\"\n              title=\"Software Engineer\"\n              bio={\n                <span>\n                  Elias focuses on adaptors and converting client requirements\n                  into data transformation in OpenFn jobs. He also works on the\n                  aspects of the platform that support job writing and project\n                  configuration. He is also a obsessed with automating his daily\n                  tasks, finding the simplest of possible solutions, and the\n                  quest for efficiency in collaborative work.\n                  <br />\n                  <br />\n                  He is a supporter of the open-source movement and has a deep\n                  interest in natural computing algorithms, machine learning,\n                  statistics, and probability. He strongly believes that\n                  advances in AI and data processing will provide great\n                  opportunities for solving Africa&apos;s biggest\n                  challenges—such as linguistic barriers and youth education.\n                  Elias teaches mathematics and computer programming.\n                  <br />\n                  <br />\n                  In 2018 he co-founded a community of african researchers,\n                  teachers, students and entrepreneurs that come together to use\n                  cutting edge technologies like ML, connected devices and\n                  blockchain for solving local african problems. That community,{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://galsen.ai\"\n                    text=\"GalsenAI\"\n                  />\n                  , now has more that 3500 active members and has run more than\n                  12 social projects in 2 years. He is based in Dakar and you\n                  can follow him on twitter{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://twitter.com/eliaswalyba\"\n                    text=\"@eliaswalyba\"\n                  />\n                  .\n                </span>\n              }\n              image={Images.elias}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"isma\"\n              name=\"Isma-ilou Sadou\"\n              title=\"ML Engineer\"\n              bio={\n                <span>\n                  Isma is driving the development of build-time AI-generated\n                  adaptors workflow code. He is passionate about technology and\n                  its inner workings, finding joy in creating impactful\n                  solutions.\n                  <br />\n                  <br />\n                  In 2022, he co-founded HISMA Association, a non-profit\n                  organization focused on empowering vulnerable communities in\n                  northern Cameroon through impactful eye care and education\n                  initiatives. Together with their dedicated partners, HISMA has\n                  successfully conducted, and continues to engage in free\n                  surgery campaigns, extensive awareness programs, training for\n                  community health workers, and provision of educational\n                  scholarships to children.\n                  <br />\n                  <br />\n                  He began his career in full-stack web development before\n                  transitioning to machine learning. He has a robust background\n                  spanning diverse ML projects encompassing autonomous driving,\n                  embedded AI, and cloud-based LLMs, he showcases a strong\n                  penchant for versatility and an insatiable curiosity.\n                  Furthermore, he actively contributes to research, notably\n                  publishing work on inference time reduction, thereby\n                  contributing to the evolving landscape of AI.\n                  <br />\n                  <br />\n                  Isma holds an M.Sc. in Embedded Systems, specializing in\n                  Artificial Intelligence, and a minor in Innovation and\n                  Entrepreneurship from the European Institute of Technology (TU\n                  Berlin & KTH Stockholm). He is based in Hamburg.\n                </span>\n              }\n              image={Images.isma}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"joe\"\n              name=\"Joe Clark\"\n              title=\"Principal Engineer\"\n              bio={\n                <span>\n                  Joe is a JavaScript and Typescript specialist, focusing on the\n                  tools that allow users to build, execute, and debug workflows\n                  and adaptors in a secure NodeJs environment.\n                  <br />\n                  <br />\n                  As a JavaScript engineer for the last 16 years, change is in\n                  Joe&apos;s blood. He learned to code in Java at the University\n                  of Sussex, UK, where he studied Artificial Intelligence. In\n                  industry he has worked on language grammars, syntactic and\n                  semantic code analysis, natural language generation and data\n                  visualisation, as well as rich front ends in frameworks from\n                  Dojo to React.\n                  <br />\n                  <br />\n                  The uniting factor in Joe&apos;s work is a passion for\n                  providing delightful user experiences, whether in a web page,\n                  visualisation or command-line tool.\n                </span>\n              }\n              image={Images.joe}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"mtuchi\"\n              name=\"Emmanuel Evance\"\n              title=\"Software Engineer\"\n              bio={\n                <span>\n                  Emmanuel focuses on design, development, and testing work\n                  related to the OpenFn adaptors, jobs and platform. He works\n                  with clients and the services team to convert functional\n                  requirements into clean, manageable operations, extending the\n                  utility of their integrations.\n                  <br />\n                  <br />\n                  He is currently part of the organizing committee of{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://pycon.or.tz/about/\"\n                    text=\"PyCon Tanzania\"\n                  />\n                  , where he shares his passion and support for the open-source\n                  movement by bringing the Python community together to share\n                  different real-world use cases of the programming language.\n                  <br />\n                  <br />\n                  Before joining OpenFn, he co-founded a software startup called{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://irabu.co.tz/\"\n                    text=\"irabu\"\n                  />{' '}\n                  and served as Operation lead for his last 2 years. irabu\n                  remains with the mission to build simple and valuable\n                  solutions for SMEs, having designed and built a digital\n                  solutions called{' '}\n                  <Link color=\"primary\" href=\"http://uza.co.tz\" text=\"UZA\" />. A\n                  SaaS product that gives SMEs power to market, sell, and retain\n                  customers with less friction. He also worked at{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://codeforafrica.org/\"\n                    text=\"Code for Tanzania\"\n                  />{' '}\n                  where he was leading the{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"http://sensosr.africa\"\n                    text=\"sensors.Africa\"\n                  />{' '}\n                  initiative seeks to address data gaps by providing low-cost\n                  sensors, which people can use to measure and monitor the\n                  quality of the air and water in their communities.\n                  <br />\n                  <br />\n                  Emmanuel is based in Arusha, Tanzania and you can follow him\n                  on{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://twitter.com/mtuchidev\"\n                    text=\"@mtuchidev\"\n                  />\n                  .\n                </span>\n              }\n              image={Images.mtuchi}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"nick\"\n              name=\"Nick McCreath\"\n              title=\"Chief Product Officer\"\n              bio={\n                <span>\n                  Nick leads OpenFn&apos;s product strategy, collaborating\n                  closely with the team to create solutions that both empower\n                  and delight our users. As Chief Product Officer, Nick is\n                  committed to developing a powerful and user-friendly platform\n                  that caters to the diverse needs of all OpenFn users.\n                  <br />\n                  <br />\n                  Before joining OpenFn, Nick headed up lead the product team at{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"http://groovehq.com/\"\n                    text=\"GrooveHq.com\"\n                  />{' '}\n                  as CPO & Co-founder. His extensive experience includes serving\n                  as a CPO for multiple venture-backed startups across Germany\n                  and South East Asia. Notably, Nick played a pivotal role in\n                  the growth of Web Africa, where he held the position of Head\n                  of Product and contributed to its transformation into\n                  Africa&apos;s largest independent ISP.\n                  <br />\n                  <br />\n                  Nick&apos;s academic background includes a degree in Software\n                  Engineering. He has been a certified agile practitioner since\n                  2007 and maintains multiple specializations and certifications\n                  in usability and user experience through Human Factors\n                  International.\n                </span>\n              }\n              image={Images.nick}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"rita\"\n              name=\"Rita Zágoni\"\n              title=\"Implementation Consultant\"\n              bio={\n                <span>\n                  Rita supports Open Function Group&apos;s partners in\n                  implementation planning and capacity building. Her focus is on\n                  how organizations build towards long-term (i.e.,{' '}\n                  <em>flexible</em>) interoperability in a sustainable way.\n                  <br />\n                  <br />\n                  She is the co-founder of the data training and consulting\n                  agency{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://fringegraph.com/\"\n                    text=\"Fringe Graph\"\n                  />\n                  , a firm dedicated to making technology more accessible for\n                  social impact organisations. She has trained a wide range of\n                  non-profit organisations, journalists, and researchers on data\n                  literacy, analysis and visualisation with a focus on achieving\n                  lasting personal, organisational and social impact. Before\n                  joining OpenFn she led the data and technology implementation\n                  work at Africa&apos;s Voices Foundation. She holds and MA in\n                  Philosophy from the Eotvos Lorand University in Hungary. She\n                  is based in Nairobi and tweets intermittently as{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://twitter.com/@ritazagoni\"\n                    text=\"@ritazagoni\"\n                  />\n                  .\n                </span>\n              }\n              image={Images.rita}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"rory\"\n              name=\"Rory McKinley\"\n              title=\"Monitoring, Observability &amp; Security Lead\"\n              bio={\n                <span>\n                  Rory focuses on the tools and processes that enable security,\n                  stability, and scalability—<em>S3</em>—at OpenFn. His work in\n                  testing cuts across our platform and open-source technologies.\n                  <br />\n                  <br /> Rory is a full-stack systems developer with over 16\n                  years of experience. He thrives when problem solving, has a\n                  penchant for Elixir, Erlang, and Ruby, and loves\n                  teaching—particularly things like TDD and Scrum. After 7 years\n                  working in telecommunications engineering, he started work at\n                  Hetzner to join them in a long journey of improving systems\n                  quality. This would see the introduction of technologies such\n                  as Ruby, NodeJS, Clojure, and Elixir. It involved agile\n                  software development, instituting better code deployment\n                  practices, improved code quality, automated testing and\n                  devops. Follow him on twitter{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://twitter.com/rorymckinley\"\n                    text=\"@rorymckinley\"\n                  />\n                  .\n                </span>\n              }\n              image={Images.rory}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"santosh\"\n              name=\"Santosh Sewlal\"\n              title=\"Data and Analytics Lead\"\n              bio={\n                <span>\n                  Santosh focuses on databases across OpenFn&apos;s cloud-hosted\n                  deployments, leads our data warehousing, analytics and Google\n                  BigQuery work, and advises on local-deployment database\n                  options for enterprise clients.\n                  <br />\n                  <br />\n                  He specializes in Postgres, Oracle, IBM, Microsoft, and\n                  SQL-based technologies and adds more than two decades years of\n                  high-performance, large-scale database focus/DBA experience to\n                  our team. He has worked in the financial sector and the\n                  telecommunications sector, where database security is\n                  paramount, for firms such as Standard Bank and T-Systems. He\n                  is most passionate about our work in education and public\n                  health. Santosh doesn&apos;t tweet.\n                </span>\n              }\n              image={Images.santosh}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"roger\"\n              name=\"Rogerio Pontual\"\n              title=\"Principal Engineer\"\n              bio={\n                <span>\n                  Rogerio focuses application strategy, architecture, and\n                  development for OpenFn Lightning.\n                  <br />\n                  <br />\n                  He began his career in 2001 and has been working with Elixir\n                  and Erlang since 2018. He has honed a deep interest in highly\n                  available, fault-tolerant systems. He believes in brining\n                  great care and attention to all aspects of the secure software\n                  development lifecycle. Lately he has been involved with\n                  decentralized architectures such as blockchains and dreams\n                  about developing software that can impact many lives and\n                  support diverse communities to help them preserve nature.\n                  <br />\n                  <br />\n                  He holds an BA in Computer Engineering, he has taken some\n                  cloud certifications targeting software scalability while\n                  enjoying life in Lisbon.\n                </span>\n              }\n              image={Images.roger}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"stuart\"\n              name=\"Stuart Corbishley\"\n              title=\"Chief Technology Officer, Co-founder\"\n              bio={\n                <span>\n                  Stuart oversees technology at Open Function Group. He focuses\n                  on our approach to application development, leads our\n                  engineering team, and is responsible for the architectural\n                  design of OpenFn&apos;s key products—how they fit together\n                  with each other and the rest of the digital public goods\n                  ecosystem.\n                  <br />\n                  <br />\n                  He is an experienced software developer with a passion for\n                  architecture, bug hunting and performance of web applications.\n                  Over his career he has developed skills in systems\n                  integration, scaling, automation, testing, problem solving &\n                  project management. He is fond of Phoenix, Elixir, Ruby,\n                  Javascript, automated testing and solving problems. He was a\n                  member of the lead engineers for the Gauteng Online project,\n                  an ambitious government endeavour providing 2300 schools in\n                  the Gauteng with computers and internet. It resulted in one of\n                  the largest wireless mesh networks in the world, and providing\n                  over two-hundred thousand students with internet access. All\n                  using Ubuntu and open source technologies. He is a frequent\n                  speaker at RubyFuza and has worked with Railsbridge Cape Town;\n                  an initiative to improve the diversity of the software\n                  industry by providing a safe space for women and their friends\n                  to learn how to code. Follow him on twitter{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://twitter.com/stucorbishley\"\n                    text=\"@stucorbishley\"\n                  />\n                  .\n                </span>\n              }\n              image={Images.stu}\n            />\n          </Grid>\n          <Grid item className={classes.profile}>\n            <Profile\n              id=\"taylor\"\n              name=\"Taylor Downs\"\n              title=\"Chief Executive Officer, Founder\"\n              bio={\n                <span>\n                  Taylor oversees partnerships and strategy at Open Function\n                  Group and is responsible for the long-term sustainability of\n                  the solutions we provide—strengthening digital public goods\n                  and digital public Infrastructure while delivering more\n                  efficient and effective health & humanitarian services in\n                  under-resourced settings.\n                  <br />\n                  <br />\n                  He is a{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://www.atlanticfellows.org/for-social-and-economic-equity/\"\n                    text=\"Senior Atlantic Fellow for Social & Economic Equity\"\n                  />\n                  . He received the first annual Harvard SECON Social Impact\n                  Award and the 2017{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"http://blog.tides.org/2017/02/28/tides-awards-10000-2017-pizzigati-prize-to-software-developer-taylor-downs/\"\n                    text=\"Pizzigati Prize\"\n                  />{' '}\n                  for Software Development in the Public Interest. He was named\n                  to{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"http://www.forbes.com/pictures/ekeg45kfk/taylor-downs-zak-kaufman-karti-subramanian-26-26-27/\"\n                    text=\"Forbes’ 30 under 30 list\"\n                  />\n                  , is a 2012{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"http://www.echoinggreen.org/\"\n                    text=\"Echoing Green Fellow\"\n                  />\n                  , a 2014{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"http://mulagofoundation.org/\"\n                    text=\"Rainer Arnhold Fellow\"\n                  />\n                  , and a 2015{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"http://poptech.org/class_of_2015\"\n                    text=\"PopTech Fellow\"\n                  />\n                  . He serves as an advisor to the Technical, Product, and\n                  Architecture Committees for the ITU/GIZ/DIAL-lead{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://www.govstack.global/\"\n                    text=\"GovStack\"\n                  />{' '}\n                  initiative, accelerating the digital transformation of\n                  government services through the adoption of digital public\n                  goods.\n                  <br />\n                  <br />\n                  Before starting OpenFn, he co-founded{' '}\n                  <Link\n                    href=\"https://www.verasolutions.org\"\n                    text=\"Vera Solutions\"\n                    color=\"primary\"\n                  />{' '}\n                  and served as CEO for its first 4 years. Vera is a leader in\n                  the ICT4D space, an impact-first technology company with more\n                  than 100 employees and 300 implementations in 40+ countries.\n                  Before Vera, he lived and worked in a dozen countries in\n                  Africa while focusing on curriculum and M&E at a major\n                  public-health implementer and consulting on intervention\n                  design, training, and monitoring & evaluation with more than a\n                  dozen NGOs around Africa and Asia. He holds an MSc in\n                  inequalities and social sciences from the London School of\n                  Economics and Political Science with a focus on technology\n                  policy and a BA in religious studies with a focus on Tibetan\n                  Buddhism from Amherst College. You can follow him on twitter{' '}\n                  <Link\n                    color=\"primary\"\n                    href=\"https://twitter.com/taylordowns2000\"\n                    text=\"@taylordowns2000\"\n                  />\n                  .\n                </span>\n              }\n              image={Images.taylor}\n            />\n          </Grid>\n        </Grid>\n      </Container>\n    </span>\n  );\n}\n\nexport default React.memo(Team);\n","import React, { useEffect } from 'react';\nimport { Typography, makeStyles } from '@material-ui/core';\nimport { Link } from 'react-router-dom';\nimport { clickEvent } from '../helpers';\nimport Banner from './Banner';\nimport Feature from './Feature';\nimport ThirdPartyItem from './ThirdPartyItem';\n\nconst useStyles = makeStyles(theme => ({\n  list: {\n    '& li': {\n      paddingBottom: theme.spacing(2),\n    },\n  },\n}));\n\nfunction ThirdPartyList() {\n  const classes = useStyles();\n\n  useEffect(() => {\n    document.title = 'Third Party Providers - OpenFn';\n  }, []);\n\n  return (\n    <div>\n      <Banner title=\"External Service Providers\" />\n      <Feature\n        intro=\"Third Party Services at OpenFn\"\n        subtitle=\"Last Updated: June 20th, 2023\"\n      >\n        <Typography>\n          OpenFn, like most modern software offerings, entrusts certain aspects\n          of our offering (like web hosting, payment processing, etc.) to\n          third-party providers. We select these providers based on their\n          performance and their ongoing commitment to to data protection. For\n          the sake of full transparency, here&apos;s an alphabetical list of\n          every third-party provider we interact with to deliver our\n          platform-as-a-service offering:\n        </Typography>\n        <Typography>\n          <ol className={classes.list}>\n            <ThirdPartyItem\n              name=\"Digital Ocean\"\n              url=\"https://www.digitalocean.com/\"\n              description={\n                <span>\n                  hosts our status page, our community forum, and a small set of\n                  scripts we use to test continuously test and monitor the\n                  performance of OpenFn.org. It&apos;s important that we keep\n                  this on separate infrastructure from our main hosting\n                  providers so that we can detect problems and report on that\n                  provider.\n                </span>\n              }\n            />\n            <ThirdPartyItem\n              name=\"GitHub\"\n              url=\"https://github.com/\"\n              description={\n                <span>\n                  stores your job expressions (the actual scripts you define\n                  with steps and operations) if you have elected to use Github\n                  for version control. You choose the repository that stores\n                  your job data and manage security and access on that\n                  repository yourself. We also use GitHub to manage our own\n                  software development and deployment process.\n                </span>\n              }\n            />\n            <ThirdPartyItem\n              name=\"Google Analytics\"\n              url=\"https://analytics.google.com\"\n              description={\n                <span>\n                  helps us understand how people find our site, which pages are\n                  helpful, and how we can better attract similar organizations\n                  interested in data integration and automation. No individually\n                  identifiable information is sent to Google.\n                </span>\n              }\n            />\n            <ThirdPartyItem\n              name=\"Google Cloud Platform\"\n              url=\"https://cloud.google.com/\"\n              description={\n                <span>\n                  (GCP) is where we host our application and various supporting\n                  services. That means both data processing and storage take\n                  place within the secure Google cloud. We&apos;ve chosen GCP to\n                  run our core servers because of their commitment to trust,\n                  privacy, and compliance.\n                </span>\n              }\n            />\n            <ThirdPartyItem\n              name=\"Google reCAPTCHA\"\n              url=\"https://www.google.com/recaptcha/\"\n              description={\n                <span>\n                  helps us make that everyone who registers for OpenFn is a\n                  human. It captures a small amount of your browser data to\n                  ensure you&apos;re not a bot.\n                </span>\n              }\n            />\n            <ThirdPartyItem\n              name=\"Jira (Atlassian)\"\n              url=\"https://www.atlassian.com/software/jira\"\n              description={\n                <span>\n                  helps us manage support requests that are opened via the\n                  application. Our team responds to those requests via the Jira\n                  web app.\n                </span>\n              }\n            />\n            <ThirdPartyItem\n              name=\"Mailgun\"\n              url=\"https://www.mailgun.com/\"\n              description={\n                <span>\n                  allows us to send emails, like the registration confirmation\n                  message and failed-run notifications.\n                </span>\n              }\n            />\n            <ThirdPartyItem\n              name=\"Plausible Analytics\"\n              url=\"https://plausible.io/\"\n              description={\n                <span>\n                  helps us understand how people find our site, which pages are\n                  helpful, and how we can better attract similar organizations\n                  interested in data integration and automation. No individually\n                  identifiable information is sent to Plausible.\n                </span>\n              }\n            />\n            <ThirdPartyItem\n              name=\"Sentry.io\"\n              url=\"https://sentry.io/\"\n              description={\n                <span>\n                  helps us track errors in our platform—by sending a small bit\n                  of data from your browser when you encounter an error, it\n                  helps our developers instantly identify bugs and fix them.\n                </span>\n              }\n            />\n            <ThirdPartyItem\n              name=\"Stripe\"\n              url=\"https://stripe.com/\"\n              description={\n                <span>\n                  handles OpenFn&apos;s customer credit card information. We\n                  don&apos;t store your credit card data in our databases, but\n                  rather link securely to the industry standard credit card\n                  processing service. As it happens, Stripe has also put\n                  together an incredible resource on the GDPR and data\n                  protection. You can find it{' '}\n                  <a\n                    href=\"https://stripe.com/gb/guides/general-data-protection-regulation\"\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                  >\n                    here\n                  </a>\n                  .\n                </span>\n              }\n            />\n          </ol>\n        </Typography>\n        <Typography>\n          We strive for transparency and professionalism at OpenFn. If anything\n          here is unclear, if you have any questions, or if you&apos;d simply\n          like to talk about how we protect customer data, please don&apos;t\n          hesitate to contact us by emailing{' '}\n          <Link\n            to=\"mailto:legal@openfn.org\"\n            href=\"mailto:legal@openfn.org\"\n            onClick={() => clickEvent('Contact', 'Trust (Third Party List)')}\n          >\n            trust@openfn.org\n          </Link>\n          .\n        </Typography>\n      </Feature>\n    </div>\n  );\n}\n\nexport default React.memo(ThirdPartyList);\n","import React, { useEffect } from 'react';\nimport { makeStyles } from '@material-ui/core';\nimport { useHistory } from 'react-router-dom';\nimport Button from '@material-ui/core/Button';\nimport { linkTo } from '../helpers';\nimport Banner from './Banner';\nimport Feature from './Feature';\nimport imagePaths from '../helpers/imagePaths';\n\nconst useStyles = makeStyles(() => ({\n  image: {\n    maxWidth: '100%',\n    paddingTop: '2em',\n    paddingBottom: '2em',\n  },\n}));\n\nfunction What() {\n  const classes = useStyles();\n  const history = useHistory();\n  useEffect(() => {\n    document.title = 'Automation & Data Integration - OpenFn';\n  }, []);\n\n  return (\n    <div>\n      <Banner\n        title=\"Why OpenFn?\"\n        subtitle=\"Flexible, real-time data automation and integration—without\n            having to worry about security, stability, or scale.\"\n      />\n      <Feature\n        centered\n        intro={\n          <span>\n            You use more than one technology;\n            <br />\n            we make them talk to each other.\n          </span>\n        }\n        body={\n          <div>\n            Whether you&apos;re dealing with public health information systems,\n            facility registries, and national reporting databases, or CRMs,\n            ERPs, and supply chain management systems... they don&apos;t all\n            speak the same language, off-the-shelf plug-ins don&apos;t meet your\n            needs, and you don&apos;t want to sign an annual contract for\n            $50,000 for a product that takes 6 months to implement. This is\n            where Open Function comes in. OpenFn is an integration platform\n            designed for the social sector. We offer an affordable, scalable,\n            and secure infrastructure that can be used to quickly connect your\n            existing technologies and automate key workflows so that you\n            don&apos;t have to re-code the wheel.\n            <br />\n            <br />\n            <Button\n              color=\"secondary\"\n              size=\"large\"\n              variant=\"contained\"\n              onClick={linkTo('/how', history)}\n            >\n              How it works\n            </Button>\n          </div>\n        }\n      >\n        <img\n          src={imagePaths.diagramHumanitarian}\n          className={classes.image}\n          alt=\"CommCare and DHIS2, integrated\"\n        />\n      </Feature>\n      <Feature\n        centered\n        gray\n        intro=\"All the flex, without the fuss.\"\n        body={\n          <div>\n            OpenFn makes data integration easy. We take care of the\n            &quot;plumbing&quot; without sacrificing your flexibility. Use our\n            powerful data flow and task automation engine to precisely define\n            how your apps should connect and let our platform handle all of the\n            message processing, storage, routing, etc. When setting up automated\n            integrations involving multiple technologies, there are dozens of\n            things you need to get right. OpenFn takes care of the integration\n            “plumbing”, while leaving you in complete control of how you process\n            your data. You tell us how information should flow, how it should be\n            transformed via the web interface, and the platform takes care of\n            the rest.\n            <br />\n            <br />\n            You can&nbsp;&nbsp;\n            <Button\n              color=\"secondary\"\n              size=\"large\"\n              variant=\"contained\"\n              onClick={linkTo('/signup', history)}\n            >\n              Sign up\n            </Button>\n            &nbsp;&nbsp;for free and start integrating today.\n          </div>\n        }\n      />\n      <Feature\n        centered\n        intro=\"Enterprise-grade infrastructure.\"\n        body={\n          <div>\n            OpenFn harnesses the extreme scalability of the ErlangVM, Elixir,\n            and Phoenix behind an enterprise-grade load balancer to provide you\n            with world-class uptime, performance, reliability, and security.\n            You&apos;ve got enterprise grade infrastructure and a robust,\n            battle-tested platform at your fingertips to configure complex\n            integrations without the price of traditional corporate providers.\n            Don&apos;t settle for less.\n            <br />\n            <br />\n            <Button\n              color=\"secondary\"\n              size=\"large\"\n              variant=\"contained\"\n              onClick={linkTo('/trust', history)}\n            >\n              Trust and Reliability\n            </Button>\n          </div>\n        }\n      />\n      <Feature\n        gray\n        centered\n        intro=\"Automate without losing the ability to evolve.\"\n        body={\n          <div>\n            OpenFn enables you to choose and connect the tools, or apps that\n            best meet your needs. Use the applications that suit you best, and\n            swap out applications as your needs evolve. Connect your favorite\n            tools to OpenFn to automate the flow of data across your\n            organization in real-time. Integrate any tool with a REST endpoint\n            or a webhooks service. Make use of our ready-made connectors or\n            “language-packages” to quickly plug in common ICT4D tools like\n            DHIS2, ODK, CommCare, and M-Pesa.\n            <br />\n            <br />\n            <Button\n              variant=\"contained\"\n              color=\"secondary\"\n              size=\"large\"\n              onClick={linkTo('/apps', history)}\n            >\n              Connected Applications\n            </Button>\n          </div>\n        }\n      />\n      <Feature\n        centered\n        intro={\n          <span>\n            Make better decisions, <em>faster</em>.\n          </span>\n        }\n        body={\n          <div>\n            Data integration saves time and money. Get better data into the\n            hands of your decision-makers, faster. OpenFn has processed hundreds\n            of millions of lines of data for social impact partners around the\n            world, enabling them to do good, better. Learn more by reading some\n            our solution overviews and success stories below.\n            <br />\n            <br />\n            <Button\n              variant=\"contained\"\n              color=\"secondary\"\n              size=\"large\"\n              onClick={linkTo('/solutions', history)}\n            >\n              Solution Overviews\n            </Button>\n            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n            <Button\n              variant=\"contained\"\n              color=\"secondary\"\n              size=\"large\"\n              onClick={linkTo('/signup', history)}\n            >\n              Sign Up\n            </Button>\n          </div>\n        }\n      />\n    </div>\n  );\n}\n\nexport default React.memo(What);\n","import React from 'react';\nimport Banner from '../marketing/Banner';\nimport Feature from '../marketing/Feature';\n\nfunction IEWarning() {\n  return (\n    <div>\n      <Banner title=\"Using OpenFn\" />\n      <Feature\n        intro=\"Internet Explorer\"\n        body={\n          <div>\n            Unfortunately, using OpenFn requires a modern web browser and\n            Internet Explorer is not supported. For information on your current\n            browser and instructions on how to upgrade, please visit{' '}\n            <a\n              href=\"http://browser-update.org/update-browser.html\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              http://browser-update.org/update-browser.html\n            </a>\n            <br />\n            <br />\n            Apologies for the inconvenience. If you have any questions please\n            don&apos;t hesitate to reach out. You can email{' '}\n            <a href=\"mailto:admin@openfn.org\">admin@openfn.org</a> or initiate a\n            chat with us (with the yellow button in the lower right corner) and\n            we will get back to you as soon as posisble.\n          </div>\n        }\n      />\n    </div>\n  );\n}\n\nexport default React.memo(IEWarning);\n","import IEWarning from './IEWarning';\n\nexport default function RequireBrowser(Component) {\n  const isIE = /*@cc_on!@*/false || !!document.documentMode;\n  if (isIE) { return IEWarning; }\n  return Component;\n}","import React, { useEffect } from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport imagePaths from '../helpers/imagePaths';\nimport Banner from '../marketing/Banner';\nimport ClientLogos from '../marketing/ClientLogos';\nimport SignupForm from './SignupForm';\nimport { clickEvent } from '../helpers';\n\nfunction Signup() {\n  useEffect(() => {\n    document.title = 'Sign up - OpenFn';\n    clickEvent('Registration', 'visit_signup_page');\n  }, []);\n\n  return (\n    <div style={{ marginBottom: 32 }}>\n      <Banner\n        id=\"sign-up-banner\"\n        title=\"Sign up for free.\"\n        subtitle=\"Go live with an integration today.\"\n      />\n      <Grid\n        container\n        direction=\"row\"\n        justifyContent=\"center\"\n        alignItems=\"top\"\n        spacing={8}\n        style={{ padding: '4em' }}\n      >\n        <Grid item xs={12} sm={6} xl={4} id=\"sign-up-form-grid\">\n          <Typography variant=\"h5\">\n            We are no longer accepting new registrations on v1, but you can head\n            to OpenFn.org/register to create a free account on v2.\n          </Typography>\n        </Grid>\n      </Grid>\n    </div>\n  );\n}\n\nexport default Signup;\n","import React, { useEffect } from 'react';\nimport {\n  Avatar,\n  Button,\n  Card,\n  CardActions,\n  CardContent,\n  CardHeader,\n  Grid,\n  Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n  Security as SecurityIcon,\n  VerifiedUser as VerifiedUserIcon,\n} from '@material-ui/icons';\nimport { FORM_ERROR } from 'final-form';\nimport { isEqual } from 'lodash';\nimport { Field, Form } from 'react-final-form';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport { login } from '../actions/SessionActions';\nimport { recoverPassword } from '../actions/UserActions';\nimport imagePaths from '../helpers/imagePaths';\nimport FormActions from './FormActions';\nimport TextInput from './FormHelpers/TextInput';\n\nconst useStyles = makeStyles(theme => ({\n  login: {\n    paddingTop: theme.spacing(8),\n    minHeight: '65vh',\n    backgroundImage: `url(${imagePaths.bgPattern})`,\n  },\n  avatar: {\n    backgroundColor: theme.palette.secondary.light,\n  },\n  error: {\n    color: theme.palette.error.main,\n  },\n}));\n\nconst validate = values => {\n  const errors = {};\n  if (!values.email) {\n    errors.email = 'Required';\n  }\n  if (!values.password) {\n    errors.password = 'Required';\n  }\n  return errors;\n};\n\nfunction UserLogin() {\n  const history = useHistory();\n\n  const dispatch = useDispatch();\n\n  const classes = useStyles();\n\n  const location = useLocation();\n\n  const { from } = location.state || { from: { pathname: '/projects' } };\n\n  const nextPath =\n    location.state && location.state.from && location.state.from.pathname;\n\n  const expired = location.state && location.state.expired;\n\n  const authMessage = useSelector(state => state.auth.authMessage, isEqual);\n\n  const submit = values => {\n    return new Promise(resolve => {\n      dispatch(login(values))\n        .then(() => {\n          resolve(history.replace(from));\n        })\n        .catch(error => {\n          resolve({ [FORM_ERROR]: error });\n        });\n    });\n  };\n\n  const handleReset = email => {\n    dispatch(recoverPassword(email, history));\n  };\n\n  useEffect(() => {\n    document.title = 'Login - OpenFn';\n  }, []);\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      render={({ handleSubmit, submitError, values, form }) => {\n        if (authMessage === 'Account temporarily disabled.') {\n          return (\n            <Grid container justifyContent=\"center\" className={classes.login}>\n              <Grid item xs={12} sm={6} md={4}>\n                <Card style={{ marginTop: '4em', marginBottom: '4em' }}>\n                  <CardHeader\n                    title=\"Login temporarily disabled\"\n                    subheader={<>Attempted email id: {values.email}</>}\n                    avatar={\n                      <Avatar>\n                        <SecurityIcon />\n                      </Avatar>\n                    }\n                  />\n                  <CardContent>\n                    <Typography>\n                      Login attempts related to this email have been temporarily\n                      disabled for security reasons. If this is your email and\n                      you have an OpenFn account, you will need to contact\n                      support to regain access.\n                    </Typography>\n                  </CardContent>\n                  <CardActions>\n                    <Button\n                      href={`mailto:support@openfn.org?subject=Account access for \"${values.email}\"`}\n                      target=\"_blank\"\n                    >\n                      Contact support\n                    </Button>\n                  </CardActions>\n                </Card>\n              </Grid>\n            </Grid>\n          );\n        }\n\n        if (authMessage === 'Platform access has been restricted.') {\n          return (\n            <Grid container justifyContent=\"center\" className={classes.login}>\n              <Grid item xs={12} sm={6} md={4}>\n                <Card style={{ marginTop: '4em', marginBottom: '4em' }}>\n                  <CardHeader\n                    title=\"Platform access restricted\"\n                    subheader={<>Attempted email id: {values.email}</>}\n                    avatar={\n                      <Avatar>\n                        <SecurityIcon />\n                      </Avatar>\n                    }\n                  />\n                  <CardContent>\n                    <Typography>\n                      Legacy platform access has been restricted as we finalize\n                      migration to{' '}\n                      <a\n                        href=\"https://app.openfn.org\"\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                      >\n                        OpenFn v2\n                      </a>\n                      . Please contact support@openfn.org if you need access to v1.\n                    </Typography>\n                  </CardContent>\n                  <CardActions>\n                    <Button\n                      href={`mailto:support@openfn.org?subject=Platform access for \"${values.email}\"`}\n                      target=\"_blank\"\n                    >\n                      Contact support\n                    </Button>\n                  </CardActions>\n                </Card>\n              </Grid>\n            </Grid>\n          );\n        }\n\n        return (\n          <Grid container justifyContent=\"center\" className={classes.login}>\n            <Grid item>\n              <Card>\n                <CardHeader\n                  title={expired ? 'Please re-authenticate' : 'Login'}\n                  subheader={nextPath && `This resource is protected`}\n                  avatar={\n                    <Avatar className={classes.avatar}>\n                      {expired ? <SecurityIcon /> : <VerifiedUserIcon />}\n                    </Avatar>\n                  }\n                />\n                <form id=\"sign_in_form\" onSubmit={handleSubmit}>\n                  <CardContent>\n                    <Field\n                      name=\"email\"\n                      id=\"username\"\n                      component={TextInput}\n                      type=\"email\"\n                      label=\"Email\"\n                      autoComplete=\"username\"\n                    />\n                    <br />\n                    <Field\n                      id=\"password\"\n                      name=\"password\"\n                      component={TextInput}\n                      type=\"password\"\n                      label=\"Password\"\n                      autoComplete=\"current-password\"\n                    />\n                    {submitError && (\n                      <Typography className={classes.error}>\n                        {authMessage}\n                      </Typography>\n                    )}\n                  </CardContent>\n                  <FormActions\n                    submit={handleSubmit}\n                    enterPress\n                    submitText=\"Login\"\n                    form={form}\n                  >\n                    <Button\n                      disabled={!values.email}\n                      type=\"button\"\n                      id=\"password-recovery\"\n                      onClick={() => handleReset(values.email)}\n                    >\n                      Recover Password\n                    </Button>\n                  </FormActions>\n                </form>\n              </Card>\n            </Grid>\n          </Grid>\n        );\n      }}\n    />\n  );\n}\n\nexport default UserLogin;\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { FORM_ERROR } from 'final-form';\nimport { Field, Form } from 'react-final-form';\nimport { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { resetPassword } from '../actions/UserActions';\nimport TextInput from './FormHelpers/TextInput';\nimport imagePaths from '../helpers/imagePaths';\n\nconst useStyles = makeStyles(theme => ({\n  resetContainer: {\n    minHeight: '65vh',\n    backgroundImage: `url(${imagePaths.bgPattern})`,\n  },\n}));\n\nconst validate = values => {\n  const errors = {};\n  if (!values.password) {\n    errors.password = 'Required';\n  }\n  if (values.password !== values.passwordConfirmation) {\n    errors.password = 'Password and confirmation do not match.';\n  }\n  if (!values.hashedPasswordResetToken) {\n    errors.hashedPasswordResetToken = 'Required';\n  }\n  return errors;\n};\n\nfunction ResetPassword() {\n  const dispatch = useDispatch();\n\n  const classes = useStyles();\n\n  const history = useHistory();\n\n  const submit = values => {\n    return new Promise(resolve => {\n      dispatch(resetPassword(values))\n        .then(() => {\n          resolve();\n        })\n        .then(() => {\n          setTimeout(() => {\n            history.push('/projects');\n          }, 1000);\n        })\n        .catch(() => {\n          resolve({\n            [FORM_ERROR]: 'Please check your token or contact us.',\n          });\n        });\n    });\n  };\n\n  return (\n    <Form\n      onSubmit={submit}\n      validate={validate}\n      render={({\n        handleSubmit,\n        submitting,\n        pristine,\n        invalid,\n        dirtySinceLastSubmit,\n        submitError,\n      }) => (\n        <Grid\n          container\n          justifyContent=\"center\"\n          className={classes.resetContainer}\n        >\n          <Grid item>\n            <Card style={{ marginTop: '4em', marginBottom: '4em' }}>\n              <CardHeader\n                title=\"Reset password.\"\n                subheader=\"Using a reset token sent over email.\"\n              />\n              <CardContent>\n                <Typography>Enter your recovery token below.</Typography>\n                <form onSubmit={handleSubmit} autoComplete=\"off\">\n                  <Field\n                    name=\"hashedPasswordResetToken\"\n                    component={TextInput}\n                    type=\"password\"\n                    label=\"Recovery Token\"\n                    fullWidth\n                    autoComplete=\"new-password\"\n                  />\n                  <br />\n                  <Field\n                    name=\"password\"\n                    component={TextInput}\n                    type=\"password\"\n                    label=\"New Password\"\n                    fullWidth\n                    autoComplete=\"new-password\"\n                  />\n                  <br />\n                  <Field\n                    name=\"passwordConfirmation\"\n                    component={TextInput}\n                    type=\"password\"\n                    label=\"Confirm Password\"\n                    fullWidth\n                    autoComplete=\"new-password\"\n                  />\n                </form>\n                {submitError && (\n                  <div>\n                    <br />\n                    <Typography style={{ color: 'red' }}>\n                      {submitError}\n                    </Typography>\n                  </div>\n                )}\n              </CardContent>\n              <CardActions>\n                <Button\n                  type=\"submit\"\n                  variant=\"contained\"\n                  color=\"secondary\"\n                  disabled={\n                    submitting || pristine || (invalid && !dirtySinceLastSubmit)\n                  }\n                  onClick={handleSubmit}\n                >\n                  {submitting ? (\n                    <i className=\"fas fa-circle-notch fa-lg fa-spin\" />\n                  ) : (\n                    'Reset Password'\n                  )}\n                </Button>\n              </CardActions>\n            </Card>\n          </Grid>\n        </Grid>\n      )}\n    />\n  );\n}\n\nexport default ResetPassword;\n","import React, { useEffect } from 'react';\nimport {\n  Card,\n  CardHeader,\n  Avatar,\n  CardContent,\n  Grid,\n  Typography,\n} from '@material-ui/core';\nimport { Security as SecurityIcon } from '@material-ui/icons';\nimport { makeStyles } from '@material-ui/core/styles';\nimport imagePaths from '../helpers/imagePaths';\n\nconst useStyles = makeStyles(theme => ({\n  delete: {\n    paddingTop: theme.spacing(8),\n    paddingLeft: theme.spacing(2),\n    paddingRight: theme.spacing(2),\n    minHeight: '65vh',\n    backgroundImage: `url(${imagePaths.bgPattern})`,\n  },\n}));\n\nfunction AccountDeletionConfirmation() {\n  useEffect(() => {\n    document.title = 'Account Deletion - OpenFn';\n  }, []);\n\n  const classes = useStyles();\n\n  return (\n    <Grid container justifyContent=\"center\" className={classes.delete}>\n      <Grid item xs={12} sm={6} md={4}>\n        <Card>\n          <CardHeader\n            title=\"Account deletion scheduled.\"\n            avatar={\n              <Avatar>\n                <SecurityIcon />\n              </Avatar>\n            }\n          />\n          <CardContent>\n            <Typography>\n              Your account has been scheduled for permanent deletion. We&apos;ve\n              sent an email with all the details. If this is unwanted please\n              contact support@openfn.org within 7 days.\n            </Typography>\n          </CardContent>\n        </Card>\n      </Grid>\n    </Grid>\n  );\n}\n\nexport default AccountDeletionConfirmation;\n","import React, { useEffect, useState } from 'react';\nimport {\n  Switch,\n  Route,\n  Redirect,\n  useLocation,\n  useHistory,\n} from 'react-router-dom';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n  AppBar,\n  Toolbar,\n  List,\n  ListItem,\n  ListItemText,\n  Hidden,\n  IconButton,\n} from '@material-ui/core';\nimport {\n  Menu as MenuIcon,\n  ExpandMore as ExpandMoreIcon,\n} from '@material-ui/icons';\nimport { isEqual } from 'lodash';\nimport { logout, getCurrentUser } from '../actions/SessionActions';\nimport Notifications from '../actions/Notifications';\nimport { linkTo, pushTo, closeLoader } from '../helpers';\nimport Snackbar from '../components/Snackbar';\nimport Footer from './Footer';\nimport UserMenu from '../components/UserMenu';\nimport BigMenu from './BigMenu';\nimport ScrollToTop from '../components/ScrollToTop';\nimport About from './About';\nimport Blog from './Blog';\nimport Clients from './Clients';\nimport Compliance from './Compliance';\nimport Home from './Home';\nimport How from './How';\nimport Impact from './Impact';\nimport Partners from './Partners';\nimport Mission from './Mission';\nimport Pricing from './Pricing';\nimport Careers from './Careers';\nimport Privacy from './Privacy';\nimport ProductsList from './ProductsList';\nimport Solutions from './Solutions';\nimport Team from './Team';\nimport Terms from './Terms';\nimport ThirdPartyList from './ThirdPartyList';\nimport Trust from './Trust';\nimport Why from './Why';\nimport RequireBrowser from '../components/RequireBrowser';\nimport Signup from '../components/Signup';\nimport UserLogin from '../components/UserLogin';\nimport ResetPassword from '../components/ResetPassword';\nimport SupportTicketForm from '../components/SupportTicketForm';\nimport { ErrorPresenter } from '../components/ErrorView';\nimport AccountDeletionConfirmation from '../components/AccountDeletionConfirmation';\n\nconst dismissNotification = Notifications.dismiss;\n\nconst useStyles = makeStyles(theme => ({\n  root: {\n    flexGrow: 1,\n    overflowX: 'hidden',\n  },\n  flex: {\n    flexGrow: 1,\n  },\n  menuButton: {\n    marginLeft: -12,\n  },\n  topMenuList: {\n    display: 'inherit',\n    height: '64px',\n    paddingTop: 0,\n    paddingBottom: 0,\n  },\n  appBar: {\n    backgroundColor: theme.palette.background.paper,\n  },\n  topLine: {\n    height: 1,\n    width: '100%',\n    backgroundColor: `${theme.palette.offWhite} !important`,\n  },\n  topLink: {\n    padding: 0,\n  },\n  icon: {\n    marginLeft: 3,\n  },\n  iconDarken: {\n    marginLeft: 3,\n    color: `${theme.palette.primary.main} !important`,\n  },\n  darken: {\n    backgroundColor: `${theme.palette.offWhite} !important`,\n    borderBottom: `2px solid ${theme.palette.primary.main}`,\n    paddingBottom: '6px',\n  },\n  marketingFrame: {\n    paddingTop: 44,\n    background: theme.palette.background.paper,\n  },\n}));\n\nfunction Marketing() {\n  const location = useLocation();\n\n  const history = useHistory();\n\n  const classes = useStyles();\n\n  const dispatch = useDispatch();\n\n  const [userMenuAnchor, setUserMenuAnchor] = useState(null);\n\n  const [subMenu, setSubMenu] = useState('');\n\n  const [drawer, setDrawer] = useState(false);\n\n  const [menuExpanded, setMenuExpanded] = useState(false);\n\n  const auth = useSelector(state => state.auth, isEqual);\n\n  const user = useSelector(\n    state => state.users.items[state.auth.currentUserId],\n    isEqual\n  );\n\n  const notification = useSelector(\n    state => Object.values(state.notifications.items)[0] || {},\n    isEqual\n  );\n\n  const handleMenu = event => {\n    setUserMenuAnchor(event.currentTarget);\n  };\n\n  const handleClose = () => {\n    setUserMenuAnchor(null);\n  };\n\n  const handleLinkTo = (path, hist) => {\n    handleClose();\n    pushTo(path, hist);\n  };\n\n  const handleExpand = menu => {\n    if (menu !== subMenu) {\n      setMenuExpanded(true);\n      setSubMenu(menu);\n    } else {\n      setMenuExpanded(!menuExpanded);\n      setSubMenu('');\n    }\n  };\n\n  const toggleDrawer = bool => {\n    setDrawer(bool);\n  };\n\n  const open = Boolean(userMenuAnchor);\n\n  function linkGenerator(text, id, title, onClick) {\n    return (\n      <ListItem\n        button\n        onClick={onClick}\n        className={subMenu === id ? classes.darken : null}\n      >\n        <ListItemText\n          primary={text}\n          className={classes.topLink}\n          primaryTypographyProps={\n            title ? { color: 'inherit', variant: 'h6' } : { color: 'inherit' }\n          }\n        />\n        {id && (\n          <ExpandMoreIcon\n            fontSize=\"small\"\n            className={subMenu === id ? classes.iconDarken : classes.icon}\n          />\n        )}\n      </ListItem>\n    );\n  }\n\n  useEffect(() => {\n    dispatch(getCurrentUser());\n    closeLoader();\n    if (window.gtag) window.gtag('set', 'content_group', 'marketing');\n  }, [dispatch]);\n\n  useEffect(() => {\n    setMenuExpanded(false);\n    setSubMenu('');\n    setDrawer(false);\n  }, [location]);\n\n  return (\n    <div className={classes.root}>\n      <ScrollToTop />\n      <AppBar position=\"fixed\" className={classes.appBar} color=\"default\">\n        <Toolbar>\n          <Hidden mdUp>\n            <IconButton\n              className={classes.menuButton}\n              color=\"inherit\"\n              aria-label=\"Menu\"\n              onClick={() => toggleDrawer(!drawer)}\n            >\n              <MenuIcon />\n            </IconButton>\n            <List className={classes.topMenuList}>\n              <ListItem button onClick={linkTo('/', history)}>\n                <ListItemText\n                  primary=\"OpenFn\"\n                  className={classes.topLink}\n                  primaryTypographyProps={{\n                    color: 'inherit',\n                    variant: 'h6',\n                    style: { fontSize: '.8rem' },\n                  }}\n                />\n              </ListItem>\n            </List>\n          </Hidden>\n          <Hidden smDown>\n            <List className={classes.topMenuList}>\n              {linkGenerator('OpenFn v1', null, true, linkTo('/', history))}\n              {/* {linkGenerator('Platform', 'platform', false, () =>\n                handleExpand('platform')\n              )}\n              {linkGenerator('Solutions', 'solutions', false, () =>\n                handleExpand('solutions')\n              )} */}\n              {/* {linkGenerator(\n                'Pricing',\n                null,\n                false,\n                linkTo('/pricing', history)\n              )} */}\n              {/* {linkGenerator('Help', 'help', false, () => handleExpand('help'))}\n              {linkGenerator('About', 'about', false, () =>\n                handleExpand('about')\n              )} */}\n            </List>\n          </Hidden>\n          <span className={classes.flex} />\n          <UserMenu\n            auth={auth}\n            linkTo={linkTo}\n            open={open}\n            userMenuAnchor={userMenuAnchor}\n            handleClose={handleClose}\n            handleMenu={handleMenu}\n            handleLinkTo={handleLinkTo}\n            logout={hist => dispatch(logout(hist))}\n            location={location}\n            history={history}\n          />\n        </Toolbar>\n        <Hidden smDown>\n          {menuExpanded && <BigMenu subMenu={subMenu} type=\"horizontal\" />}\n        </Hidden>\n      </AppBar>\n      <Hidden mdUp>\n        <BigMenu\n          type=\"vertical\"\n          drawer={drawer}\n          onClose={() => toggleDrawer(false)}\n        />\n      </Hidden>\n      <div className={classes.marketingFrame}>\n        <Switch>\n          {/* <Redirect from=\"/leadership\" to=\"/team\" />\n          <Redirect from=\"/what\" to=\"/why\" />\n          <Route exact path=\"/about\" component={About} />\n          <Route exact path=\"/apps\" component={ProductsList} />\n          <Route exact path=\"/blog\" component={Blog} />\n          <Route exact path=\"/clients\" component={Clients} />\n          <Route exact path=\"/compliance\" component={Compliance} />\n          <Route exact path=\"/external-services\" component={ThirdPartyList} />\n          <Route exact path=\"/how\" component={How} />\n          <Route exact path=\"/impact\" component={Impact} />\n          <Route exact path=\"/team\" component={Team} />\n          <Route exact path=\"/careers\" component={Careers} />\n          <Route exact path=\"/partners\" component={Partners} />\n          <Route exact path=\"/mission\" component={Mission} />\n          <Route exact path=\"/pricing\" component={Pricing} />\n          <Route exact path=\"/solutions\" component={Solutions} />\n          <Route exact path=\"/trust\" component={Trust} />\n          <Route exact path=\"/why\" component={Why} /> */}\n          <Route exact path=\"/signup\" component={RequireBrowser(Signup)} />\n          <Route exact path=\"/login\" component={RequireBrowser(UserLogin)} />\n          <Route exact path=\"/reset_password\" component={ResetPassword} />\n          {/* <Route exact path=\"/terms\" component={Terms} />\n          <Route exact path=\"/privacy\" component={Privacy} /> */}\n          <Route\n            exact\n            path=\"/goodbye\"\n            component={AccountDeletionConfirmation}\n          />\n          <Route exact path=\"/\" component={Home} />\n          <Route\n            render={props => (\n              <div style={{ padding: '4em', minHeight: '65vh' }}>\n                <ErrorPresenter\n                  {...props}\n                  history={history}\n                  error={{ status: 404 }}\n                />\n              </div>\n            )}\n          />\n        </Switch>\n      </div>\n      {window.JIRA_SUPPORT && <SupportTicketForm user={user} />}\n      <Snackbar\n        notification={notification}\n        onClose={() => dispatch(dismissNotification(notification))}\n        TransitionProps={{ onExited: handleClose }}\n        onClick={() => dispatch(dismissNotification(notification))}\n      />\n      <Footer linkTo={linkTo} history={history} />\n    </div>\n  );\n}\n\nexport default Marketing;\n","import PropTypes from 'prop-types';\nimport { useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\n\nfunction sendPageView(location) {\n  window.gtag('config', window.GA4_TRACKING_CODE, {\n    page_path: location.pathname,\n  });\n}\n\nfunction GAListener({ children }) {\n  const history = useHistory();\n\n  if (Boolean(window.GA4_TRACKING_CODE)) {\n    useEffect(() => {\n      sendPageView(history.location);\n      return history.listen(sendPageView);\n    }, [history]);\n  }\n\n  return children;\n}\n\nGAListener.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default GAListener;\n","import React from 'react';\nimport { BrowserRouter, Route, Switch } from 'react-router-dom';\nimport { QueryParamProvider } from 'use-query-params';\nimport AppFrame from '../components/AppFrame';\nimport Marketing from '../marketing/Marketing';\nimport GAListener from './googleAnalytics';\n\nexport default (\n  <BrowserRouter>\n    <QueryParamProvider ReactRouterRoute={Route}>\n      <GAListener>\n        <Switch>\n          <Route\n            key=\"appFrame\"\n            path=\"/:path(projects|billing|account|credentials|change_email|change_password|activation_required|signup/confirm|signup/activate)\"\n            component={AppFrame}\n          />\n          <Route key=\"marketing\" path=\"/\" component={Marketing} />\n        </Switch>\n      </GAListener>\n    </QueryParamProvider>\n  </BrowserRouter>\n);\n","import amber from '@material-ui/core/colors/amber';\nimport green from '@material-ui/core/colors/green';\nimport grey from '@material-ui/core/colors/grey';\nimport { createTheme } from '@material-ui/core/styles';\n\nconst headerFont = 'Roboto, sans-serif';\nconst bodyFont = 'Roboto, sans-serif';\nconst codeFont = '\"Fira Code\", monospace';\n\nconst theme = createTheme({\n  palette: {\n    grey,\n    type: 'light',\n    banner: {\n      left: '#003131',\n      right: '#000',\n    },\n    primary: {\n      light: '#63ccff',\n      main: '#009be5', // bright blue\n      dark: '#006db3',\n    },\n    // primary: blue,\n    secondary: {\n      main: '#18202c', // midnight blue\n      light: '#33445e', // ligther midnight blue\n    },\n    success: {\n      light: green[300],\n      main: green[500],\n    },\n    warning: {\n      main: amber[500],\n      light: amber[300],\n    },\n    offWhite: grey[100],\n    transWhite: 'rgba(255, 255, 255, 0.70)',\n    transWhiteDark: 'rgba(255, 255, 255, 0.30)',\n    codeEditor: 'clouds_midnight',\n  },\n  typography: {\n    codeFont,\n    fontFamily: bodyFont,\n    h1: { fontFamily: headerFont },\n    h2: { fontFamily: headerFont },\n    h3: { fontFamily: headerFont },\n    h4: { fontFamily: headerFont },\n    h5: { fontFamily: headerFont },\n    h6: { fontFamily: headerFont },\n    subtitle1: { fontFamily: headerFont },\n    subtitle2: { fontFamily: headerFont },\n    body1: { fontFamily: bodyFont },\n    body2: { fontFamily: bodyFont },\n    button: { fontFamily: headerFont },\n    caption: { fontFamily: headerFont },\n    overline: { fontFamily: headerFont },\n  },\n  props: {\n    MuiTab: {\n      disableRipple: true,\n    },\n    MuiButton: {\n      disableFocusRipple: true,\n    },\n  },\n  mixins: {\n    toolbar: {\n      minHeight: 48,\n    },\n  },\n});\n\nexport default {\n  ...theme,\n  overrides: {\n    MuiCssBaseline: {\n      '@global': {\n        html: {\n          height: '100%',\n        },\n        body: {\n          height: '100%',\n        },\n        code: {\n          fontFamily: theme.typography.codeFont,\n          backgroundColor: theme.palette.grey[200],\n          padding: theme.spacing(0.5),\n          borderRadius: theme.spacing(1),\n        },\n        pre: {\n          fontFamily: theme.typography.codeFont,\n        },\n        '.ace_editor': {\n          fontFamily: theme.typography.codeFont,\n          'font-feature-settings':\n            '\"calt\" 1' /* Enable ligatures for IE 10+, Edge */,\n          'text-rendering':\n            'optimizeLegibility' /* Force ligatures for Webkit, Blink, Gecko */,\n          fontSize: '14px !important',\n        },\n        // '.ace_content': {\n        //   lineHeight: 1,\n        // },\n      },\n    },\n    MuiCardHeader: {\n      content: {\n        minWidth: 0,\n      },\n    },\n    MuiDrawer: {\n      paperAnchorLeft: {\n        backgroundColor: theme.palette.secondary.main,\n      },\n    },\n    MuiButton: {\n      label: {\n        textTransform: 'none',\n      },\n      contained: {\n        boxShadow: 'none',\n        '&:active': {\n          boxShadow: 'none',\n        },\n      },\n    },\n    MuiTabs: {\n      root: {\n        marginLeft: theme.spacing(1),\n      },\n      indicator: {\n        height: 3,\n        borderTopLeftRadius: 3,\n        borderTopRightRadius: 3,\n        backgroundColor: theme.palette.common.white,\n      },\n    },\n    MuiTab: {\n      root: {\n        textTransform: 'none',\n        margin: '0 16px',\n        minWidth: 0,\n        padding: 0,\n        [theme.breakpoints.up('md')]: {\n          padding: 0,\n          minWidth: 0,\n        },\n      },\n    },\n    MuiIconButton: {\n      root: {\n        padding: theme.spacing(1),\n      },\n    },\n    MuiTooltip: {\n      tooltip: {\n        textAlign: 'center',\n        fontSize: '90%',\n      },\n    },\n    MuiDivider: {\n      root: {\n        backgroundColor: '#404854',\n      },\n    },\n    MuiListItemText: {\n      primary: {\n        // fontWeight: theme.typography.fontWeightMedium,\n      },\n    },\n    MuiListItemIcon: {\n      root: {\n        color: 'inherit',\n        marginRight: 0,\n        '& svg': {\n          fontSize: 20,\n        },\n      },\n    },\n    MuiAvatar: {\n      root: {\n        width: 32,\n        height: 32,\n      },\n    },\n  },\n};\n","export default store => next => action => {\n\n  if (typeof action == \"function\") {\n    console.debug(\"Dispatch (function)\", action, )\n  } else {\n    const { type, ...payload } = action;\n    console.debug(\"Dispatch (fsa)\", type, payload)\n  }\n\n  return next(action);\n\n}\n\n","import { combineReducers } from 'redux';\nimport { LOGOUT_SUCCESSFUL } from '../constants';\n\nfunction items(state = [], action) {\n  switch (action.type) {\n    case 'ADAPTORS_SUCCESS':\n      return action.payload || [];\n\n    case LOGOUT_SUCCESSFUL:\n      return [];\n\n    default:\n      return state;\n  }\n}\n\nfunction helpers(state = [], action) {\n  switch (action.type) {\n    case 'FETCHING_HELPERS':\n      return { fetchingHelpers: true };\n    case 'HELPERS_SUCCESS':\n      return { ...(action.payload || {}), fetchingHelpers: false };\n\n    case 'HELPERS_CLEARED':\n    case 'HELPERS_FAILED':\n      return { fetchingHelpers: false };\n\n    default:\n      return { ...state, fetchingHelpers: false };\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case 'ADAPTORS_SUCCESS':\n      return false;\n\n    case 'FETCHING_ADAPTORS':\n      return true;\n\n    default:\n      return state;\n  }\n}\n\nfunction uniqueId(name, version) {\n  return `${name}-${version}`;\n}\n\nfunction onDemandItems(state = {}, action) {\n  const message =\n    action.payload?.error?.logs?.split('\\nnpm ERR! ')[1] ??\n    action.payload?.error?.message;\n\n  const { name, version } = action.payload ?? {};\n\n  if (!name || !version) return state;\n\n  const key = uniqueId(name, version);\n\n  switch (action.type) {\n    case 'ADAPTOR_REQUESTED':\n      state[key] = {\n        ...(state[key] ?? {}),\n        requested: state[key] ? !state[key].requested : true,\n      };\n      return state;\n\n    case 'INSTALLING_ADAPTOR':\n      if (state[key]?.installed) {\n        return state;\n      }\n      state[key] = {\n        ...(state[key] ?? {}),\n        installing: true,\n        message: `language-${action.payload.name}@${action.payload.version} is installing.`,\n        astInstalled: false,\n        installed: false,\n        installError: null,\n      };\n      return state;\n\n    case 'ADAPTOR_INSTALLED':\n      state[key] = {\n        message: `language-${action.payload.name}@${action.payload.version} installed.`,\n        installed: true,\n        installError: null,\n        installing: false,\n        astInstalled: false,\n      };\n      return state;\n\n    case 'ADAPTOR_INSTALL_FAILED':\n      state[key] = {\n        message: message,\n        installError: action.payload,\n        installing: false,\n        installed: false,\n        astInstalled: false,\n      };\n      return state;\n\n    case 'HELPERS_SUCCESS':\n      state[key] = {\n        ...(state[key] ?? {}),\n        astInstalled: true,\n        astError: null,\n      };\n      return state;\n\n    case 'HELPERS_FAILED':\n      state[key] = {\n        ...(state[key] ?? {}),\n        astInstalled: false,\n        astError: action.payload,\n      };\n      return state;\n\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  helpers,\n  isLoading,\n  onDemandItems,\n});\n","import {\n    AUTHENTICATED,\n    CURRENT_USER_FOUND,\n    CURRENT_USER_NOT_FOUND,\n    FETCHING_CURRENT_USER,\n    LOGIN_FAILED,\n    LOGIN_SUCCESSFUL,\n    LOGOUT_SUCCESSFUL,\n    UNAUTHENTICATED, USER_UPDATED, USER_UPDATE_INVALID\n} from '../constants';\n\nconst initialState = {\n  token: null,\n  expiration: null,\n  isAuthenticated: null,\n  requiresActivation: false,\n  currentUserId: null,\n  isLoading: false,\n  authMessage: null,\n};\n\nexport default function Auth(state = initialState, action) {\n  switch (action.type) {\n    case LOGIN_SUCCESSFUL:\n      return {\n        ...state,\n        isAuthenticated: true,\n        expiration: action.token.expiry,\n        token: action.token.jwt,\n        authMessage: null,\n      };\n\n    case LOGOUT_SUCCESSFUL:\n      return { ...initialState, isAuthenticated: false };\n\n    case LOGIN_FAILED:\n      const { status } = action.error.response;\n\n      if (status === 429)\n        return { ...state, authMessage: 'Account temporarily disabled.' };\n\n      if (status === 403)\n        return { ...state, authMessage: 'Platform access has been restricted.' };\n\n      return { ...state, authMessage: 'Invalid email or password.' };\n\n    case USER_UPDATED:\n      return { ...state, authMessage: null, passwordMessage: null };\n\n    case USER_UPDATE_INVALID:\n      return {\n        ...state,\n        passwordMessage:\n          'Change failed. Please ensure your current password is correct.',\n      };\n\n    case 'USER_NOT_FOUND':\n      return { ...state, authMessage: action.message };\n\n    case FETCHING_CURRENT_USER:\n      return { ...state, isLoading: true };\n\n    case CURRENT_USER_FOUND:\n      return {\n        ...state,\n        isLoading: false,\n        isAuthenticated: true,\n        expiration: action.user.expiration,\n        currentUserId: action.user.id,\n        requiresActivation: action.user.requiresActivation,\n      };\n\n    case 'USER_ACTIVATED':\n      return { ...state, requiresActivation: false };\n\n    case CURRENT_USER_NOT_FOUND:\n      return {\n        ...state,\n        isLoading: false,\n        isAuthenticated: false,\n        currentUserId: null,\n        requiresActivation: false,\n      };\n\n    case AUTHENTICATED:\n      return { ...state, isAuthenticated: true, token: action.payload.token };\n\n    case UNAUTHENTICATED:\n      return { ...state, isAuthenticated: false, token: null };\n\n    default:\n      return state;\n  }\n}\n","import { filter } from 'lodash';\nimport { combineReducers } from 'redux';\nimport {\n    AUTH_METHODS_REQUEST, AUTH_METHODS_SUCCESS,\n    AUTH_METHOD_REMOVED, LOGOUT_SUCCESSFUL\n} from '../constants';\n\nfunction items(state={}, action) {\n  switch (action.type) {\n\n    case AUTH_METHODS_SUCCESS:\n      return action.payload.entities.authMethods || {};\n\n    case AUTH_METHOD_REMOVED:\n      var authMethodId = action.authMethodId;\n\n      var newState = filter(state, function({id}) {\n        return id !== authMethodId;\n      });\n\n      return newState;\n\n    case LOGOUT_SUCCESSFUL:\n      return {}\n\n    default:\n      return state;\n  }\n}\n\nfunction loading(state=false, action) {\n  switch (action.type) {\n    case AUTH_METHODS_REQUEST:\n      return true;\n\n    case AUTH_METHODS_SUCCESS:\n      return false\n\n    default:\n      return state;\n\n  }\n}\n\nexport default combineReducers({\n  items, loading\n})\n","import { combineReducers } from 'redux';\nimport {\n    BLOG_POSTS_FAILURE, BLOG_POSTS_REQUEST,\n    BLOG_POSTS_SUCCESS,\n    LOGOUT_SUCCESSFUL\n} from '../constants';\n\nfunction items(state = [], action) {\n  switch (action.type) {\n    case BLOG_POSTS_SUCCESS:\n      if (!action.payload) {\n        return state;\n      }\n      return action.payload;\n\n    case LOGOUT_SUCCESSFUL:\n      return [];\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case BLOG_POSTS_REQUEST:\n      return true;\n    case BLOG_POSTS_FAILURE:\n    case BLOG_POSTS_SUCCESS:\n      return false;\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  isLoading,\n});\n","import { combineReducers } from 'redux';\nimport { JOINING_CHANNEL, LEFT_CHANNEL } from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    // case JOINED_CHANNEL:\n    case JOINING_CHANNEL:\n      return { ...state, [action.channelName]: action.channel };\n\n    case LEFT_CHANNEL:\n      return Object.fromEntries(\n        Object.entries(state).filter(([k, _v]) => k !== action.channelName)\n      );\n\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n});\n","import { filter } from 'lodash';\nimport { combineReducers } from 'redux';\nimport {\n  CREDENTIALS_FAILURE,\n  CREDENTIALS_REQUEST,\n  CREDENTIALS_SUCCESS,\n  CREDENTIAL_INVALID,\n  CREDENTIAL_SHARE_INVALID,\n  CREDENTIAL_REMOVED,\n  CREDENTIAL_SUCCESS,\n  LOGOUT_SUCCESSFUL,\n  SCOPED_PROJECT,\n  UNSCOPED_PROJECT,\n} from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    case CREDENTIALS_SUCCESS:\n    case CREDENTIAL_SUCCESS:\n      return action.payload.entities.credentials || {};\n\n    case CREDENTIAL_REMOVED:\n      return filter(state, ({ id }) => id !== action.credentialId);\n\n    case UNSCOPED_PROJECT:\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction error(state = false, action) {\n  switch (action.type) {\n    case CREDENTIALS_FAILURE:\n      return action.payload;\n\n    case CREDENTIAL_INVALID:\n      return action.error;\n\n    case CREDENTIAL_SUCCESS:\n    case CREDENTIALS_SUCCESS:\n    case CREDENTIAL_REMOVED:\n    case UNSCOPED_PROJECT:\n    case LOGOUT_SUCCESSFUL:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case CREDENTIALS_REQUEST:\n      return true;\n    case CREDENTIAL_SHARE_INVALID:\n      return false;\n    case CREDENTIAL_SUCCESS:\n    case CREDENTIALS_SUCCESS:\n    case LOGOUT_SUCCESSFUL:\n    case UNSCOPED_PROJECT:\n    case SCOPED_PROJECT:\n      return false;\n    default:\n      return state;\n  }\n}\nexport default combineReducers({\n  items,\n  error,\n  isLoading,\n});\n","import { filter, merge } from 'lodash';\nimport { combineReducers } from 'redux';\nimport {\n  DISMISS_JOB_ERROR,\n  JOBS_REQUEST,\n  JOBS_SUCCESS,\n  JOB_CHANGED,\n  JOB_FAILURE,\n  JOB_REMOVED,\n  JOB_REQUEST,\n  JOB_SUCCESS,\n  LOGOUT_SUCCESSFUL,\n  UNSCOPED_PROJECT,\n  RECEIPTS_RECEIVED,\n  RECEIPT_RECEIVED,\n} from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    case JOBS_SUCCESS:\n    case JOB_SUCCESS:\n      return merge({}, state, action.payload.entities.jobs);\n\n    case JOB_REMOVED:\n      var { jobId } = action;\n\n      var newState = filter(state, function ({ id }) {\n        return id !== jobId;\n      });\n\n      return newState;\n\n    case JOB_CHANGED:\n      const { id, change } = action;\n\n      return merge({}, state, { [id]: change });\n\n    case RECEIPT_RECEIVED:\n      return { ...state, ...action.payload.entities.jobs };\n\n    case RECEIPTS_RECEIVED:\n      return { ...state, ...action.entities.jobs };\n\n    case 'runs/LOADED':\n      return { ...state, ...action.payload.entities.jobs } || state;\n\n    case 'runs/LOADED_DETAILS':\n      return { ...state, ...action.payload.entities.jobs } || state;\n\n    case UNSCOPED_PROJECT:\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case JOBS_SUCCESS:\n    case JOB_FAILURE:\n      return false;\n    case JOBS_REQUEST:\n      return true;\n\n    default:\n      return state;\n  }\n}\n\nfunction detailsLoading(state = false, action) {\n  switch (action.type) {\n    case JOB_SUCCESS:\n    case JOB_FAILURE:\n      return false;\n    case JOB_REQUEST:\n      return true;\n\n    default:\n      return state;\n  }\n}\n\nfunction error(state = false, action) {\n  switch (action.type) {\n    case JOB_FAILURE:\n      return action.payload;\n\n    case JOB_CHANGED:\n    case JOB_REMOVED:\n    case JOB_SUCCESS:\n    case JOBS_REQUEST:\n    case JOBS_SUCCESS:\n    case LOGOUT_SUCCESSFUL:\n    case UNSCOPED_PROJECT:\n    case DISMISS_JOB_ERROR:\n    case RECEIPT_RECEIVED:\n    case RECEIPTS_RECEIVED:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  isLoading,\n  detailsLoading,\n  error,\n});\n","import { combineReducers } from 'redux';\nimport {\n  BRANCH_GET_FAILURE,\n  BRANCH_GET_SUCCESS,\n  PROJECT_REPO_CONNECTION_CREATED,\n  PROJECT_REPO_CONNECTION_REMOVED,\n  PROJECT_REPO_CONNECTION_SUCCESS,\n  PROJECT_REPO_CONNECTION_UPDATED,\n  LOGOUT_SUCCESSFUL,\n  REPO_GET_FAILURE,\n  REPO_GET_SUCCESS,\n  REPO_REQUEST,\n} from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    // THERE CAN ONLY EVER BE ONE JOB SOURCE FOR A PROJECT\n\n    case PROJECT_REPO_CONNECTION_SUCCESS:\n      return action.payload.entities.projectRepoConnections || {};\n\n    case PROJECT_REPO_CONNECTION_CREATED:\n      return action.payload.entities.projectRepoConnections || {};\n\n    case PROJECT_REPO_CONNECTION_UPDATED:\n      return action.payload.entities.projectRepoConnections || {};\n\n    case PROJECT_REPO_CONNECTION_REMOVED:\n      return {};\n\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction repos(state = {}, action) {\n  switch (action.type) {\n    case REPO_GET_SUCCESS:\n      return action.repos;\n\n    case REPO_GET_FAILURE:\n      return {};\n\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction branches(state = {}, action) {\n  switch (action.type) {\n    case BRANCH_GET_SUCCESS:\n      return action.branches;\n\n    case BRANCH_GET_FAILURE:\n      return {};\n\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction isLoadingRepos(state = false, action) {\n  switch (action.type) {\n    case REPO_REQUEST:\n      return true;\n\n    case REPO_GET_SUCCESS:\n    case REPO_GET_FAILURE:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  repos,\n  branches,\n  isLoadingRepos,\n});\n","import { combineReducers } from 'redux';\nimport { SCOPED_PROJECT, SWITCHED_MENU, UNSCOPED_PROJECT } from '../constants';\n\nfunction selectedMenuKey(state = null, action) {\n  switch (action.type) {\n    case SWITCHED_MENU:\n      return action.key;\n    default:\n      return state;\n  }\n}\n\nfunction scopedProject(state = null, action) {\n  switch (action.type) {\n    case SCOPED_PROJECT:\n      return action.project.id;\n    case UNSCOPED_PROJECT:\n      return null;\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({ selectedMenuKey, scopedProject });\n","import { filter } from 'lodash';\nimport { combineReducers } from 'redux';\nimport { NOTIFICATION_ADDED, NOTIFICATION_DISMISSED } from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    case NOTIFICATION_ADDED:\n      return { ...state, [action.notification.id]: action.notification };\n    case NOTIFICATION_DISMISSED:\n      return filter(state, ({ id }) => id !== action.id);\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({ items });\n","import { combineReducers } from 'redux';\nimport {\n    PLANS_RECEIVED\n} from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    case PLANS_RECEIVED:\n      var plans = action.plans.reduce(( acc, p ) => {\n        return { ...acc, [p.id]: p }\n      }, {})\n      return { ...state, ...plans };\n\n    default:\n      return state;\n  }\n}\n\nfunction changeRequested(state = false, action) {\n  switch (action.type) {\n    case 'CHANGE_REQUESTED':\n      return true;\n    case 'CHANGE_REJECTED':\n    case 'CHANGE_CONFIRMED':\n      return false;\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  changeRequested\n})\n","import { combineReducers } from 'redux';\nimport {\n    LOGOUT_SUCCESSFUL, PRODUCTS_SUCCESS\n} from '../constants';\n\nfunction items(state={}, action) {\n  switch (action.type) {\n    case PRODUCTS_SUCCESS:\n      if (!action.payload.entities.products) {\n        return state;\n      } else {\n          return action.payload.entities.products;\n      }\n    case LOGOUT_SUCCESSFUL:\n      return {}\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items\n})\n","import { combineReducers } from 'redux';\nimport {\n    FAILED_PROJECT_FILES, LOGOUT_SUCCESSFUL, RECEIVED_PROJECT_FILES, REQUESTED_PROJECT_FILES\n} from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    case RECEIVED_PROJECT_FILES:\n      return action.payload.entities.projectFiles || {};\n\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction error(state = false, action) {\n  switch (action.type) {\n    case FAILED_PROJECT_FILES:\n      return action;\n\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case REQUESTED_PROJECT_FILES:\n      return true;\n\n    case RECEIVED_PROJECT_FILES:\n    case FAILED_PROJECT_FILES:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  error,\n  isLoading,\n});\n","import { merge } from 'lodash';\nimport { combineReducers } from 'redux';\nimport {\n  CHANGING_PLAN,\n  FAILED_USAGE_COUNTS,\n  PROJECT_REPO_CONNECTION_REMOVED,\n  LOGOUT_SUCCESSFUL,\n  PLAN_CHANGED,\n  PLAN_CHANGE_FAILED,\n  PROJECTS_REQUEST,\n  PROJECTS_SUCCESS,\n  PROJECT_CREATED,\n  PROJECT_NOT_FOUND,\n  PROJECT_SUCCESS,\n  PROJECT_UPDATED,\n  PROJECT_DELETED,\n  RECEIVED_RUN_STATS_FOR_PROJECT,\n  RECEIVED_RUN_STATS_FOR_PROJECTS,\n  RECEIVED_USAGE_COUNTS,\n  RECEIVED_USAGE_HISTORY,\n  REQUESTED_USAGE_COUNTS,\n  UNSCOPED_PROJECT,\n  PROJECT_DELETION_CANCELED,\n} from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    case PROJECTS_SUCCESS:\n    case PROJECT_SUCCESS:\n    case PROJECT_UPDATED:\n    case PROJECT_DELETED:\n    case PROJECT_DELETION_CANCELED:\n    case PROJECT_CREATED:\n      return merge({}, state, action.payload.entities.projects);\n\n    case PLAN_CHANGED:\n      return { ...state, [action.project.id]: action.project };\n\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    case PROJECT_REPO_CONNECTION_REMOVED:\n      state[\n        action.payload.entities.projectRepoConnections[\n          action.payload.result\n        ].projectId\n      ].projectRepoConnectionId = null;\n      return state;\n\n    default:\n      return state;\n  }\n}\n\nfunction runStats(state = {}, action) {\n  switch (action.type) {\n    case RECEIVED_RUN_STATS_FOR_PROJECT:\n      return { ...state, [action.payload.projectId]: action.payload.stats };\n\n    case RECEIVED_RUN_STATS_FOR_PROJECTS:\n      return {\n        ...state,\n        ...action.payload.projectRunStats.reduce((acc, i) => {\n          return { ...acc, [i.projectId]: i.stats };\n        }, {}),\n      };\n    default:\n      return state;\n  }\n}\n\nfunction usageCounts(state = {}, action) {\n  switch (action.type) {\n    case RECEIVED_USAGE_COUNTS:\n      return {\n        ...state,\n        ...action.payload.reduce((acc, i) => {\n          return { ...acc, [i.projectId]: i };\n        }, {}),\n      };\n\n    case LOGOUT_SUCCESSFUL:\n      return {};\n    default:\n      return state;\n  }\n}\n\nfunction usageDetails(state = [], action) {\n  switch (action.type) {\n    case RECEIVED_USAGE_HISTORY:\n      return action.payload;\n\n    case UNSCOPED_PROJECT:\n    case LOGOUT_SUCCESSFUL:\n      return [];\n    default:\n      return state;\n  }\n}\n\nfunction loadingDetails(state = false, action) {\n  switch (action.type) {\n    case REQUESTED_USAGE_COUNTS:\n      return true;\n\n    case RECEIVED_USAGE_COUNTS:\n    case FAILED_USAGE_COUNTS:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case PROJECTS_REQUEST:\n      return true;\n\n    case PROJECTS_SUCCESS:\n    case PLAN_CHANGE_FAILED:\n    case PLAN_CHANGED:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nfunction loaded(state = false, action) {\n  switch (action.type) {\n    case PROJECTS_REQUEST:\n    case LOGOUT_SUCCESSFUL:\n      return false;\n\n    case PROJECTS_SUCCESS:\n      return true;\n\n    default:\n      return state;\n  }\n}\n\nfunction isChanging(state = false, action) {\n  switch (action.type) {\n    case CHANGING_PLAN:\n      return true;\n\n    case PLAN_CHANGED:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nfunction error(state = false, { type, error }) {\n  switch (type) {\n    case PROJECTS_REQUEST:\n    case PROJECT_SUCCESS:\n      return false;\n\n    case PROJECT_NOT_FOUND:\n      return error;\n\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  error,\n  isChanging,\n  isLoading,\n  items,\n  loaded,\n  loadingDetails,\n  runStats,\n  usageCounts,\n  usageDetails,\n});\n","import { filter } from 'lodash';\nimport { combineReducers } from 'redux';\nimport {\n    COLLAB_EMAIL_NOT_FOUND, LOGOUT_SUCCESSFUL, PROJECT_REQUEST,\n    PROJECT_USERS_SUCCESS, PROJECT_USER_ALREADY_ADDED, PROJECT_USER_CREATED, PROJECT_USER_REMOVED\n} from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    // Remove collabs when someone scopes an project.\n    case PROJECT_REQUEST:\n      return {};\n\n    case PROJECT_USERS_SUCCESS:\n      return { ...action.data.entities.projectUsers };\n\n    case PROJECT_USER_CREATED:\n      return { ...state, [action.projectUser.id]: action.projectUser };\n\n    case PROJECT_USER_REMOVED:\n      var projectUserId = action.projectUserId;\n      var newState = filter(state, function ({ id }) {\n        return id !== projectUserId;\n      });\n\n      return newState;\n\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction requestCollaboratorAdd(state = false, action) {\n  switch (action.type) {\n    case PROJECT_USER_CREATED:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nfunction collaboratorAddStatus(state = {}, action) {\n  switch (action.type) {\n    case PROJECT_USER_CREATED:\n      return { success: true, error: null };\n\n    case COLLAB_EMAIL_NOT_FOUND:\n      return {\n        success: false,\n        error:\n          \"We can't find a user associated with that email. If they're new, please ask them to register before adding them to your project.\",\n      };\n\n    case PROJECT_USER_ALREADY_ADDED:\n      return {\n        success: false,\n        error:\n          'This user might have already been granted access, or you may lack permission to do so.',\n      };\n\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  requestCollaboratorAdd,\n  collaboratorAddStatus,\n});\n","import { mergeWith, pick } from 'lodash';\nimport { combineReducers } from 'redux';\nimport {\n  ADD_RECEIPT,\n  BODIES_RECEIVED,\n  FETCHING_RECEIPT,\n  FETCHING_RECEIPTS,\n  FETCHING_RECEIPTS_FAILED,\n  FETCHING_RECEIPT_FAILED,\n  JOB_SUCCESS,\n  LOGOUT_SUCCESSFUL,\n  PROJECT_REQUEST,\n  PROJECT_SUCCESS,\n  RECEIPTS_RECEIVED,\n  RECEIPT_JOB_STATES_RECEIVED,\n  RECEIPT_RECEIVED,\n  RECEIPT_UPDATED,\n  UNSCOPED_PROJECT,\n} from '../constants';\n\nfunction items(state = {}, action) {\n  const existingIds = Object.keys(state);\n\n  switch (action.type) {\n    case RECEIPT_RECEIVED:\n      return { ...state, ...action.payload.entities.receipts };\n\n    case RECEIPTS_RECEIVED:\n      return action.entities.receipts || {};\n\n    case RECEIPT_JOB_STATES_RECEIVED:\n      return mergeWith({}, state, action.entities.receipts, (a, b) =>\n        b === null ? a : undefined\n      );\n\n    case BODIES_RECEIVED:\n      return action.entities.receipts || {};\n\n    case RECEIPT_UPDATED:\n      return {\n        ...state,\n        ...pick(action.payload.entities.receipts, existingIds),\n      };\n\n    case ADD_RECEIPT:\n      return { ...state, [action.receipt.id]: action.receipt };\n\n    case LOGOUT_SUCCESSFUL:\n    case UNSCOPED_PROJECT:\n    case 'CLEAR_RECEIPTS':\n      // TODO: decide on job load\n      return {};\n\n    case FETCHING_RECEIPTS_FAILED:\n      return state;\n\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case FETCHING_RECEIPT:\n    case FETCHING_RECEIPTS:\n      return true;\n\n    case RECEIPT_RECEIVED:\n    case RECEIPTS_RECEIVED:\n    case BODIES_RECEIVED:\n    case FETCHING_RECEIPTS_FAILED:\n    case FETCHING_RECEIPT_FAILED:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nfunction error(state = false, action) {\n  switch (action.type) {\n    case FETCHING_RECEIPT_FAILED:\n    case FETCHING_RECEIPTS_FAILED:\n      return action.error;\n\n    case ADD_RECEIPT:\n    case FETCHING_RECEIPT:\n    case FETCHING_RECEIPTS:\n    case RECEIPTS_RECEIVED:\n    case PROJECT_SUCCESS:\n    case LOGOUT_SUCCESSFUL:\n    case RECEIPT_RECEIVED:\n    case RECEIPT_UPDATED:\n    case PROJECT_REQUEST:\n    case JOB_SUCCESS:\n    case BODIES_RECEIVED:\n    case RECEIPT_JOB_STATES_RECEIVED:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\n// Pagination\n// ==========\n\nconst defaultPagination = {\n  page: 1,\n  total: null,\n  perPage: 10,\n  totalPages: null,\n};\n\nfunction pagination(state = defaultPagination, action) {\n  switch (action.type) {\n    case RECEIPTS_RECEIVED:\n      return action.pagination;\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  isLoading,\n  pagination,\n  error,\n});\n","import { mergeWith, pick } from 'lodash';\nimport { combineReducers } from 'redux';\nimport {\n  FETCHING_RECEIPT_JOB_STATES,\n  FETCHING_RECEIPT_JOB_STATES_FAILED,\n  LOADED,\n  LOADED_DETAILS,\n  LOADING,\n  LOAD_FAILED,\n  LOGOUT_SUCCESSFUL,\n  PROJECT_REQUEST,\n  RECEIPTS_RECEIVED,\n  RECEIPT_JOB_STATES_RECEIVED,\n  RECEIPT_RECEIVED,\n  RUNS_RECEIVED,\n  RUNS_UPDATED,\n  RUN_RECEIVED,\n  RUN_UPDATED,\n  UNSCOPED_PROJECT,\n} from '../constants';\n\nfunction items(state = {}, action) {\n  const existingIds = Object.keys(state);\n\n  switch (action.type) {\n    case RECEIPTS_RECEIVED:\n      return { ...state, ...action.entities.runs };\n\n    case RECEIPT_RECEIVED:\n      return state;\n\n    case RECEIPT_JOB_STATES_RECEIVED:\n      return mergeWith({}, state, action.entities.receiptJobStates, (a, b) =>\n        b === null ? a : undefined\n      );\n\n    case LOADED:\n      return action.payload.entities.runs || [];\n\n    case LOADED_DETAILS:\n    case RUNS_RECEIVED:\n      return action.payload.entities.runs;\n\n    case RUN_UPDATED:\n      return { ...state, ...pick(action.payload.entities.runs, existingIds) };\n\n    case RUN_RECEIVED:\n      return { ...state, ...action.payload.entities.runs };\n\n    // In the case where we want to update a run that already exists in the\n    // state. i.e. when paginating we don't want items added to the list.\n    case RUNS_UPDATED:\n      return { ...state, ...pick(action.payload.entities.runs, existingIds) };\n\n    case PROJECT_REQUEST:\n      return {};\n\n    case UNSCOPED_PROJECT:\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case LOADING:\n      return true;\n    case LOAD_FAILED:\n    case LOADED_DETAILS:\n    case LOADED:\n      return false;\n    default:\n      return state;\n  }\n}\n\n// Pagination\n// ==========\n\nconst defaultPagination = {\n  page: 1,\n  total: null,\n  perPage: 10,\n  totalPages: null,\n};\n\nfunction pagination(state = defaultPagination, action) {\n  switch (action.type) {\n    case LOADED:\n      if (action.payload.pagination) {\n        return action.payload.pagination;\n      }\n      return state;\n\n    default:\n      return state;\n  }\n}\n\nfunction error(state = false, { type, error }) {\n  switch (type) {\n    case FETCHING_RECEIPT_JOB_STATES:\n    case LOADED_DETAILS:\n    case LOADED:\n    case LOADING:\n    case LOGOUT_SUCCESSFUL:\n    case PROJECT_REQUEST:\n    case RECEIPT_RECEIVED:\n    case RECEIPTS_RECEIVED:\n    case RUN_RECEIVED:\n    case RECEIPT_JOB_STATES_RECEIVED:\n    case RUN_UPDATED:\n    case RUNS_RECEIVED:\n    case RUNS_UPDATED:\n      return false;\n\n    case FETCHING_RECEIPT_JOB_STATES_FAILED:\n    case LOAD_FAILED:\n      return error;\n\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  isLoading,\n  pagination,\n  error,\n});\n","import { filter, merge } from 'lodash';\nimport { combineReducers } from 'redux';\nimport {\n  LOGOUT_SUCCESSFUL,\n  UNSCOPED_PROJECT,\n  NEW_TRIGGER,\n  RECEIPT_RECEIVED,\n  SCOPED_PROJECT,\n  TRIGGERS_REQUEST,\n  TRIGGERS_SUCCESS,\n  TRIGGER_CHANGED,\n  TRIGGER_FAILURE,\n  TRIGGER_REMOVED,\n  TRIGGER_REQUEST,\n  TRIGGER_SUCCESS,\n} from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    case TRIGGERS_SUCCESS:\n      return action.payload.entities.triggers || {};\n\n    case TRIGGER_SUCCESS:\n      const { triggers } = action.payload.entities;\n      return merge({}, state, triggers);\n\n    case NEW_TRIGGER:\n      return merge({}, state, action.trigger);\n\n    case TRIGGER_REMOVED:\n      var triggerId = action.triggerId;\n\n      var newState = filter(state, function ({ id }) {\n        return id !== triggerId;\n      });\n\n      return newState;\n\n    case TRIGGER_CHANGED:\n      const { id, change } = action;\n\n      return merge({}, state, { [id]: change });\n\n    case RECEIPT_RECEIVED:\n      return action.payload.entities.triggers || state;\n\n    case 'runs/LOADED':\n      return { ...state, ...action.payload.entities.triggers } || state;\n\n    case 'runs/LOADED_DETAILS':\n      return { ...state, ...action.payload.entities.triggers } || state;\n\n    case UNSCOPED_PROJECT:\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction error(state = false, action) {\n  switch (action.type) {\n    case TRIGGER_FAILURE:\n      return action.payload || action.error;\n\n    case TRIGGERS_REQUEST:\n    case TRIGGER_REQUEST:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case TRIGGERS_REQUEST:\n      return true;\n\n    case LOGOUT_SUCCESSFUL:\n    case TRIGGERS_SUCCESS:\n    case SCOPED_PROJECT:\n      return false;\n    default:\n      return state;\n  }\n}\nexport default combineReducers({\n  items,\n  error,\n  isLoading,\n});\n","import { combineReducers } from 'redux';\nimport {\n  CARD_CHANGE_FINISHED,\n  CARD_CHANGE_REQUESTED,\n  LOGOUT_SUCCESSFUL,\n  UPDATING_USER,\n  USER_RECEIVED,\n  USER_UPDATED,\n  USER_UPDATE_INVALID,\n} from '../constants';\n\nfunction items(state = {}, action) {\n  switch (action.type) {\n    case USER_RECEIVED:\n      return { ...state, [action.user.id]: action.user };\n\n    case USER_UPDATED:\n      return { ...state, [action.payload.id]: action.payload };\n\n    case 'USER_ACTIVATED':\n      return { ...state, [action.payload.id]: action.payload };\n\n    case LOGOUT_SUCCESSFUL:\n      return {};\n\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case UPDATING_USER:\n      return true;\n\n    case USER_UPDATED:\n      return false;\n\n    case USER_UPDATE_INVALID:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nconst initialState = {\n  failure: false,\n};\n\nfunction registration(state = initialState, action) {\n  switch (action.type) {\n    case 'USER_REGISTRATION_FAILURE':\n      return { ...state, failure: true };\n\n    case 'USER_REGISTRATION_SUCCESS':\n      return initialState;\n\n    default:\n      return state;\n  }\n}\n\nfunction changingCard(state = false, action) {\n  switch (action.type) {\n    case CARD_CHANGE_REQUESTED:\n      return true;\n    case CARD_CHANGE_FINISHED:\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  isLoading,\n  changingCard,\n  registration,\n});\n","import { combineReducers } from 'redux';\n\nfunction items(state = [], action) {\n  switch (action.type) {\n    case 'SEARCH_REQUESTED':\n    case 'CLEAR_SEARCH_RESULTS':\n      return [];\n\n    case 'SEARCH_RESULTS_RECEIVED':\n      return [...state, ...action.payload.results];\n    default:\n      return state;\n  }\n}\n\nfunction initializeProgressKeys(keys, bool) {\n  return keys.reduce((acc, key) => {\n    return { ...acc, [key]: bool };\n  }, {});\n}\n\nconst initialState = { inProgress: {}, searchedRange: null, limited: {} };\n\nfunction progress(\n  state = initialState,\n  action\n) {\n  switch (action.type) {\n    case 'SEARCH_REQUESTED':\n    case 'CLEAR_SEARCH_RESULTS':\n      return initialState;\n\n    case 'SEARCH_STARTED':\n      const keys = action.payload.types;\n      return {\n        ...state,\n        searchedRange: { ...state.searchedRange },\n        inProgress: { ...initializeProgressKeys(keys, true) },\n      };\n\n    case 'SEARCH_FINISHED':\n      const type = action.payload.type;\n      const limited = action.payload.limited;\n      return {\n        ...state,\n        inProgress: { ...state.inProgress, ...{ [type]: false } },\n        limited: { ...state.limited, ...{ [type]: limited } },\n      };\n\n    case 'SEARCH_RESULTS_RECEIVED':\n      const searchKey = action.payload.type;\n      return {\n        ...state,\n        inProgress: { ...state.inProgress },\n        searchedRange: {\n          ...state.searchedRange,\n          ...(searchKey ? { [searchKey]: action.payload.range.start } : {}),\n        },\n      };\n\n    default:\n      return state;\n  }\n}\n\nfunction searchId(state = null, action) {\n  switch (action.type) {\n    case 'SEARCH_REQUESTED':\n      return action.payload.searchId;\n    case 'CLEAR_SEARCH_RESULTS':\n      return null;\n    default:\n      return state;\n  }\n}\n\nfunction isLoading(state = false, action) {\n  switch (action.type) {\n    case 'SEARCH_REQUESTED':\n      return true;\n\n    case 'SEARCH_STARTED':\n    case 'SEARCH_RESULTS_RECEIVED':\n    case 'CLEAR_SEARCH_RESULTS':\n      return false;\n\n    default:\n      return state;\n  }\n}\n\nfunction error(state = null, action) {\n  switch (action.type) {\n    case 'SEARCH_REQUESTED':\n    case 'CLEAR_SEARCH_RESULTS':\n      return null;\n    case 'SEARCH_FAILED':\n      return action.payload;\n    default:\n      return state;\n  }\n}\n\nexport default combineReducers({\n  items,\n  searchId,\n  isLoading,\n  progress,\n  error,\n});\n","export default function reducer(\n  state = {\n    isActivating: false,\n    hasActivated: null,\n    activationFailed: null,\n  },\n  action\n) {\n  switch (action.type) {\n    case 'ACTIVATING_USER':\n      return { ...state, isActivating: true };\n    case 'USER_ACTIVATION_FAILED':\n      return { ...state, isActivating: false, activationFailed: true };\n    case 'USER_ACTIVATED':\n      return { ...state, isActivating: false, hasActivated: true };\n\n    default:\n      return state;\n  }\n}\n","window.addEventListener('storage', ({ key }) => {\n  // If another tab removes the `auth_token` (or logs out) trigger a\n  // refresh which takes them to login.\n  if (key === 'auth_token') {\n    // Don't need to close the socket if we refresh, but when we just\n    // transition in React we need to close the socket.\n    // closeSocket(oldValue);\n    window.location.reload();\n  }\n});\n\n// eslint-disable-next-line import/prefer-default-export\nexport function sessionMiddleware() {\n  return next => {\n    return action => {\n      return next(action);\n    };\n  };\n}\n","import { applyMiddleware, combineReducers, compose, createStore } from 'redux';\nimport thunk from 'redux-thunk';\nimport * as Sentry from '@sentry/react';\nimport { omit } from 'lodash';\nimport logger from '../middleware/logger';\nimport promise from '../middleware/promise';\nimport * as reducers from '../reducers';\nimport { sessionMiddleware } from '../session';\n\nconst sentryReduxEnhancer = Sentry.createReduxEnhancer({\n  actionTransformer: action => {\n    Sentry.configureScope(scope => {\n      scope.setExtra('lastReduxAction', {\n        type: action.type,\n      });\n    });\n    return { type: action.type, data: 'REDACTED' };\n  },\n  stateTransformer: state => {\n    // Note: to be secure by design, we have to optionally ADD parts of state\n    // that we are certain don't contain sensitive data, rather then removing\n    // those that we expect might.\n    const safeState = {\n      adaptors: state.adaptors,\n      auth: state.auth,\n      blogPosts: state.blogPosts,\n      channels: state.channels,\n      credentials: 'REDACTED',\n      projectRepoConnections: 'REDACTED',\n      jobs: 'REDACTED',\n      menu: state.menu,\n      notifications: state.notifications,\n      plans: state.plans,\n      products: state.products,\n      projectFiles: 'REDACTED',\n      projectUsers: state.projectUsers,\n      projects: state.projects,\n      receipts: 'REDACTED',\n      runs: 'REDACTED',\n      triggers: 'REDACTED',\n      users: 'REDACTED',\n      activation: state.activation,\n    };\n\n    return safeState;\n  },\n  configureScopeWithState: (scope, state) => {\n    const user = omit(state.users.items[state.auth.currentUserId], [\n      'organization',\n      'orgWebsite',\n      'lastName',\n      'firstName',\n      'lastLogin',\n      'githubAccessToken',\n      'expYear',\n      'last4',\n      'expMonth',\n      'email',\n      'brand',\n    ]);\n\n    scope.setUser(user);\n  },\n});\n\nconst debugMode = Boolean(Number(localStorage.getItem('debug')));\n\nconst middleware = [thunk, promise, sessionMiddleware];\n\nif (debugMode) {\n  middleware.push(logger);\n}\n\nconst enhancer = compose(\n  applyMiddleware(...middleware),\n  sentryReduxEnhancer,\n  window.__REDUX_DEVTOOLS_EXTENSION__\n    ? window.__REDUX_DEVTOOLS_EXTENSION__()\n    : f => f\n);\n\nconst reducer = combineReducers(reducers);\n\nexport default () => createStore(reducer, enhancer);\n","export default function promiseMiddleware() {\n\n  return (next) => {\n    return (action) => {\n\n      if(!action) {\n        console.warn(\"Promise middlware detected an empty action.\")\n      }\n\n      const { promise, types, ...rest } = action;\n\n      if (!promise) {\n        return next(action);\n      }\n\n      const [BEGIN, SUCCESS, FAILURE] = types;\n\n      next({ ...rest, type: BEGIN });\n\n      return promise.then(\n        (response) => next({ ...rest, payload: response, type: SUCCESS }),\n        (error) => next({ ...rest, payload: error, type: FAILURE })\n      );\n    }\n  }\n\n}\n","import React from 'react';\n\nif (process.env.NODE_ENV === 'development') {\n  const whyDidYouRender = require('@welldone-software/why-did-you-render');\n  const ReactRedux = require('react-redux/lib');\n\n  whyDidYouRender(React, {\n    include: [\n      // /ProjectsList/i,\n      // /ProjectScope/i,\n      // /AppFrame/i,\n      // /PrivateRoute/i,\n      // /ReceiptsList/i,\n      // /routes/i,\n      // /router\\./i,\n      // /GAListener/i,\n    ],\n    // trackAllPureComponents: true,\n    trackExtraHooks: [[ReactRedux, 'useSelector', 'useMemo']],\n    // onlyLogs: true\n  });\n}\n\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport { ThemeProvider } from '@material-ui/core/styles';\nimport * as Sentry from '@sentry/react';\nimport { Integrations } from '@sentry/tracing';\nimport { createBrowserHistory } from 'history';\nimport CookieConsent from 'react-cookie-consent';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport router from './config/routes';\nimport theme from './constants/theme';\nimport store from './redux/store';\n\nconst history = createBrowserHistory();\n\nif (window.SENTRY_ENV !== 'dev') {\n  Sentry.init({\n    dsn: window.SENTRY_DSN,\n    release: `openfn@v${window.OFN_VERSION}`,\n    environment: window.SENTRY_ENV,\n    integrations: [\n      new Integrations.BrowserTracing({\n        routingInstrumentation: Sentry.reactRouterV5Instrumentation(history),\n        tracingOrigins: ['localhost', /openfn\\.org/, /openfunction\\.io/],\n      }),\n    ],\n    // Set tracesSampleRate to 1.0 to capture 100%\n    // of transactions for performance monitoring.\n    // We recommend adjusting this value in production\n    tracesSampleRate: parseFloat(window.SENTRY_SAMPLE_RATE) || 1.0,\n  });\n}\n\nrequire.context('../favicons', true, /^\\.\\//);\n\nReactDOM.render(\n  <React.StrictMode>\n    <ThemeProvider theme={theme}>\n      <CssBaseline />\n      <Provider store={store()}>{router}</Provider>\n      <CookieConsent\n        location=\"bottom\"\n        buttonText=\"OK\"\n        buttonId=\"accept-cookies\"\n        cookieName=\"ofnCookie\"\n        style={{\n          background: theme.palette.primary.dark,\n          fontFamily: theme.typography.fontFamily,\n          color: theme.palette.grey[50],\n          opacity: 0.9,\n          zIndex: 2147483647,\n        }}\n        buttonStyle={{\n          color: theme.palette.grey[50],\n          background: theme.palette.secondary.main,\n          fontFamily: theme.typography.fontFamily,\n          borderRadius: theme.shape.borderRadius,\n          fontSize: '14px',\n        }}\n        expires={150}\n      >\n        OpenFn.org uses cookies.{' '}\n        <span style={{ fontSize: '12px' }}>\n          By continuing to use this site you agree to our use of cookies. Read\n          all about our use of data at&nbsp;\n          <a\n            style={{ color: 'white' }}\n            onClick={() => (window.location.href = '/privacy')}\n            href=\"/privacy\"\n          >\n            openfn.org/privacy\n          </a>\n        </span>\n      </CookieConsent>\n    </ThemeProvider>\n  </React.StrictMode>,\n  document.getElementById('app')\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.amdD = function () {\n\tthrow new Error('define cannot be used indirect');\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk\"] = self[\"webpackChunk\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [736], () => (__webpack_require__(76875)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","AUTH_METHODS_REQUEST","AUTH_METHODS_SUCCESS","AUTH_METHOD_REMOVED","BLOG_POSTS_REQUEST","BLOG_POSTS_SUCCESS","BLOG_POSTS_FAILURE","CREDENTIALS_FAILURE","CREDENTIALS_REQUEST","CREDENTIALS_SUCCESS","CREDENTIAL_INVALID","CREDENTIAL_REMOVED","CREDENTIAL_SUCCESS","CREDENTIAL_SHARE_INVALID","JOBS_REQUEST","JOBS_SUCCESS","JOB_CHANGED","JOB_FAILURE","JOB_REMOVED","JOB_REQUEST","JOB_SUCCESS","DISMISS_JOB_ERROR","NEW_TRIGGER","TRIGGER_CHANGED","TRIGGER_FAILURE","TRIGGER_REMOVED","TRIGGER_REQUEST","TRIGGER_SUCCESS","TRIGGERS_REQUEST","TRIGGERS_SUCCESS","LOGIN_FAILED","LOGIN_SUCCESSFUL","LOGOUT_SUCCESSFUL","AUTHENTICATED","UNAUTHENTICATED","CURRENT_USER_FOUND","CURRENT_USER_NOT_FOUND","FETCHING_CURRENT_USER","ADD_RECEIPT","RECEIPTS_RECEIVED","BODIES_RECEIVED","FETCHING_RECEIPT","FETCHING_RECEIPT_FAILED","FETCHING_RECEIPTS","FETCHING_RECEIPTS_FAILED","RECEIPT_RECEIVED","RECEIPT_UPDATED","RECEIPT_JOB_STATES_RECEIVED","FETCHING_RECEIPT_JOB_STATES","FETCHING_RECEIPT_JOB_STATES_FAILED","UPDATING_USER","USER_RECEIVED","USER_UPDATE_INVALID","USER_UPDATED","CARD_CHANGE_REQUESTED","CARD_CHANGE_FINISHED","CHANGING_PLAN","PLAN_CHANGED","PLAN_CHANGE_FAILED","PROJECTS_REQUEST","PROJECTS_SUCCESS","PROJECT_FAILURE","PROJECT_CREATED","PROJECT_REQUEST","PROJECT_SUCCESS","PROJECT_NOT_FOUND","PROJECT_UPDATED","PROJECT_DELETED","PROJECT_DELETION_CANCELED","REQUESTED_USAGE_COUNTS","RECEIVED_USAGE_COUNTS","FAILED_USAGE_COUNTS","RECEIVED_USAGE_HISTORY","RECEIVED_RUN_STATS_FOR_PROJECTS","RECEIVED_RUN_STATS_FOR_PROJECT","PROJECT_USERS_SUCCESS","PROJECT_USER_REMOVED","PROJECT_USER_CREATED","PROJECT_USER_ALREADY_ADDED","COLLAB_EMAIL_NOT_FOUND","REQUESTED_PROJECT_FILES","RECEIVED_PROJECT_FILES","FAILED_PROJECT_FILES","PROJECT_REPO_CONNECTION_CREATED","PROJECT_REPO_CONNECTION_SUCCESS","PROJECT_REPO_CONNECTION_UPDATED","PROJECT_REPO_CONNECTION_REMOVED","REPO_REQUEST","REPO_GET_SUCCESS","REPO_GET_FAILURE","BRANCH_GET_SUCCESS","BRANCH_GET_FAILURE","PRODUCTS_SUCCESS","PLANS_RECEIVED","SWITCHED_MENU","SCOPED_PROJECT","UNSCOPED_PROJECT","CHANNEL_ERROR","JOINING_CHANNEL","LEFT_CHANNEL","NOTIFICATION_ADDED","NOTIFICATION_DISMISSED","LOADING","LOADED","LOADED_DETAILS","LOAD_FAILED","RUNS_UPDATED","RUNS_RECEIVED","RUN_UPDATED","RUN_RECEIVED","msg","theme","dispatch","noteId","Date","now","type","notification","receiptByIdApiPath","jobByIdApiPath","projectBySlugApiPath","slug","clearJobStatePath","job","fetchProjectRepoConnectionPath","project","projectApiPath","runApiPath","run","credentialApiPath","credential","credentialAccessToggleApiPath","triggerByIdApiPath","triggerApiPath","trigger","usageCountApiPath","usageHistoryApiPath","schema","AuthMethod","Credential","Job","ProjectRepoConnection","Product","Project","ProjectWithCollaborators","ProjectFile","Trigger","User","ReceiptJobState","ProjectUser","define","collaborators","ReceiptMatch","idAttribute","receiptMatch","Run","Receipt","receiptMatches","receiptJobStates","RequestFailure","response","status","statusText","url","captureStackTrace","name","NotFound","Unauthorized","BadRequest","UnprocessableEntity","errors","error","camelizeKeys","firstMessage","entries","k","v","handleBadResponse","json","buildHeaders","headers","accept","window","OFN_VERSION","localStorage","getItem","authorization","get","queryParams","Qs","decamelizeKeys","arrayFormat","URL","location","fetch","mode","put","payload","method","body","JSON","stringify","post","del","urlString","toString","getProjects","normalize","getProjectBySlug","putProject","postProject","delProject","projectSlug","cancelProjectDeletion","fetchProjectBySlug","exportProject","style","exportProjectApiPath","then","Notifications","projectExportRequested","catch","projectExportFailed","createProject","description","updateProject","toggleSupportAccess","allowSupport","togglePublic","projectPayload","public","getSocket","token","socket","Socket","params","connect","closeSocket","disconnect","cache","delete","buildOauthConsentUrl","obj","URLSearchParams","fromEntries","filter","toggleValue","func","val","allowSaveForSubmitError","form","getState","submitErrors","dirtyFieldsSinceLastSubmit","dirtySinceLastSubmit","err","some","fieldWithError","hasOwnProperty","insertAceText","editor","string","position","noBreak","insertPosition","sort","join","values","every","value","Number","isInteger","isValidAceEditorPosition","row","session","getLength","column","insert","createFormErrors","submissionErrors","field","message","linkTo","path","history","preventDefault","stopPropagation","ctrlKey","metaKey","open","push","scrollTo","pushTo","closeLoader","loading_screen","finish","setTimeout","hoursAgo","number","getTime","toISOString","prepISO","parseISO","formatTime","databaseString","format","calendarTime","formatRelative","duration","databaseString2","unit","differenceInDays","differenceInMilliseconds","tableTime","time","fullDate","date","formatDistance","addSuffix","RunItemPresenter","start","end","insertedAt","exitCode","startedAt","finishedAt","receiptId","done","startedRaw","validJson","parse","runStarted","runStartFailed","jobId","errorMessage","clickEvent","category","action","label","gtag","cronToHuman","str","opts","cron","isValid","capitalize","cronstrue","slice","toLowerCase","githubAdaptorLink","projectRepoConnection","repositoryOwner","repositoryName","repositoryBranch","pathInExternalRepo","equalOrFalsy","val1","val2","allowAnyOption","options","indexOf","text","formSaveKeys","saveAction","key","humanReadable","uuid","nChars","slugify","replace","slugRule","length","getCurrentUser","jwt","data","user","users","login","email","password","removeItem","expiry","setItem","logout","redirectTo","textLogoWhite","require","sqLogo","sqLogoGradient","how","bgPattern","bgNoise","pdf","diagram","diagramHumanitarian","airport","farmers","communityHealthWorkers","miraclefeet","lego","commcareDhis2","aissatou","aleksa","ben","elias","isma","joe","nick","mtuchi","rita","rory","roger","santiago","santosh","stu","taylor","ase","bt","caris","cfk","drinkwell","fca","grs","ikapadata","irc","keteka","lastMileHealth","livelyhoods","logicalOutcomes","lwala","lwr","miracleFeet","myagro","nalibali","nrc","popcouncil","psi","saep","sff","sinapis","skateistan","swissTPH","tns","unFoundation","unicef","vpuu","wcs","xrunner","dial","digitalSquare","poptech","mulago","salesforceOrg","echoinggreen","dasra","chai","chile","dsme","ukAid","adminCert","devCert","vera","ayder","kkt","os4h","ampImpact","azureAd","civiCrm","collect","angaza","arcGis","asana","bahmni","bambooHr","baoSystems","beyonic","box","brck","captricity","carto","caleuche","cartodb","certificate","commcare","commCareHq","commCare","crisisNet","crowdmap","devResults","dhis2","dhis2White","dropbox","echoMobile","engagespark","engageSpark","enketoSmartPaper","eskuad","facebook","facebookMessenger","frontlineCloud","frontlineSms","godata","googlesheets","googleSheets","googleMaps","http","iFormBuilder","iformbuilder","kobotoolbox","koBoToolbox","iHris","humansis","keychain","khanacademy","khanAcademy","kopoKopo","ibmMaximoEam","magpi","mailchimp","mailgun","mapbox","maximo","mogli","mPesa","medicMobile","medicmobile","microsoftDynamics","dynamics","mobenziResearcher","mongodb","mongoDb","motechSuite","mysql","mySql","mssql","nexmo","oauth2","oAuth20","odkX","odk","odkWhite","odoo","ona","openConceptLabOcl","openMrsWhite","openMrs","openmrs","openfn","openHim","openhim","openSrp","postgresql","postgreSql","primero","progres","rapidpro","rapidPro","raw","resourcemap","resourceMap","salesforceForceCom","salesforceClassic","salesforceOffline","salesforce1","salesforce","sap","serenicNavigator","sftp","sharepoint","smap","smpp","statwing","sumRandoVpn","surveyCto","surveycto","taroWorks","telerivet","twilio","theSocialCollective","ushahidi","votoMobile","vtigerCrm","vtiger","zoho","zohoReports","microsoftAzure","microsoft","googleSignInNormal","googleSignInDisabled","projectPath","projectAccessPath","projectSettingsPath","projectUsagePath","projectJobsPath","projectJobPath","projectJobEditPath","projectSaveAndRunJobPath","projectProjectRepoConnectionsPath","projectReceiptsPath","projectReceiptInspectPath","receipt","projectCredentialsPath","projectCredentialPath","runShowPath","projectRunsPath","projectNextRunPath","nextId","projectPrevRunPath","prevId","projectParentRunPath","parentId","newAuthMethodPath","projectTriggersPath","projectTriggerPath","projectDownloadsPath","useStyles","makeStyles","root","paddingBottom","spacing","OneCardHolder","children","wide","full","noPad","classes","container","justifyContent","className","item","xs","md","lg","xl","React","flexGrow","zIndex","textAlign","parent","Loader","verb","naked","round","CircularProgress","LinearProgress","delUser","userUpdated","userUpdateFailed","cardChangeFinished","resetPassword","hashed_password_reset_token","hashedPasswordResetToken","recoverPassword","resendConfirmationLink","resendConfirmationLinkApiPath","updateUser","updatingUser","changes","userByIdApiPath","updatedUser","Promise","reject","putUser","userUpdateInvalid","assignDefaultCard","stripeToken","postNewCard","fetchBranches","owner","branches","useHistory","useLocation","search","confirmationToken","userId","useDispatch","useSelector","state","activation","isActivating","hasActivated","activationFailed","useEffect","document","title","user_id","confirmation_token","activateUser","marginTop","marginBottom","avatar","Avatar","Security","variant","onClick","href","target","selectMenuKey","menu","selectedMenuKey","selectCurrentPlan","planId","plans","items","selectUsageCount","projectId","projects","usageCounts","selectProjectError","selectUsageDetails","usageCount","plan","jobs","runsInPeriod","runLimit","submissionLimit","jobsCount","x","autoprocess","jobLimit","selectJobs","selectJob","identifier","find","expression","selectReceipts","receipts","attachReceiptJobStates","runs","Boolean","assembleMatches","matches","Array","isArray","triggerId","triggers","attachMatches","selectReceiptJobStateError","selectReceiptError","selectReceiptsLoading","isLoading","selectReceiptsPagination","pagination","selectSearchId","searchResults","searchId","selectSearchIsLoading","selectSearchProgress","progress","selectSearchError","selectSearchResults","a","b","selectRuns","selectRunsPagination","selectRunsLoading","selectAdaptors","adaptors","selectAdaptorInstalled","adaptorKey","onDemandItems","installed","selectAdaptorFetchingHelpers","helpers","fetchingHelpers","selectTriggers","selectCredentials","credentials","selectHelpers","adaptor","selectJobError","selectCurrentUser","selectUsers","auth","currentUserId","selectAuth","selectNotifications","notifications","selectProjects","selectScopedProject","scopedProject","selectBlogPosts","blogPosts","p","pubDate","loading","ActivationModal","onClose","onVerificationRequiredPage","pathname","color","autoFocus","currentUser","withStyles","warning","palette","light","overLimit","categoryHeader","paddingTop","categoryHeaderPrimary","backgroundColor","itemCategory","boxShadow","itemActiveItem","primary","main","itemPrimary","fontSize","itemIcon","minWidth","marginRight","hIcon","divider","withTheme","props","selectedProject","usageWarning","categories","icon","SettingsEthernet","FlashOn","VpnKey","Build","Inbox","History","Search","ListAlt","LinearScale","Tune","CloudDownload","Settings","generalLinks","Dashboard","LibraryBooks","QuestionAnswer","Code","InsertChart","Public","IS_OTP","hostname","Home","Fingerprint","List","disablePadding","i","ListItem","disabled","ListItemIcon","ListItemText","childId","button","clsx","postChangePlan","attrs","postChangePlanPath","changePlan","changingPlan","planChanged","planChangeFailed","changeDefaultCard","cardDetails","cvc","Stripe","card","createToken","exp","UserActions","changeRejected","APIError","this","stack","fetchPlans","plansReceived","plansFetchFailed","prototype","create","constructor","textField","helperText","fontFamily","typography","codeFont","TextInput","input","fullWidth","multiline","hidden","area","monospace","instant","meta","touched","submitError","custom","useState","showPassword","setShowPassword","getSubmitErrorMessage","concat","isRaw","textValue","showError","Hidden","xsUp","implementation","FormControl","InputLabel","htmlFor","Input","endAdornment","IconButton","Visibility","VisibilityOff","inputProps","role","onBlur","event","undefined","InputProps","gray","clickable","cursor","secondary","validate","validateCardNumber","validateExpiry","validateCVC","cardIcons","Visa","MasterCard","Discover","JCB","Unknown","focused","setFocused","projectItems","ownedInboxes","userRole","showCardChangeModal","changingCard","handleFocus","Payment","querySelector","last4","expMonth","expYear","brand","placeholders","article","current","cardStyle","subheader","CreditCard","Table","TableHead","TableRow","TableCell","Help","TableBody","ownedInbox","hover","price","billingPeriodEnd","TransitionProps","onExited","onSubmit","openFnError","stripeError","render","handleSubmit","submitting","invalid","pristine","component","placeholder","onFocus","sm","handleResponse","getCredentials","query","handleRawBodies","includes","getCredential","prepBody","rawBody","putCredential","transferTarget","deleted","external_id","externalId","project_id","destroyCredential","postCredential","changeProjectCredential","fetchCredentials","promise","types","credentialCreated","credentialSuccess","credentialUpdateFailed","credentialShareInvalid","updateCredential","createCredential","deleteCredential","transferCredential","target_email","target_id","switchedMenu","unscopedProject","grid","display","marginLeft","width","gridColumn","paddingLeft","backgroundClip","columnBreakpoints","breakpointColumnsObj","default","breakpointCols","columnClassName","SearchTooltip","tooltip","maxWidth","Tooltip","SectionFrame","anchorEl","setAnchorEl","handleClose","actions","filters","searchHeading","assign","helper","searchText","section","jsonOnly","onSearchFocus","onSearchBlur","onSearchKeyDown","hasError","sectionFrame","Paper","Toolbar","disableHoverListener","onChange","margin","startAdornment","onKeyDown","flex","right","noSearch","lgUp","currentTarget","startIcon","FilterList","filtersMenu","keepMounted","mdDown","JIRA_SUPPORT","fabShift","fab","Fab","SupervisorAccount","Add","defaultProps","padding","bottom","getJobs","getJobById","postJob","putJob","adaptorInstallFailed","getAdaptors","getHelpers","version","originalAdaptorName","originalAdaptorVersion","convert","helpersSuccess","fetchJobs","fetchJobById","jobSuccess","jobFailed","archiveJob","jobArchive","archived","toggleOption","updateJob","toggleJob","dismissJobError","createJob","runJob","leaveIfUnused","channel","canLeave","hasNoExtraBindings","bindings","test","leave","bindEvents","eventRefs","evt","callback","on","forEach","ref","off","setupChannel","channelName","topic","receive","onError","joinChannel","existingChannel","channels","unbindFunc","group","FormActions","cancel","submit","reset","mini","cancelText","submitText","enterPress","formState","hasValidationErrors","hasSubmitErrors","modifiedSinceLastSubmit","isPristine","Cancel","Undo","size","Save","textDecoration","Link","rel","UserDetails","picture","src","alt","ExternalIdLabel","SignInWithOauthProvider","Oauth2","initialValues","fromWizard","onSubmitComplete","onCancel","consentText","hiddenFields","oAuthProviderName","providerUserInfoUrl","providerAuthUrl","accessScope","providerTokenUrl","formRef","useRef","useParams","credentialInitialValues","oAuthProvider","userInfoUrl","scope","authUrl","tokenUrl","channelKey","Math","random","fieldIsHidden","skipValidationForSecrets","result","leaveChannel","updated","batch","entities","change","handleOauthServerResponse","refreshToken","accessToken","clientId","clientSecret","dirtyFields","errorsBody","hasConsent","userInfo","autoComplete","provider","bodySchemas","apiVersion","apiUrl","apiToken","account","apiKey","cert","ca","hostUrl","applicationName","appId","username","deprecationMessage","Images","height","baseUrl","authType","consumerKey","secretKey","baseURL","server","domain","db","loginUrl","securityToken","secret","clusterUrl","database","port","userName","host","apiSecret","instanceUrl","ssl","allowSelfSignedCert","basicAuth","instanceName","accountSid","authToken","systemId","clientHost","identity","deprecation","array","CredentialForm","bodySchema","credentialSlug","deprecationOverride","setDeprecationOverride","showRawJson","setShowRawJson","bodyFields","reduce","acc","components","op","fieldName","control","checked","Checkbox","otherError","onKey","red","header","help","modalShow","setModalShow","expandIcon","ExpandMore","AssignmentInd","valid","imageSubheader","maxHeight","accessSection","borderBottomLeftRadius","borderBottomRightRadius","deleteModalShow","setDeleteModalShow","credentialAdaptors","newCred","useMemo","exisitingCred","findCredential","allowList","allProjects","toUpperCase","handleProjectCredential","toggleProjectCredential","fetchCredential","fields","KeychainHelper","DeleteModal","FormComponent","WrappedComponent","titleTypographyProps","noWrap","subheaderTypographyProps","Delete","goBack","separator","borderTop","grey","borderBottom","buttonContainer","media","CredentialModal","show","onHide","selectedAdaptor","setSelectedAdaptor","adaptorsList","credentialsList","c","onAdaptorSelect","newCredentialPath","onModalHide","dialog","DialogContentText","direction","CredentialAssignmentModal","ErrorTokenRequest","errorText","ErrorOutline","currentUserIsOwner","requestTokenError","userEmail","CredentialsList","setFilter","showCredModal","setShowCredModal","showAssignmentModal","setShowAssignmentModal","closeModals","ErrorPresenter","resetErrorHandler","showReportDialog","errorCode","ErrorDisplay","fourOhFour","to","from","expired","fourHundred","fiveHundred","sentryFeedbackDialogOptions","subtitle","subtitle2","back","bullet","transform","pos","MAINTENANCE_MESSAGE","gutterBottom","PrivateRoute","rest","isAuthenticated","expiration","isExpired","getUsageCount","getUsageCounts","getUsageHistory","fetchUsageCount","getAuthMethods","fetchAuthMethods","createAuthMethod","authMethod","auth_method","postAuthMethod","authMethodCreated","authMethodCreateFailed","deleteAuthMethod","authMethodId","fetchProjectUsers","projectUsers","deleteProjectUser","projectUser","projectUserApiPath","projectUserId","createProjectUser","userByEmailApiPath","project_user","AuthMethodItem","onDelete","countMethods","otherProps","passHidden","setPassHidden","keyHidden","setKeyHidden","handlePassClick","handleKeyClick","showHideDeleteModal","basicToggle","apiKeyToggle","createdAt","toggleSupport","dark","paddingRight","addAuth","collabEmail","showSupportModal","setState","authMethods","am","projectUserItems","projectUserCount","pu","addCollabStatus","collaboratorAddStatus","currentPlan","prevState","hideModal","handleDelete","handleAddUser","canAddCollabs","masterSupport","userLimit","SupportModal","NoAuthMethods","Switch","labelPlacement","PersonAdd","MenuItem","align","collaborator","RemoveCircle","Lock","EnhancedEncryption","formControl","SelectInput","allowAny","allowEmpty","showEmpty","noOptions","shrink","Select","displayEmpty","createModalShow","setCreateModalShow","authMethodCount","showCreateModal","hideCreateModal","handleCancel","typeOptions","validationErrors","FORM_ERROR","getPaginationFromHeaders","perPage","total","totalPages","camelizeTrigger","criteria","exclusion","decamelizeTrigger","getTriggers","getTriggerById","putTrigger","postTrigger","camelizeReceipt","original","rm","receiptUpdated","normalizeReceipt","fetchReceiptFailed","fetchReceiptById","fetchReceiptJobStates","receiptIds","loadReceipts","page","updateReceipt","loadedReceiptJobStates","receiptsEnqueued","count","getRuns","getRun","runsEnqueued","createRun","loadRuns","loaded","loadRun","loadedDetail","runFailed","receiveRun","pageNumber","endDate","fetchTriggers","triggerRequest","triggerSuccess","triggerFailure","fetchTrigger","updateTrigger","createTrigger","addNotification","list","ExpressionHelper","fn","docs","examples","tags","disableGutters","onSelect","disableTypography","example","onCopy","latestVersionText","selectedOperation","setSelectedOperation","githubLink","npmCutOff","npm","adaptorVersion","useNpm","cmp","npmUrl","substring","ghUrl","produceDocs","operation","ExpandLess","Collapse","in","timeout","unmountOnExit","Drawer","anchor","ListSubheader","GitHub","operations","Book","common","ace","config","set","setModuleUrl","langTools","snippetManager","themeOptions","setupEditor","$worker","send","environments","esversion","undef","createSnippets","tag","index","caption","functionName","getExamples","flat","codeWithTabs","split","cleanCode","getSnippetForExample","snippet","snippetText","parseSnippetFile","parseSnippet","addGlobals","adaptorGlobals","adaptorName","commons","validAst","adaptorFunctions","globals","console","addCompleter","getCompletions","prefix","completions","score","f","previousSnippets","prevSnippets","snippetMap","javascript","sessionMode","$mode","$id","sessionSnippetsScope","files","unregister","snippetNameMap","snippets","register","success","avSuccess","failed","avFailed","running","avRunning","other","avOther","ExitCodeIcon","circleSize","CheckCircle","Warning","interval","Timer","Done","fail","unknown","flexWrap","alignItems","triggerOptions","typeHelpers","CronText","hCron","TriggerView","submitAction","j","jobsUsingTrigger","showModal","handleDeleteTrigger","deleteTrigger","jobsList","names","jobOptions","mutators","modify","changeValue","triggerIcons","handleTypeChange","NewTriggerView","GetSampleReceiptsButton","onLightBg","Refresh","IconPicker","currentOption","handleClick","hint","font","content","top","left","pointerEvents","background","borderRadius","opacity","MozBoxSizing","WebkitBoxSizing","boxSizing","MozBackgroundClip","WebkitBackgroundClip","WebkitTransition","transition","borderLeft","borderRight","borderColor","inline","transWhite","border","StudioInput","hoverError","disableUnderline","select","SelectProps","InputLabelProps","createOptions","arrayOfPaths","nodeArray","depth","node","isDotableNodeName","isNaN","parseFloat","isNumeric","copyPath","hasQuotes","extra","AdaptorModal","handleShowModal","handleAdaptorChange","mainForm","mainFormValues","customAdaptorName","customAdaptorVersion","match","PrevAndNextReceipts","currentReceiptIndex","nextReceipt","prevReceipt","ChevronRight","ChevronLeft","DocumentationButton","toggleDrawer","currentAdaptor","astAvailable","selectAdaptorAstInstalled","endIcon","OptionButtons","handleThemeChange","Palette","Copiable","textToCopy","Notification","SimpleHelperButton","DropDownHelperButton","menuItems","dense","HelperButtons","FormActionsConfiguration","fullScreen","toggleScreenMode","customPristine","ToolTipScreenMode","FullscreenExit","Fullscreen","StudioHeader","credentialOptions","adaptorOptions","AppBar","elevation","projectRepoConnectionId","Wrapper","flexContainer","bigEditor","WizardHeader","Wizard","smallEditor","TriggerDialog","modalClass","formOnChange","showTriggerModal","loadSampleReceipts","hideTriggerModal","triggerShow","versionOptions","activeStep","setActiveStep","handleResize","Stepper","nonLinear","orientation","Step","StepButton","StepLabel","StepContent","newButton","editModal","credentialId","pickerTextField","fontWeight","overflowX","backgroundImage","minHeight","pickerAdornment","splitter","whiteSpace","transWhiteDark","splitterBottom","splitterTitle","webkitTransform","paneContainer","editorTitle","textJustify","primaryBlue","overflow","paper","offWhite","jsonExplorerStyles","splitPaneStyles","flexFlow","disabledButton","optionExtra","codeEditor","receiptViewer","logViewer","selectedReceipt","handleCreateRun","editorStyle","setFullScreen","pathToNode","showAdaptorModal","runId","runsLoading","maxVersion","installingCurrentAdaptor","installing","selectInstallingAdaptor","currentAdaptorInstallMessage","selectInstallStatusMessage","currentAdaptorInstallError","installError","selectAdaptorInstallError","currentAdaptorInstalled","setTriggerShow","requested","selectAdaptorRequested","bool","handleReceiveLog","handleShowAdaptorModal","handleReceiveRun","handleReceiveAdaptor","receiveAdaptor","handleReceiveAdaptorError","receiveAdaptorError","setGrowth","domElement","resize","cleanupFn","new","installAdaptor","step","onStopResize","Autocomplete","autoHighlight","clearOnBlur","clearOnEscape","jsonKeyPathList","nodeType","keyPathType","groupBy","filterOptions","inputValue","getOptionLabel","option","renderOption","navigator","clipboard","writeText","noOptionsText","picker","renderInput","configuration","showPrintMargin","readOnly","propagate","CloudQueue","tabSize","editorProps","$blockScrolling","Infinity","onLoad","setOptions","enableBasicAutocompletion","enableLiveAutocompletion","enableSnippets","SlowMotionVideo","setValue","ClearAll","wrapEnabled","setCurrentReceiptIndex","drawerOpen","setDrawerOpen","setError","jobError","allCredentials","t","selectedTriggerId","selectTriggerId","selectedTrigger","sortedVersions","versions","reverse","useCallback","newVersion","initValues","currentJob","newRun","r","saveAndRun","newJob","JobItem","onToggle","order","triggerDisplay","longRunIcon","longRun","WatchLater","cardHeaderRoot","cardHeaderContent","logo","Language","handleToggle","jobCardContent","triggerIcon","primaryTypographyProps","FolderShared","Today","updatedAt","verticalAlign","backgroundSize","archiveShow","setArchiveShow","jobItems","archivedCount","triggerItems","credentialItems","filteredJobs","toggleArchived","deleteJob","gotoJob","addProjectRepoConnectionFailed","projectRepoConnectionUpdatedSuccess","fetchProjectRepoConnection","projectRepoConnections","createProjectRepoConnection","autodeployEnabled","project_repo_connection","repository_owner","repository_name","repository_branch","autodeploy_enabled","updateProjectRepoConnection","paginationGrid","goToPage","PaginationControls","currentPage","numberPerPage","targetPage","setTargetPage","totalPagesDisplay","newValue","shortValue","suffixNum","floor","precision","toPrecision","toFixed","abbreviateNumber","invalidTargetPage","resetTargetPage","min","max","KeyboardReturn","FirstPage","KeyboardArrowLeft","KeyboardArrowRight","LastPage","noBorder","bar","être","plural","lastArrival","borderless","queueSize","setQueueSize","querying","setQuerying","throttled","projectCheckQueuePath","checkQueue","trailing","nRuns","nReceipts","runText","receiptText","colSpan","floatRight","float","recharts","heading","pxToRem","secondaryHeading","flexBasis","useTheme","clearStateModalShow","revertModalShow","revertEvent","setArrival","events","je","timestamp","editors","hasCrashes","states","crashed","triggerJob","triggerJobName","userTheme","lastSuccess","jobStateUpdatedDate","hideClearStateModal","hideRevertModal","job_id","handleRevertJob","githubEventId","github_event_id","updatedJob","revertJob","ceil","noConsole","ClearStateModal","clearJobState","RevertModal","commitSha","eventId","ArchiveModal","private","OpenInNew","checkedIcon","togglePrivate","Unarchive","Archive","LockOpen","toggleNoConsole","Edit","Info","DeleteForever","PlayCircleFilled","ResponsiveContainer","AreaChart","stats","XAxis","dataKey","YAxis","Legend","Area","stackId","stroke","fill","dot","strokeWidth","Power","Schedule","minLines","maxLines","eventType","paginationControls","filterParams","prevQuery","getProjectFiles","allProjectUsers","projectFilesLoading","projectFiles","allProjectFiles","formatDistanceStrict","expiresAt","d","log","pow","formatBytes","fromUnixTime","linkExpiry","ConfirmChangeModal","confirmChange","previousPlan","proposedPlan","blockDowngradeForJobs","blockDowngradeForCollabs","upgrade","PureComponent","ExportProjectConfigModal","exportYaml","exportLightning","DeleteProjectModal","_","projectName","submitSucceeded","check","contentArea","PlanSlider","mark","thumb","active","track","rail","Slider","marks","PlanChangeForm","slider","valueLabelDisplay","CancelProjectDeletionModal","formatDistanceToNow","scheduledDeletion","centered","link","usage","chart","newSlug","changeModalShow","setChangeModalShow","addressHidden","setAddressHidden","exportModalShow","setExportModalShow","cancelProjectDeletionModalShow","setCancelProjectDeletionModalShow","showPublicModal","setShowPublicModal","isChanging","selectedProjectPlanId","selectedPlanId","setSelectedPlanId","nextPlan","nextPlanId","selectedPlan","days","billingPeriod","usageDetails","percentDone","pastDue","limit","trajectory","planLine","y","pace","safe","paceFill","pacePercent","baseInboxUrl","protocol","hideExportModal","handleYaml","handleLightning","showChangeModal","PublicModal","LocalLibraryOutlined","LocalLibrary","MoreVert","placement","thing","address","concurrency","notificationThreshold","ScatterChart","hide","strokeDasharray","Scatter","line","rejectChange","changeDetails","CheckboxInput","js","projectRepoConnectionsRepos","repos","projectRepoConnectionsBranches","projectRepoConnectionsIsLoadingRepos","isLoadingRepos","projectRepoConnectionOwner","enabledForProject","versionControl","isProjectRepoConnectionOwner","deleteProjectRepoConnection","githubPath","webhookId","floatingLabelText","findIndex","selectedRepo","handleRepoChange","RunItem","onRetry","deleteIcon","play","retry","Type","xsDown","initialWidth","wordBreak","TouchApp","Chip","chip","smUp","topCard","expansion","expansionBottom","wait","appBar","summary","Warnings","notes","Transition","Slide","CopyBlockButton","attribute","FileCopy","AceModal","TransitionComponent","edge","Close","focus","JobMatchRow","onTrigger","ManualRow","headerModalShow","setHeaderModalShow","bodyModalShow","setBodyModalShow","assembledRuns","assembleRuns","handleRetry","JsonAce","retainReceipts","Mail","projectReceiptEditPath","restoreReceipt","Restore","projectPrevReceiptInspectPath","projectNextReceiptInspectPath","striped","resetState","inboxUrl","sending","CreateMessageModal","otherParams","Send","BulkModal","onConfirm","queryString","totalItems","properAction","charAt","export","reprocess","messages","noFlows","noFlowText","estimateText","DateFilter","filterChanged","noNow","startDate","selectedStartDate","handleStartDateChange","selectedEndDate","handleEndDateChange","rangeChange","setRangeChange","jobStates","dateRange","M","utils","DateFnsUtils","showTodayButton","disableFuture","emptyLabel","EmptyList","extraChip","RowError","chipArray","playButton","onRunClick","receiptJobStateError","rjsLabels","matchLabels","defaultFilter","searchString","svg","selectEmpty","rightIcon","belowTable","bottomSpace","ActionButtons","receiptsLength","onReprocessClick","onExportClick","defaultFilters","setSearchText","PlaylistPlay","MatchingTriggersFilter","RelatedRunsFilter","autoWidth","ReceiptsFilterBar","FilterBar","setShowCreateModal","keyCode","exportModalVisible","setExportModalVisible","reprocessModalVisible","setReprocessModalVisible","useQueryParams","withDefault","StringParam","NumberParam","queryObj","setQuery","receiptsWithJobStates","receiptsWithMatches","allReceipts","allTriggers","handleReceiveReceipt","newlyInserted","inserted_at","receiveReceipt","receipt_id","handleReprocessOne","acceptExport","exportReceipts","hideReprocessModal","acceptReprocess","leaveReceiptsChannel","leaveRunsChannel","receiptsResponse","colsSpan","invalidBody","jsonEditor","useHotkeys","execCommand","bodyEditor","flexDirection","defaultExpanded","onBulkRetryClick","JobFilter","SuccessFilter","RunsFilterBar","bulkRetryModalVisible","setBulkRetryModalVisible","allRuns","allJobs","hideBulkRetryModal","acceptBulkRetry","exportQueryString","exportRunsApiPath","cleanup","failure","rerun","RunView","runStartedText","initialLogState","logState","setLogState","jobTrigger","isFlow","TimerOff","disableFocusListener","prevProps","nextProps","responseData","searchedRange","inProgress","typeInProgress","wasLimited","limited","limitedOn","finished","bodies","logs","hasProgress","menuButton","breakpoints","up","shape","alpha","searchIcon","inputRoot","inputInput","transitions","initialState","dateFilter","setDateFilter","setTypes","setDateRange","setString","disableSearch","setDisableSearch","searchProgress","searchIsLoading","searchError","disabledSearchButton","handleReceiveResult","results","handleSearchFinished","handleSearch","uuidv4","Box","bgcolor","ToggleButtonGroup","newTypes","ToggleButton","Subject","InputBase","borderTopLeftRadius","matchType","model","searchResult","smallIcon","jobName","humanCron","substr","projectUsageDetails","periodEnd","periodStart","childRoutes","AccessSettings","RunsList","AuthMethodNew","CredentialView","ProjectFilesList","JobsList","JobEdit","JobView","ReceiptsList","ReceiptInspector","ReceiptView","ProjectSettings","TriggersList","hasLoaded","setLoaded","triggerSlug","findTrigger","UsageCountsList","SearchConsole","findProject","projectsInFlight","Component","exact","getRunStatsForProject","projectRunStatsApiPath","dateMarker","ProjectItem","runStats","usageCountsLoading","placeInCycle","stat","wordWrap","valueBuffer","WelcomeMessage","hasProjects","AddCircle","YouTube","getElementById","click","Chat","handleCreate","ProjectsList","loadingDetails","fetchRunStatsForProject","noTopPad","noBottomPad","intro","outro","lineHeight","styling","info","Snackbar","ContentProps","anchorOrigin","vertical","horizontal","autoHideDuration","reason","alertIcon","currentPassword","emailConfirmation","passwordMessage","passwordConfirmation","getProducts","products","freeSolo","multiple","product","DeleteAccountModal","performDeletion","deleteUser","ok","getContrastText","firstName","lastName","oAuthConsentParams","githubAccessToken","DinersClub","notificationOptions","editorStyleOptions","handleToken","removeToken","notificationLabel","emailLabel","requiresActivation","leftMargin","rightMargin","userMenu","topButton","down","handleLinkTo","handleMenu","userMenuAnchor","AccountCircle","transformOrigin","ExitToApp","postTicket","ticket","getTicketTypes","ticketKey","setTicketKey","setTicketTypes","openDialog","setOpenDialog","ticketType","requestType","details","feedback","defaultValue","rows","ticketTypes","alerts","setAlerts","handleReceiveAlert","alert","handleReceiveDirective","directive","reload","leaveAlertsChannel","force","leaveAllBrowsersChannel","contents","needsUpgrade","upgradeHtml","Alert","severity","warningIcon","unixExpiration","threshold","dismissals","setDismissals","urgency","setUrgency","setInterval","rt","calculateRemainingTime","clearInterval","WarningRounded","toUTCString","sessionExtensionSuccess","drawerWidth","drawer","easing","sharp","leavingScreen","appBarShift","enteringScreen","flexShrink","drawerClose","toolbar","mixins","contentWithDrawer","UpgradeWarning","percentage","haltedMessage","propTypes","PropTypes","ProjectDeletionWarning","drawerPermanent","setDrawerPermanent","mobileOpen","setMobileOpen","showActivationModal","setShowActivationModal","setUserMenuAnchor","dismissNotification","firstNotification","userConfirmation","confirmedAt","FullDrawer","handleDrawerOpen","SOFT_MAINTENANCE","smDown","Menu","mdUp","disableClearable","getOptionSelected","pickProject","blurOnSelect","FeedbackButton","hist","args","enterDelay","onOpen","leaveDelay","drawerPaper","ModalProps","fallback","resetError","Sentry","ActivationPage","SignupConfirm","Billing","listStyle","listItem","bigMenu","white","normal","darken","vertDivider","subMenuList","subMenu","linkGenerator","sideLinkGenerator","subLinkGenerator","links","why","AssignmentTurnedIn","trust","compliance","AccountBalance","apps","Apps","ViewCarousel","clients","pricing","ChromeReaderMode","community","Forum","github","blog","RssFeed","about","Business","partners","Navigation","team","People","mission","Explore","g1","g2","g3","g4","withRouter","Dots","documentMode","particles","density","enable","value_area","polygon","nb_sides","image","anim","speed","opacity_min","sync","size_min","line_linked","distance","move","straight","out_mode","bounce","attract","rotateX","rotateY","interactivity","detect_on","onhover","onclick","modes","grab","bubble","repulse","particles_nb","remove","retina_detect","banner","more","Banner","dispatchEvent","Event","resizeEvent","createEvent","initUIEvent","getBlogPosts","roots","chips","signupContainer","signupLogos","quote","selected","blm","green","playerWrapper","reactPlayer","SocialStories","alternate","toolbarTitle","layout","local","cardHeader","cardPricing","cardActions","adaptorIcon","httpIcon","desc","website","customAdaptor","raised","fontVariant","guid","face","bio","profile","IEWarning","RequireBrowser","imagePaths","nextPath","authMessage","VerifiedUser","resetContainer","topMenuList","topLine","topLink","iconDarken","marketingFrame","setSubMenu","setDrawer","menuExpanded","setMenuExpanded","Signup","UserLogin","ResetPassword","AccountDeletionConfirmation","sendPageView","GA4_TRACKING_CODE","page_path","GAListener","listen","ReactRouterRoute","Route","AppFrame","Marketing","headerFont","bodyFont","createTheme","amber","h1","h2","h3","h4","h5","h6","subtitle1","body1","body2","overline","MuiTab","disableRipple","MuiButton","disableFocusRipple","overrides","MuiCssBaseline","html","pre","MuiCardHeader","MuiDrawer","paperAnchorLeft","textTransform","contained","MuiTabs","indicator","borderTopRightRadius","MuiIconButton","MuiTooltip","MuiDivider","MuiListItemText","MuiListItemIcon","MuiAvatar","store","next","debug","uniqueId","combineReducers","astInstalled","astError","Auth","newState","detailsLoading","changeRequested","projectRunStats","requestCollaboratorAdd","defaultPagination","existingIds","registration","initializeProgressKeys","searchKey","range","reducer","addEventListener","sentryReduxEnhancer","actionTransformer","setExtra","stateTransformer","configureScopeWithState","setUser","debugMode","middleware","thunk","warn","BEGIN","SUCCESS","FAILURE","logger","enhancer","compose","applyMiddleware","__REDUX_DEVTOOLS_EXTENSION__","reducers","createBrowserHistory","SENTRY_ENV","dsn","SENTRY_DSN","release","environment","integrations","Integrations","routingInstrumentation","tracingOrigins","tracesSampleRate","SENTRY_SAMPLE_RATE","ReactDOM","ThemeProvider","CssBaseline","createStore","router","buttonText","buttonId","cookieName","buttonStyle","expires","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","call","m","amdD","O","chunkIds","priority","notFulfilled","fulfilled","splice","n","getter","__esModule","definition","defineProperty","enumerable","g","globalThis","Function","hmd","prop","Symbol","toStringTag","nmd","paths","baseURI","self","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""}