{"version":3,"file":"9812.c469aa98.js","mappings":"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AS,Y,EACM,CACjBC,MAAO6jB,IAAAA,OAAiBC,WACxB7jB,OAAQ4jB,IAAAA,OAAiBC,WACzBjkB,KAAMgkB,IAAAA,QAAkBA,IAAAA,QAAkBC,a,4YAqC9C,S,kBCrDO,SAASpI,IACd,MAAO,MACT,C,8FCKA,MAoBaqI,EAAmB,CAC9B9F,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,WAEP8F,EAAmB,CAAE/F,OAAQ8F,EAAiB9F,OAAOgG,QAAQC,UAAWhG,UAAW6F,EAAiB7F,WACpGiG,EAAc,CAAElG,OAAQ8F,EAAiB9F,OAAOgG,MAAM,EAAG,IAAIC,UAAWhG,UAAW6F,EAAiB7F,WACpGkG,EAAgB,CAAEnG,OAAQ8F,EAAiB9F,OAAOgG,MAAM,IAAK/F,UAAW6F,EAAiB7F,WA49DzFmG,EAA0B,CAC9BpG,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,QAg/BAN,EAAiD,CAC5D,CAAC1B,EAAAA,GAAQL,SAAUkI,EACnBO,GAAIP,EACJQ,IAAKR,EACLS,IAAKT,EACLU,IAAKV,EACLW,IAAKX,EACLY,QA77HmB,CACnB1G,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,WAm9FX0G,IAAKZ,EACLa,KAAMb,EACNc,KAAMd,EACNe,IAAKf,EACLgB,IAAKhB,EACLiB,KAAMb,EACNc,OAAQnB,EACRoB,OAAQhB,EACRiB,KAAMrB,EACNsB,UA19FuB,CACvBpH,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,WAg/DXoH,cAAevB,EACfwB,cAAexB,GAGJyB,EAAuD,CAClE,CAACtJ,EAAAA,GAAQL,SAAUwI,EACnBC,GAAID,EACJE,IAAKF,EACLG,IAAKH,EACLI,IAAKJ,EACLK,IAAKL,EACLM,QA3gC0B,CAC1B1G,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,QAiCX0G,IAAKP,EACLQ,KAAMR,EACNS,KAAMT,EACNU,IAAKV,EACLW,IAAKX,EACLY,KAAMZ,EACNa,OAAQb,EACRc,OAAQd,EACRe,KAAMf,EACNgB,UAAWhB,EACXiB,cAAejB,EACfkB,cAAelB,GAGJxG,EAviIiB,CAC5BI,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,UAAW,U,kBCtBN,SAASpW,EAAU2d,GACxB,OAAO,IAAIC,SAAQ,CAACC,EAASC,KAC3B,IAAI/d,EAAQ,IAAIge,MAEhBhe,EAAMie,OAAS,WACbH,EAAQ9d,EACV,EAEAA,EAAMke,QAAU,WACdH,GACF,EAEA/d,EAAM4d,IAAMA,CAAG,GAEnB,C,kCCjBO,SAASO,IAAgB,IAAAC,EAC9B,OAA8B,QAA9BA,EAAOtd,OAAOud,wBAAgB,IAAAD,EAAAA,EAAI,CACpC,CAEO,SAAStf,EACd5C,EACAT,EACAtD,EACAC,GAEA,IAAK8D,IAAWT,EAAS,OAEzB,MAAM6iB,EAAQH,IAQd,OANAjiB,EAAO/D,MAAQA,EAAQmmB,EACvBpiB,EAAO9D,OAASA,EAASkmB,EACzBpiB,EAAOvH,MAAMwD,MAAQA,EAAQ,KAC7B+D,EAAOvH,MAAMyD,OAASA,EAAS,KAC/BqD,EAAQD,MAAM8iB,EAAOA,GAEdA,CACT,C,uGCrBO,IAAKC,EAAW,SAAXA,GAAW,OAAXA,EAAAA,EAAW,eAAXA,EAAAA,EAAW,uCAAXA,EAAAA,EAAW,uBAAXA,CAAW,MAMhB,SAASC,IACd,OAAI1e,eAAe2e,eAAuBF,EAAYG,KAEnB,IAA/B5e,eAAe6e,YACVJ,EAAYK,SAGdL,EAAYM,gBACrB,CAKO,SAASC,EAAc9rB,GAA0E,IAAA+rB,EAAAC,EAAAC,EAAAC,EACtG,MAAM,SAAEC,EAAWre,OAAO8J,SAASuU,SAAQ,MAAE7U,EAAQxJ,OAAO8J,SAASC,OAAM,iBAAEuU,GAAmB,GAASpsB,EAKtC,IAAAqsB,GAHxD,QAAXN,GAAAC,EAAAle,QAAOwe,YAAI,IAAAP,GAAXA,EAAA5hB,KAAA6hB,EAAc,MAAO,YAAa,GAAFvZ,OAAK0Z,GAAQ1Z,OAAG6E,EAAMjU,OAAS,IAAM,IAAEoP,OAAG6E,EAAMgB,QAAQ,MAAO,MACpF,QAAX2T,GAAAC,EAAApe,QAAOwe,YAAI,IAAAL,GAAXA,EAAA9hB,KAAA+hB,EAAc,QAAS,aAEnBE,GAAoBZ,MAAqBD,EAAYK,YACxC,QAAfS,EAAAve,OAAOye,gBAAQ,IAAAF,GAAfA,EAAiBG,MAAMvpB,MAAK,IAAMspB,SAASE,kBAE/C,C,qGCvBO,IAAKC,EAAY,SAAZA,GAAY,OAAZA,EAAY,gBAAZA,EAAY,kBAAZA,EAAY,gBAAZA,EAAY,YAAZA,EAAY,YAAZA,EAAY,YAAZA,EAAY,gBAAZA,EAAY,cAAZA,EAAY,gBAAZA,EAAY,YAAZA,EAAY,UAAZA,EAAY,YAAZA,EAAY,kBAAZA,CAAY,MAgBZC,EAAY,SAAZA,GAAY,OAAZA,EAAY,QAAZA,EAAY,yBAAZA,EAAY,0BAAZA,CAAY,MA8BxB,SAASC,EAAiBzZ,EASxBxL,GACA,IAAAklB,EAAA,IATA,UACE/nB,EAAS,MACTyQ,EAAK,KACL1B,EAAO,UAAS,MAChBhO,EAAQ6mB,EAAaxf,QAAO,SAC5BnJ,KACG/D,GAC8BmT,EAGnC,MAAM2Z,EAAuB,QAAhBD,EAAG7sB,EAAM8sB,eAAO,IAAAD,EAAAA,EAAI7sB,EAAM+sB,eAEvC,OACEpoB,EAAAA,EAAAA,MAAA,SACEG,UAAWQ,IAAWR,EAAW6nB,EAAa9Y,GAAO,0BAA2B,CAC9E,mCAAoC7T,EAAMgtB,WACzCjpB,SAAA,EAEHY,EAAAA,EAAAA,MAAA,OAAKG,UAAU,qBAAoBf,SAAA,EACjCc,EAAAA,EAAAA,KAAA,YACM7E,EACJ2H,IAAKA,EACL7D,KAAK,WACLgB,UAAWQ,IACT,iHACA,iEACA,8BACA,0PAEA,CACE,sQACEO,IAAU6mB,EAAaO,OACzB,8QACEpnB,IAAU6mB,EAAaQ,QACzB,sQACErnB,IAAU6mB,EAAaS,OACzB,sPACEtnB,IAAU6mB,EAAaU,KACzB,sPACEvnB,IAAU6mB,EAAaW,KACzB,sPACExnB,IAAU6mB,EAAaY,KACzB,sQACEznB,IAAU6mB,EAAaa,OACzB,8PACE1nB,IAAU6mB,EAAac,MACzB,sQACE3nB,IAAU6mB,EAAae,OACzB,sPACE5nB,IAAU6mB,EAAagB,KACzB,8OACE7nB,IAAU6mB,EAAaiB,IACzB,sPACE9nB,IAAU6mB,EAAakB,KACzB,iNACE/nB,IAAU6mB,EAAaxf,YAI9B4f,IACCjoB,EAAAA,EAAAA,KAACoR,EAAAA,GAAI,CACHlT,KAAK,OACL+B,UAAWQ,IAAW,4BAA6B,CACjD,eAAgBO,IAAU6mB,EAAaxf,QACvC,gCAAiCrH,IAAU6mB,EAAaxf,UAE1D/H,MAAO,QAIZoQ,QAAAA,EAASxR,IAGhB,CAEO,MAAM8pB,GAAWC,EAAAA,EAAAA,YAAWlB,E,iKCpHnC,SAASmB,EAAMC,GAA+B,IAAlB1K,EAAG/jB,UAAA8D,OAAA,QAAA1D,IAAAJ,UAAA,GAAAA,UAAA,GAAG,EAAGwC,EAAGxC,UAAA8D,OAAA,QAAA1D,IAAAJ,UAAA,GAAAA,UAAA,GAAG,EACzC,OAAOyuB,EAAMjsB,EAAMA,EAAMisB,EAAM1K,EAAMA,EAAM0K,CAC7C,CAKA,SAASC,EAAQjoB,GACf,MAAO,YAAaA,CACtB,CAKA,SAASkoB,EAAoBjqB,EAAsB+B,GACjD,MAAMmoB,EAAOlqB,EAAKmqB,wBAGZC,EAAUJ,EAAQjoB,GAASA,EAAMsoB,QAAQ,GAAMtoB,EAErD,MAAO,CACLpE,KAAMmsB,GAAOM,EAAQE,OAASJ,EAAKvsB,KAAOkM,OAAO0gB,cAAgBL,EAAKhpB,OACtEtD,IAAKksB,GAAOM,EAAQI,OAASN,EAAKtsB,IAAMiM,OAAO4gB,cAAgBP,EAAK/oB,QAExE,CAOA,SAASupB,EAAmB3oB,IACzBioB,EAAQjoB,IAAUA,EAAMsE,gBAC3B,CAOA,SAASskB,EAAwBzb,GAKwB,IALvB,OAChC0b,EAAM,MACNC,EAAK,UACLhqB,KACG9E,GACkDmT,EACrD,MAAM4b,GAAYC,EAAAA,EAAAA,QAAuB,MACnCC,GAAaD,EAAAA,EAAAA,SAAO,IACnBE,EAAYC,IAAeC,EAAAA,EAAAA,WAAS,GAMrCC,GAAUL,EAAAA,EAAAA,SAAQhpB,KAClBipB,EAAW3nB,UAAY2mB,EAAQjoB,MAC9BipB,EAAW3nB,UAAS2nB,EAAW3nB,QAAU2mB,EAAQjoB,KAC/C,KAGHspB,GAAaC,EAAAA,EAAAA,cAChBvpB,IACC2oB,EAAmB3oB,IAOJioB,EAAQjoB,GAASA,EAAMsoB,QAAQjrB,OAAS,EAAI2C,EAAMwpB,QAAU,IAE7DT,EAAUznB,QACtBunB,EAAOX,EAAoBa,EAAUznB,QAAStB,IAE9CmpB,GAAY,EACd,GAEF,CAACN,IAGGY,GAAkBF,EAAAA,EAAAA,cACtBpH,IAA0D,IAAzD,YAAEuH,GAAkDvH,EACnDwG,EAAmBe,GAEdL,EAAQ/nB,QAAQooB,KAIrBb,EAAOX,EAAoBa,EAAUznB,QAAUooB,IAC/CP,GAAY,GAAK,GAEnB,CAACN,IAGGc,GAAgBJ,EAAAA,EAAAA,cACnBvpB,IACC,MAAM4pB,EAAU5pB,EAAM6pB,OAAS7pB,EAAM4pB,QAGjCA,EAAU,IAAMA,EAAU,KAE9B5pB,EAAMsE,iBAINwkB,EAAM,CACJltB,KAAkB,KAAZguB,EAAiB,IAAmB,KAAZA,GAAkB,IAAO,EACvD/tB,IAAiB,KAAZ+tB,EAAiB,IAAmB,KAAZA,GAAkB,IAAO,IACtD,GAEJ,CAACd,IAGGgB,GAAgBP,EAAAA,EAAAA,cAAY,IAAMJ,GAAY,IAAQ,IAEtDY,GAAuBR,EAAAA,EAAAA,cAC1B3uB,IAEC,MAAMovB,EAAcpvB,EAAQkN,OAAO1L,iBAAmB0L,OAAOpL,oBAC7DstB,EAAYf,EAAW3nB,QAAU,YAAc,YAAagoB,GAC5DU,EAAYf,EAAW3nB,QAAU,WAAa,UAAWwoB,EAAc,GAEzE,CAACR,EAAYQ,IAUf,OAPAG,EAAAA,EAAAA,kBAAgB,KACdF,EAAqBb,GACd,KACLA,GAAca,GAAqB,EAAM,IAE1C,CAACb,EAAYa,KAGdlrB,EAAAA,EAAAA,KAAA,UACM7E,EACJ2H,IAAKonB,EACLjqB,UAAWQ,IAAWR,EAAW,yBACjCorB,aAAcT,EACd3nB,YAAa2nB,EACbU,UAAWR,EACXS,SAAU,GAGhB,CAEO,MAAMC,GAAkBC,EAAAA,EAAAA,MAAK1B,GCrJ7B,SAAS2B,EAAOpd,GAA2C,IAA1C,MAAEtN,EAAK,KAAEjE,EAAI,IAAEC,EAAM,IAAmBsR,EAC9D,OACEtO,EAAAA,EAAAA,KAAA,OACEC,UAAU,oGACVnD,MAAO,CACLE,IAAK,GAAF4Q,OAAW,IAAN5Q,EAAS,KACjBD,KAAM,GAAF6Q,OAAY,IAAP7Q,EAAU,MACnBmC,UAEFc,EAAAA,EAAAA,KAAA,OAAKC,UAAU,mDAAmDnD,MAAO,CAAEoD,gBAAiBc,MAGlG,C,yBCcO,SAAS2qB,EAAgBC,GAC9B,MAAMC,EAAWC,EAAiBF,GAClC,IAAIhT,EAAqB,EACrBV,EAAqB,EACrB3Y,EAAqB,EACrBD,EAAqB,IAmBzB,OAhBwB,IAApBusB,EAASrtB,QAAoC,IAApBqtB,EAASrtB,QACpCoa,EAAI,KAAOiT,EAAS,GAAKA,EAAS,GAClC3T,EAAI,KAAO2T,EAAS,GAAKA,EAAS,GAClCtsB,EAAI,KAAOssB,EAAS,GAAKA,EAAS,GAElCvsB,EAAwB,IAApBusB,EAASrtB,OAAe,KAAOqtB,EAAS,GAAKA,EAAS,GAAKvsB,GAGlC,IAApBusB,EAASrtB,QAAoC,IAApBqtB,EAASrtB,SAC3Coa,EAAI,KAAOiT,EAAS,GAAKA,EAAS,GAClC3T,EAAI,KAAO2T,EAAS,GAAKA,EAAS,GAClCtsB,EAAI,KAAOssB,EAAS,GAAKA,EAAS,GAElCvsB,EAAwB,IAApBusB,EAASrtB,OAAe,KAAOqtB,EAAS,GAAKA,EAAS,GAAKvsB,GAG1D,CAAEsZ,EAAGxM,OAAOwM,GAAIV,EAAG9L,OAAO8L,GAAI3Y,EAAG6M,OAAO7M,GAAID,EAAGrC,KAAKwhB,IAAIxhB,KAAKgQ,MAAOb,OAAO9M,GAAK,IAAO,KAAO,IAAK,GAC5G,CASO,SAASysB,EAAgBH,GAC9B,OAAOI,EAAWL,EAAgBC,GACpC,CAoBO,SAASK,EAAWC,GACzB,OAAOjvB,KAAKC,IAAID,KAAKwhB,IAAIxhB,KAAKgQ,MAAc,IAARif,GAAc,KAAM,GACrDve,SAAS,IACTwe,SAAS,EAAG,IACjB,CASO,SAASC,EAAgBprB,GAA4B,IAAfkrB,EAAKxxB,UAAA8D,OAAA,QAAA1D,IAAAJ,UAAA,IAAAA,UAAA,GAChD,MAAMke,EAAI5X,EAAM4X,EAAEjL,SAAS,IACrBuK,EAAIlX,EAAMkX,EAAEvK,SAAS,IACrBpO,EAAIyB,EAAMzB,EAAEoO,SAAS,IACrBie,EAAY,IAAMhT,EAAEuT,SAAS,EAAG,KAAOjU,EAAEiU,SAAS,EAAG,KAAO5sB,EAAE4sB,SAAS,EAAG,KAEhF,OAAKD,GAAqB,IAAZlrB,EAAM1B,EAIb,GAAPsO,OAAUge,GAAShe,OAAGqe,EAAWjrB,EAAM1B,IAH9BssB,CAIX,CAWO,SAASS,EAAgBrrB,GAA4B,IAAfkrB,EAAKxxB,UAAA8D,OAAA,QAAA1D,IAAAJ,UAAA,IAAAA,UAAA,GAGhD,OAAO0xB,EAFWE,EAAWtrB,GAEKkrB,EACpC,CAyBO,SAASF,EAAWhrB,GACzB,MAAM4X,EAAI5X,EAAM4X,EAAI,IACdV,EAAIlX,EAAMkX,EAAI,IACd3Y,EAAIyB,EAAMzB,EAAI,IAEdwZ,EAAI9b,KAAKC,IAAI0b,EAAGV,EAAG3Y,GACnBsB,EAAIkY,EAAI9b,KAAKwhB,IAAI7F,EAAGV,EAAG3Y,GACvB4Y,EAAItX,IAAMkY,IAAMH,GAAKV,EAAI3Y,GAAKsB,EAAIkY,IAAMb,EAAI,GAAK3Y,EAAIqZ,GAAK/X,EAAI,GAAK+X,EAAIV,GAAKrX,GAElF,MAAO,CACLsX,EAAG,IAAMA,EAAI,EAAIA,EAAI,EAAIA,GACzBU,EAAGE,EAAIlY,EAAIkY,EAAI,EACfA,EAAGA,EACHzZ,EAAG0B,EAAM1B,EAEb,CAoCO,SAASgtB,EAAWtrB,GACzB,MAAMiX,EAAI,SAACO,GAAS,IAAEH,EAAC3d,UAAA8D,OAAA,QAAA1D,IAAAJ,UAAA,GAAAA,UAAA,IAAI8d,EAAIxX,EAAMmX,EAAI,IAAM,EAAC,OAAKnX,EAAM+X,EAAI/X,EAAM+X,EAAI/X,EAAM6X,EAAI5b,KAAKC,IAAID,KAAKwhB,IAAIpG,EAAG,EAAIA,EAAG,GAAI,EAAE,EAErH,MAAO,CACLO,EAAG3b,KAAKgQ,MAAa,IAAPgL,EAAE,IAChBC,EAAGjb,KAAKgQ,MAAa,IAAPgL,EAAE,IAChB1Y,EAAGtC,KAAKgQ,MAAa,IAAPgL,EAAE,IAChB3Y,EAAGrC,KAAKgQ,MAAgB,IAAVjM,EAAM1B,GAAW,IAEnC,CA6BO,SAASitB,EAAiBvrB,GAC/B,MAAO,QAAP4M,OAAe5M,EAAM4X,EAAC,MAAAhL,OAAK5M,EAAMkX,EAAC,MAAAtK,OAAK5M,EAAMzB,EAAC,MAAAqO,OAAK5M,EAAM1B,EAAC,IAC5D,CASO,SAASktB,EAAmBxrB,GACjC,MAAMyrB,EAAa,gFAAgFC,KAAK1rB,IACjG8nB,EAAKH,EAAOE,EAAMqD,EAAQ,MAAOO,aAAU,EAAVA,EAAYlI,MAAM,KAAM,CAAC,EAAG,EAAG,EAAG,GAAG3jB,IAAI+rB,QACjF,MAAO,CACL/T,EAAGxM,OAAOwgB,SAAS9D,GACnB5Q,EAAG9L,OAAOwgB,SAASjE,GACnBppB,EAAG6M,OAAOwgB,SAAS/D,GACnBvpB,EAAG8M,OAAO2V,WAAWmK,GAEzB,CAeO,SAASJ,EAAiBe,GAC/B,OAAOA,EAASpZ,QAAQ,KAAM,GAChC,CAKO,SAASqZ,EAAaD,GAC3B,MAAME,EAAQF,EAASG,WAAW,QAC5BnU,GAAI,IAAIoU,QAASnwB,MAIvB,OAFA+b,EAAE7X,MAAQ+rB,EAAQF,EAAW,IAAHjf,OAAOke,EAAiBe,IAE/B,KAAZhU,EAAE7X,KACX,CAKO,SAASksB,EAAkBL,GAGhC,OAFcM,EAASN,GAGdT,EAAgBI,EAAmBK,IAAW,GAGhDA,CACT,CAKO,SAASM,EAASN,GACvB,MAAMO,EAAU,CAAC,OAIjB,SALuD1yB,UAAA8D,OAAA,QAAA1D,IAAAJ,UAAA,KAAAA,UAAA,KAGrD0yB,EAAQhvB,KAAK,QAERgvB,EAAQC,MAAML,GAAeH,EAASG,WAAWA,IAC1D,CAKO,SAASM,EAAiBT,GAC/B,OAAIM,EAASN,GACJb,EAAWQ,EAAmBK,IAGhCd,EAAgBc,EACzB,CC3TO,SAASU,EAAKjf,GAAsC,IAArC,MAAEtN,EAAK,SAAE8P,GAA0BxC,EACvD,MAAMkf,GAAkB9C,EAAAA,EAAAA,cAAa+C,GAAqB3c,EAAS,IAAK9P,EAAO1B,EAAG,EAAImuB,EAAI1wB,QAAS,CAAC+T,EAAU9P,IAExG0sB,GAAkBC,EAAAA,EAAAA,UAAQ,KAC9B,MAAMC,EAAevB,EAAgB,IAAKrrB,EAAO1B,EAAG,IAC9CuuB,EAAaxB,EAAgB,IAAKrrB,EAAO1B,EAAG,IAAK,GAEvD,MAAO,0BAAPsO,OAAiCggB,EAAY,MAAAhgB,OAAKigB,EAAU,OAG3D,CAAC7sB,EAAMmX,EAAGnX,EAAM6X,EAAG7X,EAAM+X,IAE5B,OACEjZ,EAAAA,EAAAA,MAAC0rB,EAAe,CAACxB,OAAQwD,EAAiBvD,MAAOuD,EAAiB,aAAW,QAAOtuB,SAAA,EAClFc,EAAAA,EAAAA,KAAA,OAAKC,UAAU,wEAAuEf,UACpFc,EAAAA,EAAAA,KAAA,OAAKC,UAAU,OAAOnD,MAAO,CAAEgxB,gBAAiBJ,QAElD1tB,EAAAA,EAAAA,KAAC0rB,EAAO,CAAC1uB,IAAK,GAAKD,KAAM,EAAIiE,EAAM1B,EAAG0B,MAAOqrB,EAAgBrrB,GAAO,OAG1E,C,eC5BA,MAAM+sB,EAAiB,CACrB,CAAEpuB,MAAO,OAAQyO,MAAO,WACxB,CAAEzO,MAAO,OAAQyO,MAAO,WACxB,CAAEzO,MAAO,UAAWyO,MAAO,WAC3B,CAAEzO,MAAO,SAAUyO,MAAO,WAC1B,CAAEzO,MAAO,SAAUyO,MAAO,WAC1B,CAAEzO,MAAO,SAAUyO,MAAO,WAC1B,CAAEzO,MAAO,OAAQyO,MAAO,WACxB,CAAEzO,MAAO,aAAcyO,MAAO,WAC9B,CAAEzO,MAAO,OAAQyO,MAAO,WACxB,CAAEzO,MAAO,OAAQyO,MAAO,WACxB,CAAEzO,MAAO,UAAWyO,MAAO,WAC3B,CAAEzO,MAAO,QAASyO,MAAO,WACzB,CAAEzO,MAAO,OAAQyO,MAAO,WACxB,CAAEzO,MAAO,SAAUyO,MAAO,WAC1B,CAAEzO,MAAO,QAASyO,MAAO,WACzB,CAAEzO,MAAO,MAAOyO,MAAO,YAkClB,SAAS4f,EAAY1f,GAAkE,IAAjE,MAAEtN,EAAK,OAAEud,EAASwP,EAAc,SAAEjd,GAA6BxC,EAC1F,MAAM2f,EAAiBjtB,EAAMktB,cAE7B,OACEluB,EAAAA,EAAAA,KAAA,OAAKC,UAAU,yBAAyB,cAAY,gBAAef,SAChEqf,EAAO3d,KAAKutB,IACX,MAAMC,EAAaH,EAAejB,WAAWmB,EAAS/f,OACtD,OACEpO,EAAAA,EAAAA,KAAA,OAEEC,UAAU,sDACVN,MAAOwuB,EAASxuB,MAChB7C,MAAO,CAAEoD,gBAAiBiuB,EAAS/f,OACnCgE,QAASA,IAAMtB,EAASqd,EAAS/f,MAAO2d,EAAgBoC,EAAS/f,QAAQlP,SAExEkvB,IAAcpuB,EAAAA,EAAAA,KAACoR,EAAAA,GAAI,CAAClT,KAAK,OAAO+B,UAAU,kBANtCkuB,EAAS/f,MAOV,KAKhB,CCxDO,SAASigB,EAAa/f,GAA0C,IAAzC,MAAEtN,EAAK,SAAE8P,GAA8BxC,EACnE,MAAMggB,GAAWX,EAAAA,EAAAA,UAAQ,IAR3B,SAA6B3sB,GAC3B,MAAO,CACLjE,KAAMiE,EAAMmX,EAAI,IAChBnb,IAAK,EAAIgE,EAAM6X,EAEnB,CAGiC0V,CAAoBvtB,IAAQ,CAACA,IAEtDwtB,GAAeb,EAAAA,EAAAA,UAAQ,IAAMtB,EAAgB,CAAElU,EAAGnX,EAAMmX,EAAGU,EAAG7X,EAAM6X,EAAGE,EAAG,EAAGzZ,EAAG,KAAM,CAAC0B,EAAMmX,EAAGnX,EAAM6X,IAEtG4V,GAAmB/D,EAAAA,EAAAA,cACtB+C,GACC3c,EAAS,CACPqH,EAAGlb,KAAKgQ,MAAiB,IAAXwgB,EAAI1wB,MAClB8b,EAAG,EAAI4U,EAAIzwB,IACX+b,EAAG,EACHzZ,EAAG0B,EAAM1B,KAEb,CAAC0B,EAAM1B,EAAGwR,IAGZ,OACEhR,EAAAA,EAAAA,MAAC0rB,EAAe,CACdxB,OAAQyE,EACRxE,MAAOwE,EACP,aAAW,QACXxuB,UAAU,qBAAoBf,SAAA,EAE9Bc,EAAAA,EAAAA,KAAA,OAAKC,UAAU,yEAAwEf,UACrFc,EAAAA,EAAAA,KAAA,OAAKC,UAAU,sCAEjBD,EAAAA,EAAAA,KAAC0rB,EAAO,CAAC1uB,IAAKsxB,EAAStxB,IAAKD,KAAMuxB,EAASvxB,KAAMiE,MAAOwtB,MAG9D,CCpCO,SAASE,EAASpgB,GAAsC,IAArC,MAAEtN,EAAK,SAAE8P,GAA0BxC,EAC3D,MAAMkf,GAAkB9C,EAAAA,EAAAA,cAAa+C,GAAqB3c,EAAS,IAAK9P,EAAO+X,EAAG,EAAI0U,EAAI1wB,QAAS,CAAC+T,EAAU9P,IAExGwtB,GAAeb,EAAAA,EAAAA,UACnB,IAAMtB,EAAgB,CAAElU,EAAGnX,EAAMmX,EAAGU,EAAG7X,EAAM6X,EAAGE,EAAG/X,EAAM+X,EAAGzZ,EAAG,KAC/D,CAAC0B,EAAMmX,EAAGnX,EAAM6X,EAAG7X,EAAM+X,IAGrB2U,GAAkBC,EAAAA,EAAAA,UAAQ,KAC9B,MAAMC,EAAevB,EAAgB,CAAElU,EAAGnX,EAAMmX,EAAGU,EAAG7X,EAAM6X,EAAGE,EAAG,EAAGzZ,EAAG,IAClEuuB,EAAaxB,EAAgB,CAAElU,EAAGnX,EAAMmX,EAAGU,EAAG7X,EAAM6X,EAAGE,EAAG,EAAGzZ,EAAG,IAEtE,MAAO,0BAAPsO,OAAiCggB,EAAY,MAAAhgB,OAAKigB,EAAU,OAC3D,CAAC7sB,EAAMmX,EAAGnX,EAAM6X,IAEnB,OACE/Y,EAAAA,EAAAA,MAAC0rB,EAAe,CAACxB,OAAQwD,EAAiBvD,MAAOuD,EAAiB,aAAW,YAAWtuB,SAAA,EACtFc,EAAAA,EAAAA,KAAA,OAAKC,UAAU,sBAAsBnD,MAAO,CAAEgxB,gBAAiBJ,MAC/D1tB,EAAAA,EAAAA,KAAC0rB,EAAO,CAAC1uB,IAAK,GAAKD,KAAM,EAAIiE,EAAM+X,EAAG/X,MAAOwtB,MAGnD,C,eCTO,SAASG,EAAYrgB,GAAgD,IAA/C,KAAEsgB,EAAI,MAAE5tB,EAAK,UAAEf,GAA8BqO,EACxE,MAAMiQ,EAAS9C,MAAMC,QAAQ1a,GAASA,EAAQ,CAACA,GACzC6tB,ELwUD,SAAyC7tB,GAC9C,OARK,SAAyBA,GAC9B,MAAO,MAASA,EAAM4X,EAAI,MAAS5X,EAAMkX,EAAI,MAASlX,EAAMzB,CAC9D,CAMSuvB,CAAgB9tB,IAAU,KAAOA,EAAM1B,EAAI,EACpD,CK1UqByvB,CAAgCpD,EAAgBpN,EAAO,KAC1E,OACEze,EAAAA,EAAAA,MAAA,OACEG,UAAWQ,IACT,mHACAR,GACAf,SAAA,CAED0vB,IACC5uB,EAAAA,EAAAA,KAAA,OAAKC,UAAU,gFAA+Ef,UAC3F8vB,EAAAA,EAAAA,IAAgBJ,IACf5uB,EAAAA,EAAAA,KAACoR,EAAAA,GAAI,CAAClT,KAAM0wB,EAAM3uB,UAAU,WAAWe,MAAO6tB,EAAa,QAAU,QAASvuB,MAAM,OAAOC,OAAO,SAElGquB,IAILrQ,EAAO3d,KAAI,CAACI,EAAO4K,KAElB5L,EAAAA,EAAAA,KAAA,OAAiBC,UAAU,gBAAgBnD,MAAO,CAAEoD,gBAAiBc,GAAQ9B,SAAC,KAApE0M,OAMlB,CC/BO,MAAMqjB,EAAc/tB,EAAAA,YACzB,CAAAoN,EAEExL,KACG,IAFH,MAAE9B,EAAK,WAAEkuB,EAAU,gBAAEC,GAAkB,EAAI,SAAEre,KAAa3V,GAAyBmT,EAGnF,MAAO8gB,EAAYC,IAAiB9E,EAAAA,EAAAA,UAAS+E,EAA2BtuB,IAClEuuB,EAASD,EAAmBF,IAElCI,EAAAA,EAAAA,YAAU,KACRH,EAAcC,EAA2BtuB,GAAO,GAC/C,CAACA,IAEJ,MAAMyuB,GAAyB/E,EAAAA,EAAAA,cAC5BvpB,IACC,MAAMiN,EAAQkhB,EAA2BnuB,EAAMuuB,cAActhB,OACvDmhB,EAASnhB,EAAM4e,WAAW,QAC1B2C,EAAaJ,EAASnhB,EAAQ,IAAHR,OAAOQ,GAExCihB,EAAcjhB,IACTA,EAAM5P,QAAU,GAAM+wB,GAAUnhB,EAAM5P,QAAU,KAAQ8wB,EAAuBK,IAClF7e,EAAS6e,EAAYL,EAA0BK,GACjD,GAEF,CAAC7e,IAEH,OACE9Q,EAAAA,EAAAA,KAAC4vB,EAAAA,GAAK,IACAz0B,EACJ2H,IAAKA,EACLsL,MAAOghB,EACPF,WAAYzuB,IACV,YACA,CACE,UAAW0uB,IAAoBI,EAC/B,QAASJ,GAAmBI,EAC5B,QAASJ,IAAoBI,EAC7B,OAAQJ,GAAmBI,GAE7BL,GAEFW,aACE/vB,EAAAA,EAAAA,MAAA,OAAKG,UAAWQ,IAAW,oBAAqB,CAAE,YAAa0uB,IAAmBjwB,SAAA,CAC/EiwB,IACCnvB,EAAAA,EAAAA,KAAA,OAAKC,UAAU,UAASf,UACtBc,EAAAA,EAAAA,KAAC2uB,EAAY,CAAC3tB,MAAOA,EAAOf,UAAU,eAGxCsvB,IAAUvvB,EAAAA,EAAAA,KAAA,QAAMC,UAAWQ,IAAW,CAAE,OAAQ0uB,IAAmBjwB,SAAC,SAG1E4R,SAAU2e,GACV,IChBD,SAASK,EAAWxhB,GAON,IAPO,MAC1BtN,EAAK,gBACL+uB,GAAkB,EAAI,eACtBC,GAAiB,EAAI,aACrBC,EAAe,MAAK,SACpBnf,EAAQ,mBACRof,GACiB5hB,EACjB,MAAM6hB,GAAchG,EAAAA,EAAAA,QAAOnpB,IACpBovB,EAAWC,IAAY9F,EAAAA,EAAAA,UAAS+E,EAA2BtuB,IAC5DqQ,EAAUif,EAAAA,KACVC,EAAQlf,aAAO,EAAPA,EAASkZ,SAAS,sBAKhCiF,EAAAA,EAAAA,YAAU,KACR,MAAMgB,EAAelB,EAA2Ba,EAAY1tB,SACtDguB,EAAWnB,EAA2BtuB,GAExCwvB,IAAiBC,GAAanB,EAAuBmB,KAEzDN,EAAY1tB,QAAUzB,EACtBqvB,EAASf,EAA2BtuB,IAAO,GAC1C,CAACA,IAQJ,MAAM0vB,GAAmBhG,EAAAA,EAAAA,cACtB1pB,IACC,MAAM2vB,EPmPL,SAA4B3vB,EAAa4vB,EAAwBZ,GACtE,MACO,SADCY,EAEGrE,EAAiBD,EAAWtrB,IAE5BqrB,EAAgBrrB,EAAOgvB,EAEpC,CO1P0BV,CAA6BtuB,EAAOivB,EAAcD,GACtEG,EAAY1tB,QAAUkuB,EACtB7f,EAAS6f,EAAa3vB,GACtBqvB,EAASrvB,EAAM,GAEjB,CAAC8P,EAAUkf,EAAgBC,IAGvBY,GAAuBnG,EAAAA,EAAAA,cAAY,KAAM,IAAAoG,EAC7C,MAAM1iB,EAAoC,QAA/B0iB,EAAGC,OAAO,6BAAqB,IAAAD,OAAA,EAA5BA,EAA8BE,OAE5C,IAAK5iB,EAAO,OAIZ,IAFgBkhB,EAAuBlhB,GAGrC,OAAO6iB,MAAM,iCAGfP,EAAiBpB,EAA2BlhB,GAAO,GAClD,CAACsiB,IAEJ,OACE5wB,EAAAA,EAAAA,MAAA,OAAKG,UAAU,qDAAoDf,SAAA,CAChE6wB,IACCjwB,EAAAA,EAAAA,MAAAoS,EAAAA,SAAA,CAAAhT,SAAA,EACGgyB,EAAAA,EAAAA,QACClxB,EAAAA,EAAAA,KAACmS,EAAAA,EAAM,CAACC,QAASye,EAAsB5wB,UAAU,gBAAgBkxB,aAAa,cAAajyB,SAAC,sBAI9Fc,EAAAA,EAAAA,KAACquB,EAAa,CAACrtB,MAAOovB,EAAWtf,SAAU4f,KAC3C1wB,EAAAA,EAAAA,KAAC0uB,EAAS,CAAC1tB,MAAOovB,EAAWtf,SAAU4f,IAEtCV,IAAkBhwB,EAAAA,EAAAA,KAACutB,EAAK,CAACvsB,MAAOovB,EAAWtf,SAAU4f,QAI1D1wB,EAAAA,EAAAA,KAAA,OACEC,UAAWQ,IAAW,CACpB,wEAAyEsvB,IACxE7wB,UAEHc,EAAAA,EAAAA,KAACguB,EAAY,CACXhtB,MAAOA,EACP8P,SAAUA,CAACsgB,EAAMC,KACfd,SAAAA,EAAOe,MAAM,CAAEC,eAAe,IAC9BrB,SAAAA,IACAQ,EAAiB,IAAKW,EAAc/xB,EAAG8wB,EAAU9wB,GAAI,QAMjE,CAUO,SAASkyB,EAAgBlO,GAAwE,IAAvE,MAAE5S,EAAK,gBAAE+gB,EAAe,SAAE3gB,KAAa3V,GAA8BmoB,EACpG,MAAMoO,GAAeC,EAAAA,EAAAA,MACf5B,GAA4C,IAA1B50B,EAAM40B,gBACxB6B,GAAiBV,EAAAA,EAAAA,MAEvB,OACEpxB,EAAAA,EAAAA,MAAAoS,EAAAA,SAAA,CAAAhT,SAAA,EACEc,EAAAA,EAAAA,KAAC6xB,EAAAA,GAAc,CACb91B,MAAO21B,EACP/yB,QACEqB,EAAAA,EAAAA,KAACivB,EAAW,CACVjuB,MAAO7F,EAAM6F,MACb0P,MAAOA,EACPzR,KAAM2yB,IAAmB7B,EAAkB,SAAW,OACtD,cAAa0B,EACb3gB,SAAUA,OAIhB9Q,EAAAA,EAAAA,KAAC8xB,EAAAA,GAAO,CAAC/1B,MAAO21B,EAAcK,uBAAqB,EAAC,aAAW,eAAeC,UAAU,EAAM9yB,UAC5Fc,EAAAA,EAAAA,KAAA,OACEC,UAAWQ,IACT,WACAsvB,GAAmB,CACjB,OAAQ6B,EACR,QAASA,IAEX1yB,UAEFc,EAAAA,EAAAA,KAAC8vB,EAAW,IACN30B,EACJ2V,SAAUA,EACVof,mBAAoBA,KACdH,GACJ2B,EAAaO,MAAM,UAOjC,C,eC3KO,SAASC,EAAgB5jB,GAKN,IALO,gBAC/B6jB,EAAe,SACfrhB,EAAQ,gBACRif,GAAkB,KACf50B,GACmBmT,EACtB,MAAMsjB,GAAiBV,EAAAA,EAAAA,MAEvB,OACEpxB,EAAAA,EAAAA,MAAAoS,EAAAA,SAAA,CAAAhT,SAAA,CACG6wB,IAAoB6B,IACnB5xB,EAAAA,EAAAA,KAAA,OAAKC,UAAU,WAAUf,UACvBc,EAAAA,EAAAA,KAACivB,EAAW,CACV,cAAY,qBACZve,MAAOyhB,EACPnxB,MAAO7F,EAAM6F,MACbmuB,iBAAiB,EACjBre,SAAUA,OAIhB9Q,EAAAA,EAAAA,KAAA,OACEC,UAAWQ,IACT,sBACAsvB,GAAmB,CACjB,OAAQ6B,EACR,QAASA,IAEX1yB,UAEFc,EAAAA,EAAAA,KAAC8vB,EAAW,IAAK30B,EAAO40B,gBAAiBA,EAAiBjf,SAAUA,EAAUof,mBAAoBA,aAI1G,CASO,SAASkC,EAAc9O,GAAqD,IAApD,MAAEtiB,EAAK,SAAE9B,KAAa/D,GAA4BmoB,EAC/E,OACEtjB,EAAAA,EAAAA,KAACmS,EAAAA,EAAM,CACL0d,aAAa7vB,EAAAA,EAAAA,KAAC2uB,EAAY,CAAC3tB,MAAOA,EAAOf,UAAWQ,IAAW,UAAW4xB,EAAAA,GAAeC,YACrFn3B,EAAK+D,SAERA,GAGP,CAuDO,SAASqzB,EAAiB5O,GAQK,IARqC,KACzE3U,EAAI,KACJ4f,EAAI,OACJrQ,EAAM,UACNte,EAAS,SACT6Q,EAAQ,uBACR0hB,KACGr3B,GAC+BwoB,EAClC,MAAM+N,GAAeC,EAAAA,EAAAA,MACfc,EAASf,EAAanH,SAAS,QAC/BmI,IAAkBv3B,EAAMu3B,eAAiBnU,EAAO/f,OAAS,GACxDm0B,EAAkBC,GAAuB1xB,EAAAA,SAAe,GACzD2xB,EAAoB3xB,EAAAA,aACxB,CAACF,EAAe8xB,KACdhiB,EACEyN,EAAO3d,KAAI,CAACmyB,EAAannB,IAAWA,IAAU+mB,EAAmB,IAAKI,EAAa/xB,SAAU+xB,IAC7FD,EACD,GAEH,CAACH,EAAkBpU,EAAQzN,IAE7B,OACEhR,EAAAA,EAAAA,MAAAoS,EAAAA,SAAA,CAAAhT,SAAA,EACEc,EAAAA,EAAAA,KAACmS,EAAAA,EAAM,CACLpW,MAAO21B,EACPsB,GAAInB,EAAAA,GACJ,cAAaW,EACb5hB,MAAM,UACN3Q,UAAWQ,IAAW,QAASR,GAC/BiR,SAAS,UACT+hB,WAAW,SACXjkB,KAAMA,EACNkkB,OAAQT,EAAOvzB,UAEfc,EAAAA,EAAAA,KAAC2uB,EAAY,CACXC,KAAMA,EACN5tB,MAAOud,EAAO3d,KAAIuyB,IAAA,IAAC,MAAEnyB,GAAOmyB,EAAA,OAAKnyB,CAAK,IACtCf,UAAWQ,IAAW,gBAAiB4xB,EAAAA,GAAeC,YAG1DxyB,EAAAA,EAAAA,MAACgyB,EAAAA,GAAO,CAAC/1B,MAAO21B,EAAc,aAAW,eAAcxyB,SAAA,CACpDwzB,IACC1yB,EAAAA,EAAAA,KAAA,OAAKC,UAAU,+BAA8Bf,UAC3Cc,EAAAA,EAAAA,KAACozB,EAAAA,EAAW,CAACC,eAAgBjB,EAAgBkB,YAAY,EAAMp0B,SAC5Dqf,EAAO3d,KAAI,CAAA2yB,EAAmB3nB,KAAK,IAAvB,MAAE5K,EAAK,MAAE0P,GAAO6iB,EAAA,OAC3BvzB,EAAAA,EAAAA,KAACoyB,EAAc,CAEbpxB,MAAOA,EACPkyB,OAAQP,IAAqB/mB,EAC7BwG,QAASA,IAAMwgB,EAAoBhnB,GAAO1M,SAEzCwR,GALI9E,EAMU,SAKzB5L,EAAAA,EAAAA,KAACkyB,EAAgB,IAEX/2B,EACJ6F,MAAOud,EAAOoU,GAAkB3xB,MAChC8P,SAAU+hB,GAHLF,QAQf,C,gHCxLO,MAAMa,EAAmCllB,IAAmD,IAAlD,UAAErO,EAAS,MAAEyQ,EAAK,KAAE2Q,EAAI,kBAAEoS,GAAmBnlB,EAC5F,MAAOolB,EAAUC,GAAezyB,EAAAA,UAAe,GAEzC0yB,EAAwB1yB,EAAAA,aAAkB,KAC9CyyB,GAAY,GACZE,IAAKxS,EAAK,GACT,CAACA,IAoBJ,OAlBAngB,EAAAA,WAAgB,KACd,IAAI4yB,EACJ,MAAMC,EAAaA,KACZD,GACLlkB,aAAakkB,EAAQ,EASvB,OAPIJ,IACFK,IACAD,EAAU7qB,OAAOwG,YAAW,KAC1BkkB,GAAY,EAAM,GACjB,MAGE,KACLI,GAAY,CACb,GACA,CAACL,KAGF5zB,EAAAA,EAAAA,MAAA,OAAKG,UAAWA,EAAUf,SAAA,EACxBc,EAAAA,EAAAA,KAACg0B,EAAAA,GAAQ,CACPtjB,MAAOA,EACPujB,UAAQ,EACR7hB,QAAUtW,GAAMA,EAAE4zB,cAAcwE,SAChChF,WAAW,OACX,cAAY,6BACZ9gB,MAAOiT,KAETvhB,EAAAA,EAAAA,MAAA,OAAKG,UAAU,sBAAqBf,SAAA,CACjCu0B,IAAqBzzB,EAAAA,EAAAA,KAAA,OAAAd,SAAMu0B,KAC5BzzB,EAAAA,EAAAA,KAACmS,EAAAA,EAAM,CACLlS,UAAU,oBACV2Q,MAAM,OACNwB,QAASwhB,EACTzL,SAAUuL,EACV7D,YAAa6D,EAAW,YAAS54B,EACjC,cAAY,gCAA+BoE,SAE1Cw0B,EAAW,SAAW,cAGvB,C,gFCxDH,SAASrhB,EAAG/D,GAAgE,IAA/D,UAAErO,EAAS,MAAEK,EAAQ,GAAE,OAAEC,EAASD,KAAUnF,GAAiBmT,EAC/E,OACEtO,EAAAA,EAAAA,KAAA,UACM7E,EACJg5B,MAAM,6BACNl0B,UAAWQ,IAAW,kDAAmDR,GACzEK,MAAOA,EACPC,OAAQA,GAGd,C,+4BCFA,MAAM6zB,EAAsB,uBACtBC,EAA6B,CACjCC,UAAW,YAAF1mB,OAAcwmB,EAAmB,qCAMrC,SAASG,EAAmBjmB,GAAoE,IAAnE,eAAEkmB,EAAc,uBAAEC,EAAsB,QAAEC,EAAO,MAAE34B,GAAcuS,EACnG,MAAM,YAAEqmB,IAAgBC,EAAAA,EAAAA,GAAc,CAAEC,WAAY94B,EAAM+4B,SAAW/4B,EAAMg5B,YACrEC,EAAgBj5B,EAAMk5B,sBAAsBxyB,QA0BlD,OAxBAvB,EAAAA,WAAgB,KACd,IAAK8zB,IAAkBj5B,EAAM+4B,UAAYL,EAAwB,OAGjE,MAAMS,EAAaF,EAAczL,yBAC1B,CAAE9kB,GAAWiwB,EACpB,IAAIS,EAAmB,OACvB,GAAIp5B,EAAMq5B,UAAUpI,WAAW,UAAW,CACxC,IAAIzsB,EAASo0B,EAAcO,EAAW7R,OAAmB,EAAV5e,EAG3CywB,EAAW7R,OAAS,IAAG9iB,GAAU0I,OAAOosB,SAC5CF,EAAmB,GAAHvnB,OAAM3Q,KAAKwhB,IAAIle,EAAQi0B,GAAe,KACxD,KAAO,CACL,MAAMj0B,EAAS20B,EAAWl4B,IAAgB,EAAVyH,EAChC0wB,EAAmB,GAAHvnB,OAAM3Q,KAAKwhB,IAAIle,EAAQi0B,GAAe,KACxD,CAGA,MAAMc,EAAYN,EAAcO,aAAa,iBACvCC,EAAiBF,EAAYp5B,SAASC,eAAem5B,GAAa,KACxEE,SAAAA,EAAgB14B,MAAM24B,YAAYrB,EAAqBe,EAAiB,GACvE,CAACH,EAAeL,EAAaH,EAAgBC,EAAwBC,EAAS34B,EAAMq5B,UAAWr5B,EAAM+4B,UAEjGL,EAAyBJ,OAA6Bv5B,CAC/D,C,qCCzCA,MAAM46B,EAAoC,CAAC,EAAG,GAqEvC,SAASC,EAAWrnB,GAA8D,IAA7D,IAAEtR,EAAG,KAAED,EAAI,cAAE64B,EAAa,KAAE3D,EAAI,MAAEphB,GAAyBvC,EACrF,MAAOunB,EAAeC,GAAoB50B,EAAAA,SAAe,MACnD60B,EAAa70B,EAAAA,SAAc,IArEnC,SAAuBlE,EAAaD,GAClC,MAAO,CACLwsB,qBAAAA,GACE,MAAMD,EAAO,CACXtsB,IAAKA,EAAMiM,OAAOosB,QAClBxxB,EAAG7G,EAAMiM,OAAOosB,QAChBt4B,KAAMA,EAAOkM,OAAO+sB,QACpBlyB,EAAG/G,EAAOkM,OAAO+sB,QACjB3S,OAAQrmB,EACRomB,MAAOrmB,EACPuD,MAAO,EACPC,OAAQ,GAGV,MAAO,IACF+oB,EACH2M,OAAQA,IAAM3M,EAElB,EAEJ,CAiDyC4M,CAAcl5B,EAAKD,IAAO,CAACA,EAAMC,IAClEm5B,GAAgBC,EAAAA,EAAAA,GAAiB,CAAEhB,UAAW,kBAC9C,cAAEiB,IAAkBC,EAAAA,EAAAA,IAAuBH,GAC3CI,EAAcr1B,EAAAA,QAAa,IAE3B,OAAEs1B,EAAM,WAAEC,IAAeC,EAAAA,EAAAA,GAAUX,EAAYF,EAAe,CAClET,UAAW,WACXuB,UAAW,CACT,CACEz4B,KAAM,SACN04B,QAAS,CACPjU,OAAQ+S,OAyBhB,OAhBAx0B,EAAAA,WAAgB,KACVm1B,GAAiBE,EAAY9zB,SAASwvB,GAAM,GAC/C,CAACoE,EAAepE,IAKnB/wB,EAAAA,WAAgB,KACdi1B,EAAcU,OACdN,EAAY9zB,SAAU,EAEf,IAAM0zB,EAAclE,SAG1B,KAGDjyB,EAAAA,EAAAA,KAAA,OAIE8C,IAAKgzB,KACDW,EAAWK,OACfh6B,MAAO05B,EAAOM,OACd72B,UAAU,+DACV,cAAY,2BAA0Bf,UAEtCc,EAAAA,EAAAA,KAAC+2B,EAAmB,CAClBrmB,OAAO1Q,EAAAA,EAAAA,KAACmS,EAAAA,EAAM,CAAClS,UAAU,8BACzB21B,cAAeA,EACf75B,MAAOo6B,EACPtlB,MAAOA,EACPmmB,UAAQ,KAIhB,CAUA,SAASC,EAAgB3T,EAEvBxgB,GACA,IAFA,MAAE4N,EAAK,MAAEG,EAAK,MAAE9U,EAAK,SAAEi7B,EAAQ,cAAEpB,EAAgBxpB,OAAO8qB,kBAAyC5T,EAGjG,MAAM6T,GAAaf,EAAAA,EAAAA,GAAiB,CAAEhB,UAAW,gBAC3CgC,EAAiB7C,EAAoB,CACzCC,eAAgBoB,EAChBnB,wBAAwB,EACxBC,QAASgB,EACT35B,UAGF,OACEiE,EAAAA,EAAAA,KAACq3B,EAAAA,GAAQ,CACPv0B,IAAKA,EACL4N,MAAOA,EACP3U,MAAOA,EACP,aAAW,eACXi7B,SAAUA,EACVl6B,MAAOs6B,EACPn3B,UAAU,kBAAiBf,SAE1B2R,EAAMjQ,KAAI,CAAC02B,EAAM1rB,IACE,YAAd0rB,EAAKr4B,MACAe,EAAAA,EAAAA,KAACu3B,EAAAA,GAAiB,CAAAr4B,SAAco4B,EAAK5mB,OAAb9E,QAGX9Q,KAAlBw8B,aAAI,EAAJA,EAAMV,UAEN52B,EAAAA,EAAAA,KAAC+2B,EAAmB,CAClBh7B,MAAOo7B,EACPzmB,OACE1Q,EAAAA,EAAAA,KAACw3B,EAAAA,GAAY,CAACrmB,aAAa,aAAa,+BAAAvD,OAA8B0pB,EAAKv3B,IAAKb,SAC7Eo4B,EAAK5mB,QAGVG,MAAOymB,EAAKV,WAMhB52B,EAAAA,EAAAA,KAACw3B,EAAAA,GAAY,CAEXplB,QAASA,KAAM,IAAAqlB,EAAAvQ,EAAAC,EACD,QAAZsQ,EAAAH,EAAKllB,eAAO,IAAAqlB,GAAZA,EAAAnyB,KAAAgyB,GACW,QAAXpQ,GAAAC,EAAAle,QAAOwe,YAAI,IAAAP,GAAXA,EAAA5hB,KAAA6hB,EAAc,QAAS,eAAgBuQ,OAAOC,OAAO,CAAEC,YAAaN,EAAKv3B,IAAMu3B,EAAK7P,MAAM,EAE5F,+BAAA7Z,OAA8B0pB,EAAKv3B,IACnCE,UAAU,WAAUf,SAEnBo4B,EAAK5mB,OARD9E,MAcjB,CAEA,MAAMmrB,EAAsB71B,EAAAA,WAAiB+1B,G,mECtLtC,MAAMY,EAAgB32B,EAAAA,YAC3B,CAAAoN,EAA8CxL,KAAG,IAAhD,SAAE5D,EAAQ,SAAE44B,EAAQ,UAAE73B,KAAc9E,GAAOmT,EAAA,OAC1CtO,EAAAA,EAAAA,KAAA,UACM7E,EACJ2H,IAAKA,EACL7C,UAAWQ,IAAWR,EAAW,wCACjCnD,MAAO,CAAEg7B,YAAW54B,SAEnBA,GACG,IAWH,SAAS64B,EAAUzU,GAA4F,IAA3F,QAAE0U,EAAU,EAAC,KAAEC,EAAO,EAAC,OAAEvtB,GAAS,EAAK,SAAExL,EAAQ,UAAEe,KAAc9E,GAAwBmoB,EAClH,OACEtjB,EAAAA,EAAAA,KAAA,UACM7E,EACJ8E,UAAWQ,IAAWR,EAAW,mBAAoB,CACnD,2EAA4EyK,IAE9E5N,MAAO,CAAEo7B,oBAAqB,UAAFtqB,OAAYoqB,EAAO,UAAUG,iBAAkB,UAAFvqB,OAAYqqB,EAAI,WAAW/4B,SAEnGA,GAGP,CAMO,MAAMk5B,EAAuCj9B,IAAU6E,EAAAA,EAAAA,KAAC+3B,EAAU,IAAK58B,I,eCzD9E,MAAMk9B,EAAsDl4B,GAASA,EAqB9D,SAASm4B,EAAUhqB,GAUwB,IALhD0kB,GAAIuF,EAAW,SACfC,EAAW,QAAmB,UAC9BC,EAAY,WAAuB,cACnCC,EAAgBL,KACbl9B,GAC2CmT,EAC9C,MAAQ,CAACkqB,GAAWpqB,EAAO,CAACqqB,GAAY3nB,GAAa3V,GAC9CY,EAAOT,GAAY4F,EAAAA,SAAwDkN,GAE5EuqB,EAAez3B,EAAAA,aACnB,WACE5F,EAASo9B,KAAch+B,YACvBoW,KAASpW,UACX,GACA,CAACoW,EAAU4nB,IAGb,OAAOx3B,EAAAA,cAAoBq3B,EAAa,IACnCp9B,EACH,CAACq9B,GAAWz8B,EACZ,CAAC08B,GAAYE,GAEjB,C,qCC9CO,MAAMC,EAAc13B,EAAAA,cAAwD,MAMnF,SAAS23B,EAAqBhoB,EAA8BzC,GAC1D,OAAKA,GAAmB,IAAVA,EAEPyC,EAAMioB,WAAWxB,GAASA,EAAKlpB,QAAUA,KAFb,CAGrC,C,eCSO,SAAS2qB,EAAQzqB,GAUmD,IAViB,GAC1F0kB,EAAE,YACFgG,EAAc,OAAM,aACpBC,EAAY,QACZ7mB,EAAO,WACP8mB,EAAU,UACVj5B,EAAS,cACTk5B,GAAgB,EAAI,SACpBj6B,KACG/D,GACoEmT,EACvE,MAAMvS,EAAQmF,EAAAA,WAAiB03B,GAE/B,OACE54B,EAAAA,EAAAA,KAACo5B,EAAAA,EAAoB,IACfr9B,KACAZ,EACJiX,QAAUN,IACRM,SAAAA,EAAUN,GACVmnB,SAAAA,EAAennB,EAAG4d,cAAc3vB,GAAIo5B,EAAc,EAEpDD,WAAapnB,IACXonB,SAAAA,EAAapnB,GACbmnB,SAAAA,EAAennB,EAAG4d,cAAc3vB,GAAIo5B,EAAc,EAClDj6B,SAEAm6B,IACA,MAAMnG,EAASoG,QAAQD,EAAU,kBAEjC,OACEr5B,EAAAA,EAAAA,KAACmS,EAAAA,EAAM,IACDknB,EACJrG,GAAIA,EACJuG,KAAK,WACLt6B,KAAO9D,EAAM63B,IAAM73B,EAAM63B,KAAOwG,EAAAA,QAAoC1+B,EAAX,SACzD2+B,MAAM,OACN7oB,MAAOsiB,EAAS8F,EAAc,WAC9B7H,aAAa,uBACblxB,UAAWQ,IAAW,2BAA4BR,GAAWf,SAE5DA,GACM,GAKnB,CC9BO,SAASw6B,EAAIprB,GAQN,IARO,MACnBvS,EAAK,cACL49B,EAAa,UACbjzB,EAAY,SAAQ,kBACpBkzB,GAAoB,EAAI,SACxB9oB,EAAQ,SACR5R,KACG/D,GACOmT,EACV,MAAMurB,EAAe34B,EAAAA,OAA4B,MAGjDA,EAAAA,WAAgB,UAEMpG,IAAlB6+B,GACAA,GAAiB,GACjBE,EAAap3B,UAAYk3B,GACzB59B,EAAM8U,MAAMrS,OAASm7B,IAErB59B,EAAM+9B,KAAK/9B,EAAM8U,MAAM8oB,GAAe55B,IACtC85B,EAAap3B,QAAUk3B,EACzB,GACC,CAACA,EAAe59B,EAAOA,EAAM8U,MAAMrS,SAEtC,MAAMy6B,EAAe/3B,EAAAA,aACnB,CAACnB,EAAYg6B,KACXjpB,SAAAA,EACE/U,EAAM8U,MAAMioB,WAAWxB,GAASA,EAAKv3B,KAAOA,IAC5Cg6B,EACD,GAEH,CAACjpB,EAAU/U,EAAM8U,QAGnB,OACE7Q,EAAAA,EAAAA,KAAC44B,EAAYzqB,SAAQ,CAACC,MAAOrS,EAAMmD,UACjCc,EAAAA,EAAAA,KAACo5B,EAAAA,EAAgB,IACXr9B,KACAZ,EACJo+B,KAAK,OACLt5B,UAAWQ,IAAW,eAAgBtF,EAAM8E,UAAW,CACrD,yCAA0C25B,GAAmC,WAAdlzB,EAC/D,kBAAmBkzB,GAAmC,QAAdlzB,IACvCxH,SAEFgC,EAAAA,SAAeN,IAAI1B,GAAW86B,GACxB94B,EAAAA,eAAqB84B,IAEtBA,EAAM/6B,OAAS85B,EACV73B,EAAAA,aAAmB84B,EAAO,IAAKA,EAAM7+B,MAAO89B,aAAcA,IAH1Be,OAWnD,C,oCC7FO,IAAKC,EAAS,SAATA,GAAS,OAATA,EAAS,eAATA,EAAS,iBAATA,EAAS,gBAATA,EAAS,eAATA,CAAS,MA0Ed,SAASC,EAAW5rB,GAWN,IAXO,MAC1BoC,EAAK,KACL1B,EAAO,UAAS,YAChB6gB,EAAW,aACX1e,EAAY,IACZsN,EAAM,EAAC,IACPvhB,EAAM,IAAG,KACT8P,EAAO,EAAC,UACR/M,EAAS,eACTk6B,KACGh/B,GACcmT,EACjB,MAAO8rB,EAAUC,IAAe9P,EAAAA,EAAAA,WAAS,GACnC+P,GAAWnQ,EAAAA,EAAAA,QAAuB,MAClCoQ,GAAWpQ,EAAAA,EAAAA,QAAwB,OAEzCqF,EAAAA,EAAAA,YAAU,KACR6K,EAAYf,QAAQgB,EAAS73B,SAAW83B,EAAS93B,SAAS,GACzD,IAEH,MAAM+3B,GAAY7M,EAAAA,EAAAA,UAAQ,KACxB,MAAM8M,EAAQH,EAAS73B,QACjBi4B,EAAQH,EAAS93B,QACjBk4B,GAAgBx/B,EAAMiT,MAAQqQ,IAAQvhB,EAAMuhB,GAElD,IAAK2b,IAAaK,IAAUC,EAAO,OAEnC,MAAME,EAAWH,EAAMlR,wBACjBsR,EAAWH,EAAMnR,wBAEvB,OAASoR,GAAgBC,EAASt6B,MAAQu6B,EAASv6B,OAAUs6B,EAASt6B,MAAS,GAAG,GACjF,CAACme,EAAKvhB,EAAK/B,EAAMiT,MAAOgsB,IAE3B,OACEp6B,EAAAA,EAAAA,KAAC86B,EAAAA,GAAK,CAACn7B,MAAO+Q,EAAOzQ,UAAWA,EAAUf,UACxCY,EAAAA,EAAAA,MAAA,OAAKG,UAAWQ,IAAWw5B,EAAUjrB,GAAO,yCAAyC9P,SAAA,CAClF2wB,GAED/vB,EAAAA,EAAAA,MAAA,OAAKgD,IAAKw3B,EAAUr6B,UAAU,gBAAef,SAAA,EAC3CY,EAAAA,EAAAA,MAAA,OAAKG,UAAU,eAAcf,SAAA,EAC3Bc,EAAAA,EAAAA,KAAA,OACEC,UAAWQ,IAAW,6DAA8D,CAClF,aAAc25B,IACbl7B,UAEHc,EAAAA,EAAAA,KAAA,OACEC,UAAU,6DACVnD,MAAO,CAAEwD,MAAO,GAAFsN,OAAK4sB,EAAS,WAIhCx6B,EAAAA,EAAAA,KAAA,QACE8C,IAAKy3B,EACLt6B,UAAWQ,IACT,mNACA,CAAE,aAAc25B,IAElBt9B,MAAO,CAAEC,KAAM,GAAF6Q,OAAK4sB,EAAS,YAI/Bx6B,EAAAA,EAAAA,KAAA,YACM7E,EACJ8D,KAAK,QACLwf,IAAKA,EACLvhB,IAAKA,EACL8P,KAAMA,EACN/M,UAAWQ,IAAW05B,EAAgB,8DAIzChpB,MAIT,C,gDCvJO,IAAK4pB,EAAY,SAAZA,GAAY,OAAZA,EAAAA,EAAY,qCAAZA,EAAAA,EAAY,6BAAZA,CAAY,MAKZC,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAAA,EAAgB,uBAAhBA,EAAAA,EAAgB,2BAAhBA,CAAgB,M,kCCIrB,MAAMC,GAAiB/5B,EAAAA,cAAqC,CACjEwF,UAAWs0B,EAAiBE,SAC5BtqB,MAAOmqB,EAAaI,gBACpBC,WAAW,EACXC,aAAa,EACbnK,UAAU,IAGL,SAASoK,KACd,OAAOp6B,EAAAA,WAAiB+5B,GAC1B,CCdA,MAAMM,GAAqBjtB,IAK6B,IAL5B,UAC1B5H,EAAS,UACT00B,EAAS,SACTlK,EAAQ,MACRtgB,GACgBtC,EAChB,OACO,IADC8sB,EAEG,CACLn7B,UAAWQ,IAAW,kDAAmD,CACvE,iCAAkCiG,IAAcs0B,EAAiBE,SACjE,iGACEjzB,eAAeoI,sBAKd,CACLpQ,UAAWQ,IAAW,6DAA8D,CAClF,qBAAsBiG,IAAcs0B,EAAiBQ,YAAcvzB,eAAeoI,mBAClF,8FACE3J,IAAcs0B,EAAiBE,SACjC,YAAax0B,IAAcs0B,EAAiBE,WAAahK,EACzD,qCAAsCtgB,IAAUmqB,EAAaU,cAAgBvK,EAC7E,qDACExqB,IAAcs0B,EAAiBQ,YAAc5qB,IAAUmqB,EAAaU,YACtE,oBAAqB7qB,IAAUmqB,EAAaU,YAC5C,uEAAwEvK,IAGhF,EA4BK,SAASwK,GAAOpY,GAMmB,IANlB,UACtB5c,EAAY,WAAU,MACtBkK,EAAQ,kBAAiB,SACzBsgB,GAAW,EAAK,SAChBhyB,EAAQ,UACRe,GACsCqjB,EACtC,MAAMqY,EAAaz6B,EAAAA,OAA6B,MAC1C06B,EAAuB16B,EAAAA,SAC3B,KAAM,CACJwF,UAAWs0B,EAAiBt0B,GAC5BkK,MAAOmqB,EAAanqB,GACpBwqB,UACEJ,EAAiBt0B,KAAes0B,EAAiBE,UAAYH,EAAanqB,KAAWmqB,EAAaU,YACpGJ,YACEL,EAAiBt0B,KAAes0B,EAAiBQ,YAAcT,EAAanqB,KAAWmqB,EAAaU,YACtGvK,cAEF,CAACxqB,EAAWkK,EAAOsgB,IAEf2K,EAAkBN,GAAmBK,GA2B3C,OAzBA16B,EAAAA,iBAAsB,KAGpB,GAAI65B,EAAanqB,KAAWmqB,EAAaU,cAAeK,EAAAA,EAAAA,MAAmB,CACzE,MAAMC,EAAchsB,KAAS,KAC3B,GAA2B,OAAvB4rB,EAAWl5B,QAAkB,CAC/B,MAAMu5B,EAAgBL,EAAWl5B,QAAQ3F,MAAMwD,MAC/Cq7B,EAAWl5B,QAAQ3F,MAAMwD,MAAQ,IAEjCq7B,EAAWl5B,QAAQw5B,YACnBN,EAAWl5B,QAAQ3F,MAAMwD,MAAQ07B,CACnC,IACC,KAKH,OAHAD,IACA9yB,OAAO1L,iBAAiB,SAAUw+B,GAE3B,KACL9yB,OAAOpL,oBAAoB,SAAUk+B,EAAY,CAErD,IACC,CAACnrB,KAKF5Q,EAAAA,EAAAA,KAAA,OAEED,GAAG,UACH,cAAY,UACZE,UAAWQ,IAAWo7B,EAAgB57B,UAAWA,GACjD6C,IAAK64B,EAAWz8B,UAEhBc,EAAAA,EAAAA,KAACi7B,GAAe9sB,SAAQ,CAACC,MAAOwtB,EAAqB18B,SAAEA,KANlDwH,EASX,CCzDO,SAASw1B,GAAa5Y,GAMiB,IAAA6Y,EAAAC,EAAAC,EAAA,IAN8B,KAC1E/E,EAAI,gBACJgF,EACAC,WAAYC,EAAc,UAC1BC,KACGthC,GACuCmoB,EAC1C,MAAM,MAAE1S,EAAK,YAAEyqB,GAAgBC,KACzBiB,EAAaC,QAAsC1hC,IAApBw8B,EAAKoF,WACpCC,EAjER,SAA+BruB,GAUe,IAVd,MAC9BsC,EAAK,SACLgsB,EAAQ,YACRvB,EAAW,WACXkB,GAMDjuB,EACC,MAAMuuB,EAAkB50B,eAAeoI,mBACvC,OAAQO,IACDmqB,EAAaU,YACT,CACLx7B,UAAWQ,IACT,CACEq8B,KAAMzB,EACN,aAAcA,IAAgBwB,EAC9B,gBAAiBN,IAGlBM,GAAmB,CAClB,yFAAyF,EACzF,+EAAgFD,EAChF,uCAAwCA,IAG5ChsB,MAAOisB,EAAkB,kBAAoB,cAC7C3rB,SAAU2rB,OAAkB/hC,EAAY,OACxCkU,KAAMqsB,GAAewB,OAAkB/hC,EAAY,QAG9C,CACLmF,UAAWQ,IACT,+NACA,CACE,gBAAiB87B,EACjB,mJACGK,EACH,4EAA6EA,IAGjFhsB,MAAO,cACPM,SAAU,QAGlB,CAkByB6rB,CAAuB,CAC5CnsB,QACAyqB,cACAuB,SAAUzhC,EAAM+3B,OAChBqJ,WAAYA,IAGRS,EAAcA,KAClBh9B,EAAAA,EAAAA,KAACoR,EAAAA,GAAI,CAAClT,KAAO/C,EAAM+3B,QAAUoE,EAAK2F,YAAe3F,EAAK1I,KAAMtuB,MAAO,GAAIL,UAAU,cAGnF,OACED,EAAAA,EAAAA,KAACmS,EAAAA,EAAM,IACDwqB,KACCxhC,EACL83B,WAA4B,QAAlBkJ,EAAEhhC,EAAM83B,kBAAU,IAAAkJ,EAAAA,EAAI,SAChCx8B,MAAOxE,EAAMgtB,UAAYmU,EAAkBA,EAAmBnhC,EAAM+3B,QAAUoE,EAAK4F,aAAgB5F,EAAK33B,MACxGqP,KACqB,QADjBotB,EACFO,EAAe3tB,YAAI,IAAAotB,EAAAA,EAClBxrB,IAAUmqB,EAAaI,iBAAmBlzB,eAAeoI,mBAAqB,SAAW,QAC3FnR,SAEAu9B,GACCz8B,EAAAA,EAAAA,KAACgQ,EAAAA,EAAO,CAACmtB,MAAO,IAAKltB,eAAgB+sB,IAAc99B,UACjDc,EAAAA,EAAAA,KAACkQ,EAAAA,EAAO,CAAC5P,MAAO,QAGlBN,EAAAA,EAAAA,KAAAkS,EAAAA,SAAA,CAAAhT,SACiB,QADjBm9B,EACGlhC,EAAM+D,gBAAQ,IAAAm9B,EAAAA,EACZE,GACCv8B,EAAAA,EAAAA,KAACgQ,EAAAA,EAAO,CAACmtB,MAAO,IAAKltB,eAAgB+sB,IAAc99B,UACjDc,EAAAA,EAAAA,KAACoR,EAAAA,GAAI,CAAClT,KAAMo5B,EAAKoF,WAAYp8B,MAAO,GAAIL,UAAU,eAGpD+8B,OAMd,C,wDC7GA,MAAMI,GAAmC,CAAC,EAAG,GACvCC,GAAgB,IAEhB53B,GAAkBqM,IACtBA,EAAGrM,gBAAgB,EAmBd,SAAS63B,GAAgB5zB,GAC9B,MAAM2H,EAdD,SAAyB3H,GAAuC,IAAA6zB,EAAAC,EACrE,MAAM9I,EAAoC,QAA7B6I,EAAI7zB,aAAQ,EAARA,EAAU+zB,uBAAe,IAAAF,EAAAA,EAAIH,GAS9C,MAAO,IARShE,GAAAA,EAAuB,IAClC1vB,EACH0rB,UAA8B,QAArBoI,EAAE9zB,aAAQ,EAARA,EAAU0rB,iBAAS,IAAAoI,EAAAA,EAAI,eAClCC,gBAAiB/I,EACjBgJ,SAAUC,GAAAA,EACVC,OAAO,IAGYlJ,UACvB,CAGkB/C,CAAgBjoB,GAC1Bm0B,EAAc38B,EAAAA,OAA4B,MAC1C48B,EAAc58B,EAAAA,OAA4B,MAE1C68B,EAAgB78B,EAAAA,QAAa,KACL,OAAxB28B,EAAYp7B,SACdwG,OAAO2G,aAAaiuB,EAAYp7B,SAEN,OAAxBq7B,EAAYr7B,SACdwG,OAAO2G,aAAakuB,EAAYr7B,QAClC,IAGIu7B,EAAc98B,EAAAA,QAAa,KAC/B68B,EAAct7B,UACdo7B,EAAYp7B,QAAUwG,OAAOwG,YAAW,KACtC4B,EAAQwlB,MAAM,GACbwG,GAAc,IAGbY,EAAc/8B,EAAAA,QAAa,KAC/B68B,EAAct7B,UACdq7B,EAAYr7B,QAAUwG,OAAOwG,YAAW,KACtC4B,EAAQ4gB,MAAM,GACboL,GAAc,IAMnB,OAFAn8B,EAAAA,WAAgB,IAAM,IAAM68B,EAAct7B,WAAW,IAE9C,IACF4O,EACHwlB,KAAMmH,EAAYv7B,QAClBwvB,KAAMgM,EAAYx7B,QAClBy7B,YAAaF,EAAYv7B,QACzB07B,WAAYF,EAAYx7B,QACxBQ,YAAawC,GAEjB,C,wCCwBO,SAASqsB,GAAOxjB,GAiBN,IAjBO,MACtBvS,EAAK,SACLmD,EAAQ,YACRk/B,GAAc,EAAI,YAClBC,GAAc,EAAI,cAClBC,EACA,aAAc3tB,EAAS,KACvBshB,EAAI,mBACJsM,GAAqB,EAAI,YACzBC,GAAc,EAAI,eAClBC,EAAc,oBACdC,EAAmB,iBACnBC,EAAmBvyB,OAAO8qB,iBAAgB,MAC1CtmB,EAAQ,QAAO,uBACf6jB,GAAyB,EAAK,oBAC9BmK,GAAsB,KACnBzjC,GACUmT,EACb,MAAMuwB,GAASC,EAAAA,EAAAA,OACT,cAAEzI,IAAkBC,EAAAA,EAAAA,IAAuBv6B,IAC3C,YAAE44B,IAAgBC,EAAAA,EAAAA,GAAc,CAAEC,YAAawB,IAE/CrB,EAAgBj5B,EAAMk5B,sBAAsBxyB,QAC5C20B,EAAiB7C,EAAoB,CACzCC,eAAgBmK,EAChBlK,yBACAC,QAAS34B,EAAM24B,QACf34B,UAyBF,OAtBAmF,EAAAA,WAAgB,KACd,IAAK8zB,IAAkBj5B,EAAM+4B,UAAaL,IAA0BmK,EAAsB,OAE1F,MAAM1J,EAAaF,EAAczL,wBAC3B+L,EAAYN,EAAcO,aAAa,iBACvCC,EAAiBF,EAAYp5B,SAASC,eAAem5B,GAAa,KAGpEsJ,IACFpJ,SAAAA,EAAgB14B,MAAM24B,YAAY,YAAa,GAAF7nB,OAAKsnB,EAAW50B,MAAK,OACpE,GACC,CACDvE,EAAM+4B,QACN/4B,EAAM24B,QACNM,EACAP,EACAmK,EACAjK,EACA54B,EAAMq5B,UACNuJ,IAGEtI,EAAsB,MAGxBr2B,EAAAA,EAAAA,KAAC++B,GAAAA,EAAM,CAAA7/B,UACLc,EAAAA,EAAAA,KAACo5B,GAAAA,EAAc,IACTr9B,EACJk2B,KAAMA,QAAAA,EAAQl2B,EAAMk2B,KACpBsM,mBAAoBA,EACpBS,yBAA0BZ,EAC1B,aAAYztB,EACZsuB,yBAA0BZ,EAC1Ba,uBAAwBZ,EAAcp/B,SAErCokB,IAAA,IAAC,gBAAE6b,EAAe,eAAEC,KAAmBC,GAAY/b,EAAA,OAClDxjB,EAAAA,EAAAA,MAAAoS,EAAAA,SAAA,CAAAhT,SAAA,EACEc,EAAAA,EAAAA,KAAA,OACEC,UAAWQ,IAAWo+B,EAAQ,sCAAuC,CACnE,uBAAwBL,IAE1BpsB,SAA4B,IAAnBqsB,EAA2BxM,QAAAA,EAAQl2B,EAAMk2B,KAAOwM,EACzDx7B,YAAc9B,IAEZA,EAAMsE,gBAAgB,KAG1BzF,EAAAA,EAAAA,KAAA,UACMq/B,EACJp/B,UAAWQ,IAAWo+B,EAAQ,mDAC9B/hC,MAAO,IAAKuiC,EAAWviC,SAAU4hC,GAAsBx/B,UAEvDc,EAAAA,EAAAA,KAACs/B,GAAAA,GAAG,CACFH,gBAAiBA,EACjBC,eAAgBA,EAChB,iBAAgBrjC,EAAMq5B,UACtBxkB,MAAOA,KACHzV,EACJ8E,UAAWQ,IAAW,sBAAuBtF,EAAM8E,WACnDnD,MAAO23B,EAAyB,IAAK2C,KAAmBj8B,EAAM2B,OAAU3B,EAAM2B,MAAMoC,SAEnFA,QAGJ,KAKb,C,gBCnLO,MAAM2yB,GAAiB3wB,EAAAA,YAC5B,CAAAoN,EAA0CxL,KAA+C,IAAAy8B,EAAA,IAAxF,MAAExjC,KAAUZ,GAA2BmT,EACtC,MAAMuwB,GAASC,EAAAA,EAAAA,MAEf,OACE9+B,EAAAA,EAAAA,KAACo5B,GAAAA,EAAwB,CACvBt2B,IAAKA,KACD3H,EACJ63B,GAAY,QAAVuM,EAAEpkC,EAAM63B,UAAE,IAAAuM,EAAAA,EAAI,YACZxjC,EACJkE,UAAWQ,IAAWtF,EAAM8E,UAAW,CACrC,CAAC4+B,GAAS9iC,EAAM+4B,UACf51B,SAEF/D,EAAM+D,UACkB,ICyC1B,SAASsgC,GAAYlxB,GAUN,IAAAmxB,EAAA,IAVO,YAC3BC,EAAW,SACX9C,EAAQ,UACRH,EAAS,WACTkD,EAAU,WACVC,EAAU,SACV9uB,EAAQ,gBACR+uB,GAAkB3O,EAAAA,EAAAA,MAAU,SAC5B/I,EAAQ,gBACRmU,GACkBhuB,EAClB,MAAMwxB,GXxEqBlJ,EWwEI,CAAEmJ,UAAW,MXvErC3G,EAAAA,EAAyB,IAAKxC,EAASoJ,MAAM,EAAMC,kBAAkB,KADvE,IAAsBrJ,EWyE3B,MAAM,MAAEhmB,EAAK,YAAEyqB,GAAgBC,MACxB4E,EAAcC,GAAmBj/B,EAAAA,SAAew+B,GACjDU,EAAUR,aAAU,EAAVA,EAAYnsB,QAAQ,MAAO,KAAK4sB,oBAC1CC,EAAqB1vB,IAAUmqB,EAAaU,YAC5C/J,EAAe4L,GAAgB,CACnClI,UAAWkL,GAAsBjF,EAAc,SAAW,gBAEtDnH,EXnED,SACLn4B,EACA2V,EACAb,EACAC,GAEA,MAAO6oB,EAAe4G,GAAoBr/B,EAAAA,SAAe23B,EAAqBhoB,EAAOa,IAC/E8uB,EAAet/B,EAAAA,QAAa,IAAMnF,EAAMk2B,SAG9C/wB,EAAAA,WAAgB,KACd,MAAMu/B,EAAW5H,EAAqBhoB,EAAOa,GAC7C6uB,EAAiBE,EAAS,GACzB,CAAC5vB,EAAO8oB,EAAejoB,IAE1B,MAAMgvB,EAAex/B,EAAAA,aACnB,SAAC0K,GAAwC,IAAzButB,IAAaz+B,UAAA8D,OAAA,QAAA1D,IAAAJ,UAAA,KAAAA,UAAA,GAC3B,MAAMwlC,EAAervB,EAAMjF,GAC3B20B,EAAiB30B,GAEbutB,GAAeqH,EAAa/9B,UAChCqO,EAASovB,EACX,GACA,CAACrvB,EAAOC,EAAUyvB,IAGpB,MAAO,CAAE5G,gBAAe+G,eAC1B,CWwCiBC,CACbjP,EACAwO,EAAangC,GAC4C,QAD1C0/B,EACfE,aAAU,EAAVA,EAAY/+B,KAAKkK,IAAC,CAAQsD,MAAOtD,EAAE/K,GAAI2Q,MAAO5F,EAAEnL,iBAAS,IAAA8/B,EAAAA,EAAI,IAC5DmB,IACCT,EAAgBR,EAAYA,EAAY7G,WAAWxB,GAASA,EAAKv3B,KAAO6gC,EAAOxyB,UAC/E0C,EAAS8vB,EAAOxyB,MAAO,SAAS,IAIpC,OACEtO,EAAAA,EAAAA,MAAA,OACEG,UAAWQ,IAAW,gBAAiB,CACrCq8B,KAAMwD,GAAsBjF,EAC5B,YAAaiF,IAAuBjF,IAAgBpzB,eAAeoI,qBAClEnR,SAAA,EAEHY,EAAAA,EAAAA,MAACo8B,GAAa,CACZlJ,GAAInB,GACJ91B,MAAO21B,EACPP,aAAa,WACb,+BAAAvjB,OAA8BwyB,EAAO,WACrC9I,KAAM4I,EACNhN,OAAQ0J,EACRzU,SAAUA,EACVxoB,MAAOigC,EACPtD,gBAAiBA,EACjBG,UAAWA,EACXrqB,QAAUN,IACRA,EAAGrM,iBACHqM,EAAG+uB,kBACH/vB,EAASovB,EAAangC,GAAI,QAAQ,EAClCb,SAAA,EAEFc,EAAAA,EAAAA,KAACoR,EAAAA,GAAI,CAAClT,KAAO0+B,GAAYsD,EAAajD,YAAeiD,EAAatR,KAAMtuB,MAAO,GAAIL,UAAU,cAC7FD,EAAAA,EAAAA,KAACoR,EAAAA,GAAI,CAAClT,KAAK,aAAaoC,MAAO,GAAIL,UAAU,qBAG9C4/B,GACC7/B,EAAAA,EAAAA,KAAC8gC,GAAAA,EAAY,CACXjwB,MAAO8uB,EAAW/+B,KAAK02B,IAAI,CAAQlpB,MAAOkpB,EAAKv3B,GAAI2Q,MAAO4mB,EAAK33B,UAC/DmR,SAAW8vB,IACTT,EAAgBR,EAAYA,EAAY7G,WAAWxB,GAASA,EAAKv3B,KAAO6gC,EAAOxyB,UAC/E0C,EAAS8vB,EAAOxyB,MAAO,SAAS,EAElCgE,QAASA,IAAMtB,EAASovB,EAAangC,GAAI,aAG3CC,EAAAA,EAAAA,KAAC8xB,GAAO,CACNwM,cAAe,CAAE77B,QAASvG,SAASoX,MACnCvX,MAAO21B,EACP,aAAYvJ,GAAYmU,EAAkBA,EAAkBsD,EAC5DpB,aAAa,EAAMt/B,UAEnBc,EAAAA,EAAAA,KAAC05B,EAAI,CAAC39B,MAAO+jC,EAAW7/B,UAAU,WAAW6Q,SAAUojB,EAAOwM,aAAaxhC,SACxEygC,EAAW/+B,KAAK02B,IACft3B,EAAAA,EAAAA,KAAC+4B,EAAQ,CAEPlJ,aAAa7vB,EAAAA,EAAAA,KAACoR,EAAAA,GAAI,CAAClT,KAAMo5B,EAAK1I,KAAM3uB,UAAU,kBAAkBK,MAAO,KACvE,+BAAAsN,OAA8BwyB,EAAO,KAAAxyB,OAAI0pB,EAAKv3B,IAAKb,SAElDo4B,EAAK33B,OAJD23B,EAAKv3B,YAY1B,CCzJO,SAASghC,GAAWzyB,GAWoB,IAXnB,YAC1BoxB,EAAW,UACXjD,EAAS,SACTG,EAAQ,WACRL,EAAU,WACVoD,EAAU,WACVC,EAAU,SACV9uB,EAAQ,gBACR+uB,EAAe,SACf1X,EAAQ,gBACRmU,GAC2ChuB,EAC3C,MAAM0yB,EAAepE,IAAazU,EAElC,OAAMwX,SAAAA,EAAYnhC,QAEdwB,EAAAA,EAAAA,KAACw/B,GAAY,CACXI,WAAYA,EACZD,WAAYA,EACZD,YAAaA,EACbvX,SAAUA,EACVyU,SAAUoE,EACVvE,UAAWA,EACX3rB,SAAUA,EACV+uB,gBAAiBA,EACjBvD,gBAAiBA,KAMrBt8B,EAAAA,EAAAA,KAACk8B,GAAa,CACZ,8BAAAtuB,OAA6B8xB,EAAY3/B,IACzCu3B,KAAMoI,EACNxM,OAAQ8N,EACRvE,UAAWA,EACXF,WAAYA,EACZpU,SAAUA,EACVmU,gBAAiBA,EACjBlqB,QAASA,KACPtB,EAAS4uB,EAAY3/B,GAAI,SAAS,GAI1C,CCtCO,SAASkhC,GAAc3yB,GAAqC,IAApC,UAAErO,GAAgCqO,EAC/D,MAAM,UAAE5H,EAAS,MAAEkK,GAAU0qB,KAE7B,OACEt7B,EAAAA,EAAAA,KAAA,OACEC,UAAWQ,IACT,+BACA,CACE,gCAAiCiG,IAAcs0B,EAAiBE,SAChE,mBAAoBx0B,IAAcs0B,EAAiBQ,WACnD,OAAQ90B,IAAcs0B,EAAiBE,UAAYtqB,IAAUmqB,EAAaU,YAC1E,SAAU/0B,IAAcs0B,EAAiBQ,YAAc5qB,IAAUmqB,EAAaU,YAC9E,MAAO/0B,IAAcs0B,EAAiBQ,YAAc5qB,IAAUmqB,EAAaU,aAE7Ex7B,IAIR,C,iDCxBO,SAASihC,GAAW5yB,GAA+B,IAA9B,KAAEtB,GAA0BsB,EACtD,OACExO,EAAAA,EAAAA,MAACw/B,GAAAA,GAAG,CAACr/B,UAAU,iBAAgBf,SAAA,CAC5B8N,EAAKrN,QACJK,EAAAA,EAAAA,KAACmhC,EAAAA,GAAO,CAAC/3B,MAAO,EAAGnJ,UAAU,OAAMf,SAChC8N,EAAKrN,QAGTqN,EAAKsG,OAAQtT,EAAAA,EAAAA,KAACohC,EAAAA,GAAS,CAAAliC,SAAE8N,EAAKsG,SAGrC,CCOA,IAAI+tB,GACGrtB,eAAestB,GAAoBC,GACxC,GAAIF,GAAiB,OAAOA,GAE5B,IACEE,GAAW,GACX,MAAMC,QAAwB,gCAI9B,OAHAH,GAAkBG,EAAgBn5B,QAClCk5B,GAAW,GAEJF,EACT,CAAE,MAAO,CACX,CAKA,MAAMI,GAAgBhhC,IAAWihC,EAAAA,GAAmBC,EAAAA,GAAqBC,EAAAA,GAAWC,QAASxP,EAAAA,GAAewP,SAC5G,SAASC,GAAeC,EAAqB/0B,EAAgBpB,EAAeo2B,GAAiB,IAAAC,EAAAC,EAC3F,MAAO,CACL,CACE1rB,OAAQurB,EAAKI,SACbC,QAAS3hC,IAAWghC,GAAe,WAAWY,EAAAA,EAAAA,IAAeC,EAAAA,GAAYhxB,OAAOL,OAAQsxB,EAAAA,GAAcV,SACtGxgB,KAAM,QAERzV,EAAQ,GAAK,CACX4K,OAAQurB,EAAKS,KACbJ,QAAS3hC,IAAWghC,IAAeY,EAAAA,EAAAA,IAAeC,EAAAA,GAAYhxB,OAAOL,OAAQsxB,EAAAA,GAAcV,SAC3FxgB,KAAqB,QAAjB4gB,EAAEj1B,EAAKy1B,kBAAU,IAAAR,EAAAA,EAAI,QAE3B,CACEG,QAAS3hC,IAAWghC,IAAeY,EAAAA,EAAAA,IAAeC,EAAAA,GAAYzZ,MAAM5X,OAAQsxB,EAAAA,GAAcV,SAC1FrrB,OAAQurB,EAAKW,KACbrhB,KAAqB,QAAjB6gB,EAAEl1B,EAAK21B,kBAAU,IAAAT,EAAAA,EAAKt2B,IAAUo2B,EAAIxjC,OAAS,EAAI,SAAW,SAElEF,OAAOg7B,QACX,CA6BO,SAASsJ,KACd,MAAO,OAAPh1B,OAAc3E,OAAO8J,SAASuU,SAAS7T,QAAQ,QAAS,KAC1D,CAEO,SAASovB,GAAgBC,GAAyB,IAAAC,EACvD,MAAMC,EAA+B,QAAfD,EAAGE,oBAAY,IAAAF,OAAA,EAAZA,EAAcG,QAAQN,MACzCO,EAAgBL,EAAMhK,WAAWiJ,GAASA,EAAKhiC,KAAOijC,IACtDI,EAAiBD,IAAkBL,EAAMtkC,OAAS,GAAKskC,EAAMve,MAAM4e,EAAgB,GAAGE,OAAO/L,GAASA,EAAKgM,OAC3GC,EAAcH,EAAiBN,EAAQA,EAAMve,MAAM4e,EAAgB,GAazE,MAAO,CAAEK,aAAcJ,EAAgBrB,KAZtBwB,EAAYE,QAC3B,CAACC,EAAKjhC,IACJA,EAAQ6gC,KACJI,EACA,IACKA,EACH3jC,GAAI0C,EAAQ1C,GACZ+M,MAAO,IAAI42B,EAAI52B,SAAUrK,EAAQqK,SAEzC,CAAE/M,GAAI,OAAQ+M,MAAO,GAAI62B,YAAaJ,EAAY,GAAGxjC,KAIzD,CAEO,SAAS6jC,GAAaC,GAAa,IAAAC,EAC5B,QAAZA,EAAAb,oBAAY,IAAAa,GAAZA,EAAcC,QAAQnB,KAAciB,EACtC,CC3GO,MAAMG,GAAkB,CAC7BC,WAAW,EACXC,iBAAiB,GAaZ,SAASC,GAAQvN,GACtB,MAAO6F,EAAW2H,GAAgBljC,EAAAA,UAAe,IAC1CmjC,EAAaC,GAAWpjC,EAAAA,SAAqC,MAM9DqjC,EAAarjC,EAAAA,OAAa,oBAAqB+H,OAAS,IAAIu7B,qBAAoB1pC,GAChF2pC,EAAgBvjC,EAAAA,QAAcnF,IAAmB,IAAA2oC,EAC/B,QAAtBA,EAAIH,EAAW9hC,eAAO,IAAAiiC,GAAlBA,EAAoBC,OAAOC,SAE/BR,EAAaroC,EAAM,IAGrBmF,EAAAA,WAAgB,IAAM,SAAA2jC,EAAA,OAAwB,QAAxBA,EAAMN,EAAW9hC,eAAO,IAAAoiC,OAAA,EAAlBA,EAAoBC,OAAO,GAAE,IAEzD,MAAMC,EAAY7jC,EAAAA,aAChB8S,eAAOgxB,GAAmD,IAAAC,EAAA,IAAvBC,IAAWxqC,UAAA8D,OAAA,QAAA1D,IAAAJ,UAAA,KAAAA,UAAA,GAC5C,MAAM2mC,QAAwB8D,GAA8BV,EAAchiC,SAE1E,GAAI4+B,IAAsC,QAAnB4D,EAACV,EAAW9hC,eAAO,IAAAwiC,IAAlBA,EAAoBN,OAAOC,SAAS,KAAA1d,EAAAC,EAAAie,EAC1D,MAAMrD,EAAOsC,QAAAA,EAAe,IAAIhD,EAAgBgE,KAAK,IAAKrB,MAAoBpN,IAEzEyN,GAAaC,EAAQvC,GAG1BtmB,MAAM6pB,KAAKvD,EAAKj1B,OAAOy4B,SAASv4B,GAAS+0B,EAAKyD,WAAWx4B,EAAKjN,MAE9D,MAAM0lC,EDaP,SAAsB1D,EAAqBj1B,GAChD,OAAOA,EAAMlM,KAAI,CAACoM,EAAMpB,KAAK,IAAA85B,EAAAC,EAAAC,EAAAC,EAAA,MAAM,CACjCC,SAAU,CAAEC,QAAS/4B,EAAK3G,OAAQwB,GAAkB,QAAhB69B,EAAE14B,EAAKooB,iBAAS,IAAAsQ,EAAAA,EAAI,QACxDtD,QAAS,WAET4D,cAAe,CACbrP,UAAW,CACT,CACEz4B,KAAM,SACN04B,QAAS,CACPjU,OAAmB,QAAbgjB,EAAE34B,EAAK2V,cAAM,IAAAgjB,EAAAA,EAAI,CAAC,EAAG,QAMnCtkB,KAAM4kB,GAAAA,eAAwB/kC,EAAAA,cAAoBggC,GAAa,CAAEl0B,UAEjE2d,QAASmX,GAAeC,EAAM/0B,EAAMpB,EAAOkB,GAC3Co5B,0BAA6C,QAApBN,EAAE54B,EAAKm5B,qBAAa,IAAAP,EAAAA,EAAI,EACjDQ,2BAA+C,QAArBP,EAAE74B,EAAKq5B,sBAAc,IAAAR,EAAAA,EAAI,EACpD,GACH,CCnC+BV,CAAuBpD,EAAMiD,EAAWl4B,OAU/D,OATAi1B,EAAKuE,SAASb,GAEVP,GACFC,GAAuBH,EAAWjlC,IAGpCgiC,EAAKwE,QACM,QAAXrf,GAAAC,EAAAle,QAAOwe,YAAI,IAAAP,GAAXA,EAAA5hB,KAAA6hB,EAAc,QAAS,aAAc,CAAEqf,YAAmC,QAAxBpB,EAAEJ,EAAWrB,mBAAW,IAAAyB,EAAAA,EAAIJ,EAAWjlC,KAElFgiC,CACT,CACF,GACA,CAACsC,EAAazN,IAGhB,MAAO,CACL6F,YACA4H,cACAU,YACAlC,gBAAiBsC,GACjBvB,aAAcuB,GAElB,C,eChEO,IAAKsB,GAAU,SAAVA,GAAU,OAAVA,EAAU,sBAAVA,EAAU,mBAAVA,EAAU,mBAAVA,EAAU,oBAAVA,EAAU,sBAAVA,EAAU,mBAAVA,EAAU,kBAAVA,CAAU,MAmBtB,MAAMC,GAAcxlC,EAAAA,YAAiB,SAAoBoN,EAWvDxL,GACA,IATA,SACEoO,EAAW,OAAM,MACjBN,EAAQ,MAAK,KACb5B,EAAO,SACP,gBAAiB23B,EAAY,SAC7BznC,KACG/D,GAC0CmT,EAG/C,MAAMyU,EAAU0jB,GAAWz3B,GACrBkkB,EAASoG,QAAQqN,GACjBx1B,GAxBiBy1B,EAwBczrC,EAAMgW,aAxB6ByrB,EAwBf1J,GAvBrDlE,EAAAA,EAAAA,IAAgB4X,IAAiB5mC,EAAAA,EAAAA,KAACoR,EAAAA,GAAI,CAAClT,KAAM0oC,IACxC1lC,EAAAA,eAAqB0lC,GACrB1lC,EAAAA,aAAmB0lC,EAAoD,CAC5E1T,OAAQ0J,IAEAgK,GANd,IAAyBA,EAAiDhK,EA0BxE,OACE98B,EAAAA,EAAAA,MAACqS,EAAAA,EACC,IACKhX,EACL2H,IAAKA,EACLowB,OAAQA,EACRtiB,MAAOA,EACP5B,KAAMA,EACNkC,SAAUA,EACVC,kBAAcrW,EACdmF,UAAW+C,IAAW,cAAe7H,EAAM8E,WAC3CkxB,aAAcnuB,IAAW+f,EAAS,OAAQ5nB,EAAMg2B,cAAcjyB,SAAA,EAE9Dc,EAAAA,EAAAA,KAAA,QAAAd,SAAOA,IACNiS,IAGP,IAEO,SAAS01B,GACd1rC,GAEA,OAAO6E,EAAAA,EAAAA,KAACswB,GAAAA,EAAW,IAAKn1B,EAAOwD,QAAQqB,EAAAA,EAAAA,KAAC0mC,GAAW,KACrD,C,gBCjEO,SAASI,GAAQ3rC,GACtB,OACE6E,EAAAA,EAAAA,KAACswB,GAAAA,EAAe,IACVn1B,EACJ8E,UAAW+C,IAAW7H,EAAM8E,UAAW,sEAG7C,C,gBCPO,SAAS8mC,GAAS5rC,GACvB,OAAO6E,EAAAA,EAAAA,KAACswB,GAAAA,EAAgB,IAAKn1B,GAC/B,C,gBCFO,SAAS6rC,GAAI14B,GAAkE,IAAjE,SAAEpP,GAA6DoP,EAClF,OACEtO,EAAAA,EAAAA,KAACswB,GAAAA,EAAmB,CAAApxB,UAClBc,EAAAA,EAAAA,KAAA,OAAKC,UAAU,mBAAkBf,SAAEA,KAGzC,CCRyB,IAEpB+nC,GAAS,SAATA,GAAS,OAATA,EAAS,oBAATA,EAAS,qBAATA,CAAS,EAATA,IAAS,IAMTC,GAAY,SAAZA,GAAY,OAAZA,EAAY,sBAAZA,EAAY,uBAAZA,CAAY,EAAZA,IAAY,IAYV,SAASC,GAAK74B,GAA6F,IAA5F,KAAEU,EAAO,SAAQ,QAAE3E,EAAU2E,EAAI,OAAEkkB,EAAM,SAAEh0B,GAA+CoP,EAC9G,MAAM84B,EAAeF,GAAa78B,GAC5Bg9B,EAAYJ,GAAUj4B,GAE5B,OACEhP,EAAAA,EAAAA,KAAA,QACEC,UAAW+C,IACT,yEACAokC,EACAC,EACA,CACE,2CAA4CnU,EAC5C,yKACGA,IAELh0B,SAEDA,GAGP,C,mFCpBA,SAASooC,EAAmBh5B,GAAqE,IAApE,SAAEpP,EAAQ,gBAAEqoC,EAAkB,CAAC,EAAC,KAAErpC,GAAgCoQ,EAC7F,MAAM,QAAEs4B,EAAO,MAAE5lC,EAAK,OAAEwmC,EAAM,UAAEpS,EAAY,UAAamS,EACnD76B,GAAU+6B,EAAAA,EAAAA,IAAgB,CAAErS,cAElC,OACEt1B,EAAAA,EAAAA,MAAAoS,EAAAA,SAAA,CAAAhT,SAAA,EACEc,EAAAA,EAAAA,KAAC0nC,EAAAA,GAAc,CAACC,WAAS,EAAC5rC,MAAO2Q,EAAS6e,UAAW,EAAGqc,sBAAoB,EAAA1oC,SACzEgC,EAAAA,aAAmBhC,EAAU,CAC5B2oC,QAAU1mC,IAA8C,IAAA2mC,EAAAC,EAChC,QAAtBD,GAAAC,EAAA7oC,EAAS/D,OAAM0sC,eAAO,IAAAC,GAAtBA,EAAAxiC,KAAAyiC,EAAyB5mC,GACzBuL,EAAQmqB,MAAM,EAEhBmR,OAAS7mC,IAA8C,IAAA8mC,EAAAC,EAChC,QAArBD,GAAAC,EAAAhpC,EAAS/D,OAAM6sC,cAAM,IAAAC,GAArBA,EAAA3iC,KAAA4iC,EAAwB/mC,GACxBuL,EAAQulB,MAAM,MAInB2U,IACC5mC,EAAAA,EAAAA,KAACmoC,EAAAA,GAAO,CACNC,oBAAoB,EACpBnoC,UAAU,SACVF,GAAI7B,EACJnC,MAAO2Q,EACP1L,MAAOA,EACP,cAAa9C,SAAAA,EAAMM,OAAS,GAAHoP,OAAM1P,EAAI,iBAAapD,EAChD0sC,OAAQA,EAAOtoC,SAEd0nC,MAKX,CAEA,SAASyB,EAAqB/kB,EAE5BxgB,GACA,IAFA,gBAAEykC,EAAe,cAAEe,GAAgB,KAASntC,GAAuEmoB,EAGnH,MAAMiN,GAAQvwB,EAAAA,EAAAA,KAAC4vB,EAAAA,GAAK,IAAKz0B,EAAO2H,IAAKA,IAErC,OAAKwlC,GAKHtoC,EAAAA,EAAAA,KAACsnC,EAAmB,CAACppC,KAAM/C,EAAM+C,KAAMqpC,gBAAiBA,EAAgBroC,SACrEqxB,IALIA,CAQX,CAEO,MAAMgY,EAAernC,EAAAA,WAAiBmnC,E,4ECjEtC,SAASzT,IAAyE,IAA3D,iBAAE4T,EAAmB,IAAG,WAAE3T,GAAa,GAAan6B,UAAA8D,OAAA,QAAA1D,IAAAJ,UAAA,GAAAA,UAAA,GAAG,CAAC,EACpF,MAAOsU,EAAMy5B,GAAWvnC,EAAAA,SAAe,CACrCwnC,WAAYz/B,OAAOy/B,WACnB/T,YAAa1rB,OAAO0rB,cAqBtB,OAlBAzzB,EAAAA,WAAgB,KACd,IAAK2zB,EAAY,OAEjB,MAAM8T,EAAe54B,KAAS,KAC5B04B,EAAQ,CACNC,WAAYz/B,OAAOy/B,WACnB/T,YAAa1rB,OAAO0rB,aACpB,GACD6T,GAIH,OAFAv/B,OAAO1L,iBAAiB,SAAUorC,GAE3B,KACLA,EAAan0B,SACbvL,OAAOpL,oBAAoB,SAAU8qC,EAAa,CACnD,GACA,CAACH,EAAkB3T,IAEf7lB,CACT,C","sources":["webpack://@finviz/website/./js/app/maps/components/CanvasHover.tsx","webpack://@finviz/website/./js/app/maps/components/Canvas.tsx","webpack://@finviz/website/./js/app/maps/components/Legend.tsx","webpack://@finviz/website/./js/app/maps/components/Map.tsx","webpack://@finviz/website/./js/app/maps/components/MapSelect.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Zoom.tsx","webpack://@finviz/website/./js/app/maps/services/api.ts","webpack://@finviz/website/./js/app/maps/store/action-creators.ts","webpack://@finviz/website/./js/app/maps/store/appDispatcher.ts","webpack://@finviz/website/./js/app/maps/store/constants.ts","webpack://@finviz/website/./js/app/maps/store/store.ts","webpack://@finviz/website/./js/app/maps/store/mapStore.ts","webpack://@finviz/website/./js/app/maps/constants/font.ts","webpack://@finviz/website/./js/app/maps/zoom.ts","webpack://@finviz/website/./js/app/maps/treemap.ts","webpack://@finviz/website/./js/app/shared/components/Sparkline.tsx","webpack://@finviz/website/./js/app/shared/getTextFontFamily.ts","webpack://@finviz/website/./js/app/shared/gradients.ts","webpack://@finviz/website/./js/app/shared/loadImage.ts","webpack://@finviz/website/./js/app/shared/retinafy.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/checkbox.tsx","webpack://@finviz/website/./js/main/components/color-picker/draggable.tsx","webpack://@finviz/website/./js/main/components/color-picker/pointer.tsx","webpack://@finviz/website/./js/main/components/color-picker/util.ts","webpack://@finviz/website/./js/main/components/color-picker/alpha.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-palette.tsx","webpack://@finviz/website/./js/main/components/color-picker/hue-saturation.tsx","webpack://@finviz/website/./js/main/components/color-picker/lightness.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-preview.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-input.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-button.tsx","webpack://@finviz/website/./js/main/components/copy-to-clipboard/copy-to-clipboard.tsx","webpack://@finviz/website/./js/main/components/icon/svg.tsx","webpack://@finviz/website/./js/main/hooks/use-popover-maxHeight.ts","webpack://@finviz/website/./js/main/components/context-menu/context-menu.tsx","webpack://@finviz/website/./js/main/components/grid/grid.tsx","webpack://@finviz/website/./js/main/components/inner-state/inner-state.tsx","webpack://@finviz/website/./js/main/components/list/hooks.tsx","webpack://@finviz/website/./js/main/components/list/list-item.tsx","webpack://@finviz/website/./js/main/components/list/list.tsx","webpack://@finviz/website/./js/main/components/range.tsx","webpack://@finviz/website/./js/main/components/toolbar/interfaces.ts","webpack://@finviz/website/./js/main/components/toolbar/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/toolbar.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-button.tsx","webpack://@finviz/website/./js/main/components/toolbar/popover/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/popover/popover.tsx","webpack://@finviz/website/./js/main/components/toolbar/popover/popover-trigger.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-group.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-item.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-divider.tsx","webpack://@finviz/website/./js/main/components/tour/step-content.tsx","webpack://@finviz/website/./js/main/components/tour/utils.ts","webpack://@finviz/website/./js/main/components/tour/hooks.tsx","webpack://@finviz/website/./js/main/components/tabs/tab.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-list.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-panel.tsx","webpack://@finviz/website/./js/main/components/tabs/tabs.tsx","webpack://@finviz/website/./js/main/components/badge.tsx","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx"],"sourcesContent":["import classnames from 'classnames'\r\nimport { Component } from 'react'\r\n\r\nimport '../../../../styles/map-hover.css'\r\nimport Sparkline from '../../shared/components/Sparkline'\r\nimport MapActions from '../store/action-creators'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapDataNode, MapTypeId } from '../types'\r\nimport { getVisibleTooltipTickers } from '../utils'\r\n\r\ninterface CanvasHoverProps {\r\n treemap: Treemap\r\n mapType: MapTypeId\r\n mapNodeId: string\r\n}\r\n\r\ninterface CanvasHoverState {\r\n visibleTickers: string[]\r\n activeNode?: MapDataNode\r\n sparklinesData: Record\r\n}\r\n\r\nclass CanvasHover extends Component {\r\n state: CanvasHoverState = { visibleTickers: [], activeNode: undefined, sparklinesData: {} }\r\n\r\n componentDidMount() {\r\n MapStore.addChangeListener(this._onChange)\r\n document.addEventListener('mousemove', this._onMouseMove)\r\n }\r\n\r\n componentWillUnmount() {\r\n MapActions.loadSparklinesCancel()\r\n MapStore.removeChangeListener(this._onChange)\r\n document.removeEventListener('mousemove', this._onMouseMove)\r\n }\r\n\r\n componentDidUpdate(_: CanvasHoverProps, prevState: CanvasHoverState) {\r\n const { activeNode, visibleTickers, sparklinesData } = this.state\r\n\r\n if (!activeNode || activeNode.name === prevState?.activeNode?.name) return\r\n\r\n if (!visibleTickers.includes(activeNode.name)) {\r\n visibleTickers.push(activeNode.name)\r\n }\r\n\r\n const tickersToLoad = visibleTickers.filter((ticker) => !sparklinesData[ticker])\r\n\r\n if (tickersToLoad.length) {\r\n MapActions.loadSparklineData(tickersToLoad, this.props.mapType)\r\n }\r\n }\r\n\r\n _onChange = () => {\r\n const activeNode = MapStore.getHoveredNode(this.props.mapNodeId)\r\n const sparklinesData = MapStore.getSparklines()\r\n\r\n this.setState({\r\n visibleTickers: getVisibleTooltipTickers(activeNode),\r\n activeNode,\r\n sparklinesData,\r\n })\r\n }\r\n\r\n _formatPerf = (d: MapDataNode) => {\r\n if (typeof d.additional !== 'undefined' && d.additional !== null) {\r\n return d.additional\r\n } else if (typeof d.perf !== 'undefined' && d.perf !== null) {\r\n return this.props.treemap.formatValue(d.perf.toFixed(2))\r\n } else {\r\n return 'N/A'\r\n }\r\n }\r\n\r\n render() {\r\n var d = MapStore.getHoveredNode(this.props.mapNodeId)\r\n if (!this.state.activeNode || !d) {\r\n return null\r\n }\r\n var hasSparkline =\r\n this.state.sparklinesData && this.state.sparklinesData[d.name] && this.state.sparklinesData[d.name].length > 0\r\n var price = hasSparkline\r\n ? this.state.sparklinesData[d.name][this.state.sparklinesData[d.name].length - 1].toFixed(2)\r\n : ''\r\n var colorScale = this.props.treemap.colorScale\r\n var type = this.props.treemap.type\r\n\r\n var children = d.parent.children\r\n .filter((node) => this.state.visibleTickers.includes(node.name))\r\n .sort((a, b) => b.dx * b.dy - a.dx * a.dy)\r\n\r\n var isSmall = children.length > 15\r\n var title = (type !== MapTypeId.World ? d.parent.parent.name + ' - ' : '') + d.parent.name\r\n return (\r\n
\r\n

{title}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {d.description}\r\n \r\n \r\n\r\n {children.length > 1 &&\r\n children.map((c) => {\r\n var hasSparkline =\r\n this.state.sparklinesData &&\r\n this.state.sparklinesData[c.name] &&\r\n this.state.sparklinesData[c.name].length > 0\r\n var data = hasSparkline ? this.state.sparklinesData[c.name] : []\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
{d.data?.data?.nameOverride ?? d.name}\r\n {hasSparkline ? (\r\n \r\n ) : null}\r\n {price}{this._formatPerf(d)}
{c.data?.data?.nameOverride ?? c.name}\r\n {hasSparkline ? (\r\n \r\n ) : null}\r\n {hasSparkline ? data[data.length - 1].toFixed(2) : ''}\r\n {this._formatPerf(c)}\r\n
\r\n
\r\n )\r\n }\r\n\r\n _onMouseMove = (e: MouseEvent) => {\r\n if (!this.state.activeNode) {\r\n return\r\n }\r\n var marginLeft = 100\r\n var marginTop = 0\r\n var el = document.getElementById('hover')!\r\n var hoverWidth = el.scrollWidth\r\n var hoverHeight = el.scrollHeight\r\n var availWidth = document.documentElement.clientWidth\r\n var availHeight = document.documentElement.clientHeight\r\n if (e.clientX + hoverWidth + marginLeft * 1.5 < availWidth) {\r\n el.style.left = e.clientX + marginLeft + 'px'\r\n } else if (e.clientX - hoverWidth - marginLeft > 0) {\r\n el.style.left = e.clientX - marginLeft - hoverWidth + 'px'\r\n } else {\r\n marginLeft = 20\r\n if (e.clientX + hoverWidth + marginLeft < availWidth) {\r\n el.style.left = e.clientX + marginLeft + 'px'\r\n } else {\r\n el.style.left = e.clientX - marginLeft - hoverWidth + 'px'\r\n }\r\n }\r\n el.style.top =\r\n Math.max(0, e.clientY + marginTop - Math.max(0, e.clientY + marginTop + hoverHeight - availHeight)) + 'px'\r\n }\r\n}\r\n\r\nexport default CanvasHover\r\n","import classNames from 'classnames'\r\nimport Hammer from 'hammerjs'\r\nimport * as React from 'react'\r\n\r\nimport { isFirefoxDesktop } from '../../shared/isMobile'\r\nimport { loadImage } from '../../shared/loadImage'\r\nimport { retinafy } from '../../shared/retinafy'\r\nimport LayoutGenerator from '../layout-generator'\r\nimport MapActionCreators from '../store/action-creators'\r\nimport mapActionCreators from '../store/action-creators'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapDataIndustry, MapDataNode, MapDataSector, MapTypeId, NodeDepth } from '../types'\r\nimport { getOffset } from '../utils'\r\nimport CanvasHover from './CanvasHover'\r\nimport Legend from './Legend'\r\n\r\ninterface CanvasProps {\r\n alt?: string\r\n treemap: Treemap\r\n zoom?: boolean\r\n legend?: boolean\r\n zoomOnWheel?: boolean\r\n hover?: boolean\r\n onNodeClick?: (props: {\r\n event: React.MouseEvent\r\n treemap: Treemap\r\n node?: MapDataNode\r\n industry?: MapDataIndustry\r\n sector?: MapDataSector\r\n }) => void\r\n}\r\n\r\ninterface CanvasState {\r\n zoom: number\r\n initialized: boolean\r\n type: MapTypeId\r\n dataHash: string\r\n width: number\r\n height: number\r\n}\r\n\r\n// TODO presunt w, h, zoom, translate do stavu\r\nclass Canvas extends React.Component {\r\n static defaultProps = {\r\n zoom: true,\r\n legend: true,\r\n hover: true,\r\n zoomOnWheel: true,\r\n }\r\n\r\n state: CanvasState = {\r\n zoom: 1,\r\n initialized: false,\r\n type: this.props.treemap.type,\r\n dataHash: this.props.treemap.dataHash,\r\n width: this.props.treemap.width,\r\n height: this.props.treemap.height,\r\n }\r\n\r\n _canvas = React.createRef()\r\n _hoverCanvas = React.createRef()\r\n\r\n // @ts-ignore\r\n _canvasContext: CanvasRenderingContext2D\r\n // @ts-ignore\r\n _hoverContext: CanvasRenderingContext2D\r\n\r\n _cache: Record = {}\r\n mouseDown: boolean = false\r\n lastPanX: number = 0\r\n lastPanY: number = 0\r\n\r\n animationFrameId: number | null = null\r\n\r\n // @ts-ignore\r\n worldBackground: HTMLImageElement\r\n\r\n constructor(props: CanvasProps) {\r\n super(props)\r\n\r\n this._cache = {}\r\n\r\n for (var event of [\r\n '_onChange',\r\n '_onMouseDown',\r\n '_onMouseMove',\r\n '_onMouseUp',\r\n '_onMouseLeave',\r\n '_onDoubleClick',\r\n '_onWheel',\r\n '_onPanStart',\r\n '_onPanMove',\r\n '_onPinch',\r\n '_getPublishCanvas',\r\n ]) {\r\n // @ts-ignore\r\n this[event] = this[event].bind(this)\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n MapStore.addChangeListener(this._onChange)\r\n mapActionCreators._setOnPublish(this._getPublishCanvas)\r\n\r\n this._initialize()\r\n }\r\n\r\n componentDidUpdate() {\r\n if (!this.state.initialized) return\r\n\r\n const { treemap } = this.props\r\n const { dataHash, type } = this.state\r\n\r\n // Nothing changed from outside, so we just render the current view\r\n if (\r\n // Data update\r\n treemap.dataHash === dataHash &&\r\n // Type update\r\n type === treemap.type &&\r\n // Window Resize\r\n treemap.width === this.state.width &&\r\n treemap.height === this.state.height\r\n ) {\r\n this.renderFromCache(this._canvasContext)\r\n this.renderHover(this._hoverContext)\r\n return\r\n }\r\n\r\n this._setCanvasSize(treemap.width, treemap.height)\r\n\r\n if (!this.worldBackground && treemap.type === MapTypeId.World) {\r\n this._loadTreemapGeoBackground().then(() => this._updateCanvasCaches(treemap))\r\n } else {\r\n this._updateCanvasCaches(treemap)\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n // TODO remove hammer listener\r\n MapStore.removeChangeListener(this._onChange)\r\n this._hoverCanvas.current?.removeEventListener('wheel', this._onWheel)\r\n }\r\n\r\n render() {\r\n const { initialized } = this.state\r\n const { alt, treemap, legend, hover, zoom } = this.props\r\n\r\n return (\r\n
\r\n \r\n {alt}\r\n \r\n {(hover || zoom) && (\r\n \r\n )}\r\n {legend && }\r\n {hover && }\r\n
\r\n )\r\n }\r\n\r\n renderFromCache(context: CanvasRenderingContext2D) {\r\n const { treemap } = this.props\r\n const { zoom } = this.state\r\n const [x, y] = treemap.zoom.translate()\r\n const nearestSize = treemap.zoom.getNearestSize(zoom)\r\n\r\n // Last resort if the cache doesn’t exist\r\n if (!this._cache[nearestSize]) this._createCache(nearestSize)\r\n\r\n context.save()\r\n context.drawImage(this._cache[nearestSize].canvas, ~~x, ~~y, ~~(treemap.width * zoom), ~~(treemap.height * zoom))\r\n context.restore()\r\n }\r\n\r\n _onChange() {\r\n const { treemap } = this.props\r\n\r\n this.setState({ zoom: treemap.zoom.scale() })\r\n }\r\n\r\n _onMouseDown() {\r\n this.mouseDown = true\r\n }\r\n\r\n _onMouseMove(e: React.MouseEvent) {\r\n if (this.mouseDown || !this.props.hover) return\r\n\r\n const { treemap } = this.props\r\n var { offsetX, offsetY } = getOffset(e)\r\n let nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\r\n\r\n if (!nodeAtPosition) {\r\n const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\r\n nodeAtPosition = industryAtPosition?.children[0]\r\n }\r\n\r\n MapActionCreators.setHoveredNode(treemap.mapNodeId, nodeAtPosition)\r\n }\r\n\r\n _onMouseUp() {\r\n this.mouseDown = false\r\n }\r\n\r\n _onMouseLeave() {\r\n MapActionCreators.setHoveredNode(this.props.treemap.mapNodeId, undefined)\r\n }\r\n\r\n _onDoubleClick(e: React.MouseEvent) {\r\n const { treemap } = this.props\r\n const { offsetX, offsetY } = getOffset(e)\r\n const nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\r\n const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\r\n const sectorAtPosition = treemap.getSectorAtPosition(offsetX, offsetY)\r\n this.props.onNodeClick?.({\r\n event: e,\r\n treemap,\r\n node: nodeAtPosition,\r\n industry: industryAtPosition,\r\n sector: sectorAtPosition,\r\n })\r\n }\r\n\r\n _onWheel(e: MouseEvent) {\r\n if (!this.props.zoom) return\r\n\r\n e.preventDefault()\r\n\r\n if (!this.state.initialized) {\r\n return\r\n }\r\n\r\n var { offsetX, offsetY } = getOffset(e)\r\n // @ts-ignore\r\n MapActionCreators.zoom(this.props.treemap, -e.deltaY, offsetX, offsetY)\r\n }\r\n\r\n _onPanStart(e: any) {\r\n if (!this.state.initialized) {\r\n return\r\n }\r\n\r\n this.lastPanX = e.pointers[0].clientX\r\n this.lastPanY = e.pointers[0].clientY\r\n }\r\n\r\n _onPanMove(e: any) {\r\n if (!this.state.initialized) {\r\n return\r\n }\r\n\r\n var movementX = this.lastPanX - e.pointers[0].clientX\r\n var movementY = this.lastPanY - e.pointers[0].clientY\r\n this.lastPanX = e.pointers[0].clientX\r\n this.lastPanY = e.pointers[0].clientY\r\n const { treemap } = this.props\r\n MapActionCreators.changeTranslate(treemap, movementX, movementY)\r\n }\r\n\r\n _onPinch(e: any) {\r\n if (!this.state.initialized || !this.props.zoom || e.pointers.length < 2) {\r\n return\r\n }\r\n\r\n var offsetX1 = e.pointers[0].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft, // TODO fix scrolled\r\n offsetY1 = e.pointers[0].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\r\n offsetX2 = e.pointers[1].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft,\r\n offsetY2 = e.pointers[1].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\r\n offsetX = (offsetX1 + offsetX2) / 2,\r\n offsetY = (offsetY1 + offsetY2) / 2\r\n var direction = e.scale >= 1 ? 1 : -1\r\n MapActionCreators.zoom(this.props.treemap, direction, offsetX, offsetY)\r\n }\r\n\r\n _setCanvasContexts() {\r\n const canvas = this._canvas.current!\r\n const canvasContext = canvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n this._canvasContext = canvasContext\r\n\r\n if (this.props.hover || this.props.zoom) {\r\n const hoverCanvas = this._hoverCanvas.current!\r\n const hoverContext = hoverCanvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n\r\n this._hoverContext = hoverContext\r\n }\r\n }\r\n\r\n _setCanvasSize(width: number, height: number) {\r\n retinafy(this._canvas.current, this._canvasContext, width, height)\r\n\r\n if (this.props.hover || this.props.zoom) {\r\n retinafy(this._hoverCanvas.current, this._hoverContext, width, height)\r\n }\r\n }\r\n\r\n async _initialize() {\r\n const { treemap, zoomOnWheel } = this.props\r\n\r\n this._setCanvasContexts()\r\n this._setCanvasSize(treemap.width, treemap.height)\r\n\r\n const zoomLevels = treemap.getZoomLevels()\r\n var render = () => {\r\n this._createCacheWithPriority(zoomLevels, zoomLevels[0], () => {\r\n this.setState({ initialized: true })\r\n\r\n const hoverCanvas = this._hoverCanvas.current\r\n\r\n if (!hoverCanvas) return\r\n\r\n var hammertime = new Hammer(hoverCanvas)\r\n hammertime.get('pinch').set({ enable: true, threshold: 0.1 })\r\n hammertime.on('panstart', this._onPanStart)\r\n hammertime.on('panmove', this._onPanMove)\r\n hammertime.on('pinch', this._onPinch)\r\n\r\n if (zoomOnWheel) {\r\n hoverCanvas.addEventListener('wheel', this._onWheel, { passive: false })\r\n }\r\n })\r\n }\r\n\r\n if (treemap.type === MapTypeId.World) {\r\n await this._loadTreemapGeoBackground()\r\n render()\r\n } else {\r\n render()\r\n }\r\n }\r\n\r\n async _getTreemapGeoBackground() {\r\n if (this.props.treemap.getIsSmall()) {\r\n return FinvizSettings.hasDarkTheme\r\n ? import('../assets/map_geo_small_dark@2x.png')\r\n : import('../assets/map_geo_small@2x.png')\r\n }\r\n\r\n return import('../assets/map_geo.png')\r\n }\r\n\r\n async _loadTreemapGeoBackground() {\r\n try {\r\n const image = await this._getTreemapGeoBackground()\r\n this.worldBackground = await loadImage(image.default)\r\n } catch {}\r\n }\r\n\r\n _createCache(scale: number) {\r\n const { treemap } = this.props\r\n\r\n const oldScale = treemap.zoom.scale()\r\n const oldTranslate = treemap.zoom.translate()\r\n const width = ~~(treemap.width * scale)\r\n const height = ~~(treemap.height * scale)\r\n\r\n if (!this._cache[scale]) {\r\n const cacheCanvas = document.createElement('canvas')\r\n const cacheContext = cacheCanvas.getContext('2d', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\r\n\r\n this._cache[scale] = { canvas: cacheCanvas, context: cacheContext }\r\n }\r\n\r\n retinafy(this._cache[scale].canvas, this._cache[scale].context, width, height)\r\n\r\n treemap.zoom.scale(scale)\r\n treemap.zoom.translateAbs([0, 0])\r\n this.renderCanvas(this._cache[scale].context, treemap)\r\n treemap.zoom.scale(oldScale)\r\n treemap.zoom.translateAbs(oldTranslate)\r\n }\r\n\r\n _updateCanvasCaches(treemap: Treemap) {\r\n this._createCacheWithPriority(treemap.getZoomLevels(), treemap.zoom.getNearestSize(), () => {\r\n this.setState((prevState) => ({\r\n dataHash: treemap.dataHash,\r\n width: treemap.width,\r\n height: treemap.height,\r\n type: treemap.type,\r\n zoom: treemap.type !== prevState.type ? 1 : prevState.zoom,\r\n }))\r\n\r\n // Reset zoom if we’re changing map type\r\n if (this.state.type !== treemap.type) {\r\n mapActionCreators.setHoveredNode(treemap.mapNodeId, undefined)\r\n mapActionCreators.resetSparklineData()\r\n }\r\n\r\n this.renderFromCache(this._canvasContext)\r\n })\r\n }\r\n\r\n _createCacheWithPriority(zoomLevels: number[], currentZoom: number, callback?: () => void) {\r\n if (this.animationFrameId) window.cancelAnimationFrame(this.animationFrameId)\r\n\r\n const remainingLevels = zoomLevels.filter((level) => level !== currentZoom)\r\n this.animationFrameId = requestAnimationFrame(() => {\r\n this._createCache(currentZoom)\r\n callback?.()\r\n this._queueUpdateCache(remainingLevels)\r\n })\r\n }\r\n\r\n _queueUpdateCache(scales: number[], currentScale = 0) {\r\n if (!scales[currentScale]) return\r\n\r\n this.animationFrameId = requestAnimationFrame(() => {\r\n this._createCache(scales[currentScale])\r\n this._queueUpdateCache(scales, currentScale + 1)\r\n })\r\n }\r\n\r\n renderHover(context: CanvasRenderingContext2D) {\r\n if (!this.props.hover) return\r\n\r\n const { treemap } = this.props\r\n const { hover } = treemap.settings.industry\r\n const hoveredNode = MapStore.getHoveredNode(treemap.mapNodeId)\r\n const industry = hoveredNode?.parent\r\n\r\n context.save()\r\n\r\n context.clearRect(0, 0, treemap.width, treemap.height)\r\n context.translate.apply(context, treemap.zoom.translate())\r\n context.scale(treemap.zoom.scale(), treemap.zoom.scale())\r\n\r\n if (!industry) {\r\n context.restore()\r\n return\r\n }\r\n\r\n const showIndustryHeader =\r\n LayoutGenerator.isNodeHeaderVisible(industry, treemap.settings) && industry.depth === NodeDepth.Industry\r\n let industryOffset =\r\n treemap.getIsSmall() || showIndustryHeader\r\n ? treemap.settings.industry.padding.top\r\n : LayoutGenerator.smallIndustryPadding.top\r\n\r\n if (industry.depth === NodeDepth.Sector) industryOffset = treemap.settings.sector.header.height\r\n\r\n if (showIndustryHeader && !treemap.getIsSmall()) {\r\n industryOffset += 1.5\r\n }\r\n\r\n // Outter border\r\n context.strokeStyle = hover?.border ?? 'transparent'\r\n context.lineWidth = 3\r\n context.strokeRect(industry.x - 0.5, industry.y - 0.5 + industryOffset, industry.dx, industry.dy - industryOffset)\r\n\r\n // Inner borders\r\n context.translate(0.5, 0.5)\r\n context.lineWidth = 1\r\n context.beginPath()\r\n for (let i = 0; i < industry.children.length; i++) {\r\n const node = industry.children[i]\r\n context.moveTo(node.x - 1, node.y - 1)\r\n context.lineTo(node.x + node.dx - 1, node.y - 1)\r\n context.lineTo(node.x + node.dx - 1, node.y + node.dy - 1)\r\n context.lineTo(node.x - 1, node.y + node.dy - 1)\r\n context.lineTo(node.x - 1, node.y - 1.5)\r\n }\r\n context.stroke()\r\n\r\n // Header and text\r\n if (!treemap.getIsSmall() && showIndustryHeader) {\r\n context.translate(-0.5, -0.5)\r\n treemap.renderIndustryHeader({\r\n node: industry,\r\n context,\r\n config: hover,\r\n parent: treemap.settings.industry,\r\n fill: hover?.background ?? treemap.settings.background,\r\n })\r\n treemap.renderNodeText({ node: industry, context, config: hover, parent: treemap.settings.industry })\r\n }\r\n\r\n context.restore()\r\n }\r\n\r\n renderCanvas(context: CanvasRenderingContext2D, treemap: Treemap) {\r\n context.save()\r\n\r\n const scale = treemap.zoom.getNearestSize()\r\n\r\n context.fillStyle = treemap.settings.background\r\n context.fillRect(0, 0, treemap.width * scale, treemap.height * scale)\r\n\r\n context.translate.apply(context, treemap.zoom.translate())\r\n context.scale(scale, scale)\r\n\r\n /* BACKGROUND */\r\n if (treemap.type === MapTypeId.World && this.worldBackground) {\r\n if (treemap.getIsSmall()) context.translate(0, 20)\r\n\r\n context.drawImage(\r\n this.worldBackground,\r\n 0,\r\n 0,\r\n this.worldBackground.naturalWidth,\r\n this.worldBackground.naturalHeight,\r\n 0,\r\n 20,\r\n treemap.width,\r\n treemap.width / (this.worldBackground.naturalWidth / this.worldBackground.naturalHeight)\r\n )\r\n }\r\n\r\n if (treemap.settings.sector.background) {\r\n context.fillStyle = treemap.settings.sector.background\r\n for (let index = 0; index < treemap.sectors.length; index++) {\r\n const node = treemap.sectors[index]\r\n context.fillRect(node.x, node.y, node.dx, node.dy)\r\n }\r\n }\r\n\r\n if (treemap.settings.industry.background) {\r\n context.fillStyle = treemap.settings.industry.background\r\n for (let index = 0; index < treemap.industries.length; index++) {\r\n const node = treemap.industries[index]\r\n context.fillRect(node.x, node.y + 3, node.dx - 1, node.dy - 4)\r\n }\r\n }\r\n\r\n /* STOCKS */\r\n for (let index = 0; index < treemap.nodes.length; index++) {\r\n const node = treemap.nodes[index]\r\n if (!node.parent) continue // Skip on root node\r\n treemap.renderStockNode(treemap.nodes[index], context)\r\n }\r\n\r\n /* INDUSTRIES */\r\n for (let index = 0; index < treemap.industries.length; index++) {\r\n const node = treemap.industries[index]\r\n const isLargeNode = LayoutGenerator.isNodeHeaderVisible(node, treemap.settings)\r\n const isGeoMap = treemap.type === MapTypeId.World\r\n const renderBackground = treemap.getIsSmall() ? isGeoMap : !isGeoMap\r\n\r\n if (!isLargeNode || (treemap.getIsSmall() && !isGeoMap)) continue\r\n\r\n if (Number.isFinite(node.perf) && renderBackground) {\r\n treemap.renderIndustryHeader({\r\n node,\r\n context,\r\n config: treemap.settings.industry.header,\r\n parent: treemap.settings.industry,\r\n fill: treemap.colorScale(node.perf),\r\n })\r\n }\r\n\r\n treemap.renderNodeText({\r\n node,\r\n context,\r\n config: treemap.settings.industry.header,\r\n parent: treemap.settings.industry,\r\n })\r\n }\r\n\r\n /* SECTORS */\r\n if (treemap.type !== MapTypeId.World) {\r\n for (let index = 0; index < treemap.sectors.length; index++) {\r\n const node = treemap.sectors[index]\r\n\r\n if (treemap.getIsSmall()) {\r\n treemap.renderIndustryHeader({\r\n node,\r\n context,\r\n config: treemap.settings.sector.header,\r\n parent: treemap.settings.sector,\r\n fill: treemap.settings.sector.header.background ?? treemap.colorScale(node.perf),\r\n })\r\n }\r\n\r\n treemap.renderNodeText({\r\n node,\r\n context,\r\n config: treemap.settings.sector.header,\r\n parent: treemap.settings.sector,\r\n })\r\n }\r\n }\r\n\r\n context.restore()\r\n\r\n if (treemap.settings.sector.border) {\r\n this.renderSectorBorders(context, treemap)\r\n }\r\n }\r\n\r\n renderSectorBorders(context: CanvasRenderingContext2D, treemap: Treemap) {\r\n const scale = treemap.zoom.scale()\r\n context.lineWidth = 2 * scale\r\n context.strokeStyle = treemap.settings.sector.border ?? 'transparent'\r\n\r\n context.beginPath()\r\n\r\n // Outside border\r\n context.moveTo(0, 0)\r\n context.lineTo(treemap.width * scale, 0)\r\n context.lineTo(treemap.width * scale, treemap.height * scale)\r\n context.lineTo(0, treemap.height * scale)\r\n context.lineTo(0, -1)\r\n\r\n for (let index = 0; index < treemap.sectors.length; index++) {\r\n const sector = treemap.sectors[index]\r\n\r\n context.strokeRect(sector.x * scale, sector.y * scale, sector.dx * scale, sector.dy * scale)\r\n }\r\n\r\n context.stroke()\r\n }\r\n\r\n _getPublishCanvas() {\r\n return this._cache[1].canvas\r\n }\r\n}\r\n\r\nexport default Canvas\r\n","import classnames from 'classnames'\r\n\r\nimport { scaleStepFormat } from '../constants/settings'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapTypeId } from '../types'\r\n\r\ninterface LegendProps {\r\n treemap: Treemap\r\n className?: string\r\n}\r\n\r\nfunction Legend(props: LegendProps) {\r\n const colorScale = props.treemap.colorScale\r\n\r\n if (!colorScale) {\r\n return null\r\n }\r\n\r\n var boxover =\r\n 'cssbody=[tooltip_bdy] cssheader=[tooltip_hdr] header=[' +\r\n props.treemap.scale.name +\r\n \"] body=[
\" +\r\n props.treemap.scale.tooltip +\r\n '
] offsety=[-70] delay=[500]'\r\n\r\n const [scaleMin, scaleMax] = props.treemap.getScaleMinMax()\r\n var steps = [scaleMin]\r\n var diff = scaleMax - scaleMin\r\n if (diff > 0) {\r\n var step = diff / 6\r\n for (var i = 1; i < 7; i++) {\r\n steps.push(Math.round((scaleMin + step * i) * 10) / 10)\r\n }\r\n }\r\n\r\n if (props.treemap.scale.id === '_rec') {\r\n steps = [5, 4, 3, 2, 1]\r\n } else if (props.treemap.scale.id === '_earndate') {\r\n steps = [-30, -15, -1, 1, 15, 30]\r\n }\r\n\r\n // TODO some widths\r\n var stepWidth = ['_rec', '_earndate'].indexOf(props.treemap.scale.id) !== -1 ? 100 : 50\r\n var format = scaleStepFormat[props.treemap.scale.id]\r\n return (\r\n
\r\n {![MapTypeId.Portfolio, MapTypeId.ETFHoldings].includes(props.treemap.type) && (\r\n
\r\n Use mouse wheel to zoom in and out. Drag zoomed map to pan it.\r\n
\r\n Double‑click a ticker to display detailed information in a new window.\r\n
\r\n {!MapStore.isWidget() &&\r\n 'Hover mouse cursor over a ticker to see its main competitors in a stacked view with a 3-month history graph.'}\r\n
\r\n )}\r\n
\r\n {steps.map((step, index) => (\r\n \r\n {props.treemap.formatValue(step.toString(), [scaleMin, scaleMax], format)}\r\n
\r\n ))}\r\n
\r\n \r\n )\r\n}\r\n\r\nexport default Legend\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nimport { Delayed } from '../../../main/components/delayed'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport { ISettings } from '../constants/settings'\r\nimport LayoutGenerator from '../layout-generator'\r\nimport mapActionCreators from '../store/action-creators'\r\nimport Treemap from '../treemap'\r\nimport { MapDataRoot, MapSubtype, MapType } from '../types'\r\nimport * as mapUtils from '../utils'\r\nimport Canvas from './Canvas'\r\n\r\nconst MapContext = React.createContext<{\r\n treemap?: Treemap\r\n setTreemap: React.Dispatch>\r\n generator?: LayoutGenerator\r\n setGenerator: React.Dispatch>\r\n}>({ setTreemap: () => {}, setGenerator: () => {} })\r\n\r\nexport function useMapContext() {\r\n return React.useContext(MapContext)\r\n}\r\n\r\nexport function MapContextProvider(props: React.PropsWithChildren<{}>) {\r\n const [treemap, setTreemap] = React.useState()\r\n const [generator, setGenerator] = React.useState()\r\n\r\n return (\r\n {props.children}\r\n )\r\n}\r\n\r\ninterface MapProps {\r\n className?: string\r\n isLoadingData?: boolean\r\n isFetchingPerf?: boolean\r\n type: MapType\r\n subtype: MapSubtype\r\n data?: MapDataRoot\r\n settings?: ISettings\r\n onNodeClick?: React.ComponentProps['onNodeClick']\r\n zoom?: boolean\r\n zoomOnWheel?: boolean\r\n legend?: boolean\r\n hover?: boolean\r\n truncateNodeName?: boolean\r\n dataHash?: string\r\n}\r\n\r\nexport function Map({\r\n className,\r\n isLoadingData,\r\n isFetchingPerf = isLoadingData,\r\n type,\r\n subtype,\r\n data,\r\n settings,\r\n onNodeClick,\r\n zoom,\r\n zoomOnWheel,\r\n legend,\r\n hover,\r\n truncateNodeName,\r\n dataHash,\r\n}: MapProps) {\r\n const { setGenerator, treemap: prevTreemap, setTreemap } = useMapContext()\r\n const containerRef = React.useRef(null)\r\n\r\n /**\r\n * We can’t `useEffect` for generator/treemap, because we’d have to deal with stale references in\r\n * other effects. In order to ensure we always get the current values, we need to either `useRef`\r\n * them (and update props for both state and ref) or `useMemo` and wait for first render to happen.\r\n */\r\n const [hasRendered, setHasRendered] = React.useState(false)\r\n\r\n /**\r\n * Generator makes the layout, it should only change when the map type or settings change.\r\n */\r\n const generator = React.useMemo(() => {\r\n if (!hasRendered || !containerRef.current) return\r\n\r\n const isSmall = mapUtils.getIsSmall()\r\n const size = mapUtils.getSize(containerRef.current, type.type, isSmall)\r\n const mapSettings = settings ?? mapUtils.getSettingsForMapType(type.type, isSmall)\r\n const generator = new LayoutGenerator(size.width, size.height, type.type, mapSettings, isSmall)\r\n\r\n // This is used for updating the map base data using map-generator\r\n window.MAP_EXPORT = generator\r\n\r\n return generator\r\n }, [hasRendered, type.type, settings])\r\n\r\n /**\r\n * Treemap object is the logical representation of the map (whereas Canvas is graphical)\r\n * We want to hold to it for as long as we can and reuse it. That’s why we’re comparing\r\n * `prevTreemap` and returning the prev value if it equals.\r\n */\r\n const treemap = React.useMemo(() => {\r\n if (!generator || !data || !dataHash || prevTreemap?.type === type.type) return prevTreemap\r\n\r\n return new Treemap({\r\n data: generator.getLayout(data),\r\n width: generator.width,\r\n height: generator.height,\r\n settings: generator.settings,\r\n isSmall: generator.isSmall,\r\n scale: { id: subtype.scaleId, name: subtype.name, tooltip: subtype.tooltip },\r\n countIndustryPerf: subtype.countIndustryPerf,\r\n countSectorPerf: generator.isSmall && subtype.countSectorPerf,\r\n type: type.type,\r\n subtype: subtype.id,\r\n truncateNodeName,\r\n mapNodeId: prevTreemap?.mapNodeId,\r\n dataHash,\r\n zoomLevels: zoom === false ? [1] : undefined,\r\n })\r\n // Can’t add `prevTreemap` because we’d end up in a loop\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [generator, data, type.type, subtype])\r\n\r\n /**\r\n * Update context values\r\n */\r\n React.useEffect(() => {\r\n setHasRendered(true)\r\n setGenerator(generator)\r\n setTreemap(treemap)\r\n }, [generator, setGenerator, setTreemap, treemap])\r\n\r\n /**\r\n * Handle data updates\r\n */\r\n const updateTimeoutRef = React.useRef()\r\n React.useEffect(() => {\r\n if (!treemap || !generator || !data || isFetchingPerf) return\r\n\r\n updateTimeoutRef.current = window.setTimeout(() => {\r\n if (!dataHash || treemap.dataHash === dataHash) return\r\n\r\n const layout = generator.getLayout(data)\r\n mapActionCreators.updateLayout(treemap, {\r\n width: generator.width,\r\n height: generator.height,\r\n data: layout,\r\n scale: { id: subtype.scaleId, name: subtype.name, tooltip: subtype.tooltip },\r\n dataHash,\r\n })\r\n }, 100)\r\n\r\n return () => {\r\n if (updateTimeoutRef.current) window.clearTimeout(updateTimeoutRef.current)\r\n }\r\n }, [generator, treemap, data, isFetchingPerf, subtype, dataHash])\r\n\r\n /**\r\n * Recalculate layout when the window size changes\r\n */\r\n React.useEffect(() => {\r\n const containerElement = containerRef.current\r\n\r\n if (!generator || !containerElement || !treemap || !data) return\r\n\r\n const resize = throttle(() => {\r\n const size = mapUtils.getSize(containerElement, generator.type, generator.isSmall)\r\n\r\n if (size.width === treemap.width && size.height === treemap.height) return\r\n\r\n treemap.zoom.scale(1)\r\n generator.width = size.width\r\n generator.height = size.height\r\n const layout = generator.getLayout(data)\r\n mapActionCreators.updateLayout(treemap, {\r\n width: generator.width,\r\n height: generator.height,\r\n data: layout,\r\n scale: treemap.scale,\r\n dataHash: treemap.dataHash,\r\n })\r\n }, 100)\r\n\r\n window.addEventListener('resize', resize)\r\n\r\n return () => {\r\n window.removeEventListener('resize', resize)\r\n }\r\n }, [generator, treemap, data])\r\n\r\n return (\r\n
\r\n \r\n {(!treemap && !isLoadingData) || !treemap || isLoadingData ? (\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 classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Select, SelectListProps, SelectProps } from '../../../main/components'\r\nimport { ButtonHTMLProps, ButtonProps } from '../../../main/components/button'\r\nimport { Icon } from '../../../main/components/icon'\r\n\r\nexport enum MapSelectTheme {\r\n light,\r\n dark,\r\n}\r\n\r\ninterface MapSelectThemeReturn {\r\n label: React.HTMLProps\r\n button: ButtonProps & ButtonHTMLProps\r\n popover: SelectListProps\r\n}\r\n\r\nconst hasRedesign = FinvizSettings.hasRedesignEnabled\r\n\r\nfunction getMapSelectTheme(theme: MapSelectTheme): MapSelectThemeReturn | undefined {\r\n switch (theme) {\r\n case MapSelectTheme.dark:\r\n return {\r\n label: {\r\n className: 'text-gray-400',\r\n },\r\n button: {\r\n theme: 'transparent',\r\n rounding: 'none',\r\n className: 'w-full border border-[#585f72] bg-[#4a505f] hover:border-[#707990] hover:bg-[#535a6b]',\r\n rightContent: ,\r\n },\r\n popover: {\r\n rounding: 'none',\r\n theme: 'none',\r\n className:\r\n 'border border-[#585f72] bg-[#4a505f] [--bg-primary:74_80_95] [--border-primary:103,111,133] [--scrollbar-radius:0] dark:[--thumb-bg-hover:#262931] dark:[--thumb-bg:#363a46] dark:[--track-bg-hover:transparent] dark:[--track-bg:transparent]',\r\n },\r\n }\r\n\r\n case MapSelectTheme.light:\r\n return {\r\n label: { className: 'text-gray-500' },\r\n button: {\r\n rounding: 'none',\r\n className: 'w-full bg-primary',\r\n },\r\n popover: {\r\n rounding: 'none',\r\n className: classnames('overflow-y-auto max-h-80', {\r\n '[--scrollbar-radius:0]': !hasRedesign,\r\n }),\r\n },\r\n }\r\n }\r\n}\r\n\r\ninterface MapSelectProps extends Omit, 'theme'> {\r\n /**\r\n * Theme for the map select\r\n *\r\n * @default dark\r\n */\r\n theme?: keyof typeof MapSelectTheme\r\n}\r\n\r\nexport function MapSelect({\r\n label,\r\n 'aria-label': ariaLabel,\r\n theme = 'dark',\r\n items,\r\n onChange,\r\n ...props\r\n}: MapSelectProps) {\r\n const selectTheme = React.useMemo(() => getMapSelectTheme(MapSelectTheme[theme]), [theme])\r\n\r\n return (\r\n
\r\n {label && (\r\n

{label}

\r\n )}\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button } from '../../../../main/components/button'\r\nimport { SVG } from '../../../../main/components/icon/svg'\r\nimport mapActionCreators from '../../store/action-creators'\r\nimport { useMapContext } from '../Map'\r\n\r\nexport function useZoomButtons() {\r\n const { treemap } = useMapContext()\r\n const zoomOut = React.useCallback(\r\n (ev: React.MouseEvent) => {\r\n if (!treemap) return\r\n ev.preventDefault()\r\n mapActionCreators.zoom(treemap, -1, treemap.width / 2, treemap.height / 2)\r\n },\r\n [treemap]\r\n )\r\n const zoomIn = React.useCallback(\r\n (ev: React.MouseEvent) => {\r\n if (!treemap) return\r\n ev.preventDefault()\r\n mapActionCreators.zoom(treemap, 1, treemap.width / 2, treemap.height / 2)\r\n },\r\n [treemap]\r\n )\r\n\r\n return { zoomIn, zoomOut }\r\n}\r\n\r\nexport function Zoom() {\r\n const handlers = useZoomButtons()\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 )\r\n}\r\n","import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapBaseData(type: MapTypeId, cacheBuster: number) {\r\n return apiRequest(`/maps/${type}.json`, { query: { rev: cacheBuster } }, true)\r\n}\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n return apiRequest(`/api/map_perf.ashx`, { query: { t: type, st: subtype } })\r\n}\r\n\r\nexport function mapPerfScreener(query = window.location.search) {\r\n return apiRequest(`/api/map_perf_screener.ashx${query}`)\r\n}\r\n\r\nexport interface UploadMapResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\r\n return apiRequest(`/publish_map_submit.ashx`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': ContentType.FormUrlEncoded,\r\n },\r\n body: new URLSearchParams({\r\n file: data.replace('data:image/png;base64,', ''),\r\n type,\r\n subtype,\r\n }),\r\n })\r\n}\r\n","import debounce from 'lodash.debounce'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../../main/services/api'\r\nimport Treemap from '../treemap'\r\nimport { MapData, MapDataNode, MapTypeId, PerfData, Scale } from '../types'\r\nimport { getVisibleTooltipTickers } from '../utils'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport mapStore from './mapStore'\r\n\r\nvar _targetScale = 1\r\nfunction zoomIn(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() + 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() + 0.05 < _targetScale + 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction zoomOut(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() - 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() - 0.05 > _targetScale - 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction updateVisibleSparklines(treemap: Treemap) {\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n if (hoveredNode) {\r\n const tickersToLoad = getVisibleTooltipTickers(hoveredNode)\r\n\r\n if (!tickersToLoad.includes(hoveredNode.name)) {\r\n tickersToLoad.push(hoveredNode.name)\r\n }\r\n\r\n if (tickersToLoad.length) {\r\n debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n }\r\n }\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise | null = null\r\nasync function loadSparklines(tickers: string[], mapType: string) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.LOAD_SPARKLINES_STARTED,\r\n })\r\n _lastSparklinesRequest?.cancel?.()\r\n _lastSparklinesRequest = apiRequest(\r\n '/api/map_sparklines.ashx',\r\n { query: { t: tickers.join(','), ty: mapType } },\r\n true\r\n )\r\n\r\n try {\r\n const data = await _lastSparklinesRequest\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_COMPLETED,\r\n data: data,\r\n })\r\n } catch (error) {\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_FAILED,\r\n error,\r\n })\r\n }\r\n}\r\n\r\nconst debouncedLoadSparklines = debounce(loadSparklines, 200, { trailing: true })\r\n\r\nconst actions = {\r\n setHoveredNode(mapNodeId: string, node: MapDataNode | undefined) {\r\n if (!node) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n }\r\n\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node,\r\n mapNodeId,\r\n })\r\n },\r\n\r\n loadSparklineData(tickers: string[], mapType: MapTypeId) {\r\n if (tickers) {\r\n debouncedLoadSparklines(tickers, mapType)\r\n }\r\n },\r\n\r\n loadSparklinesCancel() {\r\n _lastSparklinesRequest?.cancel?.()\r\n },\r\n\r\n resetSparklineData() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n },\r\n\r\n changeTranslate(treemap: Treemap, tx: number, ty: number) {\r\n treemap.zoom.translate([tx, ty])\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.CHANGE_TRANSLATE,\r\n })\r\n },\r\n\r\n zoom(treemap: Treemap, direction: number, offsetX: number, offsetY: number) {\r\n if (direction > 0) {\r\n const zoomLevel = treemap.getNextZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomIn(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n } else {\r\n const zoomLevel = treemap.getPreviousZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomOut(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n }\r\n },\r\n\r\n render() {\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n zoomAndTranslate(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n treemap.zoom.scale(1, { x: tx, y: ty })\r\n treemap.zoom.scale(scale, { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n updateLayout(\r\n treemap: Treemap,\r\n props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }\r\n ) {\r\n treemap.updateData(props)\r\n treemap.zoom.updateDimensions(props)\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n\r\n // Update hovered node if any\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n if (hoveredNode) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node: treemap.nodes.find((node) => node.name === hoveredNode.name),\r\n mapNodeId: treemap.mapNodeId,\r\n })\r\n updateVisibleSparklines(treemap)\r\n }\r\n },\r\n\r\n updatePerfData(treemap?: Treemap, data?: PerfData) {\r\n if (!treemap || !data) return\r\n\r\n treemap.updatePerf(data)\r\n AppDispatcher.handleServerAction({ type: ActionTypes.UPDATE_DATA, version: data.version })\r\n\r\n updateVisibleSparklines(treemap)\r\n },\r\n\r\n _setOnPublish(getPublishCanvas: () => HTMLCanvasElement) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_PUBLISH_CANVAS,\r\n getPublishCanvas,\r\n })\r\n },\r\n\r\n setupWidget() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_WIDGET,\r\n isWidget: true,\r\n })\r\n },\r\n}\r\n\r\nexport default actions\r\n","import { Dispatcher } from 'flux'\r\n\r\nimport { PayloadSources } from './constants'\r\n\r\nclass AppDispatcher extends Dispatcher {\r\n handleServerAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.SERVER_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n\r\n handleViewAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.VIEW_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n}\r\n\r\nexport default new AppDispatcher()\r\n","import keyMirror from 'keymirror'\r\n\r\nconst ActionTypes = keyMirror({\r\n RENDER_TREEMAP: null,\r\n CHANGE_TRANSLATE: null,\r\n SET_HOVERED_NODE: null,\r\n\r\n LOAD_SPARKLINES_STARTED: null,\r\n LOAD_SPARKLINES_COMPLETED: null,\r\n LOAD_SPARKLINES_FAILED: null,\r\n RESET_SPARKLINE_DATA: null,\r\n\r\n INIT_STARTED: null,\r\n INIT_FAILED: null,\r\n\r\n UPDATE_DATA: null,\r\n\r\n SET_PUBLISH_CANVAS: null,\r\n\r\n SET_WIDGET: null,\r\n})\r\n\r\nconst PayloadSources = keyMirror({\r\n SERVER_ACTION: null,\r\n VIEW_ACTION: null,\r\n})\r\n\r\nexport { ActionTypes, PayloadSources }\r\n","import { EventEmitter } from 'events'\r\n\r\nclass Store extends EventEmitter {\r\n static CHANGE_EVENT = 'change'\r\n\r\n emitChange() {\r\n this.emit(Store.CHANGE_EVENT)\r\n }\r\n\r\n addChangeListener(callback: (...args: any[]) => void) {\r\n this.on(Store.CHANGE_EVENT, callback)\r\n }\r\n\r\n removeChangeListener(callback: (...args: any[]) => void) {\r\n this.removeListener(Store.CHANGE_EVENT, callback)\r\n }\r\n}\r\n\r\nexport default Store\r\n","import { MapDataNode } from '../types'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport Store from './store'\r\n\r\nlet _hoveredNode: MapDataNode\r\nlet _mapNodeId: string\r\nlet _sparklinesData: Record = {}\r\nlet _dataVersion: number\r\nlet _isWidget = false\r\nlet _getPublishCanvas: () => HTMLCanvasElement\r\n\r\nclass MapStore extends Store {\r\n getHoveredNode(mapNodeId: string) {\r\n if (mapNodeId === _mapNodeId) return _hoveredNode\r\n return undefined\r\n }\r\n\r\n getSparklines() {\r\n return _sparklinesData\r\n }\r\n\r\n getDataVersion() {\r\n return _dataVersion\r\n }\r\n\r\n isWidget() {\r\n return _isWidget\r\n }\r\n\r\n getPublishCanvas() {\r\n return _getPublishCanvas()\r\n }\r\n}\r\n\r\nvar mapStore = new MapStore()\r\n\r\n// @ts-ignore\r\nmapStore.dispatchToken = AppDispatcher.register(function (payload: any) {\r\n var action = payload.action\r\n\r\n switch (action.type) {\r\n case ActionTypes.RENDER_TREEMAP:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_HOVERED_NODE:\r\n if (action.node !== _hoveredNode) {\r\n _hoveredNode = action.node\r\n _mapNodeId = action.mapNodeId\r\n mapStore.emitChange()\r\n }\r\n break\r\n\r\n case ActionTypes.CHANGE_TRANSLATE:\r\n // @ts-ignore\r\n _hoveredNode = undefined\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_STARTED:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_COMPLETED:\r\n _sparklinesData = { ..._sparklinesData, ...action.data }\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.RESET_SPARKLINE_DATA:\r\n case ActionTypes.LOAD_SPARKLINES_FAILED:\r\n _sparklinesData = {}\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.UPDATE_DATA:\r\n _dataVersion = action.version\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_PUBLISH_CANVAS:\r\n _getPublishCanvas = action.getPublishCanvas\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_WIDGET:\r\n _isWidget = action.isWidget\r\n mapStore.emitChange()\r\n break\r\n }\r\n})\r\n\r\nexport default mapStore\r\n","// Based on Lato font with bold weight\r\nexport const fontSizesWidths: Record> = {\r\n 4: {\r\n 0: 2.32,\r\n 1: 2.32,\r\n 2: 2.32,\r\n 3: 2.32,\r\n 4: 2.32,\r\n 5: 2.32,\r\n 6: 2.32,\r\n 7: 2.32,\r\n 8: 2.32,\r\n 9: 2.32,\r\n ' ': 0.772,\r\n '+': 2.32,\r\n '-': 1.436,\r\n '%': 3.212,\r\n '.': 0.9,\r\n a: 2.094,\r\n b: 2.28,\r\n c: 1.908,\r\n d: 2.28,\r\n e: 2.138,\r\n f: 1.402,\r\n g: 2.07,\r\n h: 2.274,\r\n i: 1.084,\r\n j: 1.076,\r\n k: 2.206,\r\n l: 1.084,\r\n m: 3.368,\r\n n: 2.274,\r\n o: 2.274,\r\n p: 2.262,\r\n q: 2.28,\r\n r: 1.634,\r\n s: 1.748,\r\n t: 1.548,\r\n u: 2.274,\r\n v: 2.134,\r\n w: 3.164,\r\n x: 2.16,\r\n y: 2.134,\r\n z: 1.878,\r\n A: 2.84,\r\n B: 2.606,\r\n C: 2.682,\r\n D: 2.99,\r\n E: 2.29,\r\n F: 2.246,\r\n G: 2.892,\r\n H: 3.024,\r\n I: 1.256,\r\n J: 1.748,\r\n K: 2.792,\r\n L: 2.068,\r\n M: 3.72,\r\n N: 3.024,\r\n O: 3.198,\r\n P: 2.5,\r\n Q: 3.198,\r\n R: 2.62,\r\n S: 2.146,\r\n T: 2.38,\r\n U: 2.912,\r\n V: 2.84,\r\n W: 4.186,\r\n X: 2.716,\r\n Y: 2.618,\r\n Z: 2.468,\r\n },\r\n 6: {\r\n 0: 3.48,\r\n 1: 3.48,\r\n 2: 3.48,\r\n 3: 3.48,\r\n 4: 3.48,\r\n 5: 3.48,\r\n 6: 3.48,\r\n 7: 3.48,\r\n 8: 3.48,\r\n 9: 3.48,\r\n ' ': 1.158,\r\n '+': 3.48,\r\n '-': 2.154,\r\n '%': 4.818,\r\n '.': 1.35,\r\n a: 3.141,\r\n b: 3.42,\r\n c: 2.862,\r\n d: 3.42,\r\n e: 3.207,\r\n f: 2.103,\r\n g: 3.105,\r\n h: 3.411,\r\n i: 1.626,\r\n j: 1.614,\r\n k: 3.309,\r\n l: 1.626,\r\n m: 5.052,\r\n n: 3.411,\r\n o: 3.411,\r\n p: 3.393,\r\n q: 3.42,\r\n r: 2.451,\r\n s: 2.622,\r\n t: 2.322,\r\n u: 3.411,\r\n v: 3.201,\r\n w: 4.746,\r\n x: 3.24,\r\n y: 3.201,\r\n z: 2.817,\r\n A: 4.26,\r\n B: 3.909,\r\n C: 4.023,\r\n D: 4.485,\r\n E: 3.435,\r\n F: 3.369,\r\n G: 4.338,\r\n H: 4.536,\r\n I: 1.884,\r\n J: 2.622,\r\n K: 4.188,\r\n L: 3.102,\r\n M: 5.58,\r\n N: 4.536,\r\n O: 4.797,\r\n P: 3.75,\r\n Q: 4.797,\r\n R: 3.93,\r\n S: 3.219,\r\n T: 3.57,\r\n U: 4.368,\r\n V: 4.26,\r\n W: 6.279,\r\n X: 4.074,\r\n Y: 3.927,\r\n Z: 3.702,\r\n },\r\n 8: {\r\n 0: 4.64,\r\n 1: 4.64,\r\n 2: 4.64,\r\n 3: 4.64,\r\n 4: 4.64,\r\n 5: 4.64,\r\n 6: 4.64,\r\n 7: 4.64,\r\n 8: 4.64,\r\n 9: 4.64,\r\n ' ': 1.544,\r\n '+': 4.64,\r\n '-': 2.872,\r\n '%': 6.424,\r\n '.': 1.8,\r\n a: 4.188,\r\n b: 4.56,\r\n c: 3.816,\r\n d: 4.56,\r\n e: 4.276,\r\n f: 2.804,\r\n g: 4.14,\r\n h: 4.548,\r\n i: 2.168,\r\n j: 2.152,\r\n k: 4.412,\r\n l: 2.168,\r\n m: 6.736,\r\n n: 4.548,\r\n o: 4.548,\r\n p: 4.524,\r\n q: 4.56,\r\n r: 3.268,\r\n s: 3.496,\r\n t: 3.096,\r\n u: 4.548,\r\n v: 4.268,\r\n w: 6.328,\r\n x: 4.32,\r\n y: 4.268,\r\n z: 3.756,\r\n A: 5.68,\r\n B: 5.212,\r\n C: 5.364,\r\n D: 5.98,\r\n E: 4.58,\r\n F: 4.492,\r\n G: 5.784,\r\n H: 6.048,\r\n I: 2.512,\r\n J: 3.496,\r\n K: 5.584,\r\n L: 4.136,\r\n M: 7.44,\r\n N: 6.048,\r\n O: 6.396,\r\n P: 5,\r\n Q: 6.396,\r\n R: 5.24,\r\n S: 4.292,\r\n T: 4.76,\r\n U: 5.824,\r\n V: 5.68,\r\n W: 8.372,\r\n X: 5.432,\r\n Y: 5.236,\r\n Z: 4.936,\r\n },\r\n 9: {\r\n 0: 5.22,\r\n 1: 5.22,\r\n 2: 5.22,\r\n 3: 5.22,\r\n 4: 5.22,\r\n 5: 5.22,\r\n 6: 5.22,\r\n 7: 5.22,\r\n 8: 5.22,\r\n 9: 5.22,\r\n ' ': 1.737,\r\n '+': 5.22,\r\n '-': 3.231,\r\n '%': 7.227,\r\n '.': 2.025,\r\n a: 4.712,\r\n b: 5.13,\r\n c: 4.293,\r\n d: 5.13,\r\n e: 4.811,\r\n f: 3.155,\r\n g: 4.658,\r\n h: 5.117,\r\n i: 2.439,\r\n j: 2.421,\r\n k: 4.964,\r\n l: 2.439,\r\n m: 7.578,\r\n n: 5.117,\r\n o: 5.117,\r\n p: 5.09,\r\n q: 5.13,\r\n r: 3.677,\r\n s: 3.933,\r\n t: 3.483,\r\n u: 5.117,\r\n v: 4.802,\r\n w: 7.119,\r\n x: 4.86,\r\n y: 4.802,\r\n z: 4.226,\r\n A: 6.39,\r\n B: 5.864,\r\n C: 6.035,\r\n D: 6.728,\r\n E: 5.153,\r\n F: 5.054,\r\n G: 6.507,\r\n H: 6.804,\r\n I: 2.826,\r\n J: 3.933,\r\n K: 6.282,\r\n L: 4.653,\r\n M: 8.37,\r\n N: 6.804,\r\n O: 7.196,\r\n P: 5.625,\r\n Q: 7.196,\r\n R: 5.895,\r\n S: 4.829,\r\n T: 5.355,\r\n U: 6.552,\r\n V: 6.39,\r\n W: 9.419,\r\n X: 6.111,\r\n Y: 5.891,\r\n Z: 5.553,\r\n },\r\n 10: {\r\n 0: 5.8,\r\n 1: 5.8,\r\n 2: 5.8,\r\n 3: 5.8,\r\n 4: 5.8,\r\n 5: 5.8,\r\n 6: 5.8,\r\n 7: 5.8,\r\n 8: 5.8,\r\n 9: 5.8,\r\n ' ': 1.93,\r\n '+': 5.8,\r\n '-': 3.59,\r\n '%': 8.03,\r\n '.': 2.25,\r\n a: 5.235,\r\n b: 5.7,\r\n c: 4.77,\r\n d: 5.7,\r\n e: 5.345,\r\n f: 3.505,\r\n g: 5.175,\r\n h: 5.685,\r\n i: 2.71,\r\n j: 2.69,\r\n k: 5.515,\r\n l: 2.71,\r\n m: 8.42,\r\n n: 5.685,\r\n o: 5.685,\r\n p: 5.655,\r\n q: 5.7,\r\n r: 4.085,\r\n s: 4.37,\r\n t: 3.87,\r\n u: 5.685,\r\n v: 5.335,\r\n w: 7.91,\r\n x: 5.4,\r\n y: 5.335,\r\n z: 4.695,\r\n A: 7.1,\r\n B: 6.515,\r\n C: 6.705,\r\n D: 7.475,\r\n E: 5.725,\r\n F: 5.615,\r\n G: 7.23,\r\n H: 7.56,\r\n I: 3.14,\r\n J: 4.37,\r\n K: 6.98,\r\n L: 5.17,\r\n M: 9.3,\r\n N: 7.56,\r\n O: 7.995,\r\n P: 6.25,\r\n Q: 7.995,\r\n R: 6.55,\r\n S: 5.365,\r\n T: 5.95,\r\n U: 7.28,\r\n V: 7.1,\r\n W: 10.465,\r\n X: 6.79,\r\n Y: 6.545,\r\n Z: 6.17,\r\n },\r\n 11: {\r\n 0: 6.38,\r\n 1: 6.38,\r\n 2: 6.38,\r\n 3: 6.38,\r\n 4: 6.38,\r\n 5: 6.38,\r\n 6: 6.38,\r\n 7: 6.38,\r\n 8: 6.38,\r\n 9: 6.38,\r\n ' ': 2.123,\r\n '+': 6.38,\r\n '-': 3.949,\r\n '%': 8.833,\r\n '.': 2.475,\r\n a: 5.759,\r\n b: 6.27,\r\n c: 5.247,\r\n d: 6.27,\r\n e: 5.88,\r\n f: 3.856,\r\n g: 5.693,\r\n h: 6.254,\r\n i: 2.981,\r\n j: 2.959,\r\n k: 6.067,\r\n l: 2.981,\r\n m: 9.262,\r\n n: 6.254,\r\n o: 6.254,\r\n p: 6.221,\r\n q: 6.27,\r\n r: 4.494,\r\n s: 4.807,\r\n t: 4.257,\r\n u: 6.254,\r\n v: 5.869,\r\n w: 8.701,\r\n x: 5.94,\r\n y: 5.869,\r\n z: 5.165,\r\n A: 7.81,\r\n B: 7.167,\r\n C: 7.376,\r\n D: 8.223,\r\n E: 6.298,\r\n F: 6.177,\r\n G: 7.953,\r\n H: 8.316,\r\n I: 3.454,\r\n J: 4.807,\r\n K: 7.678,\r\n L: 5.687,\r\n M: 10.23,\r\n N: 8.316,\r\n O: 8.795,\r\n P: 6.875,\r\n Q: 8.795,\r\n R: 7.205,\r\n S: 5.902,\r\n T: 6.545,\r\n U: 8.008,\r\n V: 7.81,\r\n W: 11.512,\r\n X: 7.469,\r\n Y: 7.2,\r\n Z: 6.787,\r\n },\r\n 12: {\r\n 0: 6.96,\r\n 1: 6.96,\r\n 2: 6.96,\r\n 3: 6.96,\r\n 4: 6.96,\r\n 5: 6.96,\r\n 6: 6.96,\r\n 7: 6.96,\r\n 8: 6.96,\r\n 9: 6.96,\r\n ' ': 2.316,\r\n '+': 6.96,\r\n '-': 4.308,\r\n '%': 9.636,\r\n '.': 2.7,\r\n a: 6.282,\r\n b: 6.84,\r\n c: 5.724,\r\n d: 6.84,\r\n e: 6.414,\r\n f: 4.206,\r\n g: 6.21,\r\n h: 6.822,\r\n i: 3.252,\r\n j: 3.228,\r\n k: 6.618,\r\n l: 3.252,\r\n m: 10.104,\r\n n: 6.822,\r\n o: 6.822,\r\n p: 6.786,\r\n q: 6.84,\r\n r: 4.902,\r\n s: 5.244,\r\n t: 4.644,\r\n u: 6.822,\r\n v: 6.402,\r\n w: 9.492,\r\n x: 6.48,\r\n y: 6.402,\r\n z: 5.634,\r\n A: 8.52,\r\n B: 7.818,\r\n C: 8.046,\r\n D: 8.97,\r\n E: 6.87,\r\n F: 6.738,\r\n G: 8.676,\r\n H: 9.072,\r\n I: 3.768,\r\n J: 5.244,\r\n K: 8.376,\r\n L: 6.204,\r\n M: 11.16,\r\n N: 9.072,\r\n O: 9.594,\r\n P: 7.5,\r\n Q: 9.594,\r\n R: 7.86,\r\n S: 6.438,\r\n T: 7.14,\r\n U: 8.736,\r\n V: 8.52,\r\n W: 12.558,\r\n X: 8.148,\r\n Y: 7.854,\r\n Z: 7.404,\r\n },\r\n 13: {\r\n 0: 7.54,\r\n 1: 7.54,\r\n 2: 7.54,\r\n 3: 7.54,\r\n 4: 7.54,\r\n 5: 7.54,\r\n 6: 7.54,\r\n 7: 7.54,\r\n 8: 7.54,\r\n 9: 7.54,\r\n ' ': 2.509,\r\n '+': 7.54,\r\n '-': 4.667,\r\n '%': 10.439,\r\n '.': 2.925,\r\n a: 6.806,\r\n b: 7.41,\r\n c: 6.201,\r\n d: 7.41,\r\n e: 6.949,\r\n f: 4.557,\r\n g: 6.728,\r\n h: 7.391,\r\n i: 3.523,\r\n j: 3.497,\r\n k: 7.17,\r\n l: 3.523,\r\n m: 10.946,\r\n n: 7.391,\r\n o: 7.391,\r\n p: 7.352,\r\n q: 7.41,\r\n r: 5.311,\r\n s: 5.681,\r\n t: 5.031,\r\n u: 7.391,\r\n v: 6.936,\r\n w: 10.283,\r\n x: 7.02,\r\n y: 6.936,\r\n z: 6.104,\r\n A: 9.23,\r\n B: 8.47,\r\n C: 8.717,\r\n D: 9.718,\r\n E: 7.443,\r\n F: 7.3,\r\n G: 9.399,\r\n H: 9.828,\r\n I: 4.082,\r\n J: 5.681,\r\n K: 9.074,\r\n L: 6.721,\r\n M: 12.09,\r\n N: 9.828,\r\n O: 10.394,\r\n P: 8.125,\r\n Q: 10.394,\r\n R: 8.515,\r\n S: 6.975,\r\n T: 7.735,\r\n U: 9.464,\r\n V: 9.23,\r\n W: 13.605,\r\n X: 8.827,\r\n Y: 8.509,\r\n Z: 8.021,\r\n },\r\n 14: {\r\n 0: 8.12,\r\n 1: 8.12,\r\n 2: 8.12,\r\n 3: 8.12,\r\n 4: 8.12,\r\n 5: 8.12,\r\n 6: 8.12,\r\n 7: 8.12,\r\n 8: 8.12,\r\n 9: 8.12,\r\n ' ': 2.702,\r\n '+': 8.12,\r\n '-': 5.026,\r\n '%': 11.242,\r\n '.': 3.15,\r\n a: 7.329,\r\n b: 7.98,\r\n c: 6.678,\r\n d: 7.98,\r\n e: 7.483,\r\n f: 4.907,\r\n g: 7.245,\r\n h: 7.959,\r\n i: 3.794,\r\n j: 3.766,\r\n k: 7.721,\r\n l: 3.794,\r\n m: 11.788,\r\n n: 7.959,\r\n o: 7.959,\r\n p: 7.917,\r\n q: 7.98,\r\n r: 5.719,\r\n s: 6.118,\r\n t: 5.418,\r\n u: 7.959,\r\n v: 7.469,\r\n w: 11.074,\r\n x: 7.56,\r\n y: 7.469,\r\n z: 6.573,\r\n A: 9.94,\r\n B: 9.121,\r\n C: 9.387,\r\n D: 10.465,\r\n E: 8.015,\r\n F: 7.861,\r\n G: 10.122,\r\n H: 10.584,\r\n I: 4.396,\r\n J: 6.118,\r\n K: 9.772,\r\n L: 7.238,\r\n M: 13.02,\r\n N: 10.584,\r\n O: 11.193,\r\n P: 8.75,\r\n Q: 11.193,\r\n R: 9.17,\r\n S: 7.511,\r\n T: 8.33,\r\n U: 10.192,\r\n V: 9.94,\r\n W: 14.651,\r\n X: 9.506,\r\n Y: 9.163,\r\n Z: 8.638,\r\n },\r\n 18: {\r\n 0: 10.44,\r\n 1: 10.44,\r\n 2: 10.44,\r\n 3: 10.44,\r\n 4: 10.44,\r\n 5: 10.44,\r\n 6: 10.44,\r\n 7: 10.44,\r\n 8: 10.44,\r\n 9: 10.44,\r\n ' ': 3.474,\r\n '+': 10.44,\r\n '-': 6.462,\r\n '%': 14.454,\r\n '.': 4.05,\r\n a: 9.423,\r\n b: 10.26,\r\n c: 8.586,\r\n d: 10.26,\r\n e: 9.621,\r\n f: 6.309,\r\n g: 9.315,\r\n h: 10.233,\r\n i: 4.878,\r\n j: 4.842,\r\n k: 9.927,\r\n l: 4.878,\r\n m: 15.156,\r\n n: 10.233,\r\n o: 10.233,\r\n p: 10.179,\r\n q: 10.26,\r\n r: 7.353,\r\n s: 7.866,\r\n t: 6.966,\r\n u: 10.233,\r\n v: 9.603,\r\n w: 14.238,\r\n x: 9.72,\r\n y: 9.603,\r\n z: 8.451,\r\n A: 12.78,\r\n B: 11.727,\r\n C: 12.069,\r\n D: 13.455,\r\n E: 10.305,\r\n F: 10.107,\r\n G: 13.014,\r\n H: 13.608,\r\n I: 5.652,\r\n J: 7.866,\r\n K: 12.564,\r\n L: 9.306,\r\n M: 16.74,\r\n N: 13.608,\r\n O: 14.391,\r\n P: 11.25,\r\n Q: 14.391,\r\n R: 11.79,\r\n S: 9.657,\r\n T: 10.71,\r\n U: 13.104,\r\n V: 12.78,\r\n W: 18.837,\r\n X: 12.222,\r\n Y: 11.781,\r\n Z: 11.106,\r\n },\r\n 20: {\r\n 0: 11.6,\r\n 1: 11.6,\r\n 2: 11.6,\r\n 3: 11.6,\r\n 4: 11.6,\r\n 5: 11.6,\r\n 6: 11.6,\r\n 7: 11.6,\r\n 8: 11.6,\r\n 9: 11.6,\r\n ' ': 3.86,\r\n '+': 11.6,\r\n '-': 7.18,\r\n '%': 16.06,\r\n '.': 4.5,\r\n a: 10.47,\r\n b: 11.4,\r\n c: 9.54,\r\n d: 11.4,\r\n e: 10.69,\r\n f: 7.01,\r\n g: 10.35,\r\n h: 11.37,\r\n i: 5.42,\r\n j: 5.38,\r\n k: 11.03,\r\n l: 5.42,\r\n m: 16.84,\r\n n: 11.37,\r\n o: 11.37,\r\n p: 11.31,\r\n q: 11.4,\r\n r: 8.17,\r\n s: 8.74,\r\n t: 7.74,\r\n u: 11.37,\r\n v: 10.67,\r\n w: 15.82,\r\n x: 10.8,\r\n y: 10.67,\r\n z: 9.39,\r\n A: 14.2,\r\n B: 13.03,\r\n C: 13.41,\r\n D: 14.95,\r\n E: 11.45,\r\n F: 11.23,\r\n G: 14.46,\r\n H: 15.12,\r\n I: 6.28,\r\n J: 8.74,\r\n K: 13.96,\r\n L: 10.34,\r\n M: 18.6,\r\n N: 15.12,\r\n O: 15.99,\r\n P: 12.5,\r\n Q: 15.99,\r\n R: 13.1,\r\n S: 10.73,\r\n T: 11.9,\r\n U: 14.56,\r\n V: 14.2,\r\n W: 20.93,\r\n X: 13.58,\r\n Y: 13.09,\r\n Z: 12.34,\r\n },\r\n 24: {\r\n 0: 13.92,\r\n 1: 13.92,\r\n 2: 13.92,\r\n 3: 13.92,\r\n 4: 13.92,\r\n 5: 13.92,\r\n 6: 13.92,\r\n 7: 13.92,\r\n 8: 13.92,\r\n 9: 13.92,\r\n ' ': 4.632,\r\n '+': 13.92,\r\n '-': 8.616,\r\n '%': 19.272,\r\n '.': 5.4,\r\n a: 12.564,\r\n b: 13.68,\r\n c: 11.448,\r\n d: 13.68,\r\n e: 12.828,\r\n f: 8.412,\r\n g: 12.42,\r\n h: 13.644,\r\n i: 6.504,\r\n j: 6.456,\r\n k: 13.236,\r\n l: 6.504,\r\n m: 20.208,\r\n n: 13.644,\r\n o: 13.644,\r\n p: 13.572,\r\n q: 13.68,\r\n r: 9.804,\r\n s: 10.488,\r\n t: 9.288,\r\n u: 13.644,\r\n v: 12.804,\r\n w: 18.984,\r\n x: 12.96,\r\n y: 12.804,\r\n z: 11.268,\r\n A: 17.04,\r\n B: 15.636,\r\n C: 16.092,\r\n D: 17.94,\r\n E: 13.74,\r\n F: 13.476,\r\n G: 17.352,\r\n H: 18.144,\r\n I: 7.536,\r\n J: 10.488,\r\n K: 16.752,\r\n L: 12.408,\r\n M: 22.32,\r\n N: 18.144,\r\n O: 19.188,\r\n P: 15,\r\n Q: 19.188,\r\n R: 15.72,\r\n S: 12.876,\r\n T: 14.28,\r\n U: 17.472,\r\n V: 17.04,\r\n W: 25.116,\r\n X: 16.296,\r\n Y: 15.708,\r\n Z: 14.808,\r\n },\r\n 30: {\r\n 0: 17.4,\r\n 1: 17.4,\r\n 2: 17.4,\r\n 3: 17.4,\r\n 4: 17.4,\r\n 5: 17.4,\r\n 6: 17.4,\r\n 7: 17.4,\r\n 8: 17.4,\r\n 9: 17.4,\r\n ' ': 5.79,\r\n '+': 17.4,\r\n '-': 10.77,\r\n '%': 24.09,\r\n '.': 6.75,\r\n a: 15.705,\r\n b: 17.1,\r\n c: 14.31,\r\n d: 17.1,\r\n e: 16.035,\r\n f: 10.515,\r\n g: 15.525,\r\n h: 17.055,\r\n i: 8.13,\r\n j: 8.07,\r\n k: 16.545,\r\n l: 8.13,\r\n m: 25.26,\r\n n: 17.055,\r\n o: 17.055,\r\n p: 16.965,\r\n q: 17.1,\r\n r: 12.255,\r\n s: 13.11,\r\n t: 11.61,\r\n u: 17.055,\r\n v: 16.005,\r\n w: 23.73,\r\n x: 16.2,\r\n y: 16.005,\r\n z: 14.085,\r\n A: 21.3,\r\n B: 19.545,\r\n C: 20.115,\r\n D: 22.425,\r\n E: 17.175,\r\n F: 16.845,\r\n G: 21.69,\r\n H: 22.68,\r\n I: 9.42,\r\n J: 13.11,\r\n K: 20.94,\r\n L: 15.51,\r\n M: 27.9,\r\n N: 22.68,\r\n O: 23.985,\r\n P: 18.75,\r\n Q: 23.985,\r\n R: 19.65,\r\n S: 16.095,\r\n T: 17.85,\r\n U: 21.84,\r\n V: 21.3,\r\n W: 31.395,\r\n X: 20.37,\r\n Y: 19.635,\r\n Z: 18.51,\r\n },\r\n 36: {\r\n 0: 20.88,\r\n 1: 20.88,\r\n 2: 20.88,\r\n 3: 20.88,\r\n 4: 20.88,\r\n 5: 20.88,\r\n 6: 20.88,\r\n 7: 20.88,\r\n 8: 20.88,\r\n 9: 20.88,\r\n ' ': 6.948,\r\n '+': 20.88,\r\n '-': 12.924,\r\n '%': 28.908,\r\n '.': 8.1,\r\n a: 18.846,\r\n b: 20.52,\r\n c: 17.172,\r\n d: 20.52,\r\n e: 19.242,\r\n f: 12.618,\r\n g: 18.63,\r\n h: 20.466,\r\n i: 9.756,\r\n j: 9.684,\r\n k: 19.854,\r\n l: 9.756,\r\n m: 30.312,\r\n n: 20.466,\r\n o: 20.466,\r\n p: 20.358,\r\n q: 20.52,\r\n r: 14.706,\r\n s: 15.732,\r\n t: 13.932,\r\n u: 20.466,\r\n v: 19.206,\r\n w: 28.476,\r\n x: 19.44,\r\n y: 19.206,\r\n z: 16.902,\r\n A: 25.56,\r\n B: 23.454,\r\n C: 24.138,\r\n D: 26.91,\r\n E: 20.61,\r\n F: 20.214,\r\n G: 26.028,\r\n H: 27.216,\r\n I: 11.304,\r\n J: 15.732,\r\n K: 25.128,\r\n L: 18.612,\r\n M: 33.48,\r\n N: 27.216,\r\n O: 28.782,\r\n P: 22.5,\r\n Q: 28.782,\r\n R: 23.58,\r\n S: 19.314,\r\n T: 21.42,\r\n U: 26.208,\r\n V: 25.56,\r\n W: 37.674,\r\n X: 24.444,\r\n Y: 23.562,\r\n Z: 22.212,\r\n },\r\n}\r\n\r\nexport const fontSizeLineHeights: Record = {\r\n 4: 5,\r\n 6: 7,\r\n 8: 10,\r\n 9: 11,\r\n 10: 12,\r\n 11: 13,\r\n 12: 14,\r\n 13: 15,\r\n 14: 20,\r\n 18: 21,\r\n 20: 24,\r\n 24: 28,\r\n 30: 35,\r\n 36: 42,\r\n}\r\n","import * as d3 from 'd3'\r\n\r\ninterface Dimensions {\r\n width: number\r\n height: number\r\n}\r\n\r\nexport class Zoom {\r\n zoomElement = document.createElement('canvas')\r\n zoomSelection = d3.select(this.zoomElement)\r\n behavior: d3.ZoomBehavior\r\n\r\n translateExtent: [width: number, height: number]\r\n zoomLevels: number[]\r\n\r\n constructor(dimensions: Dimensions, zoomLevels: number[]) {\r\n this.translateExtent = [dimensions.width, dimensions.height]\r\n this.zoomLevels = zoomLevels\r\n\r\n this.behavior = d3\r\n .zoom()\r\n .extent([[0, 0], this.translateExtent])\r\n .scaleExtent([this.zoomLevels[0], this.zoomLevels[this.zoomLevels.length - 1]])\r\n .translateExtent([[0, 0], this.translateExtent])\r\n .on('zoom', null)\r\n\r\n this.zoomSelection.call(this.behavior)\r\n }\r\n\r\n updateDimensions = (dimensions: Dimensions) => {\r\n this.translateExtent = [dimensions.width, dimensions.height]\r\n this.behavior.extent([[0, 0], this.translateExtent]).translateExtent([[0, 0], this.translateExtent])\r\n }\r\n\r\n getTransform = () => d3.zoomTransform(this.zoomElement)\r\n\r\n scale = (newZoom?: number, mapCenter?: { x: number; y: number }) => {\r\n if (typeof newZoom === 'number' && Number.isFinite(newZoom)) {\r\n if (mapCenter) {\r\n this.zoomSelection.call(this.behavior.scaleTo, newZoom, [mapCenter.x, mapCenter.y])\r\n } else {\r\n this.zoomSelection.call(this.behavior.scaleTo, newZoom)\r\n }\r\n return newZoom\r\n }\r\n\r\n return this.getTransform().k\r\n }\r\n\r\n translate = (args?: [x: number, y: number]): [x: number, y: number] => {\r\n const scale = this.scale()\r\n\r\n if (Array.isArray(args) && Number.isFinite(args[0]) && Number.isFinite(args[1])) {\r\n this.zoomSelection.call(this.behavior.translateBy, -(args[0] / scale), -(args[1] / scale))\r\n return [args[0], args[1]]\r\n }\r\n let t = this.getTransform()\r\n return [t.x, t.y]\r\n }\r\n\r\n translateAbs = ([x, y]: [x: number, y: number]) => {\r\n const scale = this.scale()\r\n this.zoomSelection.call(this.behavior.translateTo, -(x / scale), -(y / scale), [0, 0])\r\n }\r\n\r\n getNearestSize(currentZoom: number = this.scale()) {\r\n let nearestSize = this.zoomLevels[0]\r\n for (var i = 0, len = this.zoomLevels.length; i < len; i++) {\r\n const level = this.zoomLevels[i]\r\n if (level >= currentZoom) {\r\n nearestSize = level\r\n break\r\n }\r\n }\r\n\r\n return nearestSize\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport { PortfolioSymbolType } from '../../main/modules/portfolio/types'\r\nimport { getSymbolType } from '../../main/modules/portfolio/utils'\r\nimport { getUuid } from '../../main/util'\r\nimport { getTextFontFamily } from '../shared/getTextFontFamily'\r\nimport { gradientSmall, gradients } from '../shared/gradients'\r\nimport { fontSizeLineHeights, fontSizesWidths } from './constants/font'\r\nimport { ISettingsSection, scaleMinMax, scaleStepFormat } from './constants/settings'\r\nimport { ISettings, ISettingsSectionFont, ISettingsSectionHeader } from './constants/settings'\r\nimport LayoutGenerator from './layout-generator'\r\nimport {\r\n MapData,\r\n MapDataIndustry,\r\n MapDataNode,\r\n MapDataRow,\r\n MapDataSector,\r\n MapSubtypeId,\r\n MapTypeId,\r\n PerfData,\r\n Scale,\r\n ScaleId,\r\n} from './types'\r\nimport * as mapUtils from './utils'\r\nimport { Zoom } from './zoom'\r\n\r\nconst fontFamily = getTextFontFamily()\r\n\r\nclass Treemap {\r\n width: number\r\n height: number\r\n version?: number\r\n scale: Scale\r\n countIndustryPerf: boolean\r\n countSectorPerf?: boolean\r\n nodes: MapDataNode[] = []\r\n sectors: MapDataSector[] = []\r\n industries: MapDataIndustry[] = []\r\n zoom: Zoom\r\n colorScale: (n?: number) => string\r\n settings: ISettings\r\n type: MapTypeId\r\n subtype: MapSubtypeId\r\n isSmall: boolean\r\n zoomLevels: number[]\r\n dataHash: string\r\n mapNodeId: string\r\n truncateNodeName: boolean\r\n\r\n constructor({\r\n countIndustryPerf = false,\r\n countSectorPerf = false,\r\n subtype = MapSubtypeId.DayPerf,\r\n isSmall = false,\r\n zoomLevels = mapUtils.getDefaultZoomLevels(),\r\n truncateNodeName = false,\r\n ...props\r\n }: {\r\n data: MapData\r\n width: number\r\n height: number\r\n version?: number\r\n scale: Scale\r\n countIndustryPerf?: boolean\r\n countSectorPerf?: boolean\r\n settings: ISettings\r\n type: MapTypeId\r\n subtype?: MapSubtypeId\r\n isSmall?: boolean\r\n zoomLevels?: number[]\r\n truncateNodeName?: boolean\r\n mapNodeId?: string\r\n dataHash: string\r\n }) {\r\n this.width = props.width\r\n this.height = props.height\r\n this.version = props.version\r\n this.settings = props.settings\r\n this.type = props.type\r\n this.scale = props.scale\r\n this.nodes = props.data.nodes\r\n this.sectors = props.data.sectors\r\n this.industries = props.data.industries\r\n this.subtype = subtype\r\n this.zoomLevels = zoomLevels\r\n this.isSmall = isSmall\r\n this.countIndustryPerf = countIndustryPerf\r\n this.countSectorPerf = countSectorPerf\r\n this.truncateNodeName = truncateNodeName\r\n this.mapNodeId = props.mapNodeId ?? getUuid()\r\n this.dataHash = props.dataHash\r\n\r\n this.zoom = new Zoom({ width: this.width, height: this.height }, this.zoomLevels)\r\n\r\n this.colorScale = this.getColorScale()\r\n\r\n if (this.countIndustryPerf) {\r\n this._updateIndustryPerf()\r\n }\r\n if (this.countSectorPerf) {\r\n this._updateSectorPerf()\r\n }\r\n }\r\n\r\n getIsSmall() {\r\n return this.isSmall\r\n }\r\n\r\n updateData(props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }) {\r\n this.width = props.width\r\n this.height = props.height\r\n this.nodes = props.data.nodes\r\n this.sectors = props.data.sectors\r\n this.industries = props.data.industries\r\n this.scale = props.scale\r\n this.dataHash = props.dataHash\r\n\r\n if (this.countIndustryPerf) {\r\n this._updateIndustryPerf()\r\n }\r\n if (this.countSectorPerf) {\r\n this._updateSectorPerf()\r\n }\r\n\r\n this.colorScale = this.getColorScale()\r\n }\r\n\r\n getScaleMinMax() {\r\n switch (this.scale.id) {\r\n case ScaleId.PortfolioPct:\r\n case ScaleId.PortfolioUsd:\r\n if (this.nodes.length === 0) return [0, 0]\r\n // get min/max week perf\r\n const minValuePerf = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\r\n const maxValuePerf = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\r\n const perfMax = Math.max(minValuePerf, maxValuePerf)\r\n // get min/max all time perf\r\n const minValueNode = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.perf)!)\r\n const maxValueNode = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.perf)!)\r\n const valueMax = Math.max(minValueNode, maxValueNode)\r\n // Use the weekly perf as a buffer, compute number of digits and round nicely\r\n const valueToUse = this.scale.id === ScaleId.PortfolioPct ? valueMax + perfMax : valueMax * (1 + perfMax / 100)\r\n // Sanity check\r\n if (Number.isNaN(valueToUse)) return [0, 0]\r\n const numberOfDigits = Math.max(Math.floor(Math.log10(Math.abs(valueToUse))), 0) + 1\r\n const roundedBound = Math.ceil(valueToUse / numberOfDigits) * numberOfDigits\r\n\r\n return [-roundedBound, roundedBound]\r\n default:\r\n return scaleMinMax[this.scale.id]\r\n }\r\n }\r\n\r\n getColorScale() {\r\n const [minDomain, maxDomain] = this.getScaleMinMax()\r\n let gradient = gradients[this.scale.id]\r\n if (this.getIsSmall() && this.scale.id === ScaleId.DayPerf) {\r\n gradient = gradientSmall\r\n }\r\n const linearScale = d3\r\n .scaleLinear()\r\n .domain([minDomain, maxDomain])\r\n .range([0, gradient.colors.length - 1])\r\n return (d?: number) => {\r\n if (typeof d === 'undefined' || !Number.isFinite(d)) {\r\n return gradient.nullColor\r\n }\r\n const min = Math.min(minDomain, maxDomain)\r\n const max = Math.max(minDomain, maxDomain)\r\n const value = Math.max(Math.min(d, max), min)\r\n\r\n const i = Math.round(linearScale(value))\r\n\r\n return gradient.colors[i]\r\n }\r\n }\r\n\r\n getParentSector(node: MapDataNode | MapDataIndustry): string {\r\n if (node.parent && !!node.parent.parent) return this.getParentSector(node.parent as MapDataIndustry)\r\n\r\n return node.name\r\n }\r\n\r\n /*\r\n * data = {\r\n * nodes: {\"AAPL\": 1.5, \"MSFT\": -0.5}\r\n * industries: {...}\r\n * }\r\n */\r\n updatePerf(data: PerfData) {\r\n this.dataHash = data.hash\r\n\r\n for (var i = 0; i < this.nodes.length; i++) {\r\n const nodeName = this.nodes[i].name\r\n\r\n if (Array.isArray(data.nodes)) {\r\n const parentSector = this.getParentSector(this.nodes[i])\r\n const updatedNode = data.nodes.find((node) => node.name === nodeName && node.data?.sector === parentSector)\r\n\r\n if (!updatedNode) continue\r\n\r\n this.nodes[i].perf = updatedNode.perf\r\n this.nodes[i].additional = updatedNode.additional\r\n } else {\r\n this.nodes[i].perf = data.nodes[nodeName]\r\n this.nodes[i].additional = data.additional[nodeName]\r\n }\r\n }\r\n\r\n if (this.countIndustryPerf) {\r\n this._updateIndustryPerf()\r\n } else {\r\n this._resetIndustryPerf()\r\n }\r\n\r\n if (this.countSectorPerf) {\r\n this._updateSectorPerf()\r\n }\r\n\r\n this.colorScale = this.getColorScale()\r\n }\r\n\r\n _resetIndustryPerf() {\r\n for (var i = 0; i < this.industries.length; i++) {\r\n this.industries[i].perf = undefined\r\n }\r\n }\r\n\r\n _updateIndustryPerf() {\r\n var industry, weightedPriceSum, marketCapSum, stock, marketCap, everyStockUndefined\r\n for (var i = 0; i < this.industries.length; i++) {\r\n industry = this.industries[i]\r\n weightedPriceSum = 0\r\n marketCapSum = 0\r\n everyStockUndefined = true\r\n for (var j = 0; j < industry.children.length; j++) {\r\n stock = industry.children[j]\r\n marketCap = stock.dx * stock.dy\r\n if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\r\n weightedPriceSum += stock.perf * marketCap\r\n everyStockUndefined = false\r\n }\r\n marketCapSum += marketCap\r\n }\r\n if (!everyStockUndefined) {\r\n industry.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\r\n }\r\n }\r\n }\r\n\r\n _updateSectorPerf() {\r\n var sector, industry, weightedPriceSum, marketCapSum, stock, marketCap\r\n for (var s = 0; s < this.sectors.length; s++) {\r\n sector = this.sectors[s]\r\n weightedPriceSum = 0\r\n marketCapSum = 0\r\n for (var i = 0; i < sector.children.length; i++) {\r\n industry = sector.children[i]\r\n for (var j = 0; j < industry.children.length; j++) {\r\n stock = industry.children[j]\r\n marketCap = stock.dx * stock.dy\r\n if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\r\n weightedPriceSum += stock.perf * marketCap\r\n }\r\n marketCapSum += marketCap\r\n }\r\n }\r\n sector.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\r\n }\r\n }\r\n\r\n _getNodeTopOffset(node: MapDataNode) {\r\n if (!this.isSmall && this.type === MapTypeId.World) return 0\r\n\r\n const isSmallSecMap = this.isSmall && this.type === MapTypeId.Sector\r\n // Industry\r\n let parent: MapDataRow = node.parent\r\n let leftPadding = this.settings.industry.padding.left\r\n let topPadding = this.settings.industry.padding.top + this.settings.industry.header.height\r\n\r\n if (isSmallSecMap) {\r\n // Sector\r\n parent = node.parent.parent\r\n leftPadding = this.settings.sector.padding.left\r\n topPadding = this.settings.sector.padding.top + this.settings.sector.header.height\r\n }\r\n\r\n const isFirstNodeInIndustry =\r\n Math.floor(parent.x + leftPadding) === node.x && Math.floor(parent.y + topPadding) === node.y\r\n const showIndustryHeader = LayoutGenerator.isNodeHeaderVisible(parent, this.settings)\r\n\r\n return isFirstNodeInIndustry && showIndustryHeader ? 6 : 0\r\n }\r\n\r\n getNodeText(node: MapDataNode) {\r\n let name = node.name\r\n const scale = this.zoom.getNearestSize()\r\n const fontSizes = this.settings.scaleFontSizes[scale]\r\n const nodeTopOffset = this._getNodeTopOffset(node)\r\n const nodeHeight = node.dy - nodeTopOffset\r\n\r\n let nodeNameFontSize = this.findMaxFontSizeForText(node.name, node.dx, nodeHeight, fontSizes)\r\n if (!nodeNameFontSize && this.truncateNodeName) {\r\n nodeNameFontSize = fontSizes[fontSizes.length - 1]\r\n name = this.getLongestText(\r\n name,\r\n nodeNameFontSize,\r\n Math.max(0, node.dx - this.settings.fontSizePadding[nodeNameFontSize] * 2)\r\n )\r\n } else if (!nodeNameFontSize) return null\r\n\r\n const nodeNameLineHeight = fontSizeLineHeights[nodeNameFontSize]\r\n const stepFormat = scaleStepFormat[this.scale.id]\r\n const format = stepFormat === '%N%' ? (node.dx > 32 ? stepFormat : '%N') : stepFormat\r\n\r\n let perfText = getSymbolType(node.name) === PortfolioSymbolType.Cash ? '' : node.additional ?? ''\r\n if (perfText.length === 0 && node.perf !== undefined && Number.isFinite(node.perf)) {\r\n perfText = this.formatValue(node.perf.toFixed(2), scaleMinMax[this.scale.id], format)\r\n }\r\n\r\n const fontPairs =\r\n this.settings.fontSizePairs[nodeNameFontSize]?.filter((allowedSize) => fontSizes.includes(allowedSize)) ?? []\r\n\r\n let perfFontSize\r\n let perfLineHeight = 0\r\n if (fontPairs.length) {\r\n perfFontSize =\r\n fontPairs && this.findMaxFontSizeForText(perfText, node.dx, nodeHeight - nodeNameLineHeight, fontPairs)\r\n perfLineHeight = perfFontSize ? fontSizeLineHeights[perfFontSize] : 0\r\n }\r\n\r\n const textHeight = nodeNameLineHeight + perfLineHeight\r\n\r\n return {\r\n topOffset: node.dy - textHeight <= nodeTopOffset ? nodeTopOffset : 0,\r\n fontSize: nodeNameFontSize,\r\n perfText,\r\n perfFontSize,\r\n name,\r\n }\r\n }\r\n\r\n findMaxFontSizeForText(text: string, width: number, height: number, fontSizes: number[]) {\r\n if (!text.length) return\r\n\r\n return fontSizes.find(\r\n (fontSize) =>\r\n this.getLongestText(text, fontSize, Math.max(0, width - this.settings.fontSizePadding[fontSize] * 2)) ===\r\n text && fontSizeLineHeights[fontSize] < height\r\n )\r\n }\r\n\r\n getLongestText(text: string, fontSize: number, maxWidth: number) {\r\n if (maxWidth === 0) return ''\r\n const widths = fontSizesWidths[fontSize]\r\n let i = 0\r\n let width = 0\r\n\r\n while (i < text.length) {\r\n width += widths[text[i]] ?? widths['W']\r\n if (width > maxWidth) break\r\n i++\r\n }\r\n\r\n return text.substring(0, i)\r\n }\r\n\r\n getZoomLevels() {\r\n return this.zoomLevels\r\n }\r\n\r\n getNextZoomLevel() {\r\n var actualZoomLevel = this.zoom.scale()\r\n if (this.zoomLevels[this.zoomLevels.length - 1] === actualZoomLevel) {\r\n return actualZoomLevel\r\n }\r\n for (var i = 0; i < this.zoomLevels.length; i++) {\r\n if (this.zoomLevels[i] > actualZoomLevel) {\r\n return this.zoomLevels[i]\r\n }\r\n }\r\n\r\n return this.zoomLevels[0]\r\n }\r\n\r\n getPreviousZoomLevel() {\r\n var actualZoomLevel = this.zoom.scale()\r\n if (this.zoomLevels[0] === actualZoomLevel) {\r\n return actualZoomLevel\r\n }\r\n for (var i = this.zoomLevels.length; i >= 0; i--) {\r\n if (this.zoomLevels[i] < actualZoomLevel) {\r\n return this.zoomLevels[i]\r\n }\r\n }\r\n\r\n return this.zoomLevels[0]\r\n }\r\n\r\n getLastZoomLevel() {\r\n return this.zoomLevels[this.zoomLevels.length - 1]\r\n }\r\n\r\n formatValue(\r\n value: string,\r\n [min, max]: [min: number, max: number] = scaleMinMax[this.scale.id],\r\n format: string = scaleStepFormat[this.scale.id]\r\n ) {\r\n let stepFormat = format\r\n if (typeof format !== 'string') {\r\n stepFormat = format[value]\r\n }\r\n\r\n if (!stepFormat) return value\r\n\r\n const floatValue = parseFloat(value)\r\n const absValue = value.replace(/^-/, '')\r\n const isPositiveScaleOnly = Math.min(min, max) >= 0 && Math.max(min, max) >= 0\r\n let formated = stepFormat?.replace('%N', absValue) ?? absValue\r\n\r\n // Some formats might not include number (eg. Before/After earnings)\r\n if (!stepFormat || !stepFormat.includes('%N')) return formated\r\n\r\n if (floatValue > 0 && !isPositiveScaleOnly) return `+${formated}`\r\n\r\n if (floatValue < 0) return `-${formated}`\r\n\r\n return formated\r\n }\r\n\r\n renderStockNode(node: MapDataNode, context: CanvasRenderingContext2D) {\r\n // Draw background\r\n context.fillStyle = this.colorScale(node.perf)\r\n context.fillRect(node.x, node.y, node.dx - 1, node.dy - 1)\r\n\r\n const nodeText = this.getNodeText(node)\r\n\r\n if (!nodeText) return\r\n\r\n context.save()\r\n\r\n // Set text properties\r\n context.textBaseline = 'middle'\r\n context.textAlign = 'center'\r\n context.fillStyle = 'rgba(0, 0, 0, 0.5)'\r\n\r\n const nodeY = node.y + nodeText.topOffset\r\n const nodeDY = node.dy - nodeText.topOffset\r\n const textX = node.x + node.dx / 2\r\n let nameY = nodeY + nodeDY / 2\r\n let perfTextY = nameY + nodeText.fontSize / 2\r\n const zoom = this.zoom.scale()\r\n const offset = zoom > 1 ? (1 / zoom) * 1.2 : 1\r\n if (nodeText.perfFontSize) {\r\n perfTextY = nameY + nodeText.fontSize / 2\r\n nameY -= nodeText.perfFontSize / 2\r\n context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\r\n context.fillText(nodeText.perfText, textX + offset, perfTextY + offset)\r\n }\r\n\r\n context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\r\n context.fillText(nodeText.name, textX + offset, nameY + offset)\r\n\r\n context.fillStyle = 'rgba(255, 255, 255, 1)'\r\n\r\n if (nodeText.perfFontSize) {\r\n context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\r\n context.fillText(nodeText.perfText, textX, perfTextY)\r\n }\r\n\r\n context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\r\n context.fillText(nodeText.name, textX, nameY)\r\n context.restore()\r\n }\r\n\r\n getSpacingWithDefaults(spacing?: { top: number; right: number; bottom?: number; left: number }) {\r\n return {\r\n top: spacing?.top ?? 0,\r\n right: spacing?.right ?? 0,\r\n bottom: spacing?.bottom ?? 0,\r\n left: spacing?.left ?? 0,\r\n }\r\n }\r\n\r\n renderIndustryHeader({\r\n node,\r\n context,\r\n config,\r\n fill,\r\n parent,\r\n }: {\r\n node: MapDataRow\r\n context: CanvasRenderingContext2D\r\n config?: ISettingsSectionHeader\r\n parent?: ISettingsSection\r\n fill: string\r\n }) {\r\n const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\r\n const margin = this.getSpacingWithDefaults(config?.margin)\r\n const x = node.x + parrentPadding.left + margin.left\r\n const y = node.y + parrentPadding.top + margin.top\r\n const width = node.dx - parrentPadding.left - margin.left - parrentPadding.right - margin.right\r\n const height = y + (config?.height ?? 0)\r\n\r\n context.fillStyle = fill\r\n context.strokeStyle = config?.border ?? this.settings.background\r\n context.beginPath()\r\n context.moveTo(x, y)\r\n context.lineTo(x, height)\r\n\r\n context.lineTo(node.x + 6, height)\r\n context.lineTo(node.x + 11, height + 5)\r\n context.lineTo(node.x + 16, height)\r\n\r\n context.lineTo(x + width, height)\r\n context.lineTo(x + width, y)\r\n context.lineTo(x - 0.5, y)\r\n context.fill()\r\n context.stroke()\r\n }\r\n\r\n renderNodeText({\r\n node,\r\n context,\r\n config,\r\n parent,\r\n }: {\r\n node: MapDataRow\r\n context: CanvasRenderingContext2D\r\n config?: ISettingsSectionFont\r\n parent?: ISettingsSection\r\n }) {\r\n if (!config) return\r\n\r\n const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\r\n const padding = this.getSpacingWithDefaults(config?.padding)\r\n\r\n context.textBaseline = 'alphabetic'\r\n context.textAlign = 'left'\r\n context.fillStyle = config.color\r\n context.font = `${config.fontWeight} ${config.fontSize}px ${fontFamily}`\r\n\r\n const text = this.getLongestText(\r\n node.name.toUpperCase(),\r\n config.fontSize,\r\n node.dx - parrentPadding.left - padding.left - parrentPadding.right - padding.right\r\n )\r\n context.fillText(\r\n text,\r\n node.x + parrentPadding.left + padding.left,\r\n node.y + parrentPadding.top + padding.top + config.fontSize\r\n )\r\n }\r\n\r\n getNodeAtPosition(x: number, y: number): MapDataNode | undefined {\r\n var scale = this.zoom.scale()\r\n var [tx, ty] = this.zoom.translate()\r\n for (var i = 0, len = this.nodes.length; i < len; i++) {\r\n var d = this.nodes[i]\r\n if (\r\n d.x * scale + tx < x &&\r\n x < (d.x + d.dx + 1) * scale + tx &&\r\n d.y * scale + ty < y &&\r\n y < (d.y + d.dy + 1) * scale + ty &&\r\n d.parent\r\n ) {\r\n return d\r\n }\r\n }\r\n }\r\n\r\n getSectorAtPosition(x: number, y: number): MapDataSector | undefined {\r\n var scale = this.zoom.scale()\r\n var [tx, ty] = this.zoom.translate()\r\n for (var i = 0, len = this.sectors.length; i < len; i++) {\r\n var d = this.sectors[i]\r\n if (\r\n d.x * scale + tx < x &&\r\n x < (d.x + d.dx + 1) * scale + tx &&\r\n d.y * scale + ty < y &&\r\n y < (d.y + d.dy + 1) * scale + ty &&\r\n d.parent\r\n ) {\r\n return d\r\n }\r\n }\r\n }\r\n\r\n getIndustryAtPosition(x: number, y: number): MapDataIndustry | undefined {\r\n var scale = this.zoom.scale()\r\n var [tx, ty] = this.zoom.translate()\r\n for (var i = 0, len = this.industries.length; i < len; i++) {\r\n var d = this.industries[i]\r\n if (\r\n d.x * scale + tx < x &&\r\n x < (d.x + d.dx + 1) * scale + tx &&\r\n d.y * scale + ty < y &&\r\n y < (d.y + d.dy + 1) * scale + ty &&\r\n d.parent\r\n ) {\r\n return d\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Treemap\r\n","import classnames from 'classnames'\r\nimport * as d3 from 'd3'\r\nimport PropTypes from 'prop-types'\r\nimport { Component } from 'react'\r\n\r\ninterface SparklineProps {\r\n className?: string\r\n data: number[]\r\n width: number\r\n height: number\r\n}\r\n\r\nclass Sparkline extends Component {\r\n static propTypes = {\r\n width: PropTypes.number.isRequired,\r\n height: PropTypes.number.isRequired,\r\n data: PropTypes.arrayOf(PropTypes.number).isRequired,\r\n }\r\n\r\n shouldComponentUpdate(nextProps: SparklineProps) {\r\n // eslint-disable-next-line eqeqeq\r\n return nextProps.data != this.props.data\r\n }\r\n\r\n render() {\r\n var data = this.props.data\r\n var x = d3.scaleLinear().range([0, this.props.width]).domain([0, data.length])\r\n\r\n var y = d3\r\n .scaleLinear()\r\n .range([this.props.height - 4, 0])\r\n .domain(d3.extent(data, (d) => d) as [number, number])\r\n\r\n var line = d3\r\n .line()\r\n .curve(d3.curveBasis)\r\n .x((d, i) => x(i))\r\n .y((d) => y(d))\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default Sparkline\r\n","export function getTextFontFamily() {\r\n return 'Lato'\r\n}\r\n","import { ScaleId } from '../maps/types'\r\n\r\nexport interface GradientDefinition {\r\n colors: string[]\r\n nullColor: string\r\n}\r\n\r\nconst redGreenGradientSmall = {\r\n colors: [\r\n '#e01427',\r\n '#ce252b',\r\n '#bb2f30',\r\n '#aa3534',\r\n '#993938',\r\n '#853c3c',\r\n '#743d3f',\r\n '#414554',\r\n '#3e5f50',\r\n '#3f704f',\r\n '#3f814d',\r\n '#3c924a',\r\n '#36a446',\r\n '#2bb642',\r\n '#12c93b',\r\n ],\r\n nullColor: '#2f323d',\r\n}\r\nexport const redGreenGradient = {\r\n colors: [\r\n '#f63538',\r\n '#ee373a',\r\n '#e6393b',\r\n '#df3a3d',\r\n '#d73c3f',\r\n '#ce3d41',\r\n '#c73e43',\r\n '#bf4045',\r\n '#b64146',\r\n '#ae4248',\r\n '#a5424a',\r\n '#9d434b',\r\n '#94444d',\r\n '#8b444e',\r\n '#824450',\r\n '#784551',\r\n '#6f4552',\r\n '#644553',\r\n '#5a4554',\r\n '#4f4554',\r\n '#414554',\r\n '#3f4c53',\r\n '#3d5451',\r\n '#3b5a50',\r\n '#3a614f',\r\n '#38694f',\r\n '#366f4e',\r\n '#35764e',\r\n '#347d4e',\r\n '#32844e',\r\n '#31894e',\r\n '#31904e',\r\n '#30974f',\r\n '#2f9e4f',\r\n '#2fa450',\r\n '#2faa51',\r\n '#2fb152',\r\n '#2fb854',\r\n '#30be56',\r\n '#30c558',\r\n '#30cc5a',\r\n ],\r\n nullColor: '#2f323d',\r\n}\r\nconst greenRedGradient = { colors: redGreenGradient.colors.slice().reverse(), nullColor: redGreenGradient.nullColor }\r\nconst redGradient = { colors: redGreenGradient.colors.slice(0, 22).reverse(), nullColor: redGreenGradient.nullColor }\r\nconst greenGradient = { colors: redGreenGradient.colors.slice(21), nullColor: redGreenGradient.nullColor }\r\nconst blueGradient = {\r\n colors: [\r\n '#3d4251',\r\n '#3d4250',\r\n '#3d4250',\r\n '#3e4251',\r\n '#3e4251',\r\n '#3d4350',\r\n '#3d4350',\r\n '#3d4350',\r\n '#3e4351',\r\n '#3e4350',\r\n '#3d4351',\r\n '#3d4352',\r\n '#3f4353',\r\n '#3f4353',\r\n '#3f4453',\r\n '#3f4554',\r\n '#3e4354',\r\n '#3e4354',\r\n '#3f4454',\r\n '#3f4454',\r\n '#3f4454',\r\n '#3f4454',\r\n '#3f4454',\r\n '#3f4555',\r\n '#3f4556',\r\n '#3f4457',\r\n '#3f4457',\r\n '#3f4457',\r\n '#3f4557',\r\n '#3f4657',\r\n '#3f4657',\r\n '#3f4657',\r\n '#3f4557',\r\n '#3e4557',\r\n '#3e4558',\r\n '#3f465a',\r\n '#3f4659',\r\n '#3f4759',\r\n '#3f4759',\r\n '#3f475a',\r\n '#3f4759',\r\n '#3f465a',\r\n '#3f465a',\r\n '#3f4759',\r\n '#3f475b',\r\n '#40475b',\r\n '#40475b',\r\n '#40465b',\r\n '#40465c',\r\n '#40465d',\r\n '#40485d',\r\n '#40485c',\r\n '#40475c',\r\n '#40465c',\r\n '#40465c',\r\n '#40465c',\r\n '#40485d',\r\n '#40485d',\r\n '#40485e',\r\n '#40485f',\r\n '#40495e',\r\n '#40495e',\r\n '#40485e',\r\n '#40485f',\r\n '#40495e',\r\n '#40485e',\r\n '#40485f',\r\n '#404960',\r\n '#404960',\r\n '#404860',\r\n '#404861',\r\n '#404a62',\r\n '#404962',\r\n '#404962',\r\n '#404a62',\r\n '#404a62',\r\n '#404861',\r\n '#404961',\r\n '#404a63',\r\n '#404a64',\r\n '#404a65',\r\n '#404b64',\r\n '#404b64',\r\n '#404a65',\r\n '#404a65',\r\n '#404a65',\r\n '#404a65',\r\n '#404b65',\r\n '#404b65',\r\n '#414c65',\r\n '#424c65',\r\n '#424b65',\r\n '#414b66',\r\n '#414b67',\r\n '#414b67',\r\n '#414c67',\r\n '#424b67',\r\n '#424c67',\r\n '#414c67',\r\n '#414b67',\r\n '#414c67',\r\n '#414c67',\r\n '#414c69',\r\n '#414c6a',\r\n '#414c6a',\r\n '#414c6a',\r\n '#414d6a',\r\n '#424e6a',\r\n '#414d6a',\r\n '#414d6a',\r\n '#414d6a',\r\n '#414d6a',\r\n '#414d6a',\r\n '#414d6b',\r\n '#414d6c',\r\n '#414e6c',\r\n '#414f6c',\r\n '#414e6c',\r\n '#414d6c',\r\n '#414d6c',\r\n '#414e6c',\r\n '#424e6d',\r\n '#424e6d',\r\n '#414f6d',\r\n '#424f6f',\r\n '#414e6f',\r\n '#414e6f',\r\n '#424f70',\r\n '#414f6f',\r\n '#414f6f',\r\n '#414f6f',\r\n '#414e6f',\r\n '#414e6f',\r\n '#414f6f',\r\n '#414f6f',\r\n '#414f71',\r\n '#414f72',\r\n '#425073',\r\n '#425173',\r\n '#415072',\r\n '#425173',\r\n '#425173',\r\n '#425173',\r\n '#415072',\r\n '#415072',\r\n '#415172',\r\n '#415173',\r\n '#415174',\r\n '#415174',\r\n '#415074',\r\n '#415074',\r\n '#415174',\r\n '#415074',\r\n '#415074',\r\n '#415074',\r\n '#415175',\r\n '#415275',\r\n '#425276',\r\n '#425277',\r\n '#415177',\r\n '#415177',\r\n '#425278',\r\n '#425378',\r\n '#415277',\r\n '#415378',\r\n '#415378',\r\n '#415277',\r\n '#415378',\r\n '#42537a',\r\n '#42537c',\r\n '#42537b',\r\n '#41537a',\r\n '#41527a',\r\n '#41537a',\r\n '#41547a',\r\n '#42547b',\r\n '#41547a',\r\n '#41547a',\r\n '#41547c',\r\n '#41547c',\r\n '#41557c',\r\n '#41557c',\r\n '#41557c',\r\n '#41557c',\r\n '#41557d',\r\n '#41547d',\r\n '#41547c',\r\n '#42557d',\r\n '#41557d',\r\n '#41557d',\r\n '#41557f',\r\n '#415580',\r\n '#41567f',\r\n '#41567f',\r\n '#415580',\r\n '#41567f',\r\n '#415580',\r\n '#415580',\r\n '#41557f',\r\n '#415680',\r\n '#415680',\r\n '#415680',\r\n '#415681',\r\n '#415681',\r\n '#415781',\r\n '#415781',\r\n '#415681',\r\n '#415781',\r\n '#415781',\r\n '#415781',\r\n '#415782',\r\n '#415784',\r\n '#415784',\r\n '#425885',\r\n '#425885',\r\n '#415784',\r\n '#415784',\r\n '#415784',\r\n '#415784',\r\n '#425885',\r\n '#425885',\r\n '#415885',\r\n '#415885',\r\n '#425987',\r\n '#415887',\r\n '#415887',\r\n '#415987',\r\n '#415887',\r\n '#425988',\r\n '#425988',\r\n '#415887',\r\n '#415987',\r\n '#415988',\r\n '#415988',\r\n '#415988',\r\n '#415989',\r\n '#415989',\r\n '#415989',\r\n '#415989',\r\n '#415989',\r\n '#415989',\r\n '#41598a',\r\n '#405a8b',\r\n '#405a8c',\r\n '#405b8c',\r\n '#405b8c',\r\n '#405b8c',\r\n '#405a8c',\r\n '#405a8c',\r\n '#405a8c',\r\n '#405a8c',\r\n '#405b8c',\r\n '#415c8d',\r\n '#415c8e',\r\n '#405b8e',\r\n '#415c90',\r\n '#405b8f',\r\n '#405c8f',\r\n '#415d90',\r\n '#405b8f',\r\n '#405c8f',\r\n '#405c8f',\r\n '#405b8f',\r\n '#405c8f',\r\n '#405c90',\r\n '#405c91',\r\n '#405c91',\r\n '#405c91',\r\n '#405d91',\r\n '#405e91',\r\n '#405d91',\r\n '#415e91',\r\n '#405e91',\r\n '#415e91',\r\n '#415e92',\r\n '#3f5d94',\r\n '#3f5d93',\r\n '#3f5d93',\r\n '#3f5e94',\r\n '#405e94',\r\n '#3f5d94',\r\n '#3f5d94',\r\n '#3f5d94',\r\n '#3f5e94',\r\n '#3f5e95',\r\n '#3f5e96',\r\n '#3f5e96',\r\n '#3f5e96',\r\n '#405f97',\r\n '#405f97',\r\n '#3f5e96',\r\n '#3f5e97',\r\n '#3f5f97',\r\n '#3f6097',\r\n '#3f5f97',\r\n '#3f6097',\r\n '#3f5f98',\r\n '#3f5f99',\r\n '#3e5f99',\r\n '#3e6199',\r\n '#3e6099',\r\n '#3e5f99',\r\n '#3e5f99',\r\n '#3e5f98',\r\n '#3e6099',\r\n '#3d609a',\r\n '#3d6099',\r\n '#3e609b',\r\n '#3e619c',\r\n '#3e619c',\r\n '#3e619c',\r\n '#3e609b',\r\n '#3e609c',\r\n '#3e609c',\r\n '#3e619b',\r\n '#3e629c',\r\n '#3e629c',\r\n '#3e619c',\r\n '#3d619d',\r\n '#3d639f',\r\n '#3d629f',\r\n '#3d629f',\r\n '#3d639f',\r\n '#3d629f',\r\n '#3c619e',\r\n '#3c619e',\r\n '#3d629f',\r\n '#3d62a0',\r\n '#3d63a0',\r\n '#3d63a0',\r\n '#3d62a0',\r\n '#3d63a1',\r\n '#3d62a0',\r\n '#3d63a0',\r\n '#3d64a1',\r\n '#3d63a0',\r\n '#3c63a0',\r\n '#3b63a2',\r\n '#3c64a3',\r\n '#3c65a3',\r\n '#3b63a3',\r\n '#3b63a3',\r\n '#3b63a3',\r\n '#3b63a3',\r\n '#3c63a3',\r\n '#3c65a3',\r\n '#3c65a3',\r\n '#3b64a4',\r\n '#3a65a5',\r\n '#3b66a6',\r\n '#3c65a6',\r\n '#3a65a5',\r\n '#3a64a5',\r\n '#3a64a5',\r\n '#3b65a5',\r\n '#3a65a5',\r\n '#3a66a6',\r\n '#3b66a6',\r\n '#3b66a6',\r\n '#3a66a8',\r\n '#3a67a8',\r\n '#3b67a8',\r\n '#3b66a8',\r\n '#3b66a8',\r\n '#3b66a8',\r\n '#3b67a8',\r\n '#3a66a8',\r\n '#3966a9',\r\n '#3967a9',\r\n '#3a67aa',\r\n '#3a67ab',\r\n '#3967ab',\r\n '#3a68ab',\r\n '#3a68ab',\r\n '#3968ab',\r\n '#3966aa',\r\n '#3966aa',\r\n '#3968ab',\r\n '#3968ab',\r\n '#3867ac',\r\n '#3867ac',\r\n '#3868ac',\r\n '#3869ad',\r\n '#3969ad',\r\n '#3968ad',\r\n '#3868ac',\r\n '#3868ac',\r\n '#3869ae',\r\n '#3868ad',\r\n '#3868ad',\r\n '#3769af',\r\n '#3869b0',\r\n '#3769af',\r\n '#3769af',\r\n '#386ab0',\r\n '#386ab0',\r\n '#376aaf',\r\n '#376aaf',\r\n '#376ab0',\r\n '#366ab1',\r\n '#366ab2',\r\n '#366ab2',\r\n '#366ab2',\r\n '#366ab3',\r\n '#366bb3',\r\n '#366ab2',\r\n '#3669b2',\r\n '#366ab2',\r\n '#366ab2',\r\n '#366ab2',\r\n '#356bb3',\r\n '#346bb4',\r\n '#356cb4',\r\n '#356cb4',\r\n '#346bb4',\r\n '#356cb4',\r\n '#356cb5',\r\n '#356cb5',\r\n '#356cb5',\r\n '#346cb5',\r\n '#346cb5',\r\n '#346cb6',\r\n '#336db7',\r\n '#326cb7',\r\n '#326db7',\r\n '#336db7',\r\n '#336cb7',\r\n '#326bb6',\r\n '#326cb6',\r\n '#326db7',\r\n '#326db8',\r\n '#316dba',\r\n '#316eb9',\r\n '#316eb9',\r\n '#326eba',\r\n '#316eba',\r\n '#316db9',\r\n '#316db9',\r\n '#316eb9',\r\n '#306eba',\r\n '#306dba',\r\n '#306dba',\r\n '#306ebb',\r\n '#306dbb',\r\n '#306dbc',\r\n '#306fbc',\r\n '#306fbc',\r\n '#306ebb',\r\n '#306eba',\r\n '#306fbc',\r\n '#2f6fbd',\r\n '#2d6ebe',\r\n '#2d6ebe',\r\n '#2d6fbe',\r\n '#2e70be',\r\n '#2e70be',\r\n '#2e6fbe',\r\n '#2e6fbe',\r\n '#2e6fbe',\r\n '#2c6fc0',\r\n '#2d70c0',\r\n '#2d70c0',\r\n '#2b70c1',\r\n '#2b70c1',\r\n '#2c70c1',\r\n '#2c70c1',\r\n '#2b71c1',\r\n '#2c70c1',\r\n '#2c70c1',\r\n '#2c71c1',\r\n '#2c71c1',\r\n '#2a72c3',\r\n '#2971c3',\r\n '#2a71c2',\r\n '#2972c3',\r\n '#2a71c3',\r\n '#2a71c3',\r\n '#2972c3',\r\n '#2972c3',\r\n '#2972c3',\r\n '#2872c5',\r\n '#2872c6',\r\n '#2872c5',\r\n '#2773c6',\r\n '#2773c6',\r\n '#2772c6',\r\n '#2772c5',\r\n '#2672c5',\r\n '#2673c5',\r\n '#2673c5',\r\n '#2673c7',\r\n '#2472c8',\r\n '#2473c8',\r\n '#2474c8',\r\n '#2573c9',\r\n '#2573c9',\r\n '#2573c9',\r\n '#2573c9',\r\n '#2474c8',\r\n '#2374c9',\r\n '#2374c9',\r\n '#2374c9',\r\n '#2375c9',\r\n '#2374c9',\r\n '#2374c9',\r\n '#2475c9',\r\n '#2575ca',\r\n '#2476ca',\r\n '#2476ca',\r\n '#2476ca',\r\n '#2575cb',\r\n '#2577ca',\r\n '#2577ca',\r\n '#2576ca',\r\n '#2577ca',\r\n '#2577ca',\r\n '#2577ca',\r\n '#2677ca',\r\n '#2678ca',\r\n '#2678cb',\r\n '#2778cb',\r\n '#2778cb',\r\n '#2679cb',\r\n '#2779cb',\r\n '#2779cb',\r\n '#2779cb',\r\n '#2779cb',\r\n '#2879cb',\r\n '#287acb',\r\n '#287acb',\r\n '#2879cb',\r\n '#287acb',\r\n '#287bcb',\r\n '#287acb',\r\n '#287acb',\r\n '#287bcc',\r\n '#287bcc',\r\n '#297bcc',\r\n '#297bcc',\r\n '#297bcc',\r\n '#297bcc',\r\n '#297ccc',\r\n '#297ccc',\r\n '#297dcc',\r\n '#297dcc',\r\n '#2a7dcc',\r\n '#2a7dcc',\r\n '#2a7ecd',\r\n '#2a7ecd',\r\n '#2a7ecc',\r\n '#2a7ecc',\r\n '#2b7ecd',\r\n '#2c7ecd',\r\n '#2c7fcd',\r\n '#2c7fcd',\r\n '#2b7ecc',\r\n '#2b7ecc',\r\n '#2c7fcd',\r\n '#2c7fcd',\r\n '#2c7fcd',\r\n '#2c7fcd',\r\n '#2b7fcd',\r\n '#2b80cd',\r\n '#2c80ce',\r\n '#2d80ce',\r\n '#2d80ce',\r\n '#2c81cd',\r\n '#2d82ce',\r\n '#2d82ce',\r\n '#2d81ce',\r\n '#2d82ce',\r\n '#2d82ce',\r\n '#2d82cd',\r\n '#2e82cd',\r\n '#2e83ce',\r\n '#2e82ce',\r\n '#2d82cd',\r\n '#2d83cd',\r\n '#2e83cf',\r\n '#2e84cf',\r\n '#2e84cf',\r\n '#2e83ce',\r\n '#2e83ce',\r\n '#3084cf',\r\n '#3085cf',\r\n '#2f85ce',\r\n '#3085cf',\r\n '#2f86ce',\r\n '#2f86ce',\r\n '#2f86cf',\r\n '#2f85cf',\r\n '#2f86ce',\r\n '#2f86cf',\r\n '#2f86cf',\r\n '#2f87cf',\r\n '#2f86d0',\r\n '#2f86d0',\r\n '#2f86d0',\r\n '#3087cf',\r\n '#3088d0',\r\n '#3088d0',\r\n '#3087cf',\r\n '#3088cf',\r\n '#3188d0',\r\n '#3188d1',\r\n '#3088d0',\r\n '#3089d0',\r\n '#3089d0',\r\n '#3088d0',\r\n '#3188d0',\r\n '#3189d0',\r\n '#3289d0',\r\n '#3289d0',\r\n '#328ad1',\r\n '#328ad1',\r\n '#318ad0',\r\n '#318ad0',\r\n '#318ad0',\r\n '#328bd1',\r\n '#328ad1',\r\n '#328ad1',\r\n '#338bd2',\r\n '#338bd2',\r\n '#338cd1',\r\n '#338cd1',\r\n '#338cd2',\r\n '#338cd2',\r\n '#338dd1',\r\n '#338dd1',\r\n '#338dd2',\r\n '#338dd1',\r\n '#338ed2',\r\n '#338ed2',\r\n '#338ed2',\r\n '#348ed2',\r\n '#348ed2',\r\n '#348ed2',\r\n '#348fd2',\r\n '#348fd2',\r\n '#348fd2',\r\n '#348fd2',\r\n '#348fd2',\r\n '#348fd2',\r\n '#3390d2',\r\n '#3391d2',\r\n '#3491d3',\r\n '#3490d3',\r\n '#3491d3',\r\n '#3491d3',\r\n '#3591d3',\r\n '#3591d3',\r\n '#3691d4',\r\n '#3690d4',\r\n '#3590d3',\r\n '#3592d3',\r\n '#3592d4',\r\n '#3592d4',\r\n '#3592d3',\r\n '#3593d3',\r\n '#3592d4',\r\n '#3592d4',\r\n '#3592d4',\r\n '#3593d4',\r\n '#3694d4',\r\n '#3695d4',\r\n '#3694d4',\r\n '#3693d4',\r\n '#3693d4',\r\n '#3695d4',\r\n '#3695d4',\r\n '#3695d4',\r\n '#3796d4',\r\n '#3796d4',\r\n '#3695d4',\r\n '#3695d5',\r\n '#3696d5',\r\n '#3696d5',\r\n '#3696d5',\r\n '#3695d4',\r\n '#3696d4',\r\n '#3797d5',\r\n '#3796d5',\r\n '#3797d5',\r\n '#3898d5',\r\n '#3898d5',\r\n '#3797d5',\r\n '#3798d5',\r\n '#3899d5',\r\n '#3899d5',\r\n '#3899d6',\r\n '#3799d6',\r\n '#3799d6',\r\n '#3799d6',\r\n '#389ad6',\r\n '#389ad6',\r\n '#3799d5',\r\n '#3799d5',\r\n '#3799d6',\r\n '#379ad6',\r\n '#379ad6',\r\n '#399ad6',\r\n '#399ad6',\r\n '#389bd5',\r\n '#389bd5',\r\n '#389bd6',\r\n '#389bd6',\r\n '#399cd7',\r\n '#399bd7',\r\n '#399cd7',\r\n '#399dd7',\r\n '#389cd7',\r\n '#389cd6',\r\n '#389dd6',\r\n '#399ed7',\r\n '#389dd6',\r\n '#389dd6',\r\n '#389fd6',\r\n '#399fd7',\r\n '#399ed6',\r\n '#399ed6',\r\n '#399fd7',\r\n '#399fd7',\r\n '#399fd7',\r\n '#3aa0d8',\r\n '#3aa0d8',\r\n '#3a9fd8',\r\n '#3a9fd8',\r\n '#3a9fd8',\r\n '#3aa0d8',\r\n '#3aa1d8',\r\n '#3aa1d8',\r\n '#3aa1d8',\r\n '#3aa1d8',\r\n '#3aa1d8',\r\n '#3aa2d9',\r\n '#3aa1d9',\r\n '#3aa1d8',\r\n '#39a2d8',\r\n '#3aa2d9',\r\n '#3aa3d9',\r\n '#3ba3d9',\r\n '#3ba3d9',\r\n '#3ba2d8',\r\n '#3aa2d8',\r\n '#3aa4d8',\r\n '#3ba4d9',\r\n '#3aa3d8',\r\n '#3aa3d9',\r\n '#3ba5da',\r\n '#3ba5d9',\r\n '#3ba4d9',\r\n '#3ba4d9',\r\n '#3ba4d9',\r\n '#3aa5d9',\r\n '#3ba5da',\r\n '#3ba6da',\r\n '#3ba6da',\r\n '#3ba6da',\r\n '#3ba6d9',\r\n '#3ba6d9',\r\n '#3ba6da',\r\n '#3aa5da',\r\n '#3ba6da',\r\n '#3ca7da',\r\n '#3ca7da',\r\n '#3ba7da',\r\n '#3ba6da',\r\n '#3ca7da',\r\n '#3ca8da',\r\n '#3ca8da',\r\n '#3ca8da',\r\n '#3ca9db',\r\n '#3ca9db',\r\n '#3ca9da',\r\n '#3ca8db',\r\n '#3ba8db',\r\n '#3baadb',\r\n '#3caadb',\r\n '#3ca9db',\r\n '#3caadb',\r\n '#3caadb',\r\n '#3ca9db',\r\n '#3ca9db',\r\n '#3ca9db',\r\n '#3cabdb',\r\n '#3cabdc',\r\n '#3caadb',\r\n '#3cabdb',\r\n '#3cacdc',\r\n '#3cacdc',\r\n '#3cacdc',\r\n '#3caddc',\r\n '#3caddc',\r\n '#3caddc',\r\n '#3caedc',\r\n '#3caddd',\r\n '#3caddd',\r\n '#3caedc',\r\n '#3eaedd',\r\n '#3eaddd',\r\n '#3daddc',\r\n '#3daedc',\r\n '#3daedc',\r\n '#3dafdd',\r\n '#3dafdd',\r\n '#3daedd',\r\n '#3dafdd',\r\n '#3dafdd',\r\n '#3dafdd',\r\n '#3db0dd',\r\n '#3db0dd',\r\n '#3db0dc',\r\n '#3db0dc',\r\n '#3db1dd',\r\n '#3db1dd',\r\n '#3db0dd',\r\n '#3db0dd',\r\n '#3db1dd',\r\n '#3db1de',\r\n '#3db1de',\r\n '#3db1de',\r\n '#3db2de',\r\n '#3db2de',\r\n '#3db2dd',\r\n '#3db2dd',\r\n '#3db3dd',\r\n '#3db2de',\r\n '#3db3de',\r\n '#3db4de',\r\n '#3db3dd',\r\n '#3db4de',\r\n '#3db4de',\r\n '#3db4de',\r\n '#3db5df',\r\n '#3db5df',\r\n '#3db4df',\r\n '#3db4df',\r\n '#3db5df',\r\n '#3db5de',\r\n '#3db5de',\r\n '#3db5de',\r\n '#3db6df',\r\n '#3db6df',\r\n '#3db6de',\r\n '#3db6de',\r\n '#3db7df',\r\n '#3db7e0',\r\n '#3db8e0',\r\n '#3db8e0',\r\n '#3db7e0',\r\n '#3db7df',\r\n '#3db7df',\r\n '#3eb7df',\r\n '#3eb8df',\r\n '#3eb8df',\r\n '#3eb9e0',\r\n '#3eb9e0',\r\n '#3eb8df',\r\n '#3eb9df',\r\n '#3fb9df',\r\n '#3fb9e0',\r\n '#3ebae1',\r\n '#3ebae0',\r\n '#3ebae0',\r\n '#3ebae0',\r\n '#3eb9e0',\r\n '#3fbae1',\r\n '#3fbbe1',\r\n '#3ebae0',\r\n '#3ebbe1',\r\n '#3ebae0',\r\n '#3ebbe0',\r\n '#3ebce1',\r\n '#3fbce1',\r\n '#3ebce0',\r\n '#3ebce2',\r\n '#3ebce2',\r\n '#3ebde2',\r\n '#3fbde2',\r\n '#3fbde2',\r\n '#3ebde1',\r\n '#3ebee1',\r\n '#3ebde2',\r\n '#3fbde2',\r\n '#3fbde2',\r\n '#3ebee1',\r\n '#3ebfe1',\r\n '#3ebfe1',\r\n '#3ebfe1',\r\n '#3fbfe2',\r\n '#3ebfe1',\r\n '#3ebee1',\r\n '#3ebee2',\r\n '#3ebfe2',\r\n '#3ebfe2',\r\n '#3ebfe2',\r\n '#3ec0e2',\r\n '#3ec1e2',\r\n '#3fc0e3',\r\n '#3fc0e3',\r\n '#3ec0e2',\r\n '#3ec1e2',\r\n '#3ec2e2',\r\n '#3ec2e2',\r\n '#3ec2e2',\r\n '#3ec3e3',\r\n '#3ec3e3',\r\n '#3ec3e3',\r\n '#3ec2e3',\r\n '#3ec2e3',\r\n '#3fc3e3',\r\n '#3fc4e3',\r\n '#3ec4e3',\r\n '#3ec3e3',\r\n '#3ec3e3',\r\n '#3ec5e4',\r\n '#3fc5e4',\r\n '#3fc5e3',\r\n '#3fc4e4',\r\n '#3fc5e4',\r\n '#3ec6e4',\r\n '#3ec5e4',\r\n '#3ec4e4',\r\n '#3ec5e4',\r\n '#3ec6e4',\r\n '#3ec6e4',\r\n '#3ec6e4',\r\n '#3ec6e4',\r\n '#3ec6e4',\r\n '#3ec7e4',\r\n '#3ec6e4',\r\n '#3ec6e4',\r\n '#3ec6e4',\r\n '#3ec7e4',\r\n '#3dc8e4',\r\n '#3dc8e4',\r\n '#3dc7e5',\r\n '#3dc7e5',\r\n '#3dc8e5',\r\n '#3dc8e4',\r\n '#3dc8e4',\r\n '#3dc9e5',\r\n '#3dc9e5',\r\n '#3dc9e5',\r\n '#3dc9e5',\r\n '#3dc9e5',\r\n '#3dc9e4',\r\n '#3dc9e5',\r\n '#3dcae6',\r\n '#3dcbe6',\r\n '#3dcae6',\r\n '#3dcae6',\r\n '#3dcae6',\r\n '#3dcbe6',\r\n '#3dcce6',\r\n '#3ecce6',\r\n '#3ecce6',\r\n '#3dcbe6',\r\n '#3dcce6',\r\n '#3dcce6',\r\n '#3dcce6',\r\n '#3dcce5',\r\n '#3dcce5',\r\n '#3dcce6',\r\n '#3dcde7',\r\n '#3dcde7',\r\n '#3dcde7',\r\n '#3dcfe7',\r\n '#3dcfe7',\r\n '#3dcfe7',\r\n '#3dcee7',\r\n '#3dcee6',\r\n '#3dcee6',\r\n '#3dcfe7',\r\n '#3dcfe7',\r\n '#3dcfe6',\r\n '#3dcfe6',\r\n '#3dd0e8',\r\n '#3ed1e8',\r\n '#3ed1e7',\r\n '#3dd0e7',\r\n '#3dd0e8',\r\n '#3dd0e7',\r\n '#3dd1e7',\r\n '#3dd1e7',\r\n '#3dd0e7',\r\n '#3cd1e8',\r\n '#3cd2e8',\r\n '#3cd1e8',\r\n '#3cd1e7',\r\n '#3cd1e7',\r\n '#3cd2e8',\r\n '#3cd3e9',\r\n '#3cd2e8',\r\n '#3cd2e9',\r\n '#3cd2e9',\r\n '#3cd3e8',\r\n '#3cd4e8',\r\n '#3cd3e8',\r\n '#3cd3e8',\r\n ],\r\n nullColor: '#2f323d',\r\n}\r\nconst earningsGradient = {\r\n colors: [\r\n '#592d48',\r\n '#592d49',\r\n '#5b2d49',\r\n '#5b2d49',\r\n '#5b2d49',\r\n '#5b2e49',\r\n '#5b2e49',\r\n '#5b2e4a',\r\n '#5c2e4a',\r\n '#5d2f4b',\r\n '#5c2f4b',\r\n '#5c2e4b',\r\n '#5f2f4c',\r\n '#5f2f4c',\r\n '#5e2e4c',\r\n '#5e2e4c',\r\n '#60304d',\r\n '#60304d',\r\n '#5f2f4d',\r\n '#5f2f4d',\r\n '#62304f',\r\n '#62304f',\r\n '#61304f',\r\n '#62314f',\r\n '#62314f',\r\n '#633150',\r\n '#633150',\r\n '#63314f',\r\n '#63304f',\r\n '#643150',\r\n '#643151',\r\n '#643151',\r\n '#653152',\r\n '#653051',\r\n '#653051',\r\n '#663152',\r\n '#673253',\r\n '#673253',\r\n '#673253',\r\n '#673253',\r\n '#683254',\r\n '#683254',\r\n '#683254',\r\n '#693254',\r\n '#693354',\r\n '#6a3354',\r\n '#6a3354',\r\n '#6a3355',\r\n '#6a3356',\r\n '#6a3456',\r\n '#6c3456',\r\n '#6c3356',\r\n '#6c3457',\r\n '#6c3457',\r\n '#6c3457',\r\n '#6c3457',\r\n '#6d3458',\r\n '#6e3559',\r\n '#6f3559',\r\n '#6f3459',\r\n '#6f345a',\r\n '#70355b',\r\n '#70365b',\r\n '#6f355a',\r\n '#70365b',\r\n '#71355a',\r\n '#71355a',\r\n '#71365b',\r\n '#72355b',\r\n '#72365c',\r\n '#72365d',\r\n '#72355c',\r\n '#73355c',\r\n '#73355d',\r\n '#73375d',\r\n '#73375d',\r\n '#76375e',\r\n '#76375f',\r\n '#76375f',\r\n '#76375f',\r\n '#76365e',\r\n '#76365e',\r\n '#76375f',\r\n '#763860',\r\n '#773861',\r\n '#783860',\r\n '#783860',\r\n '#783861',\r\n '#793861',\r\n '#793862',\r\n '#793762',\r\n '#793761',\r\n '#7b3962',\r\n '#7b3962',\r\n '#7a3962',\r\n '#7a3962',\r\n '#7b3963',\r\n '#7c3964',\r\n '#7d3a64',\r\n '#7d3b64',\r\n '#7d3a65',\r\n '#7d3a65',\r\n '#7d3a65',\r\n '#7e3b65',\r\n '#803b66',\r\n '#7f3a66',\r\n '#7e3a66',\r\n '#7f3a67',\r\n '#7f3b67',\r\n '#803c67',\r\n '#803c67',\r\n '#7f3b67',\r\n '#813c68',\r\n '#823b69',\r\n '#823b69',\r\n '#813b69',\r\n '#823c69',\r\n '#823c69',\r\n '#823c69',\r\n '#823c69',\r\n '#843d6a',\r\n '#843d6a',\r\n '#843d6a',\r\n '#843c6b',\r\n '#863c6c',\r\n '#853c6c',\r\n '#853d6c',\r\n '#863e6c',\r\n '#863d6c',\r\n '#873d6c',\r\n '#873d6c',\r\n '#873d6d',\r\n '#893e6e',\r\n '#8a3e6f',\r\n '#8a3e6f',\r\n '#893e6e',\r\n '#893d6e',\r\n '#893e6e',\r\n '#8a3f6f',\r\n '#8b3f70',\r\n '#8b3f71',\r\n '#8b3e70',\r\n '#8b3e70',\r\n '#8c3f70',\r\n '#8c4071',\r\n '#8c4070',\r\n '#8c4070',\r\n '#8d4071',\r\n '#8d4072',\r\n '#8d4072',\r\n '#8f4073',\r\n '#8f4074',\r\n '#8f4073',\r\n '#8f4173',\r\n '#8f4173',\r\n '#904173',\r\n '#904174',\r\n '#904175',\r\n '#904175',\r\n '#914175',\r\n '#924175',\r\n '#924275',\r\n '#924275',\r\n '#914175',\r\n '#924277',\r\n '#934277',\r\n '#934277',\r\n '#944278',\r\n '#954277',\r\n '#954278',\r\n '#954278',\r\n '#954278',\r\n '#954378',\r\n '#964378',\r\n '#964379',\r\n '#96447a',\r\n '#96437a',\r\n '#96437a',\r\n '#98437a',\r\n '#98447b',\r\n '#98457b',\r\n '#98457b',\r\n '#98457b',\r\n '#99447b',\r\n '#9a457d',\r\n '#9b457d',\r\n '#9b457d',\r\n '#9a447c',\r\n '#9a457c',\r\n '#9b457c',\r\n '#9b457e',\r\n '#9b467e',\r\n '#9c467e',\r\n '#9d467f',\r\n '#9e467f',\r\n '#9d467f',\r\n '#9e467e',\r\n '#9e477f',\r\n '#9e4780',\r\n '#9e477f',\r\n '#9f4680',\r\n '#a04680',\r\n '#a04880',\r\n '#a04881',\r\n '#a04881',\r\n '#a04881',\r\n '#a24883',\r\n '#a24883',\r\n '#a24882',\r\n '#a24883',\r\n '#a24883',\r\n '#a24883',\r\n '#a24883',\r\n '#a34983',\r\n '#a34983',\r\n '#a34984',\r\n '#a44985',\r\n '#a54986',\r\n '#a54986',\r\n '#a54986',\r\n '#a54a85',\r\n '#a54a85',\r\n '#a54a85',\r\n '#a64a86',\r\n '#a74a87',\r\n '#a84a88',\r\n '#a84a88',\r\n '#a74a87',\r\n '#a84b87',\r\n '#a84b88',\r\n '#a84b88',\r\n '#a84b88',\r\n '#a94b89',\r\n '#aa4b89',\r\n '#ab4b89',\r\n '#ab4b89',\r\n '#ab4c8a',\r\n '#aa4c8a',\r\n '#aa4c8a',\r\n '#ab4c8a',\r\n '#ad4c8b',\r\n '#ad4c8b',\r\n '#ad4c8b',\r\n '#ad4c8c',\r\n '#ae4d8d',\r\n '#ae4c8c',\r\n '#ae4d8d',\r\n '#af4e8e',\r\n '#af4e8d',\r\n '#b04e8d',\r\n '#b04e8d',\r\n '#b04d8e',\r\n '#b04e8e',\r\n '#b04d8e',\r\n '#b04e8e',\r\n '#b14f8f',\r\n '#b14e90',\r\n '#b14e90',\r\n '#b14f90',\r\n '#b25090',\r\n '#b34f90',\r\n '#b34f90',\r\n '#b34f90',\r\n '#b35091',\r\n '#b44f91',\r\n '#b55092',\r\n '#b55092',\r\n '#b55092',\r\n '#b55192',\r\n '#b55092',\r\n '#b55092',\r\n '#b55093',\r\n '#b65094',\r\n '#b75194',\r\n '#b85193',\r\n '#b75093',\r\n '#b85095',\r\n '#b85095',\r\n '#b85295',\r\n '#b85295',\r\n '#ba5296',\r\n '#b95197',\r\n '#b95197',\r\n '#ba5297',\r\n '#ba5297',\r\n '#ba5296',\r\n '#ba5296',\r\n '#bb5397',\r\n '#bc5297',\r\n '#bd5298',\r\n '#bd5499',\r\n '#bc5499',\r\n '#bc5499',\r\n '#bc5499',\r\n '#bd5499',\r\n '#be549a',\r\n '#bf549b',\r\n '#bf549b',\r\n '#bf549b',\r\n '#bf549b',\r\n '#c0559b',\r\n '#c0559b',\r\n '#c0559b',\r\n '#c0559b',\r\n '#c0549c',\r\n '#c0549c',\r\n '#c2569c',\r\n '#c2569d',\r\n '#c2569e',\r\n '#c2569e',\r\n '#c4569e',\r\n '#c4569e',\r\n '#c4569f',\r\n '#c3579e',\r\n '#c3579e',\r\n '#c5579e',\r\n '#c658a0',\r\n '#c5579f',\r\n '#c4579f',\r\n '#c557a0',\r\n '#c757a0',\r\n '#c657a0',\r\n '#c658a1',\r\n '#c759a2',\r\n '#c758a2',\r\n '#c758a2',\r\n '#c858a2',\r\n '#c959a3',\r\n '#ca59a3',\r\n '#c958a2',\r\n '#c958a2',\r\n '#c959a3',\r\n '#ca59a4',\r\n '#cb59a4',\r\n '#cb59a4',\r\n '#cb59a4',\r\n '#cb5aa5',\r\n '#cc5ba5',\r\n '#cc5ba5',\r\n '#cc5aa5',\r\n '#cd5ba6',\r\n '#cd5ba6',\r\n '#cd5ba6',\r\n '#ce5ba7',\r\n '#ce5ca7',\r\n '#cf5ca7',\r\n '#cf5ca7',\r\n '#cf5ca7',\r\n '#d05ca8',\r\n '#d05ba9',\r\n '#d05ba9',\r\n '#d05ba9',\r\n '#d15ca9',\r\n '#d15da9',\r\n '#d15da9',\r\n '#d15ca9',\r\n '#d25caa',\r\n '#d25dab',\r\n '#d25eab',\r\n '#d25eab',\r\n '#d35eab',\r\n '#d35dab',\r\n '#d35dab',\r\n '#d45eac',\r\n '#d45dac',\r\n '#d55ead',\r\n '#d55ead',\r\n '#d55dad',\r\n '#d65eac',\r\n '#d65fad',\r\n '#d65fae',\r\n '#d65fae',\r\n '#d75fae',\r\n '#d75fae',\r\n '#d75fae',\r\n '#d75fae',\r\n '#d75faf',\r\n '#d760b0',\r\n '#d960b0',\r\n '#d95fb0',\r\n '#d961b0',\r\n '#d961b1',\r\n '#d961b1',\r\n '#da61b0',\r\n '#dc61b2',\r\n '#dc60b2',\r\n '#db60b2',\r\n '#db61b2',\r\n '#dc61b2',\r\n '#dd61b3',\r\n '#dd61b3',\r\n '#dd62b3',\r\n '#de62b3',\r\n '#de63b4',\r\n '#de63b5',\r\n '#dd62b4',\r\n '#de62b4',\r\n '#df63b5',\r\n '#e063b5',\r\n '#e063b5',\r\n '#e063b6',\r\n '#e164b6',\r\n '#e164b6',\r\n '#e164b6',\r\n '#e164b7',\r\n '#e264b7',\r\n '#e264b7',\r\n '#e264b7',\r\n '#e264b8',\r\n '#e265b8',\r\n '#e265b8',\r\n '#e365b8',\r\n '#e364b8',\r\n '#e465b9',\r\n '#e565ba',\r\n '#e565ba',\r\n '#e566b9',\r\n '#e566ba',\r\n '#e566bb',\r\n '#e666ba',\r\n '#e766bb',\r\n '#e665bb',\r\n '#e665bb',\r\n '#e666bb',\r\n '#e867bc',\r\n '#e867bc',\r\n '#e867bc',\r\n '#e867bc',\r\n '#e968bd',\r\n '#e967be',\r\n '#e968be',\r\n '#e969bd',\r\n '#ea68bf',\r\n '#ea69bf',\r\n '#ea69bf',\r\n '#eb69c0',\r\n '#eb69c0',\r\n '#eb6ac0',\r\n '#eb6ac0',\r\n '#ec6ac1',\r\n '#ed6ac2',\r\n '#ec6bc2',\r\n '#ec6bc2',\r\n '#ed6bc2',\r\n '#ed6bc3',\r\n '#ed6bc3',\r\n '#ed6bc3',\r\n '#ee6bc2',\r\n '#ef6bc3',\r\n '#ef6cc3',\r\n '#ef6cc3',\r\n '#f06cc4',\r\n '#f06cc5',\r\n '#f16cc4',\r\n '#f16cc4',\r\n '#f16cc5',\r\n '#f16dc6',\r\n '#f16dc6',\r\n '#f36dc6',\r\n '#f36dc7',\r\n '#f36dc6',\r\n '#f36dc7',\r\n '#f36dc7',\r\n '#f46dc7',\r\n '#f56ec7',\r\n '#f46ec7',\r\n '#f46ec7',\r\n '#f46ec8',\r\n '#f56ec8',\r\n '#f56fc8',\r\n '#f66fc8',\r\n '#f76fc9',\r\n '#f76fc9',\r\n '#f76fc9',\r\n '#f86fca',\r\n '#f970cb',\r\n '#f971cb',\r\n '#f870cb',\r\n '#f870cb',\r\n '#f870cc',\r\n '#f970cd',\r\n '#fa71cd',\r\n '#fa71cd',\r\n '#fa71cd',\r\n '#fa72ce',\r\n '#fb71ce',\r\n '#fb71ce',\r\n '#fb71ce',\r\n '#fc72cf',\r\n '#fb72ce',\r\n '#fb72ce',\r\n '#fc72cf',\r\n '#fd72d0',\r\n '#fe73d1',\r\n '#ff73d1',\r\n '#ff72d1',\r\n '#fe72d1',\r\n '#ff73d2',\r\n '#ff74d2',\r\n '#fe74d2',\r\n '#02dfce',\r\n '#02dece',\r\n '#02dece',\r\n '#03dfce',\r\n '#03dfce',\r\n '#03dfcd',\r\n '#03ddcd',\r\n '#03ddcd',\r\n '#03ddcc',\r\n '#02dccb',\r\n '#02dccb',\r\n '#03dccc',\r\n '#03dbcb',\r\n '#03dbca',\r\n '#03dbca',\r\n '#03dbca',\r\n '#03daca',\r\n '#04dbcb',\r\n '#04dacb',\r\n '#03d9ca',\r\n '#03d8c9',\r\n '#04d9c9',\r\n '#04dac9',\r\n '#04d9c9',\r\n '#04d9c8',\r\n '#04d7c7',\r\n '#04d6c7',\r\n '#04d7c8',\r\n '#05d7c7',\r\n '#05d6c7',\r\n '#05d6c7',\r\n '#04d6c7',\r\n '#05d5c6',\r\n '#05d5c6',\r\n '#05d5c6',\r\n '#05d5c5',\r\n '#06d4c5',\r\n '#05d4c5',\r\n '#05d4c5',\r\n '#06d4c5',\r\n '#06d3c4',\r\n '#06d2c4',\r\n '#06d2c4',\r\n '#06d2c3',\r\n '#06d2c3',\r\n '#07d2c2',\r\n '#07d0c1',\r\n '#07d0c2',\r\n '#07d0c1',\r\n '#07cfc1',\r\n '#07cfc1',\r\n '#07d0c1',\r\n '#09cfc0',\r\n '#08cfc0',\r\n '#09cfc0',\r\n '#0acec1',\r\n '#0acec0',\r\n '#09cdbf',\r\n '#09cdbf',\r\n '#0acebf',\r\n '#0accbe',\r\n '#0bccbf',\r\n '#0bccbf',\r\n '#0bccbe',\r\n '#0bcbbe',\r\n '#0bcbbe',\r\n '#0bcbbd',\r\n '#0ccabc',\r\n '#0ccbbd',\r\n '#0dcbbd',\r\n '#0dcabc',\r\n '#0cc9bb',\r\n '#0dc8ba',\r\n '#0ec9bb',\r\n '#0ec9bb',\r\n '#0dc8ba',\r\n '#0ec8bb',\r\n '#0dc7ba',\r\n '#0ec7ba',\r\n '#0fc7ba',\r\n '#0ec6b9',\r\n '#0fc6b9',\r\n '#0fc6b9',\r\n '#0fc5b8',\r\n '#0fc6b8',\r\n '#0fc6b8',\r\n '#0fc4b8',\r\n '#10c4b7',\r\n '#10c4b7',\r\n '#10c3b6',\r\n '#10c3b6',\r\n '#10c3b6',\r\n '#12c2b6',\r\n '#11c2b6',\r\n '#11c2b6',\r\n '#12c3b6',\r\n '#12c2b5',\r\n '#12c1b5',\r\n '#12c0b5',\r\n '#13c0b4',\r\n '#13c1b4',\r\n '#13c0b3',\r\n '#13bfb3',\r\n '#13c0b4',\r\n '#13bfb2',\r\n '#13beb3',\r\n '#13beb3',\r\n '#13bfb2',\r\n '#14beb1',\r\n '#14beb1',\r\n '#14beb1',\r\n '#14bdb1',\r\n '#14bdb1',\r\n '#15bdb1',\r\n '#16bdb1',\r\n '#15bcb0',\r\n '#16baaf',\r\n '#16bab0',\r\n '#16bbb0',\r\n '#15bbaf',\r\n '#15b9ae',\r\n '#15b9ae',\r\n '#16baae',\r\n '#17baae',\r\n '#17b9ae',\r\n '#17b8ae',\r\n '#17b8ac',\r\n '#17b8ac',\r\n '#18b8ac',\r\n '#18b7ab',\r\n '#18b7ab',\r\n '#18b7ab',\r\n '#19b7ac',\r\n '#18b7ac',\r\n '#18b5ac',\r\n '#18b5ab',\r\n '#18b5aa',\r\n '#19b4aa',\r\n '#1ab4aa',\r\n '#1ab5aa',\r\n '#19b3a9',\r\n '#19b3a9',\r\n '#19b4a9',\r\n '#19b4a9',\r\n '#19b2a8',\r\n '#1ab3a8',\r\n '#1ab3a8',\r\n '#1ab2a7',\r\n '#1bb1a7',\r\n '#1ab0a7',\r\n '#1ab0a7',\r\n '#1ab0a7',\r\n '#1bb1a6',\r\n '#1bb1a6',\r\n '#1bafa6',\r\n '#1bafa6',\r\n '#1cafa5',\r\n '#1cafa5',\r\n '#1cafa5',\r\n '#1caea4',\r\n '#1caea4',\r\n '#1caea4',\r\n '#1caea4',\r\n '#1cada3',\r\n '#1caca2',\r\n '#1caca2',\r\n '#1caca2',\r\n '#1caca2',\r\n '#1eaba2',\r\n '#1eaca2',\r\n '#1eaca2',\r\n '#1eaba2',\r\n '#1daaa1',\r\n '#1ea9a1',\r\n '#1ea9a1',\r\n '#1daaa0',\r\n '#1ea89f',\r\n '#1fa9a0',\r\n '#1fa8a0',\r\n '#1ea79f',\r\n '#1fa79e',\r\n '#1fa89f',\r\n '#1fa79e',\r\n '#1ea69d',\r\n '#1ea79d',\r\n '#1ea79c',\r\n '#1ea59c',\r\n '#1ea59c',\r\n '#20a59c',\r\n '#1fa59c',\r\n '#1fa59c',\r\n '#20a49b',\r\n '#20a49c',\r\n '#1fa49c',\r\n '#1fa49a',\r\n '#1fa39a',\r\n '#20a29a',\r\n '#20a39a',\r\n '#20a39a',\r\n '#20a29a',\r\n '#21a199',\r\n '#21a099',\r\n '#21a099',\r\n '#21a198',\r\n '#21a098',\r\n '#219f98',\r\n '#219f98',\r\n '#21a098',\r\n '#219f97',\r\n '#219f97',\r\n '#219e97',\r\n '#219d96',\r\n '#219d97',\r\n '#229d96',\r\n '#229d96',\r\n '#229d96',\r\n '#229c95',\r\n '#239d95',\r\n '#239d95',\r\n '#239c95',\r\n '#229a94',\r\n '#229a93',\r\n '#229a93',\r\n '#239b93',\r\n '#229a93',\r\n '#239892',\r\n '#239892',\r\n '#239992',\r\n '#249991',\r\n '#249991',\r\n '#249791',\r\n '#239791',\r\n '#249791',\r\n '#249791',\r\n '#249791',\r\n '#239690',\r\n '#239590',\r\n '#24968f',\r\n '#24968f',\r\n '#23958f',\r\n '#24958e',\r\n '#24948e',\r\n '#24948e',\r\n '#24958e',\r\n '#25938d',\r\n '#25938d',\r\n '#25938d',\r\n '#24938c',\r\n '#24928c',\r\n '#25928c',\r\n '#25928c',\r\n '#25928c',\r\n '#25918c',\r\n '#25908b',\r\n '#25908b',\r\n '#25908b',\r\n '#248f8a',\r\n '#258f8a',\r\n '#258f8a',\r\n '#25908b',\r\n '#258f8a',\r\n '#248e89',\r\n '#258e89',\r\n '#268e89',\r\n '#268e88',\r\n '#268e88',\r\n '#268d88',\r\n '#268c88',\r\n '#268c86',\r\n '#268c86',\r\n '#268c87',\r\n '#268c87',\r\n '#268b86',\r\n '#268a87',\r\n '#268a86',\r\n '#268a85',\r\n '#268a86',\r\n '#268a86',\r\n '#268884',\r\n '#268884',\r\n '#268884',\r\n '#278783',\r\n '#278783',\r\n '#268883',\r\n '#278682',\r\n '#278682',\r\n '#278682',\r\n '#278682',\r\n '#278681',\r\n '#278681',\r\n '#278581',\r\n '#278480',\r\n '#278580',\r\n '#278480',\r\n '#278381',\r\n '#278481',\r\n '#27837f',\r\n '#288480',\r\n '#288380',\r\n '#27827f',\r\n '#27827f',\r\n '#27817e',\r\n '#27817e',\r\n '#27817e',\r\n '#27807d',\r\n '#27807d',\r\n '#27807d',\r\n '#28807d',\r\n '#27807c',\r\n '#277f7b',\r\n '#277f7b',\r\n '#277f7b',\r\n '#287e7b',\r\n '#287d7a',\r\n '#287d7a',\r\n '#297e7b',\r\n '#297d7b',\r\n '#297c7b',\r\n '#297c7b',\r\n '#297d7b',\r\n '#287b79',\r\n '#287c79',\r\n '#287b79',\r\n '#297a79',\r\n '#297a78',\r\n '#297b78',\r\n '#297b78',\r\n '#287a77',\r\n '#287976',\r\n '#287876',\r\n '#287876',\r\n '#287876',\r\n '#287775',\r\n '#297876',\r\n '#297976',\r\n '#297776',\r\n '#287675',\r\n '#297776',\r\n '#297775',\r\n '#287674',\r\n '#297574',\r\n '#297574',\r\n '#297574',\r\n '#297474',\r\n '#287472',\r\n '#297472',\r\n '#297472',\r\n '#297472',\r\n '#297271',\r\n '#287271',\r\n '#287271',\r\n '#297271',\r\n '#297271',\r\n '#287171',\r\n '#28716f',\r\n '#29716f',\r\n '#28706f',\r\n '#297070',\r\n '#297070',\r\n '#296f6f',\r\n '#296f6f',\r\n '#286e6e',\r\n '#286e6e',\r\n '#286f6e',\r\n '#296e6e',\r\n '#286d6d',\r\n '#286d6d',\r\n '#296d6d',\r\n '#296e6d',\r\n '#296e6d',\r\n '#296c6b',\r\n '#286c6b',\r\n '#286c6b',\r\n '#296c6b',\r\n '#296a6b',\r\n '#286a6a',\r\n '#286a6a',\r\n '#296969',\r\n '#2a6969',\r\n '#296969',\r\n '#296869',\r\n '#2a6969',\r\n '#2a6969',\r\n '#2a6969',\r\n '#2a6868',\r\n '#296768',\r\n '#296768',\r\n '#2a6767',\r\n '#2a6767',\r\n '#2a6767',\r\n '#2a6567',\r\n '#296566',\r\n '#286666',\r\n '#286565',\r\n '#286565',\r\n '#296565',\r\n '#286465',\r\n '#296464',\r\n '#296464',\r\n '#286364',\r\n '#286263',\r\n '#286263',\r\n '#286263',\r\n '#286163',\r\n '#286062',\r\n '#286062',\r\n '#286162',\r\n '#296163',\r\n '#285f62',\r\n '#296062',\r\n '#296062',\r\n '#295f61',\r\n '#296061',\r\n '#285f60',\r\n '#285d5f',\r\n '#285d5f',\r\n '#285d60',\r\n '#285c5f',\r\n '#285c5e',\r\n '#285c5f',\r\n '#295b5e',\r\n '#285b5d',\r\n '#285b5d',\r\n '#285c5d',\r\n '#295c5d',\r\n '#285b5c',\r\n '#285b5c',\r\n '#285b5c',\r\n '#285a5d',\r\n '#28595d',\r\n '#28595b',\r\n '#28595b',\r\n '#29585c',\r\n '#28585b',\r\n '#28585a',\r\n '#28575a',\r\n '#29585b',\r\n '#29585b',\r\n '#29575a',\r\n '#295659',\r\n '#285558',\r\n '#285658',\r\n '#285658',\r\n '#295558',\r\n '#295557',\r\n '#285457',\r\n '#285357',\r\n '#285457',\r\n '#285356',\r\n '#295456',\r\n '#295356',\r\n '#285256',\r\n '#295256',\r\n '#285255',\r\n '#285255',\r\n '#295255',\r\n '#295155',\r\n '#284f54',\r\n '#274f54',\r\n '#275054',\r\n '#275054',\r\n '#275054',\r\n '#274e52',\r\n '#274e52',\r\n '#284e52',\r\n '#274d51',\r\n '#274d51',\r\n '#274e52',\r\n '#274c50',\r\n '#274c50',\r\n '#274e51',\r\n '#284e51',\r\n '#274c50',\r\n '#284c50',\r\n '#284b50',\r\n '#274a50',\r\n '#284a50',\r\n '#284a50',\r\n '#28494e',\r\n '#27484e',\r\n '#274a4e',\r\n '#274a4d',\r\n '#27494d',\r\n '#28484e',\r\n '#27474c',\r\n '#26484d',\r\n '#26484d',\r\n '#26484c',\r\n '#25464b',\r\n '#26464b',\r\n '#26474b',\r\n '#26474b',\r\n '#26454a',\r\n '#26454a',\r\n '#26464a',\r\n '#26464a',\r\n '#254349',\r\n '#264349',\r\n '#264349',\r\n '#26444a',\r\n ],\r\n nullColor: '#414554',\r\n}\r\n\r\nconst redGreenGradientBubbles = {\r\n colors: [\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f63538',\r\n '#f53538',\r\n '#f53538',\r\n '#f53538',\r\n '#f53538',\r\n '#f53538',\r\n '#f53538',\r\n '#f53538',\r\n '#f53538',\r\n '#f43538',\r\n '#f43538',\r\n '#f43538',\r\n '#f43538',\r\n '#f43538',\r\n '#f43538',\r\n '#f33538',\r\n '#f33538',\r\n '#f33538',\r\n '#f33538',\r\n '#f33538',\r\n '#f33538',\r\n '#f33538',\r\n '#f33538',\r\n '#f33538',\r\n '#f23538',\r\n '#f23538',\r\n '#f23538',\r\n '#f23538',\r\n '#f13538',\r\n '#f13538',\r\n '#f13538',\r\n '#f13538',\r\n '#f03538',\r\n '#f03538',\r\n '#f03538',\r\n '#f03538',\r\n '#f03538',\r\n '#f03538',\r\n '#ef3538',\r\n '#ef3538',\r\n '#ef3538',\r\n '#ef3538',\r\n '#ef3538',\r\n '#ef3538',\r\n '#ee3639',\r\n '#ee3639',\r\n '#ee3639',\r\n '#ed3639',\r\n '#ed3639',\r\n '#ed3639',\r\n '#ec3639',\r\n '#ec3639',\r\n '#ec3639',\r\n '#eb3639',\r\n '#eb3639',\r\n '#eb3639',\r\n '#eb3639',\r\n '#eb3639',\r\n '#ea3639',\r\n '#ea3639',\r\n '#ea3639',\r\n '#e93639',\r\n '#e93639',\r\n '#e83538',\r\n '#e83538',\r\n '#e83538',\r\n '#e73538',\r\n '#e73538',\r\n '#e73538',\r\n '#e63538',\r\n '#e63639',\r\n '#e63639',\r\n '#e63639',\r\n '#e63639',\r\n '#e53639',\r\n '#e53639',\r\n '#e53639',\r\n '#e53639',\r\n '#e53639',\r\n '#e53639',\r\n '#e43639',\r\n '#e43639',\r\n '#e43639',\r\n '#e33639',\r\n '#e33639',\r\n '#e33639',\r\n '#e23639',\r\n '#e23639',\r\n '#e23639',\r\n '#e13639',\r\n '#e13639',\r\n '#e13639',\r\n '#e03639',\r\n '#e0363a',\r\n '#e0363a',\r\n '#e0363a',\r\n '#df363a',\r\n '#df363a',\r\n '#df363a',\r\n '#de363a',\r\n '#de363a',\r\n '#de363a',\r\n '#de363a',\r\n '#de363a',\r\n '#de363a',\r\n '#dd363a',\r\n '#dd373b',\r\n '#dd373b',\r\n '#dc373b',\r\n '#dc373b',\r\n '#dc373b',\r\n '#db373b',\r\n '#db373b',\r\n '#db373b',\r\n '#da373b',\r\n '#da373d',\r\n '#da373d',\r\n '#d9373d',\r\n '#d9373d',\r\n '#d9373d',\r\n '#d9373d',\r\n '#d9373d',\r\n '#d8373e',\r\n '#d8373e',\r\n '#d7383e',\r\n '#d7383e',\r\n '#d7383e',\r\n '#d6383e',\r\n '#d6383e',\r\n '#d5383e',\r\n '#d5383e',\r\n '#d4383e',\r\n '#d4383e',\r\n '#d4383f',\r\n '#d3383f',\r\n '#d3383f',\r\n '#d3393f',\r\n '#d33940',\r\n '#d23940',\r\n '#d23940',\r\n '#d13940',\r\n '#d13941',\r\n '#d03941',\r\n '#d03941',\r\n '#cf3941',\r\n '#cf3942',\r\n '#cf3942',\r\n '#cf3a42',\r\n '#ce3a42',\r\n '#cd3a43',\r\n '#cd3a43',\r\n '#cc3943',\r\n '#cc3943',\r\n '#cb3944',\r\n '#cb3944',\r\n '#ca3944',\r\n '#ca3944',\r\n '#c93a45',\r\n '#c93a45',\r\n '#c83a45',\r\n '#c73a45',\r\n '#c73a45',\r\n '#c53a45',\r\n '#c53a45',\r\n '#c43a45',\r\n '#c43a46',\r\n '#c43a46',\r\n '#c43c46',\r\n '#c33c47',\r\n '#c33c47',\r\n '#c23c47',\r\n '#c23c47',\r\n '#c13c48',\r\n '#c13c48',\r\n '#c03c48',\r\n '#c03c48',\r\n '#bf3c48',\r\n '#bf3d4a',\r\n '#be3d4a',\r\n '#be3d4a',\r\n '#bd3d4a',\r\n '#bd3d4b',\r\n '#bc3d4b',\r\n '#bc3d4b',\r\n '#bb3d4b',\r\n '#bb3d4b',\r\n '#bb3d4c',\r\n '#bb3d4c',\r\n '#ba3d4c',\r\n '#ba3e4c',\r\n '#b83e4c',\r\n '#b83e4c',\r\n '#b83e4c',\r\n '#b73e4c',\r\n '#b73e4c',\r\n '#b63e4c',\r\n '#b63e4c',\r\n '#b53e4d',\r\n '#b53e4d',\r\n '#b53e4d',\r\n '#b43e4d',\r\n '#b43e4d',\r\n '#b33e4d',\r\n '#b33f4d',\r\n '#b23f4e',\r\n '#b23f4e',\r\n '#b23f4e',\r\n '#b13f4e',\r\n '#b13f4e',\r\n '#b03e4e',\r\n '#b03e4e',\r\n '#b03e4f',\r\n '#b03e4f',\r\n '#b03e4f',\r\n '#ae3e4f',\r\n '#ae3e4f',\r\n '#ad3e4f',\r\n '#ad3e4f',\r\n '#ac3e4f',\r\n '#ac3f50',\r\n '#ab3f50',\r\n '#ab3f50',\r\n '#aa3f50',\r\n '#aa3f50',\r\n '#a93f50',\r\n '#a93f50',\r\n '#a73f50',\r\n '#a73f50',\r\n '#a63f50',\r\n '#a63f51',\r\n '#a53f51',\r\n '#a53f51',\r\n '#a43f50',\r\n '#a43f50',\r\n '#a43f50',\r\n '#a43f50',\r\n '#a24050',\r\n '#a24050',\r\n '#a14050',\r\n '#a04051',\r\n '#a04051',\r\n '#9f4051',\r\n '#9f4051',\r\n '#9e4051',\r\n '#9c4051',\r\n '#9c4051',\r\n '#9b4051',\r\n '#9a4051',\r\n '#9a4053',\r\n '#994053',\r\n '#994153',\r\n '#984153',\r\n '#974153',\r\n '#974153',\r\n '#964153',\r\n '#954153',\r\n '#954153',\r\n '#934054',\r\n '#934054',\r\n '#924054',\r\n '#914054',\r\n '#914054',\r\n '#904053',\r\n '#8e4053',\r\n '#8e4153',\r\n '#8d4153',\r\n '#8d4153',\r\n '#8d4154',\r\n '#8b4154',\r\n '#8b4154',\r\n '#8a4154',\r\n '#894154',\r\n '#894154',\r\n '#884154',\r\n '#884154',\r\n '#864154',\r\n '#864154',\r\n '#854154',\r\n '#844155',\r\n '#844255',\r\n '#824255',\r\n '#824255',\r\n '#824255',\r\n '#824255',\r\n '#814255',\r\n '#814255',\r\n '#804255',\r\n '#804255',\r\n '#7e4255',\r\n '#7e4255',\r\n '#7d4255',\r\n '#7d4256',\r\n '#7c4256',\r\n '#7c4256',\r\n '#7b4256',\r\n '#7b4256',\r\n '#7b4256',\r\n '#794256',\r\n '#794256',\r\n '#784256',\r\n '#784356',\r\n '#774256',\r\n '#774256',\r\n '#774256',\r\n '#764256',\r\n '#764256',\r\n '#764256',\r\n '#754256',\r\n '#754256',\r\n '#744255',\r\n '#744255',\r\n '#744255',\r\n '#734255',\r\n '#734255',\r\n '#734255',\r\n '#724255',\r\n '#724255',\r\n '#724255',\r\n '#714255',\r\n '#714255',\r\n '#6f4255',\r\n '#6f4255',\r\n '#6f4255',\r\n '#6e4255',\r\n '#6e4255',\r\n '#6e4255',\r\n '#6d4255',\r\n '#6d4255',\r\n '#6d4255',\r\n '#6c4255',\r\n '#6c4255',\r\n '#6c4255',\r\n '#6b4155',\r\n '#6b4155',\r\n '#694155',\r\n '#694155',\r\n '#694155',\r\n '#684155',\r\n '#684155',\r\n '#684155',\r\n '#684155',\r\n '#684155',\r\n '#674155',\r\n '#674155',\r\n '#674155',\r\n '#664154',\r\n '#664154',\r\n '#654154',\r\n '#654154',\r\n '#654154',\r\n '#634154',\r\n '#634154',\r\n '#624154',\r\n '#624154',\r\n '#614154',\r\n '#614154',\r\n '#614154',\r\n '#604054',\r\n '#604054',\r\n '#5f4054',\r\n '#5f4054',\r\n '#5f4054',\r\n '#5e4054',\r\n '#5e4054',\r\n '#5d4054',\r\n '#5d4054',\r\n '#5d4054',\r\n '#5c4053',\r\n '#5c4053',\r\n '#5c4053',\r\n '#5b4053',\r\n '#5b4053',\r\n '#5a4053',\r\n '#5a4053',\r\n '#5a4053',\r\n '#593f53',\r\n '#593f53',\r\n '#593f53',\r\n '#583f53',\r\n '#583f53',\r\n '#583f53',\r\n '#573f53',\r\n '#573e53',\r\n '#573e53',\r\n '#563e53',\r\n '#563e53',\r\n '#563e53',\r\n '#563e53',\r\n '#553e52',\r\n '#553e52',\r\n '#553e52',\r\n '#543e52',\r\n '#543e52',\r\n '#543e52',\r\n '#543e52',\r\n '#543e52',\r\n '#533e52',\r\n '#533e52',\r\n '#533e52',\r\n '#533e52',\r\n '#533e52',\r\n '#523e51',\r\n '#523e51',\r\n '#523e51',\r\n '#523e51',\r\n '#523e51',\r\n '#513e51',\r\n '#513e51',\r\n '#513e51',\r\n '#513e51',\r\n '#513e51',\r\n '#513e51',\r\n '#513e51',\r\n '#513e51',\r\n '#503e51',\r\n '#503e51',\r\n '#503e51',\r\n '#503e51',\r\n '#503e51',\r\n '#503e51',\r\n '#503e51',\r\n '#503e51',\r\n '#503e51',\r\n '#503f51',\r\n '#503f51',\r\n '#4f3f51',\r\n '#4f3f51',\r\n '#4f3f51',\r\n '#4d3f51',\r\n '#4d3f51',\r\n '#4d4151',\r\n '#4b4151',\r\n '#4b4151',\r\n '#4a4152',\r\n '#494152',\r\n '#484253',\r\n '#484253',\r\n '#474253',\r\n '#474253',\r\n '#464353',\r\n '#454353',\r\n '#454353',\r\n '#444454',\r\n '#444454',\r\n '#434454',\r\n '#434454',\r\n '#424454',\r\n '#424554',\r\n '#424554',\r\n '#424554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#414554',\r\n '#404654',\r\n '#404654',\r\n '#404654',\r\n '#404653',\r\n '#404653',\r\n '#3f4653',\r\n '#3f4753',\r\n '#3f4753',\r\n '#3e4753',\r\n '#3e4753',\r\n '#3e4852',\r\n '#3d4852',\r\n '#3d4852',\r\n '#3c4951',\r\n '#3c4951',\r\n '#3b4951',\r\n '#3b4a51',\r\n '#3b4a50',\r\n '#3b4a50',\r\n '#3a4c50',\r\n '#394c50',\r\n '#394c50',\r\n '#394c50',\r\n '#394c50',\r\n '#394c50',\r\n '#384c4f',\r\n '#384c4f',\r\n '#384c4f',\r\n '#384d50',\r\n '#384d50',\r\n '#384d50',\r\n '#384d50',\r\n '#384d50',\r\n '#384d50',\r\n '#384d50',\r\n '#384d50',\r\n '#384d50',\r\n '#384e50',\r\n '#364e50',\r\n '#364e4f',\r\n '#364e4f',\r\n '#364e4f',\r\n '#364e4f',\r\n '#364e4f',\r\n '#364f4f',\r\n '#364f4f',\r\n '#354f4f',\r\n '#354f4f',\r\n '#354f4f',\r\n '#354f4f',\r\n '#35514f',\r\n '#35514f',\r\n '#35514f',\r\n '#34514f',\r\n '#34514f',\r\n '#34524f',\r\n '#34524f',\r\n '#34524f',\r\n '#34524f',\r\n '#33524e',\r\n '#33534e',\r\n '#33534e',\r\n '#33534e',\r\n '#32534e',\r\n '#32544e',\r\n '#32544e',\r\n '#32544e',\r\n '#32544e',\r\n '#31554e',\r\n '#31554e',\r\n '#31554e',\r\n '#31564d',\r\n '#31564d',\r\n '#31564d',\r\n '#31564d',\r\n '#31574d',\r\n '#30574d',\r\n '#30574d',\r\n '#30584d',\r\n '#30584d',\r\n '#2f584d',\r\n '#2f594d',\r\n '#2f594d',\r\n '#2f594c',\r\n '#2e5a4c',\r\n '#2e5a4c',\r\n '#2e5a4c',\r\n '#2d5b4c',\r\n '#2d5b4c',\r\n '#2d5b4c',\r\n '#2d5b4c',\r\n '#2c5c4c',\r\n '#2c5c4c',\r\n '#2c5c4c',\r\n '#2b5d4b',\r\n '#2b5d4b',\r\n '#2b5d4b',\r\n '#2b5e4b',\r\n '#2a5e4b',\r\n '#2a5e4b',\r\n '#2a5f4b',\r\n '#2a5f4b',\r\n '#2a5f4b',\r\n '#2a604b',\r\n '#2a604b',\r\n '#2a604b',\r\n '#29624b',\r\n '#29624b',\r\n '#29624b',\r\n '#29624b',\r\n '#29634b',\r\n '#29634b',\r\n '#29634b',\r\n '#29644b',\r\n '#28644b',\r\n '#28644b',\r\n '#28644b',\r\n '#28654b',\r\n '#28654a',\r\n '#27654a',\r\n '#27664a',\r\n '#27664a',\r\n '#27664a',\r\n '#27664a',\r\n '#26684a',\r\n '#26684a',\r\n '#26684a',\r\n '#26684a',\r\n '#26694a',\r\n '#25694a',\r\n '#25694a',\r\n '#25694a',\r\n '#256a4a',\r\n '#256a4a',\r\n '#256a4a',\r\n '#256a4a',\r\n '#246a4a',\r\n '#246b49',\r\n '#246b49',\r\n '#246b49',\r\n '#246b49',\r\n '#246c49',\r\n '#246c49',\r\n '#236c49',\r\n '#236c49',\r\n '#236e49',\r\n '#236e49',\r\n '#236e49',\r\n '#236e49',\r\n '#236f49',\r\n '#236f49',\r\n '#236f49',\r\n '#226f49',\r\n '#227049',\r\n '#227049',\r\n '#227049',\r\n '#227149',\r\n '#227149',\r\n '#227149',\r\n '#227149',\r\n '#227349',\r\n '#217349',\r\n '#217349',\r\n '#217449',\r\n '#217449',\r\n '#217449',\r\n '#217449',\r\n '#217549',\r\n '#217549',\r\n '#217549',\r\n '#207649',\r\n '#207649',\r\n '#207649',\r\n '#207847',\r\n '#207847',\r\n '#207847',\r\n '#207947',\r\n '#207947',\r\n '#207947',\r\n '#207947',\r\n '#207947',\r\n '#207947',\r\n '#207b47',\r\n '#207b47',\r\n '#207b47',\r\n '#207c47',\r\n '#207c47',\r\n '#207c47',\r\n '#207d47',\r\n '#207d47',\r\n '#207e48',\r\n '#207e48',\r\n '#207e48',\r\n '#208048',\r\n '#208048',\r\n '#208048',\r\n '#208148',\r\n '#208148',\r\n '#208148',\r\n '#208248',\r\n '#1f8247',\r\n '#1f8247',\r\n '#1f8347',\r\n '#1f8347',\r\n '#1f8347',\r\n '#1f8547',\r\n '#1f8547',\r\n '#1f8547',\r\n '#1f8647',\r\n '#1f8647',\r\n '#1f8647',\r\n '#1e8747',\r\n '#1e8747',\r\n '#1e8747',\r\n '#1e8747',\r\n '#1e8947',\r\n '#1e8947',\r\n '#1e8947',\r\n '#1e8a47',\r\n '#1e8a47',\r\n '#1e8a47',\r\n '#1e8b47',\r\n '#1e8b47',\r\n '#1e8b47',\r\n '#1e8b47',\r\n '#1e8c47',\r\n '#1e8c47',\r\n '#1e8c47',\r\n '#1e8c47',\r\n '#1e8e47',\r\n '#1e8e47',\r\n '#1e8e47',\r\n '#1e8f47',\r\n '#1d8f47',\r\n '#1d8f47',\r\n '#1d8f47',\r\n '#1d9047',\r\n '#1d9047',\r\n '#1e9047',\r\n '#1e9047',\r\n '#1e9147',\r\n '#1e9147',\r\n '#1e9147',\r\n '#1e9347',\r\n '#1e9347',\r\n '#1e9347',\r\n '#1e9347',\r\n '#1e9447',\r\n '#1e9447',\r\n '#1e9447',\r\n '#1e9548',\r\n '#1e9548',\r\n '#1e9548',\r\n '#1e9648',\r\n '#1e9648',\r\n '#1e9648',\r\n '#1f9848',\r\n '#1f9848',\r\n '#1f9848',\r\n '#209948',\r\n '#209948',\r\n '#209948',\r\n '#209a48',\r\n '#209a48',\r\n '#209a48',\r\n '#209b48',\r\n '#209b48',\r\n '#209b48',\r\n '#209b48',\r\n '#219c48',\r\n '#219c48',\r\n '#219d48',\r\n '#219d48',\r\n '#219e48',\r\n '#219e48',\r\n '#219e48',\r\n '#219f48',\r\n '#219f48',\r\n '#21a048',\r\n '#21a048',\r\n '#21a048',\r\n '#21a148',\r\n '#21a148',\r\n '#21a348',\r\n '#21a348',\r\n '#22a449',\r\n '#22a449',\r\n '#22a449',\r\n '#22a549',\r\n '#22a549',\r\n '#22a649',\r\n '#22a649',\r\n '#22a64a',\r\n '#23a74a',\r\n '#23a74a',\r\n '#23a84a',\r\n '#23a84a',\r\n '#23aa4a',\r\n '#23aa4a',\r\n '#23aa4a',\r\n '#24ab4a',\r\n '#24ab4a',\r\n '#24ab4a',\r\n '#25ac4a',\r\n '#25ac4a',\r\n '#25ad4a',\r\n '#25ad4a',\r\n '#25ad4a',\r\n '#26ae4a',\r\n '#26ae4a',\r\n '#26ae4a',\r\n '#26af4a',\r\n '#26af4a',\r\n '#26b04a',\r\n '#26b04a',\r\n '#26b04a',\r\n '#27b14a',\r\n '#27b14a',\r\n '#27b14a',\r\n '#27b24a',\r\n '#27b24a',\r\n '#27b24a',\r\n '#27b24a',\r\n '#27b34a',\r\n '#27b34a',\r\n '#27b34a',\r\n '#28b54b',\r\n '#28b54b',\r\n '#28b54b',\r\n '#28b54b',\r\n '#28b64b',\r\n '#28b64b',\r\n '#28b64d',\r\n '#28b64d',\r\n '#28b74d',\r\n '#28b74d',\r\n '#28b74d',\r\n '#29b74d',\r\n '#29b84d',\r\n '#29b84d',\r\n '#29b84d',\r\n '#29b84d',\r\n '#29b94d',\r\n '#29b94d',\r\n '#29b94d',\r\n '#29b94d',\r\n '#29b94d',\r\n '#29b94d',\r\n '#29b94d',\r\n '#29b94e',\r\n '#2aba4e',\r\n '#2aba4e',\r\n '#2aba4e',\r\n '#2aba4e',\r\n '#2aba4e',\r\n '#2aba4e',\r\n '#2aba4e',\r\n '#2abb4e',\r\n '#2abb4e',\r\n '#2abb4f',\r\n '#2abb4f',\r\n '#2abc4f',\r\n '#2abc4f',\r\n '#2abc4f',\r\n '#2bbc4f',\r\n '#2bbc4f',\r\n '#2bbd4f',\r\n '#2bbd4f',\r\n '#2bbd50',\r\n '#2bbd50',\r\n '#2bbd50',\r\n '#2bbe50',\r\n '#2bbe50',\r\n '#2bbe50',\r\n '#2bbe50',\r\n '#2bbe50',\r\n '#2bbf51',\r\n '#2cbf51',\r\n '#2cbf51',\r\n '#2cbf51',\r\n '#2cc051',\r\n '#2cc051',\r\n '#2cc051',\r\n '#2cc052',\r\n '#2cc052',\r\n '#2cc152',\r\n '#2cc152',\r\n '#2cc152',\r\n '#2cc152',\r\n '#2dc353',\r\n '#2dc353',\r\n '#2dc353',\r\n '#2dc353',\r\n '#2dc353',\r\n '#2ec453',\r\n '#2ec453',\r\n '#2ec454',\r\n '#2ec454',\r\n '#2ec454',\r\n '#2ec554',\r\n '#2ec554',\r\n '#2fc554',\r\n '#2fc554',\r\n '#2fc655',\r\n '#2fc655',\r\n '#2fc655',\r\n '#2fc655',\r\n '#2fc655',\r\n '#2fc755',\r\n '#2fc755',\r\n '#2fc756',\r\n '#2fc756',\r\n '#2fc756',\r\n '#2fc756',\r\n '#2fc856',\r\n '#2fc856',\r\n '#2fc856',\r\n '#2fc856',\r\n '#2fc856',\r\n '#2fc858',\r\n '#2fc958',\r\n '#2fc958',\r\n '#2fc958',\r\n '#2fc958',\r\n '#2fc958',\r\n '#2fc958',\r\n '#2fc958',\r\n '#2fca58',\r\n '#2fca58',\r\n '#2fca58',\r\n '#2fca59',\r\n '#2fca59',\r\n '#2fca59',\r\n '#2fca59',\r\n '#2fca59',\r\n '#30ca59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb59',\r\n '#30cb5a',\r\n '#30cb5a',\r\n '#30cb5a',\r\n '#30cb5a',\r\n '#30cb5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n '#30cc5a',\r\n ],\r\n nullColor: 'pink',\r\n}\r\nconst blueGradientBubbles = {\r\n colors: [\r\n '#0c3574',\r\n '#0b3475',\r\n '#0b3475',\r\n '#0c3475',\r\n '#0c3575',\r\n '#0c3475',\r\n '#0c3475',\r\n '#0c3576',\r\n '#0c3677',\r\n '#0c3677',\r\n '#0d3776',\r\n '#0d3676',\r\n '#0e3677',\r\n '#0e3576',\r\n '#0d3576',\r\n '#0d3677',\r\n '#0d3777',\r\n '#0e3778',\r\n '#0e3778',\r\n '#0d3877',\r\n '#0d3878',\r\n '#0d3878',\r\n '#0d3878',\r\n '#0d3878',\r\n '#0d3978',\r\n '#0e3778',\r\n '#0e3779',\r\n '#0e397a',\r\n '#0f3979',\r\n '#0f3a7a',\r\n '#0f3a7b',\r\n '#0f3a7b',\r\n '#0e3a7a',\r\n '#0e3a7a',\r\n '#0f3a7a',\r\n '#0e3a7a',\r\n '#0f3a7c',\r\n '#0f3a7c',\r\n '#0f3a7b',\r\n '#0f3b7b',\r\n '#0f3a7b',\r\n '#0e3a7b',\r\n '#0e3b7c',\r\n '#0f3c7c',\r\n '#0f3c7c',\r\n '#0f3d7d',\r\n '#0f3d7d',\r\n '#0f3c7d',\r\n '#0f3c7e',\r\n '#0f3d7e',\r\n '#0f3d7e',\r\n '#0f3d7e',\r\n '#0f3e7e',\r\n '#0f3d7e',\r\n '#103e7e',\r\n '#113e7f',\r\n '#103e7e',\r\n '#103d7e',\r\n '#103e7f',\r\n '#103e7e',\r\n '#113e80',\r\n '#113f80',\r\n '#103f7f',\r\n '#114080',\r\n '#113f81',\r\n '#114081',\r\n '#113f81',\r\n '#103e80',\r\n '#103f81',\r\n '#104181',\r\n '#104181',\r\n '#103f81',\r\n '#114082',\r\n '#103f82',\r\n '#103f81',\r\n '#114081',\r\n '#114282',\r\n '#114282',\r\n '#114282',\r\n '#124182',\r\n '#114082',\r\n '#114182',\r\n '#114283',\r\n '#124384',\r\n '#114384',\r\n '#114383',\r\n '#124383',\r\n '#124485',\r\n '#114384',\r\n '#114384',\r\n '#114384',\r\n '#114484',\r\n '#124585',\r\n '#124585',\r\n '#124585',\r\n '#134587',\r\n '#134586',\r\n '#134586',\r\n '#134687',\r\n '#134687',\r\n '#134586',\r\n '#134686',\r\n '#134687',\r\n '#134787',\r\n '#134788',\r\n '#134688',\r\n '#134688',\r\n '#134687',\r\n '#124788',\r\n '#124789',\r\n '#134688',\r\n '#134688',\r\n '#134688',\r\n '#134788',\r\n '#134889',\r\n '#13488a',\r\n '#13488a',\r\n '#13488a',\r\n '#134889',\r\n '#134789',\r\n '#13478a',\r\n '#13498a',\r\n '#14498a',\r\n '#15498b',\r\n '#14488b',\r\n '#14498c',\r\n '#15498c',\r\n '#14498b',\r\n '#15498c',\r\n '#15498c',\r\n '#14498c',\r\n '#154a8d',\r\n '#144b8c',\r\n '#144b8c',\r\n '#154b8d',\r\n '#144c8d',\r\n '#154b8d',\r\n '#154b8d',\r\n '#154c8d',\r\n '#144c8d',\r\n '#154c8d',\r\n '#154c8d',\r\n '#164c8e',\r\n '#164c8e',\r\n '#164c8e',\r\n '#164c8e',\r\n '#154d8e',\r\n '#154d8f',\r\n '#164e90',\r\n '#164e90',\r\n '#164e90',\r\n '#154e8f',\r\n '#154d90',\r\n '#154e90',\r\n '#164e90',\r\n '#154e91',\r\n '#154f91',\r\n '#155091',\r\n '#165091',\r\n '#164f91',\r\n '#164f92',\r\n '#165092',\r\n '#165092',\r\n '#165092',\r\n '#165092',\r\n '#155192',\r\n '#155192',\r\n '#175093',\r\n '#175293',\r\n '#175293',\r\n '#175093',\r\n '#175093',\r\n '#175293',\r\n '#175293',\r\n '#175193',\r\n '#175294',\r\n '#175394',\r\n '#175394',\r\n '#175294',\r\n '#175395',\r\n '#175295',\r\n '#175295',\r\n '#175395',\r\n '#175395',\r\n '#185495',\r\n '#185495',\r\n '#175396',\r\n '#175497',\r\n '#175397',\r\n '#175497',\r\n '#175597',\r\n '#175597',\r\n '#175597',\r\n '#175497',\r\n '#185497',\r\n '#195698',\r\n '#195798',\r\n '#185597',\r\n '#185497',\r\n '#185599',\r\n '#195799',\r\n '#195799',\r\n '#185799',\r\n '#185699',\r\n '#195699',\r\n '#195799',\r\n '#195799',\r\n '#19589a',\r\n '#185899',\r\n '#185899',\r\n '#18589a',\r\n '#18589a',\r\n '#18599a',\r\n '#18589a',\r\n '#18579a',\r\n '#19589b',\r\n '#19599b',\r\n '#19599a',\r\n '#18599a',\r\n '#1a5a9c',\r\n '#1a5a9d',\r\n '#1a5a9c',\r\n '#1a599d',\r\n '#1a5a9d',\r\n '#1a5a9e',\r\n '#1a5a9e',\r\n '#195a9d',\r\n '#195a9d',\r\n '#195a9d',\r\n '#195a9d',\r\n '#1a5a9e',\r\n '#1a5b9f',\r\n '#1a5b9e',\r\n '#1a5b9e',\r\n '#1a5d9e',\r\n '#1a5c9f',\r\n '#195c9f',\r\n '#195c9f',\r\n '#195da0',\r\n '#195d9f',\r\n '#195ca0',\r\n '#1a5ca0',\r\n '#1a5d9f',\r\n '#1a5ea1',\r\n '#1a5ea1',\r\n '#1a5da0',\r\n '#1a5da0',\r\n '#195ea0',\r\n '#195ea0',\r\n '#1a5ea0',\r\n '#1a5ea1',\r\n '#1c5fa3',\r\n '#1c5fa3',\r\n '#1b5fa3',\r\n '#1b5ea2',\r\n '#1b5ea2',\r\n '#1b5ea2',\r\n '#1b5fa3',\r\n '#1b60a3',\r\n '#1b60a3',\r\n '#1b5fa3',\r\n '#1b60a3',\r\n '#1c61a4',\r\n '#1b60a4',\r\n '#1b60a4',\r\n '#1b61a4',\r\n '#1b60a4',\r\n '#1b60a4',\r\n '#1b60a4',\r\n '#1b62a4',\r\n '#1b62a5',\r\n '#1b61a5',\r\n '#1b62a5',\r\n '#1b62a5',\r\n '#1b61a5',\r\n '#1d61a6',\r\n '#1d63a6',\r\n '#1c62a6',\r\n '#1d63a6',\r\n '#1d62a6',\r\n '#1c62a6',\r\n '#1c63a7',\r\n '#1d64a8',\r\n '#1c64a7',\r\n '#1c64a7',\r\n '#1d65a8',\r\n '#1c63a8',\r\n '#1d64a9',\r\n '#1d65a9',\r\n '#1d65a9',\r\n '#1d65a9',\r\n '#1d65a9',\r\n '#1d66a9',\r\n '#1d66a9',\r\n '#1c65a9',\r\n '#1d66aa',\r\n '#1d66aa',\r\n '#1c65aa',\r\n '#1c66aa',\r\n '#1c66aa',\r\n '#1d66aa',\r\n '#1c66ab',\r\n '#1c68ab',\r\n '#1c67ab',\r\n '#1c67ab',\r\n '#1d68ab',\r\n '#1d68ac',\r\n '#1e68ac',\r\n '#1e67ab',\r\n '#1d67ab',\r\n '#1e69ac',\r\n '#1e69ac',\r\n '#1d68ac',\r\n '#1d68ac',\r\n '#1e69ae',\r\n '#1e6aae',\r\n '#1e6aad',\r\n '#1e69ad',\r\n '#1e6aae',\r\n '#1d69ae',\r\n '#1d6aae',\r\n '#1e6bae',\r\n '#1e6aaf',\r\n '#1e6baf',\r\n '#1e6baf',\r\n '#1e6bb0',\r\n '#1e6cb0',\r\n '#1d6baf',\r\n '#1d6baf',\r\n '#1e6bb0',\r\n '#1d6ab0',\r\n '#1d6cb0',\r\n '#1d6db1',\r\n '#1e6cb1',\r\n '#1e6db0',\r\n '#1e6cb1',\r\n '#1d6cb1',\r\n '#1d6cb0',\r\n '#1f6db1',\r\n '#1f6cb1',\r\n '#1f6cb1',\r\n '#1f6db2',\r\n '#1f6cb1',\r\n '#1f6db1',\r\n '#1f6eb3',\r\n '#1f6fb3',\r\n '#1f6eb3',\r\n '#1f6eb3',\r\n '#1f6fb3',\r\n '#1f6fb3',\r\n '#1f6fb4',\r\n '#1f6fb4',\r\n '#1f6fb4',\r\n '#2070b5',\r\n '#1f70b4',\r\n '#1f70b4',\r\n '#1f70b4',\r\n '#1f71b5',\r\n '#1f71b5',\r\n '#1f71b5',\r\n '#1f71b5',\r\n '#1f70b5',\r\n '#1f71b5',\r\n '#1f72b6',\r\n '#1f72b6',\r\n '#1f71b6',\r\n '#1f71b6',\r\n '#1f72b5',\r\n '#2072b6',\r\n '#2172b7',\r\n '#2172b7',\r\n '#2172b6',\r\n '#2172b6',\r\n '#2172b7',\r\n '#2072b7',\r\n '#2073b8',\r\n '#2173b9',\r\n '#2173b9',\r\n '#2075b8',\r\n '#2075b8',\r\n '#2174b8',\r\n '#2174b9',\r\n '#2175ba',\r\n '#2174ba',\r\n '#2174ba',\r\n '#2175ba',\r\n '#2175ba',\r\n '#2176bb',\r\n '#2176bb',\r\n '#2076ba',\r\n '#2076ba',\r\n '#2176bb',\r\n '#2176bb',\r\n '#2076bb',\r\n '#2077bb',\r\n '#2177bc',\r\n '#2077bb',\r\n '#2077bb',\r\n '#2077bc',\r\n '#2077bc',\r\n '#2077bc',\r\n '#2177bd',\r\n '#2078bc',\r\n '#2078bc',\r\n '#2178bd',\r\n '#2279be',\r\n '#2178be',\r\n '#2179be',\r\n '#2179be',\r\n '#2279bf',\r\n '#2278bf',\r\n '#2179bf',\r\n '#217abf',\r\n '#227ac0',\r\n '#2279c0',\r\n '#227ac0',\r\n '#227abf',\r\n '#227ac0',\r\n '#217bc0',\r\n '#227bc0',\r\n '#227bc0',\r\n '#217bc0',\r\n '#217ac0',\r\n '#217bc0',\r\n '#217cc1',\r\n '#227cc1',\r\n '#217cc1',\r\n '#217cc1',\r\n '#227cc1',\r\n '#217cc1',\r\n '#227cc2',\r\n '#227cc2',\r\n '#227dc2',\r\n '#217dc1',\r\n '#217dc2',\r\n '#217dc2',\r\n '#217dc3',\r\n '#217ec3',\r\n '#217ec3',\r\n '#217ec3',\r\n '#227ec4',\r\n '#237fc4',\r\n '#237ec5',\r\n '#237ec5',\r\n '#237ec5',\r\n '#237ec4',\r\n '#237ec4',\r\n '#237ec6',\r\n '#237fc6',\r\n '#2380c6',\r\n '#237fc5',\r\n '#237fc5',\r\n '#2380c5',\r\n '#2380c7',\r\n '#2381c6',\r\n '#2381c6',\r\n '#2380c6',\r\n '#2381c7',\r\n '#2380c6',\r\n '#2380c7',\r\n '#2381c8',\r\n '#2382c7',\r\n '#2381c7',\r\n '#2381c7',\r\n '#2382c8',\r\n '#2382c8',\r\n '#2383c8',\r\n '#2384c9',\r\n '#2384c9',\r\n '#2383c8',\r\n '#2383c9',\r\n '#2383ca',\r\n '#2384ca',\r\n '#2384ca',\r\n '#2383ca',\r\n '#2383ca',\r\n '#2384ca',\r\n '#2384ca',\r\n '#2484cb',\r\n '#2485cb',\r\n '#2385cb',\r\n '#2384cb',\r\n '#2385cb',\r\n '#2485cb',\r\n '#2585cc',\r\n '#2586cc',\r\n '#2485cc',\r\n '#2485cc',\r\n '#2485cc',\r\n '#2486cd',\r\n '#2586cd',\r\n '#2587cd',\r\n '#2487cc',\r\n '#2486cd',\r\n '#2587cd',\r\n '#2587cd',\r\n '#2487ce',\r\n '#2588ce',\r\n '#2588ce',\r\n '#2588ce',\r\n '#2488cf',\r\n '#2588cf',\r\n '#2589ce',\r\n '#2589ce',\r\n '#2688cf',\r\n '#2589ce',\r\n '#2789cf',\r\n '#2889d0',\r\n '#2889d0',\r\n '#288ad0',\r\n '#2889d0',\r\n '#298ad0',\r\n '#2b8bd0',\r\n '#2a89cf',\r\n '#2989cf',\r\n '#2b8bcf',\r\n '#2c8cd0',\r\n '#2c8ccf',\r\n '#2d8cd0',\r\n '#2d8cd0',\r\n '#2c8bd0',\r\n '#2e8cd1',\r\n '#2e8cd1',\r\n '#2e8cd0',\r\n '#2e8cd1',\r\n '#2e8dd0',\r\n '#308ed0',\r\n '#318ed1',\r\n '#318dd1',\r\n '#308dd0',\r\n '#308dd0',\r\n '#318fd0',\r\n '#338fd1',\r\n '#328dd1',\r\n '#338ed1',\r\n '#348fd1',\r\n '#348fd2',\r\n '#338ed2',\r\n '#338ed1',\r\n '#348fd1',\r\n '#3590d1',\r\n '#368fd2',\r\n '#3690d1',\r\n '#3690d1',\r\n '#3690d2',\r\n '#3791d3',\r\n '#3791d3',\r\n '#3791d2',\r\n '#3790d2',\r\n '#3790d2',\r\n '#3892d2',\r\n '#3892d2',\r\n '#3992d2',\r\n '#3a92d3',\r\n '#3a93d3',\r\n '#3b92d3',\r\n '#3b92d3',\r\n '#3a93d3',\r\n '#3a93d3',\r\n '#3b93d3',\r\n '#3c94d3',\r\n '#3d94d3',\r\n '#3d94d3',\r\n '#3d94d3',\r\n '#3d93d3',\r\n '#3f93d4',\r\n '#3f96d4',\r\n '#3f96d4',\r\n '#3e95d3',\r\n '#3e96d3',\r\n '#3f96d4',\r\n '#4095d4',\r\n '#4095d4',\r\n '#3f96d4',\r\n '#3f96d4',\r\n '#4096d4',\r\n '#4297d4',\r\n '#4197d4',\r\n '#4096d3',\r\n '#4196d3',\r\n '#4397d5',\r\n '#4398d5',\r\n '#4397d5',\r\n '#4398d5',\r\n '#4398d5',\r\n '#4499d5',\r\n '#4499d5',\r\n '#4499d5',\r\n '#4499d5',\r\n '#459ad5',\r\n '#459ad4',\r\n '#459ad4',\r\n '#459ad4',\r\n '#459ad5',\r\n '#459ad6',\r\n '#469bd6',\r\n '#469bd5',\r\n '#469ad5',\r\n '#469ad5',\r\n '#479bd5',\r\n '#499cd6',\r\n '#499cd6',\r\n '#499cd5',\r\n '#499cd5',\r\n '#499cd6',\r\n '#4a9dd6',\r\n '#4a9fd6',\r\n '#4a9ed6',\r\n '#4a9ed5',\r\n '#4a9ed6',\r\n '#4b9ed7',\r\n '#4b9ed7',\r\n '#4b9fd7',\r\n '#4a9ed7',\r\n '#4b9ed7',\r\n '#4ca0d7',\r\n '#4c9ed7',\r\n '#4b9ed7',\r\n '#4c9fd7',\r\n '#4da0d7',\r\n '#4da0d8',\r\n '#4da0d8',\r\n '#4c9fd8',\r\n '#4c9fd7',\r\n '#4da0d7',\r\n '#4ea2d8',\r\n '#4ea2d8',\r\n '#4ea1d8',\r\n '#4ea2d7',\r\n '#4ea2d7',\r\n '#4ea2d8',\r\n '#4ea2d7',\r\n '#4ea2d7',\r\n '#4fa3d9',\r\n '#50a3d9',\r\n '#50a3d8',\r\n '#4fa2d8',\r\n '#4fa3d8',\r\n '#51a3d8',\r\n '#51a3d8',\r\n '#51a3d9',\r\n '#51a3d8',\r\n '#51a3d8',\r\n '#52a4d9',\r\n '#52a5da',\r\n '#52a4d9',\r\n '#52a4d9',\r\n '#52a5da',\r\n '#53a5da',\r\n '#53a5da',\r\n '#53a5da',\r\n '#54a5da',\r\n '#54a5da',\r\n '#54a6d9',\r\n '#54a7d9',\r\n '#54a6d9',\r\n '#54a7d9',\r\n '#55a8da',\r\n '#55a8da',\r\n '#56a8db',\r\n '#55a7da',\r\n '#56a8db',\r\n '#57a8db',\r\n '#56a7da',\r\n '#57a8db',\r\n '#57a8db',\r\n '#57a8db',\r\n '#58a9da',\r\n '#58aada',\r\n '#57a9da',\r\n '#57a8da',\r\n '#57a9da',\r\n '#58aadb',\r\n '#59aadb',\r\n '#59aadb',\r\n '#59aadc',\r\n '#59abdb',\r\n '#5aacdb',\r\n '#5aabdb',\r\n '#59abdb',\r\n '#5babdb',\r\n '#5babdc',\r\n '#5babdc',\r\n '#5aabdc',\r\n '#5baddc',\r\n '#5bacdc',\r\n '#5cacdc',\r\n '#5bacdc',\r\n '#5caedc',\r\n '#5caddc',\r\n '#5cacdc',\r\n '#5caddc',\r\n '#5dafdc',\r\n '#5dafdc',\r\n '#5caedc',\r\n '#5daedc',\r\n '#5eb0dd',\r\n '#5db0dd',\r\n '#5eafdd',\r\n '#5eafdd',\r\n '#5fb1dd',\r\n '#5fb1dd',\r\n '#5fafdd',\r\n '#5fafdd',\r\n '#60b1dd',\r\n '#60b1dd',\r\n '#60b1dd',\r\n '#60b1dd',\r\n '#60b1dd',\r\n '#61b1de',\r\n '#61b1de',\r\n '#61b1de',\r\n '#61b1de',\r\n '#61b2dd',\r\n '#61b2dd',\r\n '#62b2dd',\r\n '#62b2de',\r\n '#62b2de',\r\n '#62b2de',\r\n '#63b3dd',\r\n '#63b4de',\r\n '#63b4df',\r\n '#63b4df',\r\n '#63b3df',\r\n '#63b4de',\r\n '#63b4de',\r\n '#63b4df',\r\n '#63b5df',\r\n '#64b6df',\r\n '#64b6df',\r\n '#64b6df',\r\n '#64b5de',\r\n '#65b6e0',\r\n '#65b7e0',\r\n '#65b7df',\r\n '#65b6e0',\r\n '#65b6e0',\r\n '#65b6df',\r\n '#66b6df',\r\n '#67b7e0',\r\n '#67b8e0',\r\n '#66b8df',\r\n '#66b8e0',\r\n '#67b8df',\r\n '#67b7df',\r\n '#67b8e0',\r\n '#67b9e0',\r\n '#67b8e0',\r\n '#68b9e1',\r\n '#69bae1',\r\n '#69bae1',\r\n '#68b8e0',\r\n '#69b9e0',\r\n '#69bae0',\r\n '#69bae0',\r\n '#6abbe1',\r\n '#69bbe0',\r\n '#69bbe0',\r\n '#69bbe1',\r\n '#6abce1',\r\n '#6abbe0',\r\n '#6abbe0',\r\n '#6abbe1',\r\n '#6abce1',\r\n '#6abce2',\r\n '#6bbde2',\r\n '#6bbee1',\r\n '#6cbde2',\r\n '#6cbde2',\r\n '#6bbde1',\r\n '#6cbde1',\r\n '#6cbde2',\r\n '#6cbde2',\r\n '#6cbde2',\r\n '#6cbee2',\r\n '#6cbee2',\r\n '#6dbfe2',\r\n '#6dbfe2',\r\n '#6dbee2',\r\n '#6ebee3',\r\n '#6fbfe3',\r\n '#6fc0e3',\r\n '#6fc0e2',\r\n '#6ebfe3',\r\n '#6ec0e3',\r\n '#6ec1e3',\r\n '#6ec1e3',\r\n '#6ec1e4',\r\n '#6fc0e3',\r\n '#70c1e3',\r\n '#70c2e3',\r\n '#70c2e4',\r\n '#6fc1e3',\r\n '#6fc1e3',\r\n '#70c2e3',\r\n '#71c2e4',\r\n '#70c3e4',\r\n '#70c2e4',\r\n '#70c2e4',\r\n '#72c4e4',\r\n '#72c4e4',\r\n '#71c2e4',\r\n '#71c2e4',\r\n '#73c4e4',\r\n '#72c3e4',\r\n '#72c3e4',\r\n '#72c3e4',\r\n '#72c4e4',\r\n '#73c5e4',\r\n '#73c5e4',\r\n '#72c5e4',\r\n '#73c6e4',\r\n '#73c5e4',\r\n '#73c6e4',\r\n '#74c7e5',\r\n '#73c6e4',\r\n '#75c8e5',\r\n '#74c7e5',\r\n '#74c7e5',\r\n '#74c6e5',\r\n '#75c6e5',\r\n '#76c7e5',\r\n '#75c7e5',\r\n '#76c8e5',\r\n '#75c8e5',\r\n '#75c8e6',\r\n '#76c8e6',\r\n '#77c8e5',\r\n '#76c9e6',\r\n '#76c9e5',\r\n '#76c9e5',\r\n '#77cae6',\r\n '#77c9e6',\r\n '#77c9e6',\r\n '#77c9e6',\r\n '#78cae6',\r\n '#77cbe7',\r\n '#77cbe7',\r\n '#78cbe7',\r\n '#78cbe7',\r\n '#79cae6',\r\n '#78cae6',\r\n '#78cbe7',\r\n '#78cae6',\r\n '#79cae6',\r\n '#7acce6',\r\n '#7acde7',\r\n '#7acbe7',\r\n '#79cce6',\r\n '#79cee7',\r\n '#7acee8',\r\n '#7acde8',\r\n '#79cde7',\r\n '#7acde7',\r\n '#7bcee8',\r\n '#7acee7',\r\n '#7acfe7',\r\n '#7acee7',\r\n '#7ccee8',\r\n '#7bcee7',\r\n '#7bcfe7',\r\n '#7bcfe7',\r\n '#7bcfe8',\r\n '#7dd0e9',\r\n '#7dd0e9',\r\n '#7ccfe8',\r\n '#7ccfe8',\r\n '#7cd1e8',\r\n '#7cd1e8',\r\n '#7cd0e8',\r\n '#7cd0e8',\r\n '#7dd1e8',\r\n '#7dd2e9',\r\n '#7dd2e9',\r\n '#7ed2e9',\r\n '#7dd1e8',\r\n '#7dd2e8',\r\n '#7fd3ea',\r\n '#7fd3ea',\r\n '#7ed3e9',\r\n '#7ed2ea',\r\n '#80d2ea',\r\n '#7fd3e9',\r\n '#7fd2e9',\r\n '#80d4ea',\r\n '#80d5ea',\r\n '#7fd4e9',\r\n '#7fd4e9',\r\n '#80d4e9',\r\n '#81d6ea',\r\n '#81d6eb',\r\n '#80d4ea',\r\n '#80d5ea',\r\n '#80d6ea',\r\n '#80d5ea',\r\n '#81d6ea',\r\n '#81d6ea',\r\n '#82d6ea',\r\n '#82d7ea',\r\n '#82d8ea',\r\n '#81d6ea',\r\n '#81d6ea',\r\n '#82d8ea',\r\n '#82d7eb',\r\n '#82d8eb',\r\n '#82d8eb',\r\n '#82d7eb',\r\n '#83d9eb',\r\n '#84d9ec',\r\n '#84d9ec',\r\n '#83d8eb',\r\n '#83d8eb',\r\n '#85d8eb',\r\n '#85d9eb',\r\n '#84daeb',\r\n '#85daeb',\r\n '#85dbec',\r\n '#85dbec',\r\n '#84daec',\r\n '#85dbec',\r\n '#86dbec',\r\n '#86dbec',\r\n '#85dbec',\r\n '#85dbec',\r\n '#85dbec',\r\n '#85dcec',\r\n '#86ddec',\r\n '#86dceb',\r\n '#86dceb',\r\n '#87ddec',\r\n '#86dced',\r\n '#86dcec',\r\n '#86deec',\r\n '#86deed',\r\n '#87ddec',\r\n '#87deed',\r\n '#87dfec',\r\n '#87deec',\r\n '#88deed',\r\n '#89deec',\r\n '#88deec',\r\n '#88dfed',\r\n '#88dfec',\r\n '#89e0ed',\r\n '#89e0ee',\r\n '#88dfee',\r\n '#89e0ee',\r\n '#88dfed',\r\n '#88dfed',\r\n '#8ae1ee',\r\n '#89e1ed',\r\n '#8ae2ee',\r\n '#8ae2ee',\r\n '#8ae2ee',\r\n '#8ae1ee',\r\n '#8be3ee',\r\n '#8be3ee',\r\n '#8be2ee',\r\n '#8be2ee',\r\n '#8be2ef',\r\n '#8ce2ef',\r\n '#8ce3ef',\r\n '#8be3ee',\r\n '#8ce4ef',\r\n '#8be3ef',\r\n '#8be3ee',\r\n '#8de5ef',\r\n '#8de4ef',\r\n '#8de4ef',\r\n '#8de5ef',\r\n '#8ce4ef',\r\n '#8de4ef',\r\n '#8de4ef',\r\n '#8de4f0',\r\n '#8ee6f0',\r\n '#8ee6f0',\r\n '#8ee6ef',\r\n '#8ee6ef',\r\n '#8de7ef',\r\n '#8de6ef',\r\n '#8fe7f0',\r\n '#8fe8f1',\r\n '#8ee6ef',\r\n '#8ee6ef',\r\n '#8ee8f1',\r\n '#8fe8f1',\r\n '#8fe7f0',\r\n '#90e8f1',\r\n '#90e8f1',\r\n '#8fe8f0',\r\n '#90eaf1',\r\n '#8fe9f0',\r\n '#8fe9f0',\r\n '#90eaf1',\r\n '#90eaf1',\r\n '#91eaf1',\r\n '#91eaf1',\r\n '#91eaf1',\r\n '#92ebf2',\r\n '#91eaf1',\r\n ],\r\n nullColor: 'pink',\r\n}\r\n\r\nexport const gradients: Record = {\r\n [ScaleId.DayPerf]: redGreenGradient,\r\n _5: redGreenGradient,\r\n _10: redGreenGradient,\r\n _15: redGreenGradient,\r\n _20: redGreenGradient,\r\n _25: redGreenGradient,\r\n _relvol: blueGradient,\r\n _pe: greenRedGradient,\r\n _fpe: greenRedGradient,\r\n _peg: greenRedGradient,\r\n _ps: greenRedGradient,\r\n _pb: greenRedGradient,\r\n _div: greenGradient,\r\n _eps5y: redGreenGradient,\r\n _short: redGradient,\r\n _rec: redGreenGradient,\r\n _earndate: earningsGradient,\r\n _portfolioPct: redGreenGradient,\r\n _portfolioUsd: redGreenGradient,\r\n}\r\n\r\nexport const bubbleGradients: Record = {\r\n [ScaleId.DayPerf]: redGreenGradientBubbles,\r\n _5: redGreenGradientBubbles,\r\n _10: redGreenGradientBubbles,\r\n _15: redGreenGradientBubbles,\r\n _20: redGreenGradientBubbles,\r\n _25: redGreenGradientBubbles,\r\n _relvol: blueGradientBubbles,\r\n _pe: redGreenGradientBubbles,\r\n _fpe: redGreenGradientBubbles,\r\n _peg: redGreenGradientBubbles,\r\n _ps: redGreenGradientBubbles,\r\n _pb: redGreenGradientBubbles,\r\n _div: redGreenGradientBubbles,\r\n _eps5y: redGreenGradientBubbles,\r\n _short: redGreenGradientBubbles, // TODO red skala\r\n _rec: redGreenGradientBubbles,\r\n _earndate: redGreenGradientBubbles,\r\n _portfolioPct: redGreenGradientBubbles,\r\n _portfolioUsd: redGreenGradientBubbles,\r\n}\r\n\r\nexport const gradientSmall = redGreenGradientSmall\r\n","/**\r\n * Load image before we can render it in canvas\r\n */\r\nexport function loadImage(src: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n var image = new Image()\r\n\r\n image.onload = function () {\r\n resolve(image)\r\n }\r\n\r\n image.onerror = function () {\r\n reject()\r\n }\r\n\r\n image.src = src\r\n })\r\n}\r\n","export function getScaleRatio() {\r\n return window.devicePixelRatio ?? 1\r\n}\r\n\r\nexport function retinafy(\r\n canvas: HTMLCanvasElement | undefined | null,\r\n context: CanvasRenderingContext2D | undefined,\r\n width: number,\r\n height: number\r\n) {\r\n if (!canvas || !context) return\r\n\r\n const ratio = getScaleRatio()\r\n\r\n canvas.width = width * ratio\r\n canvas.height = height * ratio\r\n canvas.style.width = width + 'px'\r\n canvas.style.height = height + 'px'\r\n context.scale(ratio, ratio)\r\n\r\n return ratio\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef } from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\nexport enum ColorVariant {\r\n violet = 'violet',\r\n emerald = 'emerald',\r\n orange = 'orange',\r\n teal = 'teal',\r\n pink = 'pink',\r\n lime = 'lime',\r\n purple = 'purple',\r\n green = 'green',\r\n yellow = 'yellow',\r\n blue = 'blue',\r\n red = 'red',\r\n gray = 'gray',\r\n default = 'default',\r\n}\r\n\r\nexport enum CheckboxSize {\r\n none = '', // Do not set fixed size\r\n small = 'min-h-6 text-2xs', // 24px\r\n regular = 'min-h-7 text-sm', // 28px\r\n}\r\nexport type CheckboxSizeType = keyof typeof CheckboxSize\r\n\r\ninterface CheckboxProps extends Omit, 'label' | 'size'> {\r\n /**\r\n * Text that gets displayed on the right side of the checkbox\r\n */\r\n label?: ReactNode\r\n\r\n checked: boolean\r\n\r\n /**\r\n * Size of the checkbox\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: CheckboxSizeType\r\n\r\n /**\r\n * Color of the checkbox\r\n *\r\n * @default \"default\"\r\n */\r\n color?: ColorVariant\r\n}\r\n\r\nfunction CheckboxComponent(\r\n {\r\n className,\r\n label,\r\n size = 'regular',\r\n color = ColorVariant.default,\r\n children,\r\n ...props\r\n }: PropsWithChildren,\r\n ref: ForwardedRef\r\n) {\r\n const checked = props.checked ?? props.defaultChecked\r\n\r\n return (\r\n \r\n
\r\n \r\n {checked && (\r\n \r\n )}\r\n
\r\n {label ?? children}\r\n \r\n )\r\n}\r\n\r\nexport const Checkbox = forwardRef(CheckboxComponent)\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren, memo, useCallback, useLayoutEffect, useRef, useState } from 'react'\r\n\r\nexport interface Interaction {\r\n left: number\r\n top: number\r\n}\r\n\r\n/**\r\n * Clamp value between two bounds\r\n */\r\nfunction clamp(num: number, min = 0, max = 1) {\r\n return num > max ? max : num < min ? min : num\r\n}\r\n\r\n/**\r\n * Check if an event was triggered by touch\r\n */\r\nfunction isTouch(event: MouseEvent | TouchEvent): event is TouchEvent {\r\n return 'touches' in event\r\n}\r\n\r\n/**\r\n * Returns a relative position of the pointer inside the node's bounding box\r\n */\r\nfunction getRelativePosition(node: HTMLDivElement, event: MouseEvent | TouchEvent): Interaction {\r\n const rect = node.getBoundingClientRect()\r\n\r\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\r\n const pointer = isTouch(event) ? event.touches[0] : (event as MouseEvent)\r\n\r\n return {\r\n left: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\r\n top: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height),\r\n }\r\n}\r\n\r\n/**\r\n * Browsers introduced an intervention, making touch events passive by default.\r\n * This workaround removes `preventDefault` call from the touch handlers.\r\n * @see https://github.com/facebook/react/issues/19651\r\n */\r\nfunction preventDefaultMove(event: MouseEvent | TouchEvent) {\r\n !isTouch(event) && event.preventDefault()\r\n}\r\n\r\ninterface Props {\r\n onMove: (interaction: Interaction) => void\r\n onKey: (offset: Interaction) => void\r\n}\r\n\r\nfunction DraggablePickerComponent({\r\n onMove,\r\n onKey,\r\n className,\r\n ...props\r\n}: PropsWithChildren & HTMLProps) {\r\n const container = useRef(null)\r\n const hasTouched = useRef(false)\r\n const [isDragging, setDragging] = useState(false)\r\n\r\n /**\r\n * Prevent mobile browsers from handling mouse events (conflicting with touch ones).\r\n * If we detected a touch interaction before, we prefer reacting to touch events only.\r\n */\r\n const isValid = useRef((event: MouseEvent | TouchEvent): boolean => {\r\n if (hasTouched.current && !isTouch(event)) return false\r\n if (!hasTouched.current) hasTouched.current = isTouch(event)\r\n return true\r\n })\r\n\r\n const handleMove = useCallback(\r\n (event: MouseEvent | TouchEvent) => {\r\n preventDefaultMove(event)\r\n\r\n // If user moves the pointer outside of the window or iframe bounds and release it there,\r\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\r\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\r\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\r\n // without pressing it down\r\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0\r\n\r\n if (isDown && container.current) {\r\n onMove(getRelativePosition(container.current, event))\r\n } else {\r\n setDragging(false)\r\n }\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleMoveStart = useCallback(\r\n ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\r\n preventDefaultMove(nativeEvent)\r\n\r\n if (!isValid.current(nativeEvent)) return\r\n\r\n // The node/ref must actually exist when user start an interaction.\r\n // We won't suppress the ESLint warning though, as it should probably be something to be aware of.\r\n onMove(getRelativePosition(container.current!, nativeEvent))\r\n setDragging(true)\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const keyCode = event.which || event.keyCode\r\n\r\n // Ignore all keys except arrow ones\r\n if (keyCode < 37 || keyCode > 40) return\r\n // Do not scroll page by arrow keys when document is focused on the element\r\n event.preventDefault()\r\n // Send relative offset to the parent component.\r\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\r\n // to reduce the size of the library\r\n onKey({\r\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\r\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\r\n })\r\n },\r\n [onKey]\r\n )\r\n\r\n const handleMoveEnd = useCallback(() => setDragging(false), [])\r\n\r\n const toggleDocumentEvents = useCallback(\r\n (state) => {\r\n // add or remove additional pointer event listeners\r\n const toggleEvent = state ? window.addEventListener : window.removeEventListener\r\n toggleEvent(hasTouched.current ? 'touchmove' : 'mousemove', handleMove)\r\n toggleEvent(hasTouched.current ? 'touchend' : 'mouseup', handleMoveEnd)\r\n },\r\n [handleMove, handleMoveEnd]\r\n )\r\n\r\n useLayoutEffect(() => {\r\n toggleDocumentEvents(isDragging)\r\n return () => {\r\n isDragging && toggleDocumentEvents(false)\r\n }\r\n }, [isDragging, toggleDocumentEvents])\r\n\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport const DraggablePicker = memo(DraggablePickerComponent)\r\n","interface PointerProps {\r\n className?: string\r\n top?: number\r\n left: number\r\n color: string\r\n}\r\n\r\nexport function Pointer({ color, left, top = 0.5 }: PointerProps) {\r\n return (\r\n \r\n
\r\n
\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `app/utils/colors.ts` in charts repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string) {\r\n const isRgb = getIsRgb(strColor)\r\n\r\n if (isRgb) {\r\n return rgbaToHexString(rgbaStringToObject(strColor), true)\r\n }\r\n\r\n return strColor\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Alpha({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, a: 1 - pos.left }), [onChange, color])\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ ...color, a: 1 })\r\n const gradientTo = hsvaToHEXString({ ...color, a: 0 }, true)\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n // Don’t recalculate when alpha changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [color.h, color.s, color.v])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { Icon } from '../icon'\r\nimport { HSVA, hexStringToHSVA } from './util'\r\n\r\nconst DEFAULT_COLORS = [\r\n { title: 'Rose', value: '#f43f5e' },\r\n { title: 'Pink', value: '#db2777' },\r\n { title: 'Fuchsia', value: '#c026d3' },\r\n { title: 'Purple', value: '#9333ea' },\r\n { title: 'Violet', value: '#7c3aed' },\r\n { title: 'Indigo', value: '#4f46e5' },\r\n { title: 'Blue', value: '#2563eb' },\r\n { title: 'Light Blue', value: '#0284c7' },\r\n { title: 'Cyan', value: '#0891b2' },\r\n { title: 'Teal', value: '#0d9488' },\r\n { title: 'Emerald', value: '#059669' },\r\n { title: 'Green', value: '#16a34a' },\r\n { title: 'Lime', value: '#65a30d' },\r\n { title: 'Yellow', value: '#eab308' },\r\n { title: 'Amber', value: '#d97706' },\r\n { title: 'Red', value: '#dc2626' },\r\n]\r\n\r\ninterface ColorItem {\r\n /**\r\n * Name of the color\r\n */\r\n title: string\r\n\r\n /**\r\n * Hex value\r\n */\r\n value: string\r\n}\r\n\r\ninterface ColorPaletteProps {\r\n /**\r\n * Current selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * List of colors to display in the palette\r\n *\r\n * @default DEFAULT_COLORS\r\n */\r\n colors?: ColorItem[]\r\n\r\n /**\r\n * Callback when user picks a color\r\n */\r\n onChange: (color: string, originalColor: HSVA) => void\r\n}\r\n\r\nexport function ColorPalette({ color, colors = DEFAULT_COLORS, onChange }: ColorPaletteProps) {\r\n const lowerCaseColor = color.toLowerCase()\r\n\r\n return (\r\n
\r\n {colors.map((colorObj) => {\r\n const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n return (\r\n onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n >\r\n {isSelected && }\r\n
\r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface HueSaturationProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nfunction getPositionFromHSLA(color: HSVA) {\r\n return {\r\n left: color.h / 360,\r\n top: 1 - color.s,\r\n }\r\n}\r\n\r\nexport function HueSaturation({ color, onChange }: HueSaturationProps) {\r\n const position = useMemo(() => getPositionFromHSLA(color), [color])\r\n\r\n const colorPreview = useMemo(() => hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 }), [color.h, color.s])\r\n\r\n const changeSaturation = useCallback(\r\n (pos: Interaction) =>\r\n onChange({\r\n h: Math.round(pos.left * 360),\r\n s: 1 - pos.top,\r\n v: 1,\r\n a: color.a,\r\n }),\r\n [color.a, onChange]\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","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Lightness({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, v: 1 - pos.left }), [onChange, color])\r\n\r\n const colorPreview = useMemo(\r\n () => hsvaToHEXString({ h: color.h, s: color.s, v: color.v, a: 1 }),\r\n [color.h, color.s, color.v]\r\n )\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 })\r\n const gradientTo = hsvaToHEXString({ h: color.h, s: color.s, v: 0, a: 1 })\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n }, [color.h, color.s])\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 from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { getIsColorTooLightOrTransparent, hexStringToRGBA } from './util'\r\n\r\ninterface ColorPreviewProps {\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * One or more colors to show in the preview\r\n */\r\n color: string | string[]\r\n\r\n /**\r\n * Wrapper classname\r\n */\r\n className?: string\r\n}\r\n\r\nexport function ColorPreview({ icon, color, className }: ColorPreviewProps) {\r\n const colors = Array.isArray(color) ? color : [color]\r\n const isTooLight = getIsColorTooLightOrTransparent(hexStringToRGBA(colors[0]))\r\n return (\r\n \r\n {icon && (\r\n
\r\n {isValidIconName(icon) ? (\r\n \r\n ) : (\r\n icon\r\n )}\r\n
\r\n )}\r\n {colors.map((color, index) => (\r\n //   has to be there because of a bug on safari which ignores h-full when empty element\r\n
\r\n  \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ForwardedRef, useCallback, useEffect, useState } from 'react'\r\n\r\nimport { Input, InputComponentProps } from '../input'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPickerProps } from './picker'\r\nimport * as colorUtil from './util'\r\n\r\ninterface PickerInputProps extends Omit {\r\n color: ColorPickerProps['color']\r\n onChange: ColorPickerProps['onChange']\r\n\r\n /*\r\n * Is color preview square visible\r\n *\r\n * @default true\r\n * */\r\n hasColorPreview?: boolean\r\n}\r\nexport const PickerInput = React.forwardRef(\r\n (\r\n { color, inputClass, hasColorPreview = true, onChange, ...props }: PickerInputProps,\r\n ref: ForwardedRef\r\n ) => {\r\n const [colorInput, setColorInput] = useState(colorUtil.removeHashSymbol(color))\r\n const isRgba = colorUtil.getIsRgb(colorInput)\r\n\r\n useEffect(() => {\r\n setColorInput(colorUtil.removeHashSymbol(color))\r\n }, [color])\r\n\r\n const handleColorInputChange = useCallback(\r\n (event) => {\r\n const value = colorUtil.removeHashSymbol(event.currentTarget.value)\r\n const isRgba = value.startsWith('rgba')\r\n const colorValue = isRgba ? value : `#${value}`\r\n\r\n setColorInput(value)\r\n if ((value.length >= 6 || (isRgba && value.length >= 16)) && colorUtil.isValidColor(colorValue)) {\r\n onChange(colorValue, colorUtil.hexStringToHSVA(colorValue))\r\n }\r\n },\r\n [onChange]\r\n )\r\n return (\r\n \r\n {hasColorPreview && (\r\n
\r\n \r\n
\r\n )}\r\n {!isRgba && #}\r\n
\r\n }\r\n onChange={handleColorInputChange}\r\n />\r\n )\r\n }\r\n)\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button } from '../button'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Alpha } from './alpha'\r\nimport { ColorPalette } from './color-palette'\r\nimport { HueSaturation } from './hue-saturation'\r\nimport { Lightness } from './lightness'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\nexport interface ColorPickerProps {\r\n /**\r\n * The selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * Whether or not the user is able to select custom color\r\n *\r\n * @default true\r\n */\r\n canSelectCustom?: boolean\r\n\r\n /**\r\n * Whether or not the user is able to change alpha channel. Only applicable\r\n * when `canSelectCustom` is true\r\n *\r\n * @default true\r\n */\r\n canSelectAlpha?: boolean\r\n\r\n /**\r\n * Sets the output format for the color picker\r\n *\r\n * @default 'hex'\r\n */\r\n outputFormat?: 'hex' | 'rgba'\r\n\r\n /**\r\n * Callback when user changes color. Use the second parameter to do color space\r\n * conversions otherwise the color could differ due to rounding\r\n */\r\n onChange: (color: string, originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Callback when user clicks on a palette item. Used to close popover\r\n */\r\n onPaletteItemClick?: () => void\r\n}\r\n\r\nexport function ColorPicker({\r\n color,\r\n canSelectCustom = true,\r\n canSelectAlpha = true,\r\n outputFormat = 'hex',\r\n onChange,\r\n onPaletteItemClick,\r\n}: ColorPickerProps) {\r\n const cachedColor = useRef(color)\r\n const [hsvaColor, setColor] = useState(colorUtil.getHSVAFromColor(color))\r\n const popover = Ariakit.usePopoverContext()\r\n const input = popover?.useState('disclosureElement')\r\n\r\n /**\r\n * Update state if the color from outside changed\r\n */\r\n useEffect(() => {\r\n const currentColor = colorUtil.removeHashSymbol(cachedColor.current)\r\n const newColor = colorUtil.removeHashSymbol(color)\r\n\r\n if (currentColor === newColor || !colorUtil.isValidColor(newColor)) return\r\n\r\n cachedColor.current = color\r\n setColor(colorUtil.getHSVAFromColor(color))\r\n }, [color])\r\n\r\n /**\r\n * Handle color change\r\n * 1. update cache so we can correctly check when outside color updates\r\n * 2. Update internal color representation\r\n * 3. call onChange with string color\r\n */\r\n const onChangeCallback = useCallback(\r\n (color: colorUtil.HSVA) => {\r\n const stringColor = colorUtil.stringifyHSVAColor(color, outputFormat, canSelectAlpha)\r\n cachedColor.current = stringColor\r\n onChange(stringColor, color)\r\n setColor(color)\r\n },\r\n [onChange, canSelectAlpha, outputFormat]\r\n )\r\n\r\n const onSetCustomCodeClick = useCallback(() => {\r\n const value = prompt('Enter a color code')?.trim()\r\n\r\n if (!value) return\r\n\r\n const isValid = colorUtil.isValidColor(value)\r\n\r\n if (!isValid) {\r\n return alert('The code is not a valid color')\r\n }\r\n\r\n onChangeCallback(colorUtil.getHSVAFromColor(value))\r\n }, [onChangeCallback])\r\n\r\n return (\r\n
\r\n {canSelectCustom && (\r\n <>\r\n {isMobile() && (\r\n \r\n )}\r\n \r\n \r\n\r\n {canSelectAlpha && }\r\n \r\n )}\r\n\r\n \r\n {\r\n input?.focus({ preventScroll: true })\r\n onPaletteItemClick?.()\r\n onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n }}\r\n />\r\n
\r\n \r\n )\r\n}\r\n\r\ninterface InputColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for the input\r\n */\r\n label?: ReactNode\r\n inputDataTestId?: string\r\n}\r\n\r\nexport function InputColorPicker({ label, inputDataTestId, onChange, ...props }: InputColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const canSelectCustom = props.canSelectCustom !== false\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n \r\n }\r\n />\r\n \r\n \r\n {\r\n if (canSelectCustom) return\r\n popoverState.hide()\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button, ButtonComponentProps, ButtonRounding, ButtonSizeType } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { IconNameType } from '../icon'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPicker, ColorPickerProps } from './picker'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\ninterface MultiColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n}\r\n\r\nexport function MultiColorPicker({\r\n colorInputLabel,\r\n onChange,\r\n canSelectCustom = true,\r\n ...props\r\n}: MultiColorPickerProps) {\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n {canSelectCustom && !isMobileDevice && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n {}} />\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ColorTabButtonProps extends ButtonComponentProps {\r\n /*\r\n * Preview color\r\n * */\r\n color: string\r\n}\r\n\r\nexport function ColorTabButton({ color, children, ...props }: ColorTabButtonProps) {\r\n return (\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps\r\n extends Omit {\r\n /**\r\n * Temporary prop to enable/disable multi picker funcionality,\r\n * in the future we'll only use secondaryColor prop to decide if the picker is multi picker or not\r\n *\r\n * @default undefined\r\n */\r\n isMultiPicker?: boolean\r\n\r\n /**\r\n * Button classname\r\n */\r\n className?: string\r\n\r\n /**\r\n * Array of objects with color and value\r\n */\r\n colors: ColorType[]\r\n\r\n /**\r\n * Color onchange callback\r\n */\r\n onChange: (colors: ColorType[], originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Button size\r\n *\r\n * @default undefined\r\n */\r\n size?: ButtonSizeType\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Identifier for e2e testing\r\n *\r\n * @default undefined\r\n */\r\n buttonPickerDataTestId?: string\r\n}\r\n\r\nexport function ButtonColorPicker({\r\n size,\r\n icon,\r\n colors,\r\n className,\r\n onChange,\r\n buttonPickerDataTestId,\r\n ...props\r\n}: ButtonColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const isOpen = popoverState.useState('open')\r\n const isMultiPicker = !!props.isMultiPicker && colors.length > 1\r\n const [activeColorIndex, setActiveColorIndex] = React.useState(0)\r\n const handleColorChange = React.useCallback(\r\n (color: string, originalColor: colorUtil.HSVA) => {\r\n onChange(\r\n colors.map((colorObject, index) => (index === activeColorIndex ? { ...colorObject, color } : colorObject)),\r\n originalColor\r\n )\r\n },\r\n [activeColorIndex, colors, onChange]\r\n )\r\n return (\r\n <>\r\n \r\n color)}\r\n className={classnames('h-full w-full', ButtonRounding.small)}\r\n />\r\n \r\n \r\n {isMultiPicker && (\r\n
\r\n \r\n {colors.map(({ color, label }, index) => (\r\n setActiveColorIndex(index)}\r\n >\r\n {label}\r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n
\r\n \r\n )\r\n}\r\n","import copy from 'copy-to-clipboard'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { InputProps, Textarea } from '../input'\r\n\r\ninterface Props extends Pick {\r\n className?: string\r\n text: string\r\n bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC = ({ className, label, text, bottomLeftContent }) => {\r\n const [isCopied, setIsCopied] = React.useState(false)\r\n\r\n const handleCopyToClipboard = React.useCallback(() => {\r\n setIsCopied(true)\r\n copy(text)\r\n }, [text])\r\n\r\n React.useEffect(() => {\r\n let timeout: number\r\n const resetTimer = () => {\r\n if (!timeout) return\r\n clearTimeout(timeout)\r\n }\r\n if (isCopied) {\r\n resetTimer()\r\n timeout = window.setTimeout(() => {\r\n setIsCopied(false)\r\n }, 2000)\r\n }\r\n\r\n return () => {\r\n resetTimer()\r\n }\r\n }, [isCopied])\r\n\r\n return (\r\n
\r\n e.currentTarget.select()}\r\n inputClass=\"h-12\"\r\n data-testid=\"copy-to-clipboard-textarea\"\r\n value={text}\r\n />\r\n
\r\n {bottomLeftContent &&
{bottomLeftContent}
}\r\n \r\n {isCopied ? 'Copied' : 'Copy'}\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\nexport type SVGProps = React.SVGProps\r\n\r\nexport function SVG({ className, width = 16, height = width, ...props }: SVGProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { DropdownStateReturn } from '../components/dropdown'\r\nimport { PopoverStateReturn } from '../components/toolbar/popover/hooks'\r\nimport { useWindowSize } from './use-window-size'\r\n\r\ntype Props = {\r\n maxHeightLimit: number\r\n hasViewportHeightLimit: boolean\r\n offsets: [number, number]\r\n state: DropdownStateReturn | PopoverStateReturn\r\n}\r\n\r\nconst MAX_HEIGHT_PROPERTY = '--popover-max-height'\r\nconst POPOVER_HEIGHT_LIMIT_STYLE = {\r\n maxHeight: `calc(var(${MAX_HEIGHT_PROPERTY}) - env(safe-area-inset-bottom))`,\r\n}\r\n\r\n/**\r\n * Limit popover height to be always in viewport is `hasViewportHeightLimit` is true\r\n */\r\nexport function usePopoverMaxHeight({ maxHeightLimit, hasViewportHeightLimit, offsets, state }: Props) {\r\n const { innerHeight } = useWindowSize({ isWatching: state.visible || state.animating })\r\n const buttonElement = state.unstable_referenceRef.current\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !hasViewportHeightLimit) return\r\n\r\n // calculate height\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const [, offsetY] = offsets\r\n let elementMaxHeight = 'auto'\r\n if (state.placement.startsWith('bottom')) {\r\n let height = innerHeight - buttonRect.bottom - offsetY * 2\r\n // when used on pages where is scrollable content, buttonRect.bottom is sometimes negative\r\n // in that case we need to subtract window.scrollY\r\n if (buttonRect.bottom < 0) height -= window.scrollY\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n } else {\r\n const height = buttonRect.top - offsetY * 2\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n }\r\n\r\n // set height\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n popoverWrapper?.style.setProperty(MAX_HEIGHT_PROPERTY, elementMaxHeight)\r\n }, [buttonElement, innerHeight, maxHeightLimit, hasViewportHeightLimit, offsets, state.placement, state.visible])\r\n\r\n return hasViewportHeightLimit ? POPOVER_HEIGHT_LIMIT_STYLE : undefined\r\n}\r\n","import * as React from 'react'\r\nimport { usePopper } from 'react-popper'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { Button } from '../button'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { Dropdown, DropdownItem, DropdownSeparator, useDropdownState } from '../dropdown'\r\nimport { ObjectHash } from '../types'\r\n\r\nconst DEFAULT_OFFSETS: [number, number] = [5, 5]\r\n\r\nfunction getVirtualRef(top: number, left: number) {\r\n return {\r\n getBoundingClientRect(): DOMRect {\r\n const rect = {\r\n top: top - window.scrollY,\r\n x: top - window.scrollY,\r\n left: left - window.scrollX,\r\n y: left - window.scrollX,\r\n bottom: top,\r\n right: left,\r\n width: 0,\r\n height: 0,\r\n }\r\n\r\n return {\r\n ...rect,\r\n toJSON: () => rect,\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport interface IContextMenuOption {\r\n type?: never\r\n id: string\r\n label: React.ReactNode\r\n onClick?: () => void\r\n options?: ContextMenuItem[]\r\n gtag?: ObjectHash\r\n}\r\n\r\ninterface IContextMenuDivider {\r\n type: 'divider'\r\n label?: React.ReactNode\r\n}\r\n\r\nexport type ContextMenuItem = IContextMenuOption | IContextMenuDivider\r\n\r\ninterface ContextMenuProps {\r\n /**\r\n * Top coordinate of the click\r\n */\r\n top: number\r\n\r\n /**\r\n * Left coordinate of the click\r\n */\r\n left: number\r\n\r\n /**\r\n * Can limit the max height of the menu\r\n *\r\n * @default undefined\r\n */\r\n menuMaxHeight?: number\r\n\r\n /**\r\n * Items visible in the menu\r\n */\r\n items: ContextMenuItem[]\r\n\r\n /**\r\n * Callback to hide the menu\r\n */\r\n hide: () => void\r\n}\r\n\r\nexport function ContextMenu({ top, left, menuMaxHeight, hide, items }: ContextMenuProps) {\r\n const [popperElement, setPopperElement] = React.useState(null)\r\n const virtualRef = React.useMemo(() => getVirtualRef(top, left), [left, top])\r\n const dropdownState = useDropdownState({ placement: 'bottom-start' })\r\n const { isFullyClosed } = getExtendedDialogState(dropdownState)\r\n const hasBeenOpen = React.useRef(false)\r\n\r\n const { styles, attributes } = usePopper(virtualRef, popperElement, {\r\n placement: 'auto-end',\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: DEFAULT_OFFSETS,\r\n },\r\n },\r\n ],\r\n })\r\n\r\n /**\r\n * This effect handles closing the context menu (parent element) itself\r\n */\r\n React.useEffect(() => {\r\n if (isFullyClosed && hasBeenOpen.current) hide()\r\n }, [isFullyClosed, hide])\r\n\r\n /**\r\n * This effect handles opening/closing the inner dropdown\r\n */\r\n React.useEffect(() => {\r\n dropdownState.show()\r\n hasBeenOpen.current = true // This acts as a way to differentiate the first render\r\n\r\n return () => dropdownState.hide()\r\n // This needs to run only on mount/unmount for obvious reasons\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n \r\n }\r\n menuMaxHeight={menuMaxHeight}\r\n state={dropdownState}\r\n items={items}\r\n isStatic\r\n />\r\n \r\n )\r\n}\r\n\r\ninterface ContextMenuInnerProps {\r\n label: JSX.Element\r\n items: ContextMenuItem[]\r\n state: ReturnType\r\n isStatic?: boolean\r\n menuMaxHeight?: number\r\n}\r\n\r\nfunction ContextMenuInner(\r\n { label, items, state, isStatic, menuMaxHeight = Number.MAX_SAFE_INTEGER }: ContextMenuInnerProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const innerState = useDropdownState({ placement: 'right-start' })\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: menuMaxHeight,\r\n hasViewportHeightLimit: true,\r\n offsets: DEFAULT_OFFSETS,\r\n state,\r\n })\r\n\r\n return (\r\n \r\n {items.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return {item.label}\r\n }\r\n\r\n if (item?.options !== undefined) {\r\n return (\r\n \r\n {item.label}\r\n \r\n }\r\n items={item.options}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n {\r\n item.onClick?.()\r\n window.gtag?.('event', 'context-menu', Object.assign({ menu_option: item.id }, item.gtag))\r\n }}\r\n data-testid={`dropdown-menu-${item.id}`}\r\n className=\"shrink-0\"\r\n >\r\n {item.label}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nconst ContextMenuDropdown = React.forwardRef(ContextMenuInner)\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\ninterface GridLayoutProps extends React.HTMLProps {\r\n /**\r\n * Number of columns\r\n */\r\n columns?: number\r\n\r\n /**\r\n * Number of rows\r\n */\r\n rows?: number\r\n\r\n /**\r\n * Whether or not a border is rendered between and around items. eg. charts\r\n * on HP won’t have a border\r\n *\r\n * @default false\r\n */\r\n border?: boolean\r\n}\r\n\r\nexport const ChartGridCell = React.forwardRef(\r\n ({ children, gridArea, className, ...props }, ref) => (\r\n \r\n {children}\r\n \r\n )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps {\r\n /**\r\n * Css grid-area value\r\n */\r\n gridArea?: string\r\n}\r\n\r\nexport function GridLayout({ columns = 1, rows = 1, border = false, children, className, ...props }: GridLayoutProps) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface ChartGridProps extends GridLayoutProps {\r\n isResizable?: boolean\r\n}\r\n\r\nexport const ChartGrid: React.FC = (props) => \r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor = (data) => data\r\n\r\nconst DEFAULT_VALUE_KEY = 'value'\r\nconst DEFAULT_CHANGE_KEY = 'onChange'\r\n\r\ntype ValueAccessor<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters[ChangeKey]>) => React.ComponentProps[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps,\r\n ChangeKey extends keyof React.ComponentProps,\r\n> = RequireByKey, 'as'> & {\r\n valueKey?: ValueKey\r\n changeKey?: ChangeKey\r\n valueAccessor?: ValueAccessor\r\n}\r\n\r\nexport function InnerState<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n>({\r\n as: asComponent,\r\n valueKey = 'value' as ValueKey,\r\n changeKey = 'onChange' as ChangeKey,\r\n valueAccessor = defaultValueAccessor,\r\n ...props\r\n}: InnerStateProps) {\r\n const { [valueKey]: value, [changeKey]: onChange } = props\r\n const [state, setState] = React.useState[ValueKey]>(value)\r\n\r\n const handleChange = React.useCallback>(\r\n (...args) => {\r\n setState(valueAccessor(...args))\r\n onChange(...args)\r\n },\r\n [onChange, valueAccessor]\r\n )\r\n\r\n return React.createElement(asComponent, {\r\n ...props,\r\n [valueKey]: state,\r\n [changeKey]: handleChange,\r\n })\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { SelectItem } from '../select'\r\nimport { PopoverStateReturn } from '../toolbar/popover/hooks'\r\n\r\nexport const ListContext = React.createContext(null)\r\n\r\nexport function useListState(options?: Reakit.CompositeInitialState) {\r\n return Reakit.useCompositeState({ ...options, loop: true, unstable_virtual: true })\r\n}\r\n\r\nfunction getSelectedItemIndex(items: SelectItem[], value: unknown) {\r\n if (!value && value !== 0) return -1\r\n\r\n return items.findIndex((item) => item.value === value)\r\n}\r\n\r\n/**\r\n * Hook which handles select state and returns onChange handler\r\n */\r\nexport function useList>(\r\n state: PopoverStateReturn,\r\n defaultValue: ValueType | undefined,\r\n items: ItemType[],\r\n onChange: (item: ItemType) => void\r\n) {\r\n const [selectedIndex, setSelectedIndex] = React.useState(getSelectedItemIndex(items, defaultValue))\r\n const closePopover = React.useRef(() => state.hide())\r\n\r\n // Update select value on change from outside\r\n React.useEffect(() => {\r\n const newIndex = getSelectedItemIndex(items, defaultValue)\r\n setSelectedIndex(newIndex)\r\n }, [items, selectedIndex, defaultValue])\r\n\r\n const onItemChange = React.useCallback(\r\n (index: number, closeOnSelect = true) => {\r\n const selectedItem = items[index]\r\n setSelectedIndex(index)\r\n\r\n if (closeOnSelect) closePopover.current()\r\n onChange(selectedItem)\r\n },\r\n [items, onChange, setSelectedIndex]\r\n )\r\n\r\n return { selectedIndex, onItemChange }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps, ButtonTheme } from '../button'\r\nimport { ListContext } from './hooks'\r\n\r\nexport interface ListItemProps {\r\n /**\r\n * Theme when the button is selected\r\n */\r\n activeTheme?: keyof typeof ButtonTheme\r\n\r\n /**\r\n * Close parent popover when the item is clicked\r\n */\r\n closeOnSelect?: boolean\r\n\r\n /**\r\n * OnChange callback when item is clicked or navigated to\r\n * @private\r\n */\r\n onSelectItem?: (item: string, closeOnSelect?: boolean) => void\r\n}\r\n\r\nexport function ListItem({\r\n as,\r\n activeTheme = 'blue',\r\n onSelectItem,\r\n onClick,\r\n onKeyPress,\r\n className,\r\n closeOnSelect = true,\r\n children,\r\n ...props\r\n}: React.PropsWithChildren & ButtonComponentProps) {\r\n const state = React.useContext(ListContext)\r\n\r\n return (\r\n {\r\n onClick?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n onKeyPress={(ev) => {\r\n onKeyPress?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n >\r\n {(itemProps: ButtonComponentProps) => {\r\n const active = Boolean(itemProps['aria-selected'])\r\n\r\n return (\r\n \r\n {children}\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\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { ListContext } from './hooks'\r\nimport { ListItem } from './list-item'\r\n\r\nexport enum ListDirection {\r\n row,\r\n column,\r\n}\r\n\r\nexport interface ListProps extends Omit {\r\n /**\r\n * The returned object from `useListState`\r\n */\r\n state: Reakit.CompositeStateReturn\r\n\r\n /**\r\n * The selected option\r\n */\r\n selectedIndex?: number\r\n\r\n /**\r\n * Callback when selected option index changes\r\n */\r\n onChange?: (selectedIndex: number, closeParent?: boolean) => void\r\n\r\n /**\r\n * Direction to render items\r\n * @default col\r\n */\r\n direction?: keyof typeof ListDirection\r\n\r\n /**\r\n * Whether or not default styles should be included for the list\r\n * @default true\r\n */\r\n includeBaseStyles?: boolean\r\n}\r\n\r\nexport function List({\r\n state,\r\n selectedIndex,\r\n direction = 'column',\r\n includeBaseStyles = true,\r\n onChange,\r\n children,\r\n ...props\r\n}: ListProps) {\r\n const prevSelected = React.useRef(null)\r\n\r\n // Select option when `selectedIndex` changes\r\n React.useEffect(() => {\r\n if (\r\n selectedIndex !== undefined &&\r\n selectedIndex >= 0 &&\r\n prevSelected.current !== selectedIndex &&\r\n state.items.length > selectedIndex\r\n ) {\r\n state.move(state.items[selectedIndex].id)\r\n prevSelected.current = selectedIndex\r\n }\r\n }, [selectedIndex, state, state.items.length])\r\n\r\n const onSelectItem = React.useCallback(\r\n (id: string, closeParent: boolean) => {\r\n onChange?.(\r\n state.items.findIndex((item) => item.id === id),\r\n closeParent\r\n )\r\n },\r\n [onChange, state.items]\r\n )\r\n\r\n return (\r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === ListItem) {\r\n return React.cloneElement(child, { ...child.props, onSelectItem: onSelectItem })\r\n }\r\n\r\n return child\r\n })}\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\n\r\nimport { Label } from './typography'\r\n\r\nexport enum RangeSize {\r\n small = 'sm:h-6', // 24px height\r\n regular = 'sm:h-7', // 28px height\r\n medium = 'sm:h-8', // 32px height\r\n large = 'sm:h-9', // 36px height\r\n}\r\n\r\ntype InputProps = HTMLProps\r\n\r\ninterface RangeSliderProps extends Omit {\r\n /**\r\n * Label which is rendered above the select\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Range size. All inputs have forced height on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof RangeSize\r\n\r\n /**\r\n * Element which will be rendered on the left side of the slider\r\n */\r\n leftContent?: ReactNode\r\n\r\n /**\r\n * Element which will be rendered on the right side of the slider\r\n */\r\n rightContent?: ReactNode\r\n\r\n /**\r\n * Class name for the wrapper element\r\n */\r\n className?: string\r\n\r\n /**\r\n * Class name for the input element\r\n */\r\n inputClassName?: string\r\n\r\n /**\r\n * Min value for the input\r\n *\r\n * @default 0\r\n */\r\n min?: number\r\n\r\n /**\r\n * Max value for the input\r\n *\r\n * @default 100\r\n */\r\n max?: number\r\n\r\n /**\r\n * Step value for the input\r\n *\r\n * @default 1\r\n */\r\n step?: number\r\n\r\n /**\r\n * Current value\r\n */\r\n value: number\r\n\r\n /**\r\n * Callback when value changes\r\n */\r\n onChange: InputProps['onChange']\r\n}\r\n\r\nexport function RangeSlider({\r\n label,\r\n size = 'regular',\r\n leftContent,\r\n rightContent,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n className,\r\n inputClassName,\r\n ...props\r\n}: RangeSliderProps) {\r\n const [hasTrack, setHasTrack] = useState(false)\r\n const trackRef = useRef(null)\r\n const thumbRef = useRef(null)\r\n\r\n useEffect(() => {\r\n setHasTrack(Boolean(trackRef.current && thumbRef.current))\r\n }, [])\r\n\r\n const thumbLeft = useMemo(() => {\r\n const track = trackRef.current\r\n const thumb = thumbRef.current\r\n const valuePercent = (props.value - min) / (max - min)\r\n\r\n if (!hasTrack || !track || !thumb) return\r\n\r\n const trackBox = track.getBoundingClientRect()\r\n const thumbBox = thumb.getBoundingClientRect()\r\n\r\n return ((valuePercent * (trackBox.width - thumbBox.width)) / trackBox.width) * 100\r\n }, [min, max, props.value, hasTrack])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { ButtonRoundingType, ButtonThemeType } from '../button'\r\nimport { IconNameType } from '../icon'\r\n\r\nexport enum ToolbarTheme {\r\n chipTransparent, // (default)\r\n alternative,\r\n}\r\n\r\nexport enum ToolbarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n\r\nexport type ToolbarDirectionType = keyof typeof ToolbarDirection\r\n\r\nexport interface IButtonThemeSettings {\r\n className?: string\r\n theme: ButtonThemeType\r\n rounding: ButtonRoundingType\r\n}\r\n\r\nexport interface IToolbarItem {\r\n id: string\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport type ToolbarThemeType = keyof typeof ToolbarTheme\r\n","import * as React from 'react'\r\n\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\nexport interface IToolbarContext {\r\n direction: ToolbarDirection\r\n theme: ToolbarTheme\r\n isWrapped: boolean\r\n isStretched: boolean\r\n isMobile: boolean\r\n}\r\n\r\nexport const ToolbarContext = React.createContext({\r\n direction: ToolbarDirection.vertical,\r\n theme: ToolbarTheme.chipTransparent,\r\n isWrapped: false,\r\n isStretched: false,\r\n isMobile: false,\r\n})\r\n\r\nexport function useToolbarContext() {\r\n return React.useContext(ToolbarContext)\r\n}\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\n\r\nimport { isSafariDesktop } from '../../../app/shared/isMobile'\r\nimport { IToolbarContext, ToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarDirectionType, ToolbarTheme, ToolbarThemeType } from './interfaces'\r\n\r\nconst getToolbarSettings = ({\r\n direction,\r\n isWrapped,\r\n isMobile,\r\n theme,\r\n}: IToolbarContext): React.HTMLProps => {\r\n switch (isWrapped) {\r\n case true:\r\n return {\r\n className: classnames('shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'flex flex-wrap justify-between': direction === ToolbarDirection.vertical,\r\n 'grid border border-gray-100 dark:border-gray-600 p-1.5 gap-1 border-box rounded-md grid-cols-2':\r\n FinvizSettings.hasRedesignEnabled,\r\n }),\r\n }\r\n\r\n default:\r\n return {\r\n className: classnames('flex shrink-0 items-center p-1.5 bg-white dark:bg-gray-800', {\r\n 'space-x-1.5 px-1.5': direction === ToolbarDirection.horizontal && FinvizSettings.hasRedesignEnabled,\r\n 'flex-col overflow-hidden overflow-y-auto [--inset-l:0.5rem] landscape-primary:pl-inset-left':\r\n direction === ToolbarDirection.vertical,\r\n 'space-y-2': direction === ToolbarDirection.vertical && !isMobile,\r\n 'pb-inset-bottom [--inset-b:0.5rem]': theme !== ToolbarTheme.alternative && !isMobile,\r\n 'w-screen space-x-2 overflow-hidden overflow-x-auto':\r\n direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n 'overflow-x-hidden': theme === ToolbarTheme.alternative,\r\n 'relative z-10 rounded-md border border-gray-100 dark:border-gray-600': isMobile,\r\n }),\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarProps {\r\n /**\r\n * Toolbar direction\r\n *\r\n * @default vertical\r\n */\r\n direction?: ToolbarDirectionType\r\n\r\n /**\r\n * Toolbar buttons theme\r\n *\r\n * @default light\r\n */\r\n theme?: ToolbarThemeType\r\n\r\n /**\r\n * Charts mobile design\r\n *\r\n * @default false\r\n */\r\n isMobile?: boolean\r\n\r\n className?: string\r\n}\r\n\r\nexport function Toolbar({\r\n direction = 'vertical',\r\n theme = 'chipTransparent',\r\n isMobile = false,\r\n children,\r\n className,\r\n}: React.PropsWithChildren) {\r\n const toolbarRef = React.useRef(null)\r\n const contextProviderValue = React.useMemo(\r\n () => ({\r\n direction: ToolbarDirection[direction],\r\n theme: ToolbarTheme[theme],\r\n isWrapped:\r\n ToolbarDirection[direction] === ToolbarDirection.vertical && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isStretched:\r\n ToolbarDirection[direction] === ToolbarDirection.horizontal && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isMobile,\r\n }),\r\n [direction, theme, isMobile]\r\n )\r\n const toolbarSettings = getToolbarSettings(contextProviderValue)\r\n\r\n React.useLayoutEffect(() => {\r\n // Workaround for Safari scrollbar bug https://github.com/finvizhq/charts/issues/1038\r\n // Safari injects scrollbar after layout render and doesn't trigger reflow\r\n if (ToolbarTheme[theme] !== ToolbarTheme.alternative && isSafariDesktop()) {\r\n const forceReflow = throttle(() => {\r\n if (toolbarRef.current !== null) {\r\n const originalWidth = toolbarRef.current.style.width\r\n toolbarRef.current.style.width = '0'\r\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\r\n toolbarRef.current.offsetWidth\r\n toolbarRef.current.style.width = originalWidth\r\n }\r\n }, 200)\r\n\r\n forceReflow()\r\n window.addEventListener('resize', forceReflow)\r\n\r\n return () => {\r\n window.removeEventListener('resize', forceReflow)\r\n }\r\n }\r\n }, [theme])\r\n\r\n // reason for key is that popover is sealing initial state, description in\r\n // https://github.com/finvizhq/Finviz-Website/pull/402\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { PropsWithAs } from '../types'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\n\r\nfunction getButtonThemeSettings({\r\n theme,\r\n isActive,\r\n isStretched,\r\n isInAction,\r\n}: {\r\n theme: ToolbarTheme\r\n isStretched: boolean\r\n isActive?: boolean\r\n isInAction?: boolean\r\n}): Omit & ButtonProps {\r\n const includeRedesign = FinvizSettings.hasRedesignEnabled\r\n switch (theme) {\r\n case ToolbarTheme.alternative:\r\n return {\r\n className: classnames(\r\n {\r\n grow: isStretched,\r\n 'h-10 w-10': !isStretched && !includeRedesign,\r\n 'animate-pulse': isInAction,\r\n },\r\n\r\n !includeRedesign && {\r\n 'active:bg-white disabled:bg-white disabled:text-gray-300 disabled:hover:text-gray-300': true,\r\n 'border border-white text-gray-500 hover:border-gray-100 hover:text-gray-900': !isActive,\r\n 'border border-gray-900 text-gray-900': isActive,\r\n }\r\n ),\r\n theme: includeRedesign ? 'chipTransparent' : 'transparent',\r\n rounding: includeRedesign ? undefined : 'none',\r\n size: isStretched || includeRedesign ? undefined : 'none',\r\n }\r\n default:\r\n return {\r\n className: classnames(\r\n 'border dark:disabled:bg-gray-800 dark:disabled:text-gray-600 disabled:text-gray-300 disabled:bg-white dark:disabled:hover:bg-gray-800 dark:disabled:hover:text-gray-600 disabled:hover:text-gray-300 disabled:hover:bg-white',\r\n {\r\n 'animate-pulse': isInAction,\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 !isActive,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': isActive,\r\n }\r\n ),\r\n theme: 'transparent',\r\n rounding: 'small',\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarButtonProps extends Omit {\r\n item: IToolbarItem\r\n disabledTooltip?: string\r\n isInAction?: boolean\r\n isLoading?: boolean\r\n}\r\n\r\nexport function ToolbarButton({\r\n item,\r\n disabledTooltip,\r\n isInAction: isInActionProp,\r\n isLoading,\r\n ...props\r\n}: PropsWithAs & ToolbarButtonProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const isInAction = isInActionProp && item.iconAction !== undefined\r\n const buttonSettings = getButtonThemeSettings({\r\n theme,\r\n isStretched,\r\n isActive: props.active,\r\n isInAction: isInAction,\r\n })\r\n\r\n const getMainIcon = () => (\r\n \r\n )\r\n\r\n return (\r\n & ToolbarButtonProps)}\r\n appearance={props.appearance ?? 'square'}\r\n title={props.disabled && disabledTooltip ? disabledTooltip : (props.active && item.titleActive) || item.title}\r\n size={\r\n buttonSettings.size ??\r\n (theme === ToolbarTheme.chipTransparent || FinvizSettings.hasRedesignEnabled ? 'medium' : 'large')\r\n }\r\n >\r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {props.children ??\r\n (isInAction ? (\r\n \r\n \r\n \r\n ) : (\r\n getMainIcon()\r\n ))}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../../constants'\r\n\r\nexport type PopoverStateReturn = ReturnType\r\n\r\nconst DEFAULT_OFFSET: [number, number] = [0, 5]\r\nconst HOVER_TIMEOUT = 150\r\n\r\nconst preventDefault = (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n}\r\n\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function usePopoverState(settings?: Reakit.PopoverInitialState) {\r\n const offsets = (settings?.unstable_offset ?? DEFAULT_OFFSET) as [number, number]\r\n const popover = Reakit.usePopoverState({\r\n ...settings,\r\n placement: settings?.placement ?? 'bottom-start',\r\n unstable_offset: offsets,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n modal: false,\r\n })\r\n\r\n return { ...popover, offsets }\r\n}\r\n\r\nexport function useHoverPopover(settings?: Reakit.PopoverInitialState) {\r\n const popover = usePopoverState(settings)\r\n const showTimeout = React.useRef(null)\r\n const hideTimeout = React.useRef(null)\r\n\r\n const clearTimeouts = React.useRef(() => {\r\n if (showTimeout.current !== null) {\r\n window.clearTimeout(showTimeout.current)\r\n }\r\n if (hideTimeout.current !== null) {\r\n window.clearTimeout(hideTimeout.current)\r\n }\r\n })\r\n\r\n const showPopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n showTimeout.current = window.setTimeout(() => {\r\n popover.show()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n const hidePopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n hideTimeout.current = window.setTimeout(() => {\r\n popover.hide()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n // Unmount cleanup\r\n React.useEffect(() => () => clearTimeouts.current(), [])\r\n\r\n return {\r\n ...popover,\r\n show: showPopover.current,\r\n hide: hidePopover.current,\r\n onMouseOver: showPopover.current,\r\n onMouseOut: hidePopover.current,\r\n onMouseDown: preventDefault,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { usePopoverMaxHeight } from '../../../hooks/use-popover-maxHeight'\r\nimport { useWindowSize } from '../../../hooks/use-window-size'\r\nimport { Box, BoxProps } from '../../box'\r\nimport { getExtendedDialogState, useZIndex } from '../../dialog'\r\nimport { PopoverStateReturn } from './hooks'\r\n\r\nexport interface PopoverProps extends BoxProps, Pick {\r\n /**\r\n * The returned object from `usePopoverState`\r\n */\r\n state: PopoverStateReturn\r\n\r\n /**\r\n * Focus the popover when it opens\r\n *\r\n * @default true\r\n */\r\n focusOnShow?: Reakit.PopoverProps['unstable_autoFocusOnShow']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default true\r\n */\r\n focusOnHide?: Reakit.PopoverProps['unstable_autoFocusOnHide']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default undefined\r\n */\r\n finalFocusRef?: Reakit.PopoverProps['unstable_finalFocusRef']\r\n\r\n /**\r\n * Hides when clicked outside of popover, works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside?: Reakit.PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Overlay click callback or if false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Popover wrapper css style object\r\n *\r\n * @default undefined\r\n */\r\n popoverWrapperStyle?: React.CSSProperties\r\n\r\n /**\r\n * Show popover arrow\r\n *\r\n * @default false\r\n */\r\n hasArrow?: boolean\r\n\r\n /**\r\n * Enable or disable backdrop click events\r\n *\r\n * @default true\r\n */\r\n hasBackdrop?: boolean\r\n\r\n /**\r\n * Set the popover to height to be limited by the viewport instead of having full height\r\n *\r\n * @default false\r\n */\r\n hasViewportHeightLimit?: boolean\r\n\r\n /**\r\n * Set the popover max-width to be limited by the trigger button\r\n */\r\n hasButtonWidthLimit?: boolean\r\n\r\n /**\r\n * Can be used together with `hasViewportHeightLimit` to limit the height of the popover\r\n *\r\n * @default undefined\r\n */\r\n popoverMaxHeight?: number\r\n}\r\n\r\nexport function Popover({\r\n state,\r\n children,\r\n focusOnShow = true,\r\n focusOnHide = true,\r\n finalFocusRef,\r\n 'aria-label': ariaLabel,\r\n hide,\r\n hideOnClickOutside = true,\r\n hasBackdrop = true,\r\n onOverlayClick,\r\n popoverWrapperStyle,\r\n popoverMaxHeight = Number.MAX_SAFE_INTEGER,\r\n theme = 'light',\r\n hasViewportHeightLimit = false,\r\n hasButtonWidthLimit = false,\r\n ...props\r\n}: PopoverProps) {\r\n const zIndex = useZIndex()\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const { innerHeight } = useWindowSize({ isWatching: !isFullyClosed })\r\n\r\n const buttonElement = state.unstable_referenceRef.current\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: popoverMaxHeight,\r\n hasViewportHeightLimit,\r\n offsets: state.offsets,\r\n state,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !(hasViewportHeightLimit || hasButtonWidthLimit)) return\r\n\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n\r\n // Limit popover max-width to be width of the trigger button\r\n if (hasButtonWidthLimit) {\r\n popoverWrapper?.style.setProperty('max-width', `${buttonRect.width}px`)\r\n }\r\n }, [\r\n state.visible,\r\n state.offsets,\r\n buttonElement,\r\n hasViewportHeightLimit,\r\n hasButtonWidthLimit,\r\n innerHeight,\r\n state.placement,\r\n popoverMaxHeight,\r\n ])\r\n\r\n if (isFullyClosed) return null\r\n\r\n return (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n <>\r\n {\r\n // prevents from page scroll when clicked outside of popover\r\n event.preventDefault()\r\n }}\r\n />\r\n \r\n \r\n {children}\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\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { useZIndex } from '../../dialog'\r\n\r\ninterface PopoverButtonProps extends Reakit.PopoverDisclosureHTMLProps {\r\n state: Reakit.PopoverStateReturn\r\n as?: React.ElementType\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const PopoverTrigger = React.forwardRef(\r\n ({ state, ...props }: PopoverButtonProps, ref: React.ForwardedRef) => {\r\n const zIndex = useZIndex()\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Icon } from '../icon'\r\nimport { List, ListItem, useListState } from '../list'\r\nimport { useList } from '../list/hooks'\r\nimport { NativeSelect } from '../select/NativeSelect'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\nimport { useHoverPopover } from './popover/hooks'\r\nimport { Popover } from './popover/popover'\r\nimport { PopoverTrigger } from './popover/popover-trigger'\r\nimport { ToolbarButton } from './toolbar-button'\r\n\r\nexport interface ToolbarGroupProps {\r\n /**\r\n * Main button item\r\n */\r\n defaultItem: IToolbarItem\r\n\r\n /**\r\n * Shows spinner instead of icon\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Current selected item id\r\n */\r\n isActive: boolean\r\n\r\n /**\r\n * Should indicate some action in progress\r\n */\r\n isInAction?: boolean\r\n\r\n /**\r\n * Array of items\r\n */\r\n groupItems: IToolbarItem[]\r\n\r\n /**\r\n * Expand group button label\r\n */\r\n groupTitle?: string\r\n\r\n /**\r\n * On item select callback\r\n */\r\n onChange: (id: string, trigger: 'button' | 'select' | 'group') => void\r\n\r\n /**\r\n * Use native select for mobile devices\r\n *\r\n * @default true\r\n */\r\n useNativeSelect?: boolean\r\n\r\n /**\r\n * Is item disabled\r\n */\r\n disabled?: boolean\r\n\r\n /**\r\n * Tooltip message if item is disabled\r\n */\r\n disabledTooltip?: string\r\n}\r\n\r\nexport function ToolbarGroup({\r\n defaultItem,\r\n isActive,\r\n isLoading,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect = isMobile(),\r\n disabled,\r\n disabledTooltip,\r\n}: ToolbarGroupProps) {\r\n const listState = useListState({ currentId: null })\r\n const { theme, isStretched } = useToolbarContext()\r\n const [selectedItem, setSelectedItem] = React.useState(defaultItem)\r\n const groupId = groupTitle?.replace(/\\s/g, '-').toLocaleLowerCase()\r\n const isAlternativeTheme = theme === ToolbarTheme.alternative\r\n const popoverState = useHoverPopover({\r\n placement: isAlternativeTheme && isStretched ? 'bottom' : 'right-start',\r\n })\r\n const select = useList(\r\n popoverState,\r\n selectedItem.id,\r\n groupItems?.map((i) => ({ value: i.id, label: i.title })) ?? [],\r\n (option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }\r\n )\r\n\r\n return (\r\n \r\n ) => {\r\n ev.preventDefault()\r\n ev.stopPropagation()\r\n onChange(selectedItem.id, 'group')\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {useNativeSelect ? (\r\n ({ value: item.id, label: item.title }))}\r\n onChange={(option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }}\r\n onClick={() => onChange(selectedItem.id, 'select')}\r\n />\r\n ) : (\r\n \r\n \r\n {groupItems.map((item) => (\r\n }\r\n data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n >\r\n {item.title}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { PartialBy } from '../../types'\r\nimport { ToolbarButton } from './toolbar-button'\r\nimport { ToolbarGroup, ToolbarGroupProps } from './toolbar-group'\r\n\r\nexport function ToolbarItem({\r\n defaultItem,\r\n isLoading,\r\n isActive,\r\n isInAction,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect,\r\n disabled,\r\n disabledTooltip,\r\n}: PartialBy) {\r\n const isItemActive = isActive && !disabled\r\n\r\n if (!!groupItems?.length) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n {\r\n onChange(defaultItem.id, 'button')\r\n }}\r\n />\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\ntype ToolbarDividerProps = {\r\n className?: string\r\n}\r\n\r\nexport function ToolbarDivider({ className }: ToolbarDividerProps) {\r\n const { direction, theme } = useToolbarContext()\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Box } from '../box'\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { TourStep } from './types'\r\n\r\nexport function StepContent({ step }: { step: TourStep }) {\r\n return (\r\n \r\n {step.title && (\r\n \r\n {step.title}\r\n \r\n )}\r\n {step.body && {step.body}}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as ReactDOM from 'react-dom/server'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport {\r\n BUTTON_BASE_CLASS,\r\n BUTTON_FOCUS_STYLES,\r\n ButtonPadding,\r\n ButtonRounding,\r\n ButtonSize,\r\n ButtonTheme,\r\n getButtonTheme,\r\n} from '../button'\r\nimport { StepContent } from './step-content'\r\nimport { TourDefinition, TourStep } from './types'\r\n\r\ntype ExcludesFalse = (x: T | false) => x is T\r\n\r\n/**\r\n * Async load Shepherd module when we need it\r\n */\r\nlet shepherdLibrary: typeof Shepherd\r\nexport async function loadShepherdLibrary(setLoading: (state: boolean) => void) {\r\n if (shepherdLibrary) return shepherdLibrary\r\n\r\n try {\r\n setLoading(true)\r\n const shepherdPromise = await import('shepherd.js')\r\n shepherdLibrary = shepherdPromise.default\r\n setLoading(false)\r\n\r\n return shepherdLibrary\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Get buttons based on index in the step array\r\n */\r\nconst buttonClasses = classnames(BUTTON_BASE_CLASS, BUTTON_FOCUS_STYLES, ButtonSize.regular, ButtonRounding.regular)\r\nfunction getStepButtons(tour: Shepherd.Tour, step: TourStep, index: number, arr: TourStep[]) {\r\n return [\r\n {\r\n action: tour.complete,\r\n classes: classnames(buttonClasses, 'mr-auto', getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: 'Exit',\r\n },\r\n index > 0 && {\r\n action: tour.back,\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: step.backButton ?? 'Back',\r\n },\r\n {\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.blue).button, ButtonPadding.regular),\r\n action: tour.next,\r\n text: step.nextButton ?? (index === arr.length - 1 ? 'Finish' : 'Next'),\r\n },\r\n ].filter(Boolean as unknown as ExcludesFalse)\r\n}\r\n\r\n/**\r\n * Convert tour steps to Shepherd steps\r\n */\r\nexport function processSteps(tour: Shepherd.Tour, steps: TourStep[]): Shepherd.Step.StepOptions[] {\r\n return steps.map((step, index) => ({\r\n attachTo: { element: step.target, on: step.placement ?? 'auto' },\r\n classes: 'z-dialog',\r\n // Add offset\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: step.offset ?? [0, 10],\r\n },\r\n },\r\n ],\r\n },\r\n // Render the body\r\n text: ReactDOM.renderToString(React.createElement(StepContent, { step })),\r\n // Add buttons\r\n buttons: getStepButtons(tour, step, index, steps),\r\n modalOverlayOpeningRadius: step.overlayRadius ?? 8,\r\n modalOverlayOpeningPadding: step.overlayPadding ?? 0,\r\n }))\r\n}\r\n\r\nexport function getTourKey() {\r\n return `tour${window.location.pathname.replace(/[/.]/g, '-')}`\r\n}\r\n\r\nexport function getStepsForUser(tours: TourDefinition[]) {\r\n const lastFinishedTour = localStorage?.getItem(getTourKey())\r\n const lastTourIndex = tours.findIndex((tour) => tour.id === lastFinishedTour)\r\n const allToursViewed = lastTourIndex === tours.length - 1 || tours.slice(lastTourIndex + 1).every((item) => item.skip)\r\n const toursToView = allToursViewed ? tours : tours.slice(lastTourIndex + 1)\r\n const userTour = toursToView.reduce(\r\n (acc, current) =>\r\n current.skip\r\n ? acc\r\n : {\r\n ...acc,\r\n id: current.id,\r\n steps: [...acc.steps, ...current.steps],\r\n },\r\n { id: 'tour', steps: [], initialTour: toursToView[0].id }\r\n )\r\n\r\n return { hasNewTours: !allToursViewed, tour: userTour }\r\n}\r\n\r\nexport function completeTour(key: string) {\r\n localStorage?.setItem(getTourKey(), key)\r\n}\r\n","import * as React from 'react'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport { TourDefinition } from './types'\r\nimport * as tourUtils from './utils'\r\n\r\nexport const DEFAULT_OPTIONS = {\r\n exitOnEsc: true,\r\n useModalOverlay: true,\r\n}\r\n\r\n/**\r\n * Hook which controls shepherd.js. The library is lazy-loaded when the tour starts\r\n *\r\n * Returns:\r\n * - `isLoading`: state of the library loading\r\n * - `currentTour`: tour object, only defined after library has loaded\r\n * - `startTour`: load the library and start tour. Returns `currentTour`\r\n * - `getStepsForUser`: returns a list of tour steps based on tours the user finished\r\n * - `completeTour`: persists the last finished tour to local storage\r\n */\r\nexport function useTour(options?: Shepherd.Tour.TourOptions) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [currentTour, setTour] = React.useState(null)\r\n\r\n /**\r\n * We’re loading shepherd asynchronously and want to have loading state so we use\r\n * AbortController to check if the component is still mounted.\r\n */\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const loadingSetter = React.useRef((state: boolean) => {\r\n if (controller.current?.signal.aborted) return\r\n\r\n setIsLoading(state)\r\n })\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n const startTour = React.useCallback(\r\n async (definition: TourDefinition, setComplete = true) => {\r\n const shepherdLibrary = await tourUtils.loadShepherdLibrary(loadingSetter.current)\r\n\r\n if (shepherdLibrary && !controller.current?.signal.aborted) {\r\n const tour = currentTour ?? new shepherdLibrary.Tour({ ...DEFAULT_OPTIONS, ...options })\r\n\r\n if (!currentTour) setTour(tour)\r\n\r\n // Reset the tour steps in case they were updated\r\n Array.from(tour.steps).forEach((step) => tour.removeStep(step.id))\r\n\r\n const processedSteps = tourUtils.processSteps(tour, definition.steps)\r\n tour.addSteps(processedSteps)\r\n\r\n if (setComplete) {\r\n tourUtils.completeTour(definition.id)\r\n }\r\n\r\n tour.start()\r\n window.gtag?.('event', 'tour-start', { event_label: definition.initialTour ?? definition.id })\r\n\r\n return tour\r\n }\r\n },\r\n [currentTour, options]\r\n )\r\n\r\n return {\r\n isLoading,\r\n currentTour,\r\n startTour,\r\n getStepsForUser: tourUtils.getStepsForUser,\r\n completeTour: tourUtils.completeTour,\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-duplicate-enum-values */\r\nimport * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps } from '../button'\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum TabSpacing {\r\n xxsmall = 'space-x-0.5', // 2px spacing\r\n xsmall = 'space-x-1', // 4px spacing\r\n none = 'space-x-1.5', // 6px spacing\r\n small = 'space-x-1.5', // 6px spacing\r\n regular = 'space-x-1.5', // 6px spacing\r\n medium = 'space-x-2', // 8px spacing\r\n large = 'space-x-2', // 8px spacing\r\n}\r\n\r\nfunction getRightContent(content: JSX.Element | IconNameType | undefined, isActive: boolean) {\r\n if (isValidIconName(content)) return \r\n else if (React.isValidElement(content))\r\n return React.cloneElement(content as React.ReactElement<{ active: boolean }>, {\r\n active: isActive,\r\n })\r\n else return content\r\n}\r\n\r\nconst InternalTab = React.forwardRef(function InternalTab<\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n {\r\n rounding = 'none',\r\n theme = 'tab',\r\n size = 'medium',\r\n 'aria-selected': ariaSelected,\r\n children,\r\n ...props\r\n }: Omit, 'theme'>,\r\n ref: React.ForwardedRef\r\n) {\r\n const spacing = TabSpacing[size]\r\n const active = Boolean(ariaSelected)\r\n const rightContent = getRightContent(props.rightContent, active)\r\n\r\n return (\r\n )}\r\n ref={ref}\r\n active={active}\r\n theme={theme}\r\n size={size}\r\n rounding={rounding}\r\n rightContent={undefined}\r\n className={classNames('group/badge', props.className)}\r\n contentClass={classNames(spacing, 'flex', props.contentClass)}\r\n >\r\n {children}\r\n {rightContent}\r\n \r\n )\r\n})\r\n\r\nexport function Tab(\r\n props: React.PropsWithChildren>\r\n) {\r\n return } />\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\n\r\nexport function TabList(props: Ariakit.TabListProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function TabPanel(props: Ariakit.TabPanelProps) {\r\n return \r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function Tabs({ children }: React.PropsWithChildren) {\r\n return (\r\n \r\n
{children}
\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nenum BadgeSize {\r\n small = 'h-4 min-w-4', // 16px height\r\n medium = 'h-5 min-w-5', // 20px height\r\n}\r\ntype BadgeSizeType = keyof typeof BadgeSize\r\n\r\nenum BadgePadding {\r\n small = 'px-[5px] py-0', // 16px height\r\n medium = 'px-1.5 py-0.5', // 20px height\r\n}\r\ntype BadgePaddingType = keyof typeof BadgePadding\r\n\r\ntype BadgeProps = {\r\n size?: BadgeSizeType\r\n padding?: BadgePaddingType\r\n active?: boolean\r\n}\r\n\r\nexport function Badge({ size = 'medium', padding = size, active, children }: React.PropsWithChildren) {\r\n const badgePadding = BadgePadding[padding]\r\n const badgeSize = BadgeSize[size]\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import * as AriaKit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { Input, InputHTMLProps, InputProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipProps, TooltipTrigger, useTooltipState } from './tooltip'\r\n\r\ntype TooltipInputProps = InputProps & InputHTMLProps & { isInteractive?: boolean }\r\n\r\ninterface TooltipSettingsProps extends Pick, Pick {\r\n content?: React.ReactNode\r\n color?: keyof typeof TooltipColor\r\n}\r\n\r\nexport interface TooltipInputWrapperProps extends Pick {\r\n children: React.ReactElement\r\n /**\r\n * Settings for Tooltip component and useTooltipStore\r\n */\r\n tooltipSettings?: TooltipSettingsProps\r\n}\r\n\r\nfunction TooltipInputWrapper({ children, tooltipSettings = {}, name }: TooltipInputWrapperProps) {\r\n const { content, color, gutter, placement = 'bottom' } = tooltipSettings\r\n const tooltip = useTooltipState({ placement })\r\n\r\n return (\r\n <>\r\n \r\n {React.cloneElement(children, {\r\n onFocus: (event: React.FocusEvent) => {\r\n children.props.onFocus?.(event)\r\n tooltip.show()\r\n },\r\n onBlur: (event: React.FocusEvent) => {\r\n children.props.onBlur?.(event)\r\n tooltip.hide()\r\n },\r\n })}\r\n \r\n {content && (\r\n \r\n {content}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n { tooltipSettings, isInteractive = true, ...props }: TooltipInputProps & Omit,\r\n ref: React.ForwardedRef\r\n) {\r\n const input = \r\n\r\n if (!isInteractive) {\r\n return input\r\n }\r\n\r\n return (\r\n \r\n {input}\r\n \r\n )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\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 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 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"],"names":["CanvasHover","Component","constructor","arguments","_defineProperty","visibleTickers","activeNode","undefined","sparklinesData","MapStore","getHoveredNode","this","props","mapNodeId","getSparklines","setState","getVisibleTooltipTickers","d","additional","perf","treemap","formatValue","toFixed","e","state","marginLeft","el","document","getElementById","hoverWidth","scrollWidth","hoverHeight","scrollHeight","availWidth","documentElement","clientWidth","availHeight","clientHeight","clientX","style","left","top","Math","max","clientY","componentDidMount","addChangeListener","_onChange","addEventListener","_onMouseMove","componentWillUnmount","MapActions","loadSparklinesCancel","removeChangeListener","removeEventListener","componentDidUpdate","_","prevState","_prevState$activeNode","name","includes","push","tickersToLoad","filter","ticker","length","loadSparklineData","mapType","render","_d$data$data$nameOver","_d$data","hasSparkline","price","colorScale","type","children","parent","node","sort","a","b","dx","dy","isSmall","title","MapTypeId","World","_jsxs","id","_jsx","className","backgroundColor","data","nameOverride","Sparkline","width","height","_formatPerf","classnames","description","colSpan","map","c","_c$data$data$nameOver","_c$data","color","Canvas","React","event","super","zoom","initialized","dataHash","_cache","bind","mapActionCreators","_setOnPublish","_getPublishCanvas","_initialize","renderFromCache","_canvasContext","renderHover","_hoverContext","_setCanvasSize","worldBackground","_updateCanvasCaches","_loadTreemapGeoBackground","then","_this$_hoverCanvas$cu","_hoverCanvas","current","_onWheel","alt","legend","hover","ref","_canvas","classNames","onMouseDown","_onMouseDown","onMouseMove","onMouseUp","_onMouseUp","onMouseLeave","_onMouseLeave","onDoubleClick","_onDoubleClick","Legend","scale","context","x","y","translate","nearestSize","getNearestSize","_createCache","save","drawImage","canvas","restore","mouseDown","offsetX","offsetY","getOffset","nodeAtPosition","getNodeAtPosition","industryAtPosition","getIndustryAtPosition","MapActionCreators","setHoveredNode","_this$props$onNodeCli","_this$props","sectorAtPosition","getSectorAtPosition","onNodeClick","call","industry","sector","preventDefault","deltaY","_onPanStart","lastPanX","pointers","lastPanY","_onPanMove","movementX","movementY","changeTranslate","_onPinch","offsetX1","target","offsetLeft","offsetParent","offsetY1","offsetTop","direction","_setCanvasContexts","canvasContext","getContext","isFirefoxDesktop","willReadFrequently","hoverContext","retinafy","zoomOnWheel","zoomLevels","getZoomLevels","_createCacheWithPriority","hoverCanvas","hammertime","Hammer","get","set","enable","threshold","on","passive","_getTreemapGeoBackground","getIsSmall","FinvizSettings","hasDarkTheme","image","loadImage","default","oldScale","oldTranslate","cacheCanvas","createElement","cacheContext","translateAbs","renderCanvas","resetSparklineData","currentZoom","callback","animationFrameId","window","cancelAnimationFrame","remainingLevels","level","requestAnimationFrame","_queueUpdateCache","scales","currentScale","_hover$border","settings","hoveredNode","clearRect","apply","showIndustryHeader","LayoutGenerator","isNodeHeaderVisible","depth","NodeDepth","Industry","industryOffset","padding","smallIndustryPadding","Sector","header","strokeStyle","border","lineWidth","strokeRect","beginPath","i","moveTo","lineTo","_hover$background","stroke","renderIndustryHeader","config","fill","background","renderNodeText","fillStyle","fillRect","naturalWidth","naturalHeight","index","sectors","industries","nodes","renderStockNode","isLargeNode","isGeoMap","renderBackground","Number","isFinite","_treemap$settings$sec","renderSectorBorders","_treemap$settings$sec2","boxover","tooltip","scaleMin","scaleMax","getScaleMinMax","steps","diff","step","round","stepWidth","indexOf","format","scaleStepFormat","Portfolio","ETFHoldings","isWidget","minWidth","textShadow","toString","concat","MapContext","setTreemap","setGenerator","useMapContext","MapContextProvider","generator","Provider","value","Map","_ref","isLoadingData","isFetchingPerf","subtype","truncateNodeName","prevTreemap","containerRef","hasRendered","setHasRendered","mapUtils","size","mapSettings","MAP_EXPORT","Treemap","getLayout","scaleId","countIndustryPerf","countSectorPerf","updateTimeoutRef","setTimeout","layout","updateLayout","clearTimeout","containerElement","resize","throttle","Delayed","delayComponent","Spinner","MapSelectTheme","hasRedesign","hasRedesignEnabled","MapSelect","_props$rounding","_props$size","_props$listProps","label","ariaLabel","theme","items","onChange","selectTheme","dark","button","rounding","rightContent","Icon","popover","light","getMapSelectTheme","Select","placeholder","defaultValue","listProps","useZoomButtons","zoomOut","ev","zoomIn","Zoom","handlers","_Fragment","Button","onClick","SVG","mapBaseData","cacheBuster","apiRequest","query","rev","mapPerf","t","st","mapPerfScreener","location","search","uploadMap","method","headers","ContentType","FormUrlEncoded","body","URLSearchParams","file","replace","_targetScale","updateVisibleSparklines","mapStore","debouncedLoadSparklines","_lastSparklinesRequest","debounce","async","tickers","_lastSparklinesReques","_lastSparklinesReques2","AppDispatcher","handleViewAction","ActionTypes","LOAD_SPARKLINES_STARTED","cancel","join","ty","handleServerAction","LOAD_SPARKLINES_COMPLETED","error","LOAD_SPARKLINES_FAILED","trailing","RESET_SPARKLINE_DATA","SET_HOVERED_NODE","_lastSparklinesReques3","_lastSparklinesReques4","tx","CHANGE_TRANSLATE","zoomLevel","getNextZoomLevel","animate","RENDER_TREEMAP","getPreviousZoomLevel","zoomAndTranslate","updateData","updateDimensions","find","updatePerfData","updatePerf","UPDATE_DATA","version","getPublishCanvas","SET_PUBLISH_CANVAS","setupWidget","SET_WIDGET","Dispatcher","action","payload","source","PayloadSources","SERVER_ACTION","dispatch","VIEW_ACTION","keyMirror","INIT_STARTED","INIT_FAILED","Store","EventEmitter","emitChange","emit","CHANGE_EVENT","removeListener","_hoveredNode","_mapNodeId","_dataVersion","_sparklinesData","_isWidget","getDataVersion","dispatchToken","register","fontSizesWidths","f","g","h","j","k","l","m","n","o","p","q","r","s","u","v","w","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","fontSizeLineHeights","dimensions","d3","zoomElement","translateExtent","behavior","extent","newZoom","mapCenter","zoomSelection","scaleTo","getTransform","args","Array","isArray","translateBy","translateTo","scaleExtent","len","fontFamily","getTextFontFamily","_props$mapNodeId","MapSubtypeId","DayPerf","getUuid","getColorScale","_updateIndustryPerf","_updateSectorPerf","ScaleId","PortfolioPct","PortfolioUsd","minValuePerf","abs","_node$data$perfWeek","_node$data","perfWeek","maxValuePerf","_node$data$perfWeek2","_node$data2","perfMax","minValueNode","maxValueNode","valueMax","valueToUse","isNaN","numberOfDigits","floor","log10","roundedBound","ceil","scaleMinMax","minDomain","maxDomain","gradient","gradients","gradientSmall","linearScale","domain","range","colors","nullColor","min","getParentSector","hash","nodeName","parentSector","updatedNode","_node$data3","_resetIndustryPerf","weightedPriceSum","marketCapSum","stock","marketCap","everyStockUndefined","_getNodeTopOffset","isSmallSecMap","leftPadding","topPadding","isFirstNodeInIndustry","getNodeText","_node$additional","_this$settings$fontSi","_this$settings$fontSi2","fontSizes","scaleFontSizes","nodeTopOffset","nodeHeight","nodeNameFontSize","findMaxFontSizeForText","getLongestText","fontSizePadding","nodeNameLineHeight","stepFormat","perfText","getSymbolType","PortfolioSymbolType","Cash","fontPairs","fontSizePairs","allowedSize","perfFontSize","perfLineHeight","textHeight","topOffset","fontSize","text","maxWidth","widths","_widths$text$i","substring","actualZoomLevel","getLastZoomLevel","_stepFormat$replace","_stepFormat","floatValue","parseFloat","absValue","isPositiveScaleOnly","formated","nodeText","textBaseline","textAlign","nodeY","nodeDY","textX","nameY","perfTextY","offset","font","fillText","getSpacingWithDefaults","spacing","_spacing$top","_spacing$right","_spacing$bottom","_spacing$left","right","bottom","_ref2","_config$height","_config$border","parrentPadding","margin","_ref3","fontWeight","toUpperCase","shouldComponentUpdate","nextProps","line","curve","transform","PropTypes","isRequired","redGreenGradient","greenRedGradient","slice","reverse","redGradient","greenGradient","redGreenGradientBubbles","_5","_10","_15","_20","_25","_relvol","_pe","_fpe","_peg","_ps","_pb","_div","_eps5y","_short","_rec","_earndate","_portfolioPct","_portfolioUsd","bubbleGradients","src","Promise","resolve","reject","Image","onload","onerror","getScaleRatio","_window$devicePixelRa","devicePixelRatio","ratio","AdsProvider","getAdsProvider","hasUserPremium","None","adsProvider","Freestar","InvestingChannel","trackPageView","_window$gtag","_window","_window$gtag2","_window2","pathname","freestarPageView","_window$freestar","gtag","freestar","queue","trackPageview","ColorVariant","CheckboxSize","CheckboxComponent","_props$checked","checked","defaultChecked","disabled","violet","emerald","orange","teal","pink","lime","purple","green","yellow","blue","red","gray","Checkbox","forwardRef","clamp","num","isTouch","getRelativePosition","rect","getBoundingClientRect","pointer","touches","pageX","pageXOffset","pageY","pageYOffset","preventDefaultMove","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","useState","isValid","handleMove","useCallback","buttons","handleMoveStart","nativeEvent","handleKeyDown","keyCode","which","handleMoveEnd","toggleDocumentEvents","toggleEvent","useLayoutEffect","onTouchStart","onKeyDown","tabIndex","DraggablePicker","memo","Pointer","hexStringToRGBA","hexString","hexColor","removeHashSymbol","hexStringToHSVA","rgbaToHSVA","alphaToHex","alpha","padStart","rgbaToHexString","hsvaToHEXString","hsvaToRGBA","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","String","parseInt","strColor","isValidColor","isRgb","startsWith","Option","convertColorToHEX","getIsRgb","rgbKeys","some","getHSVAFromColor","Alpha","changeLightness","pos","gradientPreview","useMemo","gradientFrom","gradientTo","backgroundImage","DEFAULT_COLORS","ColorPalette","lowerCaseColor","toLowerCase","colorObj","isSelected","HueSaturation","position","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","icon","isTooLight","getLumaFromRGBA","getIsColorTooLightOrTransparent","isValidIconName","PickerInput","inputClass","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","currentTarget","colorValue","Input","leftContent","ColorPicker","canSelectCustom","canSelectAlpha","outputFormat","onPaletteItemClick","cachedColor","hsvaColor","setColor","Ariakit","input","currentColor","newColor","onChangeCallback","stringColor","output","onSetCustomCodeClick","_prompt","prompt","trim","alert","isMobile","contentClass","_hex","orignalColor","focus","preventScroll","InputColorPicker","inputDataTestId","popoverState","usePopoverState","isMobileDevice","PopoverTrigger","Popover","hideOnInteractOutside","backdrop","hide","MultiColorPicker","colorInputLabel","ColorTabButton","ButtonRounding","small","ButtonColorPicker","buttonPickerDataTestId","isOpen","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","as","appearance","active","_ref4","ButtonGroup","childComponent","hasDivider","_ref5","CopyToClipboard","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","Textarea","readOnly","select","xmlns","MAX_HEIGHT_PROPERTY","POPOVER_HEIGHT_LIMIT_STYLE","maxHeight","usePopoverMaxHeight","maxHeightLimit","hasViewportHeightLimit","offsets","innerHeight","useWindowSize","isWatching","visible","animating","buttonElement","unstable_referenceRef","buttonRect","elementMaxHeight","placement","scrollY","popoverId","getAttribute","popoverWrapper","setProperty","DEFAULT_OFFSETS","ContextMenu","menuMaxHeight","popperElement","setPopperElement","virtualRef","scrollX","toJSON","getVirtualRef","dropdownState","useDropdownState","isFullyClosed","getExtendedDialogState","hasBeenOpen","styles","attributes","usePopper","modifiers","options","show","popper","ContextMenuDropdown","isStatic","ContextMenuInner","MAX_SAFE_INTEGER","innerState","maxHeightStyle","Dropdown","item","DropdownSeparator","DropdownItem","_item$onClick","Object","assign","menu_option","ChartGridCell","gridArea","GridLayout","columns","rows","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","InnerState","asComponent","valueKey","changeKey","valueAccessor","handleChange","ListContext","getSelectedItemIndex","findIndex","ListItem","activeTheme","onSelectItem","onKeyPress","closeOnSelect","Reakit","itemProps","Boolean","role","BUTTON_DEFAULT_ELEMENT","align","List","selectedIndex","includeBaseStyles","prevSelected","move","closeParent","child","RangeSize","RangeSlider","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","Label","ToolbarTheme","ToolbarDirection","ToolbarContext","vertical","chipTransparent","isWrapped","isStretched","useToolbarContext","getToolbarSettings","horizontal","alternative","Toolbar","toolbarRef","contextProviderValue","toolbarSettings","isSafariDesktop","forceReflow","originalWidth","offsetWidth","ToolbarButton","_props$appearance","_buttonSettings$size","_props$children","disabledTooltip","isInAction","isInActionProp","isLoading","iconAction","buttonSettings","isActive","includeRedesign","grow","getButtonThemeSettings","getMainIcon","iconActive","titleActive","delay","DEFAULT_OFFSET","HOVER_TIMEOUT","useHoverPopover","_settings$unstable_of","_settings$placement","unstable_offset","animated","COMPONENT_ANIMATION_DURATION","modal","showTimeout","hideTimeout","clearTimeouts","showPopover","hidePopover","onMouseOver","onMouseOut","focusOnShow","focusOnHide","finalFocusRef","hideOnClickOutside","hasBackdrop","onOverlayClick","popoverWrapperStyle","popoverMaxHeight","hasButtonWidthLimit","zIndex","useZIndex","Portal","unstable_autoFocusOnShow","unstable_autoFocusOnHide","unstable_finalFocusRef","onTransitionEnd","onAnimationEnd","innerProps","Box","_props$as","ToolbarGroup","_groupItems$map","defaultItem","groupItems","groupTitle","useNativeSelect","listState","currentId","loop","unstable_virtual","selectedItem","setSelectedItem","groupId","toLocaleLowerCase","isAlternativeTheme","setSelectedIndex","closePopover","newIndex","onItemChange","useList","option","stopPropagation","NativeSelect","ToolbarItem","isItemActive","ToolbarDivider","StepContent","Heading","Paragraph","shepherdLibrary","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","regular","getStepButtons","tour","arr","_step$backButton","_step$nextButton","complete","classes","getButtonTheme","ButtonTheme","ButtonPadding","back","backButton","next","nextButton","getTourKey","getStepsForUser","tours","_localStorage","lastFinishedTour","localStorage","getItem","lastTourIndex","allToursViewed","every","skip","toursToView","hasNewTours","reduce","acc","initialTour","completeTour","key","_localStorage2","setItem","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","useTour","setIsLoading","currentTour","setTour","controller","AbortController","loadingSetter","_controller$current","signal","aborted","_controller$current2","abort","startTour","definition","_controller$current3","setComplete","tourUtils","_definition$initialTo","Tour","from","forEach","removeStep","processedSteps","_step$placement","_step$offset","_step$overlayRadius","_step$overlayPadding","attachTo","element","popperOptions","ReactDOM","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","overlayPadding","addSteps","start","event_label","TabSpacing","InternalTab","ariaSelected","content","Tab","TabList","TabPanel","Tabs","BadgeSize","BadgePadding","Badge","badgePadding","badgeSize","TooltipInputWrapper","tooltipSettings","gutter","useTooltipState","TooltipTrigger","focusable","isHideOnClickOutside","onFocus","_children$props$onFoc","_children$props","onBlur","_children$props$onBlu","_children$props2","Tooltip","hideOnHoverOutside","TooltipInputComponent","isInteractive","TooltipInput","throttleWaitInMs","setSize","innerWidth","handleResize"],"sourceRoot":""}