{"version":3,"file":"quote-portal-components.b98c964c.js","mappings":"8lCAAO,SAASA,EAAMC,GAA+B,IAApBC,EAAcC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAChD,SAAUG,KAAKN,MAAMO,OAAON,EAAI,KAAOC,IAAW,KAAOA,IAASM,QAAQN,EAC5E,C,6CAEO,MAAMO,EAAS,CACpBC,YAAcA,GAAiCV,EAA4B,IAAtBO,OAAOG,IAAsB,IAClFC,YAAcA,GAAiCX,EAA4B,IAAtBO,OAAOI,IAAsB,IAClFC,YAAcA,GAAwBZ,EAAMY,GAC5CC,YAAcA,GAAwBb,EAAMa,GAC5CC,KAAOA,GAAiBd,EAAa,IAAPc,GAAc,IAC5CC,KAAOD,GAAiBd,EAAa,IAAPc,GAAc,IAC5CE,WAAaA,GAAuBhB,EAAmB,IAAbgB,GAAoB,IAC9DC,eAAiBA,GAAwBA,EACzCC,aAAeA,GAAsBA,EACrCC,aAAeA,GAAsBA,EACrCC,UAAYA,GAAsBpB,EAAkB,IAAZoB,GAAmB,IAC3DC,WAAaA,GAAuBrB,EAAmB,IAAbqB,GAAoB,KAGnDC,EAAc,IAEdC,EAAyBC,OAAOC,OAAO,CAClDC,IAAK,IAAIC,KAAK,KAAM,EAAG,GACvBC,IAAK,IAAID,KAAK,KAAM,EAAG,K,gFCElB,SAASE,EAAoBC,GAWT,IAXU,MACnCC,EAAQ,IAAG,OACXC,EAAS,IAAG,OACZC,EAAM,UACNC,EAAS,aACTC,EAAY,2BACZC,EAA6BC,EAAAA,GAA2BC,QAAO,eAC/DC,EAAc,MACdC,EAAK,OACLC,EAASC,IAA4B,YACrCC,GAAc,GACSb,EACvB,MAAO,CACLc,OAAQC,EAAAA,GAAW,QACnBd,QACAC,SACAc,SAAU,EACVC,UAAW,EACXC,YAAY,EACZC,UAAU,EACVb,6BACAG,iBACAC,QACAC,SACAS,OAAQ,CACN,CACEnB,MAAO,EACPoB,WAAW,EACXC,aAAa,EACbC,UAAW,KACXrB,SACAE,YACAoB,MAAOC,EAAAA,GAAUC,OACjBvB,OAAQA,EACRwB,WAAY,EACZC,WAAYC,EAAAA,GAAWC,MACvBjB,cACAkB,SAAS,EACTC,MAAO,CACL,CACE9B,SACA+B,SAAU5B,MAMtB,CAEO,SAASO,IACd,IACE,OAAOsB,KAAKC,OAAMC,EAAAA,EAAAA,IAAiB,gBACrC,CAAE,MACA,MACF,CACF,C,mGC5EO,MAAMC,EAAkB,uCAAsC,IAEhEC,EAAS,SAATA,GAAS,OAATA,EAAS,8BAATA,EAAS,+BAATA,EAAS,4BAATA,EAAS,yBAATA,CAAS,EAATA,GAAS,IAOd,MAAMC,EAAgB,CACpB,CAACD,EAAUE,oBAAqB,CAAEC,WAAY,EAAGC,MAAO,CAAEzC,MAAO,IAAK0C,UAAW,MACjF,CAACL,EAAUM,iBAAkB,CAAEH,WAAY,EAAGC,MAAO,CAAEzC,MAAO,IAAK0C,UAAW,MAC9E,CAACL,EAAUO,eAAgB,CAAEJ,WAAY,EAAGC,MAAO,CAAEzC,MAAO,IAAK0C,UAAW,KAC5E,CAACL,EAAUQ,WAAY,CAAEL,WAAY,EAAGC,MAAO,CAAEzC,MAAO,IAAK0C,UAAW,OAGpEI,EAAyBC,EAAAA,OAA8BA,EAAAA,GAAqBC,iBAK3E,SAASC,IACd,IAAIC,EA2BJ,MAAO,CAAEC,OAzBT,WACE,IAC8B,IAAAC,EAA5B,GAAIN,EAC0B,QAA5BM,EAAAC,OAAOC,6BAAqB,IAAAF,GAA5BA,EAA8BG,MAAK,KAAM,IAAAC,EAAAC,EACvC,IAAIC,EAAuC,QAAjCF,EAAGH,OAA6B,4BAAC,IAAAG,EAAAA,EAAI,CAAC,EAChDN,EAA8B,QAA1BO,EAAGJ,OAAOL,wBAAgB,IAAAS,OAAA,EAAvBA,EAAyBE,IAAIC,IAAIxB,EAAiBsB,EAAO,GAGtE,CAAE,MAAOG,GACPC,QAAQC,MAAMF,EAChB,CACF,EAciBG,QAZjB,WACE,IAC8B,IAAAC,EAA5B,GAAInB,EAC0B,QAA5BmB,EAAAZ,OAAOC,6BAAqB,IAAAW,GAA5BA,EAA8BV,MAAK,KAAM,IAAAW,EACnC,QAAJA,EAAAhB,SAAI,IAAAgB,GAAJA,EAAMF,SAAS,GAGrB,CAAE,MAAOH,GACPC,QAAQC,MAAMF,EAChB,CACF,EAGF,CAKO,SAASM,IAA6C,IAAtBC,EAAehG,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAWvD,OAVAiG,EAAAA,iBAAsB,KACpB,MAAMnB,EAAOD,IAIb,OAFAC,EAAKC,SAEE,IAAMD,EAAKc,SAAS,GAG1BI,GAEItB,CACT,CAqBO,SAASwB,EAAKvE,GAA+C,IAA9C,KAAEwE,EAAI,SAAEC,EAAW,KAAMC,GAAmB1E,EAChE,MAAM2E,EAAUrC,EAAUkC,GACpBI,EAAWrC,EAAcoC,GACzBE,EAAgB,GAAGF,KAAWnG,KAAKoB,IAAIpB,KAAKsB,IAAI2E,EAAU,GAAIG,EAASnC,cAE7E,OAAKM,GAEE+B,EAAAA,EAAAA,KAAA,UAASJ,EAAOK,GAAIF,EAAenC,MAAO,IAAKgC,EAAMhC,SAAUkC,EAASlC,SAF3C,IAGtC,C,kDClGO,SAASsC,EAAmBC,GAAqE,IAA/BC,EAAS7G,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG8G,eAAeC,GAClG,MAAMzB,EAAgCzB,KAAKC,MAAMD,KAAKmD,UAAUJ,IAOhE,GALAtB,EAAOzC,YAAa,EAChBiE,eAAeG,iBACjB3B,EAAOzC,WAAayC,EAAOxC,WAAaoE,EAAAA,GAAMC,YAG5CN,EAAW,CACb,MAAMO,EAAON,eAAeM,KAC5BC,EAAAA,GAAAA,sBAAgC/B,EAAQuB,EAAWO,EAAO,CAAEA,aAASlH,EACvE,CAEA,OAAOoF,CACT,C,2FCZO,SAASgC,EAAa3F,GAGiD,IAHhD,SAC5B4F,GAAW,KACRlB,GACuE1E,EAC1E,OACE8E,EAAAA,EAAAA,KAACe,EAAAA,EAAqB,IAChBnB,EACJkB,SAAUA,EACVE,OAAQ,KACRC,gBAAgB,MAChBC,UAAWC,IAAWvB,EAAMsB,UAAW,yCAG7C,CAEAL,EAAcO,YAAcL,EAAAA,EAAsBK,W,sGCNlD,SAASC,EAAUnG,GAQ0B,IARzB,MAClBoG,EAAK,QACLC,EAAO,GACPC,EAAK,EAAC,GACNC,EAAK,EAAC,MACNC,GAAQ,GAAG,SACXC,KACG/B,GACsC1E,EACzC,IAAKqG,EAAS,OAEd,MAAMK,EAAIL,EAAQK,EAAIL,EAAQpG,MAAQ,EAAIqG,EACpCK,EAAIN,EAAQM,EAAIN,EAAQnG,OAAS,EAAIqG,EAE3C,OACEK,EAAAA,EAAAA,MAAA,WACMlC,EACJmC,SAAU,GACVC,WAAY,IACZC,WAAW,SACXC,iBAAiB,UACjBhB,UAAU,uDACVtD,MAAO,CAAEuE,UAAW,aAAaP,QAAQC,eAAeH,SAAcC,SAAA,CAErEL,IAAStB,EAAAA,EAAAA,KAAA,SAAOkB,UAAWC,IAAWiB,EAAAA,EAAkBd,GAAQ,gBAAgBK,SAAC,QAClF3B,EAAAA,EAAAA,KAAA,SAAOkB,UAAU,mCAAkCS,SAAEA,MAG3D,CAMO,SAASU,EAAKC,GAA4C,IAA3C,SAAEX,EAAQ,MAAEL,KAAU1B,GAAmB0C,EAC7D,OAAOtC,EAAAA,EAAAA,KAACuC,EAAAA,EAAa,CAACC,SAASxC,EAAAA,EAAAA,KAACqB,EAAU,CAACM,SAAUA,EAAUL,MAAOA,OAAe1B,GACvF,CAEAyC,EAAMjB,YAAcmB,EAAAA,EAAcnB,W,oGC9C3B,IAAKqB,EAAU,SAAVA,GAAU,OAAVA,EAAU,wBAAVA,EAAU,iBAAVA,EAAU,0BAAVA,EAAU,uCAAVA,CAAU,MAaf,SAASC,EAAiBxH,GAU9B,IAV+B,MAChCyH,EAAK,UACLC,EAAS,UACTC,GAAY,EAAI,YAChBC,GAAc,GAMf5H,EACC,IAAKvB,OAAOoJ,SAAS,IAAIhI,KAAK4H,GAAOK,WAAY,MAAO,GAExD,MAAMC,EAAOJ,GAAYK,EAAAA,EAAAA,IAAQP,GAAS,IAAI5H,KAAK4H,GAEnD,OAAIG,GAAmC,IAApBG,EAAKE,WAClBP,IAAcH,EAAWW,gBAAwBH,EAAKI,cAAcC,WAAWC,UAAU,GACtFN,EAAKI,cAAcC,YAGrBzJ,EAAAA,EAAAA,GAAOoJ,EAAML,EACtB,CAEO,MAAMY,UAAcC,EAAAA,G,YAAdD,E,EAAK,e,EACM,IACjBC,EAAAA,EAAcC,aACjBxC,UAAW,mCACXyC,UAAU,EACVC,UAAU,EACVnC,GAAI,EACJoC,KApCe,CACjB9B,SAAU,GACVC,WAAY,IACZ8B,KAAM,IAkCJC,QAAS,OACTrH,MAAO,OACPsH,KAAM,SACNC,SAAU,6B,kfC/CP,SAASC,IACd,MAAMC,GAAWC,EAAAA,EAAAA,MAEjB5E,EAAAA,WAAgB,KAGd,MAAM,EAAE6E,IAAMC,EAAAA,EAAAA,GAAkBH,EAASI,SACpCF,GAAK7F,OAAOgG,oBACfhG,OAAO2F,SAASM,QAClB,GACC,CAACN,EAASI,QACf,C,sECRO,SAASG,IAAyE,IAA3D,iBAAEC,EAAmB,IAAG,WAAEC,GAAa,GAAarL,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACpF,MAAOsL,EAAMC,GAAWtF,EAAAA,SAAe,CACrCuF,YAAaC,SAASC,gBAAgBF,YACtCG,WAAY1G,OAAO0G,WACnBC,YAAa3G,OAAO2G,cAsBtB,OAnBA3F,EAAAA,WAAgB,KACd,IAAKoF,EAAY,OAEjB,MAAMQ,EAAeC,KAAS,KAC5BP,EAAQ,CACNC,YAAaC,SAASC,gBAAgBF,YACtCG,WAAY1G,OAAO0G,WACnBC,YAAa3G,OAAO2G,aACpB,GACDR,GAIH,OAFAnG,OAAO8G,iBAAiB,SAAUF,GAE3B,KACLA,EAAaG,SACb/G,OAAOgH,oBAAoB,SAAUJ,EAAa,CACnD,GACA,CAACT,EAAkBC,IAEfC,CACT,C,oGC7BA,MAAMY,EAAU,EAET,SAASC,EAAoBC,GAAwB,IAAAC,EAAAC,EAC1D,MAAMC,EAAmBd,SAASe,eAAeJ,GAE3CK,EAAMF,aAAgB,EAAhBA,EAAkBG,wBAE9B,MAAO,CACL9K,MAAOzB,KAAKsB,KAAe,QAAX4K,EAACI,aAAG,EAAHA,EAAK7K,aAAK,IAAAyK,EAAAA,EAAI,GAAKH,EAAS,GAC7CrK,OAAQ1B,KAAKsB,KAAgB,QAAZ6K,EAACG,aAAG,EAAHA,EAAK5K,cAAM,IAAAyK,EAAAA,EAAI,GAAKJ,EAAS,GAEnD,CAEO,SAASS,EAAeC,EAAWR,GACxC,MAAMS,EAAmBV,EAAoBC,GAE7C,GAAIQ,EAAM,CACR,MAAME,EAAczL,OAAO0L,OAAO,CAAC,EAAGC,qBAAqBC,UAAW,CACpE3K,OAAQ0K,qBAAqB1K,OAC7BV,MAAOiL,EAAiBjL,MACxBC,OAAQgL,EAAiBhL,OACzBgB,YAAY,EACZqK,QAAS,CAAC,SAAU,WAAY,UAAW,WAE7C,IAAK,IAAIpC,EAAI,EAAGA,EAAIgC,EAAY/J,OAAO9C,OAAQ6K,IACxCgC,EAAY/J,OAAO+H,GAAGvH,aACzBuJ,EAAY/J,OAAO+H,GAAGvH,WAAa,SAIvC,OAAOuJ,CACT,CAEA,MAAO,CACLK,WAAW,EACXvL,MAAOiL,EAAiBjL,MACxBC,OAAQgL,EAAiBhL,OACzBc,SAAU,EACVC,UAAW,EACXC,YAAY,EACZuK,oBAAoB,EACpB/K,MAAO2K,qBAAqB3K,MAC5BC,OAAQ0K,qBAAqB1K,OAC7B4K,QAAS,CAAC,SAAU,WAAY,UAAW,SAC3CzK,OAAQuK,qBAAqBvK,OAC7BM,OAAQiK,qBAAqBK,QAAQC,KAAI,SAAUxL,EAAgByL,GACjE,MAAO,CACLxL,UAAWiL,qBAAqBQ,QAAQD,GACxCrK,UAAW8J,qBAAqBS,OAAOF,GACvCpK,MAAO6J,qBAAqBU,SAASvK,OAAS,SAC9CrB,OAAQA,EACRyB,YAAYoK,EAAAA,EAAAA,IAAuB7L,GACnCkB,UAAWgK,qBAAqBU,SAAS1K,UACzCC,YAAa+J,qBAAqBU,SAASzK,YAC3C2K,eAAgBZ,qBAAqBU,SAASE,eAC9CpL,aAAa,EACbmB,MAAO0D,EAAAA,GAAAA,SAAmB2F,qBAAqBU,UAEnD,IAEJ,CAEO,MAAMG,EAAiBA,CAACC,EAA2Bb,KACxD,MAAMc,EAAclK,KAAKmD,UAAUiG,GAAWe,SAAS,YAEvD,IAAK,IAAIlD,EAAI,EAAGA,EAAIgD,EAAO7N,OAAQ6K,IAAK,CACtC,MAAMmD,EAAQH,EAAOhD,GAEG,OAApBmD,EAAMlM,WAA0C,OAApBkM,EAAMlM,WAA0C,OAApBkM,EAAMlM,WAA0C,QAApBkM,EAAMlM,YACvFkM,EAAMC,eAAe,uBACxBD,EAAME,kBAAwC,QAApBF,EAAMlM,UAAsB,IAAM,KAGzDkM,EAAMC,eAAe,wBACxBD,EAAMG,mBAAyC,QAApBH,EAAMlM,UAAsB,IAAM,KAG1DkM,EAAMC,eAAe,4BACxBD,EAAMI,uBAA6C,QAApBJ,EAAMlM,UAAsB,EAAI,IAG5DkM,EAAMC,eAAe,8BACxBD,EAAMK,yBAA2B,IAIhCL,EAAMC,eAAe,iBACxBD,EAAMF,YAAcA,GAGtBE,EAAMM,OAAStB,EAAUL,KAAKlG,GAE9B8H,EAAAA,EAAMzJ,OAAckJ,EACtB,E,iHC5FK,MAAMQ,EAAexI,EAAAA,cAMzB,CAAEsH,OAAQ,EAAGzL,OAAQ,GAAI4M,OAAQC,EAAAA,GAAUC,EAAGC,KAAM,KAAMC,QAAS,OAE/D,SAASC,EAAoBpN,GAI2B,IAJ1B,OACnCG,EAAM,MACNyL,EAAK,SACLnF,GAC2DzG,EAC3D,MAAOqN,IAASC,EAAAA,EAAAA,MACVxE,EAAOuE,EAAME,IAAIC,EAAAA,GAAWC,MAC5BV,EAASM,EAAME,IAAIC,EAAAA,GAAWE,QAC9BC,EAAerJ,EAAAA,SACnB,KAAM,CAAGsH,QAAOzL,SAAQ4M,SAAQG,MAAMU,EAAAA,EAAAA,GAAa9E,GAAOqE,SAASU,EAAAA,EAAAA,GAAgB/E,MACnF,CAAC8C,EAAOmB,EAAQ5M,EAAQ2I,IAG1B,OAAOhE,EAAAA,EAAAA,KAACgI,EAAagB,SAAQ,CAACrG,MAAOkG,EAAalH,SAAEA,GACtD,C,6JCZO,SAASsH,EAAU/N,GAMvB,IANwB,eACzBgO,EAAc,WACdC,GAIDjO,EACC,MAAMkO,EAAU5J,EAAAA,OAAawF,SAASe,eAAesD,EAAAA,MACrDC,EAAAA,EAAAA,KAEA,MAAMzK,EAASW,EAAAA,SAAc,KAC3B,IAAI6G,EAAc7H,OAAO+K,kBAEzB,IAAKlD,EAAa,OAEdA,EAAYmD,YAEdpC,EAAAA,EAAAA,IAAef,EAAYmD,WAAYnD,IAGnCA,EAAYoD,WAAW1B,EAAAA,GAAMzJ,OAAO+H,EAAYoD,WACpDpD,GAAcnG,EAAAA,EAAAA,GAAmBmG,EAAa8C,IAGhD,MAAM,EAAEO,EAAIrJ,eAAesJ,gBAAkBrF,EAAAA,EAAAA,KACvCsF,GAAaC,EAAAA,EAAAA,GAAyBxD,EAAaqD,GAEzD,MAAO,IACFrD,KACAuD,EACHhO,MAAOyE,eAAeyJ,aAAeC,EAAAA,GAAMC,KAAOD,EAAAA,GAAME,MACxDzO,2BAA4BC,EAAAA,GAA2ByO,UACvD5N,OAAQ+J,EAAY/J,OAAOuK,KAAKsD,IAAK,IAAAC,EAAA,MAAM,IACtCD,EACH1N,UACE4D,eAAeG,gBAAkB6J,EAAAA,GAAiB9C,SAAwB,QAAhB6C,EAACD,EAAM1N,iBAAS,IAAA2N,EAAAA,EAAI,IAAMD,EAAM1N,UAAY,KACzG,OACEyM,EACJ,GACA,CAACC,EAAYD,IAEhB,OAAKrK,GAAWuK,EAAQkB,QAEjBC,EAAAA,cAAsBvK,EAAAA,EAAAA,KAACwK,EAAAA,GAA0B,CAACC,cAAerB,EAASvK,OAAQA,IAAYuK,EAAQkB,SAFrE,IAG1C,C,+TCrCO,MAAMI,EAAqBlL,EAAAA,cAAwC,CACxEmL,iBAAalR,EACbmR,mBAAenR,EACfoR,oBAAqBA,SAoChB,SAASC,EAAW5P,GAAoF,IAAnF,MAAE4L,EAAK,oBAAE+D,EAAmB,eAAEE,EAAc,MAAEC,EAAK,SAAErJ,GAA4BzG,EAE3G,MAAM+P,EAAUzL,EAAAA,WAAiBwI,EAAAA,GAC3BkD,EAAepE,QAAAA,EAASmE,EAAQnE,MAGhC8D,EACJG,aAA0BI,UAAYC,MAAMC,QAAQN,GAAkBA,EAAeG,GAAgBH,EACjGJ,EAAcK,aAAiBG,UAAYC,MAAMC,QAAQL,GAASA,EAAME,GAAgBF,GAOvFM,EAAWC,GAAgB/L,EAAAA,SAAwBqL,QAAAA,IAA0BD,KAAmBD,ICzElG,SAAiCa,GAA4E,IAAhDC,EAAyBlS,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAAImS,IAAOnS,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GACzGiG,EAAAA,WAAgB,KACd,IAAKgM,EAAe,OAEpB,MAAMG,EAAeC,GAAkCA,aAAO,EAAPA,EAASC,UAAUC,IAAI,UACxEC,EAAeH,GAAkCA,aAAO,EAAPA,EAASC,UAAUG,OAAO,UAC3EC,EAAiBA,CAACL,EAAiCM,KACnDN,aAAmBT,UAAYC,MAAMC,QAAQO,GAC/CA,EAAQO,QAAQD,GAEhBA,EAASN,EACX,EAMF,OAHAK,EAAeT,EAAeE,EAAUC,EAAcI,GACtDE,EAAeR,EAAeC,EAAUK,EAAcJ,GAE/C,KACLM,EAAeT,EAAeO,GAC9BE,EAAeR,EAAeE,EAAY,CAC3C,GACA,CAACH,EAAeC,EAAeC,GACpC,CDoDEU,CAAwBxB,EAAeD,EAAaW,GAEpD,MAAMe,EAAqB7M,EAAAA,SACzB,KAAM,CAEJmL,YAAaA,EACbC,cAAeA,EAEfC,oBAAsBa,GAAsBH,GAAce,GAAcZ,QAAAA,GAAYY,OAEtF,CAAC3B,EAAaC,IAGhB,OAAKD,GAGH3K,EAAAA,EAAAA,KAACuM,EAAAA,GAAa,CAACC,SAAU,KAAMC,QAASA,IAAMlB,GAAa,GAAO5J,UAChE3B,EAAAA,EAAAA,KAAC0K,EAAmB1B,SAAQ,CAACrG,MAAO0J,EAAmB1K,SACpD4I,EAAAA,aAAsB5I,EAAUgJ,OALd,IAS3B,CErFO,MAAM+B,EAAoBlN,EAAAA,cANxB,CACLmN,iBAAkB,KAClBxI,SAJgB,IAAIyI,IAAIpO,OAAO2F,SAAS0I,QAUrC,SAASC,EAAiB5R,GAA6C,IAA5C,SAAEyG,GAAwCzG,EAC1E,MAAM,oBAAE2P,GAAwBrL,EAAAA,WAAiBkL,GAC3CqC,ECjBD,WAAsC,IAAAC,EAC3C,MAAMC,EAAYzO,OAAO6B,eAAeG,gBAClC,iBAAEmM,IAAqBO,EAAAA,EAAAA,KACvBC,GAAaC,EAAAA,EAAAA,GAA2C,QAA9BJ,EAACL,aAAgB,EAAhBA,EAAkBU,mBAAW,IAAAL,EAAAA,EAAI,KAAM,CACtEM,gBAAiB,CAAC,YAAa,gBAE3B,8BAAEC,IAAkCC,EAAAA,EAAAA,GAAmC,CAC3EL,aACAF,cAGF,IAAKE,EACH,MAAO,CACLhJ,SAAU,IAAIyI,IAAI,GAAGpO,OAAO2F,SAASsJ,WAAWjP,OAAO2F,SAASI,SAAU/F,OAAO2F,SAASuJ,QAC1Ff,oBAGJ,MAAMxI,EAAWoJ,EAA8B,CAC7ClS,OAAQ8R,aAAU,EAAVA,EAAY9R,OACpBC,UAAW6R,aAAU,EAAVA,EAAY7R,UACvBmB,UAAW0Q,aAAU,EAAVA,EAAY1Q,YAGzB,MAAO,CAAE0H,SAAU,IAAIyI,IAAI,GAAGzI,EAASsJ,WAAWtJ,EAASI,SAAU/F,OAAO2F,SAASuJ,QAASf,mBAChG,CDPegB,GAIb,OAFAnO,EAAAA,WAAgB,IAAMqL,KAAuB,CAACA,KAEvC7K,EAAAA,EAAAA,KAAC0M,EAAkB1D,SAAQ,CAACrG,MAAOoK,EAAKpL,SAAEA,GACnD,CEhBA,MAAMsL,EAAY5M,eAAeG,eAuD1B,SAASoN,EAAc1S,GAU+C,IAV9C,YAC7B2S,EAAW,YACXC,EAAW,KACX1F,EAAI,QACJ2F,EAAO,eACPC,GAAiB,EAAI,kBACrBC,EAAoB,CAACvF,EAAAA,GAAWwF,OAAQxF,EAAAA,GAAWC,KAAMD,EAAAA,GAAWE,OAAQF,EAAAA,GAAWyF,WAAU,gBACjGC,EAAe,sBACfC,KACGzO,GACsE1E,EACzE,MAAMoT,EAAe9O,EAAAA,WAAiBwI,EAAAA,GAChCuG,EAAc/O,EAAAA,WAAiBkN,GAE/B8B,EAAUhP,EAAAA,SAAc,IACxBqO,IAAgBZ,GAAkBwB,EAAAA,EAAAA,IAAiBX,GAChC,mBAAZC,EAA+BA,EAAQQ,IAE3CG,EAAAA,EAAAA,IACLH,EAAYpK,SACZ8J,EACAG,EACAC,QAAAA,EAAyB,CAAE,CAAC3F,EAAAA,GAAWC,MAAOP,IAC9C9E,YACD,CAACuK,EAAaC,EAAaC,EAASQ,EAAaN,EAAmBG,EAAiBC,EAAuBjG,IAE/G,OACEpI,EAAAA,EAAAA,KAAC2O,EAAAA,GAAI,IACC/O,EACJgP,GAAIJ,EACJR,eAAiBH,IAAgBZ,GAAce,EAC/C9M,UAAWC,IAAWvB,EAAMsB,UAAW,WAAY,CACjD,gBAAiBoN,EAAalG,OAASA,GAAQkG,EAAajG,UAAYD,IACvEzG,SAEF/B,EAAM+B,UAGb,CC7FO,SAASkN,IACd,MAAM,OAAExT,GAAWmE,EAAAA,WAAiBwI,EAAAA,GAC9B8G,GAASC,EAAAA,EAAAA,MACTC,EAAYF,EAAOG,SAAS,SAE3BC,IAAqBC,EAAAA,EAAAA,GAAe,IACtCC,EAAAA,EACHC,iBAAkBL,IAEdM,EAAcJ,aAAiB,EAAjBA,EAAmBI,YAEvC,OACExN,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAC4N,EAAc,CACbC,aAAW,EACXC,YAAY,qBACZC,QAASA,IAAM,wBAAwB1S,IACvCmU,QAAUxQ,IAAM,IAAAyQ,EAAAC,EACTrP,eAAeG,iBACT,QAAXiP,GAAAC,EAAAlR,QAAOmR,YAAI,IAAAF,GAAXA,EAAAG,KAAAF,EAAc,QAAS,QAAS,CAAEG,eAAgB,iBAC9C7Q,EAAE8Q,SAAW9Q,EAAE+Q,UACnB/Q,EAAEgR,iBACFlB,EAAOmB,QAAM,EAEf,cAAY,iBAAgBtO,SAC7B,eAGD3B,EAAAA,EAAAA,KAACkQ,EAAAA,GAAM,CAACC,MAAOrB,EAAQ,aAAW,YAAY5N,UAAU,YAAWS,SAChE2N,GACCtP,EAAAA,EAAAA,KAACsP,EAAW,CAACjU,OAAQA,KAErB2E,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,wCAAuCS,UACpD3B,EAAAA,EAAAA,KAACoQ,EAAAA,EAAO,UAMpB,C,eCvCO,SAASC,IACd,MAAM,OAAEhV,GAAWmE,EAAAA,WAAiBwI,EAAAA,GAC9B8G,GAASC,EAAAA,EAAAA,MACTC,EAAYF,EAAOG,SAAS,SAE3BqB,IAAyBnB,EAAAA,EAAAA,GAAe,IAC1CoB,EAAAA,EACHlB,iBAAkBL,IAEdwB,EAAkBF,aAAqB,EAArBA,EAAuBE,gBAE/C,OACE1O,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAC4N,EAAc,CACbG,QAASA,IAAM,6BAA6B1S,IAC5CmU,QAAUxQ,IAAM,IAAAyQ,EAAAC,EACTrP,eAAeoQ,MAAMjX,SACf,QAAXiW,GAAAC,EAAAlR,QAAOmR,YAAI,IAAAF,GAAXA,EAAAG,KAAAF,EAAc,QAAS,QAAS,CAAEG,eAAgB,sBAC9C7Q,EAAE8Q,SAAW9Q,EAAE+Q,UACnB/Q,EAAEgR,iBACFlB,EAAOmB,QAAM,EACbtO,SACH,sBAGD3B,EAAAA,EAAAA,KAACkQ,EAAAA,GAAM,CAACC,MAAOrB,EAAQ,aAAW,mBAAmB5N,UAAU,QAAOS,SACnE6O,GACCxQ,EAAAA,EAAAA,KAACwQ,EAAe,CAACnV,OAAQA,KAEzB2E,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,wCAAuCS,UACpD3B,EAAAA,EAAAA,KAACoQ,EAAAA,EAAO,UAMpB,CCpCO,SAASM,IACd,MAAM,YAAE/F,GAAgBnL,EAAAA,WAAiBkL,GACnCiG,EAA0D,SAAvChG,EAAaiG,QAAQC,cAE9C,OACE7Q,EAAAA,EAAAA,KAACR,EAAAA,SAAc,CAACgN,SAAU,KAAK7K,UAC7B3B,EAAAA,EAAAA,KAAC8M,EAAiB,CAAAnL,UAChBG,EAAAA,EAAAA,MAAA,OAAKZ,UAAU,mBAAkBS,SAAA,EAC/BG,EAAAA,EAAAA,MAAC8L,EAAc,CAACxF,KAAM0I,EAAAA,GAAUC,YAAa3C,gBAAiB,CAAC1F,EAAAA,GAAWC,MAAO0F,sBAAuB,CAAC,EAAE1M,SAAA,EACzG3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,YAAWS,SAAC,WAC5B3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,mBAAkBS,SAAC,qBAErC3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,OAE/BG,EAAAA,EAAAA,MAAC8L,EAAc,CACbC,aAAW,EACXC,YAAY,qBACZ1F,KAAM4I,EAAAA,GAAaC,YACnB,cAAY,0BAAyBtP,SAAA,EAErC3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,YAAWS,SAAC,aAC5B3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,mBAAkBS,SAAC,sBAErC3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,MAE9BgP,IACC7O,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAC4N,EAAc,CAACxF,KAAM4I,EAAAA,GAAaE,cAAcvP,SAAC,oBAClD3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,UAInC3B,EAAAA,EAAAA,KAAC4N,EAAc,CAACxF,KAAM0I,EAAAA,GAAUK,WAAWxP,SAAC,gBAC5C3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,MAE9BtB,eAAe+Q,wBACdtP,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAC4N,EAAc,CAACxF,KAAM4I,EAAAA,GAAaK,QAAQ1P,SAAC,aAC5C3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,UAInC3B,EAAAA,EAAAA,KAAC4N,EAAc,CAACxF,KAAM0I,EAAAA,GAAUQ,QAAS,cAAY,qBAAoB3P,SAAC,aAG1E3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,OAE/BG,EAAAA,EAAAA,MAAC8L,EAAc,CAACxF,KAAM4I,EAAAA,GAAaO,cAAe,cAAY,sBAAqB5P,SAAA,EACjF3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,YAAWS,SAAC,aAC5B3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,mBAAkBS,SAAC,uBAErC3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,OAE/B3B,EAAAA,EAAAA,KAACqQ,EAAmB,KACpBrQ,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,OAE/B3B,EAAAA,EAAAA,KAAC6O,EAAe,UAK1B,C,+jBChDA,MAAM2C,IAAoBnR,eAAeoR,mBAEnCC,EAAkB,SAAU/O,GAChC,OAAIA,EAAQ,EACH,yBACEA,EAAQ,EACV,yBAEF,EACT,EAEMgP,EAAa,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAoBjG,MAAMC,UAAcC,EAAAA,UAAsBC,WAAAA,GAAA,SAAAvY,WAAAwY,EAAA,oBACzBvS,EAAAA,YAAiC,CAEhDwS,qBAAAA,CAAsBC,GACpB,OAtBgB,SAAUC,EAAiBC,GAC7C,GAAID,EAAK1Y,SAAW2Y,EAAK3Y,OACvB,OAAO,EAET,IAAK,IAAI6K,EAAI,EAAGA,EAAI6N,EAAK1Y,OAAQ6K,IAC/B,GAAI6N,EAAK7N,KAAO8N,EAAK9N,GACnB,OAAO,EAGX,OAAO,CACT,CAYY+N,CAAYC,KAAKzS,MAAMgH,QAASqL,EAAUrL,QACpD,CAEA0L,MAAAA,GAAS,IAAAC,EAAAC,EACP,MAAM5W,EAAQyE,eAAeyJ,aAAeC,EAAAA,GAAMC,KAAOD,EAAAA,GAAME,MACzDwI,EAAc1K,EAAAA,GAAM2K,QAAeC,GAAMA,EAAEC,MAAMpZ,OAAS,GAAK6Y,KAAKzS,MAAMgH,QAAQW,SAASoL,EAAEtX,UAC7FgL,GAAcpL,EAAAA,EAAAA,GAAqB,CACvCI,OAA8B,QAAxBkX,EAAgB,QAAhBC,EAAEC,EAAY,UAAE,IAAAD,OAAA,EAAdA,EAAgBnX,cAAM,IAAAkX,EAAAA,EAAI,GAClCjX,UAAW4M,EAAAA,GAAUC,EACrB5M,aAAc,CACZ,CACEyI,KAAM6O,EAAAA,GAAiBC,UACvBlM,QAASyL,KAAKzS,MAAMgH,QACpBmM,SAAUV,KAAKzS,MAAMoT,QACrBC,OAAQZ,KAAKzS,MAAMsT,MACnBC,SAAU,KAGdhY,MAAO,IACPC,OAAQ,IACRW,aAAa,EACbP,2BAA4BC,EAAAA,GAA2B2X,UACvDxX,UAEF,OACEoE,EAAAA,EAAAA,KAAA,OAAKqT,IAAKhB,KAAKiB,aAAcrT,GAAG,QAAQiB,UAAU,uBAAuBtD,MAAO,CAAE2V,QAAS,GAAI5R,UAC7F3B,EAAAA,EAAAA,KAACwT,EAAAA,GAAW,CAAC3U,OAAQwH,EAAaoE,cAAe4H,KAAKiB,gBAG5D,EAaF,MAAMG,UAAc5B,EAAAA,UAClBS,MAAAA,GACE,MAAM,OAAEoB,EAAM,KAAEC,GAAStB,KAAKzS,MACxBgU,EAAcla,KAAKma,KAAKH,EAAOla,OAAS,IACxCsa,EAAYC,IAAW,cAAe,CAC1C,2BAA4BvC,IAGxBwC,EAAM,GACZ,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAaK,IAC/BD,EAAItV,MACFoD,EAAAA,EAAAA,MAAA,MAEEZ,UAAW6S,IAAW,CACpB,kBAAmBvC,EACnB,mDAAoDA,IACnD7P,SAAA,EAEH3B,EAAAA,EAAAA,KAAA,MAAIkB,UAAW4S,IACdJ,EAAOQ,OAAO,EAAG,IAAIrN,KAAKsN,IACzBnU,EAAAA,EAAAA,KAAA,MAAgBkB,UAAW4S,EAAUnS,SAClCwS,GADMA,KAIVF,IAAML,EAAc,IAAK5T,EAAAA,EAAAA,KAAA,MAAIkB,UAAW4S,EAAUnS,SAAC,YAZ/CsS,IAeTN,EAAKxH,SAAQ,CAACiI,EAAK/P,KACjB2P,EAAItV,MACFoD,EAAAA,EAAAA,MAAA,MAEEZ,UAAW6S,IAAW,CACpB,oCAAqCvC,EACrC,mBAAoBA,GAAmBnN,EAAI,GAAM,EACjD,kBAAmBmN,GAAmBnN,EAAI,GAAM,EAChD,iBAAkBmN,GAAmBnN,EAAI,GAAM,IAC9C1C,SAAA,EAEH3B,EAAAA,EAAAA,KAAA,MAAIkB,UAAW6S,IAAW,YAAa,CAAE,iBAAkBvC,IAAmB7P,SAAEyS,EAAI/Y,SACnF+Y,EAAIV,OAAOQ,OAAO,EAAG,IAAIrN,KAAI,CAACwN,EAAKC,KAClCtU,EAAAA,EAAAA,KAAA,MAEEkB,UAAW6S,IAAW,aAAcrC,EAAgB6C,WAAWF,IAAO,CACpE,iBAAkB7C,IACjB7P,SAEF0S,GALI,GAAGD,EAAI/Y,UAAUgZ,KAAOC,OAQhCL,IAAML,EAAc,IACnB5T,EAAAA,EAAAA,KAAA,MACEkB,UAAW6S,IAAW,aAAcrC,EAAgB6C,WAAWH,EAAII,QAAS,CAC1E,iBAAkBhD,IACjB7P,SAEFyS,EAAII,UAzBJ,GAAGP,KAAK5P,KA6BhB,IAIL,OACErE,EAAAA,EAAAA,KAAA,SACEkB,UAAW6S,IAAW,CACpB,+CAAgDvC,EAChD,cAAeA,IAEjBiD,YAAY,IACZC,YAAY,IACZC,OAAQ,EAAEhT,UAEV3B,EAAAA,EAAAA,KAAA,SAAA2B,SAAQqS,KAGd,EAyBK,MAAMY,UAAa/C,EAAAA,UACxBC,WAAAA,CAAYlS,GAAY,IAAAiV,EACtBC,MAAMlV,GAAMiV,EAAAxC,KAAAN,EAAA,sBA2LE,KACdM,KAAK0C,OAAO1C,KAAKlC,MAAMvJ,SAAS,EAAM,IACvCmL,EAAA,wBAiBiB,KAChB,MAAM,QAAEiB,EAAO,MAAEE,GAAUb,KAAKlC,MAEhC,IAAK6C,IAAYE,EACf,OAGF,MAAM8B,EAAcjN,EAAAA,GAAM2K,QAAQC,GAA2B,MAAhBA,EAAErX,YACzCyX,EAAW,IAAIhY,KAAKiY,EAAU,UAC9BC,EAAS,IAAIlY,KAAKmY,EAAQ,UAChC8B,EAAY7I,SAASwG,IACnB,MAAMsC,EAAI,GACRC,EAAI,GACJC,EAAI,GACJC,EAAI,GACJjN,EAAI,GACJkN,EAAI,GACN,IAAK,IAAIhR,EAAI,EAAGA,EAAIsO,EAAEC,MAAMpZ,OAAQ6K,IAAK,CACvC,MAAMpB,EAAOxC,EAAAA,GAAM6U,sBAAsB3C,EAAE1P,KAAKoB,IAC5C0O,GAAY9P,GAAQA,GAAQgQ,IAC9BgC,EAAEvW,KAAKiU,EAAE4C,KAAKlR,IACd6Q,EAAExW,KAAKiU,EAAE6C,KAAKnR,IACd8Q,EAAEzW,KAAKiU,EAAE8C,IAAIpR,IACb+Q,EAAE1W,KAAKiU,EAAEC,MAAMvO,IACf8D,EAAEzJ,KAAKiU,EAAE1P,KAAKoB,IACdgR,EAAE3W,KAAKiU,EAAE+C,OAAOrR,IAEpB,CAIAsO,EAAEgD,kBACFhD,EAAEiD,iBAAiB,CACjBL,KAAMN,EACNO,KAAMN,EACNO,IAAKN,EACLvC,MAAOwC,EACPnS,KAAMkF,EACNuN,OAAQL,GACR,IAIJhD,KAAKwD,aAAa,IACnB9D,EAAA,eAEQ+D,eAAOlP,GAAwC,IAArBmP,IAASxc,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAC1C,MAAM,EAAEyc,IAAM1R,EAAAA,EAAAA,KAmBd,GAlBIyR,GACFlB,EAAKoB,SAAS,CAAEC,SAAS,IAG3BnO,EAAAA,GAAMoO,MAAMhK,SAAQ2J,WACdtO,EAAMnM,SAAW2a,GAAyB,MAApBxO,EAAMlM,WAAsBya,KAKlDnP,EAAQW,SAASC,EAAMnM,eACnBmM,EAAM4O,UAAU,CAAEC,UAAWN,EAAYO,EAAAA,GAAeC,QAAUD,EAAAA,GAAeE,YACvF3B,EAAK4B,mBAELjP,EAAMrI,UACR,IAGE4W,EAAW,CACb,MAAM5N,EAAIvB,EAAQC,KAAKxL,IAAM,CAAQA,OAAQA,EAAQC,UAAW4M,EAAAA,GAAUC,EAAGrL,WAAYC,EAAAA,GAAWC,UAC9F0Z,EAAI9P,EAAQC,KAAKxL,IAAM,CAAQA,OAAQA,EAAQC,UAAW4M,EAAAA,GAAUwO,EAAG5Z,WAAYC,EAAAA,GAAWC,gBAC9F+K,EAAAA,GAAM4O,OAAOxO,EAAEyO,OAAOF,IAE5B7B,EAAKoB,SAAS,CAAEC,SAAS,GAC3B,CAEArB,EAAK4B,iBACP,IAAC1E,EAAA,kBAEY/S,IACXA,EAAEgR,iBACF,MAAM6G,GAAeC,EAAAA,EAAAA,GAAmBzE,KAAKlC,MAAM0G,cAAc,GAC3DjQ,EAAUiQ,EAAaE,MAAM,KACnC1E,KAAK4D,SAAS,CAAErP,UAASiQ,iBAAgB,KACvCxE,KAAK0C,OAAOnO,EAAQ,GACpB,IACHmL,EAAA,uBAEgB,CAAC/N,EAAchF,KAC9B,MAAMmR,EAAa,CAAC,EACpBA,EAAMnM,EAAO,SAAWqO,KAAKlC,MAAMuD,OAAOsD,QAAQN,GAAMA,EAAE/T,QAAU3D,EAAEiY,OAAOtU,QAAO,GACpF0P,KAAK4D,SAAS9F,EAAM,IACrB4B,EAAA,4BAEqB,CAAC/N,EAAcf,KACnC,MAAMiU,GAAgBC,EAAAA,EAAAA,IAAqB,IAAIpc,KAAKkI,IAE9CkN,EAAa,CAAC,EACpBA,EAAMnM,EAAO,OAASkT,EACtB/G,EAAMnM,EAAO,mBAAoB,EACjCqO,KAAK4D,SAAS9F,GAAO,KACnBkC,KAAK0C,OAAO1C,KAAKlC,MAAMvJ,QAAQ,GAC/B,IAjTF,MAAMwQ,EAAM,IAAIrc,KACd2Y,EAAS,GAEX,IAAK,IAAI2D,GADS,IAAItc,MAAOsI,cAAgB,GAClBgU,GAAQD,EAAI/T,cAAegU,IACpD,IAAK,IAAIlD,EAAQ,EAAGA,GAAS,MACvBkD,IAASD,EAAI/T,eAAiB8Q,EAAQiD,EAAIjU,WAAa,GAD5BgR,IAI/BT,EAAOhV,KAAK,CACViE,MAAOwR,EAAM7Q,WAAWgU,SAAS,EAAG,KAAO,OAASD,EACpDE,MAAO5F,EAAWwC,EAAQ,GAAK,IAAMkD,EAAK/T,WAAWC,UAAU,KAKrE8O,KAAKlC,MAAQ,CACX0G,aAAcW,mBAAmBC,KAAK,KACtC7Q,QAAS4Q,mBACT9D,OAAQA,EACRgE,UAAWhE,EAAOA,EAAOla,OAAS,IAClCme,QAASjE,EAAOA,EAAOla,OAAS,GAMhCoe,SAAST,EAAAA,EAAAA,IAAqBU,EAAAA,EAAY,IAAI9c,KAAQ,CAAE+c,MAAO,EAAGpE,OAAQ,MAC1EqE,SAASZ,EAAAA,EAAAA,IAAqB,IAAIpc,MAClCiY,SAASmE,EAAAA,EAAAA,IAAqBU,EAAAA,EAAiB,IAAI9c,KAAQ,IAC3DmY,OAAOiE,EAAAA,EAAAA,IAAqB,IAAIpc,MAChCmb,SAAS,EAEb,CAEA5D,MAAAA,GACE,GAAID,KAAKlC,MAAM+F,QACb,OACElW,EAAAA,EAAAA,KAAA,OACEkB,UAAU,gDACVtD,MAAO,CAAEC,UAAWwC,eAAeoR,mBAAqB,IAAM,KAAM9P,SACrE,eAML,MAAMqW,EAAO,IAAIjd,KAAKsX,KAAKlC,MAAMuH,UAAU/U,OACrCiM,EAAK,IAAI7T,KAAKsX,KAAKlC,MAAMwH,QAAQhV,OACjCsV,EAAe5F,KAAKlC,MAAMuD,OAC7B7M,KAAKsN,GAAUA,EAAMxR,QACrBqU,QAAQ7C,GAAU,IAAIpZ,KAAKoZ,IAAU6D,GAAQ,IAAIjd,KAAKoZ,IAAUvF,IAG7DsJ,EADSnQ,EAAAA,GAAM2K,QAAQC,GAA2B,MAAhBA,EAAErX,YAChBuL,KAAK8L,IAC7B,MAAMwF,EAAwD,CAAE9c,OAAQsX,EAAEtX,OAAQ+c,KAAM,CAAC,GASzF,OARAzF,EAAE1P,KAAKkJ,SAAQ,CAAChE,EAAQ9D,KACtB,GAAU,IAANA,EACF,OAEF,MAAMpB,EAAOxC,EAAAA,GAAM6U,sBAAsBnN,GACnCiQ,EAAqB,IAAbzF,EAAEC,MAAMvO,GAAYsO,EAAEC,MAAMvO,EAAI,GAAK,IACnD8T,EAAIC,MAAMnV,EAAKE,WAAa,GAAGG,WAAWgU,SAAS,EAAG,KAAO,OAASrU,EAAKI,eAAiB+U,CAAI,IAE3FD,CAAG,IAGNzE,EAASuE,EAAapR,KACzBsN,GAAUxC,EAAW,IAAI5W,KAAKoZ,GAAOhR,YAAc,IAAM,IAAIpI,KAAKoZ,GAAO9Q,cAAcC,WAAWC,UAAU,KAEzGoQ,EAAOuE,EAAWrR,KAAKW,IAC3B,MAAM6Q,EAAiB,GACvB,IAAI7D,EAAQ,EAWZ,OAVAyD,EAAa9L,SAASgI,IACpB,MAAMiE,EAAO1e,KAAKN,MAA0B,IAApBoO,EAAM4Q,KAAKjE,IAAgB,IAC9CmE,MAAMF,GAITC,EAAK3Z,KAAK,QAHV8V,GAAShN,EAAM4Q,KAAKjE,GAAS,IAAM,EACnCkE,EAAK3Z,MAAM0Z,EAAO,EAAI,IAAM,IAAMA,EAAKxe,QAAQ,GAAK,KAGtD,IAEF4a,EAAsB,KAAbA,EAAQ,GACV,CAAEnZ,OAAQmM,EAAMnM,OAAQqY,OAAQ2E,EAAM7D,OAAQA,EAAQ,EAAI,IAAM,IAAMA,EAAM5a,QAAQ,GAAK,IAAK,IAGvG,OACEkI,EAAAA,EAAAA,MAAA,OAAKZ,UAAU,wEAAuES,SAAA,EACpF3B,EAAAA,EAAAA,KAAA,QAAMuY,SAAUlG,KAAKmG,UAAWtX,UAAU,gBAAeS,UACvD3B,EAAAA,EAAAA,KAAA,SAAOkB,UAAU,2BAA0BS,UACzC3B,EAAAA,EAAAA,KAAA,SAAA2B,UACEG,EAAAA,EAAAA,MAAA,MAAAH,SAAA,EACE3B,EAAAA,EAAAA,KAAA,MAAA2B,SAAI,cACJ3B,EAAAA,EAAAA,KAAA,MAAI7E,MAAM,OAAOyC,MAAO,CAAE6a,QAAS,SAAU9W,UAC3C3B,EAAAA,EAAAA,KAAA,SACEkB,UAAU,WACV8C,KAAK,OACLrB,MAAO0P,KAAKlC,MAAM0G,aAClB6B,SAAW1Z,IACTqT,KAAK4D,SAAS,CAAEY,aAAc7X,EAAEiY,OAAOtU,OAAQ,EAEjD/E,MAAO,CAAEzC,MAAO,QAChB,cAAY,wCAGhB6E,EAAAA,EAAAA,KAAA,MAAA2B,UACE3B,EAAAA,EAAAA,KAAA,SACEkB,UAAU,qBACV8C,KAAK,SACLrB,MAAM,SACN,cAAY,4DAQxB3C,EAAAA,EAAAA,KAAC4R,EAAK,CAAChL,QAASyL,KAAKlC,MAAMvJ,QAASoM,QAASX,KAAKlC,MAAM6C,QAASE,MAAOb,KAAKlC,MAAM+C,SAEnFpR,EAAAA,EAAAA,MAAA,QACEZ,UAAU,cACVtD,MAAO,CAAE+B,SAAU,WAAYgZ,IAAK,GAAIC,MAAOpH,EAAkB,EAAI,EAAGzP,SAAU,IAClF,cAAY,sCAAqCJ,SAAA,EAEjD3B,EAAAA,EAAAA,KAAA,OAAKpC,MAAO,CAAE+B,SAAU,WAAYxE,MAAO,GAAI0d,QAAS,gBAAiBlX,UACvE3B,EAAAA,EAAAA,KAAC8Y,EAAAA,EAAU,CACTlB,QAAS,IAAI7c,KAAKsX,KAAKlC,MAAMyH,SAC7BG,QAAS,IAAIhd,KAAKsX,KAAKlC,MAAM4H,SAC7BpV,MAAO,IAAI5H,KAAKsX,KAAKlC,MAAM6C,SAC3B0F,SAAWK,IACT1G,KAAK2G,oBAAoB,QAAQ7B,EAAAA,EAAAA,IAAqB4B,GAAU,EAChEpX,UAEF3B,EAAAA,EAAAA,KAAA,SAAOgE,KAAK,QAAQiV,UAAQ,EAAC/X,UAAU,kBAAkByB,MAAO0P,KAAKlC,MAAM6C,cAG9E,OACDhT,EAAAA,EAAAA,KAAA,OAAKpC,MAAO,CAAE+B,SAAU,WAAYxE,MAAO,GAAI0d,QAAS,gBAAiBlX,UACvE3B,EAAAA,EAAAA,KAAC8Y,EAAAA,EAAU,CACTlB,QAAS,IAAI7c,KAAKsX,KAAKlC,MAAMyH,SAC7BG,QAAS,IAAIhd,KAAKsX,KAAKlC,MAAM4H,SAC7BpV,MAAO,IAAI5H,KAAKsX,KAAKlC,MAAM+C,OAC3BwF,SAAWK,IACT1G,KAAK2G,oBAAoB,MAAM7B,EAAAA,EAAAA,IAAqB4B,GAAU,EAC9DpX,UAEF3B,EAAAA,EAAAA,KAAA,SAAOgE,KAAK,QAAQiV,UAAQ,EAAC/X,UAAU,kBAAkByB,MAAO0P,KAAKlC,MAAM+C,gBAKjFpR,EAAAA,EAAAA,MAAA,MAAIZ,UAAU,2BAA2B,cAAY,mDAAkDS,SAAA,CAAC,8BAEtG3B,EAAAA,EAAAA,KAAA,UACEkB,UAAU,YACVyB,MAAO0P,KAAKlC,MAAMuH,UAAU/U,MAC5B+V,SAAUrG,KAAK6G,eAAeC,KAAK9G,KAAM,QACzCzU,MAAO,CAAEoE,WAAY,UAAWL,SAE/B0Q,KAAKlC,MAAMuD,OAAO7M,KAAKuS,IACtBpZ,EAAAA,EAAAA,KAAA,UAA2B2C,MAAOyW,EAAOzW,MAAMhB,SAC5CyX,EAAO7B,OADG6B,EAAOzW,WAIf,UAET3C,EAAAA,EAAAA,KAAA,UACEkB,UAAU,YACVyB,MAAO0P,KAAKlC,MAAMwH,QAAQhV,MAC1B+V,SAAUrG,KAAK6G,eAAeC,KAAK9G,KAAM,MACzCzU,MAAO,CAAEoE,WAAY,UAAWL,SAE/B0Q,KAAKlC,MAAMuD,OAAO7M,KAAKuS,IACtBpZ,EAAAA,EAAAA,KAAA,UAA2B2C,MAAOyW,EAAOzW,MAAMhB,SAC5CyX,EAAO7B,OADG6B,EAAOzW,eAM1B3C,EAAAA,EAAAA,KAACyT,EAAK,CAACC,OAAQA,EAAQC,KAAMA,KAE7B3T,EAAAA,EAAAA,KAAA,WAGN,CAMAqZ,iBAAAA,GACEhH,KAAK0C,OAAO1C,KAAKlC,MAAMvJ,SAKvBmB,EAAAA,GAAMoR,KAAK,oBAAqB9G,KAAKoE,iBACrCzR,SAASM,iBAAiB,kBAAmB+M,KAAKiH,cACpD,CAEAC,oBAAAA,GACExR,EAAAA,GAAMyR,OAAO,oBAAqBnH,KAAKoE,iBACvCzR,SAASQ,oBAAoB,kBAAmB6M,KAAKiH,cACvD,E,gDC/YK,SAASG,EAAQve,GAAwE,IAAvE,MAAEqc,EAAK,SAAE5V,KAAa/B,GAA+C1E,EAC5F,OACE4G,EAAAA,EAAAA,MAAA,UACMlC,EACJsB,UAAWC,IAAWvB,EAAMsB,UAAW,yCAA0C,CAC/E,aAAcb,eAAeoR,qBAC5B9P,SAAA,EAEH3B,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,yBAAwBS,UACrC3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,gDAA+CS,SAAE4V,MAElE5V,IAGP,C,kHCGK+X,GAAkB,SAAlBA,GAAkB,OAAlBA,EAAkB,UAAlBA,EAAkB,aAAlBA,CAAkB,EAAlBA,IAAkB,IAKvB,MAAMC,GAAoB,GAE1B,SAASC,GAAsBjX,EAAazH,GAAoC,IAAlC,QAAE6I,GAA8B7I,EAC5E,MAAM2e,GAAYC,EAAAA,EAAAA,IAAkBnX,GACpC,OAAIoB,IAAY2V,GAAmBK,IAAYF,GAG7C7Z,EAAAA,EAAAA,KAACga,EAAAA,EAAY,CAACrX,MAAOA,EAAOsX,aAAc,KAAKtY,SAC5CkY,GAGP,CAEO,SAASK,GAAeta,GAC7B,MAAM,MAAEkH,GAAUtH,EAAAA,WAAiBwI,EAAAA,GAC7BmS,EAAW3a,EAAAA,SAAc,KAC7B,MAAM4a,GAAYC,EAAAA,GAAAA,IAAmC,CACnDC,UAAW,6BAA6BxT,IACxCyT,eAAe,IAGjB,OAAOH,aAAS,EAATA,EAAWvT,KAAKuN,IAAG,IAAWA,EAAKnR,MAAMuX,EAAAA,EAAAA,IAAmBpG,EAAInR,SAAS,GAC/E,CAAC6D,IAEE2T,EAAejb,EAAAA,SACnB,IAAO2a,ECpDJ,SAAyBO,EAA2BC,GAAyC,IAAhBC,EAAUrhB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAC/F,MAAMshB,EAAkB,GAClBC,EAAa,IAAI/f,KAAK4f,GACtBI,EAAgB,IAAIhgB,KAAK2f,GACzBM,EAAYnD,GAAAA,EAAekD,EAAeH,GAChD,IAAI3X,EAAO4U,GAAAA,EAAiBmD,EAAWD,GAAiBA,EAAgBC,EAExE,KAAO/X,GAAQ6X,GACbD,EAAMnc,KAAKuE,EAAKD,WAChBC,EAAO,IAAIlI,KAAKkI,EAAKI,cAAeJ,EAAKE,WAAa,EAAGyX,GAG3D,OAAOC,CACT,CDuCsBI,CAAgBd,EAAS,GAAGlX,KAAMkX,GAASA,aAAQ,EAARA,EAAU3gB,QAAS,GAAGyJ,WAAQxJ,GAC3F,CAAC0gB,IAGH,OAAKA,SAAAA,EAAU3gB,QAGbwG,EAAAA,EAAAA,KAACyZ,EAAQ,IAAK7Z,EAAO2X,MAAM,aAAY5V,UACrC3B,EAAAA,EAAAA,KAACkb,EAAAA,GAAY,CAAC9f,OAAQ,IAAK+f,kBAAkB,EAAMxZ,UACjDG,EAAAA,EAAAA,MAACsZ,EAAAA,EAAa,CAACC,KAAMlB,EAAUmB,OAAQ,CAAEC,KAAM,GAAI3C,MAAO,IAAKjX,SAAA,EAC7D3B,EAAAA,EAAAA,KAACa,EAAAA,EAAa,KACdb,EAAAA,EAAAA,KAACwD,GAAAA,GAAK,CACJgY,OAAQ,CAAC,UAAW,WACpBX,MAAOJ,EACPgB,cAAgB9Y,IACdD,EAAAA,GAAAA,IAAkB,CAAEC,QAAOC,UAAWH,GAAAA,GAAWiZ,WAAY7Y,WAAW,EAAOC,aAAa,OAGhG9C,EAAAA,EAAAA,KAAC2b,GAAAA,EAAK,CAACC,QAAQ,UAASja,UACtB3B,EAAAA,EAAAA,KAACqC,EAAAA,EAAK,CAACb,IAAKmY,GAAmBrY,MAAM,OAAMK,SAAC,+BAI9C3B,EAAAA,EAAAA,KAAC2b,GAAAA,EAAK,CACJE,UAAW,KACXD,QAAQ,WACRE,YAAY,QACZN,OAAQlZ,IAAwB,IAAtByZ,EAASC,GAAQ1Z,EACzB,MAAM2Z,EAA0D,IAAjDviB,KAAKsB,IAAItB,KAAKwiB,IAAIH,GAAUriB,KAAKwiB,IAAIF,IACpD,MAAO,EAAEC,EAAQA,EAAO,EACxBta,UAEF3B,EAAAA,EAAAA,KAACqC,EAAAA,EAAK,CAACb,GAAImY,GAAkBhY,SAAC,YAEhCG,EAAAA,EAAAA,MAACqa,GAAAA,GAAO,CACNC,YAAczZ,IACZD,EAAAA,GAAAA,IAAkB,CAAEC,QAAOC,UAAWH,GAAAA,GAAW4Z,yBAA0BxZ,WAAW,IAExFyZ,YAAa1C,GAAsBjY,SAAA,EAEnC3B,EAAAA,EAAAA,KAACuc,GAAAA,GAAU,CAAChF,MAAM,0BAA0BxT,QAAS2V,GAAmBK,OACxE/Z,EAAAA,EAAAA,KAACuc,GAAAA,GAAU,CAAChF,MAAM,OAAOxT,QAAS2V,GAAmB8C,YAGvDxc,EAAAA,EAAAA,KAACyc,GAAAA,EAAI,CAAC1Y,QAAS2V,GAAmBK,IAAK6B,QAAQ,UAAUc,KAAK,KAC9D1c,EAAAA,EAAAA,KAAC2c,EAAAA,EAAG,CACFf,QAAQ,WACR7X,QAAS2V,GAAmB8C,MAC5BI,OAAQ,CAAC,EAAG,EAAG,EAAG,GAClBtb,MAAQqB,GAAoB,MAATA,EAAgB,OAASA,EAAQ,EAAI,QAAU,eA7C9C,IAmDhC,C,4EE7GO,MAAMka,GAAe,IACfC,GAAY,EAElB,IAAKC,GAAO,SAAPA,GAAO,OAAPA,EAAO,oBAAPA,EAAO,sBAAPA,CAAO,MCGZ,SAASC,GAAgB9hB,GAA8B,IAA7B,EAAE0G,EAAC,MAAEzG,KAAUyE,GAAY1E,EACtD+hB,EAAOrb,EACX,MAAMe,EAAQ/C,EAAMsd,QAAQtd,EAAMmE,SAC5BoZ,EAAiD,IAAjCvd,EAAMsd,QAAQE,gBAAwD,IAAhCxd,EAAMsd,QAAQG,cAM1E,OALIF,IACEvd,EAAMmE,UAAYgZ,GAAQO,KAAML,GAAQ9hB,EAAQ,EAC/C8hB,GAAQ9hB,EAAQ,GAGT,IAAVwH,GAAgBhJ,OAAOoJ,SAASJ,IAMlCb,EAAAA,EAAAA,MAAA,KAAAH,SAAA,EACE3B,EAAAA,EAAAA,KAACud,GAAAA,EAAS,CACR3b,EAAGub,EAAgBF,EAAO9hB,EAAQ,EAAIyG,EACtCC,EAAGjC,EAAM4d,WAAW3b,EACpB1G,MAAOgiB,EAAwB,EAARhiB,EAAYA,EACnCC,OAAQwE,EAAM4d,WAAWpiB,OACzB0I,KAAK,gBAENlE,EAAMmE,UAAYgZ,GAAQO,OACzBtd,EAAAA,EAAAA,KAACyd,EAAAA,EAAQ,IACH7d,EACJgC,EAAGub,EAAgBF,EAAO9hB,EAAQ,EAAI2hB,GAAY,EAAIG,EAAO9hB,EAAQ2hB,GACrE3hB,MAAO2hB,KAGVld,EAAMmE,UAAYgZ,GAAQW,MACzB1d,EAAAA,EAAAA,KAACyd,EAAAA,EAAQ,IAAK7d,EAAOgC,EAAGub,EAAgBvb,EAAIkb,GAAY,EAAIG,EAAM9hB,MAAO2hB,SApBtE9c,EAAAA,EAAAA,KAACR,EAAAA,SAAc,GAwB1B,CCXO,SAASme,GAAsB1a,GACpC,MAAM+X,GAAY4C,EAAAA,GAAAA,GAAa3a,GACzB4a,GAAUC,EAAAA,GAAAA,GAAW9C,GAErB7G,EAAQ6G,EAAU+C,eAAe,QAAS,CAAE5J,MAAO,UACnD6J,EAAWhD,EAAU9X,UACrBmU,EAAO2D,EAAU3X,cAEvB,MAAO,GAAG8Q,KAAS6J,KADJH,EAAQ3a,cACmBmU,GAC5C,CAEO,SAAS4G,GACdC,EAAU5b,GAKV,IAAA6b,EAAAC,EAAA,IAJA,QACEra,EAAO,mBACPsa,GACkG/b,EAEpG,MAAM,QAAEgc,GAA0C,QAAjCH,EAAwB,QAAxBC,EAAGC,EAAmB,UAAE,IAAAD,OAAA,EAArBA,EAAuBlB,eAAO,IAAAiB,EAAAA,EAAI,CAAC,EAEvD,IAAKG,EAAS,OAAO,KAErB,MAAMC,EAAaxa,IAAYgZ,GAAQW,IAAMY,aAAO,EAAPA,EAASE,oBAAsBF,aAAO,EAAPA,EAASG,qBAC/E9b,EAAQoB,IAAYgZ,GAAQW,IAAMY,aAAO,EAAPA,EAASjB,cAAgBiB,aAAO,EAAPA,EAASlB,eACpEsB,EAAwB,IAAV/b,EACdgc,EAAaD,EAAc,KAAO3a,IAAYgZ,GAAQW,IAAM/a,GAASA,EAE3E,OACEb,EAAAA,EAAAA,MAACkY,EAAAA,EACC,CACArX,MAAOgc,EACP1E,aAAc,KACd/Y,UAAWC,IAAW,mCAAoC,CACxD,cAAeud,EACf,eAAgBA,IACf/c,SAAA,EAEHG,EAAAA,EAAAA,MAAA,QAAMZ,UAAU,OAAMS,SAAA,EAAEmY,EAAAA,EAAAA,IAAkB4E,EAAc,KAAO/b,EAAO,CAAEic,aAAc,MAAO,QAC3FF,IACA5c,EAAAA,EAAAA,MAAA,QAAMZ,UAAU,iBAAgBS,SAAA,CAAC,IAC7B4c,QAAAA,EAAc,EAAE,SAAsB,IAAfA,EAAmB,GAAK,IAAI,SAK/D,CClDO,SAASM,GAAyB3jB,GAAwC,IAAA4jB,EAAA,IAAvC,UAAE5d,GAAmChG,EAC7E,MAAM,OAAEG,EAAM,MAAEyL,GAAUtH,EAAAA,WAAiBwI,EAAAA,IACpC+W,EAAWC,GAAgBxf,EAAAA,SAA4B,IAExD2a,EAAW3a,EAAAA,SAAc,KAC7B,MAAM6b,GAAOhB,EAAAA,GAAAA,IAA2C,CACtDC,UAAW,qBAAqBxT,IAChCyT,eAAe,IAGjB,MAAO,CACLc,OACAG,OAAQH,SAAAA,EAAM7hB,OACV,EACE0J,EAAAA,GAAAA,KAAQ0a,EAAAA,GAAAA,IAAa1a,EAAAA,GAAAA,IAAQmY,EAAK,GAAGpY,QAAQD,WAC7CE,EAAAA,GAAAA,KAAQ4a,EAAAA,GAAAA,IAAW5a,EAAAA,GAAAA,IAAQmY,EAAKA,EAAK7hB,OAAS,GAAGyJ,QAAQD,WAE3D,GACL,GACA,CAAC8D,IAEEmY,EAA2Bzf,EAAAA,SAC/B,SAAA0f,EAAA,OAAmB,QAAnBA,EAAM/E,EAASkB,YAAI,IAAA6D,OAAA,EAAbA,EAAeC,MAAMvd,GAAMA,EAAE6c,qBAAuB,GAAK7c,EAAE4c,oBAAsB,GAAE,GACzF,CAACrE,IAyBH,OAtBA3a,EAAAA,WAAgB,KACTyf,GAELnJ,iBAAgC,IAAAsJ,EAC9B,GAAkB,QAAdA,EAACjF,EAASkB,YAAI,IAAA+D,IAAbA,EAAe5lB,OAAQ,OAC5B,MASM6hB,EDpDL,SAA4B7T,EAAYtM,GAAgC,IAA7B6X,EAAUE,GAAiB/X,EAC3E,MAAMmkB,EAA+B,GAE/BC,GAAgBpc,EAAAA,GAAAA,KAAQ0a,EAAAA,GAAAA,IAAa1a,EAAAA,GAAAA,IAAQ6P,KAAY/P,UACzDuc,GAAcrc,EAAAA,GAAAA,KAAQ4a,EAAAA,GAAAA,IAAW5a,EAAAA,GAAAA,IAAQ+P,KAAUjQ,UACzD,IAAK,IAAI8D,EAAQ,EAAGA,EAAQU,EAAMvE,KAAKzJ,OAAQsN,IAAS,CACtD,MAAM0Y,EAAuC,IAApBhY,EAAMvE,KAAK6D,GAC9B2Y,EAAejY,EAAMoL,MAAMpL,EAAMkY,eAAe5Y,IAElDwY,EAAgBE,GAAoBA,EAAmBD,GAE3DF,EAAY3gB,KAAK,CAAEuE,KAAMuc,EAAkB5M,MAAO6M,GACpD,CAEA,OAAOJ,CACT,CCqCmBM,OATO5X,EAAAA,GAAMU,IAAI,CAC5BpN,SACAyB,YAAY8iB,EAAAA,GAAAA,IAAcvkB,GAC1BC,UAAW4M,EAAAA,GAAUC,EAErB0X,QAAS,CAAEC,eAAiBtY,IAAWA,EAAMM,UAIR,CAFtBqS,EAASkB,KAAK,GAAGpY,KACnBkX,EAASkB,KAAKlB,EAASkB,KAAK7hB,OAAS,GAAIyJ,OAGxD+b,EAAa3D,EAAKxU,KAAI,CAACuN,EAAKtN,KAAK,IAAAiZ,EAAA,MAAM,IAAK3L,EAAKkK,QAAsB,QAAfyB,EAAE5F,EAASkB,YAAI,IAAA0E,OAAA,EAAbA,EAAgBjZ,GAAQ,IACpF,CAEAkZ,EAAgB,GACf,CAAC7F,EAAU8E,EAA0BnY,EAAOzL,IAE7B,QAAdyjB,EAAC3E,EAASkB,YAAI,IAAAyD,GAAbA,EAAetlB,QAAWylB,GAG7Bjf,EAAAA,EAAAA,KAACyZ,EAAQ,CAAClC,MAAM,yBAAyBrW,UAAWA,EAAUS,UAC5D3B,EAAAA,EAAAA,KAACkb,EAAAA,GAAY,CAAC9f,OAAQyhB,GAAalb,UACjCG,EAAAA,EAAAA,MAACsZ,EAAAA,EAAa,CAACC,KAAMlB,EAASkB,KAAM4E,OAAQ,EAAGC,eAAgB,EAAG5E,OAAQ,CAAEC,KAAM,GAAI3C,MAAO,IAAKjX,SAAA,EAChG3B,EAAAA,EAAAA,KAACa,EAAAA,EAAa,KACdb,EAAAA,EAAAA,KAACwD,GAAAA,GAAK,CAACgY,OAAQrB,EAASqB,OAAQ2E,QAAQ,YAAYC,MAAI,KACxDpgB,EAAAA,EAAAA,KAACwD,GAAAA,GAAK,CACJgY,OAAQrB,EAASqB,OACjBC,cAAgB9Y,IACdD,EAAAA,GAAAA,IAAkB,CAAEC,QAAOC,UAAWH,GAAAA,GAAWiZ,WAAY7Y,WAAW,EAAOC,aAAa,OAGhG9C,EAAAA,EAAAA,KAAC2b,GAAAA,EAAK,CAACG,YAAY,QAAOna,UACxB3B,EAAAA,EAAAA,KAACqC,EAAAA,EAAK,CAACb,GAAI,GAAGG,SAAC,yBAEjB3B,EAAAA,EAAAA,KAAC2b,GAAAA,EAAK,CAACC,QAAQ,aAAaH,cAAgB9Y,IAAUmX,EAAAA,EAAAA,IAAkBnX,GAAQ6Y,OAAQ,CAAC,UAAW,QAAQ7Z,UAC1G3B,EAAAA,EAAAA,KAACqC,EAAAA,EAAK,CAACb,IAAK,GAAIF,MAAM,OAAMK,SAAC,mBAI/BG,EAAAA,EAAAA,MAACqa,GAAAA,GAAO,CACNC,YAAauB,GACbrB,YAAa2B,GACboC,QAAQrgB,EAAAA,EAAAA,KAACsgB,GAAAA,EAAS,CAACC,mBAAoBpG,EAASkB,KAAK7hB,SAAWmI,SAAA,EAEhE3B,EAAAA,EAAAA,KAACuc,GAAAA,GAAU,CACThF,MAAM,uBACNxT,QAASgZ,GAAQO,KACjBkD,WAAW,kDAEbxgB,EAAAA,EAAAA,KAACuc,GAAAA,GAAU,CACThF,MAAM,qBACNxT,QAASgZ,GAAQW,IACjB8C,WAAW,qDAIfxgB,EAAAA,EAAAA,KAACyc,GAAAA,EAAI,CAACpB,KAAM0D,EAAWhb,QAAQ,QAAQoc,QAAQ,YAAYvE,QAAQ,aAAac,KAAK,KACrF1c,EAAAA,EAAAA,KAAC2c,EAAAA,EAAG,CAAC5Y,QAASgZ,GAAQO,KAAMhc,MAAM,MAAMmf,MAAOzD,MAC/Chd,EAAAA,EAAAA,KAAC2c,EAAAA,EAAG,CAAC5Y,QAASgZ,GAAQW,IAAKpc,MAAM,QAAQmf,MAAOzD,YAzCQ,IA8ClE,C,uCCjGK0D,GAA0B,SAA1BA,GAA0B,OAA1BA,EAAAA,EAA0B,uBAA1BA,EAAAA,EAA0B,iBAA1BA,CAA0B,EAA1BA,IAA0B,IAK/B,SAASC,GAAgBC,EAAoB5c,GAE3C,MAAO,6BADMA,IAAS0c,GAA2BG,MAAQ,eAAiB,gCACnBD,GACzD,CAEA,MAAME,GAAoBzgB,eAAeoR,mBAEnCsP,GAAoB,CACxB,WAAYD,IAGP,SAASE,KACd,MAAM,MAAEla,GAAUtH,EAAAA,WAAiBwI,EAAAA,IAC7B,cAAEiZ,EAAa,iBAAEC,EAAgB,WAAEC,EAAU,cAAEC,GAAkB5hB,EAAAA,SAAc,KAAM,IAAA6hB,EAAAC,EACzF,MAAMnH,GAAWE,EAAAA,GAAAA,IAAmD,CAClEC,UAAW,qCAAqCxT,IAChDyT,eAAe,IAGX0G,EAA2C,QAA9BI,EAAGlH,aAAQ,EAARA,EAAUoH,yBAAiB,IAAAF,EAAAA,EAAI,GAC/CF,EAAqC,QAA3BG,EAAGnH,aAAQ,EAARA,EAAUqH,sBAAc,IAAAF,EAAAA,EAAI,GAE/C,MAAO,CACLL,gBACAC,iBAAkBD,EAAcznB,OAAS,EACzC2nB,aACAC,cAAeD,EAAW3nB,OAAS,EACpC,GACA,CAACsN,KAEG2a,EAAwBC,GAA6BliB,EAAAA,SAC1D0hB,EAAmBR,GAA2BiB,SAAWjB,GAA2BG,OAEhFe,EAAQH,IAA2Bf,GAA2BiB,SAAWV,EAAgBE,EAE/F,OACErf,EAAAA,EAAAA,MAAA,OACEZ,UAAW6S,IAAW,mBAAoB,CACxC,wCAAyC+M,KACxCnf,SAAA,EAEHG,EAAAA,EAAAA,MAAA,OACEZ,UAAW6S,IAAW,2CAA4C,CAChE,OAAQ+M,GACR,UAAWA,KACVnf,SAAA,EAEH3B,EAAAA,EAAAA,KAAC6hB,GAAAA,GAAO,CACNC,MAAO,EACP5gB,UAAW6S,IAAW,MAAO,CAC3B,qCAAsC+M,GACtC,aAAcA,KACbnf,SACJ,6BAGDG,EAAAA,EAAAA,MAACigB,GAAAA,EAAU,CAACld,KAAK,QAAQmd,SAAWlB,QAA6BrnB,EAAT,OAAmBkI,SAAA,EACzE3B,EAAAA,EAAAA,KAACiiB,GAAAA,EAAgB,CACfC,UAAWhB,EACXiB,OAAQV,IAA2Bf,GAA2BiB,SAC9DnS,QAASA,KACPkS,EAA0BhB,GAA2BiB,SAAS,EAC9DhgB,SACH,cAGD3B,EAAAA,EAAAA,KAACiiB,GAAAA,EAAgB,CACfC,UAAWd,EACXe,OAAQV,IAA2Bf,GAA2BG,MAC9DrR,QAASA,KACPkS,EAA0BhB,GAA2BG,MAAM,EAC3Dlf,SACH,iBAKL3B,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,wCACflB,EAAAA,EAAAA,KAACyT,GAAAA,GAAK,CACJvS,UAAW6S,IAAW,+BAAgC,CACpD,SAAU+M,KACTnf,UAEH3B,EAAAA,EAAAA,KAACoiB,GAAAA,GAAS,CAAAzgB,SACPigB,EAAM/a,KAAI3L,IAAA,IAAC,WAAE0lB,EAAU,KAAElhB,EAAI,cAAE2iB,GAAennB,EAAA,OAC7C4G,EAAAA,EAAAA,MAACwgB,GAAAA,GAAQ,CAAA3gB,SAAA,EACP3B,EAAAA,EAAAA,KAACuiB,GAAAA,GAAS,CAACC,YAAY,EAAOthB,UAAW6S,IAAWgN,IAAmBpf,UACrE3B,EAAAA,EAAAA,KAAA,KAAGkB,UAAU,0BAA0B2L,KAAM8T,GAAgBC,EAAYa,GAAwB9f,SAC9FjC,QAAAA,EAAQ,SAGbM,EAAAA,EAAAA,KAACuiB,GAAAA,GAAS,CAACE,MAAOC,GAAAA,GAAWC,MAAOzhB,UAAW6S,IAAWgN,GAAmB,QAAQpf,UACnF3B,EAAAA,EAAAA,KAACga,EAAAA,EAAY,CAACrX,MAAO0f,EAAepI,aAAc,KAAKtY,UACpDihB,EAAAA,EAAAA,IAAaP,EAAe,CAAEQ,OAAQ,YAR9BjC,EAWJ,UAMvB,CClHO,SAASkC,GAAU5nB,GAA2E,IAA1E,MAAE6nB,EAAK,KAAE9f,EAAI,UAAE+f,EAAS,MAAEC,EAAK,UAAEC,EAAS,UAAEC,GAA4BjoB,EACjG,MAAMkoB,GAAa9K,MAAM2K,IAAUA,EAAQ,EAAI,EAAI,EAC7CI,EAAWH,GAAavpB,OAAOoJ,SAASmgB,GAE9C,OACEphB,EAAAA,EAAAA,MAAA,OAAKZ,UAAU,cAAaS,SAAA,CACzBohB,IAAS/iB,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,UAASS,SAAEohB,KAElC9f,GAAQ+f,KACRlhB,EAAAA,EAAAA,MAAA,QAAMZ,UAAU,mBAAkBS,SAAA,CAC/BqhB,QAAAA,GAAaM,EAAAA,GAAAA,IAAWrgB,EAAM,GAAI,UAClCA,IACCnB,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,CACG,KACD3B,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,MAAQ,KAAE2hB,EAAAA,GAAAA,IAAWrgB,EAAM,GAAI,WAAW,aAMjFnB,EAAAA,EAAAA,MAAA,OAAKZ,UAAU,sBAAqBS,SAAA,EAClC3B,EAAAA,EAAAA,KAAA,UAAQkB,UAAU,4BAA2BS,UAAEihB,EAAAA,EAAAA,IAAaK,EAAO,CAAErE,aAAc,IAAKwE,iBACxFpjB,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,6BAA4BS,UACzCG,EAAAA,EAAAA,MAACyhB,EAAAA,EAAiB,CAAA5hB,SAAA,EAChBG,EAAAA,EAAAA,MAACkY,EAAAA,EAAY,CAACrX,MAAOugB,EAAWhiB,UAAW6S,IAAW,CAAE,gBAAiBsP,IAAY1hB,SAAA,EACnF3B,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,UAASS,SAAC,mBACxBihB,EAAAA,EAAAA,IAAaM,EAAW,CAAEM,cAAc,EAAMJ,kBAEjDthB,EAAAA,EAAAA,MAACkY,EAAAA,EAAY,CACXrX,MAAOwgB,EACPjiB,UAAW6S,IAAW,CAAE,gBAAiBsP,IACzCpJ,cAAcja,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,cAAaS,SAAC,MAASA,SAAA,EAErD3B,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,UAASS,SAAC,uBACxBihB,EAAAA,EAAAA,IAAaO,gBAO5B,CCtDA,MAAMM,GAAsB,CAAC,SAAU,UACjCC,GAA4B,IAAID,GAAqB,UAAW,aAW/D,SAASE,GAAsBhX,GAAmD,IAAAiX,EACvF,MAAMzW,GAAaC,EAAAA,EAAAA,IAAcT,aAAgB,EAAhBA,EAAkBrQ,SAASunB,QAAS,CACnEvW,gBAAiB,CAAC,SAClBwW,eAAgBL,KAEZM,GAAa3W,EAAAA,EAAAA,IAAiC,QAApBwW,EAACzW,aAAU,EAAVA,EAAY3F,eAAO,IAAAoc,EAAAA,EAAI,KAAM,CAC5DtW,gBAAiB,CAAC,YAAa,YAAa,aAAc,aAC1DwW,eAAgBJ,KAGlB,OAAKK,EAEE,CACLC,UAAWD,EAAWC,UACtBC,UAAWF,EAAWE,UACtBC,SAAUH,EAAWG,SACrBC,SAAUJ,EAAWI,SACrBC,WAAYL,EAAWK,WACvBC,UAAWN,EAAWM,WARA,IAU1B,CCpBO,SAASC,KACd,MAAM,oBAAEzZ,GAAwBrL,EAAAA,WAAiBkL,IAC3C,iBAAEiC,IAAqBO,EAAAA,EAAAA,MACvBmO,EAAOsI,GAAsBhX,GAC7B4X,IAAYlJ,EAQlB,OANA7b,EAAAA,WAAgB,KACV+kB,GAAS1Z,GAAoB,GAE1B,IAAMA,GAAoB,KAChC,CAAC0Z,EAAS1Z,KAEN7K,EAAAA,EAAAA,KAACwkB,GAAkB,CAACnJ,KAAMA,GACnC,CAiDO,MAAMoJ,IAAwBC,EAAAA,EAAAA,KAA4BC,EAAAA,EAAAA,KA1CjE,SAAuCzpB,GAA+D,IAA9D,iBAAEyR,EAAgB,OAAE9N,GAAwC3D,EAClG,MAAM,oBAAE2P,GAAwBrL,EAAAA,WAAiBkL,GAC3C2Q,EAAOsI,GAAsBhX,GAqCnC,OA7BAnN,EAAAA,WAAgB,MACdsW,iBACE,IAAK,MAAMzP,KAAexH,EAAOvC,OAAQ,CACvC,MAAMsoB,EAAkBhqB,OAAO0L,OAAO,CAAC,EAAGD,GAE1Cue,EAAgBC,aAAelY,SACxBiY,EAAgB1nB,MACY,MAA/B0nB,EAAgB7oB,cAClB6oB,EAAgB7oB,aAAc,GAEhC4Q,EAAiBrQ,SAASgC,OAAOsmB,EACnC,CAEA,MAAMza,EAAQwC,EAAiBrQ,SAASunB,QAElCrc,QAAcO,EAAAA,GAAMU,IAAI,CAC5BpN,OAAQ8O,EAAM9O,OACdyB,WAAYqN,EAAMrN,WAClBxB,UAAW6O,EAAM7O,UACjBukB,QAAS,CAAEiF,QAAS,KAGtB3a,EAAMyL,iBAAiB,CAAEpO,UACzBqD,GACF,CAEAka,EAAyB,GACxB,CAACpY,EAAkB9N,EAAOvC,OAAQuO,KAE9B7K,EAAAA,EAAAA,KAACwkB,GAAkB,CAACnJ,KAAMA,GACnC,KAIO,SAASmJ,GAAkBliB,GAAiD,IAAhD,KAAE+Y,GAA4C/Y,EAC/E,IAAK+Y,EAAM,OAAO,KAElB,MAAM2J,EAAWrrB,OAAOoJ,SAASsY,EAAK2I,WAChCiB,EAAgBtrB,OAAOoJ,SAASsY,EAAK+I,aAAe/I,EAAK+I,aAAe/I,EAAK4I,UAC7EC,EAAW7I,EAAK6I,UAAWhhB,EAAAA,GAAAA,IAAwB,IAAhBmY,EAAK6I,UAAmB,KAC3DC,GAAYD,GAAY7I,EAAK8I,UAAWb,EAAAA,GAAAA,IAAWjI,EAAK8I,SAAU,WAAY,gBAAkB,KAChGe,EAAY7J,EAAKgJ,WAAYnhB,EAAAA,GAAAA,IAAyB,IAAjBmY,EAAKgJ,WAAoB,KAEpE,IAAIc,EAMJ,OALIjB,GAAYgB,IAC6BC,EAAvCtN,GAAAA,EAAiBqN,EAAWhB,GAA6B,YACtC,gBAIvBpiB,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,CACGqjB,IACChlB,EAAAA,EAAAA,KAAC8iB,GAAU,CACTC,MAAM,aACNE,MAAO5H,EAAK4I,UACZhhB,KAAMihB,EACNlB,UAAWmB,EACXjB,UAAW7H,EAAK4I,UAAY5I,EAAK2I,UACjCb,UAAmD,KAAvC9H,EAAK4I,UAAY5I,EAAK2I,UAAY,KAGjDiB,IACCjlB,EAAAA,EAAAA,KAAC8iB,GAAU,CACTC,MAAO,GAAGoC,UACVlC,MAAO5H,EAAK+I,WACZnhB,KAAMiiB,EACNlC,UAAWmC,EACXjC,UAAW7H,EAAK+I,WAAa/I,EAAK4I,UAClCd,UAAoD,KAAxC9H,EAAK+I,WAAa/I,EAAK4I,UAAY,OAKzD,C,6kBClGe,MAAMmB,WAAiBvT,EAAAA,UAAyBC,WAAAA,GAAA,SAAAvY,WAAAwY,GAAA,eAC1BsT,EAAAA,EAAAA,aAAW,CAI9ChM,iBAAAA,GACEhH,KAAKiT,aACP,CAEAC,kBAAAA,GACElT,KAAKiT,aACP,CAEAA,WAAAA,GAAc,IAAAE,EACZ,MAAM,KAAEnK,EAAI,MAAE0H,GAAU1Q,KAAKzS,MAC7B,GAAIyb,IAAShJ,KAAKoT,UAChB,OAEFpT,KAAKoT,UAAYpK,EACjBhJ,KAAKqT,OAAOpb,QAASqb,UAAY,GAEjC,MAAMC,GAAyC,IAA3BvT,KAAKzS,MAAMgmB,YAEzBtK,EACCyH,EAAQ,GAAK,GADdzH,EAEGjJ,KAAKzS,MAAMimB,aAAe,GAF7BvK,EAGIsK,EAAc,GAAK,GAHvBtK,EAIE,GAEFwK,EAAazT,KAAKzS,MAAMzE,OAAS,IACjC4qB,EAAc1T,KAAKzS,MAAMxE,QAAU,IACnCD,EAAQ2qB,EAAaxK,EAAcA,EACnClgB,EAAS2qB,EAAczK,EAAaA,EAEpC1Z,EAAIokB,GAAAA,KAEPxK,OAAOH,EAAKxU,KAAKsB,GAAMA,EAAEzI,QACzBumB,WAAW,CAAC,EAAG9qB,IACfsd,QAAQ,IAEX,IAAI3d,EAAMkrB,GAAAA,IAAO3K,GAAOlT,GAAWA,EAAExF,QAEnC7H,EADEA,EAAM,EACFkrB,GAAAA,IAAO3K,GAAOlT,GAAWzO,KAAKoB,IAAIqN,EAAExF,OAAQwF,EAAExF,SAE9C,EAGR,MAAMd,EAAImkB,GAAAA,MAEPE,MAAM,CAAC9qB,EAAQ,IACfogB,OAAO,CAAC1gB,EAAKkrB,GAAAA,IAAO3K,GAAOlT,GAAWzO,KAAKwiB,IAAI/T,EAAExF,WACjDwjB,OACGC,EAAU/T,KAAKzS,MAAMymB,eAAiBhU,KAAKzS,MAAMymB,eAAiBxkB,EAAEykB,aAEpEC,EAAMP,GAAAA,IACF3T,KAAKqT,OAAOpb,SACnBkc,SAAS,QAAS,IAClBC,OAAO,KACPC,KAAK,YAAa,aAAepL,EAAc,IAAMA,EAAa,KAE/DqL,EAAQX,GAAAA,IAAcpkB,GACtBglB,EAAQZ,GAAAA,IAAankB,GAAGgZ,MAAMzf,EAAS,IAAM,GAAK,GAIxDmrB,EAAIE,OAAO,KAAKC,KAAK,QAAS,QAAQ9W,KAFboW,GAAAA,IAAYnkB,GAEmBglB,UAAU1rB,GAAO2rB,cAAc,GAAGR,WAAW,KAErGC,EACGE,OAAO,KACPC,KAAK,QAAS,eACdA,KAAK,YAAa,eAAiBtrB,EAAS,KAC5CwU,KAAK+W,GAERJ,EACGQ,UAAU,gBACVnpB,MAAM,cAAegoB,EAAc,MAAQ,UAC3Cc,KAAK,KAAMd,EAAc,QAAU,GACnCc,KAAK,KAAMd,EAAc,QAAU,SACnCc,KAAK,YAAa,WAAad,GAAe,GAAK,GAAK,KAE3DW,EACGE,OAAO,KACPC,KAAK,QAAS,eACdA,KAAK,YAAa,aAAevrB,EAAQ,QACzCyU,KAAKgX,GAEJ7D,GACFwD,EACGE,OAAO,QACPC,KAAK,QAAS,mBACdA,KAAK,IAAK,GACVA,KAAK,KAAM,GACXA,KAAK,cAAe,SACpBM,KAAKjE,GAGV,MAAMkE,EAAa9e,IAAW,IAAA+e,EAC5B,IAAI9rB,EAAS1B,KAAKwiB,IAAIra,EAAS,QAARqlB,EAAC/e,EAAExF,aAAK,IAAAukB,EAAAA,EAAI,GAAKrlB,EAAE,IAI1C,OAHIsG,EAAExF,MAAQ,GAAKwF,EAAExF,MAAQ,KAC3BvH,EAAS1B,KAAKsB,IAAII,EAAQ,KAErBA,CAAM,EAET+rB,EAAa/rB,GAAmBA,EAAS,GAClCmrB,EAAIQ,UAAU,QAAQ1L,KAAKA,GAErC+L,QACAX,OAAO,QACPC,KAAK,SAAS,SAAUve,GACvB,MAAO,aAAeA,EAAExF,MAAQ,EAAI,WAAa,WACnD,IACC+jB,KAAK,KAAMve,GAAWvG,EAAEuG,EAAEzI,QAC1BgnB,KAAK,KAAMve,GAAWtG,EAAEnI,KAAKsB,IAAI,EAAGmN,EAAExF,UACtC+jB,KAAK,SAAUO,GACfP,KAAK,QAAS9kB,EAAEylB,aAChBX,KAAK,KAAoB,QAAdlB,EAAAnlB,sBAAc,IAAAmlB,GAAdA,EAAgB/T,mBAAqB,EAAI,GAEvD8U,EACGQ,UAAU,cACV1L,KAAKA,GACL+L,QACAX,OAAO,QACPC,KAAK,QAAS,cACdA,KAAK,KAAMve,GAAWvG,EAAEuG,EAAEzI,MAASkC,EAAEylB,YAAc,IACnDX,KAAK,KAAMve,IACV,MAAM/M,EAAS6rB,EAAU9e,GACnBmf,EAAUH,EAAU/rB,GAC1B,OAAI+M,EAAExF,MAAQ,EACLd,EAAEnI,KAAKsB,IAAI,EAAGmN,EAAExF,QAAUvH,GAAUksB,EAAU,IAAM,GAEtDzlB,EAAEnI,KAAKsB,IAAI,EAAGmN,EAAExF,SAAW2kB,GAAW,EAAI,GAAG,IAErDZ,KAAK,QAASve,IAAa9H,eAAeyJ,cAAgBqd,EAAUF,EAAU9e,IAAM,QAAU,UAC9Fue,KAAK,cAAe,UACpBA,KAAK,YAAa,QAClBM,MAAM7e,GAAwB,OAAZA,EAAExF,MAAiByjB,EAAQje,EAAExF,OAAS,KAE3D0P,KAAKqT,OAAOpb,QAAS1M,MAAMzC,MAAQ2qB,EAAa,KAChDzT,KAAKqT,OAAOpb,QAAS1M,MAAMxC,OAAS2qB,EAAc,IACpD,CAEAzT,MAAAA,GACE,OAAOtS,EAAAA,EAAAA,KAAA,OAAKqT,IAAKhB,KAAKqT,OAAQxkB,UAAW,oBAAsBmR,KAAKzS,MAAMsB,WAAa,KACzF,EClKK,IAAKqmB,GAAkB,SAAlBA,GAAkB,OAAlBA,EAAkB,sBAAlBA,EAAkB,4BAAlBA,CAAkB,MAKlBC,GAAuB,SAAvBA,GAAuB,OAAvBA,EAAuB,gBAAvBA,EAAuB,sBAAvBA,CAAuB,MAK5B,MAEMC,GAAmB,CAC9B,CAACF,GAAmBG,YAAY,EAChC,CAACH,GAAmBI,eAAe,EACnCC,oBAAqBJ,GAAwBK,Q,8bCkB/C,MAAMzC,WAAiBvT,EAAAA,UAGrBC,WAAAA,CAAYlS,GACVkV,MAAMlV,GAAMmS,GAAA,sBACZM,KAAKqT,QAASL,EAAAA,EAAAA,YAChB,CAEAhM,iBAAAA,GACEhH,KAAKiT,aACP,CAEAC,kBAAAA,GACElT,KAAKiT,aACP,CAEAA,WAAAA,GACE,MAAMjK,EAAOhJ,KAAKzS,MAAMyb,KAGlBlgB,EAAsB,EAAdkgB,EAAK7hB,OAGboI,EAAIokB,GAAAA,KAEPxK,OAAOH,EAAKxU,KAAKsB,GAAMA,EAAEzI,QACzBwmB,MAAM,CAAC,EAAG/qB,IAEb,IAAIL,EAAMkrB,GAAAA,IAAO3K,GAAOlT,GAAWA,EAAExF,QAEnC7H,EADEA,EAAM,EACFkrB,GAAAA,IAAO3K,GAAOlT,GAAWzO,KAAKoB,IAAIqN,EAAExF,OAAQwF,EAAExF,SAE9C,EAGR,MAAMd,EAAImkB,GAAAA,MAEPE,MAAM,CAhBM,GAgBG,IACf1K,OAAO,CAAC1gB,EAAKkrB,GAAAA,IAAO3K,GAAOlT,GAAWzO,KAAKwiB,IAAI/T,EAAExF,WACjDwjB,OACA2B,QAAQ1sB,GAIL2sB,EAFM/B,GAAAA,IAAU3T,KAAKqT,OAAOpb,SAASkc,SAAS,QAAS,IAE5CO,UAAU,QAAQ1L,KAAKA,GACxC0M,EACGX,QACAX,OAAO,QACPC,KAAK,SAAS,SAAUve,GACvB,MAAO,aAAeA,EAAExF,MAAQ,EAAI,WAAa,WACnD,IACC+jB,KAAK,KAAK,SAAUve,GACnB,OAAOvG,EAAEuG,EAAEzI,KACb,IACCgnB,KAAK,KAAK,SAAUve,GACnB,OAAOtG,EAAEnI,KAAKsB,IAAI,EAAGmN,EAAExF,OACzB,IACC+jB,KAAK,UAAU,SAAUve,GACxB,IAAI/M,EAAS1B,KAAKwiB,IAAIra,EAAEsG,EAAExF,OAASd,EAAE,IAIrC,OAHIsG,EAAExF,MAAQ,GAAKwF,EAAExF,MAAQ,KAC3BvH,EAAS1B,KAAKsB,IAAII,EAAQ,KAErBA,CACT,IACCsrB,KAAK,QA7CS,GA8CjBqB,EACGC,aACAtB,KAAK,SAAS,SAAUve,GACvB,MAAO,aAAeA,EAAExF,MAAQ,EAAI,WAAa,WACnD,IACC+jB,KAAK,KAAK,SAAUve,GACnB,OAAOvG,EAAEuG,EAAEzI,KACb,IACCgnB,KAAK,KAAK,SAAUve,GACnB,OAAOtG,EAAEnI,KAAKsB,IAAI,EAAGmN,EAAExF,OACzB,IACC+jB,KAAK,UAAU,SAAUve,GACxB,IAAI/M,EAAS1B,KAAKwiB,IAAIra,EAAEsG,EAAExF,OAASd,EAAE,IAIrC,OAHIsG,EAAExF,MAAQ,GAAKwF,EAAExF,MAAQ,KAC3BvH,EAAS1B,KAAKsB,IAAII,EAAQ,KAErBA,CACT,IACCsrB,KAAK,QAhES,GAiEjBqB,EAAKE,OAAOjc,SAEZqG,KAAKqT,OAAOpb,QAAS1M,MAAMzC,MAAQA,EAAQ,KAC3CkX,KAAKqT,OAAOpb,QAAS1M,MAAMxC,OAASA,MACtC,CAEAkX,MAAAA,GACE,OAAOtS,EAAAA,EAAAA,KAAA,OAAKqT,IAAKhB,KAAKqT,OAAQxkB,UAAU,mBAC1C,EAGF,SAASgnB,KACP,OACEloB,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,iCAAgCS,UAC7CG,EAAAA,EAAAA,MAAA,OAAKZ,UAAU,yCAAwCS,SAAA,EACrD3B,EAAAA,EAAAA,KAACmoB,GAAAA,GAAI,CAACzoB,KAAK,OAAOvE,MAAM,KAAK+F,UAAU,2BACvClB,EAAAA,EAAAA,KAAA,MAAIkB,UAAU,yCAAwCS,SAAC,oCACvD3B,EAAAA,EAAAA,KAAA,KAAA2B,SAAG,4KAIH3B,EAAAA,EAAAA,KAAA,KACE6M,KAAK,gFACLoK,OAAO,SACP/V,UAAU,WAAUS,SACrB,mBAMT,CAMA,MAAMymB,WAAwBvW,EAAAA,UAAgCC,WAAAA,GAAA,SAAAvY,WAAAwY,GAAA,aACpD,CACNsW,OAAO,GACR,CAED/V,MAAAA,GACE,OACEtS,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,UAASS,UACtBG,EAAAA,EAAAA,MAACwmB,GAAAA,EAAuB,CAACC,UAAU,QAAQC,YAAa,EAAE7mB,SAAA,EACxD3B,EAAAA,EAAAA,KAACsoB,GAAAA,EAAqB,CAACpG,UAAW7P,KAAKzS,MAAMyb,KAAK8D,MAAMvd,GAAkB,OAAZA,EAAEe,QAAgBhB,UAC9E3B,EAAAA,EAAAA,KAAColB,GAAQ,CAAC/J,KAAMhJ,KAAKzS,MAAMyb,UAE7Brb,EAAAA,EAAAA,KAACsoB,GAAAA,EAAe,CACdG,QAAQ,EACRvnB,UAAW6S,IAAW,6DAA8D,CAClF,SAAU1T,eAAeG,iBACxBmB,SAEFtB,eAAeG,gBACdR,EAAAA,EAAAA,KAAC0oB,GAAW,CAACrN,KAAMhJ,KAAKzS,MAAMyb,KAAMuK,aAAa,KAEjD5lB,EAAAA,EAAAA,KAACkoB,GAAY,UAMzB,EAGF,MAAMS,GAAiB,IAEjBC,GAAoBA,IACnBvoB,eAAeG,eAI6C,OAA1DqoB,EAAAA,GAAAA,UAAiB,oBAAqBF,IAA0B,IAAM,IAHpEA,GAMLG,GAA+ClB,GAC/CA,IAAwBJ,GAAwBuB,UAC3C,IAIF,IAUT,SAASC,KAAsB,IAAAxD,EAC7B,MAAM,SAAEyD,IAAaC,EAAAA,GAAAA,MACfC,EAAU3pB,EAAAA,QAAapB,EAAAA,GAAAA,QAEtB+R,EAAO8F,GAAYzW,EAAAA,SAAgC,CACxD4pB,OAAQR,KACRS,MAAO,IACPC,SAAU,KACVjO,KAAM,OAGF/f,EAAYwtB,GAA4CG,EAASrB,sBAEjE,KAAEvM,GAASlL,EACXoU,EAAUlJ,IAASA,EAAKnc,OAAStE,OAAO2uB,KAAKlO,GAAM7hB,OAAS,EAC5DiY,EAAmC,QAAjB+T,EAAGnlB,sBAAc,IAAAmlB,OAAA,EAAdA,EAAgB/T,mBAkB3CjS,EAAAA,WAAgB,KAAM,IAAAgqB,EAIpB,OAHAL,EAAQ7e,SAAUlM,EAAAA,GAAAA,MACH,QAAforB,EAAAL,EAAQ7e,eAAO,IAAAkf,GAAfA,EAAiBlrB,SAEV,KAAM,IAAAmrB,EACI,QAAfA,EAAAN,EAAQ7e,eAAO,IAAAmf,GAAfA,EAAiBtqB,SAAS,CAC3B,GACA,IAEHK,EAAAA,WAAgB,KAzBDsW,WACb,MAAM,OAAEsT,EAAM,MAAEC,GAAUlZ,GACpB,EAAE6F,IAAM1R,EAAAA,GAAAA,OAEd,IACE,MAAMolB,QAAiBC,MAAM,yBAAyB3T,QAAQoT,OAAYC,IAAQ/tB,KAC5EsuB,QAAaF,EAASE,OAE5B3T,EAAS,IACJ9F,EACHmZ,SAAUM,EAAKN,SACfjO,KAAMuO,EAAK1qB,MAAQ0qB,EAAOA,EAAKvO,MAEnC,CAAE,MAAO,GAaTtG,EAAQ,GAEP,CAAC5E,EAAMkZ,MAAOlZ,EAAMiZ,OAAQ9tB,IAE/B,MAAMuuB,EAAmBA,CAAC5pB,EAAY+mB,KAEpChnB,EAAAA,EAAAA,KAAA,KACE6M,KAAK,IACL3L,UAAW6S,IAAW,WAAY,CAAE,YAAa5D,EAAMkZ,QAAUppB,IACjEuP,QAAUxQ,IACRA,EAAEgR,iBACFiG,EAAS,IACJ9F,EACHkZ,MAAOppB,GACP,EACF0B,SAEDqlB,IAIL,OAAa,OAAT3L,EACK,MAIPvZ,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAA,SAAO7E,MAAM,OAAOsZ,YAAY,IAAIvT,UAAU,0BAAyBS,UACrE3B,EAAAA,EAAAA,KAAA,SAAA2B,UACEG,EAAAA,EAAAA,MAAA,MAAAH,SAAA,EACEG,EAAAA,EAAAA,MAAA,MAAIlE,MAAOyC,eAAeG,eAAiB,CAAEspB,YAAa,GAAM,CAAC,EAAEnoB,SAAA,CAChEtB,eAAeG,iBAEdsB,EAAAA,EAAAA,MAAA,UACEZ,UAAW6S,IAAW,CACpB,4BAA6BtC,EAC7B,YAAaA,IAEf9O,MAAOwN,EAAMiZ,OACb1Q,SAAW1Z,IACTA,EAAEgR,iBACF,MAAMoZ,EAA4B,MAAnBpqB,EAAEiY,OAAOtU,MAAgB,IAAM,IAC9CsT,EAAS,IACJ9F,EACHiZ,OAAQA,KAEVW,EAAAA,GAAAA,UAAS,oBAAqBX,EAAQT,IAAgB,EAAM,EAC5DhnB,SAAA,EAEF3B,EAAAA,EAAAA,KAAA,UAAQ2C,MAAM,IAAGhB,SAAC,aAClB3B,EAAAA,EAAAA,KAAA,UAAQ2C,MAAM,IAAGhB,SAAC,eAGrBtB,eAAeG,iBAAkBR,EAAAA,EAAAA,KAAAuP,EAAAA,SAAA,CAAA5N,SAAE,SAEpCG,EAAAA,EAAAA,MAAA,QAAMZ,UAAU,iBAAgBS,SAAA,CAC7BkoB,EAAiB,IAAK,oBAAoB,KAAC7pB,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,MAAS,IACnFkoB,EAAiB,IAAK,iBAAiB,KAAC7pB,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAC,MAAS,IAChFkoB,EAAiB,IAAK,oBAG3B7pB,EAAAA,EAAAA,KAAA,MAAIyiB,MAAM,QAAO9gB,UACf3B,EAAAA,EAAAA,KAACgqB,GAAyB,aAKjCzF,IAAWvkB,EAAAA,EAAAA,KAACiqB,GAAe,CAAC5O,KAAMlL,EAAMkL,KAAMiO,SAAUnZ,EAAMmZ,YAC7D/E,IACAvkB,EAAAA,EAAAA,KAAA,SACE7E,MAAM,OACNsZ,YAAY,IACZ,cAAY,yBACZvT,UAAW6S,IAAW,CACpB,qEAAsEtC,EACtE,+CAAgDA,EAChD,WAAYpR,eAAeG,iBAC1BmB,UAEH3B,EAAAA,EAAAA,KAAA,SAAA2B,UACE3B,EAAAA,EAAAA,KAAA,MAAIkB,UAAU,gFAA+ES,UAC3F3B,EAAAA,EAAAA,KAAA,MAAIkB,UAAWuQ,EAAqB,GAAK,eAAe9P,SAAC,0FASvE,CAUA,SAASqoB,KACP,MAAM,SAAEf,EAAQ,YAAEiB,IAAgBhB,EAAAA,GAAAA,MAE5BiB,EAAgBA,CAACC,EAA2BznB,KAChDunB,EAAY,IACPjB,EACH,CAACmB,GAAMznB,GACP,EAGE0nB,EAAiB7qB,EAAAA,SAAc,IACNypB,EAASrB,sBAAwBJ,GAAwBuB,UAG7E,aAGF,cACN,CAACE,EAASrB,sBAEb,OACE9lB,EAAAA,EAAAA,MAAA,OAAKZ,UAAU,sCAAqCS,SAAA,EAClDG,EAAAA,EAAAA,MAACigB,GAAAA,EAAU,CAACld,KAAK,QAAQ0S,MAAM,OAAOyK,UAAWlB,EAAAA,GAAAA,WAA+BrnB,EAAT,OAAmBkI,SAAA,EACxF3B,EAAAA,EAAAA,KAACiiB,GAAAA,EAAgB,CACfE,OAAQ8G,EAAS1B,GAAmBG,WACpClY,QAASA,KACP2a,EAAc5C,GAAmBG,WAAYuB,EAAS1B,GAAmBG,WAAW,EACpF/lB,SAED0oB,KAEHrqB,EAAAA,EAAAA,KAACiiB,GAAAA,EAAgB,CACfE,OAAQ8G,EAAS1B,GAAmBI,cACpCnY,QAASA,KACP2a,EAAc5C,GAAmBI,cAAesB,EAAS1B,GAAmBI,cAAc,EAC1FhmB,SAED,GAAG0oB,YAIRvoB,EAAAA,EAAAA,MAACigB,GAAAA,EAAU,CAACld,KAAK,QAAQ0S,MAAM,YAAYyK,UAAWlB,EAAAA,GAAAA,WAA+BrnB,EAAT,OAAmBkI,SAAA,EAC7F3B,EAAAA,EAAAA,KAACiiB,GAAAA,EAAgB,CACfE,OAAQ8G,EAASrB,sBAAwBJ,GAAwBK,OACjErY,QAASA,KACP2a,EAAc,sBAAuB3C,GAAwBK,OAAO,EACpElmB,SACH,YAGD3B,EAAAA,EAAAA,KAACiiB,GAAAA,EAAgB,CACfE,OAAQ8G,EAASrB,sBAAwBJ,GAAwBuB,UACjEvZ,QAASA,KACP2a,EAAc,sBAAuB3C,GAAwBuB,UAAU,EACvEpnB,SACH,mBAMT,CAEA,SAAS2oB,GAAY/S,GACnB,OAAQA,GACN,IAAK,kBACL,IAAK,gBACH,OAAO,EAGX,OAAO,CACT,CA2BA,SAASgT,GAAehT,GACtB,OAAQA,GACN,IAAK,kBACL,IAAK,gBACL,IAAK,wBACL,IAAK,kBACL,IAAK,eACL,IAAK,0BACL,IAAK,mBACL,IAAK,0BACL,IAAK,aACL,IAAK,uBACL,IAAK,eACL,IAAK,4BACL,IAAK,oBACL,IAAK,eACL,IAAK,+BACL,IAAK,iCACL,IAAK,iCACL,IAAK,iCACL,IAAK,qBACL,IAAK,0BACL,IAAK,sBACL,IAAK,0BACH,OAAO,EAGX,OAAO,CACT,CAIA,SAAS0S,GAAe/uB,GAA2C,IAAAsvB,EAAA,IAA1C,KAAEnP,EAAI,SAAEiO,GAAgCpuB,EAC/D,MAAM,SAAE+tB,IAAaC,EAAAA,GAAAA,MACfuB,EAA6C,SAAjCpP,aAAI,EAAJA,EAAO,mBAAmB,IACtCqP,EAAarP,EA5DrB,SAAmBA,EAAgCoP,GACjD,MAAME,EAAc,CAAC,EAqBrB,OApBA/vB,OAAO2uB,KAAKlO,GAAMlP,SAASie,IACzBO,EAAOP,GAAO/O,EAAK+O,GAChBvjB,KAAI,CAAClE,EAAOmE,KACX,GAAIwjB,GAAYF,GAAM,CACpB,IAAIQ,EAMJ,OAJEA,EADY,KAAVjoB,EACY,KAEA4R,WAAW5R,EAAMkoB,QAAQ,KAAM,KAExC,CACLnrB,KAAM2b,EAAK,mBAAmBvU,GAC9BnE,MAAOioB,EAEX,CACA,OAAO,IAAI,IAEZE,MAAML,EAAY,EAAI,EAAE,IAGtBE,CACT,CAqC4BI,CAAU1P,EAAMoP,GAAa,KAEjDO,EAAUxrB,EAAAA,SACd,IACEkrB,EACI9vB,OAAOqwB,QAAQP,GAAYQ,QAQzB,CAACC,EAAG7oB,KAAoB,IAAjB8nB,EAAKgB,GAAO9oB,EACnB,IAAKgoB,GAAYF,GACf,OAAOe,EAET,MAAMH,EAAsE,GAC5E,IAAIK,EAA2B,KAGR,IAAID,GAAQE,UAEpBnf,SAAQof,IAAe,IAAd,MAAE5oB,GAAO4oB,EAC/B,MAAMC,EAAgC,iBAAV7oB,EAC5B,GAAK6oB,GAA8B,OAAdH,GAAoC,IAAdA,EAEpC,CACL,MAAMI,EAAS9oB,EAAQ0oB,EACvBL,EAAQtsB,KAAK,CAAE+sB,SAAQtI,UAAYsI,EAAS/xB,KAAKwiB,IAAImP,GAAc,KACrE,MAJEL,EAAQtsB,KAAK,CAAE+sB,OAAQ,KAAMtI,UAAW,OAMtCqI,IAAcH,EAAY1oB,EAAK,IAGrC,MAAM+oB,EAAkB,IAAIV,GAASM,UACrC,MAAO,IACFH,EACH,CAACf,GAAM,CACLqB,OAAQC,EAAgB7kB,KAAI8kB,IAAA,IAAC,OAAEF,GAAQE,EAAA,OAAKF,CAAM,IAClDtI,UAAWuI,EAAgB7kB,KAAI+kB,IAAA,IAAC,UAAEzI,GAAWyI,EAAA,OAAKzI,CAAS,KAE9D,GACA,CAAC,GACJ,CAAC,GACP,CAACuH,IAGGL,EAAiB7qB,EAAAA,SAAc,IACNypB,EAASrB,sBAAwBJ,GAAwBuB,UAG7E,aAGF,cACN,CAACE,EAASrB,sBAEb,IAAKvM,IAASqP,EAAY,OAAO,KAEjC,MAAMjZ,EAAmC,QAAjB+Y,EAAGnqB,sBAAc,IAAAmqB,OAAA,EAAdA,EAAgB/Y,mBACrCoa,EAAY9X,IAAW,YAAa,CACxC,yCAA0CtC,IAEtCqa,GAAmBra,GAAsB4J,EAAK,iBAAmB,EAAI,EAE3E,OACEvZ,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAA,SACE7E,MAAM,OACNsZ,YAAY,IACZC,YAAY,IACZ,cAAY,yBACZxT,UAAW6S,IAAW,CACpB,qEAAsEtC,EACtE,+CAAgDA,EAChD,WAAYpR,eAAeG,iBAC1BmB,UAEH3B,EAAAA,EAAAA,KAAA,SAAA2B,SACG/G,OAAO2uB,KAAKlO,GAAMxU,KAAI,CAACujB,EAAK2B,KAC3B,MAAMC,IAAehB,EAAQZ,IAAQ/O,EAAK+O,GAAKjL,MAAMxc,GAAUA,IAC/D,OACEb,EAAAA,EAAAA,MAAA,MAEEZ,UAAW6S,IAAW,CACpB,gFAAiFtC,EACjF,iBAAkBA,GAAsB8Y,GAAeH,GACvD,kBAAmB3Y,GAAsB8Y,GAAeH,GACxD,mBAAoB3Y,IAAuB8Y,GAAeH,GAC1D,YAA0B,IAAb2B,EACb,YAAaA,IAAaD,IACzBnqB,SAAA,EAEHG,EAAAA,EAAAA,MAAA,MAAIZ,UAAW2qB,EAAUlqB,SAAA,CACtByoB,EACA4B,GAAc/C,EAAS1B,GAAmBG,aACzC5lB,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAE0oB,OAGnC2B,GAAc/C,EAAS1B,GAAmBI,gBACzC7lB,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAAA,QAAMkB,UAAU,eAAcS,SAAE,GAAG0oB,eAIzCrqB,EAAAA,EAAAA,KAAA,MAAIkB,UAAW2qB,EAAWpJ,MAAM,SAAQ9gB,SACrC2oB,GAAYF,KAAQpqB,EAAAA,EAAAA,KAACooB,GAAe,CAAC/M,KAAMqP,EAAWN,GAAKkB,cAE7DjQ,EAAK+O,GAAKvjB,KAAI,CAAClE,EAAOmE,KAAU,IAAAmlB,EAAAC,EAAAC,EAAAC,EAAAC,EAC/B,MAAMC,EAAc7B,EAAY3jB,EAAQ,EAAIA,EACtCylB,EAAkD,QAApCN,EAAe,QAAfC,EAAGlB,EAAQZ,UAAI,IAAA8B,OAAA,EAAZA,EAAcT,OAAOa,UAAY,IAAAL,EAAAA,EAAI,KACtDO,EAAwD,QAAvCL,EAAe,QAAfC,EAAGpB,EAAQZ,UAAI,IAAAgC,OAAA,EAAZA,EAAcjJ,UAAUmJ,UAAY,IAAAH,EAAAA,EAAI,KAClE,IAAK9rB,eAAeG,eAAgB,CAClC,GAAIurB,IAAaD,GAA6B,IAAVhlB,EAClC,OACEhF,EAAAA,EAAAA,MAAA,MAEE2gB,MAAM,QACNvhB,UAAU,gDACVurB,QAAS7xB,OAAO2uB,KAAKlO,GAAM7hB,OAAS,EACpCkzB,QAASrR,EAAK+O,GAAK5wB,OAAS,EAAEmI,SAAA,EAE9B3B,EAAAA,EAAAA,KAACP,GAAAA,GAAK,CACJC,KAAK,gBACLwB,UAAU,6DAEZlB,EAAAA,EAAAA,KAACmoB,GAAAA,GAAI,CAACzoB,KAAK,OAAOvE,MAAM,KAAK+F,UAAU,2BACvClB,EAAAA,EAAAA,KAAA,MAAIkB,UAAU,yCAAwCS,SAAC,oCACvD3B,EAAAA,EAAAA,KAAA,KAAGkB,UAAU,wCAAuCS,SAAC,4KAKrD3B,EAAAA,EAAAA,KAAA,KACE6M,KAAK,gFACLoK,OAAO,SACP/V,UAAU,WAAUS,SACrB,iBArBImF,GA2BX,GACEA,EAAQ,IACN2K,GAA8B,oBAAR2Y,GACb,oBAARA,GAAqC,kBAARA,GAEhC,OAAO,IAEX,CAEA,OACEtoB,EAAAA,EAAAA,MAAA,MAAgB2gB,MAAM,QAAQvhB,UAAW2qB,EAAUlqB,SAAA,CAChDgB,EACAqpB,GAAc/C,EAAS1B,GAAmBG,aACzC5lB,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAACga,EAAAA,EAAY,CAACrX,MAAO4pB,EAAgBtS,aAAc,KAAKtY,UACrDgrB,EAAAA,EAAAA,IAAkBJ,EAAgB,CAAE3N,aAAc,WAIxDoN,GAAc/C,EAAS1B,GAAmBI,gBACzC7lB,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAA,UACAA,EAAAA,EAAAA,KAACga,EAAAA,EAAY,CACXrX,MAAO6pB,EACPvS,aAAoC,OAAtBuS,EAA6B,IAAM,KAAK7qB,SAExB,QAFwB0qB,EAErDG,aAAiB,EAAjBA,EAAmB5yB,QAAQ,UAAE,IAAAyyB,EAAAA,EAAI,WAjBjCvlB,EAqBJ,MA9FJsjB,EAiGF,SAKbpqB,EAAAA,EAAAA,KAAA,SAAOkB,UAAU,0BAA0B/F,MAAM,OAAOsZ,YAAY,IAAG9S,UACrE3B,EAAAA,EAAAA,KAAA,SAAA2B,UACE3B,EAAAA,EAAAA,KAAA,MAAA2B,UACEG,EAAAA,EAAAA,MAAA,MAAI2gB,MAAM,QAAO9gB,SAAA,CAAC,uBAAqB2nB,aAMnD,CAEA,SAlVA,WACE,OACEtpB,EAAAA,EAAAA,KAAC4sB,GAAAA,GAA8B,CAACC,gBAAiBpF,GAAkBqF,UDjVpC,+BCiVmEnrB,UAChG3B,EAAAA,EAAAA,KAACgpB,GAAmB,KAG1B,EClVM+D,IAAcjM,EAAAA,GAAAA,MACd7T,GAAYzO,OAAO6B,eAAeG,eAEjC,SAASwsB,GAAiB9xB,GAAmC,IAAlC,sBAAE+xB,GAA8B/xB,EAChE,MAAM,MAAE4L,EAAK,OAAEzL,EAAM,OAAE4M,GAAWzI,EAAAA,WAAiBwI,EAAAA,GAEnD,OACElG,EAAAA,EAAAA,MAAA,OACEZ,UAAWC,IAAW,gDAAiD,CACrE,6BAA8B4rB,KAC7BprB,SAAA,EAEH3B,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,YACflB,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,8BAA6BS,UAC1C3B,EAAAA,EAAAA,KAACktB,EAAAA,GAAgB,CACflL,SAAU+K,GAAc,UAAY,OACpCloB,KAAK,SACLoI,UAAWA,GACXkgB,sBAAuB1xB,EAAAA,GAA2ByO,eAGtDlK,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,+CAA8CS,UAC3D3B,EAAAA,EAAAA,KAACotB,EAAAA,GAAuB,CACtBvoB,KAAK,SACLwoB,WAAYvmB,EACZmG,UAAW5M,eAAeG,eAC1B8sB,sBAAsB,EACtBC,kBAAmBN,EACnBO,yBAAuB,OAG3BxtB,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,0BAAyBS,UACtC3B,EAAAA,EAAAA,KAACytB,GAAAA,GAAM,CACLzL,SAAU+K,QAActzB,EAAY,OACpCi0B,YAAY,QACZ7oB,KAAK,SACL3D,UAAU,mBACV,cAAY,wBACZ,aAAY4F,EACZ,cAAazL,EACb,iBAAgB4M,EAAOtG,SACxB,cAMT,C,gBCrDA,SAASgsB,GAAYC,EAAiBxC,GACpC,OAAOA,EAAOvkB,KAAI,CAAClE,EAAOmE,KAAU,CAAGpH,KAAMkuB,EAAU9mB,EAAOnE,YAAU2oB,SAC1E,CAcA,SAASuC,GAAO3yB,GAUC,IAVA,KACfmc,EAAI,KACJgE,EAAI,MACJ0H,EAAK,iBACL+K,EAAmB,EAAC,iBACpBC,EAAmB,EAAC,WACpBC,EAAa,EAAC,WACdC,EAAa,EAAC,gBACdC,EAAkB,GAAE,gBACpBC,EAAkB,IACLjzB,EACb,MAAMgrB,EAAQxsB,KAAKsB,OAAOqgB,EAAKxU,KAAKlE,GAAUjJ,KAAKwiB,IAAIvZ,KAAQqU,OAAOrd,SAChEy0B,EAAU10B,KAAKwiB,IAAIgK,IAAU,IAC7BxpB,EAAQ0xB,EAAUH,EAAaD,EAC/B5C,EAAS/P,EAAKxU,KAAKlE,IACvB,MAAM0rB,GAAUj1B,EAAAA,GAAAA,IAAMsD,EAAQiG,EAAOyrB,EAAUL,EAAmBD,GAClE,OAAgB,MAATnrB,GAAiBhJ,OAAO2e,MAAM+V,GAAW,KAAOA,CAAO,IAGhE,OACEruB,EAAAA,EAAAA,KAAColB,GAAQ,CACPrC,MAAOA,EAAQ,KAAOqL,EAAUD,EAAkBD,GAClD7S,KAAMsS,GAAYtW,EAAM+T,GACxB/E,eAAiB1jB,IAAUvJ,EAAAA,GAAAA,IAAMuJ,EAAOyrB,EAAUL,EAAmBD,GACrE3yB,MAAO,IACPC,OAAQ,IACRyqB,YAAa,GACb3kB,UAAU,SAGhB,CAEe,SAASotB,KACtB,MAAM,MAAExnB,GAAUtH,EAAAA,WAAiBwI,EAAAA,GAE7BoS,EAAY5a,EAAAA,SAChB,KACE6a,EAAAA,GAAAA,IAA8D,CAC5DC,UAAW,gBAAgBxT,IAC3ByT,eAAe,KAEnB,CAACzT,IAGH,OAAKsT,GAGHtY,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAA,MAAIyiB,MAAM,SAAQ9gB,UAChB3B,EAAAA,EAAAA,KAAC6tB,GAAO,CAAC9K,MAAM,MAAM1L,KAAM+C,EAAU/C,KAAMgE,KAAMjB,EAAUgR,OAAO,QAEpEprB,EAAAA,EAAAA,KAAA,MAAIyiB,MAAM,SAAQ9gB,UAChB3B,EAAAA,EAAAA,KAAC6tB,GAAO,CACN9K,MAAM,QACN1L,KAAM+C,EAAU/C,KAChBgE,KAAMjB,EAAUgR,OAAO,GACvB2C,iBAAkB,EAClBE,WAAY,KACZC,gBAAgB,SAChBC,gBAAgB,cAGpBnuB,EAAAA,EAAAA,KAAA,MAAIyiB,MAAM,SAAQ9gB,UAChB3B,EAAAA,EAAAA,KAAC6tB,GAAO,CACN9K,MAAM,qBACN1L,KAAM+C,EAAU/C,KAChBgE,KAAMjB,EAAUgR,OAAO,GACvB2C,iBAAkB,EAClBE,WAAY,KACZC,gBAAgB,QAChBC,gBAAgB,eA1BD,IA+BzB,C,gBClGO,MAAMI,GAAyB,CACpCC,SAAUA,IAAM,uFAChBC,SAAU,uBCGZ,SAASC,KAGP,OACE1uB,EAAAA,EAAAA,KAAA,OAAKkB,UAAU,sCAAqCS,SACjDyJ,MAAM4M,KAAK5M,MAAM,IAAIvE,KAAI,CAACqX,EAAGpX,KAC5B9G,EAAAA,EAAAA,KAAA,OAAiBkB,UAJrB,yIAI4CS,UACtC3B,EAAAA,EAAAA,KAACoQ,EAAAA,EAAO,KADAtJ,MAMlB,CAYA,UAAe6nB,EAAAA,GAAAA,KAVf,WACE,MAAOC,IAAqBzf,EAAAA,EAAAA,GAAe,IACtCof,GACHlf,kBAAkB,EAClBwf,cAAe,SAEXC,EAAuBF,aAAiB,EAAjBA,EAAmBG,YAChD,OAAOD,GAAuB9uB,EAAAA,EAAAA,KAAC8uB,EAAoB,KAAM9uB,EAAAA,EAAAA,KAAC0uB,GAAe,GAC3E,ICVMM,GAAehqB,SAASiqB,iBAAiB,0BACzCC,GAAclqB,SAASiqB,iBAAiB,wBAExCE,GAAoBnqB,SAASiqB,iBAAiB,+BAC9CG,GAAmBpqB,SAASiqB,iBAAiB,6BAE7CI,GAA4BrqB,SAASiqB,iBAAiB,eAEtDK,GAA2BtqB,SAASiqB,iBAAiB,gBAErDM,GAAmBvqB,SAASiqB,iBAAiB,eAE7CO,GAAsBxqB,SAASiqB,iBAAiB,0BAEhDQ,GAA2BzqB,SAASiqB,iBAAiB,uBAEpD,SAASS,GAAqBx0B,GAAgE,IAA/D,sBAAE+xB,GAA2D/xB,EACjG,MAAM+P,EAAUzL,EAAAA,WAAiBwI,EAAAA,GAE3B2nB,EAAsB3qB,SAAS4qB,cAAc,2BAA2B3kB,EAAQ5P,UAChFw0B,EAAqB7qB,SAAS4qB,cAAc,yBAAyB3kB,EAAQ5P,UAC7Ey0B,IAAUD,KAAwBF,EAExC,OACE7tB,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,CACqB,IAAlBsJ,EAAQnE,QAAgBtI,OAAOgG,qBAC9BxE,EAAAA,EAAAA,KAAC8K,EAAW,CAACC,eAAgBikB,GAAchkB,MAAOkkB,GAAarkB,qBAAqB,EAAMlJ,UACxF3B,EAAAA,EAAAA,KAACR,EAAAA,SAAc,CAACgN,SAAU,KAAK7K,SAC5BsJ,EAAQ7C,OAAS0I,EAAAA,GAAUC,aAAe9F,EAAQ5C,UAAY2I,EAAAA,GAAaE,eAC1ElR,EAAAA,EAAAA,KAACskB,GAAuB,KAExBtkB,EAAAA,EAAAA,KAACykB,GAAqB,CAAC5lB,OAAQL,OAAO+K,yBAM9CvJ,EAAAA,EAAAA,KAAC8K,EAAW,CAACC,eAAgBokB,GAAmBnkB,MAAOokB,GAAkBvkB,qBAAqB,EAAMlJ,UAClG3B,EAAAA,EAAAA,KAAC0Q,EAAe,MAGjBzF,EAAQ7C,OAAS0I,EAAAA,GAAUC,cAC1BjP,EAAAA,EAAAA,MAACtC,EAAAA,SAAc,CAACgN,SAAU,KAAK7K,SAAA,CACV,IAAlBsJ,EAAQnE,QAAe9G,EAAAA,EAAAA,KAACiJ,GAAAA,EAAU,IAElCgC,EAAQnE,MAAQ,IACf9G,EAAAA,EAAAA,KAAC8K,EAAW,CACVE,MAAOqkB,GAEPvoB,MAAOmE,EAAQnE,MAAQ,EAAEnF,UAEzB3B,EAAAA,EAAAA,KAACgtB,GAAiB,CAACC,sBAAuBA,SAMjDhiB,EAAQ5C,UAAY2I,EAAAA,GAAaC,aAAezS,OAAOgZ,oBAAwC,IAAlBvM,EAAQnE,QAAe9G,EAAAA,EAAAA,KAAC4U,EAAI,IAEzGkb,IACC9vB,EAAAA,EAAAA,KAAC8K,EAAW,CAACC,eAAgB4kB,EAAqB3kB,MAAO6kB,EAAmBluB,UAC1EG,EAAAA,EAAAA,MAAAyN,EAAAA,SAAA,CAAA5N,SAAA,EACE3B,EAAAA,EAAAA,KAAC+vB,GAAW,KACZ/vB,EAAAA,EAAAA,KAACka,GAAc,CAAChZ,UAAU,eAKhClB,EAAAA,EAAAA,KAAC8K,EAAW,CACVE,MAAOskB,GAEPxoB,MAAOgpB,EAAQ7kB,EAAQnE,MAAQ,OAAIrN,EAAUkI,UAE7C3B,EAAAA,EAAAA,KAACsuB,GAAiB,OAGpBtuB,EAAAA,EAAAA,KAAC8K,EAAW,CAACE,MAAOukB,GAAiB5tB,UACnC3B,EAAAA,EAAAA,KAACgwB,GAAU,OAGbhwB,EAAAA,EAAAA,KAAC8K,EAAW,CAACE,MAAOwkB,GAAoB7tB,UACtC3B,EAAAA,EAAAA,KAAC6e,GAAyB,CAAC3d,UAAU,YAGvClB,EAAAA,EAAAA,KAAC8K,EAAW,CAACE,MAAOykB,GAAyB9tB,UAC3C3B,EAAAA,EAAAA,KAACghB,GAAsB,QAI/B,C,gBCrGA,MAAMiP,GAAuC,uCACvCC,GAAqC,wBACrCC,GAA0B,6BCEjB,SAASC,MACtBlsB,EAAAA,EAAAA,KCPA1E,EAAAA,WAAgB,KACd,MAAM6wB,EAAgBrrB,SAASiqB,iBAAoC,6BAEnE,SAASqB,EAAqBC,GAC5BA,EAAGvgB,iBAEH,MAAMwgB,EAASD,EAAGE,cACZC,EAAsBF,EAAOG,uBAEnCD,SAAAA,EAAqBzB,iBAAiB,YAAY9iB,SAAQ,CAACykB,EAAQ9pB,EAAO6M,KACpEid,EAAO/kB,UAAUglB,SAAS,YAC5BD,EAAO/kB,UAAUG,OAAO,WAG1B4kB,EAAO/kB,UAAUG,OAAO,UAEpBlF,IAAU6M,EAAKna,OAAS,GAC1Bo3B,EAAO/kB,UAAUC,IAAI,UACvB,IAGF0kB,EAAO3kB,UAAUC,IAAI,UACrBtN,OAAOmR,MAAQnR,OAAOmR,KAAK,QAAS,QAAS,CAAEE,eAAgB,kBACjE,CAIA,OAFAwgB,EAAclkB,SAASqkB,GAAWA,EAAOlrB,iBAAiB,QAASgrB,KAE5D,KACLD,EAAclkB,SAASqkB,GAAWA,EAAOhrB,oBAAoB,QAAS8qB,IAAsB,CAC7F,GACA,IDpBH,MAAO/nB,IAASC,EAAAA,EAAAA,MACV5B,EAAU2B,EAAME,IAAIC,EAAAA,GAAWwF,QAAS6I,MAAM,MAC9C,sBAAEkW,GDNH,WACL,MAAM9oB,GAAWC,EAAAA,GAAAA,OACX,EAAEsF,EAAC,GAAEonB,IAAOxsB,EAAAA,EAAAA,GAAkBH,EAASI,QACvCwsB,EAAmBvxB,EAAAA,QAAa,IAC/BytB,EAAuB+D,GAA4BxxB,EAAAA,UAAe,GAiEzE,OA/DAA,EAAAA,WAAgB,KACd,MAAMyxB,EAAsBjsB,SAASksB,uBAAuBhB,IACtDiB,EAAsBnsB,SAASksB,uBAAuBjB,IACtDmB,EAAkB,IAAIC,gBAqD5B,OAnDIN,EAAiBzmB,UACf2mB,EAAoBz3B,OAAS,GAAGw3B,GAAyB,GAE7DrH,MAAMxlB,EAASsJ,SAAWtJ,EAASI,OAAQ,CAAE+sB,OAAQF,EAAgBE,SAClEC,MAAM7H,GAAaA,EAAS1C,SAC5BuK,MAAMvK,IACL,MAAMwK,GAAa,IAAIC,WAAYC,gBAAgB1K,EAAM,aAGzD,GAAIiK,EAAoBz3B,OAAS,EAAG,CAClC,MAAMm4B,EAA0BvmB,MAAM4M,KAAKiZ,GACrCW,EAA6BxmB,MAAM4M,KACvCwZ,EAAWN,uBAAuBhB,MAGhC0B,aAA0B,EAA1BA,EAA4Bp4B,UAAWm4B,EAAwBn4B,OACjEm4B,EAAwBxlB,SAAQ,CAACP,EAAS9E,KACxC8E,EAAQimB,OAAS,IAAMb,GAAyB,GAChDplB,EAAQkmB,IAAMF,EAA2B9qB,GAAOgrB,GAAG,IAGrDd,GAAyB,EAE7B,CAGA,MAAMe,EAAwC3mB,MAAM4M,KAAKmZ,GACnDa,EAA2C5mB,MAAM4M,KACrDwZ,EAAWN,uBAAuBjB,MAGhC+B,aAAwC,EAAxCA,EAA0Cx4B,UAAWu4B,EAAsCv4B,QAC7Fu4B,EAAsC5lB,SAAQ,CAACP,EAAS9E,KACtD8E,EAAQ+Z,UAAYqM,EAAyClrB,GAAO6e,SAAS,IAKjF,MAAMsM,EAAkCT,EAAWzrB,eAAeoqB,IAC9D8B,SAAAA,EAAiCrhB,QAAQshB,uBAC3C7xB,eAAe8xB,eAAiBF,EAAgCrhB,QAAQshB,qBAC1E,IAEDE,OAAOC,IACNrB,GAAyB,GACR,eAAbqB,EAAI3yB,MACN4yB,OAAOC,iBAAiBF,EAC1B,KAGNtB,EAAiBzmB,SAAU,EACpB,KACL8mB,EAAgBoB,OAAO,CACxB,GAGA,CAAC9oB,EAAGonB,IAEA,CAAE7D,wBACX,CChEoCwF,GAElC,OAAO7rB,EAAQC,KAAI,CAACxL,EAAQyL,KAC1B9G,EAAAA,EAAAA,KAACsI,EAAAA,EAAoB,CAAcjN,OAAQA,EAAQyL,MAAOA,EAAMnF,UAC9D3B,EAAAA,EAAAA,KAAC0vB,GAAqB,CAACzC,sBAAuBA,KADrB5xB,IAI/B,C,qGEVO,SAASwO,EACd6oB,GAKA,IADAhpB,EAACnQ,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG2O,EAAAA,GAAUC,EAEd,MAAM,YAAEpD,GAAgBC,SAAS2tB,MAC3B,UAAEp2B,EAAS,YAAEC,EAAW,UAAEC,GAAci2B,EAAap2B,OAAO,GAC5Ds2B,EAAgB7tB,EAAc,GACpC,IAAI5J,EAAQ,IACRe,EAAW,EACXC,EAAY,EACZ02B,EAAmB,EACvB,MAAMC,EACJJ,EAAal3B,6BAA8Bu3B,EAAAA,EAAAA,IAAyBL,EAAal3B,4BAEnF,OAAQkO,GACN,KAAKxB,EAAAA,GAAU8qB,GACbH,EAAmB,EACnB32B,EAAW,GACPK,GAAaC,GAAeuI,EAAc,QAC5C5I,EAAY,GAEd,MACF,KAAK+L,EAAAA,GAAU+qB,GACbJ,EAAmB,EACnB,MACF,KAAK3qB,EAAAA,GAAUgrB,GACbL,EAAmB,EACft2B,GAAaC,GAAeuI,GAAe,OAC7C7I,EAAW,GAEb,MACF,KAAKgM,EAAAA,GAAUirB,GACbN,EAAmB,EACnB32B,EAAW,EACXC,EAAY4I,GAAe,KAAO,EAAI,EACtC,MACF,KAAKmD,EAAAA,GAAUkrB,IACbj4B,EAAQ,KACRgB,EAAY,EACZ,MACF,KAAK+L,EAAAA,GAAUmrB,IACf,KAAKnrB,EAAAA,GAAUorB,IACbn4B,EAAQ,KACR,MACF,KAAK+M,EAAAA,GAAUgN,EACb/Z,EAAQ,KACR,MACF,KAAK+M,EAAAA,GAAUqrB,GACf,KAAKrrB,EAAAA,GAAUsrB,GACbr4B,EAAQ,KACR,MACF,KAAK+M,EAAAA,GAAUC,EACbhN,EAAQ,KACR,MACF,KAAK+M,EAAAA,GAAUurB,EACf,KAAKvrB,EAAAA,GAAUwO,EACbvb,EAAQ,IAIZ,OAAQuO,GACN,KAAKxB,EAAAA,GAAU8qB,GACf,KAAK9qB,EAAAA,GAAU+qB,GACf,KAAK/qB,EAAAA,GAAUgrB,GACf,KAAKhrB,EAAAA,GAAUirB,GACb,MAAMO,EAAc,CAClBb,mBACAc,mBAAoBz3B,EAAW,EAAIC,EACnCy3B,eAAgBp3B,EAChBq3B,aAAct3B,GAEhBpB,GAAQ24B,EAAAA,EAAAA,IAAuB,IAC1BJ,EACHK,SAAUnB,EACVoB,cAAev3B,IACdw3B,qBAuBP,OAlBInB,IAAsB33B,EAAQ,MAG9By3B,GAAiBz3B,IACnBA,EAAQzB,KAAKsB,IAAI,IAAK43B,GAClBlpB,IAAMxB,EAAAA,GAAUC,IAClBjM,EAAW,EACXC,EAAY,EACZhB,EAAQ,OAKRu3B,EAAavsB,MAAQ2sB,KACvB52B,EAAWw2B,EAAax2B,SACxBC,EAAYu2B,EAAav2B,WAGpB,CACLhB,QACAe,WACAC,YAEJ,CAEO,SAASmN,IAA2B,IAAAsa,EAAAsQ,EACzC,MAAM,WAAEhvB,IAAeR,EAAAA,EAAAA,MACjB,iBAAEiI,IAAqBO,EAAAA,EAAAA,MACvBinB,EAAsB30B,EAAAA,SAAc,SAAA40B,EAAA,OAAyC,QAAzCA,EAAMznB,aAAgB,EAAhBA,EAAkBrQ,SAAS6Z,MAAM,UAAE,IAAAie,EAAAA,EAAI,IAAI,GAAE,CAACznB,IACxFQ,GAAaC,EAAAA,EAAAA,IAAc+mB,EAAqB,CAAE7mB,gBAAiB,CAAC,WACpE9F,GAAQ4F,EAAAA,EAAAA,IAAiC,QAApBwW,EAACzW,aAAU,EAAVA,EAAY3F,eAAO,IAAAoc,EAAAA,EAAI,KAAM,CAAEtW,gBAAiB,CAAC,SAAU,YAAa,gBAC9F+mB,EAAS1nB,SAAsB,QAANunB,EAAhBvnB,EAAkBxG,YAAI,IAAA+tB,OAAA,EAAtBA,EAAwBj0B,GAEvCT,EAAAA,WAAgB,KACd,MAAMypB,EAAYoL,EAAsC,KAA7B1nB,aAAgB,EAAhBA,EAAkBsc,SACvC3tB,EAAYkM,aAAK,EAALA,EAAOlM,UACzB,GAAIqR,GAAoBrR,GAAa2tB,EAAU,CAC7C,MAAM,MAAE9tB,EAAK,SAAEe,EAAQ,UAAEC,GAAc0N,EAAyB8C,EAAiB2nB,WAAYh5B,GACvFi5B,EAAcn3B,KAAKC,MAAMD,KAAKmD,UAAU0oB,IAC9CsL,EAAYC,cAAcC,OAAOv4B,SAAWA,EAC5Cq4B,EAAYG,kBAAkBD,OAAOv4B,SAAWA,EAChDq4B,EAAYC,cAAcC,OAAOt4B,UAAYA,EAC7Co4B,EAAYG,kBAAkBD,OAAOt4B,UAAYA,EACjDwQ,EAAiBiJ,iBAAiB,CAAEza,QAAO8tB,SAAUsL,GACvD,IAGC,CAAC/sB,aAAK,EAALA,EAAOjL,UAAWiL,aAAK,EAALA,EAAOhL,YAAagL,aAAK,EAALA,EAAOlM,UAAW+4B,EAAQnvB,GACtE,C","sources":["webpack://@finviz/website/./js/app/backtest/utils.tsx","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/components/Ads.tsx","webpack://@finviz/website/./js/app/shared/getInitChartConfig.ts","webpack://@finviz/website/./js/main/components/chart/CartesianGrid.tsx","webpack://@finviz/website/./js/main/components/chart/Label.tsx","webpack://@finviz/website/./js/main/components/chart/XAxis.tsx","webpack://@finviz/website/./js/main/hooks/use-check-non-idea-chart-missing-config.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/modules/charts/util.ts","webpack://@finviz/website/./js/main/modules/quote/QuoteContext.tsx","webpack://@finviz/website/./js/main/modules/quote/components/QuoteChart.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Portal.tsx","webpack://@finviz/website/./js/main/hooks/useToggleStaticElement.ts","webpack://@finviz/website/./js/main/modules/quote/components/Navigation/QuoteLinksWrapper.tsx","webpack://@finviz/website/./js/main/modules/quote/hooks/use-chart-timeframe-path-watch.ts","webpack://@finviz/website/./js/main/modules/quote/components/Navigation/QuoteLinkComponent.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Navigation/CreateAlertLink.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Navigation/SaveToPortfolioLink.tsx","webpack://@finviz/website/./js/main/modules/quote/Navigation.tsx","webpack://@finviz/website/./js/main/modules/quote/components/ComparePerformance.tsx","webpack://@finviz/website/./js/main/components/chart/ChartBox.tsx","webpack://@finviz/website/./js/main/modules/quote/components/FundFlowsChart.tsx","webpack://@finviz/website/./js/main/components/chart/utils.ts","webpack://@finviz/website/./js/main/modules/quote/components/InsiderTradingChart/constants.ts","webpack://@finviz/website/./js/main/modules/quote/components/InsiderTradingChart/InsiderVolumeBar.tsx","webpack://@finviz/website/./js/main/modules/quote/components/InsiderTradingChart/utils.tsx","webpack://@finviz/website/./js/main/modules/quote/components/InsiderTradingChart/InsiderTradingVolumeChart.tsx","webpack://@finviz/website/./js/main/modules/quote/components/InstitutionalOwnership.tsx","webpack://@finviz/website/./js/main/modules/quote/components/QuotePrice.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Price/hooks.ts","webpack://@finviz/website/./js/main/modules/quote/components/Price/QuoteHeader.tsx","webpack://@finviz/website/./js/main/modules/quote/components/barChart.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Statements/constants.ts","webpack://@finviz/website/./js/main/modules/quote/components/Statements/statements.tsx","webpack://@finviz/website/./js/main/modules/quote/components/StaticChartHeader.tsx","webpack://@finviz/website/./js/main/modules/quote/components/fundamentalCharts.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/async-modules.ts","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/index.tsx","webpack://@finviz/website/./js/main/modules/quote/PortalComponents.tsx","webpack://@finviz/website/./js/main/modules/quote/hooks/use-stock-detail-updater.tsx","webpack://@finviz/website/./js/main/modules/quote/components/QuoteSharedWrapper.tsx","webpack://@finviz/website/./js/main/modules/quote/hooks/useToggleRatings.ts","webpack://@finviz/website/./js/main/modules/quote/hooks/use-chart-layout-width-watch.ts"],"sourcesContent":["export function round(n: number, places: number = 2) {\r\n return (+(Math.round(Number(n + 'e+' + places)) + 'e-' + places)).toFixed(places)\r\n}\r\n\r\nexport const format = {\r\n totalReturn: (totalReturn: number | string) => round(Number(totalReturn) * 100) + '%',\r\n maxDrawdown: (maxDrawdown: number | string) => round(Number(maxDrawdown) * 100) + '%',\r\n sharpeRatio: (sharpeRatio: number) => round(sharpeRatio),\r\n calmarRatio: (calmarRatio: number) => round(calmarRatio),\r\n CAGR: (CAGR: number) => round(CAGR * 100) + '%',\r\n cagr: (CAGR: number) => round(CAGR * 100) + '%',\r\n volatility: (volatility: number) => round(volatility * 100) + '%',\r\n numberOfTrades: (numberOfTrades: any) => numberOfTrades,\r\n positiveDays: (positiveDays: any) => positiveDays,\r\n negativeDays: (negativeDays: any) => negativeDays,\r\n bestMonth: (bestMonth: number) => round(bestMonth * 100) + '%',\r\n worstMonth: (worstMonth: number) => round(worstMonth * 100) + '%',\r\n}\r\n\r\nexport const figureSpace = ' '\r\n\r\nexport const BACKTEST_MIN_MAX_DATES = Object.freeze({\r\n min: new Date(1996, 5, 3),\r\n max: new Date(2023, 0, 31),\r\n})\r\n","import { SpecificChartFunctionality } from '../../main/constants'\r\nimport { ChartConfigChartPaneElement, Instrument, LayoutType, ScaleType, TIMEFRAME, Theme } from '../charts-lib'\r\nimport { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps extends ChartConfigChartPaneElement {\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n width?: number\r\n height?: number\r\n ticker: string\r\n timeframe: TIMEFRAME\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n theme?: Theme\r\n colors?: ReturnType\r\n refreshData?: boolean\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n width = 800,\r\n height = 400,\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n theme,\r\n colors = getCustomColorsFromCookies(),\r\n refreshData = false,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: LayoutType['1h1v'],\r\n width,\r\n height,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n theme,\r\n colors,\r\n charts: [\r\n {\r\n width: 0,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n height,\r\n timeframe,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: Instrument.Stock,\r\n refreshData,\r\n stretch: true,\r\n panes: [\r\n {\r\n height,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as tracking from '../tracking'\r\n\r\nexport const IC_PUBLISHER_ID = 'df0d0d52-cc7f-11e8-82a5-0abbb61c4a6a'\r\n\r\nenum AdTagName {\r\n IC_TickerInContent = 'IC_D_3x3',\r\n IC_MapsLeftRail = 'IC_D_125x125',\r\n IC_Statements = 'IC_D_300x60',\r\n IC_Groups = 'IC_D_300x250',\r\n}\r\n\r\nconst tagDefinition = {\r\n [AdTagName.IC_TickerInContent]: { placements: 3, style: { width: 970, minHeight: 250 } },\r\n [AdTagName.IC_MapsLeftRail]: { placements: 2, style: { width: 125, minHeight: 125 } },\r\n [AdTagName.IC_Statements]: { placements: 1, style: { width: 300, minHeight: 60 } },\r\n [AdTagName.IC_Groups]: { placements: 1, style: { width: 336, minHeight: 280 } },\r\n}\r\n\r\nconst hasInvestingChannelAds = tracking.getAdsProvider() === tracking.AdsProvider.InvestingChannel\r\n\r\n/**\r\n * Get create/destroy methods to control ads insertion\r\n */\r\nexport function getInvestingChannelPage() {\r\n var page: ICPageReturn\r\n\r\n function create() {\r\n try {\r\n if (hasInvestingChannelAds) {\r\n window.InvestingChannelQueue?.push(() => {\r\n let config = window['FINVIZ_IC_UAT_CONFIG'] ?? {}\r\n page = window.InvestingChannel?.UAT.Run(IC_PUBLISHER_ID, config)\r\n })\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n }\r\n\r\n function destroy() {\r\n try {\r\n if (hasInvestingChannelAds) {\r\n window.InvestingChannelQueue?.push(() => {\r\n page?.destroy()\r\n })\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n }\r\n\r\n return { create, destroy }\r\n}\r\n\r\n/**\r\n * Hook which recreates ads on deps change (SPA navigation,…)\r\n */\r\nexport function useInvestingChannelAds(deps: unknown[] = []) {\r\n React.useLayoutEffect(() => {\r\n const page = getInvestingChannelPage()\r\n\r\n page.create()\r\n\r\n return () => page.destroy()\r\n // eslint cannot statically check the dependencies and complains about it\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, deps)\r\n\r\n return hasInvestingChannelAds\r\n}\r\n\r\ninterface AdTagProps extends Omit, 'name'> {\r\n /**\r\n * Name of the ad tag\r\n */\r\n name: keyof typeof AdTagName\r\n\r\n /**\r\n * Manually set the placement position for this tag\r\n *\r\n * @default 1\r\n */\r\n position?: number\r\n\r\n /**\r\n * Additional class names for the wrapper div\r\n */\r\n className?: string\r\n}\r\n\r\nexport function AdTag({ name, position = 1, ...props }: AdTagProps) {\r\n const tagName = AdTagName[name]\r\n const tagProps = tagDefinition[tagName]\r\n const placementName = `${tagName}_${Math.min(Math.max(position, 1), tagProps.placements)}`\r\n\r\n if (!hasInvestingChannelAds) return null\r\n\r\n return
\r\n}\r\n","import { type RootChartConfigObject, Utils, convertTa } from '../charts-lib'\r\n\r\nexport function getInitChartConfig(initialConfig: RootChartConfigObject, initialTA = FinvizSettings.TA) {\r\n const config: RootChartConfigObject = JSON.parse(JSON.stringify(initialConfig))\r\n\r\n config.scrollable = false\r\n if (FinvizSettings.hasUserPremium) {\r\n config.scrollable = config.editable || !Utils.isMobile()\r\n }\r\n\r\n if (initialTA) {\r\n const COTs = FinvizSettings.COTs\r\n convertTa.mergeChartAndTAConfig(config, initialTA, COTs ? { COTs } : undefined)\r\n }\r\n\r\n return config\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\nimport { CartesianGrid as RechartsCartesianGrid } from 'recharts'\r\n\r\nexport function CartesianGrid({\r\n vertical = false,\r\n ...props\r\n}: React.PropsWithoutRef>) {\r\n return (\r\n \r\n )\r\n}\r\n\r\nCartesianGrid.displayName = RechartsCartesianGrid.displayName\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Label as RechartsLabel } from 'recharts'\r\n\r\nimport { CHART_ITEM_COLORS, ChartItemColorType } from './constants'\r\n\r\ninterface LabelInnerProps extends LabelProps {\r\n dx?: number\r\n dy?: number\r\n viewBox?: { x: number; y: number; width: number; height: number }\r\n color?: ChartItemColorType\r\n}\r\n\r\nfunction LabelInner({\r\n color,\r\n viewBox,\r\n dx = 0,\r\n dy = 0,\r\n angle = -90,\r\n children,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n if (!viewBox) return\r\n\r\n const x = viewBox.x + viewBox.width / 2 + dx\r\n const y = viewBox.y + viewBox.height / 2 + dy\r\n\r\n return (\r\n \r\n {color && }\r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface LabelProps extends React.PropsWithoutRef> {\r\n color?: ChartItemColorType\r\n}\r\n\r\nexport function Label({ children, color, ...props }: LabelProps) {\r\n return } {...props} />\r\n}\r\n\r\nLabel.displayName = RechartsLabel.displayName\r\n","import { format } from 'date-fns'\r\nimport { XAxis as RechartsXAxis } from 'recharts'\r\n\r\nimport { getDate } from '../../../app/header/utils'\r\n\r\nexport enum DateFormat {\r\n MonthSingleChar = 'MMMMM',\r\n MonthShort = 'MMM',\r\n MonthShortDayNum = 'MMM dd',\r\n MonthShortDayNumYearFull = 'MMM dd yyyy',\r\n}\r\n\r\nconst TICK_STYLE = {\r\n fontSize: 10,\r\n fontWeight: 400, // Different from YAxis\r\n fill: '',\r\n}\r\n\r\nexport function dateAxisFormatter({\r\n value,\r\n outFormat,\r\n parseAsNY = true,\r\n breakOnYear = false,\r\n}: {\r\n value: any\r\n outFormat: string\r\n parseAsNY?: boolean\r\n breakOnYear?: boolean\r\n}) {\r\n if (!Number.isFinite(new Date(value).getTime())) return ''\r\n\r\n const date = parseAsNY ? getDate(value) : new Date(value)\r\n\r\n if (breakOnYear && date.getMonth() === 0) {\r\n if (outFormat === DateFormat.MonthSingleChar) return date.getFullYear().toString().substring(2)\r\n return date.getFullYear().toString()\r\n }\r\n\r\n return format(date, outFormat)\r\n}\r\n\r\nexport class XAxis extends RechartsXAxis {\r\n static defaultProps = {\r\n ...RechartsXAxis.defaultProps,\r\n className: 'fill-gray-500 dark:fill-gray-300',\r\n tickLine: false,\r\n axisLine: false,\r\n dy: 5,\r\n tick: TICK_STYLE,\r\n dataKey: 'date',\r\n scale: 'time',\r\n type: 'number',\r\n interval: 'equidistantPreserveStart',\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { decodeQueryString } from '../../app/queryString'\r\n\r\nexport function useCheckNonIdeaChartMissingConfig() {\r\n const location = useLocation()\r\n\r\n React.useEffect(() => {\r\n // Navigation (back/forward) from nonexisting idea page doesn't fully reload the page\r\n // So if we're on non idea page and have still isIdeaNotFoundPage flag we want to reload the page\r\n const { i } = decodeQueryString(location.search)\r\n if (!i && window.isIdeaNotFoundPage) {\r\n window.location.reload()\r\n }\r\n }, [location.search])\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n clientWidth: document.documentElement.clientWidth,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n clientWidth: document.documentElement.clientWidth,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import Quote from 'finviz-charts/app/models/quote'\r\n\r\nimport { convertTa } from '../../../app/charts-lib'\r\nimport { ObjectHash } from '../../components/types'\r\nimport { getInstrumentForTicker } from '../../util'\r\n\r\nconst PADDING = 2 // Border widths\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\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 getChartConfig(idea: any, chartElementId: string) {\r\n const chartsDimensions = getChartsDimensions(chartElementId)\r\n\r\n if (idea) {\r\n const chartConfig = Object.assign({}, FinvizChartsSettings.ideaChart, {\r\n colors: FinvizChartsSettings.colors,\r\n width: chartsDimensions.width,\r\n height: chartsDimensions.height,\r\n scrollable: true,\r\n editors: ['layout', 'settings', 'publish', 'tools'],\r\n })\r\n for (let i = 0; i < chartConfig.charts.length; i++) {\r\n if (!chartConfig.charts[i].instrument) {\r\n chartConfig.charts[i].instrument = 'stock'\r\n }\r\n }\r\n\r\n return chartConfig\r\n }\r\n\r\n return {\r\n newCharts: true,\r\n width: chartsDimensions.width,\r\n height: chartsDimensions.height,\r\n barWidth: 3,\r\n barMargin: 1,\r\n scrollable: true,\r\n alignChartsToRight: true,\r\n theme: FinvizChartsSettings.theme,\r\n colors: FinvizChartsSettings.colors,\r\n editors: ['layout', 'settings', 'publish', 'tools'],\r\n layout: FinvizChartsSettings.layout,\r\n charts: FinvizChartsSettings.tickers.map(function (ticker: string, index: number) {\r\n return {\r\n timeframe: FinvizChartsSettings.periods[index],\r\n dateRange: FinvizChartsSettings.ranges[index],\r\n scale: FinvizChartsSettings.taConfig.scale || 'linear',\r\n ticker: ticker,\r\n instrument: getInstrumentForTicker(ticker),\r\n premarket: FinvizChartsSettings.taConfig.premarket,\r\n aftermarket: FinvizChartsSettings.taConfig.aftermarket,\r\n hasChartEvents: FinvizChartsSettings.taConfig.hasChartEvents,\r\n refreshData: true,\r\n panes: convertTa.getPanes(FinvizChartsSettings.taConfig),\r\n }\r\n }),\r\n }\r\n}\r\n\r\nexport const initIdeaQuotes = (quotes: Array, ideaChart: ObjectHash) => {\r\n const hasPatterns = JSON.stringify(ideaChart).includes('patterns')\r\n\r\n for (let i = 0; i < quotes.length; i++) {\r\n const quote = quotes[i]\r\n\r\n if (quote.timeframe === 'i1' || quote.timeframe === 'i3' || quote.timeframe === 'i5' || quote.timeframe === 'i15') {\r\n if (!quote.hasOwnProperty('drawMinutesPerDay')) {\r\n quote.drawMinutesPerDay = quote.timeframe === 'i15' ? 390 : 420\r\n }\r\n\r\n if (!quote.hasOwnProperty('marketStartMinutes')) {\r\n quote.marketStartMinutes = quote.timeframe === 'i15' ? 570 : 540\r\n }\r\n\r\n if (!quote.hasOwnProperty('premarketLengthMinutes')) {\r\n quote.premarketLengthMinutes = quote.timeframe === 'i15' ? 0 : 30\r\n }\r\n\r\n if (!quote.hasOwnProperty('aftermarketLengthMinutes')) {\r\n quote.aftermarketLengthMinutes = 0\r\n }\r\n }\r\n\r\n if (!quote.hasOwnProperty('hasPatterns')) {\r\n quote.hasPatterns = hasPatterns\r\n }\r\n\r\n quote.ideaID = ideaChart.idea.id\r\n\r\n Quote.create(quote)\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../../app/charts-lib'\r\nimport { QuoteQuery, QuoteSubview, QuoteView } from './types'\r\nimport { getQuoteSubview, getQuoteView } from './utils'\r\n\r\nexport const QuoteContext = React.createContext<{\r\n index: number\r\n ticker: string\r\n period: TIMEFRAME\r\n view: QuoteView | null\r\n subview: QuoteSubview | null\r\n}>({ index: -1, ticker: '', period: TIMEFRAME.d, view: null, subview: null })\r\n\r\nexport function QuoteContextProvider({\r\n ticker,\r\n index,\r\n children,\r\n}: React.PropsWithChildren<{ ticker: string; index: number }>) {\r\n const [query] = useSearchParams()\r\n const type = query.get(QuoteQuery.Type) as QuoteView | QuoteSubview\r\n const period = query.get(QuoteQuery.Period) as TIMEFRAME\r\n const contextValue = React.useMemo(\r\n () => ({ index, ticker, period, view: getQuoteView(type), subview: getQuoteSubview(type) }),\r\n [index, period, ticker, type]\r\n )\r\n\r\n return {children}\r\n}\r\n","import { CHART_ELEMENT_ID } from 'finviz-charts/app/constants/common'\r\nimport * as React from 'react'\r\nimport ReactDOM from 'react-dom'\r\n\r\nimport {\r\n ChartLayoutWithGlobalState,\r\n FREE_DATE_RANGES,\r\n Quote,\r\n RootChartConfigObject,\r\n Theme,\r\n} from '../../../../app/charts-lib'\r\nimport { decodeQueryString } from '../../../../app/queryString'\r\nimport { getInitChartConfig } from '../../../../app/shared/getInitChartConfig'\r\nimport { SpecificChartFunctionality, TIMEFRAME } from '../../../constants'\r\nimport { initIdeaQuotes } from '../../charts/util'\r\nimport { getChartLayoutSizeConfig, useChartLayoutWidthWatch } from '../hooks/use-chart-layout-width-watch'\r\n\r\nexport function QuoteChart({\r\n configOverride,\r\n TAOverride,\r\n}: {\r\n configOverride?: Partial\r\n TAOverride?: any\r\n}) {\r\n const chartEl = React.useRef(document.getElementById(CHART_ELEMENT_ID))\r\n useChartLayoutWidthWatch()\r\n\r\n const config = React.useMemo(() => {\r\n let chartConfig = window.globalChartConfig\r\n\r\n if (!chartConfig) return\r\n\r\n if (chartConfig.ideaQuotes) {\r\n // Load idea quote data\r\n initIdeaQuotes(chartConfig.ideaQuotes, chartConfig)\r\n } else {\r\n // Create Quote from inlined data so we don’t have to fetch it\r\n if (chartConfig.quoteData) Quote.create(chartConfig.quoteData)\r\n chartConfig = getInitChartConfig(chartConfig, TAOverride)\r\n }\r\n\r\n const { p = FinvizSettings.defaultPeriod } = decodeQueryString()\r\n const sizeConfig = getChartLayoutSizeConfig(chartConfig, p as TIMEFRAME)\r\n\r\n return {\r\n ...chartConfig,\r\n ...sizeConfig,\r\n theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\r\n specificChartFunctionality: SpecificChartFunctionality.quotePage,\r\n charts: chartConfig.charts.map((chart) => ({\r\n ...chart,\r\n dateRange:\r\n FinvizSettings.hasUserPremium || FREE_DATE_RANGES.includes(chart.dateRange ?? '') ? chart.dateRange : null,\r\n })),\r\n ...configOverride,\r\n }\r\n }, [TAOverride, configOverride])\r\n\r\n if (!config || !chartEl.current) return null\r\n\r\n return ReactDOM.createPortal(, chartEl.current)\r\n}\r\n","import * as React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\n\r\nimport { useToggleStaticElements } from '../../../hooks/useToggleStaticElement'\r\nimport { QuoteContext } from '../QuoteContext'\r\n\r\ntype AnyElement = Element | Element[] | NodeListOf\r\n\r\ninterface PortalContextProps {\r\n /**\r\n * The root element this component will get rendered into\r\n */\r\n rootElement?: HTMLElement\r\n\r\n /**\r\n * Static (server rendered) element associated with this component.\r\n * Hide this element when the component gets rendered\r\n */\r\n staticElement?: HTMLElement\r\n\r\n toggleStaticElement: (isEnabled?: boolean) => void\r\n}\r\n\r\nexport const QuotePortalContext = React.createContext({\r\n rootElement: undefined,\r\n staticElement: undefined,\r\n toggleStaticElement: () => {},\r\n})\r\n\r\n/**\r\n * Portal component props\r\n */\r\ninterface QuotePortalProps {\r\n /**\r\n * Override the ticker index from context if you need to skip the first ticker\r\n */\r\n index?: number\r\n\r\n /**\r\n * Server rendered elements to replace with react components\r\n */\r\n staticElements?: AnyElement\r\n\r\n /**\r\n * Immediately replace the static element with react children.\r\n * Turn this off if the child component is suspended\r\n *\r\n * @default true (if root exists)\r\n */\r\n toggleStaticElement?: boolean\r\n\r\n /**\r\n * Elements to render the react components into\r\n */\r\n roots: AnyElement\r\n\r\n /**\r\n * Intentionally restricted to JSX element so that we don’t have to check children is valid react element\r\n */\r\n children: JSX.Element\r\n}\r\n\r\nexport function QuotePortal({ index, toggleStaticElement, staticElements, roots, children }: QuotePortalProps) {\r\n // We might need to offset the index if we want to skip the first ticker (eg. static image chart)\r\n const context = React.useContext(QuoteContext)\r\n const elementIndex = index ?? context.index\r\n\r\n // Get the root and associated static html element, get them by index if array\r\n const staticElement =\r\n staticElements instanceof NodeList || Array.isArray(staticElements) ? staticElements[elementIndex] : staticElements\r\n const rootElement = roots instanceof NodeList || Array.isArray(roots) ? roots[elementIndex] : roots\r\n\r\n /**\r\n * Set up element switching. We might want to hold off if we’re passing a suspendable component.\r\n * We can’t catch the promise here, it might have already been caught down the tree\r\n * and we want to avoid hiding the server-rendered element before the react content is ready\r\n */\r\n const [isEnabled, setIsEnabled] = React.useState(toggleStaticElement ?? (!!staticElement && !!rootElement))\r\n useToggleStaticElements(staticElement, rootElement, isEnabled)\r\n\r\n const portalContextValue = React.useMemo(\r\n () => ({\r\n // Cast here to make it easier to pass any `Element`s as props\r\n rootElement: rootElement as HTMLElement,\r\n staticElement: staticElement as HTMLElement,\r\n // A way to get notified when children get rendered, because they could be suspended and waiting for requests\r\n toggleStaticElement: (enabled?: boolean) => setIsEnabled((prevValue) => enabled ?? !prevValue),\r\n }),\r\n [rootElement, staticElement]\r\n )\r\n\r\n if (!rootElement) return null\r\n\r\n return (\r\n setIsEnabled(false)}>\r\n \r\n {ReactDOM.createPortal(children, rootElement)}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\ntype QuerySelectorReturn = Element | null\r\ntype AnyElement = QuerySelectorReturn | QuerySelectorReturn[] | NodeListOf\r\n\r\nexport function useToggleStaticElements(elementToHide?: AnyElement, elementToShow: AnyElement = [], enabled = true) {\r\n React.useEffect(() => {\r\n if (!elementToHide) return\r\n\r\n const hideElement = (element?: QuerySelectorReturn) => element?.classList.add('hidden')\r\n const showElement = (element?: QuerySelectorReturn) => element?.classList.remove('hidden')\r\n const toggleElements = (element: AnyElement | undefined, toggleFn: typeof hideElement) => {\r\n if (element instanceof NodeList || Array.isArray(element)) {\r\n element.forEach(toggleFn)\r\n } else {\r\n toggleFn(element)\r\n }\r\n }\r\n\r\n toggleElements(elementToHide, enabled ? hideElement : showElement)\r\n toggleElements(elementToShow, enabled ? showElement : hideElement)\r\n\r\n return () => {\r\n toggleElements(elementToHide, showElement)\r\n toggleElements(elementToShow, hideElement)\r\n }\r\n }, [elementToHide, elementToShow, enabled])\r\n}\r\n","import React from 'react'\r\n\r\nimport { useChartTimeframePathWatch } from '../../hooks/use-chart-timeframe-path-watch'\r\nimport { QuotePortalContext } from '../Portal'\r\n\r\nexport type QuoteLinksContextType = ReturnType\r\n\r\nfunction getDefaultContextValue() {\r\n const urlObject = new URL(window.location.href)\r\n\r\n return {\r\n chartLayoutModel: null,\r\n location: urlObject,\r\n }\r\n}\r\n\r\nexport const QuoteLinksContext = React.createContext(getDefaultContextValue())\r\n\r\nexport function QuoteLinksWrapper({ children }: React.PropsWithChildren) {\r\n const { toggleStaticElement } = React.useContext(QuotePortalContext)\r\n const info = useChartTimeframePathWatch()\r\n\r\n React.useEffect(() => toggleStaticElement(), [toggleStaticElement])\r\n\r\n return {children}\r\n}\r\n","import { useChartModelCustomDateRangeValues } from 'finviz-charts/app/controllers/chart-controls/use-chart-model-custom-date-range-values'\r\nimport { useChartLayoutGlobalModelAsync, useModelState } from 'finviz-charts/app/lib-export'\r\n\r\nexport function useChartTimeframePathWatch() {\r\n const isPremium = window.FinvizSettings.hasUserPremium\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const chartModel = useModelState(chartLayoutModel?.activeChart ?? null, {\r\n watchProperties: ['timeframe', 'dateRange'],\r\n })\r\n const { generateChartLayoutRouterPath } = useChartModelCustomDateRangeValues({\r\n chartModel,\r\n isPremium,\r\n })\r\n\r\n if (!chartModel)\r\n return {\r\n location: new URL(`${window.location.pathname}${window.location.search}`, window.location.origin),\r\n chartLayoutModel,\r\n }\r\n\r\n const location = generateChartLayoutRouterPath({\r\n ticker: chartModel?.ticker,\r\n timeframe: chartModel?.timeframe,\r\n dateRange: chartModel?.dateRange,\r\n })\r\n\r\n return { location: new URL(`${location.pathname}${location.search}`, window.location.origin), chartLayoutModel }\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\nimport { Link, LinkProps, To } from 'react-router-dom'\r\n\r\nimport { getElitePageLink, getNavigationLinkUrl } from '../../../../util'\r\nimport { QuoteContext } from '../../QuoteContext'\r\nimport { QuoteQuery, QuoteSubview, QuoteView } from '../../types'\r\nimport { QuoteLinksContext, QuoteLinksContextType } from './QuoteLinksWrapper'\r\n\r\nconst isPremium = FinvizSettings.hasUserPremium\r\n\r\ninterface SharedNavigationLinkProps {\r\n /**\r\n * Mark as only available to elite users. When se to `true`, free users will be\r\n * redirected to elite landing when clicking the link\r\n */\r\n isEliteOnly?: boolean\r\n\r\n /**\r\n * Used together with isEliteOnly to set the correct utm campaign param\r\n */\r\n utmCampaign?: string\r\n}\r\n\r\ninterface NavigationLinkProps extends SharedNavigationLinkProps, Omit {\r\n /**\r\n * Keys to preserve from the current URL query. Runs first when manipulating the URL\r\n *\r\n * @default [Ticker, Type, Period, DateRange]\r\n */\r\n preserveQueryKeys?: Array\r\n\r\n /**\r\n * Keys to omit from the current URL query. Runs after `preserveQueryKeys`\r\n */\r\n removeQueryKeys?: Array\r\n\r\n /**\r\n * Additional values to set to the URL query after preserving/removing\r\n *\r\n * @default { Type: props.view }\r\n */\r\n additionalQueryValues?: Partial>\r\n\r\n /**\r\n * The view the component links to\r\n */\r\n view: QuoteView | QuoteSubview\r\n\r\n getLink?: never\r\n}\r\n\r\ninterface CustomNavigationLinkProps extends SharedNavigationLinkProps, Omit {\r\n view?: never\r\n preserveQueryKeys?: never\r\n removeQueryKeys?: never\r\n additionalQueryValues?: never\r\n\r\n /**\r\n * Custom function to get the link\r\n */\r\n getLink: (context: QuoteLinksContextType) => To\r\n}\r\n\r\nexport function NavigationLink({\r\n isEliteOnly,\r\n utmCampaign,\r\n view,\r\n getLink,\r\n reloadDocument = true,\r\n preserveQueryKeys = [QuoteQuery.Ticker, QuoteQuery.Type, QuoteQuery.Period, QuoteQuery.DateRange],\r\n removeQueryKeys,\r\n additionalQueryValues,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const quoteContext = React.useContext(QuoteContext)\r\n const linkContext = React.useContext(QuoteLinksContext)\r\n\r\n const linkUrl = React.useMemo(() => {\r\n if (isEliteOnly && !isPremium) return getElitePageLink(utmCampaign)\r\n if (typeof getLink === 'function') return getLink(linkContext)\r\n\r\n return getNavigationLinkUrl(\r\n linkContext.location,\r\n preserveQueryKeys,\r\n removeQueryKeys,\r\n additionalQueryValues ?? { [QuoteQuery.Type]: view }\r\n ).toString()\r\n }, [isEliteOnly, utmCampaign, getLink, linkContext, preserveQueryKeys, removeQueryKeys, additionalQueryValues, view])\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Dialog, useDialogState } from '../../../../components/dialog'\r\nimport { Spinner } from '../../../../components/spinner'\r\nimport { useAsyncModule } from '../../../../services/async-modules-utils'\r\nimport { createAlertAsyncModule } from '../../../create-alert/async-modules'\r\nimport { QuoteContext } from '../../QuoteContext'\r\nimport { NavigationLink } from './QuoteLinkComponent'\r\n\r\nexport function CreateAlertLink() {\r\n const { ticker } = React.useContext(QuoteContext)\r\n const dialog = useDialogState()\r\n const isVisible = dialog.useState('open')\r\n\r\n const [createAlertModule] = useAsyncModule({\r\n ...createAlertAsyncModule,\r\n shouldLoadModule: isVisible,\r\n })\r\n const CreateAlert = createAlertModule?.CreateAlert\r\n\r\n return (\r\n <>\r\n `/create_alert.ashx?t=${ticker}`}\r\n onClick={(e) => {\r\n if (!FinvizSettings.hasUserPremium) return\r\n window.gtag?.('event', 'click', { event_category: 'create-alert' })\r\n if (e.ctrlKey || e.metaKey) return\r\n e.preventDefault() // needed to prevent opening parent link\r\n dialog.show()\r\n }}\r\n data-testid=\"set-alert-link\"\r\n >\r\n Set Alert\r\n \r\n \r\n {CreateAlert ? (\r\n \r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Dialog, useDialogState } from '../../../../components/dialog'\r\nimport { Spinner } from '../../../../components/spinner'\r\nimport { useAsyncModule } from '../../../../services/async-modules-utils'\r\nimport { saveToPortfolioAsyncModule } from '../../../save-to-portfolio/async-modules'\r\nimport { QuoteContext } from '../../QuoteContext'\r\nimport { NavigationLink } from './QuoteLinkComponent'\r\n\r\nexport function SaveToPortfolioLink() {\r\n const { ticker } = React.useContext(QuoteContext)\r\n const dialog = useDialogState()\r\n const isVisible = dialog.useState('open')\r\n\r\n const [saveToPortfolioModule] = useAsyncModule({\r\n ...saveToPortfolioAsyncModule,\r\n shouldLoadModule: isVisible,\r\n })\r\n const SaveToPortfolio = saveToPortfolioModule?.SaveToPortfolio\r\n\r\n return (\r\n <>\r\n `/save_to_portfolio.ashx?t=${ticker}`}\r\n onClick={(e) => {\r\n if (!FinvizSettings.email.length) return\r\n window.gtag?.('event', 'click', { event_category: 'save-to-portfolio' })\r\n if (e.ctrlKey || e.metaKey) return\r\n e.preventDefault() // needed to prevent opening parent link\r\n dialog.show()\r\n }}\r\n >\r\n Add to Portfolio\r\n \r\n \r\n {SaveToPortfolio ? (\r\n \r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { CreateAlertLink } from './components/Navigation/CreateAlertLink'\r\nimport { NavigationLink } from './components/Navigation/QuoteLinkComponent'\r\nimport { QuoteLinksWrapper } from './components/Navigation/QuoteLinksWrapper'\r\nimport { SaveToPortfolioLink } from './components/Navigation/SaveToPortfolioLink'\r\nimport { QuotePortalContext } from './components/Portal'\r\nimport { QuoteQuery, QuoteSubview, QuoteView } from './types'\r\n\r\nexport function QuoteNavigation() {\r\n const { rootElement } = React.useContext(QuotePortalContext)\r\n const hasShortInterest = rootElement!.dataset.shortinterest === 'true'\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n Chart\r\n Stock Detail\r\n \r\n \r\n\r\n \r\n Compare\r\n Compare Perf.\r\n \r\n \r\n\r\n {hasShortInterest && (\r\n <>\r\n Short Interest\r\n \r\n \r\n )}\r\n\r\n Financials\r\n \r\n\r\n {FinvizSettings.hasTrafficPageEnabled && (\r\n <>\r\n Traffic\r\n \r\n \r\n )}\r\n\r\n \r\n Options\r\n \r\n \r\n\r\n \r\n Filings\r\n Latest Filings\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","/* global FinvizQuoteTickers */\r\nimport classnames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\nimport React, { ChangeEvent, Component, FormEvent } from 'react'\r\n\r\nimport {\r\n ChartElementType,\r\n ChartLayout,\r\n Instrument,\r\n Quote,\r\n QuoteFetchType,\r\n TIMEFRAME,\r\n Theme,\r\n Utils,\r\n} from '../../../../app/charts-lib'\r\nimport { decodeQueryString } from '../../../../app/queryString'\r\nimport { getStaticChartConfig } from '../../../../app/shared/chartLayoutConfig'\r\nimport { getSanitizedTicker } from '../../../../app/shared/ticker-sanitizer'\r\nimport { formatDateToStringUS } from '../../../../app/shared/utils'\r\nimport { DatePicker } from '../../../components/date-picker'\r\nimport { SpecificChartFunctionality } from '../../../constants'\r\n\r\nconst redesignEnabled = !!FinvizSettings.hasRedesignEnabled\r\n\r\nconst colorScaleClass = function (value: number) {\r\n if (value < 0) {\r\n return 'color-text is-negative'\r\n } else if (value > 0) {\r\n return 'color-text is-positive'\r\n }\r\n return ''\r\n}\r\n\r\nconst monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nconst arraysEqual = function (arr1: unknown[], arr2: unknown[]) {\r\n if (arr1.length !== arr2.length) {\r\n return false\r\n }\r\n for (let i = 0; i < arr1.length; i++) {\r\n if (arr1[i] !== arr2[i]) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\ninterface ChartProps {\r\n tickers: string[]\r\n fromDay: string\r\n toDay: string\r\n}\r\n\r\nclass Chart extends Component {\r\n containerRef = React.createRef()\r\n\r\n shouldComponentUpdate(nextProps: ChartProps) {\r\n return !arraysEqual(this.props.tickers, nextProps.tickers)\r\n }\r\n\r\n render() {\r\n const theme = FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light\r\n const tickerQuote = Quote.select((q) => q.close.length > 0 && this.props.tickers.includes(q.ticker))\r\n const chartConfig = getStaticChartConfig({\r\n ticker: tickerQuote[0]?.ticker ?? '',\r\n timeframe: TIMEFRAME.d,\r\n paneElements: [\r\n {\r\n type: ChartElementType.PerfChart,\r\n tickers: this.props.tickers,\r\n fromDate: this.props.fromDay,\r\n toDate: this.props.toDay,\r\n overlays: [],\r\n },\r\n ],\r\n width: 1000,\r\n height: 450,\r\n refreshData: false,\r\n specificChartFunctionality: SpecificChartFunctionality.quotePerf,\r\n theme,\r\n })\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\ninterface TableProps {\r\n months: string[]\r\n rows: Array<{\r\n ticker: string\r\n months: string[]\r\n total: string\r\n }>\r\n}\r\n\r\n// mozno vyfarbovat tabulku?\r\nclass Table extends Component {\r\n render() {\r\n const { months, rows } = this.props\r\n const groupsCount = Math.ceil(months.length / 12)\r\n const tdClasses = classnames('text-center', {\r\n 'body-table-nw font-bold': !redesignEnabled,\r\n })\r\n\r\n const trs = []\r\n for (let g = 0; g < groupsCount; g++) {\r\n trs.push(\r\n \r\n \r\n {months.splice(0, 12).map((month) => (\r\n \r\n {month}\r\n \r\n ))}\r\n {g === groupsCount - 1 && Total}\r\n \r\n )\r\n rows.forEach((row, i) => {\r\n trs.push(\r\n \r\n {row.ticker}\r\n {row.months.splice(0, 12).map((col, monthIndex) => (\r\n \r\n {col}\r\n \r\n ))}\r\n {g === groupsCount - 1 && (\r\n \r\n {row.total}\r\n \r\n )}\r\n \r\n )\r\n })\r\n }\r\n\r\n return (\r\n \r\n {trs}\r\n \r\n )\r\n }\r\n}\r\n\r\ninterface PerfState {\r\n tickersInput: string\r\n tickers: string[]\r\n months: Array<{\r\n value: string\r\n label: string\r\n }>\r\n fromMonth: {\r\n value: string\r\n label: string\r\n }\r\n toMonth: {\r\n value: string\r\n label: string\r\n }\r\n minDate: string\r\n maxDate: string\r\n fromDay: string\r\n toDay: string\r\n loading: boolean\r\n}\r\n\r\nexport class Perf extends Component {\r\n constructor(props: any) {\r\n super(props)\r\n const now = new Date(),\r\n months = []\r\n const startYear = new Date().getFullYear() - 36 // We have 37.25 years of data in DB, so leaving some offset\r\n for (let year = startYear; year <= now.getFullYear(); year++) {\r\n for (let month = 1; month <= 12; month++) {\r\n if (year === now.getFullYear() && month > now.getMonth() + 1) {\r\n break\r\n }\r\n months.push({\r\n value: month.toString().padStart(2, '0') + '/01/' + year,\r\n label: monthNames[month - 1] + ' ' + year.toString().substring(2),\r\n })\r\n }\r\n }\r\n\r\n this.state = {\r\n tickersInput: FinvizQuoteTickers.join(','),\r\n tickers: FinvizQuoteTickers,\r\n months: months,\r\n fromMonth: months[months.length - 12],\r\n toMonth: months[months.length - 1],\r\n /**\r\n * DB_BARS_LIMIT - code below is dependent on amount of data we store for specific timeframes\r\n * Search DB_BARS_LIMIT in the project to find other places with such code.\r\n */\r\n // 2510 bars = ±10 years\r\n minDate: formatDateToStringUS(dateFns.sub(new Date(), { years: 9, months: 11 })),\r\n maxDate: formatDateToStringUS(new Date()),\r\n fromDay: formatDateToStringUS(dateFns.subYears(new Date(), 1)),\r\n toDay: formatDateToStringUS(new Date()),\r\n loading: true,\r\n }\r\n }\r\n\r\n render() {\r\n if (this.state.loading) {\r\n return (\r\n \r\n Loading...\r\n
\r\n )\r\n }\r\n\r\n const from = new Date(this.state.fromMonth.value)\r\n const to = new Date(this.state.toMonth.value)\r\n const monthsToShow = this.state.months\r\n .map((month) => month.value)\r\n .filter((month) => new Date(month) >= from && new Date(month) <= to)\r\n\r\n const quotes = Quote.select((q: any) => q.timeframe === 'm')\r\n const quotesPerf = quotes.map((q: any) => {\r\n const obj: { ticker: string; perf: Record } = { ticker: q.ticker, perf: {} }\r\n q.date.forEach((d: any, i: number) => {\r\n if (i === 0) {\r\n return\r\n }\r\n const date = Utils.dateFromUnixTimestamp(d)\r\n const perf = (q.close[i] * 100) / q.close[i - 1] - 100\r\n obj.perf[(date.getMonth() + 1).toString().padStart(2, '0') + '/01/' + date.getFullYear()] = perf\r\n })\r\n return obj\r\n })\r\n\r\n const months = monthsToShow.map(\r\n (month) => monthNames[new Date(month).getMonth()] + ' ' + new Date(month).getFullYear().toString().substring(2)\r\n )\r\n const rows = quotesPerf.map((quote: any) => {\r\n const cols: string[] = []\r\n let total = 1\r\n monthsToShow.forEach((month) => {\r\n const perf = Math.round(quote.perf[month] * 100) / 100\r\n if (!isNaN(perf)) {\r\n total *= quote.perf[month] / 100 + 1\r\n cols.push((perf > 0 ? '+' : '') + perf.toFixed(2) + '%')\r\n } else {\r\n cols.push('N/A')\r\n }\r\n })\r\n total = (total - 1) * 100\r\n return { ticker: quote.ticker, months: cols, total: (total > 0 ? '+' : '') + total.toFixed(2) + '%' }\r\n })\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Tickers:\r\n {\r\n this.setState({ tickersInput: e.target.value })\r\n }}\r\n style={{ width: '100%' }}\r\n data-testid=\"quote-compare-perf-tickers-input\"\r\n />\r\n \r\n \r\n
\r\n
\r\n\r\n \r\n\r\n \r\n
\r\n {\r\n this._onDatePickerChange('from', formatDateToStringUS(newValue))\r\n }}\r\n >\r\n \r\n \r\n
\r\n {' - '}\r\n
\r\n {\r\n this._onDatePickerChange('to', formatDateToStringUS(newValue))\r\n }}\r\n >\r\n \r\n \r\n
\r\n \r\n\r\n

