{"version":3,"file":"8881.e3f619a5.js","mappings":"gvCAMO,MAEMA,EACX,0GAEWC,EAAsB,wDAE5B,IAAKC,EAAU,SAAVA,GAAU,OAAVA,EAAU,QAAVA,EAAU,gCAAVA,EAAU,8BAAVA,EAAU,6BAAVA,EAAU,+BAAVA,EAAU,6BAAVA,EAAU,4BAAVA,CAAU,MAWVC,EAAa,SAAbA,GAAa,OAAbA,EAAa,QAAbA,EAAa,iBAAbA,EAAa,cAAbA,EAAa,eAAbA,EAAa,eAAbA,EAAa,gBAAbA,EAAa,aAAbA,CAAa,MAUbC,EAAW,SAAXA,GAAW,OAAXA,EAAW,QAAXA,EAAW,iBAAXA,EAAW,qBAAXA,EAAW,mBAAXA,CAAW,MASXC,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,QAAhBA,EAAgB,kBAAhBA,EAAgB,iBAAhBA,EAAgB,gBAAhBA,EAAgB,kBAAhBA,EAAgB,iBAAhBA,EAAgB,gBAAhBA,CAAgB,MAUhBC,EAAc,SAAdA,GAAc,OAAdA,EAAc,QAAdA,EAAc,gBAAdA,EAAc,qBAAdA,EAAc,oBAAdA,CAAc,MASdC,EAAW,SAAXA,GAAW,OAAXA,EAAAA,EAAW,6BAAXA,EAAAA,EAAW,iBAAXA,EAAAA,EAAW,uCAAXA,EAAAA,EAAW,eAAXA,EAAAA,EAAW,eAAXA,EAAAA,EAAW,mBAAXA,EAAAA,EAAW,yBAAXA,EAAAA,EAAW,aAAXA,EAAAA,EAAW,2BAAXA,EAAAA,EAAW,uBAAXA,EAAAA,EAAW,8CAAXA,EAAAA,EAAW,gCAAXA,EAAAA,EAAW,sBAAXA,EAAAA,EAAW,sBAAXA,EAAAA,EAAW,sCAAXA,EAAAA,EAAW,gBAAXA,EAAAA,EAAW,8BAAXA,EAAAA,EAAW,gBAAXA,EAAAA,EAAW,wBAAXA,EAAAA,EAAW,cAAXA,CAAW,MA4BhB,SAASC,EAAeC,GAAoC,IAAhBC,EAAMC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GACvD,OAAQF,GACN,KAAKF,EAAYO,MACf,MAAO,CACLC,OAAQC,IACN,4JACA,2JACA,CACE,qFAAsFN,EACtF,qCAAsCA,KAK9C,KAAKH,EAAYU,iBACf,MAAO,CACLF,OAAQC,IACN,4JACA,2JACA,CACE,qFAAsFN,EACtF,qCAAsCA,KAK9C,KAAKH,EAAYW,KACf,MAAO,CACLH,OAAQC,IACN,yKACA,CACE,uCAAwCN,EACxC,iBAAkBA,KAK1B,KAAKH,EAAYY,KACf,MAAO,CACLJ,OAAQC,IACN,yLACA,CACE,iCAAkCN,EAClC,cAAeA,KAKvB,KAAKH,EAAYa,OACf,MAAO,CACLL,OAAQC,IACN,iKACA,CACE,qCAAsCN,EACtC,gBAAiBA,KAKzB,KAAKH,EAAYc,UACf,MAAO,CACLN,OAAQC,IACN,iNACA,CACE,6FAA8FN,EAC9F,yBAA0BA,KAKlC,KAAKH,EAAYe,IACf,MAAO,CACLP,OAAQC,IACN,2JACA,CACE,+BAAgCN,EAChC,aAAcA,KAKtB,KAAKH,EAAYgB,WACf,MAAO,CACLR,OAAQC,IACN,uKAEFQ,KAAM,cAGV,KAAKjB,EAAYkB,SACf,MAAO,CACLV,OAAQC,IACN,6FACA,CACE,sGACGN,EACH,qCAAsCA,KAK9C,KAAKH,EAAYmB,oBACf,MAAO,CACLX,OAAQ,oDAGZ,KAAKR,EAAYoB,aACf,MAAO,CACLZ,OAAQC,IAAW,0EAA2E,CAC5F,qBAAsBN,EACtB,cAAeA,KAIrB,KAAKH,EAAYqB,QACf,MAAO,CACLb,OAAQC,IACN,6FACA,CACE,gCAAiCN,KAIzC,KAAKH,EAAYsB,QACf,MAAO,CACLd,OAAQC,IAEN,8KAEA,qOACA,CACE,uCAAwCN,EACxC,yFAA0FA,KAIlG,KAAKH,EAAYuB,KACf,MAAO,CACLf,OAAQC,IAAW,mEAAoE,CACrF,qGAAsGN,EACtG,oGAAqGA,KAG3G,KAAKH,EAAYwB,YACf,MAAO,CACLhB,OAAQC,IAEN,oIAEA,sJACA,CACE,iKACGN,EACH,2EAA4EA,KAIpF,KAAKH,EAAYyB,gBACf,MAAO,CACLjB,OAAQC,IACN,yIACA,CACE,mJACGN,EACH,+EAAgFA,KAIxF,KAAKH,EAAY0B,KACf,MAAO,CACLlB,OAAQC,IACN,sFACA,sEACA,CACE,iFAAkFN,EAClF,4DAA6DA,KAKrE,KAAKH,EAAY2B,SACf,MAAO,CACLnB,OACE,oJAGN,KAAKR,EAAY4B,IACf,MAAO,CACLpB,OAAQC,IAAW,WAAY,CAC7B,8HACGN,EACH,6FAA8FA,KAIpG,QACE,MAAO,CAAC,EAEd,CAkFA,SAAS0B,EAAeC,EAkBtBC,GACA,IAjBEC,GAAIC,EAAW,MACf/B,EAAQ,QAAO,KACfgC,EAAO,UAAS,SAChBC,EAAW,UAAS,UACpBC,GAAY,EAAI,WAChBC,EAAa,UAAS,MACtBC,EAAK,QACLC,EAAUL,EAAI,OACd/B,EAAM,aACNqC,EAAY,YACZC,EAAW,aACXC,EAAY,UACZC,EAAS,SACTC,KACGC,GAC2Bf,EAGhC,MAAMgB,EAA0B,WAAfT,EACXU,EAAcC,EAAAA,SAAc,IAAM/C,EAAeD,EAAYE,GAAQC,IAAS,CAACD,EAAOC,IACtF8C,EAAgBD,EAAAA,SAAc,IAAOF,EAAW,KAAOlD,EAAc2C,IAAW,CAACO,EAAUP,IAC3FW,EAAaJ,EAAWhD,EAAiBoC,GAAQvC,EAAWuC,GAC5DiB,EAAiBpD,EAAeoC,GAChCiB,EAAWX,GAAeC,EAEhC,OAAOM,EAAAA,cACLf,QAAAA,EAxYkC,SAyYlC,IACKY,EACHd,MACAY,UAAWlC,IACThB,EACAsD,EAAYvC,OACZyC,EACAC,EACAC,EACA,CACE,0BAA4BL,EAC5B,CAACpD,GAAsB0C,GAEzBO,KAGJU,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAV,SAAA,CACGH,IACCc,EAAAA,EAAAA,KAAA,OAAKZ,UAAU,uCAAsCC,UAClDY,EAAAA,EAAAA,IAAgBf,IAAec,EAAAA,EAAAA,KAACE,EAAAA,GAAI,CAACC,KAAMjB,EAAaE,UAAWI,EAAY9B,OAAWwB,IAG9FG,IAAaE,GACZS,EAAAA,EAAAA,KAAA,OACEZ,UAAWlC,IAAW+B,EAAc,QAASF,QAAAA,EAASc,GAAYvD,EAAY8D,KAAO9D,EAAY+D,OAAQ,CACvG,SAAUnB,GAAe9C,EAAWkE,UAAYlE,EAAWuC,GAC3D,OAAQO,GAAe9C,EAAWmE,SAAWnE,EAAWuC,GACxD,SAAUO,GAAe,CAAC9C,EAAWoE,KAAMpE,EAAWqE,MAAOrE,EAAWsE,SAASC,SAASvE,EAAWuC,IACrG,OAAQO,GAAe,CAAC9C,EAAWwE,OAAQxE,EAAWyE,OAAOF,SAASvE,EAAWuC,IACjF,SAAUQ,GAAgB/C,EAAWkE,UAAYlE,EAAWuC,GAC5D,OAAQQ,GAAgB/C,EAAWmE,SAAWnE,EAAWuC,GACzD,SACEQ,GAAgB,CAAC/C,EAAWoE,KAAMpE,EAAWqE,MAAOrE,EAAWsE,SAASC,SAASvE,EAAWuC,IAC9F,OAAQQ,GAAgB,CAAC/C,EAAWwE,OAAQxE,EAAWyE,OAAOF,SAASvE,EAAWuC,MACjFU,SAEFA,IAGHA,EAEDF,IACCa,EAAAA,EAAAA,KAAA,OAAKZ,UAAU,uCAAsCC,UAClDY,EAAAA,EAAAA,IAAgBd,IAAgBa,EAAAA,EAAAA,KAACE,EAAAA,GAAI,CAACC,KAAMhB,EAAcC,UAAWI,EAAY9B,OAAWyB,OAKvG,CAMO,MAAM2B,EAASrB,EAAAA,WAAiBnB,E,4GClbhC,SAAS4B,EAAI3B,GAAwF,IAAvF,KAAE4B,EAAM1B,GAAIC,EAAW,UAAEU,EAAS,MAAE2B,EAAQ,GAAE,OAAEC,EAASD,KAAUzB,GAAkBf,EACxG,GAAI4B,GAAQzB,EACV,MAAM,IAAIuC,MAAM,sEAGlB,IAAKd,IAASzB,EACZ,MAAM,IAAIuC,MAAM,qBAGlB,GAAId,EAAM,CACR,QAAuBpD,IAAnBmE,EAASf,GACX,MAAM,IAAIc,MAAM,kBAGlB,MAAME,EAAW,CAAC,QAASD,EAASf,IAAOiB,OAAOC,SAASC,KAAK,KAEhE,OACEtB,EAAAA,EAAAA,KAAA,UACMV,EACJF,UAAWlC,IAAW,kDAAmDkC,GACzE2B,MAAwB,iBAAVA,GAAsBQ,OAAOC,SAAST,GAAYA,EAAQ,GAAX,MAAqBA,EAClFC,OAA0B,iBAAXA,GAAuBO,OAAOC,SAASR,GAAaA,EAAS,GAAZ,MAAsBA,EAAO3B,UAE7FW,EAAAA,EAAAA,KAAA,OAAKyB,KAAM,sBAAsBN,aAAoBO,eAAeC,iBAAiBxB,OAG3F,CAEA,MAAMyB,EAAYlD,EAClB,OAAOsB,EAAAA,EAAAA,KAAC4B,EAAS,IAAKtC,EAAOF,UAAWA,EAAW2B,MAAOA,EAAOC,OAAQA,GAC3E,CC9CO,SAASf,EAAgBE,GAC9B,SAAKA,GAAwB,iBAATA,SAEsBpD,IAAnCmE,EAASf,EAClB,CAIA,MAAM0B,EAAO,GACPC,EAAe,gBACfC,EAAa,cACbC,EAAa,cACbC,EAAW,WAGJf,EAAW,CAEtBgB,IAAKL,EACLM,cAAeN,EACfO,eAAgBP,EAChBQ,aAAcR,EACdS,aAAcT,EACdU,UAAWV,EACXW,SAAUX,EACVY,UAAWZ,EACXa,UAAWb,EACXc,WAAYd,EACZe,QAASf,EACTgB,cAAehB,EACfiB,SAAUjB,EACVkB,YAAalB,EACbmB,SAAUnB,EACVoB,WAAYpB,EACZqB,aAAcrB,EACdsB,YAAatB,EACbuB,aAAcvB,EACdwB,MAAOxB,EACPyB,SAAUzB,EACV0B,gBAAiB1B,EACjB2B,KAAM3B,EACN4B,KAAM5B,EACN6B,KAAM7B,EACN8B,MAAO9B,EACP+B,eAAgB/B,EAChBgC,MAAOhC,EACPiC,WAAYjC,EACZkC,QAASlC,EACTmC,KAAMnC,EACNoC,UAAWpC,EACXqC,KAAMrC,EACNsC,KAAMtC,EACNuC,SAAUvC,EACVwC,SAAUxC,EACVyC,KAAMzC,EACN0C,SAAU1C,EACV2C,UAAW3C,EACX4C,KAAM5C,EACN6C,WAAY7C,EACZ8C,UAAW9C,EACX+C,MAAO/C,EACPgD,KAAMhD,EACNiD,KAAMjD,EACNkD,UAAWlD,EACXmD,QAASnD,EACToD,QAASpD,EACTqD,QAASrD,EACTsD,QAAStD,EACTuD,OAAQvD,EACRwD,QAASxD,EACTyD,OAAQzD,EACR0D,SAAU1D,EACV2D,cAAe3D,EACf4D,MAAO5D,EACP6D,QAAS7D,EACT8D,KAAM9D,EACN+D,aAAc/D,EACdgE,iBAAkBhE,EAClBiE,eAAgBjE,EAChBkE,OAAQlE,EACRmE,SAAUnE,EACVoE,SAAUpE,EACVqE,aAAcrE,EACdsE,WAAYtE,EACZuE,SAAUvE,EACVwE,oBAAqBxE,EACrByE,kBAAmBzE,EACnB0E,QAAS1E,EAGT2E,WAAY1E,EACZ2E,WAAY3E,EACZ4E,WAAY5E,EACZ6E,WAAY7E,EACZ8E,WAAY9E,EACZ+E,WAAY/E,EACZgF,WAAYhF,EACZiF,WAAYjF,EACZkF,WAAYlF,EAGZmF,oBAAqBlF,EACrBmF,0BAA2BnF,EAC3BoF,yBAA0BpF,EAC1BqF,6BAA8BrF,EAC9BsF,0BAA2BtF,EAC3BuF,gCAAiCvF,EACjCwF,mBAAoBxF,EACpByF,mBAAoBzF,EACpB0F,+BAAgC1F,EAChC2F,qCAAsC3F,EACtC4F,mBAAoB5F,EACpB6F,qBAAsB7F,EACtB8F,UAAW9F,EACX+F,UAAW/F,EACXgG,YAAahG,EACbiG,UAAWjG,EACXkG,gBAAiBlG,EACjBmG,YAAanG,EACboG,WAAYpG,EACZqG,cAAerG,EACfsG,SAAUtG,EACVuG,YAAavG,EACbwG,aAAcxG,EACdyG,aAAczG,EACd0G,UAAW1G,EACX2G,cAAe3G,EACf4G,YAAa5G,EACb6G,aAAc7G,EACd8G,SAAU9G,EACV+G,gBAAiB/G,EACjBgH,SAAUhH,EACViH,aAAcjH,EACdkH,UAAWlH,EAGXmH,eAAgBlH,EAChBmH,oBAAqBnH,EACrBoH,gBAAiBpH,EACjBqH,cAAerH,EACfsH,cAAetH,EAGfuH,MAAOtH,EACPuH,WAAYvH,EACZwH,aAAcxH,EACdyH,MAAOzH,EACP0H,WAAY1H,EACZ2H,aAAc3H,EACd4H,QAAS5H,EACT6H,QAAS7H,EACT8H,YAAa9H,EACb+H,UAAW/H,EACXgI,MAAOhI,EACPiI,QAASjI,E,qECrIJ,SAASkI,EAAO5L,GAAoE,IAAnE,cAAE6L,GAAgB,EAAK,SAAEC,EAAW,EAAC,MAAEtJ,EAAQ,IAAkBxC,EACvF,MAAM+L,EAAU,EAAIvJ,EAAS,EACvBwJ,EAAcD,EAAS,EACvBE,EAAWF,EAASC,EAAc,EAClCE,EAAyB,EAATH,EAAaI,KAAKC,GAExC,OACE7K,EAAAA,EAAAA,MAAA,OACEV,UAAWlC,IAAW,iBAAkB,CAAE,gBAAiBkN,IAC3DrJ,MAAOA,EACPC,OAAQD,EACR6J,QAAS,OAAO7J,KAASA,IACzB8J,MAAM,6BAA4BxL,SAAA,EAElCW,EAAAA,EAAAA,KAAA,UACEZ,UAAU,2EACV0L,MAAO,CAAEP,YAAa,GAAGA,OACzBQ,GAAIP,EACJQ,GAAIR,EACJS,EAAGX,KAELtK,EAAAA,EAAAA,KAAA,UACEZ,UAAU,4EACV0L,MAAO,CACLI,gBAAiB,GAAGT,KAAiBA,IACrCU,iBAAkB,IAAGV,GAAkBL,EAAgBC,EAAW,IAAM,IAAOI,GAC/EF,YAAa,GAAGA,MAChBa,cAAe,SAEjBL,GAAIP,EACJQ,GAAIR,EACJS,EAAGX,MAIX,C,mGC7BO,SAASe,EAAO9M,GAAiE,IAAhE,MAAE+M,EAAK,SAAEjM,KAAaC,GAAwCf,EACpF,OAAOkB,EAAAA,cAlBT,SAA2B6L,GACzB,OAAQA,GACN,KAAK,EACH,MAAO,KACT,KAAK,EACH,MAAO,KACT,KAAK,EACH,MAAO,KACT,KAAK,EACH,MAAO,KACT,KAAK,EACH,MAAO,KACT,QACE,MAAO,KAEb,CAIIC,CAAkBD,GAClB,IACKhM,EACHF,UAAWlC,IAAWoC,EAAMF,UAAW,YAAa,CAClD,WAAsB,IAAVkM,EACZ,WAAsB,IAAVA,EACZ,UAAqB,IAAVA,EAGX,GAAc,IAAVA,EACJ,UAAqB,IAAVA,EACX,WAAsB,IAAVA,KAGhBjM,EAEJ,CA4BO,SAASmM,EAASC,GAMoB,IANQ,GACnDhN,EAAK,IAAG,KACRE,EAAO,UAAS,OAChBiC,EAAM,SACNvB,KACGC,GACsCmM,EACzC,OAAOhM,EAAAA,cACLhB,EACA,IACKa,EACHF,UAAWlC,IAAWoC,EAAMF,UAAW,CACrC,cAAewB,EACf,UAAoB,UAATjC,EACX,UAAoB,YAATA,EACX,WAAqB,UAATA,EACZ,WAAqB,SAATA,KAGhBU,EAEJ,CAQO,SAASqM,EAAKC,GAA6F,IAA5F,MAAEC,EAAK,eAAEC,EAAc,aAAEC,EAAY,SAAEzM,KAAaC,GAAsCqM,EAC9G,OACE7L,EAAAA,EAAAA,MAAA,YAAWR,EAAOF,UAAWlC,IAAWoC,EAAMF,UAAW,YAAa,CAAE,YAAa0M,IAAgBzM,SAAA,CAClGuM,IAAS5L,EAAAA,EAAAA,KAAA,QAAMZ,UAAWlC,IAAW,WAAY,CAAE,QAAS4O,GAAgBD,GAAgBxM,SAAEuM,IAC9FvM,IAGP,C,qmBCzGO,IAAK0M,EAAW,SAAXA,GAAW,OAAXA,EAAW,mCAAXA,EAAW,qDAAXA,EAAW,mDAAXA,EAAW,gCAAXA,CAAW,MAmBhB,MAAMC,UAAuB/K,MAMlCgL,WAAAA,CAAYC,GAAwF,IAA5CC,EAAItP,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAAIuP,EAA0BvP,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC/FwP,MAAM,GAAGH,KADwBrP,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,oBACPyP,EAAA,sBAAAA,EAAA,sBALf,GAAKA,EAAA,oBAAAA,EAAA,aAEQ,CAAC,GAI5BC,KAAKL,OAASA,EACdK,KAAKC,cAAgBN,GAAU,IAC/BK,KAAKJ,KAAOA,EACZI,KAAKH,MAAQA,CACf,EAWK,SAASK,EACdC,GAG4C,IAAAC,EAAA,IAF5C,MAAEC,EAAK,QAAEC,EAAU,CAAC,KAAMC,GAAwDjQ,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACtFkQ,EAAgBlQ,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAEhB,MAAMmQ,EAAa,oBAAqBC,OAAS,IAAIC,qBAAoBnQ,EACnEoQ,EAAaP,EAAQ,GAAGF,KAAO,IAAIU,gBAAgBR,KAAWF,EAG9DW,EAAiB,IAClBP,EACHD,QAAS,CACP,eAL6D,QAAnCF,EAAIE,EAAgB,uBAAe,IAAAF,EAAAA,EAAIZ,EAAYuB,mBAM1ET,IAKDU,EAFUC,MAAML,EAAY,IAAKE,EAAgBI,OAAQT,aAAU,EAAVA,EAAYS,SAGxEC,MAAKC,UAAoB,IAAApP,EACxB,MAAMqP,QAAqBC,EAASC,OAC9BC,EAAwE,QAAxCxP,EAAIsP,EAAShB,QAAQmB,IAAI,uBAAe,IAAAzP,EAAAA,EAAYwN,EAAYkC,KAEtG,IACE,MAAMC,EA3Dd,SAAqCL,EAAkBM,GACrD,OAAQA,GACN,KAAKpC,EAAYuB,gBACjB,KAAKvB,EAAYqC,mBACjB,KAAKrC,EAAYsC,eACf,OAAOC,KAAKC,MAAMV,GACpB,QACE,OAAOA,EAEb,CAkD+BW,CAA4BZ,EAAcG,GACjE,IAAKF,EAASY,IAAMZ,EAAS3B,QAAU,IACrC,MAAM,IAAIF,EAAe6B,EAAS3B,OAAQ2B,EAASa,WAAYR,EAAgB,CAC7ES,MAAOd,EAAShB,QAAQmB,IAAI,YAIhC,OAAOE,CACT,CAAE,MAAOU,GACP,GAAIA,aAAiB5C,EACnB,MAAM4C,EAER,MAAM,IAAI5C,EAAe6B,EAAS3B,OAAQ0C,EAAMC,QAASjB,EAAc,CACrEe,MAAOd,EAAShB,QAAQmB,IAAI,WAEhC,KAEDc,OAAOF,IAYN,GAXIA,EAAM1C,QAAU,KAClB6C,EAAAA,IAAkBC,IAChBA,EAAMC,WAAW,aAAcL,EAAMxC,OAEhB,MAAjBwC,EAAM1C,OACR6C,EAAAA,GAAwBH,GAExBG,EAAAA,GAAsB,GAAGH,EAAM1C,UAAU0C,EAAMC,UACjD,IAGA9B,EACF,MAAM6B,CACR,IAUJ,OAPI5B,IACFO,EAAkB2B,OAAS,KACzBlC,EAAWmC,QACX5B,EAAkB6B,SAAU,CAAI,GAI7B7B,CACT,CAQO,SAAS8B,IACd,OAAO5C,EAA8B,wBAAyB,CAAEG,MAAO,CAAE0C,MADrCzS,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,MAC6C,EACtF,CAEO,SAAS0S,IACd,OAAO9C,EAAkD,2BAA4B,CACnFG,MAAO,CACL4C,OAAQ,eAGd,CAEO,SAASC,EAAiBC,GAC/B,OAAOjD,EAAmB,sBAAuB,CAC/CG,MAAO,CACL+C,EAAGD,IAGT,CAOO,SAASE,EAAsBC,GACpC,OAAOpD,EAAiC,2BAA4B,CAClEG,MAAO,CACLkD,IAAKD,EACLL,OAAQ,mCAGd,CAEO,SAASO,EAAiB5P,EAAc6P,GAC7C,OAAOvD,EACL,uBACA,CACEG,MAAO,CACLqD,OAAQ9P,UACMpD,IAAViT,GAAuB,CACzBA,MAAOA,MAIb,EAEJ,C","sources":["webpack://@finviz/website/./js/main/components/button.tsx","webpack://@finviz/website/./js/main/components/icon/icon.tsx","webpack://@finviz/website/./js/main/components/icon/index.tsx","webpack://@finviz/website/./js/main/components/spinner.tsx","webpack://@finviz/website/./js/main/components/typography.tsx","webpack://@finviz/website/./js/main/services/api.ts"],"sourcesContent":["import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { PropsWithAs } from './types'\r\n\r\nexport const BUTTON_DEFAULT_ELEMENT = 'button'\r\n\r\nexport const BUTTON_BASE_CLASS =\r\n 'group/button flex shrink-0 items-center justify-center font-medium whitespace-nowrap focus:outline-none'\r\nexport const BUTTON_SQUARE_BASE_CLASS = 'shrink-0 justify-center'\r\nexport const BUTTON_FOCUS_STYLES = 'focus-visible:ring-2 ring-gray-200 dark:ring-gray-500'\r\n\r\nexport enum ButtonSize {\r\n none = '', // Do not set fixed dimensions\r\n xxsmall = 'text-info h-4 min-w-4', // 16px height\r\n xsmall = 'text-2xs h-5 min-w-5', // 20px height\r\n small = 'text-2xs h-6 min-w-6', // 24px height\r\n regular = 'text-2xs h-7 min-w-7', // 28px height\r\n medium = 'text-sm h-8 min-w-8', // 32px height\r\n large = 'text-sm h-9 min-w-9', // 36px height\r\n}\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum ButtonPadding {\r\n none = '',\r\n xxsmall = 'px-0.5', // 2px padding\r\n xsmall = 'px-1', // 4px padding\r\n small = 'px-1.5', // 6px padding\r\n regular = 'px-2', // 8px padding\r\n medium = 'px-2.5', // 10px padding\r\n large = 'px-3', // 12px padding\r\n}\r\n\r\nexport enum ButtonAlign {\r\n none = '',\r\n left = 'text-left',\r\n center = 'text-center',\r\n right = 'text-right',\r\n}\r\n\r\nexport type ButtonSizeType = keyof typeof ButtonSize\r\n\r\nexport enum ButtonSquareSize {\r\n none = '', // Do not set fixed dimensions\r\n xxsmall = 'h-4 w-4', // 16x16px\r\n xsmall = 'h-5 w-5', // 20x20px\r\n small = 'h-6 w-6', // 24x24px\r\n regular = 'h-7 w-7', // 28x28px\r\n medium = 'h-8 w-8', // 32x32px\r\n large = 'h-9 w-9', // 36x36px\r\n}\r\n\r\nexport enum ButtonRounding {\r\n none = '',\r\n small = 'rounded', // 4px\r\n regular = 'rounded-md', // 6px\r\n full = 'rounded-full', // 9999px\r\n}\r\n\r\nexport type ButtonRoundingType = keyof typeof ButtonRounding\r\n\r\nexport enum ButtonTheme {\r\n transparent, // Only basic shape is rendered\r\n light,\r\n lightTransparent,\r\n dark,\r\n blue,\r\n violet,\r\n blueHover,\r\n red,\r\n headerItem,\r\n menuItem,\r\n menuItemTransparent,\r\n menuItemDark,\r\n opacity,\r\n outline,\r\n chipTransparent,\r\n chip,\r\n chipOutline,\r\n link,\r\n linkText,\r\n tab,\r\n}\r\n\r\nexport type ButtonThemeType = keyof typeof ButtonTheme\r\n\r\n/**\r\n * Get button theme\r\n */\r\nexport function getButtonTheme(theme: ButtonTheme, active = false) {\r\n switch (theme) {\r\n case ButtonTheme.light: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200/90 disabled:bg-gray-200/30 disabled:text-gray-400 disabled:hover:bg-gray-200/30 disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-gray-200/30 hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.lightTransparent: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200/90 disabled:bg-transparent disabled:text-gray-400 disabled:hover:bg-transparent disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-transparent hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.dark: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-gray-50 active:bg-gray-500/90 disabled:bg-gray-500/30 disabled:text-gray-300 disabled:hover:bg-gray-500/30 disabled:hover:text-gray-300',\r\n {\r\n 'bg-gray-500/30 hover:bg-gray-500/50': !active,\r\n 'bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blue: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white hover:text-white active:bg-blue-600 disabled:bg-blue-200 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-blue-400 hover:bg-blue-500': !active,\r\n 'bg-blue-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.violet: {\r\n return {\r\n button: classnames(\r\n 'text-white hover:text-white focus:text-white disabled:bg-violet-200 dark:disabled:text-gray-300 disabled:hover:bg-violet-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-violet-400 hover:bg-violet-500': !active,\r\n 'bg-violet-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blueHover: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-blue-600 disabled:bg-blue-200 disabled:text-gray-400 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 disabled:hover:text-gray-400 dark:disabled:hover:text-gray-300',\r\n {\r\n 'text-blue-600 hover:bg-blue-400 hover:text-white dark:text-blue-500 dark:hover:text-white': !active,\r\n 'bg-blue-400 text-white': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.red: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white active:bg-red-600 disabled:bg-red-200 disabled:text-gray-300 disabled:hover:bg-red-200 disabled:hover:text-gray-300',\r\n {\r\n 'bg-red-400 hover:bg-red-500': !active,\r\n 'bg-red-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.headerItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent bg-gray-800 text-gray-300 hover:bg-gray-900 hover:text-white disabled:hover:text-gray-300 disabled:bg-gray-700 disabled:hover:bg-gray-700' // Base\r\n ),\r\n icon: 'text-white',\r\n }\r\n }\r\n case ButtonTheme.menuItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent dark:disabled:hover:bg-transparent disabled:hover:bg-transparent',\r\n {\r\n 'hover:bg-gray-200/30 disabled:text-gray-400 disabled:hover:text-gray-400 dark:hover:bg-gray-500/30':\r\n !active,\r\n 'bg-gray-200/30 dark:bg-gray-500/30': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.menuItemTransparent: {\r\n return {\r\n button: 'border border-transparent disabled:text-gray-400',\r\n }\r\n }\r\n case ButtonTheme.menuItemDark: {\r\n return {\r\n button: classnames('border border-transparent text-white dark:disabled:hover:bg-transparent', {\r\n 'hover:bg-gray-700': !active,\r\n 'bg-gray-700': active,\r\n }),\r\n }\r\n }\r\n case ButtonTheme.opacity:\r\n return {\r\n button: classnames(\r\n 'border border-transparent disabled:opacity-50 disabled:hover:opacity-50 dark:text-gray-400',\r\n {\r\n 'opacity-70 hover:opacity-100': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.outline:\r\n return {\r\n button: classnames(\r\n // Base styles\r\n 'bg-primary border disabled:border-gray-100 disabled:bg-gray-50 disabled:text-gray-500 disabled:hover:border-gray-100 disabled:hover:bg-gray-50 disabled:hover:text-gray-500',\r\n // Dark styles\r\n 'dark:bg-gray-800 dark:text-gray-50 dark:disabled:border-transparent dark:disabled:bg-gray-700 dark:disabled:text-gray-400 dark:disabled:hover:border-transparent dark:disabled:hover:bg-gray-700 dark:disabled:hover:text-gray-400',\r\n {\r\n 'border-blue-400 dark:border-blue-400': active,\r\n 'border-gray-100 hover:border-gray-300 dark:hover:border-gray-400 dark:border-gray-600': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.chip:\r\n return {\r\n button: classnames('border dark:disabled:hover:bg-gray-700 disabled:hover:bg-gray-50', {\r\n 'border-transparent bg-gray-200/30 hover:bg-gray-200/30 dark:bg-gray-700 dark:hover:bg-gray-500/30': !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:border-blue-400 dark:bg-gray-500/30 dark:text-white': active,\r\n }),\r\n }\r\n case ButtonTheme.chipOutline:\r\n return {\r\n button: classnames(\r\n // Base styles\r\n 'border text-gray-600 disabled:text-gray-400 disabled:hover:border-gray-200 disabled:hover:bg-primary disabled:hover:text-gray-400',\r\n // Dark styles\r\n 'dark:text-gray-200 dark:disabled:text-gray-400 dark:disabled:hover:text-gray-400 dark:disabled:hover:border-gray-600 dark:disabled:hover:bg-primary',\r\n {\r\n 'bg-primary border-primary hover:text-default hover:border-gray-300 hover:bg-gray-50 dark:hover:text-default dark:hover:bg-gray-900 dark:hover:border-gray-400':\r\n !active,\r\n 'text-default border-blue-400 bg-blue-50 dark:bg-blue-700 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.chipTransparent:\r\n return {\r\n button: classnames(\r\n 'border dark:disabled:hover:bg-transparent disabled:hover:bg-transparent dark:disabled:hover:text-gray-400 disabled:hover:text-gray-500', // Base styles\r\n {\r\n 'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-500/30 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.link: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent disabled:text-blue-500/50 disabled:hover:text-blue-500/50', // Light\r\n 'dark:disabled:text-blue-300/50 dark:disabled:hover:text-blue-300/50', // Dark\r\n {\r\n 'text-blue-500 hover:text-blue-600 dark:text-blue-300 dark:hover:text-blue-200': !active,\r\n 'bg-blue-50 text-blue-600 dark:bg-blue-700 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.linkText: {\r\n return {\r\n button:\r\n 'text-inherit font-normal hover:text-blue-600 dark:hover:text-blue-200 no-underline hover:underline disabled:opacity-50 disabled:hover:opacity-50',\r\n }\r\n }\r\n case ButtonTheme.tab: {\r\n return {\r\n button: classnames('border-b', {\r\n 'border-b-gray-100 text-default dark:border-b-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 dark:hover:border-b-gray-600':\r\n !active,\r\n 'text-blue-500 border-b-blue-400 shadow-blue-400 shadow-[inset_0_-1px_0] dark:text-blue-300': active,\r\n }),\r\n }\r\n }\r\n default:\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * Export Button html props type so we don’t always have to omit\r\n */\r\nexport type ButtonHTMLProps = Omit<\r\n React.HTMLProps,\r\n 'ref' | 'type' | 'size' | 'content' | 'align' | 'as'\r\n>\r\n\r\nexport interface ButtonProps {\r\n /**\r\n * Visual appearance of the button\r\n */\r\n theme?: ButtonThemeType\r\n\r\n /**\r\n * Sets if button is square or normal.\r\n *\r\n * @default 'regular'\r\n */\r\n appearance?: 'regular' | 'square'\r\n\r\n /**\r\n * Size of the button\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: ButtonSizeType\r\n\r\n /**\r\n * Override align of the text for a button\r\n *\r\n * @default center, left when `leftContent` or `rightContent` are defined\r\n */\r\n align?: keyof typeof ButtonAlign\r\n\r\n /**\r\n * Override button padding\r\n *\r\n * @default undefined\r\n */\r\n padding?: keyof typeof ButtonPadding\r\n\r\n /**\r\n * Render button in an active state (darker background, etc.)\r\n */\r\n active?: boolean\r\n\r\n /**\r\n * Sets if the button has focus ring\r\n *\r\n * @default true\r\n */\r\n focusRing?: boolean\r\n\r\n /**\r\n * Sets rounded corners for the button\r\n *\r\n * @default regular\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n /**\r\n * Class for the content wrapper\r\n */\r\n contentClass?: string\r\n\r\n /**\r\n * Name of left icon\r\n */\r\n leftContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Name of right icon\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n}\r\n\r\nexport type ButtonComponentProps =\r\n PropsWithAs & ButtonProps\r\n\r\nfunction ButtonComponent(\r\n {\r\n as: asComponent,\r\n theme = 'light',\r\n size = 'regular',\r\n rounding = 'regular',\r\n focusRing = true,\r\n appearance = 'regular',\r\n align,\r\n padding = size, // same as size\r\n active,\r\n contentClass,\r\n leftContent,\r\n rightContent,\r\n className,\r\n children,\r\n ...props\r\n }: ButtonComponentProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const isSquare = appearance === 'square'\r\n const buttonTheme = React.useMemo(() => getButtonTheme(ButtonTheme[theme], active), [theme, active])\r\n const buttonPadding = React.useMemo(() => (isSquare ? null : ButtonPadding[padding]), [isSquare, padding])\r\n const buttonSize = isSquare ? ButtonSquareSize[size] : ButtonSize[size]\r\n const buttonRounding = ButtonRounding[rounding]\r\n const hasIcons = leftContent || rightContent\r\n\r\n return React.createElement(\r\n asComponent ?? BUTTON_DEFAULT_ELEMENT,\r\n {\r\n ...props,\r\n ref,\r\n className: classnames(\r\n BUTTON_BASE_CLASS,\r\n buttonTheme.button,\r\n buttonPadding,\r\n buttonSize,\r\n buttonRounding,\r\n {\r\n [BUTTON_SQUARE_BASE_CLASS]: isSquare,\r\n [BUTTON_FOCUS_STYLES]: focusRing,\r\n },\r\n className\r\n ),\r\n },\r\n <>\r\n {leftContent && (\r\n
\r\n {isValidIconName(leftContent) ? : leftContent}\r\n
\r\n )}\r\n {children && !isSquare ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n children\r\n )}\r\n {rightContent && (\r\n
\r\n {isValidIconName(rightContent) ? : rightContent}\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const Button = React.forwardRef(ButtonComponent) as <\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & ButtonProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { IconNameType, iconList } from '.'\r\nimport { SVGProps } from './svg'\r\n\r\nexport interface IconProps extends SVGProps {\r\n /**\r\n * Icon name\r\n */\r\n name?: IconNameType\r\n\r\n /**\r\n * Alternative way to pass icon to render if you want to render a custom component\r\n * or use `iconList` object lookup\r\n */\r\n as?: React.FC\r\n}\r\n\r\nexport function Icon({ name, as: asComponent, className, width = 16, height = width, ...props }: IconProps) {\r\n if (name && asComponent) {\r\n throw new Error('Specifying both \"name\" and \"as\" on Icon component is not supported')\r\n }\r\n\r\n if (!name && !asComponent) {\r\n throw new Error('No icon specified')\r\n }\r\n\r\n if (name) {\r\n if (iconList[name] === undefined) {\r\n throw new Error('Icon not found')\r\n }\r\n\r\n const fileName = ['icons', iconList[name]].filter(Boolean).join('_')\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const Component = asComponent!\r\n return \r\n}\r\n","// Export the Icon component itself\r\nexport * from './icon'\r\n\r\nexport function isValidIconName(name?: unknown): name is IconNameType {\r\n if (!name || typeof name !== 'string') return false\r\n\r\n return iconList[name as IconNameType] !== undefined\r\n}\r\n\r\nexport type IconNameType = keyof typeof iconList\r\n\r\nconst root = ''\r\nconst chartLayouts = 'chart-layouts'\r\nconst chartTools = 'chart-tools'\r\nconst chartTypes = 'chart-types'\r\nconst screener = 'screener'\r\n\r\n// Export list of icon components\r\nexport const iconList = {\r\n // Main icons\r\n add: root,\r\n arrowBackward: root,\r\n arrowDownShort: root,\r\n arrowForward: root,\r\n arrowUpShort: root,\r\n briefcase: root,\r\n calendar: root,\r\n caretDown: root,\r\n caretLeft: root,\r\n caretRight: root,\r\n caretUp: root,\r\n caretVertical: root,\r\n chartBar: root,\r\n chartBubble: root,\r\n chartPie: root,\r\n chartTable: root,\r\n chartTreemap: root,\r\n chevronDown: root,\r\n chevronRight: root,\r\n close: root,\r\n darkMode: root,\r\n diamondOutlined: root,\r\n done: root,\r\n drag: root,\r\n draw: root,\r\n empty: root,\r\n exitFullscreen: root,\r\n flash: root,\r\n fullscreen: root,\r\n gesture: root,\r\n gift: root,\r\n hamburger: root,\r\n help: root,\r\n idea: root,\r\n ideaLoad: root,\r\n ideaSave: root,\r\n info: root,\r\n interval: root,\r\n lightMode: root,\r\n lock: root,\r\n lockOpened: root,\r\n menuClose: root,\r\n minus: root,\r\n more: root,\r\n note: root,\r\n openInNew: root,\r\n palette: root,\r\n profile: root,\r\n publish: root,\r\n refresh: root,\r\n remove: root,\r\n restore: root,\r\n search: root,\r\n settings: root,\r\n settingsWheel: root,\r\n share: root,\r\n signOut: root,\r\n star: root,\r\n starOutlined: root,\r\n switchHorizontal: root,\r\n switchVertical: root,\r\n tabKey: root,\r\n template: root,\r\n trashCan: root,\r\n trendingDown: root,\r\n trendingUp: root,\r\n triangle: root,\r\n triangleOutlineDown: root,\r\n triangleOutlineUp: root,\r\n warning: root,\r\n\r\n // Chart layouts\r\n layout1h1v: chartLayouts,\r\n layout1h2v: chartLayouts,\r\n layout1h3v: chartLayouts,\r\n layout1l2r: chartLayouts,\r\n layout1t2b: chartLayouts,\r\n layout2h1v: chartLayouts,\r\n layout2h2v: chartLayouts,\r\n layout3h1v: chartLayouts,\r\n layout3h2v: chartLayouts,\r\n\r\n // Chart tools\r\n drawingActionDelete: chartTools,\r\n drawingSettingAutosaveOff: chartTools,\r\n drawingSettingAutosaveOn: chartTools,\r\n drawingSettingAutosaveSaving: chartTools,\r\n drawingSettingDrawingMode: chartTools,\r\n drawingSettingDrawingModeActive: chartTools,\r\n drawingSettingHide: chartTools,\r\n drawingSettingLock: chartTools,\r\n drawingSettingPreserveDrawings: chartTools,\r\n drawingSettingPreserveDrawingsActive: chartTools,\r\n drawingSettingShow: chartTools,\r\n drawingSettingUnlock: chartTools,\r\n toolArrow: chartTools,\r\n toolBrush: chartTools,\r\n toolCallout: chartTools,\r\n toolCurve: chartTools,\r\n toolElliottWave: chartTools,\r\n toolEllipse: chartTools,\r\n toolExpand: chartTools,\r\n toolFibonacci: chartTools,\r\n toolLine: chartTools,\r\n toolMeasure: chartTools,\r\n toolMidLineH: chartTools,\r\n toolMidLineV: chartTools,\r\n toolMouse: chartTools,\r\n toolPitchfork: chartTools,\r\n toolPolygon: chartTools,\r\n toolPosition: chartTools,\r\n toolRect: chartTools,\r\n toolRectRotated: chartTools,\r\n toolText: chartTools,\r\n toolTriangle: chartTools,\r\n toolXABCD: chartTools,\r\n\r\n // Chart types\r\n candleBarBasic: chartTypes,\r\n candleBarHeikinAshi: chartTypes,\r\n candleBarHollow: chartTypes,\r\n lineChartType: chartTypes,\r\n ohlcChartType: chartTypes,\r\n\r\n // Screener\r\n above: screener,\r\n aboveEqual: screener,\r\n abovePercent: screener,\r\n below: screener,\r\n belowEqual: screener,\r\n belowPercent: screener,\r\n between: screener,\r\n crosses: screener,\r\n crossesDown: screener,\r\n crossesUp: screener,\r\n equal: screener,\r\n outside: screener,\r\n}\r\n","import classnames from 'classnames'\r\n\r\ninterface SpinnerProps {\r\n /**\r\n * Spinner as progress bar\r\n * @default false\r\n */\r\n isProgressBar?: boolean\r\n\r\n /**\r\n * Progress number in percent\r\n * @default 0\r\n */\r\n progress?: number\r\n\r\n /**\r\n * Spinner box width\r\n *\r\n * @default 28\r\n */\r\n width?: number\r\n}\r\n\r\nexport function Spinner({ isProgressBar = false, progress = 0, width = 28 }: SpinnerProps) {\r\n const radius = (3 * width) / 7\r\n const strokeWidth = radius / 3\r\n const circleXY = radius + strokeWidth / 2\r\n const circumference = radius * 2 * Math.PI\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ComponentProps, ElementType, HTMLProps, PropsWithChildren, ReactNode } from 'react'\r\n\r\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\r\n\r\ninterface HeadingProps extends HTMLProps {\r\n /**\r\n * Heading level\r\n */\r\n level: HeadingLevel\r\n}\r\n\r\nfunction getHeadingElement(level: HeadingLevel) {\r\n switch (level) {\r\n case 1:\r\n return 'h1'\r\n case 2:\r\n return 'h2'\r\n case 3:\r\n return 'h3'\r\n case 4:\r\n return 'h4'\r\n case 5:\r\n return 'h5'\r\n default:\r\n return 'h6'\r\n }\r\n}\r\n\r\nexport function Heading({ level, children, ...props }: PropsWithChildren) {\r\n return React.createElement(\r\n getHeadingElement(level),\r\n {\r\n ...props,\r\n className: classnames(props.className, 'font-bold', {\r\n 'text-3xl': level === 1,\r\n 'text-2xl': level === 2,\r\n 'text-xl': level === 3,\r\n // We don't want to set any specific fontsize because it's used e.g. in DialogHeader\r\n // where it uses font-size: inherit; and is different on old/redesign versions\r\n '': level === 4,\r\n 'text-sm': level === 5,\r\n 'text-2xs': level === 6,\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface ParagraphProps extends Omit>, 'size' | 'as'> {\r\n /**\r\n * Determines which element the text should render to\r\n *\r\n * @default p\r\n */\r\n as?: ElementType\r\n\r\n /**\r\n * Font size for the paragraph\r\n * - tiny - 10px\r\n * - small - 12px\r\n * - default - 14px\r\n * - medium - 16px\r\n * - large - 18px\r\n *\r\n * @default default\r\n */\r\n size?: 'tiny' | 'small' | 'default' | 'medium' | 'large'\r\n\r\n /**\r\n * Paragraph font weight\r\n */\r\n medium?: boolean\r\n}\r\n\r\nexport function Paragraph({\r\n as = 'p',\r\n size = 'default',\r\n medium,\r\n children,\r\n ...props\r\n}: PropsWithChildren>) {\r\n return React.createElement(\r\n as,\r\n {\r\n ...props,\r\n className: classnames(props.className, {\r\n 'font-medium': medium,\r\n 'text-lg': size === 'large',\r\n 'text-sm': size === 'default',\r\n 'text-2xs': size === 'small',\r\n 'text-3xs': size === 'tiny',\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface LabelProps extends Omit, 'title'> {\r\n title?: ReactNode\r\n titleClassName?: string\r\n isHorizontal?: boolean\r\n}\r\n\r\nexport function Label({ title, titleClassName, isHorizontal, children, ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { PortfolioDefinition } from '../modules/portfolio/types'\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/charts/blob/master/app/utils/fetch_api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nexport class ThrowableError extends Error {\r\n status: number\r\n isServerError = false\r\n body: unknown\r\n extra: Record = {}\r\n\r\n constructor(status: number, message = 'ThrowableError', body = '', extra: Record = {}) {\r\n super(`${status} ${message}`)\r\n this.status = status\r\n this.isServerError = status >= 500\r\n this.body = body\r\n this.extra = extra\r\n }\r\n}\r\n\r\nexport interface CancelablePromise extends Promise {\r\n aborted?: boolean\r\n cancel?: () => void\r\n}\r\n\r\n/**\r\n * General api fetch utility which returns a cancelable promise\r\n */\r\nexport function apiRequest(\r\n url: string,\r\n { query, headers = {}, ...options }: RequestInit & { query?: Record } = {},\r\n throwOnAllErrors = false\r\n): CancelablePromise {\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n const requestUrl = query ? `${url}?${new URLSearchParams(query)}` : url\r\n const contentType: ContentType = (headers as any)['Content-Type'] ?? ContentType.ApplicationJson\r\n\r\n const requestOptions = {\r\n ...options,\r\n headers: {\r\n 'Content-Type': contentType,\r\n ...headers,\r\n },\r\n }\r\n const request = fetch(requestUrl, { ...requestOptions, signal: controller?.signal })\r\n\r\n const cancelableRequest: CancelablePromise = request\r\n .then(async (response) => {\r\n const textResponse = await response.text()\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n\r\n try {\r\n const parsedResponse = parseResponseForContentType(textResponse, responseContentType)\r\n if (!response.ok || response.status >= 500) {\r\n throw new ThrowableError(response.status, response.statusText, parsedResponse, {\r\n rayId: response.headers.get('cf-ray'),\r\n })\r\n }\r\n\r\n return parsedResponse\r\n } catch (error: any) {\r\n if (error instanceof ThrowableError) {\r\n throw error\r\n }\r\n throw new ThrowableError(response.status, error.message, textResponse, {\r\n rayId: response.headers.get('cf-ray'),\r\n })\r\n }\r\n })\r\n .catch((error: ThrowableError) => {\r\n if (error.status >= 500) {\r\n Sentry.withScope((scope) => {\r\n scope.setContext('Cloudflare', error.extra)\r\n\r\n if (error.status === 500) {\r\n Sentry.captureException(error)\r\n } else {\r\n Sentry.captureMessage(`${error.status} ${error.message}`)\r\n }\r\n })\r\n }\r\n if (throwOnAllErrors) {\r\n throw error\r\n }\r\n })\r\n\r\n if (controller) {\r\n cancelableRequest.cancel = () => {\r\n controller.abort()\r\n cancelableRequest.aborted = true\r\n }\r\n }\r\n\r\n return cancelableRequest\r\n}\r\n\r\nexport interface SearchApiResult {\r\n ticker: string\r\n company: string\r\n exchange: string\r\n}\r\n\r\nexport function searchApiRequest(input = '') {\r\n return apiRequest('/api/suggestions.ashx', { query: { input } }, true)\r\n}\r\n\r\nexport function portfoliosRequest() {\r\n return apiRequest<{ portfolios: PortfolioDefinition[] }>('/api/portfolio_data.ashx', {\r\n query: {\r\n fields: 'portfolios',\r\n },\r\n })\r\n}\r\n\r\nexport function lastCloseRequest(ticker: string) {\r\n return apiRequest('/request_quote.ashx', {\r\n query: {\r\n t: ticker,\r\n },\r\n })\r\n}\r\n\r\ninterface PortfolioLimitResult {\r\n transactions: number\r\n limitTransactions: number\r\n}\r\n\r\nexport function portfolioLimitRequest(portfolioId: number) {\r\n return apiRequest('/api/portfolio_data.ashx', {\r\n query: {\r\n pid: portfolioId,\r\n fields: 'transactions,limitTransactions',\r\n },\r\n })\r\n}\r\n\r\nexport function setCookieRequest(name: string, value?: unknown) {\r\n return apiRequest(\r\n '/api/set_cookie.ashx',\r\n {\r\n query: {\r\n cookie: name,\r\n ...(value !== undefined && {\r\n value: value,\r\n }),\r\n },\r\n },\r\n true\r\n )\r\n}\r\n"],"names":["BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","ButtonPadding","ButtonAlign","ButtonSquareSize","ButtonRounding","ButtonTheme","getButtonTheme","theme","active","arguments","length","undefined","light","button","classnames","lightTransparent","dark","blue","violet","blueHover","red","headerItem","icon","menuItem","menuItemTransparent","menuItemDark","opacity","outline","chip","chipOutline","chipTransparent","link","linkText","tab","ButtonComponent","_ref","ref","as","asComponent","size","rounding","focusRing","appearance","align","padding","contentClass","leftContent","rightContent","className","children","props","isSquare","buttonTheme","React","buttonPadding","buttonSize","buttonRounding","hasIcons","_jsxs","_Fragment","_jsx","isValidIconName","Icon","name","left","center","xxsmall","xsmall","none","small","regular","includes","medium","large","Button","width","height","Error","iconList","fileName","filter","Boolean","join","Number","isFinite","href","FinvizSettings","versionImages","Component","root","chartLayouts","chartTools","chartTypes","screener","add","arrowBackward","arrowDownShort","arrowForward","arrowUpShort","briefcase","calendar","caretDown","caretLeft","caretRight","caretUp","caretVertical","chartBar","chartBubble","chartPie","chartTable","chartTreemap","chevronDown","chevronRight","close","darkMode","diamondOutlined","done","drag","draw","empty","exitFullscreen","flash","fullscreen","gesture","gift","hamburger","help","idea","ideaLoad","ideaSave","info","interval","lightMode","lock","lockOpened","menuClose","minus","more","note","openInNew","palette","profile","publish","refresh","remove","restore","search","settings","settingsWheel","share","signOut","star","starOutlined","switchHorizontal","switchVertical","tabKey","template","trashCan","trendingDown","trendingUp","triangle","triangleOutlineDown","triangleOutlineUp","warning","layout1h1v","layout1h2v","layout1h3v","layout1l2r","layout1t2b","layout2h1v","layout2h2v","layout3h1v","layout3h2v","drawingActionDelete","drawingSettingAutosaveOff","drawingSettingAutosaveOn","drawingSettingAutosaveSaving","drawingSettingDrawingMode","drawingSettingDrawingModeActive","drawingSettingHide","drawingSettingLock","drawingSettingPreserveDrawings","drawingSettingPreserveDrawingsActive","drawingSettingShow","drawingSettingUnlock","toolArrow","toolBrush","toolCallout","toolCurve","toolElliottWave","toolEllipse","toolExpand","toolFibonacci","toolLine","toolMeasure","toolMidLineH","toolMidLineV","toolMouse","toolPitchfork","toolPolygon","toolPosition","toolRect","toolRectRotated","toolText","toolTriangle","toolXABCD","candleBarBasic","candleBarHeikinAshi","candleBarHollow","lineChartType","ohlcChartType","above","aboveEqual","abovePercent","below","belowEqual","belowPercent","between","crosses","crossesDown","crossesUp","equal","outside","Spinner","isProgressBar","progress","radius","strokeWidth","circleXY","circumference","Math","PI","viewBox","xmlns","style","cx","cy","r","strokeDasharray","strokeDashoffset","strokeLinecap","Heading","level","getHeadingElement","Paragraph","_ref2","Label","_ref3","title","titleClassName","isHorizontal","ContentType","ThrowableError","constructor","status","body","extra","super","_defineProperty","this","isServerError","apiRequest","url","_ContentType","query","headers","options","throwOnAllErrors","controller","window","AbortController","requestUrl","URLSearchParams","requestOptions","ApplicationJson","cancelableRequest","fetch","signal","then","async","textResponse","response","text","responseContentType","get","Html","parsedResponse","contentType","ApplicationJsonUTF","FormUrlEncoded","JSON","parse","parseResponseForContentType","ok","statusText","rayId","error","message","catch","Sentry","scope","setContext","cancel","abort","aborted","searchApiRequest","input","portfoliosRequest","fields","lastCloseRequest","ticker","t","portfolioLimitRequest","portfolioId","pid","setCookieRequest","value","cookie"],"sourceRoot":""}