{"version":3,"file":"8960.8f1a483f.js","mappings":"+OAIO,IAAKA,EAAe,SAAfA,GAAe,OAAfA,EAAAA,EAAe,eAAfA,EAAAA,EAAe,eAAfA,EAAAA,EAAe,mBAAfA,EAAAA,EAAe,yBAAfA,EAAAA,EAAe,6BAAfA,CAAe,MAQpB,SAASC,EAAmBC,EAAuBC,GACxD,OAAQD,GACN,KAAKF,EAAgBI,KACnB,MAAO,CACLC,MAAO,gBAEX,KAAKL,EAAgBM,OAGnB,MAAO,CACLD,MAAO,kBASX,KAAKL,EAAgBO,UACnB,MAAO,CACLF,MAAO,aASX,KAAKL,EAAgBQ,YACnB,MAAO,CACLH,MAAO,eAUf,CAgBO,SAASI,EAAWC,GAAyC,IAAxC,MAAEC,EAAK,UAAEC,GAA6BF,EAChE,OAAIC,IAAUX,EAAgBa,KAAa,MAGzCC,EAAAA,EAAAA,KAAA,OACEF,UAAWG,IAAW,oCAAqCH,EAAW,CACpE,eAAgBD,IAAUX,EAAgBI,KAC1C,gBAAiB,CAACJ,EAAgBO,UAAWP,EAAgBQ,aAAaQ,SAASL,GACnF,aAAcA,IAAUX,EAAgBM,UAIhD,CCzEA,MAAMW,EAAkB,IAAK,IAExBC,EAAkB,SAAlBA,GAAkB,OAAlBA,EAAAA,EAAkB,yBAAlBA,EAAAA,EAAkB,mBAAlBA,CAAkB,EAAlBA,GAAkB,IAWvB,MAAMC,EAAgC,CACpC,CAAEC,UAAWC,IAAUC,iBAAiB,EAAOC,WAAY,YAC3D,CAAEH,SAAU,IAAKE,iBAAiB,EAAOC,WAAY,SACrD,CAAEH,SAAU,IAAKE,iBAAiB,EAAOC,WAAY,QACrD,CAAEH,SAAU,IAAKE,iBAAiB,EAAMC,WAAY,SAGtD,SAASC,EAAaC,GAAoF,IAAzDC,EAAuBC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,eAAeJ,eACxF,MAAMK,GAAOC,EAAAA,EAAAA,GAAQP,GACfd,EDyBD,SAA4BoB,EAAYL,GAC7C,OAAIO,EAAAA,EAAAA,IAAUF,GAAc/B,EAAgBM,QACxC4B,EAAAA,EAAAA,IAAYH,EAAML,GAAwB1B,EAAgBO,WAC1D4B,EAAAA,EAAAA,IAAcJ,EAAML,GAAwB1B,EAAgBQ,YAGzDR,EAAgBa,IACzB,CChCgBuB,CAAmBL,EAAML,GAEvC,MAAO,CAAEK,OAAMpB,QACjB,CAEA,SAAS0B,EAAaC,GACpB,MAAMC,GAAQC,EAAAA,EAAAA,IAAgB,CAAEC,UAAW,WACrC9B,EAAQV,EAAmBqC,EAAM3B,MAAO2B,EAAMP,MAEpD,OAAKpB,GAGH+B,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACE9B,EAAAA,EAAAA,KAAC+B,EAAAA,GAAc,CAACN,MAAOA,EAAO,aAAY5B,EAAMN,MAAMuC,UACpD9B,EAAAA,EAAAA,KAAA,OAAKF,UAAU,uDAAsDgC,UACnE9B,EAAAA,EAAAA,KAACL,EAAW,IAAK6B,SAGrBxB,EAAAA,EAAAA,KAACgC,EAAAA,GAAO,CAACP,MAAOA,EAAO3B,UAAU,eAAcgC,UAC7C9B,EAAAA,EAAAA,KAACiC,EAAAA,GAAO,CAACC,MAAO,EAAGpC,UAAU,OAAMgC,SAChCjC,EAAMN,aAXI,IAiBrB,CAEA,SAAS4C,EAAYX,GACnB,MAAM3B,EAAQV,EAAmBqC,EAAM3B,MAAO2B,EAAMP,MAEpD,OAAKpB,GAGH+B,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACE9B,EAAAA,EAAAA,KAACL,EAAW,IAAK6B,EAAO1B,UAAU,UAClCE,EAAAA,EAAAA,KAAA,QAAA8B,SAAQ,GAAEjC,EAAMN,gBALD,IAQrB,CAKA,SAAS6C,EAAuBC,EAAkCC,GAChE,GAA4B,iBAAjBD,EAA2B,OAAOC,EAAYA,EAAYxB,OAAS,GAI9E,OAF4BwB,EAAYC,QAAQC,GAAeH,GAAgBG,EAAWlC,WAE/DmC,OAASH,EAAYA,EAAYxB,OAAS,EACvE,CAEA,SAAS4B,EAAgBC,EAA0BC,GACjD,OAAOD,IAASvC,EAAmByC,OAASA,OAAOC,WAAaF,GAASG,aAAe,CAC1F,CAyBO,SAASC,EAAIpD,GAMN,IANO,UACnBE,EAAS,UACTa,EAAS,eACTsC,EAAiB,YAAW,YAC5BX,EAAcjC,KACXmB,GACO5B,EACV,MAAMsD,GAAiBC,EAAAA,EAAAA,KACjBC,EAAUC,EAAAA,OAA6B,OACtC5B,EAAO6B,GAAYD,EAAAA,SAAe3C,EAAaC,KAC/C4C,EAAmBC,GAAiBH,EAAAA,SAAsC,MAqCjF,OAnCAA,EAAAA,WAAgB,KACd,MAAMI,EAAWC,aAAY,IAAMJ,EAAS5C,EAAaC,KAAaR,GACtE,MAAO,IAAMwD,cAAcF,EAAS,GACnC,CAAC9C,IAEJ0C,EAAAA,WAAgB,KACd,IAAKH,IAAmBE,EAAQQ,QAAS,OAEzC,IAAKL,EAAmB,CACtB,MAAMM,EAAenB,EAAgBtC,EAAmB6C,GAAiBG,EAAQQ,SACjFJ,EAAcpB,EAAuByB,EAAcvB,GACrD,CAEA,MAAMwB,EAAeC,KAAS,KAC5B,MACMC,EAAkB5B,EADHM,EAAgBtC,EAAmB6C,GAAiBG,EAAQQ,SACpBtB,GAEzD0B,IAAoBT,GAAmBC,EAAcQ,EAAgB,GACxE,KAEGC,EAAW,IAAIf,GAAgBgB,IACnCrB,OAAOsB,uBAAsB,KACvBC,MAAMC,QAAQH,IAAYA,EAAQpD,OAAS,GAAGgD,GAAc,GAChE,IAMJ,OAHAG,EAASK,QAAQlB,EAAQQ,SACzBf,OAAO0B,iBAAiB,SAAUT,GAE3B,KACLG,EAASO,aACT3B,OAAO4B,oBAAoB,SAAUX,EAAa,CACnD,GACA,CAACZ,EAAgBK,EAAmBjB,EAAaW,KAGlDjD,EAAAA,EAAAA,KAAA,OAAK0E,IAAKtB,KAAa5B,EAAO1B,UAAWA,EAAUgC,SAChDyB,IACC3B,EAAAA,EAAAA,MAAA,OAAK9B,UAAU,kEAAiEgC,SAAA,CAC7EyB,EAAkB/C,iBACjBR,EAAAA,EAAAA,KAACmC,EAAW,CAAClB,KAAMQ,EAAMR,KAAMpB,MAAO4B,EAAM5B,SAE5CG,EAAAA,EAAAA,KAACuB,EAAY,CAACN,KAAMQ,EAAMR,KAAMpB,MAAO4B,EAAM5B,SAE/CG,EAAAA,EAAAA,KAAA,QAAA8B,UAAO6C,EAAAA,EAAAA,IAAuBlD,EAAMR,KAAMsC,EAAkB9C,kBAKtE,C,iHC3JO,SAASmE,EAAkBhF,GAAyE,IAAxE,SAAEkC,EAAQ,aAAE+C,GAA0DjF,EACvG,MAAMkF,EAASzB,EAAAA,OACb,IAAI0B,EAAAA,EAAY,CACdC,eAAgB,CACdC,QAAS,CACPC,kBAAkB,EAClBC,sBAAsB,KACnBN,GAAcG,gBAAgBC,YAEhCJ,GAAcG,mBAEhBH,KAIP,OACE7E,EAAAA,EAAAA,KAACoF,EAAAA,GAAmB,CAACN,OAAQA,EAAOlB,QAAQ9B,UAC1C9B,EAAAA,EAAAA,KAACqF,EAAAA,GAAa,CAACC,kBAAmBC,EAAAA,GAAqBzD,SAAEA,KAG/D,CAEO,SAAS0D,EACdC,EACAC,GAEA,MAAMC,EAAgBnE,IACpBxB,EAAAA,EAAAA,KAAC4E,EAAkB,CAACC,aAAca,EAAO5D,UACvC9B,EAAAA,EAAAA,KAACyF,EAAS,IAAKjE,MAMnB,OAFAmE,EAAaC,YAAe,0BAAyBH,EAAUG,aAAe,eAEvED,CACT,C,8GChDO,MAAME,EAAcxC,EAAAA,cAAwD,MAE5E,SAASyC,EAAaC,GAC3B,OAAOC,EAAAA,EAAyB,IAAKD,EAASE,MAAM,EAAMC,kBAAkB,GAC9E,C,qCCkBO,SAASC,EAAQvG,GAUmD,IAViB,GAC1FwG,EAAE,YACFC,EAAc,OAAM,aACpBC,EAAY,QACZC,EAAO,WACPC,EAAU,UACV1G,EAAS,cACT2G,GAAgB,EAAI,SACpB3E,KACGN,GACoE5B,EACvE,MAAM6B,EAAQ4B,EAAAA,WAAiBwC,GAE/B,OACE7F,EAAAA,EAAAA,KAACgG,EAAAA,EAAoB,IACfvE,KACAD,EACJ+E,QAAUG,IACRH,IAAUG,GACVJ,IAAeI,EAAGC,cAAcC,GAAIH,EAAc,EAEpDD,WAAaE,IACXF,IAAaE,GACbJ,IAAeI,EAAGC,cAAcC,GAAIH,EAAc,EAClD3E,SAEA+E,IACA,MAAMC,EAASC,QAAQF,EAAU,kBAEjC,OACE7G,EAAAA,EAAAA,KAACgH,EAAAA,EAAM,IACDH,EACJT,GAAIA,EACJa,KAAK,WACL7H,KAAOoC,EAAM4E,IAAM5E,EAAM4E,KAAOc,EAAAA,QAAoCnG,EAAX,SACzDoG,MAAM,OACNC,MAAON,EAAST,EAAc,WAC9BgB,aAAa,uBACbvH,UAAWG,IAAW,2BAA4BH,GAAWgC,SAE5DA,GACM,GAKnB,CC9BO,SAASwF,EAAI1H,GAQN,IARO,MACnB6B,EAAK,cACL8F,EAAa,UACbC,EAAY,SAAQ,kBACpBC,GAAoB,EAAI,SACxBC,EAAQ,SACR5F,KACGN,GACO5B,EACV,MAAM+H,EAAetE,EAAAA,OAA4B,MAGjDA,EAAAA,WAAgB,UAEMtC,IAAlBwG,GACAA,GAAiB,GACjBI,EAAa/D,UAAY2D,GACzB9F,EAAMmG,MAAM9G,OAASyG,IAErB9F,EAAMoG,KAAKpG,EAAMmG,MAAML,GAAeX,IACtCe,EAAa/D,QAAU2D,EACzB,GACC,CAACA,EAAe9F,EAAOA,EAAMmG,MAAM9G,SAEtC,MAAMwF,EAAejD,EAAAA,aACnB,CAACuD,EAAYkB,KACXJ,IACEjG,EAAMmG,MAAMG,WAAWC,GAASA,EAAKpB,KAAOA,IAC5CkB,EACD,GAEH,CAACJ,EAAUjG,EAAMmG,QAGnB,OACE5H,EAAAA,EAAAA,KAAC6F,EAAYoC,SAAQ,CAACC,MAAOzG,EAAMK,UACjC9B,EAAAA,EAAAA,KAACgG,EAAAA,EAAgB,IACXvE,KACAD,EACJyF,KAAK,OACLnH,UAAWG,IAAW,eAAgBuB,EAAM1B,UAAW,CACrD,yCAA0C2H,GAAmC,WAAdD,EAC/D,kBAAmBC,GAAmC,QAAdD,IACvC1F,SAEFuB,EAAAA,SAAe8E,IAAIrG,GAAWsG,GACxB/E,EAAAA,eAAqB+E,IAEtBA,EAAMhJ,OAAS+G,EACV9C,EAAAA,aAAmB+E,EAAO,IAAKA,EAAM5G,MAAO8E,aAAcA,IAH1B8B,OAWnD,C,yMCxFA,MAAMC,EAAkB,SAcjB,SAASC,EAAY1I,GAKiB,IAJ3CwG,GAAImC,EAAW,MACf9G,EAAK,SACLK,KACGN,GACsC5B,EACzC,OACEI,EAAAA,EAAAA,KAACgG,EAAAA,EAA8B,IAAKvE,KAAWD,EAAKM,SAChD+E,IACA,MAAM2B,EAAW/G,GAAOgH,YAAc5B,EAAUD,GAEhD,OACE5G,EAAAA,EAAAA,KAACgH,EAAAA,EAAM,IACAH,EACLT,GAAImC,GAAeF,EACnBvB,OAAQ0B,EACRpB,MAAM,WACNhI,KAAK,SACL+H,MAAM,OACNE,aAAcpH,IAAWuB,EAAM6F,aAAc,eAAevF,SAE3DA,GACM,GAKnB,CCXO,SAAS4G,EAAQ9I,GASmB,IATlB,MACvB6B,EAAK,SACLK,EAAQ,WACR6G,EAAU,aACVC,EAAY,SACZlB,EAAQ,YACRmB,EACA,aAAcC,KACXtH,GACoC5B,EACvC,MAAM,cAAEmJ,IAAkBC,EAAAA,EAAAA,IAAuBvH,GAC3CwH,GAASC,EAAAA,EAAAA,MAUf,OARA7F,EAAAA,WAAgB,KACVsF,GAAYQ,WACd1H,EAAM2H,sBAAsBxF,SAASyF,MAAM,CAAEC,eAAe,GAC9D,GAGC,KAGD1H,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACE9B,EAAAA,EAAAA,KAACgG,EAAAA,EAAwB,IACnBvE,KACAkH,EAEJ1C,UAAMlF,EACNqF,GAAImD,EAAAA,GACJJ,WAAW,EACX,aAAYL,EACZU,UAAY9C,IACK,UAAXA,EAAG+C,KACL/B,EAASjG,EAAMiI,YAEjBf,GAAYa,YAAY9C,EAAG,EAE7B,cAAamC,KAEbE,IACA/I,EAAAA,EAAAA,KAAC2J,EAAAA,EAAM,CAAA7H,UACL9B,EAAAA,EAAAA,KAACgG,EAAAA,EAA+B,IAAKvE,KAAWmH,EAAc,aAAYE,EAAUhH,SACjF8H,IAAA,IAAC,gBAAEC,EAAe,eAAEC,KAAmBC,GAAYH,EAAA,OAClD5J,EAAAA,EAAAA,KAAA,UAAS+J,EAAYjK,UAAWG,IAAW8J,EAAWjK,UAAWmJ,EAAQ,+BAA+BnH,UACtG9B,EAAAA,EAAAA,KAACgK,EAAAA,GAAG,IACExI,EACJqI,gBAAiBA,EACjBC,eAAgBA,EAChB,iBAAgBrI,EAAME,UACtB7B,UAAWG,IAAWuB,EAAM1B,UAAW,8CAA8CgC,SAEpFuB,EAAAA,SAAe8E,IAAIrG,GAAWsG,GACxB/E,EAAAA,eAAqB+E,IAEtBA,EAAMhJ,OAASkJ,EACVjF,EAAAA,aACL+E,EACA,CACE3G,QACAwI,UAAWA,KACTvC,EAASU,EAAM5G,MAAM0G,MAAM,IARME,OAiBzC,QAOpB,C,oDClHO,MAAM8B,EAAwB,CACnC,CAAEC,KAAM,MAAOC,gBAAYrJ,GAC3B,CAAEoJ,KAAM,SAAUC,WAAYC,EAAAA,EAAWC,OACzC,CAAEH,KAAM,UAAWC,WAAYC,EAAAA,EAAWE,SAC1C,CAAEJ,KAAM,QAASC,WAAYC,EAAAA,EAAWG,OACxC,CAAEL,KAAM,SAAUC,WAAYC,EAAAA,EAAWI,S,eCJpC,SAASC,EAASlJ,GACvB,OAAOxB,EAAAA,EAAAA,KAAA,UAASwB,EAAO1B,UAAWG,IAAWuB,EAAM1B,UAAW,0CAChE,C,yBCGO,SAAS6K,EAAYnJ,GAC1B,OACEI,EAAAA,EAAAA,MAAC8I,EAAQ,CAAC5K,UAAU,uBAAsBgC,SAAA,EACxC9B,EAAAA,EAAAA,KAAC4K,EAAAA,GAAI,CAACC,MAAO,GAAIV,KAAK,UAAUrK,UAAU,mBAC1CE,EAAAA,EAAAA,KAACiC,EAAAA,GAAO,CAACC,MAAO,EAAGpC,UAAU,OAAMgC,SAAC,gCAGpCF,EAAAA,EAAAA,MAACkJ,EAAAA,GAAS,CAACC,KAAK,QAAQjL,UAAU,oDAAmDgC,SAAA,CAAC,mEACnB,KACjE9B,EAAAA,EAAAA,KAAA,KAAGgL,KAAMC,EAAAA,EAAKC,YAAapL,UAAU,gBAAegC,SAAC,oBAEjD,QAGN9B,EAAAA,EAAAA,KAACgH,EAAAA,EAAM,CAAClH,UAAU,OAAOsH,MAAM,YAAYb,QAASA,IAAM/E,EAAM2J,qBAAqBrJ,SAAC,YAK5F,C,oCCdO,SAASsJ,EAASxL,GAAsC,IAArC,UAAEyL,EAAS,KAAEC,GAAsB1L,EAC3D,MAAM2L,EAAQD,EAAKE,cAAcC,QAAQJ,EAAUG,eAE7CE,GAAgBC,EAAAA,EAAAA,UACpB,KAAM,CACJC,OAAQN,EAAKO,UAAU,EAAGN,GAC1BF,UAAWC,EAAKO,UAAUN,EAAOA,EAAQF,EAAUvK,QACnDgL,MAAOR,EAAKO,UAAUN,EAAQF,EAAUvK,WAE1C,CAACuK,EAAUvK,OAAQyK,EAAOD,IAG5B,OAAIC,EAAQ,GAAKF,EAAUvK,OAAS,GAAUd,EAAAA,EAAAA,KAAA,QAAA8B,SAAOwJ,KAGnD1J,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACE9B,EAAAA,EAAAA,KAAA,QAAMF,UAAU,gBAAegC,SAAE4J,EAAcE,WAC5CF,EAAcL,UAAUvK,SACzBd,EAAAA,EAAAA,KAAA,QAAMF,UAAU,oFAAmFgC,SAChG4J,EAAcL,aAGnBrL,EAAAA,EAAAA,KAAA,QAAMF,UAAU,gBAAegC,SAAE4J,EAAcI,UAGrD,CCzBO,SAASC,EAAWvK,GACzB,OACEI,EAAAA,EAAAA,MAAC0G,EAAY,IACP9G,EAAMqF,UACVpF,MAAOD,EAAMC,MACbyG,MAAO1G,EAAMwG,KAAKgE,OAClBlM,UAAU,mEACVuH,aAAa,kCACb,mBACuBtG,IAArBS,EAAMyK,WACD,SAAQzK,EAAMyK,kCAAkCzK,EAAMwG,KAAKgE,cAC5DjL,EACLe,SAAA,EAED9B,EAAAA,EAAAA,KAAA,QAAMF,UAAU,OAAMgC,UACpB9B,EAAAA,EAAAA,KAACoL,EAAS,CAACE,KAAM9J,EAAMwG,KAAKgE,OAAQX,UAAW7J,EAAMC,MAAOiI,gBAE9D1J,EAAAA,EAAAA,KAAA,QAAMF,UAAU,uEAAsEgC,UACpF9B,EAAAA,EAAAA,KAACoL,EAAS,CAACE,KAAM9J,EAAMwG,KAAKkE,QAASb,UAAW7J,EAAMC,MAAOiI,gBAE/D1J,EAAAA,EAAAA,KAAA,QAAMF,UAAU,+BAA8BgC,SAAEN,EAAMwG,KAAKmE,aAGjE,C,eC/BO,SAASC,EAAqBC,GACnC,MAAML,GAASM,EAAAA,EAAAA,GAAmBD,GAAW,GAE7C,IAAIE,EAAe,GAEnB,QAHmBC,EAAAA,EAAAA,IAAYR,IAAUS,EAAAA,EAAAA,IAAuBT,GAAU,MAIxE,KAAK3B,EAAAA,EAAWC,MACdiC,EAAetB,EAAAA,EAAKyB,QAAQV,GAC5B,MACF,KAAK3B,EAAAA,EAAWG,MACd+B,EAAetB,EAAAA,EAAK0B,mBAAmBX,GACvC,MACF,KAAK3B,EAAAA,EAAWE,QACdgC,EAAetB,EAAAA,EAAK2B,qBAAqBZ,GACzC,MACF,KAAK3B,EAAAA,EAAWI,OACd8B,EAAetB,EAAAA,EAAK4B,oBAAoBb,GACxC,MACF,QACE,OAAOf,EAAAA,EAAK6B,SAASd,GAGzB,OAAOO,GAAgBvL,eAAe+L,gBAAkB,GAC1D,CCLO,SAASC,EAAWxL,GACzB,MAAM,KAAEyL,EAAI,UAAEC,IAAcC,EAAAA,EAAAA,GAC1B,CAAC,SAAU3L,EAAMC,MAAMiI,WAAYlI,EAAM4I,aACzC,KAAMgD,EAAAA,EAAAA,IAAiB5L,EAAMC,MAAMiI,WAAYlI,EAAM4I,aACrD,CAAEiD,QAAS7L,EAAMC,MAAMiI,WAAW5I,OAAS,EAAGwM,kBAAkB,EAAMC,UAAWhN,IAAUiN,UAAWjN,OAElG,YAAEkN,EAAW,KAAEC,EAAI,SAAEC,GAAanM,EAAMC,MAW9C,OATA4B,EAAAA,WAAgB,KACT6J,GAAcD,GAAMnM,QAAWU,EAAMoM,iBAG/BD,IAAaE,EAAAA,GACtBJ,EAAYI,EAAAA,IAHZJ,EAAY,GACZC,IAGF,GACC,CAACR,EAAWD,EAAMQ,EAAaC,EAAMlM,EAAMoM,iBAAkBD,IAE5DT,GAEAlN,EAAAA,EAAAA,KAAC0K,EAAQ,CAAC5K,UAAU,cAAagC,UAC/B9B,EAAAA,EAAAA,KAAC8N,EAAAA,EAAO,OAMZlM,EAAAA,EAAAA,MAAA,OAAK9B,UAAU,iDAAgDgC,SAAA,CAC5DmL,GAAwB,IAAhBA,EAAKnM,SACZd,EAAAA,EAAAA,KAAA,OAAKF,UAAU,mCAAkCgC,SAC9CmL,EAAK9E,KAAKH,IACThI,EAAAA,EAAAA,KAAC+L,EAAU,CACTtK,MAAOD,EAAMC,MAEbuG,KAAMA,EACNiE,WAAYzK,EAAMyK,WAClBpF,UACErF,EAAMuM,iBACF,CACE3H,GAAI,IACJ4E,KAAMoB,EAAqBpE,EAAKgE,SAElC,CACEzF,QAAUG,IACRA,EAAGsH,iBACHxM,EAAMyM,mBAAmBjG,EAAKgE,QAC9BxK,EAAMC,OAAOyM,cAAc,GAAG,IAbnClG,EAAKgE,YAqBjBxK,EAAMoM,mBACL5N,EAAAA,EAAAA,KAACgH,EAAAA,EAAM,CACLZ,GAAG,IACHtG,UAAU,8BACVuH,aAAa,cACb2D,KAAMC,EAAAA,EAAK6B,SAASqB,mBAAmB3M,EAAMC,MAAM2M,cAAgB5M,EAAMC,MAAMiI,aAAa5H,SAC7F,uBAMT,CCpDO,SAASuM,EAAMzO,GAKN,IALO,aACrB0O,GAAe,EAAI,iBACnBV,GAAmB,EAAI,iBACvBG,GAAmB,KAChBvM,GACS5B,EACZ,MAAM,MAAE2O,IAAUC,EAAAA,EAAAA,KACZ/M,GCvCyBsE,EDuCA,CAC7B0I,eAAgB,EAChB/E,WAAYlI,EAAMkN,aAClB/M,UAAWH,EAAMmN,kBAAoB,gBCzChC3I,EAAAA,EAAiC,IACnCD,EACH4H,SAAUE,EAAAA,EACVe,OAAO,EACPC,QAAQ,EACRC,gBAAiB,CAAC,EAAG,MANlB,IAA0B/I,ED4C/B,MAAM,cAAEgD,IAAkBC,EAAAA,EAAAA,IAAuBvH,GAC3CsN,GAAYjJ,EAAAA,EAAAA,IAAa,CAAEkJ,YAAa,cACvCC,EAAUC,GAAe7L,EAAAA,SAAe,GAEzC8L,EAAiB9L,EAAAA,QAAcqD,IACnC,OAAQA,EAAG+C,KACT,IAAK,aACHhI,EAAM2N,QACN,MACF,IAAK,UACHF,GAAazN,IAAWA,EAAQ,EAAIyI,EAAsBpJ,QAAUoJ,EAAsBpJ,SAC1F,MACF,IAAK,YACHoO,GAAazN,IAAWA,EAAQ,GAAKyI,EAAsBpJ,SAE/D,IAOIuO,EAAiBhM,EAAAA,aACpBqD,IACgB,WAAXA,EAAG+C,KAAoBhI,EAAM6N,UAC/B5I,EAAG6I,kBACH9N,EAAMiM,OACR,GAIF,CAACjM,EAAM6N,QAAS7N,EAAMiM,OAYxB,OANArK,EAAAA,WAAgB,KACV0F,GACFmG,EAAY,EACd,GACC,CAACnG,KAGF/I,EAAAA,EAAAA,KAAC0I,EAAQ,CACPjH,MAAOA,EACP3B,UAAU,wBACV,aAAW,SACX6I,WAAY,CACVvB,MAAO5F,EAAM4F,MACb2D,KAAMvJ,EAAMuJ,KACZ5B,UAAW3H,EAAM2H,UACjBqG,YAAahO,EAAMgO,aAAe,gBAClCC,aAAc,MACdC,YAAa,MACbC,eAAgB,MAChBC,UAAW,IACXpG,UAAW6F,EACXQ,OAASC,IAEPA,EAAE9B,gBAAgB,EAEpB+B,WAAYvO,EAAMuO,WAClBC,aAAcxO,EAAMwO,gBAChB1B,GAAgB,CAAE2B,YAAa,WAErCrH,aAAc,CACZ9I,UAAWG,IAAWuB,EAAM0O,aAAc,mBAAoB,CAC5D,wBAAyB1O,EAAM2O,wBAC/B,gBAAiB3O,EAAM2O,0BAEzBC,MAAO,CACLvF,MAAOrJ,EAAM2O,wBACT1O,EAAM2H,sBAAsBxF,SAASyM,wBAAwBxF,OAAS,SACtE9J,EACJuP,SAAU,UAGd5I,SAAWQ,IACL6F,EACFlL,OAAO0N,SAASvF,KAAOoB,EAAqBlE,IAE5C1G,EAAMyM,oBAAmB3B,EAAAA,EAAAA,GAAmBpE,IAC5CzG,EAAMyM,cAAc,IACtB,UAEwBnN,IAArBS,EAAMyK,YAA4B,CAAEpD,YAAc,SAAQrH,EAAMyK,oCAAoCnK,UAEzGF,EAAAA,EAAAA,MAAA,OAAK9B,UAAU,uFAAsFgC,SAAA,CAClGN,EAAMgP,yBACLxQ,EAAAA,EAAAA,KAACsH,EAAAA,GAAI,CACH,aAAW,wBACXG,mBAAmB,EACnB3H,UAAU,oCACV2B,MAAOsN,EACPxH,cAAe0H,EACfvH,SAAW6D,GAAU2D,EAAY3D,GACjC/B,UAAW2F,EAAevL,QAAQ9B,SAEjCoI,EAAsB/B,KAAK8G,IAC1BjP,EAAAA,EAAAA,KAACmG,EAAAA,GAAQ,CAAArE,SAAsBmN,EAAS9E,MAAzB8E,EAAS9E,WAI5BpB,IACA/I,EAAAA,EAAAA,KAACqF,EAAAA,GAAa,CACZC,kBAAmBqF,EACnB8F,QAASlC,EACTmC,UAAW,CAACjP,EAAM2M,aAAc3M,EAAMiI,YAAY5H,UAElD9B,EAAAA,EAAAA,KAACgN,EAAU,CACTvL,MAAOA,EACP2I,WAAYF,EAAsB+E,GAAU7E,WAC5C6B,WAAYzK,EAAMyK,WAClB2B,iBAAkBA,EAClBG,iBAAkBA,EAClBE,iBAAkBzM,EAAMyM,yBAOtC,C,iKElIA,MAAM0C,UAAgGC,IAAAA,OACpGC,YACEC,EAAAA,GAAkBlO,QAEpB,iBAAOmO,CAA8BC,EAAiBC,GACpD,OAAO,IAAIC,KAAKF,EAAKC,EACvB,CAEA,yBAAOE,CACLC,GAEA,OAAO,CACT,CAEAC,WAAY,EACZC,qBAAsB,EACtBC,MAAe,CAAC,EAEhBN,MACAO,QAmBAC,YAA4B,KAC5BC,aAAc,EACdC,YAAa,EACbC,WAAY,EACZC,kBAAmB,EACnBC,aAAkC,KAKlCC,WAAAA,CAAYC,EAAwBf,GAClCgB,MAAMD,EAAQf,GACdC,KAAKD,MAAQA,EACTC,KAAKgB,YACPhB,KAAKiB,IAAIjB,KAAKgB,eAAiB,CAAC,GAEhChB,KAAKiB,IAAIjB,KAAKkB,UAAY,CAAC,GAE7BlB,KAAKiB,IAAIH,GACTd,KAAKM,QAAU,GAEfN,KAAKmB,YAAcnB,KAAKmB,YAAYC,KAAKpB,MACzCA,KAAKqB,YAAcrB,KAAKqB,YAAYD,KAAKpB,MACzCA,KAAKjH,UAAYiH,KAAKjH,UAAUqI,KAAKpB,MACrCA,KAAKoB,KAAK,YAAapB,KAAKmB,aAC5BnB,KAAKoB,KAAK,YAAapB,KAAKqB,aAC5BrB,KAAKoB,KAAK,UAAWpB,KAAKjH,WAC1BiH,KAAKoB,KAAK,UAAU,KAElB,MAAM1P,EAAUsO,KAAKsB,kBACjBtB,KAAKD,MAAMwB,iBAAiBC,gBAAgB,WAAYxB,MACxDA,KAAKD,MAAM0B,cAAcD,gBAAgB,WAAYxB,MAEzDtO,GAASgQ,QAAQ,SAAUhQ,EAAQ,GAEvC,CAEA,QAAIxD,GACF,OAAQ8R,KAAKa,YAA+B3S,IAC9C,CAEAyT,SAAAA,GACE,OAAO3B,KAAKM,OACd,CAEAsB,MAAAA,CAAO1B,EAAW2B,GAAa,CAE/BC,aAAAA,CAAcrB,GACZT,KAAKS,WAAaA,EAClBT,KAAK0B,QAAQ,SACf,CAEAK,YAAAA,CAAarB,GACXV,KAAKU,UAAYA,EACjBV,KAAK0B,QAAQ,SACf,CAEAM,qBAAAA,GACE,OAAOhC,KAAKS,YAAcT,KAAKU,SACjC,CAEAuB,kBAAAA,GACE,MAAMC,EAAYlC,KAAKD,MAAM0B,WAAWD,gBAAgB,WAAYxB,OAAOmC,OAC3E,OAAOD,GAAWE,YAAcpC,IAClC,CAEAiB,GAAAA,CAAInB,GACF,MAAMuC,EAAcC,OAAOC,KAAKzC,GAAK0C,QACnC,CAACC,EAAKlK,KAAQ,IAAMkK,EAAK,CAAClK,GAAMyH,KAAKK,MAAM9H,MAC3C,CAAC,GAEH,GAAImK,KAAKC,UAAU7C,KAAS4C,KAAKC,UAAUN,GAAc,CACvD,MAAMO,EAAaA,CAACC,EAA0BC,EAA0BvK,KACtE,GAAIyH,KAAK+C,gBAA0B,eAARxK,EACzB,OAAOuK,GAAY,CAAC,CACtB,EAEFE,IAAUhD,KAAKK,MAAOP,EAAK8C,GACvB5C,KAAKiC,uBAAyBjC,KAAKiD,gBACrCjD,KAAKkD,8BAEPlD,KAAK0B,QAAQ,SAAU1B,KACzB,CAEA,OADAA,KAAKY,aAAe,KACbZ,IACT,CAEAmD,GAAAA,CAA2B5K,GACzB,OAAOyH,KAAKK,MAAM9H,EACpB,CAEA6K,qBAAuBA,OAEvBC,GAAMC,GAActD,KAAKD,MAAMwD,MAAMD,EAAEA,GAEvCE,GAAMC,GAAczD,KAAKD,MAAMwD,MAAME,EAAEA,GAEvCF,KAAAA,CAAK7U,GAAyC,IAAxC,EAAE4U,EAAC,EAAEG,GAAiC/U,EAC1CsR,KAAK0D,OAAS,CAAC,EACfJ,EAAEK,SAASC,IACTtB,OAAOuB,eAAe7D,KAAK0D,OAAQE,EAAI,CACrCT,IAAKA,IAAMnD,KAAKqD,GAAGrD,KAAKK,MAAMuD,KAC9B,IAGJH,EAAEE,SAASC,IACTtB,OAAOuB,eAAe7D,KAAK0D,OAAQE,EAAI,CACrCT,IAAKA,IAAMnD,KAAKwD,GAAGxD,KAAKK,MAAMuD,KAC9B,GAEN,CAEAE,MAAAA,CAAO5D,GAA4B,CAEnC6D,YAAAA,CAAaC,GACiBhE,KAAKU,YAAcV,KAAKS,aAElDuD,EAAQC,YAAc,IAExBjE,KAAK2B,YAAY1K,KAAKiN,GAAUA,EAAMJ,OAAOE,KAC7CA,EAAQC,YAAc,CACxB,CAEA9C,WAAAA,CAAYgD,GACVnE,KAAKQ,aAAc,EACnBR,KAAKW,kBAAmB,EACxB,IAAK,MAAMuD,KAASlE,KAAK2B,YACvB,GAAIuC,EAAME,SAASD,GAGjB,OAFAnE,KAAKO,YAAc2D,OACnBlE,KAAKO,YAAY8D,aAAaF,EAIpC,CAEA9C,WAAAA,CAAY8C,GACLA,EAAKG,WAGc,MAApBtE,KAAKO,cACPP,KAAKO,YAAYgE,OAAOJ,GACxBnE,KAAK0B,QAAQ,UAEjB,CAEA3I,SAAAA,CAAUmH,GACRF,KAAKQ,aAAc,EACnBR,KAAKW,kBAAmB,EACxBX,KAAKO,YAAc,KACdP,KAAKiD,gBAAmBjD,KAAKsB,mBAChCtB,KAAKkD,8BAEPlD,KAAK0B,QAAQ,SAAU1B,KACzB,CAEAkD,4BAA8BA,KAC5B,MAAMsB,EAAQxE,KAAKD,OAAO0E,QAAQD,QAClC,GAAIA,EAAO,CACT,MAAQlB,EAAGoB,GAAe1E,KAAKoD,uBACzBuB,EAAqBD,EAAWlC,QAAO,CAACC,EAAKlK,KACjD,MAAMqM,EAAY5E,KAAKK,MAAM9H,GAE7B,MAAO,IACFkK,EACH,CAAClK,GAHeqM,GAAaJ,EAAMK,yBAAyBD,GAI7D,GACA,CAAC,GACJ5E,KAAKiB,IAAI,CAAE0D,sBACb,GAGFG,YAAAA,GACE,MAAMN,EAAQxE,KAAKD,MAAM0E,QAAQD,SAC3B,mBAAEG,GAAuB3E,KAAKK,MACpC,IAAKmE,IAAUG,EAGb,OAEF,MAAMI,EAA6BzC,OAAOtP,QAAQ2R,GAAoBnC,QACpE,CAACC,EAAG/J,KAAA,IAAGH,EAAKyM,GAAUtM,EAAA,MAAM,IACvB+J,EACH,CAAClK,GAAMyM,GAAaR,EAAMS,0BAA0BD,GACrD,GACD,CAAC,GAEHhF,KAAKiB,IAAI8D,EACX,CAEAG,eAAAA,CAAgBf,GACd,IAAK,MAAMD,KAASlE,KAAK2B,YACvB,GAAIuC,EAAME,SAASD,GACjB,OAAO,EAGX,OAAO,CACT,CAEAC,QAAAA,CAASD,GACP,OAAOnE,KAAKkF,gBAAgBf,EAC9B,CAEAgB,iCAAAA,GACE,OAAOnF,KAAKD,MAAM0E,QAAQW,eAAeC,uBAAyBrF,KAAKsF,cACzE,CAEAC,cAAAA,GACE,IAAI/Q,EAEFA,EADEwL,KAAKwF,mBACEC,IAAM,CAAC,EAAGzF,KAAKwF,sBAEfC,IAAM,CAAC,EAAGzF,KAAK0F,aAEtB1F,KAAK+C,gBACPvO,EAAOmR,OAAOC,KAAK,CAAE1X,KAAM,aAAc+K,KAAM,aAAc5K,MAAO,eAElD,MAAhBmG,EAAOqR,QACTrR,EAAOqR,MAAQ7F,KAAK/G,MAEtB,IAAK,MAAM6M,KAAStR,EAAOmR,OACJ,MAAjBG,EAAMC,UACRD,EAAM9O,MAAQ8O,EAAMC,SAEQ,MAA1B/F,KAAKK,MAAMyF,EAAM7M,QACnB6M,EAAM9O,MAAQgJ,KAAKK,MAAMyF,EAAM7M,OAGnC,OAAOzE,CACT,CAEAwR,QAAAA,GACE,OAAOP,IAAM,CAAC,EAAGzF,KAAKK,MAAO,CAAEnS,KAAM8R,KAAK9R,MAC5C,CAEA+X,QAAAA,GACE,OAAOjG,KAAKgG,UACd,CAEAE,4BAAAA,GACE,OAAOlG,KAAKK,MAAMsE,mBAAqBrC,OAAOC,KAAKvC,KAAKK,MAAMsE,oBAAsB,EACtF,CAEAwB,gBAAAA,GAGE,OAAOC,IAAKpG,KAAKiG,WAAYjG,KAAKkG,+BACpC,CAEAG,aAAAA,CAAc3U,GACZ4U,YAAW,KACT5U,EAAQwR,8BACR,MAAMU,EAAK5D,KAAKD,MAAM0B,WAAWD,gBAAgB,WAAYxB,MACxD4D,EAwBHA,EAAG2C,QAAQ7U,GArBXC,OAAO6U,QAAQC,eAAe,2BAA4B,CACxDC,MAAO,CACLC,WAAY,CACVzY,KAAM8R,MAAM9R,KACZiS,UAAWH,MAAMG,UACjBK,YAAaR,MAAMQ,YACnBC,WAAYT,MAAMS,WAClBC,UAAWV,MAAMU,UACjBC,iBAAkBX,MAAMW,kBAE1BiG,WAAY,CACV1Y,KAAMwD,GAASxD,KACfiS,UAAWzO,GAASyO,UACpBK,YAAa9O,GAAS8O,YACtBC,WAAY/O,GAAS+O,WACrBC,UAAWhP,GAASgP,UACpBC,iBAAkBjP,GAASiP,oBAMnC,GAEJ,CAEAkG,QAAAA,GACE,OAAO7G,KAAK/G,IACd,CAEAgK,YAAAA,GACE,OAAOjD,KAAKG,SACd,CAEA2G,sBAAAA,GACE,OAAO9G,KAAKI,mBACd,CAEA2G,OAAAA,GACE/G,KAAKkD,8BACLlD,KAAKgH,QACP,CAEAC,sBAAAA,GACE,OAAOA,EAAAA,EAAAA,IAAuBjH,KAAKD,MAAM0E,QAAQW,eACnD,CAEArC,YAAAA,GACE,QAAS/C,KAAK9R,KAAKgZ,WAAW,UAChC,CAEA5F,eAAAA,GACE,QAAStB,MAAM9R,KAAKgZ,WAAW,cACjC,CAEA5B,YAAAA,GACE,MAAM,MAAE6B,EAAK,MAAEC,GAAUC,EAAAA,GAAoBrH,KAAKD,MAAM0E,QAAQD,QAAQ8C,WAClEC,EAAavH,KAAKK,MAAMkH,aAAaH,GAG3C,YAAmBvX,IAAf0X,GAEmC,IAAnCjF,OAAOC,KAAKgF,GAAY3X,SAErB4X,EAAAA,EAAAA,IAAU,CAAExQ,MAAOmQ,EAAOM,IAAKF,EAAWG,KAAMC,IAAKJ,EAAWK,IACzE,CAEAC,eAAAA,CAAgBC,GACd,MAAM,MAAEV,EAAK,MAAED,GAAUE,EAAAA,GAAoBrH,KAAKD,MAAM0E,QAAQD,QAAQ8C,WAClES,EAAezF,OAAOC,KAAKyF,EAAAA,IAAgBzN,QAAQ6M,GAEzD,IAAIa,EAA4B,GAC5BC,EAA6C,CAAC,EAElD,OAAQJ,GACN,KAAKK,EAAAA,GAAgBC,gBACnBH,EAAkB3F,OAAOC,KAAKyF,EAAAA,IAAgB3W,QAAO,CAACkH,EAAK8B,IAAUA,EAAQ0N,IAC7EG,EAAa,CAAER,KAAMP,GACrB,MAEF,KAAKgB,EAAAA,GAAgBE,gBACnBJ,EAAkB3F,OAAOC,KAAKyF,EAAAA,IAAgB3W,QAAO,CAACkH,EAAK8B,IAAUA,EAAQ0N,IAC7EG,EAAa,CAAEN,GAAIT,GACnB,MAEF,KAAKgB,EAAAA,GAAgBG,YACnBL,EAAkB3F,OAAOC,KAAKyF,EAAAA,IAAgB3W,QAAO,CAACkH,EAAK8B,IAAUA,IAAU0N,IAC/EG,EAAa,CAAER,KAAMP,EAAOS,GAAIT,GAChC,MAEF,KAAKgB,EAAAA,GAAgBI,IACrB,QAEE,YADAvI,KAAKiB,IAAI,CAAEsG,WAAY,CAAC,IAK5BvH,KAAKiB,IAAI,CACPsG,WAAYjF,OAAOkG,OAAO,CAAC,KAAMP,EAAgBhR,KAAKH,IAAI,CAAQ,CAACA,GAAO,CAAC,MAAO,CAAE,CAACsQ,GAAQc,KAEjG,CAEAO,eAAAA,GACE,MAAQnF,EAAGoF,EAASjF,EAAGkF,GAAY3I,KAAKoD,wBAA0B,CAAC,EACnE,GAA0B,OAAtBpD,KAAKY,aAAuB,CAC9B,MAAMA,EAAe,CAAC,EACtB8H,GAAS/E,SAASpL,IAChB,MAAMqM,EAAY5E,KAAKK,MAAM9H,QACX1I,IAAd+U,IACFhE,EAAagI,KAAOC,KAAKpB,IAAI7C,EAAWhE,EAAagI,MAAQhE,GAC7DhE,EAAakI,KAAOD,KAAKlB,IAAI/C,EAAWhE,EAAakI,MAAQlE,GAC/D,IAEF+D,GAAShF,SAASpL,IAChB,MAAMwQ,EAAY/I,KAAKK,MAAM9H,QACX1I,IAAdkZ,IACFnI,EAAaoI,KAAOH,KAAKpB,IAAIsB,EAAWnI,EAAaoI,MAAQD,GAC7DnI,EAAaqI,KAAOJ,KAAKlB,IAAIoB,EAAWnI,EAAaqI,MAAQF,GAC/D,IAGF/I,KAAKY,aAAeA,CACtB,CAEA,OAAOZ,KAAKY,YACd,CAEAsI,gBAAAA,CAAiBzE,EAAc5P,GAC7B,MAAM,KAAE+T,EAAI,KAAEE,EAAI,KAAEE,EAAI,KAAEC,GAASjJ,KAAKyI,kBAExC,GAAIzI,KAAKiD,eACP,OAAO,EAGT,IAAKpO,GAASsU,MAAO,CACnB,MAAMC,OAAyBvZ,IAATiZ,GAAsBO,MAAMP,GAC5CQ,OAAyBzZ,IAAT+Y,GAAsBS,MAAMT,GAClD,KACGQ,GACAE,GACCtJ,KAAKqD,GAAGyF,KAAUrE,EAAM8E,YAAcvJ,KAAKqD,GAAGuF,KAAUnE,EAAM8E,WAAa9E,EAAM9K,OAEnF,OAAO,CAEX,CAEA,IAAK9E,GAAS2U,MAAO,CACnB,QAAa3Z,IAATmZ,QAA+BnZ,IAAToZ,EACxB,OAAO,EAGT,MAAMQ,EAAWzJ,KAAKD,MAAMwD,MAAME,EAAEiG,OAAO,GACrCC,EAAc3J,KAAKD,MAAMwD,MAAME,EAAEiG,OAAO1J,KAAKD,MAAM6J,QACzD,OAAOH,GAAYT,GAAQW,GAAeV,CAC5C,CAGA,OAAO,CACT,EAGF,S,4FC7dA,MAAMY,UAAoDpK,EAAAA,EACxDE,YAAcC,EAAAA,GAAkBkK,KAEhCjJ,WAAAA,CAAYC,EAAwBf,GAClCgB,MAAMD,EAAQf,GACdC,KAAK8D,OAAS9D,KAAK8D,OAAO1C,KAAKpB,MAC/BA,KAAK+J,OAAS/J,KAAK+J,OAAO3I,KAAKpB,MAC/BA,KAAKM,QAAU,CACb,IAAI0J,EAAAA,EACF,KACA,IAAMhK,KAAKK,MAAM4J,KACjB,IAAMjK,KAAKK,MAAM6J,IACjBlK,KAAK+J,OACL/J,KAAKD,OAEP,IAAIiK,EAAAA,EACF,KACA,IAAMhK,KAAKK,MAAM8J,KACjB,IAAMnK,KAAKK,MAAM+J,IACjBpK,KAAK+J,OACL/J,KAAKD,OAGX,CAEAiB,WAAAA,GACE,MAAO,CACLqJ,UAAW,EACXC,YAAatK,KAAKiH,yBAAyBsD,gBAAgBC,OAAOV,KAEtE,CAEA1G,qBAAuBA,KAAA,CAASE,EAAG,CAAC,KAAM,MAAOG,EAAG,CAAC,KAAM,QAE3DK,MAAAA,CAAOE,GACL,MAAM,GAAEiG,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAEC,EAAE,UAAEC,GAAcrK,KAAKK,MACrCoK,GAAYC,EAAAA,EAAAA,IAAiB,CAAET,KAAIC,KAAIC,KAAIC,OAC3CO,GAAcC,EAAAA,EAAAA,IAAoB,CAAEP,eAAcI,IAExDzG,EAAQ6G,UAAUF,EAAYrH,EAAGqH,EAAYlH,GAC7CO,EAAQ8G,YACR9G,EAAQ/C,IAAI,YAAajB,KAAKK,MAAMgK,WACpCrG,EAAQ/C,IAAI,cAAejB,KAAKK,MAAMiK,aAEtCtG,EAAQO,OAAOkG,EAAUR,GAAIQ,EAAUP,IACnClK,KAAKK,MAAM0K,YACb/G,EAAQgH,YAAY,CAAChL,KAAKK,MAAM0K,aAElC/G,EAAQiH,OAAOR,EAAUN,GAAIM,EAAUL,IACvCpG,EAAQkH,SACJlL,KAAKK,MAAM0K,YACb/G,EAAQgH,YAAY,IAEtBhH,EAAQ6G,WAA2B,EAAjBF,EAAYrH,GAAyB,EAAjBqH,EAAYlH,GAE9CzD,KAAKgC,yBACPhC,KAAK+D,aAAaC,EAEtB,CAEApC,MAAAA,CAAO0B,EAAWG,GAChBzD,KAAKK,MAAM4J,IAAM3G,EACjBtD,KAAKK,MAAM8J,IAAM7G,EACjBtD,KAAKK,MAAM6J,IAAMzG,EACjBzD,KAAKK,MAAM+J,IAAM3G,CACnB,CAEAsG,MAAAA,CAAMrb,GAAqD,IAApD,KAAER,EAAI,KAAEid,EAAI,KAAEC,GAAoC1c,EAC1C,MAATR,GACF8R,KAAKK,MAAM4J,IAAMkB,EACjBnL,KAAKK,MAAM6J,IAAMkB,IAEjBpL,KAAKK,MAAM8J,IAAMgB,EACjBnL,KAAKK,MAAM+J,IAAMgB,EAErB,CAEAhH,QAAAA,CAASD,GACP,OAAIpD,MAAMoE,sCACNkG,EAAAA,GAAKC,kBAAkBnH,EAAMnE,KAAKK,QAAU,IAGzCU,MAAMqD,SAASD,GACxB,EAGF,S,6DC7FA,MAAMoH,EAA+B,CACnCnR,KAAM,GACNoR,KAAM,CACJ3R,KAAM,GACN4R,OAAQ,QACRvM,MAAO,SACPwM,OAAQ,UAEVC,WAAY,GAEZC,UAAWC,EAAAA,GAAUC,KAErBC,aAAcC,EAAAA,GAAaC,WAC3BC,QAAS,CACPC,IAAK,EACLC,MAAO,EACPC,OAAQ,EACRP,KAAM,IAIV,MAAMQ,UAAoD7M,EAAAA,EACxDE,YAAcC,EAAAA,GAAkBxF,KAEhC,iCAAOmS,CACLC,GAEA,IADAlc,EAA4BX,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAEhC,MAAO,IACF4b,EAASiB,MACTlK,OAAOtP,QAAQ1C,GAAOkS,QAAO,CAACC,EAAG/T,KAAA,IAAG6J,EAAKvB,GAAMtI,EAAA,OAAMsI,EAAQ,IAAKyL,EAAK,CAAClK,GAAMvB,GAAUyL,CAAG,GAAG,CAAC,GAEtG,CAEAxJ,KAAO,gBAMP,gBAAOwT,GACLnK,OAAOuB,eAAe7D,KAAK0M,UAAW,QAAS,CAC7CvJ,GAAAA,GAKE,OAHInD,KAAKgE,SACPhE,KAAK2M,aAAa3M,KAAKgE,SAElBhE,KAAK4M,UAAY5M,KAAKK,MAAM6L,QAAQJ,KAAO9L,KAAKK,MAAM6L,QAAQE,KACvE,IAGF9J,OAAOuB,eAAe7D,KAAK0M,UAAW,SAAU,CAC9CvJ,GAAAA,GACE,MAAM0J,EAAQ7M,KAAK8M,WAAWld,OAC9B,OAAOoQ,KAAKK,MAAMsL,WAAakB,EAAQ7M,KAAKK,MAAM6L,QAAQC,IAAMnM,KAAKK,MAAM6L,QAAQG,MACrF,IAGF/J,OAAOuB,eAAe7D,KAAK0M,UAAW,OAAQ,CAC5CvJ,GAAAA,GACE,MAAM4J,EAAI/M,KAAKK,MAAMmL,KACrB,MAAQ,GAAEuB,EAAE7N,SAAS6N,EAAErB,UAAUqB,EAAElT,UAAUkT,EAAEtB,QACjD,GAEJ,CAEAjG,kBAAAA,GACE,MAAO,CACLG,OAAQ,CACN,CAAEzX,KAAM,mBAAoB+K,KAAM,OAAQ+T,UAAU,GACpD,CAAE9e,KAAM,OAAQ+K,KAAM,QACtB,CACE/K,KAAM,aACN+K,KAAM,YACN5K,MAAO,QACP0X,QAAS/F,KAAKiH,yBAAyBsD,gBAAgBC,OAAOyC,uBAEhE,CACE/e,KAAM,aACN+K,KAAM,aACN5K,MAAO,aACP0X,QAAS,iBAEX,CACE7X,KAAM,SACN+K,KAAM,SACNwO,IAAK,EACL1B,QAAS,CAAEmH,MAAO,cAAevT,MAAO,KAIhD,CAEAqH,WAAAA,GACE,MAAO,IACFuK,EACH4B,UAAWnN,KAAKiH,yBAAyBsD,gBAAgBC,OAAOyC,sBAEpE,CAEA7J,qBAAuBA,KAAA,CAASE,EAAG,CAAC,KAAMG,EAAG,CAAC,OAE9CxC,GAAAA,CAAInB,GAKF,OAJAiB,MAAME,IAAInB,GACNA,EAAI0L,MAAM3R,OAASiG,EAAI6L,aACzB3L,KAAKK,MAAMsL,WAAa9C,KAAKlB,IAAI7H,EAAI0L,KAAK3R,KAAMmG,KAAKK,MAAMsL,aAEtD3L,IACT,CAEA8D,MAAAA,CAAOE,GACLhE,KAAK2M,aAAa3I,GACdhE,KAAKK,MAAM+M,OAASpN,KAAKgE,SAE3BhE,KAAKgE,QAAQqJ,OACbrN,KAAKgE,QAAQ6G,UAAU7K,KAAKK,MAAMiD,EAAItD,KAAKK,MAAMoD,GACjDzD,KAAKgE,QAAQsJ,OAAQtN,KAAKK,MAAM+M,MAAQvE,KAAK0E,GAAM,KACnDvN,KAAKgE,QAAQwJ,SAASxN,KAAKK,MAAMjG,KAAM,EAAG,GAC1C4F,KAAKgE,QAAQyJ,YAEbzN,KAAK0N,mBACL1N,KAAK2N,aAET,CAEAf,OAAAA,CAAQ5I,GACFA,GACFhE,KAAK2M,aAAa3I,GAEpB,MAAM4J,EAAQ5N,KAAK8M,WACnB,IAAInF,EAAM,EACV,IAAK,MAAMmC,KAAQ8D,EACjBjG,EAAMkB,KAAKlB,IAAI3H,KAAKgE,SAAS6J,YAAY/D,GAAMnQ,OAASmU,OAAOC,iBAAkBpG,GAEnF,QAASA,CACX,CAEAvD,QAAAA,CAAS4J,GACP,MAAM7J,EAAOnE,KAAKiO,YAAYD,GAE9B,OACEhO,KAAKK,MAAMiD,EAAKa,EAAKb,GACrBa,EAAKb,EAAItD,KAAKK,MAAMiD,EAAKtD,KAAKrG,OAC9BqG,KAAKK,MAAMoD,EAAKzD,KAAKK,MAAMmL,KAAK3R,KAAOsK,EAAKV,GAC5CU,EAAKV,EAAIzD,KAAKK,MAAMoD,EAAKzD,KAAKK,MAAMmL,KAAK3R,KAAOmG,KAAK4J,QAIhD7I,MAAMqD,SAAS4J,EACxB,CAEArB,YAAAA,CAAa3I,GACXhE,KAAKgE,QAAUA,EACfA,EAAQ/C,IAAI,OAAQjB,KAAKwL,MACzBxH,EAAQ/C,IAAI,YAAajB,KAAKK,MAAM8M,WACpCnJ,EAAQ/C,IAAI,YAAajB,KAAKK,MAAMuL,WACpC5H,EAAQ/C,IAAI,eAAgBjB,KAAKK,MAAM0L,aACzC,CAEAe,QAAAA,GACE,OAAO9M,KAAKK,MAAMjG,KAAKyM,WAAWqH,MAAM,KAC1C,CAEAP,UAAAA,GACE,IAAK3N,KAAKgE,QAAS,OACnB,IAAI,EAAEP,GAAMzD,KAAKK,MACjB,IAAK,MAAMyJ,KAAQ9J,KAAK8M,WACtB9M,KAAKgE,QAAQwJ,SAAS1D,EAAM9J,KAAKK,MAAMiD,EAAKtD,KAAKK,MAAM6L,QAAQJ,KAAMrI,GACrEA,GAAMzD,KAAKK,MAAMsL,UAErB,CAEA+B,gBAAAA,GACE,IAAK1N,KAAKK,MAAM8N,aAAenO,KAAKgE,QAClC,OAGF,MAAM,MAAErK,GAAUqG,MACZ,OAAE4J,GAAW5J,KACboO,EAAWxE,EAAS5J,KAAKK,MAAM6L,QAAQC,IAAMnM,KAAKK,MAAM6L,QAAQG,QAChE,EAAE/I,GAAMtD,KAAKK,MACnB,IAAIoD,EAAIzD,KAAKK,MAAMoD,EAAKmG,EAEQ,WAA5B5J,KAAKK,MAAM0L,aACbtI,EAAIzD,KAAKK,MAAMoD,EAAK2K,EAAW,EAAIpO,KAAKK,MAAM6L,QAAQC,IAAM,EACvB,eAA5BnM,KAAKK,MAAM0L,eACpBtI,EAAIzD,KAAKK,MAAMoD,EAAKzD,KAAKK,MAAMsL,YAGjC3L,KAAKgE,QAAQ8G,YACb9K,KAAKgE,QAAQ/C,IAAI,YAAajB,KAAKK,MAAM8N,YACzCnO,KAAKgE,QAAQqK,KAAK/K,EAAIG,EAAG9J,EAAOiQ,GAChC5J,KAAKgE,QAAQsK,OACbtO,KAAKgE,QAAQ/C,IAAI,YAAajB,KAAKK,MAAM8M,WACzCnN,KAAKuO,eACLvO,KAAKgE,QAAQwK,WACf,CAEAD,YAAAA,GACE,MAAM,UAAElE,EAAY,EAAC,YAAEC,EAAW,OAAEmE,GAAWzO,KAAKK,MAC9CqO,EAAcD,GAAQ9U,OAAS,GAEhC0Q,GAAarK,KAAKK,MAAMiK,aAAeoE,EAAc,IAAM1O,KAAKgE,UACnEhE,KAAKgE,QAAQ/C,IAAI,cAAeqJ,GAAemE,GAAQvB,OAAS,IAChElN,KAAKgE,QAAQ/C,IAAI,YAAa4H,KAAKlB,IAAI0C,EAAWqE,IAClD1O,KAAKgE,QAAQkH,SAEjB,CAEQ+C,WAAAA,CAAY9J,GAClB,MAAM,cAAEwK,GAAkB3O,KAAKiH,yBAC/B,MAAO,CACL3D,EAAGtD,KAAKD,MAAMwD,MAAMD,EAAEa,EAAKb,GAAKtD,KAAKD,MAAM0E,QAAQ8E,WAAaoF,EAAc7C,KAAKnS,MACnF8J,EAAGzD,KAAKD,MAAMwD,MAAME,EAAEU,EAAKV,GAAKkL,EAAcxC,IAAIvC,OAEtD,CAEAhI,MAAAA,CAAO0B,EAAWG,GAChBzD,KAAKK,MAAMiD,GAAMtD,KAAKD,MAAMwD,MAAMD,EAAEA,GAAK,EACzCtD,KAAKK,MAAMoD,GAAMzD,KAAKD,MAAMwD,MAAME,EAAEA,GAAKzD,KAAKD,MAAMwD,MAAME,EAAE,EAC9D,CAEAmL,SAAAA,GACE,OAAO5O,KAAK4J,MACd,EAGF0C,EAAKG,YAEL,S,gDC5JA,QA5EA,MACEve,KACA2gB,MAAQ,EACRC,MAAQ,EACRzL,GACAG,GACAuG,OACAhK,MAEAc,WAAAA,CAAY3S,EAAiBmV,EAAeG,EAAeuG,EAAoBhK,GAC7EC,KAAK9R,KAAOA,EACZ8R,KAAKqD,GAAKA,EACVrD,KAAKwD,GAAKA,EACVxD,KAAK+J,OAASA,EACd/J,KAAKD,MAAQA,CACf,CAEA+D,MAAAA,CAAOE,GACL,MAAM,cAAE+K,GAAkB/O,KAAKD,MAAMkH,yBACrCjD,EAAQ/C,IAAI,YAAa8N,EAAc7B,OACvClJ,EAAQ/C,IAAI,cAAe8N,EAAcC,aACzChL,EAAQ/C,IAAI,YAAa8N,EAAcL,aACvC,MAAMpL,IAAMtD,KAAKsD,IACXG,IAAMzD,KAAKyD,IACXwL,EAAajP,KAAKkP,gBAClBC,GAASC,EAAAA,EAAAA,IAAuBL,EAAcL,aACpD1K,EAAQ8G,YACR9G,EAAQqK,KAAK/K,EAAI6L,EAAQ1L,EAAI0L,EAAQF,EAAYA,GACjDjL,EAAQsK,OACRtK,EAAQkH,QACV,CAEA7G,YAAAA,CAAaF,GAEX,OADAnE,KAAK6O,MAAQ1K,EAAKb,EACVtD,KAAK8O,MAAQ3K,EAAKV,CAC5B,CAEAc,MAAAA,CAAOJ,GACL,MAAMgH,EAAOhH,EAAKb,EAAItD,KAAK6O,MACrBzD,EAAOjH,EAAKV,EAAIzD,KAAK8O,MAC3B9O,KAAK+J,OAAO,CAAE7b,KAAM8R,KAAK9R,KAAMid,OAAMC,OAAMjH,SAC3CnE,KAAK6O,MAAQ1K,EAAKb,EAClBtD,KAAK8O,MAAQ3K,EAAKV,CACpB,CAEAW,QAAAA,CAASD,GACP,MAAMxK,EAAQqG,KAAKD,MAAMwD,MAAMD,EAAEoG,OAAO1J,KAAKkP,iBACvCtF,EAAS5J,KAAKD,MAAMwD,MAAME,EAAEiG,OAAO,GAAK1J,KAAKD,MAAMwD,MAAME,EAAEiG,OAAO1J,KAAKkP,iBAE7E,OACElP,KAAKqD,KAAO1J,EAAQ,GAAKwK,EAAKb,GAC9BtD,KAAKqD,KAAO1J,EAAQ,GAAKwK,EAAKb,GAC9BtD,KAAKwD,KAAOoG,EAAS,EAAIzF,EAAKV,GAC9BzD,KAAKwD,KAAOoG,EAAS,EAAIzF,EAAKV,CAKlC,CAEAyL,aAAAA,GACE,MAAM,cAAEH,GAAkB/O,KAAKD,MAAMkH,yBACrC,OAAO8H,EAAclV,KAAmC,EAA5BkV,EAAcL,WAC5C,CAEApL,CAAAA,GACE,MAAM,cAAEyL,GAAkB/O,KAAKD,MAAMkH,yBACrC,OAAOjH,KAAKD,MAAMwD,MAAMD,EAAEtD,KAAKqD,MAAQ0L,EAAclV,KAAO,CAC9D,CAEA4J,CAAAA,GACE,MAAM,cAAEsL,GAAkB/O,KAAKD,MAAMkH,yBACrC,OAAOjH,KAAKD,MAAMwD,MAAME,EAAEzD,KAAKwD,MAAQuL,EAAclV,KAAO,CAC9D,E,mLCIF,QAjFA,MACE,WAAAgH,GACEb,KAAKqP,QAAS,UAAa,KAAOC,SAASC,cAAc,SAC3D,CAEA,GAAAtO,CAAIuO,EAAU7V,EAAOiQ,GACnB5J,KAAKwP,SAAWA,EAChBxP,KAAKrG,MAAQA,EACbqG,KAAK4J,OAASA,EACd5J,KAAKyP,UAAW,CAClB,CAEA,MAAA3L,CAAOE,EAASV,EAAGG,GAUjB,GATS,MAALH,IACFA,EAAI,GAEG,MAALG,IACFA,EAAI,GAEDzD,KAAKyP,UACRzP,KAAK0P,YAEH1P,KAAKrG,MAAQ,GAAKqG,KAAK4J,OAAS,GAIpC,IACM5J,KAAK2P,OAAS,GAAK3P,KAAKqP,OAC1BrL,EAAQ4L,UACN5P,KAAKqP,OACL,EACA,KACGrP,KAAKrG,MAAQqG,KAAK2P,UAClB3P,KAAK4J,OAAS5J,KAAK2P,OACtBrM,EACAG,EACAzD,KAAKrG,MACLqG,KAAK4J,SAGP5F,EAAQqJ,OACRrJ,EAAQ6G,UAAUvH,EAAGG,GACrBzD,KAAKwP,SAASxL,GACdA,EAAQyJ,UAEZ,CAAE,MAAO7O,IACP,QACEA,EACAoB,KAAKqP,OACD,CACE3I,MAAO,CACL/M,MAAOqG,KAAKrG,MACZiQ,OAAQ5J,KAAK4J,OACb+F,MAAO3P,KAAK2P,MACZE,OAAQ7P,KAAKqP,OAAO1V,MACpBmW,QAAS9P,KAAKqP,OAAOzF,OACrBmG,OAAQpe,OAAOqe,OAAOrW,MACtBsW,QAASte,OAAOqe,OAAOpG,SAG3B,CAAC,EAET,CACF,CAEA,OAAA8F,IACM,YAGJ1P,KAAKqP,OAAO1V,MAAQqG,KAAKrG,MACzBqG,KAAKqP,OAAOzF,OAAS5J,KAAK4J,OAC1B5J,KAAKgE,SAAU,OAAoBhE,KAAKqP,QACxCrP,KAAK2P,MAAQ,KAAMO,gBACnB,KAAMC,uBAAuB,CAAEC,cAAepQ,KAAKqP,OAAQ1V,MAAOqG,KAAKrG,MAAOiQ,OAAQ5J,KAAK4J,SAC3F5J,KAAKgE,QAAQT,MAAMvD,KAAK2P,MAAO3P,KAAK2P,OAEpC3P,KAAKwP,SAASxP,KAAKgE,SACnBhE,KAAKyP,UAAW,EAClB,G,oEC9EK,IAAKY,EAAQ,SAARA,GAAQ,OAARA,EAAQ,wBAARA,EAAQ,oBAARA,EAAQ,oBAARA,CAAQ,M,sECJb,IAAKC,EAAwB,SAAxBA,GAAwB,OAAxBA,EAAAA,EAAwB,WAAxBA,EAAAA,EAAwB,WAAxBA,EAAAA,EAAwB,WAAxBA,EAAAA,EAAwB,YAAxBA,CAAwB,MAO7B,SAASC,EAAoBC,GAClC,MAAO,CACLC,KAAMD,GAAkBF,EAAyBI,GACjDC,IAAKH,GAAkBF,EAAyBM,EAChDC,IAAKL,GAAkBF,EAAyBQ,EAChDC,IAAKP,GAAkBF,EAAyBU,EAEpD,CCoGA,MAAMC,EAAgBviB,IAA+D,IAA9D,KAAEwiB,EAAI,UAAE5J,GAAiD5Y,EAC1EyiB,EAAa,GACjB,MAAMC,EAAQF,EAAKG,WACbC,EAAOJ,EAAKK,cACZC,EAAMN,EAAKlhB,UACjB,OAAQsX,GACN,KAAKmK,EAAAA,GAAUC,GACf,KAAKD,EAAAA,GAAUE,GACf,KAAKF,EAAAA,GAAUG,GACf,KAAKH,EAAAA,GAAUI,GACf,KAAKJ,EAAAA,GAAUK,IACf,KAAKL,EAAAA,GAAUM,IACf,KAAKN,EAAAA,GAAUO,IACf,KAAKP,EAAAA,GAAUQ,EACf,KAAKR,EAAAA,GAAUS,GACf,KAAKT,EAAAA,GAAUU,GACb,MAAMC,IACDlB,EAAKmB,WAAa,IAAM,GAAM,GAAGxL,WAAWyL,QAAQ,MACvD,IACApB,EAAKqB,aAAa1L,WAAWyL,QAAQ,OACpCpB,EAAKmB,WAAa,GAAK,KAAO,MACjClB,EAAc,GAAEqB,EAAAA,GAAOpB,MAAUI,KAAOY,IACxC,MACF,KAAKX,EAAAA,GAAUgB,EACf,KAAKhB,EAAAA,GAAUiB,EACbvB,EAAc,GAAEqB,EAAAA,GAAOpB,MAAUI,IACjC,MACF,KAAKC,EAAAA,GAAUX,EACbK,EAAc,GAAEqB,EAAAA,GAAOpB,MAAUE,IAMrC,OAAOH,CAAU,EAkBnB,SAASwB,EACPC,EACAC,EACAC,EACAC,GAEA,MAAMC,EAAmBJ,EAAkB,EACrCK,EAAeJ,EAAkBC,EAAKljB,OAAS,EACrD,IAAIsjB,EAAWN,EACXO,EAAWN,EAQf,OAPIG,IACFE,GAAY,GAEVD,IACFE,GAAY,GAGVJ,EAAIG,KAAcJ,EAAKK,KAAcH,GAAoBC,GACpDN,EAAsCO,EAAUC,EAAUL,EAAMC,GAGlEA,EAAIG,GAAYJ,EAAKK,GAAY,CAAED,WAAUC,YAAa,CAAED,SAAUC,EAAUA,SAAUD,EACnG,CAEA,MAEME,EAAUC,IAAAA,KAAoB,KAEpC,MAAMC,UAA6D7T,EAAAA,EACjE,gBAAOgN,GACLnK,OAAOuB,eAAe7D,KAAK0M,UAAW,QAAS,CAC7CvJ,GAAAA,GACE,MAAM,cAAEwL,GAAkB3O,KAAKiH,yBAC/B,OAAOjH,KAAKD,MAAMpG,MAAQgV,EAAc7C,KAAKnS,MAAQgV,EAAcvC,MAAMzS,KAC3E,IAGF2I,OAAOuB,eAAe7D,KAAK0M,UAAW,SAAU,CAC9CvJ,GAAAA,GACE,MAAM,cAAEwL,GAAkB3O,KAAKiH,yBAC/B,OAAOjH,KAAKkC,UAAU0H,OAAS+E,EAAcxC,IAAIvC,OAAS+E,EAActC,OAAOzC,MACjF,GAEJ,CAEA,yBAAO3J,CAAkBsT,GAAsE,IAArE,SAAEC,GAAiED,EAC3F,OAAO1K,KAAKlB,IAAI,KAAM6L,EAASvc,KAAKwc,GAAYC,EAAAA,EAAeD,EAAQvlB,MAAM+R,mBAAmBwT,KAClG,CAEA9T,aAAe,QACfA,gBAAkB,GAElBuC,UACAnC,MACAhE,KACA4X,2BACAC,YAAc,EACdC,YAAc,EACdC,SAA0C,GAC1CN,SAAsB,GACtBO,aACAC,oBAAqB,EACrBC,YAIW,KAYXpT,WAAAA,CAAYC,EAAoBoB,GAC9BnB,MAAMD,EAAQoB,GAEdlC,KAAKkC,UAAYA,EACjBlC,KAAKD,MAAQC,KAAKkC,UAAUuC,QAC5BzE,KAAKjE,KAAOiE,KAAKD,MAAMyE,QACvB,MAAM0P,EAAmBlU,KAAKD,MAAMqF,eAMpC,GALApF,KAAK2T,2BAA6BO,EAAiBP,2BACnD3T,KAAK+T,aAAeG,EAAiBH,aACrC/T,KAAKmU,SAAWC,EAAAA,GAAMD,UAAS,GAE/BnU,KAAKwT,SAAW,GACZ1S,EAAO0S,SAAU,CACnB,IAAK,MAAMa,KAAqBvT,EAAO0S,SAAU,CAO/C,MAAMC,EAAUC,EAAAA,EAAeW,EAAkBnmB,MAAM2R,WACrD,IACKwU,EACHnH,OACGmH,EAAkBnH,OAASmH,EAAkBnH,MAAMle,SAAS,KACzD,IACAslB,EAAAA,EAAAA,IAAkBD,EAAkBnH,QAE5ClN,KAAKkC,WAEPlC,KAAKuU,WAAWd,EAClB,QACO3S,EAAO0S,QAChB,CAEAxT,KAAKwU,YAAcxU,KAAKwU,YAAYpT,KAAKpB,MACzCA,KAAK2N,WAAa3N,KAAK2N,WAAWvM,KAAKpB,MACvCA,KAAKyU,gBAAkBzU,KAAKyU,gBAAgBrT,KAAKpB,MACjDA,KAAK0U,WAAa1U,KAAK0U,WAAWtT,KAAKpB,MACvCA,KAAK2U,qBAAuB3U,KAAK2U,qBAAqBvT,KAAKpB,MAG3DA,KAAKkC,UAAUd,KAAK,SAAUpB,KAAK0U,YACnC1U,KAAKkC,UAAUd,KAAK,SAAUpB,KAAK0B,QAAQN,KAAKpB,KAAM,WACtDA,KAAKD,MAAQC,KAAKkC,UAAUuC,QAE5BzE,KAAKD,MAAMqB,KAAK,SAAUpB,KAAK0U,YAC/B1U,KAAKD,MAAMqB,KAAK,SAAUpB,KAAK0B,QAAQN,KAAKpB,KAAM,WAClDA,KAAKD,MAAMqB,KAAKwT,EAAAA,GAAkBC,iBAAkB7U,KAAK8U,uBAAuB1T,KAAKpB,OACrF,MAAM+U,EAA0B/U,KAAK0B,QAAQN,KAAKpB,KAAM,SAAU,SAClEA,KAAKD,MAAMqB,KAAK,WAAW,KACzBpB,KAAKD,MAAMiH,OAAO,SAAUhH,KAAK0U,YACjC1U,KAAKD,MAAMiH,OAAO4N,EAAAA,GAAkBC,iBAAkB7U,KAAK8U,uBAAuB1T,KAAKpB,OACvFgV,EAAAA,EAAWhO,OAAO,SAAU+N,IAC5BE,EAAAA,EAAAA,IAAcjV,KAAKkV,UAAU7F,OAAO,IAEtC2F,EAAAA,EAAW5T,KAAK,SAAU2T,GAE1B/U,KAAKD,MAAMqF,eAAehE,KAAK,QAASpB,KAAK0U,YAC7C1U,KAAKD,MAAMqF,eAAehE,KAAK,SAAUpB,KAAKmV,yBAAyB/T,KAAKpB,OAE5EA,KAAK0U,YACP,CAEAU,WAAAA,GACE,MAAMC,MAAM,wBACd,CAEAvR,MAAAA,CAAOE,GAKL,GAJAhE,KAAKjE,KAAOiE,KAAKD,MAAMyE,QACvBxE,KAAKuJ,WAAavJ,KAAKD,MAAMwJ,WAC7BvJ,KAAKgE,QAAUA,EAEgB,IAA3BhE,KAAKjE,KAAKuZ,MAAM1lB,OAGlB,OAFAoQ,KAAKuV,+BACAvV,KAAKwV,wBAAwBxV,KAAKyV,aAAazR,IAItDhE,KAAKgE,QAAQqJ,OACbrN,KAAK0V,OACL1V,KAAK2V,eACL3V,KAAKoV,cACLpV,KAAK4V,iBACL5V,KAAK6V,kBACL7V,KAAK8V,0BACL9V,KAAKgE,QAAQyJ,UACRzN,KAAKwV,wBAAwBxV,KAAKyV,aAAazR,EACtD,CAEA+R,UAAAA,CAAW/R,GACThE,KAAKjE,KAAOiE,KAAKD,MAAMyE,QACvBxE,KAAKuJ,WAAavJ,KAAKD,MAAMwJ,WAC7BvJ,KAAKgE,QAAUA,EAEfhE,KAAKgW,cACLhW,KAAKkV,UAAUpR,OAAOE,EACxB,CAEAyR,YAAAA,CAAazR,GACX,GAAIhE,KAAKiW,WAAY,CACnB,MAAM,cAAEtH,GAAkB3O,KAAKiH,yBAI/B,GAHAjD,EAAQ6G,UAAU8D,EAAc7C,KAAKnS,MAAO,GAC5CqG,KAAKiW,WAAWnS,OAAOE,IAEnBkS,EAAAA,EAAAA,IAAqBlW,KAAK2T,6BAAoD,iBAArB3T,KAAKjE,KAAKjB,OAA2B,CAChG,MAAM,OAAE0P,GAAWmE,EAAcwH,QACjC,IAAI7J,EAAAA,EACF,CACElS,KAAM,MACNkJ,EAAGqL,EAAcxC,IAAIrR,OAAOsb,OAAOtK,KACnCrI,EAAGkL,EAAcxC,IAAIrR,OAAOsb,OAAOjK,IAAOkK,EAAAA,GAAUC,IAAMC,EAAAA,GAAOD,IACjE9K,KAAM,CAAE3R,KAAMwc,EAAAA,GAAUC,KACxBnJ,UAAW3C,EAAOpQ,KAClB2R,aAAc4C,EAAcxC,IAAIqK,UAElCxW,KAAKkC,WACL4B,OAAOE,EACX,CAEAA,EAAQ6G,WAAW8D,EAAc7C,KAAKnS,MAAO,EAC/C,CACF,CAEA8c,eAAAA,CAAgBzS,GACd,MAAM,cAAE2K,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAC3B3R,EAAQxE,KAAKD,MAAMyE,QACnBf,GAAKzD,KAAK4J,OAAS5J,KAAK0W,SAASC,QAAQ,GAAK,GAAK,EAEzD,OAAO,IAAIrK,EAAAA,EACT,CACElS,KAAMoK,EAAMtL,aAAeC,EAAAA,GAAWyd,MAAQ,sBAAuBC,EAAAA,EAAAA,IAAkBrS,EAAM8C,WAC7FhE,EAAGqL,EAAc7C,KAAKxE,UAAU8O,OAAOtK,KACvCrI,EAAGkL,EAAcxC,IAAIvC,OAASnG,GAAKkL,EAAc7C,KAAKxE,UAAU8O,OAAOjK,KAAO,GAC9EiB,OAAQ,GACR5B,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQoC,EAAc7C,KAAKxE,UAAUkE,MAC3E2B,UAAW3C,EAAOsM,cAClBlL,UAAWC,EAAAA,GAAUkL,OACrBhL,aAAcC,EAAAA,GAAaC,YAE7BjM,KAAKkC,WACL4B,OAAOE,EACX,CAEA2J,UAAAA,CAAW3J,GACT,MAAM,cAAE2K,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QACjCnS,EAAQqJ,OACRrJ,EAAQ6G,UAAU8D,EAAc7C,KAAKnS,MAAO,IAEvCuc,EAAAA,EAAAA,IAAqBlW,KAAK2T,4BAa7B3T,KAAKiW,WAAa,IAAI3J,EAAAA,EACpB,CACElS,KAAM4F,KAAKjE,KAAK9C,MAAQ+G,KAAKjE,KAAKjB,OAClCwI,EAAGqL,EAAcxC,IAAIrR,OAAOsb,OAAOtK,KACnCrI,EAAGkL,EAAcxC,IAAIrR,OAAOsb,OAAOjK,IACnCX,KAAM,CAAE3R,KAAMwc,EAAAA,GAAUW,EAAG9X,MAAO,QAClCiO,UAAW3C,EAAOpQ,MAEpB4F,KAAKkC,WApBPlC,KAAKiW,WAAa,IAAI3J,EAAAA,EACpB,CACElS,KAAM4F,KAAKjE,KAAK9C,MAAQ+G,KAAKjE,KAAKjB,OAClCwI,EAAGqL,EAAcxC,IAAIrR,OAAOsb,OAAOtK,KACnCrI,EAAGkL,EAAcxC,IAAIrR,OAAOsb,OAAOjK,IACnCX,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQoC,EAAcxC,IAAIrR,OAAO0Q,MACvEO,aAAc4C,EAAcxC,IAAIqK,SAChCrJ,UAAW3C,EAAOpQ,MAEpB4F,KAAKkC,WAcTlC,KAAK4T,YAAc5T,KAAKiW,WAAWrJ,QAAQ5I,GAGvChE,KAAK2T,6BAA+BsD,EAAAA,GAA2BC,WACjE,IAAI5K,EAAAA,EACF,CACElS,KAAM,eACNkJ,EAAGtD,KAAKrG,MAAQgV,EAAcvC,MAAMzS,MAAQ,EAC5C8J,EAAG,EACH+H,KAAM,CAAE3R,KAAMwc,EAAAA,GAAUc,IACxBvL,UAAWC,EAAAA,GAAUO,MACrBL,aAAcC,EAAAA,GAAaG,IAC3BgB,UAAW,sBAEbnN,KAAKkC,WACL4B,OAAOE,GAGNhE,KAAKwV,yBACRxV,KAAKoX,aAAa,CAAEpT,YACfhE,KAAK8T,SAAS,IACjB9T,KAAKqX,QAAQ,CAAErT,UAASsT,cAAc,IAExCtX,KAAKqX,QAAQ,CAAErT,aAGjBA,EAAQyJ,UACHzN,KAAKwV,yBAA2BU,EAAAA,EAAAA,IAAqBlW,KAAK2T,6BAC7D3T,KAAKyW,gBAAgBzS,EAEzB,CAEAqT,OAAAA,CAAOE,GAoBJ,IApBK,QACNvT,EAAO,aACPsT,GAAe,EAAI,KACnBvb,EAAI,KACJmV,EAAI,WACJC,EAAa,KAAI,iBACjBqG,EAAmB,MAcpBD,EACC,IAAKvX,KAAKjE,KAAK0b,SAAU,OAGzB,MAAMA,EAAY,GAAEjF,EAAAA,MAAWxS,KAAKjE,KAAK0b,SAAW,KAAO,IAAO,MAAMzX,KAAKjE,KAAK0b,SAAW,OACzFvB,EAAAA,EAAAA,IAAqBlW,KAAK2T,4BAC5B3T,KAAK0X,WAAW,CACd1T,UACAkN,KAAMuG,EACNE,mBAAmB,EACnBC,cAAc,EACdN,iBAEOvb,GAAQmV,EACjBlR,KAAK0X,WAAW,CACd1T,UACAkN,KAAMD,EAAc,CAAEC,OAAM5J,UAAWtH,KAAKjE,KAAKuL,YACjDuQ,KAAM9b,EAAK8b,KACX/E,KAAM/W,EAAK+W,KACXC,IAAKhX,EAAKgX,IACVuC,MAAOvZ,EAAKuZ,MACZwC,QAAQC,EAAAA,EAAAA,IAA8BjK,OAAO/R,EAAK+b,SAClDR,eACAE,qBAEsB,OAAfrG,EACTnR,KAAK0X,WAAW,CACd1T,UACAkN,KAAMC,EACN0G,KAAM,KACN/E,KAAM,KACNC,IAAK,KACLuC,MAAO,KACPwC,OAAQ,KACRR,iBAGFtX,KAAK0X,WAAW,CACd1T,UACAkN,KAAMuG,EACNO,UACElK,OAAOmK,SAASjY,KAAKjE,KAAKmc,aAAelY,KAAKjE,KAAKmc,aAAelY,KAAKjE,KAAKoc,UACxEnY,KAAKoY,UAAUpY,KAAKjE,KAAKmc,iBACzBroB,EACNioB,QAAQC,EAAAA,EAAAA,IAA8B/X,KAAKjE,KAAKsc,YAChDT,cAAc,EACd7nB,KAAMqkB,EAAAA,GAAAA,sBAA4BpU,KAAKjE,KAAKmV,KAAKoH,QAASC,mBAAmB,QAAS,CACpFC,KAAM,UACNC,OAAQ,YAEVnB,kBACGtX,KAAK0Y,sBAGd,CAEAA,kBAAAA,GACE,MAAO,CACLb,KAAM7X,KAAKoY,UAAUpY,KAAKjE,KAAK4c,UAC/B7F,KAAM9S,KAAKoY,UAAUpY,KAAKjE,KAAK6c,UAC/B7F,IAAK/S,KAAKoY,UAAUpY,KAAKjE,KAAK8c,SAC9BvD,MAAOtV,KAAKoY,UAAUpY,KAAKjE,KAAKoc,WAEpC,CAEAxD,oBAAAA,CAAqB3Q,GACdhE,KAAKwV,uBAE4B,IAA3BxV,KAAKjE,KAAKuZ,MAAM1lB,QACzBoQ,KAAK8Y,+BAA+B9U,GAFpChE,KAAK+Y,8BAA8B/U,EAIvC,CAEA+U,6BAAAA,CAA8B/U,GAC5B,MAAM,cAAE2K,GAAkB3O,KAAKiH,yBACzB7M,EAAO,IAAIkS,EAAAA,EACf,CACEhJ,EAAGqL,EAAc7C,KAAKkN,aAAa5C,OAAOtK,KAC1CrI,EAAGkL,EAAcxC,IAAIvC,OAAS+E,EAAc7C,KAAKkN,aAAa5C,OAAOjK,IACrEX,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQoC,EAAc7C,KAAKkN,aAAaxN,MAC9EO,aAAcC,EAAAA,GAAaG,KAE7BnM,KAAKkC,WAEP,IAAK,MAAMuR,KAAWzT,KAAKwT,SACpBC,EAAQwF,2BAGb7e,EACG6G,IAAI,CACH7G,KAAMqZ,EAAQ5M,WACdpD,EAAGrJ,EAAK+I,IAAI,KAAQwL,EAAc7C,KAAKkN,aAAaE,aACpD/L,UAAWsG,EAAQ0F,kBAEpBrV,OAAOE,EAEd,CAEAoV,kBAAAA,GACE,OAAIpZ,KAAKjE,KAAK7C,aAAeC,EAAAA,GAAWI,QAAUyG,KAAKjE,KAAKoc,WAAa,KAChE,EAEF,CACT,CAEAkB,sBAAAA,CAAsBC,GAA6F,IAA5F,UAAEnB,EAAS,kBAAEoB,GAA6ED,EAC/G,MAAiC,iBAAtBC,GAAkCvZ,KAAKD,MAAMwD,QAAUiW,EAAAA,GAAUC,WAClE,GAAEzZ,KAAK0Z,OAAMC,EAAAA,EAAAA,IAAuB,CAAEC,OAAQzB,EAAW0B,KAAMN,IAAsB,MAExFvZ,KAAK0Z,MAAMvB,EACpB,CAEA3D,WAAAA,CACExQ,GAGA,IAFA,UAAEmU,GAAsDxoB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGqQ,KAAKjE,KAChE+d,IAAYnqB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAEZ,MAAM,cAAEgf,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QACjC,IAAI1S,EAAGsW,EAAWC,EAAWC,EAC7B,MAAMpP,GAAYqP,EAAAA,EAAAA,IAAa,CAAElW,UAASmW,QAASxL,EAAc7C,KAAKnS,MAAOygB,QAASzL,EAAcxC,IAAIvC,SACxGiB,EAAUwP,KACV,MAAMC,EAAYzR,KAAK0R,MAAMva,KAAKkC,UAAU0H,OAAS,IAC/C4Q,EAASxa,KAAKya,aACd,kBAAElB,GAAsBiB,EACxB5Q,EAAS5J,KAAK4J,OACpB,IACI8Q,EADAC,EAAY,EAGhB,OAAQ3a,KAAKD,MAAMwD,OACjB,KAAKiW,EAAAA,GAAUC,WAAY,CACzB,IAAKF,EAAmB,OAExB,MAAMqB,EAAa5a,KAAKkC,UAAU0Y,YAC5B,IAAEnT,EAAG,IAAEE,GAAQiT,GAAcJ,EAEnCxa,KAAKD,MAAM8a,gBAAgB,gBAAiBtB,GAE5C,MAAMuB,GAAUnB,EAAAA,EAAAA,IAAuB,CAAEC,OAAQnS,EAAKoS,KAAMN,IACtDwB,GAAUpB,EAAAA,EAAAA,IAAuB,CAAEC,OAAQjS,EAAKkS,KAAMN,IAG5DS,EADkBgB,EAAAA,MAAiBrE,MAAM,CAAC,EAAG3W,KAAK4J,SAASqR,OAAO,CAACF,EAASD,IAAUI,KAAK,IACrEC,MAAMtS,KAAKpB,IAAI6S,EAAW,IAChDP,EAAYC,EAAU/iB,KAAKmkB,IAASC,EAAAA,EAAAA,IAAuB,CAAEzB,OAAQwB,EAAMvB,KAAMN,MACjFU,EAAiBja,KAAKqZ,uBAAuB,CAAElB,YAAWoB,sBAC1D,KACF,CACA,KAAKC,EAAAA,GAAU8B,YAAa,CAC1B,IAAK/B,EAAmB,OAExB,MAAMqB,EAAa5a,KAAKkC,UAAU0Y,YAC5B,IAAEnT,EAAG,IAAEE,GAAQiT,GAAcJ,EACnCT,EAAY,CAAClR,KAAK0R,MAAM9S,IACxB,MAAM8T,EAAW,GAEXC,EAAgB,GACtB,GAAI/T,EAAM,EAAG,CACX,IAAIgU,EAAuB5S,KAAKpB,IAAI,EAAGE,GACvC,KAAO3H,KAAKkC,UAAUqB,MAAME,EAAEgY,GAAwBF,EAAWvb,KAAKkC,UAAUqB,MAAME,EAAEgE,IAAM,CAC5F,MAAM2T,EAAOpb,KAAKkC,UAAUqB,MAAME,EAAEiG,OAAO1J,KAAKkC,UAAUqB,MAAME,EAAEgY,GAAwBF,GAC1F,GAAIE,IAAyBL,EAC3B,MAEF,MAAMzE,EAAQqE,EAAAA,KAASS,GAAuBL,EAAM,GACpDK,GAAwB9E,EAAMA,EAAM/mB,OAAS,GAC7C4rB,EAAcE,QAAQD,EACxB,CACF,CAEA,MAAME,EAAgB,GAItB,IAHIhU,EAAM,GACRgU,EAAc/V,KAAKiD,KAAKlB,IAAI3H,KAAKkC,UAAUqB,MAAME,EAAEiG,OAAO1J,KAAKkC,UAAUqB,MAAME,EAAEgE,GAAO8T,GAAW,IAE9Fvb,KAAKkC,UAAUqB,MAAME,EAAEkY,EAAcA,EAAc/rB,OAAS,IAAM2rB,EAAW,GAAG,CACrF,MAAMK,EAAeD,EAAcA,EAAc/rB,OAAS,GACpDisB,EAAiB7b,KAAKkC,UAAUqB,MAAME,EAAEkY,EAAcA,EAAc/rB,OAAS,IAC7EwrB,EAAOpb,KAAKkC,UAAUqB,MAAME,EAAEiG,OAAOmS,EAAiBN,GAC5D,GAAIK,IAAiBR,EACnB,MAGF,MAAMzE,EAAQqE,EAAAA,IAAQY,EAAcR,EAAM,GAC1CO,EAAc/V,KAAK+Q,EAAMA,EAAM/mB,OAAS,GAC1C,CACAmqB,EAAY,IAAIyB,KAAkBG,GAClC3B,EAAYD,EACZE,EAAiBja,KAAKqZ,uBAAuB,CAAElB,cAC/C,KACF,CACA,QAEE4B,EAAY/Z,KAAKkC,UAAUqB,MAAME,EAAE0X,MAAMtS,KAAKpB,IAAI6S,EAAW,IAC7DN,EAAYD,EACZE,EAAiBja,KAAKqZ,uBAAuB,CAAElB,cAG/C6B,EAAUpqB,QAAU,IACtB+qB,EAAY9R,KAAKiT,IAAI9B,EAAU,GAAKA,EAAU,MAG9CW,EAAY,KACXzE,EAAAA,EAAAA,IAAqBlW,KAAK2T,6BAA+B9K,KAAK6Q,MAAMM,EAAU,IAAInT,WAAWjX,OAAS,KAEvG8qB,EAAa,GAGf,MAAMqB,EAAeA,CAACC,EAAaC,IACzBjc,KAAKD,MAAMwD,QACZiW,EAAAA,GAAUC,WACL,GAAEuC,KAEHhc,KAAK0Z,MAAMsC,EAAKC,GAIvBC,EAAY,IAAI5P,EAAAA,EACpB,CACEhJ,EAAGtD,KAAKrG,MAAQqG,KAAKoZ,qBAAuBzK,EAAcvC,MAAM+P,KAAK/F,OAAOtK,KAC5EN,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQoC,EAAcvC,MAAM+P,KAAK3Q,MACvE2B,UAAW3C,EAAOpQ,KAClB2R,aAAcC,EAAAA,GAAaoQ,QAE7Bpc,KAAKkC,WAGP,IAAIma,EAAYrc,KAAKsc,WACrB,MAAMC,EAAoBA,KACxBL,EAAUjb,IAAI,CACZuK,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQoC,EAAcvC,MAAM+P,KAAK3Q,MACvE2B,UAAW3C,EAAOpQ,KAClB2R,aAAcC,EAAAA,GAAaoQ,SAE7BC,EAAYrc,KAAKsc,UAAU,EAE7B,IAAK,IAAIE,EAAI,EAAGA,EAAIzC,EAAUnqB,OAAQ4sB,IACpC/Y,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAGuW,EAAUyC,KAC7B/Y,EAAI,GAAKA,EAAImG,IACbnG,IAAMmG,IAAQnG,GAAK,GACvB4Y,EAAUpb,IAAI,CAAEiJ,GAAIzG,EAAG2G,GAAI3G,IAC3ByY,EAAUjb,IAAI,CACZ7G,KAAM2hB,EAAa/B,EAAUwC,GAAI9B,GACjCjX,MAEEzD,KAAKD,MAAMwD,QAAUiW,EAAAA,GAAUC,YAA+B,IAAjBO,EAAUwC,IACzDH,EAAUpb,IAAI,CAAEqJ,YAAaE,EAAOpQ,OACpC8hB,EAAUjb,IAAI,CACZuK,KAAM,CAAEE,OAAQ,OAAQ7R,KAAMqiB,EAAU7b,MAAMmL,KAAK3R,MACnDsT,UAAW3C,EAAOiS,yBAEpBJ,EAAUvY,OAAOE,GACjBkY,EAAUpY,OAAOE,GACjBuY,MAEAF,EAAUvY,OAAOE,GACjBkY,EAAUpY,OAAOE,KAGrB6G,EAAU6R,OAEN5C,GACF9Z,KAAK2c,iBAAiB,CAAE3Y,UAAS4Y,YAAa/T,KAAK6Q,MAAM1Z,KAAKwD,GAAG2U,IAAa9pB,MAAO4rB,GAazF,CAEA4C,gCAAAA,GACE,OAAOC,EAAAA,EAAAA,IACL,KACKC,EAAAA,EAAAA,IAAiB/c,KAAKiH,yBAAyB0H,cAAcwH,QAAQ3L,OAAOwS,mBAC/EpM,EAAG,IAEL,MAEJ,CAEAqM,iCAAAA,CAAiCC,GAM9B,IAN+B,eAChCC,EAAc,oBACdC,GAIDF,EACC,MAAM,cAAEvO,GAAkB3O,KAAKiH,0BACzB,WAAE0E,GAAegD,EAAcvC,MAAM+P,KAAK3Q,KAC1CU,EAAUI,EAAAA,EAAKC,2BAA2B,UAAWoC,EAAcvC,MAAM+P,KAAK3Q,KAAKU,SAEnF5V,EAAYuS,KAAKwU,KAAKF,EAAiBC,IAAwB,EAC/DjO,GAAUxD,GAAc2R,EAAAA,GAAYC,IAAMrR,EAAQC,KAAOqR,EAAAA,GAAQlH,MAAQpK,EAAQG,QAAUmR,EAAAA,GAAQlH,KACnGmH,EAAyB5U,KAAK6Q,MAAM1Z,KAAKwD,GAAG2Z,IAC5CO,EAA8B7U,KAAK6Q,MAAM1Z,KAAKwD,GAAG4Z,IACjDO,EAAYF,EAAyBtO,EAAS7Y,EAEpD,OAAOuS,KAAKiT,IAAI4B,EAA8BD,GAA0BtO,EACpEuO,EACAC,CACN,CAEAhB,gBAAAA,CAAgBiB,GAUb,IAVc,QACf5Z,EAAO,YACP4Y,EAAW,MACXvuB,EAAK,WACL8f,GAMDyP,EACC,MAAM,cAAEjP,GAAkB3O,KAAKiH,yBACzB4D,GAAYqP,EAAAA,EAAAA,IAAa,CAAElW,UAASmW,QAASxL,EAAc7C,KAAKnS,MAAOygB,QAASzL,EAAcxC,IAAIvC,UAClG,OAAEY,GAAWmE,EAAcwH,SAC3B,KAAEtc,EAAI,WAAE8R,GAAegD,EAAcvC,MAAM+P,KAAK3Q,KAChDU,EAAUI,EAAAA,EAAKC,2BAA2B,UAAWoC,EAAcvC,MAAM+P,KAAK3Q,KAAKU,SAEzFrB,EAAUwP,KACV,IAAI/N,EAAAA,EACF,CACElS,KAAM/L,EACNiV,EAAGtD,KAAKrG,MAAQqG,KAAKoZ,qBAAuBlN,EAAQJ,KAAO6C,EAAcvC,MAAM+P,KAAK/F,OAAOtK,KAC3FrI,EAAGmZ,EACHpR,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQ,CAAE1S,OAAMqF,MAAO,SAC7DyM,aACAO,UACAH,aAAcC,EAAAA,GAAaoQ,OAC3BjP,UACEnN,KAAK2T,6BAA+BsD,EAAAA,GAA2BC,UAAY,QAAU1M,EAAOqT,YAC9F1P,WAAYA,GAAc3D,EAAOwS,mBAEnChd,KAAKkC,WACL4B,OAAOE,GACT6G,EAAU6R,MACZ,CAEA1G,WAAAA,GACE,MAAM,WAAEzM,EAAU,MAAE5P,GAAUqG,MACxB,cAAE2O,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAEjCnW,KAAKgE,QAAQqJ,OAEiB,IAA5BrN,KAAKjE,KAAK+hB,gBACT5H,EAAAA,EAAAA,IAAqBlW,KAAK2T,6BAC3B3T,KAAKjE,KAAK7C,aAAeC,EAAAA,GAAW4kB,iBAEpC/d,KAAK0V,MAAK,GAEZ1V,KAAKgE,QAAQ6G,UAAU8D,EAAc7C,KAAKnS,MAAOgV,EAAcxC,IAAIvC,QACnE,MAAMoU,EAAe,IAAI1R,EAAAA,EACvB,CACE7I,EAAGzD,KAAK4J,OAAS+E,EAActC,OAAO8P,KAAK/F,OAAOjK,IAClDX,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQ,CAAE1S,KAAM8U,EAActC,OAAO8P,KAAK3Q,KAAK3R,OACrFsT,UAAW3C,EAAOpQ,KAClB2R,aAAcC,EAAAA,GAAaG,IAC3BP,UAAWC,EAAAA,GAAUkL,QAEvB/W,KAAKkC,WAQD+b,EAAgBpV,KAAKlB,KACzBuW,EAAAA,EAAAA,IAAyB,CACvB1Z,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKkC,UAAUqB,MACtBgG,eACClP,MAAQ,EACX,GAGI8jB,GAAcC,EAAAA,EAAAA,IAAwB,CAC1C5Z,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKkC,UAAUqB,MACtBgG,aACA8U,WAAY1kB,IACXU,MAEH,OAAQ2F,KAAKjE,KAAKuL,WAChB,KAAKmK,EAAAA,GAAUC,GACf,KAAKD,EAAAA,GAAUE,GACf,KAAKF,EAAAA,GAAUG,GACf,KAAKH,EAAAA,GAAUI,GACT7R,KAAKjE,KAAK7C,aAAeC,EAAAA,GAAWC,MAEpC4G,KAAK9R,OAASowB,EAAAA,GAAiBC,WAC/Bve,KAAK2T,6BAA+BsD,EAAAA,GAA2BC,WACvC,OAAxBlX,KAAKjE,KAAKuL,UAEVtH,KAAKwe,iBAAiB,CAAER,eAAcC,gBAAeE,gBAErDne,KAAKye,oBAAoBT,GAG3Bhe,KAAK0e,2BAA2B,CAAEV,eAAcC,gBAAeE,gBAEjE,MACF,KAAK1M,EAAAA,GAAUK,KACToE,EAAAA,EAAAA,IAAqBlW,KAAK2T,4BAC5B3T,KAAKye,oBAAoBT,GAEzBhe,KAAKwe,iBAAiB,CAAER,eAAcC,gBAAeE,gBAEvD,MACF,KAAK1M,EAAAA,GAAUM,IACf,KAAKN,EAAAA,GAAUO,IACf,KAAKP,EAAAA,GAAUQ,EACf,KAAKR,EAAAA,GAAUS,GACf,KAAKT,EAAAA,GAAUU,GACbnS,KAAKwe,iBAAiB,CAAER,eAAcC,gBAAeE,gBACrD,MACF,KAAK1M,EAAAA,GAAUgB,EACbzS,KAAK2e,iBAAiB,CAAEX,eAAcC,gBAAeE,gBACrD,MACF,KAAK1M,EAAAA,GAAUiB,EACb1S,KAAK4e,kBAAkB,CAAEZ,eAAcC,gBAAeE,gBACtD,MACF,KAAK1M,EAAAA,GAAUX,EACb9Q,KAAK6e,mBAAmB,CAAEb,eAAcC,gBAAeE,gBAK3Dne,KAAKgE,QAAQyJ,SACf,CAEAqR,eAAAA,CAAgBxb,GAAuB,IAAZyb,EAAMpvB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAClC,OAAO2T,GAAK,EAAIyb,GAAUzb,GAAKtD,KAAKrG,MAAQolB,CAC9C,CAEAC,iBAAAA,CAAiBC,GAQd,IARe,OAChBC,EAAM,aACNlB,EAAY,gBACZmB,EAAkB,GAKnBF,EACC,MAAMG,EAA6B,GAC7BC,EAA2D,GACjEH,EAAOI,UAAU3b,SAAStV,IACxB2vB,EAAa/c,IAAI,CAAE7G,KAAM/L,EAAM+L,OAC/B,MAAMmlB,EAAY1W,KAAK0R,MAAMyD,EAAapR,QAAQ5M,KAAKgE,UACjDwb,EAAW,IAAKnxB,EAAOkxB,aACzBlxB,EAAMoxB,YACRL,EAAa1D,QAAQ8D,GAErBJ,EAAaxZ,KAAK4Z,EACpB,IAGFJ,EAAazb,SAAQ+b,IAA4B,IAA3B,EAAEpc,EAAC,KAAElJ,EAAI,UAAEmlB,GAAWG,EAC1C,IAAK1f,KAAK8e,gBAAgBxb,EAAG6b,GAC3B,OAEF,MAAMQ,EAAkBJ,EAAY,EAC9BK,EAAetc,EAAIqc,EAAkBR,EACrCU,EAAgB7f,KAAKrG,OAAS2J,EAAIqc,GAAmBR,EAC3D,IAAIW,EAASxc,EACTsc,EAAe,EACjBE,EAASjX,KAAK6Q,MAAMpW,EAAIsc,GACfC,EAAgB,IACzBC,EAASjX,KAAK6Q,MAAMpW,EAAIuc,IA1xBPnnB,KAAA,IAAC,EACxB4K,EAAC,UACDic,EAAS,oBACTF,GAKD3mB,EAAA,OACC2mB,EAAoBU,MAAKC,IAAkB,IAAjB,KAAEtY,EAAI,GAAEE,GAAIoY,EACpC,MAAMpX,EAAOtF,EAAIic,EAAY,EACvBzW,EAAOxF,EAAIic,EAAY,EAC7B,OAAQ7X,EAAOoB,GAAQA,EAAOlB,GAAQF,EAAOkB,GAAQA,EAAOhB,CAAG,GAC/D,EA+wBMqY,CAAiB,CAAE3c,EAAGwc,EAAQP,YAAWF,0BAG7CA,EAAoBzZ,KAAK,CACvB8B,KAAMoY,EAASH,EAAkBpJ,EAAAA,GAAO2J,EACxCtY,GAAIkY,EAASH,EAAkBpJ,EAAAA,GAAO2J,IAExClC,EAAa/c,IAAI,CAAE7G,OAAMkJ,EAAGwc,IAC5B9B,EAAala,OAAO9D,KAAKgE,SAAQ,GAErC,CAEAya,mBAAAA,CAAoBT,GAClB,MAAMzrB,EAAW4tB,EAAAA,GAA0BngB,KAAKjE,KAAKuL,WAC/C8Y,KAAqBpgB,KAAKjE,KAAKskB,mBAAqB,IAC1D,IAAIC,EAAgB,GAAKzX,KAAK0X,KAAKvgB,KAAKjE,KAAKykB,yBAA2B,IACxE,MAAMtB,EAAS,IACXhJ,EAAAA,EAAAA,IAAqBlW,KAAK2T,8BAC5B2M,EAAgB,IAGlB,MAAMG,EAAQzgB,KAAK0gB,WACbC,GAAWC,EAAAA,EAAAA,IAAsB,CACrCC,WAAY7gB,KAAKD,MAAM8gB,WACvBC,YAAa9gB,KAAKD,MAAMqF,iBAGpB2b,EAAc/gB,KAAKjE,KAAKilB,iBACxBrJ,GAAoBzB,EAAAA,EAAAA,IAAqBlW,KAAK2T,4BAC9CwL,EAAkBxH,EAlxBW,GAkxB0C,EAC7E,IAAK,MAAMnG,KAAOuP,EAAa,CAC7B,MAAME,EAAWF,EAAYvP,GACvBN,GAAOgQ,EAAAA,EAAAA,IAAmB1P,GAEhC,IAAK,IAAIgL,EAAI4D,EAAiB5D,GAAK8D,EAAe9D,IAAK,CACrD,IAAIlZ,GACI,GAAJkZ,EAASxc,KAAKjE,KAAKskB,oBAAsB9tB,EAAYouB,EACvDM,GAAYjhB,KAAKjE,KAAKolB,kBAAoB5uB,GAAYouB,EACtD3gB,KAAKuJ,WACP,IAAKvJ,KAAK8e,gBAAgBxb,EAAG6b,GAC3B,SAEF,IAAIiC,EAAWvY,KAAK6Q,MAAMpW,GAE1B,GAAIkZ,IAAM4D,EAAiB,CACzB,GAAIzI,EAAmB,CACrByJ,EAAWvY,KAAK6Q,MAAMpW,EAAI,EAAK,GAAK/Q,EAAYouB,GAEhDF,EACGxf,IAAI,CACHgJ,GAAImX,EACJjX,GAAIiX,IAELtd,OAAO9D,KAAKgE,SACf,QACF,CACyC,IAArChE,KAAKjE,KAAKslB,yBAEZ/d,GAAM,GAAK/Q,EAAYouB,GAEzBS,EAAWvY,KAAK6Q,MAAMpW,GACtBmd,EAAMxf,IAAI,CAAEgJ,GAAImX,EAAUjX,GAAIiX,IAAYtd,OAAO9D,KAAKgE,SACtDkb,EAAOtZ,KAAK,CACV6Z,aAAa,EACbrlB,KAAMoY,EAAAA,GAAOtB,EAAKG,YAAc,IAAMH,EAAKlhB,UAAU6W,WAAWyL,QAAQ,MACxEhP,EAAG8d,GAEP,MACEX,EAAMxf,IAAI,CAAEgJ,GAAImX,EAAUjX,GAAIiX,IAAYtd,OAAO9D,KAAKgE,SACtDkb,EAAOtZ,KAAK,CACVxL,MAAQoiB,EAAI,IAAM,GAAM,GAAKA,EAAI,GAAK,KAAO,MAC7ClZ,EAAG8d,GAGT,CACF,CACAphB,KAAKgf,kBAAkB,CAAEE,SAAQlB,eAAcmB,mBACjD,CAEAT,0BAAAA,CAA0B4C,GAAkE,IAAjE,aAAEtD,EAAY,cAAEC,EAAa,YAAEE,GAAgCmD,EACpFC,EAAU,GACVC,EAAYC,IAEhB,MAAMvC,EAAS,GACTuB,EAAQzgB,KAAK0gB,WACnB,IAAK,IAAIlE,EAAIyB,EAAezB,GAAK2B,EAAa3B,IAAK,CACjD,MAAMtL,EAAOkD,EAAAA,GAAAA,sBAA4BpU,KAAKjE,KAAKmV,KAAKsL,IAClDhL,EAAMN,EAAKlhB,UAAY,IAAMkhB,EAAKG,WAClCqQ,EAAQxQ,EAAKmB,WACb/O,EAAIuF,KAAK6Q,MAAM1Z,KAAKqD,GAAGmZ,GAAKxc,KAAKuJ,YAEvC,GAAIiI,IAAQ+P,EAAS,CAGnB,GAFAA,EAAU/P,EACVgQ,EAAYE,GACP1hB,KAAK8e,gBAAgBxb,GACxB,SAEFmd,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SACxCkb,EAAOtZ,KAAK,CACVtC,IACAlJ,KAAMoY,EAAAA,GAAOtB,EAAKG,YAAc,IAAMH,EAAKlhB,UAAU6W,WAAWyL,QAAQ,OAE5E,MAAO,GAAIoP,EAAQ,GAAM,GAAKA,IAAUF,EAAW,CAEjD,GADAA,EAAYE,GACP1hB,KAAK8e,gBAAgBxb,GACxB,SAEFmd,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SACxCkb,EAAOtZ,KAAK,CAAEtC,IAAGlJ,MAAQsnB,EAAQ,IAAM,GAAM,GAAKA,EAAQ,GAAK,KAAO,OACxE,CACF,CACA1hB,KAAKgf,kBAAkB,CAAEE,SAAQlB,gBACnC,CAEAQ,gBAAAA,CAAgBmD,GAAkE,IAAjE,aAAE3D,EAAY,cAAEC,EAAa,YAAEE,GAAgCwD,EAC1EJ,EAAU,GACVje,EAAI,EAER,MAAM4b,EAAS,GACTuB,EAAQzgB,KAAK0gB,WACnB,IAAK,IAAIlE,EAAIyB,EAAezB,GAAK2B,EAAa3B,IAAK,CACjD,MAAMtL,EAAOkD,EAAAA,GAAAA,sBAA4BpU,KAAKjE,KAAKmV,KAAKsL,IAClDhL,EAAMN,EAAKlhB,UAAY,IAAMkhB,EAAKG,WACxC,GAAIG,IAAQ+P,EAAS,CAEnB,GADAA,EAAU/P,EACNxR,KAAKjE,KAAK7C,aAAeC,EAAAA,GAAWC,MAAO,CAC7C,MACMwoB,GADc1Q,EAAKqB,aAAiC,GAAlBrB,EAAKmB,WACVrS,KAAKjE,KAAKskB,oBAAsBrgB,KAAKjE,KAAKxJ,SAC7E+Q,EAAIuF,KAAK6Q,MAAM1Z,KAAKkC,UAAUqB,MAAMD,EAAEtD,KAAKjE,KAAK8lB,SAASrF,GAAKoF,GAAe5hB,KAAKuJ,WACpF,MACEjG,EAAIuF,KAAK6Q,MAAM1Z,KAAKqD,GAAGmZ,GAAKxc,KAAKuJ,YAEnC,IAAKvJ,KAAK8e,gBAAgBxb,GACxB,SAEFmd,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SACxCkb,EAAOtZ,KAAK,CACVxL,KAAMoY,EAAAA,GAAOtB,EAAKG,YAAc,IAAMH,EAAKlhB,UAAU6W,WAAWyL,QAAQ,MACxEhP,KAEJ,CACF,CAGA,GAAItD,KAAK2T,6BAA+BsD,EAAAA,GAA2BC,UAAW,CAC5E,MAAMO,EAAY,GAAEjF,EAAAA,MAAWxS,KAAKjE,KAAK0b,SAAW,KAAO,IAAO,OAAOzX,KAAKjE,KAAK0b,SAAW,KAC3F5Q,WACAyL,QAAQ,QAEX,GAAI4M,EAAOtvB,OAAS,GAAKsvB,EAAOA,EAAOtvB,OAAS,GAAGwK,OAASqd,EAAU,CAOpEnU,GANkBtD,KAAKjE,KAAK+lB,gBACXlB,EAAAA,EAAAA,IAAsB,CACrCC,WAAY7gB,KAAKD,MAAM8gB,WACvBC,YAAa9gB,KAAKD,MAAMqF,iBAI1B8Z,EAAOtZ,KAAK,CACVxL,KAAMqd,EACNnU,MAEFmd,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,QAC1C,CACF,CAEAhE,KAAKgf,kBAAkB,CAAEE,SAAQlB,gBACnC,CAEAW,gBAAAA,CAAgBoD,GAAkE,IAAjE,aAAE/D,EAAY,cAAEC,EAAa,YAAEE,GAAgC4D,EAC1EC,EAAY,GAEhB,MAAM9C,EAAS,GACTuB,EAAQzgB,KAAK0gB,WACnB,IAAK,IAAIlE,EAAIyB,EAAezB,GAAK2B,EAAa3B,IAAK,CACjD,MAAMtL,EAAOkD,EAAAA,GAAAA,sBAA4BpU,KAAKjE,KAAKmV,KAAKsL,IAClDpL,EAAQF,EAAKG,WAAa,IAAMH,EAAKK,cAC3C,GAAIH,IAAU4Q,EAAW,CACvBA,EAAY5Q,EACZ,MAAM9N,EAAIuF,KAAK6Q,MAAM1Z,KAAKqD,GAAGmZ,GAAKxc,KAAKuJ,YACvC,IAAKvJ,KAAK8e,gBAAgBxb,GACxB,SAEFmd,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SACxCkb,EAAOtZ,KAAK,CACV6Z,YAAiC,IAApBvO,EAAKG,WAClBjX,KAA0B,IAApB8W,EAAKG,WAAmBH,EAAKK,cAAc1K,WAAa2L,EAAAA,GAAOtB,EAAKG,YAC1E/N,KAEJ,CACF,CACAtD,KAAKgf,kBAAkB,CAAEE,SAAQlB,gBACnC,CAEAY,iBAAAA,CAAiBqD,GAAkE,IAAjE,aAAEjE,EAAY,cAAEC,EAAa,YAAEE,GAAgC8D,EAC3ED,EAAY,GAEhB,MAAM9C,EAAS,GACTuB,EAAQzgB,KAAK0gB,YACb,OAAElW,GAAWxK,KAAKiH,yBAAyB0H,cAAcwH,QAC/D,IAAK,IAAIqG,EAAIyB,EAAezB,GAAK2B,EAAa3B,IAAK,CACjD,MAAMtL,EAAOkD,EAAAA,GAAAA,sBAA4BpU,KAAKjE,KAAKmV,KAAKsL,IAClDpL,EAAQF,EAAKG,WAAa,IAAMH,EAAKK,cAC3C,GAAIH,IAAU4Q,EAAW,CACvBA,EAAY5Q,EACZ,MAAM9N,EAAIuF,KAAK6Q,MAAM1Z,KAAKqD,GAAGmZ,GAAKxc,KAAKuJ,YACvC,IAAKvJ,KAAK8e,gBAAgBxb,GACxB,SAEE4N,EAAKG,WAAa,GAAM,EAC1BoP,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SAExC,IAAI6F,EAAAA,EACF,CACEI,GAAI3G,EACJ6G,GAAI7G,EACJ4G,GAAI,EACJE,GAAIpK,KAAK4J,OACTU,YAAaE,EAAO0X,cACpBnX,WAAY,GAEd/K,KAAKkC,WACL4B,OAAO9D,KAAKgE,SAEhB,MAAMme,EAAkC,IAApBjR,EAAKG,WACzB6N,EAAOtZ,KAAK,CACVxL,KAAM+nB,EAAcjR,EAAKK,cAAc1K,WAAWlM,UAAU,GAAK6X,EAAAA,GAAOtB,EAAKG,YAAY,GACzFoO,YAAa0C,EACb7e,KAEJ,CACF,CACAtD,KAAKgf,kBAAkB,CAAEE,SAAQlB,gBACnC,CAEAa,kBAAAA,CAAkBuD,GAAkE,IAAjE,aAAEpE,EAAY,cAAEC,EAAa,YAAEE,GAAgCiE,EAC5EC,EAAW,KAEf,MAAMnD,EAAS,GACTuB,EAAQzgB,KAAK0gB,WACnB,IAAK,IAAIlE,EAAIyB,EAAezB,GAAK2B,EAAa3B,IAAK,CACjD,MAAMtL,EAAOkD,EAAAA,GAAAA,sBAA4BpU,KAAKjE,KAAKmV,KAAKsL,IAClDlL,EAAOJ,EAAKK,cACZ+Q,EAAgC,IAApBpR,EAAKG,WACvB,GAAIC,IAAS+Q,IAA+B,IAAlBnD,EAAOtvB,QAAgB0yB,GAAY,CAC3DD,EAAW/Q,EACX,MAAMhO,EAAIuF,KAAK6Q,MAAM1Z,KAAKqD,GAAGmZ,GAAKxc,KAAKuJ,YACvC,IAAKvJ,KAAK8e,gBAAgBxb,GACxB,SAEFmd,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SACxCkb,EAAOtZ,KAAK,CACVxL,KAAM8W,EAAKK,cAAc1K,WACzBvD,KAEJ,CACF,CACAtD,KAAKgf,kBAAkB,CAAEE,SAAQlB,gBACnC,CAEAlJ,sBAAAA,GACE9U,KAAKmV,2BACLnV,KAAK0U,aACL1U,KAAK0B,QAAQ,SACf,CAEAyT,wBAAAA,GACEnV,KAAKgU,oBAAsBhU,KAAKD,MAAMqF,eAAemd,sBAAsBC,EAAAA,GAAcC,IAC3F,CAEAC,cAAAA,CAAe7V,EAAe8V,EAAmBC,GAG3C/V,EAFa,IAGfA,EAHe,GAKjB,MAAMsO,EAAQnb,KAAK0W,SAASyE,MAAMtO,GAAOxb,QAAQ+pB,GAAkB,IAATA,IAC1D,OAAIvO,GALa,EAMR,CAACsO,EAAMA,EAAMvrB,OAAS,IAK3BurB,EAAMvrB,OAASgzB,EAAkC,GAApBzH,EAAMvrB,OAAS,GAAS+yB,EAChD3iB,KAAK0iB,eAAe7V,EAAQ,EAAG8V,EAAWC,GAE5CzH,CACT,CAEA0H,gBAAAA,CAAiB7e,GACf,MAAM,cAAE2K,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QACjC,IAAID,EAAAA,EAAAA,IAAqBlW,KAAK2T,4BAA6B,CACzD3P,EAAQqJ,OACR,MAAMyV,EAAiBja,KAAKlB,IAAI,EAAGkB,KAAKpB,IAAI,EAAGzH,KAAKjE,KAAK+mB,iBAEnDxf,EAAI,GACJE,EAAMC,GAAckL,EAAcxC,IAAIvC,OAAS5J,KAAK4J,OAAS5J,KAAK4J,QAAU,GAAMnG,GAClFmG,EAAS5J,KAAK4J,QAAU,GAAMkZ,GAE9Bz0B,EAAQ,IAAIie,EAAAA,EAChB,CACEhJ,EAAG,GACHkI,KAAM,CAAE3R,KAAM,GACdsT,UAAW3C,EAAOpQ,KAClB2R,aAAcC,EAAAA,GAAaoQ,OAC3BxQ,UAAWC,EAAAA,GAAUO,OAEvBpM,KAAKkC,WAEP,IAAK,IAAIsa,EAAI,GAAKA,GAAK,EAAGA,GAAK,GAAK,CAClC,MAAM/Y,EAAIoF,KAAK6Q,MAAMlW,EAAGgZ,IACxBnuB,EACG4S,IAAI,CACH7G,KAAMoiB,EAAEuG,QAAQ,GAChBtf,EAAGA,IAEJK,OAAOE,GAEVA,EAAQ/C,IAAI,cAAe,sBAC3B+C,EAAQ8G,YACR9G,EAAQgH,YAAY,CAAC,EAAG,IACxBhH,EAAQ6G,UAAU,EAAG,IACrB7G,EAAQO,OAAOjB,EAAGG,GAClBO,EAAQiH,OAAO3H,EAAI,EAAGG,GACtBO,EAAQ6G,UAAU,GAAI,IACtB7G,EAAQkH,QACV,CA0BA,OAxBAlH,EAAQ/C,IAAI,YAAa,2BACzB+C,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ/C,IAAI,cAAeuJ,EAAOwY,MAClChf,EAAQgH,YAAY,IAEpBhH,EAAQif,SAAS3f,EAAGuF,KAAK6Q,MAAM/K,EAAcxC,IAAIvC,OAAS5J,KAAK4J,OAASA,GAAS,EAAGf,KAAK6Q,MAAM9P,IAC/F5F,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQkf,WAAW5f,EAAGqL,EAAcxC,IAAIvC,OAAQ,EAAG5J,KAAK4J,QACxD5F,EAAQ6G,WAAW,IAAM,IAEzB,IAAIyB,EAAAA,EACF,CACElS,KAAM,mBACNkJ,EAAG,GACHG,EAAGkL,EAAcxC,IAAIvC,OAAS5J,KAAK4J,OAAS,EAC5C4B,KAAM,CAAE3R,KAAMwc,EAAAA,GAAUC,KACxB3K,WAAY2R,EAAAA,GAAYnG,GACxBhK,UAAW3C,EAAOpQ,KAClB2R,aAAcC,EAAAA,GAAaG,IAC3BP,UAAWC,EAAAA,GAAUO,OAEvBpM,KAAKkC,WACL4B,OAAOE,QACTA,EAAQyJ,SAEV,CACA,MAAM0V,EAAWnjB,KAAK0W,SAASC,QAAQ,GACjCyM,EAAqBzU,EAAc7C,KAAKuX,WAAW7X,KAAK3R,KACxDygB,EAAYzR,KAAK0R,MAAM4I,EAAWC,GAClCjI,EAAQnb,KAAK0iB,eAAepI,EAAW6I,EAAUC,GACjDE,EAAStjB,KAAK0W,SAAS6M,WAAW,EAAG,KACrCnpB,EAAO,IAAIkS,EAAAA,EACf,CACEhJ,EAAGqL,EAAc7C,KAAKuX,WAAWjN,OAAOtK,KACxCN,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQ,CAAE1S,KAAM8U,EAAc7C,KAAKuX,WAAW7X,KAAK3R,OACzFsT,UAAW3C,EAAOpQ,KAClB2R,aAAcC,EAAAA,GAAaoQ,OAC3BxQ,UAAWC,EAAAA,GAAUO,OAEvBpM,KAAKkC,WAEPiZ,EAAMxX,SAASyX,GACbhhB,EACG6G,IAAI,CACH7G,KAAMkpB,EAAOlI,GAAM7U,QAAQ,IAAK,KAChC9C,EAAGkL,EAAcxC,IAAIvC,OAAS5J,KAAK4J,OAAS5J,KAAK0W,SAAS0E,KAE3DtX,OAAOE,IAEd,CAEA2R,YAAAA,GACE,IAAK3V,KAAKgU,mBAAoB,OAE9B,MAAM,cAAErF,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,SAE1BqN,EAAYC,GAAYzjB,KAAK0W,SAASuE,SAC7C,GAAIjb,KAAK0jB,qBAAuB1jB,KAAKjE,KAAKuL,WAAakc,IAAeC,EACpE,OAEF,MAAM5Y,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAaoF,EAAc7C,KAAKnS,MAC9CygB,QAASzL,EAAcxC,IAAIvC,OAAS5J,KAAK4J,OAAS,KAEpDiB,EAAUwP,KACV,MAAMsJ,EAAe3jB,KAAK4jB,kBACpBC,EAAwB7jB,KAAK8jB,4BACnCC,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKkC,UAAUqB,MACtBgG,WAAYvJ,KAAKuJ,WACjB5P,MAAOqG,KAAKrG,MACZqqB,gBAAiBA,CAACxH,EAAGlZ,KAEnB,GAAItD,KAAKjE,KAAK+b,OAAO0E,IAAM,EACzB,OAGFxc,KAAKgE,QAAQmJ,UAAYnN,KAAKjE,KAAKuZ,MAAMkH,GAAKxc,KAAKjE,KAAK8b,KAAK2E,GAAKhS,EAAOyZ,gBAAkBzZ,EAAO0Z,cAClG,MAAMzgB,EAAIoF,KAAK6Q,MAAM1Z,KAAK0W,SAAS1W,KAAKjE,KAAK+b,OAAO0E,KACpDxc,KAAKgE,QAAQif,SAAS3f,EAAIqgB,EAAc,GAAIE,GAAwBpgB,EAAE,IAG1EoH,EAAU6R,MACZ,CAEA9G,cAAAA,GACE,MAAM,cAAEjH,GAAkB3O,KAAKiH,yBACzB4D,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAaoF,EAAc7C,KAAKnS,MAC9CygB,QAASzL,EAAcxC,IAAIvC,SAE7BiB,EAAUwP,KACV,IAAK,MAAM5G,KAAWzT,KAAKwT,SACzBC,EAAQ0Q,cAAcnkB,KAAKgE,SAE7B6G,EAAU6R,MACZ,CAEA0H,WAAAA,CAAYpgB,GACV,MAAMqgB,GAAaD,EAAAA,EAAAA,IAAY,CAC7BpgB,UACAgR,WAAU,IACV9S,UAAWlC,KAAKkC,UAChBoiB,aAActkB,KAAKrG,MACnB4qB,cAAevkB,KAAK4J,OACpBpF,MAAOxE,KAAKjE,KACZyoB,sBAAwBC,GAAUzkB,KAAK0kB,mBAAmBD,GAC1DE,kBAAoB3kB,KAAKwV,4BAAgD3lB,EAAvBmQ,KAAKyU,kBAErDzU,KAAKwV,wBACPxV,KAAKyU,gBAAgBzQ,EAASgR,EAAAA,EAAW4P,qBAAqB5kB,KAAKkC,iBAGlDrS,IAAfw0B,IACFQ,EAAAA,EAAAA,GAAiB,CACfC,UAAW9kB,KAAKD,MAAMqF,eAAe2f,mBACrCC,OAAQX,EAAa,YAAc,UACnCY,kBAAmB,YAGzB,CAEAC,mBAAAA,CAAoBC,EAAoB5sB,GAAoD,IAAlC6sB,IAAyBz1B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GACjF,MAAM01B,EAAIrlB,KAAKjE,KAAKupB,kBAAkB/sB,EAAK4sB,GAC3C,GAAU,OAANE,EACF,OAAOD,EAA4BplB,KAAKoY,UAAUiN,GAAM,GAAEA,GAE9D,CAEAE,mBAAAA,CAAoBJ,GAClB,MAAMK,EAAiBxlB,KAAKjE,KAAK0pB,uBAAuBN,GAClDO,EAAa1lB,KAAKjE,KAAKuZ,MAAMkQ,IAAmB,KAChDG,EAAgB3lB,KAAKjE,KAAKuZ,MAAMkQ,EAAiB,IAAM,KAC7D,OAAmB,OAAfE,GAAyC,OAAlBC,GAClBC,EAAAA,EAAAA,IAA+B,CAAE7pB,KAAMiE,KAAKjE,KAAM8pB,YAAaH,EAAYI,UAAWH,IAGxF,IACT,CAEAlR,eAAAA,CAAgBzQ,EAAmCmhB,GACjD,MAAM,cAAExW,GAAkB3O,KAAKiH,yBAI/B,GAHAjD,EAAQqJ,OACRrJ,EAAQ6G,UAAU8D,EAAc7C,KAAKnS,MAAO,GAExCqG,KAAKwV,yBACPxV,KAAK2U,qBAAqB3Q,GACtB8J,OAAOzE,MAAM8b,IAGf,OAFAnlB,KAAKqX,QAAQ,CAAErT,iBACfA,EAAQyJ,UAKZ,MAAMsY,EAAiB/lB,KAAKjE,KAAKupB,kBAAkB,OAAQH,GACrDjU,EAAO6U,EAAiB3R,EAAAA,GAAAA,sBAA4B2R,GAAkB,KAE5E,GAAa,OAAT7U,EAAe,CACjB,MAAM8U,EACJhmB,KAAKjE,KAAKmV,KAAKthB,OAAS,GACpBq2B,EAAAA,EAAAA,IAA+B,CAC7BC,UAAWlmB,KAAKjE,KAAKmV,KAAK,GAC1BiV,QAASnmB,KAAKjE,KAAKmV,KAAKlR,KAAKjE,KAAKmV,KAAKthB,OAAS,GAChD4U,MAAOxE,KAAKjE,OAEd,GAWN,OAVAiE,KAAKqX,QAAQ,CACXrT,UACAmN,WAAY6U,EAAmBb,GAC3BlU,EAAc,CACZC,KAAMkD,EAAAA,GAAAA,sBAA4B4R,EAAmBb,IACrD7d,UAAWtH,KAAKjE,KAAKuL,YAEvB,YAENtD,EAAQyJ,SAEV,CAEAzN,KAAKqX,QAAQ,CACXrT,UACAkN,OACAnV,KAAM,CACJ8b,KAAM7X,KAAKklB,oBAAoBC,EAAY,QAC3CrS,KAAM9S,KAAKklB,oBAAoBC,EAAY,QAC3CpS,IAAK/S,KAAKklB,oBAAoBC,EAAY,OAC1C7P,MAAOtV,KAAKklB,oBAAoBC,EAAY,SAC5CrN,OAAQ9X,KAAKklB,oBAAoBC,EAAY,UAAU,IAEzD3N,iBAAkBxX,KAAKulB,oBAAoBJ,KAG7CnhB,EAAQyJ,SACV,CAEA2J,YAAAA,CAAYgP,GAAqD,IAApD,QAAEpiB,GAAgDoiB,EAC7D,MACM,cAAEzX,GAAkB3O,KAAKiH,0BACzB,OAAEnM,EAAM,OAAEurB,EAAM,KAAEC,GAAS3X,EAAcxC,KACzC,aAAEoa,EAAY,kBAAEC,IAAsBC,EAAAA,EAAAA,IAAgB,CAAE1qB,KAAMiE,KAAKjE,OAEzE,IAAKwqB,EACH,OAGF,MAAMG,EAAc1mB,KAAK2T,6BAA+BsD,EAAAA,GAA2BC,UAC7EyP,EAAoB3mB,KAAKjE,KAAK7C,aAAeC,EAAAA,GAAWyd,MACxDgQ,EAAa,IAAIta,EAAAA,EACrB,CACElS,KAAMssB,GAAeC,EAAoBJ,EAAaM,cAAgBN,EAAaO,OACnFxjB,GAAI4S,EAAAA,EAAAA,IAAqBlW,KAAK2T,4BAE1B3T,KAAKrG,MADLqG,KAAKrG,MAAQgV,EAAcxC,IAAIka,OAAOjQ,OAAOhK,MAEjD3I,EAAGkL,EAAcxC,IAAIka,OAAOjQ,OAAOjK,IACnCX,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQoC,EAAcxC,IAAIka,OAAO7a,MACvEI,UAAWC,EAAAA,GAAUO,MACrBL,aAAc4C,EAAcxC,IAAIqK,SAChCrJ,WAAW4Z,EAAAA,EAAAA,IAAe,CAAEV,OAAQE,EAAaS,OAAQrY,mBAE3D3O,KAAKkC,WAKP,GAHAlC,KAAK6T,YAAc+S,EAAWha,QAAQ5I,GACtC4iB,EAAW9iB,OAAOE,KAEd0iB,GAAiB1mB,KAAK+T,eAAgB4S,IAGtCH,EAAmB,CACrB,MAAMS,EAAkB,IAAI3a,EAAAA,EAC1B,CACElS,KAAMosB,GAAmBM,OACzBtb,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQoC,EAAcxC,IAAIka,OAAO7a,MACvEI,UAAWC,EAAAA,GAAUO,MACrBL,aAAc4C,EAAcxC,IAAIqK,SAChCrJ,WAAW4Z,EAAAA,EAAAA,IAAe,CAAEV,OAAQG,EAAkBQ,OAAQrY,mBAEhE3O,KAAKkC,WAEDglB,EAAuBD,EAAgBra,QAAQ5I,GAC/CmjB,EAAuBnnB,KAAK6T,YA3Cd,GA2C4CqT,EAG9DvY,EAAc7C,KAAKnS,MAAQqG,KAAK4T,YAAc9Y,EAAOsb,OAAOtK,KAAQyK,EAAAA,GAAOgH,EAC3E5O,EAAc7C,KAAKnS,MAAQqG,KAAKrG,MAAQwtB,EAAuBd,EAAOjQ,OAAOhK,OAE7E6a,EACGhmB,IAAI,CACHqC,EAAGtD,KAAKrG,MAAQgV,EAAcxC,IAAIka,OAAOjQ,OAAOhK,MAASpM,KAAK6T,YAnDhD,GAoDdpQ,EAAGkL,EAAcxC,IAAIka,OAAOjQ,OAAOjK,MAEpCrI,OAAOE,GACVhE,KAAKiU,YAAc,KACnBjU,KAAK6T,YAAcsT,GAEnBnnB,KAAK8T,SAAS,IACdnF,EAAc7C,KAAKnS,MACjBqG,KAAK4T,YACL9Y,EAAOsb,OAAOtK,KACd9L,KAAK8T,SAAS,GAAGna,MACjB2sB,EAAKlQ,OAAOtK,KACZwa,EAAKlQ,OAAOhK,MACZuC,EAAc7C,KAAKnS,MAAQqG,KAAKrG,MAAQutB,EAAuBb,EAAOjQ,OAAOhK,QAE/E6a,EACGhmB,IAAI,CACHqC,EAAGtD,KAAKrG,MAAQgV,EAAcxC,IAAIka,OAAOjQ,OAAOhK,MAChD3I,EAAGkL,EAAcxC,IAAIka,OAAOjQ,OAAOjK,IAAOwC,EAAcxC,IAAIka,OAAO7a,KAAK3R,KAAQ0c,EAAAA,GAAOgH,IAExFzZ,OAAOE,GACVhE,KAAK6T,YAAchL,KAAKlB,IAAI3H,KAAK6T,YAAaqT,GAC9ClnB,KAAKiU,YAAc,CACjB3Q,EAAGtD,KAAKrG,MAAQgV,EAAcxC,IAAIka,OAAOjQ,OAAOhK,MAChD3I,EAAGkL,EAAcxC,IAAIka,OAAOjQ,OAAOjK,IAAOwC,EAAcxC,IAAIka,OAAO7a,KAAK3R,KAAQ0c,EAAAA,GAAOgH,EACvF5jB,MAAOutB,GAGb,CACF,CAEAxP,UAAAA,CAAW0P,GACJpnB,KAAKwV,uBAGRxV,KAAKqnB,qBAAqBD,GAF1BpnB,KAAKsnB,oBAAoBF,EAI7B,CAEAC,oBAAAA,CAAoBE,GAA6F,IAA5F,QAAEvjB,EAAO,KAAEkN,EAAI,KAAE2G,EAAI,KAAE/E,EAAI,IAAEC,EAAG,MAAEuC,EAAK,OAAEwC,EAAM,iBAAEN,GAAyC+P,EAC7G,MAAMC,EAAmBjX,EAAoBvQ,KAAKrG,QAC5C,cAAEgV,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAE3BsR,EAAW,IAAInb,EAAAA,EACnB,CACEd,KAAM,CAAE3R,KAAMwc,EAAAA,GAAUkH,GACxB5R,WAAY,GACZwB,UAAW3C,EAAOpQ,KAClBwR,UAAWC,EAAAA,GAAUC,KACrBC,aAAcC,EAAAA,GAAaoQ,OAC3BjO,YAAYuZ,EAAAA,EAAAA,IAAwBld,EAAOmd,WAAY,KAEzD3nB,KAAKkC,WAGD0lB,EAAe1W,EAAO,CAAC,CAAE9W,KAAM8W,EAAMhE,MAAOkG,IAAa,GACzDyU,GAAchQ,GAAQ,IAAMvC,GAAS,GAAKjC,IAAAA,IAAmB,KAAOA,IAAAA,MAAqB,KACzFyU,EAAYjQ,EACd,CACE,CAAEzd,KAAM,IAAK8S,MAAOkG,GACpB,CAAEhZ,KAAMyd,EAAM3K,MAAO2a,IAEvB,GACEE,EAAYjV,EACd,CACE,CAAE1Y,KAAM,IAAK8S,MAAOkG,GACpB,CAAEhZ,KAAM0Y,EAAM5F,MAAO2a,IAEvB,GACEG,EAAYjV,EACd,CACE,CAAE3Y,KAAM,IAAK8S,MAAOkG,GACpB,CAAEhZ,KAAM2Y,EAAK7F,MAAO2a,IAEtB,GACEI,EAAY3S,EACd,CACE,CAAElb,KAAM,IAAK8S,MAAOkG,GACpB,CAAEhZ,KAAMkb,EAAOpI,MAAO2a,IAExB,GACEK,EAAcpQ,EAChB,CACE,CAAE1d,KAAM,MAAO8S,MAAOkG,GACtB,CAAEhZ,KAAM0d,EAAQ5K,MAAO2a,IAEzB,GACEM,EAAqC,MAApB3Q,EAA2B,CAAC,CAAEpd,KAAMod,EAAiBsP,OAAQ5Z,MAAO2a,IAAgB,GAErGja,EAA4B,GAE5Bwa,EAA8BC,GAClCA,EAAaC,SAAQ,CAAC7mB,EAAUpH,IAC9BA,EAAQ,EAAK,IAAKoH,EAAS7R,OAAS,EAAI,CAAC,SAAW,MAAQ6R,GAAiCA,IAE7F+lB,EAAiB3W,IACnBjD,EAAMhI,KACJwiB,EAA2B,CACzBR,EACAE,EACAC,EACAC,EACAC,EACAC,EACAC,KAGKX,EAAiB7W,KAC1B/C,EAAMhI,KAAKwiB,EAA2B,CAACR,EAAcO,KACrDva,EAAMhI,KAAKwiB,EAA2B,CAACN,EAAWC,EAAWC,EAAWC,EAAWC,OAEnFta,EAAMhI,KAAKwiB,EAA2B,CAACR,EAAcM,EAAaC,KAClEva,EAAMhI,KAAKwiB,EAA2B,CAACN,EAAWC,EAAWC,EAAWC,MAG1E,MAAMM,EAAShS,EAAAA,GAAO2J,EAAIvR,EAAc7C,KAAKnS,MAC7C,IAAI2J,EAAIilB,EACJ9kB,EAAI8S,EAAAA,GAAO2J,EAAIuH,EAASpnB,MAAMsL,WAAa,EAE/CiC,EAAMjK,SAASmG,IACbxG,EAAIilB,EACJze,EAAKnG,SAAQ,CAAC6kB,EAAanuB,EAAOguB,KAChC,MAAMnc,EAAU,CAAEJ,KAAM,EAAGM,MAAO,EAAGD,IAAK,EAAGE,OAAQ,IAC/C,KAAEjS,EAAO,GAAE,MAAE8S,GAAsC,UAAhBsb,EAA0B,CAAC,EAAIA,EAC1D,IAAVnuB,EACF6R,EAAQJ,KAAO,EACNzR,IAAUguB,EAAaz4B,OAAS,EACzCsc,EAAQE,MAAQ,EACS,UAAhBoc,IACTtc,EAAQJ,KAAO,EACfI,EAAQE,MAAQ,EACXob,EAAiB7W,MACpBzE,EAAQJ,KAAO,EACfI,EAAQE,MAAQ,IAGpBqb,EAASxmB,IAAI,CAAE7G,OAAM+S,UAAWD,EAAO5J,IAAGG,IAAGyI,YAC7Cub,EAAS3jB,OAAOE,GAChBV,GAAKmkB,EAAS9tB,KAAK,IAErB8J,GAAKgkB,EAASpnB,MAAMsL,UAAU,GAElC,CAEAmN,8BAAAA,CAA+B9U,GAC7B,MAAM,cAAE2K,GAAkB3O,KAAKiH,yBACzBugB,EAAmBjX,EAAoBvQ,KAAKrG,OAC5C8uB,EAAa,IAAInc,EAAAA,EACrB,CACEd,KAAM,CAAE3R,KAAMwc,EAAAA,GAAUkH,GACxB5R,WAAY,GACZC,UAAWC,EAAAA,GAAUC,KACrBC,aAAcC,EAAAA,GAAaoQ,OAC3BjO,YAAYuZ,EAAAA,EAAAA,IAAwB/Y,EAAcwH,QAAQ3L,OAAOmd,WAAY,IAE7ErkB,EAAGiT,EAAAA,GAAO2J,EAAIvR,EAAc7C,KAAKnS,MACjCuS,QAAS,CAAEJ,KAAM0R,EAAAA,GAAQD,EAAGnR,MAAOoR,EAAAA,GAAQD,EAAGpR,IAAK,EAAGE,OAAQ,IAEhErM,KAAKkC,WAGP,IAAIwmB,EAAuB,EACvBlB,EAAiB3W,IACnB6X,EAAuB,EACdlB,EAAiB7W,MAC1B+X,EAAuB,GAIzB,MAAM,WAAE/c,GAAe8c,EAAWpoB,MAClC,IAAIoD,EAAIkI,EAAa+c,EAAuB/c,EAAa,EAAI4K,EAAAA,GAAO2J,EAEpE,IAAK,MAAMzM,KAAWzT,KAAKwT,SACpBC,EAAQwF,4BAGbwP,EAAWxnB,IAAI,CACb7G,KAAMqZ,EAAQ5M,WACdpD,IACA0J,UAAWsG,EAAQ0F,kBAClBrV,OAAOE,GACVP,GAAKkI,EAET,CAEA2b,mBAAAA,CAAmBqB,GAcO,IAdN,QAClB3kB,EAAO,KACPkN,EAAI,KACJ2G,EAAI,KACJ/E,EAAI,IACJC,EAAG,MACHuC,EAAK,OACLwC,EAAM,UACNE,EAAS,kBACTL,GAAoB,EAAK,aACzBC,GAAe,EAAK,KACpB7nB,EAAI,aACJunB,GAAe,EAAK,iBACpBE,GACsBmR,EACtB,MAAM,cAAEha,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,SAC3B,KAAEmQ,GAAS3X,EAAcxC,IACzBua,EAAc1mB,KAAK2T,6BAA+BsD,EAAAA,GAA2BC,UAC7EyP,EAAoB3mB,KAAKjE,KAAK7C,aAAeC,EAAAA,GAAWyd,MAC1D8P,GAAeC,EACjBL,EAAKp4B,KAAOmiB,EAASuY,SACZlC,GAAe1mB,KAAKjE,KAAK7C,aAAeC,EAAAA,GAAWC,OAASrJ,IACrEu2B,EAAKp4B,KAAOmiB,EAASwY,UAGvB,MAAMC,EAAWxC,EAAKp4B,KAAOo4B,EAAKlQ,OAAOjK,IAAMma,EAAKlQ,OAAOjK,IAAOwC,EAAcxC,IAAIrR,OAAO0Q,KAAK3R,KAC1FkvB,EAAezC,EAAK9a,KAAK3R,KACzBmvB,EACJhpB,KAAK4T,YACLjF,EAAcxC,IAAIrR,OAAOsb,OAAOtK,MAC/B9L,KAAKrG,OACHqG,KAAK4T,YACJjF,EAAcxC,IAAIrR,OAAOsb,OAAOtK,KAChC9L,KAAK6T,aACJ8D,EAAoB,EAAIhJ,EAAcxC,IAAIka,OAAOjQ,OAAOhK,SAC3D,EACE6c,EAAcjpB,KAAK4T,YAAcjF,EAAcxC,IAAIrR,OAAOsb,OAAOtK,KAAQwa,EAAKlQ,OAAOtK,KAErFod,GADW,CAACrR,EAAM/E,EAAMC,EAAKuC,EAAOwC,GAAQiI,MAAMoJ,IAAgBA,IAEpE,CACEjY,KAAM,CAACA,GAAQ,IACfkY,WAAY,CACT,GAAElY,YAAe2G,QAAW/E,QAAWC,QAAUuC,IAChD0C,EAAa,QAAOA,IAAc,eACvBF,UAKbN,EAAmBA,EAAiBsP,YAASj3B,GAC7CwB,QAAQ2F,QAAoBnH,IAAVmH,KAEtB,CACEka,KAAM,CAACA,GAAQ,IACfkY,WAAY,CAAE,GAAElY,GAAQ,OAGxBmY,EAAY,IAAI/c,EAAAA,EACpB,CACEd,KAAM,CAAE3R,KAAMkvB,IAEhB/oB,KAAKkC,WAGDonB,EAAcA,IACb3R,EAGEtH,EAASuY,SAFPvY,EAAS+Y,WAoEfxR,EAsBH5X,KAAK8T,SAAW,IArBhB9P,EAAQmJ,UAAY3C,EAAOmd,WAC3B3nB,KAAK8T,SAASnQ,SAASmG,IACrB,MAAMxG,EAAKwG,EAAK8B,YAAcC,EAAAA,GAAUC,KAAOhC,EAAKxG,EAAIwG,EAAKxG,EAAKwG,EAAKnQ,MAAS,EAC1E8J,EAAKqG,EAAKiC,eAAiBC,EAAAA,GAAaG,IAAMrC,EAAKrG,EAAIqG,EAAKrG,EAAKslB,EACvE/kB,EAAQif,SACN3f,EAAIka,EAAAA,GAAQlH,IACZ7S,EAAI+Z,EAAAA,GAAQlH,IACZkH,EAAAA,GAAQlH,IAAMxM,EAAKnQ,MAAS6jB,EAAAA,GAAQlH,IACpCkH,EAAAA,GAAQlH,IAAMyS,EAAevL,EAAAA,GAAQlH,IACtC,IAGCtW,KAAKiU,aACPjQ,EAAQif,SACNjjB,KAAKiU,YAAY3Q,EAAItD,KAAKiU,YAAYta,MAAQ6jB,EAAAA,GAAQlH,IACtDtW,KAAKiU,YAAYxQ,EAAIkL,EAAcxC,IAAIka,OAAO7a,KAAK3R,KAAQ2jB,EAAAA,GAAQlH,IACnEkH,EAAAA,GAAQlH,IAAMtW,KAAKiU,YAAYta,MAAQ6jB,EAAAA,GAAQlH,IAC/CkH,EAAAA,GAAQlH,IAAM3H,EAAcxC,IAAIka,OAAO7a,KAAK3R,KAAQ2jB,EAAAA,GAAQrG,KAOlE,MAAMoS,EAxFkBC,MACtB,OAAQlD,EAAKp4B,MAAQo7B,KACnB,KAAKjZ,EAAS+Y,WACZ,MAAO,CACLhvB,KAAM8uB,EAAKE,WACX9lB,EAAG,CAAC2lB,EAAaA,GACjBxlB,EAAG,CAAC6iB,EAAKlQ,OAAOjK,KAChBP,UAAWC,EAAAA,GAAUC,KACrBC,aAAc,CAACC,EAAAA,GAAaC,aAEhC,KAAKoE,EAASuY,SACZ,GAAIlC,GAAeC,EAAmB,CACpC,MAAMvsB,EAAQ,GAAE8uB,EAAKhY,kCAAkC4G,IACjDyH,EAAY8J,EAAUpoB,IAAI,CAAE7G,SAAQwS,QAAQ5I,GAClD,MAAO,CACL5J,KAAM,CAACA,GACPkJ,EAAG,CACDtD,KAAKrG,MAAQgV,EAAcxC,IAAIka,OAAOjQ,OAAOhK,MAASpM,KAAK6T,YAAc0L,EAAYkK,EAAAA,GAAaC,KAEpGjmB,EAAG,CAAC6iB,EAAKlQ,OAAOjK,KAChBP,UAAWC,EAAAA,GAAUkL,OACrBhL,aAAc,CAACC,EAAAA,GAAaC,YAEhC,CAAO,GAAI0L,EACT,MAAO,CACLvd,KAAM8uB,EAAKhY,KACX5N,EAAG,CAAC0lB,GACJvlB,EAAG,CAAC6iB,EAAKlQ,OAAOjK,KAChBP,UAAWC,EAAAA,GAAUkL,OACrBhL,aAAc,CAACC,EAAAA,GAAaC,aAEzB,CACL,MASM0d,IARJ3pB,KAAKrG,OACFqG,KAAK4T,YACJjF,EAAcxC,IAAIrR,OAAOsb,OAAOtK,KAChCwa,EAAKlQ,OAAOtK,KACZwa,EAAKlQ,OAAOhK,MACZpM,KAAK6T,YACLlF,EAAcxC,IAAIka,OAAOjQ,OAAOhK,OACpCid,EAAUpoB,IAAI,CAAE7G,KAAM8uB,EAAKhY,KAAK,KAAMtE,QAAQ5I,KACbsiB,EAAK9a,KAAKgL,WAAaxK,EAAAA,GAAaG,IACvE,MAAO,CACL/R,KAAM8uB,EAAKhY,KACX5N,EAAG,CAAC2lB,GACJxlB,EAAGkmB,EAAW,CAACb,GAAY,CAACxC,EAAKlQ,OAAOjK,KACxCP,UAAWC,EAAAA,GAAUC,KACrBC,aAAc4d,EAAW,CAAC3d,EAAAA,GAAaG,KAAO,CAACH,EAAAA,GAAaC,YAEhE,CACF,KAAKoE,EAASwY,SACZ,MAAO,CACLzuB,KAAM,CAACrK,GACPuT,EAAG,CAAC0lB,EAAgBK,EAAUpoB,IAAI,CAAE7G,KAAMrK,IAAQ6c,QAAQ5I,GAAW,GACrEP,EAAG,CAACqlB,GACJld,UAAWC,EAAAA,GAAUkL,OACrBhL,aAAc,CAACua,EAAK9a,KAAKgL,WAE7B,QACE,OACJ,EA4BmBgT,GAEfI,EAAqBC,IAYrB,IAZsB,QAC1BC,EAAO,OACPhmB,GAAS,GAUV+lB,EACC,MAAME,GAA0BzD,EAAKp4B,MAAQo7B,OAAmBjZ,EAAS+Y,YAAc5R,EACvFsS,GAAS1vB,KAAKuJ,SAAQ,CAACmG,EAA0BzP,KAC/C,IAAImiB,EAAIniB,EACJkP,EAAa,EACb4D,EAAY3C,EAAOpQ,KACnBA,EAAO0P,EACPzP,EAAQ,GAAK0vB,IACfvN,GAAK,EACLjT,EAAa8f,EAAUzc,QAAQ5I,GAC/B5J,EAAO0P,EAEPqD,GAAY4Z,EAAAA,EAAAA,IAAe,CAAEV,OAAQ7O,EAAiBwP,OAAQrY,mBAEhE,MAAM9Z,EAAU,CACduF,OACAkJ,EAAGwmB,EAAQxmB,EAAEkZ,GAAKjT,EAClB9F,EAAGqmB,EAAQrmB,EAAE+Y,GACbzQ,aAAcua,EAAK9a,KAAKgL,SAAW8P,EAAK9a,KAAKgL,SAAWsT,EAAQ/d,aAAayQ,GAC7E5Q,UAAW0a,EAAK9a,KAAKI,UAAY0a,EAAK9a,KAAKI,UAAYke,EAAQle,UAC/DuB,aAEFkc,EAAUpoB,IAAIpM,GACV+iB,IACF5X,KAAK8T,SAAS0I,GAAK,CAAE7iB,MAAO0vB,EAAUzc,QAAQ5I,MAAanP,IAEzDiP,GACFulB,EAAUvlB,OAAOE,EACnB,GACA,EAIJ,OAFA4lB,EAAmB,CAAEE,QAASP,EAAczlB,OAAQwT,IAE7C,CACLiS,eACAK,qBAEJ,CAGA9T,uBAAAA,GACE,MAAM,cAAEnH,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAC3B6T,EAAShqB,KAAKD,MAAMyE,QAAQ8C,UAClC,GAAItH,KAAKjE,KAAK7C,aAAeC,EAAAA,GAAWC,MACtC,OAEF,IAAK,CAACqY,EAAAA,GAAUC,GAAID,EAAAA,GAAUE,GAAIF,EAAAA,GAAUG,GAAIH,EAAAA,GAAUI,IAAI7iB,SAASg7B,GACrE,OAGF,MAAMz3B,EAAW03B,SAASD,EAAOrvB,UAAU,GAAI,IACzComB,EAAc/gB,KAAKjE,KAAKilB,iBACxBnW,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAaoF,EAAc7C,KAAKnS,MAC9CygB,QAASzL,EAAcxC,IAAIvC,SAE7BiB,EAAUwP,KACV,MAAMsJ,EAAe3jB,KAAK4jB,kBAC1B,IAAK,MAAMpS,KAAOuP,EAAa,CAE7B,MAAME,EAAWF,EAAYvP,GAC7B,IAAI0Y,EAAMlqB,KAAKjE,KAAKolB,kBAAoB5uB,EAAY0uB,EAChDkJ,EAAKnqB,KAAKjE,KAAKslB,uBAAyB9uB,EAAW23B,EACnDE,EAAKpqB,KAAKkC,UAAUqB,MAAMD,EAAE4mB,GAAMvG,EAClChqB,EAAQqG,KAAKkC,UAAUqB,MAAMD,EAAE6mB,GAAMnqB,KAAKkC,UAAUqB,MAAMD,EAAE4mB,GAChElqB,KAAKgE,QAAQ/C,IAAI,YAAauJ,EAAO6f,eACrCrqB,KAAKgE,QAAQif,SAASmH,EAAI,EAAGzwB,EAAOqG,KAAK4J,OAAS,GAE9C5J,KAAKjE,KAAKykB,yBAA2B,IACvC0J,EACGlqB,KAAKjE,KAAKolB,kBAAoB5uB,EAAY0uB,GAC1CjhB,KAAKjE,KAAKolB,kBAAoBnhB,KAAKjE,KAAKykB,0BAA4BjuB,EACvE43B,EAAKnqB,KAAKjE,KAAKykB,yBAA2BjuB,EAAW23B,EACrDE,EAAKpqB,KAAKkC,UAAUqB,MAAMD,EAAE4mB,GAAMvG,EAClChqB,EAAQqG,KAAKkC,UAAUqB,MAAMD,EAAE6mB,GAAMnqB,KAAKkC,UAAUqB,MAAMD,EAAE4mB,GAE5DlqB,KAAKgE,QAAQ/C,IAAI,YAAauJ,EAAO8f,iBACrCtqB,KAAKgE,QAAQif,SAASmH,EAAI,EAAGzwB,EAAOqG,KAAK4J,OAAS,GAEtD,CACAiB,EAAU6R,MACZ,CAEA6N,mBAAAA,GACE,MAAM/lB,EAAQxE,KAAKD,MAAMyE,QACnBgmB,EAAUhmB,EAAMtL,aAAeC,EAAAA,GAAWC,MAC1CqxB,EAA0BC,EAAAA,GAA2B17B,SAASwV,EAAM8C,WACpEqjB,EAAe3qB,KAAK2T,6BAA+BsD,EAAAA,GAA2B2T,WAEpF,OAAOJ,IAAYC,GAA2BE,EAChD,CAEA9U,eAAAA,GACE,MAAM,cAAElH,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QACjC,IAAKnW,KAAKuqB,sBACR,OAEF,MAAM1f,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASxL,EAAc7C,KAAKnS,MAC5BygB,QAASzL,EAAcxC,IAAIvC,SAE7BiB,EAAUwP,KAEV,IAAI5W,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAGxD,KAAKD,MAAMyE,QAAQshB,YAC1CriB,IAAMzD,KAAK4J,SAAQnG,GAAK,GAE5B,IAAIoG,EAAAA,EACF,CACEI,GAAI,EACJE,GAAInK,KAAKrG,MACTuQ,GAAIzG,EACJ2G,GAAI3G,EACJ6G,YAAaE,EAAOsb,UACpB/a,WAAY,GAEd/K,KAAKkC,WACL4B,OAAO9D,KAAKgE,SACd6G,EAAU6R,MACZ,CAEAnH,uBAAAA,GACE,MAAM,cAAE5G,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAC3B7S,MAAQqL,EAAc7C,KAAKnS,MAAQgV,EAAcvC,MAAMzS,MAAQqG,KAAKrG,OAAS,GAC7E8J,MAAQkL,EAAcxC,IAAIvC,OAAS+E,EAActC,OAAOzC,OAAS5J,KAAK4J,QAAU,GACtF,IAAI0C,EAAAA,EACF,CACElS,KAAM,sBACNkJ,IACAG,IACA+H,KAAM,CAAE3R,KAAMwc,EAAAA,GAAU6J,EAAGhhB,MAAO,QAClCiO,UAAW3C,EAAOpQ,KAClBwR,UAAWC,EAAAA,GAAUkL,OACrBhL,aAAcC,EAAAA,GAAaoQ,QAE7Bpc,KAAKkC,WACL4B,OAAO9D,KAAKgE,QAChB,CAGA0Q,UAAAA,GACE,MAAM,cAAE/F,GAAkB3O,KAAKiH,yBAQ/BjH,KAAKkV,UAAYlV,KAAKkV,WAAa,IAAI2V,EAEvC7qB,KAAKkV,UAAUjU,KACZ+C,IACgC,IAA3BhE,KAAKjE,KAAKuZ,MAAM1lB,QAIpBoQ,KAAKwU,YAAYxQ,GACjBhE,KAAK2N,WAAW3J,IACXhE,KAAK8qB,wBAA0B9qB,KAAKgU,oBACvChU,KAAK6iB,iBAAiB7e,GAEnBhE,KAAKwV,wBACRxV,KAAK2U,qBAAqB3Q,IAT1BhE,KAAK2N,WAAW3J,EAUlB,GAEFhE,KAAKrG,MAAQgV,EAAc7C,KAAKnS,MAAQgV,EAAcvC,MAAMzS,MAC5DqG,KAAK4J,OAAS+E,EAAcxC,IAAIvC,OAAS+E,EAActC,OAAOzC,OAElE,CAGAmhB,SAAAA,CAAU1nB,GACRrD,KAAKjE,KAAOiE,KAAKD,MAAMyE,QACvB,MAAM,aAAEwmB,GAAiBhrB,KAAKiH,yBAAyB0H,cAAcoI,OAErE,GAAkB,mBAAP1T,EACT,OAGF,MAAMsgB,EAAe3jB,KAAK4jB,kBAEpBqH,EAAU,GAChB,IAAK,IAAIzO,EAAI,EAAGA,EAAIxc,KAAKjE,KAAK+b,OAAOloB,OAAQ4sB,IAAK,CAChD,MAAMlZ,EAAID,EAAGrD,KAAKjE,KAAK8lB,SAASrF,IAAMmH,EAClCrgB,EAAItD,KAAKD,MAAMwJ,WAAa,GAAKjG,EAAItD,KAAKD,MAAMwJ,WAAavJ,KAAKrG,OAItEsxB,EAAQrlB,KAAK5F,KAAKjE,KAAK+b,OAAO0E,GAChC,CAEA,MAAM7U,EAAMyM,EAAAA,GAAMzM,IAAIsjB,IAAY,EAC5B9H,EAAW6H,GAAgB,GACjChrB,KAAK0W,SAAWsE,EAAAA,MAAiBrE,MAAM,CAAC,EAAGwM,IAAWlI,OAAO,CAAC,EAAGtT,IAAMuT,KAAK,GAC5Elb,KAAK0jB,mBAAqB1jB,KAAKjE,KAAKuL,SACtC,CAGAoO,IAAAA,CAAKwV,GACH,MAAM,cAAEvc,GAAkB3O,KAAKiH,yBACR,MAAnBikB,IACFA,GAAkB,GAEpBlrB,KAAKgE,QAAQ8G,YACb,IAAIqgB,EAAe,EACfD,IACFC,EAAexc,EAActC,OAAOzC,QAEtC5J,KAAKgE,QAAQqK,KAAKM,EAAc7C,KAAKnS,MAAOgV,EAAcxC,IAAIvC,OAAQ5J,KAAKrG,MAAOqG,KAAK4J,OAASuhB,GAChGnrB,KAAKgE,QAAQ0R,MACf,CAEAnB,UAAAA,CAAWd,GAGT,OAFAA,EAAQhP,MAAQzE,KAChBA,KAAKwT,SAAS5N,KAAK6N,GACZzT,KAAK0B,QAAQ,SACtB,CAEA0pB,WAAAA,CAAY5X,GAEV,OADAxT,KAAKwT,SAAWA,EACTxT,KAAK0B,QAAQ,SACtB,CAEA2pB,aAAAA,CAAc5X,GACZ,IAAK,IAAIpZ,EAAQ,EAAGA,EAAQ2F,KAAKwT,SAAS5jB,OAAQyK,IAAS,CAEzD,GADW2F,KAAKwT,SAASnZ,KACdoZ,EAAS,CAClBzT,KAAKK,MAAMmT,SAAS8X,OAAOjxB,EAAO,GAClC2F,KAAKwT,SAAS8X,OAAOjxB,EAAO,GAC5B2F,KAAK0B,QAAQ,UACb,KACF,CACF,CACF,CAEA+Y,SAAAA,GACEza,KAAKjE,KAAOiE,KAAKD,MAAMyE,QACvB,IAAIiD,EAAMqG,OAAOyd,UACb5jB,EAAMmG,OAAO0d,UACbtY,GAAY,EACZC,GAAY,EACZoG,EAAoB,KAExB,MAAMkS,GAAwBvN,EAAAA,EAAAA,IAAyB,CACrD3U,WAAYvJ,KAAKD,MAAMwJ,WACvBhG,MAAOvD,KAAKkC,UAAUqB,MACtBiB,MAAOxE,KAAKjE,KACZ2vB,kBAAkB,IAEdC,GAAuBvN,EAAAA,EAAAA,IAAwB,CACnD7U,WAAYvJ,KAAKD,MAAMwJ,WACvBhG,MAAOvD,KAAKkC,UAAUqB,MACtBiB,MAAOxE,KAAKjE,KACZsiB,WAAYre,KAAKrG,MACjB+xB,kBAAkB,IASpB,GALED,EAAsBG,UACtBD,EAAqBC,UACrBH,EAAsBpxB,QAAUsxB,EAAqBtxB,MAIrDoN,EAAMzH,KAAKjE,KAAKgX,IAAI0Y,EAAsBpxB,OAC1CsN,EAAM3H,KAAKjE,KAAK+W,KAAKjK,KAAKpB,IAAIkkB,EAAqBtxB,MAAO2F,KAAKjE,KAAK8lB,SAASjyB,OAAS,IACtF2pB,EAAoBvZ,KAAKjE,KAAKuZ,MAAMmW,EAAsBpxB,WACrD,CAGL,MAAMwxB,EAAuBJ,EAAsBpxB,OAASoxB,EAAsBG,SAAW,EAAI,GACjG,IAAK,IAAIpP,EAAIqP,EAAsBrP,GAAKmP,EAAqBtxB,MAAOmiB,MAChD,IAAdtJ,GAAmBlT,KAAKjE,KAAKgX,IAAIG,GAAYlT,KAAKjE,KAAKgX,IAAIyJ,MAC7DtJ,EAAWsJ,KAEK,IAAdrJ,GAAmBnT,KAAKjE,KAAK+W,KAAKK,GAAYnT,KAAKjE,KAAK+W,KAAK0J,MAC/DrJ,EAAWqJ,GAKf,GAAIxc,KAAKjE,KAAKgX,IAAIG,KAAclT,KAAKjE,KAAK+W,KAAKK,GAAW,CACxD,MAAM2Y,EAAuBnZ,EAC3BO,EACAC,EACAnT,KAAKjE,KAAK+W,KACV9S,KAAKjE,KAAKgX,KAEZG,EAAW4Y,EAAqB5Y,SAChCC,EAAW2Y,EAAqB3Y,QAClC,CAEA1L,EAAMzH,KAAKjE,KAAKgX,IAAIG,GACpBvL,EAAM3H,KAAKjE,KAAK+W,KAAKK,GAErBoG,EAAoBvZ,KAAKjE,KAAKuZ,MAAMuW,EACtC,CAcA,OAXI7rB,KAAKuqB,uBAAiD,OAAxBvqB,KAAKjE,KAAK+pB,YAC1Cre,EAAMoB,KAAKpB,IAAIA,EAAKzH,KAAKjE,KAAK+pB,WAC9Bne,EAAMkB,KAAKlB,IAAIA,EAAK3H,KAAKjE,KAAK+pB,YAI5B9lB,KAAK2T,6BAA+BsD,EAAAA,GAA2BC,WAAclX,KAAKD,MAAMgsB,YAC1FtkB,EAAMoB,KAAKpB,IAAIA,EAAKzH,KAAKjE,KAAKoc,WAC9BxQ,EAAMkB,KAAKlB,IAAIA,EAAK3H,KAAKjE,KAAKoc,YAGzB,CAAE1Q,MAAKE,MAAK4R,oBACrB,CAEA3X,MAAAA,GAAU,CAEVwC,QAAAA,GACE,OAAO,CACT,CAEAf,GAAMC,GAActD,KAAKkC,UAAUqB,MAAMD,EAAEtD,KAAKjE,KAAK8lB,SAASve,IAE9DE,GAAMC,GAAczD,KAAKkC,UAAUqB,MAAME,EAAEA,GAE3CiW,KAAAA,CAAM2L,EAAW2G,GACf,OAAOtS,EAAAA,EAAAA,IAAM,CAAE3d,KAAMiE,KAAKjE,KAAMkwB,IAAK5G,EAAG2G,eAAgBA,GAAkBhsB,KAAK0kB,sBACjF,CAEAtM,SAAAA,CAAUiN,GACR,MAAM6G,EAAkBlsB,KAAK0kB,qBAC7B,OAAOhL,EAAAA,EAAAA,IAAM,CACX3d,KAAMiE,KAAKjE,KACXkwB,IAAK5G,EACL2G,eAAgBE,EAAkBrjB,KAAKlB,IAAIukB,EAAiB,QAAKr8B,GAErE,CAEAmW,QAAAA,GACE,MAAMwN,EAAWxT,KAAKwT,SAASvc,KAAKwc,GAAYA,EAAQzN,aACxD,OAAOP,IAAM,CAAC,EAAGzF,KAAKK,MAAO,CAAEnS,KAAM8R,KAAK9R,KAAMslB,YAClD,CAEAvN,QAAAA,GACE,MAAMuN,EAAWxT,KAAKwT,SAASvc,KAAKwc,GAAYA,EAAQxN,aACxD,OAAOR,IAAM,CAAC,EAAGzF,KAAKK,MAAO,CAAEnS,KAAM8R,KAAK9R,KAAMslB,YAClD,CAEAsQ,wBAAAA,GACE,MAAM,aAAEqI,EAAY,eAAEC,IAAmBC,EAAAA,EAAAA,IAA6B,CACpEvL,YAAa9gB,KAAKD,MAAMqF,eACxByb,WAAY7gB,KAAKD,MAAM8gB,aAEzB,OAAOsL,EAAgC,EAAjBC,CACxB,CAEAxI,eAAAA,GACE,QAAS/a,KAAKlB,IAAI,EAAG3H,KAAK8jB,2BAA6B,EACzD,CAEAY,kBAAAA,CAAmBD,GACjB,MAAM,UAAEtM,EAAS,WAAEjf,GAAe8G,KAAKjE,KACjCuwB,EAAW7H,GAAS5b,KAAKiT,IAAI2I,GACnC,OAAItM,GAAa,IACR,EACEA,GAAa,IACf,EACEjf,IAAeC,EAAAA,GAAWC,QAAUkzB,GAAYnU,GAAa,EAC/D,OACgBtoB,IAAdsoB,EAEF,OAFF,CAMT,CAEAoU,UAAAA,CAAWr+B,GACT,OAAO8R,KAAKwT,SAASuM,MAAMzc,GAAMA,EAAEpV,OAAS,YAAcA,GAC5D,CAEAwyB,QAAAA,GACE,OAAO,IAAI7W,EAAAA,EACT,CACEK,GAAI,EACJE,GAAIpK,KAAK4J,OACTU,YAAatK,KAAKiH,yBAAyB0H,cAAcwH,QAAQ3L,OAAOwY,KACxEjY,WAAY,GAEd/K,KAAKkC,UAET,CAEAoa,QAAAA,GACE,OAAO,IAAIzS,EAAAA,EACT,CACEI,GAAI,EACJE,GAAInK,KAAKrG,MACT2Q,YAAatK,KAAKiH,yBAAyB0H,cAAcwH,QAAQ3L,OAAOwY,KACxEjY,WAAY,GAEd/K,KAAKkC,UAET,CAEA+E,sBAAAA,GACE,OAAOA,EAAAA,EAAAA,IAAuBjH,KAAKD,MAAMqF,eAC3C,CAEA0lB,oBAAAA,GACE,OACE9qB,KAAKmU,UAAYnU,KAAKD,MAAMqF,eAAeuO,6BAA+BsD,EAAAA,GAA2BuV,SAEzG,CAEAC,kCAAAA,GACE,MAAM,cAAE9d,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,SAC3B,MAAEjgB,EAAK,2BAAEyd,GAA+B3T,KAAKD,MAAMqF,eACzD,IAAIsnB,EAASliB,EACb,MAAMmiB,GAAoBC,EAAAA,EAAAA,GAAmB,CAC3CF,SACAx2B,UAEI22B,EAAuBvqB,OAAOC,KAAKoqB,GACnCG,EAA4B,CAAC,WAAY,SAAU,aAAc,WAAY,UAAW,aAAa/M,MACxGgN,GAAaF,EAAqB79B,SAAS+9B,KAI5C72B,IAAU82B,EAAAA,GAAMC,QAChBC,EAAAA,EAAAA,IAA6B,CAC3BvZ,2BAA4BA,EAC5BwZ,cAAexe,EAAcoI,OAAO4J,SAAyC,EAA9BhS,EAAcoI,OAAOtI,WAG1Cqe,IAC5BJ,EAAS,IAAKA,KAAWU,EAAAA,KAQ3B,OALEzZ,IAA+BsD,EAAAA,GAA2BC,WAA6C,IAAhCvI,EAAcoI,OAAOtI,SAC9Dqe,IAC9BJ,EAAS,IAAKA,KAAWW,EAAAA,MAA0BV,IAG9CD,CACT,CAEAlX,oBAAAA,GACE,OAAOxV,KAAK2T,6BAA+BsD,EAAAA,GAA2BuV,YAAac,EAAAA,EAAAA,IAAiBttB,KACtG,EAGFsT,EAAU7G,YAEV,UC9xEA,MAAM8gB,UAAoBC,EACxB7tB,YAAc2e,EAAAA,GAAiBiP,YAC/B5tB,aAAe,SACfA,gBAAkB,iBAElB8tB,sBAAAA,CAAsB/+B,GAA0E,IAAzE,MAAE2L,EAAK,oBAAEqzB,EAAmB,iBAAEC,GAAyCj/B,EAC5F,MAAM,UAAEk/B,EAAS,QAAEC,EAAO,WAAEC,EAAU,SAAEC,EAAQ,SAAEC,EAAQ,OAAEC,GAAWP,EACjE7V,EAAO7X,KAAKjE,KAAK8b,KAAKxd,GACtBib,EAAQtV,KAAKjE,KAAKuZ,MAAMjb,GACxBwtB,EAAavS,EAAQuC,EAAO+V,EAAYC,EACxCK,EAAY5Y,EAAQuC,EAAOmW,EAAWC,EAC5C,MAAO,CACLpW,OACAvC,QACAxC,KAAM9S,KAAKjE,KAAK+W,KAAKzY,GACrB0Y,IAAK/S,KAAKjE,KAAKgX,IAAI1Y,GACnB8zB,aAActG,EACd7Y,YAAasG,EAAQuC,EAAOiW,EAAaC,EACzCG,UAAWP,EAAmBO,EAAYrG,EAE9C,CAEAzS,WAAAA,GACE,GAAIpV,KAAK0jB,qBAAuB1jB,KAAKjE,KAAKuL,UACxC,OAEF,MAAM,cAAEqH,GAAkB3O,KAAKiH,yBACzBuD,EAASxK,KAAKysB,sCACd,aAAEN,EAAY,eAAEC,IAAmBC,EAAAA,EAAAA,IAA6B,CACpEvL,YAAa9gB,KAAKD,MAAMqF,eACxByb,WAAY7gB,KAAKD,MAAM8gB,aAEnBuN,EACJjC,EAAgC,EAAjBC,GAAsB,KACnCpsB,KAAK9R,OAASowB,EAAAA,GAAiB+P,mBAAwC,IAAnBjC,GAClDvhB,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAaoF,EAAc7C,KAAKnS,MAC9CygB,QAASzL,EAAcxC,IAAIvC,SAEvB0kB,GAAmBpU,EAAAA,EAAAA,IAAa,CACpClW,QAAShE,KAAKgE,QACdmW,QAASoU,GACTnU,QAAS,IAGXvP,EAAUwP,MACV0J,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKkC,UAAUqB,MACtBgG,WAAYvJ,KAAKuJ,WACjB5P,MAAOqG,KAAKrG,MACZqqB,gBAAiBA,CAACxH,EAAWzF,KAC3B,MAAM,KAAEc,EAAI,MAAEvC,EAAK,KAAExC,EAAI,IAAEC,EAAG,UAAEmb,EAAS,YAAElf,EAAW,aAAEmf,GAAiBnuB,KAAKytB,uBAAuB,CACnGpzB,MAAOmiB,EACPkR,oBAAqBljB,EACrBmjB,iBAAkBS,IAGdI,EAAiB3lB,KAAK6Q,MAAM1Z,KAAKwD,GAAG4Q,EAAAA,GAAMzM,IAAIkQ,EAAMvC,KACpDmZ,EAAgB5lB,KAAK6Q,MAAM1Z,KAAKwD,GAAG4Q,EAAAA,GAAM3M,IAAIoQ,EAAMvC,KACnDoZ,EAAiB7lB,KAAK6Q,MAAM1Z,KAAKwD,GAAGsP,IACpC6b,EAAgB9lB,KAAK6Q,MAAM1Z,KAAKwD,GAAGuP,IAEnC6b,EAAmBH,EAAgBD,EACnCK,EAAkB9X,EAASlO,KAAK0R,MAAM6R,EAAiBD,EAAe,GACtE2C,EAAkB1C,EAAiB,EAIzC,IAAI2C,EAAAA,EAAAA,OAAcF,EAAkB7uB,KAAKuJ,WAAa,EACpD,OAGF,MAAMylB,EAAoCJ,GAAqC,EAAjBxC,EACxD6C,GAAoCb,GAA6BO,EAAgBD,EAAiB,EAiBxG,GAfAJ,EAAiBjU,KACjBra,KAAKgE,QAAQ/C,IAAI,cAAeitB,GAChCluB,KAAKgE,QAAQ8G,YACb9K,KAAKgE,QAAQO,OAAOwS,EAAQ2X,GACxBN,IACFpuB,KAAKgE,QAAQiH,OAAO8L,EAAQyX,GAC5BxuB,KAAKgE,QAAQO,OACXwS,EACAyX,GAAkBQ,EAAoCJ,EAvF/C,KA0FX5uB,KAAKgE,QAAQiH,OAAO8L,EAAQkY,EAAmCP,EAAiB,EAAIC,GACpF3uB,KAAKgE,QAAQkH,SACbojB,EAAiB5R,OAEb0R,EAA2B,CAC7B,MAAMc,EAAY9C,EAAiB,EAC/B8C,IACFlvB,KAAKgE,QAAQ/C,IAAI,cAAe+N,GAC5BggB,GACFhvB,KAAKgE,QAAQ/C,IAAI,YAAamrB,GAC9BpsB,KAAKgE,QAAQkf,WACX2L,EAAkBC,EAClBN,EAAiBM,EACjB3C,EAAe,EAAI2C,EACnBF,EAAmB,EAAIE,GAEzB9uB,KAAKgE,QAAQ/C,IAAI,YA1GZ,KA4GLjB,KAAKgE,QAAQ8G,YACb9K,KAAKgE,QAAQO,OAAOsqB,EAAiBL,EAAiBD,IACtDvuB,KAAKgE,QAAQiH,OAAO4jB,EAAkB1C,EAAe,EAAIC,EAAgBoC,EAAiBD,IAC1FvuB,KAAKgE,QAAQkH,WAIjB,MAAMikB,EAAaP,EAAmB,EAAIxC,EACpCgD,EAAUD,EAAa,GACzBC,GAAYF,IACdlvB,KAAKgE,QAAQ/C,IAAI,YAAamuB,EAAUjB,EAAenf,GACvDhP,KAAKgE,QAAQif,SACX4L,EAAkBzC,EAClBoC,EAAiBpC,EACjBD,EACAiD,EAAUD,EA3HL,GA8HX,KAGJtkB,EAAU6R,MACZ,CAEA7V,QAAAA,GACE,MAAQ,gBAAe7G,KAAKjE,KAAKjB,QACnC,EAGF,UC9IA,MAAMuzB,UAA0Bd,EAC9B5tB,YAAc2e,EAAAA,GAAiB+P,kBAC/B1uB,aAAe,gBACfA,gBAAkB,kBAElB,yBAAOM,CAAmBvO,GACxB,OAAOmX,KAAKlB,IAAI,EAAG5G,MAAMd,mBAAmBvO,GAC9C,CAEA+7B,sBAAAA,CAAsB/+B,GAAwD,IAAvD,MAAE2L,EAAK,oBAAEqzB,GAA4Ch/B,EAC1E,MAAMmpB,EAAO7X,KAAKjE,KAAK8b,KAAKxd,GACtBib,EAAQtV,KAAKjE,KAAKuZ,MAAMjb,GACxBg1B,EAAW/Z,EAAQuC,EACnByX,EACJha,EAAQtV,KAAKjE,KAAKuZ,MAAMjb,EAAQ,GAAKqzB,EAAoB6B,YAAc7B,EAAoB8B,cACvF3H,EAAuB,IAAVxtB,EAAcqzB,EAAoB+B,WAAaH,EAClE,MAAO,CACLzX,OACAvC,QACAxC,KAAM9S,KAAKjE,KAAK+W,KAAKzY,GACrB0Y,IAAK/S,KAAKjE,KAAKgX,IAAI1Y,GAEnB8zB,aAAckB,EAAW,mBAAqBxH,EAC9C7Y,YAAa6Y,EACbqG,UAAWrG,EAEf,CAEAhhB,QAAAA,GACE,MAAQ,uBAAsB7G,KAAKjE,KAAKjB,QAC1C,EAGF,UC7BA,MAAM40B,UAAmBnC,EACvB5tB,YAAc2e,EAAAA,GAAiBoR,WAC/B/vB,aAAe,cACfA,gBAAkB,sBAElB,yBAAOM,CAAmBvO,GACxB,OAAOmX,KAAKlB,IAAI,EAAG5G,MAAMd,mBAAmBvO,GAC9C,CAEA+7B,uBAAyB/+B,IAA6E,IAA5E,MAAE2L,EAAK,oBAAEqzB,EAAmB,iBAAEC,GAAyCj/B,EAC/F,MAAMihC,EAAS3vB,KAAKjE,KAAK6zB,oBAEnB/X,EAAO8X,EAAO9X,KAAKxd,GACnBib,EAAQqa,EAAOra,MAAMjb,GACrBwtB,EAAavS,EAAQuC,EAAO6V,EAAoBE,UAAYF,EAAoBG,QAChFK,EAAY5Y,EAAQuC,EAAO6V,EAAoBM,SAAWN,EAAoBO,OACpF,MAAO,CACLpW,OACAvC,QACAxC,KAAMjK,KAAKlB,IAAI3H,KAAKjE,KAAK+W,KAAKzY,GAAQwd,EAAMvC,GAC5CvC,IAAKlK,KAAKpB,IAAIoQ,EAAMvC,EAAOtV,KAAKjE,KAAKgX,IAAI1Y,IACzC8zB,aAActG,EACd7Y,YAAasG,EAAQuC,EAAO6V,EAAoBI,WAAaJ,EAAoBK,SACjFG,UAAWP,EAAmBO,EAAYrG,EAC3C,EAGHgI,cAAgBA,KACd,MAAMrlB,EAASxK,KAAKysB,sCAElB5U,KAAMc,EACNrD,MAAO6C,EACPrF,KAAM8F,EACN7F,IAAK8F,GACH7Y,KAAKytB,uBAAuB,CAC9BpzB,MAAO2F,KAAKjE,KAAKmV,KAAKthB,OAAS,EAC/B89B,oBAAqBljB,IAGvB,MAAO,CAAEmO,WAAUR,YAAWS,WAAUC,UAAS,EAGnDH,kBAAAA,GACE,MAAM5E,EAAW9T,KAAK6vB,gBACtB,MAAO,CACLhY,KAAM7X,KAAKoY,UAAUtE,EAAS6E,UAC9B7F,KAAM9S,KAAKoY,UAAUtE,EAAS8E,UAC9B7F,IAAK/S,KAAKoY,UAAUtE,EAAS+E,SAC7BvD,MAAOtV,KAAKoY,UAAUtE,EAASqE,WAEnC,CAEA3D,YAAexQ,IACb,MAAM,UAAEmU,GAAcnY,KAAK6vB,gBAC3B9uB,MAAMyT,YAAYxQ,EAAS,CAAEmU,cAAa,GAE1C,MAAM,kBAAEoB,GAAsBvZ,KAAKya,YACnC,GAAIza,KAAKD,MAAMwD,QAAUiW,EAAAA,GAAUC,aAAeF,EAAmB,OAErE,MAAMuW,EAAsB9vB,KAAKjE,KAAKuZ,MAAMtV,KAAKjE,KAAKuZ,MAAM1lB,OAAS,GAC/DmgC,EAAyB/vB,KAAKqZ,uBAAuB,CAAElB,YAAWoB,sBAClEyW,EAA2BhwB,KAAKqZ,uBAAuB,CAAElB,UAAW2X,EAAqBvW,sBAE/FvZ,KAAK2c,iBAAiB,CAAE3Y,UAAS4Y,YAAa/T,KAAK6Q,MAAM1Z,KAAKwD,GAAG2U,IAAa9pB,MAAO0hC,IAEjFA,IAA2BC,GAE/BhwB,KAAK2c,iBAAiB,CACpB3Y,UACA4Y,YAAa5c,KAAKid,kCAAkC,CAClDE,eAAgBhF,EAChBiF,oBAAqB0S,IAEvBzhC,MAAO2hC,EACP7hB,WAAYnO,KAAK6c,oCACjB,EAGJqI,mBAAAA,CAAoBC,EAAoB5sB,GAAoD,IAAlC6sB,IAAyBz1B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GACjF,MAAM6a,EAASxK,KAAKysB,qCACd5K,EAAW7hB,KAAKjE,KAAK0pB,uBAAuBN,GAClD,GAAItD,GAAY,EAAG,CACjB,IAAI7qB,EAAQ,KACZ,GAAI,CAAC,OAAQ,MAAO,OAAQ,SAAShI,SAASuJ,GAAM,CAElDvB,EADagJ,KAAKytB,uBAAuB,CAAEpzB,MAAOwnB,EAAU6L,oBAAqBljB,IACpEjS,EACf,CAEA,GADAvB,EAAkB,OAAVA,EAAiBgJ,KAAKjE,KAAKupB,kBAAkB/sB,EAAK4sB,GAAcnuB,EAC1D,OAAVA,EACF,OAAOouB,EAA4BplB,KAAKoY,UAAUphB,GAAU,GAAEA,GAElE,CACF,CAEAuuB,mBAAAA,CAAoBJ,GAClB,MAAMtD,EAAW7hB,KAAKjE,KAAK0pB,uBAAuBN,GAC5CwK,EAAS3vB,KAAKjE,KAAK6zB,oBACnBlK,EAAaiK,EAAOra,MAAMuM,IAAa,KACvC8D,EAAgBgK,EAAOra,MAAMuM,EAAW,IAAM,KACpD,OAAmB,OAAf6D,GAAyC,OAAlBC,GAClBC,EAAAA,EAAAA,IAA+B,CAAE7pB,KAAMiE,KAAKjE,KAAM8pB,YAAaH,EAAYI,UAAWH,IAGxF,IACT,CAEA9e,QAAAA,GACE,MAAQ,mBAAkB7G,KAAKjE,KAAKjB,QACtC,EAGF,UClHA,MAAMyjB,UAAkBiP,EACtB7tB,YAAc2e,EAAAA,GAAiBC,UAC/B5e,aAAe,OACfA,gBAAkB,gBAElByV,WAAAA,GACE,MAAM,cAAEzG,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QACjC,IAAIjY,EAA2Boa,EAC/B,MAAMzN,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAaoF,EAAc7C,KAAKnS,MAAQ,GACtDygB,QAASzL,EAAcxC,IAAIvC,OAAS,KAEtCiB,EAAUwP,KACVra,KAAKgE,QAAQ8G,YACb9K,KAAKgE,QAAQ/C,IAAI,YAAa,GAC9BjB,KAAKgE,QAAQ/C,IAAI,cAAeuJ,EAAOV,OACvCia,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKkC,UAAUqB,MACtBgG,WAAYvJ,KAAKuJ,WACjB5P,MAAOqG,KAAKrG,MACZqqB,gBAAiBA,CAACxH,EAAWlZ,KAC3B,MAAMG,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAGxD,KAAKjE,KAAKuZ,MAAMkH,KAC7Cxc,KAAKgE,QAAQiH,OAAO3H,EAAGG,GACvB6U,EAAOhV,OACOzT,IAAVqO,IACFA,EAAQoF,EACV,SAGUzT,IAAVqO,QAAgCrO,IAATyoB,IACzBtY,KAAKgE,QAAQkH,SACblL,KAAKgE,QAAQ/C,IAAI,YAAauJ,EAAO2D,YACrCnO,KAAKgE,QAAQiH,OAAOqN,EAAOtY,KAAK4J,QAChC5J,KAAKgE,QAAQiH,OAAO/M,EAAQ8B,KAAK4J,QACjC5J,KAAKgE,QAAQsK,QAGfzD,EAAU6R,MACZ,CAEA7V,QAAAA,GACE,MAAQ,cAAa7G,KAAKjE,KAAKjB,QACjC,EAGF,UC1CMm1B,EAAU,iBAEVC,EAAY,iBAElB,MAAMnS,UAAwByP,EAC5B7tB,YAAc2e,EAAAA,GAAiBP,gBAE/B,gBAAOtR,GACLnK,OAAOuB,eAAe7D,KAAK0M,UAAW,QAAS,CAC7CvJ,GAAAA,GACE,MAAM,wBAAEgtB,GAA4BnwB,KAAKiH,yBACzC,OAAOjH,KAAKD,MAAMpG,MAAQw2B,EAAwBrkB,KAAKnS,MAAQw2B,EAAwB/jB,MAAMzS,KAC/F,IAGF2I,OAAOuB,eAAe7D,KAAK0M,UAAW,SAAU,CAC9CvJ,GAAAA,GACE,MAAM,wBAAEgtB,GAA4BnwB,KAAKiH,yBACzC,OAAOjH,KAAKkC,UAAU0H,OAASumB,EAAwBhkB,IAAIvC,OAASumB,EAAwB9jB,OAAOzC,MACrG,GAEJ,CAKA/I,WAAAA,CAAYC,EAAiCf,GAC3CgB,MAAMD,EAAQf,GACdC,KAAK2N,WAAa3N,KAAK2N,WAAWvM,KAAKpB,MACvCA,KAAK2U,qBAAuB3U,KAAK2U,qBAAqBvT,KAAKpB,MAC3DA,KAAKwU,YAAcxU,KAAKwU,YAAYpT,KAAKpB,MACzCA,KAAK0U,WAAa1U,KAAK0U,WAAWtT,KAAKpB,KACzC,CAEA0U,UAAAA,GAEE,GADA3T,MAAM2T,cACD1U,KAAKjE,KACR,OAEF,MAAMq0B,EAAgB,GACtBpwB,KAAKjE,KAAKuZ,MAAM3R,SAAQ,CAAC0sB,EAAK7T,KAC5B4T,EAAI5T,GAAK6T,EAAMrwB,KAAKjE,KAAK+b,OAAO0E,EAAE,IAEpCxc,KAAKswB,MAAQF,EAEb,IAAIG,EAAY,KAChB,IAAK,IAAI/T,EAAIxc,KAAKjE,KAAK+b,OAAOloB,OAAS,EAAG4sB,GAAK,EAAGA,IAChD,GAA4B,IAAxBxc,KAAKjE,KAAK+b,OAAO0E,GAAU,CAC7B+T,EAAY/T,EACZ,KACF,CAEFxc,KAAKwwB,eACW,OAAdD,EACI,KACA1nB,KAAKpB,IAAI8oB,EAAW1nB,KAAK6Q,OAAO1Z,KAAKjE,KAAKolB,kBAAoBnhB,KAAKjE,KAAKskB,oBA3DjE,GA4Df,CAEAjL,WAAAA,GACE,MAAM,wBAAE+a,GAA4BnwB,KAAKiH,yBACnC4D,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAa4mB,EAAwBrkB,KAAKnS,MAAQ,GAChEygB,QAAS+V,EAAwBhkB,IAAIvC,OAAS,KAEhDiB,EAAUwP,KACVra,KAAKywB,mBAAmBzwB,KAAKgE,QAAShE,KAAKswB,MAAO,EAAG,EAAG,GACxDzlB,EAAU6R,MACZ,CAEA+T,kBAAAA,CACEzsB,EACA0sB,EACAhpB,EACAipB,EACAC,GAEA,GAA4B,OAAxB5wB,KAAKwwB,eACP,OAEF,MAAMK,GAAaC,EAAAA,EAAAA,OACb,cAAEniB,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAE3B8E,EAAS,CAtFD,GADA,GAyFdjX,EAAQqJ,OACRrJ,EAAQ8G,YACR9G,EAAQqK,MACLrO,KAAKuJ,WACNvJ,KAAKwD,GAAGyX,EAAO,IACfjb,KAAKqD,GAAGrD,KAAKwwB,gBACb3nB,KAAK6Q,MAAM1Z,KAAKwD,GAAGmtB,GAAY3wB,KAAKwD,GAAGyX,EAAO,KAAO,IAEvDjX,EAAQ0R,OACR1R,EAAQ/C,IAAI,YAhGJ,0BAiGR+C,EAAQ/C,IAAI,cAAe4vB,EAAarmB,EAAOumB,WAAad,GAC5DjsB,EAAQ8G,YACR9G,EAAQO,OAAOvE,KAAKqD,GAAG,GAAIwF,KAAK6Q,MAAM1Z,KAAKwD,GAAGyX,EAAO,MACrD,IAAK,IAAIuB,EAAI9U,EAAM8U,EAAIxc,KAAKjE,KAAKuZ,MAAM1lB,OAAQ4sB,IAC7CxY,EAAQiH,OAAOjL,KAAKqD,GAAGmZ,GAAI3T,KAAK6Q,MAAM1Z,KAAKwD,GAAGktB,EAAMlU,MAEtDxY,EAAQiH,OAAOjL,KAAKqD,GAAGrD,KAAKjE,KAAKuZ,MAAM1lB,OAAS,GAAIiZ,KAAK6Q,MAAM1Z,KAAKwD,GAAGyX,EAAO,MAC9EjX,EAAQsK,OACRtK,EAAQkH,SACRlH,EAAQyJ,UAERzJ,EAAQqJ,OACRrJ,EAAQ8G,YACR9G,EAAQqK,MACLrO,KAAKuJ,WACNvJ,KAAKwD,GAAGyX,EAAO,IACfjb,KAAKqD,GAAGrD,KAAKwwB,gBACb3nB,KAAK6Q,MAAM1Z,KAAKwD,GAAGotB,IAAe,IAEpC5sB,EAAQ0R,OACR1R,EAAQ/C,IAAI,YAnHF,0BAoHV+C,EAAQ/C,IAAI,cAAe4vB,EAAarmB,EAAOwmB,SAAWd,GAC1DlsB,EAAQ8G,YACR9G,EAAQO,OAAOvE,KAAKqD,GAAG,GAAIwF,KAAK6Q,MAAM1Z,KAAKwD,GAAGyX,EAAO,MACrD,IAAK,IAAIuB,EAAI9U,EAAM8U,EAAIxc,KAAKjE,KAAKuZ,MAAM1lB,OAAQ4sB,IAC7CxY,EAAQiH,OAAOjL,KAAKqD,GAAGmZ,GAAI3T,KAAK6Q,MAAM1Z,KAAKwD,GAAGktB,EAAMlU,MAEtDxY,EAAQiH,OAAOjL,KAAKqD,GAAGrD,KAAKjE,KAAKuZ,MAAM1lB,OAAS,GAAIiZ,KAAK6Q,MAAM1Z,KAAKwD,GAAGyX,EAAO,MAC9EjX,EAAQsK,OACRtK,EAAQkH,SACRlH,EAAQyJ,SACV,CAEAuI,WAAAA,GACE,MAAM,wBAAEma,GAA4BnwB,KAAKiH,0BACnC,OAAEuD,GAAW2lB,EAAwBha,QACrCtL,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAa4mB,EAAwBrkB,KAAKnS,MACxDygB,QAAS+V,EAAwBhkB,IAAIvC,SAEvCiB,EAAUwP,KAEV,MAAMoG,EAAQzgB,KAAK0gB,WACbtmB,EAAO,IAAIkS,EAAAA,EACf,CACE7I,EAAGzD,KAAK4J,OAAS,GACjB4B,KAAM,CAAE3R,KAAM,GACdsT,UAAW3C,EAAOpQ,KAClB2R,aAAcC,EAAAA,GAAaK,OAC3BT,UAAWC,EAAAA,GAAUkL,QAEvB/W,KAAKkC,WAEP,IAAIoB,EAEJA,EAAItD,KAAKqD,GAAG,GACZod,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SAExCV,EAAItD,KAAKqD,GAAG,IAAM,EAClBjJ,EAAK6G,IAAI,CAAE7G,KAAM,OAAQkJ,MAAKQ,OAAO9D,KAAKgE,SAC1Cyc,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SAExCV,EAAItD,KAAKqD,GAAG,IACZod,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SAExCV,EAAItD,KAAKqD,GAAG,IACZjJ,EAAK6G,IAAI,CAAE7G,KAAM,OAAQkJ,MAAKQ,OAAO9D,KAAKgE,SAC1Cyc,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SAExCV,EAAItD,KAAKqD,GAAG,IACZod,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SAExCV,EAAItD,KAAKqD,GAAG,IACZjJ,EAAK6G,IAAI,CAAE7G,KAAM,MAAOkJ,MAAKQ,OAAO9D,KAAKgE,SACzCyc,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SAExCV,EAAItD,KAAKqD,GAAG,KACZod,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SAExCV,EAAItD,KAAKqD,GAAG,KACZjJ,EAAK6G,IAAI,CAAE7G,KAAM,MAAOkJ,MAAKQ,OAAO9D,KAAKgE,SACzCyc,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,SAExC6G,EAAU6R,MACZ,CAEA/O,UAAAA,GAAc,CAEd8G,eAAAA,GAAmB,CAEnBE,oBAAAA,GAAwB,CAExBsc,QAAAA,GACE,MAAO,CAAExpB,KAjMK,EAiMWE,IAhMX,EAiMhB,CAEAupB,oBAAAA,GACE,OAAOlxB,KAAKixB,UACd,CAEAzc,WAAAA,CAAYxQ,GACV,MAAM,wBAAEmsB,EAAuB,cAAExhB,GAAkB3O,KAAKiH,0BAClD,OAAEuD,GAAWmE,EAAcwH,QAC3B0a,GAAaC,EAAAA,EAAAA,MACbjmB,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASgW,EAAwBrkB,KAAKnS,MACtCygB,QAAS+V,EAAwBhkB,IAAIvC,SAEvCiB,EAAUwP,KAEV,MAAM8W,EAAQnxB,KAAKsc,WACnB,IAAK,MAAMlB,IAAQ,EApNL,EAoNiB,EAnNjB,GAmNgC,CAC5C,MAAM3X,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAG4X,IAC7B+V,EAAMlwB,IAAI,CAAEiJ,GAAIzG,EAAG2G,GAAI3G,IAAKK,OAAOE,EACrC,CAEA,MAAM5J,EAAO,IAAIkS,EAAAA,EACf,CACEhJ,EAAGtD,KAAKrG,MAAQ,GAChB6R,KAAM,CAAE3R,KAAM,GACdkS,aAAcC,EAAAA,GAAaoQ,OAC3BxQ,UAAWC,EAAAA,GAAUO,OAEvBpM,KAAKkC,WAGDkvB,EAASP,EAAarmB,EAAOwmB,SAAWd,EACxCmB,EAAWR,EAAarmB,EAAOumB,WAAad,EAC5C3X,EAAOtY,KAAKswB,MAAMtwB,KAAKwwB,gBACvBc,EAAkC,OAAxBtxB,KAAKwwB,eAA0B3nB,KAAK0R,MAAa,GAAPjC,EAAY,IAAM,GAC5Ele,EAAK6G,IAAI,CAAEwC,EAAGzD,KAAKwD,GAAG,GAAK,EAAG2J,UAAWikB,EAAQh3B,KAAO,GAAEk3B,OAAcxtB,OAAOE,GAC/E5J,EAAK6G,IAAI,CAAEwC,EAAGzD,KAAKwD,GAAG,GAAK,EAAG2J,UAAWkkB,EAAUj3B,KAAS,IAAMk3B,EAAR,MAAsBxtB,OAAOE,GAEvF6G,EAAU6R,MACZ,CAEAhH,IAAAA,GACE,MAAM,wBAAEya,GAA4BnwB,KAAKiH,yBACzCjH,KAAKgE,QAAQ8G,YACb9K,KAAKgE,QAAQqK,KAAK8hB,EAAwBrkB,KAAKnS,MAAOw2B,EAAwBhkB,IAAIvC,OAAQ5J,KAAKrG,MAAOqG,KAAK4J,QAC3G5J,KAAKgE,QAAQ0R,MACf,CAEA+E,SAAAA,GACE,OAAOza,KAAKixB,UACd,CAEApO,gBAAAA,GAAoB,CAEpBlN,YAAAA,GAAgB,CAEhB9O,QAAAA,GACE,MAAQ,wBACV,EAEFkX,EAAgBtR,YAEhB,U,eC1PA,MAAM8kB,EAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAE7F,MAAMC,UAAuBhE,EAC3B7tB,YAAc2e,EAAAA,GAAiBkT,eAC/BC,kBAA8B,GAE9B5wB,WAAAA,CAAYC,EAAsCf,GAChDgB,MAAMD,EAAQf,GACdC,KAAK2N,WAAa3N,KAAK2N,WAAWvM,KAAKpB,KACzC,CAEAoV,WAAAA,GACE,MAAM,cAAEzG,EAAa,eAAE+iB,GAAmB1xB,KAAKiH,yBACzC4D,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAaoF,EAAc7C,KAAKnS,MAAQ,GACtDygB,QAASzL,EAAcxC,IAAIvC,OAAS,KAEtCiB,EAAUwP,KAEVra,KAAKgE,QAAQ/C,IAAI,YAAa,GAE9B,MAAM0wB,EAA4B,CAAC,EACnC,IAAK,MAAMntB,KAASxE,KAAK4xB,YACvBD,EAAOntB,EAAM1J,QAAU0J,EAGzB,IAAK,IAAInK,EAAQ2F,KAAKK,MAAMwxB,QAAQjiC,OAAS,EAAGyK,GAAS,EAAGA,IAAS,CACnE,MACMmK,EAAQmtB,EADC3xB,KAAKK,MAAMwxB,QAAQx3B,IAElC2F,KAAKgE,QAAQ/C,IAAI,cAAeywB,EAAer3B,EAAQq3B,EAAe9hC,SACtEoQ,KAAKgE,QAAQ8G,YACb,IAAK,IAAI0R,EAAI,EAAGsV,EAAMttB,EAAM8Q,MAAM1lB,OAAQmiC,EAAMD,GAAO,EAAGC,EAAMvV,EAAIsV,EAAMtV,EAAIsV,EAAKC,EAAMvV,IAAMA,IAAK,CAClG,MAAMlZ,EAAItD,KAAKqD,GAAGmZ,GAClB,GAAIlZ,EAAItD,KAAKuJ,YAAc,IAAMjG,EAAItD,KAAKuJ,WAAavJ,KAAKD,MAAMpG,MAAQ,GAExE,SAEF,MAAM8J,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAGgB,EAAM8Q,MAAMkH,KACzCxc,KAAKgE,QAAQiH,OAAO3H,EAAGG,EACzB,CACAzD,KAAKgE,QAAQkH,QACf,CAEAL,EAAU6R,MACZ,CAEA/O,UAAAA,CAAW3J,GACT,MAAM,cAAE2K,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAC3B/b,EAAO4F,KAAKK,MAAMhS,OAAS,GAC3BoV,GAAKzD,KAAK4J,OAAS,GAAK,EAc9B,OAbA,IAAI0C,EAAAA,EACF,CACElS,OACAkJ,EAAG,GACHG,EAAGkL,EAAcxC,IAAIvC,OAASnG,EAC9B2J,OAAQ,GACR5B,KAAM,CAAE3R,KAAM,GAAI6R,OAAQ,MAAOD,OAAQ,oBACzC0B,UAAW3C,EAAOsM,cAClBlL,UAAWC,EAAAA,GAAUkL,OACrBhL,aAAcC,EAAAA,GAAaC,YAE7BjM,KAAKkC,WACL4B,OAAOE,GACFhE,KAAKyU,gBAAgBzQ,EAAShE,KAAKjE,KAAKuZ,MAAM1lB,OAAS,EAChE,CAEA6kB,eAAAA,CAAgBzQ,EAAmCmhB,GACjD,MAAM,cAAExW,EAAa,eAAE+iB,GAAmB1xB,KAAKiH,0BACzC,OAAEuD,GAAWmE,EAAcwH,QAC3B6b,EAAkB5d,EAAAA,GAAMzM,IAAI3H,KAAKK,MAAMwxB,QAAQ56B,KAAKmb,GAAMA,EAAExiB,UAE5DshB,EAAOkD,EAAAA,GAAAA,sBAA4BpU,KAAKjE,KAAKupB,kBAAkB,OAAQH,IAAe,GACtF/T,EAAQF,EAAKG,WACbC,EAAOJ,EAAKK,cACZC,EAAMN,EAAKlhB,UACXiiC,EAAa9M,IAAenlB,KAAKjE,KAAKuZ,MAAM1lB,OAAS,EAE3D,IAAI0c,EAAAA,EACF,CACElS,KAAO,GAAEm3B,EAAOngB,MAAUI,KAAOF,iBACjChO,EAAGqL,EAAc7C,KAAKnS,OAASq4B,EAAkB,GAAK,IAAM,KAC5DvuB,EAAG,GACH+H,KAAM,CAAE3R,KAAM,GACdsT,UAAW3C,EAAOpQ,KAClB+T,WAAY3D,EAAOmd,YAErB3nB,KAAKkC,WACL4B,OAAOE,GAET,MAAM2tB,EAA4B,CAAC,EACnC,IAAK,MAAMntB,KAASxE,KAAK4xB,YACvBD,EAAOntB,EAAM1J,QAAU0J,EAEzB,IAAK,IAAInK,EAAQ,EAAGA,EAAQ2F,KAAKK,MAAMwxB,QAAQjiC,OAAQyK,IAAS,CAC9D,MAAMoJ,EAAI+Z,EAAAA,GAAQD,GAAKC,EAAAA,GAAQD,EAAID,EAAAA,GAAY4C,GAAK7lB,EAChD2F,KAAKyxB,kBAAkBp3B,KACzB2J,EAAQmJ,UAAY3C,EAAOmd,WAC3B3jB,EAAQif,SACNtU,EAAc7C,KAAKnS,MAAQ6jB,EAAAA,GAAQ0U,KACnCzuB,EAAI+Z,EAAAA,GAAQ0U,KACZ1U,EAAAA,GAAQ0U,KAAOlyB,KAAKyxB,kBAAkBp3B,GAASmjB,EAAAA,GAAQ0U,KACvD1U,EAAAA,GAAQ0U,KAAO7b,EAAAA,GAAU6J,EAAI1C,EAAAA,GAAQ0U,OAGzC,MAAMp3B,EAASkF,KAAKK,MAAMwxB,QAAQx3B,GAC5B83B,EAAaR,EAAO72B,GAAQwa,MAAM6P,GAClC/qB,EAAO,IAAIkS,EAAAA,EACf,CACElS,KAAO,GAAEU,KAAgC,iBAAfq3B,EAA0BA,EAAWpP,QAAQ,GAAKtB,QAC5Ene,EAAGqL,EAAc7C,KAAKnS,MACtB8J,IACA+H,KAAM,CAAE3R,KAAMwc,EAAAA,GAAU6J,EAAGhhB,MAAO,QAClCyM,WAAY2R,EAAAA,GAAY4C,EACxB/S,UAAWukB,EAAer3B,EAAQq3B,EAAe9hC,QACjDgc,UAAWC,EAAAA,GAAUC,KACrBC,aAAcC,EAAAA,GAAaG,KAE7BnM,KAAKkC,WAEH+vB,IACFjyB,KAAKyxB,kBAAkBp3B,GAASD,EAAKwS,QAAQ5I,IAE/C5J,EAAK0J,OAAOE,EACd,CACF,CAEAktB,oBAAAA,GACE,IAAIzpB,EAAMqG,OAAOyd,UACb5jB,EAAMmG,OAAO0d,UAEjB,MAAM,WAAEjiB,GAAevJ,KAAKD,MAAK,QAAAqyB,EAAAziC,UAAAC,OAJXyiC,EAAM,IAAAn/B,MAAAk/B,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAND,EAAMC,GAAA3iC,UAAA2iC,GAK5B,IAAK,MAAMlC,KAAOiC,EAChB,IAAK,IAAI7V,EAAI,EAAGsV,EAAM1B,EAAIxgC,OAAQmiC,EAAMD,GAAO,EAAGC,EAAMvV,EAAIsV,EAAMtV,EAAIsV,EAAKC,EAAMvV,IAAMA,IAAK,CAC1F,MAAMzF,EAAS/W,KAAKqD,GAAGmZ,GACnBzF,EAASxN,EAAa,GAAKwN,EAASxN,EAAavJ,KAAKrG,QAKtD8N,EAAM2oB,EAAI5T,KACZ/U,EAAM2oB,EAAI5T,IAER7U,EAAMyoB,EAAI5T,KACZ7U,EAAMyoB,EAAI5T,IAEd,CAGF,MAAO,CAAE/U,MAAKE,MAChB,CAEA8S,SAAAA,GACE,MAAMkX,EAAS3xB,KAAK4xB,YACpB,IAAI,IAAEnqB,EAAG,IAAEE,GAAQ3H,KAAKkxB,wBAAwBS,EAAO16B,KAAKs7B,GAAMA,EAAEjd,SAOpE,YAN8B,IAAnBtV,KAAKK,MAAMoH,MACpBA,EAAMzH,KAAKK,MAAMoH,UAEW,IAAnBzH,KAAKK,MAAMsH,MACpBA,EAAM3H,KAAKK,MAAMsH,KAEZ,CAAEF,MAAKE,MAChB,CAEAkb,gBAAAA,GAAoB,CAEpBlN,YAAAA,GAAgB,CAEhBic,SAAAA,GACE,OAAOY,EAAAA,EAAMC,QACVF,GACCvyB,KAAKK,MAAMwxB,QAAQ7iC,SAASujC,EAAEz3B,SAC9By3B,EAAEjrB,YAActH,KAAKjE,MAAMuL,WAC3BtH,KAAKD,MAAMqF,eAAestB,SAASH,EAAEI,SAE3C,CAEA9rB,QAAAA,GACE,MAAQ,cAAa7G,KAAKjE,KAAKjB,QACjC,EAGF,UClMA,MAAM83B,UAAkBpF,EACtB7tB,YAAc2e,EAAAA,GAAiBuU,UAC/BlzB,aAAe,OACfA,gBAAkB,gBAElByV,WAAAA,GACE,MAAM,cAAEzG,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAC3BtL,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAaoF,EAAc7C,KAAKnS,MAC9CygB,QAASzL,EAAcxC,IAAIvC,SAE7BiB,EAAUwP,KAEV,MAAMyY,EAAwB9yB,KAAK8jB,2BAEnC,IAAIzZ,EAAY,EACZyoB,GAAyB,GAC3BzoB,EAAY,EACHyoB,GAAyB,GAClCzoB,EAAY,EACHyoB,GAAyB,KAClCzoB,EAAY,GAEd,MAAM0oB,EAAgB1oB,EAAY,EAC5B2oB,EAAuBnqB,KAAK6Q,MAAMoZ,EAAwB,EAAIC,GAC9DE,EAAa5oB,EAAY,GAAM,EAAI,EAAI,GAC7CrK,KAAKgE,QAAQ/C,IAAI,YAAaoJ,IAE9B0Z,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKkC,UAAUqB,MACtBgG,WAAYvJ,KAAKuJ,WACjB5P,MAAOqG,KAAKrG,MACZqqB,gBAAiBA,CAACxH,EAAWlZ,KAC3B,MAAM4vB,KAAU5vB,EAAI,GAAK2vB,EAWzB,GATAjzB,KAAKgE,QAAQ8G,YACb9K,KAAKgE,QAAQ/C,IACX,cACAjB,KAAKjE,KAAKuZ,MAAMkH,GAAKxc,KAAKjE,KAAK8b,KAAK2E,GAAKhS,EAAOglB,cAAgBhlB,EAAO+kB,aAGzEvvB,KAAKgE,QAAQO,OAAO2uB,EAAMrqB,KAAK6Q,MAAM1Z,KAAKwD,GAAGxD,KAAKjE,KAAK+W,KAAK0J,MAC5Dxc,KAAKgE,QAAQiH,OAAOioB,EAAMrqB,KAAK6Q,MAAM1Z,KAAKwD,GAAGxD,KAAKjE,KAAKgX,IAAIyJ,MAEvDwW,GAAwB,EAAG,CAC7B,MAAMnb,EAAOhP,KAAK6Q,MAAM1Z,KAAKwD,GAAGxD,KAAKjE,KAAK8b,KAAK2E,KAC/Cxc,KAAKgE,QAAQO,OAAO2uB,EAAOH,EAAelb,EAAOob,GACjDjzB,KAAKgE,QAAQiH,OAAOioB,EAAOH,EAAgBC,EAAsBnb,EAAOob,GAExE,MAAM3d,EAAQzM,KAAK6Q,MAAM1Z,KAAKwD,GAAGxD,KAAKjE,KAAKuZ,MAAMkH,KACjDxc,KAAKgE,QAAQO,OAAO2uB,EAAOH,EAAezd,EAAQ2d,GAClDjzB,KAAKgE,QAAQiH,OAAOioB,EAAOH,EAAgBC,EAAsB1d,EAAQ2d,EAC3E,CAEAjzB,KAAKgE,QAAQkH,QAAQ,IAIzBL,EAAU6R,MACZ,CAEA7V,QAAAA,GACE,MAAQ,QAAO7G,KAAKjE,KAAKjB,QAC3B,EAGF,UC/DMy2B,EAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAW7F,MAAM4B,WAAkB3F,EACtB7tB,YAAc2e,EAAAA,GAAiB6U,UAE/BC,kBACAC,KAA6B,CAAC,EAE9BxyB,WAAAA,CAAYC,EAAiCf,GAC3CgB,MAAMD,EAAQf,GACdC,KAAK2N,WAAa3N,KAAK2N,WAAWvM,KAAKpB,MACvCA,KAAK2U,qBAAuB3U,KAAK2U,qBAAqBvT,KAAKpB,MAC3DA,KAAKwU,YAAcxU,KAAKwU,YAAYpT,KAAKpB,MACzCA,KAAKozB,kBAAoB,CAAC,CAC5B,CAEAhe,WAAAA,GACE,MAAM,cAAEzG,EAAa,eAAE+iB,GAAmB1xB,KAAKiH,yBACzC4D,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAaoF,EAAc7C,KAAKnS,MAAQ,GACtDygB,QAASzL,EAAcxC,IAAIvC,OAAS,KAEtCiB,EAAUwP,KAEVra,KAAKgE,QAAQ8G,YACb9K,KAAKgE,QAAQ/C,IAAI,YAAa,GAC9B,IAAK,IAAI5G,EAAQ,EAAGA,EAAQ2F,KAAKK,MAAMwxB,QAAQjiC,OAAQyK,IAAS,CAC9D,MAAMS,EAASkF,KAAKK,MAAMwxB,QAAQx3B,GAClC,IAA0B,MAArB2F,KAAKqzB,KAAKv4B,GAAkBkF,KAAKqzB,KAAKv4B,GAAQlL,OAAS,GAAK,EAAG,CAClEoQ,KAAKgE,QAAQ/C,IAAI,cAAeywB,EAAer3B,EAAQq3B,EAAe9hC,SACtEoQ,KAAKgE,QAAQ8G,YACb,IAAK,IAAI0R,EAAI,EAAGsV,EAAM9xB,KAAKjE,KAAKuZ,MAAM1lB,OAAQmiC,EAAMD,GAAO,EAAGC,EAAMvV,EAAIsV,EAAMtV,EAAIsV,EAAKC,EAAMvV,IAAMA,IACjGxc,KAAKgE,QAAQiH,OAAOjL,KAAKqD,GAAGmZ,GAAI3T,KAAK6Q,MAAM1Z,KAAKwD,GAAGxD,KAAKqzB,KAAKv4B,GAAQ0hB,MAEvExc,KAAKgE,QAAQkH,QACf,CACF,CAEAL,EAAU6R,MACZ,CAEA/O,UAAAA,CAAW3J,GACT,MAAM,cAAE2K,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAC3B6T,EAAS,MACb,OAAQhqB,KAAKD,MAAMyE,QAAQ8C,WACzB,IAAK,IACH,MAAO,QACT,IAAK,IACH,MAAO,SACT,IAAK,IACH,MAAO,UACT,QACE,OAEL,EAXc,GAYT7D,GAAKzD,KAAK4J,OAAS,GAAK,EAC9B,IAAI0C,EAAAA,EACF,CACElS,KAAM4vB,EACN1mB,EAAG,GACHG,EAAGkL,EAAcxC,IAAIvC,OAASnG,EAC9B2J,OAAQ,GACR5B,KAAM,CAAE3R,KAAM,GAAI6R,OAAQ,MAAOD,OAAQ,oBACzC0B,UAAW3C,EAAOsM,cAClBlL,UAAWC,EAAAA,GAAUkL,OACrBhL,aAAcC,EAAAA,GAAaC,YAE7BjM,KAAKkC,WACL4B,OAAOE,EACX,CAEAyQ,eAAAA,CAAgBzQ,EAAmCmhB,GACjD,MAAM,cAAExW,EAAa,eAAE+iB,GAAmB1xB,KAAKiH,0BACzC,OAAEuD,GAAWmE,EAAcwH,QAC3BjF,EAAOkD,EAAAA,GAAAA,sBAA4BpU,KAAKjE,KAAKupB,kBAAkB,OAAQH,IAAe,GAC5F,IAAIhU,EAAa,GACjB,MAAMC,EAAQF,EAAKG,WACbC,EAAOJ,EAAKK,cACZC,EAAMN,EAAKlhB,UACjB,OAAQgQ,KAAKjE,KAAKuL,WAChB,IAAK,IACL,IAAK,IACH6J,EAAc,GAAEogB,EAAOngB,MAAUI,IACjC,MACF,IAAK,IACHL,EAAc,GAAEogB,EAAOngB,MAAUE,IACjC,MACF,QACE,OAGJ,IAAIgiB,GAAmB,EACvB,IAAK,IAAIj5B,EAAQ,EAAGA,EAAQ2F,KAAKK,MAAMwxB,QAAQjiC,OAAQyK,IAAS,CAC9D,MAAMS,EAASkF,KAAKK,MAAMwxB,QAAQx3B,GAC5Bk5B,EAAavzB,KAAKqzB,KAAKv4B,GAC7B,GAAIy4B,GAAY3jC,OAAQ,CACtBoU,EAAQmJ,UAAY3C,EAAOmd,WAC3B3jB,EAAQif,SACNtU,EAAc7C,KAAKnS,MAAQ6jB,EAAAA,GAAQ0U,KACnC3b,EAAAA,GAAO2J,GAAK7J,EAAAA,GAAU6J,EAAIsT,EAAAA,GAAOrc,IAAM9c,EAAQmjB,EAAAA,GAAQ0U,KACvD1U,EAAAA,GAAQ0U,KAAOlyB,KAAKozB,kBAAkBt4B,GAAU0iB,EAAAA,GAAQ0U,KACxD1U,EAAAA,GAAQ0U,KAAO7b,EAAAA,GAAU6J,EAAI1C,EAAAA,GAAQ0U,MAEvC,MAAMuB,EAAU3lB,OAAOmK,SAASsb,EAAWpO,IACrCuO,EAAiBD,EAAW,GAAEF,EAAWpO,GAAYpC,QAAQ,MAAQ,GAC3EuQ,EAAmBA,GAAoBG,EACvC,IAAInnB,EAAAA,EACF,CACElS,KAAO,GAAEU,KAAU44B,IACnBpwB,EAAGqL,EAAc7C,KAAKnS,MACtB8J,EAAG8S,EAAAA,GAAO2J,GAAK7J,EAAAA,GAAU6J,EAAIsT,EAAAA,GAAOrc,IAAM9c,EAC1CmR,KAAM,CAAE3R,KAAMwc,EAAAA,GAAU6J,EAAGhhB,MAAO,QAClCiO,UAAWukB,EAAer3B,EAAQq3B,EAAe9hC,QACjDgc,UAAWC,EAAAA,GAAUC,KACrBC,aAAcC,EAAAA,GAAaG,KAE7BnM,KAAKkC,WACL4B,OAAOE,EACX,CACF,CAEIsvB,GACF,IAAIhnB,EAAAA,EACF,CACElS,KAAO,GAAE+W,iBACT7N,EAAGqL,EAAc7C,KAAKnS,MAAQ,IAC9B8J,EAAG,GACH+H,KAAM,CAAE3R,KAAM,GACdsT,UAAW3C,EAAOpQ,KAClB+T,WAAY3D,EAAOmd,YAErB3nB,KAAKkC,WACL4B,OAAOE,EAEb,CAEA2Q,oBAAAA,CAAqB3Q,GACnBjD,MAAM4T,qBAAqB3Q,GAC3B,MAAM,cAAE2K,EAAa,eAAE+iB,GAAmB1xB,KAAKiH,yBAE/C,IAAK,IAAI5M,EAAQ,EAAGA,EAAQ2F,KAAKK,MAAMwxB,QAAQjiC,OAAQyK,IAAS,CAC9D,MAAMS,EAASkF,KAAKK,MAAMwxB,QAAQx3B,GAC5Bk5B,EAAavzB,KAAKqzB,KAAKv4B,GAC7B,GAAIy4B,GAAY3jC,OAAQ,CACtB,MAAM+jC,EAAiB3zB,KAAKqzB,KAAKv4B,GAAQlL,OAAS,EAE5C8jC,EADU5lB,OAAOmK,SAASsb,EAAWI,IACT,GAAEJ,EAAWI,GAAgB5Q,QAAQ,MAAQ,GACzE3oB,EAAO,IAAIkS,EAAAA,EACf,CACElS,KAAO,GAAEU,KAAU44B,IACnBpwB,EAAGqL,EAAc7C,KAAKnS,MACtB8J,EAAG8S,EAAAA,GAAO2J,GAAK7J,EAAAA,GAAU6J,EAAIsT,EAAAA,GAAOrc,IAAM9c,EAC1CmR,KAAM,CAAE3R,KAAMwc,EAAAA,GAAU6J,EAAGhhB,MAAO,QAClCiO,UAAWukB,EAAer3B,EAAQq3B,EAAe9hC,QACjDgc,UAAWC,EAAAA,GAAUC,KACrBC,aAAcC,EAAAA,GAAaG,KAE7BnM,KAAKkC,WAEPlC,KAAKozB,kBAAoB,IAAKpzB,KAAKozB,kBAAmB,CAACt4B,GAASV,EAAKwS,QAAQ5I,IAC7E5J,EAAK0J,OAAOE,EACd,CACF,CACF,CAEAitB,QAAAA,GACEjxB,KAAKqzB,KAAO,CAAC,EACb,MAAM1B,EAAS3xB,KAAK4xB,YAEdgC,EAAW,IAAIC,KAAK7zB,KAAKK,MAAMuzB,SAAW,UAC1CE,EAAS,IAAID,KAAK7zB,KAAKK,MAAMyzB,OAAS,UACtCC,EAAiB,GACvB,IAAK,MAAMvvB,KAASmtB,EAAQ,CAC1B,MAAMqC,EAAS,GACf,IAAK,IAAIxX,EAAI,EAAGsV,EAAMttB,EAAM8Q,MAAM1lB,OAAQmiC,EAAMD,GAAO,EAAGC,EAAMvV,EAAIsV,EAAMtV,EAAIsV,EAAKC,EAAMvV,IAAMA,IAAK,CAClG,MAAMtL,EAAOkD,EAAAA,GAAAA,sBAA4B5P,EAAM0M,KAAKsL,IAChDoX,GAAY1iB,GAAQA,GAAQ4iB,GAC9BE,EAAOpuB,KAAKpB,EAAM8Q,MAAMkH,GAE5B,CACAuX,EAAenuB,KAAK,CAAE9K,OAAQ0J,EAAM1J,OAAQwa,MAAO0e,GACrD,CAEA,MAAMC,EAAYjZ,EAAAA,IAAO+Y,GAAiBxB,GAAMA,EAAEjd,MAAM1lB,UAAW,EACnE,IAAK,MAAM4U,KAASuvB,EAAgB,CAClC/zB,KAAKqzB,KAAK7uB,EAAM1J,QAAU,GAC1B,MAAMoD,EAAQsG,EAAM8Q,MAAM,GAC1B,IAAInG,EAAS,EACb,GAAI8kB,EAAYzvB,EAAM8Q,MAAM1lB,OAAQ,CAClCuf,EAAS8kB,EAAYzvB,EAAM8Q,MAAM1lB,OACjC,IAAK,IAAI4sB,EAAI,EAAG0X,EAAO/kB,EAAQglB,EAAOD,GAAQ,EAAGC,EAAO3X,EAAI0X,EAAO1X,EAAI0X,EAAMC,EAAO3X,IAAMA,IACxFxc,KAAKqzB,KAAK7uB,EAAM1J,QAAQ0hB,GAAKiF,GAEjC,CACA,IAAK,IAAIjF,EAAI,EAAG4X,EAAO5vB,EAAM8Q,MAAM1lB,OAAQykC,EAAOD,GAAQ,EAAGC,EAAO7X,EAAI4X,EAAO5X,EAAI4X,EAAMC,EAAO7X,IAAMA,IACpGxc,KAAKqzB,KAAK7uB,EAAM1J,QAAQqU,EAASqN,GAAuB,IAAjBhY,EAAM8Q,MAAMkH,GAAYte,EAAQ,GAE3E,CACA,MAAM,IAAEuJ,EAAG,IAAEE,GAAQ3H,KAAKkxB,wBAAwB5uB,OAAOC,KAAKvC,KAAKqzB,MAAMp8B,KAAKqM,GAAMtD,KAAKqzB,KAAK/vB,MAC9F,MAAO,CAAEmE,MAAKE,MAChB,CAGAupB,oBAAAA,GACE,IAAIzpB,EAAMqG,OAAOyd,UACb5jB,EAAMmG,OAAO0d,UAEjB,MAAM,WAAEjiB,GAAevJ,KAAKD,MAAK,QAAAqyB,EAAAziC,UAAAC,OAJXyiC,EAAM,IAAAn/B,MAAAk/B,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAND,EAAMC,GAAA3iC,UAAA2iC,GAK5B,IAAK,MAAMlC,KAAOiC,EAChB,IAAK,IAAI7V,EAAI,EAAGsV,EAAM1B,EAAIxgC,OAAQmiC,EAAMD,GAAO,EAAGC,EAAMvV,EAAIsV,EAAMtV,EAAIsV,EAAKC,EAAMvV,IAAMA,IAAK,CAC1F,MAAMzF,EAAS/W,KAAKqD,GAAGmZ,GACnBzF,EAASxN,EAAa,GAAKwN,EAASxN,EAAavJ,KAAKrG,QAKtD8N,EAAM2oB,EAAI5T,KACZ/U,EAAM2oB,EAAI5T,IAER7U,EAAMyoB,EAAI5T,KACZ7U,EAAMyoB,EAAI5T,IAEd,CAGF,MAAO,CAAE/U,MAAKE,MAChB,CAEA6M,WAAAA,CAAYxQ,GACV,MAAM,cAAE2K,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAC3BtL,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,UACAmW,QAASxL,EAAc7C,KAAKnS,MAC5BygB,QAASzL,EAAcxC,IAAIvC,SAE7BiB,EAAUwP,KACV,MAAMc,EAAQnb,KAAKkC,UAAUqB,MAAME,EAAE0X,MAAM,IACrCgW,EAAQnxB,KAAKsc,WACbliB,EAAO,IAAIkS,EAAAA,EACf,CACEhJ,EAAGtD,KAAKrG,MAAQ,EAChB6R,KAAM,CAAE3R,KAAM,GACdsT,UAAW3C,EAAOpQ,KAClB2R,aAAcC,EAAAA,GAAaoQ,QAE7Bpc,KAAKkC,WAEP,IAAK,MAAMkZ,KAAQD,EAAO,CACxB,MAAM1X,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAG4X,IAC7B+V,EAAMlwB,IAAI,CAAEiJ,GAAIzG,EAAG2G,GAAI3G,IAAKK,OAAOE,GACnC5J,EAAK6G,IAAI,CAAE7G,KAAMghB,EAAK2H,QAAQ,GAAItf,MAAKK,OAAOE,EAChD,CACA6G,EAAU6R,MACZ,CAEA1G,WAAAA,GACE,MAAM,cAAErH,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,QAC3BtL,GAAYqP,EAAAA,EAAAA,IAAa,CAC7BlW,QAAShE,KAAKgE,QACdmW,QAASna,KAAKuJ,WAAaoF,EAAc7C,KAAKnS,MAC9CygB,QAASzL,EAAcxC,IAAIvC,SAE7BiB,EAAUwP,KACV,MAAMjgB,EAAO,IAAIkS,EAAAA,EACf,CACE7I,EAAGzD,KAAK4J,OAAS,GACjB4B,KAAM,CAAE3R,KAAM,GACdsT,UAAW3C,EAAOpQ,KAClB2R,aAAcC,EAAAA,GAAaK,OAC3BT,UAAWC,EAAAA,GAAUkL,QAEvB/W,KAAKkC,WAEDqd,EAAYnlB,EAAK6G,IAAI,CAAE7G,KAAM,SAAUwS,QAAQ5M,KAAKgE,SAE1D,IAAIkN,EAAO,IAAI2iB,KAAyB,IAApB7zB,KAAKjE,KAAKmV,KAAK,IAC/B8Q,EAAY9Q,EAAKG,WAAa,IAAMH,EAAKK,cAEzC+iB,EAAe,EACnBt0B,KAAKjE,KAAKmV,KAAKvN,SAAQ,CAAC8O,EAAGpY,KACzB,GAAIA,EAAQ,EACV,OAGF,MAAM6W,EAAO,IAAI2iB,KAAS,IAAJphB,GAChBrB,EAAQF,EAAKG,WAAa,IAAMH,EAAKK,cACvCH,IAAU4Q,GACZsS,IAEFtS,EAAY5Q,CAAK,IAGnB,MAAMmjB,KAAwBv0B,KAAKrG,MAAQ4lB,GACrCiV,EAAgBF,EAAeC,EACrC,IAAIE,EAEFA,EADED,GAAiB,EACLC,KAAM,EACXD,GAAiB,EACXlxB,GAAcA,EAAI,GAAM,EAC9BkxB,GAAiB,EACXlxB,GAAcA,EAAI,GAAM,EAC9BkxB,GAAiB,EACXlxB,GAAcA,EAAI,GAAM,EAC9BkxB,GAAiB,EACXlxB,GAAcA,EAAI,GAAM,EAExBA,GAAoB,IAANA,EAG/B4N,EAAO,IAAI2iB,KAAyB,IAApB7zB,KAAKjE,KAAKmV,KAAK,IAC/B8Q,EAAY9Q,EAAKG,WAAa,IAAMH,EAAKK,cAEzC,MAAMkP,EAAQzgB,KAAK0gB,WAEnB,IAAK,IAAIlE,EAAI,EAAGA,EAAIxc,KAAKjE,KAAKmV,KAAKthB,OAAQ4sB,IAAK,CAC9CtL,EAAO,IAAI2iB,KAAyB,IAApB7zB,KAAKjE,KAAKmV,KAAKsL,IAC/B,MAAMpL,EAAQF,EAAKG,WAAa,IAAMH,EAAKK,cAC3C,GAAIH,IAAU4Q,EAAW,CACvBA,EAAY5Q,EACZ,MAAM9N,EAAItD,KAAKqD,GAAGmZ,GAClB,GAAIlZ,EAAItD,KAAKuJ,YAAc,IAAMjG,EAAItD,KAAKuJ,WAAavJ,KAAKrG,MAAQ,GAElE,SAIF,GAFA8mB,EAAMxf,IAAI,CAAEgJ,GAAI3G,EAAG6G,GAAI7G,IAAKQ,OAAO9D,KAAKgE,UAEnCywB,EAAYvjB,EAAKG,YACpB,SAGFjX,EACG6G,IAAI,CACH7G,KAA0B,IAApB8W,EAAKG,WAAmBH,EAAKK,cAAc1K,WAAa0qB,EAAOrgB,EAAKG,YAC1E/N,EAAGA,IAEJQ,OAAO9D,KAAKgE,QACjB,CACF,CAEA6G,EAAU6R,MACZ,CAEAjC,SAAAA,GACE,OAAOza,KAAKixB,UACd,CAEApO,gBAAAA,GAAoB,CAEpBlN,YAAAA,GAAgB,CAEhBic,SAAAA,GACE,OAAOY,EAAAA,EAAMC,QACVF,GACCvyB,KAAKK,MAAMwxB,QAAQ7iC,SAASujC,EAAEz3B,SAC9By3B,EAAEjrB,YAActH,KAAKjE,MAAMuL,WAC3BtH,KAAKD,MAAMqF,eAAestB,SAASH,EAAEI,SAE3C,CAEA9rB,QAAAA,GACE,MAAQ,cAAa7G,KAAKjE,KAAKjB,QACjC,EAGF,YC1Xa45B,GAAepyB,OAAOqyB,OAAO,CACxC,CAACrW,EAAAA,GAAiBiP,aAAcqH,EAChC,CAACtW,EAAAA,GAAiBoR,YAAamF,EAC/B,CAACvW,EAAAA,GAAiB+P,mBAAoByG,EACtC,CAACxW,EAAAA,GAAiBC,WAAYwW,EAC9B,CAACzW,EAAAA,GAAiBP,iBAAkBiX,EACpC,CAAC1W,EAAAA,GAAiBkT,gBAAiByD,EACnC,CAAC3W,EAAAA,GAAiBuU,WAAYqC,EAC9B,CAAC5W,EAAAA,GAAiB6U,WAAYgC,I,kcClBzB,MAAM9e,EAAY,CACvBC,IAAK,EACLa,GAAI,EACJoG,EAAG,EACH2C,EAAG,GACHlJ,EAAG,GACH0S,IAAK,GACL0L,KAAM,IAEK9X,EAAc,CACzBnG,GAAI,EACJoG,EAAG,EACH2C,EAAG,IAEQ1C,EAAU,CACrB0U,KAAM,EACN5b,IAAK,EACLa,GAAI,EACJoG,EAAG,GAEQiW,EAAS,CACpBrc,GAAI,GAEOsS,EAAe,CAC1BlM,EAAG,GACH2C,EAAG,GACHlJ,EAAG,GACHqe,GAAI,GACJ3L,IAAK,IAEM4L,EAAkB,GAClBC,EAAiC,GACjChf,EAAS,CACpBD,IAAK,EACLa,GAAI,EACJoG,EAAG,EACH2C,EAAG,EACHwJ,IAAK,IAEMlX,EAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAE7F,IAAKgjB,EAAe,SAAfA,GAAe,OAAfA,EAAe,kBAAfA,EAAe,cAAfA,EAAe,cAAfA,EAAe,oBAAfA,EAAe,sBAAfA,CAAe,MAQfC,EAAU,SAAVA,GAAU,OAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,EAAU,eAAVA,CAAU,MAYV71B,EAAiB,SAAjBA,GAAiB,OAAjBA,EAAiB,yBAAjBA,EAAiB,qBAAjBA,EAAiB,gCAAjBA,EAAiB,qBAAjBA,EAAiB,yBAAjBA,EAAiB,sDAAjBA,EAAiB,wCAAjBA,EAAiB,mBAAjBA,EAAiB,yBAAjBA,EAAiB,4CAAjBA,EAAiB,yBAAjBA,EAAiB,2BAAjBA,EAAiB,6BAAjBA,EAAiB,4CAAjBA,EAAiB,gCAAjBA,EAAiB,gCAAjBA,EAAiB,uBAAjBA,EAAiB,mBAAjBA,EAAiB,2BAAjBA,EAAiB,oCAAjBA,EAAiB,qBAAjBA,EAAiB,sCAAjBA,EAAiB,kDAAjBA,EAAiB,sCAAjBA,EAAiB,mEAAjBA,CAAiB,MA4BjB0e,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,kCAAhBA,EAAgB,gCAAhBA,EAAgB,+CAAhBA,EAAgB,8BAAhBA,EAAgB,8BAAhBA,EAAgB,0CAAhBA,EAAgB,yCAAhBA,EAAgB,8BAAhBA,CAAgB,MAWhBkE,EAAa,SAAbA,GAAa,OAAbA,EAAa,iCAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,2BAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,mBAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,yBAAbA,EAAa,yBAAbA,EAAa,yBAAbA,EAAa,uBAAbA,EAAa,qBAAbA,EAAa,qBAAbA,EAAa,mBAAbA,CAAa,MA4BbkT,EAAW,SAAXA,GAAW,OAAXA,EAAW,2BAAXA,EAAW,qBAAXA,EAAW,iBAAXA,EAAW,mBAAXA,EAAW,mBAAXA,EAAW,qBAAXA,EAAW,qBAAXA,EAAW,uBAAXA,EAAW,iBAAXA,EAAW,mBAAXA,EAAW,mBAAXA,EAAW,6BAAXA,EAAW,iBAAXA,EAAW,mBAAXA,EAAW,mBAAXA,EAAW,qBAAXA,EAAW,mBAAXA,EAAW,iBAAXA,EAAW,qBAAXA,CAAW,MAsBXC,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,iCAAhBA,EAAgB,yBAAhBA,EAAgB,+BAAhBA,CAAgB,MAMhBC,EAAc,SAAdA,GAAc,OAAdA,EAAc,mCAAdA,EAAc,iCAAdA,EAAc,yBAAdA,EAAc,+BAAdA,CAAc,MAOdC,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,iCAAnBA,EAAmB,yBAAnBA,EAAmB,uCAAnBA,EAAmB,+CAAnBA,EAAmB,6CAAnBA,EAAmB,2CAAnBA,CAAmB,MASxB,MAAMC,EAAwD,CACnE,CAACD,EAAoBE,WAAY,YACjC,CAACF,EAAoBG,OAAQ,QAC7B,CAACH,EAAoBI,kBAAmB,qBACxC,CAACJ,EAAoBK,kBAAmB,qBACxC,CAACL,EAAoBM,iBAAkB,qBACvC,CAACN,EAAoBO,gBAAiB,sBAU3BC,EAA0C,CACrD,OAAQ,CAAEC,QAAS,EAAGC,KAAM,EAAG1pB,MAAO,GACtC,OAAQ,CAAEypB,QAAS,EAAGC,KAAM,EAAG1pB,MAAO,GACtC,OAAQ,CAAEypB,QAAS,EAAGC,KAAM,EAAG1pB,MAAO,GACtC,OAAQ,CAAEypB,QAAS,EAAGC,KAAM,EAAG1pB,MAAO,GACtC,OAAQ,CAAEypB,QAAS,EAAGC,KAAM,EAAG1pB,MAAO,GACtC,OAAQ,CAAEypB,QAAS,EAAGC,KAAM,EAAG1pB,MAAO,GACtC,OAAQ,CAAEypB,QAAS,EAAGC,KAAM,EAAG1pB,MAAO,GACtC,OAAQ,CACNypB,QAAS,EACTC,KAAM,EACN1pB,MAAO,EACP2pB,UAAW,CAAC,gBAAiB,gBAAiB,kBAEhD,OAAQ,CACNF,QAAS,EACTC,KAAM,EACN1pB,MAAO,EACP2pB,UAAW,CAAC,gBAAiB,gBAAiB,mBAIrCC,EAAiB,CAC5BC,IAAK,MACLC,KAAM,QAQD,IAAKllB,EAAS,SAATA,GAAS,OAATA,EAAS,QAATA,EAAS,QAATA,EAAS,QAATA,EAAS,QAATA,EAAS,UAATA,EAAS,UAATA,EAAS,UAATA,EAAS,MAATA,EAAS,QAATA,EAAS,QAATA,EAAS,MAATA,EAAS,MAATA,EAAS,MAATA,CAAS,MAkBd,MAAMiZ,EAA6B,CAACjZ,EAAUC,GAAID,EAAUE,GAAIF,EAAUG,GAAIH,EAAUI,IAElFsO,EAA4B,CACvC,CAAC1O,EAAUC,IAAK,EAChB,CAACD,EAAUE,IAAK,EAChB,CAACF,EAAUG,IAAK,EAChB,CAACH,EAAUI,IAAK,EAChB,CAACJ,EAAUK,KAAM,GACjB,CAACL,EAAUM,KAAM,GACjB,CAACN,EAAUO,KAAM,GACjB,CAACP,EAAUQ,GAAI,GACf,CAACR,EAAUS,IAAK,IAChB,CAACT,EAAUU,IAAK,KAGX,IAAKykB,EAAa,SAAbA,GAAa,OAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,UAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,UAAbA,CAAa,MAalB,MAAMC,EAAoB,CAC/B,CAACplB,EAAUC,IAAK,GAChB,CAACD,EAAUE,IAAK,IAChB,CAACF,EAAUG,IAAK,IAChB,CAACH,EAAUI,IAAK,IAChB,CAACJ,EAAUK,KAAM,IACjB,CAACL,EAAUM,KAAM,IACjB,CAACN,EAAUO,KAAM,KACjB,CAACP,EAAUQ,GAAI,KACf,CAACR,EAAUS,IAAK,KAChB,CAACT,EAAUU,IAAK,MAChB,CAACV,EAAUgB,GAAI,MACf,CAAChB,EAAUiB,GAAI,OACf,CAACjB,EAAUX,GAAI,QAGJgmB,EAAU,CACrBC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,UAGH,IAAK3gB,EAA0B,SAA1BA,GAA0B,OAA1BA,EAA0B,kBAA1BA,EAA0B,sBAA1BA,EAA0B,sBAA1BA,EAA0B,sBAA1BA,EAA0B,wBAA1BA,EAA0B,sBAA1BA,EAA0B,sBAA1BA,EAA0B,0BAA1BA,EAA0B,wBAA1BA,CAA0B,MAY1BpL,EAAS,SAATA,GAAS,OAATA,EAAS,YAATA,EAAS,cAATA,EAAS,gBAATA,EAAS,cAATA,EAAS,UAATA,CAAS,MAQTG,EAAY,SAAZA,GAAY,OAAZA,EAAY,UAAZA,EAAY,2BAAZA,EAAY,gBAAZA,EAAY,wBAAZA,EAAY,mCAAZA,EAAY,gBAAZA,CAAY,MASZwN,EAAS,SAATA,GAAS,OAATA,EAAS,gBAATA,EAAS,wBAATA,EAAS,0BAATA,CAAS,MAMTqe,EAAwB,SAAxBA,GAAwB,OAAxBA,EAAAA,EAAwB,uBAAxBA,EAAAA,EAAwB,kBAAxBA,EAAAA,EAAwB,mBAAxBA,EAAAA,EAAwB,6CAAxBA,CAAwB,MAO7B,MAAMC,EAA8B,GAE9BC,EAAa,CACxB,CAACve,EAAUwe,QAAS,SACpB,CAACxe,EAAUC,YAAa,aACxB,CAACD,EAAU8B,aAAc,eAGd2c,EAAsB,CACjCxzB,MAAO,IACPyzB,UAAW,KAGAC,EAAyB,GAEzBC,EAAsB,IAEtBC,EAA+B,IAE/BC,EAAmB,CAAC,KAAM,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,OAE/DzhB,EAAqBvP,IAChC,OAAQA,GACN,KAAKmK,EAAUC,GACb,MAAO,QACT,KAAKD,EAAUE,GACb,MAAO,QACT,KAAKF,EAAUG,GACb,MAAO,QACT,KAAKH,EAAUI,GACb,MAAO,QACT,KAAKJ,EAAUK,IACb,MAAO,SACT,KAAKL,EAAUM,IACb,MAAO,SACT,KAAKN,EAAUO,IACb,MAAO,SACT,KAAKP,EAAUQ,EACb,MAAO,OACT,KAAKR,EAAUS,GACb,MAAO,OACT,KAAKT,EAAUU,GACb,MAAO,OACT,KAAKV,EAAUgB,EACb,MAAO,QACT,KAAKhB,EAAUiB,EACb,MAAO,SACT,KAAKjB,EAAUX,EACb,MAAO,UACT,QACE,MAAO,GACX,EAoBK,IAAKynB,EAAwB,SAAxBA,GAAwB,OAAxBA,EAAwB,MAAxBA,EAAwB,MAAxBA,EAAwB,QAAxBA,EAAwB,QAAxBA,EAAwB,QAAxBA,EAAwB,MAAxBA,EAAwB,MAAxBA,CAAwB,MAYxBvwB,EAAc,SAAdA,GAAc,OAAdA,EAAc,kBAAdA,EAAc,cAAdA,EAAc,YAAdA,EAAc,cAAdA,EAAc,gBAAdA,CAAc,MASnB,MAAMX,EAAsB,CACjC,CAACoK,EAAUC,IAAK,CACdvK,MAAO,EACPC,MAAOY,EAAewwB,SAExB,CAAC/mB,EAAUE,IAAK,CACdxK,MAAO,EACPC,MAAOY,EAAewwB,SAExB,CAAC/mB,EAAUG,IAAK,CACdzK,MAAO,EACPC,MAAOY,EAAewwB,SAExB,CAAC/mB,EAAUI,IAAK,CACd1K,MAAO,EACPC,MAAOY,EAAewwB,SAExB,CAAC/mB,EAAUK,KAAM,CACf3K,MAAO,GACPC,MAAOY,EAAewwB,SAExB,CAAC/mB,EAAUM,KAAM,CACf5K,MAAO,GACPC,MAAOY,EAAewwB,SAExB,CAAC/mB,EAAUO,KAAM,CACf7K,MAAO,GACPC,MAAOY,EAAewwB,SAExB,CAAC/mB,EAAUQ,GAAI,CACb9K,MAAO,EACPC,MAAOY,EAAe0Z,OAExB,CAACjQ,EAAUS,IAAK,CACd/K,MAAO,EACPC,MAAOY,EAAe0Z,OAExB,CAACjQ,EAAUU,IAAK,CACdhL,MAAO,EACPC,MAAOY,EAAe0Z,OAExB,CAACjQ,EAAUgB,GAAI,CACbtL,MAAO,EACPC,MAAOY,EAAeywB,MAExB,CAAChnB,EAAUiB,GAAI,CACbvL,MAAO,EACPC,MAAOY,EAAe0wB,OAExB,CAACjnB,EAAUX,GAAI,CACb3J,MAAO,EACPC,MAAOY,EAAeupB,SAIboH,EAAuBr2B,OAAOC,KAAK8E,GAAqC7E,QACnF,CAACo2B,EAAMC,KAAS,IACXD,EACH,CAACvxB,EAAoBwxB,GAAMzxB,OAAQwxB,EAAKvxB,EAAoBwxB,GAAMzxB,OAC9D,IAAIwxB,EAAKvxB,EAAoBwxB,GAAMzxB,OAAQC,EAAoBwxB,GAAM1xB,OACrE,CAACE,EAAoBwxB,GAAM1xB,UAEjC,CAAC,GAYI,IAAKgB,EAAe,SAAfA,GAAe,OAAfA,EAAAA,EAAe,qCAAfA,EAAAA,EAAe,qCAAfA,EAAAA,EAAe,6BAAfA,EAAAA,EAAe,aAAfA,CAAe,MAOpB,MAAM2wB,EAAoB,kBAGpBC,EAA8B,G,4TC3fpC,IAAKC,EAAyB,SAAzBA,GAAyB,OAAzBA,EAAyB,cAAzBA,EAAyB,YAAzBA,CAAyB,MAK9B,MACMC,EAA6B,IAInC,SAASC,EAAmBnN,GACjC,OAAOA,EAAU7d,MAAM+qB,EACzB,CCyBO,MAAME,EAAuBzqC,IAA6D,IAA5D,MAAE0qC,EAAK,IAAEtH,EAAG,MAAEttB,EAAK,UAAEunB,GAAkCr9B,EAC1F,MAAM2qC,EAAaD,EAAQA,EAAME,UAAY,IAAO,EAC9CC,EAAWzH,EAAIwH,UAAY,IAE3BE,EAAqBh1B,EAAM0M,KAAKthB,OAAS,EAC/C,IAAI6pC,EAAsBD,EACtBE,EAAmB,EACvB,GACE,CAAC9C,EAAAA,GAAc+C,GAAI/C,EAAAA,GAAcgD,IAAI5qC,SAAS+8B,IAC9CvnB,EAAMtL,aAAeC,EAAAA,GAAWC,MAEhCsgC,EAAmBl1B,EAAM2c,sBACpB,CACL,IAAI0Y,GAAwB,EAY5B,GAXAJ,GAAuB,EACvBj1B,EAAM0M,KAAKvN,SAAQ,CAACm2B,EAAWz/B,KAZLy/B,IAAsBA,GAAaT,GAAcS,GAAaP,EAalFQ,CAAmBD,MACS,IAA1BD,IACFA,EAAuBx/B,GAEzBo/B,EAAsBp/B,EACxB,IAEFq/B,EAAmBD,EAAsBI,EAAuB,GAElC,IAA1BA,IAAwD,IAAzBJ,EACjC,MAAO,CAAEC,iBAAkB,EAAGM,gBAAiB,EAEnD,CAEA,MAAO,CAAEN,mBAAkBM,gBAAiBR,EAAqBC,EAAqB,EAG3EQ,EAA4BvhC,IAON,IAPO,kBACxCwhC,EAAiB,MACjBd,EAAK,IACLtH,EAAG,MACHttB,EAAK,WACL21B,EAAU,kBACVC,GAC4B1hC,EAC5B,MAAM,iBAAEghC,EAAgB,gBAAEM,GAAoBb,EAAqB,CACjEC,QACAtH,MACAttB,QACAunB,UAAWoO,EAAWpO,YAExB,GAAyB,IAArB2N,EACF,MAAO,CAAE7Y,WAAYsZ,EAAWtZ,WAAYtX,WAAY4wB,EAAW5wB,YAGrE,MAAMuX,EAAcqZ,EAAW/0B,eACzByb,GAAawZ,EAAAA,EAAAA,IAA8B,CAC/CvZ,cACAoZ,oBACAR,iBAAkBU,GAAqBV,IAEnC/Y,GAAWC,EAAAA,EAAAA,IAAsB,CAAEE,cAAaD,eAUtD,MAAO,CAAEA,aAAYtX,WARnB+wB,EAAc,CACZ91B,QACA21B,aACA3lC,OAAQ,CAAC,EACTmsB,WACA4Z,mBAAoBH,IAEtBJ,EAAkBrZ,EACa,EAGtB6Z,EAAwBxa,IAAmD,IAAlD,UAAE+L,EAAS,MAAEvnB,GAAgCwb,EACjF,MAAMya,EAAcj2B,EAAMk2B,iBACpBjjB,GAAWkjB,EAAAA,EAAAA,IAAsBn2B,EAAM0M,KAAK1M,EAAM0M,KAAKthB,OAAS,IAEtE,GAAIm8B,EAAU/8B,SAASiqC,GAA6B,CAClD,MAAMtiB,EDlGH,SAAqCjoB,GAAqE,IAApE,UAAEq9B,EAAS,WAAE6O,GAAqDlsC,EAC7G,MAAOmsC,EAAiBC,GAAkB5B,EAAmBnN,GAE7D,GAAI8O,IAAoB7B,EAA0B+B,MAAO,CACvD,MAAOC,EAAgBC,GAAgBH,EAAev0B,QAAQ,KAAM,KAAK2H,MAXzC,KAY1BgtB,EAAWF,EAAiB,IAAInH,KAAKmH,GAAkB,KACvDG,EAASF,EAAe,IAAIpH,KAAKoH,GAAgB,KACvD,MAAO,CACL7B,MAAO8B,IAAaptB,OAAOzE,MAAM6xB,EAAS5B,WAAa4B,EAAW,KAClEpJ,IAAKqJ,IAAWrtB,OAAOzE,MAAM8xB,EAAO7B,WAAa8B,EAAAA,EAAiBD,GAAU,KAEhF,CAEA,GAAIN,IAAoB7B,EAA0BqC,KAAM,CACtD,MAAOC,EAAO/J,EAAQkH,GAAQqC,EAAe5sB,MApBb,KAoBgDjX,IAAI6W,QAEpF,MAAI,CAACwtB,EAAO/J,EAAQkH,GAAM1Y,KAAKjS,OAAOzE,OAC7B,CAAE+vB,MAAO,KAAMtH,IAAK,MAGtB,CACLsH,MAAOgC,EAAAA,EAAmBA,EAAAA,EAAYR,EAAY,CAAEU,QAAO/J,SAAQkH,KAAMA,EAAO,KAChF3G,IAAK8I,EAET,CAEA,MAAO,CAAExB,MAAO,KAAMtH,IAAK8I,EAC7B,CCuEkBW,CAA6B,CAAExP,YAAW6O,WAAYnjB,IAC9Dqa,GAAM0J,EAAAA,EAAAA,IACV7kB,EAAMmb,KAAOnb,EAAMmb,IAAIwH,WAAa7hB,EAAS6hB,UAAY3iB,EAAMmb,IAAMra,GACrE,GAEF,MAAO,CACL2hB,MAAOziB,EAAMyiB,QAASoC,EAAAA,EAAAA,IAAqB7kB,EAAMyiB,OAAO,GACxDtH,MAEJ,CAEA,IAAIsH,EAEJ,OAAQrN,GACN,KAAK6K,EAAAA,GAAc+C,GACjBliB,EAASgkB,SAAS,GAAI,GAAI,GAAI,KAC9BrC,EAA+B,IAAvBqB,EAAY7qC,OAAe6nB,EAAWgjB,EAAYA,EAAY7qC,OAAS,GAC/E,MACF,KAAKgnC,EAAAA,GAAcgD,GACjBniB,EAASgkB,SAAS,GAAI,GAAI,GAAI,KAC9B,MAAMC,EAAwC,IAAvBjB,EAAY7qC,QAAgB,EAAIiZ,KAAKlB,IAAI8yB,EAAY7qC,OAAS,EAAG,GACxFwpC,GAA4B,IAApBsC,EAAwBjkB,EAAWgjB,EAAYiB,GACvD,MACF,KAAK9E,EAAAA,GAAc+E,GACjBvC,EAAQgC,EAAAA,EAAkB3jB,EAAU,GACpC,MACF,KAAKmf,EAAAA,GAAcgF,GACjBxC,EAAQgC,EAAAA,EAAkB3jB,EAAU,GACpC,MACF,KAAKmf,EAAAA,GAAciF,GACjBzC,EAAQgC,EAAAA,EAAkB3jB,EAAU,GACpC,MACF,KAAKmf,EAAAA,GAAckF,IACjB1C,EAAQgC,EAAAA,EAAoB3jB,GAC5B,MACF,KAAKmf,EAAAA,GAAc1sB,GACjBkvB,EAAQgC,EAAAA,EAAiB3jB,EAAU,GACnC,MACF,KAAKmf,EAAAA,GAAcxsB,GACjBgvB,EAAQgC,EAAAA,EAAiB3jB,EAAU,GACnC,MACF,KAAKmf,EAAAA,GAAcmF,GACjB3C,EAAQgC,EAAAA,EAAiB3jB,EAAU,GACnC,MACF,KAAKmf,EAAAA,GAAcjvB,IACnB,QACEyxB,EAAQ,KAIZ,MAAO,CAAEA,MAAOA,IAASoC,EAAAA,EAAAA,IAAqBpC,GAAO,GAAQtH,KAAK0J,EAAAA,EAAAA,IAAqB/jB,GAAU,GAAQ,EAa9FukB,EAAsBzoB,IAU7B,IAV8B,cAClC0oB,EAAa,WACb9B,EAAU,SACVxZ,GAAWC,EAAAA,EAAAA,IAAsB,CAAEC,WAAYsZ,EAAWtZ,WAAYC,YAAaqZ,EAAW/0B,iBAAiB,SAC/Gyc,GAMDtO,EACC,MAAM,cAAE5E,GAAkBwrB,EAAWlzB,yBAC/BtN,EAAQwgC,EAAWxgC,MAAQgV,EAAc7C,KAAKnS,MAAQgV,EAAcvC,MAAMzS,MAC1EuiC,EAAkBrzB,KAAK0R,MAAM5gB,EAAQgnB,GAE3C,QAASwb,EAAAA,GAAM10B,IAAIkZ,EAAW,EAAGwb,EAAAA,GAAMx0B,IAAIs0B,EAAetiC,GAD9CU,EACyDwnB,EAAWqa,EADlD7hC,EAAQsmB,KAA1BtmB,KACsF,EAqB7F,SAAS+hC,EAAsB9iB,GAYnC,IAZoC,iBACrC+iB,EAAgB,mBAChBC,EAAkB,aAClBC,EAAY,eACZC,EAAc,SACdp9B,GAODka,EACC,MAAMmjB,EA/BD,SAA0BllB,GAU9B,IAV+B,eAChCilB,EAAc,aACdD,EAAY,iBACZF,EAAgB,mBAChBC,GAMD/kB,EACC,MAEMmlB,EAA8E,IAAvD,KAFAH,EAAexD,EAAAA,GAA8B,IAC3CyD,EAAiBzD,EAAAA,GAA8B,IAG9E,OAAOtP,EAAAA,GAAazS,EAAIyS,EAAAA,GAAaC,IAAOgT,EAAsBL,EAAoBC,CACxF,CAeyBK,CAAkB,CAAEJ,eAAcC,iBAAgBF,qBAAoBD,qBAGvFO,EADuD,GAA9B7D,EAAAA,GACcsD,EAAoBC,EAE3DO,EACJL,GAAkBD,GAAgBn9B,GAFPq9B,EAAiBG,GAE0Bx9B,EAAWq9B,EAEnF,MAAO,CACLA,iBACAG,WAAYC,EAAkBD,EAAa,EAC3CE,qBAAsBD,EAAkBJ,EAAiBG,EAAaH,EACtEM,iBAXuB,GAa3B,CAEO,MAAMzC,EAAgBpd,IAQH,IARI,MAC5B1Y,EAAK,WACL21B,EAAU,OACV3lC,EAAM,SACNmsB,GAAWC,EAAAA,EAAAA,IAAsB,CAAEC,WAAYsZ,EAAWtZ,WAAYC,YAAaqZ,EAAW/0B,iBAAiB,SAC/Gyc,EAAWmb,EAAYx4B,GAAM,mBAC7B+1B,EAAkB,6BAClB0C,GAA+B,GACZ/f,EACnB,MAAM,cAAEvO,GAAkBwrB,EAAWlzB,yBAC/BtN,EAAQwgC,EAAWxgC,MAAQgV,EAAc7C,KAAKnS,MAAQgV,EAAcvC,MAAMzS,MAC1Ega,EAA6BwmB,EAAW/0B,eAAeuO,2BAC7D,GAAInf,GAAQ0oC,QACV,OAAO,EAET,GAAIhnB,EAAqBvC,GACvB,OAAOgN,EAET,MAAMtd,EAAMhJ,GAAkBA,EAAQsmB,EACtC,IAAIpX,EAAa5P,EAAQ0J,EAAGwe,GAAYhZ,KAAK6Q,MAAMiH,EAAW,GAE9D,GADApX,EAAaV,KAAK6Q,MAAMyiB,EAAAA,GAAM10B,IAAIkZ,EAAW,EAAGwb,EAAAA,GAAMx0B,IAAI4B,EAAY5P,EAAQ0J,EAAGwe,EAAW,OAE1Fob,GACAE,EAAsB,CACpB34B,QACA+1B,qBACA5mB,6BACAoY,UAAWoO,EAAWpO,YAExB,CACA,IAAIqR,EAAqB,EACrB7C,EACF6C,EAAqBv0B,KAAK0X,KAAKga,EAAqB/1B,EAAMsd,gBAC9B,KAAnBtd,EAAMjS,UAAmB4nC,EAAWpO,YAAc6K,EAAAA,GAAcgD,GACzEwD,EAAqB,EACO,KAAnB54B,EAAMjS,SACf6qC,EAAqB,EACO,KAAnB54B,EAAMjS,SACf6qC,EAAqB,GACO,KAAnB54B,EAAMjS,SACf6qC,EAAqB,GACO,MAAnB54B,EAAMjS,SACf6qC,EAAqB,GACO,MAAnB54B,EAAMjS,SACf6qC,EAAqB,GACZ54B,EAAMjS,SAAW,MAC1B6qC,EAAsB54B,EAAMjS,SAAW,GAAM,IAE/C,MAAM,WAAEqqC,EAAU,iBAAEG,GAAqBX,EAAuB,CAC9DG,aAAc/3B,EAAM64B,UACpBb,eAAgBh4B,EAAM84B,YACtBhB,mBAAoB3b,EACpB0b,iBAAkB73B,EAAMjS,SACxB6M,SAAU+6B,EAAWxgC,QAKvB,GAHsByjC,EAAqB54B,EAAMsd,eAAkBnB,EAAWic,GAGzDjjC,EAAQ,EAAG,CAC9B,MAAM4jC,EAAgB/4B,EAAM0M,KAAKoH,OAASlE,EAAAA,GAAAA,sBAA4B5P,EAAM0M,KAAKoH,QAAW,KAEtFklB,GAAgBl7B,OAAOC,KAAKiC,EAAMwc,kBAAkBpxB,OAASwtC,GAAsB54B,EAAMsd,eACzF2b,GAAmBF,GAAelrB,YAAc,IAAM0qB,EAAmBH,EAAa,EAC5FrzB,EAAaV,KAAK6Q,OAAOrW,EAAGm6B,GAAgB7c,EAAW,GAAK8c,CAC9D,CACF,CAEA,OAAI9pB,IAA+BsD,EAAAA,GAA2BC,UACrD3N,EAEFyyB,EAAoB,CACzBC,cAAe1yB,EACf4wB,aACAxZ,WACAkB,YACA,EAGSmb,EAAex4B,GAAiBA,GAAOw4B,YAAYx4B,EAAMqT,MAAMjoB,OAAS4U,EAAMqT,KAAKjoB,OAAS,EAAI,IAAM,EAEtGsmB,EAAwBvC,GACnCA,IAA+BsD,EAAAA,GAA2B2T,WAe/CuS,EAAwBvf,IAKH,IALI,MACpCpZ,EAAK,UACLunB,EAAS,mBACTwO,EAAkB,2BAClB5mB,GAC2BiK,EAC3B,MAAM8f,EAAkBl5B,EAAMm5B,YAAcn5B,EAAMtL,aAAeC,EAAAA,GAAWC,MAEtEwkC,EAAqB,CAAC3mB,EAAAA,GAA2B4mB,UAAW5mB,EAAAA,GAA2BC,WAAWloB,SACtG2kB,GAEImqB,EAAcnqB,IAA+BsD,EAAAA,GAA2BuV,UACxEuR,EACJD,KAAiB/R,GAAa,CAAC6K,EAAAA,GAAc+C,GAAI/C,EAAAA,GAAcgD,IAAI5qC,SAAS+8B,GAE9E,OAAO2R,IAAoBE,GAAsBG,GADhBD,GAAevD,EACsD,EAU3F7kB,EAAOuJ,IAAuD,IAAtD,UAAE+e,EAAS,MAAErkC,EAAK,OAAEiQ,EAAM,SAAEq0B,GAAqBhf,EACpE,MAAMqF,EAAe3qB,EAAQskC,EAASnyB,KAAKnS,MAAQskC,EAAS7xB,MAAMzS,MAC5D4qB,EAAgB3a,EAASq0B,EAAS9xB,IAAIvC,OAASq0B,EAAS5xB,OAAOzC,OACrEo0B,EAAUlzB,YACVkzB,EAAU3vB,KAAK4vB,EAASnyB,KAAKnS,MAAOskC,EAAS9xB,IAAIvC,OAAQ0a,EAAcC,GACvEyZ,EAAUtoB,MAAM,EAGLwoB,EAAeh8B,IAC1B,MAAM,cAAEyM,EAAa,kBAAEwvB,GAAsBj8B,EAAUuC,QAAQwC,yBAC/D,IAAK,MAAMvV,KAAWwQ,EAAUT,WAAW8G,MACzC,GAAI7W,EAAQ0sC,cACV,OAAOD,EAGX,OAAOxvB,CAAa,EAUhB0vB,EAA8BC,IAClC,MAAM95B,EAAQ85B,EAAan8B,OAAOsC,QAAQD,QAE1C,OAAOA,EAAMjD,YAAY3R,OAAS,IAAM,CAAC6hB,EAAAA,GAAUiB,EAAGjB,EAAAA,GAAUX,GAAG9hB,SAASwV,EAAM8C,UAAU,EAGjFi3B,EAAe7e,IAAkD,IAAjD,WAAEya,EAAU,UAAEj4B,GAA8Bwd,EACvE,MAAM,cAAE/Q,EAAa,kBAAEwvB,EAAiB,wBAAEhO,GAA4BgK,EAAWlzB,yBAC3E6Z,EAAcqZ,EAAW/0B,eACzBk3B,GAAqB1b,EAAAA,EAAAA,IAAsB,CAAEE,cAAaD,WAAYsZ,EAAWtZ,aACvF,IAAK,MAAMyd,IAAgB,IAAIp8B,EAAUs8B,oBAAqBt8B,EAAUu8B,mBAAkB,IAAS,CACjG,MAAM76B,EAAK06B,EAAaI,SAClBC,EAAUL,EAAaK,UAC7B,GAAIA,GAAWL,EAAaF,cAAe,CACzC,IAAI/6B,EAAc46B,EAAwFtkC,EAC1G,MAAMilC,EAAYD,EAAUxE,EAAW52B,MAAQiW,EAAAA,GAAUwe,OAEvDiG,EADEU,EACSxE,EAAWjhC,aAAeC,EAAAA,GAAW4kB,gBAAkBoS,EAA0BxhB,EAEjFwvB,EAEb,MAAM5Z,EAAgBriB,EAAU0H,OAASq0B,EAAS9xB,IAAIvC,OAASq0B,EAAS5xB,OAAOzC,OAE3EuwB,EAAW+C,SACbvjC,EAAQwgC,EAAWxgC,MAAQskC,EAASnyB,KAAKnS,MAAQskC,EAAS7xB,MAAMzS,MAChE0J,EAAK2X,EAAAA,MAEFrE,MAAM,CAAC,EAAGhd,IACVshB,OAAO,CAAC,EAAGpS,KAAKlB,IAAI,EAAGwyB,EAAW31B,QAAQ8Q,MAAM1lB,OAAS,OAE5DyT,EAAOhJ,GAAkBA,EAAQiiC,EACjCj5B,EAAGqG,OAAUpG,GAAcA,EAAIg5B,EAC/Bj5B,EAAG1J,MAAQ,SAAU+Y,GACnB,OAAO1S,KAAK0J,OAAOgJ,GAAK1S,KAAK0J,OAAO,EACtC,GAEFxH,EAAU2Y,gBAAgB,QAAS,CAAEvX,EAAGD,IAExC,MAAM,IAAEoE,EAAG,IAAEE,GAAQzF,EAAU0Y,YAAchX,EAAG6W,YAChD,IAAIjX,EAEJ,MAAMq7B,EAAqBA,CAACC,EAAwBC,KAClD,GAAIJ,GAAWN,EAA2BC,GAAe,CACvD,MAAMU,EAAoBza,EAAgB0a,EAAAA,GACpCC,EAAQJ,EAAar3B,GACrBwT,EAAS6jB,EAAa7jB,SAC5B,GAAIikB,EAAQF,EAAmB,CAC7B,MACMG,EADYJ,IAAepoB,MAAM,CAAC,EAAGqoB,IAAoB/jB,OAAO,CAACtT,EAAKF,IAC9CiC,OAAO6a,GACrCua,EAAa7jB,OAAO,CAACA,EAAO,GAAIkkB,GAClC,CACF,GAGF,GAAQP,IACDplB,EAAAA,GAAU8B,YACb9X,EAAKwX,EAAAA,MAAiBrE,MAAM,CAAC,EAAG4N,IAAgBtJ,OAAO,CAACtT,EAAKF,IAC7Do3B,EAAmBr7B,EAAIwX,EAAAA,UAGvBxX,EAAKwX,EAAAA,MAAiBrE,MAAM,CAAC,EAAG4N,IAAgBtJ,OAAO,CAACtT,EAAKF,IACxDvF,EAAU0Y,aACbpX,EAAKA,EAAG0X,KAAK,IACb2jB,EAAmBr7B,EAAIwX,EAAAA,MAI7BxX,EAAGoG,OAAS,SAAUqI,GACpB,OAAOjS,KAAK0J,OAAOuI,GAAKjS,KAAK0J,OAAO,EACtC,EACAxH,EAAU2Y,gBAAgB,QAAS,CACjCvX,EAAGD,EACHI,EAAGD,IAGDm7B,GACF/6B,EAAGmnB,UAAW1nB,GAEhB,KACF,CACF,GAIW+L,EAA0B/E,GAAuBA,EAAY,GAAM,EAAI,EAAI,GAW3EO,EAAsB0W,IAAsD,IAArD,UAAEjX,EAAS,GAAEJ,EAAE,GAAEC,EAAE,GAAEC,EAAE,GAAEC,GAAuBkX,EAElF,OAAIjX,EAAY,GAAM,EACb,CAAE/G,EAAG,EAAGG,EAAG,GAEhByG,IAAOE,EACF,CAAE9G,EAAG,EAAGG,EAAG,IACTwG,IAAOE,EACT,CAAE7G,EAAG,GAAKG,EAAG,GAEb,CAAEH,EAAG,GAAKG,EAAG,GACtB,EAGWiH,EAA0C5K,IACrD,MAAMs/B,EAAU98B,OAAOtP,QAAgB8M,GACvC,IAAK,IAAI0c,EAAI,EAAGA,EAAI4iB,EAAQxvC,OAAQ4sB,IAClC4iB,EAAQ5iB,GAAG,GAAK3T,KAAK6Q,MAAM0lB,EAAQ5iB,GAAG,IAExC,OAAOla,OAAO+8B,YAAYD,EAAQ,EAcvBllB,EAAeyH,IAAA,IAAC,QAAE3d,EAAO,QAAEmW,EAAO,QAAEC,GAAqBuH,EAAA,MAAqB,CACzFtH,GAAIA,IAAMrW,EAAQ6G,UAAUsP,EAASC,GACrCsC,KAAMA,IAAM1Y,EAAQ6G,WAAqB,EAAXsP,GAAyB,EAAXC,GAC7C,EAOYT,EAAyBoI,IAAA,IAAC,OAAEnI,EAAM,KAAEC,GAA6BkI,EAAA,OAAOnI,EAASC,GAAQA,EAAQ,GAAG,EAEpGwB,EAAyB4G,IAAA,IAAC,OAAErI,EAAM,KAAEC,GAA6BoI,EAAA,OAAMrI,EAAS,IAAOC,EAAOA,CAAI,EAOxG,SAASylB,EAAkCld,GAAiE,IAAhE,WAAE+X,EAAU,MAAE31B,GAAgD4d,EAC/G,MAAM,cAAEzT,GAAkBwrB,EAAWlzB,yBAC/BizB,EAAoBC,EAAWxgC,OAASgV,EAAc7C,KAAKnS,MAAQgV,EAAcvC,MAAMzS,QAEvF,MAAEy/B,EAAK,IAAEtH,EAAG,kBAAEsI,GDzef,SAAmC1hC,GAA4D,IAA3D,UAAEqzB,EAAS,MAAEvnB,GAA4C9L,EAClG,MAAM6mC,EAAc/E,EAAsB,CAAEzO,YAAWvnB,WAChDq2B,GAAmB3B,EAAmBnN,GAE7C,IAAIyT,EAA8B,KAC9BC,EAA4B,KAC5BC,EAAmC,KAEvC,GAAIH,EAAYnG,OAASyB,IAAoB7B,EAA0BqC,KAAM,CAC3E,MACMsE,EAAsB,IADRn7B,EAAMk2B,kBACmBpb,UACvCsgB,EAAqBD,EAAoB9oC,WAAWqa,GAASA,EAAKooB,WAAaiG,EAAYnG,MAAOE,YAClGuG,EAAmBF,EAAoB9oC,WAAWqa,GAASA,EAAKooB,WAAaiG,EAAYzN,IAAKwH,YACpGkG,EAAiBG,EAAoBC,IAAuB,KAC5DH,EAAeE,EAAoBE,IAAqB,KACxDH,EAAoBl7B,EAAMjS,UAAY,EAAIqtC,EAAqBC,EAAmB,EAAI,IACxF,CAEA,MAAO,CACLzG,MAAOmG,EAAYnG,MACnBtH,IAAKyN,EAAYzN,IACjB0N,iBACAC,eACAC,oBACAtF,mBAAoBsF,GAAqB,IAAMl7B,EAAMsd,gBAAkB,SAAMjyB,EAC7EiwC,gBAAiBP,EAAYnG,OAASgC,EAAAA,EAAmBmE,EAAYnG,OACrE2G,cAAeR,EAAYzN,KAAOsJ,EAAAA,EAAiBmE,EAAYzN,KAEnE,CC6c4CkO,CAA2B,CACnEjU,UAAWoO,EAAWpO,UACtBvnB,WAGI,WAAEqc,EAAU,WAAEtX,GAAe0wB,EAA0B,CAC3DC,oBACAd,QACAtH,MACAttB,QACA41B,oBACAD,WAAYA,IAGVA,EAAWtZ,aAAeA,GAAcsZ,EAAW5wB,aAAeA,GACpE4wB,EAAW8F,iBAAiB,CAAEpf,aAAYtX,cAE9C,CAEO,SAAS22B,EAAU9Z,GAYvB,IAZwB,iBACzBlS,EAAgB,WAChBimB,EAAU,UACVj4B,EAAS,UACT87B,EAAS,kBACTmC,GAAoB,GAOrB/Z,EACKlkB,EAAUuC,QAAQvL,aAAeC,EAAAA,GAAW4kB,gBAC9CigB,EAAUoC,UAAU,EAAG,EAAGjG,EAAWxgC,MAAOuI,EAAU0H,SAEtDo0B,EAAU/8B,IAAI,YAAak5B,EAAWlzB,yBAAyB0H,cAAcwH,QAAQ3L,OAAOmd,YAC5FqW,EAAU/a,SAAS,EAAG,EAAGkX,EAAWxgC,MAAOuI,EAAU0H,SAEvD,MAAMnI,EAAWS,EAAUs8B,iBAC3B,IAAK,MAAQE,SAAU2B,KAAqB5+B,EACA,mBAA/B4+B,EAAgBtqB,aACzBioB,EAAU3wB,OACVgzB,EAAgBtqB,WAAWioB,GAC3BA,EAAUvwB,WAId,MAAMlM,EAAcW,EAAUu8B,oBACxBR,EAAWC,EAAYh8B,GAC7B,IAAK,MAAQw8B,SAAU2B,IAAqB,IAAI5+B,KAAaF,GAAc,CACzE,MAAM++B,EAAYD,EAAgBt9B,eAC5Bw9B,EAAeF,EAAgB/+B,oBAEjCg/B,IAAcpsB,EAAiBssB,sBAAyBH,EAAgB/6B,oBAEhEg7B,IAAaC,GAAkBF,EAAgBn3B,iBAAiBixB,MAI5E6D,EAAU3wB,OAC2B,MAAjCgzB,EAAgBlc,eAClB6Z,EAAU3wB,OACVqI,EAAK,CACHsoB,YACArkC,MAAOwgC,EAAWxgC,MAClBiQ,OAAQ1H,EAAU0H,OAClBq0B,aAEFD,EAAUnzB,UAAU3I,EAAUuC,QAAQ8E,WAAa00B,EAASnyB,KAAKnS,MAAOskC,EAAS9xB,IAAIvC,QACrFy2B,EAAgBlc,cAAc6Z,GAC9BA,EAAUvwB,UACkC,mBAAjC4yB,EAAgBvmB,cACzBumB,EAAgBvmB,aAAakkB,IAG/BqC,EAAgBv8B,OAAOk6B,GAGvBmC,IACCjsB,EAAiBP,6BAA+BsD,EAAAA,GAA2BuV,YAC1Ec,EAAAA,EAAAA,IAAiBpZ,KACY,MAA/BmsB,EAAgBjc,aAEhBic,EAAgBjc,YAAY4Z,GAE9BA,EAAUvwB,WACZ,CACF,C,kDC3lBA,QA7BA,MACEuc,OACAqG,IACAxjB,MACA7V,MAEA6J,WAAAA,CAAYmpB,GACVhqB,KAAKgqB,OAASA,EACdhqB,KAAKqwB,IAAM,EACXrwB,KAAK6M,MAAQ,EACb7M,KAAKhJ,MAAQ,CACf,CAEAypC,GAAAA,CAAI3tB,EAAcC,EAAa+S,GAC7B,MAAM4a,EAAKtsB,EAAAA,GAAMzM,IAAI,CAACmL,EAAOC,EAAKlK,KAAKiT,IAAIhJ,EAAOgT,GAAYjd,KAAKiT,IAAI/I,EAAM+S,KAEzE9lB,KAAK6M,MAAQ7M,KAAKgqB,QACpBhqB,KAAKqwB,KAAOqQ,EACZ1gC,KAAKhJ,MAAQgJ,KAAKqwB,KAAOrwB,KAAK6M,MAAQ,GAClC7M,KAAK6M,QAAU7M,KAAKgqB,OAAS,IAC/BhqB,KAAKqwB,KAAOrwB,KAAKgqB,SAGnBhqB,KAAKhJ,OAASgJ,KAAKhJ,OAASgJ,KAAKgqB,OAAS,GAAK0W,GAAM1gC,KAAKgqB,OAE5DhqB,KAAK6M,OACP,E,qECnBK,IAAK8zB,EAAS,SAATA,GAAS,OAATA,EAAAA,EAAS,uBAATA,EAAAA,EAAS,qBAATA,EAAAA,EAAS,qBAATA,EAAAA,EAAS,uBAATA,CAAS,MAOd,MAAMC,EAAoB,CAC/B,CAACD,EAAUE,UAAW,IACtB,CAACF,EAAUG,SAAU,IACrB,CAACH,EAAUI,SAAU,IACrB,CAACJ,EAAUK,UAAW,MAGlBC,EAAoB,CACxB,CAACN,EAAUE,UAAW,EACtB,CAACF,EAAUG,SAAU,EACrB,CAACH,EAAUI,SAAU,EACrB,CAACJ,EAAUK,UAAW,IAGlBE,EAAoB,CACxB,CAACP,EAAUE,UAAW,IACtB,CAACF,EAAUG,SAAU,IACrB,CAACH,EAAUI,SAAU,IACrB,CAACJ,EAAUK,UAAW,KAyVxB,EAtVa,CACXG,WAAUA,CAACC,EAAWC,IACbD,EAAG99B,EAAI+9B,EAAG/9B,EAAI89B,EAAG39B,EAAI49B,EAAG59B,EAGjC69B,aAAYA,CAACF,EAAWC,IACfD,EAAG99B,EAAI+9B,EAAG59B,EAAI29B,EAAG39B,EAAI49B,EAAG/9B,EAGjCi+B,SAAQA,CAACH,EAAWC,IACXx4B,KAAK24B,KAAK34B,KAAK44B,IAAIL,EAAG99B,EAAI+9B,EAAG/9B,EAAG,GAAKuF,KAAK44B,IAAIL,EAAG39B,EAAI49B,EAAG59B,EAAG,IAGpEi+B,YAAAA,CAAa53B,GAEX,GAAIA,EAAKG,KAAOH,EAAKK,GACnB,MAAO,CACLw3B,EAAG,EACHC,EAAG,EACHC,GAAI/3B,EAAKG,IAGb,MAAM63B,GAAKh4B,EAAKM,GAAKN,EAAKI,KAAOJ,EAAKK,GAAKL,EAAKG,IAChD,MAAO,CACL03B,GAAIG,EACJF,EAAG,EACHC,EAAGC,EAAIh4B,EAAKG,GAAKH,EAAKI,GACtB43B,IAEJ,EAEAC,cAAAA,CAAeC,EAAcC,GAE3B,IAAIC,EAAID,EAAQryC,OAAS,EACrBuyC,GAAW,EACf,IAAK,IAAI3lB,EAAI,EAAGA,EAAIylB,EAAQryC,OAAQ4sB,IAAK,CACvC,MAAM4lB,EAAIH,EAAQzlB,IAEd4lB,EAAE3+B,EAAIu+B,EAAMv+B,GAAKw+B,EAAQC,GAAGz+B,GAAKu+B,EAAMv+B,GAAOw+B,EAAQC,GAAGz+B,EAAIu+B,EAAMv+B,GAAK2+B,EAAE3+B,GAAKu+B,EAAMv+B,KACtF2+B,EAAE9+B,GAAK0+B,EAAM1+B,GAAK2+B,EAAQC,GAAG5+B,GAAK0+B,EAAM1+B,IAErC8+B,EAAE9+B,GAAM0+B,EAAMv+B,EAAI2+B,EAAE3+B,IAAMw+B,EAAQC,GAAGz+B,EAAI2+B,EAAE3+B,IAAOw+B,EAAQC,GAAG5+B,EAAI8+B,EAAE9+B,GAAK0+B,EAAM1+B,IAChF6+B,GAAYA,GAGhBD,EAAI1lB,CACN,CACA,OAAO2lB,CACT,EAEAE,cAAAA,CAAeL,EAAcl4B,GAC3B,MAAM,EAAE63B,EAAC,EAAEC,EAAC,EAAEC,GAAM7hC,KAAK0hC,aAAa53B,GAEtC,OADajB,KAAKiT,IAAI6lB,EAAIK,EAAM1+B,EAAIs+B,EAAII,EAAMv+B,EAAIo+B,GAAKh5B,KAAK24B,KAAKG,EAAIA,EAAIC,EAAIA,EAE/E,EAEAt2B,iBAAAA,CAAkB02B,EAAcl4B,GAC9B,MAAMw4B,EAAKz5B,KAAK44B,IAAI33B,EAAKG,GAAKH,EAAKK,GAAI,GAAKtB,KAAK44B,IAAI33B,EAAKI,GAAKJ,EAAKM,GAAI,GACxE,GAAW,IAAPk4B,EACF,OAAOz5B,KAAK24B,KAAK34B,KAAK44B,IAAIO,EAAM1+B,EAAIwG,EAAKG,GAAI,GAAKpB,KAAK44B,IAAIO,EAAMv+B,EAAIqG,EAAKI,GAAI,IAEhF,MAAMkI,IAAM4vB,EAAM1+B,EAAIwG,EAAKG,KAAOH,EAAKK,GAAKL,EAAKG,KAAO+3B,EAAMv+B,EAAIqG,EAAKI,KAAOJ,EAAKM,GAAKN,EAAKI,KAAOo4B,EACpG,GAAIlwB,EAAI,EACN,OAAOvJ,KAAK24B,KAAK34B,KAAK44B,IAAIO,EAAM1+B,EAAIwG,EAAKG,GAAI,GAAKpB,KAAK44B,IAAIO,EAAMv+B,EAAIqG,EAAKI,GAAI,IAEhF,GAAIkI,EAAI,EACN,OAAOvJ,KAAK24B,KAAK34B,KAAK44B,IAAIO,EAAM1+B,EAAIwG,EAAKK,GAAI,GAAKtB,KAAK44B,IAAIO,EAAMv+B,EAAIqG,EAAKM,GAAI,IAEhF,MAAM9G,EAAIwG,EAAKG,GAAKmI,GAAKtI,EAAKK,GAAKL,EAAKG,IAClCxG,EAAIqG,EAAKI,GAAKkI,GAAKtI,EAAKM,GAAKN,EAAKI,IACxC,OAAOrB,KAAK24B,KAAK34B,KAAK44B,IAAIO,EAAM1+B,EAAIA,EAAG,GAAKuF,KAAK44B,IAAIO,EAAMv+B,EAAIA,EAAG,GACpE,EAEA8+B,0BAAAA,CAA0B7zC,GAAoE,IAAnE,MAAEsI,EAAK,WAAEkC,GAAwDxK,EAC1F,OAAIwK,IAAeC,EAAAA,GAAWI,QAAUvC,GAAS,KACxC,EAGJkC,IAAeC,EAAAA,GAAWC,OAASpC,GAAS,GAAOkC,IAAeC,EAAAA,GAAWC,OAASpC,EAAQ,EAC1F,EAGF,CACT,EAEAwrC,eAAAA,CAAgB5oB,EAAgBmJ,EAAkB0f,GAChD,MAAMC,EAAS75B,KAAKiT,IAAIlC,GAClB+oB,EAAYjqC,IAA8E,IAA7E,IAAEuzB,EAAG,OAAE2W,EAAM,OAAEC,GAAyDnqC,EACzF,MAAMoqC,EAAM7W,EAAIplB,WAChB,GAAIi8B,EAAI9zC,SAAS,KAAM,CACrB,MAAM+zC,EAAcD,EAAI50B,MAAM,KACxB80B,EAAYl1B,OAAOi1B,EAAY,IAAMF,EAC3C,OAAOh6B,KAAK6Q,MAAM5L,OAAOi1B,EAAY,KAAKl8B,WAAWo8B,OAAOp6B,KAAKlB,IAAI,EAAGq7B,GAAY,KAAOJ,CAC7F,CACA,MAAMvlB,EAAOxU,KAAKwU,KAAK4O,GACjBiX,EAAsBr6B,KAAK44B,IAAI,GAAIoB,GACnCM,EAAUT,EAASQ,EAAuB7lB,EAChD,OAAQvP,OAAOs1B,UAAUD,GAAUA,EAASA,EAAOpgB,aAAoBlzB,IAAZkzB,EAAwBA,EAAU,IAAM6f,CAAM,EAG3G,OAAIF,GAAU9B,EAAkBD,EAAUK,WAAayB,IAAc9B,EAAUK,SACtE2B,EAAU,CACf1W,IAAKrS,EACLgpB,OAAQ1B,EAAkBP,EAAUK,UACpC6B,OAAQ5B,EAAkBN,EAAUK,YAE7B0B,GAAU9B,EAAkBD,EAAUI,UAAY0B,IAAc9B,EAAUI,QAC5E4B,EAAU,CACf1W,IAAKrS,EACLgpB,OAAQ1B,EAAkBP,EAAUI,SACpC8B,OAAQ5B,EAAkBN,EAAUI,WAE7B2B,GAAU9B,EAAkBD,EAAUG,UAAY2B,IAAc9B,EAAUG,QAC5E6B,EAAU,CACf1W,IAAKrS,EACLgpB,OAAQ1B,EAAkBP,EAAUG,SACpC+B,OAAQ5B,EAAkBN,EAAUG,WAE7B4B,GAAU9B,EAAkBD,EAAUE,WAAa4B,IAAc9B,EAAUE,SAC7E8B,EAAU,CACf1W,IAAKrS,EACLgpB,OAAQ1B,EAAkBP,EAAUE,UACpCgC,OAAQ5B,EAAkBN,EAAUE,iBAGnBhxC,IAAZkzB,EAAwBnJ,EAAOmJ,QAAQA,GAAWnJ,EAAO/S,UAEpE,EAEA6S,KAAAA,CAAKsG,GAUF,IAVG,MACJhpB,EAAK,UACLmhB,EAAY,EAAC,WACbjf,EAAU,eACV8yB,GAMDhM,EACC,GAAInX,KAAKiT,IAAI9kB,IAAU4pC,EAAkBD,EAAUG,SACjD,OAAO9gC,KAAKwiC,gBAAgBxrC,EAAOg1B,GAGrC,MAAM/P,EACsB,iBAAnB+P,EACHA,EACAhsB,KAAKuiC,2BAA2B,CAAEvrC,MAAOmhB,EAAWjf,eAE1D,OAAIlC,EAAQ,KAEHA,EAAM+rB,QAAQ9G,GAEhBnO,OAAQ,GAAEjF,KAAK6Q,MAAM5L,OAAQ,GAAE9W,MAAUilB,UAAeA,KAAU8G,QAAQ9G,EACnF,EAEAonB,wBAAAA,CAAwB9vB,GAA6D,IAK/E+vB,EACAC,GANmB,KAAEz5B,EAAI,SAAEy3B,GAAkDhuB,EACjF,GAAiB,IAAbguB,EACF,MAAO,CAAEj+B,EAAGwG,EAAKK,GAAI1G,EAAGqG,EAAKM,IAM3BN,EAAKG,IAAMH,EAAKK,IAAML,EAAKI,IAAMJ,EAAKM,IACxCm5B,GAAmB,EACnBD,GAAmB,GACVx5B,EAAKG,IAAMH,EAAKK,IAAML,EAAKI,IAAMJ,EAAKM,IAC/Cm5B,EAAkB,EAClBD,GAAmB,GACVx5B,EAAKG,IAAMH,EAAKK,IAAML,EAAKI,IAAMJ,EAAKM,IAC/Cm5B,GAAmB,EACnBD,EAAkB,IAGlBC,EAAkB,EAClBD,EAAkB,GAGpB,MAAME,EAAW36B,KAAK46B,MAAM56B,KAAKiT,IAAIhS,EAAKK,GAAKL,EAAKG,IAAKpB,KAAKiT,IAAIhS,EAAKM,GAAKN,EAAKI,KAGjF,MAAO,CAAE5G,EAFCwG,EAAKK,GAAKo5B,GAAmBhC,EAAW14B,KAAK66B,IAAIF,IAE/C//B,EADFqG,EAAKM,GAAKk5B,GAAmB/B,EAAW14B,KAAK86B,IAAIH,IAE7D,EAEAI,uBAAAA,CAAuBrsB,GAQpB,IARqB,kBACtBssB,EAAiB,MACjBz2B,EAAK,cACL02B,GAKDvsB,EAGC,MAAMosB,EAAM96B,KAAK86B,IAAIv2B,GACfs2B,EAAM76B,KAAK66B,IAAIt2B,GASrB,MAAO,CAAE9J,EAPPogC,GAAOI,EAAcxgC,EAAIugC,EAAkBvgC,GAC3CqgC,GAAOG,EAAcrgC,EAAIogC,EAAkBpgC,GAC3CogC,EAAkBvgC,EAKEG,EAHpBigC,GAAOI,EAAcrgC,EAAIogC,EAAkBpgC,GAC3CkgC,GAAOG,EAAcxgC,EAAIugC,EAAkBvgC,GAC3CugC,EAAkBpgC,EAEtB,EACAsgC,qBAAAA,CAAqBzqB,GAQlB,IARmB,YACpB0qB,EAAW,aACXC,EAAY,aACZC,GAKD5qB,EAGC,MAOM3J,GANJs0B,EAAaxgC,GAAKugC,EAAY1gC,EAAI4gC,EAAa5gC,GAC/C0gC,EAAYvgC,GAAKygC,EAAa5gC,EAAI2gC,EAAa3gC,GAC/C4gC,EAAazgC,GAAKwgC,EAAa3gC,EAAI0gC,EAAY1gC,MAE9C2gC,EAAa3gC,EAAI0gC,EAAY1gC,IAAM0gC,EAAY1gC,EAAI4gC,EAAa5gC,IAChE2gC,EAAaxgC,EAAIugC,EAAYvgC,IAAMugC,EAAYvgC,EAAIygC,EAAazgC,IAGnE,OAAOoF,KAAKs7B,KAAKx0B,EACnB,EAEAy0B,2BAAAA,CAA4BhD,EAAWC,EAAWgD,EAAWC,GAM3D,GAAKlD,EAAG99B,IAAM+9B,EAAG/9B,GAAK89B,EAAG39B,IAAM49B,EAAG59B,GAAO4gC,EAAG/gC,IAAMghC,EAAGhhC,GAAK+gC,EAAG5gC,IAAM6gC,EAAG7gC,EACpE,OAAO,EAGT,MAAM8gC,GAAeD,EAAG7gC,EAAI4gC,EAAG5gC,IAAM49B,EAAG/9B,EAAI89B,EAAG99B,IAAMghC,EAAGhhC,EAAI+gC,EAAG/gC,IAAM+9B,EAAG59B,EAAI29B,EAAG39B,GAG/E,GAAoB,IAAhB8gC,EACF,OAAO,EAGT,MAAMC,IAAOF,EAAGhhC,EAAI+gC,EAAG/gC,IAAM89B,EAAG39B,EAAI4gC,EAAG5gC,IAAM6gC,EAAG7gC,EAAI4gC,EAAG5gC,IAAM29B,EAAG99B,EAAI+gC,EAAG/gC,IAAMihC,EACvEE,IAAOpD,EAAG/9B,EAAI89B,EAAG99B,IAAM89B,EAAG39B,EAAI4gC,EAAG5gC,IAAM49B,EAAG59B,EAAI29B,EAAG39B,IAAM29B,EAAG99B,EAAI+gC,EAAG/gC,IAAMihC,EAG7E,GAAIC,EAAK,GAAKA,EAAK,GAAKC,EAAK,GAAKA,EAAK,EACrC,OAAO,EAOT,MAAO,CAAEnhC,EAHC89B,EAAG99B,EAAIkhC,GAAMnD,EAAG/9B,EAAI89B,EAAG99B,GAGrBG,EAFF29B,EAAG39B,EAAI+gC,GAAMnD,EAAG59B,EAAI29B,EAAG39B,GAGnC,EAGAihC,qBAAAA,CAAsBC,EAAiBC,EAAiBC,EAAiBC,GAEvE,IAAInD,EAAGC,EACP,MAAMuB,EAAuE,CAC3E7/B,EAAG,EACHG,EAAG,EACHshC,SAAS,EACTC,SAAS,GAELT,GACHO,EAASrhC,EAAIohC,EAASphC,IAAMmhC,EAASthC,EAAIqhC,EAASrhC,IAAMwhC,EAASxhC,EAAIuhC,EAASvhC,IAAMshC,EAASnhC,EAAIkhC,EAASlhC,GAC7G,GAAoB,IAAhB8gC,EACF,OAAO,EAGT5C,EAAIgD,EAASlhC,EAAIohC,EAASphC,EAC1Bm+B,EAAI+C,EAASrhC,EAAIuhC,EAASvhC,EAC1B,MAAM2hC,GAAcH,EAASxhC,EAAIuhC,EAASvhC,GAAKq+B,GAAKmD,EAASrhC,EAAIohC,EAASphC,GAAKm+B,EACzEsD,GAAcN,EAASthC,EAAIqhC,EAASrhC,GAAKq+B,GAAKiD,EAASnhC,EAAIkhC,EAASlhC,GAAKm+B,EAiB/E,OAhBAD,EAAIsD,EAAaV,EACjB3C,EAAIsD,EAAaX,EAGjBpB,EAAO7/B,EAAIqhC,EAASrhC,EAAIq+B,GAAKiD,EAASthC,EAAIqhC,EAASrhC,GACnD6/B,EAAO1/B,EAAIkhC,EAASlhC,EAAIk+B,GAAKiD,EAASnhC,EAAIkhC,EAASlhC,GAG/Ck+B,EAAI,GAAKA,EAAI,IACfwB,EAAO4B,SAAU,GAGfnD,EAAI,GAAKA,EAAI,IACfuB,EAAO6B,SAAU,GAGZ7B,CACT,EAGAgC,+BAAAA,CAAgCC,EAAkBC,EAAeC,EAAqBC,GACpF,MAAMC,EAAmBxlC,KAAK0kC,sBAAsBU,EAAWC,EAAQC,EAAcC,GAErF,SACGC,GACDA,EAAiBT,SACjB/kC,KAAKmhC,WACHnhC,KAAKylC,eAAeL,EAAWI,GAC/BxlC,KAAKylC,eAAeL,EAAWC,KAC5B,IAGA,IAAKG,EAAkBliC,EAAGuF,KAAK6Q,MAAM8rB,EAAiBliC,GAAIG,EAAGoF,KAAK6Q,MAAM8rB,EAAiB/hC,GAClG,EAEAiiC,4BAA2BA,CAACC,EAAWC,KAG9B,CAAEtiC,GAFEqiC,EAAGriC,EAAIsiC,EAAGtiC,GAAK,EAAIsiC,EAAGtiC,EAErBG,GADDkiC,EAAGliC,EAAImiC,EAAGniC,GAAK,EAAImiC,EAAGniC,IAInCoiC,eAAAA,CAAgBC,GACd,MAAMl2C,EAASiZ,KAAK24B,KAAKsE,EAAExiC,EAAIwiC,EAAExiC,EAAIwiC,EAAEriC,EAAIqiC,EAAEriC,GAC7C,MAAO,CAAEH,EAAGwiC,EAAExiC,EAAI1T,EAAQ6T,EAAGqiC,EAAEriC,EAAI7T,EACrC,EAEAm2C,uBAAsBA,CAACD,EAAUE,KACxB,CAAE1iC,EAAGwiC,EAAExiC,EAAI0iC,EAAQviC,EAAGqiC,EAAEriC,EAAIuiC,IAGrCC,UAASA,CAACN,EAAWC,KACZ,CAAEtiC,EAAGqiC,EAAGriC,EAAIsiC,EAAGtiC,EAAGG,EAAGkiC,EAAGliC,EAAImiC,EAAGniC,IAGxCgiC,eAAcA,CAACE,EAAWC,KACjB,CAAEtiC,EAAGqiC,EAAGriC,EAAIsiC,EAAGtiC,EAAGG,EAAGkiC,EAAGliC,EAAImiC,EAAGniC,I,qEChXnC,MAAMyiC,EACXlc,OACAmc,WACA9V,IACAxjB,MACA7V,MAEA6J,WAAAA,CAAYmpB,GACVhqB,KAAKgqB,OAASA,EACdhqB,KAAKmmC,WAAa,GAAKnmC,KAAKgqB,OAAS,GACrChqB,KAAKqwB,IAAM,EACXrwB,KAAK6M,MAAQ,EACb7M,KAAKhJ,MAAQ,CACf,CAEAypC,GAAAA,CAAIhuB,GACEzS,KAAK6M,MAAQ7M,KAAKgqB,QACpBhqB,KAAKqwB,KAAO5d,EACZzS,KAAK6M,QACL7M,KAAKhJ,MAAQgJ,KAAKqwB,IAAMrwB,KAAK6M,OAE7B7M,KAAKhJ,MAAQyb,EAAIzS,KAAKmmC,WAAanmC,KAAKhJ,OAAS,EAAIgJ,KAAKmmC,WAE9D,EAOK,MAAMC,UAAuBC,EAAAA,EAClC1mC,YAAc+1B,EAAAA,GAAY4Q,IAE1BC,0BAAAA,GACE,MAAO,CAAEC,IAAK,GAChB,CAEAC,SAAAA,CAAUC,GACR,MAAM,OAAE1c,GAAWhqB,KAAKnL,SAClB,MAAEygB,GAAUtV,KAAKwE,MACjB+rB,EAAYjb,EAAM1lB,OAAS,EAC3B42C,EAAM,IAAIN,EAAyBlc,GACzChqB,KAAK2mC,kBAAoB3mC,KAAKumC,6BAE9B,IAAK,IAAIlsC,EAAQ,EAAGA,GAASk2B,IAC3BiW,EAAI/F,IAAInrB,EAAMjb,IACd2F,KAAK4mC,iBAAiBJ,IAAInsC,GAASmsC,EAAIxvC,OAEmB,IAAtD0vC,IAAoB1mC,KAAK4mC,iBAAkBvsC,IAJTA,KAQ1C,E,6DC7CK,MAAMgsC,EAIX1mC,YAA2C6iB,EAAAA,GAAcqkB,UAEzDriC,MACA3P,QAEU8xC,kBAEV9lC,WAAAA,CAAWnS,GAA+C,IAA9C,MAAE8V,EAAK,QAAE3P,GAAmCnG,EACtDsR,KAAKwE,MAAQA,GAAS,IAAIguB,EAAAA,EAC1BxyB,KAAKnL,QAAUA,EACfmL,KAAK2mC,kBAAoB3mC,KAAKumC,4BAChC,CAEA,oBAAIK,GACF,OAAO5mC,KAAK2mC,iBACd,CAEAJ,0BAAAA,GACE,MAAMlxB,MAAM,uCACd,CAEAoxB,SAAAA,CAAUvmC,GACR,MAAMmV,MAAM,sBACd,CAEAyxB,sBAAAA,CAAuBC,GACrB,MAAMH,EAAmB,CAAC,EAI1B,OAHAtkC,OAAOC,KAAKvC,KAAK4mC,kBAAkBjjC,SAASpL,IAC1CquC,EAAiBruC,GAAkCyH,KAAKgnC,oBAAoBzuC,EAAKwuC,EAAW,IAEvFH,CACT,CAEAI,mBAAAA,CAAoBzuC,EAA8BwuC,GAChD,OAAQ/mC,KAAK4mC,iBAAiBruC,GAAkB0uC,OAAOF,EACzD,CAQAG,eAAAA,GACE,MAAM,KAAEh5C,GAAS8R,KAAKa,YAKtB,MAAO,CAJW3S,EAAKggB,MAAM,KAAK,MACf5L,OAAOC,KAAKvC,KAAKnL,SAAW,CAAC,GAAGsyC,MAAK,CAACC,EAAMC,IAASD,EAAKE,cAAcD,KAEzDpwC,KAAKsB,GAAS,GAAEA,EAAI0uC,MAAM,EAAG,KAAKjnC,KAAKnL,QAAS0D,QAC5CgvC,KAAK,IAC7C,E,sDChEK,IAAKC,EAAiB,SAAjBA,GAAiB,OAAjBA,EAAiB,sBAAjBA,EAAiB,gBAAjBA,EAAiB,sBAAjBA,CAAiB,MAMtB,MAAMC,EAA0B,CACrC,CAACD,EAAkBE,QAAS,CAAC,UAC7B,CAACF,EAAkBG,WAAY,CAAC,YAAa,cAGlCC,EAAqB,CAChC,CAAE5wC,MAAOwwC,EAAkBE,OAAQr5C,MAAO,UAC1C,CAAE2I,MAAOwwC,EAAkBG,UAAWt5C,MAAO,aAC7C,CAAE2I,MAAOwwC,EAAkBK,UAAWx5C,MAAO,a,6DCf/C,SAASy5C,IAAkC,IAAhBC,EAASp4C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAErC,OAAwB,IADPo4C,EAAUxhC,QAAQ,IAAK,IAC3B3W,OACH,GAAEm4C,MAELA,CACT,CAEO,MAAMnb,EAAqBl+B,IAM5B,IAN6B,MACjCwH,EAAK,OACLw2B,GAIDh+B,EACC,MAAMs5C,EAAetb,EAAOx2B,GACtB+xC,EAAkB3lC,OAAOC,KAAKylC,GAC9BE,EAAgBhyC,IAAU82B,EAAAA,GAAMC,MAAQkb,EAAAA,GAAkBC,EAAAA,GAEhE,OAAOH,EAAgBzlC,QAAO,CAACC,EAAKsqB,IAEhC+a,EAAkBE,EAAajb,IAAWzyB,gBAC1CwtC,EAAkBI,EAAcnb,IAAWzyB,cAGzC,IACKmI,EACH,CAACsqB,GAAWib,EAAajb,IAE3BtqB,GACH,CAAC,EAAE,C,iKC0BD,MAAM0lC,EAAqC,CAChD7d,gBAAiB,YACjBnc,WAAY,YACZ2f,WAAY,YACZC,SAAU,YACVpG,WAAY,YACZ0gB,MAAO,YACPC,UAAW,OACXC,oBAAqB,OACrBvrB,kBAAmB3J,IAAAA,aAA4B,KAC/CwK,YAAaxK,IAAAA,KAAoB,KACjC2P,KAAM,YACNd,cAAe,UACfsmB,2BAA4Bn1B,IAAAA,KAAoB,KAChDo1B,qBAAsB,OACtB3+B,KAAM,YACNinB,WAAY1d,IAAAA,IAAmB,KAC/B2d,SAAU3d,IAAAA,MAAqB,KAC/Bq1B,eAAgB,YAChBlZ,cAAe,YACfD,YAAa,YACboZ,8BAA8BjhB,EAAAA,EAAAA,IAAwB,UAAW,KACjEjL,uBAAwB,OACxBmsB,0BAA2B,UAC3BC,eAAgB,YAChBxe,cAAe,YACfvE,UAAW,YACX1rB,KAAM,UACN0c,cAAe,UACf8W,UAAW,YACXC,QAAS,YACT5J,gBAAiB,UACjBC,cAAe,UACf8J,SAAU,YACVC,OAAQ,YACRwB,WAAY,QAGD2Y,EAAoC,CAC/C9d,gBAAiB,YACjBnc,WAAY,YACZ2f,WAAY,YACZC,SAAU,YACVpG,WAAYtU,IAAAA,KAAoB,KAChCg1B,MAAO,UACPC,UAAW,OACXC,oBAAqB,OACrBvrB,kBAAmB3J,IAAAA,OAAsB,KACzCwK,YAAaxK,IAAAA,KAAoB,KACjC2P,KAAM,YACNd,cAAe,UACfsmB,2BAA4Bn1B,IAAAA,KAAoB,KAChDo1B,qBAAsB,OACtB3+B,KAAM,YACNinB,WAAY1d,IAAAA,IAAmB,KAC/B2d,SAAU3d,IAAAA,MAAqB,KAC/Bq1B,eAAgBr1B,IAAAA,IAAmB,KACnCmc,cAAe,YACfD,YAAa,YACboZ,8BAA8BjhB,EAAAA,EAAAA,IAAwB,UAAW,KACjEjL,uBAAwB,OACxBmsB,0BAA2B,UAC3BC,eAAgBx1B,IAAAA,MAAqB,KACrCgX,cAAe,YACfvE,UAAW,YACX1rB,KAAM,UACN0c,cAAe,YACf8W,UAAW,YACXC,QAAS,YACT5J,gBAAiB,YACjBC,cAAe,YACf8J,SAAU,YACVC,OAAQ,YACRwB,WAAY,WAGDrC,EAAsC,CACjDW,SAAU,YACVE,OAAQ,UACRH,WAAY,YACZE,SAAU,aAGC8a,EAA6C,CACxDh/B,KAAM,UACNi/B,WAAY11B,IAAAA,IAAmB,MAGpB21B,EAA4C,CACvDl/B,KAAM,UACNi/B,WAAY11B,IAAAA,IAAmB,MAGpB41B,EAAyC,CACpDn/B,KAAM,UACN2E,OAAQ,UACRxB,sBAAuB,WAGZi8B,EAAwC,CACnDp/B,KAAM,UACN2E,OAAQ,UACRxB,sBAAuB,WAEZk8B,EAA+B,CAC1C,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAIW9b,EAAwB,CACnCQ,QAAS,UACTD,UAAW,WAGN,IAAKwb,EAAa,SAAbA,GAAa,OAAbA,EAAAA,EAAa,aAAbA,EAAAA,EAAa,iBAAbA,EAAAA,EAAa,qBAAbA,EAAAA,EAAa,mBAAbA,CAAa,MAOlB,MAAMnK,EAAyB,E,mJCpLtC,MAAMoK,EAAe,CAAE3nB,MAAO,EAAG8W,QAAS,IACpC8Q,EAAa,CAAE5nB,MAAO,GAAI8W,QAAS,IAQlC,SAAS+Q,EAAsB76C,GAQnC,IARoC,YACrC86C,EAAW,YACXC,EAAW,UACXzkC,GAKDtW,EACKg7C,GAAe/O,EAAAA,EAAAA,IAAsB31B,GACzC,MAAM2kC,EACJH,EAAYhlC,QAAQ64B,WAAa3S,EAAAA,GAA2B17B,SAASw6C,EAAYliC,WAC7EsiC,EACJH,EAAYjlC,QAAQ64B,WAAa3S,EAAAA,GAA2B17B,SAASy6C,EAAYniC,WAkBnF,MAhBI,CAACmK,EAAAA,GAAUgB,EAAGhB,EAAAA,GAAUiB,EAAGjB,EAAAA,GAAUX,GAAG9hB,SAASw6C,EAAYliC,aAC/DoiC,GAAeG,EAAAA,EAAAA,GAAQH,EAAcL,IAGnCI,EAAYniC,YAAcmK,EAAAA,GAAUX,EACtC44B,GAAeG,EAAAA,EAAAA,IAAQC,EAAAA,EAAAA,GAAeJ,GAAeJ,GAC5CG,EAAYniC,YAAcmK,EAAAA,GAAUiB,EAC7Cg3B,GAAeG,EAAAA,EAAAA,IAAQE,EAAAA,EAAAA,GAAcL,EAAc,CAAEM,aAAc,IAAMV,GAChEG,EAAYniC,YAAcmK,EAAAA,GAAUgB,GAAwC,UAAnCg3B,EAAYjlC,QAAQtL,aACtEwwC,GAAeO,EAAAA,EAAAA,GAASP,IAGtBC,IAA4BC,GAA8D,UAAnCH,EAAYjlC,QAAQtL,aAC7EwwC,EAlCJ,SAAoCx4B,GAClC,MAAMwQ,EAAQxQ,EAAKmB,WACbmmB,EAAUtnB,EAAKqB,aACrB,OAAOmP,EAAQ2nB,EAAa3nB,OAAUA,IAAU2nB,EAAa3nB,OAAS8W,EAAU6Q,EAAa7Q,OAC/F,CA8BmB0R,CAA2BR,IAAgBG,EAAAA,EAAAA,GAAQH,EAAcL,GAAgBK,OAGxFlO,EAAAA,EAAAA,IAAqBkO,GAAc,GAAOpQ,UAAY,IAClE,CC5CO,MAAM6Q,UAAczqC,IAAAA,MACzB,gBAAO+M,GACLzM,KAAKoqC,UAAU,QAAS,YACxBpqC,KAAKqqC,UAAU,OAAQC,EAAAA,EACzB,CAKAC,iBAAmBA,MAAQvqC,KAAKmC,QAAQsC,QAAQ+lC,qBAAqBhD,EAAAA,GAAkBK,WAEvF4C,wBAA2BtoC,KAAiBnC,KAAKmC,QAAQsC,QAAQimC,IAAIvoC,EAAKsC,SAE1EkmC,2BAA8BxoC,GAAenC,KAAKuqC,oBAAsBvqC,KAAKyqC,wBAAwBtoC,GAErGyiB,qBAAwBziB,IACtB,GAAInC,KAAK4qC,SAAU,CACjB,GAAI5qC,KAAKyqC,wBAAwBtoC,GAC/B,OAAO0G,KAAK6Q,MAAM1Z,KAAK4qC,SAAStnC,GAElC,MAAMunC,EAAc7qC,KAAKmC,OACzB,GAAInC,KAAKuqC,oBAAsBM,EAAa,CAC1C,MAAMC,EAAeD,EAAYpmC,QAC3BsmC,EAAmB5oC,EAAKsC,QACxBumC,EAAyBF,EAAatmC,QAAQK,yBAAyBgE,KAAK6Q,MAAM1Z,KAAK4qC,SAAStnC,IAChG2nC,EAAuBF,EAAiBvmC,QAAQS,0BACpDskC,EAAuB,CACrBC,YAAasB,EACbrB,YAAasB,EACb/lC,UAAWgmC,KAGf,OAAOniC,KAAK0R,MAAM0wB,EACpB,CACF,CAEA,OAAOn9B,OAAO2T,GAAG,EAGnBypB,gBAAmB/oC,IACjB,MAAM4G,EAAY/I,KAAK4qC,UAAUnnC,GAAK,KAEtC,GAAIzD,KAAKmC,QAAQuoC,IAAIvoC,GACnB,OAAO4G,EAGT,GAAI/I,KAAKuqC,oBAAsBvqC,KAAKmC,OAAQ,CAC1C,MAAMgpC,EAAiBnrC,KAAKmC,QAAQipC,kBAEpC,OAAOD,IADkBhpC,EAAKipC,kBACeriC,EAAY,IAC3D,CAEA,OAAO,IAAI,EAQfohC,EAAM19B,YAEN,MAAM4+B,EAAQlB,EAAMmB,SACpBD,EAAMh+B,OAEN,S,oIClDA,MAAMk+B,EAA+B,CACnC1V,EAAAA,GAAoBG,MACpBH,EAAAA,GAAoBE,UACpBF,EAAAA,GAAoBI,iBACpBJ,EAAAA,GAAoBK,iBACpBL,EAAAA,GAAoBM,gBACpBN,EAAAA,GAAoBO,gBAGtB,MAAMkU,UAAa5qC,IAAAA,MACjB,gBAAO+M,CACL6xB,EACAkN,EACArR,GAEAn6B,KAAKoqC,UAAU,OAAQ,SAAU,QAAS,aAAc,WAAY,aACpEpqC,KAAKyrC,QAAQ,WAAYnN,GACzBt+B,KAAKyrC,QAAQ,cAAeD,GAC5BxrC,KAAKqqC,UAAU,cAAe/L,GAC9Bt+B,KAAKqqC,UAAU,QAASlQ,EAC1B,CAeA/3B,UAAkC,KAClCwY,WAAkD,KAElD8wB,cAAAA,CAAe72C,GAMb,OALAmL,KAAKyB,WACF8G,MACA5E,SAASjS,IACRA,EAAQg6C,gBAAgB,IAErB1rC,KAAK2rC,QAAQ92C,EACtB,CAEAmR,QAAAA,GACE,MAAMvE,EAAWzB,KAAKyB,WACnB8G,MACAtR,KAAK2M,GAAOA,EAAGoC,aAClB,MAAO,CACL4D,OAAQ5J,KAAK4J,OACbrG,MAAOvD,KAAKuD,MACZqX,WAAY5a,KAAK4a,WACjBnZ,WAEJ,CAEAwE,QAAAA,GAAoC,IAA3B2lC,EAAQj8C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAClB,MAAM8R,EAAWzB,KAAKyB,WACnB8G,MACAtR,KAAK2M,GAAOA,EAAGqC,aAClB,OAAOG,IACL,CACEwD,OAAQ5J,KAAK4J,OACbgR,WAAY5a,KAAK4a,WACjBnZ,YAEFmqC,EAEJ,CAEAj1C,IAAAA,CAAKL,GACH,MAAMu1C,EAAa7rC,KAAKyE,QAAQqnC,cAC1BC,EAAYF,EAAWG,MAAM7pC,IAAUA,EAAK8pC,uBAC5CC,EAAaL,EAAWG,MAAM7pC,GAASnC,KAAK0qC,IAAIvoC,KAEtD,IAAK4pC,IAAcG,EAAY,OAE/B,MAAMC,EAA0B7B,EAAK8B,QAAQ/6C,QAAQ8Q,GAASA,EAAKkqC,WAAaH,EAAWG,WACrFC,EAAwBhC,EAAK8B,QAAQ/6C,QAAQ8Q,GAASA,EAAKkqC,WAAaH,EAAWG,WAEnFE,EAAoBJ,EAAwBt1C,WAAW21C,GAAWA,EAAO92C,KAAOw2C,EAAWx2C,KAC3F+2C,EAA2BN,EAAwB96C,QAAO,CAAC6O,EAAG7F,IAAUA,IAAUkyC,IAClFG,EAAmBD,EAAyB51C,WAAW21C,GAAWA,EAAO92C,KAAOq2C,EAAUr2C,KAE1Fi3C,EAAaF,EAAyBxF,MAAM,EAAGyF,GAC/CE,EAAaH,EAAyBxF,MAAMyF,EAAmB,GACjEp2C,IAAcu2C,EAAAA,GAASC,QACzBH,EAAW/mC,KAAKumC,EAAwBI,IACxCI,EAAWxF,MAAK,CAACxF,EAAGC,IAAMD,EAAEoL,eAAiBnL,EAAEmL,kBAE7Cz2C,IAAcu2C,EAAAA,GAASG,QACzBJ,EAAWhnC,KAAKumC,EAAwBI,IACxCK,EAAWzF,MAAK,CAACxF,EAAGC,IAAMD,EAAEoL,eAAiBnL,EAAEmL,kBAGjDzC,EAAK8B,QAAUE,EAAsBW,OAAO,IACvCN,EACHF,EAAyBC,MACtBE,IAEL5sC,KAAKyE,QAAQ/C,QAAQ,SAAU1B,KAAKyE,QACtC,CAEAwC,sBAAAA,GACE,OAAOA,EAAAA,EAAAA,IAAuBjH,KAAKyE,QAAQW,eAC7C,CAEAo5B,cAAAA,GACE,OAAOx+B,KAAKyB,WACT8G,MACA4+B,MAAK,CAACxF,EAAGC,IAAMD,EAAE5pC,OAAS6pC,EAAE7pC,QACjC,CAEA0mC,iBAAAA,GAAmC,IAAjByO,IAAQv9C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GACxB,MAAM4R,EAAc,IAAIvB,KAAKuB,cAAcgH,OAC3C,OAAO2kC,EAAW3rC,EAAY4lC,MAAK,CAACxF,EAAGC,IAAMD,EAAE5pC,OAAS6pC,EAAE7pC,SAAUwJ,CACtE,CAEA4rC,0BAAAA,GACE,OAAOntC,KAAKw+B,iBAAiBwN,MAAMpoC,GAAOA,EAAG+6B,WAAa/6B,EAAGw6B,iBAAkB,IACjF,CAEA6N,kBAAAA,GACE,QAASjsC,KAAKotC,eAAehP,aAC/B,CAEAiP,cAAAA,GACE,QAASrtC,KAAKotC,eAAezO,SAC/B,CAEA2O,WAAAA,GACMttC,KAAKisC,sBACPjsC,KAAK6a,gBAAgB,SAAUod,EAAAA,GAAoBC,WAEjDl4B,KAAKqtC,kBACPrtC,KAAK6a,gBAAgB,SAAUod,EAAAA,GAAoBxzB,MAEvD,CAEA2mC,eAAAA,GACE,OAAOprC,KAAKyE,QACTqnC,cACAj1C,WAAWk1C,GAAcA,EAAUrB,IAAI1qC,OAC5C,CAEAutC,qBAAAA,GACE,IAAI5lC,GAAO,EACPF,EAAM,EASV,OARAzH,KAAKw+B,iBAAiB76B,SAASC,IACzBA,EAAG7L,OAAS4P,IACdA,EAAM/D,EAAG7L,QAEP6L,EAAG7L,OAAS0P,IACdA,EAAM7D,EAAG7L,OACX,IAEK,CAAE0P,MAAKE,MAChB,CAEA6lC,yBAAAA,GACE,MAAMC,EAAkBztC,KAAKw+B,iBACvBkP,EAA+B,GAC/BC,EAA+B,GAUrC,OATAF,EAAgB9pC,SAASC,IACnBA,EAAG7L,OAAS,GACd21C,EAAkB9nC,KAAKhC,GAErBA,EAAG7L,OAAS,GACd41C,EAAkB/nC,KAAKhC,EACzB,IAGK,CAAE8pC,oBAAmBC,oBAC9B,CAEAC,iBAAAA,GACE,MAAM,kBAAEF,EAAiB,kBAAEC,GAAsB3tC,KAAKwtC,6BACtDK,EAAAA,EAAAA,IAAuB,CAAEC,cAAeJ,EAAmBK,aAAa,KACxEF,EAAAA,EAAAA,IAAuB,CAAEC,cAAeH,EAAmBI,aAAa,GAC1E,CAEAC,iBAAAA,GACE,OAAOhuC,KAAKyE,QAAQupC,mBACtB,CAEAjB,YAAAA,GACE,OAAOj/B,OAAO9N,KAAKtK,GAAG6Q,QAAQ,KAAM,IACtC,CAEA0nC,yBAAAA,GACE,IAAKjuC,KAAKuD,QAAUvD,KAAKuD,MAAM2qC,eAAe,KAC5C,OAGF,MAAM3sC,EAAcvB,KAAKy+B,mBAAkB,GAAO0I,MAChD,CAACxF,EAAGC,IAAMD,EAAEjD,SAASr+B,MAAMsE,mBAAoBrB,EAAIs+B,EAAElD,SAASr+B,MAAMsE,mBAAoBrB,IAEpF6qC,EAAoB5sC,EAAYyqC,MAAMoC,GAAeA,EAAW1P,SAASh+B,YACzE2tC,EAAmB9sC,EAAYyqC,MAAMoC,GAAeA,EAAW1P,SAAS4P,SAExEC,EAAqD,GACrDC,EAAoD,GACpDC,EAAmD,GAEzDltC,EAAYoC,SAAQ,CAACyqC,EAAY/zC,KAC/B,MAAMq0C,EAA0BntC,EAAYlQ,QAC1C,CAACs9C,EAAcnyB,IACbA,EAAIniB,GAASwO,KAAK6Q,MAAM00B,EAAW1P,SAASr+B,MAAMiD,KAAOuF,KAAK6Q,MAAMi1B,EAAcjQ,SAASr+B,MAAMiD,KAErG8qC,EAAWnO,iBAAiB,CAAE2O,OAAQF,EAAwB9+C,SAC9D,MAAM8Q,EAAY0tC,EAAW1P,WAAayP,GAAmBzP,SACvDmQ,EAAWT,EAAW1P,WAAa2P,GAAkB3P,SACrDoQ,EAAgBV,EAAW1P,SAASxwC,OAASigD,GAAmBzP,SAASxwC,KACzE6gD,EAAaX,EAAW1P,SAASxwC,OAASmgD,GAAkB3P,SAASxwC,KACtEwS,GAAcmuC,IACbC,EACFP,EAA8B3oC,KAAKwoC,GAC1BW,EACTP,EAA6B5oC,KAAKwoC,GAElCK,EAA4B7oC,KAAKwoC,GAErC,IAGFK,EAA4BtH,MAC1B,CAACxF,EAAGC,IACF2J,EAA6BhxC,QAAQonC,EAAEjD,SAASsQ,yBAChDzD,EAA6BhxC,QAAQqnC,EAAElD,SAASsQ,2BAGzB,IACtBP,KACAD,EACHH,KACGE,EACHJ,GACA98C,OAAOwE,SACU8N,SAAQ,CAACyqC,EAAY/zC,KACtC+zC,EAAYnO,iBAAiB,CAAEloC,OAAQsC,GAAQ,GAEnD,EAGF,S,oLCtPA,MAAM40C,EAAa,CAAC,EAEb,SAASC,EAAcxgD,GAI+D,IAJ9D,IAC7BygD,EAAG,IACH52C,EAAG,UACH62C,GACyF1gD,EACzF,MAAM8V,EAAQyqC,EAAWE,GACzB,OAAI3qC,GAAO6qC,WAAaD,GAAa72C,EAC5BiM,EAAMjM,GACHA,EAGL,KAFEiM,CAGX,CAEO,SAAS8qC,EAAc52C,GAK2C,IAL1C,IAC7By2C,EAAG,IACH52C,EAAG,MACHvB,EAAK,UACLo4C,GACqE12C,EACrEu2C,EAAWE,GAAO,IACZF,EAAWE,IAAME,WAAaD,EAAYH,EAAWE,GAAO,CAAC,EACjE,CAAC52C,GAAMvB,EACPq4C,SAAUD,EAEd,C,eChCA,MA4EMG,EAAa,CACjB13B,KAAM,GACN/E,KAAM,GACNC,IAAK,GACLuC,MAAO,GACPwC,OAAQ,GACR5G,KAAM,GACNk+B,WAAY,EACZI,sBAAuB,EACvBC,YAAY,EACZC,OAAO,EACPC,UAAM9/C,EACNoJ,UAAMpJ,EACNsxB,uBAAmBtxB,EACnBwwB,wBAAoBxwB,EACpBwxB,4BAAwBxxB,EACxB2wB,8BAA0B3wB,EAC1B+/C,SAAU,GACVC,sBAAkBhgD,EAClBigD,sBAAkBjgD,EAClBizB,oBAAgBjzB,EAChB8oB,cAAU9oB,EACV+oB,cAAU/oB,EACVgpB,aAAShpB,EACTsoB,eAAWtoB,EACXwoB,gBAAYxoB,EACZkgD,YAAQlgD,EACR4nB,cAAU5nB,EACVi2B,eAAWj2B,EACXqoB,gBAAYroB,EACZokB,iBAAapkB,EACb0R,YAAa,IAqEf,MAAMixB,UAAc9yB,IAAAA,MAClB,gBAAO+M,GACLzM,KAAKoqC,UACH,QACA,SACA,OACA,aACA,YACA,OACA,OACA,MACA,QACA,OACA,SACA,WACA,WACA,UACA,YACA,WACA,aACA,WACA,SACA,YACA,OACA,cACA,aACA,cACA,YACA,oBACA,qBACA,yBACA,2BACA,cACA,YACA,SACA,cACA,WACA,mBACA,mBACA,iBACA,YACA,aACA,WACA,WACA,WACA,iBACA,kBACA,aACA,kBACA,YACA,wBACA,UACA,SACA,QAEJ,CAEA,gBAAajnC,CAAGmW,GAQmB,IAPjCxe,OAAQK,EAAS,WACjBjC,EAAU,UACVoO,EAAS,QACTzS,EAAO,gBACPm7C,EAAe,eACfC,GAAiB,EAAI,UACrBC,GACe52B,EACf,MAAMxe,EAASK,EAAUoL,QAAQ,IAAK,KAC/B/B,GAASyrC,EACZzd,EAAMC,QACHF,GA3H0B75B,KAAA,IAAC,MACpC8L,EAAK,OACL1J,EAAM,WACN5B,EAAU,UACVoO,GAMD5O,EAAA,OAAK8L,EAAM1J,SAAWA,GAAU0J,EAAMtL,aAAeA,GAAcsL,EAAM8C,YAAcA,CAAS,EAkHrF6oC,CAA6B,CAAE3rC,MAAO+tB,EAAGz3B,SAAQ5B,aAAYoO,eA/G7C0Y,KAAA,IAAC,MAAExb,EAAK,KAAE4rC,GAAuCpwB,EAAA,OAAMowB,GAAQ5rC,EAAM0rC,YAAcE,CAAI,EAgHvGC,CAAoB,CAAE7rC,MAAO+tB,EAAG6d,KAAMF,KA3GzB1rC,KAAsC,IAArBA,EAAM4qC,WAAoB5qC,EAAMirC,WA4G9Da,CAAgB/d,IA/GLhf,KAAA,IAAC,MAAE/O,EAAK,QAAE3P,GAAoD0e,EAAA,OAClF1e,GAAS07C,gBAAkB17C,EAAQ07C,eAAe/rC,EAAM,EA+G/CgsC,CAAe,CAAEhsC,MAAO+tB,EAAG19B,cAC1B09B,EAAEr5B,aAAeC,EAAAA,GAAWC,OAC3B0U,OAAOs1B,UAAU7Q,EAAEI,SAxIAjkC,KAAA,IAAC,MAAE8V,EAAK,QAAE3P,GAAoDnG,EAAA,SAC5F8V,EAAM64B,YAAexoC,GAASwoC,YAC9B74B,EAAM84B,cAAiBzoC,GAASyoC,cAChC94B,EAAMisC,cAAiB57C,GAAS+6C,UAE/B/6C,GAAS67C,SAAYlsC,EAAMksC,OAAO,EAoIxBC,CAAyB,CAAEnsC,MAAO+tB,EAAG19B,eAE3C,GAEJ,GAAI2P,EAMF,OALIA,EAAMirC,iBACFjrC,EAAMosC,6BACH/7C,GAASg8C,iCACZrsC,EAAMssC,UAAU,CAAEC,UAAWC,EAAAA,EAAeC,UAAWjB,oBAExDxrC,EAGT,MAAM0sC,EAAW1e,EAAM8Y,OAAc,IAChCiE,EACHz0C,SACAwM,YACApO,aACAg3C,YACAiB,QAASt8C,GAASs8C,QAClB9T,YAAaxoC,GAASwoC,UACtBC,cAAezoC,GAASyoC,YACxBmT,cAAe57C,GAAS+6C,SACxBc,SAAU77C,GAAS67C,SAKrB,aAFMQ,EAASJ,UAAU,CAAEC,UAAWC,EAAAA,EAAeI,QAASpB,oBAEvDkB,CACT,CAEA,mBAAaG,CAAOC,GAElB,GAAoC,IAAhCA,EAAqB1hD,OACvB,MAAO,CAAC,EAGV,UACQ2hD,QAAQhpC,IACZ+oC,EAAqBr6C,KAAIimB,IAAA,IAAC,OAAEpiB,EAAM,WAAE5B,EAAU,UAAEoO,GAAW4V,EAAA,OACzDld,KAAKmD,IAAI,CAAErI,OAAQA,EAAQ5B,aAAYoO,aAAY,KAevD,OAZagqC,EAAqB9uC,QAChC,CAACgvC,EAAat0C,KAAiB,IAC1Bs0C,EACH,CAACt0C,EAAapC,QAAS03B,EAAMC,QAC1BF,GACCA,EAAEz3B,SAAWoC,EAAapC,QAC1By3B,EAAEr5B,aAAegE,EAAahE,YAC9Bq5B,EAAEjrB,YAAcpK,EAAaoK,YAC/B,MAEJ,CAAC,EAGL,CAAE,MAAOmqC,GACP,CAEJ,CA2DA,kBAAMC,CAAY9zB,GAMf,IANgB,gBACjBoyB,EAAe,QACfn7C,EAAU,CAAE3G,KAAMyjD,EAAAA,EAAwBC,MAI3Ch0B,EACK7hB,EAA4B,KAC5B2zC,GAAQ,EACRmC,GAAkB,EAEtB,MAAMC,GAAkBC,EAAAA,EAAAA,IAAuB,CAC7C1yC,SAAUW,KAAKgyC,OAAOn9C,GACtBo9C,mBAAoB,CAAC,KACrBjC,oBAGFhwC,KAAKigC,iBAAiB,CACpBwP,YAAY,EACZqC,oBAGF,IACE/1C,QAAa+1C,CACf,CAAE,MAAOL,IACHS,EAAAA,EAAAA,IAAgBT,KAClBI,GAAkB,GAIpBnC,EAAQ+B,aAAeU,EAAAA,EAEzB,CAEA,MAAMC,GAAuBr2C,IAAS81C,GAAmBh9C,EAAQ3G,OAASyjD,EAAAA,EAAwBC,IAalG,OAPA5xC,KAAKigC,iBAAiB,IAChBmS,EAAsB7C,EAAa,CAAC,EACxCG,QACAmC,kBACApC,YAAY,IAGP1zC,CACT,CAEA,qCAAMs2C,GAIE,IAJ8B,gBACpCrC,GAGDrgD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACH,MAAMoM,QAAaiE,KAAK0xC,aAAa,CAAE1B,oBACvC,SAAIj0C,GAAQA,EAAKmV,KAAKthB,OAAS,GAAKoQ,KAAKkR,KAAKthB,OAAS,IAC9CoQ,KAAKkR,KAAKlR,KAAKkR,KAAKthB,OAAS,IAAMmM,EAAKmV,KAAK,EAGxD,CAEA,eAAM4/B,CAAS7xB,GAMZ,IACGpqB,GAPU,UACdk8C,EAAS,gBACTf,GAID/wB,EAEC,GAAI8xB,IAAcC,EAAAA,EAAeI,QAC/Bv8C,EAAU,CAAE3G,KAAMyjD,EAAAA,EAAwBC,SACrC,IAAIb,IAAcC,EAAAA,EAAeC,UAMtC,OALAp8C,EAAU,CAAE3G,KAAMyjD,EAAAA,EAAwBW,QACrCtyC,KAAKwvC,uBAAyB,GA5bG,KA6bpC36C,EAAQk7C,OAAS/vC,KAAK+vC,OAI1B,CACI/vC,KAAK9G,aAAeC,EAAAA,GAAWC,QACjCvE,EAAQ67C,OAAwB,MAAf1wC,KAAK0wC,QAAwB1wC,KAAK0wC,QAGrD,MAAM30C,QAAaiE,KAAK0xC,aAAa,CAAE1B,kBAAiBn7C,YAExD,IAAKkH,IAA2B,IAAnBA,EAAKw2C,UAIhB,YAHAvyC,KAAKigC,iBAAiB,CACpBuP,uBAAwBxvC,KAAKwvC,uBAAyB,GAAK,IAI/D,GAAIxvC,KAAKsH,YAAcvL,EAAKuL,WAAatH,KAAKlF,OAAOR,gBAAkByB,EAAKjB,QAAQR,cAClF,OAGF,MAAMk4C,EAAe,CACnB7C,KAAM5zC,EAAK4zC,KACX12C,KAAM8C,EAAK9C,KACX4e,KAAM9b,EAAK8b,KACX/E,KAAM/W,EAAK+W,KACXC,IAAKhX,EAAKgX,IACVuC,MAAOvZ,EAAKuZ,MACZwC,OAAQ/b,EAAK+b,OACb5G,KAAMnV,EAAKmV,KACXiQ,kBAAmBplB,EAAKolB,kBACxBd,mBAAoBtkB,EAAKskB,mBACzBgB,uBAAwBtlB,EAAKslB,uBAC7Bb,yBAA0BzkB,EAAKykB,yBAC/BovB,SAAU7zC,EAAK6zC,UAAY,GAC3BC,iBAAkB9zC,EAAK8zC,iBACvBC,iBAAkB/zC,EAAK+zC,iBACvBhtB,eAAgB/mB,EAAK+mB,eACrBnK,SAAU5c,EAAK4c,SACfC,SAAU7c,EAAK6c,SACfC,QAAS9c,EAAK8c,QACdV,UAAWpc,EAAKoc,UAChBE,WAAYtc,EAAKsc,WACjB03B,OAAQh0C,EAAKg0C,OACbt4B,SAAU1b,EAAK0b,SACfg7B,SAAU12C,EAAK02C,SACf3sB,UAAW/pB,EAAK+pB,UAChB5N,WAAYnc,EAAKmc,WACjBjE,YAAalY,EAAKkY,YAClBy+B,UAAW32C,EAAK22C,UAChBlD,sBAAuB,EACvBjuC,YAAaxF,EAAKwF,aAAe,GACjC6tC,UAAWvb,KAAK8e,OAGlB,GAEI5B,IAAcC,EAAAA,EAAeI,UAC7B,CAACj4C,EAAAA,GAAWE,QAASF,EAAAA,GAAWG,MAAOH,EAAAA,GAAWI,QAAQvK,SAASgR,KAAK9G,YAE1E,CAIA,IAAI05C,EAAS,EACTC,EAAS,EACTC,GAAc,EAClB,KAAOF,EAAS5yC,KAAKkR,KAAKthB,QAAUijD,EAAS92C,EAAKmV,KAAKthB,QAAQ,CAC7D,MAAMmjD,EAAQ/yC,KAAKkR,KAAK0hC,GAClBI,EAAQj3C,EAAKmV,KAAK2hC,GACxB,QAAchjD,IAAVmjD,EACF,MACK,GAAID,IAAUC,EAEnBhzC,KAAK6X,KAAK+6B,GAAU72C,EAAK8b,KAAKg7B,GAC9B7yC,KAAK8S,KAAK8/B,GAAU72C,EAAK+W,KAAK+/B,GAC9B7yC,KAAK+S,IAAI6/B,GAAU72C,EAAKgX,IAAI8/B,GAC5B7yC,KAAKsV,MAAMs9B,GAAU72C,EAAKuZ,MAAMu9B,GAChC7yC,KAAK8X,OAAO86B,GAAU72C,EAAK+b,OAAO+6B,GAClCD,IACAC,SACK,GAAIE,EAAQC,QAAmBnjD,IAAVkjD,EAAqB,CAG/C,IAAoB,IAAhBD,GAAqB,CAACrhC,EAAAA,GAAUiB,EAAGjB,EAAAA,GAAUX,GAAG9hB,SAASgR,KAAKsH,WAAY,CAC5E,MAAM2rC,EAAaL,EAAS,EACtBM,GAAWvY,EAAAA,EAAAA,IAAsB36B,KAAKkR,KAAK+hC,IAC3CE,GAAUxY,EAAAA,EAAAA,IAAsB5+B,EAAKmV,KAAK2hC,IAEhD,GACGphC,EAAAA,GAAUiB,IAAM1S,KAAKsH,YAAa8rC,EAAAA,EAAAA,GAAWF,EAAUC,EAAS,CAAEnJ,aAAc,KAChFv4B,EAAAA,GAAUX,IAAM9Q,KAAKsH,YAAa+rC,EAAAA,EAAAA,GAAYH,EAAUC,GACzD,CACAnzC,KAAKkR,KAAK+hC,GAAcl3C,EAAKmV,KAAK2hC,GAClC7yC,KAAK6X,KAAKo7B,GAAcl3C,EAAK8b,KAAKg7B,GAClC7yC,KAAK8S,KAAKmgC,GAAcl3C,EAAK+W,KAAK+/B,GAClC7yC,KAAK+S,IAAIkgC,GAAcl3C,EAAKgX,IAAI8/B,GAChC7yC,KAAKsV,MAAM29B,GAAcl3C,EAAKuZ,MAAMu9B,GACpC7yC,KAAK8X,OAAOm7B,GAAcl3C,EAAK+b,OAAO+6B,GACtCC,EAAaG,EAEbJ,IACA,QACF,CACF,CACA7yC,KAAKkR,KAAKoa,OAAOsnB,EAAQ,EAAG72C,EAAKmV,KAAK2hC,IACtC7yC,KAAK6X,KAAKyT,OAAOsnB,EAAQ,EAAG72C,EAAK8b,KAAKg7B,IACtC7yC,KAAK8S,KAAKwY,OAAOsnB,EAAQ,EAAG72C,EAAK+W,KAAK+/B,IACtC7yC,KAAK+S,IAAIuY,OAAOsnB,EAAQ,EAAG72C,EAAKgX,IAAI8/B,IACpC7yC,KAAKsV,MAAMgW,OAAOsnB,EAAQ,EAAG72C,EAAKuZ,MAAMu9B,IACxC7yC,KAAK8X,OAAOwT,OAAOsnB,EAAQ,EAAG72C,EAAK+b,OAAO+6B,IAE1CD,IACAC,GACF,MAAWE,EAAQC,EACjBJ,KAEAU,QAAQC,KAAK,gCACb5hD,OAAO6U,QAAQC,eAAe,wCAAyC,CACrEC,MAAO,CACL8sC,eAAgBxzC,KAAKkR,KAAKthB,OAC1B6jD,eAAgB13C,EAAKmV,KAAKthB,OAC1BgjD,SACAC,SACAE,QACAC,WAIR,CAEAR,EAAathC,KAAOlR,KAAKkR,KACzBshC,EAAa36B,KAAO7X,KAAK6X,KACzB26B,EAAa1/B,KAAO9S,KAAK8S,KACzB0/B,EAAaz/B,IAAM/S,KAAK+S,IACxBy/B,EAAal9B,MAAQtV,KAAKsV,MAC1Bk9B,EAAa16B,OAAS9X,KAAK8X,MAC7B,CAE+B9X,KAAKigC,iBAAiBuS,IAInD7gD,OAAO6U,QAAQC,eAAe,mDAAoD,CAAEC,MAAO1G,OAExFA,MAEHrO,OAAO6U,QAAQC,eAAe,wCAAyC,CAAEC,MAAO1G,OAElFA,KAAK0B,QAAQqvC,EAAW/wC,KAAM+wC,EAChC,CAEA,gCAAMH,GACJ,IACE,aAAa5wC,KAAK8xC,eACpB,CAAE,MACA,CAEJ,CAEA4B,cAAAA,GAGA,CAEAC,IAAAA,CAAKC,GACH7yC,MAAM4yC,KAAKC,GACX,MAAM,UAAExE,EAAY,GAAMwE,GACpB,SAAEvE,GAAcH,EAAe,CAAEC,IAAKnvC,KAAKmvC,OAA0C,CAAC,EAgC5F,OA/BInvC,KAAKsH,WAAa+nC,IAAaD,IACjCE,EAAe,CAAEH,IAAKnvC,KAAKmvC,IAAK52C,IAAK,WAAYvB,MAAOo4C,EAAWA,cACnEpvC,KAAK29B,WAAa,CAChBlsB,EAAAA,GAAUC,GACVD,EAAAA,GAAUE,GACVF,EAAAA,GAAUG,GACVH,EAAAA,GAAUI,GACVJ,EAAAA,GAAUK,IACVL,EAAAA,GAAUM,IACVN,EAAAA,GAAUO,IACVP,EAAAA,GAAUQ,EACVR,EAAAA,GAAUS,GACVT,EAAAA,GAAUU,IACVnjB,SAASgR,KAAKsH,WAChBtH,KAAKzN,SAAWyN,KAAK29B,WACjBxd,EAAAA,GAA0BngB,KAAKsH,WAC/B,EACJtH,KAAK6zC,SAAW7zC,KAAK8d,cACrB9d,KAAK6hB,SAAW7hB,KAAK8zC,gBACrB9zC,KAAK4vC,SAAW5vC,KAAK4vC,UAAY,GACjC5vC,KAAK+zC,eAAiB/zC,KAAK6hB,SAASyG,SAAQ,CAACzG,EAAUxnB,KACrD,MAAMk2B,EAAYvwB,KAAK6hB,SAASxnB,EAAQ,KAAO,EAC/C,MAAO,IAAInH,MAAMwU,KAAK,CAAE9X,OAAQiyB,EAAW0O,EAAY,IAAKjiB,KAAKzF,KAAKlB,IAAI,EAAGtN,EAAQ,IAAKA,EAAM,KAGhG2F,KAAKsH,WAAatH,KAAKlF,SACzBkF,KAAKuB,YAxeX,SAA6BgW,GAAiF,IAAhF,OAAEzc,EAAM,YAAEyG,GAAoEgW,EAC1G,OACEhW,GAAatK,KAAKH,IAChB,IAAIk9C,EACJ,OAAQl9C,EAAKk9C,WACX,KAAKre,EAAAA,GAAiBI,UACpBie,EAAYpe,EAAAA,GAAeG,UAC3B,MACF,KAAKJ,EAAAA,GAAiBK,MACpBge,EAAYpe,EAAAA,GAAeI,MAC3B,MACF,KAAKL,EAAAA,GAAiBse,SACpBD,EAAYpe,EAAAA,GAAeqe,SAG/B,MAAO,IACFn9C,EACHguB,UAAY,GAAEhqB,EAAOR,iBAAiBxD,EAAKk9C,aAAal9C,EAAKo9C,gBAC7DF,YACD,KACG,EAEV,CAkdyBG,CAAqB,CACtCr5C,OAAQkF,KAAKlF,OACbyG,YAAavB,KAAKuB,eAGfvB,IACT,CAEA2rC,OAAAA,CAAQ92C,GAGN,OAFAkM,MAAM4qC,QAAQ92C,GDvmBX,SAA0BmrB,GAAgD,IAA/C,IAAEmvB,GAA2CnvB,SACtEivB,EAAWE,EACpB,CCsmBIiF,CAAkB,CAAEjF,IAAKnvC,KAAKmvC,MACvBnvC,IACT,CAEA8d,WAAAA,GACE,GAAI9d,KAAK9G,aAAeC,EAAAA,GAAWC,MACjC,OAAO/J,IAET,OAAQ2Q,KAAKsH,WACX,KAAKmK,EAAAA,GAAUC,GACf,KAAKD,EAAAA,GAAUE,GACf,KAAKF,EAAAA,GAAUG,GACf,KAAKH,EAAAA,GAAUI,GACf,KAAKJ,EAAAA,GAAUK,IACb,OAAO,GACT,KAAKL,EAAAA,GAAUM,IACf,KAAKN,EAAAA,GAAUO,IACf,KAAKP,EAAAA,GAAUQ,EACf,KAAKR,EAAAA,GAAUS,GACf,KAAKT,EAAAA,GAAUU,GACb,OAAO,GAIb,CAEAyd,iBAAAA,GACE,MAAMykB,EAAuBnF,EAAe,CAAEC,IAAKnvC,KAAKmvC,IAAK52C,IAAK,iBAAkB62C,UAAWpvC,KAAKovC,YACpG,GAAIiF,EACF,OAAOA,EAGT,MAAMC,EAAUt0C,KAAK6X,KAAK5gB,KAAI,CAACiJ,EAAGsc,KAAOxc,KAAK6X,KAAK2E,GAAKxc,KAAK8S,KAAK0J,GAAKxc,KAAKsV,MAAMkH,GAAKxc,KAAK+S,IAAIyJ,IAAM,IAMhG+3B,EAAe,CAAE18B,KALR7X,KAAK6X,KAAKrV,QACvB,CAACC,EAAKoV,EAAM2E,IAAM,IAAI/Z,GAAY,IAAN+Z,EAAU3E,EAAOy8B,EAAQ,GAAK7xC,EAAI+Z,EAAI,GAAK83B,EAAQ93B,EAAI,IAAM,IACzF,IAGmClH,MAAOg/B,GAI5C,OAFAhF,EAAe,CAAEH,IAAKnvC,KAAKmvC,IAAK52C,IAAK,iBAAkBvB,MAAOu9C,EAAcnF,UAAWpvC,KAAKovC,YAErFmF,CACT,CAEAvzB,cAAAA,GACE,MAAMwzB,EAAoBtF,EAAe,CAAEC,IAAKnvC,KAAKmvC,IAAK52C,IAAK,cAAe62C,UAAWpvC,KAAKovC,YAC9F,GAAIoF,EACF,OAAOA,EAET,MAAMzzB,EAA0B,CAAC,EACjC,IACIQ,EADA/P,EAAM,EAEV,IAAK,IAAIgL,EAAI,EAAGsV,EAAM9xB,KAAKkR,KAAKthB,OAAQmiC,EAAMD,GAAO,EAAGC,EAAMvV,EAAIsV,EAAMtV,EAAIsV,EAAKC,EAAMvV,IAAMA,IAAK,CAChG,MAAMtL,GAAOypB,EAAAA,EAAAA,IAAsB36B,KAAKkR,KAAKsL,IACvCrL,GAAasjC,EAAAA,EAAAA,IAAmBvjC,GAClCC,IAAeoQ,IACjBR,EAAY5P,GAAcK,EAC1BA,IACA+P,EAAUpQ,EAEd,CAGA,IAAI4d,EAAAA,EAAAA,OAAc/uB,KAAKyX,SAAU,CAE/B,MAAOi9B,EAAMC,EAAIC,GAAM,IAAI50C,KAAKyX,SAAW,QAAWzX,KAAKyX,SAAW,KAAO,IAAKzX,KAAKyX,SAAW,KAC5FA,EAAY,GAAEi9B,KAAQG,OAAOF,GAAIG,SAAS,EAAG,QAAQD,OAAOD,GAAIE,SAAS,EAAG,OAE9EvzB,IAAY9J,IACdsJ,EAAYtJ,GAAYjG,EAE5B,CAGA,OADA89B,EAAe,CAAEH,IAAKnvC,KAAKmvC,IAAK52C,IAAK,cAAevB,MAAO+pB,EAAaquB,UAAWpvC,KAAKovC,YACjFruB,CACT,CAEA2Z,cAAAA,GACE,MAAM8Z,EAAoBtF,EAAe,CAAEC,IAAKnvC,KAAKmvC,IAAK52C,IAAK,cAAe62C,UAAWpvC,KAAKovC,YAC9F,GAAIoF,EACF,OAAOA,EAET,MAAMzzB,EAAc/gB,KAAKghB,iBACnByZ,EAAcn4B,OAAOC,KAAKwe,GAC7B9pB,KAAKka,IACJ,MAAOG,EAAMF,EAAOI,GAAOL,EAAWjD,MAAM,KAC5C,OAAO,IAAI2lB,KAAK/lB,OAAOmc,SAAS3Y,GAAOxD,OAAOmc,SAAS7Y,GAAS,EAAGtD,OAAOmc,SAASzY,GAAK,IAEzF21B,MAAK,CAACxF,EAAGC,IAAMD,EAAErI,UAAYsI,EAAEtI,YAGlC,OADAgW,EAAe,CAAEH,IAAKnvC,KAAKmvC,IAAK52C,IAAK,cAAevB,MAAOyjC,EAAa2U,UAAWpvC,KAAKovC,YACjF3U,CACT,CAEAqZ,aAAAA,GACE,IAAK9zC,KAAK29B,YAAc39B,KAAK9G,aAAeC,EAAAA,GAAWC,MACrD,OAAOlG,MAAMwU,KAAK,CAAE9X,OAAQoQ,KAAKkR,KAAKthB,SAAUqH,KAAI,CAACiJ,EAAG7F,IAAUA,IAGpE,MAAMwnB,EAAW,GACXd,EAAc/gB,KAAKghB,iBAEzB,IAAK,IAAIxE,EAAI,EAAGA,EAAIxc,KAAKkR,KAAKthB,OAAQ4sB,GAAK,EAAG,CAC5C,MAAMtL,GAAOypB,EAAAA,EAAAA,IAAsB36B,KAAKkR,KAAKsL,IAC7C,IAAIlZ,EAAIuF,KAAK0X,MAAwB,GAAlBrP,EAAKmB,WAAkBnB,EAAKqB,aAAevS,KAAKqgB,oBAAsBrgB,KAAKzN,UAC9F+Q,GAAKyd,GAAY0zB,EAAAA,EAAAA,IAAmBvjC,IAASlR,KAAK8hB,eAClDD,EAASrF,GAAKlZ,CAChB,CAEA,OAAOue,CACT,CAEAmb,WAAAA,CAAYxgB,GACV,OAAKxc,KAAK29B,YAAc39B,KAAK9G,aAAeC,EAAAA,GAAWC,MAGhD4G,KAAK6hB,SAASrF,GAFZA,CAGX,CAEAsF,YAAAA,GACE,GAAK9hB,KAAK29B,YAAc39B,KAAK9G,aAAeC,EAAAA,GAAWC,MAGvD,OAAOyP,KAAK0X,KAAKvgB,KAAKmhB,kBAAoBnhB,KAAKzN,SACjD,CAEAkzB,sBAAAA,CAAuBprB,GACrB,GAAI2F,KAAK6hB,SACP,IAAK,IAAIrF,EAAI,EAAGA,EAAIxc,KAAK6hB,SAASjyB,OAAQ4sB,IACxC,GAAIxc,KAAK6hB,SAASrF,KAAOniB,EACvB,OAAOmiB,EAIb,OAAQ,CACV,CAEA8I,iBAAAA,CAAkB/sB,EAAkB8B,GAClC,MAAM06C,EAAY/0C,KAAKylB,uBAAuBprB,GAC9C,GAAI06C,GAAa,EAAG,CAElB,OADkB/0C,KAAKzH,GACNw8C,IAAc,IACjC,CACA,OAAO,IACT,CAEAC,cAAAA,GACE,MAAMC,EAAoB/F,EAAe,CAAEC,IAAKnvC,KAAKmvC,IAAK52C,IAAK,cAAe62C,UAAWpvC,KAAKovC,YAC9F,GAAI6F,EACF,OAAOA,EAET,MAAMC,EAAkC,CAAC,EACzC,IAAK,IAAI14B,EAAI,EAAGA,EAAIxc,KAAKkR,KAAKthB,OAAQ4sB,IACpC04B,EAAYl1C,KAAKkR,KAAKsL,IAAMA,EAG9B,OADA8yB,EAAe,CAAEH,IAAKnvC,KAAKmvC,IAAK52C,IAAK,cAAevB,MAAOk+C,EAAa9F,UAAWpvC,KAAKovC,YACjF8F,CACT,CAEArwC,wBAAAA,CAAyBD,GACvB,OAAyB,IAArB5E,KAAKkR,KAAKthB,OACL,GAEFulD,EAAAA,EAAAA,IAA0B,CAC/BvwC,YACAJ,MAAOxE,MAEX,CAEAiF,yBAAAA,CAA0BD,GACxB,OAAyB,IAArBhF,KAAKkR,KAAKthB,OACL,GAEFqV,EAAAA,EAAAA,IAA0B,CAC/BD,YACAR,MAAOxE,MAEX,CAEAgyC,MAAAA,CAAOn9C,GACL,MAAML,EAAqB,CACzBsG,OAAQkF,KAAKlF,OACb5B,WAAY8G,KAAK9G,WACjBoO,UAAWtH,KAAKsH,WAAa,KAC7Bg2B,YAAat9B,KAAKs9B,YAClBD,UAAWr9B,KAAKq9B,UAChBuS,SAAU5vC,KAAKywC,YACfU,QAASnxC,KAAKmxC,WACXt8C,GAGC21B,EAAUh2B,EAAO0E,aAAeC,EAAAA,GAAWC,MAEjD,IAAI6hB,IADoB8T,EAAAA,EAAAA,OAAyC,qBAA3Bzf,SAASjQ,SAAS+1C,MACzB5qB,EAAU,yBAA2B,GAMpE,OAJIuE,EAAAA,EAAAA,QACF9T,EAASo6B,QAAQC,IAAIC,YAGf,GAAEt6B,oBAAyBu6B,EAAAA,UAAsB,CAAEC,IAAK5hB,KAAK8e,SAAUn+C,KACjF,CAEAkhD,YAAAA,GACE,OAAOC,EAAAA,EAAAA,IAA0B31C,KAAK9G,WAAY8G,KAAKlF,OACzD,CAEA86C,SAAAA,GACE51C,KAAKigC,iBAAiBsP,EACxB,EAGF/c,EAAM/lB,YAEN,S,2CCj3BO,IAAKukC,EAAc,SAAdA,GAAc,OAAdA,EAAc,kBAAdA,EAAc,sBAAdA,CAAc,MAKdW,EAAuB,SAAvBA,GAAuB,OAAvBA,EAAuB,UAAvBA,EAAuB,cAAvBA,CAAuB,K,0HCL5B,MAAMkE,EAAqB,CAChCt4B,EAAG,EACH2C,EAAG,GACHwJ,IAAK,GACL0L,KAAM,I,eCkBD,MAAM0gB,EAA8B5/C,IAAY,CACrDyY,cAAe,CACbwH,QAAS,CACP3L,OAAQ,IACFtU,IAAU82B,EAAAA,GAAMC,MAAQkb,EAAAA,GAAkBC,EAAAA,GAC9C,CAACpb,EAAAA,GAAMC,OAAQkb,EAAAA,GACf,CAACnb,EAAAA,GAAM+oB,MAAO3N,EAAAA,IAEhB4N,eAAgB1gB,EAAAA,GAChB2gB,4BAA6B1gB,EAAAA,IAE/Bxe,OAAQ,CACN4J,SAAU,EACVu1B,UAAW,EACXznC,OAAQ,GAEVtC,IAAK,CACHvC,OAAQ6f,EAAAA,GAAa4L,GACrB7e,SAAUxK,EAAAA,GAAaC,WACvBnR,OAAQ,CACNsb,OAAQ,CACNjK,IAAK,GACLL,KAAM,GAERN,KAAM,CACJ3R,KAAMwc,EAAAA,GAAU+e,KAChBl2B,MAAO,SAGXonB,KAAM,CACJlQ,OAAQ,CACNjK,IAAK,GACLL,KAAM,GACNM,MAAO,IAETZ,KAAM,CACJ3R,KAAMwc,EAAAA,GAAUkH,IAGpB8I,OAAQ,CACNjQ,OAAQ,CACNjK,IAAK,GACLC,MAAO,GAETZ,KAAM,CACJ3R,KAAMwc,EAAAA,GAAU6J,EAChBhhB,MAAO,UAIbkN,MAAO,CACLzS,MAAO8vB,EAAAA,GAAaC,IACpBvN,KAAM,CACJ/F,OAAQ,CACNtK,KAAM,GAERN,KAAM,CACJ3R,KAAMwc,EAAAA,GAAUkH,EAChB5R,WAAY2R,EAAAA,GAAYC,EACxBrR,QAAS,CACPC,IAAKqR,EAAAA,GAAQlH,IACbjK,OAAQmR,EAAAA,GAAQlH,IAChBxK,KAAM0R,EAAAA,GAAQlH,IACdlK,MAAOoR,EAAAA,GAAQlH,QAKvBjK,OAAQ,CACNzC,OAAQ6f,EAAAA,GAAavJ,EACrB1J,SAAUxK,EAAAA,GAAaG,IACvBgQ,KAAM,CACJ/F,OAAQ,CACNjK,IAAK,GAEPX,KAAM,CACJ3R,KAAMwc,EAAAA,GAAUkH,KAItBzR,KAAM,CACJnS,MAAO8vB,EAAAA,GAAazS,EACpBgC,aAAc,CACZE,aAAc,GACd9C,OAAQ,CACNjK,KAAM,EACNL,KAAM,GAERN,KAAM,CACJ3R,KAAMwc,EAAAA,GAAUkH,EAChB7R,OAAQ,SAGZpE,UAAW,CACT8O,OAAQ,CACNjK,IAAK,EACLL,KAAM,IAERN,KAAM,CACJ3R,KAAMwc,EAAAA,GAAU6J,EAChBxU,OAAQ,MACRD,OAAQ,qBAGZ4X,WAAY,CACVjN,OAAQ,CACNtK,KAAM,IAERN,KAAM,CACJ3R,KAAMwc,EAAAA,GAAUkH,MAKxB4gB,kBAAmB,CACjBhoB,QAAS,CACPvM,OAAQ,IACRY,OAAQtU,IAAU82B,EAAAA,GAAMC,MAAQ6b,EAAAA,GAAsBE,EAAAA,IAExDjyB,OAAQ,CACN4J,SAAU,EACVu1B,UAAW,EACXznC,OAAQ,GAEVtC,IAAK,CACHvC,OAAQ6f,EAAAA,GAAalM,GAEvBnR,MAAO,CACLzS,MAAO8vB,EAAAA,GAAaC,IACpBvN,KAAM,CACJ/F,OAAQ,CACNtK,KAAM,GAERN,KAAM,CACJ3R,KAAMwc,EAAAA,GAAUkH,EAChB5R,WAAY2R,EAAAA,GAAYC,EACxBrR,QAAS,CACPC,IAAKqR,EAAAA,GAAQlH,IACbjK,OAAQmR,EAAAA,GAAQlH,IAChBxK,KAAM0R,EAAAA,GAAQlH,IACdlK,MAAOoR,EAAAA,GAAQlH,QAKvBjK,OAAQ,CACNzC,OAAQ6f,EAAAA,GAAalM,GAEvBzR,KAAM,CACJnS,MAAO8vB,EAAAA,GAAazS,EACpBm/B,eAAgB,CACdj9B,aAAc,EACd9C,OAAQ,CACNjK,IAAKoK,EAAAA,GAAOgH,EACZzR,KAAMyK,EAAAA,GAAO2J,GAEf1U,KAAM,CACJ3R,KAAMwc,EAAAA,GAAU6J,EAChBhhB,MAAO,OACPyM,WAAY2R,EAAAA,GAAY4C,MAKhCiQ,wBAAyB,CACvBha,QAAS,CACP3L,OAAQtU,IAAU82B,EAAAA,GAAMC,MAAQkb,EAAAA,GAAkBC,EAAAA,IAEpDrxB,OAAQ,CACN4J,SAAU,EACVu1B,UAAW,EACXznC,OAAQ,GAEVtC,IAAK,CACHvC,OAAQ,GAEVyC,OAAQ,CACNzC,OAAQ,IAEVkC,KAAM,CACJnS,MAAO,GAETyS,MAAO,CACLzS,MAAO,KAGX+3B,eAAgByX,EAAAA,GAChBp6B,cAAe,CACblV,KAAM,EACNu8C,UAAW,GACXlpC,MAAO,OACPwB,YAAa,EACbM,YAAa,QAEfzE,gBAAiB,CACfC,OAAQtU,IAAU82B,EAAAA,GAAMC,MAAQgc,EAAAA,GAAoBC,EAAAA,GACpDmN,YAAa,YACbC,uBAAwB,eC1LrB,SAASpY,EAAY1pC,EAAgB+hD,GAC1C,MAAMC,EAAW/wC,IAAM,CAAC,EAAG8wC,GAAiBT,EAA2BthD,EAAO0B,QAoB9E,GAlBuB,MAAnB1B,EAAOmsB,WACT61B,EAAS7nC,cAAcoI,OAAO4J,SAAWnsB,EAAOmsB,SAChD61B,EAASrY,kBAAkBpnB,OAAO4J,SAAWnsB,EAAOmsB,UAE9B,MAApBnsB,EAAO0hD,YACTM,EAAS7nC,cAAcoI,OAAOm/B,UAAY1hD,EAAO0hD,UACjDM,EAASrY,kBAAkBpnB,OAAOm/B,UAAY1hD,EAAO0hD,WAElC,MAAjB1hD,EAAOia,SACT+nC,EAAS7nC,cAAcoI,OAAOtI,OAASja,EAAOia,OAC9C+nC,EAASrY,kBAAkBpnB,OAAOtI,OAASja,EAAOia,QAEhDja,EAAOiiD,iBACTD,EAAS9kB,eAAiBl9B,EAAOiiD,gBAE/BjiD,EAAOw2B,eACTwrB,EAAS7nC,cAAcoI,OAAOiU,aAAex2B,EAAOw2B,cAElDx2B,EAAOk4B,OAAQ,CACjB,MAAMgqB,EAAgBF,EAAS7nC,cAAcwH,QAAQ3L,OACrDgsC,EAAS7nC,cAAcwH,QAAQ3L,OAAS,IACnCksC,EACH,CAAC1pB,EAAAA,GAAMC,OAAQ,IACVypB,EAAc1pB,EAAAA,GAAMC,WACpBL,EAAAA,EAAAA,GAAmB,CAAE12B,MAAO82B,EAAAA,GAAMC,MAAOP,OAAQl4B,EAAOk4B,UAE7D,CAACM,EAAAA,GAAM+oB,MAAO,IACTW,EAAc1pB,EAAAA,GAAM+oB,UACpBnpB,EAAAA,EAAAA,GAAmB,CAAE12B,MAAO82B,EAAAA,GAAM+oB,KAAMrpB,OAAQl4B,EAAOk4B,UAGhE,CAUA,GATIl4B,EAAOmf,6BAA+BsD,EAAAA,GAA2BuV,WAAa2P,EAAAA,GAAMhoB,aACtFqiC,EAAS7nC,cAAc7C,KAAKnS,MAAQ,EACpC68C,EAAS7nC,cAAcxC,IAAIrR,OAAOsb,OAAOtK,KAAO0qC,EAAS7nC,cAAc7C,KAAKkN,aAAa5C,OAAOtK,KAChG0qC,EAASrY,kBAAkBryB,KAAKnS,MAAQ,IAEtCsd,EAAAA,GAA2BuV,YAAch4B,EAAOmf,6BAA8B2Z,EAAAA,EAAAA,IAAiB94B,MACjGgiD,EAAS7nC,cAAcxC,IAAIvC,OAAS,IAGlCpV,EAAOmf,6BAA+BsD,EAAAA,GAA2BC,UAAW,CAC9E,MAAMyP,EAAoBnyB,EAAOmiD,QAAQ52B,MAAKrxB,IAAA,IAAC,WAAEwK,GAAYxK,EAAA,OAAKwK,IAAeC,EAAAA,GAAWyd,KAAK,IAC7F+P,IACF6vB,EAAS7nC,cAAcxC,IAAIma,KAAKlQ,OAAOjK,IAAM,EAC7CqqC,EAAS7nC,cAAcxC,IAAIrR,OAAOsb,OAAOjK,IAAM,EAC/CqqC,EAAS7nC,cAAcxC,IAAIrR,OAAO0Q,KAAO,CACvC3R,KAAMg8C,EAAmBnsB,IACzBxqB,MAAO,QAETs3C,EAAS7nC,cAAc7C,KAAKxE,UAAU8O,OAAOjK,IAAM,GACnDqqC,EAAS7nC,cAAc7C,KAAKxE,UAAUkE,KAAO,CAC3C3R,KAAMg8C,EAAmBt4B,EACzBre,MAAO,QAGb,CAEA,OAAOs3C,CACT,CAEO,SAASI,EAAexxC,EAA2BlP,GACxD,MAAMsgD,EAAW/wC,IAAM,CAAC,EAAGL,EAAaoxC,UAClCK,EAAU3gD,IAAU82B,EAAAA,GAAMC,MAKhC,OAJAupB,EAASrmB,wBAAwBha,QAAQ3L,OAASqsC,EAAU,IAAK1O,EAAAA,IAAoB,IAAKC,EAAAA,IAC1FoO,EAASrY,kBAAkBhoB,QAAQ3L,OAASqsC,EAAU,IAAK/N,EAAAA,IAAwB,IAAKE,EAAAA,IACxFwN,EAASjsC,gBAAgBC,OAASqsC,EAAU,IAAK5N,EAAAA,IAAsB,IAAKC,EAAAA,IAErEsN,CACT,CAEO,SAASvvC,EAAuB7B,GACrC,MAAMoxC,EAAWpxC,EAAaoxC,SAE9B,MAAO,IACFA,EACH7nC,cAAe,IACV6nC,EAAS7nC,cACZwH,QAAS,IACJqgC,EAAS7nC,cAAcwH,QAC1B3L,OAAQ,IACHgsC,EAAS7nC,cAAcwH,QAAQ3L,UAC/BgsC,EAAS7nC,cAAcwH,QAAQ3L,OAAOpF,EAAalP,UAKhE,C,uFCvHO,MAAM4gD,EAA4BpoD,IAMnC,IANoC,UACxCqoD,EAAS,iBACT7iC,GAIDxlB,EACgBwlB,EAAiB8iC,eACzBrzC,SAASc,GAAUA,EAAMqnC,cAAciL,GAAWrL,kBAAiB,EAGrE,SAASuL,EAAmBv+C,GAAkE,IAAjE,MAAE2B,EAAK,YAAE0zC,GAAsDr1C,EACjG,OAAQ2B,EAAQ,IAAM0zC,GAAe,EAAI,EAC3C,CAEO,SAASF,EAAsB7tB,GAMnC,IANoC,cACrC8tB,EAAa,YACbC,GAID/tB,GACkB+tB,EAAc,IAAID,GAAexuB,UAAYwuB,GACrDnqC,SAAQ,CAACjS,EAAS2I,KACzB,MAAM68C,EAAYD,EAAoB,CAAE58C,QAAO0zC,gBAC3CmJ,IAAcxlD,EAAQqG,QACxBrG,EAAQuuC,iBAAiB,CAAEloC,OAAQm/C,GACrC,GAEJ,CAEO,SAASC,EAAqB5jC,GAYlC,IAZmC,cACpCu6B,EAAa,WACbsJ,EAAU,UACVC,EAAS,UACTH,EAAS,YACTnJ,GAAc,GAOfx6B,EACC,MAAMmd,EAAQqd,EAAc,IAAID,GAAexuB,UAAYwuB,EACrDrsC,EACqB,IAAzBqsC,EAAcl+C,QAAgBwnD,EAC1B,IAAI1mB,EAAO0mB,GACX1mB,EACGr/B,QAAO,CAAC6O,EAAG7F,IAAU48C,EAAoB,CAAE58C,QAAO0zC,kBAAmBsJ,IACrE/uB,SAAQ,CAAC1kB,EAAIvJ,IACZ48C,EAAoB,CAAE58C,QAAO0zC,kBAAmBmJ,GAAaE,EAAa,CAACA,EAAYxzC,GAAMA,IAInGnC,EAAS7R,OAASiZ,KAAKiT,IAAIo7B,IAAcE,GAC3C31C,EAASmE,KAAKwxC,GAGhBvJ,EAAuB,CAAEC,cAAeC,EAAc,IAAItsC,GAAU6d,UAAY7d,EAAUssC,eAC5F,CAEO,SAAS4H,EAA0Bz8C,EAAwB4B,GAChE,MAAQ,GACN,CAAC3B,EAAAA,GAAWI,OAAQJ,EAAAA,GAAWG,MAAOH,EAAAA,GAAWE,SAASrK,SAASkK,KAAgB4B,EAAO9L,SAAS,KAAO,IAAM,KAC/G8L,GACL,C,yECvDO,MAAMw8C,UAAsBjR,EAAAA,EACjC1mC,YAAc+1B,EAAAA,GAAY6hB,GAE1BhR,0BAAAA,GACE,MAAO,CACLiR,IAAK,GACLC,OAAQ,GACRC,UAAW,GACXC,UAAW,GAEf,CAEAlR,SAAAA,CAAUC,GACR,MAAM,OAAE1c,EAAM,WAAE4tB,GAAe53C,KAAKnL,SAC9B,MAAEygB,GAAUtV,KAAKwE,MACvBxE,KAAK2mC,kBAAoB3mC,KAAKumC,6BAE9B,IAAIlW,EAAM,EACV,IAAK,IAAI7T,EAAI,EAAGA,EAAIwN,EAAQxN,IAC1B6T,GAAO/a,EAAMkH,GAEf,IAAK,IAAIA,EAAIwN,EAAQxN,EAAIlH,EAAM1lB,OAAQ4sB,IAAK,CAC1C6T,EAAMA,EAAM/a,EAAMkH,EAAIwN,GAAU1U,EAAMkH,GACtCxc,KAAK4mC,iBAAiB4Q,IAAIh7B,GAAK6T,EAAMrG,EAErC,IAAI6tB,EAAY,EAChB,IAAK,IAAI3V,EAAI1lB,EAAIwN,EAAS,EAAGkY,GAAK1lB,EAAG0lB,IACnC2V,GAAahvC,KAAK44B,IAAInsB,EAAM4sB,GAAKliC,KAAK4mC,iBAAiB4Q,IAAIh7B,GAAI,GAOjE,GALAxc,KAAK4mC,iBAAiB6Q,OAAOj7B,GAAK3T,KAAK24B,KAAKqW,EAAY7tB,GAExDhqB,KAAK4mC,iBAAiB8Q,UAAUl7B,GAAKxc,KAAK4mC,iBAAiB4Q,IAAIh7B,GAAKxc,KAAK4mC,iBAAiB6Q,OAAOj7B,GAAKo7B,EACtG53C,KAAK4mC,iBAAiB+Q,UAAUn7B,GAAKxc,KAAK4mC,iBAAiB4Q,IAAIh7B,GAAKxc,KAAK4mC,iBAAiB6Q,OAAOj7B,GAAKo7B,GAEhD,IAAlDlR,IAAoB1mC,KAAK4mC,iBAAkBpqB,GAC7C,KAEJ,CACF,E,gDCjCF,MAAMs7B,UAAuDr4C,EAAAA,EAC3DE,YAAc+1B,EAAAA,GAAYoiB,QAC1Bn4C,aAAe,UAEf,yBAAOM,CAAkBvR,GAAkE,IAAjE,OAAEs7B,GAA6Dt7B,EACvF,MAAOqpD,IAAaC,EAAAA,EAAAA,IAAkChuB,GACtD,OAAO+tB,CACT,CAKA,QAAI7pD,GACF,OAAQ8R,KAAKa,YAA+B3S,IAC9C,CAEA,SAAIG,GACF,OAAQ2R,KAAKa,YAA+BxS,KAC9C,CAEA8qB,aAAAA,GACE,OAAOnZ,KAAKK,MAAM6M,OAAQoH,EAAAA,EAAAA,IAAkBtU,KAAKK,MAAM6M,OAvB/B,SAwB1B,CAEA+qC,YAAAA,GACE,OAAOj4C,KAAKiH,yBAAyByqB,eAAe,EAkBtD,CAEAvN,aAAAA,CAAcjkB,GACZF,KAAKjE,KAAOiE,KAAKD,MAAM0E,QAAQD,OACjC,CAEAnB,GAAMC,GAActD,KAAKD,MAAMwD,MAAMD,EAAEtD,KAAKjE,KAAK8lB,SAASve,IAE1D40C,UAAAA,CAAWh4C,GACT,MAAMmV,MAAM,YACd,CAEA8iC,qBAAAA,CAAqBz/C,GAA+E,IAA9E,IAAEH,EAAG,YAAE6/C,GAAc,GAA8C1/C,EACvF,MAAMoN,EAAQ9F,KAAKuF,iBAAiBI,OAAOqmC,MAAKhsB,IAAA,IAAC,KAAE/mB,GAAwB+mB,EAAA,OAAKznB,IAAQU,CAAI,IAC5F,QAAS6M,IAAS0B,EAAAA,EAAAA,IAAU1B,MAAYsyC,IAAeC,EAAAA,EAAAA,IAAkBvyC,EAAM9O,OACjF,CAEAqtB,UAAAA,GACE,OAAO,CACT,CAEApL,uBAAAA,GACE,OAAOjZ,KAAKqkB,YACd,CAEA9e,cAAAA,GACE,MAAO,CACLM,MAAO,GACPF,OAAQ,GACR2yC,oBAAqB,CAAC,EAE1B,CAEAryC,QAAAA,GACE,MAAMymB,EAAmB,GACnB6rB,EAAoB,GAU1B,OARAv4C,KAAKuF,iBAAiBI,OAAOhC,SAASmC,IACjB,UAAfA,EAAM5X,KACRw+B,EAAO9mB,MAAK4yC,EAAAA,EAAAA,IAAiC1yC,EAAM9O,MAAM6P,aAEzD0xC,EAAQ3yC,KAAKE,EAAM9O,MAAM6P,WAC3B,IAGK,CAAE3Y,KAAM8R,KAAK9R,KAAM87B,OAAQuuB,EAAQhR,KAAK,KAAMr6B,MAAOwf,EAAO6a,KAAK,KAC1E,EAGF,UC1GMkR,EAAY,CAChB,CAACzrB,EAAAA,GAAMC,OAAQ,CACbyrB,IAAK,UACLC,OAAQ,UACRC,OAAQ,WAEV,CAAC5rB,EAAAA,GAAM+oB,MAAO,CACZ2C,IAAK,UACLC,OAAQ,UACRC,OAAQ,YAINC,EACI,GADJA,EAEQ,EAkBd,MAAMC,UAAuBhB,EAC3Bn4C,YAAc+1B,EAAAA,GAAY6hB,GAC1B53C,aAAe,kBAEf,yBAAOM,CAAkBvR,GAAkE,IAAjE,OAAEs7B,GAA6Dt7B,EACvF,MAAOqpD,EAAY,IAAKC,EAAAA,EAAAA,IAAkChuB,GAC1D,OAAO+tB,EAAY,CACrB,CAEA92C,GAAAA,CAAInB,GACFiB,MAAME,IAAInB,GACV,MAAM,OAAEkqB,GAAWlqB,EACnB,GAAsB,iBAAXkqB,EAAqB,CAC9B,MAAO+tB,EAAWH,GArBxB,SAAqBmB,GACnB,MAAMj4C,EAASi4C,EAAU7qC,MAAM,KAI/B,MAAO,CAHQ+b,SAASnpB,EAAO,KAAO+3C,EACnBG,WAAWl4C,EAAO,KAAO+3C,EAG9C,CAesCI,CAAYjvB,GAC5ChqB,KAAKK,MAAM2pB,OAAS+tB,EACpB/3C,KAAKK,MAAMu3C,WAAaA,EACxB53C,KAAK0B,QAAQ,SACf,CACA,OAAO1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZ,GAAiC,iBAAtBhE,KAAKK,MAAM2pB,OACpB,OAEFjpB,MAAMojB,gBACN,MAAM,OAAE3Z,GAAWxK,KAAKiH,yBAAyB0H,cAAcwH,QACzDjgB,EAAQ8J,KAAKD,MAAM0E,QAAQW,eAAelP,OAC1C,WAAEqT,EAAU,MAAE5P,GAAUqG,KAAKD,MAAM0E,SAClC0H,EAAKE,GAAUrM,KAAKD,MAAMwD,MAAME,EAAEwX,SACnCi+B,EAAYl5C,KAAKwD,GAAG2I,GACpBgtC,EAAen5C,KAAKwD,GAAG6I,IACvB,MAAEiJ,GAAUtV,KAAKjE,KACjBiuB,EAASnhB,KAAKpB,IAAIzH,KAAKK,MAAM2pB,OAAQ1U,EAAM1lB,OAAS,GAE1D,IAAIwpD,EACAC,EAAkB,EAGtBr1C,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ8G,YACR9G,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ/C,IAAI,cAAew3C,EAAUviD,GAAO0iD,QAE5C,MAAMU,EAAgB,IAAIhC,EAAc,CACtC9yC,MAAOxE,KAAKjE,KACZlH,QAAS,CACPm1B,SACA4tB,WAAY53C,KAAKK,MAAMu3C,cAkB3B,GAdA0B,EAAc7S,WAAU,CAAA/tC,EAAUq8C,KAAc,IAAvB,IAAEyC,GAAK9+C,EAC9B,KAAIsH,KAAKqD,GAAG0xC,EAAY,GAAKxrC,EAAa,GAA1C,CAOA,QAJyB1Z,IAArBupD,IAAgCA,EAAmBrE,GAEvD/wC,EAAQiH,OAAOjL,KAAKqD,GAAG0xC,GAAYlsC,KAAK6Q,MAAM1Z,KAAKwD,GAAGg0C,EAAIzC,MAEtD/0C,KAAKqD,GAAG0xC,EAAY,GAAKxrC,EAAa5P,EACxC,OAAO,EAET0/C,EAAkBtE,CARlB,CAQ2B,SAGJllD,IAArBupD,EAAJ,CACAp1C,EAAQkH,SACRlH,EAAQ/C,IAAI,YAAauJ,EAAOm+B,8BAGhC3kC,EAAQ8G,YACR9G,EAAQO,OAAOvE,KAAKqD,GAAG+1C,GAAmBF,GAC1Cl1C,EAAQ/C,IAAI,cAAew3C,EAAUviD,GAAOwiD,KAC5C,IAAK,IAAIl8B,EAAI48B,EAAkB58B,GAAK68B,EAAiB78B,IACnDxY,EAAQiH,OAAOjL,KAAKqD,GAAGmZ,GAAI3T,KAAK6Q,MAAM1Z,KAAKwD,GAAG81C,EAAc1S,iBAAiB8Q,UAAUl7B,MAEzFxY,EAAQkH,SACRlH,EAAQiH,OAAOjL,KAAKqD,GAAGg2C,GAAkBH,GACzCl1C,EAAQsK,OAGRtK,EAAQ8G,YACR9G,EAAQO,OAAOvE,KAAKqD,GAAG+1C,GAAmBD,GAC1Cn1C,EAAQ/C,IAAI,cAAew3C,EAAUviD,GAAOyiD,QAC5C,IAAK,IAAIn8B,EAAI48B,EAAkB58B,GAAK68B,EAAiB78B,IACnDxY,EAAQiH,OAAOjL,KAAKqD,GAAGmZ,GAAI3T,KAAK6Q,MAAM1Z,KAAKwD,GAAG81C,EAAc1S,iBAAiB+Q,UAAUn7B,MAEzFxY,EAAQkH,SACRlH,EAAQiH,OAAOjL,KAAKqD,GAAGg2C,GAAkBF,GACzCn1C,EAAQsK,OACRtK,EAAQ6G,WAAW,IAAM,GAzBiB,CA0B5C,CAEAtF,cAAAA,GACE,MAAMykB,EAAS,CACb97B,KAAM,SACNG,MAAO,SACP4K,KAAM,SACNjC,MAAOgJ,KAAKK,MAAM2pB,QAAU6uB,EAC5B7rC,UAAU,EACVvF,IAAK,EACLE,IAAK,QAEDiwC,EAAa,CACjB1pD,KAAM,SACNG,MAAO,aACP4K,KAAM,aACNjC,MAAOgJ,KAAKK,MAAMu3C,YAAciB,EAChC7rC,UAAU,EACVvF,IAAK,GACLE,IAAK,IACL4xC,KAAM,IAEFC,EAAW,CACftrD,KAAM,QACNG,MAAO,YACP4K,KAAM,WACNjC,MAAOgJ,KAAKK,MAAMm5C,UAAYx5C,KAAKi4C,gBAE/BwB,EAAc,CAClBvrD,KAAM,QACNG,MAAO,eACP4K,KAAM,cACNjC,MAAOgJ,KAAKK,MAAMo5C,aAAez5C,KAAKi4C,gBAGxC,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACqkB,EAAQ4tB,EAAY4B,EAAUC,GACvCnB,oBAAqB,CACnBtuB,OAAS,GAAEA,EAAO37B,wCAAwC27B,EAAOviB,WAAWuiB,EAAOriB,MACnFiwC,WAAa,GAAEA,EAAWvpD,kCAAkCupD,EAAWnwC,WAAWmwC,EAAWjwC,OAGnG,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,SACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,QACtC,IAAK,aACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,MAAK6/C,aAAa,IACxD,IAAK,WACL,IAAK,cAEH,OAAO,EACT,QACE,OAAO,EAEb,CAEAj/B,aAAAA,GACE,MAAMjjB,EAAQ8J,KAAKD,MAAM0E,QAAQW,eAAelP,MAChD,OAAO8J,KAAKK,MAAMm5C,UAAYf,EAAUviD,GAAOwiD,GACjD,CAEA7xC,QAAAA,GACE,MAAQ,MAAK7G,KAAKK,MAAM2pB,UAAUhqB,KAAKK,MAAMu3C,YAC/C,EAGFkB,EAAepsC,UAAUxL,SAAW,CAAEs4C,SAAU,UAAWC,YAAa,WAExE,U,0BC/LA,MAEMC,EACW,UADXA,EAES,YAFTA,EAGc,UAGpB,MAAMC,UAAyB7B,EAC7Bn4C,YAAc+1B,EAAAA,GAAYkkB,IAC1Bj6C,aAAe,oBAEfsB,GAAAA,CAAInB,GACFiB,MAAME,IAAInB,GACV,MAAM,OAAEkqB,GAAWlqB,EAKnB,MAJsB,iBAAXkqB,IACThqB,KAAKK,MAAM2pB,OAASC,SAASD,EAAQ,IACrChqB,KAAK0B,QAAQ,WAER1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAM,WAAE5a,EAAU,MAAE5P,GAAUqG,KAAKD,MAAM0E,SACnC,OAAEulB,GAAWhqB,KAAKK,MAClBq3C,EAAsB,GACtBC,EAAsB,GACtBkC,EAAuB,GAC7B,IAAIT,GAAoB,EACpBC,EAAkB,EACtB,QAA+BxpD,IAA3BmQ,KAAKjE,KAAKuZ,MAAM1lB,OAApB,CAIAoU,EAAQqJ,OACRrJ,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ/C,IAAI,cAAey4C,GAC3B11C,EAAQ/C,IAAI,YAAay4C,GAGzB11C,EAAQ8G,aACRiZ,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClBgG,aACA5P,QACAqqB,gBAAiBA,CAACxH,EAAGlZ,KACnB81C,GAAyC,IAAtBA,EAA0B58B,EAAI48B,EACjD1B,EAAUl7B,GAAKpI,EAAAA,GAAMzM,IAAI3H,KAAKjE,KAAK+W,KAAKm0B,MAAMp+B,KAAKlB,IAAI,EAAG6U,EAAIwN,GAASxN,EAAI,IAC3Em7B,EAAUn7B,GAAKpI,EAAAA,GAAM3M,IAAIzH,KAAKjE,KAAKgX,IAAIk0B,MAAMp+B,KAAKlB,IAAI,EAAG6U,EAAIwN,GAASxN,EAAI,IAC1Eq9B,EAAWr9B,IAAMk7B,EAAUl7B,GAAKm7B,EAAUn7B,IAAM,EAEhDxY,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGk0C,EAAUl7B,MAC/C68B,EAAkB78B,CAAC,IAGvBxY,EAAQkH,SACRlH,EAAQiH,OAAOjL,KAAKqD,GAAGg2C,GAAkBr1C,EAAQqL,OAAOzF,QACxD5F,EAAQiH,OAAOjL,KAAKqD,GAAG+1C,GAAmBp1C,EAAQqL,OAAOzF,QACzD5F,EAAQ0R,OAGR1R,EAAQ8G,YACR,IAAK,IAAI0R,EAAI48B,EAAkB58B,GAAK68B,EAAiB78B,IAAK,CACxD,MAAMlZ,EAAItD,KAAKqD,GAAGmZ,GAClBxY,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGm0C,EAAUn7B,KACjD,CACAxY,EAAQkH,SACRlH,EAAQiH,OAAOjL,KAAKqD,GAAGg2C,GAAkB,GACzCr1C,EAAQiH,OAAO,EAAG,GAClBjH,EAAQsK,OAGRtK,EAAQ/C,IAAI,cAAey4C,GAC3B11C,EAAQ8G,YACR,IAAK,IAAI0R,EAAI48B,EAAkB58B,GAAK68B,EAAiB78B,IAAK,CACxD,MAAMlZ,EAAItD,KAAKqD,GAAGmZ,GAClBxY,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGq2C,EAAWr9B,KAClD,CACAxY,EAAQkH,SACRlH,EAAQyJ,SAjDR,CAkDF,CAEAlI,cAAAA,GACE,MAAMykB,EAAS,CACb97B,KAAM,SACNG,MAAO,SACP4K,KAAM,SACNjC,MAAOgJ,KAAKK,MAAM2pB,QA1FD,GA2FjBhd,UAAU,EACVvF,IAAK,EACLE,IAAK,QAGDmyC,EAAc,CAClB5rD,KAAM,QACNG,MAAO,wBACP4K,KAAM,cACNjC,MAAOgJ,KAAKK,MAAM05C,oBAAsB/5C,KAAKi4C,gBAEzC+B,EAAY,CAChB9rD,KAAM,QACNG,MAAO,sBACP4K,KAAM,YACNjC,MAAOgJ,KAAKK,MAAM45C,kBAAoBj6C,KAAKi4C,gBAEvCiC,EAAkB,CACtBhsD,KAAM,QACNG,MAAO,oBACP4K,KAAM,kBACNjC,MAAOgJ,KAAKK,MAAM65C,iBAAmBl6C,KAAKi4C,gBAG5C,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACqkB,EAAQkwB,EAAiBJ,EAAaE,GAC/C1B,oBAAqB,CACnBtuB,OAAS,GAAEA,EAAO37B,wCAAwC27B,EAAOviB,WAAWuiB,EAAOriB,OAGzF,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,SACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,QACtC,IAAK,kBACL,IAAK,cACL,IAAK,YACH,OAAO,EACT,QACE,OAAO,EAEb,CAEA4gB,aAAAA,GACE,OAAOnZ,KAAKK,MAAM65C,eACpB,CAEArzC,QAAAA,GACE,MAAQ,YAAW7G,KAAKK,MAAM2pB,QAChC,EAGF2vB,EAAiBjtC,UAAUxL,SAAW,CACpCg5C,gBAAiBR,EACjBK,mBAAoBL,EACpBO,iBAAkBP,GAGpB,U,eC1JA,MAAMS,UAAYrC,EAChBn4C,YAAc+1B,EAAAA,GAAY4Q,IAC1B3mC,aAAe,6BAEfsB,GAAAA,CAAInB,GACFiB,MAAME,IAAInB,GACV,MAAM,OAAEkqB,GAAWlqB,EAKnB,MAJsB,iBAAXkqB,IACThqB,KAAKK,MAAM2pB,OAASC,SAASD,EAAQ,IACrChqB,KAAK0B,QAAQ,WAER1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAM,WAAE5a,EAAU,MAAE5P,GAAUqG,KAAKD,MAAM0E,QAEzCT,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ8G,YACR9G,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ/C,IAAI,cAAejB,KAAKK,MAAM6M,OACf,IAAIk5B,EAAAA,EAAe,CACxC5hC,MAAOxE,KAAKjE,KACZlH,QAAS,CACPm1B,OAAQhqB,KAAKK,MAAM2pB,UAGRyc,WAAU,CAAA/3C,EAAUqmD,KAAc,IAAvB,IAAEvO,GAAK93C,EAC/B,MAAM4U,EAAItD,KAAKqD,GAAG0xC,GAClB,KAAI/0C,KAAKqD,GAAG0xC,EAAY,GAAKxrC,EAAa,GAG1C,QAAIvJ,KAAKqD,GAAG0xC,EAAY,GAAKxrC,EAAa5P,SAG1CqK,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGgjC,EAAIuO,KAAa,IAExD/wC,EAAQkH,SACRlH,EAAQ6G,WAAW,IAAM,GAC3B,CAEAtF,cAAAA,GACE,MAAMykB,EAAS,CACb97B,KAAM,SACNG,MAAO,SACP4K,KAAM,SACNjC,MAAOgJ,KAAKK,MAAM2pB,QAAU,EAC5Bhd,UAAU,EACVvF,IAAK,EACLE,IAAK,QAEDuF,EAAQ,CACZhf,KAAM,QACNG,MAAO,QACP4K,KAAM,QACNjC,MAAOgJ,KAAKK,MAAM6M,OAASlN,KAAKi4C,gBAGlC,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACqkB,EAAQ9c,GACjBorC,oBAAqB,CACnBtuB,OAAS,GAAEA,EAAO37B,wCAAwC27B,EAAOviB,WAAWuiB,EAAOriB,OAGzF,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,SACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,QACtC,IAAK,QACH,QAASyH,KAAKK,MAAM9H,GACtB,QACE,OAAO,EAEb,CAEAsO,QAAAA,GACE,MAAQ,OAAM7G,KAAKK,MAAM2pB,QAC3B,EAGFmwB,EAAIztC,UAAUxL,SAAW,CAAEgM,MAAO,WAElC,UC7FA,MAAMktC,UAAaD,EACjBx6C,YAAc+1B,EAAAA,GAAY2kB,KAG5BD,EAAK1tC,UAAUxL,SAAW,CAAEgM,MAAO,WAEnC,U,eCEA,MAAMotC,UAAgBxC,EACpBn4C,YAAc+1B,EAAAA,GAAY6kB,KAC1B56C,aAAe,WAEfkB,WAAAA,CAAYC,EAAwBf,GAClCgB,MAAMD,EAAQf,GACdC,KAAKmkB,cAAgBnkB,KAAKmkB,cAAc/iB,KAAKpB,KAC/C,CAEAiB,GAAAA,CAAInB,GACFiB,MAAME,IAAInB,GACV,MAAM,OAAEkqB,GAAWlqB,EAKnB,MAJsB,iBAAXkqB,IACThqB,KAAKK,MAAM2pB,OAASC,SAASD,EAAQ,IACrChqB,KAAK0B,QAAQ,WAER1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAMgW,EAAan6B,KAAKD,MAAM0E,SACxB,cAAEkK,GAAkB3O,KAAKiH,0BACzB,OAAEuD,GAAWmE,EAAcwH,SAC3B,WAAE5M,EAAU,MAAE5P,EAAK,WAAEknB,GAAesZ,EAKpCqgB,GAJW55B,EAAAA,EAAAA,IAAsB,CACrCC,aACAC,YAAaqZ,EAAW/0B,iBAEG,EACvB4kB,EAASnhB,KAAKpB,IAAIzH,KAAKK,MAAM2pB,OAAQhqB,KAAKjE,KAAKuZ,MAAM1lB,OAAS,GACpE,IAAIwpD,EACAC,EAAkB,EACtBr1C,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ/C,IAAI,YAAauJ,EAAOm+B,8BAChC3kC,EAAQ8G,YACR9G,EAAQ/C,IAAI,cAAejB,KAAKK,MAAMo6C,WACtC,IAAIC,GAAY,EAChB,IAAK,IAAIl+B,EAAI,EAAGA,EAAIxc,KAAKjE,KAAKuZ,MAAM1lB,OAAQ4sB,IAAK,CAC/C,IAAIm+B,EAAc36C,KAAKjE,KAAK+W,KAAK0J,GACjC,IAAK,IAAI0lB,EAAI1lB,EAAIwN,EAAS,EAAGkY,GAAK1lB,EAAG0lB,IAC/BliC,KAAKjE,KAAK+W,KAAKovB,GAAKyY,IACtBA,EAAc36C,KAAKjE,KAAK+W,KAAKovB,IAIjC,MAAM5+B,EAAItD,KAAKqD,GAAGmZ,GAClB,GAAIxc,KAAKqD,GAAGmZ,EAAI,GAAKjT,GAAc,GAAI,CACrCmxC,EAAWC,EACX,QACF,CAEA,QADyB9qD,IAArBupD,IAAgCA,EAAmB58B,GACnDxc,KAAKqD,GAAGmZ,EAAI,GAAKjT,EAAa5P,EAChC,MAGWqG,KAAKjE,KAAK8lB,SAASrF,GAAKxc,KAAKjE,KAAK8lB,SAASw3B,GAC7C,GAAKqB,IAAaC,GAAeD,EAAW,GACrD12C,EAAQiH,OAAOpC,KAAK6Q,MAAMpW,EAAIk3C,GAAY3xC,KAAK6Q,MAAM1Z,KAAKwD,GAAGk3C,KAE/D12C,EAAQiH,OAAOpC,KAAK6Q,MAAMpW,EAAIk3C,GAAY3xC,KAAK6Q,MAAM1Z,KAAKwD,GAAGm3C,KAC7D32C,EAAQiH,OAAOpC,KAAK6Q,MAAMpW,EAAIk3C,GAAY3xC,KAAK6Q,MAAM1Z,KAAKwD,GAAGm3C,KAE7DD,EAAWC,EACXtB,EAAkB78B,CACpB,CAEA,GADAxY,EAAQkH,cACiBrb,IAArBupD,EAAgC,OAGpCp1C,EAAQiH,OAAOjL,KAAKqD,GAAGg2C,GAAmBmB,EAAW,GACrDx2C,EAAQiH,OAAOjL,KAAKqD,GAAG+1C,GAAoBoB,EAAW,GACtDx2C,EAAQsK,OAERtK,EAAQ8G,YACR9G,EAAQ/C,IAAI,cAAejB,KAAKK,MAAMu6C,UACtC,IAAIC,GAAW,EACXC,EAAU1B,EACd,IAAK,IAAI58B,EAAI48B,EAAkB58B,GAAK68B,EAAiB78B,IAAK,CACxD,IAAIu+B,EAAY/6C,KAAKjE,KAAKgX,IAAIyJ,GAC9B,IAAK,IAAI0lB,EAAI1lB,EAAIwN,EAAS,EAAGkY,GAAK1lB,EAAG0lB,IAC/BliC,KAAKjE,KAAKgX,IAAImvB,GAAK6Y,IACrBA,EAAY/6C,KAAKjE,KAAKgX,IAAImvB,IAI9B,MAAM5+B,EAAItD,KAAKqD,GAAGmZ,GACLxc,KAAKjE,KAAK8lB,SAASrF,GAAKxc,KAAKjE,KAAK8lB,SAASi5B,GAC7C,GAAKD,IAAYE,GAAaF,EAAU,GACjD72C,EAAQiH,OAAOpC,KAAK6Q,MAAMpW,EAAIk3C,GAAY3xC,KAAK6Q,MAAM1Z,KAAKwD,GAAGq3C,KAE/D72C,EAAQiH,OAAOpC,KAAK6Q,MAAMpW,EAAIk3C,GAAY3xC,KAAK6Q,MAAM1Z,KAAKwD,GAAGu3C,KAC7D/2C,EAAQiH,OAAOpC,KAAK6Q,MAAMpW,EAAIk3C,GAAY3xC,KAAK6Q,MAAM1Z,KAAKwD,GAAGu3C,KAE7DF,EAAUE,EACVD,EAAUt+B,CACZ,CACAxY,EAAQkH,SACRlH,EAAQ6G,WAAW,IAAM,IAGzB7G,EAAQiH,OAAOjL,KAAKqD,GAAGg2C,GAAkBr1C,EAAQqL,OAAOzF,QACxD5F,EAAQiH,OAAOjL,KAAKqD,GAAG+1C,GAAoBoB,EAAWx2C,EAAQqL,OAAOzF,QACrE5F,EAAQsK,MACV,CAEA/I,cAAAA,GACE,MAAMykB,EAAS,CACb97B,KAAM,SACNG,MAAO,SACP4K,KAAM,SACNjC,MAAOgJ,KAAKK,MAAM2pB,QAAU,GAC5Bhd,UAAU,EACVvF,IAAK,EACLE,IAAK,QAED8yC,EAAY,CAChBvsD,KAAM,QACNG,MAAO,aACP4K,KAAM,YACNjC,MAAOgJ,KAAKK,MAAMo6C,WAAaz6C,KAAKi4C,gBAEhC2C,EAAW,CACf1sD,KAAM,QACNG,MAAO,YACP4K,KAAM,WACNjC,MAAOgJ,KAAKK,MAAMu6C,UAAY56C,KAAKi4C,gBAGrC,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACqkB,EAAQywB,EAAWG,GAC5BtC,oBAAqB,CACnBtuB,OAAS,GAAEA,EAAO37B,wCAAwC27B,EAAOviB,WAAWuiB,EAAOriB,OAGzF,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,SACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,QACtC,IAAK,YACL,IAAK,WAEH,OAAO,EACT,QACE,OAAO,EAEb,CAEA4gB,aAAAA,GACE,OAAOnZ,KAAKK,MAAMo6C,SACpB,CAEA5zC,QAAAA,GACE,MAAQ,QAAO7G,KAAKK,MAAM2pB,QAC5B,EAGFswB,EAAQ5tC,UAAUxL,SAAW,CAC3B05C,SAAU,UACVH,UAAW,WAGb,UCtKA,MAAMO,UAAuBlD,EAC3Bn4C,YAAc+1B,EAAAA,GAAYulB,MAC1Bt7C,aAAe,kBAEf,yBAAOM,GACL,OAAO,CACT,CAEAgB,GAAAA,CAAInB,GAMF,OALAiB,MAAME,IAAInB,GACuB,iBAAtBE,KAAKK,MAAM2pB,aAA4Cn6B,IAArBmQ,KAAKK,MAAMokB,QACtDzkB,KAAKK,MAAMokB,MAAQu0B,WAAWh5C,KAAKK,MAAM2pB,QACzChqB,KAAK0B,QAAQ,WAER1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAM1gB,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAGxD,KAAKK,MAAMokB,QACxCzgB,EAAQ/C,IAAI,cAAejB,KAAKK,MAAM6M,OACtClJ,EAAQ6G,UAAU,EAAG,IACrB7G,EAAQ8G,YACR9G,EAAQO,QAAQvE,KAAKD,MAAM0E,QAAQ8E,WAAY9F,GAC/CO,EAAQiH,QAAQjL,KAAKD,MAAM0E,QAAQ8E,WAAavJ,KAAKD,MAAM0E,QAAQ9K,MAAO8J,GAC1EO,EAAQkH,SACRlH,EAAQ6G,UAAU,GAAI,GACxB,CAEAtF,cAAAA,GACE,MAAMkf,EAAQ,CACZv2B,KAAM,SACNG,MAAO,QACP4K,KAAM,QACNjC,MAAOgJ,KAAKK,MAAMokB,OAASzkB,KAAKD,OAAOwD,OAAOE,GAAGwX,SAASzY,QAAO,CAACm/B,EAAWC,IAAcD,EAAIC,GAAG,GAAK,EACvG50B,UAAU,EACVusC,KAAM,IAEFrsC,EAAQ,CACZhf,KAAM,QACNG,MAAO,QACP4K,KAAM,QACNjC,MAAOgJ,KAAKK,MAAM6M,OAASlN,KAAKi4C,gBAGlC,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAAC8e,EAAOvX,GAChBorC,oBAAqB,CACnB7zB,MAAQ,GAAEA,EAAMp2B,wBAGtB,CAEA6pD,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,QACH,OAAO2iD,EAAAA,EAAAA,IAAgBl7C,KAAKK,MAAM9H,IACpC,IAAK,QACH,QAASyH,KAAKK,MAAM9H,GACtB,QACE,OAAO,EAEb,CAEAsO,QAAAA,GACE,MAAQ,MAAK7G,KAAKK,MAAMokB,OAC1B,EAGFu2B,EAAetuC,UAAUxL,SAAW,CAAEgM,MAAO,WAE7C,UC9DMwsC,EACG,CACLyB,OAAQ,UACRC,KAAM,aAHJ1B,EAKG,CACLyB,OAAQ,UACRC,KAAM,aAPJ1B,EASY,UATZA,EAUM,UAVNA,EAWS,UAGTb,EAAqB,CACzBwC,WAAY,EACZC,KAAM,GACNC,MAAO,IAGT,SAAStC,EAAYjvB,GACnB,MAAOwxB,EAAa3C,EAAmBwC,WAAYxhC,EAAOg/B,EAAmByC,KAAMG,EAAQ5C,EAAmB0C,QAC5GvD,EAAAA,EAAAA,IAAkChuB,GACpC,MAAO,CAACwxB,EAAY3hC,EAAM4hC,EAC5B,CAEA,MAAMC,UAAsB5D,EAC1Bn4C,YAAc+1B,EAAAA,GAAYimB,GAC1Bh8C,aAAe,iBACfA,mBAAoB,EAEpB,yBAAOM,CAAkBvR,GAAkE,IAAjE,OAAEs7B,GAA6Dt7B,EACvF,OAAOma,KAAKlB,OAAOsxC,EAAYjvB,GACjC,CAEA,cAAI4xB,GACF,OAAQ57C,KAAKa,YAAqC+6C,UACpD,CAEA36C,GAAAA,CAAInB,GAEF,GADAiB,MAAME,IAAInB,GAEqB,iBAAtBE,KAAKK,MAAM2pB,cACSn6B,IAA1BmQ,KAAKK,MAAMm7C,iBAAgD3rD,IAApBmQ,KAAKK,MAAMwZ,WAA2ChqB,IAArBmQ,KAAKK,MAAMo7C,OACpF,CACA,MAAOD,EAAY3hC,EAAM4hC,GAASxC,EAAYj5C,KAAKK,MAAM2pB,QACzDhqB,KAAKK,MAAMm7C,WAAaA,EACxBx7C,KAAKK,MAAMwZ,KAAOA,EAClB7Z,KAAKK,MAAMo7C,MAAQA,CACrB,CAEA,OADAz7C,KAAK0B,QAAQ,UACN1B,IACT,CAEAqD,GAAMC,IACJ,MAAMitB,EAAYvwB,KAAKjE,KAAKuZ,MAAM1lB,OAAS,EACrCisD,EAAa77C,KAAKjE,KAAK8lB,SAAS0O,GAAajtB,EAAIitB,EAEvD,OAAOvwB,KAAKD,MAAMwD,MAAMD,EAAEtD,KAAKjE,KAAK8lB,SAASve,IAAMu4C,EAAW,EAGhE13B,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAM,WAAE5a,EAAU,MAAE5P,GAAUqG,KAAKD,MAAM0E,SACnC,KAAEqO,EAAI,IAAEC,EAAG,MAAEuC,GAAUtV,KAAKjE,MAE5B,WACJy/C,EAAU,KACV3hC,EAAI,MACJ4hC,EAAK,eACLK,EAAc,iBACdC,EAAgB,eAChBC,EAAc,iBACdC,EAAgB,cAChBC,EAAa,oBACbC,EAAmB,iBACnBC,GACEp8C,KAAKK,MAEHg8C,EAA2B,GAC3BC,EAAqB,GACrBC,EAAwB,GACxBC,EAAwB,GACxBC,EAAuBjB,EAAa,EACpCkB,EAAiB7iC,EAAO,EACxB8iC,EAAalB,EAAQ,EACrBriB,EAAQvwB,KAAKpB,IAAIi1C,EAAgBD,GACjC3qB,EAAMxc,EAAM1lB,OAAS8sD,EAE3B,GAA+B,IAA3B18C,KAAKjE,KAAKuZ,MAAM1lB,OAAc,OAGlC,IAAK,IAAI4sB,EAAI4c,EAAO5c,EAAIsV,EAAKtV,IAAK,CAChC,GAAIA,GAAKigC,GAAwBjgC,EAAIlH,EAAM1lB,OAAQ,CACjD,MAAMgtD,EAAY/zC,KAAKlB,OAAOmL,EAAKm0B,MAAMzqB,EAAIigC,EAAsBjgC,EAAI,IACjEqgC,EAAWh0C,KAAKpB,OAAOsL,EAAIk0B,MAAMzqB,EAAIigC,EAAsBjgC,EAAI,IACrE6/B,EAAe7/B,IAAMogC,EAAYC,GAAY,CAC/C,CAEA,GAAIrgC,GAAKkgC,GAAkBlgC,EAAIlH,EAAM1lB,OAAQ,CAC3C,MAAMgtD,EAAY/zC,KAAKlB,OAAOmL,EAAKm0B,MAAMzqB,EAAIkgC,EAAgBlgC,EAAI,IAC3DqgC,EAAWh0C,KAAKpB,OAAOsL,EAAIk0B,MAAMzqB,EAAIkgC,EAAgBlgC,EAAI,IAC/D8/B,EAAS9/B,IAAMogC,EAAYC,GAAY,EAEvCN,EAAY//B,EAAIkgC,IAAmBJ,EAAS9/B,GAAK6/B,EAAe7/B,IAAM,CACxE,CAEA,GAAIA,GAAKmgC,EAAY,CACnB,MAAMC,EAAY/zC,KAAKlB,OAAOmL,EAAKm0B,MAAMzqB,EAAImgC,EAAYngC,EAAI,IACvDqgC,EAAWh0C,KAAKpB,OAAOsL,EAAIk0B,MAAMzqB,EAAImgC,EAAYngC,EAAI,IAC3DggC,EAAYhgC,EAAIkgC,IAAmBE,EAAYC,GAAY,CAC7D,CACF,CAEA,IAAIC,EAAa,EACbC,EAAa,EACjB,MAAMC,EAAiBh9C,KAAKqD,GAAGs5C,EAAaD,GAE5C14C,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQqJ,OAGRrJ,EAAQ/C,IAAI,cAAe86C,GAC3B/3C,EAAQ/C,IAAI,YAAa66C,GACzB93C,EAAQ8G,aACRiZ,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClB05C,WAAYj9C,KAAKqD,GACjB65C,cAAeR,EACfnzC,aACA5P,QACAqqB,gBAAiBA,CAACxH,EAAGlZ,KACnBU,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG+4C,EAAY//B,MACjDsgC,EAAax5C,CAAC,IAGlBU,EAAQkH,SAERlH,EAAQiH,OAAO6xC,EAAY94C,EAAQqL,OAAOzF,QAC1C5F,EAAQiH,OAAO+xC,EAAgBh5C,EAAQqL,OAAOzF,QAC9C5F,EAAQ0R,OAER1R,EAAQ8G,aACRiZ,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClB05C,WAAYj9C,KAAKqD,GACjB65C,cAAeR,EACfnzC,aACA5P,QACAqqB,gBAAiBA,CAACxH,EAAGlZ,KACfkZ,GAAK+/B,EAAY3sD,SACrBoU,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGg5C,EAAYhgC,MACjDugC,EAAaz5C,EAAC,IAGlBU,EAAQiH,OAAO8xC,EAAY,GAC3B/4C,EAAQiH,OAAO+xC,EAAgB,GAC/Bh5C,EAAQsK,OACRtK,EAAQyJ,UAIRzJ,EAAQqJ,OACRrJ,EAAQ/C,IAAI,cAAeg7C,GAC3Bj4C,EAAQ/C,IAAI,YAAa+6C,GACzBh4C,EAAQ8G,aACRiZ,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClB05C,WAAYj9C,KAAKqD,GACjB65C,cAAeR,EACfnzC,aACA5P,QACAqqB,gBAAiBA,CAACxH,EAAGlZ,KACfkZ,GAAK+/B,EAAY3sD,QACrBoU,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGg5C,EAAYhgC,KAAK,IAG1DxY,EAAQkH,SAERlH,EAAQiH,OAAO8xC,EAAY/4C,EAAQqL,OAAOzF,QAC1C5F,EAAQiH,OAAO+xC,EAAgBh5C,EAAQqL,OAAOzF,QAC9C5F,EAAQ0R,OAER1R,EAAQ8G,aACRiZ,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClB05C,WAAYj9C,KAAKqD,GACjB65C,cAAeR,EACfnzC,aACA5P,QACAqqB,gBAAiBA,CAACxH,EAAGlZ,KACnBU,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG+4C,EAAY//B,KAAK,IAG1DxY,EAAQiH,OAAO8xC,EAAY,GAC3B/4C,EAAQiH,OAAO+xC,EAAgB,GAC/Bh5C,EAAQsK,OACRtK,EAAQyJ,UACRzJ,EAAQ6G,WAAW,IAAM,IAErB7K,KAAK47C,aAEP53C,EAAQ/C,IAAI,cAAek7C,GAC3Bn4C,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ8G,aACRiZ,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClB05C,WAAYj9C,KAAKqD,GACjB65C,cAAeR,EACfnzC,aACA5P,QACAqqB,gBAAiBA,CAACxH,EAAGlZ,KACnBU,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG64C,EAAe7/B,KAAK,IAG7DxY,EAAQkH,SAGRlH,EAAQ/C,IAAI,cAAei7C,GAC3Bl4C,EAAQ8G,aACRiZ,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClB05C,WAAYj9C,KAAKqD,GACjB65C,cAAeR,EACfnzC,aACA5P,QACAqqB,gBAAiBA,CAACxH,EAAGlZ,KACnBU,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG84C,EAAS9/B,KAAK,IAGvDxY,EAAQkH,SAGRlH,EAAQ/C,IAAI,cAAem7C,GAC3Bp4C,EAAQ8G,aACRiZ,EAAAA,EAAAA,IAAkB,CAChBvf,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClB05C,WAAa35C,GAActD,KAAKqD,GAAGC,EAAIuW,GACvCtQ,aACA5P,QACAqqB,gBAAiBA,CAACxH,EAAGlZ,KACnBU,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGxD,KAAKjE,KAAKuZ,MAAMkH,KAAK,IAG9DxY,EAAQkH,SACRlH,EAAQ6G,WAAW,IAAM,IAE7B,CAEAtF,cAAAA,GACE,MAAMi2C,EAAa,CACjBttD,KAAM,SACNG,MAAO,kBACP4K,KAAM,aACNjC,MAAOgJ,KAAKK,MAAMm7C,YAAc3C,EAAmBwC,WACnDruC,UAAU,EACVvF,IAAK,EACLE,IAAK,QAEDkS,EAAO,CACX3rB,KAAM,SACNG,MAAO,mBACP4K,KAAM,OACNjC,MAAOgJ,KAAKK,MAAMwZ,MAAQg/B,EAAmByC,KAC7CtuC,UAAU,EACVvF,IAAK,EACLE,IAAK,QAED8zC,EAAQ,CACZvtD,KAAM,SACNG,MAAO,wBACP4K,KAAM,QACNjC,MAAOgJ,KAAKK,MAAMo7C,OAAS5C,EAAmB0C,MAC9CvuC,UAAU,EACVvF,IAAK,EACLE,IAAK,QAGDo0C,EAAmB,CACvB7tD,KAAM,QACNG,MAAO,sBACP4K,KAAM,mBACNjC,MAAOgJ,KAAKK,MAAM07C,kBAAoB/7C,KAAKi4C,gBAEvC6D,EAAiB,CACrB5tD,KAAM,QACNG,MAAO,oBACP4K,KAAM,iBACNjC,MAAOgJ,KAAKK,MAAMy7C,gBAAkB97C,KAAKi4C,gBAErCgE,EAAmB,CACvB/tD,KAAM,QACNG,MAAO,sBACP4K,KAAM,mBACNjC,MAAOgJ,KAAKK,MAAM47C,kBAAoBj8C,KAAKi4C,gBAEvC+D,EAAiB,CACrB9tD,KAAM,QACNG,MAAO,oBACP4K,KAAM,iBACNjC,MAAOgJ,KAAKK,MAAM27C,gBAAkBh8C,KAAKi4C,gBAErCkE,EAAsB,CAC1BjuD,KAAM,QACNG,MAAO,wBACP4K,KAAM,sBACNjC,MAAOgJ,KAAKK,MAAM87C,qBAAuBn8C,KAAKi4C,gBAE1CiE,EAAgB,CACpBhuD,KAAM,QACNG,MAAO,kBACP4K,KAAM,gBACNjC,MAAOgJ,KAAKK,MAAM67C,eAAiBl8C,KAAKi4C,gBAEpCmE,EAAmB,CACvBluD,KAAM,QACNG,MAAO,qBACP4K,KAAM,mBACNjC,MAAOgJ,KAAKK,MAAM+7C,kBAAoBp8C,KAAKi4C,gBAG7C,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CACN61C,EACA3hC,EACA4hC,EACAM,EACAD,EACAG,EACAD,EACAG,EACAD,EACAE,GAEF9D,oBAAqB,CACnBkD,WAAa,GAAEA,EAAWntD,wCAAwCmtD,EAAW/zC,WAAW+zC,EAAW7zC,MACnGkS,KAAO,GAAEA,EAAKxrB,wCAAwCwrB,EAAKpS,WAAWoS,EAAKlS,MAC3E8zC,MAAQ,GAAEA,EAAMptD,wCAAwCotD,EAAMh0C,WAAWg0C,EAAM9zC,OAGrF,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,aACL,IAAK,OACL,IAAK,QACL,IAAK,UACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,QACtC,IAAK,mBACL,IAAK,iBACL,IAAK,mBACL,IAAK,iBACL,IAAK,sBACL,IAAK,gBACL,IAAK,mBACH,OAAO,EACT,QACE,OAAO,EAEb,CAEA4gB,aAAAA,GACE,OAAOnZ,KAAKK,MAAM07C,gBACpB,CAEAl1C,QAAAA,GACE,MAAQ,YAAW7G,KAAKK,MAAMm7C,cAAcx7C,KAAKK,MAAMwZ,QAAQ7Z,KAAKK,MAAMo7C,OAC5E,EAGFC,EAAchvC,UAAUxL,SAAW,CACjC66C,iBAAkBrC,EAAayB,OAC/BW,eAAgBpC,EAAa0B,KAC7Ba,iBAAkBvC,EAAayB,OAC/Ba,eAAgBtC,EAAa0B,KAC7Be,oBAAqBzC,EACrBwC,cAAexC,EACf0C,iBAAkB1C,GAGpB,UCvZA,MAAMyD,UAA0BzB,EAC9B/7C,YAAc+1B,EAAAA,GAAY0nB,IAC1Bz9C,aAAe,wBACfA,mBAAoB,EAGtB,U,eCMA,MAAMk5C,EACO,GADPA,EAEQ,EAFRA,EAGO,GAGPa,EACI,UADJA,EAEE,YAGR,SAAST,EAAYjvB,GACnB,MAAMlpB,EAASkpB,EAAO9b,MAAM,KAK5B,MAAO,CAJW+b,SAASnpB,EAAO,IACfk4C,WAAWl4C,EAAO,IACnBmpB,SAASnpB,EAAO,IAGpC,CAEA,MAAMu8C,UAAuBvF,EAC3Bn4C,YAAc+1B,EAAAA,GAAY4nB,IAC1B39C,aAAe,kBAEf,yBAAOM,CAAkBvR,GAAkE,IAAjE,OAAEs7B,GAA6Dt7B,EACvF,OAA0C,EAAnCma,KAAKlB,OAAOsxC,EAAYjvB,GACjC,CAEA/oB,GAAAA,CAAInB,GAEF,GADAiB,MAAME,IAAInB,GAEqB,iBAAtBE,KAAKK,MAAM2pB,cACQn6B,IAAzBmQ,KAAKK,MAAMk9C,gBAAqD1tD,IAA1BmQ,KAAKK,MAAM8lC,iBAAqDt2C,IAAzBmQ,KAAKK,MAAMm9C,WACzF,CACA,MAAOD,EAAWpX,EAAYqX,GAAavE,EAAYj5C,KAAKK,MAAM2pB,QAClEhqB,KAAKK,MAAMk9C,UAAYA,EACvBv9C,KAAKK,MAAM8lC,WAAaA,EACxBnmC,KAAKK,MAAMm9C,UAAYA,EACvBx9C,KAAK0B,QAAQ,SACf,CACA,OAAO1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAM,WAAE5a,EAAU,MAAE5P,GAAUqG,KAAKD,MAAM0E,SACnC,UAAE84C,EAAS,WAAEpX,EAAU,UAAEqX,EAAS,YAAE1D,EAAW,UAAEE,GAAch6C,KAAKK,MACpEmmC,EAAM,IAAIN,EAAAA,EAAyBqX,GACnCE,EAAM,IAAIC,EAAAA,EAAiBF,GAC3BG,EAAuB,GACvBjG,EAAsB,GACtBC,EAAsB,GACtBve,EAAQvwB,KAAKlB,IAAI41C,EAAWC,GAClC,IAAIpE,EACAC,EAAkB,EAEtBr1C,EAAQqJ,OACRrJ,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ/C,IAAI,cAAe64C,GAC3B91C,EAAQ/C,IAAI,YAAa+4C,GAGzBh2C,EAAQ8G,YACR,IAAK,IAAI0R,EAAI,EAAGA,EAAIxc,KAAKjE,KAAKuZ,MAAM1lB,OAAQ4sB,IAAK,CAG/C,GAFAgqB,EAAI/F,IAAIzgC,KAAKjE,KAAKuZ,MAAMkH,IACxBihC,EAAIhd,IAAIzgC,KAAKjE,KAAK+W,KAAK0J,GAAIxc,KAAKjE,KAAKgX,IAAIyJ,GAAIxc,KAAKjE,KAAKuZ,MAAMkH,EAAI,IAC7DA,EAAI4c,EACN,SAGF,MAAM91B,EAAItD,KAAKqD,GAAGmZ,GAClB,KAAIxc,KAAKqD,GAAGmZ,EAAI,GAAKjT,EAAa,GAAlC,CAGA,GAAIvJ,KAAKqD,GAAGmZ,EAAI,GAAKjT,EAAa5P,EAChC,WAEuB9J,IAArBupD,IAAgCA,EAAmB58B,GAEvDmhC,EAAWnhC,GAAKgqB,EAAIxvC,MACpB0gD,EAAUl7B,GAAKgqB,EAAIxvC,MAAQmvC,EAAasX,EAAIzmD,MAC5C2gD,EAAUn7B,GAAKgqB,EAAIxvC,MAAQmvC,EAAasX,EAAIzmD,MAE5CgN,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGk0C,EAAUl7B,MAC/C68B,EAAkB78B,CAXlB,CAYF,CACA,QAAyB3sB,IAArBupD,EAAJ,CAIAp1C,EAAQkH,SACRlH,EAAQiH,OAAOjL,KAAKqD,GAAGg2C,GAAkBr1C,EAAQqL,OAAOzF,QACxD5F,EAAQiH,OAAOjL,KAAKqD,GAAG+1C,GAAmBp1C,EAAQqL,OAAOzF,QACzD5F,EAAQ0R,OAGR1R,EAAQ8G,YACR,IAAK,IAAI0R,EAAI48B,EAAkB58B,GAAK68B,EAAiB78B,IAAK,CACxD,MAAMlZ,EAAItD,KAAKqD,GAAGmZ,GAClBxY,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGm0C,EAAUn7B,KACjD,CACAxY,EAAQkH,SACRlH,EAAQiH,OAAOjL,KAAKqD,GAAGg2C,GAAkB,GACzCr1C,EAAQiH,OAAO,EAAG,GAClBjH,EAAQsK,OAGRtK,EAAQ8G,YACR,IAAK,IAAI0R,EAAI48B,EAAkB58B,GAAK68B,EAAiB78B,IAAK,CACxD,MAAMlZ,EAAItD,KAAKqD,GAAGmZ,GAClBxY,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGm6C,EAAWnhC,KAClD,CACAxY,EAAQkH,SACRlH,EAAQyJ,SAxBR,MAFEzJ,EAAQyJ,SA2BZ,CAEAlI,cAAAA,GACE,MAAMg4C,EAAY,CAChBrvD,KAAM,SACNG,MAAO,aACP4K,KAAM,YACNjC,MAAOgJ,KAAKK,MAAMk9C,WAAa1E,EAC/B7rC,UAAU,EACVvF,IAAK,EACLE,IAAK,QAGDw+B,EAAa,CACjBj4C,KAAM,SACNG,MAAO,aACP4K,KAAM,aACNjC,MAAOgJ,KAAKK,MAAM8lC,YAAc0S,EAChC7rC,UAAU,EACVusC,KAAM,GACN9xC,IAAK,EACLE,IAAK,KAGD61C,EAAY,CAChBtvD,KAAM,SACNG,MAAO,aACP4K,KAAM,YACNjC,MAAOgJ,KAAKK,MAAMm9C,WAAa3E,EAC/B7rC,UAAU,EACVvF,IAAK,EACLE,IAAK,QAGDmyC,EAAc,CAClB5rD,KAAM,QACNG,MAAO,eACP4K,KAAM,cACNjC,MAAOgJ,KAAKK,MAAMy5C,aAAe95C,KAAKi4C,gBAElC+B,EAAY,CAChB9rD,KAAM,QACNG,MAAO,aACP4K,KAAM,YACNjC,MAAOgJ,KAAKK,MAAM25C,WAAah6C,KAAKi4C,gBAGtC,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAAC43C,EAAWpX,EAAYqX,EAAW1D,EAAaE,GACxD1B,oBAAqB,CACnBiF,UAAY,GAAEA,EAAUlvD,wCAAwCkvD,EAAU91C,WAAW81C,EAAU51C,MAC/Fw+B,WAAa,GAAEA,EAAW93C,kCAAkC83C,EAAW1+B,WAAW0+B,EAAWx+B,MAC7F61C,UAAY,GAAEA,EAAUnvD,wCAAwCmvD,EAAU/1C,WAAW+1C,EAAU71C,OAGrG,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,YAIL,IAAK,YACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,QAHtC,IAAK,aACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,MAAK6/C,aAAa,IAGxD,IAAK,cACL,IAAK,YACH,OAAO,EACT,QACE,OAAO,EAEb,CAEAj/B,aAAAA,GACE,OAAOnZ,KAAKK,MAAMy5C,WACpB,CAEAjzC,QAAAA,GACE,MAAQ,mBAAkB7G,KAAKK,MAAMk9C,aAAav9C,KAAKK,MAAM8lC,cAAcnmC,KAAKK,MAAMm9C,WACxF,EAGFH,EAAe3wC,UAAUxL,SAAW,CAAE44C,YAAaJ,EAAeM,UAAWN,GAE7E,UCnNA,MAAM7qD,WAAaipD,EACjBn4C,YAAc+1B,EAAAA,GAAY7mC,KAC1B8Q,aAAe,OAEf,yBAAOM,GACL,OAAO,CACT,CAEAokB,UAAAA,GACE,OAAO,CACT,CAEA6zB,UAAAA,GACE,OAAO,CACT,EAGF,Y,4BCdA,MAAM0F,WAAiB9F,EACrBn4C,YAAc+1B,EAAAA,GAAYkoB,SAC1Bj+C,aAAe,0BAEf,yBAAOM,GACL,OAAO,CACT,CAEAkkB,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAM,cAAExV,GAAkB3O,KAAKiH,yBACzBlL,EAAOiE,KAAKjE,KAClB,GAA6B,IAAzBA,EAAK6zC,SAAShgD,OAChB,OAGF,MAAMiuD,EAAgB,CACpBlkD,MAAO,IACPiQ,OAAQ,IACRk0C,UAAWj1C,KAAKpB,IAAI1L,EAAKuZ,MAAM1lB,OAAQ,KACvCkjB,KAAM/W,EAAK+zC,iBACX/8B,IAAKhX,EAAK8zC,iBACVlvB,SAAU,GAEZk9B,EAAcl9B,SAAWk9B,EAAclkD,MAAQ,IAE/C,MAAMokD,GAAUF,EAAc/qC,KAAO+qC,EAAc9qC,KAAO8qC,EAAcj0C,OAClEvG,EAAMC,GACA,IAANA,EACKtD,KAAKqD,GAAG,GAEVrD,KAAKqD,GAAGtH,EAAKuZ,MAAM1lB,OAAS,KAAOiuD,EAAcC,UAAYx6C,EAAIu6C,EAAcl9B,WAElFnd,EAAMC,GAAczD,KAAKwD,GAAGq6C,EAAc/qC,KAAOrP,EAAIs6C,GACrDj0C,EAAOA,CAACoD,EAAejD,EAAYC,EAAYC,EAAYC,KAC/D,MAAMK,GAAYC,EAAAA,GAAAA,IAAiB,CACjCT,GAAI5G,EAAG4G,GACPC,GAAI1G,EAAG0G,GACPC,GAAI9G,EAAG8G,GACPC,GAAI5G,EAAG4G,KAEHO,GAAcC,EAAAA,GAAAA,IAAoB,CAAEP,UAAW,KAAMI,IAC3DzG,EAAQ6G,UAAUF,EAAYrH,EAAGqH,EAAYlH,GAE7CO,EAAQ8G,YACR9G,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ/C,IAAI,cAAeiM,GAC3BlJ,EAAQiH,OAAOR,EAAUR,GAAIQ,EAAUP,IACvClG,EAAQiH,OAAOR,EAAUN,GAAIM,EAAUL,IACvCpG,EAAQkH,SAERlH,EAAQ6G,WAA2B,EAAjBF,EAAYrH,GAAyB,EAAjBqH,EAAYlH,EAAO,EAErDrJ,EAAOA,CAACA,EAAc4jD,EAA4B9wC,EAAejD,EAAYE,EAAYD,KAC7F,IAAIoC,GAAAA,EACF,CACEhJ,EAAGD,GAAI4G,EAAKE,GAAM,GAClB1G,EAAGD,EAAG0G,IAAsB,UAAf8zC,GAA0B,EAAI,GAC3CxyC,KAAM,CAAE3R,KAAM,EAAGqF,MAAO,QACxB6M,aAA6B,UAAfiyC,EAAyBhyC,EAAAA,GAAaK,OAASL,EAAAA,GAAaG,IAC1EgB,UAAWD,EACXtB,UAAWC,EAAAA,GAAUkL,OACrB3c,QAEF4F,KAAKD,OACL+D,OAAOE,EAAQ,EAEbi6C,EAASA,CAAC7jD,EAAc4jD,EAA4B9wC,EAAejD,EAAYC,KACnF,IAAIoC,GAAAA,EACF,CACEhJ,EAAGD,EAAG4G,GAAM,EACZxG,EAAGD,EAAG0G,IAAsB,UAAf8zC,GAA0B,EAAI,GAC3CxyC,KAAM,CAAE3R,KAAM,EAAGqF,MAAO,QACxB6M,aAA6B,UAAfiyC,EAAyBhyC,EAAAA,GAAaK,OAASL,EAAAA,GAAaG,IAC1EgB,UAAWD,EACXtB,UAAWC,EAAAA,GAAUkL,OACrB3c,QAEF4F,KAAKD,OACL+D,OAAOE,EAAQ,EAEbk6C,EAASz6C,GACbD,EAAGC,GAAK,IAAMzD,KAAKD,MAAM6J,OAAS+E,EAAcxC,IAAIvC,OAAS+E,EAActC,OAAOzC,OAAS,QAAU,QACjGu0C,EAAS16C,GAAeD,EAAGC,IAAM,GAAK,QAAU,QAEhD26C,EAAe,mBACfC,EAAc,oBAEpB,IAAK,MAAMC,KAAWviD,EAAK6zC,SAAU,CACnC,MAAM,GAAE3lC,EAAE,GAAEE,EAAE,GAAEo0C,EAAE,GAAEC,GAAOF,EAC3B,IAAI,GAAEp0C,EAAE,GAAEE,GAAOk0C,EACjB,OAAQA,EAAQG,MACd,KAAK,EACH30C,EAAK,2BAA4BG,EAAIC,EAAIC,EAAIC,GAC7C,MAEF,KAAK,EACHN,EAAKu0C,EAAap0C,EAAIC,EAAIC,EAAIC,GAC9B,MAEF,KAAK,EACCF,IAAO2zC,EAAcj0C,QAAUQ,IAAOyzC,EAAcj0C,SACtDM,EAAKE,EAAKyzC,EAAcj0C,OAAS,GAGnCE,EAAKs0C,EAAcn0C,EAAIC,EAAIC,EAAIC,GAC/B,MAEF,KAAK,GACHhQ,EAAK,aAAc+jD,EAAMj0C,GAAKm0C,EAAap0C,EAAIE,EAAID,GACnD,MAEF,KAAK,GACH9P,EAAK,gBAAiB8jD,EAAMh0C,GAAKk0C,EAAcn0C,EAAIE,EAAID,GACvD,MAEF,KAAK,GACH9P,EAAK,eAAgB+jD,EAAMj0C,GAAKm0C,EAAap0C,EAAIE,EAAID,GACrD,MAEF,KAAK,GACH9P,EAAK,kBAAmB8jD,EAAMh0C,GAAKk0C,EAAcn0C,EAAIE,EAAID,GACzD,MAEF,KAAK,GACH+zC,EAAO,IAAKE,EAAMj0C,GAAKm0C,EAAap0C,EAAIC,GACxC+zC,EAAO,IAAKE,EAAM/zC,GAAKi0C,EAAal0C,EAAIC,GACxC6zC,EAAO,IAAKE,EAAMK,GAAKH,EAAaE,EAAIC,GACxC,MAEF,KAAK,GACHP,EAAO,IAAKC,EAAMh0C,GAAKk0C,EAAcn0C,EAAIC,GACzC+zC,EAAO,IAAKC,EAAM9zC,GAAKg0C,EAAcj0C,EAAIC,GACzC6zC,EAAO,IAAKC,EAAMM,GAAKJ,EAAcG,EAAIC,GAK/C,CACF,CAEAj5C,cAAAA,GACE,MAAM64C,EAAe,CACnBlwD,KAAM,QACNG,MAAO,gBACP4K,KAAM,eACNjC,MAAOgJ,KAAKK,MAAM+9C,cAAgBp+C,KAAKi4C,gBAEnCoG,EAAc,CAClBnwD,KAAM,QACNG,MAAO,eACP4K,KAAM,cACNjC,MAAOgJ,KAAKK,MAAMg+C,aAAer+C,KAAKi4C,gBAGxC,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACy4C,EAAcC,GACvB/F,oBAAqB,CAAC,EAE1B,CAEAJ,UAAAA,GACE,OAAO,CACT,CAEAj/B,uBAAAA,GACE,OAAO,CACT,CAEApS,QAAAA,GACE,MAAO,EACT,EAGF+2C,GAASlxC,UAAUxL,SAAW,CAAEk9C,aAAc,UAAWC,YAAa,WAEtE,Y,+DC7KKK,GAAW,SAAXA,GAAW,OAAXA,EAAW,oBAAXA,EAAW,sBAAXA,CAAW,EAAXA,IAAW,IAMXC,GAAW,SAAXA,GAAW,OAAXA,EAAAA,EAAW,aAAXA,EAAAA,EAAW,eAAXA,EAAAA,EAAW,iBAAXA,EAAAA,EAAW,eAAXA,CAAW,EAAXA,IAAW,IAuBhB,MAAM9F,GACa,WADbA,GAEG,UAOT,MAAM+F,WAAoB9G,EACxBn4C,YAAc+1B,EAAAA,GAAYmpB,GAC1Bl/C,aAAe,eAEfsB,GAAAA,CAAInB,GACFiB,MAAME,IAAInB,GACV,MAAM,OAAEkqB,GAAWlqB,EAKnB,OAJIkqB,IACFhqB,KAAKK,MAAMy+C,gBAAkB90B,EAC7BhqB,KAAK0B,QAAQ,WAER1B,IACT,CAEA++C,aAAAA,GACE,OAAQ/+C,KAAKjE,KAAKuL,WAChB,KAAKmK,EAAAA,GAAUO,IACf,KAAKP,EAAAA,GAAUQ,EACf,KAAKR,EAAAA,GAAUS,GACb,OAAOysC,GAAYK,KACrB,KAAKvtC,EAAAA,GAAUU,GACf,KAAKV,EAAAA,GAAUgB,EACb,OAAOksC,GAAYvtC,MACrB,KAAKK,EAAAA,GAAUiB,EACf,KAAKjB,EAAAA,GAAUX,EACb,OAAO6tC,GAAYrtC,KACrB,QACE,OAAOqtC,GAAYntC,IAEzB,CAEAytC,eAAAA,CAAgBC,EAAoBC,EAAkBC,GACpD,IAAIC,EAAS,EAIb,GAHID,IAAeT,GAAYvtC,QAAOiuC,EAAS,IAC3CD,IAAeT,GAAYrtC,OAAM+tC,EAAS,KAE1CH,IAAeC,EAAU,CAC3B,GAAmB,IAAfD,EAAkB,CAKpB,OAJkBl/C,KAAKjE,KAAKmV,KAAKiuC,GAAYn/C,KAAKjE,KAAKmV,KAAKguC,IAzChD,OA6COG,CACrB,CAAO,CACL,MAAMC,EAAWnjB,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAKguC,IACtDK,EAAYpjB,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAKguC,EAAa,IAC1E,OAAIE,IAAeT,GAAYK,KACtBO,EAAUvvD,YAAcsvD,EAAStvD,UAEjCuvD,EAAUluC,aAAeiuC,EAASjuC,UAE7C,CACF,CACA,OAAO,CACT,CAEAhO,GAAMC,IACJ,MAAMitB,EAAYvwB,KAAKjE,KAAKuZ,MAAM1lB,OAAS,EACrCisD,EAAa77C,KAAKjE,KAAK8lB,SAAS0O,GAAajtB,EAAIitB,EAEvD,OAAOvwB,KAAKD,MAAMwD,MAAMD,EAAEtD,KAAKjE,KAAK8lB,SAASve,IAAMu4C,EAAW,EAGhE13B,aAAAA,CAAcngB,GAEZ,GADAjD,MAAMojB,gBACyB,IAA3BnkB,KAAKjE,KAAKuZ,MAAM1lB,OAAc,OAElC,MAAMuqC,EAAan6B,KAAKD,MAAM0E,SACxB,WAAE8E,EAAU,MAAE5P,EAAK,WAAEknB,GAAesZ,GACpC,KAAEruB,EAAI,MAAEM,GAAU+tB,EAAWlzB,yBAAyB0H,cACtD0P,EAAa1kB,EAAQmS,EAAKnS,MAAQyS,EAAMzS,MACxCgnB,GAAWC,EAAAA,EAAAA,IAAsB,CACrCC,aACAC,YAAaqZ,EAAW/0B,iBAGpBg0C,GAAmBl7B,EAAAA,EAAAA,IAAyB,CAChD1Z,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClBgG,eACClP,MACGg/C,GAAkBj7B,EAAAA,EAAAA,IAAwB,CAC9C5Z,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClBgG,aACA8U,eACChkB,MAEGD,EAAOA,CAAC/L,EAAeo2B,EAAe+6B,KAC1C,IAAIlzC,GAAAA,EACF,CACEhJ,EAAGk8C,EACH/7C,EAAGzD,KAAKwD,GAAGihB,GAAS,GACpBjZ,KAAM,CAAE3R,KAAM,EAAG6R,OAAQ,OACzBK,aAAcC,EAAAA,GAAaG,IAC3BgB,UAAWnN,KAAKK,MAAM6M,MACtB9S,KAAO,GAAE/L,OAAUqrB,EAAAA,EAAAA,IAAM,CAAE3d,KAAMiE,KAAKjE,KAAMkwB,IAAKxH,QAEnDzkB,KAAKD,OACL+D,OAAOE,EAAQ,EAGb8F,EAAOA,CAAC21C,EAAeC,EAAaj8C,KACxCO,EAAQO,OAAOk7C,EAAOz/C,KAAKwD,GAAGC,IAC9BO,EAAQiH,OAAOy0C,EAAK1/C,KAAKwD,GAAGC,GAAG,EAGjC,IAAIy7C,GAAc,EACdC,GAAY,EAChB,MAAM30B,EAAUxqB,KAAKjE,KAAK7C,aAAeC,EAAAA,GAAWC,MAC9CgmD,EAAap/C,KAAK++C,gBACxB,IACItnC,EADAkoC,EAAc,IAAI9rB,KAGtB7vB,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ/C,IAAI,cAAejB,KAAKK,MAAM6M,OAEtC,IAAK,IAAI7S,EAAQ++C,EAAkB/+C,GAASg/C,EAAiBh/C,IAAS,CAIpE,OAHAslD,EAAcxjB,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAK7W,IAGjD+kD,GACN,KAAKT,GAAYntC,IACf,GAAImuC,EAAY3vD,YAAcynB,GAAUznB,UACtC,SAEF,MACF,KAAK2uD,GAAYK,KACf,GAAIvnC,GAAY2jB,GAAAA,EAAmB3jB,EAAUkoC,EAAa,CAAE3V,aAAc,IACxE,SAEF,MACF,KAAK2U,GAAYvtC,MACf,GAAIuuC,EAAYtuC,aAAeoG,GAAUpG,WACvC,SAEF,MACF,KAAKstC,GAAYrtC,KACf,GAAIquC,EAAYpuC,gBAAkBkG,GAAUlG,cAC1C,SAON,OAHAkG,EAAWkoC,EAGHP,GACN,KAAKT,GAAYntC,IACf,GAAInX,EAAQ,EAAG,CACb,IAAIulD,EAAqB,IAAI/rB,KAC7B,IAAK,IAAIrX,EAAIniB,EAAQ,EAAGmiB,GAAK,IAC3BojC,EAAqBzjB,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAKsL,IAC5DojC,EAAmB5vD,YAAc2vD,EAAY3vD,WAFnBwsB,KAIhCojC,EAAmBnkB,SAAS,EAAG,EAAG,EAAG,GACrC,MAAMokB,EAA8B1jB,EAAAA,GAAAA,qBAA2ByjB,GAAoB,GAAOtmB,UAAY,IAChGwmB,EAAkB,IAAIjsB,KAAK8rB,GACjCG,EAAgBrkB,SAAS,EAAG,EAAG,EAAG,GAClC,MAAMskB,EAA6B5jB,EAAAA,GAAAA,qBAA2B2jB,GAAiB,GAAOxmB,UAAY,IAMlG,GAJA4lB,EAAal/C,KAAKjE,KAAKmV,KAAKra,WAAWmpD,GAAOA,GAAMH,IACpDV,EAAWn/C,KAAKjE,KAAKmV,KAAKra,WAAWmpD,GAAOA,EAAKD,IAG7Cb,IAAeC,EAAU,CAC3B,MAAMc,EAAOjgD,KAAKjE,KAAKmV,KAAKiuC,GAAYn/C,KAAKjE,KAAKmV,KAAKguC,GACjDgB,GAAqB11B,GAAWy1B,GAzKhC,MA0KAE,EAAiB31B,GAAWo1B,EAAmB5vD,YAAc2vD,EAAY3vD,UAC1EkwD,GAAsBC,IACzBjB,EAAaC,EAAWrxC,OAAOC,iBAEnC,CACF,CACA,MACF,KAAK4wC,GAAYK,KACf,MAAMoB,EAAsBhlB,GAAAA,EAAoBukB,EAAa,CAAE3V,aAAc,IACvEqW,EAA+BlkB,EAAAA,GAAAA,qBAA2BikB,GAAqB,GAAO9mB,UAAY,IAClGgnB,EAAuBllB,GAAAA,EAAYglB,EAAqB,CAAE1nB,MAAO,IACjE6nB,EAAgCpkB,EAAAA,GAAAA,qBAA2BmkB,GAAsB,GAAOhnB,UAAY,IAE1G4lB,EAAal/C,KAAKjE,KAAKmV,KAAKra,WAAWmpD,GAAOA,GAAMO,IACpDpB,EAAWn/C,KAAKjE,KAAKmV,KAAKra,WAAWmpD,GAAOA,EAAKK,IAE5CrgD,KAAKi/C,gBAAgBC,EAAYC,EAAUC,KAC9CF,EAAaC,EAAWrxC,OAAOC,kBAEjC,MACF,KAAK4wC,GAAYvtC,MACf,MAAMovC,EAAuBplB,GAAAA,EAAqBukB,GAC5Cc,EAAgCtkB,EAAAA,GAAAA,qBAA2BqkB,GAAsB,GAAOlnB,UAAY,IACpGonB,EAAwBtlB,GAAAA,EAAYolB,EAAsB,CAAEjvB,OAAQ,IACpEovB,EACJxkB,EAAAA,GAAAA,qBAA2BukB,GAAuB,GAAOpnB,UAAY,IAEvE4lB,EAAal/C,KAAKjE,KAAKmV,KAAKra,WAAWmpD,GAAOA,GAAMW,IACpDxB,EAAWn/C,KAAKjE,KAAKmV,KAAKra,WAAWmpD,GAAOA,EAAKS,IAE5CzgD,KAAKi/C,gBAAgBC,EAAYC,EAAUC,KAC9CF,EAAaC,EAAWrxC,OAAOC,kBAEjC,MACF,KAAK4wC,GAAYrtC,KACf,MAAMsvC,EAAsBxlB,GAAAA,EAAoBukB,GAC1CkB,EAA+B1kB,EAAAA,GAAAA,qBAA2BykB,GAAqB,GAAOtnB,UAAY,IAClGwnB,EAAuB1lB,GAAAA,EAAYwlB,EAAqB,CAAEtlB,MAAO,IACjEylB,EAAgC5kB,EAAAA,GAAAA,qBAA2B2kB,GAAsB,GAAOxnB,UAAY,IAE1G4lB,EAAal/C,KAAKjE,KAAKmV,KAAKra,WAAWmpD,GAAOA,GAAMe,IACpD5B,EAAWn/C,KAAKjE,KAAKmV,KAAKra,WAAWmpD,GAAOA,EAAKa,IAE5C7gD,KAAKi/C,gBAAgBC,EAAYC,EAAUC,KAC9CF,EAAaC,EAAWrxC,OAAOC,kBAMrC,MAAsB,IAAhBmxC,IAAmC,IAAdC,GAAmBD,EAAaC,GAAW,SAEtE,IAAI6B,EAAOC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EACzC,MAAMC,EAAe14C,KAAKlB,OAAO3H,KAAKjE,KAAK+W,KAAKm0B,MAAMiY,EAAYC,IAC5DqC,EAAc34C,KAAKpB,OAAOzH,KAAKjE,KAAKgX,IAAIk0B,MAAMiY,EAAYC,IAC1Dx5B,EAAgB3lB,KAAKjE,KAAKuZ,MAAM6pC,EAAW,GAEd,aAA/Bn/C,KAAKK,MAAMy+C,iBACbkC,GAASO,EAAeC,EAAc77B,GAAiB,EACvDs7B,EAAO,EAAID,EAAQO,EACnBL,EAAOF,GAASO,EAAeC,GAC/BL,EAAOK,EAAc,GAAKD,EAAeP,GACzCI,EAAO,EAAIJ,EAAQQ,EACnBH,EAAOL,GAASO,EAAeC,GAC/BF,EAAOC,EAAe,GAAKP,EAAQQ,KAEnCR,GAASO,EAAeC,EAAc77B,GAAiB,EACvDs7B,EAAOD,EA/OG,MA+OMO,EAAeC,GAC/BN,EAAOF,EA/OG,MA+OMO,EAAeC,GAC/BL,EAAOH,GAASO,EAAeC,GAC/BJ,EAAOJ,EAlPG,MAkPMO,EAAeC,GAC/BH,EAAOL,EAlPG,MAkPMO,EAAeC,GAC/BF,EAAON,GAASO,EAAeC,IAGjC,MAAMC,EAA6B,CAAET,QAAOC,OAAMC,OAAMC,OAAMC,OAAMC,OAAMC,QAG1E,IAAI7B,EAAQz/C,KAAKqD,GAAGhJ,GAChBqlD,EAAM1/C,KAAKqD,GAAGhJ,GAClB,OAAQ+kD,GACN,KAAKT,GAAYntC,IACf,MAAMjf,EAAWyN,KAAKjE,KAAKxJ,SACrBmvD,EAAWjC,EAEX3rB,EAAS,IAAID,KAAK8rB,GACxB7rB,EAAO2H,SAAS,GAAI,EAAG,EAAG,GACtBz7B,KAAKjE,KAAKuhC,aAAe/qC,GAAY,GAAGuhC,EAAO2H,SAAS,GAAI,GAAI,EAAG,GACnElpC,GAAY,KAAOi4B,GAASsJ,EAAO2H,SAAS,GAAI,GAAI,GAAI,IAC5D,MAEMkmB,GAFc7tB,EAAOwF,UAAY,IACFqmB,EAAYrmB,UAAY,KAAQ,GACtC/mC,EAC/BmtD,EAAM72C,KAAKpB,IAAIi6C,EAAWC,EAAShhC,GAAWpX,EAAa5P,GAE3D,MAAMi6B,EAAW,IAAIC,KAAK8rB,GAC1B/rB,EAAS6H,SAAS,EAAG,GAAI,EAAG,GACxBz7B,KAAKjE,KAAKshC,WAAa9qC,GAAY,GAAGqhC,EAAS6H,SAAS,EAAG,EAAG,EAAG,GACjElpC,GAAY,KAAOi4B,GAASoJ,EAAS6H,SAAS,EAAG,EAAG,EAAG,GAI3DgkB,EAAQiC,GAHc9tB,EAAS0F,UAAY,IACFqmB,EAAYrmB,UAAY,KAAQ,GACtC/mC,EACLouB,EAC9B,MAEF,KAAKg+B,GAAYK,KACf,IAAK,IAAIxiC,EAAIniB,EAAQ,EAAGmiB,GAAK68B,EAAiB78B,IAAK,CACjD,MAAMolC,EAAWzlB,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAKsL,IAC5D,IAAK4e,GAAAA,EAAmBukB,EAAaiC,EAAU,CAAE5X,aAAc,IAAM,CACnE0V,EAAM1/C,KAAKqD,GAAGmZ,GACd,KACF,CACF,CACA,IAAK,IAAIA,EAAIniB,EAAQ,EAAGmiB,GAAK48B,EAAkB58B,IAAK,CAClD,MAAMolC,EAAWzlB,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAKsL,IAC5D,IAAK4e,GAAAA,EAAmBukB,EAAaiC,EAAU,CAAE5X,aAAc,IAAM,CACnEyV,EAAQz/C,KAAKqD,GAAGmZ,EAAI,GACpB,KACF,CACF,CAEA,GAAIijC,IAAUC,EAAK,CAGjBA,IAAQl1B,EAAU,EAAI,GADH3hB,KAAK0X,MAAMvgB,KAAKjE,KAAKolB,mBAnS5B,MAmSoEnhB,KAAKjE,KAAKxJ,UAClDouB,CAC1C,CACA,MAEF,KAAKg+B,GAAYvtC,MACf,IAAK,IAAIoL,EAAIniB,EAAQ,EAAGmiB,GAAK68B,EAAiB78B,IAAK,CAEjD,GADiB2f,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAKsL,IAC/CnL,aAAesuC,EAAYtuC,WAAY,CAClDquC,EAAM1/C,KAAKqD,GAAGmZ,GACd,KACF,CACF,CACA,IAAK,IAAIA,EAAIniB,EAAQ,EAAGmiB,GAAK48B,EAAkB58B,IAAK,CAElD,GADiB2f,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAKsL,IAC/CnL,aAAesuC,EAAYtuC,WAAY,CAClDouC,EAAQz/C,KAAKqD,GAAGmZ,EAAI,GACpB,KACF,CACF,CAEA,GAAIijC,IAAUC,EAAK,CAKjBA,IAAQl1B,EAAU,GAAK,KAHJxqB,KAAKjE,KAAK4hC,WACzB90B,KAAK0X,MAAMvgB,KAAKjE,KAAKolB,mBA3Tb,MA2TqDnhB,KAAKjE,KAAKxJ,UACvE,GACsCouB,CAC5C,CACA,MACF,QACE,IAAK,IAAInE,EAAIniB,EAAQ,EAAGmiB,GAAK68B,EAAiB78B,IAAK,CAEjD,GADiB2f,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAKsL,IAC/CjL,gBAAkBouC,EAAYpuC,cAAe,CACxDmuC,EAAM1/C,KAAKqD,GAAGmZ,GACd,KACF,CACF,CACA,IAAK,IAAIA,EAAIniB,EAAQ,EAAGmiB,GAAK48B,EAAkB58B,IAAK,CAElD,GADiB2f,EAAAA,GAAAA,sBAA4Bn8B,KAAKjE,KAAKmV,KAAKsL,IAC/CjL,gBAAkBouC,EAAYpuC,cAAe,CACxDkuC,EAAQz/C,KAAKqD,GAAGmZ,EAAI,GACpB,KACF,CACF,CAEIijC,IAAUC,IAEZA,IAAQ1/C,KAAKjE,KAAKuL,YAAcmK,EAAAA,GAAUiB,EAAI,GAAK,IAAMiO,GAI/D8+B,EAAQ52C,KAAKlB,IAAI83C,GAAQl2C,GAGzBvF,EAAQ8G,YACRhB,EAAK21C,EAAOC,EAAK+B,EAAWT,OAC5Bh9C,EAAQkH,SAGRlH,EAAQqJ,OACRrJ,EAAQgH,YAAY,CAAC,EAAG,IACxBhH,EAAQ8G,YACRhB,EAAK21C,EAAOC,EAAK+B,EAAWL,MAC5Bt3C,EAAK21C,EAAOC,EAAK+B,EAAWJ,MAC5Bv3C,EAAK21C,EAAOC,EAAK+B,EAAWH,MAC5Bx3C,EAAK21C,EAAOC,EAAK+B,EAAWR,MAC5Bn3C,EAAK21C,EAAOC,EAAK+B,EAAWP,MAC5Bp3C,EAAK21C,EAAOC,EAAK+B,EAAWN,MAC5Bn9C,EAAQkH,SACRlH,EAAQyJ,UAGJiyC,EAAMD,GAAS,KACjBrlD,EAAK,IAAKqnD,EAAWT,MAAOvB,GAC5BrlD,EAAK,KAAMqnD,EAAWL,KAAM3B,GAC5BrlD,EAAK,KAAMqnD,EAAWJ,KAAM5B,GAC5BrlD,EAAK,KAAMqnD,EAAWH,KAAM7B,GAC5BrlD,EAAK,KAAMqnD,EAAWR,KAAMxB,GAC5BrlD,EAAK,KAAMqnD,EAAWP,KAAMzB,GAC5BrlD,EAAK,KAAMqnD,EAAWN,KAAM1B,GAEhC,CAEAz7C,EAAQ6G,WAAW,IAAM,GAC3B,CAEAtF,cAAAA,GACE,MAAMu5C,EAAkB,CACtB5wD,KAAM,SACNG,MAAO,mBACP4K,KAAM,kBACNjC,MAAOgJ,KAAKK,MAAMy+C,iBAAmBjG,GACrC7rC,UAAU,EACVtW,MAAO,CACL,CACEM,MAAO,WACP3I,MAAO,YAET,CACE2I,MAAO,YACP3I,MAAO,eAIP6e,EAAQ,CACZhf,KAAM,QACNG,MAAO,QACP4K,KAAM,QACNjC,MAAOgJ,KAAKK,MAAM6M,OAASlN,KAAKi4C,gBAGlC,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACm5C,EAAiB5xC,GAC1BorC,oBAAqB,CAAC,EAE1B,CAEAJ,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,kBACL,IAAK,QACH,QAASyH,KAAKK,MAAM9H,GACtB,QACE,OAAO,EAEb,CAEAsO,QAAAA,GACE,MAAQ,iBAAgB63C,GAAY1+C,KAAKK,MAAMy+C,mBACjD,EAGFF,GAAYlyC,UAAUxL,SAAW,CAC/B49C,gBAAiBjG,GACjB3rC,MAAO2rC,IAGT,YCjdA,MAAMgJ,WAAY/J,EAChBn4C,YAAc+1B,EAAAA,GAAYosB,IAC1BniD,aAAe,gBAEf,yBAAOM,GACL,OAAO,CACT,CAEAgB,GAAAA,CAAInB,GAEF,GADAiB,MAAME,IAAInB,GACuB,iBAAtBE,KAAKK,MAAM2pB,cAA4Cn6B,IAApBmQ,KAAKK,MAAMk5C,WAA6C1pD,IAAvBmQ,KAAKK,MAAM0hD,SAAwB,CAChH,MAAOxI,EAAO,EAAGwI,EAAU,GAAK/hD,KAAKK,MAAM2pB,OAAO9b,MAAM,KAAKjX,KAAKqM,GAAM01C,WAAW11C,KACnFtD,KAAKK,MAAMk5C,KAAOA,EAClBv5C,KAAKK,MAAM0hD,QAAUA,CACvB,CAEA,OADA/hD,KAAK0B,QAAQ,UACN1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAMpoB,EAAOiE,KAAKjE,KACZimD,EAAYjmD,EAAK+W,KAAK,GAAK/W,EAAK+W,KAAK,GACrCmvC,EAAWlmD,EAAKgX,IAAI,GAAKhX,EAAKgX,IAAI,GAGxC,IAAImvC,GAFQF,EAAY,GAAKA,EAAYC,EAAWD,EAAY,KACpDC,EAAW,GAAKA,EAAWD,EAAYC,EAAW,GAG1DE,EAAMD,EAASnmD,EAAKgX,IAAI,GAAKhX,EAAK+W,KAAK,GACvCsvC,EAAKF,EAASnmD,EAAK+W,KAAK,GAAK/W,EAAKgX,IAAI,GACtCsvC,EAAUtmD,EAAK+W,KAAK,GACpBwvC,EAASvmD,EAAKgX,IAAI,GAClBwvC,EAAKviD,KAAKK,MAAMk5C,KAEpB,IAAK,IAAI/8B,EAAI,EAAGsV,EAAM/1B,EAAKuZ,MAAM1lB,OAAQmiC,EAAMD,GAAO,EAAGC,EAAMvV,EAAIsV,EAAMtV,EAAIsV,EAAKC,EAAMvV,IAAMA,IAAK,CACjG,IAAIgmC,EACJ,MAAM9H,EAAW2H,EACXxH,EAAUyH,EAChBD,EAAUtmD,EAAK+W,KAAK0J,GACpB8lC,EAASvmD,EAAKgX,IAAIyJ,GAEd0lC,EACEI,GAAUH,GACZD,GAAS,EACTC,EAAMC,EAEFD,EAAMzH,IACRyH,EAAMzH,GAEJyH,EAAME,IACRF,EAAME,GAGRG,EAAYL,EAEZI,EAAKviD,KAAKK,MAAMk5C,KAChB6I,EAAKE,EAELH,GAAYI,GAAMH,EAAKD,GAEnBA,EAAMzH,IACRyH,EAAMzH,GAEJyH,EAAME,IACRF,EAAME,KAGRG,EAAYL,EAERE,EAAUD,IACZA,EAAKC,EACLE,GAAMviD,KAAKK,MAAMk5C,KACbgJ,EAAKviD,KAAKK,MAAM0hD,UAClBQ,EAAKviD,KAAKK,MAAM0hD,UAIpBI,GAAYI,GAAMH,EAAKD,GAEnBA,EAAMtH,IACRsH,EAAMtH,GAEJsH,EAAMG,IACRH,EAAMG,IAIND,GAAWF,GACbD,GAAS,EACTC,EAAMC,EAEFD,EAAMtH,IACRsH,EAAMtH,GAEJsH,EAAMG,IACRH,EAAMG,GAGRE,EAAYL,EAEZI,EAAKviD,KAAKK,MAAMk5C,KAChB6I,EAAKC,EAELF,GAAYI,GAAMH,EAAKD,GAEnBA,EAAMtH,IACRsH,EAAMtH,GAEJsH,EAAMG,IACRH,EAAMG,KAGRE,EAAYL,EAERG,EAASF,IACXA,EAAKE,EACLC,GAAMviD,KAAKK,MAAMk5C,KACbgJ,EAAKviD,KAAKK,MAAM0hD,UAClBQ,EAAKviD,KAAKK,MAAM0hD,UAIpBI,GAAYI,GAAMH,EAAKD,GAEnBA,EAAMzH,IACRyH,EAAMzH,GAEJyH,EAAME,IACRF,EAAME,IAKZ,MAAM/+C,EAAIuF,KAAK6Q,MAAM1Z,KAAKqD,GAAGmZ,GAAK,KAC5B/Y,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAGg/C,GAAa,KAC1Cx+C,EAAQ/C,IAAI,YAAaihD,EAASliD,KAAKK,MAAMoiD,YAAcziD,KAAKK,MAAMqiD,cACtE1+C,EAAQif,SAAS3f,EAAGG,EAAG,EAAG,EAC5B,CACF,CAEA8B,cAAAA,GACE,MAAMg0C,EAAO,CACXrrD,KAAM,SACNqrD,KAAM,IACN9xC,IAAK,IACLE,IAAK,IACLtZ,MAAO,OACP4K,KAAM,OACNjC,MAAOgJ,KAAKK,MAAMk5C,MAAQ,IAC1BvsC,UAAU,GAEN+0C,EAAU,CACd7zD,KAAM,SACNqrD,KAAM,IACN9xC,IAAK,IACLE,IAAK,IACLtZ,MAAO,eACP4K,KAAM,UACNjC,MAAOgJ,KAAKK,MAAM0hD,SAAW,GAC7B/0C,UAAU,GAENy1C,EAAc,CAClBv0D,KAAM,QACNG,MAAO,eACP4K,KAAM,cACNjC,MAAOgJ,KAAKK,MAAMoiD,aAAeziD,KAAKi4C,eACtC0K,cAAc,GAEVD,EAAe,CACnBx0D,KAAM,QACNG,MAAO,gBACP4K,KAAM,eACNjC,MAAOgJ,KAAKK,MAAMqiD,cAAgB1iD,KAAKi4C,eACvC0K,cAAc,GAGhB,MAAO,CACL98C,MAAO7F,KAAK3R,MACZsX,OAAQ,CAAC4zC,EAAMwI,EAASU,EAAaC,GACrCpK,oBAAqB,CACnBiB,KAAO,GAAEA,EAAKlrD,kCAAkCkrD,EAAK9xC,WAAW8xC,EAAK5xC,MACrEo6C,QAAU,GAAEA,EAAQ1zD,kCAAkC0zD,EAAQt6C,WAAWs6C,EAAQp6C,OAGvF,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,OACL,IAAK,UACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,MAAK6/C,aAAa,IAExD,IAAK,cACL,IAAK,eAEH,OAAO,EACT,QACE,OAAO,EAEb,CAEAj/B,aAAAA,GACE,OAAOnZ,KAAKK,MAAMoiD,WACpB,CAEA57C,QAAAA,GACE,MAAQ,OAAM7G,KAAKK,MAAMk5C,QAAQv5C,KAAKK,MAAM0hD,SAC9C,EAGFF,GAAIn1C,UAAUxL,SAAW,CACvBuhD,YAAa,UACbC,aAAc,WAGhB,YCvNO,MAAME,WAAuBvc,EAAAA,EAClC1mC,YAAc+1B,EAAAA,GAAYmtB,IAG1Btc,0BAAAA,GACE,MAAO,CAAEiR,IAAK,GAChB,CAEA/Q,SAAAA,CAAUC,GACR,MAAM,MAAEpxB,GAAUtV,KAAKwE,MACjB+rB,EAAYjb,EAAM1lB,OAAS,EACjCoQ,KAAK2mC,kBAAoB3mC,KAAKumC,6BAE9B,IAAIlW,EAAM,EACV,IAAK,IAAI7T,EAAI,EAAGA,EAAIxc,KAAKnL,QAAQm1B,OAAQxN,IACvC6T,GAAO/a,EAAMkH,GAEf,IAAK,IAAIA,EAAIxc,KAAKnL,QAAQm1B,OAAQxN,GAAK+T,IACrCF,EAAMA,EAAM/a,EAAMkH,EAAIxc,KAAKnL,QAAQm1B,QAAU1U,EAAMkH,GACnDxc,KAAK4mC,iBAAiB4Q,IAAIh7B,GAAK6T,EAAMrwB,KAAKnL,QAAQm1B,QAEI,IAAlD0c,IAAoB1mC,KAAK4mC,iBAAkBpqB,IAJCA,KAQpD,ECvBF,MAAMsmC,WAAYhL,EAChBn4C,YAAc+1B,EAAAA,GAAYmtB,IAC1BljD,aAAe,wBAEf,yBAAOM,CAAmB8iD,GAExB,OADwBjL,EAAQ73C,mBAAmB8iD,GAC1B,CAC3B,CAEA9hD,GAAAA,CAAInB,GACFiB,MAAME,IAAInB,GACV,MAAM,OAAEkqB,GAAWlqB,EAKnB,MAJsB,iBAAXkqB,IACThqB,KAAKK,MAAM2pB,OAASC,SAASD,EAAQ,IACrChqB,KAAK0B,QAAQ,WAER1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAM,WAAE5a,EAAU,MAAE5P,GAAUqG,KAAKD,MAAM0E,QACnCulB,EAASnhB,KAAKpB,IAAIzH,KAAKK,MAAM2pB,OAAQhqB,KAAKjE,KAAKuZ,MAAM1lB,OAAS,GACpEoU,EAAQ8G,YACR9G,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ/C,IAAI,cAAejB,KAAKK,MAAM6M,OAEf,IAAI01C,GAAe,CACxCp+C,MAAOxE,KAAKjE,KACZlH,QAAS,CAAEm1B,YAGEyc,WAAU,CAAA/3C,EAAUqmD,KAAc,IAAvB,IAAEyC,GAAK9oD,EAC/B,MAAM4U,EAAItD,KAAKqD,GAAG0xC,GAClB,KAAI/0C,KAAKqD,GAAG0xC,EAAY,GAAKxrC,EAAa,GAG1C,QAAIvJ,KAAKqD,GAAG0xC,EAAY,GAAKxrC,EAAa5P,SAG1CqK,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAGg0C,EAAIzC,KAAa,IAGxD/wC,EAAQ6G,WAAW,IAAM,IACzB7G,EAAQkH,QACV,CAEA3F,cAAAA,GACE,MAAMykB,EAAS,CACb97B,KAAM,SACNG,MAAO,SACP4K,KAAM,SACNjC,MAAOgJ,KAAKK,MAAM2pB,QAAU,EAC5Bhd,UAAU,EACVvF,IAAK,EACLE,IAAK,QAEDuF,EAAQ,CACZhf,KAAM,QACNG,MAAO,QACP4K,KAAM,QACNjC,MAAOgJ,KAAKK,MAAM6M,OAASlN,KAAKi4C,gBAGlC,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACqkB,EAAQ9c,GACjBorC,oBAAqB,CACnBtuB,OAAS,GAAEA,EAAO37B,wCAAwC27B,EAAOviB,WAAWuiB,EAAOriB,OAGzF,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,SACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,QACtC,IAAK,QACH,QAASyH,KAAKK,MAAM9H,GACtB,QACE,OAAO,EAEb,CAEAsO,QAAAA,GACE,MAAQ,OAAM7G,KAAKK,MAAM2pB,QAC3B,EAGF84B,GAAIp2C,UAAUxL,SAAW,CAAEgM,MAAO,WAElC,YCtGA,MAAM81C,WAAaF,GACjBnjD,YAAc+1B,EAAAA,GAAYutB,KAG5BD,GAAKt2C,UAAUxL,SAAW,CAAEgM,MAAO,WAEnC,YCGM2rC,GACI,EADJA,GAEQ,EAGRa,GACK,UADLA,GAEO,UAGb,SAAST,GAAYF,GACnB,MAAMj4C,EAASi4C,EAAU7qC,MAAM,KAI/B,MAAO,CAHQ+b,SAASnpB,EAAO,KAAO+3C,GACnBG,WAAWl4C,EAAO,KAAO+3C,GAG9C,CAEA,MAAMqK,WAAmBpL,EACvBn4C,YAAc+1B,EAAAA,GAAYytB,IAC1BxjD,aAAe,aAEf,yBAAOM,CAAkBvR,GAAkE,IAAjE,OAAEs7B,GAA6Dt7B,EACvF,MAAOqpD,GAAakB,GAAYjvB,GAChC,OAAO+tB,EAAY,CACrB,CAEA92C,GAAAA,CAAInB,GACFiB,MAAME,IAAInB,GACV,MAAM,OAAEkqB,GAAWlqB,EACnB,GAAsB,iBAAXkqB,EAAqB,CAC9B,MAAO+tB,EAAW5R,GAAc8S,GAAYjvB,GAC5ChqB,KAAKK,MAAM2pB,OAAS+tB,EACpB/3C,KAAKK,MAAM8lC,WAAaA,EACxBnmC,KAAK0B,QAAQ,SACf,CACA,OAAO1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZjD,MAAMojB,gBACN,MAAM,WAAE5a,EAAU,MAAE5P,GAAUqG,KAAKD,MAAM0E,SACnC,OAAEulB,EAAM,WAAEmc,GAAenmC,KAAKK,OAC9B,KAAEyS,EAAI,IAAEC,EAAG,MAAEuC,GAAUtV,KAAKjE,KAC5B0hD,EAAM,IAAIC,EAAAA,EAAiB1zB,GAC3Bo5B,EAA2B,GAC3BC,EAA2B,GAC3BC,EAAwB,GAC9B,IAAIlK,EACAC,EAAkB,EAEtBr1C,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ8G,YACR9G,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ/C,IAAI,cAAejB,KAAKK,MAAMkjD,cACtC,IAAK,IAAI/mC,EAAI,EAAGA,EAAIlH,EAAM1lB,OAAQ4sB,IAAK,CACrCihC,EAAIhd,IAAI3tB,EAAK0J,GAAIzJ,EAAIyJ,GAAIlH,EAAMkH,EAAI,IAGnC,MAAMgnC,GAAO1wC,EAAK0J,GAAKzJ,EAAIyJ,IAAM,EAC3Bk7B,EAAY8L,EAAMrd,EAAasX,EAAIzmD,MACnC2gD,EAAY6L,EAAMrd,EAAasX,EAAIzmD,MAEzCosD,EAAe5mC,GAAKk7B,EACpB2L,EAAe7mC,GAAKm7B,EAGhBriC,EAAMkH,GAAK4mC,EAAe5mC,EAAI,GAChC8mC,EAAW9mC,IAAK,EACPlH,EAAMkH,GAAK6mC,EAAe7mC,EAAI,GACvC8mC,EAAW9mC,IAAK,EAEhB8mC,EAAW9mC,GAAK8mC,EAAW9mC,EAAI,GAI7B8mC,EAAW9mC,IAAM6mC,EAAe7mC,GAAK6mC,EAAe7mC,EAAI,KAC1D6mC,EAAe7mC,GAAK6mC,EAAe7mC,EAAI,KAEpC8mC,EAAW9mC,IAAM4mC,EAAe5mC,GAAK4mC,EAAe5mC,EAAI,KAC3D4mC,EAAe5mC,GAAK4mC,EAAe5mC,EAAI,IAGzC,MAAMlZ,EAAItD,KAAKqD,GAAGmZ,GAClB,KAAIA,EAAIwN,GAAU1mB,EAAIiG,EAAa,GAAnC,CAGA,GAAIvJ,KAAKqD,GAAGmZ,EAAI,GAAKjT,EAAa5P,EAChC,WAEuB9J,IAArBupD,IAAgCA,EAAmB58B,GAEnD8mC,EAAW9mC,KAAO8mC,EAAW9mC,EAAI,IAEnCxY,EAAQO,OAAOvE,KAAKqD,GAAGmZ,EAAI,GAAI3T,KAAK6Q,MAAM1Z,KAAKwD,GAAG4/C,EAAe5mC,EAAI,MACrExY,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG6/C,EAAe7mC,OAC3C8mC,EAAW9mC,GAEpBxY,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG6/C,EAAe7mC,MAGpDxY,EAAQO,OAAOjB,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG6/C,EAAe7mC,MAEtD68B,EAAkB78B,CAjBlB,CAkBF,CAGA,GAFAxY,EAAQkH,cAEiBrb,IAArBupD,EAAJ,CAKAp1C,EAAQ8G,YACR9G,EAAQ/C,IAAI,cAAejB,KAAKK,MAAMojD,gBACtC,IAAK,IAAIjnC,EAAI48B,EAAkB58B,GAAK68B,EAAiB78B,IAAK,CACxD,MAAMlZ,EAAItD,KAAKqD,GAAGmZ,IACb8mC,EAAW9mC,IAAM8mC,EAAW9mC,EAAI,IAEnCxY,EAAQO,OAAOvE,KAAKqD,GAAGmZ,EAAI,GAAI3T,KAAK6Q,MAAM1Z,KAAKwD,GAAG6/C,EAAe7mC,EAAI,MACrExY,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG4/C,EAAe5mC,OAC1C8mC,EAAW9mC,GAKrBxY,EAAQO,OAAOjB,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG4/C,EAAe5mC,MAHpDxY,EAAQiH,OAAO3H,EAAGuF,KAAK6Q,MAAM1Z,KAAKwD,GAAG4/C,EAAe5mC,KAKxD,CACAxY,EAAQkH,SAERlH,EAAQ6G,WAAW,IAAM,GApBzB,MAFE7G,EAAQ6G,WAAW,IAAM,GAuB7B,CAEAtF,cAAAA,GACE,MAAMykB,EAAS,CACb97B,KAAM,SACNG,MAAO,SACP4K,KAAM,SACNjC,MAAOgJ,KAAKK,MAAM2pB,QAAU6uB,GAC5B7rC,UAAU,EACVvF,IAAK,EACLE,IAAK,QAEDw+B,EAAa,CACjBj4C,KAAM,SACNG,MAAO,SACP4K,KAAM,aACNjC,MAAOgJ,KAAKK,MAAM8lC,YAAc0S,GAChC7rC,UAAU,EACVusC,KAAM,GACN9xC,IAAK,EACLE,IAAK,KAGD47C,EAAe,CACnBr1D,KAAM,QACNG,MAAO,gBACP4K,KAAM,eACNjC,MAAOgJ,KAAKK,MAAMkjD,cAAgBvjD,KAAKi4C,gBAEnCwL,EAAiB,CACrBv1D,KAAM,QACNG,MAAO,kBACP4K,KAAM,iBACNjC,MAAOgJ,KAAKK,MAAMojD,gBAAkBzjD,KAAKi4C,gBAG3C,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACqkB,EAAQmc,EAAYod,EAAcE,GAC3CnL,oBAAqB,CACnBtuB,OAAS,GAAEA,EAAO37B,wCAAwC27B,EAAOviB,WAAWuiB,EAAOriB,MACnFw+B,WAAa,GAAEA,EAAW93C,kCAAkC83C,EAAW1+B,WAAW0+B,EAAWx+B,OAGnG,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,SACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,QACtC,IAAK,aACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,MAAK6/C,aAAa,IACxD,IAAK,eACL,IAAK,iBACH,OAAO,EACT,QACE,OAAO,EAEb,CAEAj/B,aAAAA,GACE,OAAOnZ,KAAKK,MAAMkjD,YACpB,CAEA18C,QAAAA,GACE,MAAQ,cAAa7G,KAAKK,MAAM2pB,UAAUhqB,KAAKK,MAAM8lC,YACvD,EAGF+c,GAAWx2C,UAAUxL,SAAW,CAC9BqiD,aAAc7J,GACd+J,eAAgB/J,IAGlB,Y,gBC9MA,MAAMgK,GACA,UADAA,GAEE,UAGF7K,GACI,GADJA,GAEK,GAUX,SAAS8K,GAAoBz2C,EAAe02C,GAC1C,OAAOl8B,EAAAA,EAAAA,KAAwBpT,EAAAA,EAAAA,IAAkBpH,GAAQ02C,EAC3D,CAuBA,MAAMC,WAAsB/L,EAC1Bn4C,YAAc+1B,EAAAA,GAAYouB,GAC1BnkD,aAAe,iBAEf,yBAAOM,CAAkBvR,GAAkE,IAAjE,OAAEs7B,GAA6Dt7B,EACvF,MAAOqpD,EAAY,IAAKC,EAAAA,EAAAA,IAAkChuB,GAC1D,OAAO+tB,EAAY,CACrB,CAEA92C,GAAAA,CAAInB,GACFiB,MAAME,IAAInB,GACV,MAAM,OAAEkqB,GAAWlqB,EACnB,GAAsB,iBAAXkqB,EAAqB,CAC9B,MAAO+tB,EAAW6L,GArBxB,SAAqB7K,GACnB,MAAMj4C,EAASi4C,EAAU7qC,MAAM,KAI/B,MAAO,CAHQ+b,SAASnpB,EAAO,KAAO+3C,GACtBG,WAAWl4C,EAAO,KAAO+3C,GAG3C,CAemCI,CAAYjvB,GACzChqB,KAAKK,MAAM2pB,OAAS+tB,EACpB/3C,KAAKK,MAAMujD,QAAUA,EACrB5jD,KAAK0B,QAAQ,SACf,CACA,OAAO1B,IACT,CAEAmkB,aAAAA,CAAcngB,GACZ,GAAiC,iBAAtBhE,KAAKK,MAAM2pB,OACpB,OAEFjpB,MAAMojB,gBAEN,MAAMgW,EAAan6B,KAAKD,MAAM0E,SACxB,WAAE8E,EAAU,MAAE5P,GAAUwgC,GACxB,KAAEruB,EAAI,MAAEM,GAAU+tB,EAAWlzB,yBAAyB0H,cACtD0P,EAAa1kB,EAAQmS,EAAKnS,MAAQyS,EAAMzS,MAE9C,GAA+B,IAA3BqG,KAAKjE,KAAKuZ,MAAM1lB,OAAc,OAElC,MAAMwpD,GAAmBl7B,EAAAA,EAAAA,IAAyB,CAChD1Z,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClBgG,eACClP,MAEGg/C,GAAkBj7B,EAAAA,EAAAA,IAAwB,CAC9C5Z,MAAOxE,KAAKjE,KACZwH,MAAOvD,KAAKD,MAAMwD,MAClBgG,aACA8U,eACChkB,OAEI0pD,EAASC,GAnEX,CACLL,IAFiCtjD,EAoEwBL,KAAKK,OAlEpC0jD,SAAWL,GAAcrjD,EAAMujD,SACzDD,GAAoBtjD,EAAM2jD,WAAaN,GAAgBrjD,EAAMujD,UAHjE,IAAqCvjD,EAqEjC,MAAO4jD,EAAUC,GAAY9vC,EAAAA,GAAMoG,OAAOxa,KAAKjE,KAAKuZ,MAAM2xB,MAAMmS,EAAkBC,EAAkB,IAE9F8K,EAAUt7C,KAAKiT,IAAIooC,EAAWD,GAAYjkD,KAAKK,MAAM2pB,OACrDo6B,EAAW,GAEjB,IAAK,IAAI5nC,EAAI,EAAGA,EAAIxc,KAAKK,MAAM2pB,OAAQxN,IAAK,CAC1C,MAAM8oB,EAAe2e,EAAWE,EAAU3nC,EACpC+oB,EAAaD,EAAe6e,EAClCC,EAASx+C,KAAK,CAAEwzB,MAAOkM,EAAcxT,IAAKyT,EAAY8e,GAAI,EAAGC,KAAM,GACrE,CAGA,IAAK,IAAI9nC,EAAI48B,EAAkB58B,GAAK68B,EAAiB78B,IAAK,CACxD,MAAM+nC,EAAuBH,EAASvtD,WAAU,CAACC,EAAMytD,KACrDC,OA1EaxoC,EA0EDhc,KAAKjE,KAAKuZ,MAAMkH,GA1EF4c,EA0EMtiC,EAAKsiC,MA1EItH,EA0EGh7B,EAAKg7B,OAAOyyB,EAzEtCvoC,EAAMod,EAAQpd,GAAOod,IAAUpd,GAAO8V,EADhE,IAAqB9V,EAAaod,EAAetH,CA2E3C,IACA,IAAsB,IAAlByyB,EAAqB,SACzB,MAAME,EAAczkD,KAAKjE,KAAKuZ,MAAMkH,GAAKxc,KAAKjE,KAAK8b,KAAK2E,GAAK,OAAS,KACtE4nC,EAASG,GAAcE,IAAgBzkD,KAAKjE,KAAK+b,OAAO0E,EAC1D,CAEA,MAAM7U,EAAMyM,EAAAA,GAAMzM,IAAIy8C,EAASntD,KAAKH,GAASA,EAAKutD,GAAKvtD,EAAKwtD,QACtDnhC,EAAwB,GAAb9E,EACXqmC,EAAW1pC,GAAAA,MAAiBrE,MAAM,CAAC,EAAGwM,IAAWlI,OAAO,CAAC,EAAGtT,IAElEy8C,EAASzgD,SAAS7M,IAChB,MAAM2M,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAG1M,EAAKsiC,QAC5BurB,EAAmB97C,KAAK6Q,MAAM1Z,KAAKwD,GAAG1M,EAAKg7B,MAAQruB,EACnDmhD,EAAgBD,GAAoB97C,KAAKiT,IAAI6oC,GAAoB,EAAI,EAAI,GACzErhD,EAAIuF,KAAKiT,IAAIvS,GACbs7C,EAAiBh8C,KAAK6Q,MAAMgrC,EAAS5tD,EAAKutD,KAC1CS,EAAmBj8C,KAAK6Q,MAAMgrC,EAAS5tD,EAAKwtD,OAElDtgD,EAAQmJ,UAAY42C,EACpB//C,EAAQif,SAAS3f,EAAGG,EAAGohD,EAAgBD,GACvC5gD,EAAQmJ,UAAY62C,EACpBhgD,EAAQif,SAAS3f,EAAIuhD,EAAgBphD,EAAGqhD,EAAkBF,EAAc,GAE5E,CAEAr/C,cAAAA,GACE,MAAMykB,EAAS,CACb97B,KAAM,SACNG,MAAO,QACP4K,KAAM,SACNjC,MAAOgJ,KAAKK,MAAM2pB,QAAU6uB,GAC5B7rC,UAAU,EACVvF,IAAK,EACLE,IAAK,QAEDi8C,EAAU,CACd11D,KAAM,SACNG,MAAO,UACP4K,KAAM,UACNjC,MAAOgJ,KAAKK,MAAMujD,SAAW/K,GAC7B7rC,UAAU,EACVvF,IAAK,EACLE,IAAK,EACL4xC,KAAM,IAEFwK,EAAU,CACd71D,KAAM,QACNG,MAAO,WACP4K,KAAM,UACNjC,MAAOgJ,KAAKK,MAAM0jD,SAAWL,IAEzBM,EAAY,CAChB91D,KAAM,QACNG,MAAO,aACP4K,KAAM,YACNjC,MAAOgJ,KAAKK,MAAM2jD,WAAaN,IAGjC,MAAO,CACL79C,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACqkB,EAAQ45B,EAASG,EAASC,GACnC1L,oBAAqB,CACnBtuB,OAAS,GAAEA,EAAO37B,wCAAwC27B,EAAOviB,WAAWuiB,EAAOriB,MACnFi8C,QAAU,GAAEA,EAAQv1D,kCAAkCu1D,EAAQn8C,WAAWm8C,EAAQj8C,OAGvF,CAEAuwC,UAAAA,CAAW3/C,GACT,OAAQA,GACN,IAAK,SACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,QACtC,IAAK,UACH,OAAOyH,KAAKm4C,sBAAsB,CAAE5/C,MAAK6/C,aAAa,IACxD,IAAK,UACL,IAAK,YAEH,OAAO,EACT,QACE,OAAO,EAEb,CAEAj/B,aAAAA,GACE,OAAOnZ,KAAKK,MAAM0jD,SAAWL,EAC/B,CAEA78C,QAAAA,GACE,MAAQ,MAAK7G,KAAKK,MAAM2pB,QAC1B,EAGF65B,GAAcn3C,UAAUxL,SAAW,CAAE6iD,QAASL,GAAcM,UAAWN,IAEvE,YCjMO,MAAMqB,WAAwB1e,EAAAA,EACnC1mC,YAAc+1B,EAAAA,GAAYsvB,KAE1Bze,0BAAAA,GACE,MAAO,CAAE0e,KAAM,GACjB,CAEAxe,SAAAA,CAAUC,GACR,MAAM,KAAEx1B,EAAI,MAAEoE,EAAK,IAAEvC,EAAG,KAAED,EAAI,OAAEgF,GAAW9X,KAAKwE,MAC1C+rB,EAAYrf,EAAKthB,OAAS,EAChCoQ,KAAK2mC,kBAAoB3mC,KAAKumC,6BAE9B,IAAI2e,EAAe,EACfC,EAAmB,EAEvB,IAAK,IAAI3oC,EAAI,EAAGA,GAAK+T,EAAW/T,IAAK,CACnC,GAAIA,EAAI,EAAG,CACT,MAAM02B,GAAWvY,EAAAA,EAAAA,IAAsBzpB,EAAKsL,EAAI,IA1B7Bte,EA2BIg1C,EA3BSkS,GA2BCzqB,EAAAA,EAAAA,IAAsBzpB,EAAKsL,KA1BlEte,EAAMqT,gBAAkB6zC,EAAO7zC,eAC/BrT,EAAMmT,aAAe+zC,EAAO/zC,YAC5BnT,EAAMlO,YAAco1D,EAAOp1D,aAyBnBk1D,EAAe,EACfC,EAAmB,EAEvB,CAUA,GALAD,IAHsB5vC,EAAMkH,GAAKzJ,EAAIyJ,GAAK1J,EAAK0J,IAAM,EAC3B1E,EAAO0E,GAGjC2oC,GAAoBrtC,EAAO0E,GAE3Bxc,KAAK4mC,iBAAiBqe,KAAKzoC,GAAK0oC,EAAeC,GAEO,IAAlDze,IAAoB1mC,KAAK4mC,iBAAkBpqB,GAC7C,KAEJ,CA5CsB6oC,IAACnnD,EAAaknD,CA6CtC,EC3CF,MAAME,WAAaxN,EACjBn4C,YAAc+1B,EAAAA,GAAYsvB,KAC1BrlD,aAAe,yBAEf,yBAAOM,GACL,OAAO,CACT,CAEAY,WAAAA,CAAYC,EAAwBf,GAClCgB,MAAMD,EAAQf,GACdC,KAAKK,MAAM2pB,OAAS,CACtB,CAEA7F,aAAAA,CAAcngB,GAEZ,GADAjD,MAAMojB,iBACDnkB,KAAKqkB,aACR,OAGF,MAAM,WAAE9a,EAAU,MAAE5P,GAAUqG,KAAKD,MAAM0E,QACzCT,EAAQ6G,UAAU,GAAK,IACvB7G,EAAQ8G,YACR9G,EAAQ/C,IAAI,YAAa,GACzB+C,EAAQ/C,IAAI,cAAejB,KAAKK,MAAM6M,OAEd,IAAI63C,GAAgB,CAC1CvgD,MAAOxE,KAAKjE,KACZlH,QAAS,CAAEm1B,OAAQhqB,KAAKK,MAAM2pB,UAGhByc,WAAU,CAAA/3C,EAAWqmD,KAAc,IAAxB,KAAEkQ,GAAMv2D,EACjC,MAAM4U,EAAItD,KAAKqD,GAAG0xC,GAClB,GAAI/0C,KAAKqD,GAAG0xC,EAAY,GAAKxrC,EAAa,EACxC,OAEF,GAAIvJ,KAAKqD,GAAG0xC,EAAY,GAAKxrC,EAAa5P,EACxC,OAAO,EAET,MAAM8J,EAAIoF,KAAK6Q,MAAM1Z,KAAKwD,GAAGyhD,EAAKlQ,KAClC/wC,EAAQiH,OAAO3H,EAAGG,EAAE,IAGtBO,EAAQkH,SACRlH,EAAQ6G,WAAW,IAAM,GAC3B,CAEAtF,cAAAA,GACE,MAAM2H,EAAQ,CACZhf,KAAM,QACNG,MAAO,QACP4K,KAAM,QACNjC,MAAOgJ,KAAKK,MAAM6M,OAASlN,KAAKi4C,gBAGlC,MAAO,CACLpyC,MAAO7F,KAAK3R,MACZsX,OAAQ,CAACuH,GACTorC,oBAAqB,CAAC,EAE1B,CAEAJ,UAAAA,CAAW3/C,GACT,MACO,UADCA,CAOV,CAEA8rB,UAAAA,GACE,OAAOrkB,KAAKD,MAAM0E,QAAQD,QAAQm5B,UACpC,CAEA1kB,uBAAAA,GACE,OAAOjZ,KAAKqkB,YACd,CAEAxd,QAAAA,GACE,MAAQ,MACV,EAGFy+C,GAAK54C,UAAUxL,SAAW,CAAEgM,MAAO,WAEnC,YC3EawG,GAAiBpR,OAAOqyB,OAAO,CAC1C,CAACe,EAAAA,GAAYoiB,SAAUrkC,EACvB,CAACiiB,EAAAA,GAAY7mC,MAAO02D,GACpB,CAAC7vB,EAAAA,GAAY6hB,IAAKiO,EAClB,CAAC9vB,EAAAA,GAAYkkB,KAAM6L,EACnB,CAAC/vB,EAAAA,GAAY4Q,KAAME,EACnB,CAAC9Q,EAAAA,GAAY2kB,MAAOqL,EACpB,CAAChwB,EAAAA,GAAY6kB,MAAOoL,EACpB,CAACjwB,EAAAA,GAAYulB,OAAQ2K,EACrB,CAAClwB,EAAAA,GAAYimB,IAAKkK,EAClB,CAACnwB,EAAAA,GAAY0nB,KAAM0I,EACnB,CAACpwB,EAAAA,GAAY4nB,KAAMyI,EACnB,CAACrwB,EAAAA,GAAYkoB,UAAWhO,GACxB,CAACla,EAAAA,GAAYmpB,IAAKmH,GAClB,CAACtwB,EAAAA,GAAYosB,KAAMK,GACnB,CAACzsB,EAAAA,GAAYmtB,KAAMrL,GACnB,CAAC9hB,EAAAA,GAAYutB,MAAOgD,GACpB,CAACvwB,EAAAA,GAAYytB,KAAMrgB,GACnB,CAACpN,EAAAA,GAAYouB,IAAKoC,GAClB,CAACxwB,EAAAA,GAAYsvB,MAAOC,I,4LCjBtB,MAAM9oB,EACJ,UAAO10B,GAAkE,QAAA2qB,EAAAziC,UAAAC,OAAnBu2D,EAAI,IAAAjzD,MAAAk/B,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAJ6zB,EAAI7zB,GAAA3iC,UAAA2iC,GACxD,GAAuB,iBAAZ6zB,EAAK,GACd,OAAOA,EAAK,IAAMA,EAAK,GAAKA,EAAK,GAAMA,EAAK,GAE9C,IAAI1+C,EAAM0+C,EAAK,GAAG,GAClB,IAAK,MAAMC,KAAOD,EAChB,IAAK,MAAMviD,KAAMwiD,EACXxiD,EAAK6D,IACPA,EAAM7D,GAIZ,OAAO6D,CACT,CAEA,UAAOE,GAAkE,QAAA0+C,EAAA12D,UAAAC,OAAnBu2D,EAAI,IAAAjzD,MAAAmzD,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJH,EAAIG,GAAA32D,UAAA22D,GACxD,GAAuB,iBAAZH,EAAK,GACd,OAAOA,EAAK,IAAMA,EAAK,GAAKA,EAAK,GAAMA,EAAK,GAE9C,IAAIx+C,EAAMw+C,EAAK,GAAG,GAClB,IAAK,MAAMC,KAAOD,EAChB,IAAK,MAAMviD,KAAMwiD,EACXxiD,EAAK+D,IACPA,EAAM/D,GAIZ,OAAO+D,CACT,CAEA,aAAO6S,GACL,IAAI7S,EAAG,QAAA4+C,EAAA52D,UAAAC,OADQu2D,EAAI,IAAAjzD,MAAAqzD,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJL,EAAIK,GAAA72D,UAAA62D,GAEnB,IAAI/+C,EAAOE,EAAMw+C,EAAK,GAAG,GACzB,IAAK,MAAMC,KAAOD,EAChB,IAAK,MAAMviD,KAAMwiD,EACXxiD,EAAK6D,IACPA,EAAM7D,GAEJA,EAAK+D,IACPA,EAAM/D,GAIZ,MAAO,CAAC6D,EAAKE,EACf,CAEA,oBAAOuI,GACL,MAA0B,oBAAXve,QAA0BA,OAAO80D,kBAAqB,CACvE,CAEA,6BAAOt2C,CAAsBzhB,GAU1B,IAV2B,cAC5B0hB,EAAa,MACbzW,EAAK,OACLiQ,EAAM,MACN+F,EAAQwsB,EAAMjsB,iBAMfxhB,EACK0hB,IACFA,EAAczW,MAAQA,EAAQgW,EAC9BS,EAAcxG,OAASA,EAAS+F,EAChCS,EAAclR,MAAMvF,MAAQA,EAAQ,KACpCyW,EAAclR,MAAM0K,OAASA,EAAS,KAE1C,CAEA,2CAAO88C,CAAqCC,GAC1C,MAAMz1C,EAAOy1C,GAAiB,IAAI9yB,KAUlC,OAAyB,IA/F7B,SAAsB3iB,GACpB,MAAM01C,EAAY11C,EAAKlhB,UACjB62D,EAAa31C,EAAKG,WAElBy1C,EAAiBF,EADL11C,EAAK61C,SAEvB,QAAIF,EAAa,GAAKA,EAAa,MAG/BA,EAAa,GAAKA,EAAa,KAGb,IAAfA,EAAmBC,GAAkB,EAAIA,GAAkB,GACpE,CAkFkBE,CARG,IAAInzB,KACnB3iB,EAAK+1C,iBACL/1C,EAAKg2C,cACLh2C,EAAKi2C,aACLj2C,EAAKk2C,cAAgB,EACrBl2C,EAAKm2C,gBACLn2C,EAAKo2C,kBAGS,EAAI,GAAU,EAChC,CAEA,2BAAO9rB,CAAqBmrB,EAAqBY,GAC/C,MAAMr2C,EAAO,IAAI2iB,KAAK8yB,GAChBa,EAA6E,IAAnDrrB,EAAMuqB,qCAAqCx1C,GACrEu2C,EAAiD,GAA3Bv2C,EAAKw2C,oBAA2B,IACtDC,EAA6BJ,EAAY,GAAK,EAEpD,OADAr2C,EAAK02C,QAAQ12C,EAAKooB,WAAamuB,EAAsBD,GAA2BG,GACzEz2C,CACT,CAGA,kCAAO22C,GAA4F,IAAhEtrB,IAAY5sC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAAS6sC,IAAc7sC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAASm4D,EAAan4D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC7F,MAEM4iB,EAAa7Z,IAAA,IAAC,MAAEgpB,EAAK,QAAE8W,GAA6C9/B,EAAA,OAAa,GAARgpB,EAAa8W,CAAO,EAE7FtnB,EAAOsqB,EAAqB,IAAI3H,MAAQ,GACxCk0B,EAAY72C,EAAK61C,SACjBiB,EAAsC,GAAlB92C,EAAKmB,WAAkBnB,EAAKqB,aAEhD01C,EAAmB1rB,EAA6C,GAA9BxD,EAAAA,GAAmC,EACrEmvB,EAAqB1rB,EAA+C,GAA9BzD,EAAAA,GAAmC,EAEzEovB,EAA0B,IAAdJ,GAAiC,IAAdA,EAC/BzZ,EAAS/7B,EAZM,CAAEmP,MAAO,EAAG8W,QAAS,KAYAyvB,EAAmBH,GAAiBE,EACxEI,EAAW71C,EAZE,CAAEmP,MAAO,GAAI8W,QAAS,IAYC0vB,EAAqBJ,GAAiBE,EAChF,OAAQG,GAAa7Z,IAAW8Z,CAClC,CAEA,4BAAOztB,CAAsB31B,GAM3B,MAAMkM,EAAO,IAAI2iB,KAAK,GAEtB,OADA3iB,EAAKm3C,cAAcrjD,GACZm3B,EAAMX,qBAAqBtqB,GAAM,EAC1C,CAEA,yBAAOujC,CAAmBvjC,GACxB,MAAQ,GAAEA,EAAKK,iBAAiBsjC,OAAO3jC,EAAKG,WAAa,GAAGyjC,SAAS,EAAG,QAAQD,OAAO3jC,EAAKlhB,WAAW8kD,SACrG,EACA,MAEJ,CAEA,yBAAO5zB,CAAmB/P,GACxB,MAAOujC,EAAMC,EAAIC,GAAMzjC,EAAWjD,MAAM,KAElCgD,EAAO,IAAI2iB,KAAK/lB,OAAOmc,SAASyqB,GAAO5mC,OAAOmc,SAAS0qB,GAAM,EAAG7mC,OAAOmc,SAAS2qB,IAKtF,OAJI9mC,OAAOzE,MAAM6H,EAAKooB,aACpBgvB,EAAAA,EAAAA,IAAiB,IAAIjzC,MAAM,gBAAiB,CAAE3O,MAAO,CAAEwK,UAGlDA,CACT,CAEA,eAAOiD,CAASo0C,GACd,IAAIx5B,EAAAA,EAAAA,MAAY,OAAO,EACvB,IAAIy5B,GAAa,EAGjB,GAAIC,UAAUC,UAAUnuD,QAAQ,cAAgB,EAC9C,IACE+U,SAASq5C,YAAY,cACrBH,GAAa,CACf,CAAE,MAAO5pD,GAAI,MAEb4pD,IAAeC,UAAUC,UAAUE,MACjC,+EAIJ,GAAIL,EACF,IACE,OACEC,IACC72D,OAAO82D,UAAUI,kBAChBl3D,OAAO82D,UAAUK,gBACjB,iBAAkBx5C,SAASC,cAAc,OAE/C,CAAE,MAAO3Q,GAAI,CAGf,OAAO4pD,CACT,CAEA,aAAOO,GACL,MAAMC,EAAcP,UAAUC,UAAUE,MAAM,SACxCK,EAAgBR,UAAUC,UAAUE,MAAM,WAC1CM,EAAcT,UAAUC,UAAUE,MAAM,SAG9C,OAFuBH,UAAUC,UAAUE,MAAM,QAAUH,UAAUK,eAAiB,IAE3DG,IAAkBC,GAAgBF,CAC/D,CAEA,gBAAOG,CAAUlwD,GACf,MAAMmwD,EAAK,IAAIC,OAAO,mBAAqBpwD,EAAO,+BAClD,OAAOqW,SAASg6C,OAAO/iD,QAAQ6iD,EAAI,KACrC,CAEA,gBAAOG,CAAUtwD,EAAcjC,EAAewyD,GAC5C,IAAIF,EAASrwD,EAAO,IAAMjC,EAAQ,aAAewyD,EAAQC,cACtB,cAA/Bn6C,SAASjQ,SAASqqD,WACpBJ,GAAU,wBAEZh6C,SAASg6C,OAASA,CACpB,EAGF,UACa9tB,EAAuBW,EAAMX,qBAC7Bb,EAAwBwB,EAAMxB,sBAC9B8Z,EAAqBtY,EAAMsY,mBAC3BvzB,EAAqBib,EAAMjb,mBAEjC,SAASyoC,IACd,OACEr6C,SAASs6C,mBACTt6C,SAASu6C,yBACTv6C,SAASw6C,sBACTx6C,SAASy6C,sBACT,CAEJ,CAEO,SAASC,EAAqBt4D,GACnC,OACEA,EAAQu4D,mBACRv4D,EAAQw4D,yBACRx4D,EAAQy4D,sBACRz4D,EAAQ04D,mBAEZ,CAEO,SAASC,IACd,OACE/6C,SAASg7C,gBAAkBh7C,SAASi7C,sBAAwBj7C,SAASk7C,mBAAqBl7C,SAASm7C,gBAEvG,CAEO,SAASC,EAAMC,GACQ,YAAxBr7C,SAASs7C,WAKbt7C,SAASjc,iBAAiB,mBAAoBs3D,GAJ5CA,GAKJ,CAEO,SAASE,EAAoBC,GAClC,MACMC,EAAmBz7C,SAAS07C,eAAeF,GAE3CG,EAAMF,GAAkB5rD,wBAE9B,MAAO,CACLxF,MAAOkP,KAAKlB,KAAKsjD,GAAKtxD,OAAS,GANjB,EAM+B,GAC7CiQ,OAAQf,KAAKlB,KAAKsjD,GAAKrhD,QAAU,GAPnB,EAOiC,GAEnD,CAEO,SAASshD,IACd,OAAOv5D,OAAOC,WAAaymC,EAAAA,EAC7B,CAEO,SAAS8yB,EAAoBh3C,GAClC,SAAIA,GAAYgoB,EAAMhoB,aACbxiB,OAAOmM,YAAc,KAAQ,CAGxC,CAEO,SAASia,EAA8B/gB,GAC5C,IAAI4rC,EAAS,GAYb,OAXI5rC,GAAS,KACXA,GAAS,IACT4rC,EAAS,KACA5rC,GAAS,KAClBA,GAAS,IACT4rC,EAAS,KACA5rC,GAAS,MAClBA,GAAS,IACT4rC,EAAS,KAGJ5rC,EAAM+rB,QAAQ,GAAK6f,CAC5B,CAEO,SAAS9R,IACd,MAAyB,oBAAXn/B,QAA0BA,OAAO7B,gBAAgBs7D,kBACjE,CAEO,SAAS99B,EACdxtB,GAMA,IALAurD,EAAa17D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CACdsnB,EAAAA,GAA2Bq0C,UAC3Br0C,EAAAA,GAA2Bs0C,YAC3Bt0C,EAAAA,GAA2Bu0C,YAG7B,OACG16B,KAAuBu6B,EAAcr8D,SAAS8Q,EAAI6T,6BAEnD7T,EAAI6T,6BAA+BsD,EAAAA,GAA2B4mB,SAElE,C,sDCvTA,MAAM4tB,EAA6D,CAAC,EAE7D,SAASC,EAAqBnzD,UAC5BkzD,EAA8BlzD,EACvC,CAOO,SAAS25C,EAAgByZ,GAC9B,MAAsB,eAAfA,EAAM1yD,IACf,CAEO,SAAS2yD,EAA4Bl9D,GAMzC,IAN0C,IAC3C6J,EAAG,0BACHszD,GAA4B,GAI7Bn9D,EACKm9D,GAhBC,SAAsBtzD,GAC3BkzD,EAA8BlzD,IAAMuzD,QACpCJ,EAAqBnzD,EACvB,CAcIwzD,CAAaxzD,GAEf,MAAMyzD,EAAa,oBAAqBr6D,OAAS,IAAIs6D,qBAAoBp8D,EAIzE,OAHIm8D,IACFP,EAA8BlzD,GAAOyzD,GAEhCA,CACT,C,mCCFA,MAAME,IAAmBn9B,E,SAAAA,OA3BzB,WACE,MAAMo9B,EAAiB1D,UAAUC,UAAUE,MAAM,YAC3CwD,EAAe3D,UAAUC,UAAUE,MAAM,UACzCK,EAAgBR,UAAUC,UAAUE,MAAM,WAC1CyD,EAAc5D,UAAUC,UAAUE,MAAM,SACxCM,EAAcT,UAAUC,UAAUE,MAAM,SACxC0D,EAAoB7D,UAAUC,UAAUE,MAAM,eAC9C2D,EAAsB9D,UAAUC,UAAUE,MAAM,kBAChD4D,EAAiB/D,UAAUC,UAAUE,MAAM,QAAUH,UAAUK,eAAiB,EAEhF2D,EACJN,GACAC,GACAnD,GACAoD,GACAnD,GACAoD,GACAC,GACAC,EAIF,QAFyB/D,UAAUC,UAAUE,MAAM,cAEzB6D,CAC5B,CAI8CC,GAEvC,SAASC,EAAoBt9C,GAClC,IAAKA,EACH,OAAO,KAGT,MAAMrL,EAAUqL,EAAOu9C,WAAW,KAAMV,EAAmB,CAAEW,oBAAoB,QAASh9D,GAC1F,IAAKmU,EAEH,OADArS,OAAO6U,QAAQC,eAAe,uBACvB,KAGTzC,EAAQ8oD,OAAS,CAAC,EAElB,MAAMC,EAAWC,yBAAyBtgD,UAAUe,QAapD,OAZAzJ,EAAQyJ,QAAU,WAEhB,OADAzN,KAAK8sD,OAAS,CAAC,EACRC,EAASE,MAAMjtD,KACxB,EAEAgE,EAAQ/C,IAAM,SAAU1I,EAAKvB,GACvBgJ,KAAK8sD,OAAOv0D,KAASvB,IACvBgJ,KAAKzH,GAAOvB,EACZgJ,KAAK8sD,OAAOv0D,GAAOvB,EAEvB,EAEOgN,CACT,C,iaC9BA,MAAMkpD,EAAiB,MACjBC,EAAgB,KAChBC,EAKD,CAAC,EAGN,SAASC,EAAwB3+D,GAA6C,IAA5C,IAAE4+D,EAAG,IAAEC,GAAmC7+D,EAC1E,MAAM8+D,EAASF,EACTG,EAASF,EACf,OAAO1kD,KAAK0R,MAAMizC,EAASN,KAAoBrkD,KAAK0R,MAAMkzC,EAASP,EACrE,CAEA,SAASQ,EAAsBh1D,GAQ5B,IAR6B,WAC9Bi1D,EAAU,OACV7yD,EAAM,UACNwM,GAKD5O,EACC,MAAQ,GAAEoC,KAAUwM,KAAaqmD,GACnC,CAsCA,SAASC,EAAqBr6C,GAc3B,IAd4B,WAC7Bo6C,EAAU,OACV7yD,EAAM,UACNwM,EAAS,YACTumD,EAAW,UACXC,EAAS,aACTC,GAQDx6C,EACC,MAAM7d,EAAKg4D,EAAuB,CAAEC,aAAY7yD,SAAQwM,eAxB1D,WACE,MAAMqrC,EAAM9e,KAAK8e,MACjBrwC,OAAOC,KAAK6qD,GAAmBzpD,SAASqqD,IAClCZ,EAAkBY,GAAqBC,SAAWtb,EAAMwa,UACnDC,EAAkBY,EAC3B,GAEJ,CAkBEE,GACAd,EAAkB13D,GAAM,CACtBm4D,cACAC,YACAC,eACAE,SAAUp6B,KAAK8e,MAEnB,CAEA,MAAMwb,EAAuB,EACvBC,EAAuB,EACvBC,EAAuB,GAEtB,SAAShiC,EAA4B9U,GAMzC,IAN0C,WAC3CsJ,EAAa,EAAC,YACdC,GAIDvJ,EACC,MAAM,cAAE5I,GAAkBmS,EAAY01B,SAChC8X,EAAiB3/C,EAAcoI,OAC/Bm/B,EACJr1B,EAAa,GAAkC,IAA7BytC,EAAepY,UAC7BrtC,KAAKpB,IAAI6mD,EAAe3tC,SAAU,EAAI,EAAIE,GAC1CytC,EAAepY,UAMrB,MAAO,CACL/pB,aALmBmiC,EAAe3tC,SAAWE,EAM7CuL,eALqBvjB,KAAKpB,IAAI6mD,EAAe7/C,OAASoS,EAAYstC,GAMlEI,eALqB1lD,KAAKlB,IAAIymD,EAAsBvlD,KAAKpB,IAAIyuC,EAAYr1B,EAAYwtC,IAOzF,CAEO,SAASztC,EAAqBtH,GAQlC,IARmC,WACpCuH,EAAa,EAAC,YACdC,EAAW,YACX0tC,GAAc,GAKfl1C,EACC,MAAM,aAAE6S,EAAY,eAAEC,EAAc,eAAEmiC,GAAmBliC,EAA6B,CAAExL,aAAYC,gBAE9FH,EAAWwL,EAAgC,EAAjBC,EAAqBmiC,EACrD,IAAKC,EACH,OAAO7tC,EAET,MAAM8tC,EAAqB9tC,EAAW,IAAM,GAAK,IACjD,OAAO9X,KAAK6Q,MAAMiH,EAAW8tC,GAAsBA,CACrD,CAEA,MAAMC,EAA+B,KAE/BC,EAA8C,CAAC,EAC/CC,EAAgD,GAEhDC,EAA0Bt2D,GAAgBo2D,EAAgCp2D,IAAQ,KAClFu2D,EAAuBA,CAACv2D,EAAavB,KACzC,IAAK43D,EAAoC5/D,SAASuJ,KAChDq2D,EAAoClzC,QAAQnjB,GACxCq2D,EAAoCh/D,OALN,IAK8C,CAC9E,MAAMm/D,EAAYH,EAAoCr9D,MAClDw9D,UACKJ,EAAgCI,EAE3C,CAGFJ,EAAgCp2D,GAAOvB,CAAK,EAGvC,SAASqjC,EAA6Bnd,GAQ1C,IAR2C,kBAC5Cgd,EAAiB,iBACjBR,EAAgB,YAChB5Y,GAKD5D,EACC,MAAM8xC,EAA4BpuC,EAAsB,CAAEE,gBACpDwb,EAAqBpC,EAAoBR,EACzCu1B,EAAY,GAAED,KAA6B1yB,IACjD,IAAI4yB,EAAgB,EAChBC,EAAoB,EACpBC,EAAkBP,EAAuBI,GACzCI,EAAY,EAIhB,IAHI/yB,GAAsB0yB,IACxBI,EAAkB9yB,EAAqB0yB,GAEd,OAApBI,GAA0B,CAC/BC,GAAa,EACb,MAAMC,EAAY,IAClBH,GAAqBD,EACrB,MAAMvuC,EAAWC,EAAsB,CAAEC,WAAYsuC,EAAmBruC,cAAa0tC,aAAa,IAC5Fe,EAAejzB,EAAqB3b,EAS1C,GARI4uC,EAAeD,EACjBJ,EAAgBA,EAAgB,EAAoB,EAAhBA,EAAoBR,EAC/Ca,GAAgBD,EACzBJ,EAAgBA,EAAgB,EAAoB,EAAhBA,GAAqBR,EAEzDU,EAAkBD,EAGF,MAAdE,EAYF,OAXA/G,EAAAA,EAAAA,IAAiB,IAAIjzC,MAAM,0DAA2D,CACpF3O,MAAO,CACL2oD,YACAH,gBACA5yB,qBACA3b,WACA4uC,eACAJ,oBACAruC,YAAaA,EAAY7a,SAAS,CAAC,SAAU,aAG1CkpD,CAEX,CAIA,OAFAL,EAAqBG,EAAUG,GAExBA,CACT,CAEO,SAASI,EAAmB5xC,GAQhC,IARiC,WAClC6xC,EAAU,MACVC,EAAK,UACLpoD,GAKDsW,EACC,MAAM+xC,EAAaF,EAAa,EAEhC,OAD0B,CAACC,EAAMC,GAAaD,EAAMD,IAAa1vC,MAAM1lB,QAAoBxK,IAAVwK,IACvDq1D,EAAMC,GAAcD,EAAMD,GAAc54B,EAAAA,GAAkBvvB,EACtF,CAyCO,SAAS2e,EAA8BvG,GAQ3C,IAR4C,UAC7CwG,EAAS,QACTC,EAAO,MACP3hB,GAKDkb,EACC,MAAQxO,KAAMw+C,EAAK,OAAE50D,EAAM,UAAEwM,EAAS,WAAEpO,EAAU,WAAEykC,EAAU,mBAAEtd,GAAuB7b,EACjFs5C,EAAYt5C,EAAMsd,gBAAkB,EAIpC8tC,EAA2B1pC,IAAcwpC,EAAM,IAAMvpC,IAAYupC,EAAMA,EAAM9/D,OAAS,GAEtFigE,EAA0B,CAC9BlC,WAAY+B,EAAM9/D,OAClBkL,SACAwM,YACAumD,YAAa3nC,EACb4nC,UAAW3nC,GAEP2pC,EAnQR,SAA8B9vC,GAY3B,IAZ4B,WAC7B2tC,EAAU,OACV7yD,EAAM,UACNwM,EAAS,YACTumD,EAAW,UACXC,GAOD9tC,EACC,MAAMtqB,EAAKg4D,EAAuB,CAAEC,aAAY7yD,SAAQwM,cAClDyoD,EAAQ3C,EAAkB13D,GAChC,OAAIq6D,GAAOlC,aAAeA,GAAekC,GAAOjC,WAAaA,GAC3DiC,EAAM9B,SAAWp6B,KAAK8e,MAClBod,EAAMlC,cAAgBA,GAAekC,EAAMjC,YAAcA,EACpDiC,EAAMhC,aAERgC,EAAMhC,aAAa18D,QACvB2+D,GAAuBA,GAAsBnC,GAAemC,GAAsBlC,KAGhF,IACT,CA0OsBmC,CAAsBJ,GAC1C,GAAIC,EACF,OAAOA,EAET,IAAKnyB,GAAczkC,IAAeC,EAAAA,GAAWC,MAAO,CAClD,GAAIw2D,EACF,OAAOF,EAET,MAAMQ,EAAmBr5B,EAAAA,GAAkBvvB,GACrC6oD,EAAYT,EAAM,GAClBj4C,EAAWi4C,EAAMA,EAAM9/D,OAAS,GAChCwgE,EAAmBvnD,KAAK0X,MAAM4vC,EAAYjqC,GAAagqC,GACvDG,EAAkBxnD,KAAK0X,MAAM4F,EAAU1O,GAAYy4C,GACzD,MAAO,IACFh9D,MAAMwU,KAAK,CAAE9X,OAAQwgE,IACrBn5D,KAAI,CAACiJ,EAAG7F,IAAU81D,GAAa91D,EAAQ,GAAK61D,IAC5C5wC,aACAowC,KACAx8D,MAAMwU,KAAK,CAAE9X,OAAQygE,IAAmBp5D,KAAI,CAACiJ,EAAG7F,IAAUod,GAAYpd,EAAQ,GAAK61D,IAE1F,CAEA,MAAMI,EAAoBV,EACtBprD,EAAMk2B,iBArFZ,SAA6Bzb,GAU1B,IAV2B,iBAC5BsxC,EAAgB,eAChBC,EAAc,aACdC,EAAY,mBACZpwC,GAMDpB,EACC,MAAMiH,GAAYyU,EAAAA,EAAAA,IAAsB41B,GAClCpqC,GAAUwU,EAAAA,EAAAA,IAAsB61B,GAChCE,EAAqBH,EAAmBE,EAAa,GACrDE,EAAkBF,EAAa7gE,OAAS,GAAK6gE,EAAaA,EAAa7gE,OAAS,GAAK4gE,EACrFL,GAAYx1B,EAAAA,EAAAA,IAAsB81B,EAAa,IAC/Ch5C,GAAWkjB,EAAAA,EAAAA,IAAsB81B,EAAaA,EAAa7gE,OAAS,IAC1E,OAAOwrC,EAAAA,EACc,CACjBhC,MACEs3B,IAAuBt1B,EAAAA,EAAkBlV,IAAcA,EAAU3T,aAAe8N,GAC5E+a,EAAAA,EAAwBlV,GAAY,GACpCA,EACN4L,IAAK6+B,EAAkBv1B,EAAAA,EAAwBjV,EAAS,GAAKA,IAE9D90B,QAAQ6f,IACP,MAAMq8C,EAAMr8C,EAAKooB,UAAY,IAAkC,GAA3BpoB,EAAKw2C,oBACzC,OACGtsB,EAAAA,EAAyBlqB,EAAM,CAAEkoB,MAAOgC,EAAAA,EAAmB+0B,GAAYr+B,IAAKsJ,EAAAA,EAAiB3jB,MAC9Fg5C,EAAa1wC,MAAM6wC,GACjBvD,EAAyB,CACvBC,IAAKsD,EAAWz0B,EAAAA,GAAMuqB,qCAAqC,IAAI7yB,KAAgB,IAAX+8B,IACpErD,SAEH,GAGT,CAiDMsD,CAAqB,CACnBN,iBAAkBrqC,EAClBsqC,eAAgBrqC,EAChBsqC,aAAcf,EACdrvC,uBAGAywC,EAA0C,GAArBzwC,EACrB0wC,EAAsB79D,MAAMwU,KAAK,CAAE9X,OAAQkuD,IAAa7mD,KAAI,CAACiJ,EAAGsc,IAAMA,EAAIqa,EAAAA,GAAkBvvB,KAC5F0pD,EAA4B70B,EAAAA,GAAMuqB,qCAAqC,IAAI7yB,KAAiB,IAAZ3N,IAChF6nC,EAAeuC,EAAkBhoC,SAASpX,IAC9C,MAEM+/C,EADJ//C,EAAKooB,UAAY,IAAO6C,EAAAA,GAAMuqB,qCAAqCx1C,GAAmC,GAA3BA,EAAKw2C,oBAC7CoJ,EACrC,OAAOC,EAAoB95D,KAEzB,CAACi6D,EAAY72D,KACV,CAACoX,EAAAA,GAAUQ,EAAGR,EAAAA,GAAUS,GAAIT,EAAAA,GAAUU,IAAInjB,SAASsY,IAAcjN,EAAQ,GAAK,KAAO,GACtF42D,EACAC,GACH,IAqBH,OAlBKtB,GACH7B,EAAa18D,QAAO,CAAC6f,EAAM7W,EAAO82D,KAChC,MAAMC,EACJlgD,GAAQgV,GACRmnC,EAAyB,CACvBC,IAAKp8C,EAAOirB,EAAAA,GAAMuqB,qCAAqC,IAAI7yB,KAAY,IAAP3iB,IAChEq8C,IAAKrnC,EAAY8qC,IAEfK,EAA8BnrC,EAAYhV,GAAQgV,EAAYirC,EAA4B92D,EAAQ,GACxG,OAAO+2D,GAAkBC,CAA2B,IAIxDzD,EAAsB,IACjBiC,EACH9B,iBAGKA,CACT,CAMO,SAAS5Y,EAAyB7zB,GAA8E,IAA7E,UAAE1c,EAAS,MAAEJ,GAA8D8c,EACnH,MAAM,KAAEpQ,EAAI,UAAE5J,GAAc9C,EACtBkrD,EAAQzpC,EAA+B,CAC3CC,UAAWhV,EAAK,GAChBiV,QAASjV,EAAKA,EAAKthB,OAAS,GAC5B4U,UAEI0hB,EAAYwpC,EAAM,GAClBvpC,EAAUupC,EAAMA,EAAM9/D,OAAS,GAC/B0hE,EAAgB5B,EAAM9/D,OAAS,EACrC,GAAIgV,GAAa,GAAKA,GAAa0sD,EAAe,CAChD,MAAM7B,EAAa5mD,KAAK0R,MAAM3V,GACxBsrD,EAAmBV,EAAoB,CAAEC,aAAYC,QAAOpoD,cAClE,OAAOooD,EAAMD,IAAe7qD,EAAY6qD,GAAcS,CACxD,CACA,MAAMqB,EAAgB3sD,EAAY,EAC5B4sD,GAAkBrrC,EAAUD,GAAawpC,EAAM9/D,OAC/C6hE,EAA0BF,EAC5B1oD,KAAKiT,IAAIlX,GAAa4sD,GACrB5sD,EAAY0sD,GAAiBE,EAClC,OAAO3oD,KAAK6Q,MAAM63C,EAAgBrrC,EAAYurC,EAA0BtrC,EAAUsrC,EACpF,CAEO,SAASxsD,EAAyB0c,GAA8E,IAA7E,UAAE3c,EAAS,MAAER,GAA8Dmd,EACnH,MAAM,KAAEzQ,EAAI,UAAE5J,GAAc9C,EACtBkrD,EAAQzpC,EAA+B,CAC3CC,UAAWhV,EAAK,GAChBiV,QAASjV,EAAKA,EAAKthB,OAAS,GAC5B4U,UAEI0hB,EAAYwpC,EAAM,GAClBvpC,EAAUupC,EAAMA,EAAM9/D,OAAS,GAC/B0hE,EAAgB5B,EAAM9/D,OAAS,EACrC,GAAIoV,GAAa0qD,EAAM,IAAM1qD,GAAa0qD,EAAMA,EAAM9/D,OAAS,GAAI,CACjE,MAAM+/D,EAAa3qD,IAAcmhB,EAAUmrC,EAAgB5B,EAAM74D,WAAWqa,GAASA,EAAOlM,IACtFkrD,EAAmBV,EAAoB,CAAEC,WAAYE,EAAa,EAAGD,QAAOpoD,cAElF,OAAOqoD,GAD6BD,EAAMC,GAAc3qD,GAAakrD,CAEvE,CACA,MAAMqB,EAAgBvsD,EAAYkhB,EAC5BsrC,GAAkBrrC,EAAUD,GAAawpC,EAAM9/D,OACrD,OAAO2hE,IACArrC,EAAYlhB,GAAawsD,EAC5BF,GAAiBtsD,EAAYmhB,GAAWqrC,CAC9C,CAGO,SAASE,EAAcv2D,GAC5B,GAA+B,IAA3BA,EAAUZ,QAAQ,KAAY,CAChC,MAAMO,EAASK,EAAUR,UAAU,GAEnC,OAAIm8B,EAAAA,GAAQh8B,GACH3B,EAAAA,GAAWI,OACS,IAAlBuB,EAAOlL,OACTuJ,EAAAA,GAAWG,MAEXH,EAAAA,GAAWE,OAEtB,CACA,OAAOF,EAAAA,GAAWC,KACpB,CAwBOu4D,eAAeC,EAA8BxvC,GAKZ,IALa,sBACnDyvC,EAAqB,UACrBvqD,EAAS,QACTzS,EAAO,UACPq7C,GACoC9tB,EACpC,MAAMkvB,EA5BD,SAA4CvvB,GAMhD,IANiD,sBAClD8vC,EAAqB,UACrBvqD,GAIDya,EACC,MAAM,SAAEtgB,GAAaowD,EACfC,EAAuBrwD,EAASuqC,MAAK/pB,IAAA,IAAC,KAAE/zB,GAAM+zB,EAAA,MAAc,oBAAT/zB,CAA0B,IAEnF,OADgB4jE,GAAsB9nC,QAAQ9b,MAAM,MAAQ,IAC7CjX,KAAK6D,IAAM,CACxBA,SACA5B,WAAYw4D,EAAc52D,GAC1BwM,eAEJ,CAa+ByqD,CAAoC,CAAEF,wBAAuBvqD,cAE1F,GAAIgqC,EAAqB1hD,OAAS,EAAG,CACnC,MAAMoiE,EAAW1gB,EAAqBr6C,KAAImvB,IAAA,IAAC,OAAEtrB,EAAM,WAAE5B,EAAU,UAAEoO,GAAW8e,EAAA,OAC1EoM,EAAAA,EAAMrvB,IAAI,CACRrI,SACA5B,aACAoO,YACAzS,UACAq7C,aACA,IAEJ,OAAOqB,QAAQhpC,IAAIypD,EACrB,CACA,OAAOzgB,QAAQ0gB,QAAQ,GACzB,CAeO,SAAS7tC,EAAWmD,GAWN,IAXO,QAC1BvjB,EAAO,WACPgR,EAAU,UACV9S,EAAS,MACTsC,EAAK,aACL8f,EAAY,cACZC,EAAa,kBACbI,EAAiB,sBACjBH,EAAqB,YACrB4Z,GAAc,EAAK,gBACnB8zB,GAAkB,GACD3qC,EACjB,MAAMpC,EAAanQ,EAAW4P,qBAAqB1iB,GAC7Ci4B,EAAaj4B,EAAUuC,SACvB,cAAEkK,EAAa,kBAAEwvB,IAAsBl3B,EAAAA,EAAAA,IAAuBkzB,EAAW/0B,gBACzEoxC,EAAWpY,EAAcD,EAAoBxvB,GAC7C,OAAEnE,GAAWmE,EAAcwH,QAEjC,IAAKnB,EAAW21B,2BAA2BzoC,GACzC,OAAO,EAGT,MAAMuiB,EAAQzP,EAAWk2B,gBAAgBhpC,GACnCka,EAASla,EAAUqB,MAAMD,EAAE6hB,GAAcgV,EAAW5wB,WACpD4oD,EAAgB/1C,EAAS,GAAKA,GAAUkI,EAC9C,GAAI6tC,EAAe,CACjB,MAAM7uD,EAAI8Y,EAASo6B,EAAS1qC,KAAKnS,MACjC,IAAIkQ,EAAAA,EACF,CACEI,GAAI3G,EACJ6G,GAAI7G,EACJ4G,GAAIssC,EAASrqC,IAAIvC,OACjBQ,GAAIosC,EAASrqC,IAAIvC,OAAS2a,EAC1Bja,YAAaE,EAAO69B,OAEtBnmC,GACA4B,OAAOE,GAET2gB,IAAoB3gB,EAASmhB,EAC/B,CAEA,MAAMitC,EAAclwD,EAAUqB,MAAME,EACjCwX,SACAgsB,QACAE,MAAK,CAACxF,EAAGC,IAAMD,EAAIC,IAEtB,GAAc,OAAVnd,KAAoB2tC,EAAY,IAAM3tC,GAASA,GAAS2tC,EAAY,IACtE,OAAOD,EAGT,MAAME,EAAUnwD,EAAUqB,MAAME,EAAEghB,GAC5BhhB,EAAIoF,KAAK6Q,MAAM24C,EAAU7b,EAASrqC,IAAIvC,QAC5C,IAAIC,EAAAA,EACF,CACEI,GAAIusC,EAAS1qC,KAAKnS,MAClBwQ,GAAIqsC,EAAS1qC,KAAKnS,MAAQ2qB,EAC1Bpa,GAAIzG,EACJ2G,GAAI3G,EACJ6G,YAAaE,EAAO69B,OAEtBnmC,GACA4B,OAAOE,GACT,MAAMsuD,EAAkB9tD,EAAMtL,aAAeC,EAAAA,GAAWI,QAAUiL,EAAM2T,WAAa,KAAQ,EAAI,EA+CjG,OA5BA,IAAI7L,EAAAA,EACF,CACElS,KAlBE+/B,EAAW52B,QAAUiW,EAAAA,GAAUC,YAAe2kB,EAQ1C,GAAE/yB,EAAAA,GAAKqO,MAAM,CACnB1iB,MAAOytB,EACPtM,UAAW3T,EAAM2T,UACjBjf,WAAYsL,EAAMtL,WAClB8yB,eAAgBxH,IAAwBC,KAAWviB,EAAUmrC,sBAAmBx9C,EAAY,OACzFqiE,EAAkB,IAAM,KAZnB,GAAE7mD,EAAAA,GAAKqO,MAAM,CACnB1iB,OAAO2iB,EAAAA,EAAAA,IAAuB,CAAEC,OAAQ6K,EAAO5K,KAAMsgB,EAAWo4B,gBAChEp6C,UAAW3T,EAAM2T,UACjBjf,WAAYsL,EAAMtL,WAClB8yB,eAAgB,OAclB1oB,EACEkzC,EAAS1qC,KAAKnS,MACd68C,EAASpqC,MAAM+P,KAAK/F,OAAOtK,KAC3BwY,GACC8Z,EAAc7nB,EAAAA,GAAOgH,EAAI+0C,EAAkB90C,EAAAA,GAAQlH,KACtDpK,QAASkyB,EACL9xB,EAAAA,EAAKC,2BAA2B,UAAW4xB,EAAkB/xB,MAAM+P,KAAK3Q,KAAKU,SAC7E,CACEC,IAAKqR,EAAAA,GAAQlH,IACblK,MAAOoR,EAAAA,GAAQlH,IACfjK,OAAQmR,EAAAA,GAAQlH,IAChBxK,KAAM0R,EAAAA,GAAQlH,KAGlB7S,IACAsI,aAAcC,EAAAA,GAAaoQ,OAC3BjP,UAAW3C,EAAO89B,UAClBn6B,WAAY3D,EAAO+9B,oBACnB/8B,KAAMc,EAAAA,EAAKC,2BAA2B,OAAQ,IAAKiqC,EAASpqC,MAAM+P,KAAK3Q,KAAMtM,MAAO,SACpFyM,WAAY6qC,EAASpqC,MAAM+P,KAAK3Q,KAAKG,YAGzCzJ,GACA4B,OAAOE,IAEF,CACT,CAOO,SAASiR,EAAc5F,GACvBA,IAELA,EAAO1V,MAAQ,EACf0V,EAAOzF,OAAS,EAChByF,EAAOnQ,MAAMvF,MAAQ,MACrB0V,EAAOnQ,MAAM0K,OAAS,MACxB,CAEO,SAASmd,EAAc4B,GAA+E,IAA9E,OAAEtC,EAAM,cAAE1X,GAAkEga,EACzG,MAAM,OAAEne,GAAWmE,EAAcwH,QACjC,OAAe,IAAXkQ,EACK7b,EAAOilB,WAETpJ,EAAS,EAAI7b,EAAOq+B,eAAiBr+B,EAAOk+B,cACrD,CAEO,SAAShvB,EAAKmQ,GAAuF,IAAtF,KAAE9tB,EAAI,IAAEkwB,EAAG,eAAED,GAAuEnC,EACxG,OAAOxe,EAAAA,GAAKqO,MAAM,CAChB1iB,MAAOi1B,EACP9T,UAAWpc,EAAKoc,UAChBjf,WAAY6C,EAAK7C,WACjB8yB,eAAgBA,GAEpB,CAYO,SAASpG,EAA8B4sC,GAQ5B,IAR6B,YAC7C3sC,EAAW,UACXC,EAAS,KACT/pB,GAKDy2D,EACC,MAAMC,EAAe5sC,EAAcC,EAC7B4sC,EAAgD,KAA/B7sC,EAAcC,EAAY,GAC3CzI,EAAOo1C,EAAe,EAAI,IAAMA,EAAe,EAAI,IAAM,GACzDE,EAAuB,GAAEj5C,EAAM,CACnC3d,OACAkwB,IAAKpjB,KAAKiT,IAAI42C,GACd1mC,eAAgB,OAOlB,MAAO,CACLhF,OAAQyrC,EACR3rC,OAP0B,GAAEzJ,IAAO3D,EAAM,CACzC3d,OACAkwB,IAAKpjB,KAAKiT,IAAI22C,SACTE,KAKL9rC,cAAgB,GAAExJ,IAAOs1C,IAE7B,CACO,SAASlsC,EAAemsC,GAA4B,IAA3B,KAAE72D,GAAuB62D,EACvD,MAAMzvB,EAA8B,CAAE5c,aAAc,KAAMC,kBAAmB,MAC5D1Y,OAAOmK,SAASlc,EAAK+pB,aAEpCqd,EAAO5c,aAAeX,EAA+B,CACnD7pB,OACA8pB,YAAa9pB,EAAKoc,UAClB2N,UAAW/pB,EAAK+pB,aAKpB,GADsBhY,OAAOmK,SAASlc,EAAKmc,aAAenc,EAAKmc,aAAenc,EAAKoc,UAChE,CACjB,MAAMqO,EAAoBZ,EAA+B,CACvD7pB,OACA8pB,YAAa9pB,EAAKmc,WAClB4N,UAAW/pB,EAAKoc,YAElBgrB,EAAO3c,kBAAoB,IACtBA,EACHM,OAAS,OAAMN,EAAkBM,SAErC,CAEA,OAAOqc,CACT,CAEO,SAAS0vB,EAAyBl/C,GACvC,MAAO,CACLsD,EAAAA,GAA2Bq0C,UAC3Br0C,EAAAA,GAA2Bu0C,WAC3Bv0C,EAAAA,GAA2Bs0C,aAC3Bv8D,SAAS2kB,EACb,CAEO,SAASuZ,EAA4B4lC,GAOzC,IAP0C,2BAC3Cn/C,EAA0B,cAC1BwZ,GAKD2lC,EACC,MAAMC,EAAuBF,EAAyBl/C,GAChDq/C,EACJr/C,IAA+BsD,EAAAA,GAA2BC,WAAaiW,EAAgB,EACnF8lC,EACJt/C,IAA+BsD,EAAAA,GAA2B4mB,WAAa1Q,EAAgB,EAEzF,OAAO4lC,GAAwBC,GAAkCC,CACnE,CAEO,MAAMC,EAAsB,cAC5B,SAASC,IACd,MAAgD,OAAzCh3B,EAAAA,GAAMgtB,UAAU+J,EACzB,CAQO,SAASE,EAAoBz/C,GAClC,OAAOA,IAA+BsD,EAAAA,GAA2BuV,SACnE,CAEO,MAAM6mC,GAAmBC,IAM1B,IAN2B,KAC/BplE,EAAI,iBACJgmB,GAIDo/C,EACkBp/C,EAAiBsqB,iBACzB76B,SAASjS,IAChB,GAAIA,EAAQitC,WAAajtC,EAAQgtC,SAASr+B,MAAMnS,OAASA,EAAM,CAC7D,MAAMiU,EAAOzQ,EAAQyQ,OACfu8B,EAAWhK,EAAAA,EAAaxmC,GAAM2R,WAClC,IACKnO,EAAQgtC,SAASr+B,MACpBnS,QAEFiU,GAEFzQ,EAAQ6U,QAAQm4B,EAClB,IACA,EAGS60B,GAA6CpN,IAKxD,MAAM,2BAAExyC,EAA0B,SAAE6/C,EAAQ,QAAEC,GAAYtN,EAE1D,OACEqN,GACAC,GAASzkE,SAASwmC,EAAAA,GAAgBk+B,QAClC//C,GACA,CACEsD,EAAAA,GAA2BuV,UAC3BvV,EAAAA,GAA2B4mB,UAC3B5mB,EAAAA,GAA2Bq0C,UAC3Br0C,EAAAA,GAA2Bs0C,YAC3Bt0C,EAAAA,GAA2Bu0C,YAC3Bx8D,SAAS2kB,EAA2B,C,iFC3vBnC,SAASggD,EAAgB5rB,GAC9B,MAAM6rB,EAAWC,EAAiB9rB,GAClC,IAAI+rB,EAAqB,EACrBC,EAAqB,EACrBnyB,EAAqB,EACrBD,EAAqB,IAmBzB,OAhBwB,IAApBiyB,EAAShkE,QAAoC,IAApBgkE,EAAShkE,QACpCkkE,EAAI,KAAOF,EAAS,GAAKA,EAAS,GAClCG,EAAI,KAAOH,EAAS,GAAKA,EAAS,GAClChyB,EAAI,KAAOgyB,EAAS,GAAKA,EAAS,GAElCjyB,EAAwB,IAApBiyB,EAAShkE,OAAe,KAAOgkE,EAAS,GAAKA,EAAS,GAAKjyB,GAGlC,IAApBiyB,EAAShkE,QAAoC,IAApBgkE,EAAShkE,SAC3CkkE,EAAI,KAAOF,EAAS,GAAKA,EAAS,GAClCG,EAAI,KAAOH,EAAS,GAAKA,EAAS,GAClChyB,EAAI,KAAOgyB,EAAS,GAAKA,EAAS,GAElCjyB,EAAwB,IAApBiyB,EAAShkE,OAAe,KAAOgkE,EAAS,GAAKA,EAAS,GAAKjyB,GAG1D,CAAEmyB,EAAGhmD,OAAOgmD,GAAIC,EAAGjmD,OAAOimD,GAAInyB,EAAG9zB,OAAO8zB,GAAID,EAAG94B,KAAKpB,IAAIoB,KAAK6Q,MAAO5L,OAAO6zB,GAAK,IAAO,KAAO,IAAK,GAC5G,CA4CO,SAASqyB,EAAgB9mD,GAA4B,IAAf+mD,EAAKtkE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAChD,MAAMmkE,EAAI5mD,EAAM4mD,EAAEjtD,SAAS,IACrBktD,EAAI7mD,EAAM6mD,EAAEltD,SAAS,IACrB+6B,EAAI10B,EAAM00B,EAAE/6B,SAAS,IACrBkhC,EAAY,IAAM+rB,EAAEhf,SAAS,EAAG,KAAOif,EAAEjf,SAAS,EAAG,KAAOlT,EAAEkT,SAAS,EAAG,KAEhF,OAAKmf,GAAqB,IAAZ/mD,EAAMy0B,EAIZ,GAAEoG,IAvBL,SAAoBksB,GACzB,OAAOprD,KAAKlB,IAAIkB,KAAKpB,IAAIoB,KAAK6Q,MAAc,IAARu6C,GAAc,KAAM,GACrDptD,SAAS,IACTiuC,SAAS,EAAG,IACjB,CAmBwBof,CAAWhnD,EAAMy0B,KAH9BoG,CAIX,CAwCO,SAASosB,EAAWjnD,GACzB,MAAM4mD,EAAI5mD,EAAM4mD,EAAI,IACdC,EAAI7mD,EAAM6mD,EAAI,IACdnyB,EAAI10B,EAAM00B,EAAI,IAEdkE,EAAIj9B,KAAKlB,IAAImsD,EAAGC,EAAGnyB,GACnBC,EAAIiE,EAAIj9B,KAAKpB,IAAIqsD,EAAGC,EAAGnyB,GACvB3vB,EAAI4vB,IAAMiE,IAAMguB,GAAKC,EAAInyB,GAAKC,EAAIiE,IAAMiuB,EAAI,GAAKnyB,EAAIkyB,GAAKjyB,EAAI,GAAKiyB,EAAIC,GAAKlyB,GAElF,MAAO,CACL5vB,EAAG,IAAMA,EAAI,EAAIA,EAAI,EAAIA,GACzBrB,EAAGk1B,EAAIjE,EAAIiE,EAAI,EACfA,EAAGA,EACHnE,EAAGz0B,EAAMy0B,EAEb,CAoCO,SAASyyB,EAAWlnD,GACzB,MAAMH,EAAI,SAACsY,GAAS,IAAEyc,EAACnyC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,IAAI01B,EAAInY,EAAM+E,EAAI,IAAM,EAAC,OAAK/E,EAAM44B,EAAI54B,EAAM44B,EAAI54B,EAAM0D,EAAI/H,KAAKlB,IAAIkB,KAAKpB,IAAIq6B,EAAG,EAAIA,EAAG,GAAI,EAAE,EAErH,MAAO,CACLgyB,EAAGjrD,KAAK6Q,MAAa,IAAP3M,EAAE,IAChBgnD,EAAGlrD,KAAK6Q,MAAa,IAAP3M,EAAE,IAChB60B,EAAG/4B,KAAK6Q,MAAa,IAAP3M,EAAE,IAChB40B,EAAG94B,KAAK6Q,MAAgB,IAAVxM,EAAMy0B,GAAW,IAEnC,CA6BO,SAAS0yB,EAAiBnnD,GAC/B,MAAQ,QAAOA,EAAM4mD,MAAM5mD,EAAM6mD,MAAM7mD,EAAM00B,MAAM10B,EAAMy0B,IAC3D,CASO,SAAS2yB,EAAmBpnD,GACjC,MAAMqnD,EAAa,gFAAgFC,KAAKtnD,IACjGunD,EAAKC,EAAOC,EAAMV,EAAQ,KAAOM,GAAYttB,MAAM,IAAM,CAAC,EAAG,EAAG,EAAG,GAAGhwC,IAAI49C,QACjF,MAAO,CACLif,EAAGhmD,OAAOmc,SAASwqC,GACnBV,EAAGjmD,OAAOmc,SAASyqC,GACnB9yB,EAAG9zB,OAAOmc,SAAS0qC,GACnBhzB,EAAG7zB,OAAOkrC,WAAWib,GAEzB,CAeO,SAASJ,EAAiBe,GAC/B,OAAOA,EAASruD,QAAQ,KAAM,GAChC,CAiBO,SAAS+N,EAAkBsgD,GAAqC,IAAnBC,IAAUllE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAC5D,MACMikE,EADQkB,EAASF,GACEZ,EAAgBM,EAAmBM,GAAWC,GAAcD,EAErF,OAAIC,EACKjB,EAEFA,EAAS3sB,MAAM,EAAG,EAC3B,CAKO,SAAS6tB,EAASF,GACvB,MAAMG,EAAU,CAAC,OAIjB,SALuDplE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,KAGrDolE,EAAQnvD,KAAK,QAERmvD,EAAQh1C,MAAM7Y,GAAe0tD,EAAS1tD,WAAWA,IAC1D,CAKO,SAAS6V,EAAiB63C,GAC/B,OAAIE,EAASF,GACJT,EAAWG,EAAmBM,IA9PhCT,EAAWR,EAiQKiB,GACzB,CAKO,SAAS93C,EAAmB5P,EAAa8nD,EAAwBC,GACtE,MACO,SADCD,EAEGX,EAAiBD,EAAWlnD,IAlNlC,SAAyBA,GAA4B,IAAf+mD,EAAKtkE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAGhD,OAAOqkE,EAFWI,EAAWlnD,GAEK+mD,EACpC,CAgNaiB,CAAgBhoD,EAAO+nD,EAEpC,CAsBO,SAASvtC,EAAwBxa,GAA0B,IAAX+mD,EAAKtkE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAE7D,OAAOqkE,EAAgB,IADLL,EAAgBzmD,GACKy0B,EAAGsyB,IAAS,EACrD,CAKO,SAASzb,EAAiCxhD,GAC/C,OAAI89D,EAAS99D,GAAeq9D,EAAiBC,EAAmBt9D,IACzDq9D,EAAiBV,EAAgB38D,GAC1C,C,gHC3WA,SAASm+D,EACPC,EACAl9B,EACArjC,GAEA,GAAuB,QAAnBqjC,EAAUj/B,KAAgB,CAC5B,MAAMo8D,EAAUxgE,GAAS86C,MAAQ,GACV,IAAnB0lB,EAAQzlE,QACVylE,EAAQzvD,KAAK,IAEfyvD,EAAQ1xD,SAAQ,SAAU2xD,IAf9B,SAA4BF,EAA+BE,GACzD,OAAOF,EAAMr1C,MAAKrxB,IAAA,IAAC,SAAE+S,GAAU/S,EAAA,OAC7B+S,EAASse,MAAMruB,GAAYA,EAAQxD,OAASs0B,EAAAA,GAAc+yC,KAAO7jE,EAAQ4jE,OAASA,GAAK,GAE3F,EAYWE,CAAmBJ,EAAOE,IAC7BF,EAAMxvD,KAAK,CACTgE,OAAQquB,EAAAA,GAAoBC,UAC5Bz2B,SAAU,CACR,CACEvT,KAAMs0B,EAAAA,GAAc+yC,IACpBD,UAKV,GACF,MACEF,EAAMxvD,KAAK,CACTgE,OAAQquB,EAAAA,GAAoBC,UAC5Bz2B,SAAU,CACR,CACEvT,KAAO,cAAgBgqC,EAAUj/B,KACjC+wB,OAAQkO,EAAU9Q,cAK5B,CAEA,SAASquC,EAA4Bv2D,GAQnC,MAPqB,CACnBw2D,YAAap3C,EAAAA,GAAiBiP,YAC9BooC,WAAYr3C,EAAAA,GAAiBoR,WAC7BkmC,kBAAmBt3C,EAAAA,GAAiB+P,kBACpCvkB,KAAMwU,EAAAA,GAAiBC,UACvB+H,KAAMhI,EAAAA,GAAiBuU,WAEL3zB,EACtB,CAcO,MAAM22D,EAAwB,SACnC9S,EACA+S,EACAjhE,GAEA,MAAMugE,EAAQrS,EAAYpM,OAAO,GAAGye,MAC9B3wD,EAAQs+C,EAAYpM,OAAO,GAlBnC,IAAsCpzC,EAoBpCkB,EAAMlB,OApB8BA,EAoBOuyD,EAASvyD,MAnB9B,CACpBwyD,OAAQv8C,EAAAA,GAAUwe,OAClBg+B,WAAYx8C,EAAAA,GAAUC,WACtBw8C,YAAaz8C,EAAAA,GAAU8B,aAEJ/X,IAAwCiW,EAAAA,GAAUwe,QAgBvE89B,EAASI,WACN7kE,QAAQ6mC,GAAcA,EAAU0S,WAAaiC,EAAAA,GAASC,QACtDnpC,SAASu0B,IACRi9B,EAAeC,EAAOl9B,EAAWrjC,EAAQ,IAG7C,MAAM2e,EAAWsiD,EAAStiD,SAASvc,KAAI,SAAUwc,GAC/C,MAAO,CACLvlB,KAAO,YAAculB,EAAQxa,KAC7B+wB,OAAQvW,EAAQ2T,YAAc,GAC9Bla,MAAOuG,EAAQvG,OAAS,GAE5B,IACAkoD,EAAMxvD,KAAK,CACTgE,OAAQquB,EAAAA,GAAoBxzB,MAC5BhD,SAAU,CACR,CACEvT,KAAMunE,EAA4BK,EAAS52D,OAC3CsU,SAAUA,MAKhBsiD,EAASI,WACN7kE,QAAQ6mC,GAAcA,EAAU0S,WAAaiC,EAAAA,GAASG,QACtDrpC,SAASu0B,IACRi9B,EAAeC,EAAOl9B,EAAWrjC,EAAQ,IAG7CkuD,EAAYn5C,OAASnF,EAAMmF,OAASquB,EAAAA,GAAoBxzB,OAAS2wD,EAAMxlE,OAAS,GAAKqoC,EAAAA,GAAoBC,SAC3G,EAEai+B,EAAW,SAAkBL,GACxC,MAAMjhE,EAAU,CAAC,EACXugE,EAAgC,GAEtCU,EAASI,WACN7kE,QAAQ6mC,GAAcA,EAAU0S,WAAaiC,EAAAA,GAASC,QACtDnpC,SAASu0B,IACRi9B,EAAeC,EAAOl9B,EAAWrjC,EAAQ,IAG7C,MAAM2e,EAAWsiD,EAAStiD,SAASvc,KAAI,SAAUwc,GAC/C,MAAO,CACLvlB,KAAO,YAAculB,EAAQxa,KAC7B+wB,OAAQvW,EAAQ2T,YAAc,GAC9Bla,MAAOuG,EAAQvG,OAAS,GAE5B,IAiBA,OAhBAkoD,EAAMxvD,KAAK,CACTgE,OAAQquB,EAAAA,GAAoBxzB,MAC5BhD,SAAU,CACR,CACEvT,KAAMunE,EAA4BK,EAAS52D,OAC3CsU,SAAUA,MAKhBsiD,EAASI,WACN7kE,QAAQ6mC,GAAcA,EAAU0S,WAAaiC,EAAAA,GAASG,QACtDrpC,SAASu0B,IACRi9B,EAAeC,EAAOl9B,EAAWrjC,EAAQ,IAGtCugE,CACT,C,mCC7IO,MAAMvwC,EAAmBn2B,IAQ1B,IAR2B,UAC/Bo2B,EAAS,OACTE,EAAM,kBACNC,GAKDv2B,EACC,MAAMgD,EAAU4d,SAAS07C,eAAelmC,IACpCpzB,GAAYuzB,GAAoBvzB,EAAQwN,MAAM8lB,SAAWC,IAC3DvzB,EAAQwN,MAAM8lB,OAASA,EACzB,C,+DCHK,MAAMjB,EAAoBr1B,IAkB3B,IAlB4B,MAChC8V,EAAK,MACLjB,EAAK,WACL05C,EAAU,gBACVmZ,EAAkB,EAAC,cACnBlZ,EAAgB,EAAC,WACjB3zC,EAAU,gBACVya,EAAe,MACfrqB,GAUDjL,EACC,MAAM2U,EAAK45C,GAAc,CAAE5iD,GAAkBkJ,EAAMD,EAAEkB,EAAMqd,SAASxnB,KAWpE,IAAIg/C,GAAmB,EACvB,IAAK,IAAI78B,EAHqB65C,EAAoC,CAAE7xD,QAAOjB,QAAOgG,aAAY6sD,oBAG1D55C,EAAIhY,EAAM8Q,MAAM1lB,OAASstD,EAAe1gC,IAAK,CAC/E,MAAMlZ,EAAID,EAAGmZ,GACb,GAAIlZ,EAAIiG,EAAa5P,EAAO,CAC1B0/C,EAAkB78B,EAClB,KACF,CACAwH,EAAgBxH,EAAGlZ,EACrB,CAEA,GAAI+1C,GAAmB,EAAG,CAExBr1B,EAAgBq1B,EADNh2C,EAAGg2C,GAEf,GAGWn7B,EAA2BxlB,IAUlC,IAVmC,WACvC6Q,EAAU,MACV/E,EAAK,MACLjB,EAAK,iBACLmoB,GAAmB,GAMpBhzB,EACC,MAAMmpB,EAAWhZ,KAAK0X,KAAKhd,EAAMD,EAAEoG,QAAQH,IACrC+sD,EAAkB9xD,EAAMuvC,eAAelrC,KAAKlB,IAAIka,EAAU,IAC1D+J,EAAWroB,EAAMD,EAAEkB,EAAMqd,SAASy0C,IAAoB/sD,EAAa,EAOzE,MAAO,CAAElP,MAAOqxB,GAAoBE,EAAW0qC,EAAkB,EAAIA,EAAiB1qC,WAAU,EAGrFxN,EAA0B4B,IAYjC,IAZkC,WACtCzW,EAAU,MACV/E,EAAK,MACLjB,EAAK,WACL8a,EAAU,iBACVqN,GAAmB,GAOpB1L,EACC,MAAM,eAAE+zB,GAAmBvvC,EACrBqd,EAAWhZ,KAAK0X,KAAKhd,EAAMD,EAAEoG,QAAQH,EAAa8U,IAClDi4C,EAAkBviB,EAAelrC,KAAKlB,IAAIka,EAAU,KAAOkyB,EAAeA,EAAenkD,OAAS,GAClGg8B,EAAWroB,EAAMD,EAAEkB,EAAMqd,SAASy0C,IAAoB/sD,EAAa,EAEzE,MAAO,CAAElP,MAAOqxB,GAAoBE,EAAW0qC,EAAkB,EAAIA,EAAiB1qC,WAAU,EAI3F,SAASyqC,EAAmC9iD,GAUhD,IAViD,MAClD/O,EAAK,MACLjB,EAAK,WACLgG,EAAU,gBACV6sD,EAAkB,GAMnB7iD,EACC,OAAO1K,KAAKlB,IAAI,EAAGuW,EAAyB,CAAE1Z,QAAOjB,QAAOgG,eAAclP,MAAQ,EAAG+7D,EACvF,C,kHClGO,MAAMG,EAAyBC,GACpCl0D,OAAOC,KAAKi0D,GAAQh0D,QAAO,CAACi0D,EAAUl+D,KACpCk+D,EAASC,OAAOn+D,EAAKi+D,EAAOj+D,IACrBk+D,IACN,IAAIE,UAIF,IAAKC,EAAW,SAAXA,GAAW,OAAXA,EAAW,mCAAXA,EAAW,qDAAXA,EAAW,mDAAXA,EAAW,gCAAXA,CAAW,MAsEhB,MAAMC,UAA+BxhD,MAC1CyhD,SACAC,WAEAl2D,WAAAA,CAAYm2D,EAAiBF,EAA+BC,GAC1Dh2D,MAAMi2D,GACNh3D,KAAK82D,SAAWA,EAChB92D,KAAK+2D,WAAaA,CACpB,EAEK,MAAME,UAAuBJ,GAC7B,MAAM1kB,UAAsB0kB,GAC5B,MAAMK,UAA4BL,GAClC,MAAMM,UAAkBN,GAE/B,QAlEiBlF,UAUI,IAV+C,SAClEtyD,EAAQ,gBACR+3D,EAAe,OACfC,EAAM,KACNC,EAAI,YACJC,EAAW,gBACXvnB,EAAe,mBACfiC,EAAkB,iBAClBulB,EAAgB,UAChBC,GAAY,GACE/oE,EACd,MAAMgpE,EAAO,GAAEr4D,IAAW+3D,EAAmB,IAAG5hB,EAAAA,UAAsB4hB,KAAqB,KACrFhwC,EAA0B,CAC9BiwC,OAAQA,GAAU,MAClBM,YAAa,UACbC,QAASL,GAAe,CACtB,eAAgBA,GAElBM,OAAQ7nB,GAAiB6nB,OACzBP,KAAMA,EACNG,aAEF,IACE,MAAMX,QAAiBgB,MAAMJ,EAAKtwC,GAC5B2wC,EAAoCjB,EAASc,QAAQz0D,IAAI,iBAA2ByzD,EAAYoB,KAChGC,EArCV,SAAqCnB,EAAkBS,GACrD,OAAQA,GACN,KAAKX,EAAYsB,gBACjB,KAAKtB,EAAYuB,mBACjB,KAAKvB,EAAYwB,eACf,OAAO11D,KAAK21D,MAAMvB,GACpB,QACE,OAAOA,EAEb,CA4ByBwB,OAAkCxB,EAAS18D,OAAQ29D,GACxE,GAAI9lB,GAAoBjjD,SAAS8nE,EAASyB,SAAWf,IAAmBV,GAAW,CAEjF,MAAM,IAQZ,SAA4BC,GAC1B,OAAQA,GACN,KAAK,IACH,OAAOE,EACT,KAAK,IACH,OAAO9kB,EACT,KAAK,IACH,OAAOglB,EACT,KAAK,IACH,OAAOD,EACT,QACE,OAAOL,EAEb,CAtB8B2B,CAAmB1B,EAASyB,QAC9C,CAAqB,GAAEb,cAAgBZ,EAASyB,SAAUN,EAAmBnB,EAASyB,OAC9F,CACA,OAAON,CACT,CAAE,MAAOxmB,GACP,MAAMA,CACR,E,mLC1EK,SAASgnB,EAAgB/pE,GAAiF,IAAhF,OAAEkrB,EAAM,mBAAE8+C,GAAoEhqE,EAC7G,MAAMiqE,EAAY9vD,KAAK44B,IAAI,GAAIi3B,GAC/B,OAAO7jB,OAAOhsC,KAAK6Q,MAAME,EAAS++C,GAAaA,EACjD,CAEO,SAAS5pC,IACd,MAA0B,oBAAZsmB,UAA2B,CAC3C,CAOO,SAAS2C,EAAkC4gB,GAEhD,OADoBA,EAAa1qD,MAAM,KACpBjX,KAAK4hE,GAAS/qD,OAAOmc,SAAS4uC,EAAM,KACzD,CAEO,SAASvQ,EAAiBwQ,EAAkBC,GAQ/CpnE,OAAO6U,OAAO8hD,iBAAiBwQ,EAAWC,EAE9C,CAEO,SAAS7d,EAAgBlkD,GAC9B,MAAMgiE,EAAelrD,OAAOkrC,WAAY,GAAEhiD,KAC1C,OAAQ8W,OAAOzE,MAAM2vD,IAAiB/gD,SAAS+gD,IAAiBA,EAAe,CACjF,CAEO,SAAS3gB,EAAkBrhD,GAChC,MAAM8vB,EAAU,GAAE9vB,IAClB,OAAOkkD,EAAgBlkD,IAAU8W,OAAOmc,SAASnD,EAAQ,MAAQhZ,OAAOkrC,WAAWlyB,EACrF,CAEO,SAAStf,EAAS9O,GAQtB,IARuB,MACxB1B,EAAK,IACLyQ,EAAMqG,OAAOC,iBAAgB,IAC7BpG,EAAMmG,OAAOmrD,kBAKdvgE,EACC,MAAMsgE,EAAelrD,OAAOkrC,WAAY,GAAEhiD,KAC1C,OAAQ8W,OAAOzE,MAAM2vD,IAAiBA,GAAgBvxD,GAAOuxD,GAAgBrxD,CAC/E,CAUO,SAASuxD,EAAel5C,GAAmE,IAAlE,MAAEhpB,EAAK,IAAEyQ,EAAG,IAAEE,GAAkDqY,EAC9F,OAAOnX,KAAKpB,IAAIoB,KAAKlB,IAAI3Q,EAAOyQ,GAAME,EACxC,CAEO,SAASwxD,EAAev6D,GAG7B,OAAIA,EAAEsvC,eAAe,gBAAqDr+C,IAAvC+O,EAA4Bw6D,QACd,IAAvCx6D,EAA4Bw6D,MAIxC,CAGO,SAASC,IACd,MAAMC,EAAU,IAAIC,QACpB,MAAO,CAAChhE,EAAavB,KACnB,GAAqB,iBAAVA,GAAgC,OAAVA,EAAgB,CAC/C,GAAIsiE,EAAQE,IAAIxiE,GACd,OAEFsiE,EAAQ74B,IAAIzpC,EACd,CACA,OAAOA,CAAK,CAEhB,CAGO,MAAMyiE,EAAuBA,CAACvoD,EAAYrc,IAC/Cqc,EAAKwoD,mBAAmB,QAAS,CAC/BloD,IAAK,UACLJ,MAAO,UACPE,KAAM,aACHzc,IAWA,SAAS8kE,IACd,OAAOhoE,OAAOioE,QAAQC,gBAPd,uCAAqCtzD,QAAQ,UAAW5L,IAC9D,MAAMknC,EAAI/zB,OAAOnT,GACjB,OAAQknC,EAAK+3B,OAAOE,gBAAgB,IAAIC,WAAW,IAAI,GAAM,IAAOl4B,EAAI,GAAMh7B,SAAS,GAAG,GAM9F,C,iFCkKO,IAAK1N,EAAU,SAAVA,GAAU,OAAVA,EAAU,cAAVA,EAAU,gBAAVA,EAAU,mCAAVA,EAAU,kBAAVA,EAAU,cAAVA,EAAU,cAAVA,CAAU,MASV6zB,EAAK,SAALA,GAAK,OAALA,EAAK,cAALA,EAAK,YAALA,CAAK,MA0BL6f,EAAQ,SAARA,GAAQ,OAARA,EAAQ,cAARA,EAAQ,cAARA,CAAQ,MAKRmtB,EAAkB,SAAlBA,GAAkB,OAAlBA,EAAkB,gBAAlBA,EAAkB,kBAAlBA,EAAkB,kBAAlBA,EAAkB,gBAAlBA,CAAkB,MAOlBplD,EAAiB,SAAjBA,GAAiB,OAAjBA,EAAiB,oCAAjBA,EAAiB,4BAAjBA,CAAiB,MAKjBqlD,EAAwB,SAAxBA,GAAwB,OAAxBA,EAAwB,gBAAxBA,CAAwB,K","sources":["webpack://@finviz/website/./js/app/header/market-badge.tsx","webpack://@finviz/website/./js/app/header/time.tsx","webpack://@finviz/website/./js/app/shared/components/QueryClientContext.tsx","webpack://@finviz/website/./js/main/components/list/hooks.tsx","webpack://@finviz/website/./js/main/components/list/list-item.tsx","webpack://@finviz/website/./js/main/components/list/list.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box-item.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box.tsx","webpack://@finviz/website/./js/main/components/search/constants.ts","webpack://@finviz/website/./js/main/components/centered.tsx","webpack://@finviz/website/./js/main/components/search/search-error.tsx","webpack://@finviz/website/./js/main/components/highlight.tsx","webpack://@finviz/website/./js/main/components/search/search-item.tsx","webpack://@finviz/website/./js/main/components/search/util.ts","webpack://@finviz/website/./js/main/components/search/search-list.tsx","webpack://@finviz/website/./js/main/components/search/search.tsx","webpack://@finviz/website/./js/main/components/combo-box/hooks.ts","webpack://@finviz/website/../charts/app/canvas/element.ts","webpack://@finviz/website/../charts/app/canvas/line.ts","webpack://@finviz/website/../charts/app/canvas/text.ts","webpack://@finviz/website/../charts/app/canvas/thumb.ts","webpack://@finviz/website/../charts/app/canvas/cache.js","webpack://@finviz/website/../charts/app/models/chart_settings/interfaces.ts","webpack://@finviz/website/../charts/app/charts/utils.ts","webpack://@finviz/website/../charts/app/charts/base_chart.ts","webpack://@finviz/website/../charts/app/charts/candle_stick.ts","webpack://@finviz/website/../charts/app/charts/candle_stick_hollow.ts","webpack://@finviz/website/../charts/app/charts/heikin_ashi.ts","webpack://@finviz/website/../charts/app/charts/line_chart.ts","webpack://@finviz/website/../charts/app/charts/market_sentiment.ts","webpack://@finviz/website/../charts/app/charts/multi_line_chart.ts","webpack://@finviz/website/../charts/app/charts/ohlc_chart.ts","webpack://@finviz/website/../charts/app/charts/perf_chart.ts","webpack://@finviz/website/../charts/app/charts/charts.ts","webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/utils/chart-date-range-utils.ts","webpack://@finviz/website/../charts/app/controllers/renderUtils.ts","webpack://@finviz/website/../charts/app/helpers/atr.ts","webpack://@finviz/website/../charts/app/helpers/math.ts","webpack://@finviz/website/../charts/app/indicator-calculation/ema.ts","webpack://@finviz/website/../charts/app/indicator-calculation/main.ts","webpack://@finviz/website/../charts/app/models/chart/contstants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/index.ts","webpack://@finviz/website/../charts/app/models/constants.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse-utils.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse.ts","webpack://@finviz/website/../charts/app/models/pane.ts","webpack://@finviz/website/../charts/app/models/quoteCache.ts","webpack://@finviz/website/../charts/app/models/quote.ts","webpack://@finviz/website/../charts/app/models/quote/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/interactive_chart_settings.ts","webpack://@finviz/website/../charts/app/models/settings.ts","webpack://@finviz/website/../charts/app/models/utils.ts","webpack://@finviz/website/../charts/app/indicator-calculation/bb.ts","webpack://@finviz/website/../charts/app/overlays/overlay.ts","webpack://@finviz/website/../charts/app/overlays/bb.ts","webpack://@finviz/website/../charts/app/overlays/dch.ts","webpack://@finviz/website/../charts/app/overlays/ema.ts","webpack://@finviz/website/../charts/app/overlays/ema2.ts","webpack://@finviz/website/../charts/app/overlays/hilo.ts","webpack://@finviz/website/../charts/app/overlays/hline.ts","webpack://@finviz/website/../charts/app/overlays/ic.ts","webpack://@finviz/website/../charts/app/overlays/icf.ts","webpack://@finviz/website/../charts/app/overlays/kch.ts","webpack://@finviz/website/../charts/app/overlays/none.ts","webpack://@finviz/website/../charts/app/overlays/patterns.ts","webpack://@finviz/website/../charts/app/overlays/pp.ts","webpack://@finviz/website/../charts/app/overlays/sar.ts","webpack://@finviz/website/../charts/app/indicator-calculation/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma2.ts","webpack://@finviz/website/../charts/app/overlays/str.ts","webpack://@finviz/website/../charts/app/overlays/vp.ts","webpack://@finviz/website/../charts/app/indicator-calculation/vwap.ts","webpack://@finviz/website/../charts/app/overlays/vwap.ts","webpack://@finviz/website/../charts/app/overlays/overlays.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/abort_controller.ts","webpack://@finviz/website/../charts/app/utils/canvas.ts","webpack://@finviz/website/../charts/app/utils/chart.ts","webpack://@finviz/website/../charts/app/utils/colors.ts","webpack://@finviz/website/../charts/app/utils/convert_ta.ts","webpack://@finviz/website/../charts/app/utils/cursor.ts","webpack://@finviz/website/../charts/app/utils/draw_in_visible_area.ts","webpack://@finviz/website/../charts/app/utils/fetch_api.ts","webpack://@finviz/website/../charts/app/utils/helpers.ts","webpack://@finviz/website/../charts/types/shared.ts"],"sourcesContent":["import classnames from 'classnames'\r\n\r\nimport { isAftermarket, isHoliday, isPremarket } from './utils'\r\n\r\nexport enum MarketBadgeType {\r\n None,\r\n Open,\r\n Closed,\r\n Premarket,\r\n Aftermarket,\r\n}\r\n\r\nexport function getMarketBadgeText(type: MarketBadgeType, _date?: Date) {\r\n switch (type) {\r\n case MarketBadgeType.Open:\r\n return {\r\n label: 'Markets Open',\r\n }\r\n case MarketBadgeType.Closed:\r\n // const holiday = getHoliday(date)\r\n\r\n return {\r\n label: 'Markets Closed',\r\n // description: holiday && (\r\n // <>\r\n // The markets observe U.S. holidays and are closed on\r\n //
\r\n // {holiday.label}\r\n // >\r\n // ),\r\n }\r\n case MarketBadgeType.Premarket:\r\n return {\r\n label: 'Premarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is possible.\r\n //
\r\n // We report it as the time between 7:00 AM and 9:30 AM\r\n // >\r\n // ),\r\n }\r\n case MarketBadgeType.Aftermarket:\r\n return {\r\n label: 'Aftermarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is still possible.\r\n //
\r\n // We report it as the time between 4:00 PM and 6:30 PM\r\n // >\r\n // ),\r\n }\r\n }\r\n}\r\n\r\nexport function getMarketBadgeType(time: Date, hasUserPremium?: boolean) {\r\n if (isHoliday(time)) return MarketBadgeType.Closed\r\n if (isPremarket(time, hasUserPremium)) return MarketBadgeType.Premarket\r\n if (isAftermarket(time, hasUserPremium)) return MarketBadgeType.Aftermarket\r\n // if (isMarketOpen(time, hasUserPremium)) return MarketBadgeType.Open\r\n\r\n return MarketBadgeType.None\r\n}\r\n\r\nexport interface MarketBadgeProps {\r\n badge: MarketBadgeType\r\n className?: string\r\n}\r\n\r\nexport function MarketBadge({ badge, className }: MarketBadgeProps) {\r\n if (badge === MarketBadgeType.None) return null\r\n\r\n return (\r\n
= {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n\r\n for (let index = this.attrs.tickers.length - 1; index >= 0; index--) {\r\n const ticker = this.attrs.tickers[index]\r\n const quote = quotes[ticker]\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -10 || x + this.leftOffset > this.model.width + 10) {\r\n // margin?\r\n continue\r\n }\r\n const y = Math.round(this.fy(quote.close[i]))\r\n this.context.lineTo(x, y)\r\n }\r\n this.context.stroke()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const text = this.attrs.label || ''\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n return this.renderCrossText(context, this.data.close.length - 1)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const maxTickerLength = utils.max(this.attrs.tickers.map((t) => t.length))\r\n\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n const isLastDate = crossIndex === this.data.close.length - 1\r\n\r\n new Text(\r\n {\r\n text: `${months[month]} ${day} ${year} `,\r\n x: ChartSettings.left.width + (maxTickerLength > 15 ? 200 : 132),\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n\r\n const quotes: ObjectHash= {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const y = PADDING.S + (PADDING.S + LINE_HEIGHT.M) * index\r\n if (this.tickersDimensions[index]) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n y - PADDING.XXXS,\r\n PADDING.XXXS + this.tickersDimensions[index] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n }\r\n const ticker = this.attrs.tickers[index]\r\n const closeValue = quotes[ticker].close[crossIndex]\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${typeof closeValue === 'number' ? closeValue.toFixed(2) : NaN} `,\r\n x: ChartSettings.left.width,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n lineHeight: LINE_HEIGHT.M,\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n if (isLastDate) {\r\n this.tickersDimensions[index] = text.measure(context)\r\n }\r\n text.render(context)\r\n }\r\n }\r\n\r\n computeVisibleMinMax(...arrays: Array) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n getMinMax() {\r\n const quotes = this.getQuotes()\r\n let { min, max } = this.computeVisibleMinMax(...quotes.map((q) => q.close))\r\n if (typeof this.attrs.min !== 'undefined') {\r\n min = this.attrs.min\r\n }\r\n if (typeof this.attrs.max !== 'undefined') {\r\n max = this.attrs.max\r\n }\r\n return { min, max }\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default MultiLineChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass OHLCChart extends Chart {\r\n static type = ChartElementType.OhlcChart\r\n static label = 'OHLC'\r\n static iconName = 'ohlcChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const barWithoutMarginWidth = this.getBarWithoutMarginWidth()\r\n\r\n let lineWidth = 1\r\n if (barWithoutMarginWidth >= 40) {\r\n lineWidth = 4\r\n } else if (barWithoutMarginWidth >= 30) {\r\n lineWidth = 3\r\n } else if (barWithoutMarginWidth >= 15) {\r\n lineWidth = 2\r\n }\r\n const lineThickness = lineWidth / 2\r\n const handleLengthFromWick = Math.round(barWithoutMarginWidth / 2 - lineThickness)\r\n const lineOffset = lineWidth % 2 === 0 ? 0 : 0.5\r\n this.context.set('lineWidth', lineWidth)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n scale: this.paneModel.scale,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const barX = ~~(x + 1) + lineOffset // move 1px to right so cursor don't cover bar of ohlc-chart & round for pixel perfect render on zoom\r\n\r\n this.context.beginPath()\r\n this.context.set(\r\n 'strokeStyle',\r\n this.data.close[i] < this.data.open[i] ? Colors.ohlcTrendDown : Colors.ohlcTrendUp\r\n )\r\n\r\n this.context.moveTo(barX, Math.round(this.fy(this.data.high[i])))\r\n this.context.lineTo(barX, Math.round(this.fy(this.data.low[i])))\r\n\r\n if (handleLengthFromWick >= 1) {\r\n const open = Math.round(this.fy(this.data.open[i]))\r\n this.context.moveTo(barX + lineThickness, open + lineOffset) // move to right edge of wick\r\n this.context.lineTo(barX - lineThickness - handleLengthFromWick, open + lineOffset) // draw line to the left\r\n\r\n const close = Math.round(this.fy(this.data.close[i]))\r\n this.context.moveTo(barX - lineThickness, close + lineOffset) // move to left edge of wick\r\n this.context.lineTo(barX + lineThickness + handleLengthFromWick, close + lineOffset) // draw line to the right\r\n }\r\n\r\n this.context.stroke()\r\n },\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `OHLC ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default OHLCChart\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, MARGIN, OFFSET, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\ninterface PerfChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n fromDate: string\r\n toDate: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nclass PerfChart extends Chart {\r\n static type = ChartElementType.PerfChart\r\n\r\n overlayLabelWidth: ObjectHash \r\n perf: ObjectHash = {}\r\n\r\n constructor(values: Partial , model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.overlayLabelWidth = {}\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n if ((this.perf[ticker] != null ? this.perf[ticker].length : 0) > 0) {\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = this.data.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n this.context.lineTo(this.fx(i), Math.round(this.fy(this.perf[ticker][i])))\r\n }\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const period = (() => {\r\n switch (this.model.quote().timeframe) {\r\n case 'd':\r\n return 'DAILY'\r\n case 'w':\r\n return 'WEEKLY'\r\n case 'm':\r\n return 'MONTHLY'\r\n default:\r\n return\r\n }\r\n })()\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text: period,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (this.data.timeframe) {\r\n case 'd':\r\n case 'w':\r\n dateString = `${months[month]} ${day}`\r\n break\r\n case 'm':\r\n dateString = `${months[month]} ${year}`\r\n break\r\n default:\r\n return\r\n }\r\n\r\n let shouldRenderDate = false\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index - PADDING.XXXS,\r\n PADDING.XXXS + this.overlayLabelWidth[ticker] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n const hasData = Number.isFinite(tickerData[crossIndex])\r\n const percentageText = hasData ? `${tickerData[crossIndex].toFixed(2)}%` : ''\r\n shouldRenderDate = shouldRenderDate || hasData\r\n new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n if (shouldRenderDate) {\r\n new Text(\r\n {\r\n text: `${dateString} `,\r\n x: ChartSettings.left.width + 132,\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n super.renderOverlaysLabels(context)\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n const lastCrossIndex = this.perf[ticker].length - 1\r\n const hasData = Number.isFinite(tickerData[lastCrossIndex])\r\n const percentageText = hasData ? `${tickerData[lastCrossIndex].toFixed(2)}%` : ''\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n this.overlayLabelWidth = { ...this.overlayLabelWidth, [ticker]: text.measure(context) }\r\n text.render(context)\r\n }\r\n }\r\n }\r\n\r\n _compute() {\r\n this.perf = {}\r\n const quotes = this.getQuotes()\r\n\r\n const fromDate = new Date(this.attrs.fromDate + ' 00:00')\r\n const toDate = new Date(this.attrs.toDate + ' 23:59')\r\n const filteredQuotes = []\r\n for (const quote of quotes) {\r\n const closes = []\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n if (fromDate <= date && date <= toDate) {\r\n closes.push(quote.close[i])\r\n }\r\n }\r\n filteredQuotes.push({ ticker: quote.ticker, close: closes })\r\n }\r\n\r\n const daysCount = d3.max(filteredQuotes, (q) => q.close.length) ?? 0\r\n for (const quote of filteredQuotes) {\r\n this.perf[quote.ticker] = []\r\n const first = quote.close[0]\r\n let offset = 0\r\n if (daysCount > quote.close.length) {\r\n offset = daysCount - quote.close.length\r\n for (let i = 0, end1 = offset, asc1 = end1 >= 0; asc1 ? i < end1 : i > end1; asc1 ? i++ : i--) {\r\n this.perf[quote.ticker][i] = NaN\r\n }\r\n }\r\n for (let i = 0, end2 = quote.close.length, asc2 = end2 >= 0; asc2 ? i < end2 : i > end2; asc2 ? i++ : i--) {\r\n this.perf[quote.ticker][offset + i] = (quote.close[i] * 100) / first - 100\r\n }\r\n }\r\n const { min, max } = this.computeVisibleMinMax(...Object.keys(this.perf).map((x) => this.perf[x]))\r\n return { min, max }\r\n }\r\n\r\n // TODO refactor into ?utils\r\n computeVisibleMinMax(...arrays: Array ) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.paneModel.scale.y.ticks(10)\r\n const yLine = this.getYLine()\r\n const text = new Text(\r\n {\r\n x: this.width + 8,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n for (const tick of ticks) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n text.set({ text: tick.toFixed(2), y }).render(context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n y: this.height + 18,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n const textWidth = text.set({ text: '2020' }).measure(this.context)\r\n\r\n let date = new Date(this.data.date[0] * 1000)\r\n let lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n let monthsInData = 0\r\n this.data.date.forEach((d, index) => {\r\n if (index < 1) {\r\n return\r\n }\r\n\r\n const date = new Date(d * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n monthsInData++\r\n }\r\n lastMonth = month\r\n })\r\n\r\n const availableTickSpots = ~~(this.width / textWidth)\r\n const monthsToAvail = monthsInData / availableTickSpots\r\n let renderMonth\r\n if (monthsToAvail <= 1) {\r\n renderMonth = () => true\r\n } else if (monthsToAvail <= 2) {\r\n renderMonth = (x: number) => x % 2 === 0\r\n } else if (monthsToAvail <= 3) {\r\n renderMonth = (x: number) => x % 3 === 0\r\n } else if (monthsToAvail <= 4) {\r\n renderMonth = (x: number) => x % 4 === 0\r\n } else if (monthsToAvail <= 6) {\r\n renderMonth = (x: number) => x % 6 === 0\r\n } else {\r\n renderMonth = (x: number) => x === 0\r\n }\r\n\r\n date = new Date(this.data.date[0] * 1000)\r\n lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n const xLine = this.getXLine()\r\n\r\n for (let i = 0; i < this.data.date.length; i++) {\r\n date = new Date(this.data.date[i] * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -15 || x + this.leftOffset > this.width + 15) {\r\n // margin?\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n if (!renderMonth(date.getMonth())) {\r\n continue\r\n }\r\n\r\n text\r\n .set({\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : months[date.getMonth()],\r\n x: x,\r\n })\r\n .render(this.context)\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Perf chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default PerfChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport candleStick from './candle_stick'\r\nimport hollowCandleStick from './candle_stick_hollow'\r\nimport heikinAshi from './heikin_ashi'\r\nimport lineChart from './line_chart'\r\nimport marketSentiment from './market_sentiment'\r\nimport multiLineCharts from './multi_line_chart'\r\nimport ohlcChart from './ohlc_chart'\r\nimport perfChart from './perf_chart'\r\n\r\nexport const chartsByType = Object.freeze({\r\n [ChartElementType.CandleStick]: candleStick,\r\n [ChartElementType.HeikinAshi]: heikinAshi,\r\n [ChartElementType.HollowCandleStick]: hollowCandleStick,\r\n [ChartElementType.LineChart]: lineChart,\r\n [ChartElementType.MarketSentiment]: marketSentiment,\r\n [ChartElementType.MultiLineChart]: multiLineCharts,\r\n [ChartElementType.OhlcChart]: ohlcChart,\r\n [ChartElementType.PerfChart]: perfChart,\r\n})\r\n","export const FONT_SIZE = {\r\n XXS: 5,\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n L: 11,\r\n XXL: 18,\r\n XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n}\r\nexport const PADDING = {\r\n XXXS: 1,\r\n XXS: 2,\r\n XS: 3,\r\n S: 5,\r\n}\r\nexport const MARGIN = {\r\n XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n S: 15,\r\n M: 30,\r\n L: 35,\r\n XL: 38,\r\n XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n XXS: 2,\r\n XS: 4,\r\n S: 6,\r\n M: 8,\r\n XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n publish = 'publish',\r\n tools = 'tools',\r\n ideas = 'ideas',\r\n settings = 'settings',\r\n timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n '1h1v' = '1h1v',\r\n '1h2v' = '1h2v',\r\n '1h3v' = '1h3v',\r\n '2h1v' = '2h1v',\r\n '2h2v' = '2h2v',\r\n '3h1v' = '3h1v',\r\n '3h2v' = '3h2v',\r\n '1l2r' = '1l2r',\r\n '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n element = 'canvas/element',\r\n arrow = 'canvas/arrow',\r\n brushV1 = 'canvas/brush/brush_v1',\r\n curve = 'canvas/curve',\r\n ellipse = 'canvas/ellipse',\r\n fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n horizontalLine = 'canvas/horizontal_line',\r\n line = 'canvas/line',\r\n measure = 'canvas/measure',\r\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n polygon = 'canvas/polygon',\r\n position = 'canvas/position',\r\n rectangle = 'canvas/rectangle',\r\n rotatedRectangle = 'canvas/rotated_rectangle',\r\n scaledLine = 'canvas/scaled_line',\r\n scaledText = 'canvas/scaled_text',\r\n symbol = 'canvas/symbol',\r\n text = 'canvas/text',\r\n triangle = 'canvas/triangle',\r\n verticalLine = 'canvas/vertical_line',\r\n xabcd = 'canvas/xabcd',\r\n calloutV1 = 'canvas/callout/callout_v1',\r\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n}\r\n\r\nexport enum ChartElementType {\r\n CandleStick = 'charts/candle_stick',\r\n HeikinAshi = 'charts/heikin_ashi',\r\n HollowCandleStick = 'charts/candle_stick_hollow',\r\n LineChart = 'charts/line_chart',\r\n OhlcChart = 'charts/ohlc_chart',\r\n MarketSentiment = 'charts/market_sentiment',\r\n MultiLineChart = 'charts/multi_line_chart',\r\n PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n Indicator = 'indicators/indicator',\r\n None = 'indicators/none',\r\n Adx = 'indicators/adx',\r\n Aro = 'indicators/aro',\r\n Aroosc = 'indicators/aroosc',\r\n Atr = 'indicators/atr',\r\n Cci = 'indicators/cci',\r\n Cot = 'indicators/cot',\r\n Fi = 'indicators/fi',\r\n Macd = 'indicators/macd',\r\n Mfi = 'indicators/mfi',\r\n Obv = 'indicators/obv',\r\n Perf = 'indicators/perf',\r\n Rmi = 'indicators/rmi',\r\n Roc = 'indicators/roc',\r\n Rsi = 'indicators/rsi',\r\n Rvol = 'indicators/rvol',\r\n Rwi = 'indicators/rwi',\r\n Stofa = 'indicators/stofa',\r\n Stofu = 'indicators/stofu',\r\n Stosl = 'indicators/stosl',\r\n Trix = 'indicators/trix',\r\n Ult = 'indicators/ult',\r\n Vol = 'indicators/vol',\r\n Wr = 'indicators/wr',\r\n}\r\n\r\nexport enum OverlayType {\r\n Overlay = 'overlays/overlay',\r\n None = 'overlays/none',\r\n Bb = 'overlays/bb',\r\n Dch = 'overlays/dch',\r\n Ema = 'overlays/ema',\r\n Ema2 = 'overlays/ema2',\r\n Hilo = 'overlays/hilo',\r\n Hline = 'overlays/hline',\r\n Ic = 'overlays/ic',\r\n Icf = 'overlays/icf',\r\n Kch = 'overlays/kch',\r\n Patterns = 'overlays/patterns',\r\n Pp = 'overlays/pp',\r\n Sar = 'overlays/sar',\r\n Sma = 'overlays/sma',\r\n Sma2 = 'overlays/sma2',\r\n Str = 'overlays/str',\r\n Vp = 'overlays/vp',\r\n Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventDbType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventType {\r\n ChartEvent = 'chartEvent/chartEvent',\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n EarningsPositive = 'chartEvent/earnings',\r\n EarningsNegative = 'chartEvent/earningsNegative',\r\n EarningsNeutral = 'chartEvent/earningsNeutral',\r\n EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record = {\r\n [ChartEventBadgeType.Dividends]: 'Dividends',\r\n [ChartEventBadgeType.Split]: 'Split',\r\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n columns: number\r\n rows: number\r\n count: number\r\n gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record = {\r\n '1h1v': { columns: 1, rows: 1, count: 1 },\r\n '1h2v': { columns: 1, rows: 2, count: 2 },\r\n '1h3v': { columns: 1, rows: 3, count: 3 },\r\n '2h1v': { columns: 2, rows: 1, count: 2 },\r\n '2h2v': { columns: 2, rows: 2, count: 4 },\r\n '3h1v': { columns: 3, rows: 1, count: 3 },\r\n '3h2v': { columns: 3, rows: 2, count: 6 },\r\n '1l2r': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n },\r\n '1t2b': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n ASC: 'ASC',\r\n DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n [TIMEFRAME.i1]: 1,\r\n [TIMEFRAME.i2]: 2,\r\n [TIMEFRAME.i3]: 3,\r\n [TIMEFRAME.i5]: 5,\r\n [TIMEFRAME.i10]: 10,\r\n [TIMEFRAME.i15]: 15,\r\n [TIMEFRAME.i30]: 30,\r\n [TIMEFRAME.h]: 60,\r\n [TIMEFRAME.h2]: 120,\r\n [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n [TIMEFRAME.i1]: 60,\r\n [TIMEFRAME.i2]: 120,\r\n [TIMEFRAME.i3]: 180,\r\n [TIMEFRAME.i5]: 300,\r\n [TIMEFRAME.i10]: 600,\r\n [TIMEFRAME.i15]: 900,\r\n [TIMEFRAME.i30]: 1800,\r\n [TIMEFRAME.h]: 3600,\r\n [TIMEFRAME.h2]: 7200,\r\n [TIMEFRAME.h4]: 14400,\r\n [TIMEFRAME.d]: 86400,\r\n [TIMEFRAME.w]: 604800,\r\n [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n BTCUSD: 'BTCUSD',\r\n LTCUSD: 'LTCUSD',\r\n ETHUSD: 'ETHUSD',\r\n XRPUSD: 'XRPUSD',\r\n BCHUSD: 'BCHUSD',\r\n BTCEUR: 'BTCEUR',\r\n LTCEUR: 'LTCEUR',\r\n ETHEUR: 'ETHEUR',\r\n XRPEUR: 'XRPEUR',\r\n BCHEUR: 'BCHEUR',\r\n LTCBTC: 'LTCBTC',\r\n ETHBTC: 'ETHBTC',\r\n XRPBTC: 'XRPBTC',\r\n BCHBTC: 'BCHBTC',\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum TextAlign {\r\n left = 'left',\r\n right = 'right',\r\n center = 'center',\r\n start = 'start',\r\n end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n top = 'top',\r\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n middle = 'middle',\r\n alphabetic = 'alphabetic',\r\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n Linear = 'linear',\r\n Percentage = 'percentage',\r\n Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport enum QuotePollingIntervalInMs {\r\n Default = 3000,\r\n Free = 180000,\r\n Elite = 3000,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n [ScaleType.Linear]: 'Linear',\r\n [ScaleType.Percentage]: 'Percentage',\r\n [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n chart: 400,\r\n indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n return '1 MIN'\r\n case TIMEFRAME.i2:\r\n return '2 MIN'\r\n case TIMEFRAME.i3:\r\n return '3 MIN'\r\n case TIMEFRAME.i5:\r\n return '5 MIN'\r\n case TIMEFRAME.i10:\r\n return '10 MIN'\r\n case TIMEFRAME.i15:\r\n return '15 MIN'\r\n case TIMEFRAME.i30:\r\n return '30 MIN'\r\n case TIMEFRAME.h:\r\n return '1 HR'\r\n case TIMEFRAME.h2:\r\n return '2 HR'\r\n case TIMEFRAME.h4:\r\n return '4 HR'\r\n case TIMEFRAME.d:\r\n return 'DAILY'\r\n case TIMEFRAME.w:\r\n return 'WEEKLY'\r\n case TIMEFRAME.m:\r\n return 'MONTHLY'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n p: string\r\n t: string\r\n l: string\r\n r?: string\r\n i?: string\r\n sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n p?: string\r\n t: string\r\n r?: string\r\n i?: string\r\n ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n l = 'l',\r\n c = 'c',\r\n cs = 'cs',\r\n hc = 'hc',\r\n ha = 'ha',\r\n o = 'o',\r\n p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n // seconds = 'seconds',\r\n minutes = 'minutes',\r\n hours = 'hours',\r\n days = 'days',\r\n weeks = 'weeks',\r\n months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n [TIMEFRAME.i1]: {\r\n micro: 1,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i3]: {\r\n micro: 3,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i5]: {\r\n micro: 5,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i10]: {\r\n micro: 10,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i15]: {\r\n micro: 15,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i30]: {\r\n micro: 30,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.h]: {\r\n micro: 1,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h4]: {\r\n micro: 4,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.d]: {\r\n micro: 1,\r\n macro: MacroTimeframe.days,\r\n },\r\n [TIMEFRAME.w]: {\r\n micro: 1,\r\n macro: MacroTimeframe.weeks,\r\n },\r\n [TIMEFRAME.m]: {\r\n micro: 1,\r\n macro: MacroTimeframe.months,\r\n },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n (prev, curr) => ({\r\n ...prev,\r\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n : [MicroMacroTimeframe[curr].micro],\r\n }),\r\n {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n from?: number\r\n to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n currentAndAbove,\r\n currentAndBelow,\r\n currentOnly,\r\n all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { getChartStartEndDates } from '../controllers/renderUtils'\r\nimport Quote from '../models/quote'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// Finviz-Website: components/timeframe-bar/custom-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange: string) {\r\n return dateRange.split(DATE_RANGE_PREFIX_DELMITER)\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nexport function getParsedDateRangeMetaData({ dateRange, quote }: { dateRange: string; quote: Quote }) {\r\n const parsedRange = getChartStartEndDates({ dateRange, quote })\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n\r\n let startQuoteDate: Date | null = null\r\n let endQuoteDate: Date | null = null\r\n let numOfDaysToRender: number | null = null\r\n\r\n if (parsedRange.start && dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const reversedDaysInQuote = [...daysInQuote].reverse()\r\n const startQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.start!.getTime())\r\n const endQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.end!.getTime())\r\n startQuoteDate = reversedDaysInQuote[startQuoteDayIndex] ?? null\r\n endQuoteDate = reversedDaysInQuote[endQuoteDayIndex] ?? null\r\n numOfDaysToRender = quote.interval <= 5 ? startQuoteDayIndex - endQuoteDayIndex + 1 : null\r\n }\r\n\r\n return {\r\n start: parsedRange.start,\r\n end: parsedRange.end,\r\n startQuoteDate,\r\n endQuoteDate,\r\n numOfDaysToRender,\r\n numOfBarsToRender: (numOfDaysToRender ?? 0) * (quote.getBarsInDay() ?? 0) || undefined,\r\n renderDateStart: parsedRange.start && dateFns.startOfDay(parsedRange.start),\r\n renderDateEnd: parsedRange.end && dateFns.endOfDay(parsedRange.end),\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { Instrument, ObjectHash } from '../../types/shared'\r\nimport {\r\n CHART_MARGIN,\r\n DateRangeType,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport ChartLayout from '../models/chart_layout'\r\nimport { IChartSettings, IIndicatorSettings, ISettings } from '../models/chart_settings/interfaces'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport Element from '../models/element'\r\nimport Pane, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport Utils from '../utils'\r\nimport utils, { convertLocalToNyTime, dateFromUnixTimestamp, isRedesignedPage } from '../utils'\r\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../utils/chart'\r\nimport {\r\n DATE_RANGE_PREFIX_DELMITER,\r\n getParsedDateRangeMetaData,\r\n parseCustomDateRangeUrlParam,\r\n} from '../utils/chart-date-range-utils'\r\n\r\ninterface VisibleBarNumberProps {\r\n start: Date | null\r\n end: Date\r\n quote: Quote\r\n dateRange: string\r\n}\r\n\r\ninterface ChartZoomAndLeftOffsetProps extends Omit {\r\n chartVisibleWidth: number\r\n numOfBarsToRender?: number\r\n chartModel: Chart\r\n}\r\n\r\ninterface ChartStartEndDatesProps {\r\n dateRange: string\r\n quote: Quote\r\n}\r\n\r\nexport const getVisibleBarsNumber = ({ start, end, quote, dateRange }: VisibleBarNumberProps) => {\r\n const startInSec = start ? start.getTime() / 1000 : 0\r\n const endInSec = end.getTime() / 1000\r\n const isQuoteDateInRange = (quoteDate: number) => quoteDate >= startInSec && quoteDate <= endInSec\r\n const lastQuoteDateIndex = quote.date.length - 1\r\n let lastVisibleBarIndex = lastQuoteDateIndex\r\n let numOfVisibleBars = 0\r\n if (\r\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\r\n quote.instrument === Instrument.Stock\r\n ) {\r\n numOfVisibleBars = quote.drawMinutesPerDay\r\n } else {\r\n let firstVisibleBarIndex = -1\r\n lastVisibleBarIndex = -1\r\n quote.date.forEach((quoteDate, index) => {\r\n if (isQuoteDateInRange(quoteDate)) {\r\n if (firstVisibleBarIndex === -1) {\r\n firstVisibleBarIndex = index\r\n }\r\n lastVisibleBarIndex = index\r\n }\r\n })\r\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\r\n\r\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\r\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\r\n }\r\n }\r\n\r\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\r\n}\r\n\r\nexport const getChartZoomAndLeftOffset = ({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n chartModel,\r\n numOfBarsToRender,\r\n}: ChartZoomAndLeftOffsetProps) => {\r\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\r\n start,\r\n end,\r\n quote,\r\n dateRange: chartModel.dateRange,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\r\n }\r\n\r\n const chartLayout = chartModel.chart_layout()\r\n const zoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth,\r\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\r\n })\r\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\r\n const leftOffset =\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: {},\r\n barWidth,\r\n numberOfBarsToDraw: numOfBarsToRender,\r\n }) +\r\n numOfBarsOffset * barWidth\r\n return { zoomFactor, leftOffset }\r\n}\r\n\r\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n\r\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\r\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\r\n const end = convertLocalToNyTime(\r\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\r\n false\r\n )\r\n return {\r\n start: range.start && convertLocalToNyTime(range.start, false),\r\n end,\r\n }\r\n }\r\n\r\n let start\r\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\r\n switch (dateRange) {\r\n case DateRangeType.d1:\r\n lastDate.setHours(23, 59, 59, 999)\r\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\r\n break\r\n case DateRangeType.d5:\r\n lastDate.setHours(23, 59, 59, 999)\r\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\r\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\r\n break\r\n case DateRangeType.m1:\r\n start = dateFns.subMonths(lastDate, 1)\r\n break\r\n case DateRangeType.m3:\r\n start = dateFns.subMonths(lastDate, 3)\r\n break\r\n case DateRangeType.m6:\r\n start = dateFns.subMonths(lastDate, 6)\r\n break\r\n case DateRangeType.ytd:\r\n start = dateFns.startOfYear(lastDate)\r\n break\r\n case DateRangeType.y1:\r\n start = dateFns.subYears(lastDate, 1)\r\n break\r\n case DateRangeType.y2:\r\n start = dateFns.subYears(lastDate, 2)\r\n break\r\n case DateRangeType.y5:\r\n start = dateFns.subYears(lastDate, 5)\r\n break\r\n case DateRangeType.max:\r\n default:\r\n start = null\r\n break\r\n }\r\n\r\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\r\n}\r\n\r\ninterface GetLeftOffsetProps {\r\n quote: Quote\r\n chartModel: Chart\r\n config?: { stretch?: boolean }\r\n barWidth?: number\r\n barIndex?: number\r\n numberOfBarsToDraw?: number\r\n shouldAlignDaysToLeftApplied?: boolean\r\n}\r\n\r\nexport const getMinMaxLeftOffset = ({\r\n newLeftOffset,\r\n chartModel,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex,\r\n}: {\r\n newLeftOffset: number\r\n chartModel: Chart\r\n barWidth?: number\r\n barIndex: number\r\n}) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const numOfBarsInView = Math.floor(width / barWidth)\r\n const fx = (index: number) => index * barWidth\r\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\r\n}\r\n\r\nexport function getFullChartWidth({\r\n hasAftermarket,\r\n hasPremarket,\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n}) {\r\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\r\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\r\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n}\r\n\r\nexport function getIntradayChartConfig({\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n hasPremarket,\r\n hasAftermarket,\r\n maxWidth,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n maxWidth: number\r\n}) {\r\n const fullChartWidth = getFullChartWidth({ hasPremarket, hasAftermarket, barWidthWithMargin, timeframeMinutes })\r\n const offsetChartAfter = 16 // Int from 0-23 , if last quote date is >= this constant `offsetInPx` is applied (chart is moved to the left)\r\n const cropChartMinutesLength = PREMARKET_AFTERMARKET_HOURS * 60\r\n const offsetInPx = (cropChartMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n const chartWidthWithOffset = fullChartWidth - offsetInPx\r\n const shouldCropChart =\r\n hasAftermarket && hasPremarket && maxWidth >= chartWidthWithOffset && maxWidth < fullChartWidth\r\n\r\n return {\r\n fullChartWidth,\r\n offsetInPx: shouldCropChart ? offsetInPx : 0,\r\n chartWidthWithOffset: shouldCropChart ? fullChartWidth - offsetInPx : fullChartWidth,\r\n offsetChartAfter,\r\n }\r\n}\r\n\r\nexport const getLeftOffset = ({\r\n quote,\r\n chartModel,\r\n config,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex = getBarIndex(quote),\r\n numberOfBarsToDraw,\r\n shouldAlignDaysToLeftApplied = true,\r\n}: GetLeftOffsetProps) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const specificChartFunctionality = chartModel.chart_layout().specificChartFunctionality\r\n if (config?.stretch) {\r\n return 0\r\n }\r\n if (getIsSmallIndexChart(specificChartFunctionality)) {\r\n return barWidth\r\n }\r\n const fx = (index: number) => index * barWidth\r\n let leftOffset = width - fx(barIndex) - Math.round(barWidth / 2)\r\n leftOffset = Math.round(Utils.min(barWidth / 2, Utils.max(leftOffset, width - fx(barIndex + 45))))\r\n if (\r\n shouldAlignDaysToLeftApplied &&\r\n shouldAlignDaysToLeft({\r\n quote,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n dateRange: chartModel.dateRange,\r\n })\r\n ) {\r\n let drawDaysInOneChart = 1\r\n if (numberOfBarsToDraw) {\r\n drawDaysInOneChart = Math.ceil(numberOfBarsToDraw / quote.getBarsInDay()!)\r\n } else if (quote.interval === 10 || chartModel.dateRange === DateRangeType.d5) {\r\n drawDaysInOneChart = 5\r\n } else if (quote.interval === 15) {\r\n drawDaysInOneChart = 6\r\n } else if (quote.interval === 30) {\r\n drawDaysInOneChart = 12\r\n } else if (quote.interval === 60) {\r\n drawDaysInOneChart = 22\r\n } else if (quote.interval === 120) {\r\n drawDaysInOneChart = 39\r\n } else if (quote.interval === 240) {\r\n drawDaysInOneChart = 78\r\n } else if (quote.interval > 240) {\r\n drawDaysInOneChart = (quote.interval / 30) * 10\r\n }\r\n const { offsetInPx, offsetChartAfter } = getIntradayChartConfig({\r\n hasPremarket: quote.premarket,\r\n hasAftermarket: quote.aftermarket,\r\n barWidthWithMargin: barWidth,\r\n timeframeMinutes: quote.interval,\r\n maxWidth: chartModel.width,\r\n })\r\n const drawDaysWidth = drawDaysInOneChart * quote.getBarsInDay()! * barWidth - offsetInPx\r\n\r\n // +1 is a buffer as it often happens drawDaysWidth is wider than width by tiny amount (< 1/10000 of px)\r\n if (drawDaysWidth <= width + 1) {\r\n const lastQuoteDate = quote.date.last() ? utils.dateFromUnixTimestamp(quote.date.last()!) : null\r\n // Align start of day to left if we have enough space to show all bars in day\r\n const barsToOffset = (Object.keys(quote.getDayToOffset()).length - drawDaysInOneChart) * quote.getBarsInDay()!\r\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\r\n leftOffset = Math.round(-fx(barsToOffset) + barWidth / 2) - offsetChartInPx\r\n }\r\n }\r\n // getMinMaxLeftOffset move left offset to keep at least one bar in view what isn't desired for offscreen charts\r\n if (specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n return leftOffset\r\n }\r\n return getMinMaxLeftOffset({\r\n newLeftOffset: leftOffset,\r\n chartModel,\r\n barWidth,\r\n barIndex,\r\n })\r\n}\r\n\r\nexport const getBarIndex = (quote: Quote) => quote?.getBarIndex(quote.open?.length ? quote.open.length - 1 : 0) || 0\r\n\r\nexport const getIsSmallIndexChart = (specificChartFunctionality: SpecificChartFunctionality) =>\r\n specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\ninterface ShouldAlignDaysToLeftProps {\r\n quote: Quote\r\n numberOfBarsToDraw?: number\r\n specificChartFunctionality: SpecificChartFunctionality\r\n dateRange: DateRangeType | null\r\n}\r\n\r\n/**\r\n * Evaluate if days should be aligned to the left\r\n * @param {object} object.quote - Quote model\r\n * @param {string} object.specificChartFunctionality - SpecificChartFunctionality enum\r\n * @returns {boolean} boolean\r\n * */\r\nexport const shouldAlignDaysToLeft = ({\r\n quote,\r\n dateRange,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n}: ShouldAlignDaysToLeftProps) => {\r\n const isStockIntraday = quote.isIntraday && quote.instrument === Instrument.Stock\r\n // We don't want this to affect /charts page, only if intraday daterange is applied\r\n const isQuoteOrOffscreen = [SpecificChartFunctionality.quotePage, SpecificChartFunctionality.offScreen].includes(\r\n specificChartFunctionality\r\n )\r\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isChartsInradayDateRange =\r\n isChartPage && !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\r\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\r\n return isStockIntraday && (isQuoteOrOffscreen || isChartsInradayDateRange || isChartPageWithFixedBars)\r\n}\r\n\r\ninterface ClipProps {\r\n canvasCtx: RenderingContext2DType\r\n width: number\r\n height: number\r\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\r\n}\r\n// pane canvasCtx clip\r\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\r\n const contentWidth = width - Settings.left.width - Settings.right.width\r\n const contentHeight = height - Settings.top.height - Settings.bottom.height\r\n canvasCtx.beginPath()\r\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\r\n canvasCtx.clip()\r\n}\r\n\r\nexport const getSettings = (paneModel: Pane): IIndicatorSettings | IChartSettings => {\r\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\r\n for (const element of paneModel.elements().all()) {\r\n if (element.isIndicator()) {\r\n return IndicatorSettings\r\n }\r\n }\r\n return ChartSettings\r\n}\r\n\r\ninterface RecountScaleProps {\r\n chartModel: Chart\r\n paneModel: Pane\r\n}\r\n\r\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog )\r\n\r\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\r\n const quote = elementModel.pane().chart().quote()\r\n\r\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\r\n}\r\n\r\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\r\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\r\n const chartLayout = chartModel.chart_layout()\r\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\r\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\r\n const el = elementModel.instance\r\n const isChart = elementModel.isChart()\r\n if (isChart || elementModel.isIndicator()) {\r\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\r\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\r\n if (isChart) {\r\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\r\n } else {\r\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\r\n }\r\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\r\n\r\n if (chartModel.stretch) {\r\n width = chartModel.width - Settings.left.width - Settings.right.width\r\n fx = d3\r\n .scaleLinear()\r\n .range([0, width])\r\n .domain([0, Math.max(0, chartModel.quote().close.length - 1)]) as ScaledFn\r\n } else {\r\n fx = ((index: number) => index * barWidthWithMargin) as ScaledFn\r\n fx.invert = (x: number) => x / barWidthWithMargin\r\n fx.width = function (w) {\r\n return this.invert(w) - this.invert(0)\r\n }\r\n }\r\n paneModel.updateAttribute('scale', { x: fx }) // some elements need fx to count getMinMax\r\n\r\n const { min, max } = paneModel.scaleRange || el.getMinMax!()\r\n let fy\r\n\r\n const handleDomainOffset = (currentScale: ScaledFn, scaleCreator: any) => {\r\n if (isChart && getShouldOffsetChartDomain(elementModel)) {\r\n const protectedHeightPx = contentHeight - CHART_EVENT_BADGE_SIZE\r\n const minPx = currentScale(min)\r\n const domain = currentScale.domain()\r\n if (minPx > protectedHeightPx) {\r\n const tempScale = scaleCreator().range([0, protectedHeightPx]).domain([max, min])\r\n const extendedMin = tempScale.invert(contentHeight)\r\n currentScale.domain([domain[0], extendedMin])\r\n }\r\n }\r\n }\r\n\r\n switch (scaleType) {\r\n case ScaleType.Logarithmic:\r\n fy = d3.scaleSymlog().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n handleDomainOffset(fy, d3.scaleSymlog)\r\n break\r\n default:\r\n fy = d3.scaleLinear().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n if (!paneModel.scaleRange) {\r\n fy = fy.nice(10)\r\n handleDomainOffset(fy, d3.scaleLinear)\r\n }\r\n break\r\n }\r\n fy.height = function (h: number) {\r\n return this.invert(h) - this.invert(0)\r\n }\r\n paneModel.updateAttribute('scale', {\r\n x: fx,\r\n y: fy,\r\n })\r\n\r\n if (isChart) {\r\n el.setupAxis!(fx as ScaleAxis)\r\n }\r\n break\r\n }\r\n }\r\n}\r\n\r\n// general, only when blurry ends won't be visible or didn't matter\r\nexport const getOffsetFromLineWidth = (lineWidth: number) => (lineWidth % 2 === 0 ? 0 : 0.5)\r\n\r\ninterface IXYOffsetFromLine {\r\n lineWidth: number\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\n// return x,y offsets for pixel perfect line rendering\r\nexport const getXYOffsetFromLine = ({ lineWidth, x1, y1, x2, y2 }: IXYOffsetFromLine) => {\r\n // don't add offset is lineWidth is even\r\n if (lineWidth % 2 === 0) {\r\n return { x: 0, y: 0 }\r\n }\r\n if (y1 === y2) {\r\n return { x: 0, y: 0.5 } // horizontal line\r\n } else if (x1 === x2) {\r\n return { x: 0.5, y: 0 } // vertical line\r\n } else {\r\n return { x: 0.5, y: 0.5 } // diagonal line\r\n }\r\n}\r\n\r\nexport const getRoundedObject = (obj: T): T => {\r\n const rounded = Object.entries (obj)\r\n for (let i = 0; i < rounded.length; i++) {\r\n rounded[i][1] = Math.round(rounded[i][1])\r\n }\r\n return Object.fromEntries(rounded) as T\r\n}\r\n\r\ninterface ITranslate {\r\n context: CanvasRenderingContext2D\r\n xOffset: number\r\n yOffset: number\r\n}\r\n\r\ninterface ITranslateObj {\r\n do: () => void\r\n undo: () => void\r\n}\r\n\r\nexport const getTranslate = ({ context, xOffset, yOffset }: ITranslate): ITranslateObj => ({\r\n do: () => context.translate(xOffset, yOffset),\r\n undo: () => context.translate(xOffset * -1, yOffset * -1),\r\n})\r\n\r\ninterface IPercentageScaleValue {\r\n number: number\r\n base: number\r\n}\r\n\r\nexport const getPercentageFromValue = ({ number, base }: IPercentageScaleValue) => ((number - base) / base) * 100\r\n\r\nexport const getValueFromPercentage = ({ number, base }: IPercentageScaleValue) => (number / 100) * base + base\r\n\r\ninterface UpdateZoomAndLeftOffsetByDateRangeProps {\r\n chartModel: Chart\r\n quote: Quote\r\n}\r\n\r\nexport function updateZoomAndLeftOffsetByDateRange({ chartModel, quote }: UpdateZoomAndLeftOffsetByDateRangeProps) {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const chartVisibleWidth = chartModel.width - (ChartSettings.left.width + ChartSettings.right.width)\r\n\r\n const { start, end, numOfBarsToRender } = getParsedDateRangeMetaData({\r\n dateRange: chartModel.dateRange,\r\n quote,\r\n })\r\n\r\n const { zoomFactor, leftOffset } = getChartZoomAndLeftOffset({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n numOfBarsToRender,\r\n chartModel: chartModel,\r\n })\r\n\r\n if (chartModel.zoomFactor !== zoomFactor || chartModel.leftOffset !== leftOffset) {\r\n chartModel.updateAttributes({ zoomFactor, leftOffset })\r\n }\r\n}\r\n\r\nexport function renderPane({\r\n chartLayoutModel,\r\n chartModel,\r\n paneModel,\r\n canvasCtx,\r\n shouldRenderCross = false,\r\n}: {\r\n chartLayoutModel: ChartLayout\r\n chartModel: Chart\r\n paneModel: Pane\r\n canvasCtx: CanvasRenderingContext2D\r\n shouldRenderCross?: boolean\r\n}) {\r\n if (paneModel.chart().instrument === Instrument.MarketSentiment) {\r\n canvasCtx.clearRect(0, 0, chartModel.width, paneModel.height)\r\n } else {\r\n canvasCtx.set('fillStyle', chartModel.getChartLayoutSettings().ChartSettings.general.Colors.canvasFill)\r\n canvasCtx.fillRect(0, 0, chartModel.width, paneModel.height)\r\n }\r\n const elements = paneModel.getAllElements()\r\n for (const { instance: elementInstance } of elements) {\r\n if (typeof elementInstance.renderGrid === 'function') {\r\n canvasCtx.save()\r\n elementInstance.renderGrid(canvasCtx)\r\n canvasCtx.restore()\r\n }\r\n }\r\n\r\n const chartEvents = paneModel.getAllChartEvents()\r\n const Settings = getSettings(paneModel)\r\n for (const { instance: elementInstance } of [...elements, ...chartEvents]) {\r\n const isDrawing = elementInstance.getIsDrawing()\r\n const isChartEvent = elementInstance.getIsChartEvent()\r\n\r\n if (isDrawing && (chartLayoutModel.isHideDrawingsActive || !elementInstance.getIsVisible())) {\r\n continue\r\n } else if ((isDrawing || isChartEvent) && !elementInstance.getIsInChartView(chartModel)) {\r\n continue\r\n }\r\n\r\n canvasCtx.save()\r\n if (elementInstance.renderContent != null) {\r\n canvasCtx.save()\r\n clip({\r\n canvasCtx,\r\n width: chartModel.width,\r\n height: paneModel.height,\r\n Settings,\r\n })\r\n canvasCtx.translate(paneModel.chart().leftOffset + Settings.left.width, Settings.top.height)\r\n elementInstance.renderContent(canvasCtx)\r\n canvasCtx.restore()\r\n if (typeof elementInstance.renderLabels === 'function') {\r\n elementInstance.renderLabels(canvasCtx)\r\n }\r\n } else {\r\n elementInstance.render(canvasCtx)\r\n }\r\n if (\r\n shouldRenderCross &&\r\n (chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage ||\r\n isRedesignedPage(chartLayoutModel)) &&\r\n elementInstance.renderCross != null\r\n ) {\r\n elementInstance.renderCross(canvasCtx)\r\n }\r\n canvasCtx.restore()\r\n }\r\n}\r\n","import utils from '../utils'\r\n\r\nclass AverageTrueRange {\r\n period: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(high: number, low: number, prevClose: number) {\r\n const tr = utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\r\n\r\n if (this.count < this.period) {\r\n this.sum += tr\r\n this.value = this.sum / (this.count + 1)\r\n if (this.count === this.period - 1) {\r\n this.sum /= this.period\r\n }\r\n } else {\r\n this.value = (this.value * (this.period - 1) + tr) / this.period\r\n }\r\n this.count++\r\n }\r\n}\r\n\r\nexport default AverageTrueRange\r\n","import { Instrument, Point } from '../../types/shared'\r\n\r\ninterface LinePoints {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport enum BigNumber {\r\n Thousand,\r\n Million,\r\n Billion,\r\n Trillion,\r\n}\r\n\r\nexport const BIG_NUMBER_VALUES = {\r\n [BigNumber.Thousand]: 1e3,\r\n [BigNumber.Million]: 1e6,\r\n [BigNumber.Billion]: 1e9,\r\n [BigNumber.Trillion]: 1e12,\r\n}\r\n\r\nconst BIG_NUMBER_ZEROES = {\r\n [BigNumber.Thousand]: 3,\r\n [BigNumber.Million]: 6,\r\n [BigNumber.Billion]: 9,\r\n [BigNumber.Trillion]: 12,\r\n}\r\n\r\nconst BIG_NUMBER_SUFFIX = {\r\n [BigNumber.Thousand]: 'K',\r\n [BigNumber.Million]: 'M',\r\n [BigNumber.Billion]: 'B',\r\n [BigNumber.Trillion]: 'T',\r\n}\r\n\r\nconst math = {\r\n dotProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.x + p1.y * p2.y\r\n },\r\n\r\n crossProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.y - p1.y * p2.x\r\n },\r\n\r\n distance(p1: Point, p2: Point) {\r\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))\r\n },\r\n\r\n lineEquation(line: LinePoints) {\r\n // ax + by + c = 0\r\n if (line.x1 === line.x2) {\r\n return {\r\n a: 1,\r\n b: 0,\r\n c: -line.x1,\r\n }\r\n }\r\n const k = (line.y2 - line.y1) / (line.x2 - line.x1)\r\n return {\r\n a: -k,\r\n b: 1,\r\n c: k * line.x1 - line.y1,\r\n k,\r\n }\r\n },\r\n\r\n pointInPolygon(point: Point, polygon: Point[]) {\r\n // http://alienryderflex.com/polygon/\r\n let j = polygon.length - 1\r\n let oddNodes = false\r\n for (let i = 0; i < polygon.length; i++) {\r\n const p = polygon[i]\r\n if (\r\n ((p.y < point.y && polygon[j].y >= point.y) || (polygon[j].y < point.y && p.y >= point.y)) &&\r\n (p.x <= point.x || polygon[j].x <= point.x)\r\n ) {\r\n if (p.x + ((point.y - p.y) / (polygon[j].y - p.y)) * (polygon[j].x - p.x) < point.x) {\r\n oddNodes = !oddNodes\r\n }\r\n }\r\n j = i\r\n }\r\n return oddNodes\r\n },\r\n\r\n distanceToLine(point: Point, line: LinePoints) {\r\n const { a, b, c } = this.lineEquation(line)\r\n const dist = Math.abs(a * point.x + b * point.y + c) / Math.sqrt(a * a + b * b)\r\n return dist\r\n },\r\n\r\n distanceToSegment(point: Point, line: LinePoints) {\r\n const l2 = Math.pow(line.x1 - line.x2, 2) + Math.pow(line.y1 - line.y2, 2)\r\n if (l2 === 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n const t = ((point.x - line.x1) * (line.x2 - line.x1) + (point.y - line.y1) * (line.y2 - line.y1)) / l2\r\n if (t < 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n if (t > 1) {\r\n return Math.sqrt(Math.pow(point.x - line.x2, 2) + Math.pow(point.y - line.y2, 2))\r\n }\r\n const x = line.x1 + t * (line.x2 - line.x1)\r\n const y = line.y1 + t * (line.y2 - line.y1)\r\n return Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2))\r\n },\r\n\r\n getInstrumentDecimalPlaces({ value, instrument }: { value: number; instrument?: Instrument }) {\r\n if (instrument === Instrument.Crypto && value <= 0.001) {\r\n return 8\r\n }\r\n\r\n if ((instrument !== Instrument.Stock && value <= 6) || (instrument === Instrument.Stock && value < 1)) {\r\n return 4\r\n }\r\n\r\n return 2\r\n },\r\n\r\n formatBigNumber(number: number, toFixed?: number, minNumber?: BigNumber) {\r\n const absNum = Math.abs(number)\r\n const getString = ({ num, suffix, zeroes }: { num: number; suffix: string; zeroes: number }) => {\r\n const str = num.toString()\r\n if (str.includes('e')) {\r\n const splitString = str.split('e')\r\n const addZeroes = Number(splitString[1]) - zeroes\r\n return Math.round(Number(splitString[0])).toString().padEnd(Math.max(0, addZeroes), '0') + suffix\r\n }\r\n const sign = Math.sign(num)\r\n const numberByZeroesCount = Math.pow(10, zeroes)\r\n const result = (absNum / numberByZeroesCount) * sign\r\n return (Number.isInteger(result) ? result : result.toFixed(toFixed !== undefined ? toFixed : 1)) + suffix\r\n }\r\n\r\n if (absNum >= BIG_NUMBER_VALUES[BigNumber.Trillion] || minNumber === BigNumber.Trillion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Trillion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Trillion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Billion] || minNumber === BigNumber.Billion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Billion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Billion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Million] || minNumber === BigNumber.Million) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Million],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Million],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Thousand] || minNumber === BigNumber.Thousand) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Thousand],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Thousand],\r\n })\r\n } else {\r\n return toFixed !== undefined ? number.toFixed(toFixed) : number.toString()\r\n }\r\n },\r\n\r\n round({\r\n value,\r\n lastClose = 0,\r\n instrument,\r\n overridePlaces,\r\n }: {\r\n value: number\r\n lastClose?: number\r\n instrument?: Instrument\r\n overridePlaces?: number\r\n }) {\r\n if (Math.abs(value) >= BIG_NUMBER_VALUES[BigNumber.Million]) {\r\n return this.formatBigNumber(value, overridePlaces)\r\n }\r\n\r\n const places =\r\n typeof overridePlaces === 'number'\r\n ? overridePlaces\r\n : this.getInstrumentDecimalPlaces({ value: lastClose, instrument })\r\n\r\n if (value < 0.000001) {\r\n // There was an issue with getting NaN when rounding small numbers with latter method\r\n return value.toFixed(places)\r\n }\r\n return Number(`${Math.round(Number(`${value}e+${places}`))}e-${places}`).toFixed(places)\r\n },\r\n\r\n perpendicularPointToLine({ line, distance }: { line: LinePoints; distance: number }) {\r\n if (distance === 0) {\r\n return { x: line.x2, y: line.y2 }\r\n }\r\n\r\n let yAxisCoeficient\r\n let xAxisCoeficient\r\n\r\n if (line.x1 <= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 <= line.x2 && line.y1 <= line.y2) {\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 >= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = 1\r\n } else {\r\n // conditions falling to else: (line.x1 >= line.x2 && line.y1 <= line.y2)\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = 1\r\n }\r\n\r\n const radAngle = Math.atan2(Math.abs(line.x2 - line.x1), Math.abs(line.y2 - line.y1))\r\n const x = line.x2 + xAxisCoeficient * (distance * Math.cos(radAngle))\r\n const y = line.y2 + yAxisCoeficient * (distance * Math.sin(radAngle))\r\n return { x, y }\r\n },\r\n\r\n rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n }: {\r\n rotationAxisPoint: Point\r\n angle: number\r\n pointToRotate: Point\r\n }) {\r\n // return newCoordinates for pointToRotate after rotation defined by\r\n // angle around rotationAxisPoint\r\n const sin = Math.sin(angle)\r\n const cos = Math.cos(angle)\r\n const rotatedX =\r\n cos * (pointToRotate.x - rotationAxisPoint.x) +\r\n sin * (pointToRotate.y - rotationAxisPoint.y) +\r\n rotationAxisPoint.x\r\n const rotatedY =\r\n cos * (pointToRotate.y - rotationAxisPoint.y) -\r\n sin * (pointToRotate.x - rotationAxisPoint.x) +\r\n rotationAxisPoint.y\r\n return { x: rotatedX, y: rotatedY }\r\n },\r\n sharedPointLinesAngle({\r\n sharedPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n sharedPoint: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) {\r\n // return angle between line from sharedPoint to oldLinePoint and\r\n // line from sharedPoint to newLinePoint\r\n const numerator =\r\n oldLinePoint.y * (sharedPoint.x - newLinePoint.x) +\r\n sharedPoint.y * (newLinePoint.x - oldLinePoint.x) +\r\n newLinePoint.y * (oldLinePoint.x - sharedPoint.x)\r\n const denominator =\r\n (oldLinePoint.x - sharedPoint.x) * (sharedPoint.x - newLinePoint.x) +\r\n (oldLinePoint.y - sharedPoint.y) * (sharedPoint.y - newLinePoint.y)\r\n const ratio = numerator / denominator\r\n\r\n return Math.atan(ratio)\r\n },\r\n\r\n twoSegmentLinesIntersection(p1: Point, p2: Point, p3: Point, p4: Point) {\r\n // line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/\r\n // Determine the intersection point of two line segments\r\n // Return FALSE if the lines don't intersect\r\n\r\n // Check if none of the lines are of length 0\r\n if ((p1.x === p2.x && p1.y === p2.y) || (p3.x === p4.x && p3.y === p4.y)) {\r\n return false\r\n }\r\n\r\n const denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y)\r\n\r\n // Lines are parallel\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n const ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator\r\n const ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator\r\n\r\n // is the intersection along the segments\r\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\r\n return false\r\n }\r\n\r\n // Return a object with the x and y coordinates of the intersection\r\n const x = p1.x + ua * (p2.x - p1.x)\r\n const y = p1.y + ua * (p2.y - p1.y)\r\n\r\n return { x, y }\r\n },\r\n\r\n // https://stackoverflow.com/a/60368757\r\n checkLineIntersection(line1_p1: Point, line1_p2: Point, line2_p1: Point, line2_p2: Point) {\r\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\r\n let a, b\r\n const result: { x: number; y: number; onLine1: boolean; onLine2: boolean } = {\r\n x: 0,\r\n y: 0,\r\n onLine1: false,\r\n onLine2: false,\r\n }\r\n const denominator =\r\n (line2_p2.y - line2_p1.y) * (line1_p2.x - line1_p1.x) - (line2_p2.x - line2_p1.x) * (line1_p2.y - line1_p1.y)\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n a = line1_p1.y - line2_p1.y\r\n b = line1_p1.x - line2_p1.x\r\n const numerator1 = (line2_p2.x - line2_p1.x) * a - (line2_p2.y - line2_p1.y) * b\r\n const numerator2 = (line1_p2.x - line1_p1.x) * a - (line1_p2.y - line1_p1.y) * b\r\n a = numerator1 / denominator\r\n b = numerator2 / denominator\r\n\r\n // if we cast these lines infinitely in both directions, they intersect here:\r\n result.x = line1_p1.x + a * (line1_p2.x - line1_p1.x)\r\n result.y = line1_p1.y + a * (line1_p2.y - line1_p1.y)\r\n\r\n // if line1 is a segment and line2 is infinite, they intersect if:\r\n if (a > 0 && a < 1) {\r\n result.onLine1 = true\r\n }\r\n // if line2 is a segment and line1 is infinite, they intersect if:\r\n if (b > 0 && b < 1) {\r\n result.onLine2 = true\r\n }\r\n // if line1 and line2 are segments, they intersect if both of the above are true\r\n return result\r\n },\r\n\r\n // ray is considered line1, segment is considered line2\r\n getRayToLineSegmentIntersection(rayOrigin: Point, rayEnd: Point, segmentStart: Point, segmentEnd: Point) {\r\n const lineIntersection = this.checkLineIntersection(rayOrigin, rayEnd, segmentStart, segmentEnd)\r\n\r\n if (\r\n !lineIntersection ||\r\n lineIntersection.onLine1 ||\r\n this.dotProduct(\r\n this.subtractPoints(rayOrigin, lineIntersection as Point),\r\n this.subtractPoints(rayOrigin, rayEnd)\r\n ) <= 0\r\n )\r\n return false\r\n return { ...lineIntersection, x: Math.round(lineIntersection.x), y: Math.round(lineIntersection.y) } // sometimes edge value can have crazy precision instead of `0` something like `5.684341886080802e-14` which is basically 0.00000000000005684341886080802 we should round it\r\n },\r\n\r\n getMiddlePointOnLineSegment(P1: Point, P2: Point) {\r\n const x = (P1.x - P2.x) / 2 + P2.x\r\n const y = (P1.y - P2.y) / 2 + P2.y\r\n return { x, y }\r\n },\r\n\r\n normalizeVector(v: Point) {\r\n const length = Math.sqrt(v.x * v.x + v.y * v.y)\r\n return { x: v.x / length, y: v.y / length }\r\n },\r\n\r\n multiplyVectorByScalar(v: Point, scalar: number) {\r\n return { x: v.x * scalar, y: v.y * scalar }\r\n },\r\n\r\n addPoints(P1: Point, P2: Point) {\r\n return { x: P1.x + P2.x, y: P1.y + P2.y }\r\n },\r\n\r\n subtractPoints(P1: Point, P2: Point): Point {\r\n return { x: P1.x - P2.x, y: P1.y - P2.y }\r\n },\r\n}\r\n\r\nexport default math\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\nexport class ExponentialMovingAverage {\r\n period: number\r\n multiplier: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.multiplier = 2 / (this.period + 1)\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(d: number) {\r\n if (this.count < this.period) {\r\n this.sum += d\r\n this.count++\r\n this.value = this.sum / this.count\r\n } else {\r\n this.value = d * this.multiplier + this.value * (1 - this.multiplier)\r\n }\r\n }\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n ema: number[]\r\n}\r\n\r\nexport class EMACalculation extends MainCalculation {\r\n static type = OverlayType.Ema\r\n\r\n getDefaultCalculatedValues() {\r\n return { ema: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated ) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n const ema = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let index = 0; index <= lastIndex; index++) {\r\n ema.add(close[index])\r\n this.calculatedValues.ema[index] = ema.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { IndicatorType, OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\n\r\ntype OptionValuesType = ObjectHash \r\ntype CalculatedValuesType = ObjectHash \r\ninterface MainProps {\r\n quote?: Quote\r\n options: T\r\n}\r\n\r\nexport type OnValueCalculatedReturnValue = boolean | undefined\r\nexport type OnValueCalculated = ((value: T, dataIndex: number) => OnValueCalculatedReturnValue) | undefined\r\n\r\nexport class MainCalculation<\r\n TOptionValues extends OptionValuesType | undefined = undefined,\r\n TCalculatedValues extends CalculatedValuesType = CalculatedValuesType,\r\n> {\r\n static type: IndicatorType | OverlayType = IndicatorType.Indicator\r\n\r\n quote: NonNullable ['quote']>\r\n options: MainProps ['options']\r\n\r\n protected _calculatedValues: TCalculatedValues\r\n\r\n constructor({ quote, options }: MainProps ) {\r\n this.quote = quote ?? new Quote()\r\n this.options = options\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n }\r\n\r\n get calculatedValues() {\r\n return this._calculatedValues\r\n }\r\n\r\n getDefaultCalculatedValues(): TCalculatedValues {\r\n throw Error('Implement getDefaultCalculatedValues')\r\n }\r\n\r\n calculate(_: OnValueCalculated ) {\r\n throw Error('Implement calculate')\r\n }\r\n\r\n getAllCalculatedValues(lastNItems: number) {\r\n const calculatedValues = {} as TCalculatedValues\r\n Object.keys(this.calculatedValues).forEach((key) => {\r\n calculatedValues[key as keyof TCalculatedValues] = this.getCalculatedValues(key, lastNItems)\r\n })\r\n return calculatedValues\r\n }\r\n\r\n getCalculatedValues(key: keyof TCalculatedValues, lastNItems: number) {\r\n return (this.calculatedValues[key] as number[]).slice(-lastNItems) as TCalculatedValues[keyof TCalculatedValues]\r\n }\r\n\r\n /**\r\n * This function is used to construct sql script for db table creation\r\n * and also to build precalculated data object used on node server.\r\n *\r\n * Precalculated data object uses database column names as property keys to simplify data mapping on BE\r\n */\r\n getDbColumnName() {\r\n const { type } = this.constructor as typeof MainCalculation\r\n const typeLabel = type.split('/')[1]\r\n const optionKeys = Object.keys(this.options ?? {}).sort((key1, key2) => key1.localeCompare(key2))\r\n\r\n const optionsStrings = optionKeys.map((key) => `${key.slice(0, 1)}${this.options![key]}`)\r\n return [typeLabel, ...optionsStrings].join('_')\r\n }\r\n}\r\n","/*\r\n * it converts it to numbered index and it causes problems later on\r\n * the reason it's not just numbered enum is that it when used in const below\r\n * */\r\nexport enum ChartSyncablePart {\r\n Crosshair = 'crosshair',\r\n Ticker = 'ticker',\r\n Timeframe = 'timeframe',\r\n}\r\n\r\nexport const ChartPartToAttrsSyncMap = {\r\n [ChartSyncablePart.Ticker]: ['ticker'],\r\n [ChartSyncablePart.Timeframe]: ['timeframe', 'dateRange'],\r\n}\r\n\r\nexport const ChartSyncableParts = [\r\n { value: ChartSyncablePart.Ticker, label: 'Ticker' },\r\n { value: ChartSyncablePart.Timeframe, label: 'Timeframe' },\r\n { value: ChartSyncablePart.Crosshair, label: 'Crosshair' },\r\n]\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { IChartThemeColors, chartDarkTheme, chartLightTheme } from '../constants'\r\n\r\nfunction normalizeHexAlpha(hexString = '') {\r\n const hexValue = hexString.replace('#', '')\r\n if (hexValue.length === 6) {\r\n return `${hexString}FF`\r\n }\r\n return hexString\r\n}\r\n\r\nexport const getColorOverwrites = ({\r\n theme,\r\n colors,\r\n}: {\r\n theme: Theme\r\n colors: ObjectHash , Theme>\r\n}) => {\r\n const customColors = colors[theme]\r\n const customColorKeys = Object.keys(customColors) as Array >\r\n const defaultColors = theme === Theme.light ? chartLightTheme : chartDarkTheme\r\n\r\n return customColorKeys.reduce((acc, colorKey) => {\r\n const isDefaultOverWritten =\r\n normalizeHexAlpha(customColors[colorKey]).toLowerCase() !==\r\n normalizeHexAlpha(defaultColors[colorKey]).toLowerCase()\r\n\r\n return isDefaultOverWritten\r\n ? {\r\n ...acc,\r\n [colorKey]: customColors[colorKey],\r\n }\r\n : acc\r\n }, {})\r\n}\r\n","import tailwindColors from '../constants/colors'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\n\r\nexport interface IChartThemeColors {\r\n aftermarketFade: string\r\n background: string\r\n borderDown: string\r\n borderUp: string\r\n canvasFill: string\r\n cross: string\r\n crossText: string\r\n crossTextBackground: string\r\n currentBackground: string\r\n currentText: string\r\n grid: string\r\n gridSecondary: string\r\n indicatorCurrentBackground: string\r\n indicatorCurrentText: string\r\n line: string\r\n marketDown: string\r\n marketUp: string\r\n negativeChange: string\r\n ohlcTrendDown: string\r\n ohlcTrendUp: string\r\n overlayTransparentBackground: string\r\n percentageZeroLineText: string\r\n performanceIndicatorLabel: string\r\n positiveChange: string\r\n premarketFade: string\r\n prevClose: string\r\n text: string\r\n textSecondary: string\r\n trendDown: string\r\n trendUp: string\r\n volumeTrendDown: string\r\n volumeTrendUp: string\r\n wickDown: string\r\n wickUp: string\r\n zeroChange: string\r\n}\r\n\r\nexport interface IIndicatorThemeColors {\r\n line: string\r\n signalLine: string\r\n}\r\n\r\nexport interface IElementThemeColors {\r\n line: string\r\n border: string\r\n textWithoutBackground: string\r\n}\r\n\r\ninterface IDarkerWickColors {\r\n borderUp: string\r\n wickUp: string\r\n borderDown: string\r\n wickDown: string\r\n}\r\n\r\nexport const chartLightTheme: IChartThemeColors = {\r\n aftermarketFade: '#FFFFFF99',\r\n background: '#008CFF0E',\r\n borderDown: '#000000FF',\r\n borderUp: '#000000FF',\r\n canvasFill: '#FFFFFFFF',\r\n cross: '#0000004C',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.brightYellow[100],\r\n currentText: tailwindColors.gray[800],\r\n grid: '#D2D2D2FF',\r\n gridSecondary: '#ECECEC',\r\n indicatorCurrentBackground: tailwindColors.gray[600],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[500],\r\n marketUp: tailwindColors.green[500],\r\n negativeChange: '#C80000FF',\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#C9CCD6', 0.25),\r\n percentageZeroLineText: '#111',\r\n performanceIndicatorLabel: '#646464',\r\n positiveChange: '#009600FF',\r\n premarketFade: '#FFFFFF99',\r\n prevClose: '#C80000FF',\r\n text: '#828282',\r\n textSecondary: '#dedede',\r\n trendDown: '#FF0000FF',\r\n trendUp: '#00FF00FF',\r\n volumeTrendDown: '#ffc0c0',\r\n volumeTrendUp: '#a8e0a8',\r\n wickDown: '#000000FF',\r\n wickUp: '#000000FF',\r\n zeroChange: '#000',\r\n}\r\n\r\nexport const chartDarkTheme: IChartThemeColors = {\r\n aftermarketFade: '#4C526133',\r\n background: '#1E6DC019',\r\n borderDown: '#F63538FF',\r\n borderUp: '#30CC5AFF',\r\n canvasFill: tailwindColors.gray[800],\r\n cross: '#404553',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.yellow[200],\r\n currentText: tailwindColors.gray[700],\r\n grid: '#363A46FF',\r\n gridSecondary: '#2C303A',\r\n indicatorCurrentBackground: tailwindColors.gray[500],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[300],\r\n marketUp: tailwindColors.green[300],\r\n negativeChange: tailwindColors.red[400],\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#0C0E13', 0.35),\r\n percentageZeroLineText: '#fff',\r\n performanceIndicatorLabel: '#646464',\r\n positiveChange: tailwindColors.green[400],\r\n premarketFade: '#4C526133',\r\n prevClose: '#C80000FF',\r\n text: '#929cb3',\r\n textSecondary: '#929CB399',\r\n trendDown: '#F63538FF',\r\n trendUp: '#30CC5AFF',\r\n volumeTrendDown: '#F635387F',\r\n volumeTrendUp: '#30CC5A7F',\r\n wickDown: '#F63538FF',\r\n wickUp: '#30CC5AFF',\r\n zeroChange: '#929cb3',\r\n}\r\n\r\nexport const darkerWickColors: IDarkerWickColors = {\r\n borderUp: '#006400FF',\r\n wickUp: '#006400',\r\n borderDown: '#6E0000FF',\r\n wickDown: '#6E0000FF',\r\n}\r\n\r\nexport const indicatorLightTheme: IIndicatorThemeColors = {\r\n line: '#000000',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const indicatorDarkTheme: IIndicatorThemeColors = {\r\n line: '#D07933',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const elementLightTheme: IElementThemeColors = {\r\n line: '#000000',\r\n border: '#000000',\r\n textWithoutBackground: '#000000',\r\n}\r\n\r\nexport const elementDarkTheme: IElementThemeColors = {\r\n line: '#5faaf4',\r\n border: '#5192D1',\r\n textWithoutBackground: '#929cb3',\r\n}\r\nexport const generalColors: Array = [\r\n '#1f77b4',\r\n '#ff7f0e',\r\n '#2ca02c',\r\n '#d62728',\r\n '#9467bd',\r\n '#8c564b',\r\n '#e377c2',\r\n '#7f7f7f',\r\n '#bcbd22',\r\n '#17becf',\r\n]\r\n\r\n// node chart with thin bars color override\r\nexport const thinBarColorsOverride = {\r\n trendUp: '#00b400',\r\n trendDown: '#b40000',\r\n}\r\n\r\nexport enum AutoSaveState {\r\n Off,\r\n Saved,\r\n Unsaved,\r\n Saving,\r\n}\r\n\r\nexport const CHART_EVENT_BADGE_SIZE = 24\r\n","import endOfDay from 'date-fns/endOfDay'\r\nimport lastDayOfMonth from 'date-fns/lastDayOfMonth'\r\nimport lastDayOfWeek from 'date-fns/lastDayOfWeek'\r\nimport setDate from 'date-fns/set'\r\n\r\nimport { TIMEFRAME, TIMEFRAMES_WITH_PRE_MARKET } from '../../constants/common'\r\nimport { convertLocalToNyTime, dateFromUnixTimestamp } from '../../utils'\r\nimport Chart from '../chart'\r\n\r\nconst MARKET_START = { hours: 9, minutes: 30 }\r\nconst END_OF_DAY = { hours: 23, minutes: 59 }\r\n\r\nfunction getIsDateBeforeMarketStart(date: Date) {\r\n const hours = date.getHours()\r\n const minutes = date.getMinutes()\r\n return hours < MARKET_START.hours || (hours === MARKET_START.hours && minutes < MARKET_START.minutes)\r\n}\r\n\r\nexport function roundTimeForSyncedPane({\r\n sourceChart,\r\n targetChart,\r\n timestamp,\r\n}: {\r\n sourceChart: Chart\r\n targetChart: Chart\r\n timestamp: number\r\n}) {\r\n let dateToReturn = dateFromUnixTimestamp(timestamp)\r\n const sourceChartHasPremarket =\r\n sourceChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(sourceChart.timeframe)\r\n const targetChartHasPremarket =\r\n targetChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(targetChart.timeframe)\r\n\r\n if ([TIMEFRAME.d, TIMEFRAME.w, TIMEFRAME.m].includes(sourceChart.timeframe)) {\r\n dateToReturn = setDate(dateToReturn, MARKET_START)\r\n }\r\n\r\n if (targetChart.timeframe === TIMEFRAME.m) {\r\n dateToReturn = setDate(lastDayOfMonth(dateToReturn), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.w) {\r\n dateToReturn = setDate(lastDayOfWeek(dateToReturn, { weekStartsOn: 1 }), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.d && targetChart.quote().instrument !== 'stock') {\r\n dateToReturn = endOfDay(dateToReturn)\r\n }\r\n\r\n if (sourceChartHasPremarket && !targetChartHasPremarket && targetChart.quote().instrument === 'stock') {\r\n dateToReturn = getIsDateBeforeMarketStart(dateToReturn) ? setDate(dateToReturn, MARKET_START) : dateToReturn\r\n }\r\n\r\n return ~~(convertLocalToNyTime(dateToReturn, false).getTime() / 1000)\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nimport { ChartSyncablePart } from '../chart/contstants'\r\nimport Pane from '../pane'\r\nimport { roundTimeForSyncedPane } from './mouse-utils'\r\n\r\nexport class Mouse extends Spine.Model {\r\n static initClass() {\r\n this.configure('Mouse', 'position')\r\n this.belongsTo('pane', Pane)\r\n }\r\n\r\n declare position: { x: number; y: number } | undefined\r\n declare pane: () => Pane | null\r\n\r\n getIsCrossSyncOn = () => !!this.pane()?.chart().getIsChartPartInSync(ChartSyncablePart.Crosshair)\r\n\r\n getIsMouseInChartOfPane = (pane: Pane) => !!this.pane()?.chart().eql(pane.chart())\r\n\r\n getShouldRenderCrossInPane = (pane: Pane) => this.getIsCrossSyncOn() || this.getIsMouseInChartOfPane(pane)\r\n\r\n getCrossIndexForPane = (pane: Pane) => {\r\n if (this.position) {\r\n if (this.getIsMouseInChartOfPane(pane)) {\r\n return Math.round(this.position.x)\r\n }\r\n const paneOfMouse = this.pane()\r\n if (this.getIsCrossSyncOn() && paneOfMouse) {\r\n const mouseInChart = paneOfMouse.chart()\r\n const currentPaneChart = pane.chart()\r\n const mousePositionTimestamp = mouseInChart.quote().getTimestampFomPositionX(Math.round(this.position.x))\r\n const currentPanePositionX = currentPaneChart.quote().getPositionXFromTimestamp(\r\n roundTimeForSyncedPane({\r\n sourceChart: mouseInChart,\r\n targetChart: currentPaneChart,\r\n timestamp: mousePositionTimestamp,\r\n })\r\n )\r\n return Math.floor(currentPanePositionX)\r\n }\r\n }\r\n\r\n return Number.NaN\r\n }\r\n\r\n getPriceForPane = (pane: Pane) => {\r\n const positionY = this.position?.y ?? null\r\n\r\n if (this.pane()?.eql(pane)) {\r\n return positionY\r\n }\r\n\r\n if (this.getIsCrossSyncOn() && this.pane()) {\r\n const mousePaneIndex = this.pane()?.getIndexInChart()\r\n const currentPaneIndex = pane.getIndexInChart()\r\n return mousePaneIndex === currentPaneIndex ? positionY : null\r\n }\r\n\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Mouse is a singleton, so `initClass` must be called before we create the instance\r\n * otherwise it wouldn’t work\r\n */\r\nMouse.initClass()\r\n\r\nconst mouse = Mouse.create ()\r\nmouse.save()\r\n\r\nexport default mouse as Mouse\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport { Position, TodoObjectHashAnyType } from '../../types/shared'\r\nimport CanvasElement from '../canvas/element'\r\nimport { ChartEventBadgeType, PANE_HEIGHT_DEFAULT } from '../constants/common'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport Element from './element'\r\nimport { rebuildElementZIndexes } from './utils'\r\n\r\nexport interface ScaleAxis {\r\n (index: number): number\r\n invert: (x: number) => number\r\n domain: () => [currentDomainMax: number, currentDomainMin: number]\r\n width: (x: number) => number\r\n height: (y: number) => number\r\n ticks: (y: number) => number[]\r\n}\r\n\r\nconst CHART_EVENT_BADGE_TYPE_ORDER = [\r\n ChartEventBadgeType.Split,\r\n ChartEventBadgeType.Dividends,\r\n ChartEventBadgeType.EarningsPositive,\r\n ChartEventBadgeType.EarningsNegative,\r\n ChartEventBadgeType.EarningsNeutral,\r\n ChartEventBadgeType.EarningsFuture,\r\n]\r\n\r\nclass Pane extends Spine.Model {\r\n static initClass(\r\n elementModel: typeof Element,\r\n chartEventElementModel: typeof ChartEventElement,\r\n chartModel: typeof Chart\r\n ) {\r\n this.configure('Pane', 'height', 'scale', 'scaleRange', 'instance', 'selection')\r\n this.hasMany('elements', elementModel)\r\n this.hasMany('chartEvents', chartEventElementModel)\r\n this.belongsTo('mainElement', elementModel)\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare id: string\r\n declare chart_id: string\r\n declare height: number\r\n declare scale: {\r\n x: ScaleAxis\r\n y: ScaleAxis\r\n }\r\n\r\n declare instance: any\r\n declare chart: () => Chart\r\n declare mainElement: () => T | null\r\n declare elements: () => Collection \r\n declare chartEvents: () => Collection \r\n selection: CanvasElement | null = null\r\n scaleRange: { min: number; max: number } | null = null\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.elements()\r\n .all()\r\n .forEach((element) => {\r\n element.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n toObject() {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toObject())\r\n return {\r\n height: this.height,\r\n scale: this.scale,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n }\r\n }\r\n\r\n toConfig(omitKeys = [] as string[]) {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toConfig())\r\n return omit(\r\n {\r\n height: this.height,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n },\r\n omitKeys\r\n )\r\n }\r\n\r\n move(direction: Position) {\r\n const chartPanes = this.chart().getAllPanes()\r\n const chartPane = chartPanes.find((pane) => !pane.getIsIndicatorPane())\r\n const targetPane = chartPanes.find((pane) => this.eql(pane))\r\n\r\n if (!chartPane || !targetPane) return\r\n\r\n const currentChartPaneRecords = Pane.records.filter((pane) => pane.chart_id === targetPane.chart_id)\r\n const ohterChartPaneRecords = Pane.records.filter((pane) => pane.chart_id !== targetPane.chart_id)\r\n\r\n const targetRecordIndex = currentChartPaneRecords.findIndex((record) => record.id === targetPane.id)\r\n const arrayWithoutTargetRecord = currentChartPaneRecords.filter((_, index) => index !== targetRecordIndex)\r\n const chartRecordIndex = arrayWithoutTargetRecord.findIndex((record) => record.id === chartPane.id)\r\n\r\n const panesAbove = arrayWithoutTargetRecord.slice(0, chartRecordIndex)\r\n const panesBelow = arrayWithoutTargetRecord.slice(chartRecordIndex + 1)\r\n if (direction === Position.Above) {\r\n panesAbove.push(currentChartPaneRecords[targetRecordIndex])\r\n panesAbove.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n if (direction === Position.Below) {\r\n panesBelow.push(currentChartPaneRecords[targetRecordIndex])\r\n panesBelow.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n\r\n Pane.records = ohterChartPaneRecords.concat([\r\n ...panesAbove,\r\n arrayWithoutTargetRecord[chartRecordIndex],\r\n ...panesBelow,\r\n ])\r\n this.chart().trigger('change', this.chart())\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.chart().chart_layout())\r\n }\r\n\r\n getAllElements() {\r\n return this.elements()\r\n .all()\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n }\r\n\r\n getAllChartEvents(isSorted = true) {\r\n const chartEvents = [...this.chartEvents().all()]\r\n return isSorted ? chartEvents.sort((a, b) => a.zIndex - b.zIndex) : chartEvents\r\n }\r\n\r\n getChartOrIndicatorElement() {\r\n return this.getAllElements().find((el) => el.isChart() || el.isIndicator()) ?? null\r\n }\r\n\r\n getIsIndicatorPane() {\r\n return !!this.mainElement()?.isIndicator()\r\n }\r\n\r\n getIsChartPane() {\r\n return !!this.mainElement()?.isChart()\r\n }\r\n\r\n resetHeight() {\r\n if (this.getIsIndicatorPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.indicator)\r\n }\r\n if (this.getIsChartPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.chart)\r\n }\r\n }\r\n\r\n getIndexInChart() {\r\n return this.chart()\r\n .getAllPanes()\r\n .findIndex((chartPane) => chartPane.eql(this))\r\n }\r\n\r\n getElementZIndexRange() {\r\n let max = -1\r\n let min = 1\r\n this.getAllElements().forEach((el) => {\r\n if (el.zIndex > max) {\r\n max = el.zIndex\r\n }\r\n if (el.zIndex < min) {\r\n min = el.zIndex\r\n }\r\n })\r\n return { min, max }\r\n }\r\n\r\n getBelowAboveZeroElements() {\r\n const allPaneElements = this.getAllElements()\r\n const elementsBelowZero: Element[] = []\r\n const elementsAboveZero: Element[] = []\r\n allPaneElements.forEach((el) => {\r\n if (el.zIndex < 0) {\r\n elementsBelowZero.push(el)\r\n }\r\n if (el.zIndex > 0) {\r\n elementsAboveZero.push(el)\r\n }\r\n })\r\n\r\n return { elementsBelowZero, elementsAboveZero }\r\n }\r\n\r\n normalizeZIndexes() {\r\n const { elementsBelowZero, elementsAboveZero } = this.getBelowAboveZeroElements()\r\n rebuildElementZIndexes({ elementsArray: elementsBelowZero, isBelowZero: true })\r\n rebuildElementZIndexes({ elementsArray: elementsAboveZero, isBelowZero: false })\r\n }\r\n\r\n getQuoteRawTicker() {\r\n return this.chart().getQuoteRawTicker()\r\n }\r\n\r\n getNumericId() {\r\n return Number(this.id.replace('c-', ''))\r\n }\r\n\r\n updateChartEventsZIndexes() {\r\n if (!this.scale || !this.scale.hasOwnProperty('x')) {\r\n return\r\n }\r\n\r\n const chartEvents = this.getAllChartEvents(false).sort(\r\n (a, b) => a.instance.attrs.positionTimestamps!.x - b.instance.attrs.positionTimestamps!.x\r\n )\r\n const hoveredChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isHovered)\r\n const openedChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isOpen)\r\n\r\n const hoveredTypeChartEventElements: ChartEventElement[] = []\r\n const openedTypeChartEventElements: ChartEventElement[] = []\r\n const nonActiveChartEventElements: ChartEventElement[] = []\r\n\r\n chartEvents.forEach((chartEvent, index) => {\r\n const chartEventsOnSameXPoint = chartEvents.filter(\r\n (chartEvent_B, i) =>\r\n i < index && Math.round(chartEvent.instance.attrs.x) === Math.round(chartEvent_B!.instance.attrs.x)\r\n )\r\n chartEvent.updateAttributes({ yIndex: chartEventsOnSameXPoint.length })\r\n const isHovered = chartEvent.instance === hoveredChartEvent?.instance\r\n const isOpened = chartEvent.instance === openedChartEvent?.instance\r\n const isHoveredType = chartEvent.instance.type === hoveredChartEvent?.instance.type\r\n const isOpenType = chartEvent.instance.type === openedChartEvent?.instance.type\r\n if (!isHovered || !isOpened) {\r\n if (isHoveredType) {\r\n hoveredTypeChartEventElements.push(chartEvent)\r\n } else if (isOpenType) {\r\n openedTypeChartEventElements.push(chartEvent)\r\n } else {\r\n nonActiveChartEventElements.push(chartEvent)\r\n }\r\n }\r\n })\r\n\r\n nonActiveChartEventElements.sort(\r\n (a, b) =>\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(a.instance.getChartEvenBadgeType()) -\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(b.instance.getChartEvenBadgeType())\r\n )\r\n\r\n const chartEventElements = [\r\n ...nonActiveChartEventElements,\r\n ...openedTypeChartEventElements,\r\n openedChartEvent,\r\n ...hoveredTypeChartEventElements,\r\n hoveredChartEvent,\r\n ].filter(Boolean)\r\n chartEventElements.forEach((chartEvent, index) => {\r\n chartEvent!.updateAttributes({ zIndex: index })\r\n })\r\n }\r\n}\r\n\r\nexport default Pane\r\n","import { ObjectHash, RequireByKey } from '../../types/shared'\r\n\r\ninterface HeikinAshiData {\r\n HAOpen: number[]\r\n HAClose: number[]\r\n}\r\n\r\ninterface QuoteValues {\r\n cachedAt: null | number\r\n dayToOffset: ObjectHash []\r\n dateToIndex: ObjectHash []\r\n heikinAshiData?: HeikinAshiData\r\n daysInQuote: Date[]\r\n}\r\n\r\ninterface QuoteCacheFunctionProps {\r\n cid: string\r\n key: keyof QuoteValues\r\n fetchedAt: number\r\n value: any\r\n}\r\n\r\nconst quoteCache = {} as ObjectHash \r\n\r\nexport function getCachedQuote({\r\n cid,\r\n key,\r\n fetchedAt,\r\n}: RequireByKey >, 'cid'>) {\r\n const quote = quoteCache[cid]\r\n if (quote?.cachedAt === fetchedAt && key) {\r\n return quote[key]\r\n } else if (!key) {\r\n return quote\r\n }\r\n return null\r\n}\r\n\r\nexport function setCachedQuote({\r\n cid,\r\n key,\r\n value,\r\n fetchedAt,\r\n}: Pick ) {\r\n quoteCache[cid] = {\r\n ...(quoteCache[cid]?.cachedAt === fetchedAt ? quoteCache[cid] : {}),\r\n [key]: value,\r\n cachedAt: fetchedAt,\r\n } as QuoteValues\r\n}\r\n\r\nexport function deleteCachedQuote({ cid }: Pick ) {\r\n delete quoteCache[cid]\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { isSameMonth, isSameWeek } from 'date-fns'\r\nimport queryString from 'query-string'\r\n\r\nimport { Instrument, ObjectHash, TodoObjectHashAnyType } from '../../types/shared'\r\nimport { ChartEventDbType, ChartEventType, IntradayTimeframeInterval, TIMEFRAME } from '../constants/common'\r\nimport type { ICOT } from '../indicators/cot'\r\nimport { dateFromUnixTimestamp, dateStringFromDate } from '../utils'\r\nimport { getIsAbortError } from '../utils/abort_controller'\r\nimport { getPositionXFromTimestamp, getTimestampFromPositionX } from '../utils/chart'\r\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\r\nimport fetchApi, { NotFoundError } from '../utils/fetch_api'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport { QuoteFetchType, QuoteFetchTypeUrlOption, QuoteUrlOptions } from './quote/constants'\r\nimport { deleteCachedQuote, getCachedQuote, setCachedQuote } from './quoteCache'\r\nimport { getRawTickerForInstrument } from './utils'\r\n\r\nconst quoteRefreshChecksBeforeFullRefresh = 15\r\n\r\ntype TodoPattern = TodoObjectHashAnyType\r\n\r\nexport interface TickerTimeframesProps {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n}\r\n\r\ninterface QuoteFetchOptions {\r\n aftermarket?: boolean\r\n premarket?: boolean\r\n patterns?: boolean\r\n events?: boolean\r\n maxBars?: number\r\n}\r\n\r\ninterface QuoteInternalOptions {\r\n cachePredicate?: (quote: Quote) => boolean\r\n fetchNewDataOnCachedQuote?: boolean\r\n}\r\n\r\ninterface UrlOptions extends QuoteFetchOptions {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n}\r\n\r\ntype ChartEventDataRaw = Omit & { eventType: ChartEventDbType }\r\n\r\nexport interface DataResponse {\r\n COTs: COTData\r\n name: string\r\n ticker: string\r\n instrument: string\r\n interval: number\r\n timeframe: string\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n date: number[]\r\n volume: number[]\r\n lastOpen: number\r\n lastHigh: number\r\n lastLow: number\r\n lastClose: number\r\n lastDate: number\r\n lastTime: string | null\r\n lastVolume: number\r\n dataId: string\r\n prevClose: number\r\n afterClose: number\r\n afterChange: number\r\n afterTime: string | null\r\n drawMinutesPerDay: number\r\n marketStartMinutes: number\r\n premarketLengthMinutes: number\r\n aftermarketLengthMinutes: number\r\n aftermarket: boolean\r\n premarket: boolean\r\n hasPatterns: boolean\r\n patterns: Array \r\n patternsMinRange: number\r\n patternsMaxRange: number\r\n relativeVolume: number\r\n isIntraday: boolean\r\n noNewData?: boolean\r\n chartEvents?: ChartEventDataRaw[]\r\n}\r\n\r\ninterface COTData {\r\n [code: string]: ICOT\r\n}\r\n\r\nconst emptyQuote = {\r\n open: [],\r\n high: [],\r\n low: [],\r\n close: [],\r\n volume: [],\r\n date: [],\r\n fetchedAt: -1,\r\n numberOfRefreshChecks: 0,\r\n isFetching: false,\r\n is404: false,\r\n COTs: undefined,\r\n name: undefined,\r\n drawMinutesPerDay: undefined,\r\n marketStartMinutes: undefined,\r\n premarketLengthMinutes: undefined,\r\n aftermarketLengthMinutes: undefined,\r\n patterns: [],\r\n patternsMinRange: undefined,\r\n patternsMaxRange: undefined,\r\n relativeVolume: undefined,\r\n lastOpen: undefined,\r\n lastHigh: undefined,\r\n lastLow: undefined,\r\n lastClose: undefined,\r\n lastVolume: undefined,\r\n dataId: undefined,\r\n lastDate: undefined,\r\n prevClose: undefined,\r\n afterClose: undefined,\r\n afterChange: undefined,\r\n chartEvents: [],\r\n}\r\n\r\ninterface ICacheAvailabilityCheckFunctionsArguments {\r\n quote: Quote\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n}\r\n\r\nconst doesQuoteAndOptionsMatch = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !quote.premarket === !options?.premarket &&\r\n !quote.aftermarket === !options?.aftermarket &&\r\n !quote.hasPatterns === !options?.patterns &&\r\n // if options.events is false we can reuse quote with events\r\n (!options?.events || !!quote.events)\r\n\r\nconst doesQuoteAndFetchParamsMatch = ({\r\n quote,\r\n ticker,\r\n instrument,\r\n timeframe,\r\n}: {\r\n quote: Quote\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n}) => quote.ticker === ticker && quote.instrument === instrument && quote.timeframe === timeframe\r\n\r\n// either we don't care about matching uuid at all, or they have to match\r\nconst isSameOrNoChartUuid = ({ quote, uuid }: { quote: Quote; uuid?: string }) => !uuid || quote.chartUuid === uuid\r\n\r\nconst isCacheAllowed = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !options?.cachePredicate || options.cachePredicate(quote)\r\n\r\nconst isNotEmptyQuote = (quote: Quote) => quote.fetchedAt !== -1 || quote.isFetching\r\n\r\nexport type QuoteGetParams = {\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n abortController?: null | AbortController\r\n shouldUseCache?: boolean\r\n chartUuid?: string\r\n}\r\n\r\nfunction getChartEventsWithId({ ticker, chartEvents }: { ticker: string; chartEvents?: ChartEventDataRaw[] }) {\r\n return (\r\n chartEvents?.map((item) => {\r\n let eventType: ChartEventType\r\n switch (item.eventType) {\r\n case ChartEventDbType.Dividends:\r\n eventType = ChartEventType.Dividends\r\n break\r\n case ChartEventDbType.Split:\r\n eventType = ChartEventType.Split\r\n break\r\n case ChartEventDbType.Earnings:\r\n eventType = ChartEventType.Earnings\r\n break\r\n }\r\n return {\r\n ...item,\r\n elementId: `${ticker.toLowerCase()}-${item.eventType}-${item.dateTimestamp}`,\r\n eventType,\r\n }\r\n }) ?? []\r\n )\r\n}\r\n\r\nclass Quote extends Spine.Model {\r\n static initClass() {\r\n this.configure(\r\n 'Quote',\r\n 'ticker',\r\n 'name',\r\n 'instrument',\r\n 'timeframe',\r\n 'open',\r\n 'high',\r\n 'low',\r\n 'close',\r\n 'date',\r\n 'volume',\r\n 'lastOpen',\r\n 'lastHigh',\r\n 'lastLow',\r\n 'lastClose',\r\n 'lastDate',\r\n 'lastVolume',\r\n 'lastTime',\r\n 'dataId',\r\n 'prevClose',\r\n 'COTs',\r\n 'chartEvents',\r\n 'afterClose',\r\n 'afterChange',\r\n 'afterTime',\r\n 'drawMinutesPerDay',\r\n 'marketStartMinutes',\r\n 'premarketLengthMinutes',\r\n 'aftermarketLengthMinutes',\r\n 'aftermarket',\r\n 'premarket',\r\n 'events',\r\n 'hasPatterns',\r\n 'patterns',\r\n 'patternsMinRange',\r\n 'patternsMaxRange',\r\n 'relativeVolume',\r\n 'fetchedAt',\r\n 'isIntraday',\r\n 'interval',\r\n 'drawDays',\r\n 'barIndex',\r\n 'barToDataIndex',\r\n 'fetchingPromise',\r\n 'isFetching',\r\n 'wasFetchAborted',\r\n 'chartUuid',\r\n 'numberOfRefreshChecks',\r\n 'maxBars',\r\n 'ideaID',\r\n 'is404'\r\n )\r\n }\r\n\r\n static async get({\r\n ticker: tickerRaw,\r\n instrument,\r\n timeframe,\r\n options,\r\n abortController,\r\n shouldUseCache = true,\r\n chartUuid,\r\n }: QuoteGetParams): Promise {\r\n const ticker = tickerRaw.replace('@', '')\r\n const [quote] = shouldUseCache\r\n ? Quote.select(\r\n (q) =>\r\n doesQuoteAndFetchParamsMatch({ quote: q, ticker, instrument, timeframe }) &&\r\n isSameOrNoChartUuid({ quote: q, uuid: chartUuid }) &&\r\n isNotEmptyQuote(q) &&\r\n isCacheAllowed({ quote: q, options }) &&\r\n (q.instrument !== Instrument.Stock ||\r\n Number.isInteger(q.ideaID) ||\r\n doesQuoteAndOptionsMatch({ quote: q, options }))\r\n )\r\n : []\r\n\r\n if (quote) {\r\n if (quote.isFetching) {\r\n await quote.getResolvedFetchingPromise()\r\n } else if (options?.fetchNewDataOnCachedQuote) {\r\n await quote.fetchData({ fetchType: QuoteFetchType.NewerData, abortController })\r\n }\r\n return quote\r\n }\r\n\r\n const newQuote = Quote.create({\r\n ...emptyQuote,\r\n ticker,\r\n timeframe,\r\n instrument,\r\n chartUuid,\r\n maxBars: options?.maxBars,\r\n premarket: !!options?.premarket,\r\n aftermarket: !!options?.aftermarket,\r\n hasPatterns: !!options?.patterns,\r\n events: !!options?.events,\r\n })\r\n\r\n await newQuote.fetchData({ fetchType: QuoteFetchType.Refetch, abortController })\r\n\r\n return newQuote\r\n }\r\n\r\n static async getAll(tickersAndTimeframes: Array<{ ticker: string; instrument: Instrument; timeframe: TIMEFRAME }>) {\r\n // TODO: fetch in 1 request\r\n if (tickersAndTimeframes.length === 0) {\r\n return {}\r\n }\r\n\r\n try {\r\n await Promise.all(\r\n tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\r\n this.get({ ticker: ticker, instrument, timeframe })\r\n )\r\n )\r\n const data = tickersAndTimeframes.reduce(\r\n (accumulator, currentValue) => ({\r\n ...accumulator,\r\n [currentValue.ticker]: Quote.select(\r\n (q: Quote) =>\r\n q.ticker === currentValue.ticker &&\r\n q.instrument === currentValue.instrument &&\r\n q.timeframe === currentValue.timeframe\r\n )[0],\r\n }),\r\n {}\r\n )\r\n return data\r\n } catch (err) {\r\n // TODO: handle somehow\r\n }\r\n }\r\n\r\n declare ticker: string\r\n declare name: string\r\n declare instrument: Instrument\r\n declare interval: number\r\n declare timeframe: TIMEFRAME\r\n declare open: number[]\r\n declare high: number[]\r\n declare low: number[]\r\n declare close: number[]\r\n declare date: number[]\r\n declare volume: number[]\r\n declare lastOpen: number\r\n declare lastHigh: number\r\n declare lastLow: number\r\n declare lastClose: number\r\n declare lastDate: number\r\n declare lastVolume: number\r\n declare dataId: string\r\n declare prevClose: number\r\n declare COTs: COTData\r\n declare afterClose: number\r\n declare afterChange: number\r\n declare drawMinutesPerDay: number\r\n declare marketStartMinutes: number\r\n declare premarketLengthMinutes: number\r\n declare aftermarketLengthMinutes: number\r\n declare hasPatterns: boolean\r\n declare patterns: Array\r\n declare patternsMinRange: number\r\n declare patternsMaxRange: number\r\n declare relativeVolume: number\r\n declare isIntraday: boolean\r\n declare drawDays?: number\r\n declare barIndex: number[]\r\n /**\r\n * Array of length the same as number of bars\r\n *\r\n * If there's a gap and a bar index has no corresponding data index,\r\n * the last data index is used (or 0 if there's no last data index)\r\n *\r\n * @type {number[]}\r\n */\r\n declare barToDataIndex: number[]\r\n declare chartUuid?: string\r\n declare aftermarket: boolean\r\n declare premarket: boolean\r\n declare fetchedAt: number\r\n declare numberOfRefreshChecks: number\r\n declare isFetching: boolean\r\n declare fetchingPromise?: Promise \r\n declare wasFetchAborted: boolean\r\n declare maxBars?: number\r\n declare ideaID?: number\r\n declare is404?: boolean\r\n declare chartEvents: Array \r\n declare events?: boolean\r\n\r\n async fetchRequest({\r\n abortController,\r\n options = { type: QuoteFetchTypeUrlOption.New },\r\n }: {\r\n abortController?: null | AbortController\r\n options?: QuoteUrlOptions\r\n }) {\r\n let data: DataResponse | null = null\r\n let is404 = false\r\n let wasFetchAborted = false\r\n\r\n const fetchingPromise = fetchApi ({\r\n location: this.getUrl(options),\r\n throwOnStatusCodes: [404],\r\n abortController,\r\n })\r\n\r\n this.updateAttributes({\r\n isFetching: true,\r\n fetchingPromise,\r\n })\r\n\r\n try {\r\n data = await fetchingPromise\r\n } catch (err) {\r\n if (getIsAbortError(err as Error)) {\r\n wasFetchAborted = true\r\n } else if (process.env.IS_E2E_TESTING) {\r\n throw new Error('Quote fetch error', { cause: err })\r\n }\r\n is404 = err instanceof NotFoundError\r\n // Ignore network/notfound errors\r\n }\r\n\r\n const shouldUseEmptyQuote = !data && !wasFetchAborted && options.type === QuoteFetchTypeUrlOption.New\r\n\r\n if (process.env.IS_E2E_TESTING && shouldUseEmptyQuote) {\r\n throw new Error('Quote fetch new fail', { cause: { options, is404, wasFetchAborted, data } })\r\n }\r\n\r\n this.updateAttributes({\r\n ...(shouldUseEmptyQuote ? emptyQuote : {}),\r\n is404,\r\n wasFetchAborted,\r\n isFetching: false,\r\n })\r\n\r\n return data\r\n }\r\n\r\n async isPossibleToFetchSequentialData({\r\n abortController,\r\n }: {\r\n abortController?: null | AbortController\r\n } = {}) {\r\n const data = await this.fetchRequest({ abortController })\r\n if (data && data.date.length > 0 && this.date.length > 0) {\r\n return this.date[this.date.length - 1] >= data.date[0]\r\n }\r\n return false\r\n }\r\n\r\n async fetchData({\r\n fetchType,\r\n abortController,\r\n }: {\r\n fetchType: QuoteFetchType\r\n abortController?: null | AbortController\r\n }) {\r\n let options: QuoteUrlOptions\r\n if (fetchType === QuoteFetchType.Refetch) {\r\n options = { type: QuoteFetchTypeUrlOption.New }\r\n } else if (fetchType === QuoteFetchType.NewerData) {\r\n options = { type: QuoteFetchTypeUrlOption.Newer }\r\n if ((this.numberOfRefreshChecks ?? 0) < quoteRefreshChecksBeforeFullRefresh) {\r\n options.dataId = this.dataId\r\n }\r\n } else {\r\n return\r\n }\r\n if (this.instrument === Instrument.Stock) {\r\n options.events = this.events == null ? true : this.events\r\n }\r\n\r\n const data = await this.fetchRequest({ abortController, options })\r\n\r\n if (!data || data.noNewData === true) {\r\n this.updateAttributes({\r\n numberOfRefreshChecks: (this.numberOfRefreshChecks ?? 0) + 1,\r\n })\r\n return\r\n }\r\n if (this.timeframe !== data.timeframe || this.ticker.toLowerCase() !== data.ticker?.toLowerCase()) {\r\n return\r\n }\r\n\r\n const newQuoteData = {\r\n COTs: data.COTs,\r\n name: data.name,\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: data.volume,\r\n date: data.date,\r\n drawMinutesPerDay: data.drawMinutesPerDay,\r\n marketStartMinutes: data.marketStartMinutes,\r\n premarketLengthMinutes: data.premarketLengthMinutes,\r\n aftermarketLengthMinutes: data.aftermarketLengthMinutes,\r\n patterns: data.patterns ?? [],\r\n patternsMinRange: data.patternsMinRange,\r\n patternsMaxRange: data.patternsMaxRange,\r\n relativeVolume: data.relativeVolume,\r\n lastOpen: data.lastOpen,\r\n lastHigh: data.lastHigh,\r\n lastLow: data.lastLow,\r\n lastClose: data.lastClose,\r\n lastVolume: data.lastVolume,\r\n dataId: data.dataId,\r\n lastDate: data.lastDate,\r\n lastTime: data.lastTime,\r\n prevClose: data.prevClose,\r\n afterClose: data.afterClose,\r\n afterChange: data.afterChange,\r\n afterTime: data.afterTime,\r\n numberOfRefreshChecks: 0,\r\n chartEvents: data.chartEvents ?? [],\r\n fetchedAt: Date.now(),\r\n }\r\n\r\n if (\r\n !(\r\n fetchType === QuoteFetchType.Refetch ||\r\n [Instrument.Futures, Instrument.Forex, Instrument.Crypto].includes(this.instrument)\r\n )\r\n ) {\r\n /*\r\n * Merges current and new data taking date as index\r\n */\r\n let AIndex = 0\r\n let BIndex = 0\r\n let mergeIndex = -1\r\n while (AIndex < this.date.length || BIndex < data.date.length) {\r\n const ADate = this.date[AIndex]\r\n const BDate = data.date[BIndex]\r\n if (BDate === undefined) {\r\n break\r\n } else if (ADate === BDate) {\r\n // Same date, update OHLCV\r\n this.open[AIndex] = data.open[BIndex]\r\n this.high[AIndex] = data.high[BIndex]\r\n this.low[AIndex] = data.low[BIndex]\r\n this.close[AIndex] = data.close[BIndex]\r\n this.volume[AIndex] = data.volume[BIndex]\r\n AIndex++\r\n BIndex++\r\n } else if (ADate > BDate || ADate === undefined) {\r\n // New bar for a date not yet in our dataset\r\n // If weekly or monthly timeframe & wasn't merged on AIndex\r\n if (mergeIndex === -1 && [TIMEFRAME.w, TIMEFRAME.m].includes(this.timeframe)) {\r\n const prevAIndex = AIndex - 1\r\n const prevDate = dateFromUnixTimestamp(this.date[prevAIndex])\r\n const newDate = dateFromUnixTimestamp(data.date[BIndex])\r\n // If merge bar for weekly is sameWeek or for monthly is sameMonth perform merge on AIndex\r\n if (\r\n (TIMEFRAME.w === this.timeframe && isSameWeek(prevDate, newDate, { weekStartsOn: 1 })) ||\r\n (TIMEFRAME.m === this.timeframe && isSameMonth(prevDate, newDate))\r\n ) {\r\n this.date[prevAIndex] = data.date[BIndex]\r\n this.open[prevAIndex] = data.open[BIndex]\r\n this.high[prevAIndex] = data.high[BIndex]\r\n this.low[prevAIndex] = data.low[BIndex]\r\n this.close[prevAIndex] = data.close[BIndex]\r\n this.volume[prevAIndex] = data.volume[BIndex]\r\n mergeIndex = prevAIndex\r\n // Incrementing BIndex only because we're mergin arrays on AIndex\r\n BIndex++\r\n continue\r\n }\r\n }\r\n this.date.splice(AIndex, 0, data.date[BIndex])\r\n this.open.splice(AIndex, 0, data.open[BIndex])\r\n this.high.splice(AIndex, 0, data.high[BIndex])\r\n this.low.splice(AIndex, 0, data.low[BIndex])\r\n this.close.splice(AIndex, 0, data.close[BIndex])\r\n this.volume.splice(AIndex, 0, data.volume[BIndex])\r\n // Incrementing AIndex because we're changing the array in-place\r\n AIndex++\r\n BIndex++\r\n } else if (ADate < BDate) {\r\n AIndex++\r\n } else {\r\n console.warn('fetchNewerData merge warning')\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData merge warning', {\r\n extra: {\r\n thisDateLength: this.date.length,\r\n dataDateLength: data.date.length,\r\n AIndex,\r\n BIndex,\r\n ADate,\r\n BDate,\r\n },\r\n })\r\n }\r\n }\r\n\r\n newQuoteData.date = this.date\r\n newQuoteData.open = this.open\r\n newQuoteData.high = this.high\r\n newQuoteData.low = this.low\r\n newQuoteData.close = this.close\r\n newQuoteData.volume = this.volume\r\n }\r\n\r\n const hasUpdatedSuccessfully = this.updateAttributes(newQuoteData)\r\n // https://github.com/finvizhq/charts/issues/510\r\n if (!hasUpdatedSuccessfully) {\r\n // attempt to find if this.model.quote() => null is comming from this.save() validation fail\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData save() validation failed', { extra: this })\r\n }\r\n if (!this) {\r\n // or this somehow became null / falsy\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData this is falsy', { extra: this })\r\n }\r\n this.trigger(fetchType, this, fetchType)\r\n }\r\n\r\n async getResolvedFetchingPromise() {\r\n try {\r\n return await this.fetchingPromise\r\n } catch {\r\n // do nothing\r\n }\r\n }\r\n\r\n fetchOlderData() {\r\n return // not yet implemented\r\n // TODO cancel previous request\r\n }\r\n\r\n load(atts: ObjectHash) {\r\n super.load(atts)\r\n const { fetchedAt = 0 } = atts\r\n const { cachedAt } = (getCachedQuote({ cid: this.cid }) as { cachedAt: number } | null) || {}\r\n if (this.timeframe && cachedAt !== fetchedAt) {\r\n setCachedQuote({ cid: this.cid, key: 'cachedAt', value: fetchedAt, fetchedAt })\r\n this.isIntraday = [\r\n TIMEFRAME.i1,\r\n TIMEFRAME.i2,\r\n TIMEFRAME.i3,\r\n TIMEFRAME.i5,\r\n TIMEFRAME.i10,\r\n TIMEFRAME.i15,\r\n TIMEFRAME.i30,\r\n TIMEFRAME.h,\r\n TIMEFRAME.h2,\r\n TIMEFRAME.h4,\r\n ].includes(this.timeframe)\r\n this.interval = this.isIntraday\r\n ? IntradayTimeframeInterval[this.timeframe as keyof typeof IntradayTimeframeInterval]\r\n : 0\r\n this.drawDays = this.getDrawDays()\r\n this.barIndex = this.getBarIndexes()\r\n this.patterns = this.patterns ?? []\r\n this.barToDataIndex = this.barIndex.flatMap((barIndex, index) => {\r\n const lastIndex = this.barIndex[index - 1] ?? -1\r\n return [...Array.from({ length: barIndex - lastIndex - 1 }).fill(Math.max(0, index - 1)), index] as number[]\r\n })\r\n }\r\n if (this.timeframe && this.ticker) {\r\n this.chartEvents = getChartEventsWithId({\r\n ticker: this.ticker,\r\n chartEvents: this.chartEvents as unknown as ChartEventDataRaw[],\r\n })\r\n }\r\n return this\r\n }\r\n\r\n destroy(options?: ObjectHash) {\r\n super.destroy(options)\r\n deleteCachedQuote({ cid: this.cid })\r\n return this\r\n }\r\n\r\n getDrawDays() {\r\n if (this.instrument !== Instrument.Stock) {\r\n return Infinity\r\n }\r\n switch (this.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n return 10\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n return 15\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getHeikinAshiData() {\r\n const cachedHeikinAshiData = getCachedQuote({ cid: this.cid, key: 'heikinAshiData', fetchedAt: this.fetchedAt })\r\n if (cachedHeikinAshiData) {\r\n return cachedHeikinAshiData as unknown as { open: number[]; close: number[] }\r\n }\r\n\r\n const HAClose = this.open.map((_, i) => (this.open[i] + this.high[i] + this.close[i] + this.low[i]) / 4)\r\n const HAOpen = this.open.reduce(\r\n (acc, open, i) => [...acc, (i === 0 ? open + HAClose[0] : acc[i - 1] + HAClose[i - 1]) / 2],\r\n [] as number[]\r\n )\r\n\r\n const heikAshiData = { open: HAOpen, close: HAClose }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'heikinAshiData', value: heikAshiData, fetchedAt: this.fetchedAt })\r\n\r\n return heikAshiData\r\n }\r\n\r\n getDayToOffset(): ObjectHash {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'dayToOffset', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as ObjectHash \r\n }\r\n const dayToOffset: ObjectHash = {}\r\n let day = 0\r\n let lastDay\r\n for (let i = 0, end = this.date.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n const dateString = dateStringFromDate(date)\r\n if (dateString !== lastDay) {\r\n dayToOffset[dateString] = day\r\n day++\r\n lastDay = dateString\r\n }\r\n }\r\n // for ofscreen renderer we need to add lastDate to have correct dayToOffset because if\r\n // premarket=false in fetch query there isn't other way to distinguish that\r\n if (getIsSSr() && this.lastDate) {\r\n // YYYYMMDD / 20211118 => YYYY-MM-DD\r\n const [yyyy, mm, dd] = [~~(this.lastDate / 10000), ~~(this.lastDate / 100) % 100, this.lastDate % 100]\r\n const lastDate = `${yyyy}-${String(mm).padStart(2, '0')}-${String(dd).padStart(2, '0')}`\r\n\r\n if (lastDay !== lastDate) {\r\n dayToOffset[lastDate] = day\r\n }\r\n }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'dayToOffset', value: dayToOffset, fetchedAt: this.fetchedAt })\r\n return dayToOffset\r\n }\r\n\r\n getDaysInQuote() {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'daysInQuote', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as Date[]\r\n }\r\n const dayToOffset = this.getDayToOffset()\r\n const daysInQuote = Object.keys(dayToOffset)\r\n .map((dateString) => {\r\n const [year, month, day] = dateString.split('-')\r\n return new Date(Number.parseInt(year), Number.parseInt(month) - 1, Number.parseInt(day))\r\n })\r\n .sort((a, b) => a.getTime() - b.getTime())\r\n\r\n setCachedQuote({ cid: this.cid, key: 'daysInQuote', value: daysInQuote, fetchedAt: this.fetchedAt })\r\n return daysInQuote\r\n }\r\n\r\n getBarIndexes() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return Array.from({ length: this.date.length }).map((_, index) => index)\r\n }\r\n\r\n const barIndex = []\r\n const dayToOffset = this.getDayToOffset()\r\n\r\n for (let i = 0; i < this.date.length; i += 1) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n let x = Math.ceil((date.getHours() * 60 + date.getMinutes() - this.marketStartMinutes) / this.interval)\r\n x += dayToOffset[dateStringFromDate(date)] * this.getBarsInDay()! // add days\r\n barIndex[i] = x\r\n }\r\n\r\n return barIndex\r\n }\r\n\r\n getBarIndex(i: number) {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return i\r\n }\r\n return this.barIndex[i]\r\n }\r\n\r\n getBarsInDay() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n return Math.ceil(this.drawMinutesPerDay / this.interval)\r\n }\r\n\r\n getDataIndexByBarIndex(index: number) {\r\n if (this.barIndex) {\r\n for (let i = 0; i < this.barIndex.length; i++) {\r\n if (this.barIndex[i] === index) {\r\n return i\r\n }\r\n }\r\n }\r\n return -1\r\n }\r\n\r\n getDataByBarIndex(key: keyof Quote, index: number) {\r\n const dataIndex = this.getDataIndexByBarIndex(index)\r\n if (dataIndex > -1) {\r\n const quoteData = this[key as keyof Quote]! as number[]\r\n return quoteData[dataIndex] ?? null\r\n }\r\n return null\r\n }\r\n\r\n getDateToIndex() {\r\n const cachedDateToIndex = getCachedQuote({ cid: this.cid, key: 'dateToIndex', fetchedAt: this.fetchedAt })\r\n if (cachedDateToIndex) {\r\n return cachedDateToIndex as unknown as ObjectHash \r\n }\r\n const dateToIndex: ObjectHash = {}\r\n for (let i = 0; i < this.date.length; i++) {\r\n dateToIndex[this.date[i]] = i\r\n }\r\n setCachedQuote({ cid: this.cid, key: 'dateToIndex', value: dateToIndex, fetchedAt: this.fetchedAt })\r\n return dateToIndex\r\n }\r\n\r\n getTimestampFomPositionX(positionX: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getTimestampFromPositionX({\r\n positionX,\r\n quote: this,\r\n })\r\n }\r\n\r\n getPositionXFromTimestamp(timestamp: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getPositionXFromTimestamp({\r\n timestamp,\r\n quote: this,\r\n })\r\n }\r\n\r\n getUrl(options: QuoteUrlOptions) {\r\n const config: UrlOptions = {\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n timeframe: this.timeframe || 'd1',\r\n aftermarket: this.aftermarket,\r\n premarket: this.premarket,\r\n patterns: this.hasPatterns,\r\n maxBars: this.maxBars,\r\n ...options,\r\n }\r\n\r\n const isStock = config.instrument === Instrument.Stock\r\n const isBrowserElite = !getIsSSr() && document.location.host === 'elite.finviz.com'\r\n let domain = isBrowserElite && isStock ? 'https://api.finviz.com' : ''\r\n\r\n if (getIsSSr()) {\r\n domain = process.env.BE_API_URL!\r\n }\r\n\r\n return `${domain}/api/quote.ashx?${queryString.stringify({ rev: Date.now(), ...config })}`\r\n }\r\n\r\n getRawTicker() {\r\n return getRawTickerForInstrument(this.instrument, this.ticker)\r\n }\r\n\r\n clearData() {\r\n this.updateAttributes(emptyQuote)\r\n }\r\n}\r\n\r\nQuote.initClass()\r\n\r\nexport default Quote\r\n","export enum QuoteFetchType {\r\n Refetch = 'refetch',\r\n NewerData = 'newerData',\r\n}\r\n\r\nexport enum QuoteFetchTypeUrlOption {\r\n New = 'new',\r\n Newer = 'newer',\r\n}\r\n\r\nexport interface QuoteUrlOptions {\r\n type: QuoteFetchTypeUrlOption\r\n dataId?: string\r\n events?: boolean\r\n}\r\n","export const largeChartFontSize = {\r\n S: 8,\r\n M: 10,\r\n XXL: 16,\r\n XXXL: 24,\r\n}\r\n","import { Theme } from '../../../types/shared'\r\nimport {\r\n CHART_MARGIN,\r\n FONT_SIZE,\r\n LINE_HEIGHT,\r\n OFFSET,\r\n PADDING,\r\n SETTINGS_HEIGHT,\r\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n TextBaseline,\r\n} from '../../constants/common'\r\nimport {\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n generalColors,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from '../constants'\r\nimport { ISettings } from './interfaces'\r\n\r\nexport const INTERACTIVE_CHART_SETTINGS = (theme: Theme): ISettings => ({\r\n ChartSettings: {\r\n general: {\r\n Colors: {\r\n ...(theme === Theme.light ? chartLightTheme : chartDarkTheme),\r\n [Theme.light]: chartLightTheme,\r\n [Theme.dark]: chartDarkTheme,\r\n },\r\n settingsHeight: SETTINGS_HEIGHT,\r\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.XL,\r\n baseline: TextBaseline.alphabetic,\r\n ticker: {\r\n margin: {\r\n top: 30,\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.XXXL,\r\n style: 'bold',\r\n },\r\n },\r\n ohlc: {\r\n margin: {\r\n top: 30,\r\n left: 30,\r\n right: 30,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n change: {\r\n margin: {\r\n top: 30,\r\n right: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n },\r\n },\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.M,\r\n baseline: TextBaseline.top,\r\n axis: {\r\n margin: {\r\n top: 8,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n overlayLabel: {\r\n labelSpacing: 12,\r\n margin: {\r\n top: -8,\r\n left: 6,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n weight: 'bold',\r\n },\r\n },\r\n timeframe: {\r\n margin: {\r\n top: 0,\r\n left: 28,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n weight: '900',\r\n family: 'Lato, sans-serif',\r\n },\r\n },\r\n volumeAxis: {\r\n margin: {\r\n left: 33,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n },\r\n IndicatorSettings: {\r\n general: {\r\n height: 140,\r\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 2,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.S,\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.S,\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n indicatorLabel: {\r\n labelSpacing: 4,\r\n margin: {\r\n top: OFFSET.S,\r\n left: OFFSET.M,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n lineHeight: LINE_HEIGHT.M,\r\n },\r\n },\r\n },\r\n },\r\n MarketSentimentSettings: {\r\n general: {\r\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: 0,\r\n },\r\n bottom: {\r\n height: 12,\r\n },\r\n left: {\r\n width: 0,\r\n },\r\n right: {\r\n width: 30,\r\n },\r\n },\r\n ColorsSettings: generalColors,\r\n ThumbSettings: {\r\n size: 8,\r\n touchSize: 16,\r\n color: '#ddd',\r\n borderWidth: 1,\r\n borderColor: '#999',\r\n },\r\n ElementSettings: {\r\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\r\n defaultFill: '#1e6dc066',\r\n defaultTransparentFill: '#1e6dc000',\r\n },\r\n})\r\n","import merge from 'lodash.merge'\r\n\r\nimport { ChartConfigChart } from '../../server/chartConfig'\r\nimport { Instrument, ObjectHash, Theme } from '../../types/shared'\r\nimport { SpecificChartFunctionality } from '../constants/common'\r\nimport Utils, { isRedesignedPage } from '../utils'\r\nimport LayoutModel from './chart_layout'\r\nimport { getColorOverwrites } from './chart_settings'\r\nimport { largeChartFontSize } from './chart_settings/constants'\r\nimport { INTERACTIVE_CHART_SETTINGS } from './chart_settings/interactive_chart_settings'\r\nimport { ISettings } from './chart_settings/interfaces'\r\nimport {\r\n IChartThemeColors,\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from './constants'\r\n\r\ninterface Config {\r\n theme: Theme\r\n barMargin?: number\r\n barWidth?: number\r\n border?: number\r\n charts?: ChartConfigChart[]\r\n colorsOverride?: Array \r\n volumeHeight?: number\r\n colors?: ObjectHash , Theme>\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n}\r\n\r\nexport function getSettings(config: Config, chartSettings?: ISettings): ISettings {\r\n const settings = merge({}, chartSettings ?? INTERACTIVE_CHART_SETTINGS(config.theme))\r\n\r\n if (config.barWidth != null) {\r\n settings.ChartSettings.center.barWidth = config.barWidth\r\n settings.IndicatorSettings.center.barWidth = config.barWidth\r\n }\r\n if (config.barMargin != null) {\r\n settings.ChartSettings.center.barMargin = config.barMargin\r\n settings.IndicatorSettings.center.barMargin = config.barMargin\r\n }\r\n if (config.border != null) {\r\n settings.ChartSettings.center.border = config.border\r\n settings.IndicatorSettings.center.border = config.border\r\n }\r\n if (config.colorsOverride) {\r\n settings.ColorsSettings = config.colorsOverride\r\n }\r\n if (config.volumeHeight) {\r\n settings.ChartSettings.center.volumeHeight = config.volumeHeight\r\n }\r\n if (config.colors) {\r\n const settingColors = settings.ChartSettings.general.Colors\r\n settings.ChartSettings.general.Colors = {\r\n ...settingColors,\r\n [Theme.light]: {\r\n ...settingColors[Theme.light],\r\n ...getColorOverwrites({ theme: Theme.light, colors: config.colors }),\r\n },\r\n [Theme.dark]: {\r\n ...settingColors[Theme.dark],\r\n ...getColorOverwrites({ theme: Theme.dark, colors: config.colors }),\r\n },\r\n }\r\n }\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.chartPage && Utils.isMobile()) {\r\n settings.ChartSettings.left.width = 0\r\n settings.ChartSettings.top.ticker.margin.left = settings.ChartSettings.left.overlayLabel.margin.left\r\n settings.IndicatorSettings.left.width = 0\r\n }\r\n if (SpecificChartFunctionality.chartPage === config.specificChartFunctionality || isRedesignedPage(config)) {\r\n settings.ChartSettings.top.height = 10\r\n }\r\n\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const isGroupInstrument = config.charts?.some(({ instrument }) => instrument === Instrument.Group)\r\n if (isGroupInstrument) {\r\n settings.ChartSettings.top.ohlc.margin.top = 4\r\n settings.ChartSettings.top.ticker.margin.top = 0\r\n settings.ChartSettings.top.ticker.font = {\r\n size: largeChartFontSize.XXL,\r\n style: 'bold',\r\n }\r\n settings.ChartSettings.left.timeframe.margin.top = 12\r\n settings.ChartSettings.left.timeframe.font = {\r\n size: largeChartFontSize.S,\r\n style: 'bold',\r\n }\r\n }\r\n }\r\n\r\n return settings\r\n}\r\n\r\nexport function updateSettings(chart_layout: LayoutModel, theme: string): ISettings {\r\n const settings = merge({}, chart_layout.settings)\r\n const isLight = theme === Theme.light\r\n settings.MarketSentimentSettings.general.Colors = isLight ? { ...chartLightTheme } : { ...chartDarkTheme }\r\n settings.IndicatorSettings.general.Colors = isLight ? { ...indicatorLightTheme } : { ...indicatorDarkTheme }\r\n settings.ElementSettings.Colors = isLight ? { ...elementLightTheme } : { ...elementDarkTheme }\r\n\r\n return settings\r\n}\r\n\r\nexport function getChartLayoutSettings(chart_layout: LayoutModel): ISettings {\r\n const settings = chart_layout.settings\r\n\r\n return {\r\n ...settings,\r\n ChartSettings: {\r\n ...settings.ChartSettings,\r\n general: {\r\n ...settings.ChartSettings.general,\r\n Colors: {\r\n ...settings.ChartSettings.general.Colors,\r\n ...settings.ChartSettings.general.Colors[chart_layout.theme],\r\n },\r\n },\r\n },\r\n }\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport ChartLayoutModel from './chart_layout'\r\nimport Element from './element'\r\n\r\nexport const handleRemoveIndicatorPane = ({\r\n paneIndex,\r\n chartLayoutModel,\r\n}: {\r\n paneIndex: number\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const charts = chartLayoutModel.getAllCharts()\r\n charts.forEach((chart) => chart.getAllPanes()[paneIndex].destroyCascade())\r\n}\r\n\r\nexport function getNormalizedZIndex({ index, isBelowZero }: { index: number; isBelowZero: boolean }) {\r\n return (index + 1) * (isBelowZero ? -1 : 1)\r\n}\r\n\r\nexport function rebuildElementZIndexes({\r\n elementsArray,\r\n isBelowZero,\r\n}: {\r\n elementsArray: Element[]\r\n isBelowZero: boolean\r\n}) {\r\n const elements = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n elements.forEach((element, index) => {\r\n const newZIndex = getNormalizedZIndex({ index, isBelowZero })\r\n if (newZIndex !== element.zIndex) {\r\n element.updateAttributes({ zIndex: newZIndex })\r\n }\r\n })\r\n}\r\n\r\nexport function changeElementZIndexes({\r\n elementsArray,\r\n addElement,\r\n oldZIndex,\r\n newZIndex,\r\n isBelowZero = false,\r\n}: {\r\n elementsArray: Element[]\r\n addElement: Element | undefined\r\n oldZIndex: number\r\n newZIndex: number\r\n isBelowZero?: boolean\r\n}) {\r\n const array = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n const elements =\r\n elementsArray.length === 0 && addElement\r\n ? [...array, addElement]\r\n : array\r\n .filter((_, index) => getNormalizedZIndex({ index, isBelowZero }) !== oldZIndex)\r\n .flatMap((el, index) =>\r\n getNormalizedZIndex({ index, isBelowZero }) === newZIndex && addElement ? [addElement, el] : el\r\n )\r\n\r\n // If there are only 2 drawings and we move a drawing from index 1 to index 2 to have to push it to the array because it's the last element and it didn't get into the array in the flatMap above\r\n if (elements.length < Math.abs(newZIndex) && addElement) {\r\n elements.push(addElement)\r\n }\r\n\r\n rebuildElementZIndexes({ elementsArray: isBelowZero ? [...elements].reverse() : elements, isBelowZero })\r\n}\r\n\r\nexport function getRawTickerForInstrument(instrument: Instrument, ticker: string) {\r\n return `${\r\n [Instrument.Crypto, Instrument.Forex, Instrument.Futures].includes(instrument) && !ticker.includes('@') ? '@' : ''\r\n }${ticker}`\r\n}\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n deviations: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n stdDev: number[]\r\n upperBand: number[]\r\n lowerBand: number[]\r\n}\r\n\r\nexport class BbCalculation extends MainCalculation {\r\n static type = OverlayType.Bb\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n sma: [],\r\n stdDev: [],\r\n upperBand: [],\r\n lowerBand: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated ) {\r\n const { period, deviations } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sum = 0\r\n for (let i = 0; i < period; i++) {\r\n sum += close[i]\r\n }\r\n for (let i = period; i < close.length; i++) {\r\n sum = sum - close[i - period] + close[i]\r\n this.calculatedValues.sma[i] = sum / period\r\n\r\n let stdDevSum = 0\r\n for (let j = i - period + 1; j <= i; j++) {\r\n stdDevSum += Math.pow(close[j] - this.calculatedValues.sma[i], 2)\r\n }\r\n this.calculatedValues.stdDev[i] = Math.sqrt(stdDevSum / period)\r\n\r\n this.calculatedValues.upperBand[i] = this.calculatedValues.sma[i] + this.calculatedValues.stdDev[i] * deviations\r\n this.calculatedValues.lowerBand[i] = this.calculatedValues.sma[i] - this.calculatedValues.stdDev[i] * deviations\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChartConfigChartPaneElement,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n RequireByKey,\r\n} from '../../types/shared'\r\nimport Element from '../canvas/element'\r\nimport BaseChart from '../charts/base_chart'\r\nimport { OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { convertColorToHEX, getRGBAValueFromValidColorString } from '../utils/colors'\r\nimport { getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\n\r\nexport interface IOverlayIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nconst DEFAULT_LABEL_COLOR = '#0587cd'\r\n\r\nclass Overlay extends Element implements IOverlayIsValid {\r\n static type = OverlayType.Overlay\r\n static label = 'Overlay'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey ) {\r\n const [periodInt] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare chart: BaseChart\r\n\r\n get type() {\r\n return (this.constructor as typeof Overlay).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Overlay).label\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.color ? convertColorToHEX(this.attrs.color) : DEFAULT_LABEL_COLOR\r\n }\r\n\r\n getFreeColor() {\r\n return this.getChartLayoutSettings().ColorsSettings[0]\r\n // TODO proper implementation - example how this could be done:\r\n // let colorsUsed = []\r\n // for (let overlay of this.chart.overlays) {\r\n // let object = overlay.getModalConfig().inputs\r\n // for (let _ in object) {\r\n // let input = object[_]\r\n // if (input.type === 'color') {\r\n // colorsUsed.push(input.value)\r\n // }\r\n // }\r\n // }\r\n // for (let color of colors) {\r\n // if (!colorsUsed.includes(color)) {\r\n // return color\r\n // }\r\n // }\r\n // return colors[0]\r\n }\r\n\r\n renderContent(_?: RenderingContext2DType) {\r\n this.data = this.model.chart().quote()\r\n }\r\n\r\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n isRendered() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: '',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toConfig() {\r\n const colors: string[] = []\r\n const periods: string[] = []\r\n\r\n this.getModalConfig().inputs.forEach((input: IModalConfigInput) => {\r\n if (input.type === 'color') {\r\n colors.push(getRGBAValueFromValidColorString(input.value.toString()))\r\n } else {\r\n periods.push(input.value.toString())\r\n }\r\n })\r\n\r\n return { type: this.type, period: periods.join(','), color: colors.join('|') }\r\n }\r\n}\r\n\r\nexport default Overlay\r\n","import { ChartConfigChartPaneElement, RequireByKey, Theme } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { BbCalculation } from '../indicator-calculation/bb'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\nconst BB_COLORS = {\r\n [Theme.light]: {\r\n TOP: '#D386DF',\r\n BOTTOM: '#69C1EA',\r\n MIDDLE: '#CFD2F2',\r\n },\r\n [Theme.dark]: {\r\n TOP: '#D38BFB',\r\n BOTTOM: '#57AEFB',\r\n MIDDLE: '#E1B6FC',\r\n },\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Deviations: 2.0,\r\n}\r\n\r\ninterface Attrs {\r\n period: number | string\r\n deviations: number\r\n topColor?: string\r\n bottomColor?: string\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const deviations = parseFloat(values[1]) || DEFAULT_PARAMETERS.Deviations\r\n\r\n return [period, deviations]\r\n}\r\n\r\nclass BollingerBands extends Overlay {\r\n static type = OverlayType.Bb\r\n static label = 'Bollinger Bands'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey ) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, deviations] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.deviations = deviations\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n const { leftOffset, width } = this.model.chart()\r\n const [top, bottom] = this.model.scale.y.domain()\r\n const scaledTop = this.fy(top)\r\n const scaledBottom = this.fy(bottom)\r\n const { close } = this.data\r\n const period = Math.min(this.attrs.period, close.length - 1)\r\n\r\n let firstBarToRender: number | undefined\r\n let lastBarToRender = 0\r\n\r\n // middle line && find first & last bar to render\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', BB_COLORS[theme].MIDDLE)\r\n\r\n const bbCalculation = new BbCalculation({\r\n quote: this.data,\r\n options: {\r\n period,\r\n deviations: this.attrs.deviations,\r\n },\r\n })\r\n\r\n bbCalculation.calculate(({ sma }, dataIndex) => {\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = dataIndex\r\n\r\n context.lineTo(this.fx(dataIndex), Math.round(this.fy(sma[dataIndex])))\r\n\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n lastBarToRender = dataIndex\r\n })\r\n\r\n if (firstBarToRender === undefined) return\r\n context.stroke()\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n\r\n // top line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledTop)\r\n context.set('strokeStyle', BB_COLORS[theme].TOP)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.upperBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledTop)\r\n context.fill()\r\n\r\n // bottom line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledBottom)\r\n context.set('strokeStyle', BB_COLORS[theme].BOTTOM)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledBottom)\r\n context.fill()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const deviations = {\r\n type: 'number',\r\n label: 'Deviations',\r\n name: 'deviations',\r\n value: this.attrs.deviations ?? DEFAULT_PARAMETERS.Deviations,\r\n required: true,\r\n min: 0.1,\r\n max: 999,\r\n step: 0.1,\r\n }\r\n const topColor = {\r\n type: 'color',\r\n label: 'Top Color',\r\n name: 'topColor',\r\n value: this.attrs.topColor ?? this.getFreeColor(),\r\n }\r\n const bottomColor = {\r\n type: 'color',\r\n label: 'Bottom Color',\r\n name: 'bottomColor',\r\n value: this.attrs.bottomColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, deviations, topColor, bottomColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n deviations: `${deviations.label} must be a number between ${deviations.min} and ${deviations.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'deviations':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'topColor':\r\n case 'bottomColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n return this.attrs.topColor || BB_COLORS[theme].TOP\r\n }\r\n\r\n toString() {\r\n return `BB ${this.attrs.period},${this.attrs.deviations}`\r\n }\r\n}\r\n\r\nBollingerBands.prototype.defaults = { topColor: '#69c1ea', bottomColor: '#d386df' }\r\n\r\nexport default BollingerBands\r\n","import { OverlayType } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n channelStrokeColor: string\r\n channelFillColor: string\r\n medianBandColor: string\r\n}\r\n\r\nconst DEFAULT_PERIOD = 20\r\n\r\nconst COLORS = {\r\n ChannelStroke: '#69c1ea',\r\n ChannelFill: '#69C1EA12',\r\n MedianBandStroke: '#ffa75f',\r\n}\r\n\r\nclass DonchianChannels extends Overlay {\r\n static type = OverlayType.Dch\r\n static label = 'Donchian Channels'\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period } = this.attrs\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const medianBand: number[] = []\r\n let firstBarToRender = -1\r\n let lastBarToRender = 0\r\n if (this.data.close.length === undefined) {\r\n return\r\n }\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', COLORS.ChannelStroke)\r\n context.set('fillStyle', COLORS.ChannelFill)\r\n\r\n //upper band + clip\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n firstBarToRender = firstBarToRender === -1 ? i : firstBarToRender\r\n upperBand[i] = utils.max(this.data.high.slice(Math.max(0, i - period), i + 1))\r\n lowerBand[i] = utils.min(this.data.low.slice(Math.max(0, i - period), i + 1))\r\n medianBand[i] = (upperBand[i] + lowerBand[i]) / 2\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n },\r\n })\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // lower band + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // median band\r\n context.set('strokeStyle', COLORS.MedianBandStroke)\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(medianBand[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PERIOD,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const strokeColor = {\r\n type: 'color',\r\n label: 'Channels Stroke Color',\r\n name: 'strokeColor',\r\n value: this.attrs.channelStrokeColor ?? this.getFreeColor(),\r\n }\r\n const fillColor = {\r\n type: 'color',\r\n label: 'Channels Fill Color',\r\n name: 'fillColor',\r\n value: this.attrs.channelFillColor ?? this.getFreeColor(),\r\n }\r\n const medianBandColor = {\r\n type: 'color',\r\n label: 'Median Band Color',\r\n name: 'medianBandColor',\r\n value: this.attrs.medianBandColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, medianBandColor, strokeColor, fillColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'medianBandColor':\r\n case 'strokeColor':\r\n case 'fillColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.medianBandColor\r\n }\r\n\r\n toString() {\r\n return `Donchian ${this.attrs.period}`\r\n }\r\n}\r\n\r\nDonchianChannels.prototype.defaults = {\r\n medianBandColor: COLORS.MedianBandStroke,\r\n channelStrokeColor: COLORS.ChannelStroke,\r\n channelFillColor: COLORS.ChannelFill,\r\n}\r\n\r\nexport default DonchianChannels\r\n","import { OverlayType } from '../constants/common'\r\nimport { EMACalculation } from '../indicator-calculation/ema'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n deviations: number\r\n color: string\r\n}\r\n\r\nclass EMA extends Overlay {\r\n static type = OverlayType.Ema\r\n static label = 'Exponential Moving Average'\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n const emaCalculation = new EMACalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.attrs.period,\r\n },\r\n })\r\n emaCalculation.calculate(({ ema }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(ema[dataIndex])))\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, color],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `EMA ${this.attrs.period}`\r\n }\r\n}\r\n\r\nEMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default EMA\r\n","import { OverlayType } from '../constants/common'\r\nimport EMA from './ema'\r\n\r\nclass EMA2 extends EMA {\r\n static type = OverlayType.Ema2\r\n}\r\n\r\nEMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default EMA2\r\n","import { OverlayType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport { getBarWidthWithMargin } from '../utils/chart'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n lowColor: string\r\n highColor: string\r\n}\r\n\r\nclass HighLow extends Overlay {\r\n static type = OverlayType.Hilo\r\n static label = 'High/Low'\r\n\r\n constructor(values: Partial , model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n }\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const chartModel = this.model.chart()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const halfWidth = barWidth / 2\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n context.translate(0.5, 0.5)\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.highColor)\r\n let prevHigh = -1\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < -10) {\r\n prevHigh = highestHigh\r\n continue\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n\r\n const diff = this.data.barIndex[i] - this.data.barIndex[lastBarToRender]\r\n if (diff > 1 && prevHigh !== highestHigh && prevHigh > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevHigh)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(highestHigh)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(highestHigh)))\r\n\r\n prevHigh = highestHigh\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n if (firstBarToRender === undefined) return\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender) + halfWidth, 0)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, 0)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.lowColor)\r\n let prevLow = -1\r\n let prevBar = firstBarToRender\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n let lowestLow = this.data.low[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n const diff = this.data.barIndex[i] - this.data.barIndex[prevBar]\r\n if (diff > 1 && prevLow !== lowestLow && prevLow > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevLow)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(lowestLow)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(lowestLow)))\r\n\r\n prevLow = lowestLow\r\n prevBar = i\r\n }\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, context.canvas.height)\r\n context.fill()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 50,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const highColor = {\r\n type: 'color',\r\n label: 'High Color',\r\n name: 'highColor',\r\n value: this.attrs.highColor ?? this.getFreeColor(),\r\n }\r\n const lowColor = {\r\n type: 'color',\r\n label: 'Low Color',\r\n name: 'lowColor',\r\n value: this.attrs.lowColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, highColor, lowColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'highColor':\r\n case 'lowColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.highColor\r\n }\r\n\r\n toString() {\r\n return `HILO ${this.attrs.period}`\r\n }\r\n}\r\n\r\nHighLow.prototype.defaults = {\r\n lowColor: '#69c1ea',\r\n highColor: '#d386df',\r\n}\r\n\r\nexport default HighLow\r\n","import { OverlayType } from '../constants/common'\r\nimport { isPositiveFloat } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n price: number\r\n color: string\r\n}\r\n\r\nclass HorizontalLine extends Overlay {\r\n static type = OverlayType.Hline\r\n static label = 'Horizontal Line'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && this.attrs.price === undefined) {\r\n this.attrs.price = parseFloat(this.attrs.period)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const y = Math.round(this.fy(this.attrs.price))\r\n context.set('strokeStyle', this.attrs.color)\r\n context.translate(0, 0.5)\r\n context.beginPath()\r\n context.moveTo(-this.model.chart().leftOffset, y)\r\n context.lineTo(-this.model.chart().leftOffset + this.model.chart().width, y)\r\n context.stroke()\r\n context.translate(0, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const price = {\r\n type: 'number',\r\n label: 'Price',\r\n name: 'price',\r\n value: this.attrs.price || this.model?.scale?.y?.domain().reduce((a: number, b: number) => a + b, 0) / 2,\r\n required: true,\r\n step: 0.1,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [price, color],\r\n inputsErrorMessages: {\r\n price: `${price.label} must be number`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'price':\r\n return isPositiveFloat(this.attrs[key])\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `HL ${this.attrs.price}`\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.defaults = { color: '#0587cd' }\r\n\r\nexport default HorizontalLine\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period?: string\r\n conversion: number\r\n base: number\r\n spanB: number\r\n spanAStrokeColor: string\r\n spanAFillColor: string\r\n spanBStrokeColor: string\r\n spanBFillColor: string\r\n conversionLineColor: string\r\n baseLineColor: string\r\n laggingSpanColor: string\r\n}\r\n\r\nconst COLORS = {\r\n SpanA: {\r\n Stroke: '#009600',\r\n Fill: '#00960022',\r\n },\r\n SpanB: {\r\n Stroke: '#C80000',\r\n Fill: '#C8000022',\r\n },\r\n ConversionLine: '#69C1EA',\r\n BaseLine: '#E54040',\r\n LaggingSpan: '#FFA75F',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Conversion: 9,\r\n Base: 26,\r\n SpanB: 52,\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const [conversion = DEFAULT_PARAMETERS.Conversion, base = DEFAULT_PARAMETERS.Base, spanB = DEFAULT_PARAMETERS.SpanB] =\r\n getParsedIntegersFromPeriodString(period)\r\n return [conversion, base, spanB]\r\n}\r\n\r\nclass IchimokuCloud extends Overlay {\r\n static type = OverlayType.Ic\r\n static label = 'Ichimoku Cloud'\r\n static renderFull = false\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey ) {\r\n return Math.max(...parsePeriod(period))\r\n }\r\n\r\n get renderFull() {\r\n return (this.constructor as typeof IchimokuCloud).renderFull\r\n }\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.conversion === undefined || this.attrs.base === undefined || this.attrs.spanB === undefined)\r\n ) {\r\n const [conversion, base, spanB] = parsePeriod(this.attrs.period)\r\n this.attrs.conversion = conversion\r\n this.attrs.base = base\r\n this.attrs.spanB = spanB\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { high, low, close } = this.data\r\n\r\n const {\r\n conversion,\r\n base,\r\n spanB,\r\n spanAFillColor,\r\n spanAStrokeColor,\r\n spanBFillColor,\r\n spanBStrokeColor,\r\n baseLineColor,\r\n conversionLineColor,\r\n laggingSpanColor,\r\n } = this.attrs\r\n\r\n const conversionLine: number[] = []\r\n const baseLine: number[] = []\r\n const senkouSpanA: number[] = []\r\n const senkouSpanB: number[] = []\r\n const conversionStartIndex = conversion - 1\r\n const baseStartIndex = base - 1\r\n const spanBIndex = spanB - 1\r\n const start = Math.min(baseStartIndex, conversionStartIndex)\r\n const end = close.length + baseStartIndex\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n // Calculation\r\n for (let i = start; i < end; i++) {\r\n if (i >= conversionStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - conversionStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - conversionStartIndex, i + 1))\r\n conversionLine[i] = (highestHi + lowestLo) / 2\r\n }\r\n\r\n if (i >= baseStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - baseStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - baseStartIndex, i + 1))\r\n baseLine[i] = (highestHi + lowestLo) / 2\r\n\r\n senkouSpanA[i + baseStartIndex] = (baseLine[i] + conversionLine[i]) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n\r\n if (i >= spanBIndex) {\r\n const highestHi = Math.max(...high.slice(i - spanBIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - spanBIndex, i + 1))\r\n senkouSpanB[i + baseStartIndex] = (highestHi + lowestLo) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n }\r\n\r\n let lastSpanAX = 0\r\n let lastSpanBX = 0\r\n const cloudStartingX = this.fx(spanBIndex + baseStartIndex)\r\n\r\n context.set('lineWidth', 1)\r\n context.translate(0.5, 0.5)\r\n context.save()\r\n // 1. Senkou Span A\r\n // 1.1 Stroke\r\n context.set('strokeStyle', spanAStrokeColor)\r\n context.set('fillStyle', spanAFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n fxOverride: this.fx,\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n lastSpanAX = x\r\n },\r\n })\r\n context.stroke()\r\n // 1.2 Clipping area\r\n context.lineTo(lastSpanAX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 1.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n fxOverride: this.fx,\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n lastSpanBX = x\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n\r\n // 2. Senkou Span B\r\n // 2.1 Stroke\r\n context.save()\r\n context.set('strokeStyle', spanBStrokeColor)\r\n context.set('fillStyle', spanBFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n fxOverride: this.fx,\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n },\r\n })\r\n context.stroke()\r\n // 2.2 Clipping area\r\n context.lineTo(lastSpanBX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 2.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n fxOverride: this.fx,\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n context.translate(-0.5, -0.5)\r\n\r\n if (this.renderFull) {\r\n // conversion line\r\n context.set('strokeStyle', conversionLineColor)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n fxOverride: this.fx,\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(conversionLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // base line\r\n context.set('strokeStyle', baseLineColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n fxOverride: this.fx,\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(baseLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // lagging span\r\n context.set('strokeStyle', laggingSpanColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n fxOverride: (x: number) => this.fx(x - base),\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.data.close[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const conversion = {\r\n type: 'number',\r\n label: 'Conversion Line',\r\n name: 'conversion',\r\n value: this.attrs.conversion ?? DEFAULT_PARAMETERS.Conversion,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const base = {\r\n type: 'number',\r\n label: 'Base Line Length',\r\n name: 'base',\r\n value: this.attrs.base ?? DEFAULT_PARAMETERS.Base,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const spanB = {\r\n type: 'number',\r\n label: 'Leading Span B Length',\r\n name: 'spanB',\r\n value: this.attrs.spanB ?? DEFAULT_PARAMETERS.SpanB,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const spanAStrokeColor = {\r\n type: 'color',\r\n label: 'Span A Stroke Color',\r\n name: 'spanAStrokeColor',\r\n value: this.attrs.spanAStrokeColor ?? this.getFreeColor(),\r\n }\r\n const spanAFillColor = {\r\n type: 'color',\r\n label: 'Span A Fill Color',\r\n name: 'spanAFillColor',\r\n value: this.attrs.spanAFillColor ?? this.getFreeColor(),\r\n }\r\n const spanBStrokeColor = {\r\n type: 'color',\r\n label: 'Span B Stroke Color',\r\n name: 'spanBStrokeColor',\r\n value: this.attrs.spanBStrokeColor ?? this.getFreeColor(),\r\n }\r\n const spanBFillColor = {\r\n type: 'color',\r\n label: 'Span B Fill Color',\r\n name: 'spanBFillColor',\r\n value: this.attrs.spanBFillColor ?? this.getFreeColor(),\r\n }\r\n const conversionLineColor = {\r\n type: 'color',\r\n label: 'Conversion Line Color',\r\n name: 'conversionLineColor',\r\n value: this.attrs.conversionLineColor ?? this.getFreeColor(),\r\n }\r\n const baseLineColor = {\r\n type: 'color',\r\n label: 'Base Line Color',\r\n name: 'baseLineColor',\r\n value: this.attrs.baseLineColor ?? this.getFreeColor(),\r\n }\r\n const laggingSpanColor = {\r\n type: 'color',\r\n label: 'Lagging Span Color',\r\n name: 'laggingSpanColor',\r\n value: this.attrs.laggingSpanColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [\r\n conversion,\r\n base,\r\n spanB,\r\n spanAStrokeColor,\r\n spanAFillColor,\r\n spanBStrokeColor,\r\n spanBFillColor,\r\n conversionLineColor,\r\n baseLineColor,\r\n laggingSpanColor,\r\n ],\r\n inputsErrorMessages: {\r\n conversion: `${conversion.label} must be a whole number between ${conversion.min} and ${conversion.max}`,\r\n base: `${base.label} must be a whole number between ${base.min} and ${base.max}`,\r\n spanB: `${spanB.label} must be a whole number between ${spanB.min} and ${spanB.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'conversion':\r\n case 'base':\r\n case 'spanB':\r\n case 'lagging':\r\n return this.getIsNumberInputValid({ key })\r\n case 'spanAStrokeColor':\r\n case 'spanAFillColor':\r\n case 'spanBStrokeColor':\r\n case 'spanBFillColor':\r\n case 'conversionLineColor':\r\n case 'baseLineColor':\r\n case 'laggingSpanColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.spanAStrokeColor\r\n }\r\n\r\n toString() {\r\n return `Ichimoku ${this.attrs.conversion},${this.attrs.base},${this.attrs.spanB}`\r\n }\r\n}\r\n\r\nIchimokuCloud.prototype.defaults = {\r\n spanAStrokeColor: COLORS.SpanA.Stroke,\r\n spanAFillColor: COLORS.SpanA.Fill,\r\n spanBStrokeColor: COLORS.SpanB.Stroke,\r\n spanBFillColor: COLORS.SpanB.Fill,\r\n conversionLineColor: COLORS.ConversionLine,\r\n baseLineColor: COLORS.BaseLine,\r\n laggingSpanColor: COLORS.LaggingSpan,\r\n}\r\n\r\nexport default IchimokuCloud\r\n","import { OverlayType } from '../constants/common'\r\nimport IchimokuCloud from './ic'\r\n\r\nclass IchimokuCloudFull extends IchimokuCloud {\r\n static type = OverlayType.Icf\r\n static label = 'Ichimoku Cloud (Full)'\r\n static renderFull = true\r\n}\r\n\r\nexport default IchimokuCloudFull\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { ExponentialMovingAverage } from '../indicator-calculation/ema'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period?: string\r\n emaPeriod: number\r\n multiplier: number\r\n atrPeriod: number\r\n strokeColor: string\r\n fillColor: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n emaPeriod: 20,\r\n multiplier: 2.0,\r\n atrPeriod: 10,\r\n}\r\n\r\nconst COLORS = {\r\n Stroke: '#69C1EA',\r\n Fill: '#69C1EA33',\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const values = period.split(',')\r\n const emaPeriod = parseInt(values[0])\r\n const multiplier = parseFloat(values[1])\r\n const atrPeriod = parseInt(values[2])\r\n\r\n return [emaPeriod, multiplier, atrPeriod]\r\n}\r\n\r\nclass KeltnerChannel extends Overlay {\r\n static type = OverlayType.Kch\r\n static label = 'Keltner Channel'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey ) {\r\n return Math.max(...parsePeriod(period)) * 2\r\n }\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.emaPeriod === undefined || this.attrs.multiplier === undefined || this.attrs.atrPeriod === undefined)\r\n ) {\r\n const [emaPeriod, multiplier, atrPeriod] = parsePeriod(this.attrs.period)\r\n this.attrs.emaPeriod = emaPeriod\r\n this.attrs.multiplier = multiplier\r\n this.attrs.atrPeriod = atrPeriod\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { emaPeriod, multiplier, atrPeriod, strokeColor, fillColor } = this.attrs\r\n const ema = new ExponentialMovingAverage(emaPeriod)\r\n const atr = new AverageTrueRange(atrPeriod)\r\n const middleLine: number[] = []\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const start = Math.max(emaPeriod, atrPeriod)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', strokeColor)\r\n context.set('fillStyle', fillColor)\r\n\r\n //top line + clip\r\n context.beginPath()\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n ema.add(this.data.close[i])\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n if (i < start) {\r\n continue\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n middleLine[i] = ema.value\r\n upperBand[i] = ema.value + multiplier * atr.value\r\n lowerBand[i] = ema.value - multiplier * atr.value\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n }\r\n if (firstBarToRender === undefined) {\r\n context.restore()\r\n return\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // bottom line + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // middle line\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(middleLine[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const emaPeriod = {\r\n type: 'number',\r\n label: 'EMA Period',\r\n name: 'emaPeriod',\r\n value: this.attrs.emaPeriod ?? DEFAULT_PARAMETERS.emaPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const multiplier = {\r\n type: 'number',\r\n label: 'Multiplier',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n }\r\n\r\n const atrPeriod = {\r\n type: 'number',\r\n label: 'ATR Period',\r\n name: 'atrPeriod',\r\n value: this.attrs.atrPeriod ?? DEFAULT_PARAMETERS.atrPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const strokeColor = {\r\n type: 'color',\r\n label: 'Stroke Color',\r\n name: 'strokeColor',\r\n value: this.attrs.strokeColor ?? this.getFreeColor(),\r\n }\r\n const fillColor = {\r\n type: 'color',\r\n label: 'Fill Color',\r\n name: 'fillColor',\r\n value: this.attrs.fillColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [emaPeriod, multiplier, atrPeriod, strokeColor, fillColor],\r\n inputsErrorMessages: {\r\n emaPeriod: `${emaPeriod.label} must be a whole number between ${emaPeriod.min} and ${emaPeriod.max}`,\r\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\r\n atrPeriod: `${atrPeriod.label} must be a whole number between ${atrPeriod.min} and ${atrPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'emaPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'atrPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'strokeColor':\r\n case 'fillColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.strokeColor\r\n }\r\n\r\n toString() {\r\n return `Keltner Channel ${this.attrs.emaPeriod},${this.attrs.multiplier},${this.attrs.atrPeriod}`\r\n }\r\n}\r\n\r\nKeltnerChannel.prototype.defaults = { strokeColor: COLORS.Stroke, fillColor: COLORS.Fill }\r\n\r\nexport default KeltnerChannel\r\n","import { OverlayType } from '../constants/common'\r\nimport Overlay from './overlay'\r\n\r\n// This indicator is used as a placeholder when we need to render TA like chart but don't need any overlay or indicator in the chart\r\nclass None extends Overlay {\r\n static type = OverlayType.None\r\n static label = 'None'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n isRendered() {\r\n return false\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n}\r\n\r\nexport default None\r\n","import Text from '../canvas/text'\r\nimport { OverlayType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport Overlay from './overlay'\r\n\r\ntype aboveBelowType = 'above' | 'below'\r\n\r\nclass Patterns extends Overlay {\r\n static type = OverlayType.Patterns\r\n static label = 'Patterns (daily charts)'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const data = this.data\r\n if (data.patterns.length === 0) {\r\n return\r\n }\r\n\r\n const originalScale = {\r\n width: 600,\r\n height: 300,\r\n barsInDay: Math.min(data.close.length, 200),\r\n high: data.patternsMaxRange,\r\n low: data.patternsMinRange,\r\n barWidth: 0,\r\n }\r\n originalScale.barWidth = originalScale.width / 200\r\n\r\n const scaleY = (originalScale.high - originalScale.low) / originalScale.height\r\n const fx = (x: number) => {\r\n if (x === 0) {\r\n return this.fx(0)\r\n }\r\n return this.fx(data.close.length - 1 - ~~(originalScale.barsInDay - x / originalScale.barWidth))\r\n }\r\n const fy = (y: number) => this.fy(originalScale.high - y * scaleY)\r\n const line = (color: string, x1: number, y1: number, x2: number, y2: number) => {\r\n const roundedXY = getRoundedObject({\r\n x1: fx(x1),\r\n y1: fy(y1),\r\n x2: fx(x2),\r\n y2: fy(y2),\r\n })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: 1, ...roundedXY })\r\n context.translate(translateXY.x, translateXY.y)\r\n\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', color)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n }\r\n const text = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, x2: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx((x1 + x2) / 2),\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const textHS = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx(x1) + 5,\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 9, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const above = (y: number) =>\r\n fy(y) + 10 >= this.model.height - ChartSettings.top.height - ChartSettings.bottom.height ? 'above' : 'below'\r\n const below = (y: number) => (fy(y) <= 15 ? 'below' : 'above')\r\n\r\n const supportColor = 'rgb(0, 150, 220)'\r\n const resistColor = 'rgb(180, 50, 200)'\r\n\r\n for (const pattern of data.patterns) {\r\n const { x1, x2, x3, y3 } = pattern\r\n let { y1, y2 } = pattern\r\n switch (pattern.kind) {\r\n case 1: // Horiz S/R\r\n line('rgba(50, 50, 180, 0.588)', x1, y1, x2, y2)\r\n break\r\n\r\n case 2: // tl resist\r\n line(resistColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 3: // tl support\r\n if (y1 === originalScale.height && y2 === originalScale.height) {\r\n y1 = y2 = originalScale.height - 1\r\n // Maybe just need to check on the new scale?\r\n } // support \"pod grafom\"\r\n line(supportColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 12: // double top\r\n text('Double Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 13: // double bottom\r\n text('Double Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 14: // multi top\r\n text('Multiple Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 15: // multi bottom\r\n text('Multiple Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 16: // h&s top\r\n textHS('L', below(y1), resistColor, x1, y1)\r\n textHS('H', below(y2), resistColor, x2, y2)\r\n textHS('R', below(y3), resistColor, x3, y3)\r\n break\r\n\r\n case 17: // h&s bot\r\n textHS('L', above(y1), supportColor, x1, y1)\r\n textHS('H', above(y2), supportColor, x2, y2)\r\n textHS('R', above(y3), supportColor, x3, y3)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const supportColor = {\r\n type: 'color',\r\n label: 'Support Color',\r\n name: 'supportColor',\r\n value: this.attrs.supportColor ?? this.getFreeColor(),\r\n }\r\n const resistColor = {\r\n type: 'color',\r\n label: 'Resist Color',\r\n name: 'resistColor',\r\n value: this.attrs.resistColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [supportColor, resistColor],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return false\r\n }\r\n\r\n toString() {\r\n return ''\r\n }\r\n}\r\n\r\nPatterns.prototype.defaults = { supportColor: '#69c1ea', resistColor: '#d386df' }\r\n\r\nexport default Patterns\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { Instrument } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { OverlayType, TIMEFRAME, TextBaseline } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport Utils from '../utils'\r\nimport { getBarWidthWithMargin, round } from '../utils/chart'\r\nimport { getFirstBarToRenderIndex, getLastBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport Overlay from './overlay'\r\n\r\nenum Calculation {\r\n standard = 'Standard',\r\n fibonacci = 'Fibonacci',\r\n}\r\ntype CalculationType = keyof typeof Calculation\r\n\r\nenum PivotPeriod {\r\n day,\r\n week,\r\n month,\r\n year,\r\n}\r\n\r\ntype PivotPointType = {\r\n pivot: number\r\n res1: number\r\n res2: number\r\n res3: number\r\n sup1: number\r\n sup2: number\r\n sup3: number\r\n}\r\n\r\ninterface Attrs {\r\n period?: string\r\n calculationType: CalculationType\r\n color: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n CalculationType: 'standard' as CalculationType,\r\n Color: '#FFA75F',\r\n}\r\nconst FIB_LVL_1 = 0.382\r\nconst FIB_LVL_2 = 0.618\r\nconst DAY_SECONDS = 86400\r\nconst MINUTES_PER_DAY = 1440\r\n\r\nclass PivotPoints extends Overlay {\r\n static type = OverlayType.Pp\r\n static label = 'Pivot Points'\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (period) {\r\n this.attrs.calculationType = period as CalculationType\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n getPeriodType() {\r\n switch (this.data.timeframe) {\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n return PivotPeriod.week\r\n case TIMEFRAME.h4:\r\n case TIMEFRAME.d:\r\n return PivotPeriod.month\r\n case TIMEFRAME.w:\r\n case TIMEFRAME.m:\r\n return PivotPeriod.year\r\n default:\r\n return PivotPeriod.day\r\n }\r\n }\r\n\r\n getIsEnoughData(startIndex: number, endIndex: number, periodType: PivotPeriod) {\r\n let dayGap = 7 // one week for week period\r\n if (periodType === PivotPeriod.month) dayGap = 28 // shortest month\r\n if (periodType === PivotPeriod.year) dayGap = 365\r\n\r\n if (startIndex !== endIndex) {\r\n if (startIndex === 0) {\r\n const daysDiff = (this.data.date[endIndex] - this.data.date[startIndex]) / DAY_SECONDS\r\n // we need to somehow determine if we have data if it starts from index 0\r\n // and we can't easily check if day before is different (different month/week/year)\r\n // so we are at least checking if it is [dayGap] days between start and end date\r\n return daysDiff >= dayGap\r\n } else {\r\n const startDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex])\r\n const beforeDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex - 1])\r\n if (periodType === PivotPeriod.week) {\r\n return beforeDay.getDate() !== startDay.getDate()\r\n } else {\r\n return beforeDay.getMonth() !== startDay.getMonth()\r\n }\r\n }\r\n }\r\n return false\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (this.data.close.length === 0) return\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n\r\n const firstBarToRender = getFirstBarToRenderIndex({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n leftOffset,\r\n }).index\r\n const lastBarToRender = getLastBarToRenderIndex({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n leftOffset,\r\n chartWidth,\r\n }).index\r\n\r\n const text = (label: string, price: number, calculatedX: number) => {\r\n new Text(\r\n {\r\n x: calculatedX,\r\n y: this.fy(price) - 13,\r\n font: { size: 8, weight: '900' },\r\n textBaseline: TextBaseline.top,\r\n fillStyle: this.attrs.color,\r\n text: `${label} (${round({ data: this.data, num: price })})`,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n const line = (fromX: number, toX: number, y: number) => {\r\n context.moveTo(fromX, this.fy(y))\r\n context.lineTo(toX, this.fy(y))\r\n }\r\n\r\n let startIndex = -1\r\n let endIndex = -1\r\n const isStock = this.data.instrument === Instrument.Stock\r\n const periodType = this.getPeriodType()\r\n let currentDate = new Date()\r\n let lastDate: Date | undefined\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n for (let index = firstBarToRender; index <= lastBarToRender; index++) {\r\n currentDate = Utils.dateFromUnixTimestamp(this.data.date[index])\r\n\r\n // check if new calculation/render is necessary\r\n switch (periodType) {\r\n case PivotPeriod.day: // only if it is a new day\r\n if (currentDate.getDate() === lastDate?.getDate()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.week: // only if it is a new week\r\n if (lastDate && dateFns.isSameWeek(lastDate, currentDate, { weekStartsOn: 1 })) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.month: // only if it is a new month\r\n if (currentDate.getMonth() === lastDate?.getMonth()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.year: // only if it is a new year\r\n if (currentDate.getFullYear() === lastDate?.getFullYear()) {\r\n continue\r\n }\r\n break\r\n }\r\n lastDate = currentDate\r\n\r\n // Find start/end indexes for the entire previous period\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n if (index > 0) {\r\n let previousTradingDay = new Date()\r\n for (let i = index - 1; i >= 0; i--) {\r\n previousTradingDay = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (previousTradingDay.getDate() !== currentDate.getDate()) break\r\n }\r\n previousTradingDay.setHours(0, 0, 0, 0)\r\n const previousNYMidnightTimestamp = Utils.convertLocalToNyTime(previousTradingDay, false).getTime() / 1000\r\n const currentMidnight = new Date(currentDate)\r\n currentMidnight.setHours(0, 0, 0, 0)\r\n const currentNYMidnightTimestamp = Utils.convertLocalToNyTime(currentMidnight, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= previousNYMidnightTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > currentNYMidnightTimestamp)\r\n\r\n // check if we have data for entire day\r\n if (startIndex !== endIndex) {\r\n const diff = this.data.date[endIndex] - this.data.date[startIndex]\r\n const isNonStockFullDay = !isStock && diff >= DAY_SECONDS\r\n const isStockFullDay = isStock && previousTradingDay.getDate() !== currentDate.getDate()\r\n if (!isNonStockFullDay && !isStockFullDay) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n }\r\n }\r\n break\r\n case PivotPeriod.week:\r\n const firstDayCurrentWeek = dateFns.startOfWeek(currentDate, { weekStartsOn: 1 })\r\n const firstDayCurrentWeekTimestamp = Utils.convertLocalToNyTime(firstDayCurrentWeek, false).getTime() / 1000\r\n const firstDayPreviousWeek = dateFns.sub(firstDayCurrentWeek, { weeks: 1 })\r\n const firstDayPreviousWeekTimestamp = Utils.convertLocalToNyTime(firstDayPreviousWeek, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousWeekTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentWeekTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.month:\r\n const firstDayCurrentMonth = dateFns.startOfMonth(currentDate)\r\n const firstDayCurrentMonthTimestamp = Utils.convertLocalToNyTime(firstDayCurrentMonth, false).getTime() / 1000\r\n const firstDayPreviousMonth = dateFns.sub(firstDayCurrentMonth, { months: 1 })\r\n const firstDayPreviousMonthTimestamp =\r\n Utils.convertLocalToNyTime(firstDayPreviousMonth, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousMonthTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentMonthTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.year:\r\n const firstDayCurrentYear = dateFns.startOfYear(currentDate)\r\n const firstDayCurrentYearTimestamp = Utils.convertLocalToNyTime(firstDayCurrentYear, false).getTime() / 1000\r\n const firstDayPreviousYear = dateFns.sub(firstDayCurrentYear, { years: 1 })\r\n const firstDayPreviousYearTimestamp = Utils.convertLocalToNyTime(firstDayPreviousYear, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousYearTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentYearTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n }\r\n\r\n // calculate pivot point if it was found\r\n if (!(startIndex !== -1 && endIndex !== -1 && startIndex < endIndex)) continue\r\n\r\n let pivot, sup1, sup2, sup3, res1, res2, res3\r\n const previousHigh = Math.max(...this.data.high.slice(startIndex, endIndex))\r\n const previousLow = Math.min(...this.data.low.slice(startIndex, endIndex))\r\n const previousClose = this.data.close[endIndex - 1] // endIndex is the beginning of the next period\r\n\r\n if (this.attrs.calculationType === 'standard') {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = 2 * pivot - previousHigh\r\n sup2 = pivot - (previousHigh - previousLow)\r\n sup3 = previousLow - 2 * (previousHigh - pivot)\r\n res1 = 2 * pivot - previousLow\r\n res2 = pivot + (previousHigh - previousLow)\r\n res3 = previousHigh + 2 * (pivot - previousLow)\r\n } else {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = pivot - (previousHigh - previousLow) * FIB_LVL_1\r\n sup2 = pivot - (previousHigh - previousLow) * FIB_LVL_2\r\n sup3 = pivot - (previousHigh - previousLow)\r\n res1 = pivot + (previousHigh - previousLow) * FIB_LVL_1\r\n res2 = pivot + (previousHigh - previousLow) * FIB_LVL_2\r\n res3 = pivot + (previousHigh - previousLow)\r\n }\r\n\r\n const pivotPoint: PivotPointType = { pivot, sup1, sup2, sup3, res1, res2, res3 }\r\n\r\n // prepare x coordinates for lines rendering\r\n let fromX = this.fx(index)\r\n let toX = this.fx(index)\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n const interval = this.data.interval\r\n const currentX = fromX\r\n\r\n const toDate = new Date(currentDate)\r\n toDate.setHours(16, 0, 0, 0)\r\n if (this.data.aftermarket && interval <= 5) toDate.setHours(18, 30, 0, 0)\r\n if (interval <= 15 && !isStock) toDate.setHours(23, 59, 59, 99)\r\n const toTimestamp = toDate.getTime() / 1000\r\n const toDiffMinutes = (toTimestamp - currentDate.getTime() / 1000) / 60\r\n const toBars = toDiffMinutes / interval\r\n toX = Math.min(currentX + toBars * barWidth, -leftOffset + width)\r\n\r\n const fromDate = new Date(currentDate)\r\n fromDate.setHours(9, 30, 0, 0)\r\n if (this.data.premarket && interval <= 5) fromDate.setHours(7, 0, 0, 0)\r\n if (interval <= 15 && !isStock) fromDate.setHours(0, 0, 0, 0)\r\n const fromTimestamp = fromDate.getTime() / 1000\r\n const fromDiffMinutes = (fromTimestamp - currentDate.getTime() / 1000) / 60\r\n const fromBars = fromDiffMinutes / interval\r\n fromX = currentX + fromBars * barWidth\r\n break\r\n\r\n case PivotPeriod.week:\r\n for (let i = index + 1; i <= lastBarToRender; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n fromX = this.fx(i + 1) // because we need start from current week\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the week\r\n const barsPerDay = Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n toX += (isStock ? 5 : 7) * barsPerDay * barWidth\r\n }\r\n break\r\n\r\n case PivotPeriod.month:\r\n for (let i = index + 1; i <= lastBarToRender; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n fromX = this.fx(i + 1) // because we need start from current month\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the month\r\n const barsPerDay = this.data.isIntraday\r\n ? Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n : 1\r\n toX += (isStock ? 20 : 30) * barsPerDay * barWidth\r\n }\r\n break\r\n default:\r\n for (let i = index + 1; i <= lastBarToRender; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n fromX = this.fx(i + 1) // because we need start from current year\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the year\r\n toX += (this.data.timeframe === TIMEFRAME.w ? 49 : 12) * barWidth\r\n }\r\n break\r\n }\r\n fromX = Math.max(fromX, -leftOffset)\r\n\r\n // render pivot line\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.pivot)\r\n context.stroke()\r\n\r\n // render resistance and support lines\r\n context.save()\r\n context.setLineDash([3, 3])\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.res1)\r\n line(fromX, toX, pivotPoint.res2)\r\n line(fromX, toX, pivotPoint.res3)\r\n line(fromX, toX, pivotPoint.sup1)\r\n line(fromX, toX, pivotPoint.sup2)\r\n line(fromX, toX, pivotPoint.sup3)\r\n context.stroke()\r\n context.restore()\r\n\r\n // render labels if there is enough space\r\n if (toX - fromX >= 48) {\r\n text('P', pivotPoint.pivot, fromX)\r\n text('R1', pivotPoint.res1, fromX)\r\n text('R2', pivotPoint.res2, fromX)\r\n text('R3', pivotPoint.res3, fromX)\r\n text('S1', pivotPoint.sup1, fromX)\r\n text('S2', pivotPoint.sup2, fromX)\r\n text('S3', pivotPoint.sup3, fromX)\r\n }\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const calculationType = {\r\n type: 'select',\r\n label: 'Calculation Type',\r\n name: 'calculationType',\r\n value: this.attrs.calculationType ?? DEFAULT_PARAMETERS.CalculationType,\r\n required: true,\r\n items: [\r\n {\r\n value: 'standard',\r\n label: 'Standard',\r\n },\r\n {\r\n value: 'fibonacci',\r\n label: 'Fibonacci',\r\n },\r\n ],\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [calculationType, color],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'calculationType':\r\n case 'color':\r\n return !!this.attrs[key]\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Pivot Points (${Calculation[this.attrs.calculationType]})`\r\n }\r\n}\r\n\r\nPivotPoints.prototype.defaults = {\r\n calculationType: DEFAULT_PARAMETERS.CalculationType,\r\n color: DEFAULT_PARAMETERS.Color,\r\n}\r\n\r\nexport default PivotPoints\r\n","import { OverlayType } from '../constants/common'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n step: number\r\n period: string\r\n maxStep: number\r\n risingColor: string\r\n fallingColor: string\r\n}\r\n\r\nclass SAR extends Overlay {\r\n static type = OverlayType.Sar\r\n static label = 'Parabolic SAR'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && (this.attrs.step === undefined || this.attrs.maxStep === undefined)) {\r\n const [step = 0, maxStep = 0] = this.attrs.period.split(',').map((x) => parseFloat(x))\r\n this.attrs.step = step\r\n this.attrs.maxStep = maxStep\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const data = this.data\r\n const deltaHigh = data.high[1] - data.high[0]\r\n const deltaLow = data.low[0] - data.low[1]\r\n const pdm = deltaHigh > 0 && deltaHigh > deltaLow ? deltaHigh : 0\r\n const mdm = deltaLow > 0 && deltaLow > deltaHigh ? deltaLow : 0\r\n let isLong = pdm >= mdm\r\n\r\n let sar = isLong ? data.low[0] : data.high[0]\r\n let ep = isLong ? data.high[1] : data.low[1]\r\n let newHigh = data.high[0]\r\n let newLow = data.low[0]\r\n let af = this.attrs.step\r\n\r\n for (let i = 1, end = data.close.length, asc = end >= 1; asc ? i < end : i > end; asc ? i++ : i--) {\r\n let sarToDraw\r\n const prevHigh = newHigh\r\n const prevLow = newLow\r\n newHigh = data.high[i]\r\n newLow = data.low[i]\r\n\r\n if (isLong) {\r\n if (newLow <= sar) {\r\n isLong = false\r\n sar = ep\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newLow\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newHigh > ep) {\r\n ep = newHigh\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n }\r\n } else {\r\n if (newHigh >= sar) {\r\n isLong = true\r\n sar = ep\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newHigh\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newLow < ep) {\r\n ep = newLow\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n }\r\n }\r\n\r\n const x = Math.round(this.fx(i) - 1.5)\r\n const y = Math.round(this.fy(sarToDraw) - 1.5)\r\n context.set('fillStyle', isLong ? this.attrs.risingColor : this.attrs.fallingColor)\r\n context.fillRect(x, y, 3, 3)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const step = {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Step',\r\n name: 'step',\r\n value: this.attrs.step ?? 0.02,\r\n required: true,\r\n }\r\n const maxStep = {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Maximum Step',\r\n name: 'maxStep',\r\n value: this.attrs.maxStep ?? 0.2,\r\n required: true,\r\n }\r\n const risingColor = {\r\n type: 'color',\r\n label: 'Rising Color',\r\n name: 'risingColor',\r\n value: this.attrs.risingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n }\r\n const fallingColor = {\r\n type: 'color',\r\n label: 'Falling Color',\r\n name: 'fallingColor',\r\n value: this.attrs.fallingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [step, maxStep, risingColor, fallingColor],\r\n inputsErrorMessages: {\r\n step: `${step.label} must be a number between ${step.min} and ${step.max}`,\r\n maxStep: `${maxStep.label} must be a number between ${maxStep.min} and ${maxStep.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'step':\r\n case 'maxStep': {\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n }\r\n case 'risingColor':\r\n case 'fallingColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.risingColor\r\n }\r\n\r\n toString() {\r\n return `SAR ${this.attrs.step},${this.attrs.maxStep}`\r\n }\r\n}\r\n\r\nSAR.prototype.defaults = {\r\n risingColor: '#69c1ea',\r\n fallingColor: '#d386df',\r\n}\r\n\r\nexport default SAR\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n}\r\n\r\nexport class SMACalculation extends MainCalculation {\r\n static type = OverlayType.Sma\r\n declare options: Options\r\n\r\n getDefaultCalculatedValues() {\r\n return { sma: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated ) {\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sum = 0\r\n for (let i = 0; i < this.options.period; i++) {\r\n sum += close[i]\r\n }\r\n for (let i = this.options.period; i <= lastIndex; i++) {\r\n sum = sum - close[i - this.options.period] + close[i]\r\n this.calculatedValues.sma[i] = sum / this.options.period\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { SMACalculation } from '../indicator-calculation/sma'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n step: number\r\n period: string\r\n maxStep: number\r\n risingColor: string\r\n color: string\r\n}\r\n\r\nclass SMA extends Overlay {\r\n static type = OverlayType.Sma\r\n static label = 'Simple Moving Average'\r\n\r\n static getNumOfBarsBuffer(chartConfig: RequireByKey ) {\r\n const numOfBarsBuffer = Overlay.getNumOfBarsBuffer(chartConfig)\r\n return numOfBarsBuffer + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n context.beginPath()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const smaCalculation = new SMACalculation({\r\n quote: this.data,\r\n options: { period },\r\n })\r\n\r\n smaCalculation.calculate(({ sma }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(sma[dataIndex])))\r\n })\r\n\r\n context.translate(-0.5, -0.5)\r\n context.stroke()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, color],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `SMA ${this.attrs.period}`\r\n }\r\n}\r\n\r\nSMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default SMA\r\n","import { OverlayType } from '../constants/common'\r\nimport SMA from './sma'\r\n\r\nclass SMA2 extends SMA {\r\n static type = OverlayType.Sma2\r\n}\r\n\r\nSMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default SMA2\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n multiplier: number\r\n uptrendColor: string\r\n downtrendColor: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 7,\r\n Multiplier: 3.0,\r\n}\r\n\r\nconst COLORS = {\r\n Uptrend: '#00a000',\r\n Downtrend: '#c80000',\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const multiplier = parseFloat(values[1]) || DEFAULT_PARAMETERS.Multiplier\r\n\r\n return [period, multiplier]\r\n}\r\n\r\nclass Supertrend extends Overlay {\r\n static type = OverlayType.Str\r\n static label = 'Supertrend'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey ) {\r\n const [periodInt] = parsePeriod(period)\r\n return periodInt + 1\r\n }\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, multiplier] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.multiplier = multiplier\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period, multiplier } = this.attrs\r\n const { high, low, close } = this.data\r\n const atr = new AverageTrueRange(period)\r\n const finalUpperBand: number[] = []\r\n const finalLowerBand: number[] = []\r\n const supertrend: boolean[] = []\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.uptrendColor)\r\n for (let i = 1; i < close.length; i++) {\r\n atr.add(high[i], low[i], close[i - 1])\r\n\r\n // compute bands\r\n const avg = (high[i] + low[i]) / 2\r\n const upperBand = avg + multiplier * atr.value\r\n const lowerBand = avg - multiplier * atr.value\r\n\r\n finalUpperBand[i] = upperBand\r\n finalLowerBand[i] = lowerBand\r\n\r\n // identify supertrend\r\n if (close[i] > finalUpperBand[i - 1]) {\r\n supertrend[i] = true\r\n } else if (close[i] < finalLowerBand[i - 1]) {\r\n supertrend[i] = false\r\n } else {\r\n supertrend[i] = supertrend[i - 1]\r\n }\r\n\r\n // adjust bands\r\n if (supertrend[i] && finalLowerBand[i] < finalLowerBand[i - 1]) {\r\n finalLowerBand[i] = finalLowerBand[i - 1]\r\n }\r\n if (!supertrend[i] && finalUpperBand[i] > finalUpperBand[i - 1]) {\r\n finalUpperBand[i] = finalUpperBand[i - 1]\r\n }\r\n\r\n const x = this.fx(i)\r\n if (i < period || x + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n if (supertrend[i] && !supertrend[i - 1]) {\r\n // buy\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalUpperBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else if (supertrend[i]) {\r\n // keep buying\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else {\r\n // keep selling\r\n context.moveTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n }\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n\r\n if (firstBarToRender === undefined) {\r\n context.translate(-0.5, -0.5)\r\n return\r\n }\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.downtrendColor)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n if (!supertrend[i] && supertrend[i - 1]) {\r\n // sell\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalLowerBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else if (!supertrend[i]) {\r\n // keep selling\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else {\r\n // keep buying\r\n context.moveTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n }\r\n }\r\n context.stroke()\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const multiplier = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.Multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n }\r\n\r\n const uptrendColor = {\r\n type: 'color',\r\n label: 'Uptrend Color',\r\n name: 'uptrendColor',\r\n value: this.attrs.uptrendColor ?? this.getFreeColor(),\r\n }\r\n const downtrendColor = {\r\n type: 'color',\r\n label: 'Downtrend Color',\r\n name: 'downtrendColor',\r\n value: this.attrs.downtrendColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, multiplier, uptrendColor, downtrendColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'uptrendColor':\r\n case 'downtrendColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor(): string {\r\n return this.attrs.uptrendColor\r\n }\r\n\r\n toString() {\r\n return `Supertrend ${this.attrs.period},${this.attrs.multiplier}`\r\n }\r\n}\r\n\r\nSupertrend.prototype.defaults = {\r\n uptrendColor: COLORS.Uptrend,\r\n downtrendColor: COLORS.Downtrend,\r\n}\r\n\r\nexport default Supertrend\r\n","import * as d3 from 'd3'\r\n\r\nimport { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport utils from '../utils'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { getFirstBarToRenderIndex, getLastBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\nconst VP_COLORS = {\r\n UP: '#00FF00',\r\n DOWN: '#FF0000',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Opacity: 0.3,\r\n}\r\n\r\ninterface Attrs {\r\n period: number | string\r\n opacity: number\r\n upColor?: string\r\n downColor?: string\r\n}\r\n\r\nfunction applyOpacityToColor(color: string, opacity: number) {\r\n return getHEXWithSpecificAplha(convertColorToHEX(color), opacity)\r\n}\r\n\r\nfunction getColorsWithAppliedOpacity(attrs: Attrs) {\r\n return [\r\n applyOpacityToColor(attrs.upColor ?? VP_COLORS.UP, attrs.opacity),\r\n applyOpacityToColor(attrs.downColor ?? VP_COLORS.DOWN, attrs.opacity),\r\n ]\r\n}\r\n\r\n// Only time when we want value to be able to equal start of segment is first segment,\r\n// because start of next segment is equal to end of previous and value would match two segments\r\nfunction isInSegment(val: number, start: number, end: number, notEqualStart: boolean) {\r\n return (notEqualStart ? val > start : val >= start) && val <= end\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const opacity = parseFloat(values[1]) || DEFAULT_PARAMETERS.Opacity\r\n\r\n return [period, opacity]\r\n}\r\n\r\nclass VolumeProfile extends Overlay {\r\n static type = OverlayType.Vp\r\n static label = 'Volume Profile'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey ) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial ) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, opacity] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.opacity = opacity\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n const firstBarToRender = getFirstBarToRenderIndex({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n leftOffset,\r\n }).index\r\n\r\n const lastBarToRender = getLastBarToRenderIndex({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n leftOffset,\r\n chartWidth,\r\n }).index\r\n\r\n const [upColor, downColor] = getColorsWithAppliedOpacity(this.attrs)\r\n const [minClose, maxClose] = utils.minMax(this.data.close.slice(firstBarToRender, lastBarToRender + 1))\r\n\r\n const segment = Math.abs(maxClose - minClose) / this.attrs.period\r\n const segments = [] // create an empty array to hold the segments\r\n\r\n for (let i = 0; i < this.attrs.period; i++) {\r\n const segmentStart = minClose + segment * i // calculate start of current segment\r\n const segmentEnd = segmentStart + segment // calculate end of current segment\r\n segments.push({ start: segmentStart, end: segmentEnd, up: 0, down: 0 }) // add segment to array\r\n }\r\n\r\n // loop through visible bars and assign volumes to segments\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const segmentIndex: number = segments.findIndex((item, segmentIndex) =>\r\n isInSegment(this.data.close[i], item.start, item.end, !!segmentIndex)\r\n )\r\n if (segmentIndex === -1) continue\r\n const volumeTrend = this.data.close[i] < this.data.open[i] ? 'down' : 'up'\r\n segments[segmentIndex][volumeTrend] += this.data.volume[i]\r\n }\r\n\r\n const max = utils.max(segments.map((item) => item.up + item.down))\r\n const rangeMax = chartWidth * 0.4 // maximum range in pixels where longest bar would reach (now it's 40% of chart width)\r\n const volumeFX = d3.scaleLinear().range([0, rangeMax]).domain([0, max])\r\n\r\n segments.forEach((item) => {\r\n const y = Math.round(this.fy(item.start))\r\n const segmentHeightRaw = Math.round(this.fy(item.end)) - y // raw segment height without gap between segments\r\n const segmentHeight = segmentHeightRaw + (Math.abs(segmentHeightRaw) > 5 ? 2 : 1) // apply gap to segment based on how high segment is\r\n const x = Math.abs(leftOffset) // segments are alligned to left side of chart which equal to absoulute value of leftOffset\r\n const upSegmentWidth = Math.round(volumeFX(item.up))\r\n const downSegmentWidth = Math.round(volumeFX(item.down))\r\n\r\n context.fillStyle = upColor\r\n context.fillRect(x, y, upSegmentWidth, segmentHeight)\r\n context.fillStyle = downColor\r\n context.fillRect(x + upSegmentWidth, y, downSegmentWidth, segmentHeight)\r\n })\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Zones',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const opacity = {\r\n type: 'number',\r\n label: 'Opacity',\r\n name: 'opacity',\r\n value: this.attrs.opacity ?? DEFAULT_PARAMETERS.Opacity,\r\n required: true,\r\n min: 0,\r\n max: 1,\r\n step: 0.1,\r\n }\r\n const upColor = {\r\n type: 'color',\r\n label: 'Up Color',\r\n name: 'upColor',\r\n value: this.attrs.upColor ?? VP_COLORS.UP,\r\n }\r\n const downColor = {\r\n type: 'color',\r\n label: 'Down Color',\r\n name: 'downColor',\r\n value: this.attrs.downColor ?? VP_COLORS.DOWN,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, opacity, upColor, downColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n opacity: `${opacity.label} must be a number between ${opacity.min} and ${opacity.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'opacity':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'upColor':\r\n case 'downColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.upColor || VP_COLORS.UP\r\n }\r\n\r\n toString() {\r\n return `VP ${this.attrs.period}`\r\n }\r\n}\r\n\r\nVolumeProfile.prototype.defaults = { upColor: VP_COLORS.UP, downColor: VP_COLORS.DOWN }\r\n\r\nexport default VolumeProfile\r\n","import { OverlayType } from '../constants/common'\r\nimport { dateFromUnixTimestamp } from '../utils'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\nconst datesAreOnSameDay = (first: Date, second: Date) =>\r\n first.getFullYear() === second.getFullYear() &&\r\n first.getMonth() === second.getMonth() &&\r\n first.getDate() === second.getDate()\r\n\r\ntype DefaultCalculatedValuesType = {\r\n vwap: number[]\r\n}\r\n\r\nexport class VWapCalculation extends MainCalculation {\r\n static type = OverlayType.Vwap\r\n\r\n getDefaultCalculatedValues() {\r\n return { vwap: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated ) {\r\n const { date, close, low, high, volume } = this.quote\r\n const lastIndex = date.length - 1\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let cumulativePV = 0\r\n let cumulativeVolume = 0\r\n\r\n for (let i = 0; i <= lastIndex; i++) {\r\n if (i > 0) {\r\n const prevDate = dateFromUnixTimestamp(date[i - 1])\r\n if (!datesAreOnSameDay(prevDate, dateFromUnixTimestamp(date[i]))) {\r\n cumulativePV = 0\r\n cumulativeVolume = 0\r\n }\r\n }\r\n\r\n const typicalPrice = (close[i] + low[i] + high[i]) / 3\r\n const pv = typicalPrice * volume[i]\r\n\r\n cumulativePV += pv\r\n cumulativeVolume += volume[i]\r\n\r\n this.calculatedValues.vwap[i] = cumulativePV / cumulativeVolume\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { OverlayType } from '../constants/common'\r\nimport { VWapCalculation } from '../indicator-calculation/vwap'\r\nimport PaneModel from '../models/pane'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n color: string\r\n}\r\n\r\nclass VWAP extends Overlay {\r\n static type = OverlayType.Vwap\r\n static label = 'VWAP (intraday charts)'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 1\r\n }\r\n\r\n constructor(values: Partial , model: PaneModel) {\r\n super(values, model)\r\n this.attrs.period = 5\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (!this.isRendered()) {\r\n return\r\n }\r\n\r\n const { leftOffset, width } = this.model.chart()\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const vwapCalculation = new VWapCalculation({\r\n quote: this.data,\r\n options: { period: this.attrs.period },\r\n })\r\n\r\n vwapCalculation.calculate(({ vwap }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return // continue\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false // break\r\n }\r\n const y = Math.round(this.fy(vwap[dataIndex]))\r\n context.lineTo(x, y)\r\n })\r\n\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [color],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'color':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n isRendered() {\r\n return this.model.chart().quote().isIntraday\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n toString() {\r\n return `VWAP`\r\n }\r\n}\r\n\r\nVWAP.prototype.defaults = { color: '#9467bd' }\r\n\r\nexport default VWAP\r\n","import { OverlayType } from '../constants/common'\r\nimport bb from './bb'\r\nimport dch from './dch'\r\nimport ema from './ema'\r\nimport ema2 from './ema2'\r\nimport hilo from './hilo'\r\nimport hline from './hline'\r\nimport ic from './ic'\r\nimport icf from './icf'\r\nimport kch from './kch'\r\nimport none from './none'\r\nimport overlay from './overlay'\r\nimport patterns from './patterns'\r\nimport pp from './pp'\r\nimport sar from './sar'\r\nimport sma from './sma'\r\nimport sma2 from './sma2'\r\nimport str from './str'\r\nimport vp from './vp'\r\nimport vwap from './vwap'\r\n\r\nexport const overlaysByType = Object.freeze({\r\n [OverlayType.Overlay]: overlay,\r\n [OverlayType.None]: none,\r\n [OverlayType.Bb]: bb,\r\n [OverlayType.Dch]: dch,\r\n [OverlayType.Ema]: ema,\r\n [OverlayType.Ema2]: ema2,\r\n [OverlayType.Hilo]: hilo,\r\n [OverlayType.Hline]: hline,\r\n [OverlayType.Ic]: ic,\r\n [OverlayType.Icf]: icf,\r\n [OverlayType.Kch]: kch,\r\n [OverlayType.Patterns]: patterns,\r\n [OverlayType.Pp]: pp,\r\n [OverlayType.Sar]: sar,\r\n [OverlayType.Sma]: sma,\r\n [OverlayType.Sma2]: sma2,\r\n [OverlayType.Str]: str,\r\n [OverlayType.Vp]: vp,\r\n [OverlayType.Vwap]: vwap,\r\n})\r\n","import {\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nclass Utils {\r\n static min (...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let min = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el < min) {\r\n min = el\r\n }\r\n }\r\n }\r\n return min\r\n }\r\n\r\n static max (...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let max = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return max\r\n }\r\n\r\n static minMax(...args: number[][]) {\r\n let max\r\n let min = (max = args[0][0] as number)\r\n for (const arg of args) {\r\n for (const el of arg) {\r\n if (el < min) {\r\n min = el\r\n }\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return [min, max]\r\n }\r\n\r\n static getScaleRatio() {\r\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n }\r\n\r\n static setSizeOnCanvasElement({\r\n canvasElement,\r\n width,\r\n height,\r\n ratio = Utils.getScaleRatio(),\r\n }: {\r\n canvasElement: HTMLCanvasElement | null\r\n width: number\r\n height: number\r\n ratio?: number\r\n }) {\r\n if (canvasElement) {\r\n canvasElement.width = width * ratio\r\n canvasElement.height = height * ratio\r\n canvasElement.style.width = width + 'px'\r\n canvasElement.style.height = height + 'px'\r\n }\r\n }\r\n\r\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n const date = referenceDate || new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n return (isDst ? 4 : 5) * 60 * 60\r\n }\r\n\r\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n const date = new Date(referenceDate)\r\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n return date\r\n }\r\n\r\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = convertLocalToNyTime(new Date(), true)\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n }\r\n\r\n static dateFromUnixTimestamp(timestamp: number) {\r\n /*\r\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n * The function adds seconds to the date instance if it exceeds 60.\r\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n * */\r\n const date = new Date(0)\r\n date.setUTCSeconds(timestamp)\r\n return Utils.convertLocalToNyTime(date, true)\r\n }\r\n\r\n static dateStringFromDate(date: Date) {\r\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n 2,\r\n '0'\r\n )}`\r\n }\r\n\r\n static dateFromDateString(dateString: string) {\r\n const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n if (Number.isNaN(date.getTime())) {\r\n captureException(new Error('Invalid Date'), { extra: { date } })\r\n }\r\n\r\n return date\r\n }\r\n\r\n static isMobile(testTouchPoints?: boolean) {\r\n if (getIsSSr()) return false\r\n let isMobileOs = false\r\n\r\n // New iOS versions no longer report iPad in user agent\r\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n try {\r\n document.createEvent('TouchEvent')\r\n isMobileOs = true\r\n } catch (e) {}\r\n } else {\r\n isMobileOs = !!navigator.userAgent.match(\r\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n )\r\n }\r\n\r\n if (testTouchPoints) {\r\n try {\r\n return (\r\n isMobileOs &&\r\n (window.navigator.msMaxTouchPoints ||\r\n window.navigator.maxTouchPoints ||\r\n 'ontouchstart' in document.createElement('div'))\r\n )\r\n } catch (e) {}\r\n }\r\n\r\n return isMobileOs\r\n }\r\n\r\n static isIPad() {\r\n const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n }\r\n\r\n static getCookie(name: string) {\r\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n }\r\n\r\n static setCookie(name: string, value: string, expires: Date) {\r\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (document.location.hostname !== 'localhost') {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n return (\r\n document.fullscreenElement ??\r\n document.webkitFullscreenElement ??\r\n document.mozFullScreenElement ??\r\n document.msFullscreenElement ??\r\n false\r\n )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n return (\r\n element.requestFullscreen ??\r\n element.webkitRequestFullScreen ??\r\n element.mozRequestFullScreen ??\r\n element.msRequestFullscreen\r\n )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n return (\r\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n )\r\n}\r\n\r\nexport function ready(fn: () => void) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const PADDING = 2 // Border widths\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n if (isMobile ?? Utils.isMobile()) {\r\n return window.orientation % 180 === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n let suffix = ''\r\n if (value >= 1000000000) {\r\n value /= 1000000000\r\n suffix = 'B'\r\n } else if (value >= 1000000) {\r\n value /= 1000000\r\n suffix = 'M'\r\n } else if (value >= 1000) {\r\n value /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n matchingPages = [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ]\r\n) {\r\n return (\r\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\n\r\nconst requestsAbortControllersCache: ObjectHash = {}\r\n\r\nexport function removeFromAbortCache(key: string) {\r\n delete requestsAbortControllersCache[key]\r\n}\r\n\r\nexport function abortRequest(key: string) {\r\n requestsAbortControllersCache[key]?.abort()\r\n removeFromAbortCache(key)\r\n}\r\n\r\nexport function getIsAbortError(error: Error) {\r\n return error.name === 'AbortError'\r\n}\r\n\r\nexport function createRequestAbortController({\r\n key,\r\n shouldAbortRunningRequest = false,\r\n}: {\r\n key: string\r\n shouldAbortRunningRequest?: boolean\r\n}) {\r\n if (shouldAbortRunningRequest) {\r\n abortRequest(key)\r\n }\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n if (controller) {\r\n requestsAbortControllersCache[key] = controller\r\n }\r\n return controller\r\n}\r\n","import { getIsSSr } from './helpers'\r\n\r\n// Extracted from isMobile, and modified to fit usage\r\nfunction isFirefoxDesktop() {\r\n const matchesAndroid = navigator.userAgent.match(/Android/i)\r\n const matchesWebOS = navigator.userAgent.match(/webOS/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesiPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\n const matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n const isMobileDevice =\r\n matchesAndroid ||\r\n matchesWebOS ||\r\n matchesIPhone ||\r\n matchesiPad ||\r\n matchesIPod ||\r\n matchesBlackBerry ||\r\n matchesWindowsPhone ||\r\n matchesIOSLike\r\n\r\n const matchesFirefox = !!navigator.userAgent.match(/firefox/i)\r\n\r\n return matchesFirefox && !isMobileDevice\r\n}\r\n\r\n// Due bug in FireFox, when if HW acceleration is used canvas is blurry\r\n// we need to set canvas as CPU only\r\nconst shouldUseCPUOnly = getIsSSr() ? false : isFirefoxDesktop()\r\n\r\nexport function getContextWithCache(canvas: HTMLCanvasElement | null): CanvasRenderingContext2D | null {\r\n if (!canvas) {\r\n return null\r\n }\r\n\r\n const context = canvas.getContext('2d', shouldUseCPUOnly ? { willReadFrequently: true } : undefined)\r\n if (!context) {\r\n window.Sentry?.captureMessage('Context unavailable')\r\n return null\r\n }\r\n\r\n context._cache = {}\r\n\r\n const _restore = CanvasRenderingContext2D.prototype.restore\r\n context.restore = function () {\r\n this._cache = {}\r\n return _restore.apply(this)\r\n }\r\n\r\n context.set = function (key, value) {\r\n if (this._cache[key] !== value) {\r\n this[key] = value\r\n this._cache[key] = value\r\n }\r\n }\r\n\r\n return context\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { ChartConfigChartPane, Instrument, ObjectHash } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport { chartsByType } from '../charts/charts'\r\nimport {\r\n CRYPTOS,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAME_SECONDS,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getPercentageFromValue } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport ChartLayoutModel from '../models/chart_layout'\r\nimport { IChartSettings } from '../models/chart_settings/interfaces'\r\nimport { Mouse } from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote, { QuoteGetParams } from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Utils, { dateFromUnixTimestamp } from '../utils'\r\nimport { captureException } from './helpers'\r\n\r\nconst DAY_IN_SECONDS = 86400\r\nconst TWO_MIN_IN_MS = 2 * 60 * 1000\r\nconst virtualDatesCache: ObjectHash<{\r\n fromSeconds: number\r\n toSeconds: number\r\n lastUsed: number\r\n virtualDates: number[]\r\n}> = {}\r\n\r\n// The reason to use this func instead of dateFns.isSameDay is performance as this is way faster\r\nfunction areTimestampsFromSameDay({ ts1, ts2 }: { ts1: number; ts2: number }) {\r\n const ts1Utc = ts1\r\n const ts2Utc = ts2\r\n return Math.floor(ts1Utc / DAY_IN_SECONDS) === Math.floor(ts2Utc / DAY_IN_SECONDS)\r\n}\r\n\r\nfunction getVirtualDatesCacheId({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n}) {\r\n return `${ticker}-${timeframe}-${idRevision}`\r\n}\r\n\r\nfunction getCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n const cache = virtualDatesCache[id]\r\n if (cache?.fromSeconds <= fromSeconds && cache?.toSeconds >= toSeconds) {\r\n cache.lastUsed = Date.now()\r\n if (cache.fromSeconds === fromSeconds && cache.toSeconds === toSeconds) {\r\n return cache.virtualDates\r\n }\r\n return cache.virtualDates.filter(\r\n (virtualDateSeconds) => virtualDateSeconds >= fromSeconds && virtualDateSeconds <= toSeconds\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction checkVirtualCacheSize() {\r\n const now = Date.now()\r\n Object.keys(virtualDatesCache).forEach((virtualDatesCacheId) => {\r\n if (virtualDatesCache[virtualDatesCacheId].lastUsed < now - TWO_MIN_IN_MS) {\r\n delete virtualDatesCache[virtualDatesCacheId]\r\n }\r\n })\r\n}\r\n\r\nfunction setCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n virtualDates: number[]\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n checkVirtualCacheSize()\r\n virtualDatesCache[id] = {\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n lastUsed: Date.now(),\r\n }\r\n}\r\n\r\nconst MAX_BAR_BORDER_WIDTH = 1\r\nconst MIN_BAR_MARGIN_WIDTH = 0\r\nconst MAX_BAR_MARGIN_WIDTH = 16\r\n\r\nexport function getBarWidthWithMarginByParts({\r\n zoomFactor = 1,\r\n chartLayout,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const { ChartSettings } = chartLayout.settings\r\n const settingsCenter = ChartSettings.center\r\n const barMargin =\r\n zoomFactor > 1 && settingsCenter.barMargin === 0\r\n ? Math.min(settingsCenter.barWidth, 1 - 1 / zoomFactor)\r\n : settingsCenter.barMargin\r\n\r\n const barFillWidth = settingsCenter.barWidth * zoomFactor\r\n const barBorderWidth = Math.min(settingsCenter.border * zoomFactor, MAX_BAR_BORDER_WIDTH)\r\n const barMarginWidth = Math.max(MIN_BAR_MARGIN_WIDTH, Math.min(barMargin * zoomFactor, MAX_BAR_MARGIN_WIDTH))\r\n\r\n return {\r\n barFillWidth,\r\n barBorderWidth,\r\n barMarginWidth,\r\n }\r\n}\r\n\r\nexport function getBarWidthWithMargin({\r\n zoomFactor = 1,\r\n chartLayout,\r\n shouldRound = true,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n shouldRound?: boolean\r\n}) {\r\n const { barFillWidth, barBorderWidth, barMarginWidth } = getBarWidthWithMarginByParts({ zoomFactor, chartLayout })\r\n\r\n const barWidth = barFillWidth + barBorderWidth * 2 + barMarginWidth\r\n if (!shouldRound) {\r\n return barWidth\r\n }\r\n const roundDecimalPlaces = barWidth > 100 ? 10 : 10000\r\n return Math.round(barWidth * roundDecimalPlaces) / roundDecimalPlaces\r\n}\r\n\r\nconst DEFAULT_ZOOM_GUESS_INCREMENT = 0.001\r\n\r\nconst zoomFactorForBarsToDisplayCache: ObjectHash = {}\r\nconst zoomFactorForBarsToDisplayCacheKeys: string[] = []\r\nconst NUMBER_OF_CACHED_ZOOM_FACTORS = 10\r\nconst getZoomFactorFromCache = (key: string) => zoomFactorForBarsToDisplayCache[key] ?? null\r\nconst setZoomFactorToCache = (key: string, value: number) => {\r\n if (!zoomFactorForBarsToDisplayCacheKeys.includes(key)) {\r\n zoomFactorForBarsToDisplayCacheKeys.unshift(key)\r\n if (zoomFactorForBarsToDisplayCacheKeys.length > NUMBER_OF_CACHED_ZOOM_FACTORS) {\r\n const poppedKey = zoomFactorForBarsToDisplayCacheKeys.pop()\r\n if (poppedKey) {\r\n delete zoomFactorForBarsToDisplayCache[poppedKey]\r\n }\r\n }\r\n }\r\n\r\n zoomFactorForBarsToDisplayCache[key] = value\r\n}\r\n\r\nexport function getZoomFactorForBarsToDisplay({\r\n chartVisibleWidth,\r\n numOfVisibleBars,\r\n chartLayout,\r\n}: {\r\n chartVisibleWidth: number\r\n numOfVisibleBars: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const defaultBarWidthWithMargin = getBarWidthWithMargin({ chartLayout })\r\n const barWidthWithMargin = chartVisibleWidth / numOfVisibleBars\r\n const cacheKey = `${defaultBarWidthWithMargin}-${barWidthWithMargin}`\r\n let zoomIncrement = 0\r\n let currentZoomFactor = 1\r\n let finalZoomFactor = getZoomFactorFromCache(cacheKey)\r\n let iteration = 0\r\n if (barWidthWithMargin <= defaultBarWidthWithMargin) {\r\n finalZoomFactor = barWidthWithMargin / defaultBarWidthWithMargin\r\n }\r\n while (finalZoomFactor === null) {\r\n iteration += 1\r\n const threshold = 0.01\r\n currentZoomFactor += zoomIncrement\r\n const barWidth = getBarWidthWithMargin({ zoomFactor: currentZoomFactor, chartLayout, shouldRound: false })\r\n const barWidthDiff = barWidthWithMargin - barWidth\r\n if (barWidthDiff > threshold) {\r\n zoomIncrement = zoomIncrement > 0 ? zoomIncrement * 2 : DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else if (barWidthDiff < -threshold) {\r\n zoomIncrement = zoomIncrement < 0 ? zoomIncrement * 2 : -DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else {\r\n finalZoomFactor = currentZoomFactor\r\n }\r\n\r\n if (iteration === 1000) {\r\n captureException(new Error('Invalid zoom factor from getZoomFactorForBarsToDisplay'), {\r\n extra: {\r\n iteration,\r\n zoomIncrement,\r\n barWidthWithMargin,\r\n barWidth,\r\n barWidthDiff,\r\n currentZoomFactor,\r\n chartLayout: chartLayout.toConfig(['colors', 'panes']),\r\n },\r\n })\r\n return currentZoomFactor\r\n }\r\n }\r\n\r\n setZoomFactorToCache(cacheKey, finalZoomFactor)\r\n\r\n return finalZoomFactor\r\n}\r\n\r\nexport function getTimeframeSeconds({\r\n lowerIndex,\r\n dates,\r\n timeframe,\r\n}: {\r\n lowerIndex: number\r\n dates: number[]\r\n timeframe: TIMEFRAME\r\n}) {\r\n const upperIndex = lowerIndex + 1\r\n const areBoundsDefined = ![dates[upperIndex], dates[lowerIndex]].some((index) => index === undefined)\r\n return areBoundsDefined ? dates[upperIndex] - dates[lowerIndex] : TIMEFRAME_SECONDS[timeframe]\r\n}\r\n\r\nfunction getVirtualTradedDays({\r\n dateStartSeconds,\r\n dateEndSeconds,\r\n datesSeconds,\r\n marketStartMinutes,\r\n}: {\r\n dateStartSeconds: number\r\n dateEndSeconds: number\r\n datesSeconds: number[]\r\n marketStartMinutes: number\r\n}) {\r\n const dateStart = dateFromUnixTimestamp(dateStartSeconds)\r\n const dateEnd = dateFromUnixTimestamp(dateEndSeconds)\r\n const isStartBeforeDates = dateStartSeconds < datesSeconds[0]\r\n const isEndAfterDates = datesSeconds.length > 0 && datesSeconds[datesSeconds.length - 1] < dateEndSeconds\r\n const firstDate = dateFromUnixTimestamp(datesSeconds[0])\r\n const lastDate = dateFromUnixTimestamp(datesSeconds[datesSeconds.length - 1])\r\n return dateFns\r\n .eachDayOfInterval({\r\n start:\r\n isStartBeforeDates && (dateFns.isWeekend(dateStart) || dateStart.getMinutes() < marketStartMinutes)\r\n ? dateFns.addBusinessDays(dateStart, -1)\r\n : dateStart,\r\n end: isEndAfterDates ? dateFns.addBusinessDays(dateEnd, 1) : dateEnd,\r\n })\r\n .filter((date) => {\r\n const ts2 = date.getTime() / 1000 - date.getTimezoneOffset() * 60\r\n return (\r\n !dateFns.isWithinInterval(date, { start: dateFns.startOfDay(firstDate), end: dateFns.endOfDay(lastDate) }) ||\r\n datesSeconds.some((dateTime) =>\r\n areTimestampsFromSameDay({\r\n ts1: dateTime - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateTime * 1000)),\r\n ts2,\r\n })\r\n )\r\n )\r\n })\r\n}\r\n\r\nexport function getVirtualTimeframeTradedDates({\r\n dateStart,\r\n dateEnd,\r\n quote,\r\n}: {\r\n dateStart: number\r\n dateEnd: number\r\n quote: Quote\r\n}) {\r\n const { date: dates, ticker, timeframe, instrument, isIntraday, marketStartMinutes } = quote\r\n const barsInDay = quote.getBarsInDay() ?? 0\r\n\r\n // Currently we're passing first and last quote dates to dateStart / dateEnd so this is always true\r\n // but this function can be used on other places in the future where it will work with dates out of quote dates range\r\n const isWithinRangeOfQuoteDate = dateStart === dates[0] && dateEnd === dates[dates.length - 1]\r\n\r\n const commonVirtualCacheProps = {\r\n idRevision: dates.length,\r\n ticker,\r\n timeframe,\r\n fromSeconds: dateStart,\r\n toSeconds: dateEnd,\r\n }\r\n const cachedDates = getCachedVirtualDates(commonVirtualCacheProps)\r\n if (cachedDates) {\r\n return cachedDates\r\n }\r\n if (!isIntraday || instrument !== Instrument.Stock) {\r\n if (isWithinRangeOfQuoteDate) {\r\n return dates\r\n }\r\n const timeframeSeconds = TIMEFRAME_SECONDS[timeframe]\r\n const firstDate = dates[0]\r\n const lastDate = dates[dates.length - 1]\r\n const numOfDatesBefore = Math.ceil((firstDate - dateStart) / timeframeSeconds)\r\n const numOfDatesAfter = Math.ceil((dateEnd - lastDate) / timeframeSeconds)\r\n return [\r\n ...Array.from({ length: numOfDatesBefore })\r\n .map((_, index) => firstDate - (index + 1) * timeframeSeconds)\r\n .reverse(),\r\n ...dates,\r\n ...Array.from({ length: numOfDatesAfter }).map((_, index) => lastDate + (index + 1) * timeframeSeconds),\r\n ]\r\n }\r\n\r\n const virtualTradedDays = isWithinRangeOfQuoteDate\r\n ? quote.getDaysInQuote()\r\n : getVirtualTradedDays({\r\n dateStartSeconds: dateStart,\r\n dateEndSeconds: dateEnd,\r\n datesSeconds: dates,\r\n marketStartMinutes,\r\n })\r\n\r\n const marketStartSeconds = marketStartMinutes * 60\r\n const barTimeframeSeconds = Array.from({ length: barsInDay }).map((_, i) => i * TIMEFRAME_SECONDS[timeframe])\r\n const quoteDatesTimestampOffset = Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateStart * 1000))\r\n const virtualDates = virtualTradedDays.flatMap((date) => {\r\n const daySeconds =\r\n date.getTime() / 1000 + Utils.getQuoteDateTimestampOffsetInSeconds(date) - date.getTimezoneOffset() * 60\r\n const dayStartSeconds = daySeconds + marketStartSeconds\r\n return barTimeframeSeconds.map(\r\n // Hourly market starts at 9:30 but all other time ticks should be rounded down to :00 of the current hour\r\n (barSeconds, index) =>\r\n ([TIMEFRAME.h, TIMEFRAME.h2, TIMEFRAME.h4].includes(timeframe) && index > 0 ? -1800 : 0) +\r\n dayStartSeconds +\r\n barSeconds\r\n )\r\n })\r\n\r\n if (!isWithinRangeOfQuoteDate) {\r\n virtualDates.filter((date, index, virtualTimeframeTradedDates) => {\r\n const isLowerBounded =\r\n date >= dateStart ||\r\n areTimestampsFromSameDay({\r\n ts1: date - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(date * 1000)),\r\n ts2: dateStart - quoteDatesTimestampOffset,\r\n })\r\n const isOneBeforeLowerBoundStarts = dateStart > date && dateStart < virtualTimeframeTradedDates[index + 1]\r\n return isLowerBounded || isOneBeforeLowerBoundStarts\r\n })\r\n }\r\n\r\n setCachedVirtualDates({\r\n ...commonVirtualCacheProps,\r\n virtualDates,\r\n })\r\n\r\n return virtualDates\r\n}\r\n\r\ninterface TimestampPositionGettersProps {\r\n quote: Quote\r\n}\r\n\r\nexport function getTimestampFromPositionX({ positionX, quote }: TimestampPositionGettersProps & { positionX: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (positionX >= 0 && positionX <= lastDateIndex) {\r\n const lowerIndex = Math.floor(positionX)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex, dates, timeframe })\r\n return dates[lowerIndex] + (positionX - lowerIndex) * timeframeSeconds\r\n }\r\n const isLookingBack = positionX < 0\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n const numOfSecondsOutOfBounds = isLookingBack\r\n ? Math.abs(positionX) * averageBarDate\r\n : (positionX - lastDateIndex) * averageBarDate\r\n return Math.round(isLookingBack ? dateStart - numOfSecondsOutOfBounds : dateEnd + numOfSecondsOutOfBounds)\r\n}\r\n\r\nexport function getPositionXFromTimestamp({ timestamp, quote }: TimestampPositionGettersProps & { timestamp: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (timestamp >= dates[0] && timestamp <= dates[dates.length - 1]) {\r\n const upperIndex = timestamp === dateEnd ? lastDateIndex : dates.findIndex((date) => date > timestamp)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex: upperIndex - 1, dates, timeframe })\r\n const positionDiffUpperTimestamp = (dates[upperIndex] - timestamp) / timeframeSeconds\r\n return upperIndex - positionDiffUpperTimestamp\r\n }\r\n const isLookingBack = timestamp < dateStart\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n return isLookingBack\r\n ? -((dateStart - timestamp) / averageBarDate)\r\n : lastDateIndex + (timestamp - dateEnd) / averageBarDate\r\n}\r\n\r\n// counterpart in Finviz-Website 'Finviz-Website/js/main/util.ts'\r\nexport function getInstrument(tickerRaw: string) {\r\n if (tickerRaw.indexOf('@') === 0) {\r\n const ticker = tickerRaw.substring(1) as keyof typeof CRYPTOS\r\n\r\n if (CRYPTOS[ticker]) {\r\n return Instrument.Crypto\r\n } else if (ticker.length === 6) {\r\n return Instrument.Forex\r\n } else {\r\n return Instrument.Futures\r\n }\r\n }\r\n return Instrument.Stock\r\n}\r\n\r\nexport function getPerfIndicatorTickerAndTimeframes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n}: {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n timeframe: TIMEFRAME\r\n}) {\r\n const { elements } = paneWithPerfIndicator\r\n const perfIndicatorElement = elements.find(({ type }) => type === 'indicators/perf')\r\n const tickers = perfIndicatorElement?.period?.split(',') ?? []\r\n return tickers.map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n }))\r\n}\r\n\r\ninterface PrefetchPerfIndicatorAllQuotesProps extends Pick {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n chartUuid?: string\r\n}\r\n\r\nexport async function prefetchPerfIndicatorAllQuotes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n}: PrefetchPerfIndicatorAllQuotesProps) {\r\n const tickersAndTimeframes = getPerfIndicatorTickerAndTimeframes({ paneWithPerfIndicator, timeframe })\r\n\r\n if (tickersAndTimeframes.length > 0) {\r\n const promises = tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\r\n Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n })\r\n )\r\n return Promise.all(promises)\r\n }\r\n return Promise.resolve([])\r\n}\r\n\r\ninterface RenderCrossProps {\r\n context: CanvasRenderingContext2D\r\n mouseModel: Mouse\r\n paneModel: Pane\r\n quote: Quote\r\n contentWidth: number\r\n contentHeight: number\r\n onRenderCrossText?: (context: CanvasRenderingContext2D, crossIndex: number) => void\r\n getRoundDecimalPlaces?: (price?: number) => number | undefined\r\n isIndicator?: boolean\r\n isPerfIndicator?: boolean\r\n}\r\n\r\nexport function renderCross({\r\n context,\r\n mouseModel,\r\n paneModel,\r\n quote,\r\n contentWidth,\r\n contentHeight,\r\n onRenderCrossText,\r\n getRoundDecimalPlaces,\r\n isIndicator = false,\r\n isPerfIndicator = false,\r\n}: RenderCrossProps) {\r\n const crossIndex = mouseModel.getCrossIndexForPane(paneModel)\r\n const chartModel = paneModel.chart()\r\n const { ChartSettings, IndicatorSettings } = getChartLayoutSettings(chartModel.chart_layout())\r\n const settings = isIndicator ? IndicatorSettings : ChartSettings\r\n const { Colors } = ChartSettings.general\r\n\r\n if (!mouseModel.getShouldRenderCrossInPane(paneModel)) {\r\n return false\r\n }\r\n\r\n const price = mouseModel.getPriceForPane(paneModel)\r\n const middle = paneModel.scale.x(crossIndex) + chartModel.leftOffset\r\n const isXAxisInView = middle > 0 && middle <= contentWidth\r\n if (isXAxisInView) {\r\n const x = middle + settings.left.width\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: settings.top.height,\r\n y2: settings.top.height + contentHeight,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n onRenderCrossText?.(context, crossIndex)\r\n }\r\n\r\n const domainRange = paneModel.scale.y\r\n .domain()\r\n .slice()\r\n .sort((a, b) => a - b)\r\n\r\n if (price === null || !(domainRange[0] <= price && price <= domainRange[1])) {\r\n return isXAxisInView\r\n }\r\n\r\n const priceFy = paneModel.scale.y(price)\r\n const y = Math.round(priceFy + settings.top.height)\r\n new Line(\r\n {\r\n x1: settings.left.width,\r\n x2: settings.left.width + contentWidth,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n const YAxisLeftMargin = quote.instrument === Instrument.Crypto && quote.lastClose <= 0.001 ? 3 : 8\r\n\r\n const getCrossText = () => {\r\n if (chartModel.scale === ScaleType.Percentage && !isIndicator) {\r\n return `${math.round({\r\n value: getPercentageFromValue({ number: price, base: chartModel.firstBarClose }),\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: 2,\r\n })}%`\r\n }\r\n return `${math.round({\r\n value: price,\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: getRoundDecimalPlaces?.(price) ?? (paneModel.getIsChartPane() ? undefined : 2),\r\n })}${isPerfIndicator ? '%' : ''}`\r\n }\r\n\r\n new Text(\r\n {\r\n text: getCrossText(),\r\n x:\r\n settings.left.width +\r\n settings.right.axis.margin.left! +\r\n contentWidth +\r\n (isIndicator ? OFFSET.S : YAxisLeftMargin - PADDING.XXS),\r\n padding: isIndicator\r\n ? Text.getMergedPropsWithDefaults('padding', IndicatorSettings.right.axis.font.padding)\r\n : {\r\n top: PADDING.XXS,\r\n right: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n },\r\n ...{\r\n y,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.crossText,\r\n background: Colors.crossTextBackground,\r\n font: Text.getMergedPropsWithDefaults('font', { ...settings.right.axis.font, style: 'bold' }),\r\n lineHeight: settings.right.axis.font.lineHeight,\r\n },\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n return true\r\n}\r\n\r\n/**\r\n * Set canvas width and height to 0 which fixes Safari memory problems\r\n *\r\n * @see https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n */\r\nexport function unmountCanvas(canvas?: HTMLCanvasElement | null) {\r\n if (!canvas) return\r\n\r\n canvas.width = 0\r\n canvas.height = 0\r\n canvas.style.width = '0px'\r\n canvas.style.height = '0px'\r\n}\r\n\r\nexport function getChangeColor({ change, ChartSettings }: { change: number; ChartSettings: IChartSettings }) {\r\n const { Colors } = ChartSettings.general\r\n if (change === 0) {\r\n return Colors.zeroChange\r\n }\r\n return change > 0 ? Colors.positiveChange : Colors.negativeChange\r\n}\r\n\r\nexport function round({ data, num, overridePlaces }: { data: Quote; num: number; overridePlaces?: number }) {\r\n return math.round({\r\n value: num,\r\n lastClose: data.lastClose,\r\n instrument: data.instrument,\r\n overridePlaces: overridePlaces,\r\n })\r\n}\r\n\r\nexport interface ITickerChange {\r\n points: number\r\n string: string\r\n percentString: string\r\n}\r\ninterface ITickerChangeResult {\r\n tickerChange: ITickerChange | null\r\n tickerAfterChange: ITickerChange | null\r\n}\r\n\r\nexport function getTickerChangeFromCloseValues({\r\n anchorClose,\r\n prevClose,\r\n data,\r\n}: {\r\n anchorClose: number\r\n prevClose: number\r\n data: Quote\r\n}): ITickerChange {\r\n const changePoints = anchorClose - prevClose\r\n const changePercent = (anchorClose / prevClose - 1) * 100\r\n const sign = changePoints < 0 ? '-' : changePoints > 0 ? '+' : ''\r\n const changePercentString = `${round({\r\n data,\r\n num: Math.abs(changePercent),\r\n overridePlaces: 2,\r\n })}%`\r\n const changePointsString = `${sign}${round({\r\n data,\r\n num: Math.abs(changePoints),\r\n })} (${changePercentString})`\r\n\r\n return {\r\n points: changePoints,\r\n string: changePointsString,\r\n percentString: `${sign}${changePercentString}`,\r\n }\r\n}\r\nexport function getTickerChange({ data }: { data: Quote }) {\r\n const result: ITickerChangeResult = { tickerChange: null, tickerAfterChange: null }\r\n const isChange = Number.isFinite(data.prevClose) // if not new stock always present\r\n if (isChange) {\r\n result.tickerChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.lastClose,\r\n prevClose: data.prevClose,\r\n })\r\n }\r\n\r\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\r\n if (isAfterChange) {\r\n const tickerAfterChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.afterClose,\r\n prevClose: data.lastClose,\r\n })\r\n result.tickerAfterChange = {\r\n ...tickerAfterChange,\r\n string: `AH: ${tickerAfterChange.string}`,\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function isForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\r\n return [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.futuresPage,\r\n ].includes(specificChartFunctionality)\r\n}\r\n\r\nexport function getShouldUseDarkerWickColors({\r\n specificChartFunctionality,\r\n totalBarWidth,\r\n}: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n timeFrame?: TIMEFRAME\r\n totalBarWidth: number\r\n}) {\r\n const isForexFuturesCrypto = isForexFuturesCryptoPage(specificChartFunctionality)\r\n const isOffscreenChartWithNarrowBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && totalBarWidth < 5\r\n const isQuoteChartWithNarrowBars =\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage && totalBarWidth < 5\r\n\r\n return isForexFuturesCrypto || isOffscreenChartWithNarrowBars || isQuoteChartWithNarrowBars\r\n}\r\n\r\nexport const DRAWING_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabled() {\r\n return Utils.getCookie(DRAWING_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport function setIsDrawingEnabled(value: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n Utils.setCookie(DRAWING_COOKIE_NAME, value ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function getIsSidebarEnabled(specificChartFunctionality?: SpecificChartFunctionality) {\r\n return specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n}\r\n\r\nexport const handleTypeChange = ({\r\n type,\r\n chartLayoutModel,\r\n}: {\r\n type: ChartElementType\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const elements = chartLayoutModel.getAllElements()\r\n elements.forEach((element) => {\r\n if (element.isChart() && element.instance.attrs.type !== type) {\r\n const pane = element.pane()\r\n const instance = chartsByType[type].fromObject(\r\n {\r\n ...element.instance.attrs,\r\n type,\r\n },\r\n pane\r\n )\r\n element.replace(instance)\r\n }\r\n })\r\n}\r\n\r\nexport const getIsPreserveDrawingsAndAutosaveAvailable = (args: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n editable: boolean\r\n editors: ChartEditorEnum[]\r\n}) => {\r\n const { specificChartFunctionality, editable, editors } = args\r\n\r\n return (\r\n editable &&\r\n editors?.includes(ChartEditorEnum.tools) &&\r\n specificChartFunctionality &&\r\n [\r\n SpecificChartFunctionality.chartPage,\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(specificChartFunctionality)\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `Website/js/main/components/color-picker/util.ts` in website repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string, allowAlpha = true) {\r\n const isRgb = getIsRgb(strColor)\r\n const hexColor = isRgb ? rgbaToHexString(rgbaStringToObject(strColor), allowAlpha) : strColor\r\n\r\n if (allowAlpha) {\r\n return hexColor\r\n }\r\n return hexColor.slice(0, 7)\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","import { ChartConfigChartPane, Position, RootChartConfigObject, TaConfigObject } from '../../types/shared'\r\nimport { ChartElementType, IndicatorType, OverlayType, PANE_HEIGHT_DEFAULT, ScaleType } from '../constants/common'\r\n\r\nfunction hasPaneWithCOTCode(panes: ChartConfigChartPane[], code: string) {\r\n return panes.some(({ elements }) =>\r\n elements.some((element) => element.type === IndicatorType.Cot && element.code === code)\r\n )\r\n}\r\nfunction pushIndicators(\r\n panes: ChartConfigChartPane[],\r\n indicator: { name: string; parameters: string },\r\n options?: { COTs?: string[] }\r\n) {\r\n if (indicator.name === 'cot') {\r\n const cotKeys = options?.COTs ?? []\r\n if (cotKeys.length === 0) {\r\n cotKeys.push('')\r\n }\r\n cotKeys.forEach(function (code: string) {\r\n if (!hasPaneWithCOTCode(panes, code)) {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: IndicatorType.Cot,\r\n code,\r\n },\r\n ],\r\n })\r\n }\r\n })\r\n } else {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: ('indicators/' + indicator.name) as IndicatorType,\r\n period: indicator.parameters,\r\n },\r\n ],\r\n })\r\n }\r\n}\r\n\r\nfunction getChartTypeByTaConfigStyle(style: string) {\r\n const chartTypeMap = {\r\n candlestick: ChartElementType.CandleStick,\r\n heikinashi: ChartElementType.HeikinAshi,\r\n hollowcandlestick: ChartElementType.HollowCandleStick,\r\n line: ChartElementType.LineChart,\r\n ohlc: ChartElementType.OhlcChart,\r\n }\r\n return chartTypeMap[style as keyof typeof chartTypeMap]\r\n}\r\n\r\nfunction getChartScaleByTaConfigScale(scale: string | undefined) {\r\n const chartScaleMap = {\r\n linear: ScaleType.Linear,\r\n percentage: ScaleType.Percentage,\r\n logarithmic: ScaleType.Logarithmic,\r\n }\r\n return chartScaleMap[scale as keyof typeof chartScaleMap] ?? ScaleType.Linear\r\n}\r\n\r\n/*\r\n * Merges chartConfig (in \"chart\" format) with taConfig (in format that TA is preserved in DB)\r\n */\r\nexport const mergeChartAndTAConfig = function convertTA(\r\n chartConfig: RootChartConfigObject,\r\n taConfig: TaConfigObject,\r\n options?: { COTs: string[] }\r\n) {\r\n const panes = chartConfig.charts[0].panes\r\n const chart = chartConfig.charts[0]\r\n\r\n chart.scale = getChartScaleByTaConfigScale(taConfig.scale)\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n chartConfig.height = chart.height = PANE_HEIGHT_DEFAULT.chart + (panes.length - 1) * PANE_HEIGHT_DEFAULT.indicator\r\n}\r\n\r\nexport const getPanes = function getPanes(taConfig: TaConfigObject) {\r\n const options = {}\r\n const panes: ChartConfigChartPane[] = []\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n return panes\r\n}\r\n","// if conditionalCursor provided, cursor is set only if current cursor !== conditionalCursor\r\n// otherwise cursor is set if element exists\r\nexport const setElementCursor = ({\r\n elementId,\r\n cursor,\r\n conditionalCursor,\r\n}: {\r\n elementId: string\r\n cursor: string\r\n conditionalCursor?: string\r\n}) => {\r\n const element = document.getElementById(elementId)\r\n if (element && (conditionalCursor ? element.style.cursor !== conditionalCursor : true)) {\r\n element.style.cursor = cursor\r\n }\r\n}\r\n","/*\r\n * We want to be able to render only bars/parts of line that are visible to users,\r\n * but without introducing visual artifacts like bars missing in front of users while scrolling\r\n * or lines that start in middle of chart for sparse intraday stock data.\r\n *\r\n * In general we want to start rendering lines one bar sooner than what is visible to user and stop rendering\r\n * one bar outside of visible area to create a continuous line.\r\n */\r\nimport { ScaleAxis } from '../models/pane'\r\nimport type Quote from '../models/quote'\r\n\r\nexport const drawInVisibleArea = ({\r\n quote,\r\n scale,\r\n fxOverride,\r\n fromIndexOffset = 0,\r\n toIndexOffset = 0,\r\n leftOffset,\r\n drawBarCallback,\r\n width,\r\n}: {\r\n quote: Quote\r\n scale: { x: ScaleAxis }\r\n fromIndexOffset?: number\r\n toIndexOffset?: number\r\n fxOverride?: (index: number) => number\r\n leftOffset: number\r\n width: number\r\n drawBarCallback: (i: number, x: number) => void\r\n}) => {\r\n const fx = fxOverride ?? ((index: number) => scale.x(quote.barIndex[index]))\r\n\r\n // We want to start rendering one bar outside of the visible area for two reasons:\r\n // 1. To create a seamless transition for bars entering/leaving the view, avoiding them from\r\n // abruptly dis/appearing when half the bar is outside.\r\n // 2. To prevent disconnected lines in case there's a bar gap.\r\n // However, if a `fromIndex` is provided and it's higher than the first visible bar,\r\n // we need to start rendering from that specific index. This ensures correct starting\r\n // points for elements like indicators that rely on this value.\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex({ quote, scale, leftOffset, fromIndexOffset })\r\n\r\n let lastBarToRender = -1\r\n for (let i = firstBarToRenderIndex; i < quote.close.length + toIndexOffset; i++) {\r\n const x = fx(i)\r\n if (x + leftOffset > width) {\r\n lastBarToRender = i\r\n break\r\n }\r\n drawBarCallback(i, x)\r\n }\r\n\r\n if (lastBarToRender > -1) {\r\n const x = fx(lastBarToRender)\r\n drawBarCallback(lastBarToRender, x)\r\n }\r\n}\r\n\r\nexport const getFirstBarToRenderIndex = ({\r\n leftOffset,\r\n quote,\r\n scale,\r\n compensateBarGap = true,\r\n}: {\r\n quote: Quote\r\n scale: { x: ScaleAxis }\r\n leftOffset: number\r\n compensateBarGap?: boolean\r\n}) => {\r\n const barIndex = Math.ceil(scale.x.invert(-leftOffset))\r\n const calculatedIndex = quote.barToDataIndex[Math.max(barIndex, 0)]\r\n const isBarGap = scale.x(quote.barIndex[calculatedIndex]) + leftOffset < 0\r\n\r\n // not all the time there is bar present on barIndex calculated via inverted leftOffset\r\n // there might be a gap between bars, if there is, barToDataIndex on that gap spot will have value of\r\n // previous bar which isn't visible, if compensateBarGap === true we need to check if that happend\r\n // and correct it if so by increasing calculated index by 1\r\n\r\n return { index: compensateBarGap && isBarGap ? calculatedIndex + 1 : calculatedIndex, isBarGap }\r\n}\r\n\r\nexport const getLastBarToRenderIndex = ({\r\n leftOffset,\r\n quote,\r\n scale,\r\n chartWidth,\r\n compensateBarGap = true,\r\n}: {\r\n quote: Quote\r\n scale: { x: ScaleAxis }\r\n leftOffset: number\r\n chartWidth: number\r\n compensateBarGap?: boolean\r\n}) => {\r\n const { barToDataIndex } = quote\r\n const barIndex = Math.ceil(scale.x.invert(-leftOffset + chartWidth))\r\n const calculatedIndex = barToDataIndex[Math.max(barIndex, 0)] ?? barToDataIndex[barToDataIndex.length - 1]\r\n const isBarGap = scale.x(quote.barIndex[calculatedIndex]) + leftOffset < 0\r\n\r\n return { index: compensateBarGap && isBarGap ? calculatedIndex + 1 : calculatedIndex, isBarGap }\r\n}\r\n\r\n// Get first bar to render compensated for fromIndexOffset\r\nexport function getCompensatedFirstBarToRenderIndex({\r\n quote,\r\n scale,\r\n leftOffset,\r\n fromIndexOffset = 0,\r\n}: {\r\n quote: Quote\r\n scale: { x: ScaleAxis }\r\n fromIndexOffset?: number\r\n leftOffset: number\r\n}) {\r\n return Math.max(0, getFirstBarToRenderIndex({ quote, scale, leftOffset }).index - 1, fromIndexOffset)\r\n}\r\n","import queryString from 'query-string'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\n\r\ninterface FetchApiProps {\r\n location: string\r\n queryParameters?: ObjectHash\r\n method?: string\r\n body?: RequestInit['body']\r\n contentType?: ContentType\r\n abortController?: null | AbortController\r\n throwOnStatusCodes?: number[]\r\n throwOnPredicate?: (response: Response) => boolean\r\n keepalive?: boolean\r\n}\r\n\r\nexport const getFormDataFromObject = (object: ObjectHash) =>\r\n Object.keys(object).reduce((formData, key) => {\r\n formData.append(key, object[key])\r\n return formData\r\n }, new FormData())\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/Finviz-Website/blob/master/Website/js/main/services/api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nconst fetchApi = async ({\r\n location,\r\n queryParameters,\r\n method,\r\n body,\r\n contentType,\r\n abortController,\r\n throwOnStatusCodes,\r\n throwOnPredicate,\r\n keepalive = false,\r\n}: FetchApiProps) => {\r\n const url = `${location}${queryParameters ? `?${queryString.stringify(queryParameters)}` : ''}`\r\n const parameters: RequestInit = {\r\n method: method || 'GET',\r\n credentials: 'include',\r\n headers: contentType && {\r\n 'Content-Type': contentType,\r\n },\r\n signal: abortController?.signal,\r\n body: body,\r\n keepalive,\r\n }\r\n try {\r\n const response = await fetch(url, parameters)\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n const responseData = parseResponseForContentType(await response.text(), responseContentType)\r\n if (throwOnStatusCodes?.includes(response.status) || throwOnPredicate?.(response)) {\r\n const StatusCodeError = getStatusCodeError(response.status)\r\n throw new StatusCodeError(`${url} returned ${response.status}`, responseData as T, response.status)\r\n }\r\n return responseData as T\r\n } catch (err) {\r\n throw err\r\n }\r\n}\r\n\r\nfunction getStatusCodeError(statusCode: number): typeof GenericStatusCodeError {\r\n switch (statusCode) {\r\n case 403:\r\n return ForbiddenError\r\n case 404:\r\n return NotFoundError\r\n case 410:\r\n return GoneError\r\n case 500:\r\n return InternalServerError\r\n default:\r\n return GenericStatusCodeError\r\n }\r\n}\r\n\r\nexport class GenericStatusCodeError extends Error {\r\n response: ObjectHash | string\r\n statusCode: number\r\n\r\n constructor(message: string, response: ObjectHash | string, statusCode: number) {\r\n super(message)\r\n this.response = response\r\n this.statusCode = statusCode\r\n }\r\n}\r\nexport class ForbiddenError extends GenericStatusCodeError {}\r\nexport class NotFoundError extends GenericStatusCodeError {}\r\nexport class InternalServerError extends GenericStatusCodeError {}\r\nexport class GoneError extends GenericStatusCodeError {}\r\n\r\nexport default fetchApi\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n const precision = Math.pow(10, numOfDecimalPlaces)\r\n return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string) {\r\n const periodParts = periodString.split(',')\r\n return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n console.error(exception)\r\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n import('@sentry/node').then((client) => {\r\n client.captureException(exception, captureContext)\r\n })\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n const string = `${value}`\r\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n value,\r\n min = Number.MIN_SAFE_INTEGER,\r\n max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n value: string | number\r\n min?: number\r\n max?: number\r\n}) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse (json: string | null = '') {\r\n try {\r\n return JSON.parse(json ?? '') as Result\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n return (e as unknown as MouseEvent).button === 0\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n const visited = new WeakSet()\r\n return (key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (visited.has(value)) {\r\n return\r\n }\r\n visited.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options,\r\n })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n","import { CanvasRenderingContext2D as NodeCanvasRenderingContext2D } from 'skia-canvas'\r\n\r\nimport {\r\n CanvasElementType,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n ChartEventType,\r\n IndicatorType,\r\n LayoutType,\r\n OverlayType,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../app/constants/common'\r\nimport ChartModel from '../app/models/chart'\r\nimport ChartLayout from '../app/models/chart_layout'\r\nimport { IChartThemeColors } from '../app/models/constants'\r\n\r\ninterface ISentry {\r\n captureException: (exception: any, captureContext?: { extra: ObjectHash }) => any\r\n captureMessage: (message: string, captureContext?: { extra: ObjectHash }) => any\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n Sentry: ISentry\r\n FinvizSettings: ObjectHash\r\n FinvizChartsSettings: ObjectHash\r\n globalChartConfig: RootChartConfigObject\r\n isRenderInProgress: boolean | number\r\n FinvizQuoteTypeCurrent: string\r\n handleScriptNotLoaded: () => void\r\n renderScriptNotLoaded: () => void\r\n gtag?: any\r\n }\r\n\r\n interface Document {\r\n fullscreenElement: any\r\n webkitFullscreenElement?: () => void\r\n mozFullScreenElement?: () => void\r\n msFullscreenElement?: () => void\r\n\r\n webkitExitFullscreen?: () => void\r\n mozExitFullScreen?: () => void\r\n msExitFullscreen?: () => void\r\n }\r\n\r\n interface HTMLElement {\r\n webkitRequestFullScreen?: () => void\r\n mozRequestFullScreen?: () => void\r\n msRequestFullscreen?: () => void\r\n }\r\n\r\n interface Navigator {\r\n msMaxTouchPoints: any\r\n }\r\n\r\n interface Array {\r\n last(): T | undefined\r\n }\r\n\r\n interface String {\r\n padLeft(paddingValue: string): string\r\n startsWith(str: string): boolean\r\n }\r\n\r\n type CanvasCache = Partial >\r\n\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n // We need to omit `canvas` because it is read only\r\n set >(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n\r\n interface HTMLCanvasElement {\r\n _cache: CanvasCache\r\n }\r\n\r\n interface ImageBitmapRenderingContext {\r\n _cache: CanvasCache\r\n }\r\n\r\n type RenderingContext2DType = CanvasRenderingContext2D | NodeCanvasRenderingContext2D\r\n}\r\n\r\ndeclare module 'skia-canvas' {\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n\r\n set >(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n}\r\n\r\nexport type TodoObjectHashAnyType = Record \r\nexport type TodoAreaObject = Record \r\nexport type ObjectHash = Record \r\nexport type EmptyObject = Record \r\n\r\nexport type TodoAnyType = any\r\n\r\nexport type ThumbType = string\r\n\r\nexport type PaneArea = {\r\n mouseDown?: boolean\r\n x: number\r\n y: number\r\n scaled: {\r\n x: number\r\n y: number\r\n }\r\n width: number\r\n height: number\r\n cursorX: number\r\n cursorY: number\r\n isCursorInChartWidthBoundaries: boolean\r\n} & T\r\n\r\nexport type Maybe = T | null | undefined\r\n\r\nexport interface DrawingBorder {\r\n color: string\r\n width: number\r\n}\r\n\r\nexport interface TextAttrs {\r\n text?: string\r\n background: string\r\n border?: { width: number; color: string }\r\n lineWidth?: number\r\n font: {\r\n size: number\r\n family?: string\r\n style?: string\r\n weight?: string\r\n }\r\n fillStyle?: string\r\n strokeStyle?: string\r\n angle?: number\r\n lineHeight: number\r\n textAlign?: TextAlign\r\n textBaseline: TextBaseline\r\n padding: {\r\n top: number\r\n right: number\r\n bottom: number\r\n left: number\r\n }\r\n}\r\n\r\nexport interface Point {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type RequireByKey = Omit & Required >\r\n\r\nexport interface ResizeByThumbFuncProps {\r\n type: ThumbType\r\n difX: number\r\n difY: number\r\n area: PaneArea \r\n}\r\n\r\nexport type ResizeByThumbWithTypeAndDifs = RequireByKey \r\n\r\nexport interface ChartConfigChartPaneElement {\r\n type: ChartElementType | CanvasElementType | IndicatorType | OverlayType | ChartEventType\r\n overlays?: OverlayConfigObject[]\r\n period?: string\r\n code?: string\r\n elementId?: string | null\r\n zIndex?: number\r\n}\r\n\r\nexport interface RendererChartBarProps {\r\n index: number\r\n chartSettingsColors: IChartThemeColors\r\n hasFillAndBorder?: boolean\r\n}\r\n\r\nexport interface ChartConfigChartPane {\r\n elements: ChartConfigChartPaneElement[]\r\n height: number\r\n chart?: ChartConfigObject | ChartModel\r\n}\r\n\r\nexport interface IIdea {\r\n id?: number\r\n date?: string\r\n note: string\r\n}\r\n\r\nexport interface ChartConfigObjectExtended {\r\n editable: boolean\r\n canChangeTicker: boolean\r\n scrollable: boolean\r\n cross: boolean\r\n ideas: boolean\r\n editors: ChartEditorEnum[]\r\n specificChartFunctionality: SpecificChartFunctionality\r\n theme: Theme\r\n layout: LayoutType\r\n uuid?: string\r\n idea?: IIdea\r\n}\r\n\r\nexport interface ChartConfigObject {\r\n width: number\r\n height: number\r\n panes: ChartConfigChartPane[]\r\n premarket: boolean\r\n aftermarket: boolean\r\n dateRange: string | null\r\n hasChartEvents?: boolean\r\n stretch?: boolean\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n chart_layout: ChartLayout\r\n zoomFactor: number\r\n leftOffset: number | null\r\n refreshData: boolean | number\r\n isHideDrawingsActive: boolean\r\n isScrolled?: boolean\r\n scale: ScaleType\r\n}\r\n\r\nexport type RootChartConfigObjectChart = Omit<\r\n ChartConfigObject,\r\n 'chart_layout' | 'leftOffset' | 'zoomFactor' | 'isHideDrawingsActive'\r\n>\r\nexport interface RootChartConfigObject extends Partial {\r\n charts: Array \r\n width: number\r\n height: number\r\n newCharts?: boolean\r\n useGrid?: boolean\r\n}\r\n\r\nexport interface TaConfigObject {\r\n indicators: IndicatorConfigObject[]\r\n overlays: OverlayDatabaseRecordObject[]\r\n height: number\r\n style: string\r\n scale: string\r\n}\r\n\r\nexport interface IndicatorConfigObject {\r\n name: string\r\n parameters: string\r\n position: Position\r\n}\r\n\r\nexport interface OverlayConfigObject {\r\n color: string\r\n period: string\r\n type: OverlayType\r\n}\r\n\r\nexport interface OverlayDatabaseRecordObject {\r\n name: string\r\n parameters: string | null\r\n color: string | null\r\n}\r\n\r\nexport enum Instrument {\r\n Stock = 'stock',\r\n Crypto = 'crypto',\r\n MarketSentiment = 'market_sentiment',\r\n Futures = 'futures',\r\n Forex = 'forex',\r\n Group = 'group',\r\n}\r\n\r\nexport enum Theme {\r\n light = 'light',\r\n dark = 'dark',\r\n}\r\n\r\nexport interface IModalConfig {\r\n title: string\r\n inputs: IModalConfigInput[]\r\n inputsErrorMessages: ObjectHash\r\n}\r\nexport interface IOptionType {\r\n value: string | number\r\n label: string\r\n}\r\nexport interface IModalConfigInput {\r\n type: React.HTMLInputTypeAttribute\r\n label: string\r\n name: string\r\n value: number | string\r\n required?: boolean\r\n min?: number\r\n color?: string\r\n step?: number\r\n items?: IOptionType[]\r\n}\r\n\r\nexport enum Position {\r\n Above = 'above',\r\n Below = 'below',\r\n}\r\n\r\nexport enum DefaultSpineEvents {\r\n Change = 'change',\r\n Destroy = 'destroy',\r\n Refresh = 'refresh',\r\n Update = 'update',\r\n}\r\n\r\nexport enum CustomSpineEvents {\r\n IndicatorsChange = 'indicatorsChange',\r\n ManualChange = 'manualChange',\r\n}\r\n\r\nexport enum DrawingSpineOptionsEvent {\r\n Remove = 'remove',\r\n}\r\n\r\nexport interface DrawingSpineOptions {\r\n eventType: DrawingSpineOptionsEvent\r\n}\r\n\r\nexport type TodoButtonProps = ObjectHash\r\nexport type TodoButtonTheme = string\r\n"],"names":["MarketBadgeType","getMarketBadgeText","type","_date","Open","label","Closed","Premarket","Aftermarket","MarketBadge","_ref","badge","className","None","_jsx","classnames","includes","UPDATE_INTERVAL","TimeBreakpointMode","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","getTimeState","fixedTime","hasUserPremium","arguments","length","undefined","FinvizSettings","time","getDate","isHoliday","isPremarket","isAftermarket","getMarketBadgeType","TooltipBadge","props","state","useTooltipState","placement","_jsxs","_Fragment","children","TooltipTrigger","Tooltip","Heading","level","StaticBadge","findMatchingBreakpoint","compareWidth","breakpoints","filter","breakpoint","pop","getCurrentWidth","mode","element","window","innerWidth","clientWidth","Time","breakpointMode","ResizeObserver","useResizeObserver","rootRef","React","setState","currentBreakpoint","setBreakpoint","interval","setInterval","clearInterval","current","currentWidth","handleResize","throttle","foundBreakpoint","observer","entries","requestAnimationFrame","Array","isArray","observe","addEventListener","disconnect","removeEventListener","ref","getFormattedDateString","QueryClientContext","queryOptions","client","QueryClient","defaultOptions","queries","useErrorBoundary","refetchOnWindowFocus","QueryClientProvider","ErrorBoundary","FallbackComponent","DefaultErrorBoundary","withQueryClientContext","Component","config","hocComponent","displayName","ListContext","useListState","options","Reakit","loop","unstable_virtual","ListItem","as","activeTheme","onSelectItem","onClick","onKeyPress","closeOnSelect","ev","currentTarget","id","itemProps","active","Boolean","Button","role","BUTTON_DEFAULT_ELEMENT","align","theme","contentClass","List","selectedIndex","direction","includeBaseStyles","onChange","prevSelected","items","move","closeParent","findIndex","item","Provider","value","map","child","DEFAULT_ELEMENT","ComboBoxItem","asComponent","selected","currentId","ComboBox","inputProps","popoverProps","inputTestId","ariaLabel","isFullyClosed","getExtendedDialogState","zIndex","useZIndex","autoFocus","unstable_referenceRef","focus","preventScroll","Input","onKeyDown","key","inputValue","Portal","_ref2","onTransitionEnd","onAnimationEnd","innerProps","Box","onMouseUp","INSTRUMENT_CATEGORIES","name","instrument","Instrument","Stock","Futures","Forex","Crypto","Centered","SearchError","Icon","width","Paragraph","size","href","link","toContact","resetErrorBoundary","Highlight","highlight","text","index","toLowerCase","indexOf","processedText","useMemo","before","substring","after","SearchItem","ticker","chartIndex","company","exchange","getRedirectForTicker","tickerRaw","getSanitizedTicker","redirectLink","cleanTicker","getInstrumentForTicker","toQuote","toForexChartDetail","toFuturesChartDetail","toCryptoChartDetail","toSearch","quoteSearchExt","SearchList","data","isLoading","useQuery","searchApiRequest","enabled","keepPreviousData","cacheTime","staleTime","setAnimated","hide","animated","isShowAllVisible","COMPONENT_ANIMATION_DURATION","Spinner","isSearchItemLink","preventDefault","onTickerSelected","setInputValue","encodeURIComponent","currentValue","Search","isSearchIcon","reset","useQueryErrorResetBoundary","minValueLength","defaultValue","defaultPlacement","modal","inline","unstable_offset","listState","orientation","category","setCategory","changeCategory","first","onInputKeyDown","visible","stopPropagation","placeholder","autoComplete","autoCorrect","autoCapitalize","maxLength","onBlur","e","inputClass","rightContent","leftContent","popoverClass","isMatchInputAndBoxWidth","style","getBoundingClientRect","maxWidth","location","allowCategorySwitching","onReset","resetKeys","Element","Spine","static","CanvasElementType","fromObject","obj","model","this","getNumOfBarsBuffer","_","isCreator","isCreatorDialogOpen","attrs","_thumbs","activeThumb","isMouseDown","isSelected","isHovered","isEditInProgress","edgeXYValues","constructor","values","super","getDefaults","set","defaults","onMouseDown","bind","onMouseMove","getIsChartEvent","chartEvents","findByAttribute","elements","trigger","getThumbs","moveBy","__","setIsSelected","setIsHovered","getShouldRenderThumbs","getIsPaneSelection","paneModel","pane","selection","attrsSubset","Object","keys","reduce","acc","JSON","stringify","customizer","objValue","srcValue","getIsDrawing","mergewith","getIsCreator","cachePointPositionTimestamp","get","getBoundingPointKeys","fx","x","scale","fy","y","scaled","forEach","el","defineProperty","render","renderThumbs","context","globalAlpha","thumb","area","isInArea","startEditing","mouseDown","moveTo","quote","chart","xPointKeys","positionTimestamps","positionX","getTimestampFomPositionX","updateScales","pointPoitionsFromTimestamp","timestamp","getPositionXFromTimestamp","thumbsAreInArea","isDrawingElementLockedOrInvisible","chart_layout","isLockDrawingsActive","getIsVisible","getModalConfig","getModalConfigBase","merge","modalConfig","inputs","push","title","input","default","toObject","toConfig","getAutosaveOmittedProperties","toAutosaveConfig","omit","replaceMyself","setTimeout","replace","Sentry","captureMessage","extra","oldElement","newElement","toString","getIsCreatorDialogOpen","release","unbind","getChartLayoutSettings","startsWith","micro","macro","MicroMacroTimeframe","timeframe","visibility","isInRange","min","from","max","to","setVisibilityTo","setTo","currentIndex","MacroTimeframe","timeframesToSet","attrsToSet","SetVisibilityTo","currentAndAbove","currentAndBelow","currentOnly","all","assign","getEdgeXYValues","xPoints","yPoints","minX","Math","maxX","positionY","minY","maxY","getIsInChartView","omitX","isMaxXInvalid","isNaN","isMinXInvalid","leftOffset","omitY","topBound","invert","bottomBound","height","Line","line","resize","Thumb","x1","y1","x2","y2","lineWidth","strokeStyle","ElementSettings","Colors","roundedXY","getRoundedObject","translateXY","getXYOffsetFromLine","translate","beginPath","dashLength","setLineDash","lineTo","stroke","difX","difY","math","distanceToSegment","DEFAULTS","font","family","weight","lineHeight","textAlign","TextAlign","left","textBaseline","TextBaseline","alphabetic","padding","top","right","bottom","Text","getMergedPropsWithDefaults","propKey","initClass","prototype","setupContext","measure","count","getLines","f","required","textWithoutBackground","color","fillStyle","angle","save","rotate","PI","fillText","restore","renderBackground","renderText","lines","measureText","Number","MIN_SAFE_INTEGER","testArea","convertArea","split","background","rawHight","rect","fill","renderBorder","closePath","border","borderWidth","ChartSettings","getHeight","lastX","lastY","ThumbSettings","borderColor","thumbWidth","getThumbWidth","offset","getOffsetFromLineWidth","canvas","document","createElement","callback","rendered","refresh","ratio","drawImage","cWidth","cHeight","sWidth","screen","sHeight","getScaleRatio","setSizeOnCanvasElement","canvasElement","OHLCType","ChartMinWidthBreakpoints","getChartBreakpoints","chartWidthInPx","isXs","xs","isS","s","isM","m","isL","l","getDateString","date","dateString","month","getMonth","year","getFullYear","day","TIMEFRAME","i1","i2","i3","i5","i10","i15","i30","h","h2","h4","t","getHours","padLeft","getMinutes","MONTHS","d","w","getClosestDifferentMinMaxValueIndices","currentMinIndex","currentMaxIndex","high","low","hasPreviousIndex","hasNextIndex","minIndex","maxIndex","gray300","tailwindColors","BaseChart","_ref4","overlays","overlay","overlaysByType","specificChartFunctionality","tickerWidth","changeWidth","lastOhlc","isLargeChart","shouldRenderVolume","afterChange","chartLayoutModel","isMobile","utils","overlayDefinition","convertColorToHEX","addOverlay","renderYAxis","renderCrossText","setupCache","renderOverlaysLabels","CustomSpineEvents","IndicatorsChange","handleIndicatorsChange","mouseModelChangeHandler","mouseModel","unmountCanvas","baseCache","updateShouldRenderVolume","renderChart","Error","close","renderChartNotAvailable","getIsRedesignedChart","renderTicker","clip","renderVolume","renderOverlays","renderPrevClose","renderFadeExtendedHours","renderGrid","renderXAxis","tickerText","getIsSmallIndexChart","general","margin","FONT_SIZE","XXS","OFFSET","baseline","renderTimeframe","volumeFY","range","Group","getTimeframeLabel","textSecondary","center","L","SpecificChartFunctionality","offScreen","XS","renderChange","getOHLC","directRender","_ref5","changePercentage","lastDate","renderOHLC","isSmallIndexChart","isNewestOHLC","open","volume","numberToStringWithUnitsSuffix","afterHour","isFinite","afterClose","lastClose","roundOhlc","lastVolume","last","toLocaleTimeString","hour","minute","getRoundedLastData","lastOpen","lastHigh","lastLow","renderOverlaysLabelsChartsPage","renderOverlaysLabelsQuotePage","overlayLabel","isRenderedOverlaysLabel","labelSpacing","getLabelColor","getYAxisLeftMargin","getYAxisLastCloseLabel","_ref6","firstVisibleClose","ScaleType","Percentage","round","getPercentageFromValue","number","base","renderLabels","lineTicks","textTicks","lastCloseLabel","getTranslate","xOffset","yOffset","do","tickCount","floor","minMax","getMinMax","placesAxis","stepPrice","scaleRange","updateAttribute","minPerc","maxPerc","d3","domain","nice","ticks","tick","getValueFromPercentage","Logarithmic","pixelGap","negativeScale","previousNegativeTick","unshift","positiveScale","previousTick","positiveScaleY","abs","getYLineText","val","places","yTickText","axis","middle","yTickLine","getYLine","resetYTicksStyles","i","percentageZeroLineText","undo","renderYAxisLabel","yCoordinate","getSecondaryLabelBackgroundColor","stringifyHSVAColor","getHSVAFromColor","currentBackground","getYAxisSecondaryLabelYCoordinate","_ref7","mainLabelValue","secondaryLabelValue","sign","LINE_HEIGHT","S","PADDING","mainLabelValuePosition","secondaryLabelValuePosition","offsetedY","_ref8","currentText","getDrawDays","MarketSentiment","textRenderer","startBarIndex","getFirstBarToRenderIndex","endBarIndex","getLastBarToRenderIndex","chartWidth","ChartElementType","LineChart","render15MinXAxis","renderIntradayXAxis","renderIntradayXAxisFutures","renderDailyXAxis","renderWeeklyXAxis","renderMonthlyXAxis","isXPointVisible","buffer","renderXAxisLabels","_ref9","labels","allowedOverflow","sortedLabels","renderedLabelRanges","reverse","textWidth","newLabel","hasPriority","_ref10","halfOfTextWidth","overflowLeft","overflowRight","labelX","some","_ref3","getIsOverlapping","M","IntradayTimeframeInterval","marketStartHour","marketStartMinutes","marketEndHour","ceil","aftermarketLengthMinutes","xLine","getXLine","barWidth","getBarWidthWithMargin","zoomFactor","chartLayout","dayToOffset","getDayToOffset","dayIndex","dateFromDateString","drawMinutesPerDay","roundedX","premarketLengthMinutes","_ref11","lastDay","lastHours","NaN","hours","_ref12","indexOffset","barIndex","getBarsInDay","_ref13","lastMonth","_ref14","gridSecondary","isYearLabel","_ref15","lastYear","isJanuary","getIsIndicatorPresent","IndicatorType","Vol","getVolumeTicks","maxHeight","fontHeight","renderVolumeAxis","relativeVolume","toFixed","grid","fillRect","strokeRect","rangeMax","volumeAxisFontSize","volumeAxis","format","tickFormat","domainFrom","domainTo","setupAxisTimeFrame","halfBarWidth","getHalfBarWidth","barWidthWithoutMargin","getBarWithoutMarginWidth","drawInVisibleArea","drawBarCallback","volumeTrendDown","volumeTrendUp","renderContent","renderCross","isRendered","contentWidth","contentHeight","getRoundDecimalPlaces","price","getPlacesLastClose","onRenderCrossText","getCrossIndexForPane","setElementCursor","elementId","getHTMLElementId","cursor","conditionalCursor","getDataByCrossIndex","crossIndex","shouldReturnRoundedString","n","getDataByBarIndex","getCrossIndexChange","crossDataIndex","getDataIndexByBarIndex","crossClose","previousClose","getTickerChangeFromCloseValues","anchorClose","prevClose","dateByBarIndex","virtualTradedDates","getVirtualTimeframeTradedDates","dateStart","dateEnd","_ref16","change","ohlc","tickerChange","tickerAfterChange","getTickerChange","isOffscreen","isGroupInstrument","changeText","percentString","string","getChangeColor","points","afterChangeText","afterChangeTextWidth","oneLineAHChangeWidth","parameters","renderOHLCChartsPage","renderOHLCQuotePage","_ref17","chartBreakpoints","OhlcText","getHEXWithSpecificAplha","canvasFill","dateElements","trendColor","oElements","hElements","lElements","cElements","volElements","changeElements","getFlatLineArrayWithSpaces","lineElements","flatMap","startX","lineElement","LabelsText","numberOfNewOhlcLines","_ref18","dateOnly","timeOnly","lineTopY","OHLCFontSize","centerXOffset","leftXOffset","OHLC","ohlcString","singleLine","OHLC_TEXT","getOHLCType","ohlcSettings","getOHLCSettings","CHART_MARGIN","XXL","alignTop","renderOHLCToCanvas","_ref19","ohlcSet","isSingleLineWithChange","period","parseInt","n0","n1","x0","premarketFade","aftermarketFade","shouldShowPrevClose","isStock","isIntradayWithPreMarket","TIMEFRAMES_WITH_PRE_MARKET","isIndexChart","smallIndex","Cache","getIsMobileChartPage","setupAxis","volumeHeight","volumes","addMarginBottom","marginBottom","setOverlays","removeOverlay","splice","MAX_VALUE","MIN_VALUE","firstBarToRenderIndex","compensateBarGap","lastBarToRenderIndex","isBarGap","firstIndexNormalized","closestMinMaxIndices","dateRange","overridePlaces","num","placesLastClose","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","priceAbs","hasOverlay","chartPage","getCandleLikeChartsRenderingColors","colors","overwrittenColors","getColorOverwrites","overwrittenColorKeys","hasOverwrittenCandleColor","colorKey","Theme","light","getShouldUseDarkerWickColors","totalBarWidth","darkerWickColors","thinBarColorsOverride","isRedesignedPage","CandleStick","Chart","getRenderChartBarProps","chartSettingsColors","hasFillAndBorder","trendDown","trendUp","borderDown","borderUp","wickDown","wickUp","wickColor","barFillColor","shouldRenderFillAndBorder","HollowCandleStick","translateForWick","WICK_WIDTH","candleBodyHigh","candleBodyLow","candleWickHigh","candleWickLow","candleBodyHeight","candleBodyLeftX","halfBorderWidth","getIsSSr","isBodyHeightGreaterOrEqualBorders","isWickLineCandleLessThanOnePixel","hasBorder","fillHeight","hasFill","isHollow","generalTrendColor","ohlcTrendUp","ohlcTrendDown","zeroChange","HeikinAshi","haData","getHeikinAshiData","getLastValues","originalLatestClose","heikinLatestCloseLabel","originalLatestCloseLabel","redLine","greenLine","MarketSentimentSettings","arr","sum","_data","lastIndex","_dataLastIndex","renderLineBullBear","array","oversold","overbought","isRedesign","isRedesignEnabled","marketDown","marketUp","_compute","computeVisibleMinMax","yLine","fillUp","fillDown","percent","months","MultiLineChart","tickersDimensions","ColorsSettings","quotes","getQuotes","tickers","end","asc","maxTickerLength","isLastDate","XXXS","closeValue","_len","arrays","_key","q","Quote","select","isIdeaId","ideaID","OHLCChart","OhlcChart","barWithoutMarginWidth","lineThickness","handleLengthFromWick","lineOffset","barX","PerfChart","overlayLabelWidth","perf","shouldRenderDate","tickerData","MARGIN","hasData","percentageText","lastCrossIndex","fromDate","Date","toDate","filteredQuotes","closes","daysCount","end1","asc1","end2","asc2","monthsInData","availableTickSpots","monthsToAvail","renderMonth","chartsByType","freeze","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","perfChart","XXXL","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","ChartEditorEnum","LayoutType","OverlayType","ChartEventDbType","ChartEventType","ChartEventBadgeType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","LAYOUTS","columns","rows","gridAreas","SORT_DIRECTION","ASC","DESC","DateRangeType","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","QuotePollingIntervalInMs","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","Linear","PANE_HEIGHT_DEFAULT","indicator","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","QuotePageQueryChartTypes","minutes","days","weeks","MicroTimeframeRange","prev","curr","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CustomDateRangePrefixEnum","DATE_RANGE_PREFIX_DELMITER","getParsedDateRange","getVisibleBarsNumber","start","startInSec","getTime","endInSec","lastQuoteDateIndex","lastVisibleBarIndex","numOfVisibleBars","d1","d5","firstVisibleBarIndex","quoteDate","isQuoteDateInRange","numOfBarsOffset","getChartZoomAndLeftOffset","chartVisibleWidth","chartModel","numOfBarsToRender","getZoomFactorForBarsToDisplay","getLeftOffset","numberOfBarsToDraw","getChartStartEndDates","daysInQuote","getDaysInQuote","dateFromUnixTimestamp","anchorDate","dateRangePrefix","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","dateFns","Prev","years","parseCustomDateRangeUrlParam","convertLocalToNyTime","setHours","startDateIndex","m1","m3","m6","ytd","y5","getMinMaxLeftOffset","newLeftOffset","numOfBarsInView","Utils","getIntradayChartConfig","timeframeMinutes","barWidthWithMargin","hasPremarket","hasAftermarket","fullChartWidth","marketMinutesLength","getFullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","getBarIndex","shouldAlignDaysToLeftApplied","stretch","shouldAlignDaysToLeft","drawDaysInOneChart","premarket","aftermarket","lastQuoteDate","barsToOffset","offsetChartInPx","isStockIntraday","isIntraday","isQuoteOrOffscreen","quotePage","isChartPage","isChartsInradayDateRange","canvasCtx","Settings","getSettings","IndicatorSettings","isIndicator","getShouldOffsetChartDomain","elementModel","recountScale","getAllElements","getAllChartEvents","instance","isChart","scaleType","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","CHART_EVENT_BADGE_SIZE","minPx","extendedMin","rounded","fromEntries","updateZoomAndLeftOffsetByDateRange","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","reversedDaysInQuote","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","updateAttributes","renderPane","shouldRenderCross","clearRect","elementInstance","isDrawing","isChartEvent","isHideDrawingsActive","add","tr","BigNumber","BIG_NUMBER_VALUES","Thousand","Million","Billion","Trillion","BIG_NUMBER_ZEROES","BIG_NUMBER_SUFFIX","dotProduct","p1","p2","crossProduct","distance","sqrt","pow","lineEquation","a","b","c","k","pointInPolygon","point","polygon","j","oddNodes","p","distanceToLine","l2","getInstrumentDecimalPlaces","formatBigNumber","minNumber","absNum","getString","suffix","zeroes","str","splitString","addZeroes","padEnd","numberByZeroesCount","result","isInteger","perpendicularPointToLine","yAxisCoeficient","xAxisCoeficient","radAngle","atan2","cos","sin","rotatedPointCoordinates","rotationAxisPoint","pointToRotate","sharedPointLinesAngle","sharedPoint","oldLinePoint","newLinePoint","atan","twoSegmentLinesIntersection","p3","p4","denominator","ua","ub","checkLineIntersection","line1_p1","line1_p2","line2_p1","line2_p2","onLine1","onLine2","numerator1","numerator2","getRayToLineSegmentIntersection","rayOrigin","rayEnd","segmentStart","segmentEnd","lineIntersection","subtractPoints","getMiddlePointOnLineSegment","P1","P2","normalizeVector","v","multiplyVectorByScalar","scalar","addPoints","ExponentialMovingAverage","multiplier","EMACalculation","MainCalculation","Ema","getDefaultCalculatedValues","ema","calculate","onValueCalculated","_calculatedValues","calculatedValues","Indicator","getAllCalculatedValues","lastNItems","getCalculatedValues","slice","getDbColumnName","sort","key1","key2","localeCompare","join","ChartSyncablePart","ChartPartToAttrsSyncMap","Ticker","Timeframe","ChartSyncableParts","Crosshair","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","chartLightTheme","chartDarkTheme","cross","crossText","crossTextBackground","indicatorCurrentBackground","indicatorCurrentText","negativeChange","overlayTransparentBackground","performanceIndicatorLabel","positiveChange","indicatorLightTheme","signalLine","indicatorDarkTheme","elementLightTheme","elementDarkTheme","generalColors","AutoSaveState","MARKET_START","END_OF_DAY","roundTimeForSyncedPane","sourceChart","targetChart","dateToReturn","sourceChartHasPremarket","targetChartHasPremarket","setDate","lastDayOfMonth","lastDayOfWeek","weekStartsOn","endOfDay","getIsDateBeforeMarketStart","Mouse","configure","belongsTo","Pane","getIsCrossSyncOn","getIsChartPartInSync","getIsMouseInChartOfPane","eql","getShouldRenderCrossInPane","position","paneOfMouse","mouseInChart","currentPaneChart","mousePositionTimestamp","currentPanePositionX","getPriceForPane","mousePaneIndex","getIndexInChart","mouse","create","CHART_EVENT_BADGE_TYPE_ORDER","chartEventElementModel","hasMany","destroyCascade","destroy","omitKeys","chartPanes","getAllPanes","chartPane","find","getIsIndicatorPane","targetPane","currentChartPaneRecords","records","chart_id","ohterChartPaneRecords","targetRecordIndex","record","arrayWithoutTargetRecord","chartRecordIndex","panesAbove","panesBelow","Position","Above","getNumericId","Below","concat","isSorted","getChartOrIndicatorElement","mainElement","getIsChartPane","resetHeight","getElementZIndexRange","getBelowAboveZeroElements","allPaneElements","elementsBelowZero","elementsAboveZero","normalizeZIndexes","rebuildElementZIndexes","elementsArray","isBelowZero","getQuoteRawTicker","updateChartEventsZIndexes","hasOwnProperty","hoveredChartEvent","chartEvent","openedChartEvent","isOpen","hoveredTypeChartEventElements","openedTypeChartEventElements","nonActiveChartEventElements","chartEventsOnSameXPoint","chartEvent_B","yIndex","isOpened","isHoveredType","isOpenType","getChartEvenBadgeType","quoteCache","getCachedQuote","cid","fetchedAt","cachedAt","setCachedQuote","emptyQuote","numberOfRefreshChecks","isFetching","is404","COTs","patterns","patternsMinRange","patternsMaxRange","dataId","abortController","shouldUseCache","chartUuid","doesQuoteAndFetchParamsMatch","uuid","isSameOrNoChartUuid","isNotEmptyQuote","cachePredicate","isCacheAllowed","hasPatterns","events","doesQuoteAndOptionsMatch","getResolvedFetchingPromise","fetchNewDataOnCachedQuote","fetchData","fetchType","QuoteFetchType","NewerData","newQuote","maxBars","Refetch","getAll","tickersAndTimeframes","Promise","accumulator","err","fetchRequest","QuoteFetchTypeUrlOption","New","wasFetchAborted","fetchingPromise","fetchApi","getUrl","throwOnStatusCodes","getIsAbortError","NotFoundError","shouldUseEmptyQuote","isPossibleToFetchSequentialData","Newer","noNewData","newQuoteData","lastTime","afterTime","now","AIndex","BIndex","mergeIndex","ADate","BDate","prevAIndex","prevDate","newDate","isSameWeek","isSameMonth","console","warn","thisDateLength","dataDateLength","fetchOlderData","load","atts","drawDays","getBarIndexes","barToDataIndex","eventType","Earnings","dateTimestamp","getChartEventsWithId","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dateStringFromDate","yyyy","mm","dd","String","padStart","dataIndex","getDateToIndex","cachedDateToIndex","dateToIndex","getTimestampFromPositionX","host","process","env","BE_API_URL","queryString","rev","getRawTicker","getRawTickerForInstrument","clearData","largeChartFontSize","INTERACTIVE_CHART_SETTINGS","dark","settingsHeight","tickerTimeframeChangeHeight","barMargin","indicatorLabel","touchSize","defaultFill","defaultTransparentFill","chartSettings","settings","colorsOverride","settingColors","charts","updateSettings","isLight","handleRemoveIndicatorPane","paneIndex","getAllCharts","getNormalizedZIndex","newZIndex","changeElementZIndexes","addElement","oldZIndex","BbCalculation","Bb","sma","stdDev","upperBand","lowerBand","deviations","stdDevSum","Overlay","periodInt","getParsedIntegersFromPeriodString","getFreeColor","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","inputsErrorMessages","periods","getRGBAValueFromValidColorString","BB_COLORS","TOP","BOTTOM","MIDDLE","DEFAULT_PARAMETERS","BollingerBands","periodStr","parseFloat","parsePeriod","scaledTop","scaledBottom","firstBarToRender","lastBarToRender","bbCalculation","step","topColor","bottomColor","COLORS","DonchianChannels","Dch","medianBand","strokeColor","channelStrokeColor","fillColor","channelFillColor","medianBandColor","EMA","EMA2","Ema2","HighLow","Hilo","halfWidth","highColor","prevHigh","highestHigh","lowColor","prevLow","prevBar","lowestLow","HorizontalLine","Hline","isPositiveFloat","Stroke","Fill","Conversion","Base","SpanB","conversion","spanB","IchimokuCloud","Ic","renderFull","outsideBar","spanAFillColor","spanAStrokeColor","spanBFillColor","spanBStrokeColor","baseLineColor","conversionLineColor","laggingSpanColor","conversionLine","baseLine","senkouSpanA","senkouSpanB","conversionStartIndex","baseStartIndex","spanBIndex","highestHi","lowestLo","lastSpanAX","lastSpanBX","cloudStartingX","fxOverride","toIndexOffset","IchimokuCloudFull","Icf","KeltnerChannel","Kch","emaPeriod","atrPeriod","atr","AverageTrueRange","middleLine","Patterns","originalScale","barsInDay","scaleY","aboveBelow","textHS","above","below","supportColor","resistColor","pattern","x3","y3","kind","Calculation","PivotPeriod","PivotPoints","Pp","calculationType","getPeriodType","week","getIsEnoughData","startIndex","endIndex","periodType","dayGap","startDay","beforeDay","calculatedX","fromX","toX","currentDate","previousTradingDay","previousNYMidnightTimestamp","currentMidnight","currentNYMidnightTimestamp","ts","diff","isNonStockFullDay","isStockFullDay","firstDayCurrentWeek","firstDayCurrentWeekTimestamp","firstDayPreviousWeek","firstDayPreviousWeekTimestamp","firstDayCurrentMonth","firstDayCurrentMonthTimestamp","firstDayPreviousMonth","firstDayPreviousMonthTimestamp","firstDayCurrentYear","firstDayCurrentYearTimestamp","firstDayPreviousYear","firstDayPreviousYearTimestamp","pivot","sup1","sup2","sup3","res1","res2","res3","previousHigh","previousLow","pivotPoint","currentX","toBars","nextDate","SAR","Sar","maxStep","deltaHigh","deltaLow","isLong","sar","ep","newHigh","newLow","af","sarToDraw","risingColor","fallingColor","customizable","SMACalculation","Sma","SMA","chartConfig","SMA2","Sma2","Supertrend","Str","finalUpperBand","finalLowerBand","supertrend","uptrendColor","avg","downtrendColor","VP_COLORS","applyOpacityToColor","opacity","VolumeProfile","Vp","upColor","downColor","minClose","maxClose","segment","segments","up","down","segmentIndex","isInSegment","volumeTrend","volumeFX","segmentHeightRaw","segmentHeight","upSegmentWidth","downSegmentWidth","VWapCalculation","Vwap","vwap","cumulativePV","cumulativeVolume","second","datesAreOnSameDay","VWAP","none","bb","dch","ema2","hilo","hline","ic","icf","kch","pp","sma2","vp","args","arg","_len2","_key2","_len3","_key3","devicePixelRatio","getQuoteDateTimestampOffsetInSeconds","referenceDate","dayNumber","monthIndex","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","isStockFastRefreshAvailable","bufferMinutes","dayOfWeek","currentDayMinutes","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","setUTCSeconds","captureException","testTouchPoints","isMobileOs","navigator","userAgent","createEvent","match","msMaxTouchPoints","maxTouchPoints","isIPad","matchesIPad","matchesIPhone","matchesIPod","getCookie","re","RegExp","cookie","setCookie","expires","toUTCString","hostname","getFullscreenStatus","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","getRequestFullscreen","requestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","getExitFullscreen","exitFullscreen","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","ready","fn","readyState","getChartsDimensions","chartElementId","containerElement","getElementById","box","getIsMobileScreenSize","getIsMobilePortrait","hasRedesignEnabled","matchingPages","forexPage","futuresPage","cryptoPage","requestsAbortControllersCache","removeFromAbortCache","error","createRequestAbortController","shouldAbortRunningRequest","abort","abortRequest","controller","AbortController","shouldUseCPUOnly","matchesAndroid","matchesWebOS","matchesiPad","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","isMobileDevice","isFirefoxDesktop","getContextWithCache","getContext","willReadFrequently","_cache","_restore","CanvasRenderingContext2D","apply","DAY_IN_SECONDS","TWO_MIN_IN_MS","virtualDatesCache","areTimestampsFromSameDay","ts1","ts2","ts1Utc","ts2Utc","getVirtualDatesCacheId","idRevision","setCachedVirtualDates","fromSeconds","toSeconds","virtualDates","virtualDatesCacheId","lastUsed","checkVirtualCacheSize","MAX_BAR_BORDER_WIDTH","MIN_BAR_MARGIN_WIDTH","MAX_BAR_MARGIN_WIDTH","settingsCenter","barMarginWidth","shouldRound","roundDecimalPlaces","DEFAULT_ZOOM_GUESS_INCREMENT","zoomFactorForBarsToDisplayCache","zoomFactorForBarsToDisplayCacheKeys","getZoomFactorFromCache","setZoomFactorToCache","poppedKey","defaultBarWidthWithMargin","cacheKey","zoomIncrement","currentZoomFactor","finalZoomFactor","iteration","threshold","barWidthDiff","getTimeframeSeconds","lowerIndex","dates","upperIndex","isWithinRangeOfQuoteDate","commonVirtualCacheProps","cachedDates","cache","virtualDateSeconds","getCachedVirtualDates","timeframeSeconds","firstDate","numOfDatesBefore","numOfDatesAfter","virtualTradedDays","dateStartSeconds","dateEndSeconds","datesSeconds","isStartBeforeDates","isEndAfterDates","dateTime","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","lastDateIndex","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","getInstrument","async","prefetchPerfIndicatorAllQuotes","paneWithPerfIndicator","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","promises","resolve","isPerfIndicator","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","firstBarClose","_ref20","changePoints","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","isQuoteChartWithNarrowBars","DRAWING_COOKIE_NAME","getIsDrawingEnabled","getIsSidebarEnabled","handleTypeChange","_ref23","getIsPreserveDrawingsAndAutosaveAvailable","editable","editors","tools","hexStringToRGBA","hexColor","removeHashSymbol","r","g","rgbaToHexString","alpha","alphaToHex","rgbaToHSVA","hsvaToRGBA","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","red","green","blue","strColor","allowAlpha","getIsRgb","rgbKeys","output","canSelectAlpha","hsvaToHEXString","pushIndicators","panes","cotKeys","code","Cot","hasPaneWithCOTCode","getChartTypeByTaConfigStyle","candlestick","heikinashi","hollowcandlestick","mergeChartAndTAConfig","taConfig","linear","percentage","logarithmic","indicators","getPanes","fromIndexOffset","getCompensatedFirstBarToRenderIndex","calculatedIndex","getFormDataFromObject","object","formData","append","FormData","ContentType","GenericStatusCodeError","response","statusCode","message","ForbiddenError","InternalServerError","GoneError","queryParameters","method","body","contentType","throwOnPredicate","keepalive","url","credentials","headers","signal","fetch","responseContentType","Html","responseData","ApplicationJson","ApplicationJsonUTF","FormUrlEncoded","parse","parseResponseForContentType","status","getStatusCodeError","getRoundedString","numOfDecimalPlaces","precision","periodString","part","exception","captureContext","parsedNumber","MAX_SAFE_INTEGER","getValueInRange","isPrimaryClick","button","getJSONReplacerFunc","visited","WeakSet","has","formatDateToStringUS","toLocaleDateString","getUuid","crypto","randomUUID","getRandomValues","Uint8Array","DefaultSpineEvents","DrawingSpineOptionsEvent"],"sourceRoot":""}