\r\n Monthly performance from  \r\n \r\n {this.state.months.map((option) => (\r\n \r\n ))}\r\n \r\n   to  \r\n \r\n {this.state.months.map((option) => (\r\n \r\n ))}\r\n \r\n

\r\n \r\n\r\n
\r\n \r\n )\r\n }\r\n\r\n refetchQuotes = () => {\r\n this._fetch(this.state.tickers, false)\r\n }\r\n\r\n componentDidMount() {\r\n this._fetch(this.state.tickers)\r\n\r\n // We have to listen to these events to synchrnously update quote data, if we do after awaiting Quote.getAll in _fetch\r\n // there's a visual glitch because it rerenders with new data from the server (there's a complete refetch after 15 requests with no new data)\r\n // and then it rerenders again after updateQuoteData\r\n Quote.bind('refetch newerData', this.updateQuoteData)\r\n document.addEventListener('quoteFetchEvent', this.refetchQuotes)\r\n }\r\n\r\n componentWillUnmount() {\r\n Quote.unbind('refetch newerData', this.updateQuoteData)\r\n document.removeEventListener('quoteFetchEvent', this.refetchQuotes)\r\n }\r\n\r\n updateQuoteData = () => {\r\n const { fromDay, toDay } = this.state\r\n\r\n if (!fromDay || !toDay) {\r\n return\r\n }\r\n\r\n const dailyQuotes = Quote.select((q: any) => q.timeframe === 'd')\r\n const fromDate = new Date(fromDay + ' 00:00')\r\n const toDate = new Date(toDay + ' 23:59')\r\n dailyQuotes.forEach((q: any) => {\r\n const o = [],\r\n h = [],\r\n l = [],\r\n c = [],\r\n d = [],\r\n v = []\r\n for (let i = 0; i < q.close.length; i++) {\r\n const date = Utils.dateFromUnixTimestamp(q.date[i])\r\n if (fromDate <= date && date <= toDate) {\r\n o.push(q.open[i])\r\n h.push(q.high[i])\r\n l.push(q.low[i])\r\n c.push(q.close[i])\r\n d.push(q.date[i])\r\n v.push(q.volume[i])\r\n }\r\n }\r\n // Clear cache so we'll recalculate values after updating quote data on next line\r\n // Cache invalidates only on quote.fetchedAt change and in this case we mutate quote values and don't change fetchedAt (which is correct)\r\n // Updating quote this way should be an edge case and that's why we have to clear the cache manually\r\n q.clearCachedData()\r\n q.updateAttributes({\r\n open: o,\r\n high: h,\r\n low: l,\r\n close: c,\r\n date: d,\r\n volume: v,\r\n })\r\n })\r\n\r\n // This is to rerender perf table on quote update\r\n this.forceUpdate()\r\n }\r\n\r\n _fetch = async (tickers: string[], isRefetch = true) => {\r\n const { t } = decodeQueryString<{ t: string; p?: TIMEFRAME }>()\r\n if (isRefetch) {\r\n this.setState({ loading: true })\r\n }\r\n\r\n Quote.all().forEach(async (quote) => {\r\n if (quote.ticker === t && quote.timeframe === 'd' && !isRefetch) {\r\n // We don't want to trigger main ticker quote newer data fetch because it's done in withQuotePolling which also triggers this function\r\n // by emmiting quoteFetchEvent\r\n return\r\n }\r\n if (tickers.includes(quote.ticker)) {\r\n await quote.fetchData({ fetchType: isRefetch ? QuoteFetchType.Refetch : QuoteFetchType.NewerData })\r\n this.updateQuoteData()\r\n } else {\r\n quote.destroy()\r\n }\r\n })\r\n\r\n if (isRefetch) {\r\n const d = tickers.map((ticker) => ({ ticker: ticker, timeframe: TIMEFRAME.d, instrument: Instrument.Stock }))\r\n const m = tickers.map((ticker) => ({ ticker: ticker, timeframe: TIMEFRAME.m, instrument: Instrument.Stock }))\r\n await Quote.getAll(d.concat(m))\r\n\r\n this.setState({ loading: false })\r\n }\r\n\r\n this.updateQuoteData()\r\n }\r\n\r\n _onSubmit = (e: FormEvent) => {\r\n e.preventDefault()\r\n const tickersInput = getSanitizedTicker(this.state.tickersInput, true)\r\n const tickers = tickersInput.split(',')\r\n this.setState({ tickers, tickersInput }, () => {\r\n this._fetch(tickers)\r\n })\r\n }\r\n\r\n _onMonthChange = (type: string, e: ChangeEvent) => {\r\n const state: any = {}\r\n state[type + 'Month'] = this.state.months.filter((m) => m.value === e.target.value)[0]\r\n this.setState(state)\r\n }\r\n\r\n _onDatePickerChange = (type: string, date: any) => {\r\n const formattedDate = formatDateToStringUS(new Date(date))\r\n\r\n const state: any = {}\r\n state[type + 'Day'] = formattedDate\r\n state[type + 'DatePickerOpen'] = false\r\n this.setState(state, () => {\r\n this._fetch(this.state.tickers)\r\n })\r\n }\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface ChartBoxProps extends Omit, 'label'> {\r\n label?: React.ReactNode\r\n}\r\n\r\nexport function ChartBox({ label, children, ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n
\r\n {label}\r\n
\r\n {children}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { ComposedChart } from 'recharts'\r\n\r\nimport { RedGreenText } from '../../../components/RedGreenText'\r\nimport { Bar } from '../../../components/chart/Bar'\r\nimport { CartesianGrid } from '../../../components/chart/CartesianGrid'\r\nimport { ChartBox } from '../../../components/chart/ChartBox'\r\nimport { ChartWrapper } from '../../../components/chart/ChartWrapper'\r\nimport { Label } from '../../../components/chart/Label'\r\nimport { Line } from '../../../components/chart/Line'\r\nimport { Tooltip, TooltipRow } from '../../../components/chart/Tooltip'\r\nimport { DateFormat, XAxis, dateAxisFormatter } from '../../../components/chart/XAxis'\r\nimport { YAxis } from '../../../components/chart/YAxis'\r\nimport { getMonthlyTicks } from '../../../components/chart/utils'\r\nimport { dateStrToTimestamp, shortFormatDollar } from '../../../util'\r\nimport { parseRouteInitData } from '../../../util-routing'\r\nimport { QuoteContext } from '../QuoteContext'\r\n\r\ninterface FundFlowsRow {\r\n date: string\r\n aum: number | null\r\n flow: number | null\r\n}\r\n\r\nenum FlowsChartDataKeys {\r\n Aum = 'aum',\r\n Flows = 'flow',\r\n}\r\n\r\nconst AXIS_LABEL_OFFSET = 38\r\n\r\nfunction tooltipValueFormatter(value: number, { dataKey }: { dataKey: string }) {\r\n const formatted = shortFormatDollar(value)\r\n if (dataKey === FlowsChartDataKeys.Aum) return formatted\r\n\r\n return (\r\n \r\n {formatted}\r\n \r\n )\r\n}\r\n\r\nexport function FundFlowsChart(props: React.HTMLProps) {\r\n const { index } = React.useContext(QuoteContext)\r\n const initData = React.useMemo(() => {\r\n const routeData = parseRouteInitData({\r\n elementId: `route-init-data-fundflows-${index}`,\r\n removeElement: false,\r\n })\r\n\r\n return routeData?.map((row) => ({ ...row, date: dateStrToTimestamp(row.date) }))\r\n }, [index])\r\n\r\n const monthlyTicks = React.useMemo(\r\n () => (initData ? getMonthlyTicks(initData[0].date, initData[initData?.length - 1].date) : undefined),\r\n [initData]\r\n )\r\n\r\n if (!initData?.length) return null\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n dateAxisFormatter({ value, outFormat: DateFormat.MonthShort, parseAsNY: false, breakOnYear: true })\r\n }\r\n />\r\n \r\n \r\n \r\n {\r\n const absMax = Math.max(Math.abs(dataMin), Math.abs(dataMax)) * 1.2\r\n return [-absMax, absMax]\r\n }}\r\n >\r\n \r\n \r\n \r\n dateAxisFormatter({ value, outFormat: DateFormat.MonthShortDayNumYearFull, parseAsNY: false })\r\n }\r\n formatValue={tooltipValueFormatter}\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n yAxisId=\"flowAxis\"\r\n dataKey={FlowsChartDataKeys.Flows}\r\n radius={[1, 1, 0, 0]}\r\n color={(value) => (value == null ? 'blue' : value > 0 ? 'green' : 'red')}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nexport function getMonthlyTicks(startingTimestamp: number, endingTimestamp: number, dayOfMonth = 1) {\r\n const ticks: number[] = []\r\n const endingDate = new Date(endingTimestamp)\r\n const initTimestamp = new Date(startingTimestamp)\r\n const startDate = dateFns.setDay(initTimestamp, dayOfMonth)\r\n let date = dateFns.isBefore(startDate, initTimestamp) ? initTimestamp : startDate\r\n\r\n while (date <= endingDate) {\r\n ticks.push(date.getTime())\r\n date = new Date(date.getFullYear(), date.getMonth() + 1, dayOfMonth)\r\n }\r\n\r\n return ticks\r\n}\r\n","export const CHART_HEIGHT = 300\r\nexport const BAR_WIDTH = 8\r\n\r\nexport enum BarType {\r\n Buy = 'buyAggregated',\r\n Sale = 'saleAggregated',\r\n}\r\n","import * as React from 'react'\r\nimport { Rectangle } from 'recharts'\r\n\r\nimport { BarInner } from '../../../../components/chart/Bar'\r\nimport { BAR_WIDTH, BarType } from './constants'\r\n\r\nexport function InsiderVolumeBar({ x, width, ...props }: any) {\r\n let newX = x\r\n const value = props.payload[props.dataKey]\r\n const isCenteredBar = props.payload.saleAggregated === 0 || props.payload.buyAggregated === 0\r\n if (isCenteredBar) {\r\n if (props.dataKey === BarType.Sale) newX += width / 2\r\n else newX -= width / 2\r\n }\r\n\r\n if (value === 0 || !Number.isFinite(value)) {\r\n // Needs to return an element, so return an empty node\r\n return \r\n }\r\n\r\n return (\r\n \r\n \r\n {props.dataKey === BarType.Sale && (\r\n \r\n )}\r\n {props.dataKey === BarType.Buy && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport { endOfMonth, startOfMonth } from 'date-fns'\r\nimport { type Quote } from 'finviz-charts/server/offScreenCanvasRender'\r\n\r\nimport { getDate } from '../../../../../app/header/utils'\r\nimport { RedGreenText } from '../../../../components/RedGreenText'\r\nimport { shortFormatDollar } from '../../../../util'\r\nimport { BarType } from './constants'\r\nimport { ChartBaseData, VolumeChartDataPerTimeframe } from './types'\r\n\r\n/**\r\n * Only get data between from/to range\r\n */\r\nexport function filterDataForChart(quote: Quote, [fromDate, toDate]: number[]) {\r\n const monthlyData: ChartBaseData[] = []\r\n\r\n const fromTimestamp = getDate(startOfMonth(getDate(fromDate))).getTime()\r\n const toTimestamp = getDate(endOfMonth(getDate(toDate))).getTime()\r\n for (let index = 0; index < quote.date.length; index++) {\r\n const currentTimestamp = quote.date[index] * 1000\r\n const currentClose = quote.close[quote.barToDataIndex[index]]\r\n\r\n if (fromTimestamp > currentTimestamp || currentTimestamp > toTimestamp) continue\r\n\r\n monthlyData.push({ date: currentTimestamp, close: currentClose })\r\n }\r\n\r\n return monthlyData\r\n}\r\n\r\nexport function tooltipTitleFormatter(date: number) {\r\n const startDate = startOfMonth(date)\r\n const endDate = endOfMonth(startDate)\r\n\r\n const month = startDate.toLocaleString('en-US', { month: 'short' })\r\n const startDay = startDate.getDate()\r\n const year = startDate.getFullYear()\r\n const endDay = endDate.getDate()\r\n return `${month} ${startDay}-${endDay}, ${year}`\r\n}\r\n\r\nexport function tooltipDataFormatter(\r\n _: unknown,\r\n {\r\n dataKey,\r\n fullTooltipPayload,\r\n }: { dataKey: string; fullTooltipPayload: { payload?: { insider: VolumeChartDataPerTimeframe } }[] }\r\n) {\r\n const { insider } = fullTooltipPayload[0]?.payload ?? {}\r\n\r\n if (!insider) return null\r\n\r\n const tradeCount = dataKey === BarType.Buy ? insider?.buyTransactionCount : insider?.saleTransactionCount\r\n const value = dataKey === BarType.Buy ? insider?.buyAggregated : insider?.saleAggregated\r\n const isZeroValue = value === 0\r\n const valueToUse = isZeroValue ? null : dataKey === BarType.Buy ? value : -value\r\n\r\n return (\r\n \r\n {shortFormatDollar(isZeroValue ? null : value, { defaultValue: '—' })} \r\n {!isZeroValue && (\r\n \r\n ({tradeCount ?? 0} Trade{tradeCount === 1 ? '' : 's'})\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { endOfMonth, startOfMonth } from 'date-fns'\r\nimport { getInstrument } from 'finviz-charts/app/utils/chart'\r\nimport * as React from 'react'\r\nimport { ComposedChart } from 'recharts'\r\n\r\nimport { Quote, TIMEFRAME } from '../../../../../app/charts-lib'\r\nimport { getDate } from '../../../../../app/header/utils'\r\nimport { Bar } from '../../../../components/chart/Bar'\r\nimport { CartesianGrid } from '../../../../components/chart/CartesianGrid'\r\nimport { ChartBox } from '../../../../components/chart/ChartBox'\r\nimport { ChartWrapper } from '../../../../components/chart/ChartWrapper'\r\nimport { CursorBar } from '../../../../components/chart/Cursor'\r\nimport { Label } from '../../../../components/chart/Label'\r\nimport { Line } from '../../../../components/chart/Line'\r\nimport { Tooltip, TooltipRow } from '../../../../components/chart/Tooltip'\r\nimport { DateFormat, XAxis, dateAxisFormatter } from '../../../../components/chart/XAxis'\r\nimport { YAxis } from '../../../../components/chart/YAxis'\r\nimport { shortFormatDollar } from '../../../../util'\r\nimport { parseRouteInitData } from '../../../../util-routing'\r\nimport { QuoteContext } from '../../QuoteContext'\r\nimport { InsiderVolumeBar } from './InsiderVolumeBar'\r\nimport { BarType, CHART_HEIGHT } from './constants'\r\nimport { ChartData, TradingVolumeChartInit } from './types'\r\nimport { filterDataForChart, tooltipDataFormatter, tooltipTitleFormatter } from './utils'\r\n\r\nexport function InsiderTradingVolumeChart({ className }: { className?: string }) {\r\n const { ticker, index } = React.useContext(QuoteContext)\r\n const [chartData, setChartData] = React.useState([])\r\n\r\n const initData = React.useMemo(() => {\r\n const data = parseRouteInitData({\r\n elementId: `insider-init-data-${index}`,\r\n removeElement: false,\r\n })\r\n\r\n return {\r\n data,\r\n domain: data?.length\r\n ? [\r\n getDate(startOfMonth(getDate(data[0].date))).getTime(),\r\n getDate(endOfMonth(getDate(data[data.length - 1].date))).getTime(),\r\n ]\r\n : [],\r\n }\r\n }, [index])\r\n\r\n const hasInsiderTradingHistory = React.useMemo(\r\n () => initData.data?.some((x) => x.saleTransactionCount > 0 || x.buyTransactionCount > 0),\r\n [initData]\r\n )\r\n\r\n React.useEffect(() => {\r\n if (!hasInsiderTradingHistory) return\r\n\r\n async function fetchQuoteData() {\r\n if (!initData.data?.length) return\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe: TIMEFRAME.d,\r\n // Do not reuse idea quote, it doesn’t have the current data\r\n options: { cachePredicate: (quote) => !quote.ideaID },\r\n })\r\n const dateFrom = initData.data[0].date\r\n const dateTo = initData.data[initData.data.length - 1]!.date\r\n const data = filterDataForChart(quote, [dateFrom, dateTo])\r\n\r\n setChartData(data.map((row, index) => ({ ...row, insider: initData.data?.[index] })))\r\n }\r\n\r\n fetchQuoteData()\r\n }, [initData, hasInsiderTradingHistory, index, ticker])\r\n\r\n if (!initData.data?.length || !hasInsiderTradingHistory) return null\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n dateAxisFormatter({ value, outFormat: DateFormat.MonthShort, parseAsNY: false, breakOnYear: true })\r\n }\r\n />\r\n \r\n \r\n \r\n shortFormatDollar(value)} domain={['dataMin', 'auto']}>\r\n \r\n \r\n }\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Heading } from '../../../components'\r\nimport { ChipSwitch, ChipSwitchButton } from '../../../components/ChipSwitch'\r\nimport { RedGreenText } from '../../../components/RedGreenText'\r\nimport { Table, TableAlign, TableBody, TableCell, TableRow } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\nimport { parseRouteInitData } from '../../../util-routing'\r\nimport { QuoteContext } from '../QuoteContext'\r\n\r\ntype InstitutionalOwnershipInitData = {\r\n managersOwnership: Array | null\r\n fundsOwnership: Array | null\r\n}\r\n\r\ninterface InstitutionalOwnershipItem {\r\n investorId: string\r\n name: string\r\n percOwnership: number\r\n}\r\n\r\nenum InstitutionalOwnershipType {\r\n Managers,\r\n Funds,\r\n}\r\n\r\nfunction getInvestorLink(investorId: string, type: InstitutionalOwnershipType) {\r\n const view = type === InstitutionalOwnershipType.Funds ? 'fund-details' : 'manager-details'\r\n return `/insidertrading.ashx?view=${view}&investorId=${investorId}`\r\n}\r\n\r\nconst isRedesignEnabled = FinvizSettings.hasRedesignEnabled\r\n\r\nconst commonTdClassName = {\r\n '!px-0.5': !isRedesignEnabled,\r\n}\r\n\r\nexport function InstitutionalOwnership() {\r\n const { index } = React.useContext(QuoteContext)\r\n const { managersItems, hasManagersItems, fundsItems, hasFundsItems } = React.useMemo(() => {\r\n const initData = parseRouteInitData({\r\n elementId: `institutional-ownership-init-data-${index}`,\r\n removeElement: false,\r\n })\r\n\r\n const managersItems = initData?.managersOwnership ?? []\r\n const fundsItems = initData?.fundsOwnership ?? []\r\n\r\n return {\r\n managersItems,\r\n hasManagersItems: managersItems.length > 0,\r\n fundsItems,\r\n hasFundsItems: fundsItems.length > 0,\r\n }\r\n }, [index])\r\n\r\n const [institutionalOwnership, setInstitutionalOwnership] = React.useState(\r\n hasManagersItems ? InstitutionalOwnershipType.Managers : InstitutionalOwnershipType.Funds\r\n )\r\n const items = institutionalOwnership === InstitutionalOwnershipType.Managers ? managersItems : fundsItems\r\n\r\n return (\r\n \r\n \r\n \r\n Institutional Ownership\r\n \r\n \r\n {\r\n setInstitutionalOwnership(InstitutionalOwnershipType.Managers)\r\n }}\r\n >\r\n Managers\r\n \r\n {\r\n setInstitutionalOwnership(InstitutionalOwnershipType.Funds)\r\n }}\r\n >\r\n Funds\r\n \r\n \r\n \r\n
\r\n \r\n \r\n {items.map(({ investorId, name, percOwnership }) => (\r\n \r\n \r\n \r\n {name ?? '-'}\r\n \r\n \r\n \r\n \r\n {formatNumber(percOwnership, { suffix: '%' })}\r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { formatDate } from '../../../../app/header/utils'\r\nimport { RedGreenMultiline, RedGreenText } from '../../../components/RedGreenText'\r\nimport { formatNumber } from '../../../util'\r\n\r\nexport interface QuotePriceProps {\r\n title?: string\r\n date?: Date | null\r\n dateLabel?: string | null\r\n price: number\r\n changeUsd: number\r\n changePct: number\r\n}\r\n\r\nexport function QuotePrice({ title, date, dateLabel, price, changeUsd, changePct }: QuotePriceProps) {\r\n const fractions = !isNaN(price) && price < 1 ? 4 : 2\r\n const hasValue = changeUsd && Number.isFinite(changeUsd)\r\n\r\n return (\r\n
\r\n {title &&
{title}
}\r\n\r\n {(date || dateLabel) && (\r\n \r\n {dateLabel ?? formatDate(date, '', 'MMM dd')}\r\n {date && (\r\n <>\r\n {' '}\r\n {formatDate(date, '', 'hh:mmaa')} ET\r\n \r\n )}\r\n \r\n )}\r\n\r\n
\r\n {formatNumber(price, { defaultValue: '—', fractions })}\r\n
\r\n \r\n \r\n
Dollar change
\r\n {formatNumber(changeUsd, { showPlusSign: true, fractions })}\r\n
\r\n %}\r\n >\r\n
Percentage change
\r\n {formatNumber(changePct)}\r\n \r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import { useModelState } from '../../../../../app/charts-lib'\r\n\r\nconst CHANGE_UPATE_EVENTS = ['change', 'update']\r\nconst QUOTE_MODEL_CHANGE_EVENTS = [...CHANGE_UPATE_EVENTS, 'refetch', 'newerData']\r\n\r\nexport interface HeaderPricesContext {\r\n prevClose: number\r\n lastClose: number\r\n lastTime: number\r\n lastDate?: number\r\n afterClose: number\r\n afterTime: number\r\n}\r\n\r\nexport function useChartContextPrices(chartLayoutModel: any): HeaderPricesContext | null {\r\n const chartModel = useModelState(chartLayoutModel?.charts().first(), {\r\n watchProperties: ['quote'],\r\n listenOnEvents: CHANGE_UPATE_EVENTS,\r\n })\r\n const quoteModel = useModelState(chartModel?.quote() ?? null, {\r\n watchProperties: ['lastClose', 'prevClose', 'afterClose', 'afterTime'],\r\n listenOnEvents: QUOTE_MODEL_CHANGE_EVENTS,\r\n })\r\n\r\n if (!quoteModel) return null\r\n\r\n return {\r\n prevClose: quoteModel.prevClose,\r\n lastClose: quoteModel.lastClose,\r\n lastTime: quoteModel.lastTime,\r\n lastDate: quoteModel.lastDate,\r\n afterClose: quoteModel.afterClose,\r\n afterTime: quoteModel.afterTime,\r\n }\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport React from 'react'\r\n\r\nimport {\r\n Quote,\r\n useChartLayoutGlobalModelAsync,\r\n withCompleteLayoutModelInit,\r\n withQuotePolling,\r\n} from '../../../../../app/charts-lib'\r\nimport { formatDate, getDate } from '../../../../../app/header/utils'\r\nimport { QuotePortalContext } from '../Portal'\r\nimport { QuotePrice } from '../QuotePrice'\r\nimport { HeaderPricesContext, useChartContextPrices } from './hooks'\r\n\r\nexport function ChartContextQuoteHeader() {\r\n const { toggleStaticElement } = React.useContext(QuotePortalContext)\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const data = useChartContextPrices(chartLayoutModel)\r\n const hasData = !!data\r\n\r\n React.useEffect(() => {\r\n if (hasData) toggleStaticElement(true)\r\n\r\n return () => toggleStaticElement(false)\r\n }, [hasData, toggleStaticElement])\r\n\r\n return \r\n}\r\n\r\ninterface QuoteHeaderWithManualInitProps {\r\n chartLayoutModel: any\r\n config: any\r\n}\r\n\r\nfunction ManualInitQuoteHeaderComponent({ chartLayoutModel, config }: QuoteHeaderWithManualInitProps) {\r\n const { toggleStaticElement } = React.useContext(QuotePortalContext)\r\n const data = useChartContextPrices(chartLayoutModel)\r\n\r\n /**\r\n * We need to instantiate layout model in order to use quote refetch on page\r\n * without an actual chart (options.) We also need to manually create a chart model\r\n *\r\n * It is then correctly caught in `useChartContextPrices`\r\n */\r\n React.useEffect(() => {\r\n async function fetchAndMapInitialQuote() {\r\n for (const chartConfig of config.charts) {\r\n const modelProperties = Object.assign({}, chartConfig)\r\n\r\n modelProperties.chart_layout = chartLayoutModel\r\n delete modelProperties.panes\r\n if (modelProperties.refreshData == null) {\r\n modelProperties.refreshData = true\r\n }\r\n chartLayoutModel.charts().create(modelProperties)\r\n }\r\n\r\n const chart = chartLayoutModel.charts().first()\r\n\r\n const quote = await Quote.get({\r\n ticker: chart.ticker,\r\n instrument: chart.instrument,\r\n timeframe: chart.timeframe,\r\n options: { maxBars: 0 },\r\n })\r\n\r\n chart.updateAttributes({ quote })\r\n toggleStaticElement()\r\n }\r\n\r\n fetchAndMapInitialQuote()\r\n }, [chartLayoutModel, config.charts, toggleStaticElement])\r\n\r\n return \r\n}\r\n\r\nexport const ManualInitQuoteHeader = withCompleteLayoutModelInit(withQuotePolling(ManualInitQuoteHeaderComponent))\r\n\r\nexport function QuoteHeaderContent({ data }: { data: HeaderPricesContext | null }) {\r\n if (!data) return null\r\n\r\n const isChange = Number.isFinite(data.prevClose)\r\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\r\n const lastTime = data.lastTime ? getDate(data.lastTime * 1000) : null\r\n const lastDate = !lastTime && data.lastDate ? formatDate(data.lastDate, 'yyyyMMdd', 'MMM dd, yyyy') : null\r\n const afterDate = data.afterTime ? getDate(data.afterTime * 1000) : null\r\n\r\n let afterhoursTitle\r\n if (lastTime && afterDate) {\r\n if (dateFns.isBefore(afterDate, lastTime)) afterhoursTitle = 'Premarket'\r\n else afterhoursTitle = 'Aftermarket'\r\n }\r\n\r\n return (\r\n <>\r\n {isChange && (\r\n \r\n )}\r\n {isAfterChange && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as d3 from 'd3'\r\nimport { Component, RefObject, createRef } from 'react'\r\n\r\nexport interface Bar {\r\n name: string\r\n value: number\r\n}\r\n\r\ninterface BarChartProps {\r\n title?: string\r\n data: Bar[]\r\n width?: number\r\n height?: number\r\n valueFormatter?: (value: number) => string\r\n xAxisRotate?: boolean\r\n marginRight?: number\r\n className?: string\r\n}\r\n\r\nexport default class BarChart extends Component {\r\n svgRef: RefObject = createRef()\r\n\r\n declare _prevData: Bar[]\r\n\r\n componentDidMount() {\r\n this.renderChart()\r\n }\r\n\r\n componentDidUpdate() {\r\n this.renderChart()\r\n }\r\n\r\n renderChart() {\r\n const { data, title } = this.props\r\n if (data === this._prevData) {\r\n return\r\n }\r\n this._prevData = data\r\n this.svgRef.current!.innerHTML = ''\r\n\r\n const xAxisRotate = this.props.xAxisRotate === true\r\n\r\n const margin = {\r\n top: title ? 20 : 10,\r\n right: this.props.marginRight || 60,\r\n bottom: xAxisRotate ? 70 : 20,\r\n left: 15,\r\n }\r\n const totalWidth = this.props.width || 440\r\n const totalHeight = this.props.height || 330\r\n const width = totalWidth - margin.left - margin.right\r\n const height = totalHeight - margin.top - margin.bottom\r\n\r\n const x = d3\r\n .scaleBand()\r\n .domain(data.map((d) => d.name))\r\n .rangeRound([0, width])\r\n .padding(0.1)\r\n\r\n let min = d3.min(data, (d: Bar) => d.value)!\r\n if (min < 0) {\r\n min = d3.min(data, (d: Bar) => Math.min(d.value, -d.value))!\r\n } else {\r\n min = 0\r\n }\r\n\r\n const y = d3\r\n .scaleLinear()\r\n .range([height, 0])\r\n .domain([min, d3.max(data, (d: Bar) => Math.abs(d.value))!])\r\n .nice()\r\n const yFormat = this.props.valueFormatter ? this.props.valueFormatter : y.tickFormat()\r\n\r\n const svg = d3\r\n .select(this.svgRef.current)\r\n .property('value', [])\r\n .append('g')\r\n .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')\r\n\r\n const xAxis = d3.axisBottom(x)\r\n const yAxis = d3.axisRight(y).ticks(height > 200 ? 10 : 5)\r\n\r\n const makeYLines = () => d3.axisLeft(y)\r\n // @ts-expect-error - tickFormat arg can be any string\r\n svg.append('g').attr('class', 'grid').call(makeYLines().tickSize(-width).tickSizeOuter(0).tickFormat(''))\r\n\r\n svg\r\n .append('g')\r\n .attr('class', 'x-axis axis')\r\n .attr('transform', 'translate(0,' + height + ')')\r\n .call(xAxis)\r\n\r\n svg\r\n .selectAll('.x-axis text')\r\n .style('text-anchor', xAxisRotate ? 'end' : 'middle')\r\n .attr('dx', xAxisRotate ? '-.8em' : 0)\r\n .attr('dy', xAxisRotate ? '.15em' : '0.8em')\r\n .attr('transform', 'rotate(' + (xAxisRotate ? -65 : 0) + ')')\r\n\r\n svg\r\n .append('g')\r\n .attr('class', 'y-axis axis')\r\n .attr('transform', 'translate(' + width + ', 0)')\r\n .call(yAxis)\r\n\r\n if (title) {\r\n svg\r\n .append('text')\r\n .attr('class', 'bar-chart-title')\r\n .attr('x', 4)\r\n .attr('y', -5)\r\n .attr('text-anchor', 'start')\r\n .text(title)\r\n }\r\n\r\n const getHeight = (d: Bar) => {\r\n let height = Math.abs(y(d.value ?? 0) - y(0))\r\n if (d.value > 0 || d.value < 0) {\r\n height = Math.max(height, 0.5)\r\n }\r\n return height\r\n }\r\n const isOutside = (height: number) => height < 14\r\n const bars = svg.selectAll('.bar').data(data)\r\n bars\r\n .enter()\r\n .append('rect')\r\n .attr('class', function (d: Bar) {\r\n return 'bar bar--' + (d.value < 0 ? 'negative' : 'positive')\r\n })\r\n .attr('x', (d: Bar) => x(d.name)!)\r\n .attr('y', (d: Bar) => y(Math.max(0, d.value)))\r\n .attr('height', getHeight)\r\n .attr('width', x.bandwidth())\r\n .attr('ry', FinvizSettings?.hasRedesignEnabled ? 2 : 0)\r\n\r\n svg\r\n .selectAll('.bar-label')\r\n .data(data)\r\n .enter()\r\n .append('text')\r\n .attr('class', 'divergence')\r\n .attr('x', (d: Bar) => x(d.name)! + x.bandwidth() / 2)\r\n .attr('y', (d: Bar) => {\r\n const height = getHeight(d)\r\n const outside = isOutside(height)\r\n if (d.value < 0) {\r\n return y(Math.max(0, d.value)) + height + (outside ? 12 : -4)\r\n }\r\n return y(Math.max(0, d.value)) + (outside ? -4 : 12)\r\n })\r\n .attr('fill', (d: Bar) => (!FinvizSettings.hasDarkTheme && isOutside(getHeight(d)) ? 'black' : 'white'))\r\n .attr('text-anchor', 'middle')\r\n .attr('font-size', '10px')\r\n .text((d: Bar) => (d.value !== null ? yFormat(d.value) : ''))\r\n\r\n this.svgRef.current!.style.width = totalWidth + 'px'\r\n this.svgRef.current!.style.height = totalHeight + 'px'\r\n }\r\n\r\n render() {\r\n return \r\n }\r\n}\r\n","export enum StatementsDataEnum {\r\n yoyChange = 'yoyChange',\r\n yoyChangePct = 'yoyChangePct',\r\n}\r\n\r\nexport enum StatementsTimeframeEnum {\r\n annual = 'annual',\r\n quarterly = 'quarterly',\r\n}\r\n\r\nexport const SETTINGS_COOKIE_KEY = 'quoteStatementsTableSettings'\r\n\r\nexport const DEFAULT_SETTINGS = {\r\n [StatementsDataEnum.yoyChange]: false,\r\n [StatementsDataEnum.yoyChangePct]: false,\r\n statementsTimeframe: StatementsTimeframeEnum.annual,\r\n}\r\n\r\nexport type StatementsType = {\r\n [StatementsDataEnum.yoyChange]: boolean\r\n [StatementsDataEnum.yoyChangePct]: boolean\r\n statementsTimeframe: StatementsTimeframeEnum\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as d3 from 'd3'\r\nimport { isRedesignEnabled } from 'finviz-charts/app/utils'\r\nimport { decodeQueryString } from 'finviz-charts/app/utils/query_string'\r\nimport * as React from 'react'\r\nimport { Component, RefObject, createRef } from 'react'\r\n\r\nimport { AdTag, getInvestingChannelPage } from '../../../../../app/shared/components/Ads'\r\nimport { Icon } from '../../../../components'\r\nimport { ChipSwitch, ChipSwitchButton } from '../../../../components/ChipSwitch'\r\nimport { RedGreenText } from '../../../../components/RedGreenText'\r\nimport { FinancialsTableContextProvider, useFinancialsTableContext } from '../../../../components/financials-table'\r\nimport { getValue, setValue } from '../../../../services/local-storage'\r\nimport { shortFormatNumber } from '../../../../util'\r\nimport BarChartBig from '../barChart'\r\nimport {\r\n DEFAULT_SETTINGS,\r\n SETTINGS_COOKIE_KEY,\r\n StatementsDataEnum,\r\n StatementsTimeframeEnum,\r\n StatementsType,\r\n} from './constants'\r\n\r\ninterface Bar {\r\n name: string\r\n value: number\r\n}\r\n\r\ninterface BarChartProps {\r\n data: Bar[]\r\n}\r\n\r\nclass BarChart extends Component {\r\n svgRef: RefObject\r\n\r\n constructor(props: BarChartProps) {\r\n super(props)\r\n this.svgRef = createRef()\r\n }\r\n\r\n componentDidMount() {\r\n this.renderChart()\r\n }\r\n\r\n componentDidUpdate() {\r\n this.renderChart()\r\n }\r\n\r\n renderChart() {\r\n const data = this.props.data\r\n\r\n const barWidth = 3\r\n const width = data.length * (barWidth + 1)\r\n const height = 16\r\n\r\n const x = d3\r\n .scaleBand()\r\n .domain(data.map((d) => d.name))\r\n .range([0, width])\r\n\r\n let min = d3.min(data, (d: Bar) => d.value)!\r\n if (min < 0) {\r\n min = d3.min(data, (d: Bar) => Math.min(d.value, -d.value))!\r\n } else {\r\n min = 0\r\n }\r\n\r\n const y = d3\r\n .scaleLinear()\r\n .range([height, 0])\r\n .domain([min, d3.max(data, (d: Bar) => Math.abs(d.value))] as [number, number])\r\n .nice()\r\n .unknown(height / 2)\r\n\r\n const svg = d3.select(this.svgRef.current).property('value', [])\r\n\r\n const bars = svg.selectAll('.bar').data(data)\r\n bars\r\n .enter()\r\n .append('rect')\r\n .attr('class', function (d: Bar) {\r\n return 'bar bar--' + (d.value < 0 ? 'negative' : 'positive')\r\n })\r\n .attr('x', function (d: Bar) {\r\n return x(d.name)!\r\n })\r\n .attr('y', function (d: Bar) {\r\n return y(Math.max(0, d.value))\r\n })\r\n .attr('height', function (d: Bar) {\r\n let height = Math.abs(y(d.value) - y(0))\r\n if (d.value > 0 || d.value < 0) {\r\n height = Math.max(height, 0.5)\r\n }\r\n return height\r\n })\r\n .attr('width', barWidth)\r\n bars\r\n .transition()\r\n .attr('class', function (d: Bar) {\r\n return 'bar bar--' + (d.value < 0 ? 'negative' : 'positive')\r\n })\r\n .attr('x', function (d: Bar) {\r\n return x(d.name)!\r\n })\r\n .attr('y', function (d: Bar) {\r\n return y(Math.max(0, d.value))\r\n })\r\n .attr('height', function (d: Bar) {\r\n let height = Math.abs(y(d.value) - y(0))\r\n if (d.value > 0 || d.value < 0) {\r\n height = Math.max(height, 0.5)\r\n }\r\n return height\r\n })\r\n .attr('width', barWidth)\r\n bars.exit().remove()\r\n\r\n this.svgRef.current!.style.width = width + 'px'\r\n this.svgRef.current!.style.height = height + 'px'\r\n }\r\n\r\n render() {\r\n return \r\n }\r\n}\r\n\r\nfunction EliteHoverAd() {\r\n return (\r\n
\r\n
\r\n \r\n

Upgrade your FINVIZ experience

\r\n

\r\n Join thousands of traders who make more informed decisions with our premium features. Real-time\r\n quotes, advanced visualizations, historical statements, and much more.\r\n

\r\n \r\n Learn more\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\ninterface BarChartWrapperProps {\r\n data: Bar[]\r\n}\r\n\r\nclass BarChartWrapper extends Component {\r\n state = {\r\n hover: false,\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n x.value !== null)}>\r\n \r\n \r\n \r\n {FinvizSettings.hasUserPremium ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nconst DEFAULT_SOURCE = 'F'\r\n\r\nconst _getDefaultSource = (): 'F' | 'R' => {\r\n if (!FinvizSettings.hasUserPremium) {\r\n return DEFAULT_SOURCE\r\n }\r\n\r\n return getValue('statements-source', DEFAULT_SOURCE) === 'R' ? 'R' : 'F'\r\n}\r\n\r\nconst getTimeframeFromStatementsSettingsTimeframe = (statementsTimeframe: StatementsTimeframeEnum) => {\r\n if (statementsTimeframe === StatementsTimeframeEnum.quarterly) {\r\n return 'Q'\r\n }\r\n\r\n // statementsTimeframe === StatementsTimeframeEnum.annual or fallback\r\n return 'A'\r\n}\r\n\r\ninterface StatementsState {\r\n source: 'F' | 'R'\r\n sheet: string\r\n currency: string | null\r\n data: Record | null\r\n}\r\n\r\nfunction StatementsComponent() {\r\n const { settings } = useFinancialsTableContext()\r\n const pageRef = React.useRef(getInvestingChannelPage())\r\n\r\n const [state, setState] = React.useState({\r\n source: _getDefaultSource(),\r\n sheet: 'I',\r\n currency: null,\r\n data: null,\r\n })\r\n\r\n const timeframe = getTimeframeFromStatementsSettingsTimeframe(settings.statementsTimeframe)\r\n\r\n const { data } = state\r\n const hasData = data && !data.error && Object.keys(data).length > 0\r\n const hasRedesignEnabled = FinvizSettings?.hasRedesignEnabled\r\n\r\n const _fetch = async () => {\r\n const { source, sheet } = state\r\n const { t } = decodeQueryString()\r\n\r\n try {\r\n const response = await fetch(`/api/statement.ashx?t=${t}&so=${source}&s=${sheet}${timeframe}`)\r\n const json = await response.json()\r\n\r\n setState({\r\n ...state,\r\n currency: json.currency,\r\n data: json.error ? json : json.data,\r\n })\r\n } catch {}\r\n }\r\n\r\n React.useEffect(() => {\r\n pageRef.current = getInvestingChannelPage()\r\n pageRef.current?.create()\r\n\r\n return () => {\r\n pageRef.current?.destroy()\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n _fetch()\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [state.sheet, state.source, timeframe])\r\n\r\n const _renderSheetLink = (id: string, text: string) => (\r\n // eslint-disable-next-line jsx-a11y/anchor-is-valid\r\n {\r\n e.preventDefault()\r\n setState({\r\n ...state,\r\n sheet: id,\r\n })\r\n }}\r\n >\r\n {text}\r\n \r\n )\r\n\r\n if (data === null) {\r\n return null\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {FinvizSettings.hasUserPremium && (\r\n // TODO fix classname when css mixins removal is merged\r\n {\r\n e.preventDefault()\r\n const source = e.target.value === 'R' ? 'R' : 'F'\r\n setState({\r\n ...state,\r\n source: source,\r\n })\r\n setValue('statements-source', source, DEFAULT_SOURCE, false)\r\n }}\r\n >\r\n \r\n \r\n \r\n )}\r\n {FinvizSettings.hasUserPremium && <>   }\r\n\r\n \r\n {_renderSheetLink('I', 'Income Statement')} {' '}\r\n {_renderSheetLink('B', 'Balance Sheet')} {' '}\r\n {_renderSheetLink('C', 'Cash Flow')}\r\n \r\n \r\n \r\n
\r\n {hasData && }\r\n {!hasData && (\r\n \r\n \r\n \r\n \r\n The statement is not available. Try switching between FactSet-Reuters source.\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction Statements() {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nfunction StatementsSettingsSection() {\r\n const { settings, setSettings } = useFinancialsTableContext()\r\n\r\n const toggleSetting = (key: keyof StatementsType, value: StatementsType[keyof StatementsType]) => {\r\n setSettings({\r\n ...settings,\r\n [key]: value,\r\n })\r\n }\r\n\r\n const yoyGrowthLabel = React.useMemo(() => {\r\n const isQuarterlyTimeframe = settings.statementsTimeframe === StatementsTimeframeEnum.quarterly\r\n\r\n if (isQuarterlyTimeframe) {\r\n return 'QoQ Growth'\r\n }\r\n\r\n return 'YoY Growth'\r\n }, [settings.statementsTimeframe])\r\n\r\n return (\r\n
\r\n \r\n {\r\n toggleSetting(StatementsDataEnum.yoyChange, !settings[StatementsDataEnum.yoyChange])\r\n }}\r\n >\r\n {yoyGrowthLabel}\r\n \r\n {\r\n toggleSetting(StatementsDataEnum.yoyChangePct, !settings[StatementsDataEnum.yoyChangePct])\r\n }}\r\n >\r\n {`${yoyGrowthLabel} %`}\r\n \r\n \r\n\r\n \r\n {\r\n toggleSetting('statementsTimeframe', StatementsTimeframeEnum.annual)\r\n }}\r\n >\r\n Annual\r\n \r\n {\r\n toggleSetting('statementsTimeframe', StatementsTimeframeEnum.quarterly)\r\n }}\r\n >\r\n Quarterly\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nfunction isChartable(label: string) {\r\n switch (label) {\r\n case 'Period End Date':\r\n case 'Period Length':\r\n return false\r\n }\r\n\r\n return true\r\n}\r\n\r\nfunction parseData(data: Record, skipFirst: boolean) {\r\n const parsed: any = {}\r\n Object.keys(data).forEach((key) => {\r\n parsed[key] = data[key]\r\n .map((value, index) => {\r\n if (isChartable(key)) {\r\n let parsedValue\r\n if (value === '') {\r\n parsedValue = null\r\n } else {\r\n parsedValue = parseFloat(value.replace(/,/g, ''))\r\n }\r\n return {\r\n name: data['Period End Date'][index],\r\n value: parsedValue,\r\n }\r\n }\r\n return null\r\n })\r\n .slice(skipFirst ? 1 : 0)\r\n })\r\n\r\n return parsed as Record>\r\n}\r\n\r\nfunction isHighlightRow(label: string) {\r\n switch (label) {\r\n case 'Period End Date':\r\n case 'Total Revenue':\r\n case 'Total Premiums Earned':\r\n case 'Interest Income':\r\n case 'Gross Profit':\r\n case 'Total Operating Expense':\r\n case 'Operating Income':\r\n case 'Net Income Before Taxes':\r\n case 'Net Income':\r\n case 'Total Current Assets':\r\n case 'Total Assets':\r\n case 'Total Current Liabilities':\r\n case 'Total Liabilities':\r\n case 'Total Equity':\r\n case 'Total Liabilities and Equity':\r\n case 'Cash from Operating Activities':\r\n case 'Cash from Investing Activities':\r\n case 'Cash from Financing Activities':\r\n case 'Net Change in Cash':\r\n case 'Price To Earnings Ratio':\r\n case 'Price to Book Ratio':\r\n case 'Price to Free Cash Flow':\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\ntype StatementsTableProps = Pick\r\n\r\nfunction StatementsTable({ data, currency }: StatementsTableProps) {\r\n const { settings } = useFinancialsTableContext()\r\n const skipFirst = data?.['Period End Date'][0] === 'TTM'\r\n const parsedData = data ? parseData(data, skipFirst) : null\r\n\r\n const yoyData = React.useMemo(\r\n () =>\r\n parsedData\r\n ? Object.entries(parsedData).reduce<\r\n Record<\r\n string,\r\n {\r\n change: Array\r\n changePct: Array\r\n }\r\n >\r\n >((acc, [key, values]) => {\r\n if (!isChartable(key)) {\r\n return acc\r\n }\r\n const yoyData: Array<{ change: number | null; changePct: number | null }> = []\r\n let lastValue: number | null = null\r\n\r\n // values are in DESC order\r\n const reversedValues = [...values].reverse()\r\n\r\n reversedValues.forEach(({ value }) => {\r\n const isValidValue = typeof value === 'number'\r\n if (!isValidValue || lastValue === null || lastValue === 0) {\r\n yoyData.push({ change: null, changePct: null })\r\n } else {\r\n const change = value - lastValue\r\n yoyData.push({ change, changePct: (change / Math.abs(lastValue)) * 100 })\r\n }\r\n\r\n if (isValidValue) lastValue = value\r\n })\r\n\r\n const reversedYoyData = [...yoyData].reverse()\r\n return {\r\n ...acc,\r\n [key]: {\r\n change: reversedYoyData.map(({ change }) => change),\r\n changePct: reversedYoyData.map(({ changePct }) => changePct),\r\n },\r\n }\r\n }, {})\r\n : {},\r\n [parsedData]\r\n )\r\n\r\n const yoyGrowthLabel = React.useMemo(() => {\r\n const isQuarterlyTimeframe = settings.statementsTimeframe === StatementsTimeframeEnum.quarterly\r\n\r\n if (isQuarterlyTimeframe) {\r\n return 'QoQ Growth'\r\n }\r\n\r\n return 'YoY Growth'\r\n }, [settings.statementsTimeframe])\r\n\r\n if (!data || !parsedData) return null\r\n\r\n const hasRedesignEnabled = FinvizSettings?.hasRedesignEnabled\r\n const cellClass = classnames('align-top', {\r\n 'snapshot-td2 h-6 !leading-4 !pt-[4px]': !hasRedesignEnabled,\r\n })\r\n const adRowIndexStart = !hasRedesignEnabled && data['Period Length'] ? 2 : 1\r\n\r\n return (\r\n <>\r\n \r\n \r\n {Object.keys(data).map((key, rowIndex) => {\r\n const hasYoYData = !!yoyData[key] && data[key].some((value) => value)\r\n return (\r\n \r\n \r\n {key}\r\n {hasYoYData && settings[StatementsDataEnum.yoyChange] && (\r\n <>\r\n
\r\n {yoyGrowthLabel}\r\n \r\n )}\r\n {hasYoYData && settings[StatementsDataEnum.yoyChangePct] && (\r\n <>\r\n
\r\n {`${yoyGrowthLabel} %`}\r\n \r\n )}\r\n \r\n \r\n {isChartable(key) && }\r\n \r\n {data[key].map((value, index) => {\r\n const changeIndex = skipFirst ? index - 1 : index\r\n const yoyChangeValue = yoyData[key]?.change[changeIndex] ?? null\r\n const yoyChangePctValue = yoyData[key]?.changePct[changeIndex] ?? null\r\n if (!FinvizSettings.hasUserPremium) {\r\n if (rowIndex === adRowIndexStart && index === 3) {\r\n return (\r\n \r\n \r\n \r\n

Upgrade your FINVIZ experience

\r\n

\r\n Join thousands of traders who make more informed decisions with our premium\r\n features. Real-time quotes, advanced visualizations, historical statements, and much\r\n more.\r\n

\r\n \r\n Learn more\r\n \r\n \r\n )\r\n }\r\n if (\r\n index > 2 &&\r\n ((hasRedesignEnabled && key !== 'Period End Date') ||\r\n (key !== 'Period End Date' && key !== 'Period Length'))\r\n ) {\r\n return null\r\n }\r\n }\r\n\r\n return (\r\n \r\n {value}\r\n {hasYoYData && settings[StatementsDataEnum.yoyChange] && (\r\n <>\r\n
\r\n \r\n {shortFormatNumber(yoyChangeValue, { defaultValue: '—' })}\r\n \r\n \r\n )}\r\n {hasYoYData && settings[StatementsDataEnum.yoyChangePct] && (\r\n <>\r\n
\r\n \r\n {yoyChangePctValue?.toFixed(2) ?? '—'}\r\n \r\n \r\n )}\r\n \r\n )\r\n })}\r\n \r\n )\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
values in Millions, {currency}
\r\n \r\n )\r\n}\r\n\r\nexport default Statements\r\n","import classNames from 'classnames'\r\nimport { isRedesignEnabled } from 'finviz-charts/app/utils'\r\nimport React from 'react'\r\n\r\nimport { ChartTypesSelect, StockDetailTimeframeBar } from '../../../../app/charts-lib'\r\nimport { Button } from '../../../components'\r\nimport { SpecificChartFunctionality } from '../../../constants'\r\nimport { QuoteContext } from '../QuoteContext'\r\n\r\ninterface Props {\r\n isStockDetailUpdating: boolean\r\n}\r\n\r\nconst hasRedesign = isRedesignEnabled()\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\n\r\nexport function StaticChartHeader({ isStockDetailUpdating }: Props) {\r\n const { index, ticker, period } = React.useContext(QuoteContext)\r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n Share\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { round } from '../../../../app/backtest/utils'\r\nimport { parseRouteInitData } from '../../../util-routing'\r\nimport { QuoteContext } from '../QuoteContext'\r\nimport BarChart, { Bar } from './barChart'\r\n\r\nfunction convertData(endYear: number, values: any[]) {\r\n return values.map((value, index) => ({ name: endYear - index, value })).reverse() as unknown as Bar[]\r\n}\r\n\r\ninterface FAChartProps {\r\n year: number\r\n data: number[]\r\n title: string\r\n smallRoundPlaces?: number\r\n largeRoundPlaces?: number\r\n smallScale?: number\r\n largeScale?: number\r\n smallTitleSufix?: string\r\n largeTitleSufix?: string\r\n}\r\n\r\nfunction FAChart({\r\n year,\r\n data,\r\n title,\r\n smallRoundPlaces = 2,\r\n largeRoundPlaces = 0,\r\n smallScale = 1,\r\n largeScale = 1,\r\n smallTitleSufix = '',\r\n largeTitleSufix = '',\r\n}: FAChartProps) {\r\n const range = Math.max(...data.map((value) => Math.abs(value)).filter(Number))\r\n const isLarge = Math.abs(range) >= 1000\r\n const scale = isLarge ? largeScale : smallScale\r\n const values = data.map((value) => {\r\n const rounded = round(scale * value, isLarge ? largeRoundPlaces : smallRoundPlaces)\r\n return value == null || Number.isNaN(rounded) ? null : rounded\r\n })\r\n\r\n return (\r\n round(value, isLarge ? largeRoundPlaces : smallRoundPlaces)}\r\n width={280}\r\n height={150}\r\n marginRight={37}\r\n className=\"is-fa\"\r\n />\r\n )\r\n}\r\n\r\nexport default function FundamentalCharts() {\r\n const { index } = React.useContext(QuoteContext)\r\n\r\n const routeData = React.useMemo(\r\n () =>\r\n parseRouteInitData<{ year: number; values: Array }>({\r\n elementId: `fa-init-data-${index}`,\r\n removeElement: false,\r\n }),\r\n [index]\r\n )\r\n\r\n if (!routeData) return null\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","export const etfHoldingsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"etf-holdings-widget\" */ './module-entry'),\r\n cacheKey: 'etf-holdings-widget',\r\n}\r\n","import { withNotificationContext } from '../../../components/notification'\r\nimport { Spinner } from '../../../components/spinner'\r\nimport { useAsyncModule } from '../../../services/async-modules-utils'\r\nimport { etfHoldingsAsyncModule } from './async-modules'\r\n\r\nfunction LoadingFallback() {\r\n const widgetClass =\r\n 'ml-3 mt-3 flex max-h-85 min-h-85 min-w-152 max-w-175 shrink grow basis-0 rounded-md border border-primary justify-center items-center'\r\n return (\r\n
\r\n {Array.from(Array(2)).map((_, index) => (\r\n
\r\n \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n\r\nfunction ETFHoldings() {\r\n const [etfHoldingsModule] = useAsyncModule({\r\n ...etfHoldingsAsyncModule,\r\n shouldLoadModule: true,\r\n errorSeverity: 'high',\r\n })\r\n const ETFHoldingsComponent = etfHoldingsModule?.ETFHoldings\r\n return ETFHoldingsComponent ? : \r\n}\r\n\r\nexport default withNotificationContext(ETFHoldings)\r\n","import * as React from 'react'\r\n\r\nimport { QuoteNavigation } from './Navigation'\r\nimport { QuoteContext } from './QuoteContext'\r\nimport { Perf } from './components/ComparePerformance'\r\nimport { FundFlowsChart } from './components/FundFlowsChart'\r\nimport { InsiderTradingVolumeChart } from './components/InsiderTradingChart'\r\nimport { InstitutionalOwnership } from './components/InstitutionalOwnership'\r\nimport { QuotePortal } from './components/Portal'\r\nimport { ChartContextQuoteHeader, ManualInitQuoteHeader } from './components/Price'\r\nimport { QuoteChart } from './components/QuoteChart'\r\nimport Statements from './components/Statements/statements'\r\nimport { StaticChartHeader } from './components/StaticChartHeader'\r\nimport FundamentalCharts from './components/fundamentalCharts'\r\nimport EtfHoldings from './etf-holdings'\r\nimport { QuoteSubview, QuoteView } from './types'\r\n\r\nconst PRICE_STATIC = document.querySelectorAll('.js-quote-price-static')\r\nconst PRICE_ROOTS = document.querySelectorAll('.js-quote-price-root')\r\n\r\nconst NAVIGATION_STATIC = document.querySelectorAll('.js-quote-navigation-static')\r\nconst NAVIGATION_ROOTS = document.querySelectorAll('.js-quote-navigation-root')\r\n\r\nconst STATIC_CHART_HEADER_ROOTS = document.querySelectorAll('.quote-menu')\r\n\r\nconst FUNDAMENTAL_CHARTS_ROOTS = document.querySelectorAll('.js-quote-fa')\r\n\r\nconst STATEMENTS_ROOTS = document.querySelectorAll('#statements')\r\n\r\nconst INSIDER_CHART_ROOTS = document.querySelectorAll('.insider-trading-chart')\r\n\r\nconst MANAGERS_AND_FUNDS_ROOTS = document.querySelectorAll('.managers-and-funds')\r\n\r\nexport function QuotePortalComponents({ isStockDetailUpdating }: { isStockDetailUpdating: boolean }) {\r\n const context = React.useContext(QuoteContext)\r\n\r\n const ETF_HOLDINGS_STATIC = document.querySelector(`.js-etf-holdings-static-${context.ticker}`)\r\n const ETF_HOLDINGS_ROOTS = document.querySelector(`.js-etf-holdings-root-${context.ticker}`)\r\n const isETF = !!ETF_HOLDINGS_ROOTS && !!ETF_HOLDINGS_STATIC\r\n\r\n return (\r\n <>\r\n {context.index === 0 && !window.isIdeaNotFoundPage && (\r\n \r\n \r\n {context.view === QuoteView.ChartDetail || context.subview === QuoteSubview.ShortInterest ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n {context.view === QuoteView.ChartDetail && (\r\n \r\n {context.index === 0 && }\r\n\r\n {context.index > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {context.subview === QuoteSubview.ComparePerf && window.FinvizQuoteTickers && context.index === 0 && }\r\n\r\n {isETF && (\r\n \r\n <>\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { decodeQueryString } from '../../../../app/queryString'\r\n\r\nconst CORRELATION_LINKS_CONTAINER_SELECTOR = 'js-quote-correlation-links-container'\r\nconst MULTITICKER_CHART_ELEMENT_SELECTOR = 'js-multi-ticker-chart'\r\nconst SET_SEARCH_EXT_SELECTOR = 'js-set-search-ext-argument'\r\n\r\nexport function useStockDetailUpdater() {\r\n const location = useLocation()\r\n const { p, ty } = decodeQueryString(location.search)\r\n const isInitializedRef = React.useRef(false)\r\n const [isStockDetailUpdating, setIsStockDetailUpdating] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const multiTickerElements = document.getElementsByClassName(MULTITICKER_CHART_ELEMENT_SELECTOR)\r\n const correlationElements = document.getElementsByClassName(CORRELATION_LINKS_CONTAINER_SELECTOR)\r\n const abortController = new AbortController()\r\n\r\n if (isInitializedRef.current) {\r\n if (multiTickerElements.length > 0) setIsStockDetailUpdating(true)\r\n\r\n fetch(location.pathname + location.search, { signal: abortController.signal })\r\n .then((response) => response.text())\r\n .then((text) => {\r\n const virtualDOM = new DOMParser().parseFromString(text, 'text/html')\r\n\r\n // Multiticker update\r\n if (multiTickerElements.length > 0) {\r\n const multiTickerHtmlElements = Array.from(multiTickerElements) as HTMLImageElement[]\r\n const newMultiTickerHtmlElements = Array.from(\r\n virtualDOM.getElementsByClassName(MULTITICKER_CHART_ELEMENT_SELECTOR)\r\n ) as HTMLImageElement[]\r\n\r\n if (newMultiTickerHtmlElements?.length === multiTickerHtmlElements.length) {\r\n multiTickerHtmlElements.forEach((element, index) => {\r\n element.onload = () => setIsStockDetailUpdating(false)\r\n element.src = newMultiTickerHtmlElements[index].src\r\n })\r\n } else {\r\n setIsStockDetailUpdating(false)\r\n }\r\n }\r\n\r\n // Correlation update\r\n const correlationLinksTableCellHtmlElements = Array.from(correlationElements) as HTMLTableCellElement[]\r\n const newCorrelationLinksTableCellHtmlElements = Array.from(\r\n virtualDOM.getElementsByClassName(CORRELATION_LINKS_CONTAINER_SELECTOR)\r\n ) as HTMLTableCellElement[]\r\n\r\n if (newCorrelationLinksTableCellHtmlElements?.length === correlationLinksTableCellHtmlElements.length) {\r\n correlationLinksTableCellHtmlElements.forEach((element, index) => {\r\n element.innerHTML = newCorrelationLinksTableCellHtmlElements[index].innerHTML\r\n })\r\n }\r\n\r\n // Search function update\r\n const newsearchFunctionWrapperElement = virtualDOM.getElementById(SET_SEARCH_EXT_SELECTOR) as HTMLDivElement\r\n if (newsearchFunctionWrapperElement?.dataset.setSearchExtArgument) {\r\n FinvizSettings.quoteSearchExt = newsearchFunctionWrapperElement.dataset.setSearchExtArgument\r\n }\r\n })\r\n .catch((err) => {\r\n setIsStockDetailUpdating(false)\r\n if (err.name !== 'AbortError') {\r\n Sentry.captureException(err)\r\n }\r\n })\r\n }\r\n isInitializedRef.current = true\r\n return () => {\r\n abortController.abort()\r\n }\r\n // We don't want to trigger effect on any location change just if period or type change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [p, ty])\r\n\r\n return { isStockDetailUpdating }\r\n}\r\n","import { useSearchParams } from 'react-router-dom'\r\n\r\nimport { useCheckNonIdeaChartMissingConfig } from '../../../hooks/use-check-non-idea-chart-missing-config'\r\nimport { QuotePortalComponents } from '../PortalComponents'\r\nimport { QuoteContextProvider } from '../QuoteContext'\r\nimport { useStockDetailUpdater } from '../hooks/use-stock-detail-updater'\r\nimport { useToggleRatings } from '../hooks/useToggleRatings'\r\nimport { QuoteQuery } from '../types'\r\n\r\nexport default function QuoteSharedWrapper() {\r\n useCheckNonIdeaChartMissingConfig()\r\n useToggleRatings()\r\n\r\n const [query] = useSearchParams()\r\n const tickers = query.get(QuoteQuery.Ticker)!.split(',')\r\n const { isStockDetailUpdating } = useStockDetailUpdater()\r\n\r\n return tickers.map((ticker, index) => (\r\n \r\n \r\n \r\n ))\r\n}\r\n","import * as React from 'react'\r\n\r\nexport function useToggleRatings() {\r\n React.useEffect(() => {\r\n const revealButtons = document.querySelectorAll('.js-reveal-ratings-button')\r\n\r\n function onToggleRatingsClick(ev: MouseEvent) {\r\n ev.preventDefault()\r\n\r\n const button = ev.currentTarget as HTMLElement\r\n const ratingsRowWithTable = button.previousElementSibling\r\n\r\n ratingsRowWithTable?.querySelectorAll('table tr').forEach((rating, index, rows) => {\r\n if (rating.classList.contains('is-last')) {\r\n rating.classList.remove('is-last')\r\n }\r\n\r\n rating.classList.remove('hidden')\r\n\r\n if (index === rows.length - 1) {\r\n rating.classList.add('is-last')\r\n }\r\n })\r\n\r\n button.classList.add('hidden')\r\n window.gtag && window.gtag('event', 'click', { event_category: 'reveal-ratings' })\r\n }\r\n\r\n revealButtons.forEach((button) => button.addEventListener('click', onToggleRatingsClick))\r\n\r\n return () => {\r\n revealButtons.forEach((button) => button.removeEventListener('click', onToggleRatingsClick))\r\n }\r\n }, [])\r\n}\r\n","import { isForexFuturesCryptoPage } from 'finviz-charts/app/utils/chart'\r\nimport * as React from 'react'\r\n\r\nimport {\r\n RootChartConfigObject,\r\n getIntradayChartConfig,\r\n useChartLayoutGlobalModelAsync,\r\n useModelState,\r\n} from '../../../../app/charts-lib'\r\nimport { TIMEFRAME } from '../../../constants'\r\nimport { useWindowSize } from '../../../hooks/use-window-size'\r\n\r\nexport function getChartLayoutSizeConfig(\r\n layoutConfig: Pick<\r\n RootChartConfigObject,\r\n 'idea' | 'barWidth' | 'barMargin' | 'charts' | 'specificChartFunctionality'\r\n >,\r\n p = TIMEFRAME.d\r\n) {\r\n const { clientWidth } = document.body\r\n const { premarket, aftermarket, dateRange } = layoutConfig.charts[0]\r\n const maxChartWidth = clientWidth - 40 // 40px left right chart padding = (19px * 2 for margin left/right) + (1px * 2 for border)\r\n let width = 990\r\n let barWidth = 3\r\n let barMargin = 1\r\n let timeframeMinutes = 0\r\n const isForexFuturesCrypto =\r\n layoutConfig.specificChartFunctionality && isForexFuturesCryptoPage(layoutConfig.specificChartFunctionality)\r\n\r\n switch (p) {\r\n case TIMEFRAME.i1:\r\n timeframeMinutes = 1\r\n barWidth = 1\r\n if (premarket || aftermarket || clientWidth < 1650) {\r\n barMargin = 0\r\n }\r\n break\r\n case TIMEFRAME.i2:\r\n timeframeMinutes = 2\r\n break\r\n case TIMEFRAME.i3:\r\n timeframeMinutes = 3\r\n if (premarket && aftermarket && clientWidth <= 1505) {\r\n barWidth = 2\r\n }\r\n break\r\n case TIMEFRAME.i5:\r\n timeframeMinutes = 5\r\n barWidth = 5\r\n barMargin = clientWidth >= 1100 ? 2 : 1\r\n break\r\n case TIMEFRAME.i10:\r\n width = 1058 // 39bars per day * 5days * 5px per bar + 35px left offset + 48px right offset\r\n barMargin = 0\r\n break\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n width = 1019\r\n break\r\n case TIMEFRAME.h:\r\n width = 1008\r\n break\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n width = 1020\r\n break\r\n case TIMEFRAME.d:\r\n width = 1282\r\n break\r\n case TIMEFRAME.w:\r\n case TIMEFRAME.m:\r\n width = 994\r\n break\r\n }\r\n\r\n switch (p) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n const commonProps = {\r\n timeframeMinutes,\r\n barWidthWithMargin: barWidth + 2 + barMargin,\r\n hasAftermarket: aftermarket,\r\n hasPremarket: premarket,\r\n }\r\n width = getIntradayChartConfig({\r\n ...commonProps,\r\n maxWidth: maxChartWidth,\r\n canCropChart: !dateRange,\r\n }).chartWidthWithOffset\r\n break\r\n }\r\n\r\n // If FFC chart use DAILY type width\r\n if (isForexFuturesCrypto) width = 1282\r\n\r\n // If chart is wider than available space in vieport override width\r\n if (maxChartWidth <= width) {\r\n width = Math.max(994, maxChartWidth)\r\n if (p === TIMEFRAME.d) {\r\n barWidth = 2\r\n barMargin = 0\r\n width = 991\r\n }\r\n }\r\n\r\n // If idea chart or FFC chart use bar configs from layout\r\n if (layoutConfig.idea || isForexFuturesCrypto) {\r\n barWidth = layoutConfig.barWidth!\r\n barMargin = layoutConfig.barMargin!\r\n }\r\n\r\n return {\r\n width,\r\n barWidth,\r\n barMargin,\r\n }\r\n}\r\n\r\nexport function useChartLayoutWidthWatch() {\r\n const { innerWidth } = useWindowSize()\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const unwatchedFirstChart = React.useMemo(() => chartLayoutModel?.charts().all()[0] ?? null, [chartLayoutModel])\r\n const chartModel = useModelState(unwatchedFirstChart, { watchProperties: ['quote'] })\r\n const quote = useModelState(chartModel?.quote() ?? null, { watchProperties: ['ticker', 'timeframe', 'isFetching'] })\r\n const ideaId = chartLayoutModel?.idea?.id\r\n\r\n React.useEffect(() => {\r\n const settings = !ideaId ? chartLayoutModel?.settings : null\r\n const timeframe = quote?.timeframe\r\n if (chartLayoutModel && timeframe && settings) {\r\n const { width, barWidth, barMargin } = getChartLayoutSizeConfig(chartLayoutModel.toConfig(), timeframe)\r\n const newSettings = JSON.parse(JSON.stringify(settings))\r\n newSettings.ChartSettings.center.barWidth = barWidth\r\n newSettings.IndicatorSettings.center.barWidth = barWidth\r\n newSettings.ChartSettings.center.barMargin = barMargin\r\n newSettings.IndicatorSettings.center.barMargin = barMargin\r\n chartLayoutModel.updateAttributes({ width, settings: newSettings })\r\n }\r\n // We don't want to trigger this effect on any chartLayoutModel change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [quote?.premarket, quote?.aftermarket, quote?.timeframe, ideaId, innerWidth])\r\n}\r\n"],"names":["round","n","places","arguments","length","undefined","Math","Number","toFixed","format","totalReturn","maxDrawdown","sharpeRatio","calmarRatio","CAGR","cagr","volatility","numberOfTrades","positiveDays","negativeDays","bestMonth","worstMonth","figureSpace","BACKTEST_MIN_MAX_DATES","Object","freeze","min","Date","max","getStaticChartConfig","_ref","width","height","ticker","timeframe","paneElements","specificChartFunctionality","SpecificChartFunctionality","default","colorsOverride","theme","colors","getCustomColorsFromCookies","refreshData","layout","LayoutType","barWidth","barMargin","scrollable","editable","charts","premarket","aftermarket","dateRange","scale","ScaleType","Linear","leftOffset","instrument","Instrument","Stock","stretch","panes","elements","JSON","parse","getParsedCookies","IC_PUBLISHER_ID","AdTagName","tagDefinition","IC_TickerInContent","placements","style","minHeight","IC_MapsLeftRail","IC_Statements","IC_Groups","hasInvestingChannelAds","tracking","InvestingChannel","getInvestingChannelPage","page","create","_window$InvestingChan","window","InvestingChannelQueue","push","_window$FINVIZ_IC_UAT","_window$InvestingChan2","config","UAT","Run","e","console","error","destroy","_window$InvestingChan3","_page","useInvestingChannelAds","deps","React","AdTag","name","position","props","tagName","tagProps","placementName","_jsx","id","getInitChartConfig","initialConfig","initialTA","FinvizSettings","TA","stringify","hasUserPremium","Utils","isMobile","COTs","convertTa","CartesianGrid","vertical","RechartsCartesianGrid","stroke","strokeDasharray","className","classNames","displayName","LabelInner","color","viewBox","dx","dy","angle","children","x","y","_jsxs","fontSize","fontWeight","textAnchor","dominantBaseline","transform","CHART_ITEM_COLORS","Label","_ref2","RechartsLabel","content","DateFormat","dateAxisFormatter","value","outFormat","parseAsNY","breakOnYear","isFinite","getTime","date","getDate","getMonth","MonthSingleChar","getFullYear","toString","substring","XAxis","RechartsXAxis","defaultProps","tickLine","axisLine","tick","fill","dataKey","type","interval","useCheckNonIdeaChartMissingConfig","location","useLocation","i","decodeQueryString","search","isIdeaNotFoundPage","reload","useWindowSize","throttleWaitInMs","isWatching","size","setSize","clientWidth","document","documentElement","innerWidth","innerHeight","handleResize","throttle","addEventListener","cancel","removeEventListener","PADDING","getChartsDimensions","chartElementId","_box$width","_box$height","containerElement","getElementById","box","getBoundingClientRect","getChartConfig","idea","chartsDimensions","chartConfig","assign","FinvizChartsSettings","ideaChart","editors","newCharts","alignChartsToRight","tickers","map","index","periods","ranges","taConfig","getInstrumentForTicker","hasChartEvents","initIdeaQuotes","quotes","hasPatterns","includes","quote","hasOwnProperty","drawMinutesPerDay","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","ideaID","Quote","QuoteContext","period","TIMEFRAME","d","view","subview","QuoteContextProvider","query","useSearchParams","get","QuoteQuery","Type","Period","contextValue","getQuoteView","getQuoteSubview","Provider","QuoteChart","configOverride","TAOverride","chartEl","CHART_ELEMENT_ID","useChartLayoutWidthWatch","globalChartConfig","ideaQuotes","quoteData","p","defaultPeriod","sizeConfig","getChartLayoutSizeConfig","hasDarkTheme","Theme","dark","light","quotePage","chart","_chart$dateRange","FREE_DATE_RANGES","current","ReactDOM","ChartLayoutWithGlobalState","parentElement","QuotePortalContext","rootElement","staticElement","toggleStaticElement","QuotePortal","staticElements","roots","context","elementIndex","NodeList","Array","isArray","isEnabled","setIsEnabled","elementToHide","elementToShow","enabled","hideElement","element","classList","add","showElement","remove","toggleElements","toggleFn","forEach","useToggleStaticElements","portalContextValue","prevValue","ErrorBoundary","fallback","onError","QuoteLinksContext","chartLayoutModel","URL","href","QuoteLinksWrapper","info","_chartLayoutModel$act","isPremium","useChartLayoutGlobalModelAsync","chartModel","useModelState","activeChart","watchProperties","generateChartLayoutRouterPath","useChartModelCustomDateRangeValues","pathname","origin","useChartTimeframePathWatch","NavigationLink","isEliteOnly","utmCampaign","getLink","reloadDocument","preserveQueryKeys","Ticker","DateRange","removeQueryKeys","additionalQueryValues","quoteContext","linkContext","linkUrl","getElitePageLink","getNavigationLinkUrl","Link","to","CreateAlertLink","dialog","useDialogState","isVisible","useState","createAlertModule","useAsyncModule","createAlertAsyncModule","shouldLoadModule","CreateAlert","_Fragment","onClick","_window$gtag","_window","gtag","call","event_category","ctrlKey","metaKey","preventDefault","show","Dialog","state","Spinner","SaveToPortfolioLink","saveToPortfolioModule","saveToPortfolioAsyncModule","SaveToPortfolio","email","QuoteNavigation","hasShortInterest","dataset","shortinterest","QuoteView","ChartDetail","QuoteSubview","ComparePerf","ShortInterest","Financials","hasTrafficPageEnabled","Traffic","Options","LatestFilings","redesignEnabled","hasRedesignEnabled","colorScaleClass","monthNames","Chart","Component","constructor","_defineProperty","shouldComponentUpdate","nextProps","arr1","arr2","arraysEqual","this","render","_tickerQuote$0$ticker","_tickerQuote$","tickerQuote","select","q","close","ChartElementType","PerfChart","fromDate","fromDay","toDate","toDay","overlays","quotePerf","ref","containerRef","opacity","ChartLayout","Table","months","rows","groupsCount","ceil","tdClasses","classnames","trs","g","splice","month","row","col","monthIndex","parseFloat","total","cellPadding","cellSpacing","border","Perf","_this","super","_fetch","dailyQuotes","o","h","l","c","v","dateFromUnixTimestamp","open","high","low","volume","clearCachedData","updateAttributes","forceUpdate","async","isRefetch","t","setState","loading","all","fetchData","fetchType","QuoteFetchType","Refetch","NewerData","updateQuoteData","m","getAll","concat","tickersInput","getSanitizedTicker","split","filter","target","formattedDate","formatDateToStringUS","now","year","padStart","label","FinvizQuoteTickers","join","fromMonth","toMonth","minDate","dateFns","years","maxDate","from","monthsToShow","quotesPerf","obj","perf","cols","isNaN","onSubmit","_onSubmit","padding","onChange","top","right","display","DatePicker","newValue","_onDatePickerChange","readOnly","_onMonthChange","bind","option","componentDidMount","refetchQuotes","componentWillUnmount","unbind","ChartBox","FlowsChartDataKeys","AXIS_LABEL_OFFSET","tooltipValueFormatter","formatted","shortFormatDollar","Aum","RedGreenText","rightContent","FundFlowsChart","initData","routeData","parseRouteInitData","elementId","removeElement","dateStrToTimestamp","monthlyTicks","startingTimestamp","endingTimestamp","dayOfMonth","ticks","endingDate","initTimestamp","startDate","getMonthlyTicks","ChartWrapper","isHoverHighlight","ComposedChart","data","margin","left","domain","tickFormatter","MonthShort","YAxis","yAxisId","tickCount","orientation","dataMin","dataMax","absMax","abs","Tooltip","formatLabel","MonthShortDayNumYearFull","formatValue","TooltipRow","Flows","Line","dot","Bar","radius","CHART_HEIGHT","BAR_WIDTH","BarType","InsiderVolumeBar","newX","payload","isCenteredBar","saleAggregated","buyAggregated","Sale","Rectangle","background","BarInner","Buy","tooltipTitleFormatter","startOfMonth","endDate","endOfMonth","toLocaleString","startDay","tooltipDataFormatter","_","_fullTooltipPayload$","_fullTooltipPayload$2","fullTooltipPayload","insider","tradeCount","buyTransactionCount","saleTransactionCount","isZeroValue","valueToUse","defaultValue","InsiderTradingVolumeChart","_initData$data4","chartData","setChartData","hasInsiderTradingHistory","_initData$data","some","_initData$data2","monthlyData","fromTimestamp","toTimestamp","currentTimestamp","currentClose","barToDataIndex","filterDataForChart","getInstrument","options","cachePredicate","_initData$data3","fetchQuoteData","barGap","barCategoryGap","xAxisId","hide","cursor","CursorBar","numberOfDatapoints","valueClass","shape","InstitutionalOwnershipType","getInvestorLink","investorId","Funds","isRedesignEnabled","commonTdClassName","InstitutionalOwnership","managersItems","hasManagersItems","fundsItems","hasFundsItems","_initData$managersOwn","_initData$fundsOwners","managersOwnership","fundsOwnership","institutionalOwnership","setInstitutionalOwnership","Managers","items","Heading","level","ChipSwitch","rounding","ChipSwitchButton","disabled","active","TableBody","percOwnership","TableRow","TableCell","hasPadding","align","TableAlign","Right","formatNumber","suffix","QuotePrice","title","dateLabel","price","changeUsd","changePct","fractions","hasValue","formatDate","RedGreenMultiline","showPlusSign","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","useChartContextPrices","_chartModel$quote","first","listenOnEvents","quoteModel","prevClose","lastClose","lastTime","lastDate","afterClose","afterTime","ChartContextQuoteHeader","hasData","QuoteHeaderContent","ManualInitQuoteHeader","withCompleteLayoutModelInit","withQuotePolling","modelProperties","chart_layout","maxBars","fetchAndMapInitialQuote","isChange","isAfterChange","afterDate","afterhoursTitle","BarChart","createRef","renderChart","componentDidUpdate","_FinvizSettings","_prevData","svgRef","innerHTML","xAxisRotate","marginRight","totalWidth","totalHeight","d3","rangeRound","range","nice","yFormat","valueFormatter","tickFormat","svg","property","append","attr","xAxis","yAxis","tickSize","tickSizeOuter","selectAll","text","getHeight","_d$value","isOutside","enter","bandwidth","outside","StatementsDataEnum","StatementsTimeframeEnum","DEFAULT_SETTINGS","yoyChange","yoyChangePct","statementsTimeframe","annual","unknown","bars","transition","exit","EliteHoverAd","Icon","BarChartWrapper","hover","Ariakit","placement","showTimeout","portal","BarChartBig","DEFAULT_SOURCE","_getDefaultSource","getValue","getTimeframeFromStatementsSettingsTimeframe","quarterly","StatementsComponent","settings","useFinancialsTableContext","pageRef","source","sheet","currency","keys","_pageRef$current","_pageRef$current2","response","fetch","json","_renderSheetLink","paddingLeft","setValue","StatementsSettingsSection","StatementsTable","setSettings","toggleSetting","key","yoyGrowthLabel","isChartable","isHighlightRow","_FinvizSettings2","skipFirst","parsedData","parsed","parsedValue","replace","slice","parseData","yoyData","entries","reduce","acc","values","lastValue","reverse","_ref3","isValidValue","change","reversedYoyData","_ref4","_ref5","cellClass","adRowIndexStart","rowIndex","hasYoYData","_yoyData$key$change$c","_yoyData$key","_yoyData$key$changePc","_yoyData$key2","_yoyChangePctValue$to","changeIndex","yoyChangeValue","yoyChangePctValue","rowSpan","colSpan","shortFormatNumber","FinancialsTableContextProvider","defaultSettings","cookieKey","hasRedesign","StaticChartHeader","isStockDetailUpdating","ChartTypesSelect","specificFunctionality","StockDetailTimeframeBar","chartIndex","isDateRangeAvailable","isLoadingOverride","isScrollIntoViewEnabled","Button","leftContent","convertData","endYear","FAChart","smallRoundPlaces","largeRoundPlaces","smallScale","largeScale","smallTitleSufix","largeTitleSufix","isLarge","rounded","FundamentalCharts","etfHoldingsAsyncModule","importFn","cacheKey","LoadingFallback","withNotificationContext","etfHoldingsModule","errorSeverity","ETFHoldingsComponent","ETFHoldings","PRICE_STATIC","querySelectorAll","PRICE_ROOTS","NAVIGATION_STATIC","NAVIGATION_ROOTS","STATIC_CHART_HEADER_ROOTS","FUNDAMENTAL_CHARTS_ROOTS","STATEMENTS_ROOTS","INSIDER_CHART_ROOTS","MANAGERS_AND_FUNDS_ROOTS","QuotePortalComponents","ETF_HOLDINGS_STATIC","querySelector","ETF_HOLDINGS_ROOTS","isETF","EtfHoldings","Statements","CORRELATION_LINKS_CONTAINER_SELECTOR","MULTITICKER_CHART_ELEMENT_SELECTOR","SET_SEARCH_EXT_SELECTOR","QuoteSharedWrapper","revealButtons","onToggleRatingsClick","ev","button","currentTarget","ratingsRowWithTable","previousElementSibling","rating","contains","ty","isInitializedRef","setIsStockDetailUpdating","multiTickerElements","getElementsByClassName","correlationElements","abortController","AbortController","signal","then","virtualDOM","DOMParser","parseFromString","multiTickerHtmlElements","newMultiTickerHtmlElements","onload","src","correlationLinksTableCellHtmlElements","newCorrelationLinksTableCellHtmlElements","newsearchFunctionWrapperElement","setSearchExtArgument","quoteSearchExt","catch","err","Sentry","captureException","abort","useStockDetailUpdater","layoutConfig","body","maxChartWidth","timeframeMinutes","isForexFuturesCrypto","isForexFuturesCryptoPage","i1","i2","i3","i5","i10","i15","i30","h2","h4","w","commonProps","barWidthWithMargin","hasAftermarket","hasPremarket","getIntradayChartConfig","maxWidth","canCropChart","chartWidthWithOffset","_chartLayoutModel$ide","unwatchedFirstChart","_chartLayoutModel$cha","ideaId","toConfig","newSettings","ChartSettings","center","IndicatorSettings"],"sourceRoot":""}